Skip to content

Commit 9a526c5

Browse files
authored
Merge pull request ajayyy#2323 from mini-bomba/error_handling
Improve error handling
2 parents cc17081 + bf6626f commit 9a526c5

18 files changed

+238
-156
lines changed

src/background.ts

Lines changed: 10 additions & 27 deletions
Original file line numberDiff line numberDiff line change
@@ -3,7 +3,7 @@ import * as CompileConfig from "../config.json";
33
import Config from "./config";
44
import { Registration } from "./types";
55
import "content-scripts-register-polyfill";
6-
import { sendRealRequestToCustomServer, setupBackgroundRequestProxy } from "../maze-utils/src/background-request-proxy";
6+
import { sendRealRequestToCustomServer, serializeOrStringify, setupBackgroundRequestProxy } from "../maze-utils/src/background-request-proxy";
77
import { setupTabUpdates } from "../maze-utils/src/tab-updates";
88
import { generateUserID } from "../maze-utils/src/setup";
99

@@ -227,33 +227,16 @@ async function submitVote(type: number, UUID: string, category: string, videoID:
227227

228228
try {
229229
const response = await asyncRequestToServer("POST", "/api/voteOnSponsorTime?UUID=" + UUID + "&videoID=" + videoID + "&userID=" + userID + typeSection);
230-
231-
if (response.ok) {
232-
return {
233-
successType: 1,
234-
responseText: await response.text()
235-
};
236-
} else if (response.status == 405) {
237-
//duplicate vote
238-
return {
239-
successType: 0,
240-
statusCode: response.status,
241-
responseText: await response.text()
242-
};
243-
} else {
244-
//error while connect
245-
return {
246-
successType: -1,
247-
statusCode: response.status,
248-
responseText: await response.text()
249-
};
250-
}
230+
231+
return {
232+
status: response.status,
233+
ok: response.ok,
234+
responseText: await response.text(),
235+
};
251236
} catch (e) {
252-
console.error(e);
237+
console.error("Error while voting:", e);
253238
return {
254-
successType: -1,
255-
statusCode: -1,
256-
responseText: ""
239+
error: serializeOrStringify(e),
257240
};
258241
}
259242
}
@@ -263,4 +246,4 @@ async function asyncRequestToServer(type: string, address: string, data = {}) {
263246
const serverAddress = Config.config.testingServer ? CompileConfig.testingServerAddress : Config.config.serverAddress;
264247

265248
return await (sendRealRequestToCustomServer(type, serverAddress + address, data));
266-
}
249+
}

src/components/CategoryPillComponent.tsx

Lines changed: 9 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -8,7 +8,8 @@ import { downvoteButtonColor, SkipNoticeAction } from "../utils/noticeUtils";
88
import { VoteResponse } from "../messageTypes";
99
import { AnimationUtils } from "../../maze-utils/src/animationUtils";
1010
import { Tooltip } from "../render/Tooltip";
11-
import { getErrorMessage } from "../../maze-utils/src/formating";
11+
import { formatJSErrorMessage, getLongErrorMessage } from "../../maze-utils/src/formating";
12+
import { logRequest } from "../../maze-utils/src/background-request-proxy";
1213

1314
export interface CategoryPillProps {
1415
vote: (type: number, UUID: SegmentUUID, category?: Category) => Promise<VoteResponse>;
@@ -127,15 +128,19 @@ class CategoryPillComponent extends React.Component<CategoryPillProps, CategoryP
127128
const response = await this.props.vote(type, this.state.segment.UUID);
128129
await stopAnimation();
129130

130-
if (response.successType == 1 || (response.successType == -1 && response.statusCode == 429)) {
131+
if ("error" in response) {
132+
console.error("[SB] Caught error while attempting to vote on a FV label", response.error);
133+
alert(formatJSErrorMessage(response.error));
134+
} else if (response.ok || response.status === 429) {
131135
this.setState({
132136
open: false,
133137
show: type === 1
134138
});
135139

136140
this.closeTooltip();
137-
} else if (response.statusCode !== 403) {
138-
alert(getErrorMessage(response.statusCode, response.responseText));
141+
} else if (response.status !== 403) {
142+
logRequest({headers: null, ...response}, "SB", "vote on FV label");
143+
alert(getLongErrorMessage(response.status, response.responseText));
139144
}
140145
}
141146
}

src/components/ChapterVoteComponent.tsx

Lines changed: 9 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -8,7 +8,8 @@ import { downvoteButtonColor, SkipNoticeAction } from "../utils/noticeUtils";
88
import { VoteResponse } from "../messageTypes";
99
import { AnimationUtils } from "../../maze-utils/src/animationUtils";
1010
import { Tooltip } from "../render/Tooltip";
11-
import { getErrorMessage } from "../../maze-utils/src/formating";
11+
import { formatJSErrorMessage, getLongErrorMessage } from "../../maze-utils/src/formating";
12+
import { logRequest } from "../../maze-utils/src/background-request-proxy";
1213

1314
export interface ChapterVoteProps {
1415
vote: (type: number, UUID: SegmentUUID, category?: Category) => Promise<VoteResponse>;
@@ -119,12 +120,16 @@ class ChapterVoteComponent extends React.Component<ChapterVoteProps, ChapterVote
119120
const response = await this.props.vote(type, this.state.segment.UUID);
120121
await stopAnimation();
121122

122-
if (response.successType == 1 || (response.successType == -1 && response.statusCode == 429)) {
123+
if ("error" in response){
124+
console.error("[SB] Caught error while attempting to vote on a chapter", response.error);
125+
alert(formatJSErrorMessage(response.error));
126+
} else if (response.ok || response.status == 429) {
123127
this.setState({
124128
show: type === 1
125129
});
126-
} else if (response.statusCode !== 403) {
127-
alert(getErrorMessage(response.statusCode, response.responseText));
130+
} else if (response.status !== 403) {
131+
logRequest({headers: null, ...response}, "SB", "vote on chapter");
132+
alert(getLongErrorMessage(response.status, response.responseText));
128133
}
129134
}
130135
}

src/components/SponsorTimeEditComponent.tsx

Lines changed: 14 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -12,6 +12,7 @@ import { defaultPreviewTime } from "../utils/constants";
1212
import { getVideo, getVideoDuration } from "../../maze-utils/src/video";
1313
import { AnimationUtils } from "../../maze-utils/src/animationUtils";
1414
import { Tooltip } from "../render/Tooltip";
15+
import { logRequest } from "../../maze-utils/src/background-request-proxy";
1516

1617
export interface SponsorTimeEditProps {
1718
index: number;
@@ -781,23 +782,26 @@ class SponsorTimeEditComponent extends React.Component<SponsorTimeEditProps, Spo
781782
if (this.props.contentContainer().channelIDInfo.status !== ChannelIDStatus.Found) return;
782783

783784
this.fetchingSuggestions = true;
784-
const result = await asyncRequestToServer("GET", "/api/chapterNames", {
785-
description,
786-
channelID: this.props.contentContainer().channelIDInfo.id
787-
});
788-
789-
if (result.ok) {
790-
try {
785+
try {
786+
const result = await asyncRequestToServer("GET", "/api/chapterNames", {
787+
description,
788+
channelID: this.props.contentContainer().channelIDInfo.id
789+
});
790+
if (result.ok) {
791791
const names = JSON.parse(result.responseText) as {description: string}[];
792792
this.setState({
793793
suggestedNames: names.map(n => ({
794794
label: n.description
795795
}))
796796
});
797-
} catch (e) {} //eslint-disable-line no-empty
797+
} else if (result.status !== 404) {
798+
logRequest(result, "SB", "chapter suggestion")
799+
}
800+
} catch (e) {
801+
console.warn("[SB] Caught error while fetching chapter suggestions", e);
802+
} finally {
803+
this.fetchingSuggestions = false;
798804
}
799-
800-
this.fetchingSuggestions = false;
801805
}
802806

803807
configUpdate(): void {

src/content.ts

Lines changed: 48 additions & 24 deletions
Original file line numberDiff line numberDiff line change
@@ -34,7 +34,7 @@ import { importTimes } from "./utils/exporter";
3434
import { ChapterVote } from "./render/ChapterVote";
3535
import { openWarningDialog } from "./utils/warnings";
3636
import { extensionUserAgent, isFirefoxOrSafari, waitFor } from "../maze-utils/src";
37-
import { getErrorMessage, getFormattedTime } from "../maze-utils/src/formating";
37+
import { formatJSErrorMessage, getFormattedTime, getLongErrorMessage } from "../maze-utils/src/formating";
3838
import { getChannelIDInfo, getVideo, getIsAdPlaying, getIsLivePremiere, setIsAdPlaying, checkVideoIDChange, getVideoID, getYouTubeVideoID, setupVideoModule, checkIfNewVideoID, isOnInvidious, isOnMobileYouTube, isOnYouTubeMusic, isOnYTTV, getLastNonInlineVideoID, triggerVideoIDChange, triggerVideoElementChange, getIsInline, getCurrentTime, setCurrentTime, getVideoDuration, verifyCurrentTime, waitForVideo } from "../maze-utils/src/video";
3939
import { Keybind, StorageChangesObject, isSafari, keybindEquals, keybindToString } from "../maze-utils/src/config";
4040
import { findValidElement } from "../maze-utils/src/dom"
@@ -53,6 +53,7 @@ import { defaultPreviewTime } from "./utils/constants";
5353
import { onVideoPage } from "../maze-utils/src/pageInfo";
5454
import { getSegmentsForVideo } from "./utils/segmentData";
5555
import { getCategoryDefaultSelection, getCategorySelection } from "./utils/skipRule";
56+
import { FetchResponse, logRequest } from "../maze-utils/src/background-request-proxy";
5657

5758
cleanPage();
5859

@@ -173,7 +174,7 @@ let popupInitialised = false;
173174

174175
let submissionNotice: SubmissionNotice = null;
175176

176-
let lastResponseStatus: number;
177+
let lastResponseStatus: number | Error | string;
177178

178179
// Contains all of the functions and variables needed by the skip notice
179180
const skipNoticeContentContainer: ContentContainer = () => ({
@@ -1314,15 +1315,19 @@ function importExistingChapters(wait: boolean) {
13141315

13151316
async function lockedCategoriesLookup(): Promise<void> {
13161317
const hashPrefix = (await getHash(getVideoID(), 1)).slice(0, 4);
1317-
const response = await asyncRequestToServer("GET", "/api/lockCategories/" + hashPrefix);
1318+
try {
1319+
const response = await asyncRequestToServer("GET", "/api/lockCategories/" + hashPrefix);
13181320

1319-
if (response.ok) {
1320-
try {
1321+
if (response.ok) {
13211322
const categoriesResponse = JSON.parse(response.responseText).filter((lockInfo) => lockInfo.videoID === getVideoID())[0]?.categories;
13221323
if (Array.isArray(categoriesResponse)) {
13231324
lockedCategories = categoriesResponse;
13241325
}
1325-
} catch (e) { } //eslint-disable-line no-empty
1326+
} else if (response.status !== 404) {
1327+
logRequest(response, "SB", "locked categories")
1328+
}
1329+
} catch (e) {
1330+
console.warn(`[SB] Caught error while looking up category locks for hashprefix ${hashPrefix}`, e)
13261331
}
13271332
}
13281333

@@ -1724,7 +1729,11 @@ function sendTelemetryAndCount(skippingSegments: SponsorTime[], secondsSkipped:
17241729
counted = true;
17251730
}
17261731

1727-
if (fullSkip) asyncRequestToServer("POST", "/api/viewedVideoSponsorTime?UUID=" + segment.UUID + "&videoID=" + getVideoID());
1732+
if (fullSkip) asyncRequestToServer("POST", "/api/viewedVideoSponsorTime?UUID=" + segment.UUID + "&videoID=" + getVideoID())
1733+
.then(r => {
1734+
if (!r.ok) logRequest(r, "SB", "segment skip log");
1735+
})
1736+
.catch(e => console.warn("[SB] Caught error while attempting to log segment skip", e));
17281737
}
17291738
}
17301739
}
@@ -2284,25 +2293,29 @@ function clearSponsorTimes() {
22842293
async function vote(type: number, UUID: SegmentUUID, category?: Category, skipNotice?: SkipNoticeComponent): Promise<VoteResponse> {
22852294
if (skipNotice !== null && skipNotice !== undefined) {
22862295
//add loading info
2287-
skipNotice.addVoteButtonInfo.bind(skipNotice)(chrome.i18n.getMessage("Loading"))
2288-
skipNotice.setNoticeInfoMessage.bind(skipNotice)();
2296+
skipNotice.addVoteButtonInfo(chrome.i18n.getMessage("Loading"))
2297+
skipNotice.setNoticeInfoMessage();
22892298
}
22902299

22912300
const response = await voteAsync(type, UUID, category);
22922301
if (response != undefined) {
22932302
//see if it was a success or failure
22942303
if (skipNotice != null) {
2295-
if (response.successType == 1 || (response.successType == -1 && response.statusCode == 429)) {
2304+
if ("error" in response) {
2305+
skipNotice.setNoticeInfoMessage(formatJSErrorMessage(response.error))
2306+
skipNotice.resetVoteButtonInfo();
2307+
} else if (response.ok || response.status === 429) {
22962308
//success (treat rate limits as a success)
2297-
skipNotice.afterVote.bind(skipNotice)(utils.getSponsorTimeFromUUID(sponsorTimes, UUID), type, category);
2298-
} else if (response.successType == -1) {
2299-
if (response.statusCode === 403 && response.responseText.startsWith("Vote rejected due to a tip from a moderator.")) {
2309+
skipNotice.afterVote(utils.getSponsorTimeFromUUID(sponsorTimes, UUID), type, category);
2310+
} else {
2311+
logRequest({headers: null, ...response}, "SB", "vote on segment");
2312+
if (response.status === 403 && response.responseText.startsWith("Vote rejected due to a tip from a moderator.")) {
23002313
openWarningDialog(skipNoticeContentContainer);
23012314
} else {
2302-
skipNotice.setNoticeInfoMessage.bind(skipNotice)(getErrorMessage(response.statusCode, response.responseText))
2315+
skipNotice.setNoticeInfoMessage(getLongErrorMessage(response.status, response.responseText))
23032316
}
23042317

2305-
skipNotice.resetVoteButtonInfo.bind(skipNotice)();
2318+
skipNotice.resetVoteButtonInfo();
23062319
}
23072320
}
23082321
}
@@ -2339,7 +2352,7 @@ async function voteAsync(type: number, UUID: SegmentUUID, category?: Category):
23392352
category: category,
23402353
videoID: getVideoID()
23412354
}, (response) => {
2342-
if (response.successType === 1) {
2355+
if (response.ok === true) {
23432356
// Change the sponsor locally
23442357
const segment = utils.getSponsorTimeFromUUID(sponsorTimes, UUID);
23452358
if (segment) {
@@ -2468,13 +2481,23 @@ async function sendSubmitMessage(): Promise<boolean> {
24682481
}
24692482
}
24702483

2471-
const response = await asyncRequestToServer("POST", "/api/skipSegments", {
2472-
videoID: getVideoID(),
2473-
userID: Config.config.userID,
2474-
segments: sponsorTimesSubmitting,
2475-
videoDuration: getVideoDuration(),
2476-
userAgent: extensionUserAgent(),
2477-
});
2484+
let response: FetchResponse;
2485+
try {
2486+
response = await asyncRequestToServer("POST", "/api/skipSegments", {
2487+
videoID: getVideoID(),
2488+
userID: Config.config.userID,
2489+
segments: sponsorTimesSubmitting,
2490+
videoDuration: getVideoDuration(),
2491+
userAgent: extensionUserAgent(),
2492+
});
2493+
} catch (e) {
2494+
console.error("[SB] Caught error while attempting to submit segments", e);
2495+
// Show that the upload failed
2496+
playerButtons.submit.button.style.animation = "unset";
2497+
playerButtons.submit.image.src = chrome.runtime.getURL("icons/PlayerUploadFailedIconSponsorBlocker.svg");
2498+
alert(formatJSErrorMessage(e));
2499+
return false;
2500+
}
24782501

24792502
if (response.status === 200) {
24802503
stopAnimation();
@@ -2523,7 +2546,8 @@ async function sendSubmitMessage(): Promise<boolean> {
25232546
if (response.status === 403 && response.responseText.startsWith("Submission rejected due to a tip from a moderator.")) {
25242547
openWarningDialog(skipNoticeContentContainer);
25252548
} else {
2526-
alert(getErrorMessage(response.status, response.responseText));
2549+
logRequest(response, "SB", "segment submission");
2550+
alert(getLongErrorMessage(response.status, response.responseText));
25272551
}
25282552
}
25292553

src/dearrowPromotion.ts

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -32,7 +32,7 @@ export async function tryShowingDeArrowPromotion() {
3232
const title = deArrowDataJson?.[getVideoID()]?.titles?.[0];
3333
if (title && title.title && (title.locked || title.votes > 0)) {
3434
Config.config.showDeArrowPromotion = false;
35-
35+
3636
tooltip = new Tooltip({
3737
text: chrome.i18n.getMessage("DeArrowTitleReplacementSuggestion") + "\n\n" + title.title,
3838
linkOnClick: () => {
@@ -71,4 +71,4 @@ function badTitle(title: string): boolean {
7171

7272
export function hideDeArrowPromotion(): void {
7373
if (tooltip) tooltip.close();
74-
}
74+
}

src/messageTypes.ts

Lines changed: 7 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -77,7 +77,7 @@ export type Message = BaseMessage & (DefaultMessage | BoolValueMessage | IsInfoF
7777

7878
export interface IsInfoFoundMessageResponse {
7979
found: boolean;
80-
status: number;
80+
status: number | string | Error;
8181
sponsorTimes: SponsorTime[];
8282
time: number;
8383
onMobileYouTube: boolean;
@@ -120,11 +120,13 @@ export type MessageResponse =
120120
| LogResponse
121121
| LoopedChapterResponse;
122122

123-
export interface VoteResponse {
124-
successType: number;
125-
statusCode: number;
123+
export type VoteResponse = {
124+
status: number;
125+
ok: boolean;
126126
responseText: string;
127-
}
127+
} | {
128+
error: Error | string;
129+
};
128130

129131
interface ImportSegmentsResponse {
130132
importedSegments: SponsorTime[];

src/options.ts

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -609,6 +609,8 @@ function activatePrivateTextChange(element: HTMLElement) {
609609
if (userInfo.warnings > 0 || userInfo.banned) {
610610
setButton.classList.add("hidden");
611611
}
612+
}).catch(e => {
613+
console.error("[SB] Caught error while fetching user info for the new user ID", e)
612614
});
613615
}
614616

0 commit comments

Comments
 (0)