From d3bfca5d7c0e4aac1be910354e0e7d00c414dc3e Mon Sep 17 00:00:00 2001 From: pike Date: Sun, 3 Dec 2023 21:16:54 +0100 Subject: [PATCH] feat: Improve Logger.error and fatal, return error --- src/auth/FacebookAuth.ts | 40 +++++++++++++++++------------------- src/auth/InstagramAuth.ts | 9 +++----- src/auth/LinkedInAuth.ts | 27 ++++++++++-------------- src/auth/RedditAuth.ts | 30 ++++++++++++--------------- src/auth/TwitterAuth.ts | 16 ++++++--------- src/models/Feed.ts | 12 +++++------ src/models/Platform.ts | 2 +- src/platforms/Ayrshare.ts | 23 ++++++++++----------- src/platforms/Facebook.ts | 19 +++++++++-------- src/platforms/Instagram.ts | 42 ++++++++++++++++---------------------- src/platforms/LinkedIn.ts | 15 +++++++------- src/platforms/Reddit.ts | 24 ++++++++++------------ src/platforms/Twitter.ts | 27 +++++++++++++----------- src/services/Fairpost.ts | 12 ----------- src/services/Logger.ts | 28 ++++++++++++++++++------- src/services/Storage.ts | 12 ++++++----- 16 files changed, 159 insertions(+), 179 deletions(-) diff --git a/src/auth/FacebookAuth.ts b/src/auth/FacebookAuth.ts index f389494..c3e9925 100644 --- a/src/auth/FacebookAuth.ts +++ b/src/auth/FacebookAuth.ts @@ -1,5 +1,5 @@ -import OAuth2Client from "./OAuth2Client"; import Logger from "../services/Logger"; +import OAuth2Client from "./OAuth2Client"; import Storage from "../services/Storage"; export default class FacebookAuth extends OAuth2Client { @@ -51,18 +51,15 @@ export default class FacebookAuth extends OAuth2Client { const result = await this.requestRemotePermissions("Facebook", url.href); if (result["error"]) { const msg = result["error_reason"] + " - " + result["error_description"]; - Logger.error(msg, result); - throw new Error(msg); + throw Logger.error(msg, result); } if (result["state"] !== state) { const msg = "Response state does not match request state"; - Logger.error(msg, result); - throw new Error(msg); + throw Logger.error(msg, result); } if (!result["code"]) { const msg = "Remote response did not return a code"; - Logger.error(msg, result); - throw new Error(msg); + throw Logger.error(msg, result); } return result["code"] as string; } @@ -83,8 +80,7 @@ export default class FacebookAuth extends OAuth2Client { if (!result["access_token"]) { const msg = "Remote response did not return a access_token"; - Logger.error(msg, result); - throw new Error(msg); + throw Logger.error(msg, result); } return result["access_token"]; @@ -129,9 +125,9 @@ export default class FacebookAuth extends OAuth2Client { ]; if (!llPageAccessToken) { - console.error(data); - throw new Error( + throw Logger.error( "No llPageAccessToken for page " + pageId + " in response.", + data, ); } @@ -160,8 +156,10 @@ export default class FacebookAuth extends OAuth2Client { access_token: string; }; if (!data["access_token"]) { - console.error(data); - throw new Error("No llUserAccessToken access_token in response."); + throw Logger.error( + "No llUserAccessToken access_token in response.", + data, + ); } return data["access_token"]; @@ -182,8 +180,7 @@ export default class FacebookAuth extends OAuth2Client { name: string; }; if (!data["id"]) { - console.error(data); - throw new Error("Can not get app scoped user id."); + throw Logger.error("Can not get app scoped user id.", data); } return data["id"]; } @@ -221,8 +218,11 @@ export default class FacebookAuth extends OAuth2Client { */ private async handleApiResponse(response: Response): Promise { if (!response.ok) { - Logger.error("FacebookAuth.handleApiResponse", response); - throw new Error(response.status + ":" + response.statusText); + throw Logger.error( + "FacebookAuth.handleApiResponse", + response.status + ":" + response.statusText, + response, + ); } const data = await response.json(); if (data.error) { @@ -236,8 +236,7 @@ export default class FacebookAuth extends OAuth2Client { data.error.error_subcode + ") " + data.error.message; - Logger.error("FacebookAuth.handleApiResponse", error); - throw new Error(error); + throw Logger.error("FacebookAuth.handleApiResponse", error); } Logger.trace("FacebookAuth.handleApiResponse", "success"); return data; @@ -248,7 +247,6 @@ export default class FacebookAuth extends OAuth2Client { * @param error - the error returned from fetch */ private handleApiError(error: Error): never { - Logger.error("FacebookAuth.handleApiError", error); - throw error; + throw Logger.error("FacebookAuth.handleApiError", error); } } diff --git a/src/auth/InstagramAuth.ts b/src/auth/InstagramAuth.ts index b89781b..cae66c7 100644 --- a/src/auth/InstagramAuth.ts +++ b/src/auth/InstagramAuth.ts @@ -52,18 +52,15 @@ export default class InstagramAuth extends FacebookAuth { if (result["error"]) { const msg = result["error_reason"] + " - " + result["error_description"]; - Logger.error(msg, result); - throw new Error(msg); + throw Logger.error(msg, result); } if (result["state"] !== state) { const msg = "Response state does not match request state"; - Logger.error(msg, result); - throw new Error(msg); + throw Logger.error(msg, result); } if (!result["code"]) { const msg = "Remote response did not return a code"; - Logger.error(msg, result); - throw new Error(msg); + throw Logger.error(msg, result); } return result["code"] as string; } diff --git a/src/auth/LinkedInAuth.ts b/src/auth/LinkedInAuth.ts index 63f0b68..6107e5b 100644 --- a/src/auth/LinkedInAuth.ts +++ b/src/auth/LinkedInAuth.ts @@ -1,5 +1,5 @@ -import OAuth2Client from "./OAuth2Client"; import Logger from "../services/Logger"; +import OAuth2Client from "./OAuth2Client"; import Storage from "../services/Storage"; export default class LinkedInAuth extends OAuth2Client { @@ -41,8 +41,7 @@ export default class LinkedInAuth extends OAuth2Client { if (!result["access_token"]) { const msg = "Remote response did not return a access_token"; - Logger.error(msg, result); - throw new Error(msg); + throw Logger.error(msg, result); } this.accessToken = result["access_token"]; // now store it @@ -74,18 +73,15 @@ export default class LinkedInAuth extends OAuth2Client { const result = await this.requestRemotePermissions("LinkedIn", url.href); if (result["error"]) { const msg = result["error_reason"] + " - " + result["error_description"]; - Logger.error(msg, result); - throw new Error(msg); + throw Logger.error(msg, result); } if (result["state"] !== state) { const msg = "Response state does not match request state"; - Logger.error(msg, result); - throw new Error(msg); + throw Logger.error(msg, result); } if (!result["code"]) { const msg = "Remote response did not return a code"; - Logger.error(msg, result); - throw new Error(msg); + throw Logger.error(msg, result); } return result["code"] as string; } @@ -117,8 +113,7 @@ export default class LinkedInAuth extends OAuth2Client { if (!result["access_token"]) { const msg = "Remote response did not return a access_token"; - Logger.error(msg, result); - throw new Error(msg); + throw Logger.error(msg, result); } return result; @@ -156,10 +151,11 @@ export default class LinkedInAuth extends OAuth2Client { */ private async handleApiResponse(response: Response): Promise { if (!response.ok) { - Logger.error("LinkedInAuth.handleApiResponse", "not ok"); - Logger.error("LinkedInAuth.handleApiResponse", await response.json()); - throw new Error( + Logger.warn("LinkedInAuth.handleApiResponse", "not ok"); + throw Logger.error( + "LinkedInAuth.handleApiResponse", response.url + ":" + response.status + ", " + response.statusText, + await response.json(), ); } const data = await response.json(); @@ -174,8 +170,7 @@ export default class LinkedInAuth extends OAuth2Client { data.error.error_subcode + ") " + data.error.message; - Logger.error("LinkedInAuth.handleApiResponse", error); - throw new Error(error); + throw Logger.error("LinkedInAuth.handleApiResponse", error); } Logger.trace("LinkedInAuth.handleApiResponse", "success"); return data; diff --git a/src/auth/RedditAuth.ts b/src/auth/RedditAuth.ts index 09998d8..786f7dc 100644 --- a/src/auth/RedditAuth.ts +++ b/src/auth/RedditAuth.ts @@ -1,5 +1,5 @@ -import OAuth2Client from "./OAuth2Client"; import Logger from "../services/Logger"; +import OAuth2Client from "./OAuth2Client"; import Storage from "../services/Storage"; export default class RedditAuth extends OAuth2Client { @@ -38,8 +38,7 @@ export default class RedditAuth extends OAuth2Client { if (!result["access_token"]) { const msg = "Remote response did not return a access_token"; - Logger.error(msg, result); - throw new Error(msg); + throw Logger.error(msg, result); } this.accessToken = result["access_token"]; return this.accessToken; @@ -66,18 +65,15 @@ export default class RedditAuth extends OAuth2Client { const result = await this.requestRemotePermissions("Reddit", url.href); if (result["error"]) { const msg = result["error_reason"] + " - " + result["error_description"]; - Logger.error(msg, result); - throw new Error(msg); + throw Logger.error(msg, result); } if (result["state"] !== state) { const msg = "Response state does not match request state"; - Logger.error(msg, result); - throw new Error(msg); + throw Logger.error(msg, result); } if (!result["code"]) { const msg = "Remote response did not return a code"; - Logger.error(msg, result); - throw new Error(msg); + throw Logger.error(msg, result); } return result["code"] as string; } @@ -106,8 +102,7 @@ export default class RedditAuth extends OAuth2Client { if (!result["access_token"]) { const msg = "Remote response did not return a access_token"; - Logger.error(msg, result); - throw new Error(msg); + throw Logger.error(msg, result); } return result; @@ -153,8 +148,11 @@ export default class RedditAuth extends OAuth2Client { */ private async handleApiResponse(response: Response): Promise { if (!response.ok) { - Logger.error("RedditAuth.handleApiResponse", "not ok"); - throw new Error(response.status + ":" + response.statusText); + throw Logger.error( + "RedditAuth.handleApiResponse", + "not ok", + response.status + ":" + response.statusText, + ); } const data = await response.json(); if (data.error) { @@ -168,8 +166,7 @@ export default class RedditAuth extends OAuth2Client { data.error.error_subcode + ") " + data.error.message; - Logger.error("RedditAuth.handleApiResponse", error); - throw new Error(error); + throw Logger.error("RedditAuth.handleApiResponse", error); } Logger.trace("RedditAuth.handleApiResponse", "success"); return data; @@ -180,7 +177,6 @@ export default class RedditAuth extends OAuth2Client { * @param error - the error returned from fetch */ private handleApiError(error: Error): never { - Logger.error("RedditAuth.handleApiError", error); - throw error; + throw Logger.error("RedditAuth.handleApiError", error); } } diff --git a/src/auth/TwitterAuth.ts b/src/auth/TwitterAuth.ts index bc871b1..3d045e4 100644 --- a/src/auth/TwitterAuth.ts +++ b/src/auth/TwitterAuth.ts @@ -1,8 +1,7 @@ -import { TwitterApi } from "twitter-api-v2"; - -import OAuth2Client from "./OAuth2Client"; import Logger from "../services/Logger"; +import OAuth2Client from "./OAuth2Client"; import Storage from "../services/Storage"; +import { TwitterApi } from "twitter-api-v2"; export default class TwitterAuth extends OAuth2Client { async setup() { @@ -31,18 +30,15 @@ export default class TwitterAuth extends OAuth2Client { const result = await this.requestRemotePermissions("Twitter", url); if (result["error"]) { const msg = result["error_reason"] + " - " + result["error_description"]; - Logger.error(msg, result); - throw new Error(msg); + throw Logger.error(msg, result); } if (result["state"] !== state) { const msg = "Response state does not match request state"; - Logger.error(msg, result); - throw new Error(msg); + throw Logger.error(msg, result); } if (!result["code"]) { const msg = "Remote response did not return a code"; - Logger.error(msg, result); - throw new Error(msg); + throw Logger.error(msg, result); } const tokens = await client.loginWithOAuth2({ @@ -51,7 +47,7 @@ export default class TwitterAuth extends OAuth2Client { redirectUri: this.getCallbackUrl(), }); if (!tokens["accessToken"]) { - throw new Error("An accessToken was not returned"); + throw Logger.error("An accessToken was not returned"); } return tokens; diff --git a/src/models/Feed.ts b/src/models/Feed.ts index 847b873..51fa726 100644 --- a/src/models/Feed.ts +++ b/src/models/Feed.ts @@ -97,7 +97,7 @@ export default class Feed { Logger.trace("Feed", "getPlatform", platformId); const platform = this.platforms[platformId]; if (!platform) { - throw new Error("Unknown platform: " + platformId); + throw Logger.error("Unknown platform: " + platformId); } return platform; } @@ -285,10 +285,10 @@ export default class Feed { Logger.trace("Feed", "schedulePost", path, platformId, date); const post = this.getPost(path, platformId); if (!post.valid) { - throw new Error("Post is not valid"); + throw Logger.error("Post is not valid"); } if (post.status !== PostStatus.UNSCHEDULED) { - throw new Error("Post is not unscheduled"); + throw Logger.error("Post is not unscheduled"); } post.schedule(date); return post; @@ -319,10 +319,10 @@ export default class Feed { for (const folder of folders) { const post = platform.getPost(folder); if (!post.valid) { - throw new Error("Post is not valid"); + throw Logger.error("Post is not valid"); } if (post.status !== PostStatus.UNSCHEDULED) { - throw new Error("Post is not unscheduled"); + throw Logger.error("Post is not unscheduled"); } post.schedule(date); posts.push(post); @@ -356,7 +356,7 @@ export default class Feed { Logger.info("Posting", platformId, path); await platform.publishPost(post, dryrun); } else { - throw new Error("Post is not valid"); + throw Logger.error("Post is not valid"); } return post; } diff --git a/src/models/Platform.ts b/src/models/Platform.ts index df44e36..4ce4417 100644 --- a/src/models/Platform.ts +++ b/src/models/Platform.ts @@ -159,7 +159,7 @@ export default class Platform { * @returns - any object */ async setup() { - throw new Error( + throw Logger.error( "No setup implemented for " + this.id + ". Read the docs in the docs folder.", diff --git a/src/platforms/Ayrshare.ts b/src/platforms/Ayrshare.ts index e08c1a6..187686c 100644 --- a/src/platforms/Ayrshare.ts +++ b/src/platforms/Ayrshare.ts @@ -76,7 +76,7 @@ export default abstract class Ayrshare extends Platform { }); if (error) { - Logger.error("Ayrshare.publishPost", this.id, "failed", response); + Logger.warn("Ayrshare.publishPost", this.id, "failed", response); } if (!dryrun) { @@ -131,8 +131,7 @@ export default abstract class Ayrshare extends Platform { }, body: buffer, }).catch((error) => { - Logger.error(error); - throw new Error("Failed uploading " + file); + throw Logger.error("Failed uploading " + file, error); }); urls.push(data.accessUrl.replace(/ /g, "%20")); @@ -151,7 +150,7 @@ export default abstract class Ayrshare extends Platform { const postPlatform = this.platforms[this.id]; if (!postPlatform) { - throw new Error( + throw Logger.error( "No ayrshare platform associated with platform " + this.id, ); } @@ -192,8 +191,7 @@ export default abstract class Ayrshare extends Platform { response["status"] !== "scheduled" ) { const error = "Bad result status: " + response["status"]; - Logger.error(error); - throw new Error(error); + throw Logger.error(error); } return response; } @@ -205,8 +203,11 @@ export default abstract class Ayrshare extends Platform { */ private async handleApiResponse(response: Response): Promise { if (!response.ok) { - Logger.error("Ayrshare.handleApiResponse", response); - throw new Error(response.status + ":" + response.statusText); + throw Logger.error( + "Ayrshare.handleApiResponse", + response, + response.status + ":" + response.statusText, + ); } const data = await response.json(); if (data.status === "error") { @@ -228,8 +229,7 @@ export default abstract class Ayrshare extends Platform { err.message; }, ); - Logger.error("Ayrshare.handleApiResponse", error); - throw new Error(error); + throw Logger.error("Ayrshare.handleApiResponse", error); } Logger.trace("Ayrshare.handleApiResponse", "success"); return data; @@ -240,7 +240,6 @@ export default abstract class Ayrshare extends Platform { * @param error - the error thrown from the api */ private handleApiError(error: Error) { - Logger.error("Ayrshare.handleApiError", error); - throw error; + throw Logger.error("Ayrshare.handleApiError", error); } } diff --git a/src/platforms/Facebook.ts b/src/platforms/Facebook.ts index f2918d8..27468be 100644 --- a/src/platforms/Facebook.ts +++ b/src/platforms/Facebook.ts @@ -120,7 +120,7 @@ export default class Facebook extends Platform { }); if (error) { - Logger.error("Facebook.publishPost", this.id, "failed", response); + Logger.warn("Facebook.publishPost", this.id, "failed", response); } if (!dryrun) { @@ -160,7 +160,7 @@ export default class Facebook extends Platform { }; if (!result["id"]) { - throw new Error("No id returned when uploading photo"); + throw Logger.error("No id returned when uploading photo"); } return result; } @@ -196,7 +196,7 @@ export default class Facebook extends Platform { }; if (!result["id"]) { - throw new Error("No id returned when uploading video"); + throw Logger.error("No id returned when uploading video"); } return result; } @@ -305,8 +305,11 @@ export default class Facebook extends Platform { */ private async handleApiResponse(response: Response): Promise { if (!response.ok) { - Logger.error("Facebook.handleApiResponse", response); - throw new Error(response.status + ":" + response.statusText); + throw Logger.error( + "Facebook.handleApiResponse", + response, + response.status + ":" + response.statusText, + ); } const data = await response.json(); if (data.error) { @@ -320,8 +323,7 @@ export default class Facebook extends Platform { data.error.error_subcode + ") " + data.error.message; - Logger.error("Facebook.handleApiResponse", error); - throw new Error(error); + throw Logger.error("Facebook.handleApiResponse", error); } Logger.trace("Facebook.handleApiResponse", "success"); return data; @@ -332,7 +334,6 @@ export default class Facebook extends Platform { * @param error - the error returned from fetch */ private handleApiError(error: Error): never { - Logger.error("Facebook.handleApiError", error); - throw error; + throw Logger.error("Facebook.handleApiError", error); } } diff --git a/src/platforms/Instagram.ts b/src/platforms/Instagram.ts index e1e2e6c..214cf5d 100644 --- a/src/platforms/Instagram.ts +++ b/src/platforms/Instagram.ts @@ -120,7 +120,7 @@ export default class Instagram extends Platform { }); if (error) { - Logger.error("Instagram.publishPost", this.id, "failed", response); + Logger.warn("Instagram.publishPost", this.id, "failed", response); } else if (!dryrun) { // post.link = ""; // todo : get instagram shortcode post.status = PostStatus.PUBLISHED; @@ -153,8 +153,7 @@ export default class Instagram extends Platform { caption: caption, })) as { id: string }; if (!container?.id) { - Logger.error("No id returned for container for " + file, container); - throw new Error("No id returned for container for " + file); + throw Logger.error("No id returned for container for " + file, container); } if (!dryrun) { @@ -164,8 +163,7 @@ export default class Instagram extends Platform { creation_id: container.id, })) as { id: string }; if (!response?.id) { - Logger.error("No id returned for igMedia for " + file, response); - throw new Error("No id returned for igMedia for " + file); + throw Logger.error("No id returned for igMedia for " + file, response); } return response; } @@ -195,8 +193,7 @@ export default class Instagram extends Platform { caption: caption, })) as { id: string }; if (!container?.id) { - Logger.error("No id returned for container for " + file, container); - throw new Error("No id returned for container for " + file); + throw Logger.error("No id returned for container for " + file, container); } if (!dryrun) { @@ -206,8 +203,7 @@ export default class Instagram extends Platform { creation_id: container.id, })) as { id: string }; if (!response?.id) { - Logger.error("No id returned for igMedia for " + file, response); - throw new Error("No id returned for igMedia for " + file); + throw Logger.error("No id returned for igMedia for " + file, response); } return response; } @@ -269,8 +265,7 @@ export default class Instagram extends Platform { id: string; }; if (!container["id"]) { - Logger.error("No id returned for carroussel container ", container); - throw new Error("No id returned for carroussel container "); + throw Logger.error("No id returned for carroussel container ", container); } // publish carousel @@ -281,8 +276,10 @@ export default class Instagram extends Platform { id: string; }; if (!response["id"]) { - Logger.error("No id returned for igMedia for carroussel", response); - throw new Error("No id returned for igMedia for carroussel"); + throw Logger.error( + "No id returned for igMedia for carroussel", + response, + ); } return response; @@ -310,7 +307,7 @@ export default class Instagram extends Platform { }; if (!result["id"]) { - throw new Error("No id returned after uploading photo " + file); + throw Logger.error("No id returned after uploading photo " + file); } return result; } @@ -334,7 +331,7 @@ export default class Instagram extends Platform { picture: string; }; if (!photoData.images?.length) { - throw new Error("No derivates found for photo " + id); + throw Logger.error("No derivates found for photo " + id); } // find largest derivative @@ -342,7 +339,7 @@ export default class Instagram extends Platform { return prev && prev.width > current.width ? prev : current; }); if (!largestPhoto["source"]) { - throw new Error("Largest derivate for photo " + id + " has no source"); + throw Logger.error("Largest derivate for photo " + id + " has no source"); } return largestPhoto["source"]; } @@ -368,7 +365,7 @@ export default class Instagram extends Platform { }; if (!result["id"]) { - throw new Error("No id returned when uploading video"); + throw Logger.error("No id returned when uploading video"); } return result; } @@ -387,7 +384,7 @@ export default class Instagram extends Platform { source: string; }; if (!videoData.source) { - throw new Error("No source url found for video " + id); + throw Logger.error("No source url found for video " + id); } return videoData["source"]; } @@ -515,8 +512,7 @@ export default class Instagram extends Platform { */ private async handleApiResponse(response: Response): Promise { if (!response.ok) { - Logger.error("Ayrshare.handleApiResponse", response); - throw new Error(response.status + ":" + response.statusText); + throw Logger.error("Ayrshare.handleApiResponse", response); } const data = await response.json(); if (data.error) { @@ -530,8 +526,7 @@ export default class Instagram extends Platform { data.error.error_subcode + ") " + data.error.message; - Logger.error("Facebook.handleApiResponse", error); - throw new Error(error); + throw Logger.error("Facebook.handleApiResponse", error); } Logger.trace("Facebook.handleApiResponse", "success"); return data; @@ -542,7 +537,6 @@ export default class Instagram extends Platform { * @param error - the api error returned from fetch */ private handleApiError(error: Error): never { - Logger.error("Facebook.handleApiError", error); - throw error; + throw Logger.error("Facebook.handleApiError", error); } } diff --git a/src/platforms/LinkedIn.ts b/src/platforms/LinkedIn.ts index a5d0ac5..d5536fc 100644 --- a/src/platforms/LinkedIn.ts +++ b/src/platforms/LinkedIn.ts @@ -138,7 +138,7 @@ export default class LinkedIn extends Platform { }); if (error) { - Logger.error("Facebook.publishPost", this.id, "failed", response); + Logger.warn("Facebook.publishPost", this.id, "failed", response); } if (!dryrun) { @@ -268,7 +268,7 @@ export default class LinkedIn extends Platform { }; }; if (!response.value) { - throw new Error("LinkedIn.getImageUploadLease: Bad response"); + throw Logger.error("LinkedIn.getImageUploadLease: Bad response"); } return response; } @@ -319,7 +319,7 @@ export default class LinkedIn extends Platform { }; }; if (!response.value) { - throw new Error("LinkedIn.getVideoUploadLease: Bad response"); + throw Logger.error("LinkedIn.getVideoUploadLease: Bad response"); } return response; } @@ -413,8 +413,8 @@ export default class LinkedIn extends Platform { data["text"] = text; } if (!response.ok) { - Logger.error("Linkedin.handleApiResponse", response); - console.log(response.headers); + Logger.warn("Linkedin.handleApiResponse", response); + Logger.warn(response.headers); const linkedInErrorResponse = response.headers["x-linkedin-error-response"]; @@ -431,7 +431,7 @@ export default class LinkedIn extends Platform { " - " + linkedInErrorResponse; - throw new Error(error); + throw Logger.error(error); } data["headers"] = {}; for (const [name, value] of response.headers) { @@ -446,7 +446,6 @@ export default class LinkedIn extends Platform { * */ private handleApiError(error: Error): Promise { - Logger.error("Linkedin.handleApiError", error); - throw error; + throw Logger.error("Linkedin.handleApiError", error); } } diff --git a/src/platforms/Reddit.ts b/src/platforms/Reddit.ts index 2dfd851..1a44600 100644 --- a/src/platforms/Reddit.ts +++ b/src/platforms/Reddit.ts @@ -111,7 +111,7 @@ export default class Reddit extends Platform { }); if (error) { - Logger.error("Reddit.publishPost", this.id, "failed", response); + Logger.warn("Reddit.publishPost", this.id, "failed", response); } else if (!dryrun) { // post.link = ""; // todo : await reddit websockets post.status = PostStatus.PUBLISHED; @@ -238,8 +238,7 @@ export default class Reddit extends Platform { }; if (!lease.args?.action || !lease.args?.fields) { const msg = "Reddit.getUploadLease: bad answer"; - Logger.error(msg, lease); - throw new Error(msg); + throw Logger.error(msg, lease); } return { @@ -284,14 +283,12 @@ export default class Reddit extends Platform { const encodedURL = xml.PostResponse.Location; if (!encodedURL) { const msg = "Reddit.uploadFile: No URL returned"; - Logger.error(msg, xml); - throw new Error(msg); + throw Logger.error(msg, xml); } return decodeURIComponent(encodedURL); } catch (e) { const msg = "Reddit.uploadFile: cant parse xml"; - Logger.error(msg, response); - throw e; + throw Logger.error(msg, response, e); } } @@ -394,8 +391,11 @@ export default class Reddit extends Platform { */ private async handleApiResponse(response: Response): Promise { if (!response.ok) { - Logger.error("Reddit.handleApiResponse", "not ok"); - throw new Error(response.status + ":" + response.statusText); + throw Logger.error( + "Reddit.handleApiResponse", + "not ok", + response.status + ":" + response.statusText, + ); } const data = await response.json(); if (data.json?.errors?.length) { @@ -405,8 +405,7 @@ export default class Reddit extends Platform { data.json.errors[0] + "-" + data.json.errors.slice(1).join(); - Logger.error("Reddit.handleApiResponse", error); - throw new Error(error); + throw Logger.error("Reddit.handleApiResponse", error); } Logger.trace("Reddit.handleApiResponse", "success"); return data; @@ -417,7 +416,6 @@ export default class Reddit extends Platform { * @param error - the error returned from fetch */ private handleApiError(error: Error): never { - Logger.error("Reddit.handleApiError", error); - throw error; + throw Logger.error("Reddit.handleApiError", error); } } diff --git a/src/platforms/Twitter.ts b/src/platforms/Twitter.ts index a10bb81..96d0be8 100644 --- a/src/platforms/Twitter.ts +++ b/src/platforms/Twitter.ts @@ -89,7 +89,8 @@ export default class Twitter extends Platform { try { mediaIds.push(await client1.v1.uploadMedia(path)); } catch (e) { - throw new Error(e); + Logger.warn("Twitter.publishPost uploadMedia failed", e); + error = e; } } } @@ -97,17 +98,19 @@ export default class Twitter extends Platform { const client2 = new TwitterApi(Storage.get("auth", "TWITTER_ACCESS_TOKEN")); if (!dryrun) { - Logger.trace("Tweeting " + post.id + "..."); - try { - result = await client2.v2.tweet({ - text: post.body, - media: { media_ids: mediaIds }, - }); - if (result.errors) { - error = new Error(result.errors.join()); + if (!error) { + Logger.trace("Tweeting " + post.id + "..."); + try { + result = await client2.v2.tweet({ + text: post.body, + media: { media_ids: mediaIds }, + }); + if (result.errors) { + error = new Error(result.errors.join()); + } + } catch (e) { + error = e; } - } catch (e) { - error = e; } } else { result = { @@ -124,7 +127,7 @@ export default class Twitter extends Platform { }); if (error) { - Logger.error("Twitter.publishPost", this.id, "failed", error, result); + Logger.warn("Twitter.publishPost", this.id, "failed", error, result); } if (!dryrun) { diff --git a/src/services/Fairpost.ts b/src/services/Fairpost.ts index db8080e..e81b269 100644 --- a/src/services/Fairpost.ts +++ b/src/services/Fairpost.ts @@ -3,7 +3,6 @@ import * as path from "path"; import * as platforms from "../platforms"; import Feed from "../models/Feed"; -import Logger from "./Logger"; import Platform from "../models/Platform"; import Storage from "./Storage"; @@ -56,17 +55,6 @@ class Fairpost { public getFeed() { return new Feed(this.platforms.filter((p) => p.active)); } - - public error(msg: string) { - Logger.error(msg); - throw new Error(msg); - } - - public fatal(msg: string, code = 1) { - Logger.fatal(msg); - process.exitCode = code; - throw new Error(msg); - } } export default Fairpost.getInstance(); diff --git a/src/services/Logger.ts b/src/services/Logger.ts index 066083c..525ef92 100644 --- a/src/services/Logger.ts +++ b/src/services/Logger.ts @@ -1,3 +1,13 @@ +/** + * Logger - minimalist singleton service + * + * - wraps log4js + * - allows overrides from env + * - returns Errors on error() and fatal() + * - sets exitCode on fatal() + * + */ + import * as log4js from "log4js"; class Logger { @@ -43,19 +53,23 @@ class Logger { this.logger.trace(args); } debug(...args) { - this.logger.trace(args); + this.logger.debug(args); } info(...args) { - this.logger.trace(args); + this.logger.info(args); } warn(...args) { - this.logger.trace(args); + this.logger.warn(args); } - error(...args) { - this.logger.trace(args); + error(...args): Error { + this.logger.error(args); + return new Error(args.filter((arg) => typeof arg === "string").join("; ")); } - fatal(...args) { - this.logger.trace(args); + fatal(...args): Error { + this.logger.fatal(args); + const code = parseInt(args[0]); + process.exitCode = code || 1; + return new Error(args.filter((arg) => typeof arg === "string").join("; ")); } } export default Logger.getInstance(); diff --git a/src/services/Storage.ts b/src/services/Storage.ts index 5713c34..ac07960 100644 --- a/src/services/Storage.ts +++ b/src/services/Storage.ts @@ -1,5 +1,7 @@ +import Logger from "./Logger"; + /** - * Store - minimalist storage manager - singleton + * Storage - minimalist singleton service * * - sets and gets key / value pairs. * - uses two 'stores': @@ -34,11 +36,11 @@ class Storage { if (storage === "env") { value = process.env["FAIRPOST_" + key] ?? ""; } else { - throw new Error("Storage " + storage + " not implemented"); + throw Logger.error("Storage " + storage + " not implemented"); } if (!value) { if (!def) { - throw new Error("Value " + key + " not found in store " + store); + throw Logger.error("Value " + key + " not found in store " + store); } value = def; } @@ -58,10 +60,10 @@ class Storage { console.log("FAIRPOST_" + key + "=" + value); console.log(); } else { - throw new Error("UI " + ui + " not implemented"); + throw Logger.error("UI " + ui + " not implemented"); } } else { - throw new Error("Storage " + storage + " not implemented"); + throw Logger.error("Storage " + storage + " not implemented"); } } }