bozonx-social-media-posting 1.1.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/LICENSE +21 -0
- package/README.md +1003 -0
- package/dist/src/app.constants.d.ts +8 -0
- package/dist/src/app.constants.js +9 -0
- package/dist/src/app.constants.js.map +1 -0
- package/dist/src/common/enums/body-format.enum.d.ts +12 -0
- package/dist/src/common/enums/body-format.enum.js +14 -0
- package/dist/src/common/enums/body-format.enum.js.map +1 -0
- package/dist/src/common/enums/error-code.enum.d.ts +12 -0
- package/dist/src/common/enums/error-code.enum.js +14 -0
- package/dist/src/common/enums/error-code.enum.js.map +1 -0
- package/dist/src/common/enums/index.d.ts +3 -0
- package/dist/src/common/enums/index.js +4 -0
- package/dist/src/common/enums/index.js.map +1 -0
- package/dist/src/common/enums/post-type.enum.d.ts +28 -0
- package/dist/src/common/enums/post-type.enum.js +30 -0
- package/dist/src/common/enums/post-type.enum.js.map +1 -0
- package/dist/src/common/filters/all-exceptions.filter.d.ts +13 -0
- package/dist/src/common/filters/all-exceptions.filter.js +103 -0
- package/dist/src/common/filters/all-exceptions.filter.js.map +1 -0
- package/dist/src/common/helpers/media-input.helper.d.ts +73 -0
- package/dist/src/common/helpers/media-input.helper.js +122 -0
- package/dist/src/common/helpers/media-input.helper.js.map +1 -0
- package/dist/src/common/interceptors/shutdown.interceptor.d.ts +12 -0
- package/dist/src/common/interceptors/shutdown.interceptor.js +41 -0
- package/dist/src/common/interceptors/shutdown.interceptor.js.map +1 -0
- package/dist/src/common/interfaces/logger.interface.d.ts +44 -0
- package/dist/src/common/interfaces/logger.interface.js +44 -0
- package/dist/src/common/interfaces/logger.interface.js.map +1 -0
- package/dist/src/common/services/shutdown.module.d.ts +2 -0
- package/dist/src/common/services/shutdown.module.js +18 -0
- package/dist/src/common/services/shutdown.module.js.map +1 -0
- package/dist/src/common/services/shutdown.service.d.ts +40 -0
- package/dist/src/common/services/shutdown.service.js +122 -0
- package/dist/src/common/services/shutdown.service.js.map +1 -0
- package/dist/src/common/types/index.d.ts +1 -0
- package/dist/src/common/types/index.js +2 -0
- package/dist/src/common/types/index.js.map +1 -0
- package/dist/src/common/types/media-input.type.d.ts +29 -0
- package/dist/src/common/types/media-input.type.js +2 -0
- package/dist/src/common/types/media-input.type.js.map +1 -0
- package/dist/src/common/validators/body-length.validator.d.ts +24 -0
- package/dist/src/common/validators/body-length.validator.js +57 -0
- package/dist/src/common/validators/body-length.validator.js.map +1 -0
- package/dist/src/common/validators/channel-id.validator.d.ts +19 -0
- package/dist/src/common/validators/channel-id.validator.js +58 -0
- package/dist/src/common/validators/channel-id.validator.js.map +1 -0
- package/dist/src/common/validators/has-content.validator.d.ts +23 -0
- package/dist/src/common/validators/has-content.validator.js +57 -0
- package/dist/src/common/validators/has-content.validator.js.map +1 -0
- package/dist/src/common/validators/media-input.validator.d.ts +44 -0
- package/dist/src/common/validators/media-input.validator.js +112 -0
- package/dist/src/common/validators/media-input.validator.js.map +1 -0
- package/dist/src/common/validators/media-priority.validator.d.ts +19 -0
- package/dist/src/common/validators/media-priority.validator.js +38 -0
- package/dist/src/common/validators/media-priority.validator.js.map +1 -0
- package/dist/src/config/app.config.d.ts +33 -0
- package/dist/src/config/app.config.js +83 -0
- package/dist/src/config/app.config.js.map +1 -0
- package/dist/src/config/library.config.d.ts +51 -0
- package/dist/src/config/library.config.js +197 -0
- package/dist/src/config/library.config.js.map +1 -0
- package/dist/src/config/yaml-config.dto.d.ts +37 -0
- package/dist/src/config/yaml-config.dto.js +152 -0
- package/dist/src/config/yaml-config.dto.js.map +1 -0
- package/dist/src/config/yaml.config.d.ts +14 -0
- package/dist/src/config/yaml.config.js +72 -0
- package/dist/src/config/yaml.config.js.map +1 -0
- package/dist/src/index.d.ts +19 -0
- package/dist/src/index.js +17 -0
- package/dist/src/index.js.map +1 -0
- package/dist/src/library.d.ts +57 -0
- package/dist/src/library.js +92 -0
- package/dist/src/library.js.map +1 -0
- package/dist/src/modules/app-config/app-config.module.d.ts +2 -0
- package/dist/src/modules/app-config/app-config.module.js +26 -0
- package/dist/src/modules/app-config/app-config.module.js.map +1 -0
- package/dist/src/modules/app-config/app-config.service.d.ts +14 -0
- package/dist/src/modules/app-config/app-config.service.js +18 -0
- package/dist/src/modules/app-config/app-config.service.js.map +1 -0
- package/dist/src/modules/app-config/interfaces/app-config.interface.d.ts +31 -0
- package/dist/src/modules/app-config/interfaces/app-config.interface.js +2 -0
- package/dist/src/modules/app-config/interfaces/app-config.interface.js.map +1 -0
- package/dist/src/modules/app-config/nest-config.service.d.ts +41 -0
- package/dist/src/modules/app-config/nest-config.service.js +91 -0
- package/dist/src/modules/app-config/nest-config.service.js.map +1 -0
- package/dist/src/modules/health/health.controller.d.ts +12 -0
- package/dist/src/modules/health/health.controller.js +33 -0
- package/dist/src/modules/health/health.controller.js.map +1 -0
- package/dist/src/modules/health/health.module.d.ts +2 -0
- package/dist/src/modules/health/health.module.js +17 -0
- package/dist/src/modules/health/health.module.js.map +1 -0
- package/dist/src/modules/media/media.module.d.ts +2 -0
- package/dist/src/modules/media/media.module.js +18 -0
- package/dist/src/modules/media/media.module.js.map +1 -0
- package/dist/src/modules/media/media.service.d.ts +15 -0
- package/dist/src/modules/media/media.service.js +49 -0
- package/dist/src/modules/media/media.service.js.map +1 -0
- package/dist/src/modules/platforms/base/auth-validator-registry.service.d.ts +25 -0
- package/dist/src/modules/platforms/base/auth-validator-registry.service.js +50 -0
- package/dist/src/modules/platforms/base/auth-validator-registry.service.js.map +1 -0
- package/dist/src/modules/platforms/base/auth-validator.interface.d.ts +16 -0
- package/dist/src/modules/platforms/base/auth-validator.interface.js +2 -0
- package/dist/src/modules/platforms/base/auth-validator.interface.js.map +1 -0
- package/dist/src/modules/platforms/base/index.d.ts +4 -0
- package/dist/src/modules/platforms/base/index.js +5 -0
- package/dist/src/modules/platforms/base/index.js.map +1 -0
- package/dist/src/modules/platforms/base/platform-registry.service.d.ts +31 -0
- package/dist/src/modules/platforms/base/platform-registry.service.js +54 -0
- package/dist/src/modules/platforms/base/platform-registry.service.js.map +1 -0
- package/dist/src/modules/platforms/base/platform.interface.d.ts +39 -0
- package/dist/src/modules/platforms/base/platform.interface.js +2 -0
- package/dist/src/modules/platforms/base/platform.interface.js.map +1 -0
- package/dist/src/modules/platforms/platforms.module.d.ts +13 -0
- package/dist/src/modules/platforms/platforms.module.js +59 -0
- package/dist/src/modules/platforms/platforms.module.js.map +1 -0
- package/dist/src/modules/platforms/telegram/telegram-auth.validator.d.ts +19 -0
- package/dist/src/modules/platforms/telegram/telegram-auth.validator.js +51 -0
- package/dist/src/modules/platforms/telegram/telegram-auth.validator.js.map +1 -0
- package/dist/src/modules/platforms/telegram/telegram-type-detector.service.d.ts +18 -0
- package/dist/src/modules/platforms/telegram/telegram-type-detector.service.js +47 -0
- package/dist/src/modules/platforms/telegram/telegram-type-detector.service.js.map +1 -0
- package/dist/src/modules/platforms/telegram/telegram.platform.d.ts +58 -0
- package/dist/src/modules/platforms/telegram/telegram.platform.js +434 -0
- package/dist/src/modules/platforms/telegram/telegram.platform.js.map +1 -0
- package/dist/src/modules/post/base-post.service.d.ts +64 -0
- package/dist/src/modules/post/base-post.service.js +99 -0
- package/dist/src/modules/post/base-post.service.js.map +1 -0
- package/dist/src/modules/post/dto/index.d.ts +3 -0
- package/dist/src/modules/post/dto/index.js +4 -0
- package/dist/src/modules/post/dto/index.js.map +1 -0
- package/dist/src/modules/post/dto/post-request.dto.d.ts +56 -0
- package/dist/src/modules/post/dto/post-request.dto.js +195 -0
- package/dist/src/modules/post/dto/post-request.dto.js.map +1 -0
- package/dist/src/modules/post/dto/post-response.dto.d.ts +41 -0
- package/dist/src/modules/post/dto/post-response.dto.js +2 -0
- package/dist/src/modules/post/dto/post-response.dto.js.map +1 -0
- package/dist/src/modules/post/dto/preview-response.dto.d.ts +33 -0
- package/dist/src/modules/post/dto/preview-response.dto.js +2 -0
- package/dist/src/modules/post/dto/preview-response.dto.js.map +1 -0
- package/dist/src/modules/post/idempotency.service.d.ts +95 -0
- package/dist/src/modules/post/idempotency.service.js +229 -0
- package/dist/src/modules/post/idempotency.service.js.map +1 -0
- package/dist/src/modules/post/post.controller.d.ts +13 -0
- package/dist/src/modules/post/post.controller.js +97 -0
- package/dist/src/modules/post/post.controller.js.map +1 -0
- package/dist/src/modules/post/post.module.d.ts +2 -0
- package/dist/src/modules/post/post.module.js +25 -0
- package/dist/src/modules/post/post.module.js.map +1 -0
- package/dist/src/modules/post/post.service.d.ts +62 -0
- package/dist/src/modules/post/post.service.js +325 -0
- package/dist/src/modules/post/post.service.js.map +1 -0
- package/dist/src/modules/post/preview.service.d.ts +23 -0
- package/dist/src/modules/post/preview.service.js +69 -0
- package/dist/src/modules/post/preview.service.js.map +1 -0
- package/dist/tsconfig.lib.tsbuildinfo +1 -0
- package/package.json +102 -0
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"idempotency.service.js","sourceRoot":"","sources":["../../../../src/modules/post/idempotency.service.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
import type { FastifyRequest } from 'fastify';
|
|
2
|
+
import { PostService } from './post.service.js';
|
|
3
|
+
import { PreviewService } from './preview.service.js';
|
|
4
|
+
import { PostRequestDto, PostResponseDto, ErrorResponseDto, PreviewResponseDto, PreviewErrorResponseDto } from './dto/index.js';
|
|
5
|
+
export declare class PostController {
|
|
6
|
+
private readonly postService;
|
|
7
|
+
private readonly previewService;
|
|
8
|
+
private readonly logger;
|
|
9
|
+
constructor(postService: PostService, previewService: PreviewService);
|
|
10
|
+
publish(request: PostRequestDto, req: FastifyRequest): Promise<PostResponseDto | ErrorResponseDto>;
|
|
11
|
+
preview(request: PostRequestDto): Promise<PreviewResponseDto | PreviewErrorResponseDto>;
|
|
12
|
+
private createAbortSignal;
|
|
13
|
+
}
|
|
@@ -0,0 +1,97 @@
|
|
|
1
|
+
var __decorate = (this && this.__decorate) || function (decorators, target, key, desc) {
|
|
2
|
+
var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;
|
|
3
|
+
if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc);
|
|
4
|
+
else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;
|
|
5
|
+
return c > 3 && r && Object.defineProperty(target, key, r), r;
|
|
6
|
+
};
|
|
7
|
+
var __metadata = (this && this.__metadata) || function (k, v) {
|
|
8
|
+
if (typeof Reflect === "object" && typeof Reflect.metadata === "function") return Reflect.metadata(k, v);
|
|
9
|
+
};
|
|
10
|
+
var __param = (this && this.__param) || function (paramIndex, decorator) {
|
|
11
|
+
return function (target, key) { decorator(target, key, paramIndex); }
|
|
12
|
+
};
|
|
13
|
+
var PostController_1;
|
|
14
|
+
import { Controller, Post, Body, HttpCode, HttpStatus, Req, Logger } from '@nestjs/common';
|
|
15
|
+
import { PostService } from './post.service.js';
|
|
16
|
+
import { PreviewService } from './preview.service.js';
|
|
17
|
+
import { PostRequestDto, } from './dto/index.js';
|
|
18
|
+
let PostController = PostController_1 = class PostController {
|
|
19
|
+
postService;
|
|
20
|
+
previewService;
|
|
21
|
+
logger = new Logger(PostController_1.name);
|
|
22
|
+
constructor(postService, previewService) {
|
|
23
|
+
this.postService = postService;
|
|
24
|
+
this.previewService = previewService;
|
|
25
|
+
}
|
|
26
|
+
async publish(request, req) {
|
|
27
|
+
const { signal, cleanup } = this.createAbortSignal(req);
|
|
28
|
+
try {
|
|
29
|
+
return await this.postService.publish(request, signal);
|
|
30
|
+
}
|
|
31
|
+
finally {
|
|
32
|
+
cleanup();
|
|
33
|
+
}
|
|
34
|
+
}
|
|
35
|
+
async preview(request) {
|
|
36
|
+
return this.previewService.preview(request);
|
|
37
|
+
}
|
|
38
|
+
createAbortSignal(req) {
|
|
39
|
+
const controller = new AbortController();
|
|
40
|
+
const raw = req.raw;
|
|
41
|
+
let isFinished = false;
|
|
42
|
+
// raw.destroyed is true after body parsing - this is normal, don't abort on it
|
|
43
|
+
// Only abort if raw.aborted (client disconnected before body was fully read)
|
|
44
|
+
if (raw.aborted) {
|
|
45
|
+
this.logger.warn('Request aborted before body parsing completed');
|
|
46
|
+
controller.abort();
|
|
47
|
+
return { signal: controller.signal, cleanup: () => { } };
|
|
48
|
+
}
|
|
49
|
+
const onAbort = () => {
|
|
50
|
+
if (!isFinished && !controller.signal.aborted) {
|
|
51
|
+
this.logger.warn('Aborting request due to client disconnect during processing');
|
|
52
|
+
controller.abort();
|
|
53
|
+
}
|
|
54
|
+
};
|
|
55
|
+
raw.on('aborted', onAbort);
|
|
56
|
+
raw.on('close', onAbort);
|
|
57
|
+
// Also listen to socket events as a fallback
|
|
58
|
+
if (raw.socket) {
|
|
59
|
+
raw.socket.on('close', onAbort);
|
|
60
|
+
}
|
|
61
|
+
return {
|
|
62
|
+
signal: controller.signal,
|
|
63
|
+
cleanup: () => {
|
|
64
|
+
isFinished = true;
|
|
65
|
+
raw.removeListener('aborted', onAbort);
|
|
66
|
+
raw.removeListener('close', onAbort);
|
|
67
|
+
if (raw.socket) {
|
|
68
|
+
raw.socket.removeListener('close', onAbort);
|
|
69
|
+
}
|
|
70
|
+
},
|
|
71
|
+
};
|
|
72
|
+
}
|
|
73
|
+
};
|
|
74
|
+
__decorate([
|
|
75
|
+
Post('post'),
|
|
76
|
+
HttpCode(HttpStatus.OK),
|
|
77
|
+
__param(0, Body()),
|
|
78
|
+
__param(1, Req()),
|
|
79
|
+
__metadata("design:type", Function),
|
|
80
|
+
__metadata("design:paramtypes", [PostRequestDto, Object]),
|
|
81
|
+
__metadata("design:returntype", Promise)
|
|
82
|
+
], PostController.prototype, "publish", null);
|
|
83
|
+
__decorate([
|
|
84
|
+
Post('preview'),
|
|
85
|
+
HttpCode(HttpStatus.OK),
|
|
86
|
+
__param(0, Body()),
|
|
87
|
+
__metadata("design:type", Function),
|
|
88
|
+
__metadata("design:paramtypes", [PostRequestDto]),
|
|
89
|
+
__metadata("design:returntype", Promise)
|
|
90
|
+
], PostController.prototype, "preview", null);
|
|
91
|
+
PostController = PostController_1 = __decorate([
|
|
92
|
+
Controller(),
|
|
93
|
+
__metadata("design:paramtypes", [PostService,
|
|
94
|
+
PreviewService])
|
|
95
|
+
], PostController);
|
|
96
|
+
export { PostController };
|
|
97
|
+
//# sourceMappingURL=post.controller.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"post.controller.js","sourceRoot":"","sources":["../../../../src/modules/post/post.controller.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,25 @@
|
|
|
1
|
+
var __decorate = (this && this.__decorate) || function (decorators, target, key, desc) {
|
|
2
|
+
var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;
|
|
3
|
+
if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc);
|
|
4
|
+
else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;
|
|
5
|
+
return c > 3 && r && Object.defineProperty(target, key, r), r;
|
|
6
|
+
};
|
|
7
|
+
import { Module } from '@nestjs/common';
|
|
8
|
+
import { PostController } from './post.controller.js';
|
|
9
|
+
import { PostService } from './post.service.js';
|
|
10
|
+
import { PreviewService } from './preview.service.js';
|
|
11
|
+
import { IdempotencyService } from './idempotency.service.js';
|
|
12
|
+
import { AppConfigModule } from '../app-config/app-config.module.js';
|
|
13
|
+
import { PlatformsModule } from '../platforms/platforms.module.js';
|
|
14
|
+
import { ShutdownModule } from '../../common/services/shutdown.module.js';
|
|
15
|
+
let PostModule = class PostModule {
|
|
16
|
+
};
|
|
17
|
+
PostModule = __decorate([
|
|
18
|
+
Module({
|
|
19
|
+
imports: [AppConfigModule, PlatformsModule, ShutdownModule],
|
|
20
|
+
controllers: [PostController],
|
|
21
|
+
providers: [PostService, PreviewService, IdempotencyService],
|
|
22
|
+
})
|
|
23
|
+
], PostModule);
|
|
24
|
+
export { PostModule };
|
|
25
|
+
//# sourceMappingURL=post.module.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"post.module.js","sourceRoot":"","sources":["../../../../src/modules/post/post.module.ts"],"names":[],"mappings":";;;;;;AAAA,OAAO,EAAE,MAAM,EAAE,MAAM,gBAAgB,CAAC;AACxC,OAAO,EAAE,cAAc,EAAE,MAAM,sBAAsB,CAAC;AACtD,OAAO,EAAE,WAAW,EAAE,MAAM,mBAAmB,CAAC;AAChD,OAAO,EAAE,cAAc,EAAE,MAAM,sBAAsB,CAAC;AACtD,OAAO,EAAE,kBAAkB,EAAE,MAAM,0BAA0B,CAAC;AAC9D,OAAO,EAAE,eAAe,EAAE,MAAM,oCAAoC,CAAC;AACrE,OAAO,EAAE,eAAe,EAAE,MAAM,kCAAkC,CAAC;AACnE,OAAO,EAAE,cAAc,EAAE,MAAM,0CAA0C,CAAC;AAOnE,IAAM,UAAU,GAAhB,MAAM,UAAU;CAAI,CAAA;AAAd,UAAU;IALtB,MAAM,CAAC;QACN,OAAO,EAAE,CAAC,eAAe,EAAE,eAAe,EAAE,cAAc,CAAC;QAC3D,WAAW,EAAE,CAAC,cAAc,CAAC;QAC7B,SAAS,EAAE,CAAC,WAAW,EAAE,cAAc,EAAE,kBAAkB,CAAC;KAC7D,CAAC;GACW,UAAU,CAAI"}
|
|
@@ -0,0 +1,62 @@
|
|
|
1
|
+
import { Logger } from '@nestjs/common';
|
|
2
|
+
import { PostRequestDto, PostResponseDto, ErrorResponseDto } from './dto/index.js';
|
|
3
|
+
import { AppConfigService } from '../app-config/app-config.service.js';
|
|
4
|
+
import { IdempotencyService } from './idempotency.service.js';
|
|
5
|
+
import { PlatformRegistry } from '../platforms/base/platform-registry.service.js';
|
|
6
|
+
import { AuthValidatorRegistry } from '../platforms/base/auth-validator-registry.service.js';
|
|
7
|
+
import { BasePostService } from './base-post.service.js';
|
|
8
|
+
import { ShutdownService } from '../../common/services/shutdown.service.js';
|
|
9
|
+
export declare class PostService extends BasePostService {
|
|
10
|
+
private readonly idempotencyService;
|
|
11
|
+
private readonly shutdownService;
|
|
12
|
+
protected readonly logger: Logger;
|
|
13
|
+
/** Minimum jitter factor for retry delay randomization (80%) */
|
|
14
|
+
private static readonly MIN_JITTER_FACTOR;
|
|
15
|
+
/** Maximum jitter factor for retry delay randomization (120%) */
|
|
16
|
+
private static readonly MAX_JITTER_FACTOR;
|
|
17
|
+
private static readonly DEFAULT_REQUEST_TIMEOUT_SECS;
|
|
18
|
+
private static readonly MAX_REQUEST_TIMEOUT_SECS;
|
|
19
|
+
constructor(appConfig: AppConfigService, platformRegistry: PlatformRegistry, authValidatorRegistry: AuthValidatorRegistry, idempotencyService: IdempotencyService, shutdownService: ShutdownService);
|
|
20
|
+
/**
|
|
21
|
+
* Publish a post to a social media platform
|
|
22
|
+
* Handles idempotency, platform selection, retry logic, and error handling
|
|
23
|
+
* @param request - Post request with platform, content, and media
|
|
24
|
+
* @param abortSignal - Optional signal to abort the operation
|
|
25
|
+
* @returns Success response with post details or error response
|
|
26
|
+
*/
|
|
27
|
+
publish(request: PostRequestDto, abortSignal?: AbortSignal): Promise<PostResponseDto | ErrorResponseDto>;
|
|
28
|
+
/**
|
|
29
|
+
* Map error to appropriate error code
|
|
30
|
+
* Categorizes errors for better error handling and monitoring
|
|
31
|
+
* @param error - Error object
|
|
32
|
+
* @returns Error code string
|
|
33
|
+
*/
|
|
34
|
+
private getErrorCode;
|
|
35
|
+
private getRequestTimeoutMs;
|
|
36
|
+
private executeWithRequestTimeout;
|
|
37
|
+
/**
|
|
38
|
+
* Retry function with exponential backoff and jitter
|
|
39
|
+
* Implements retry logic with randomized delays to avoid thundering herd
|
|
40
|
+
* @param fn - Async function to retry
|
|
41
|
+
* @param maxAttempts - Maximum number of attempts
|
|
42
|
+
* @param baseDelayMs - Base delay in milliseconds
|
|
43
|
+
* @param abortSignal - Optional signal to abort retry loop
|
|
44
|
+
* @returns Result of successful function execution
|
|
45
|
+
* @throws Last error if all attempts fail
|
|
46
|
+
*/
|
|
47
|
+
private retryWithJitter;
|
|
48
|
+
/**
|
|
49
|
+
* Determine if an error should trigger a retry
|
|
50
|
+
* Retries on network errors, server errors, and rate limits
|
|
51
|
+
* @param error - Error object
|
|
52
|
+
* @returns True if should retry, false otherwise
|
|
53
|
+
*/
|
|
54
|
+
private shouldRetry;
|
|
55
|
+
/**
|
|
56
|
+
* Sleep for specified milliseconds with abort support
|
|
57
|
+
* @param ms - Milliseconds to sleep
|
|
58
|
+
* @param abortSignal - Optional signal to abort sleep
|
|
59
|
+
* @returns Promise that resolves after delay or rejects if aborted
|
|
60
|
+
*/
|
|
61
|
+
private sleep;
|
|
62
|
+
}
|
|
@@ -0,0 +1,325 @@
|
|
|
1
|
+
var __decorate = (this && this.__decorate) || function (decorators, target, key, desc) {
|
|
2
|
+
var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;
|
|
3
|
+
if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc);
|
|
4
|
+
else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;
|
|
5
|
+
return c > 3 && r && Object.defineProperty(target, key, r), r;
|
|
6
|
+
};
|
|
7
|
+
var __metadata = (this && this.__metadata) || function (k, v) {
|
|
8
|
+
if (typeof Reflect === "object" && typeof Reflect.metadata === "function") return Reflect.metadata(k, v);
|
|
9
|
+
};
|
|
10
|
+
var PostService_1;
|
|
11
|
+
import { Injectable, BadRequestException, Logger } from '@nestjs/common';
|
|
12
|
+
import { randomUUID } from 'crypto';
|
|
13
|
+
import { PostType, ErrorCode } from '../../common/enums/index.js';
|
|
14
|
+
import { AppConfigService } from '../app-config/app-config.service.js';
|
|
15
|
+
import { IdempotencyService } from './idempotency.service.js';
|
|
16
|
+
import { PlatformRegistry } from '../platforms/base/platform-registry.service.js';
|
|
17
|
+
import { AuthValidatorRegistry } from '../platforms/base/auth-validator-registry.service.js';
|
|
18
|
+
import { BasePostService } from './base-post.service.js';
|
|
19
|
+
import { ShutdownService } from '../../common/services/shutdown.service.js';
|
|
20
|
+
let PostService = class PostService extends BasePostService {
|
|
21
|
+
static { PostService_1 = this; }
|
|
22
|
+
idempotencyService;
|
|
23
|
+
shutdownService;
|
|
24
|
+
logger = new Logger(PostService_1.name);
|
|
25
|
+
/** Minimum jitter factor for retry delay randomization (80%) */
|
|
26
|
+
static MIN_JITTER_FACTOR = 0.8;
|
|
27
|
+
/** Maximum jitter factor for retry delay randomization (120%) */
|
|
28
|
+
static MAX_JITTER_FACTOR = 1.2;
|
|
29
|
+
static DEFAULT_REQUEST_TIMEOUT_SECS = 60;
|
|
30
|
+
static MAX_REQUEST_TIMEOUT_SECS = 600;
|
|
31
|
+
constructor(appConfig, platformRegistry, authValidatorRegistry, idempotencyService, shutdownService) {
|
|
32
|
+
super(appConfig, platformRegistry, authValidatorRegistry);
|
|
33
|
+
this.idempotencyService = idempotencyService;
|
|
34
|
+
this.shutdownService = shutdownService;
|
|
35
|
+
}
|
|
36
|
+
/**
|
|
37
|
+
* Publish a post to a social media platform
|
|
38
|
+
* Handles idempotency, platform selection, retry logic, and error handling
|
|
39
|
+
* @param request - Post request with platform, content, and media
|
|
40
|
+
* @param abortSignal - Optional signal to abort the operation
|
|
41
|
+
* @returns Success response with post details or error response
|
|
42
|
+
*/
|
|
43
|
+
async publish(request, abortSignal) {
|
|
44
|
+
const requestId = randomUUID();
|
|
45
|
+
const idempotencyKey = this.idempotencyService.buildKey(request);
|
|
46
|
+
let idempotencyLocked = false;
|
|
47
|
+
if (idempotencyKey) {
|
|
48
|
+
const lock = this.idempotencyService.acquireLock(idempotencyKey);
|
|
49
|
+
if (!lock.acquired) {
|
|
50
|
+
if (lock.status === 'processing') {
|
|
51
|
+
return {
|
|
52
|
+
success: false,
|
|
53
|
+
error: {
|
|
54
|
+
code: ErrorCode.VALIDATION_ERROR,
|
|
55
|
+
message: 'Request with the same idempotencyKey is already being processed',
|
|
56
|
+
requestId,
|
|
57
|
+
},
|
|
58
|
+
};
|
|
59
|
+
}
|
|
60
|
+
if (lock.status === 'completed' && lock.response) {
|
|
61
|
+
return lock.response;
|
|
62
|
+
}
|
|
63
|
+
}
|
|
64
|
+
idempotencyLocked = lock.acquired;
|
|
65
|
+
}
|
|
66
|
+
try {
|
|
67
|
+
const { platform, accountConfig } = this.validateRequest(request);
|
|
68
|
+
const requestTimeoutMs = this.getRequestTimeoutMs(this.appConfig.requestTimeoutSecs);
|
|
69
|
+
// Check if explicit type is supported
|
|
70
|
+
const postType = request.type || PostType.AUTO;
|
|
71
|
+
if (!platform.supportedTypes.includes(postType)) {
|
|
72
|
+
throw new BadRequestException(`Post type "${postType}" is not supported by ${request.platform}`);
|
|
73
|
+
}
|
|
74
|
+
this.logger.log({
|
|
75
|
+
message: `Publishing to ${request.platform} via ${accountConfig.source === 'account' ? request.account : 'inline auth'}, type: ${postType}`,
|
|
76
|
+
metadata: {
|
|
77
|
+
requestId,
|
|
78
|
+
platform: request.platform,
|
|
79
|
+
account: request.account,
|
|
80
|
+
type: postType,
|
|
81
|
+
},
|
|
82
|
+
});
|
|
83
|
+
if (abortSignal?.aborted) {
|
|
84
|
+
throw new Error('Request aborted by client');
|
|
85
|
+
}
|
|
86
|
+
const result = await this.executeWithRequestTimeout(() => this.retryWithJitter(() => platform.publish(request, accountConfig, abortSignal), this.appConfig.retryAttempts, this.appConfig.retryDelayMs, abortSignal), requestTimeoutMs, abortSignal);
|
|
87
|
+
const response = {
|
|
88
|
+
success: true,
|
|
89
|
+
data: {
|
|
90
|
+
postId: result.postId,
|
|
91
|
+
url: result.url,
|
|
92
|
+
platform: request.platform,
|
|
93
|
+
type: postType,
|
|
94
|
+
publishedAt: new Date().toISOString(),
|
|
95
|
+
raw: result.raw,
|
|
96
|
+
requestId,
|
|
97
|
+
},
|
|
98
|
+
};
|
|
99
|
+
if (idempotencyKey) {
|
|
100
|
+
await this.idempotencyService.setCompleted(idempotencyKey, response);
|
|
101
|
+
}
|
|
102
|
+
return response;
|
|
103
|
+
}
|
|
104
|
+
catch (error) {
|
|
105
|
+
// Log full error with stack trace for debugging
|
|
106
|
+
this.logger.error({
|
|
107
|
+
message: `Failed to publish to ${request.platform}: ${error?.message ?? 'Unknown error'}`,
|
|
108
|
+
metadata: {
|
|
109
|
+
requestId,
|
|
110
|
+
platform: request.platform,
|
|
111
|
+
account: request.account,
|
|
112
|
+
type: request.type,
|
|
113
|
+
},
|
|
114
|
+
err: error, // Full error object with stack trace
|
|
115
|
+
});
|
|
116
|
+
const errorResponse = {
|
|
117
|
+
success: false,
|
|
118
|
+
error: {
|
|
119
|
+
code: this.getErrorCode(error),
|
|
120
|
+
message: error.message,
|
|
121
|
+
details: error.response?.data,
|
|
122
|
+
raw: error.response,
|
|
123
|
+
requestId,
|
|
124
|
+
},
|
|
125
|
+
};
|
|
126
|
+
// Always update idempotency record if we locked it
|
|
127
|
+
if (idempotencyKey && idempotencyLocked) {
|
|
128
|
+
await this.idempotencyService.setCompleted(idempotencyKey, errorResponse);
|
|
129
|
+
}
|
|
130
|
+
return errorResponse;
|
|
131
|
+
}
|
|
132
|
+
}
|
|
133
|
+
/**
|
|
134
|
+
* Map error to appropriate error code
|
|
135
|
+
* Categorizes errors for better error handling and monitoring
|
|
136
|
+
* @param error - Error object
|
|
137
|
+
* @returns Error code string
|
|
138
|
+
*/
|
|
139
|
+
getErrorCode(error) {
|
|
140
|
+
if (!error) {
|
|
141
|
+
return ErrorCode.INTERNAL_ERROR;
|
|
142
|
+
}
|
|
143
|
+
if (error instanceof BadRequestException) {
|
|
144
|
+
return ErrorCode.VALIDATION_ERROR;
|
|
145
|
+
}
|
|
146
|
+
if (error.code === 'ENOTFOUND' || error.code === 'ETIMEDOUT') {
|
|
147
|
+
return ErrorCode.TIMEOUT_ERROR;
|
|
148
|
+
}
|
|
149
|
+
if (error.response?.status === 429) {
|
|
150
|
+
return ErrorCode.RATE_LIMIT_ERROR;
|
|
151
|
+
}
|
|
152
|
+
if (error.response?.status >= 500) {
|
|
153
|
+
return ErrorCode.PLATFORM_ERROR;
|
|
154
|
+
}
|
|
155
|
+
if (error.response?.status === 401 || error.response?.status === 403) {
|
|
156
|
+
return ErrorCode.AUTH_ERROR;
|
|
157
|
+
}
|
|
158
|
+
return ErrorCode.PLATFORM_ERROR;
|
|
159
|
+
}
|
|
160
|
+
getRequestTimeoutMs(requestTimeoutSecs) {
|
|
161
|
+
const defaultSecs = PostService_1.DEFAULT_REQUEST_TIMEOUT_SECS;
|
|
162
|
+
const maxSecs = PostService_1.MAX_REQUEST_TIMEOUT_SECS;
|
|
163
|
+
const normalizedSecs = typeof requestTimeoutSecs === 'number' && requestTimeoutSecs > 0
|
|
164
|
+
? requestTimeoutSecs
|
|
165
|
+
: defaultSecs;
|
|
166
|
+
if (normalizedSecs > maxSecs) {
|
|
167
|
+
throw new Error(`requestTimeoutSecs must not exceed ${maxSecs} seconds`);
|
|
168
|
+
}
|
|
169
|
+
return normalizedSecs * 1000;
|
|
170
|
+
}
|
|
171
|
+
async executeWithRequestTimeout(fn, timeoutMs, signal) {
|
|
172
|
+
let timeoutHandle;
|
|
173
|
+
const abortController = new AbortController();
|
|
174
|
+
if (signal?.aborted) {
|
|
175
|
+
throw new Error('Request aborted by client');
|
|
176
|
+
}
|
|
177
|
+
// Listener for external signal
|
|
178
|
+
const onAbort = () => {
|
|
179
|
+
abortController.abort();
|
|
180
|
+
};
|
|
181
|
+
if (signal) {
|
|
182
|
+
signal.addEventListener('abort', onAbort, { once: true });
|
|
183
|
+
}
|
|
184
|
+
try {
|
|
185
|
+
return await Promise.race([
|
|
186
|
+
fn(),
|
|
187
|
+
new Promise((_, reject) => {
|
|
188
|
+
timeoutHandle = setTimeout(() => {
|
|
189
|
+
const error = new Error(`Request timed out after ${timeoutMs}ms`);
|
|
190
|
+
error.code = 'ETIMEDOUT';
|
|
191
|
+
reject(error);
|
|
192
|
+
}, timeoutMs);
|
|
193
|
+
}),
|
|
194
|
+
new Promise((_, reject) => {
|
|
195
|
+
if (signal) {
|
|
196
|
+
signal.addEventListener('abort', () => {
|
|
197
|
+
const error = new Error('Request aborted by client');
|
|
198
|
+
error.code = 'ABORT_ERR';
|
|
199
|
+
reject(error);
|
|
200
|
+
}, { once: true });
|
|
201
|
+
}
|
|
202
|
+
})
|
|
203
|
+
]);
|
|
204
|
+
}
|
|
205
|
+
catch (e) {
|
|
206
|
+
throw e;
|
|
207
|
+
}
|
|
208
|
+
finally {
|
|
209
|
+
if (timeoutHandle) {
|
|
210
|
+
clearTimeout(timeoutHandle);
|
|
211
|
+
}
|
|
212
|
+
if (signal) {
|
|
213
|
+
signal.removeEventListener('abort', onAbort);
|
|
214
|
+
}
|
|
215
|
+
}
|
|
216
|
+
}
|
|
217
|
+
/**
|
|
218
|
+
* Retry function with exponential backoff and jitter
|
|
219
|
+
* Implements retry logic with randomized delays to avoid thundering herd
|
|
220
|
+
* @param fn - Async function to retry
|
|
221
|
+
* @param maxAttempts - Maximum number of attempts
|
|
222
|
+
* @param baseDelayMs - Base delay in milliseconds
|
|
223
|
+
* @param abortSignal - Optional signal to abort retry loop
|
|
224
|
+
* @returns Result of successful function execution
|
|
225
|
+
* @throws Last error if all attempts fail
|
|
226
|
+
*/
|
|
227
|
+
async retryWithJitter(fn, maxAttempts, baseDelayMs, signal) {
|
|
228
|
+
let lastError;
|
|
229
|
+
for (let attempt = 1; attempt <= maxAttempts; attempt++) {
|
|
230
|
+
// Check if shutdown is in progress before attempting
|
|
231
|
+
if (this.shutdownService.shuttingDown) {
|
|
232
|
+
this.logger.warn('Aborting retry loop: shutdown in progress');
|
|
233
|
+
throw new Error('Operation aborted due to shutdown');
|
|
234
|
+
}
|
|
235
|
+
// Check if operation was aborted
|
|
236
|
+
if (signal?.aborted) {
|
|
237
|
+
this.logger.warn('Aborting retry loop: abort signal received');
|
|
238
|
+
throw new Error('Operation aborted');
|
|
239
|
+
}
|
|
240
|
+
try {
|
|
241
|
+
return await fn();
|
|
242
|
+
}
|
|
243
|
+
catch (error) {
|
|
244
|
+
lastError = error;
|
|
245
|
+
if (error instanceof BadRequestException) {
|
|
246
|
+
throw error;
|
|
247
|
+
}
|
|
248
|
+
if (attempt === maxAttempts) {
|
|
249
|
+
break;
|
|
250
|
+
}
|
|
251
|
+
const shouldRetry = this.shouldRetry(error);
|
|
252
|
+
if (!shouldRetry) {
|
|
253
|
+
throw error;
|
|
254
|
+
}
|
|
255
|
+
const jitterRange = PostService_1.MAX_JITTER_FACTOR - PostService_1.MIN_JITTER_FACTOR;
|
|
256
|
+
const jitter = PostService_1.MIN_JITTER_FACTOR + Math.random() * jitterRange; // random(0.8, 1.2)
|
|
257
|
+
const delay = Math.floor(baseDelayMs * jitter * attempt);
|
|
258
|
+
this.logger.warn({
|
|
259
|
+
message: `Attempt ${attempt}/${maxAttempts} failed, retrying in ${delay}ms: ${error?.message ?? 'Unknown error'}`,
|
|
260
|
+
metadata: {
|
|
261
|
+
attempt,
|
|
262
|
+
maxAttempts,
|
|
263
|
+
delay,
|
|
264
|
+
},
|
|
265
|
+
err: error,
|
|
266
|
+
});
|
|
267
|
+
if (signal?.aborted) {
|
|
268
|
+
throw new Error('Request aborted by client');
|
|
269
|
+
}
|
|
270
|
+
await this.sleep(delay, signal);
|
|
271
|
+
}
|
|
272
|
+
}
|
|
273
|
+
throw lastError;
|
|
274
|
+
}
|
|
275
|
+
/**
|
|
276
|
+
* Determine if an error should trigger a retry
|
|
277
|
+
* Retries on network errors, server errors, and rate limits
|
|
278
|
+
* @param error - Error object
|
|
279
|
+
* @returns True if should retry, false otherwise
|
|
280
|
+
*/
|
|
281
|
+
shouldRetry(error) {
|
|
282
|
+
if (error.code === 'ENOTFOUND' || error.code === 'ETIMEDOUT') {
|
|
283
|
+
return true;
|
|
284
|
+
}
|
|
285
|
+
if (error.response?.status >= 500) {
|
|
286
|
+
return true;
|
|
287
|
+
}
|
|
288
|
+
if (error.response?.status === 429) {
|
|
289
|
+
return true;
|
|
290
|
+
}
|
|
291
|
+
return false;
|
|
292
|
+
}
|
|
293
|
+
/**
|
|
294
|
+
* Sleep for specified milliseconds with abort support
|
|
295
|
+
* @param ms - Milliseconds to sleep
|
|
296
|
+
* @param abortSignal - Optional signal to abort sleep
|
|
297
|
+
* @returns Promise that resolves after delay or rejects if aborted
|
|
298
|
+
*/
|
|
299
|
+
sleep(ms, signal) {
|
|
300
|
+
return new Promise((resolve, reject) => {
|
|
301
|
+
if (signal?.aborted) {
|
|
302
|
+
return reject(new Error('Request aborted by client'));
|
|
303
|
+
}
|
|
304
|
+
const onAbort = () => {
|
|
305
|
+
clearTimeout(timeoutId);
|
|
306
|
+
reject(new Error('Request aborted by client'));
|
|
307
|
+
};
|
|
308
|
+
const timeoutId = setTimeout(() => {
|
|
309
|
+
signal?.removeEventListener('abort', onAbort);
|
|
310
|
+
resolve();
|
|
311
|
+
}, ms);
|
|
312
|
+
signal?.addEventListener('abort', onAbort, { once: true });
|
|
313
|
+
});
|
|
314
|
+
}
|
|
315
|
+
};
|
|
316
|
+
PostService = PostService_1 = __decorate([
|
|
317
|
+
Injectable(),
|
|
318
|
+
__metadata("design:paramtypes", [AppConfigService,
|
|
319
|
+
PlatformRegistry,
|
|
320
|
+
AuthValidatorRegistry,
|
|
321
|
+
IdempotencyService,
|
|
322
|
+
ShutdownService])
|
|
323
|
+
], PostService);
|
|
324
|
+
export { PostService };
|
|
325
|
+
//# sourceMappingURL=post.service.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"post.service.js","sourceRoot":"","sources":["../../../../src/modules/post/post.service.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,23 @@
|
|
|
1
|
+
import { Logger } from '@nestjs/common';
|
|
2
|
+
import { PostRequestDto, PreviewResponseDto, PreviewErrorResponseDto } from './dto/index.js';
|
|
3
|
+
import { AppConfigService } from '../app-config/app-config.service.js';
|
|
4
|
+
import { PlatformRegistry } from '../platforms/base/platform-registry.service.js';
|
|
5
|
+
import { AuthValidatorRegistry } from '../platforms/base/auth-validator-registry.service.js';
|
|
6
|
+
import { BasePostService } from './base-post.service.js';
|
|
7
|
+
export declare class PreviewService extends BasePostService {
|
|
8
|
+
protected readonly logger: Logger;
|
|
9
|
+
constructor(appConfig: AppConfigService, platformRegistry: PlatformRegistry, authValidatorRegistry: AuthValidatorRegistry);
|
|
10
|
+
/**
|
|
11
|
+
* Preview a post without actually publishing it
|
|
12
|
+
* Validates the request and returns converted content with warnings
|
|
13
|
+
* @param request - Post request to preview
|
|
14
|
+
* @returns Preview response with validation results or error response
|
|
15
|
+
*/
|
|
16
|
+
preview(request: PostRequestDto): Promise<PreviewResponseDto | PreviewErrorResponseDto>;
|
|
17
|
+
/**
|
|
18
|
+
* Create error response for preview failures
|
|
19
|
+
* @param errors - List of error messages
|
|
20
|
+
* @returns Preview error response
|
|
21
|
+
*/
|
|
22
|
+
private createErrorResponse;
|
|
23
|
+
}
|