From 00fd1512c58b5fd6b3d675aee199014d9995c9b2 Mon Sep 17 00:00:00 2001 From: Nevo David Date: Fri, 8 Aug 2025 22:02:59 +0700 Subject: [PATCH] feat: remove concurrency from the long tasks --- .../helpers/src/utils/concurrency.service.ts | 6 +++++- .../src/integrations/social.abstract.ts | 6 ++++-- .../integrations/social/instagram.provider.ts | 12 ++++++++++-- .../integrations/social/pinterest.provider.ts | 17 +++++++++++------ .../src/integrations/social/tiktok.provider.ts | 15 +++++++++++---- 5 files changed, 41 insertions(+), 15 deletions(-) diff --git a/libraries/helpers/src/utils/concurrency.service.ts b/libraries/helpers/src/utils/concurrency.service.ts index 7d447e87..906e5f52 100644 --- a/libraries/helpers/src/utils/concurrency.service.ts +++ b/libraries/helpers/src/utils/concurrency.service.ts @@ -11,7 +11,8 @@ const mapper = {} as Record; export const concurrency = async ( identifier: string, maxConcurrent = 1, - func: (...args: any[]) => Promise + func: (...args: any[]) => Promise, + ignoreConcurrency = false ) => { const strippedIdentifier = identifier.toLowerCase().split('-')[0]; mapper[strippedIdentifier] ??= new Bottleneck({ @@ -23,6 +24,9 @@ export const concurrency = async ( }); let load: T; try { + if (ignoreConcurrency) { + return await func(); + } load = await mapper[strippedIdentifier].schedule( { expiration: 600000 }, async () => { diff --git a/libraries/nestjs-libraries/src/integrations/social.abstract.ts b/libraries/nestjs-libraries/src/integrations/social.abstract.ts index 3c3aedfd..0b4d26b1 100644 --- a/libraries/nestjs-libraries/src/integrations/social.abstract.ts +++ b/libraries/nestjs-libraries/src/integrations/social.abstract.ts @@ -68,12 +68,14 @@ export abstract class SocialAbstract { url: string, options: RequestInit = {}, identifier = '', - totalRetries = 0 + totalRetries = 0, + ignoreConcurrency = false ): Promise { const request = await concurrency( this.identifier, this.maxConcurrentJob, - () => fetch(url, options) + () => fetch(url, options), + ignoreConcurrency ); if (request.status === 200 || request.status === 201) { diff --git a/libraries/nestjs-libraries/src/integrations/social/instagram.provider.ts b/libraries/nestjs-libraries/src/integrations/social/instagram.provider.ts index 3927c3d1..e9bbbae7 100644 --- a/libraries/nestjs-libraries/src/integrations/social/instagram.provider.ts +++ b/libraries/nestjs-libraries/src/integrations/social/instagram.provider.ts @@ -498,7 +498,11 @@ export class InstagramProvider while (status === 'IN_PROGRESS') { const { status_code } = await ( await this.fetch( - `https://${type}/v20.0/${photoId}?access_token=${accessToken}&fields=status_code` + `https://${type}/v20.0/${photoId}?access_token=${accessToken}&fields=status_code`, + undefined, + '', + 0, + true, ) ).json(); await timer(10000); @@ -558,7 +562,11 @@ export class InstagramProvider while (status === 'IN_PROGRESS') { const { status_code } = await ( await this.fetch( - `https://${type}/v20.0/${containerId}?fields=status_code&access_token=${accessToken}` + `https://${type}/v20.0/${containerId}?fields=status_code&access_token=${accessToken}`, + undefined, + '', + 0, + true ) ).json(); await timer(10000); diff --git a/libraries/nestjs-libraries/src/integrations/social/pinterest.provider.ts b/libraries/nestjs-libraries/src/integrations/social/pinterest.provider.ts index 8ee14294..1e53ea68 100644 --- a/libraries/nestjs-libraries/src/integrations/social/pinterest.provider.ts +++ b/libraries/nestjs-libraries/src/integrations/social/pinterest.provider.ts @@ -37,7 +37,6 @@ export class PinterestProvider value: string; } | undefined { - if (body.indexOf('cover_image_url or cover_image_content_type') > -1) { return { type: 'bad-body' as const, @@ -212,12 +211,18 @@ export class PinterestProvider let statusCode = ''; while (statusCode !== 'succeeded') { const mediafile = await ( - await this.fetch('https://api.pinterest.com/v5/media/' + media_id, { - method: 'GET', - headers: { - Authorization: `Bearer ${accessToken}`, + await this.fetch( + 'https://api.pinterest.com/v5/media/' + media_id, + { + method: 'GET', + headers: { + Authorization: `Bearer ${accessToken}`, + }, }, - }) + '', + 0, + true + ) ).json(); await timer(30000); diff --git a/libraries/nestjs-libraries/src/integrations/social/tiktok.provider.ts b/libraries/nestjs-libraries/src/integrations/social/tiktok.provider.ts index fe0700f0..2de298c6 100644 --- a/libraries/nestjs-libraries/src/integrations/social/tiktok.provider.ts +++ b/libraries/nestjs-libraries/src/integrations/social/tiktok.provider.ts @@ -375,7 +375,10 @@ export class TiktokProvider extends SocialAbstract implements SocialProvider { body: JSON.stringify({ publish_id: publishId, }), - } + }, + '', + 0, + true ) ).json(); @@ -399,11 +402,11 @@ export class TiktokProvider extends SocialAbstract implements SocialProvider { 'titok-error-upload', JSON.stringify(post), Buffer.from(JSON.stringify(post)), - handleError?.value || '', + handleError?.value || '' ); } - await timer(3000); + await timer(10000); } } @@ -496,7 +499,11 @@ export class TiktokProvider extends SocialAbstract implements SocialProvider { photo_cover_index: 0, photo_images: firstPost.media?.map((p) => p.path), }, - post_mode: firstPost?.settings?.content_posting_method === 'DIRECT_POST' ? 'DIRECT_POST' : 'MEDIA_UPLOAD', + post_mode: + firstPost?.settings?.content_posting_method === + 'DIRECT_POST' + ? 'DIRECT_POST' + : 'MEDIA_UPLOAD', media_type: 'PHOTO', }), }),