🔧 Changes to support BullMQ on the service layer

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
This commit is contained in:
2021-10-27 07:46:21 -07:00
parent 8fbea27fb2
commit 56d22a28a0
16 changed files with 151 additions and 270 deletions

View File

@@ -1 +0,0 @@
RABBITMQ_URI=amqp://user:bitnami@rabbitmq:5672

View File

@@ -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:

View File

@@ -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",

View File

@@ -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<Array<IFolderData>> {
return axios
@@ -50,50 +49,35 @@ export async function walkFolder(path: string): Promise<Array<IFolderData>> {
* @param {Object} options
* @return {Promise<string>} 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: `<span class="icon-text has-text-success"><i class="fas fa-plug"></i></span> Socket <span class="has-text-info">${socket.id}</span> connected. <strong>${walkedFolders.length}</strong> 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: `<span class="icon-text has-text-success"><i class="fas fa-plug"></i></span> Socket <span class="has-text-info">${socket.id}</span> connected. <strong>${walkedFolders.length}</strong> 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`,

View File

@@ -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();

View File

@@ -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";

View File

@@ -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: `/`,
});

View File

@@ -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: `<span class="icon-text has-text-success"><i class="fas fa-plug"></i></span> Socket <span class="has-text-info">${socket.id}</span> connected. <strong>${data}</strong>`,
dismissible: "click",
position: "tr",
autoDismiss: 0,
}),
);
});
socket.on("disconnect", () => {
console.log(`disconnect`);
});
socket.emit("bastard", { name: "puk" });
const ws: any = {
socket,
};
return (
<WebSocketContext.Provider value={ws}>{children}</WebSocketContext.Provider>
);
};
export { WebSocketContext };
export default WebSocketProvider;

View File

@@ -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(
<Provider store={store}>
<WebSocketProvider>
<ConnectedRouter history={history}>
<App />
</ConnectedRouter>
</WebSocketProvider>
<ConnectedRouter history={history}>
<App />
</ConnectedRouter>
</Provider>,
rootEl,
);

View File

@@ -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;

View File

@@ -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);
}
};

View File

@@ -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;

View File

@@ -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}`);

View File

@@ -1,4 +1,3 @@
import extra from "./routes/importComics.routes";
import opds from "./routes/opds.routes";
export default { extra, opds };
export default { opds };

View File

@@ -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;

115
yarn.lock
View File

@@ -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"