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.
Files changed (157) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +1003 -0
  3. package/dist/src/app.constants.d.ts +8 -0
  4. package/dist/src/app.constants.js +9 -0
  5. package/dist/src/app.constants.js.map +1 -0
  6. package/dist/src/common/enums/body-format.enum.d.ts +12 -0
  7. package/dist/src/common/enums/body-format.enum.js +14 -0
  8. package/dist/src/common/enums/body-format.enum.js.map +1 -0
  9. package/dist/src/common/enums/error-code.enum.d.ts +12 -0
  10. package/dist/src/common/enums/error-code.enum.js +14 -0
  11. package/dist/src/common/enums/error-code.enum.js.map +1 -0
  12. package/dist/src/common/enums/index.d.ts +3 -0
  13. package/dist/src/common/enums/index.js +4 -0
  14. package/dist/src/common/enums/index.js.map +1 -0
  15. package/dist/src/common/enums/post-type.enum.d.ts +28 -0
  16. package/dist/src/common/enums/post-type.enum.js +30 -0
  17. package/dist/src/common/enums/post-type.enum.js.map +1 -0
  18. package/dist/src/common/filters/all-exceptions.filter.d.ts +13 -0
  19. package/dist/src/common/filters/all-exceptions.filter.js +103 -0
  20. package/dist/src/common/filters/all-exceptions.filter.js.map +1 -0
  21. package/dist/src/common/helpers/media-input.helper.d.ts +73 -0
  22. package/dist/src/common/helpers/media-input.helper.js +122 -0
  23. package/dist/src/common/helpers/media-input.helper.js.map +1 -0
  24. package/dist/src/common/interceptors/shutdown.interceptor.d.ts +12 -0
  25. package/dist/src/common/interceptors/shutdown.interceptor.js +41 -0
  26. package/dist/src/common/interceptors/shutdown.interceptor.js.map +1 -0
  27. package/dist/src/common/interfaces/logger.interface.d.ts +44 -0
  28. package/dist/src/common/interfaces/logger.interface.js +44 -0
  29. package/dist/src/common/interfaces/logger.interface.js.map +1 -0
  30. package/dist/src/common/services/shutdown.module.d.ts +2 -0
  31. package/dist/src/common/services/shutdown.module.js +18 -0
  32. package/dist/src/common/services/shutdown.module.js.map +1 -0
  33. package/dist/src/common/services/shutdown.service.d.ts +40 -0
  34. package/dist/src/common/services/shutdown.service.js +122 -0
  35. package/dist/src/common/services/shutdown.service.js.map +1 -0
  36. package/dist/src/common/types/index.d.ts +1 -0
  37. package/dist/src/common/types/index.js +2 -0
  38. package/dist/src/common/types/index.js.map +1 -0
  39. package/dist/src/common/types/media-input.type.d.ts +29 -0
  40. package/dist/src/common/types/media-input.type.js +2 -0
  41. package/dist/src/common/types/media-input.type.js.map +1 -0
  42. package/dist/src/common/validators/body-length.validator.d.ts +24 -0
  43. package/dist/src/common/validators/body-length.validator.js +57 -0
  44. package/dist/src/common/validators/body-length.validator.js.map +1 -0
  45. package/dist/src/common/validators/channel-id.validator.d.ts +19 -0
  46. package/dist/src/common/validators/channel-id.validator.js +58 -0
  47. package/dist/src/common/validators/channel-id.validator.js.map +1 -0
  48. package/dist/src/common/validators/has-content.validator.d.ts +23 -0
  49. package/dist/src/common/validators/has-content.validator.js +57 -0
  50. package/dist/src/common/validators/has-content.validator.js.map +1 -0
  51. package/dist/src/common/validators/media-input.validator.d.ts +44 -0
  52. package/dist/src/common/validators/media-input.validator.js +112 -0
  53. package/dist/src/common/validators/media-input.validator.js.map +1 -0
  54. package/dist/src/common/validators/media-priority.validator.d.ts +19 -0
  55. package/dist/src/common/validators/media-priority.validator.js +38 -0
  56. package/dist/src/common/validators/media-priority.validator.js.map +1 -0
  57. package/dist/src/config/app.config.d.ts +33 -0
  58. package/dist/src/config/app.config.js +83 -0
  59. package/dist/src/config/app.config.js.map +1 -0
  60. package/dist/src/config/library.config.d.ts +51 -0
  61. package/dist/src/config/library.config.js +197 -0
  62. package/dist/src/config/library.config.js.map +1 -0
  63. package/dist/src/config/yaml-config.dto.d.ts +37 -0
  64. package/dist/src/config/yaml-config.dto.js +152 -0
  65. package/dist/src/config/yaml-config.dto.js.map +1 -0
  66. package/dist/src/config/yaml.config.d.ts +14 -0
  67. package/dist/src/config/yaml.config.js +72 -0
  68. package/dist/src/config/yaml.config.js.map +1 -0
  69. package/dist/src/index.d.ts +19 -0
  70. package/dist/src/index.js +17 -0
  71. package/dist/src/index.js.map +1 -0
  72. package/dist/src/library.d.ts +57 -0
  73. package/dist/src/library.js +92 -0
  74. package/dist/src/library.js.map +1 -0
  75. package/dist/src/modules/app-config/app-config.module.d.ts +2 -0
  76. package/dist/src/modules/app-config/app-config.module.js +26 -0
  77. package/dist/src/modules/app-config/app-config.module.js.map +1 -0
  78. package/dist/src/modules/app-config/app-config.service.d.ts +14 -0
  79. package/dist/src/modules/app-config/app-config.service.js +18 -0
  80. package/dist/src/modules/app-config/app-config.service.js.map +1 -0
  81. package/dist/src/modules/app-config/interfaces/app-config.interface.d.ts +31 -0
  82. package/dist/src/modules/app-config/interfaces/app-config.interface.js +2 -0
  83. package/dist/src/modules/app-config/interfaces/app-config.interface.js.map +1 -0
  84. package/dist/src/modules/app-config/nest-config.service.d.ts +41 -0
  85. package/dist/src/modules/app-config/nest-config.service.js +91 -0
  86. package/dist/src/modules/app-config/nest-config.service.js.map +1 -0
  87. package/dist/src/modules/health/health.controller.d.ts +12 -0
  88. package/dist/src/modules/health/health.controller.js +33 -0
  89. package/dist/src/modules/health/health.controller.js.map +1 -0
  90. package/dist/src/modules/health/health.module.d.ts +2 -0
  91. package/dist/src/modules/health/health.module.js +17 -0
  92. package/dist/src/modules/health/health.module.js.map +1 -0
  93. package/dist/src/modules/media/media.module.d.ts +2 -0
  94. package/dist/src/modules/media/media.module.js +18 -0
  95. package/dist/src/modules/media/media.module.js.map +1 -0
  96. package/dist/src/modules/media/media.service.d.ts +15 -0
  97. package/dist/src/modules/media/media.service.js +49 -0
  98. package/dist/src/modules/media/media.service.js.map +1 -0
  99. package/dist/src/modules/platforms/base/auth-validator-registry.service.d.ts +25 -0
  100. package/dist/src/modules/platforms/base/auth-validator-registry.service.js +50 -0
  101. package/dist/src/modules/platforms/base/auth-validator-registry.service.js.map +1 -0
  102. package/dist/src/modules/platforms/base/auth-validator.interface.d.ts +16 -0
  103. package/dist/src/modules/platforms/base/auth-validator.interface.js +2 -0
  104. package/dist/src/modules/platforms/base/auth-validator.interface.js.map +1 -0
  105. package/dist/src/modules/platforms/base/index.d.ts +4 -0
  106. package/dist/src/modules/platforms/base/index.js +5 -0
  107. package/dist/src/modules/platforms/base/index.js.map +1 -0
  108. package/dist/src/modules/platforms/base/platform-registry.service.d.ts +31 -0
  109. package/dist/src/modules/platforms/base/platform-registry.service.js +54 -0
  110. package/dist/src/modules/platforms/base/platform-registry.service.js.map +1 -0
  111. package/dist/src/modules/platforms/base/platform.interface.d.ts +39 -0
  112. package/dist/src/modules/platforms/base/platform.interface.js +2 -0
  113. package/dist/src/modules/platforms/base/platform.interface.js.map +1 -0
  114. package/dist/src/modules/platforms/platforms.module.d.ts +13 -0
  115. package/dist/src/modules/platforms/platforms.module.js +59 -0
  116. package/dist/src/modules/platforms/platforms.module.js.map +1 -0
  117. package/dist/src/modules/platforms/telegram/telegram-auth.validator.d.ts +19 -0
  118. package/dist/src/modules/platforms/telegram/telegram-auth.validator.js +51 -0
  119. package/dist/src/modules/platforms/telegram/telegram-auth.validator.js.map +1 -0
  120. package/dist/src/modules/platforms/telegram/telegram-type-detector.service.d.ts +18 -0
  121. package/dist/src/modules/platforms/telegram/telegram-type-detector.service.js +47 -0
  122. package/dist/src/modules/platforms/telegram/telegram-type-detector.service.js.map +1 -0
  123. package/dist/src/modules/platforms/telegram/telegram.platform.d.ts +58 -0
  124. package/dist/src/modules/platforms/telegram/telegram.platform.js +434 -0
  125. package/dist/src/modules/platforms/telegram/telegram.platform.js.map +1 -0
  126. package/dist/src/modules/post/base-post.service.d.ts +64 -0
  127. package/dist/src/modules/post/base-post.service.js +99 -0
  128. package/dist/src/modules/post/base-post.service.js.map +1 -0
  129. package/dist/src/modules/post/dto/index.d.ts +3 -0
  130. package/dist/src/modules/post/dto/index.js +4 -0
  131. package/dist/src/modules/post/dto/index.js.map +1 -0
  132. package/dist/src/modules/post/dto/post-request.dto.d.ts +56 -0
  133. package/dist/src/modules/post/dto/post-request.dto.js +195 -0
  134. package/dist/src/modules/post/dto/post-request.dto.js.map +1 -0
  135. package/dist/src/modules/post/dto/post-response.dto.d.ts +41 -0
  136. package/dist/src/modules/post/dto/post-response.dto.js +2 -0
  137. package/dist/src/modules/post/dto/post-response.dto.js.map +1 -0
  138. package/dist/src/modules/post/dto/preview-response.dto.d.ts +33 -0
  139. package/dist/src/modules/post/dto/preview-response.dto.js +2 -0
  140. package/dist/src/modules/post/dto/preview-response.dto.js.map +1 -0
  141. package/dist/src/modules/post/idempotency.service.d.ts +95 -0
  142. package/dist/src/modules/post/idempotency.service.js +229 -0
  143. package/dist/src/modules/post/idempotency.service.js.map +1 -0
  144. package/dist/src/modules/post/post.controller.d.ts +13 -0
  145. package/dist/src/modules/post/post.controller.js +97 -0
  146. package/dist/src/modules/post/post.controller.js.map +1 -0
  147. package/dist/src/modules/post/post.module.d.ts +2 -0
  148. package/dist/src/modules/post/post.module.js +25 -0
  149. package/dist/src/modules/post/post.module.js.map +1 -0
  150. package/dist/src/modules/post/post.service.d.ts +62 -0
  151. package/dist/src/modules/post/post.service.js +325 -0
  152. package/dist/src/modules/post/post.service.js.map +1 -0
  153. package/dist/src/modules/post/preview.service.d.ts +23 -0
  154. package/dist/src/modules/post/preview.service.js +69 -0
  155. package/dist/src/modules/post/preview.service.js.map +1 -0
  156. package/dist/tsconfig.lib.tsbuildinfo +1 -0
  157. 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,2 @@
1
+ export declare class PostModule {
2
+ }
@@ -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
+ }