🔌 AirDC++ socket statuses debug branch

This commit is contained in:
2023-01-09 12:00:36 -08:00
parent df1fbc7dd3
commit c05fb2f341
9 changed files with 294 additions and 266 deletions

View File

@@ -44,10 +44,6 @@
"babel-preset-minify": "^0.5.2", "babel-preset-minify": "^0.5.2",
"better-docs": "^2.7.2", "better-docs": "^2.7.2",
"comlink-loader": "^2.0.0", "comlink-loader": "^2.0.0",
"compromise": "^13.11.3",
"compromise-dates": "^2.2.1",
"compromise-numbers": "^1.4.0",
"compromise-sentences": "^0.3.0",
"date-fns": "^2.28.0", "date-fns": "^2.28.0",
"dayjs": "^1.10.6", "dayjs": "^1.10.6",
"ellipsize": "^0.1.0", "ellipsize": "^0.1.0",
@@ -138,7 +134,6 @@
"bulma": "^0.9.3", "bulma": "^0.9.3",
"clean-webpack-plugin": "^1.0.0", "clean-webpack-plugin": "^1.0.0",
"comlink": "^4.3.0", "comlink": "^4.3.0",
"compromise-strict": "^0.0.2",
"concurrently": "^4.0.0", "concurrently": "^4.0.0",
"copy-webpack-plugin": "^9.0.1", "copy-webpack-plugin": "^9.0.1",
"css-loader": "^5.1.2", "css-loader": "^5.1.2",

View File

@@ -4,7 +4,10 @@ import {
PriorityEnum, PriorityEnum,
SearchResponse, SearchResponse,
} from "threetwo-ui-typings"; } from "threetwo-ui-typings";
import { LIBRARY_SERVICE_BASE_URI, SEARCH_SERVICE_BASE_URI } from "../constants/endpoints"; import {
LIBRARY_SERVICE_BASE_URI,
SEARCH_SERVICE_BASE_URI,
} from "../constants/endpoints";
import { import {
AIRDCPP_SEARCH_RESULTS_ADDED, AIRDCPP_SEARCH_RESULTS_ADDED,
AIRDCPP_SEARCH_RESULTS_UPDATED, AIRDCPP_SEARCH_RESULTS_UPDATED,
@@ -18,6 +21,8 @@ import {
IMS_COMIC_BOOK_DB_OBJECT_FETCHED, IMS_COMIC_BOOK_DB_OBJECT_FETCHED,
AIRDCPP_TRANSFERS_FETCHED, AIRDCPP_TRANSFERS_FETCHED,
LIBRARY_ISSUE_BUNDLES, LIBRARY_ISSUE_BUNDLES,
AIRDCPP_SOCKET_CONNECTED,
AIRDCPP_SOCKET_DISCONNECTED,
} from "../constants/action-types"; } from "../constants/action-types";
import { isNil } from "lodash"; import { isNil } from "lodash";
import axios from "axios"; import axios from "axios";
@@ -32,6 +37,12 @@ function sleep(ms: number): Promise<NodeJS.Timeout> {
return new Promise((resolve) => setTimeout(resolve, ms)); return new Promise((resolve) => setTimeout(resolve, ms));
} }
export const setAirDCPPSocketConnectionAsActive = () => async (dispatch) => {
console.log("fire, fire, fire");
dispatch({
type: AIRDCPP_SOCKET_CONNECTED,
});
};
export const search = export const search =
(data: SearchData, ADCPPSocket: any, credentials: any) => (data: SearchData, ADCPPSocket: any, credentials: any) =>
async (dispatch) => { async (dispatch) => {
@@ -114,10 +125,13 @@ export const search =
}; };
export const downloadAirDCPPItem = export const downloadAirDCPPItem =
(searchInstanceId: Number, (
searchInstanceId: Number,
resultId: String, resultId: String,
comicObjectId: String, comicObjectId: String,
name: String, size: Number, type: any, name: String,
size: Number,
type: any,
ADCPPSocket: any, ADCPPSocket: any,
credentials: any, credentials: any,
): void => ): void =>
@@ -162,7 +176,6 @@ export const downloadAirDCPPItem =
comicBookDetail: bundleDBImportResult.data, comicBookDetail: bundleDBImportResult.data,
IMS_inProgress: false, IMS_inProgress: false,
}); });
} }
} catch (error) { } catch (error) {
throw error; throw error;
@@ -192,7 +205,8 @@ export const getBundlesForComic =
}); });
// get only the bundles applicable for the comic // get only the bundles applicable for the comic
if (comicObject.data.acquisition.directconnect) { if (comicObject.data.acquisition.directconnect) {
const filteredBundles = comicObject.data.acquisition.directconnect.downloads.map( const filteredBundles =
comicObject.data.acquisition.directconnect.downloads.map(
async ({ bundleId }) => { async ({ bundleId }) => {
return await ADCPPSocket.get(`queue/bundles/${bundleId}`); return await ADCPPSocket.get(`queue/bundles/${bundleId}`);
}, },
@@ -234,7 +248,6 @@ export const getTransfers =
type: LIBRARY_ISSUE_BUNDLES, type: LIBRARY_ISSUE_BUNDLES,
issue_bundles, issue_bundles,
}); });
} }
} catch (err) { } catch (err) {
throw err; throw err;

View File

@@ -8,7 +8,6 @@ import { useDispatch, useSelector } from "react-redux";
import { searchIssue } from "../../actions/fileops.actions"; import { searchIssue } from "../../actions/fileops.actions";
import ellipsize from "ellipsize"; import ellipsize from "ellipsize";
/** /**
* Component that tabulates the contents of the user's ThreeTwo Library. * Component that tabulates the contents of the user's ThreeTwo Library.
* *
@@ -20,9 +19,10 @@ export const Library = (): ReactElement => {
const searchResults = useSelector( const searchResults = useSelector(
(state: RootState) => state.fileOps.libraryComics, (state: RootState) => state.fileOps.libraryComics,
); );
const searchError = useSelector( const searchError = useSelector((state: RootState) => {
(state: RootState) => state.fileOps.librarySearchError, console.log(state);
); return state.fileOps.librarySearchError;
});
const dispatch = useDispatch(); const dispatch = useDispatch();
useEffect(() => { useEffect(() => {
dispatch( dispatch(
@@ -36,7 +36,7 @@ export const Library = (): ReactElement => {
from: 0, from: 0,
}, },
type: "all", type: "all",
trigger: "libraryPage" trigger: "libraryPage",
}, },
), ),
); );
@@ -89,7 +89,8 @@ export const Library = (): ReactElement => {
const WantedStatus = ({ value }) => { const WantedStatus = ({ value }) => {
return !value ? <span className="tag is-info is-light">Wanted</span> : null; return !value ? <span className="tag is-info is-light">Wanted</span> : null;
}; };
const columns = useMemo(() => [ const columns = useMemo(
() => [
{ {
header: "Comic Metadata", header: "Comic Metadata",
footer: 1, footer: 1,
@@ -99,7 +100,7 @@ export const Library = (): ReactElement => {
id: "fileDetails", id: "fileDetails",
minWidth: 400, minWidth: 400,
accessorKey: "_source", accessorKey: "_source",
cell: info => { cell: (info) => {
return <MetadataPanel data={info.getValue()} />; return <MetadataPanel data={info.getValue()} />;
}, },
}, },
@@ -108,7 +109,7 @@ export const Library = (): ReactElement => {
accessorKey: "_source.sourcedMetadata.comicInfo", accessorKey: "_source.sourcedMetadata.comicInfo",
align: "center", align: "center",
minWidth: 250, minWidth: 250,
cell: info => cell: (info) =>
!isEmpty(info.getValue()) ? ( !isEmpty(info.getValue()) ? (
<ComicInfoXML data={info.getValue()} /> <ComicInfoXML data={info.getValue()} />
) : ( ) : (
@@ -122,9 +123,8 @@ export const Library = (): ReactElement => {
columns: [ columns: [
{ {
header: "Publisher", header: "Publisher",
accessorKey: accessorKey: "_source.sourcedMetadata.comicvine.volumeInformation",
"_source.sourcedMetadata.comicvine.volumeInformation", cell: (info) => {
cell: info => {
return ( return (
!isNil(info.getValue()) && ( !isNil(info.getValue()) && (
<h6 className="is-size-7 has-text-weight-bold"> <h6 className="is-size-7 has-text-weight-bold">
@@ -137,15 +137,19 @@ export const Library = (): ReactElement => {
{ {
header: "Something", header: "Something",
accessorKey: "_source.acquisition.source.wanted", accessorKey: "_source.acquisition.source.wanted",
cell: info => { cell: (info) => {
!isUndefined(info.getValue()) ? !isUndefined(info.getValue()) ? (
<WantedStatus value={info.getValue().toString()} /> : "Nothing"; <WantedStatus value={info.getValue().toString()} />
) : (
"Nothing"
);
}, },
}, },
], ],
} },
], []); ],
[],
);
/** /**
* Pagination control that fetches the next x (pageSize) items * Pagination control that fetches the next x (pageSize) items
@@ -173,7 +177,6 @@ export const Library = (): ReactElement => {
); );
}, []); }, []);
/** /**
* Pagination control that fetches the previous x (pageSize) items * Pagination control that fetches the previous x (pageSize) items
* based on the y (pageIndex) offset from the ThreeTwo Elasticsearch index * based on the y (pageIndex) offset from the ThreeTwo Elasticsearch index
@@ -199,7 +202,7 @@ export const Library = (): ReactElement => {
from, from,
}, },
type: "all", type: "all",
trigger: "libraryPage" trigger: "libraryPage",
}, },
), ),
); );
@@ -229,7 +232,8 @@ export const Library = (): ReactElement => {
/> />
</div> </div>
</div> </div>
): <div className="columns"> ) : (
<div className="columns">
<div className="column is-two-thirds"> <div className="column is-two-thirds">
<article className="message is-link"> <article className="message is-link">
<div className="message-body"> <div className="message-body">
@@ -247,7 +251,8 @@ export const Library = (): ReactElement => {
)} )}
</pre> </pre>
</div> </div>
</div> } </div>
)}
</div> </div>
</section> </section>
); );

View File

@@ -1,4 +1,4 @@
import React from "react"; import React, { useContext } from "react";
import { SearchBar } from "./GlobalSearchBar/SearchBar"; import { SearchBar } from "./GlobalSearchBar/SearchBar";
import { DownloadProgressTick } from "./ComicDetail/DownloadProgressTick"; import { DownloadProgressTick } from "./ComicDetail/DownloadProgressTick";
import { Link } from "react-router-dom"; import { Link } from "react-router-dom";
@@ -10,6 +10,10 @@ const Navbar: React.FunctionComponent = (props) => {
(state: RootState) => state.airdcpp.downloadProgressData, (state: RootState) => state.airdcpp.downloadProgressData,
); );
// const airDCPPSocketConnectionStatus = useSelector((state: RootState) => {
// console.log(state);
// });
return ( return (
<nav className="navbar is-fixed-top"> <nav className="navbar is-fixed-top">
<div className="navbar-brand"> <div className="navbar-brand">
@@ -72,9 +76,7 @@ const Navbar: React.FunctionComponent = (props) => {
<div className="navbar-item has-dropdown is-hoverable"> <div className="navbar-item has-dropdown is-hoverable">
<a className="navbar-link is-arrowless"> <a className="navbar-link is-arrowless">
<i className="fa-solid fa-download"></i> <i className="fa-solid fa-download"></i>
{downloadProgressTick && ( {downloadProgressTick && <div className="pulsating-circle"></div>}
<div className="pulsating-circle"></div>
)}
</a> </a>
{!isUndefined(downloadProgressTick) ? ( {!isUndefined(downloadProgressTick) ? (
<div className="navbar-dropdown download-progress-meter"> <div className="navbar-dropdown download-progress-meter">
@@ -86,12 +88,11 @@ const Navbar: React.FunctionComponent = (props) => {
</div> </div>
{/* AirDC++ socket connection status */} {/* AirDC++ socket connection status */}
<div className="navbar-item has-dropdown is-hoverable"> <div className="navbar-item has-dropdown is-hoverable">
<a className="navbar-link is-arrowless"> <a className="navbar-link is-arrowless has-text-success">
<i className="fa-solid fa-bolt"></i> <i className="fa-solid fa-bolt"></i>
</a> </a>
</div> </div>
<div className="navbar-item has-dropdown is-hoverable is-mega"> <div className="navbar-item has-dropdown is-hoverable is-mega">
<div className="navbar-link flex">Blog</div> <div className="navbar-link flex">Blog</div>
<div id="blogDropdown" className="navbar-dropdown"> <div id="blogDropdown" className="navbar-dropdown">

View File

@@ -115,6 +115,8 @@ export const AIRDCPP_FILE_DOWNLOAD_COMPLETED =
export const LS_SINGLE_IMPORT = "LS_SINGLE_IMPORT"; export const LS_SINGLE_IMPORT = "LS_SINGLE_IMPORT";
export const AIRDCPP_BUNDLES_FETCHED = "AIRDCPP_BUNDLES_FETCHED"; export const AIRDCPP_BUNDLES_FETCHED = "AIRDCPP_BUNDLES_FETCHED";
export const AIRDCPP_DOWNLOAD_PROGRESS_TICK = "AIRDCPP_DOWNLOAD_PROGRESS_TICK"; export const AIRDCPP_DOWNLOAD_PROGRESS_TICK = "AIRDCPP_DOWNLOAD_PROGRESS_TICK";
export const AIRDCPP_SOCKET_CONNECTED = "AIRDCPP_SOCKET_CONNECTED";
export const AIRDCPP_SOCKET_DISCONNECTED = "AIRDCPP_SOCKET_DISCONNECTED";
// Transfers // Transfers
export const AIRDCPP_TRANSFERS_FETCHED = "AIRDCPP_TRANSFERS_FETCHED"; export const AIRDCPP_TRANSFERS_FETCHED = "AIRDCPP_TRANSFERS_FETCHED";

View File

@@ -1,7 +1,9 @@
import { isEmpty, isUndefined } from "lodash"; import { isEmpty, isUndefined } from "lodash";
import React, { createContext, useEffect, useState } from "react"; import React, { createContext, useEffect, useState } from "react";
import { useDispatch, useSelector } from "react-redux"; import { useDispatch, useSelector } from "react-redux";
import { setAirDCPPSocketConnectionAsActive } from "../actions/airdcpp.actions";
import { getSettings } from "../actions/settings.actions"; import { getSettings } from "../actions/settings.actions";
import AirDCPPSocket from "../services/DcppSearchService"; import AirDCPPSocket from "../services/DcppSearchService";
const AirDCPPSocketContextProvider = ({ children }) => { const AirDCPPSocketContextProvider = ({ children }) => {
@@ -51,16 +53,31 @@ const AirDCPPSocketContextProvider = ({ children }) => {
client: { host }, client: { host },
}, },
} = configuration; } = configuration;
const initializedAirDCPPSocket = new AirDCPPSocket({ const initializedAirDCPPSocket = new AirDCPPSocket({
protocol: `${host.protocol}`, protocol: `${host.protocol}`,
hostname: `${host.hostname}:${host.port}`, hostname: `${host.hostname}:${host.port}`,
}); });
// connect and disconnect handlers
initializedAirDCPPSocket.onConnected = (sessionInfo) => {
dispatch(setAirDCPPSocketConnectionAsActive());
};
initializedAirDCPPSocket.onDisconnected = async (
reason,
code,
wasClean,
) => {
console.log("kulkarni kamal kulthe", reason, code, wasClean);
};
const socketConnectionInformation = await initializedAirDCPPSocket.connect( const socketConnectionInformation = await initializedAirDCPPSocket.connect(
`${host.username}`, `${host.username}`,
`${host.password}`, `${host.password}`,
true, true,
); );
// update the state with the new socket connection information
persistSettings({ persistSettings({
...airDCPPState, ...airDCPPState,
airDCPPState: { airDCPPState: {

View File

@@ -9,6 +9,8 @@ import {
AIRDCPP_BUNDLES_FETCHED, AIRDCPP_BUNDLES_FETCHED,
AIRDCPP_TRANSFERS_FETCHED, AIRDCPP_TRANSFERS_FETCHED,
LIBRARY_ISSUE_BUNDLES, LIBRARY_ISSUE_BUNDLES,
AIRDCPP_SOCKET_CONNECTED,
AIRDCPP_SOCKET_DISCONNECTED,
} from "../constants/action-types"; } from "../constants/action-types";
import { LOCATION_CHANGE } from "redux-first-history"; import { LOCATION_CHANGE } from "redux-first-history";
import { isNil, isUndefined } from "lodash"; import { isNil, isUndefined } from "lodash";
@@ -24,6 +26,7 @@ const initialState = {
downloadFileStatus: {}, downloadFileStatus: {},
bundles: [], bundles: [],
transfers: [], transfers: [],
isAirDCPPSocketConnected: false,
}; };
function airdcppReducer(state = initialState, action) { function airdcppReducer(state = initialState, action) {
@@ -95,6 +98,18 @@ function airdcppReducer(state = initialState, action) {
...state, ...state,
transfers: action.bundles, transfers: action.bundles,
}; };
case AIRDCPP_SOCKET_CONNECTED:
return {
...state,
isAirDCPPSocketConnected: true,
};
case AIRDCPP_SOCKET_DISCONNECTED:
return {
...state,
isAirDCPPSocketConnected: false,
};
case LOCATION_CHANGE: case LOCATION_CHANGE:
return { return {
searchResults: [], searchResults: [],
@@ -105,7 +120,6 @@ function airdcppReducer(state = initialState, action) {
bundleDBImportResult: null, bundleDBImportResult: null,
// bundles: [], // bundles: [],
}; };
default: default:
return state; return state;
} }

View File

@@ -6686,13 +6686,6 @@ character-reference-invalid@^1.0.0:
resolved "https://registry.yarnpkg.com/character-reference-invalid/-/character-reference-invalid-1.1.4.tgz#083329cda0eae272ab3dbbf37e9a382c13af1560" resolved "https://registry.yarnpkg.com/character-reference-invalid/-/character-reference-invalid-1.1.4.tgz#083329cda0eae272ab3dbbf37e9a382c13af1560"
integrity sha512-mKKUkUbhPpQlCOfIuZkvSEgktjPFIsZKRRbC6KWVEMvlzblj3i3asQv5ODsrwt0N3pHAEvjP8KTQPHkp0+6jOg== integrity sha512-mKKUkUbhPpQlCOfIuZkvSEgktjPFIsZKRRbC6KWVEMvlzblj3i3asQv5ODsrwt0N3pHAEvjP8KTQPHkp0+6jOg==
chevrotain@7.0.3:
version "7.0.3"
resolved "https://registry.yarnpkg.com/chevrotain/-/chevrotain-7.0.3.tgz#f9621971a726eba804f7763edace2183d157c5d7"
integrity sha512-G634q7M5EiqNNv+0MKcQES2jmqabbi4PvUDpzjG2t+i1XQFaMCz0o8BZ8lbQbZex4RqkzJ3pOy+UwNLFlQm4eg==
dependencies:
regexp-to-ast "0.5.0"
chokidar@^2.1.8: chokidar@^2.1.8:
version "2.1.8" version "2.1.8"
resolved "https://registry.yarnpkg.com/chokidar/-/chokidar-2.1.8.tgz#804b3a7b6a99358c3c5c61e71d8728f041cff917" resolved "https://registry.yarnpkg.com/chokidar/-/chokidar-2.1.8.tgz#804b3a7b6a99358c3c5c61e71d8728f041cff917"
@@ -7120,14 +7113,7 @@ compromise-sentences@^0.3.0:
resolved "https://registry.yarnpkg.com/compromise-sentences/-/compromise-sentences-0.3.0.tgz#61d34039323155bc20dad10f24340daaabf86e26" resolved "https://registry.yarnpkg.com/compromise-sentences/-/compromise-sentences-0.3.0.tgz#61d34039323155bc20dad10f24340daaabf86e26"
integrity sha512-L6d5PXmmyPyWRMoJURYOM0yILhtV37zCOy9ZW8Xd6KgY+2qQBTwuokekaGL9MDpSH3/grRDL+AHKytYpGrTEmA== integrity sha512-L6d5PXmmyPyWRMoJURYOM0yILhtV37zCOy9ZW8Xd6KgY+2qQBTwuokekaGL9MDpSH3/grRDL+AHKytYpGrTEmA==
compromise-strict@^0.0.2: compromise@^13.11.4:
version "0.0.2"
resolved "https://registry.yarnpkg.com/compromise-strict/-/compromise-strict-0.0.2.tgz#e4bf4cc386e8795c6408d3606ebb2cd31cab9fbd"
integrity sha512-1ApkPa6kjmyS1ZFhDRZgttDcnVv+Ci8U0kIIsxRBLCN0vautyPm6FROvBwoLimlU3pgIH3hMIpdNdVfe2yj3Gw==
dependencies:
chevrotain "7.0.3"
compromise@^13.11.3, compromise@^13.11.4:
version "13.11.4" version "13.11.4"
resolved "https://registry.yarnpkg.com/compromise/-/compromise-13.11.4.tgz#3136e6d2c2cca822ba7cebd140c9f27f405b67f1" resolved "https://registry.yarnpkg.com/compromise/-/compromise-13.11.4.tgz#3136e6d2c2cca822ba7cebd140c9f27f405b67f1"
integrity sha512-nBITcNdqIHSVDDluaG6guyFFCSNXN+Hu87fU8VlhkE5Z0PwTZN1nro2O7a8JcUH88nB5EOzrxd9zKfXLSNFqcg== integrity sha512-nBITcNdqIHSVDDluaG6guyFFCSNXN+Hu87fU8VlhkE5Z0PwTZN1nro2O7a8JcUH88nB5EOzrxd9zKfXLSNFqcg==
@@ -15855,11 +15841,6 @@ regex-not@^1.0.0, regex-not@^1.0.2:
extend-shallow "^3.0.2" extend-shallow "^3.0.2"
safe-regex "^1.1.0" safe-regex "^1.1.0"
regexp-to-ast@0.5.0:
version "0.5.0"
resolved "https://registry.yarnpkg.com/regexp-to-ast/-/regexp-to-ast-0.5.0.tgz#56c73856bee5e1fef7f73a00f1473452ab712a24"
integrity sha512-tlbJqcMHnPKI9zSrystikWKwHkBqu2a/Sgw01h3zFjvYrMxEDYHzzoMZnUrbIfpTFEsoRnnviOXNCzFiSc54Qw==
regexp.prototype.flags@^1.4.1, regexp.prototype.flags@^1.4.3: regexp.prototype.flags@^1.4.1, regexp.prototype.flags@^1.4.3:
version "1.4.3" version "1.4.3"
resolved "https://registry.yarnpkg.com/regexp.prototype.flags/-/regexp.prototype.flags-1.4.3.tgz#87cab30f80f66660181a3bb7bf5981a872b367ac" resolved "https://registry.yarnpkg.com/regexp.prototype.flags/-/regexp.prototype.flags-1.4.3.tgz#87cab30f80f66660181a3bb7bf5981a872b367ac"