Skip to content

Commit

Permalink
fix: handle empty authorBadges
Browse files Browse the repository at this point in the history
  • Loading branch information
uetchy committed Apr 1, 2022
1 parent f8b0a9b commit 0a3d15c
Show file tree
Hide file tree
Showing 3 changed files with 30 additions and 30 deletions.
10 changes: 5 additions & 5 deletions rollup.config.js
Original file line number Diff line number Diff line change
Expand Up @@ -2,7 +2,7 @@ import commonjs from "@rollup/plugin-commonjs";
import { nodeResolve } from "@rollup/plugin-node-resolve";
import typescript from "@rollup/plugin-typescript";
import dts from "rollup-plugin-dts";
import { terser } from "rollup-plugin-terser";
// import { terser } from "rollup-plugin-terser";

const isProd = process.env.NODE_ENV === "production";

Expand All @@ -29,10 +29,10 @@ export default [
preferBuiltins: false, // required for `events` polyfill
}),
commonjs(),
isProd &&
terser({
keep_classnames: true, // avoid Error class mangling
}),
// isProd &&
// terser({
// keep_classnames: true, // avoid Error class mangling
// }),
],
external: ["cross-fetch", "debug"],
},
Expand Down
11 changes: 5 additions & 6 deletions src/chat/actions/addChatItemAction.ts
Original file line number Diff line number Diff line change
Expand Up @@ -245,14 +245,13 @@ export function parseLiveChatMembershipItemRenderer(
const authorPhoto = pickThumbUrl(renderer.authorPhoto);

// observed, MODERATOR
const membership = parseMembership(
renderer.authorBadges[renderer.authorBadges.length - 1]
);
// observed, undefined renderer.authorBadges
const membership = renderer.authorBadges
? parseMembership(renderer.authorBadges[renderer.authorBadges.length - 1])
: undefined;
if (!membership) {
throw new Error(
`Failed to parse membership (membership): ${JSON.stringify(
renderer.authorBadges
)}`
`Failed to parse membership (membership): ${JSON.stringify(renderer)}`
);
}

Expand Down
39 changes: 20 additions & 19 deletions src/masterchat.ts
Original file line number Diff line number Diff line change
Expand Up @@ -364,34 +364,38 @@ export class Masterchat extends EventEmitter {
payload = (await this.post(requestUrl, requestBody)).data;
} catch (err) {
// handle user cancallation
if ((err as any)?.message === "canceled") throw new AbortError();
if ((err as any)?.message === "canceled") {
this.log(`fetch`, `Request canceled`);
throw new AbortError();
}

// handle server errors
if ((err as any)?.isAxiosError) {
const { code: axiosErrorCode, response } = err as AxiosError;

// handle axios timeout
// handle early timeout
if (axiosErrorCode === "ECONNABORTED") {
this.log("timeout", "Got ECONNABORTED from axios");
if (retryRemaining > 0) {
retryRemaining -= 1;
this.log(
`axios`,
`Retrying remaining=${retryRemaining} interval=${retryInterval} axiosStatus=${axiosErrorCode}`
`fetch`,
`Retrying ${retryRemaining} / ${retryInterval}ms cause=EARLY_TIMEOUT`
);
await delay(retryInterval);
continue loop;
}
}

if (!response) {
this.log(
"fetch",
`Empty error response ${err} (${axiosErrorCode})`
);
throw new Error(
`Axios got invalid error response: ${err} (${axiosErrorCode})`
`Axios got empty error response: ${err} (${axiosErrorCode})`
);
}

this.log("axiosError", response.status);

/** error.code ->
* 400: request contains an invalid argument
* - when attempting to access livechat while it is already in replay mode
Expand All @@ -406,10 +410,7 @@ export class Masterchat extends EventEmitter {
* - temporary server-side failure
*/
const { code, status, message } = response.data.error;
this.log(
`youtube`,
`API Error: code=${code} status=${status} - ${message}`
);
this.log(`fetch`, `API error: ${code} (${status}): ${message}`);

switch (status) {
// stream got privated
Expand All @@ -430,17 +431,17 @@ export class Masterchat extends EventEmitter {
if (retryRemaining > 0) {
retryRemaining -= 1;
this.log(
`axios`,
`Retrying remaining=${retryRemaining} interval=${retryInterval} status=${status} msg=${message}`
`fetch`,
`Retrying ${retryRemaining} / ${retryInterval}ms cause=${status}`
);
await delay(retryInterval);
continue loop;
}

default:
this.log(
`[action required] axios`,
`Unrecognized server error:`,
`fetch`,
`[action required] Got unrecognized error from the API:`,
status,
message,
JSON.stringify(response.data)
Expand All @@ -449,9 +450,9 @@ export class Masterchat extends EventEmitter {
}
}

// handle client errors
// handle client-side errors
// ECONNRESET, ETIMEOUT, etc
this.log(`client`, `Unrecoverable error:`, err);
this.log(`fetch`, `Unrecoverable error:`, err);
throw err;
}

Expand All @@ -474,7 +475,7 @@ export class Masterchat extends EventEmitter {
// or accessing replay chat with live chat token
// retry with replay endpoint if isLive is unknown
if (this.isLive === undefined) {
this.log("fetch", "switched to replay endpoint");
this.log("fetch", "Switched to replay endpoint");
this.isLive = false;
applyNewLiveStatus(false);
continue loop;
Expand Down

0 comments on commit 0a3d15c

Please sign in to comment.