@hazeljs/pdf-to-audio 0.2.0-alpha.1

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 (55) hide show
  1. package/LICENSE +192 -0
  2. package/README.md +96 -0
  3. package/dist/index.d.ts +12 -0
  4. package/dist/index.d.ts.map +1 -0
  5. package/dist/index.js +18 -0
  6. package/dist/index.js.map +1 -0
  7. package/dist/index.test.d.ts +2 -0
  8. package/dist/index.test.d.ts.map +1 -0
  9. package/dist/index.test.js +49 -0
  10. package/dist/index.test.js.map +1 -0
  11. package/dist/pdf-extractor.d.ts +5 -0
  12. package/dist/pdf-extractor.d.ts.map +1 -0
  13. package/dist/pdf-extractor.js +15 -0
  14. package/dist/pdf-extractor.js.map +1 -0
  15. package/dist/pdf-extractor.test.d.ts +2 -0
  16. package/dist/pdf-extractor.test.d.ts.map +1 -0
  17. package/dist/pdf-extractor.test.js +40 -0
  18. package/dist/pdf-extractor.test.js.map +1 -0
  19. package/dist/pdf-to-audio-queue.worker.d.ts +16 -0
  20. package/dist/pdf-to-audio-queue.worker.d.ts.map +1 -0
  21. package/dist/pdf-to-audio-queue.worker.js +103 -0
  22. package/dist/pdf-to-audio-queue.worker.js.map +1 -0
  23. package/dist/pdf-to-audio-queue.worker.test.d.ts +2 -0
  24. package/dist/pdf-to-audio-queue.worker.test.d.ts.map +1 -0
  25. package/dist/pdf-to-audio-queue.worker.test.js +24 -0
  26. package/dist/pdf-to-audio-queue.worker.test.js.map +1 -0
  27. package/dist/pdf-to-audio.controller.d.ts +10 -0
  28. package/dist/pdf-to-audio.controller.d.ts.map +1 -0
  29. package/dist/pdf-to-audio.controller.js +210 -0
  30. package/dist/pdf-to-audio.controller.js.map +1 -0
  31. package/dist/pdf-to-audio.controller.test.d.ts +2 -0
  32. package/dist/pdf-to-audio.controller.test.d.ts.map +1 -0
  33. package/dist/pdf-to-audio.controller.test.js +252 -0
  34. package/dist/pdf-to-audio.controller.test.js.map +1 -0
  35. package/dist/pdf-to-audio.module.d.ts +30 -0
  36. package/dist/pdf-to-audio.module.d.ts.map +1 -0
  37. package/dist/pdf-to-audio.module.js +66 -0
  38. package/dist/pdf-to-audio.module.js.map +1 -0
  39. package/dist/pdf-to-audio.module.test.d.ts +2 -0
  40. package/dist/pdf-to-audio.module.test.d.ts.map +1 -0
  41. package/dist/pdf-to-audio.module.test.js +50 -0
  42. package/dist/pdf-to-audio.module.test.js.map +1 -0
  43. package/dist/pdf-to-audio.service.d.ts +10 -0
  44. package/dist/pdf-to-audio.service.d.ts.map +1 -0
  45. package/dist/pdf-to-audio.service.js +132 -0
  46. package/dist/pdf-to-audio.service.js.map +1 -0
  47. package/dist/pdf-to-audio.service.test.d.ts +2 -0
  48. package/dist/pdf-to-audio.service.test.d.ts.map +1 -0
  49. package/dist/pdf-to-audio.service.test.js +146 -0
  50. package/dist/pdf-to-audio.service.test.js.map +1 -0
  51. package/dist/types.d.ts +16 -0
  52. package/dist/types.d.ts.map +1 -0
  53. package/dist/types.js +3 -0
  54. package/dist/types.js.map +1 -0
  55. package/package.json +60 -0
@@ -0,0 +1,10 @@
1
+ import type { Request, HazelResponse } from '@hazeljs/core';
2
+ import { QueueService } from '@hazeljs/queue';
3
+ export declare class PdfToAudioController {
4
+ private readonly queueService;
5
+ constructor(queueService: QueueService);
6
+ convert(req: Request, res: HazelResponse): Promise<void>;
7
+ status(jobId: string, res: HazelResponse): Promise<void>;
8
+ download(jobId: string, res: HazelResponse): Promise<void>;
9
+ }
10
+ //# sourceMappingURL=pdf-to-audio.controller.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"pdf-to-audio.controller.d.ts","sourceRoot":"","sources":["../src/pdf-to-audio.controller.ts"],"names":[],"mappings":"AAWA,OAAO,KAAK,EAAE,OAAO,EAAE,aAAa,EAAE,MAAM,eAAe,CAAC;AAE5D,OAAO,EAAE,YAAY,EAAE,MAAM,gBAAgB,CAAC;AA8B9C,qBACa,oBAAoB;IACnB,OAAO,CAAC,QAAQ,CAAC,YAAY;gBAAZ,YAAY,EAAE,YAAY;IAGjD,OAAO,CAAQ,GAAG,EAAE,OAAO,EAAS,GAAG,EAAE,aAAa,GAAG,OAAO,CAAC,IAAI,CAAC;IAoCtE,MAAM,CAAiB,KAAK,EAAE,MAAM,EAAS,GAAG,EAAE,aAAa,GAAG,OAAO,CAAC,IAAI,CAAC;IAsD/E,QAAQ,CAAiB,KAAK,EAAE,MAAM,EAAS,GAAG,EAAE,aAAa,GAAG,OAAO,CAAC,IAAI,CAAC;CA0BxF"}
@@ -0,0 +1,210 @@
1
+ "use strict";
2
+ var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
3
+ if (k2 === undefined) k2 = k;
4
+ var desc = Object.getOwnPropertyDescriptor(m, k);
5
+ if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
6
+ desc = { enumerable: true, get: function() { return m[k]; } };
7
+ }
8
+ Object.defineProperty(o, k2, desc);
9
+ }) : (function(o, m, k, k2) {
10
+ if (k2 === undefined) k2 = k;
11
+ o[k2] = m[k];
12
+ }));
13
+ var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
14
+ Object.defineProperty(o, "default", { enumerable: true, value: v });
15
+ }) : function(o, v) {
16
+ o["default"] = v;
17
+ });
18
+ var __decorate = (this && this.__decorate) || function (decorators, target, key, desc) {
19
+ var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;
20
+ if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc);
21
+ 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;
22
+ return c > 3 && r && Object.defineProperty(target, key, r), r;
23
+ };
24
+ var __importStar = (this && this.__importStar) || (function () {
25
+ var ownKeys = function(o) {
26
+ ownKeys = Object.getOwnPropertyNames || function (o) {
27
+ var ar = [];
28
+ for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
29
+ return ar;
30
+ };
31
+ return ownKeys(o);
32
+ };
33
+ return function (mod) {
34
+ if (mod && mod.__esModule) return mod;
35
+ var result = {};
36
+ if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
37
+ __setModuleDefault(result, mod);
38
+ return result;
39
+ };
40
+ })();
41
+ var __metadata = (this && this.__metadata) || function (k, v) {
42
+ if (typeof Reflect === "object" && typeof Reflect.metadata === "function") return Reflect.metadata(k, v);
43
+ };
44
+ var __param = (this && this.__param) || function (paramIndex, decorator) {
45
+ return function (target, key) { decorator(target, key, paramIndex); }
46
+ };
47
+ Object.defineProperty(exports, "__esModule", { value: true });
48
+ exports.PdfToAudioController = void 0;
49
+ const core_1 = require("@hazeljs/core");
50
+ const core_2 = require("@hazeljs/core");
51
+ const queue_1 = require("@hazeljs/queue");
52
+ const pdf_to_audio_queue_worker_1 = require("./pdf-to-audio-queue.worker");
53
+ const fileUpload = new core_2.FileUploadInterceptor({
54
+ storage: 'memory',
55
+ limits: { fileSize: 50 * 1024 * 1024, files: 1 },
56
+ fileFilter: (file) => {
57
+ const allowed = ['application/pdf'];
58
+ return !file.mimetype || allowed.includes(file.mimetype);
59
+ },
60
+ });
61
+ function mapJobStateToStatus(state) {
62
+ switch (state) {
63
+ case 'waiting':
64
+ case 'delayed':
65
+ case 'paused':
66
+ return 'pending';
67
+ case 'active':
68
+ return 'processing';
69
+ case 'completed':
70
+ return 'completed';
71
+ case 'failed':
72
+ return 'failed';
73
+ default:
74
+ return 'pending';
75
+ }
76
+ }
77
+ let PdfToAudioController = class PdfToAudioController {
78
+ constructor(queueService) {
79
+ this.queueService = queueService;
80
+ }
81
+ async convert(req, res) {
82
+ try {
83
+ const { files, fields } = await fileUpload.parseMultipart(req);
84
+ const file = files?.find((f) => f.originalname?.toLowerCase().endsWith('.pdf')) || files?.[0];
85
+ if (!file?.buffer) {
86
+ throw new core_1.BadRequestException('No PDF file uploaded. Use multipart form with field "file".');
87
+ }
88
+ const options = {
89
+ includeSummary: fields?.includeSummary !== 'false',
90
+ summaryOnly: fields?.summaryOnly === 'true',
91
+ voice: fields?.voice || undefined,
92
+ };
93
+ const data = {
94
+ pdfBase64: file.buffer.toString('base64'),
95
+ options,
96
+ };
97
+ const { id } = await this.queueService.add(pdf_to_audio_queue_worker_1.PDF_TO_AUDIO_QUEUE, 'convert', data);
98
+ if (!id) {
99
+ throw new core_1.BadRequestException('Failed to enqueue job');
100
+ }
101
+ res.status(202).json({ jobId: id });
102
+ }
103
+ catch (error) {
104
+ core_1.logger.error('PDF-to-audio job submission failed:', error);
105
+ throw error;
106
+ }
107
+ }
108
+ async status(jobId, res) {
109
+ const queue = this.queueService.getQueue(pdf_to_audio_queue_worker_1.PDF_TO_AUDIO_QUEUE);
110
+ const job = await queue.getJob(jobId);
111
+ if (!job) {
112
+ throw new core_1.NotFoundException('Job not found or expired');
113
+ }
114
+ const state = await job.getState();
115
+ const progress = job.progress;
116
+ const completedChunks = typeof progress === 'object' ? progress?.completed : undefined;
117
+ const totalChunks = typeof progress === 'object' ? progress?.total : undefined;
118
+ const phase = typeof progress === 'object' ? progress?.phase : undefined;
119
+ const progressPct = typeof progress === 'number'
120
+ ? progress
121
+ : totalChunks && completedChunks != null && totalChunks > 0
122
+ ? Math.round((completedChunks / totalChunks) * 100)
123
+ : 0;
124
+ let message;
125
+ if (phase === 'extracting') {
126
+ message = 'Extracting text from PDF...';
127
+ }
128
+ else if (phase === 'summarizing') {
129
+ message = 'Generating document summary...';
130
+ }
131
+ else if (phase === 'converting' ||
132
+ (totalChunks != null && completedChunks != null && totalChunks > 0)) {
133
+ message = `Converting chunk ${completedChunks ?? 0} of ${totalChunks ?? 0}`;
134
+ }
135
+ else if (state === 'active') {
136
+ message = 'Processing...';
137
+ }
138
+ else if (state === 'waiting' || state === 'delayed') {
139
+ message = 'Job queued, waiting for worker';
140
+ }
141
+ else if (state === 'completed') {
142
+ message = 'Conversion complete';
143
+ }
144
+ else if (state === 'failed') {
145
+ message = job.failedReason ?? 'Conversion failed';
146
+ }
147
+ res.json({
148
+ jobId: job.id,
149
+ status: mapJobStateToStatus(state),
150
+ progress: progressPct,
151
+ totalChunks,
152
+ completedChunks,
153
+ message,
154
+ error: state === 'failed' ? (job.failedReason ?? 'Unknown error') : undefined,
155
+ });
156
+ }
157
+ async download(jobId, res) {
158
+ const queue = this.queueService.getQueue(pdf_to_audio_queue_worker_1.PDF_TO_AUDIO_QUEUE);
159
+ const job = await queue.getJob(jobId);
160
+ if (!job) {
161
+ throw new core_1.NotFoundException('Job not found or expired');
162
+ }
163
+ const state = await job.getState();
164
+ if (state !== 'completed') {
165
+ throw new core_1.BadRequestException('Job not completed yet. Check status first.');
166
+ }
167
+ const filePath = job.returnvalue;
168
+ if (!filePath || typeof filePath !== 'string') {
169
+ throw new core_1.BadRequestException('Job result not available');
170
+ }
171
+ const fs = await Promise.resolve().then(() => __importStar(require('fs')));
172
+ if (!fs.existsSync(filePath)) {
173
+ throw new core_1.NotFoundException('Audio file no longer available');
174
+ }
175
+ const audioBuffer = fs.readFileSync(filePath);
176
+ if (res.sendBuffer) {
177
+ res.sendBuffer(audioBuffer, 'audio/mpeg');
178
+ }
179
+ }
180
+ };
181
+ exports.PdfToAudioController = PdfToAudioController;
182
+ __decorate([
183
+ (0, core_1.Post)('/convert'),
184
+ __param(0, (0, core_1.Req)()),
185
+ __param(1, (0, core_1.Res)()),
186
+ __metadata("design:type", Function),
187
+ __metadata("design:paramtypes", [Object, Object]),
188
+ __metadata("design:returntype", Promise)
189
+ ], PdfToAudioController.prototype, "convert", null);
190
+ __decorate([
191
+ (0, core_1.Get)('/status/:jobId'),
192
+ __param(0, (0, core_1.Param)('jobId')),
193
+ __param(1, (0, core_1.Res)()),
194
+ __metadata("design:type", Function),
195
+ __metadata("design:paramtypes", [String, Object]),
196
+ __metadata("design:returntype", Promise)
197
+ ], PdfToAudioController.prototype, "status", null);
198
+ __decorate([
199
+ (0, core_1.Get)('/download/:jobId'),
200
+ __param(0, (0, core_1.Param)('jobId')),
201
+ __param(1, (0, core_1.Res)()),
202
+ __metadata("design:type", Function),
203
+ __metadata("design:paramtypes", [String, Object]),
204
+ __metadata("design:returntype", Promise)
205
+ ], PdfToAudioController.prototype, "download", null);
206
+ exports.PdfToAudioController = PdfToAudioController = __decorate([
207
+ (0, core_1.Controller)('api/pdf-to-audio'),
208
+ __metadata("design:paramtypes", [queue_1.QueueService])
209
+ ], PdfToAudioController);
210
+ //# sourceMappingURL=pdf-to-audio.controller.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"pdf-to-audio.controller.js","sourceRoot":"","sources":["../src/pdf-to-audio.controller.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAAA,wCAUuB;AAEvB,wCAAsD;AACtD,0CAA8C;AAC9C,2EAAyF;AAGzF,MAAM,UAAU,GAAG,IAAI,4BAAqB,CAAC;IAC3C,OAAO,EAAE,QAAQ;IACjB,MAAM,EAAE,EAAE,QAAQ,EAAE,EAAE,GAAG,IAAI,GAAG,IAAI,EAAE,KAAK,EAAE,CAAC,EAAE;IAChD,UAAU,EAAE,CAAC,IAAI,EAAW,EAAE;QAC5B,MAAM,OAAO,GAAG,CAAC,iBAAiB,CAAC,CAAC;QACpC,OAAO,CAAC,IAAI,CAAC,QAAQ,IAAI,OAAO,CAAC,QAAQ,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC;IAC3D,CAAC;CACF,CAAC,CAAC;AAEH,SAAS,mBAAmB,CAAC,KAAa;IACxC,QAAQ,KAAK,EAAE,CAAC;QACd,KAAK,SAAS,CAAC;QACf,KAAK,SAAS,CAAC;QACf,KAAK,QAAQ;YACX,OAAO,SAAS,CAAC;QACnB,KAAK,QAAQ;YACX,OAAO,YAAY,CAAC;QACtB,KAAK,WAAW;YACd,OAAO,WAAW,CAAC;QACrB,KAAK,QAAQ;YACX,OAAO,QAAQ,CAAC;QAClB;YACE,OAAO,SAAS,CAAC;IACrB,CAAC;AACH,CAAC;AAGM,IAAM,oBAAoB,GAA1B,MAAM,oBAAoB;IAC/B,YAA6B,YAA0B;QAA1B,iBAAY,GAAZ,YAAY,CAAc;IAAG,CAAC;IAGrD,AAAN,KAAK,CAAC,OAAO,CAAQ,GAAY,EAAS,GAAkB;QAC1D,IAAI,CAAC;YACH,MAAM,EAAE,KAAK,EAAE,MAAM,EAAE,GAAG,MAAM,UAAU,CAAC,cAAc,CACvD,GAAsD,CACvD,CAAC;YACF,MAAM,IAAI,GAAG,KAAK,EAAE,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,YAAY,EAAE,WAAW,EAAE,CAAC,QAAQ,CAAC,MAAM,CAAC,CAAC,IAAI,KAAK,EAAE,CAAC,CAAC,CAAC,CAAC;YAC9F,IAAI,CAAC,IAAI,EAAE,MAAM,EAAE,CAAC;gBAClB,MAAM,IAAI,0BAAmB,CAC3B,6DAA6D,CAC9D,CAAC;YACJ,CAAC;YAED,MAAM,OAAO,GAAsB;gBACjC,cAAc,EAAE,MAAM,EAAE,cAAc,KAAK,OAAO;gBAClD,WAAW,EAAE,MAAM,EAAE,WAAW,KAAK,MAAM;gBAC3C,KAAK,EAAE,MAAM,EAAE,KAAK,IAAI,SAAS;aAClC,CAAC;YAEF,MAAM,IAAI,GAAsB;gBAC9B,SAAS,EAAE,IAAI,CAAC,MAAM,CAAC,QAAQ,CAAC,QAAQ,CAAC;gBACzC,OAAO;aACR,CAAC;YAEF,MAAM,EAAE,EAAE,EAAE,GAAG,MAAM,IAAI,CAAC,YAAY,CAAC,GAAG,CAAC,8CAAkB,EAAE,SAAS,EAAE,IAAI,CAAC,CAAC;YAChF,IAAI,CAAC,EAAE,EAAE,CAAC;gBACR,MAAM,IAAI,0BAAmB,CAAC,uBAAuB,CAAC,CAAC;YACzD,CAAC;YAED,GAAG,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,IAAI,CAAC,EAAE,KAAK,EAAE,EAAE,EAAE,CAAC,CAAC;QACtC,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACf,aAAM,CAAC,KAAK,CAAC,qCAAqC,EAAE,KAAK,CAAC,CAAC;YAC3D,MAAM,KAAK,CAAC;QACd,CAAC;IACH,CAAC;IAGK,AAAN,KAAK,CAAC,MAAM,CAAiB,KAAa,EAAS,GAAkB;QACnE,MAAM,KAAK,GAAG,IAAI,CAAC,YAAY,CAAC,QAAQ,CAAU,8CAAkB,CAAC,CAAC;QACtE,MAAM,GAAG,GAAG,MAAM,KAAK,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC;QACtC,IAAI,CAAC,GAAG,EAAE,CAAC;YACT,MAAM,IAAI,wBAAiB,CAAC,0BAA0B,CAAC,CAAC;QAC1D,CAAC;QAED,MAAM,KAAK,GAAG,MAAM,GAAG,CAAC,QAAQ,EAAE,CAAC;QACnC,MAAM,QAAQ,GAAG,GAAG,CAAC,QAGR,CAAC;QACd,MAAM,eAAe,GAAG,OAAO,QAAQ,KAAK,QAAQ,CAAC,CAAC,CAAC,QAAQ,EAAE,SAAS,CAAC,CAAC,CAAC,SAAS,CAAC;QACvF,MAAM,WAAW,GAAG,OAAO,QAAQ,KAAK,QAAQ,CAAC,CAAC,CAAC,QAAQ,EAAE,KAAK,CAAC,CAAC,CAAC,SAAS,CAAC;QAC/E,MAAM,KAAK,GAAG,OAAO,QAAQ,KAAK,QAAQ,CAAC,CAAC,CAAC,QAAQ,EAAE,KAAK,CAAC,CAAC,CAAC,SAAS,CAAC;QACzE,MAAM,WAAW,GACf,OAAO,QAAQ,KAAK,QAAQ;YAC1B,CAAC,CAAC,QAAQ;YACV,CAAC,CAAC,WAAW,IAAI,eAAe,IAAI,IAAI,IAAI,WAAW,GAAG,CAAC;gBACzD,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,eAAe,GAAG,WAAW,CAAC,GAAG,GAAG,CAAC;gBACnD,CAAC,CAAC,CAAC,CAAC;QAEV,IAAI,OAA2B,CAAC;QAChC,IAAI,KAAK,KAAK,YAAY,EAAE,CAAC;YAC3B,OAAO,GAAG,6BAA6B,CAAC;QAC1C,CAAC;aAAM,IAAI,KAAK,KAAK,aAAa,EAAE,CAAC;YACnC,OAAO,GAAG,gCAAgC,CAAC;QAC7C,CAAC;aAAM,IACL,KAAK,KAAK,YAAY;YACtB,CAAC,WAAW,IAAI,IAAI,IAAI,eAAe,IAAI,IAAI,IAAI,WAAW,GAAG,CAAC,CAAC,EACnE,CAAC;YACD,OAAO,GAAG,oBAAoB,eAAe,IAAI,CAAC,OAAO,WAAW,IAAI,CAAC,EAAE,CAAC;QAC9E,CAAC;aAAM,IAAI,KAAK,KAAK,QAAQ,EAAE,CAAC;YAC9B,OAAO,GAAG,eAAe,CAAC;QAC5B,CAAC;aAAM,IAAI,KAAK,KAAK,SAAS,IAAI,KAAK,KAAK,SAAS,EAAE,CAAC;YACtD,OAAO,GAAG,gCAAgC,CAAC;QAC7C,CAAC;aAAM,IAAI,KAAK,KAAK,WAAW,EAAE,CAAC;YACjC,OAAO,GAAG,qBAAqB,CAAC;QAClC,CAAC;aAAM,IAAI,KAAK,KAAK,QAAQ,EAAE,CAAC;YAC9B,OAAO,GAAG,GAAG,CAAC,YAAY,IAAI,mBAAmB,CAAC;QACpD,CAAC;QAED,GAAG,CAAC,IAAI,CAAC;YACP,KAAK,EAAE,GAAG,CAAC,EAAE;YACb,MAAM,EAAE,mBAAmB,CAAC,KAAK,CAAC;YAClC,QAAQ,EAAE,WAAW;YACrB,WAAW;YACX,eAAe;YACf,OAAO;YACP,KAAK,EAAE,KAAK,KAAK,QAAQ,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,YAAY,IAAI,eAAe,CAAC,CAAC,CAAC,CAAC,SAAS;SAC9E,CAAC,CAAC;IACL,CAAC;IAGK,AAAN,KAAK,CAAC,QAAQ,CAAiB,KAAa,EAAS,GAAkB;QACrE,MAAM,KAAK,GAAG,IAAI,CAAC,YAAY,CAAC,QAAQ,CAAU,8CAAkB,CAAC,CAAC;QACtE,MAAM,GAAG,GAAG,MAAM,KAAK,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC;QACtC,IAAI,CAAC,GAAG,EAAE,CAAC;YACT,MAAM,IAAI,wBAAiB,CAAC,0BAA0B,CAAC,CAAC;QAC1D,CAAC;QAED,MAAM,KAAK,GAAG,MAAM,GAAG,CAAC,QAAQ,EAAE,CAAC;QACnC,IAAI,KAAK,KAAK,WAAW,EAAE,CAAC;YAC1B,MAAM,IAAI,0BAAmB,CAAC,4CAA4C,CAAC,CAAC;QAC9E,CAAC;QAED,MAAM,QAAQ,GAAI,GAAgC,CAAC,WAAW,CAAC;QAC/D,IAAI,CAAC,QAAQ,IAAI,OAAO,QAAQ,KAAK,QAAQ,EAAE,CAAC;YAC9C,MAAM,IAAI,0BAAmB,CAAC,0BAA0B,CAAC,CAAC;QAC5D,CAAC;QAED,MAAM,EAAE,GAAG,wDAAa,IAAI,GAAC,CAAC;QAC9B,IAAI,CAAC,EAAE,CAAC,UAAU,CAAC,QAAQ,CAAC,EAAE,CAAC;YAC7B,MAAM,IAAI,wBAAiB,CAAC,gCAAgC,CAAC,CAAC;QAChE,CAAC;QACD,MAAM,WAAW,GAAG,EAAE,CAAC,YAAY,CAAC,QAAQ,CAAC,CAAC;QAC9C,IAAI,GAAG,CAAC,UAAU,EAAE,CAAC;YACnB,GAAG,CAAC,UAAU,CAAC,WAAW,EAAE,YAAY,CAAC,CAAC;QAC5C,CAAC;IACH,CAAC;CACF,CAAA;AAxHY,oDAAoB;AAIzB;IADL,IAAA,WAAI,EAAC,UAAU,CAAC;IACF,WAAA,IAAA,UAAG,GAAE,CAAA;IAAgB,WAAA,IAAA,UAAG,GAAE,CAAA;;;;mDAiCxC;AAGK;IADL,IAAA,UAAG,EAAC,gBAAgB,CAAC;IACR,WAAA,IAAA,YAAK,EAAC,OAAO,CAAC,CAAA;IAAiB,WAAA,IAAA,UAAG,GAAE,CAAA;;;;kDAmDjD;AAGK;IADL,IAAA,UAAG,EAAC,kBAAkB,CAAC;IACR,WAAA,IAAA,YAAK,EAAC,OAAO,CAAC,CAAA;IAAiB,WAAA,IAAA,UAAG,GAAE,CAAA;;;;oDAyBnD;+BAvHU,oBAAoB;IADhC,IAAA,iBAAU,EAAC,kBAAkB,CAAC;qCAEc,oBAAY;GAD5C,oBAAoB,CAwHhC"}
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=pdf-to-audio.controller.test.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"pdf-to-audio.controller.test.d.ts","sourceRoot":"","sources":["../src/pdf-to-audio.controller.test.ts"],"names":[],"mappings":""}
@@ -0,0 +1,252 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ const mockAdd = jest.fn();
4
+ const mockGetQueue = jest.fn();
5
+ const mockSendBuffer = jest.fn();
6
+ const mockJson = jest.fn();
7
+ const mockStatus = jest.fn().mockReturnThis();
8
+ jest.mock('@hazeljs/core', () => {
9
+ const actual = jest.requireActual('@hazeljs/core');
10
+ const parseMultipartFn = jest.fn();
11
+ global.__mockParseMultipart =
12
+ parseMultipartFn;
13
+ return {
14
+ ...actual,
15
+ FileUploadInterceptor: jest.fn().mockImplementation(() => ({
16
+ parseMultipart: parseMultipartFn,
17
+ })),
18
+ };
19
+ });
20
+ jest.mock('@hazeljs/queue', () => ({
21
+ QueueService: jest.fn().mockImplementation(() => ({
22
+ add: mockAdd,
23
+ getQueue: mockGetQueue,
24
+ })),
25
+ }));
26
+ const mockExistsSync = jest.fn();
27
+ const mockReadFileSync = jest.fn();
28
+ jest.mock('fs', () => {
29
+ const actual = jest.requireActual('fs');
30
+ return {
31
+ ...actual,
32
+ existsSync: (...args) => mockExistsSync(...args),
33
+ readFileSync: (...args) => mockReadFileSync(...args),
34
+ };
35
+ });
36
+ const pdf_to_audio_controller_1 = require("./pdf-to-audio.controller");
37
+ const pdf_to_audio_queue_worker_1 = require("./pdf-to-audio-queue.worker");
38
+ const getMockParseMultipart = () => global.__mockParseMultipart;
39
+ describe('PdfToAudioController', () => {
40
+ let controller;
41
+ let mockQueue;
42
+ beforeEach(() => {
43
+ jest.clearAllMocks();
44
+ mockQueue = {
45
+ getJob: jest.fn(),
46
+ };
47
+ mockGetQueue.mockReturnValue(mockQueue);
48
+ mockAdd.mockResolvedValue({ id: 'job-123' });
49
+ controller = new pdf_to_audio_controller_1.PdfToAudioController({
50
+ add: mockAdd,
51
+ getQueue: mockGetQueue,
52
+ });
53
+ });
54
+ describe('convert', () => {
55
+ it('should add job to queue and return jobId', async () => {
56
+ const pdfBuffer = Buffer.from('pdf-content');
57
+ getMockParseMultipart().mockResolvedValue({
58
+ files: [{ originalname: 'doc.pdf', buffer: pdfBuffer }],
59
+ fields: {},
60
+ });
61
+ const mockRes = {
62
+ setHeader: jest.fn(),
63
+ status: mockStatus,
64
+ json: mockJson,
65
+ };
66
+ await controller.convert({}, mockRes);
67
+ expect(mockAdd).toHaveBeenCalledWith(pdf_to_audio_queue_worker_1.PDF_TO_AUDIO_QUEUE, 'convert', expect.objectContaining({
68
+ pdfBase64: expect.any(String),
69
+ options: expect.objectContaining({ includeSummary: true }),
70
+ }));
71
+ expect(mockStatus).toHaveBeenCalledWith(202);
72
+ expect(mockJson).toHaveBeenCalledWith({ jobId: 'job-123' });
73
+ });
74
+ it('should pass includeSummary false when field is "false"', async () => {
75
+ getMockParseMultipart().mockResolvedValue({
76
+ files: [{ originalname: 'doc.pdf', buffer: Buffer.from('pdf') }],
77
+ fields: { includeSummary: 'false' },
78
+ });
79
+ await controller.convert({}, { status: mockStatus, json: mockJson });
80
+ expect(mockAdd).toHaveBeenCalledWith(pdf_to_audio_queue_worker_1.PDF_TO_AUDIO_QUEUE, 'convert', expect.objectContaining({
81
+ options: expect.objectContaining({ includeSummary: false }),
82
+ }));
83
+ });
84
+ it('should pass summaryOnly true when field is "true"', async () => {
85
+ getMockParseMultipart().mockResolvedValue({
86
+ files: [{ originalname: 'doc.pdf', buffer: Buffer.from('pdf') }],
87
+ fields: { summaryOnly: 'true' },
88
+ });
89
+ await controller.convert({}, { status: mockStatus, json: mockJson });
90
+ expect(mockAdd).toHaveBeenCalledWith(pdf_to_audio_queue_worker_1.PDF_TO_AUDIO_QUEUE, 'convert', expect.objectContaining({
91
+ options: expect.objectContaining({ summaryOnly: true }),
92
+ }));
93
+ });
94
+ it('should pass voice from fields', async () => {
95
+ getMockParseMultipart().mockResolvedValue({
96
+ files: [{ originalname: 'doc.pdf', buffer: Buffer.from('pdf') }],
97
+ fields: { voice: 'nova' },
98
+ });
99
+ await controller.convert({}, { status: mockStatus, json: mockJson });
100
+ expect(mockAdd).toHaveBeenCalledWith(pdf_to_audio_queue_worker_1.PDF_TO_AUDIO_QUEUE, 'convert', expect.objectContaining({
101
+ options: expect.objectContaining({ voice: 'nova' }),
102
+ }));
103
+ });
104
+ it('should throw when enqueue fails (no id)', async () => {
105
+ getMockParseMultipart().mockResolvedValue({
106
+ files: [{ originalname: 'doc.pdf', buffer: Buffer.from('pdf') }],
107
+ fields: {},
108
+ });
109
+ mockAdd.mockResolvedValue({ id: undefined });
110
+ await expect(controller.convert({}, { status: mockStatus, json: mockJson })).rejects.toThrow('Failed to enqueue job');
111
+ });
112
+ it('should throw when no file uploaded', async () => {
113
+ getMockParseMultipart().mockResolvedValue({ files: [], fields: {} });
114
+ await expect(controller.convert({}, {})).rejects.toThrow('No PDF file uploaded');
115
+ expect(mockAdd).not.toHaveBeenCalled();
116
+ });
117
+ });
118
+ describe('status', () => {
119
+ it('should return job status', async () => {
120
+ mockQueue.getJob.mockResolvedValue({
121
+ id: 'job-123',
122
+ getState: jest.fn().mockResolvedValue('active'),
123
+ progress: { completed: 5, total: 10 },
124
+ failedReason: null,
125
+ });
126
+ const mockRes = { json: mockJson };
127
+ await controller.status('job-123', mockRes);
128
+ expect(mockGetQueue).toHaveBeenCalledWith(pdf_to_audio_queue_worker_1.PDF_TO_AUDIO_QUEUE);
129
+ expect(mockQueue.getJob).toHaveBeenCalledWith('job-123');
130
+ expect(mockJson).toHaveBeenCalledWith(expect.objectContaining({
131
+ jobId: 'job-123',
132
+ status: 'processing',
133
+ progress: 50,
134
+ totalChunks: 10,
135
+ completedChunks: 5,
136
+ message: 'Converting chunk 5 of 10',
137
+ }));
138
+ });
139
+ it('should throw when job not found', async () => {
140
+ mockQueue.getJob.mockResolvedValue(null);
141
+ await expect(controller.status('bad-id', { json: mockJson })).rejects.toThrow('Job not found or expired');
142
+ });
143
+ it('should return extracting phase message', async () => {
144
+ mockQueue.getJob.mockResolvedValue({
145
+ id: 'job-1',
146
+ getState: jest.fn().mockResolvedValue('active'),
147
+ progress: { completed: 0, total: 0, phase: 'extracting' },
148
+ failedReason: null,
149
+ });
150
+ await controller.status('job-1', { json: mockJson });
151
+ expect(mockJson).toHaveBeenCalledWith(expect.objectContaining({ message: 'Extracting text from PDF...' }));
152
+ });
153
+ it('should return summarizing phase message', async () => {
154
+ mockQueue.getJob.mockResolvedValue({
155
+ id: 'job-1',
156
+ getState: jest.fn().mockResolvedValue('active'),
157
+ progress: { completed: 0, total: 10, phase: 'summarizing' },
158
+ failedReason: null,
159
+ });
160
+ await controller.status('job-1', { json: mockJson });
161
+ expect(mockJson).toHaveBeenCalledWith(expect.objectContaining({ message: 'Generating document summary...' }));
162
+ });
163
+ it('should return waiting message for queued job', async () => {
164
+ mockQueue.getJob.mockResolvedValue({
165
+ id: 'job-1',
166
+ getState: jest.fn().mockResolvedValue('waiting'),
167
+ progress: 0,
168
+ failedReason: null,
169
+ });
170
+ await controller.status('job-1', { json: mockJson });
171
+ expect(mockJson).toHaveBeenCalledWith(expect.objectContaining({ status: 'pending', message: 'Job queued, waiting for worker' }));
172
+ });
173
+ it('should return error for failed job', async () => {
174
+ mockQueue.getJob.mockResolvedValue({
175
+ id: 'job-1',
176
+ getState: jest.fn().mockResolvedValue('failed'),
177
+ progress: {},
178
+ failedReason: 'TTS API error',
179
+ });
180
+ await controller.status('job-1', { json: mockJson });
181
+ expect(mockJson).toHaveBeenCalledWith(expect.objectContaining({
182
+ status: 'failed',
183
+ message: 'TTS API error',
184
+ error: 'TTS API error',
185
+ }));
186
+ });
187
+ it('should use numeric progress when progress is a number', async () => {
188
+ mockQueue.getJob.mockResolvedValue({
189
+ id: 'job-1',
190
+ getState: jest.fn().mockResolvedValue('active'),
191
+ progress: 75,
192
+ failedReason: null,
193
+ });
194
+ await controller.status('job-1', { json: mockJson });
195
+ expect(mockJson).toHaveBeenCalledWith(expect.objectContaining({ progress: 75 }));
196
+ });
197
+ });
198
+ describe('download', () => {
199
+ it('should return audio when job completed', async () => {
200
+ const audioBuffer = Buffer.from('audio-data');
201
+ mockQueue.getJob.mockResolvedValue({
202
+ id: 'job-123',
203
+ getState: jest.fn().mockResolvedValue('completed'),
204
+ returnvalue: '/data/pdf-to-audio/job-123.mp3',
205
+ });
206
+ mockExistsSync.mockReturnValue(true);
207
+ mockReadFileSync.mockReturnValue(audioBuffer);
208
+ const mockRes = { sendBuffer: mockSendBuffer };
209
+ await controller.download('job-123', mockRes);
210
+ expect(mockExistsSync).toHaveBeenCalledWith('/data/pdf-to-audio/job-123.mp3');
211
+ expect(mockReadFileSync).toHaveBeenCalledWith('/data/pdf-to-audio/job-123.mp3');
212
+ expect(mockSendBuffer).toHaveBeenCalledWith(audioBuffer, 'audio/mpeg');
213
+ });
214
+ it('should throw when audio file not found', async () => {
215
+ mockQueue.getJob.mockResolvedValue({
216
+ id: 'job-123',
217
+ getState: jest.fn().mockResolvedValue('completed'),
218
+ returnvalue: '/data/pdf-to-audio/job-123.mp3',
219
+ });
220
+ mockExistsSync.mockReturnValue(false);
221
+ await expect(controller.download('job-123', {})).rejects.toThrow('Audio file no longer available');
222
+ });
223
+ it('should throw when job not found', async () => {
224
+ mockQueue.getJob.mockResolvedValue(null);
225
+ await expect(controller.download('bad-id', {})).rejects.toThrow('Job not found or expired');
226
+ });
227
+ it('should throw when job not completed', async () => {
228
+ mockQueue.getJob.mockResolvedValue({
229
+ id: 'job-123',
230
+ getState: jest.fn().mockResolvedValue('processing'),
231
+ });
232
+ await expect(controller.download('job-123', {})).rejects.toThrow('Job not completed yet');
233
+ });
234
+ it('should throw when job has no returnvalue', async () => {
235
+ mockQueue.getJob.mockResolvedValue({
236
+ id: 'job-123',
237
+ getState: jest.fn().mockResolvedValue('completed'),
238
+ returnvalue: undefined,
239
+ });
240
+ await expect(controller.download('job-123', {})).rejects.toThrow('Job result not available');
241
+ });
242
+ it('should throw when returnvalue is not a string', async () => {
243
+ mockQueue.getJob.mockResolvedValue({
244
+ id: 'job-123',
245
+ getState: jest.fn().mockResolvedValue('completed'),
246
+ returnvalue: 123,
247
+ });
248
+ await expect(controller.download('job-123', {})).rejects.toThrow('Job result not available');
249
+ });
250
+ });
251
+ });
252
+ //# sourceMappingURL=pdf-to-audio.controller.test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"pdf-to-audio.controller.test.js","sourceRoot":"","sources":["../src/pdf-to-audio.controller.test.ts"],"names":[],"mappings":";;AAAA,MAAM,OAAO,GAAG,IAAI,CAAC,EAAE,EAAE,CAAC;AAC1B,MAAM,YAAY,GAAG,IAAI,CAAC,EAAE,EAAE,CAAC;AAC/B,MAAM,cAAc,GAAG,IAAI,CAAC,EAAE,EAAE,CAAC;AACjC,MAAM,QAAQ,GAAG,IAAI,CAAC,EAAE,EAAE,CAAC;AAC3B,MAAM,UAAU,GAAG,IAAI,CAAC,EAAE,EAAE,CAAC,cAAc,EAAE,CAAC;AAE9C,IAAI,CAAC,IAAI,CAAC,eAAe,EAAE,GAAG,EAAE;IAC9B,MAAM,MAAM,GAAG,IAAI,CAAC,aAAa,CAAC,eAAe,CAAC,CAAC;IACnD,MAAM,gBAAgB,GAAG,IAAI,CAAC,EAAE,EAAE,CAAC;IAClC,MAAmE,CAAC,oBAAoB;QACvF,gBAAgB,CAAC;IACnB,OAAO;QACL,GAAG,MAAM;QACT,qBAAqB,EAAE,IAAI,CAAC,EAAE,EAAE,CAAC,kBAAkB,CAAC,GAAG,EAAE,CAAC,CAAC;YACzD,cAAc,EAAE,gBAAgB;SACjC,CAAC,CAAC;KACJ,CAAC;AACJ,CAAC,CAAC,CAAC;AAEH,IAAI,CAAC,IAAI,CAAC,gBAAgB,EAAE,GAAG,EAAE,CAAC,CAAC;IACjC,YAAY,EAAE,IAAI,CAAC,EAAE,EAAE,CAAC,kBAAkB,CAAC,GAAG,EAAE,CAAC,CAAC;QAChD,GAAG,EAAE,OAAO;QACZ,QAAQ,EAAE,YAAY;KACvB,CAAC,CAAC;CACJ,CAAC,CAAC,CAAC;AAEJ,MAAM,cAAc,GAAG,IAAI,CAAC,EAAE,EAAE,CAAC;AACjC,MAAM,gBAAgB,GAAG,IAAI,CAAC,EAAE,EAAE,CAAC;AACnC,IAAI,CAAC,IAAI,CAAC,IAAI,EAAE,GAAG,EAAE;IACnB,MAAM,MAAM,GAAG,IAAI,CAAC,aAAa,CAAsB,IAAI,CAAC,CAAC;IAC7D,OAAO;QACL,GAAG,MAAM;QACT,UAAU,EAAE,CAAC,GAAG,IAAe,EAAE,EAAE,CAAC,cAAc,CAAC,GAAG,IAAI,CAAC;QAC3D,YAAY,EAAE,CAAC,GAAG,IAAe,EAAE,EAAE,CAAC,gBAAgB,CAAC,GAAG,IAAI,CAAC;KAChE,CAAC;AACJ,CAAC,CAAC,CAAC;AAEH,uEAAiE;AACjE,2EAAiE;AAEjE,MAAM,qBAAqB,GAAG,GAAG,EAAE,CAChC,MAAkE,CAAC,oBAAoB,CAAC;AAE3F,QAAQ,CAAC,sBAAsB,EAAE,GAAG,EAAE;IACpC,IAAI,UAAgC,CAAC;IACrC,IAAI,SAAgC,CAAC;IAErC,UAAU,CAAC,GAAG,EAAE;QACd,IAAI,CAAC,aAAa,EAAE,CAAC;QACrB,SAAS,GAAG;YACV,MAAM,EAAE,IAAI,CAAC,EAAE,EAAE;SAClB,CAAC;QACF,YAAY,CAAC,eAAe,CAAC,SAAS,CAAC,CAAC;QACxC,OAAO,CAAC,iBAAiB,CAAC,EAAE,EAAE,EAAE,SAAS,EAAE,CAAC,CAAC;QAC7C,UAAU,GAAG,IAAI,8CAAoB,CAAC;YACpC,GAAG,EAAE,OAAO;YACZ,QAAQ,EAAE,YAAY;SACd,CAAC,CAAC;IACd,CAAC,CAAC,CAAC;IAEH,QAAQ,CAAC,SAAS,EAAE,GAAG,EAAE;QACvB,EAAE,CAAC,0CAA0C,EAAE,KAAK,IAAI,EAAE;YACxD,MAAM,SAAS,GAAG,MAAM,CAAC,IAAI,CAAC,aAAa,CAAC,CAAC;YAC7C,qBAAqB,EAAE,CAAC,iBAAiB,CAAC;gBACxC,KAAK,EAAE,CAAC,EAAE,YAAY,EAAE,SAAS,EAAE,MAAM,EAAE,SAAS,EAAE,CAAC;gBACvD,MAAM,EAAE,EAAE;aACX,CAAC,CAAC;YAEH,MAAM,OAAO,GAAG;gBACd,SAAS,EAAE,IAAI,CAAC,EAAE,EAAE;gBACpB,MAAM,EAAE,UAAU;gBAClB,IAAI,EAAE,QAAQ;aACf,CAAC;YAEF,MAAM,UAAU,CAAC,OAAO,CAAC,EAAW,EAAE,OAAgB,CAAC,CAAC;YAExD,MAAM,CAAC,OAAO,CAAC,CAAC,oBAAoB,CAClC,8CAAkB,EAClB,SAAS,EACT,MAAM,CAAC,gBAAgB,CAAC;gBACtB,SAAS,EAAE,MAAM,CAAC,GAAG,CAAC,MAAM,CAAC;gBAC7B,OAAO,EAAE,MAAM,CAAC,gBAAgB,CAAC,EAAE,cAAc,EAAE,IAAI,EAAE,CAAC;aAC3D,CAAC,CACH,CAAC;YACF,MAAM,CAAC,UAAU,CAAC,CAAC,oBAAoB,CAAC,GAAG,CAAC,CAAC;YAC7C,MAAM,CAAC,QAAQ,CAAC,CAAC,oBAAoB,CAAC,EAAE,KAAK,EAAE,SAAS,EAAE,CAAC,CAAC;QAC9D,CAAC,CAAC,CAAC;QAEH,EAAE,CAAC,wDAAwD,EAAE,KAAK,IAAI,EAAE;YACtE,qBAAqB,EAAE,CAAC,iBAAiB,CAAC;gBACxC,KAAK,EAAE,CAAC,EAAE,YAAY,EAAE,SAAS,EAAE,MAAM,EAAE,MAAM,CAAC,IAAI,CAAC,KAAK,CAAC,EAAE,CAAC;gBAChE,MAAM,EAAE,EAAE,cAAc,EAAE,OAAO,EAAE;aACpC,CAAC,CAAC;YAEH,MAAM,UAAU,CAAC,OAAO,CAAC,EAAW,EAAE,EAAE,MAAM,EAAE,UAAU,EAAE,IAAI,EAAE,QAAQ,EAAW,CAAC,CAAC;YAEvF,MAAM,CAAC,OAAO,CAAC,CAAC,oBAAoB,CAClC,8CAAkB,EAClB,SAAS,EACT,MAAM,CAAC,gBAAgB,CAAC;gBACtB,OAAO,EAAE,MAAM,CAAC,gBAAgB,CAAC,EAAE,cAAc,EAAE,KAAK,EAAE,CAAC;aAC5D,CAAC,CACH,CAAC;QACJ,CAAC,CAAC,CAAC;QAEH,EAAE,CAAC,mDAAmD,EAAE,KAAK,IAAI,EAAE;YACjE,qBAAqB,EAAE,CAAC,iBAAiB,CAAC;gBACxC,KAAK,EAAE,CAAC,EAAE,YAAY,EAAE,SAAS,EAAE,MAAM,EAAE,MAAM,CAAC,IAAI,CAAC,KAAK,CAAC,EAAE,CAAC;gBAChE,MAAM,EAAE,EAAE,WAAW,EAAE,MAAM,EAAE;aAChC,CAAC,CAAC;YAEH,MAAM,UAAU,CAAC,OAAO,CAAC,EAAW,EAAE,EAAE,MAAM,EAAE,UAAU,EAAE,IAAI,EAAE,QAAQ,EAAW,CAAC,CAAC;YAEvF,MAAM,CAAC,OAAO,CAAC,CAAC,oBAAoB,CAClC,8CAAkB,EAClB,SAAS,EACT,MAAM,CAAC,gBAAgB,CAAC;gBACtB,OAAO,EAAE,MAAM,CAAC,gBAAgB,CAAC,EAAE,WAAW,EAAE,IAAI,EAAE,CAAC;aACxD,CAAC,CACH,CAAC;QACJ,CAAC,CAAC,CAAC;QAEH,EAAE,CAAC,+BAA+B,EAAE,KAAK,IAAI,EAAE;YAC7C,qBAAqB,EAAE,CAAC,iBAAiB,CAAC;gBACxC,KAAK,EAAE,CAAC,EAAE,YAAY,EAAE,SAAS,EAAE,MAAM,EAAE,MAAM,CAAC,IAAI,CAAC,KAAK,CAAC,EAAE,CAAC;gBAChE,MAAM,EAAE,EAAE,KAAK,EAAE,MAAM,EAAE;aAC1B,CAAC,CAAC;YAEH,MAAM,UAAU,CAAC,OAAO,CAAC,EAAW,EAAE,EAAE,MAAM,EAAE,UAAU,EAAE,IAAI,EAAE,QAAQ,EAAW,CAAC,CAAC;YAEvF,MAAM,CAAC,OAAO,CAAC,CAAC,oBAAoB,CAClC,8CAAkB,EAClB,SAAS,EACT,MAAM,CAAC,gBAAgB,CAAC;gBACtB,OAAO,EAAE,MAAM,CAAC,gBAAgB,CAAC,EAAE,KAAK,EAAE,MAAM,EAAE,CAAC;aACpD,CAAC,CACH,CAAC;QACJ,CAAC,CAAC,CAAC;QAEH,EAAE,CAAC,yCAAyC,EAAE,KAAK,IAAI,EAAE;YACvD,qBAAqB,EAAE,CAAC,iBAAiB,CAAC;gBACxC,KAAK,EAAE,CAAC,EAAE,YAAY,EAAE,SAAS,EAAE,MAAM,EAAE,MAAM,CAAC,IAAI,CAAC,KAAK,CAAC,EAAE,CAAC;gBAChE,MAAM,EAAE,EAAE;aACX,CAAC,CAAC;YACH,OAAO,CAAC,iBAAiB,CAAC,EAAE,EAAE,EAAE,SAAS,EAAE,CAAC,CAAC;YAE7C,MAAM,MAAM,CACV,UAAU,CAAC,OAAO,CAAC,EAAW,EAAE,EAAE,MAAM,EAAE,UAAU,EAAE,IAAI,EAAE,QAAQ,EAAW,CAAC,CACjF,CAAC,OAAO,CAAC,OAAO,CAAC,uBAAuB,CAAC,CAAC;QAC7C,CAAC,CAAC,CAAC;QAEH,EAAE,CAAC,oCAAoC,EAAE,KAAK,IAAI,EAAE;YAClD,qBAAqB,EAAE,CAAC,iBAAiB,CAAC,EAAE,KAAK,EAAE,EAAE,EAAE,MAAM,EAAE,EAAE,EAAE,CAAC,CAAC;YAErE,MAAM,MAAM,CAAC,UAAU,CAAC,OAAO,CAAC,EAAW,EAAE,EAAW,CAAC,CAAC,CAAC,OAAO,CAAC,OAAO,CACxE,sBAAsB,CACvB,CAAC;YACF,MAAM,CAAC,OAAO,CAAC,CAAC,GAAG,CAAC,gBAAgB,EAAE,CAAC;QACzC,CAAC,CAAC,CAAC;IACL,CAAC,CAAC,CAAC;IAEH,QAAQ,CAAC,QAAQ,EAAE,GAAG,EAAE;QACtB,EAAE,CAAC,0BAA0B,EAAE,KAAK,IAAI,EAAE;YACxC,SAAS,CAAC,MAAM,CAAC,iBAAiB,CAAC;gBACjC,EAAE,EAAE,SAAS;gBACb,QAAQ,EAAE,IAAI,CAAC,EAAE,EAAE,CAAC,iBAAiB,CAAC,QAAQ,CAAC;gBAC/C,QAAQ,EAAE,EAAE,SAAS,EAAE,CAAC,EAAE,KAAK,EAAE,EAAE,EAAE;gBACrC,YAAY,EAAE,IAAI;aACnB,CAAC,CAAC;YAEH,MAAM,OAAO,GAAG,EAAE,IAAI,EAAE,QAAQ,EAAE,CAAC;YACnC,MAAM,UAAU,CAAC,MAAM,CAAC,SAAS,EAAE,OAAgB,CAAC,CAAC;YAErD,MAAM,CAAC,YAAY,CAAC,CAAC,oBAAoB,CAAC,8CAAkB,CAAC,CAAC;YAC9D,MAAM,CAAC,SAAS,CAAC,MAAM,CAAC,CAAC,oBAAoB,CAAC,SAAS,CAAC,CAAC;YACzD,MAAM,CAAC,QAAQ,CAAC,CAAC,oBAAoB,CACnC,MAAM,CAAC,gBAAgB,CAAC;gBACtB,KAAK,EAAE,SAAS;gBAChB,MAAM,EAAE,YAAY;gBACpB,QAAQ,EAAE,EAAE;gBACZ,WAAW,EAAE,EAAE;gBACf,eAAe,EAAE,CAAC;gBAClB,OAAO,EAAE,0BAA0B;aACpC,CAAC,CACH,CAAC;QACJ,CAAC,CAAC,CAAC;QAEH,EAAE,CAAC,iCAAiC,EAAE,KAAK,IAAI,EAAE;YAC/C,SAAS,CAAC,MAAM,CAAC,iBAAiB,CAAC,IAAI,CAAC,CAAC;YAEzC,MAAM,MAAM,CAAC,UAAU,CAAC,MAAM,CAAC,QAAQ,EAAE,EAAE,IAAI,EAAE,QAAQ,EAAW,CAAC,CAAC,CAAC,OAAO,CAAC,OAAO,CACpF,0BAA0B,CAC3B,CAAC;QACJ,CAAC,CAAC,CAAC;QAEH,EAAE,CAAC,wCAAwC,EAAE,KAAK,IAAI,EAAE;YACtD,SAAS,CAAC,MAAM,CAAC,iBAAiB,CAAC;gBACjC,EAAE,EAAE,OAAO;gBACX,QAAQ,EAAE,IAAI,CAAC,EAAE,EAAE,CAAC,iBAAiB,CAAC,QAAQ,CAAC;gBAC/C,QAAQ,EAAE,EAAE,SAAS,EAAE,CAAC,EAAE,KAAK,EAAE,CAAC,EAAE,KAAK,EAAE,YAAY,EAAE;gBACzD,YAAY,EAAE,IAAI;aACnB,CAAC,CAAC;YACH,MAAM,UAAU,CAAC,MAAM,CAAC,OAAO,EAAE,EAAE,IAAI,EAAE,QAAQ,EAAW,CAAC,CAAC;YAC9D,MAAM,CAAC,QAAQ,CAAC,CAAC,oBAAoB,CACnC,MAAM,CAAC,gBAAgB,CAAC,EAAE,OAAO,EAAE,6BAA6B,EAAE,CAAC,CACpE,CAAC;QACJ,CAAC,CAAC,CAAC;QAEH,EAAE,CAAC,yCAAyC,EAAE,KAAK,IAAI,EAAE;YACvD,SAAS,CAAC,MAAM,CAAC,iBAAiB,CAAC;gBACjC,EAAE,EAAE,OAAO;gBACX,QAAQ,EAAE,IAAI,CAAC,EAAE,EAAE,CAAC,iBAAiB,CAAC,QAAQ,CAAC;gBAC/C,QAAQ,EAAE,EAAE,SAAS,EAAE,CAAC,EAAE,KAAK,EAAE,EAAE,EAAE,KAAK,EAAE,aAAa,EAAE;gBAC3D,YAAY,EAAE,IAAI;aACnB,CAAC,CAAC;YACH,MAAM,UAAU,CAAC,MAAM,CAAC,OAAO,EAAE,EAAE,IAAI,EAAE,QAAQ,EAAW,CAAC,CAAC;YAC9D,MAAM,CAAC,QAAQ,CAAC,CAAC,oBAAoB,CACnC,MAAM,CAAC,gBAAgB,CAAC,EAAE,OAAO,EAAE,gCAAgC,EAAE,CAAC,CACvE,CAAC;QACJ,CAAC,CAAC,CAAC;QAEH,EAAE,CAAC,8CAA8C,EAAE,KAAK,IAAI,EAAE;YAC5D,SAAS,CAAC,MAAM,CAAC,iBAAiB,CAAC;gBACjC,EAAE,EAAE,OAAO;gBACX,QAAQ,EAAE,IAAI,CAAC,EAAE,EAAE,CAAC,iBAAiB,CAAC,SAAS,CAAC;gBAChD,QAAQ,EAAE,CAAC;gBACX,YAAY,EAAE,IAAI;aACnB,CAAC,CAAC;YACH,MAAM,UAAU,CAAC,MAAM,CAAC,OAAO,EAAE,EAAE,IAAI,EAAE,QAAQ,EAAW,CAAC,CAAC;YAC9D,MAAM,CAAC,QAAQ,CAAC,CAAC,oBAAoB,CACnC,MAAM,CAAC,gBAAgB,CAAC,EAAE,MAAM,EAAE,SAAS,EAAE,OAAO,EAAE,gCAAgC,EAAE,CAAC,CAC1F,CAAC;QACJ,CAAC,CAAC,CAAC;QAEH,EAAE,CAAC,oCAAoC,EAAE,KAAK,IAAI,EAAE;YAClD,SAAS,CAAC,MAAM,CAAC,iBAAiB,CAAC;gBACjC,EAAE,EAAE,OAAO;gBACX,QAAQ,EAAE,IAAI,CAAC,EAAE,EAAE,CAAC,iBAAiB,CAAC,QAAQ,CAAC;gBAC/C,QAAQ,EAAE,EAAE;gBACZ,YAAY,EAAE,eAAe;aAC9B,CAAC,CAAC;YACH,MAAM,UAAU,CAAC,MAAM,CAAC,OAAO,EAAE,EAAE,IAAI,EAAE,QAAQ,EAAW,CAAC,CAAC;YAC9D,MAAM,CAAC,QAAQ,CAAC,CAAC,oBAAoB,CACnC,MAAM,CAAC,gBAAgB,CAAC;gBACtB,MAAM,EAAE,QAAQ;gBAChB,OAAO,EAAE,eAAe;gBACxB,KAAK,EAAE,eAAe;aACvB,CAAC,CACH,CAAC;QACJ,CAAC,CAAC,CAAC;QAEH,EAAE,CAAC,uDAAuD,EAAE,KAAK,IAAI,EAAE;YACrE,SAAS,CAAC,MAAM,CAAC,iBAAiB,CAAC;gBACjC,EAAE,EAAE,OAAO;gBACX,QAAQ,EAAE,IAAI,CAAC,EAAE,EAAE,CAAC,iBAAiB,CAAC,QAAQ,CAAC;gBAC/C,QAAQ,EAAE,EAAE;gBACZ,YAAY,EAAE,IAAI;aACnB,CAAC,CAAC;YACH,MAAM,UAAU,CAAC,MAAM,CAAC,OAAO,EAAE,EAAE,IAAI,EAAE,QAAQ,EAAW,CAAC,CAAC;YAC9D,MAAM,CAAC,QAAQ,CAAC,CAAC,oBAAoB,CAAC,MAAM,CAAC,gBAAgB,CAAC,EAAE,QAAQ,EAAE,EAAE,EAAE,CAAC,CAAC,CAAC;QACnF,CAAC,CAAC,CAAC;IACL,CAAC,CAAC,CAAC;IAEH,QAAQ,CAAC,UAAU,EAAE,GAAG,EAAE;QACxB,EAAE,CAAC,wCAAwC,EAAE,KAAK,IAAI,EAAE;YACtD,MAAM,WAAW,GAAG,MAAM,CAAC,IAAI,CAAC,YAAY,CAAC,CAAC;YAC9C,SAAS,CAAC,MAAM,CAAC,iBAAiB,CAAC;gBACjC,EAAE,EAAE,SAAS;gBACb,QAAQ,EAAE,IAAI,CAAC,EAAE,EAAE,CAAC,iBAAiB,CAAC,WAAW,CAAC;gBAClD,WAAW,EAAE,gCAAgC;aAC9C,CAAC,CAAC;YACH,cAAc,CAAC,eAAe,CAAC,IAAI,CAAC,CAAC;YACrC,gBAAgB,CAAC,eAAe,CAAC,WAAW,CAAC,CAAC;YAE9C,MAAM,OAAO,GAAG,EAAE,UAAU,EAAE,cAAc,EAAE,CAAC;YAC/C,MAAM,UAAU,CAAC,QAAQ,CAAC,SAAS,EAAE,OAAgB,CAAC,CAAC;YAEvD,MAAM,CAAC,cAAc,CAAC,CAAC,oBAAoB,CAAC,gCAAgC,CAAC,CAAC;YAC9E,MAAM,CAAC,gBAAgB,CAAC,CAAC,oBAAoB,CAAC,gCAAgC,CAAC,CAAC;YAChF,MAAM,CAAC,cAAc,CAAC,CAAC,oBAAoB,CAAC,WAAW,EAAE,YAAY,CAAC,CAAC;QACzE,CAAC,CAAC,CAAC;QAEH,EAAE,CAAC,wCAAwC,EAAE,KAAK,IAAI,EAAE;YACtD,SAAS,CAAC,MAAM,CAAC,iBAAiB,CAAC;gBACjC,EAAE,EAAE,SAAS;gBACb,QAAQ,EAAE,IAAI,CAAC,EAAE,EAAE,CAAC,iBAAiB,CAAC,WAAW,CAAC;gBAClD,WAAW,EAAE,gCAAgC;aAC9C,CAAC,CAAC;YACH,cAAc,CAAC,eAAe,CAAC,KAAK,CAAC,CAAC;YAEtC,MAAM,MAAM,CAAC,UAAU,CAAC,QAAQ,CAAC,SAAS,EAAE,EAAW,CAAC,CAAC,CAAC,OAAO,CAAC,OAAO,CACvE,gCAAgC,CACjC,CAAC;QACJ,CAAC,CAAC,CAAC;QAEH,EAAE,CAAC,iCAAiC,EAAE,KAAK,IAAI,EAAE;YAC/C,SAAS,CAAC,MAAM,CAAC,iBAAiB,CAAC,IAAI,CAAC,CAAC;YAEzC,MAAM,MAAM,CAAC,UAAU,CAAC,QAAQ,CAAC,QAAQ,EAAE,EAAW,CAAC,CAAC,CAAC,OAAO,CAAC,OAAO,CACtE,0BAA0B,CAC3B,CAAC;QACJ,CAAC,CAAC,CAAC;QAEH,EAAE,CAAC,qCAAqC,EAAE,KAAK,IAAI,EAAE;YACnD,SAAS,CAAC,MAAM,CAAC,iBAAiB,CAAC;gBACjC,EAAE,EAAE,SAAS;gBACb,QAAQ,EAAE,IAAI,CAAC,EAAE,EAAE,CAAC,iBAAiB,CAAC,YAAY,CAAC;aACpD,CAAC,CAAC;YAEH,MAAM,MAAM,CAAC,UAAU,CAAC,QAAQ,CAAC,SAAS,EAAE,EAAW,CAAC,CAAC,CAAC,OAAO,CAAC,OAAO,CACvE,uBAAuB,CACxB,CAAC;QACJ,CAAC,CAAC,CAAC;QAEH,EAAE,CAAC,0CAA0C,EAAE,KAAK,IAAI,EAAE;YACxD,SAAS,CAAC,MAAM,CAAC,iBAAiB,CAAC;gBACjC,EAAE,EAAE,SAAS;gBACb,QAAQ,EAAE,IAAI,CAAC,EAAE,EAAE,CAAC,iBAAiB,CAAC,WAAW,CAAC;gBAClD,WAAW,EAAE,SAAS;aACvB,CAAC,CAAC;YAEH,MAAM,MAAM,CAAC,UAAU,CAAC,QAAQ,CAAC,SAAS,EAAE,EAAW,CAAC,CAAC,CAAC,OAAO,CAAC,OAAO,CACvE,0BAA0B,CAC3B,CAAC;QACJ,CAAC,CAAC,CAAC;QAEH,EAAE,CAAC,+CAA+C,EAAE,KAAK,IAAI,EAAE;YAC7D,SAAS,CAAC,MAAM,CAAC,iBAAiB,CAAC;gBACjC,EAAE,EAAE,SAAS;gBACb,QAAQ,EAAE,IAAI,CAAC,EAAE,EAAE,CAAC,iBAAiB,CAAC,WAAW,CAAC;gBAClD,WAAW,EAAE,GAAG;aACjB,CAAC,CAAC;YAEH,MAAM,MAAM,CAAC,UAAU,CAAC,QAAQ,CAAC,SAAS,EAAE,EAAW,CAAC,CAAC,CAAC,OAAO,CAAC,OAAO,CACvE,0BAA0B,CAC3B,CAAC;QACJ,CAAC,CAAC,CAAC;IACL,CAAC,CAAC,CAAC;AACL,CAAC,CAAC,CAAC"}
@@ -0,0 +1,30 @@
1
+ import type { RedisConnectionOptions } from '@hazeljs/queue';
2
+ export declare const PDF_TO_AUDIO_OUTPUT_DIR = "PDF_TO_AUDIO_OUTPUT_DIR";
3
+ export interface PdfToAudioModuleOptions {
4
+ /** Redis connection for the job queue (required for async processing) */
5
+ connection: RedisConnectionOptions;
6
+ /** Directory for completed audio files (default: ./data/pdf-to-audio) */
7
+ outputDir?: string;
8
+ }
9
+ export declare class PdfToAudioModule {
10
+ /**
11
+ * Configure PdfToAudioModule with Redis-backed queue.
12
+ * Use this when you want async job processing (recommended).
13
+ *
14
+ * @example
15
+ * ```ts
16
+ * imports: [
17
+ * PdfToAudioModule.forRoot({
18
+ * connection: { host: 'localhost', port: 6379 },
19
+ * }),
20
+ * ]
21
+ * ```
22
+ */
23
+ static forRoot(options: PdfToAudioModuleOptions): {
24
+ module: typeof PdfToAudioModule;
25
+ imports: unknown[];
26
+ providers: unknown[];
27
+ controllers: unknown[];
28
+ };
29
+ }
30
+ //# sourceMappingURL=pdf-to-audio.module.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"pdf-to-audio.module.d.ts","sourceRoot":"","sources":["../src/pdf-to-audio.module.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAE,sBAAsB,EAAE,MAAM,gBAAgB,CAAC;AAM7D,eAAO,MAAM,uBAAuB,4BAA4B,CAAC;AAEjE,MAAM,WAAW,uBAAuB;IACtC,yEAAyE;IACzE,UAAU,EAAE,sBAAsB,CAAC;IACnC,yEAAyE;IACzE,SAAS,CAAC,EAAE,MAAM,CAAC;CACpB;AAED,qBAYa,gBAAgB;IAC3B;;;;;;;;;;;;OAYG;IACH,MAAM,CAAC,OAAO,CAAC,OAAO,EAAE,uBAAuB,GAAG;QAChD,MAAM,EAAE,OAAO,gBAAgB,CAAC;QAChC,OAAO,EAAE,OAAO,EAAE,CAAC;QACnB,SAAS,EAAE,OAAO,EAAE,CAAC;QACrB,WAAW,EAAE,OAAO,EAAE,CAAC;KACxB;CAcF"}
@@ -0,0 +1,66 @@
1
+ "use strict";
2
+ var __decorate = (this && this.__decorate) || function (decorators, target, key, desc) {
3
+ var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;
4
+ if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc);
5
+ 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;
6
+ return c > 3 && r && Object.defineProperty(target, key, r), r;
7
+ };
8
+ var __importDefault = (this && this.__importDefault) || function (mod) {
9
+ return (mod && mod.__esModule) ? mod : { "default": mod };
10
+ };
11
+ var PdfToAudioModule_1;
12
+ Object.defineProperty(exports, "__esModule", { value: true });
13
+ exports.PdfToAudioModule = exports.PDF_TO_AUDIO_OUTPUT_DIR = void 0;
14
+ const path_1 = __importDefault(require("path"));
15
+ const core_1 = require("@hazeljs/core");
16
+ const queue_1 = require("@hazeljs/queue");
17
+ const ai_1 = require("@hazeljs/ai");
18
+ const pdf_to_audio_service_1 = require("./pdf-to-audio.service");
19
+ const pdf_to_audio_controller_1 = require("./pdf-to-audio.controller");
20
+ const pdf_to_audio_queue_worker_1 = require("./pdf-to-audio-queue.worker");
21
+ exports.PDF_TO_AUDIO_OUTPUT_DIR = 'PDF_TO_AUDIO_OUTPUT_DIR';
22
+ let PdfToAudioModule = PdfToAudioModule_1 = class PdfToAudioModule {
23
+ /**
24
+ * Configure PdfToAudioModule with Redis-backed queue.
25
+ * Use this when you want async job processing (recommended).
26
+ *
27
+ * @example
28
+ * ```ts
29
+ * imports: [
30
+ * PdfToAudioModule.forRoot({
31
+ * connection: { host: 'localhost', port: 6379 },
32
+ * }),
33
+ * ]
34
+ * ```
35
+ */
36
+ static forRoot(options) {
37
+ const outputDir = path_1.default.resolve(process.cwd(), options.outputDir ?? 'data/pdf-to-audio');
38
+ return {
39
+ module: PdfToAudioModule_1,
40
+ imports: [queue_1.QueueModule.forRoot({ connection: options.connection })],
41
+ providers: [
42
+ { provide: exports.PDF_TO_AUDIO_OUTPUT_DIR, useValue: outputDir },
43
+ ai_1.OpenAIProvider,
44
+ pdf_to_audio_service_1.PdfToAudioService,
45
+ pdf_to_audio_queue_worker_1.PdfToAudioQueueWorker,
46
+ ],
47
+ controllers: [pdf_to_audio_controller_1.PdfToAudioController],
48
+ };
49
+ }
50
+ };
51
+ exports.PdfToAudioModule = PdfToAudioModule;
52
+ exports.PdfToAudioModule = PdfToAudioModule = PdfToAudioModule_1 = __decorate([
53
+ (0, core_1.HazelModule)({
54
+ providers: [
55
+ {
56
+ provide: exports.PDF_TO_AUDIO_OUTPUT_DIR,
57
+ useValue: path_1.default.resolve(process.cwd(), 'data/pdf-to-audio'),
58
+ },
59
+ ai_1.OpenAIProvider,
60
+ pdf_to_audio_service_1.PdfToAudioService,
61
+ pdf_to_audio_queue_worker_1.PdfToAudioQueueWorker,
62
+ ],
63
+ controllers: [pdf_to_audio_controller_1.PdfToAudioController],
64
+ })
65
+ ], PdfToAudioModule);
66
+ //# sourceMappingURL=pdf-to-audio.module.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"pdf-to-audio.module.js","sourceRoot":"","sources":["../src/pdf-to-audio.module.ts"],"names":[],"mappings":";;;;;;;;;;;;;AAAA,gDAAwB;AACxB,wCAA4C;AAC5C,0CAA6C;AAE7C,oCAA6C;AAC7C,iEAA2D;AAC3D,uEAAiE;AACjE,2EAAoE;AAEvD,QAAA,uBAAuB,GAAG,yBAAyB,CAAC;AAqB1D,IAAM,gBAAgB,wBAAtB,MAAM,gBAAgB;IAC3B;;;;;;;;;;;;OAYG;IACH,MAAM,CAAC,OAAO,CAAC,OAAgC;QAM7C,MAAM,SAAS,GAAG,cAAI,CAAC,OAAO,CAAC,OAAO,CAAC,GAAG,EAAE,EAAE,OAAO,CAAC,SAAS,IAAI,mBAAmB,CAAC,CAAC;QACxF,OAAO;YACL,MAAM,EAAE,kBAAgB;YACxB,OAAO,EAAE,CAAC,mBAAW,CAAC,OAAO,CAAC,EAAE,UAAU,EAAE,OAAO,CAAC,UAAU,EAAE,CAAC,CAAC;YAClE,SAAS,EAAE;gBACT,EAAE,OAAO,EAAE,+BAAuB,EAAE,QAAQ,EAAE,SAAS,EAAE;gBACzD,mBAAc;gBACd,wCAAiB;gBACjB,iDAAqB;aACtB;YACD,WAAW,EAAE,CAAC,8CAAoB,CAAC;SACpC,CAAC;IACJ,CAAC;CACF,CAAA;AAjCY,4CAAgB;2BAAhB,gBAAgB;IAZ5B,IAAA,kBAAW,EAAC;QACX,SAAS,EAAE;YACT;gBACE,OAAO,EAAE,+BAAuB;gBAChC,QAAQ,EAAE,cAAI,CAAC,OAAO,CAAC,OAAO,CAAC,GAAG,EAAE,EAAE,mBAAmB,CAAC;aAClD;YACV,mBAAc;YACd,wCAAiB;YACjB,iDAAqB;SACtB;QACD,WAAW,EAAE,CAAC,8CAAoB,CAAC;KACpC,CAAC;GACW,gBAAgB,CAiC5B"}
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=pdf-to-audio.module.test.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"pdf-to-audio.module.test.d.ts","sourceRoot":"","sources":["../src/pdf-to-audio.module.test.ts"],"names":[],"mappings":""}