@ctchealth/plato-sdk 0.0.11 → 0.0.13

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/README.md CHANGED
@@ -6,6 +6,16 @@ A TypeScript SDK for interacting with the Plato API to create and manage AI-powe
6
6
 
7
7
  The Plato SDK provides a simple and type-safe way to integrate with the Plato platform, allowing you to create medical training simulations with AI personas and manage voice-based interactions.
8
8
 
9
+ ## Authentication
10
+
11
+ All API requests require authentication using a Bearer token. Include your JWT token in the `API-AUTH` header:
12
+
13
+ ```
14
+ API-AUTH: Bearer <your-jwt-token>
15
+ ```
16
+
17
+ Requests without a valid JWT token will be rejected with a `401 Unauthorized` response.
18
+
9
19
  ## Features
10
20
 
11
21
  - Create AI personas with customizable professional profiles and personalities
@@ -24,7 +34,7 @@ npm install plato-sdk
24
34
  ## Quick Start
25
35
 
26
36
  ```typescript
27
- import { PlatoApiClient } from 'plato-sdk';
37
+ import { PlatoApiClient, AvatarLanguage } from 'plato-sdk';
28
38
 
29
39
  // Initialize the client
30
40
  const client = new PlatoApiClient({
@@ -33,6 +43,9 @@ const client = new PlatoApiClient({
33
43
  user: 'test@test.test',
34
44
  });
35
45
 
46
+ // Get available assistant images
47
+ const images = await client.getAssistantImages();
48
+
36
49
  // Create a simulation
37
50
  const simulation = await client.createSimulation({
38
51
  persona: {
@@ -69,6 +82,8 @@ const simulation = await client.createSimulation({
69
82
  'Demonstrate efficacy of Ibuprofen in pain management Highlight safety profile and contraindications Encourage patient adherence',
70
83
  anticipatedObjections:
71
84
  'Concerns about gastrointestinal side effects Preference for lower-cost generic alternatives Potential interactions with other medications',
85
+ imageId: images[0]._id,
86
+ avatarLanguage: AvatarLanguage.English,
72
87
  });
73
88
 
74
89
  // Check the simulation status - If simulation creation phase is equals to FINISHED, the simulation is ready to use
@@ -89,7 +104,15 @@ call.on('message', message => {
89
104
  });
90
105
 
91
106
  call.on('call-end', () => {
92
- console.log('Call ended');
107
+ console.log('Call ended - processing feedback...');
108
+ });
109
+
110
+ // Automatically receive post-call feedback when ready
111
+ call.on('call-details-ready', callDetails => {
112
+ console.log('Call Summary:', callDetails.summary);
113
+ console.log('Score:', callDetails.score);
114
+ console.log('Strengths:', callDetails.strengths);
115
+ console.log('Areas to improve:', callDetails.weaknesses);
93
116
  });
94
117
 
95
118
  // Stop the call when done
@@ -225,12 +248,7 @@ Uploads a PDF file for slide analysis. The file will be uploaded to S3 and analy
225
248
 
226
249
  - `file` (File | Blob): The PDF file to upload
227
250
 
228
- **Returns:** `Promise<UploadPdfSlidesResponseDto>` — An object containing:
229
-
230
- - `objectKey`: The S3 object key where the PDF was saved
231
- - `filename`: The original filename
232
- - `size`: The file size in bytes
233
- - `contentType`: The content type of the file
251
+ **Returns:** `Promise<string>` — A success message if the upload was successful.
234
252
 
235
253
  **Example:**
236
254
 
@@ -241,11 +259,85 @@ const file = fileInput.files?.[0];
241
259
 
242
260
  if (file) {
243
261
  const result = await client.uploadPdfSlides(file);
244
- console.log('PDF uploaded:', result.objectKey);
245
- console.log('Original filename:', result.filename);
262
+ console.log('PDF upload initiated');
246
263
  }
247
264
  ```
248
265
 
266
+ ##### getSlidesAnalysis(queryParams: PdfSlidesAnalysisQueryDto)
267
+
268
+ Retrieves a paginated and sorted list of PDF slide analysis records.
269
+
270
+ **Parameters:**
271
+
272
+ - `queryParams` (PdfSlidesAnalysisQueryDto):
273
+ - `limit` (optional): Number of records per page
274
+ - `page` (optional): Page number
275
+ - `sort` (optional): Sort order (`'asc'` or `'desc'`)
276
+ - `sortBy` (optional): Field to sort by (`'createdAt'`, `'originalFilename'`, or `'totalSlides'`)
277
+
278
+ **Returns:** `Promise<PdfSlidesDto[]>`
279
+
280
+ **Example:**
281
+
282
+ ```typescript
283
+ const analysisList = await client.getSlidesAnalysis({
284
+ limit: 10,
285
+ page: 0,
286
+ sort: 'desc',
287
+ sortBy: 'createdAt',
288
+ });
289
+ ```
290
+
291
+ ##### getSlideAnalysis(id: string)
292
+
293
+ Retrieves the detailed analysis data for a specific PDF slide record, including the overview and individual slide analysis.
294
+
295
+ **Parameters:**
296
+
297
+ - `id` (string): The unique ID of the PDF slide record
298
+
299
+ **Returns:** `Promise<PdfSlideDto>`
300
+
301
+ **Example:**
302
+
303
+ ```typescript
304
+ const details = await client.getSlideAnalysis('pdf-slide-id');
305
+ console.log('Lesson Overview:', details.lessonOverview);
306
+ ```
307
+
308
+ ##### deleteSlideAnalysis(id: string)
309
+
310
+ Deletes a PDF slide analysis record from the database and removes the corresponding file from S3 storage.
311
+
312
+ **Parameters:**
313
+
314
+ - `id` (string): The unique ID of the PDF slide record to delete
315
+
316
+ **Returns:** `Promise<void>`
317
+
318
+ **Example:**
319
+
320
+ ```typescript
321
+ await client.deleteSlideAnalysis('pdf-slide-id');
322
+ console.log('Analysis deleted successfully');
323
+ ```
324
+
325
+ ##### getAssistantImages()
326
+
327
+ Retrieves all available assistant images that can be used when creating a simulation.
328
+
329
+ **Returns:** `Promise<AssistantImageDto[]>` — An array of assistant image objects, each containing:
330
+
331
+ - `_id`: Unique identifier for the image
332
+ - `imageUrl`: URL of the assistant image
333
+
334
+ **Example:**
335
+
336
+ ```typescript
337
+ // Get all available assistant images
338
+ const images = await client.getAssistantImages();
339
+ ```
340
+
249
341
  ##### getRecommendations()
250
342
 
251
343
  Retrieves recommendations based on the user's recent call performance. Analyzes up to 10 of the most recent calls to identify patterns and provide actionable insights.
@@ -374,6 +466,7 @@ The SDK provides a comprehensive event system for managing voice calls:
374
466
  - `message`: Triggered when a message is received (contains transcript and metadata)
375
467
  - `volume-level`: Triggered with volume level updates (number)
376
468
  - `error`: Triggered when an error occurs
469
+ - `call-details-ready`: Triggered when post-call processing completes and call details are available (includes full `CallDTO` with transcript, summary, ratings, and evaluation)
377
470
 
378
471
  ### Event Usage
379
472
 
@@ -391,10 +484,229 @@ call.on('volume-level', level => {
391
484
  call.on('error', error => {
392
485
  console.error('Call error:', error);
393
486
  });
487
+
488
+ // Listen for call details after post-call processing
489
+ call.on('call-details-ready', callDetails => {
490
+ console.log('Post-call feedback ready:', callDetails);
491
+ });
492
+ ```
493
+
494
+ ## Automatic Post-Call Feedback
495
+
496
+ The SDK automatically fetches detailed call information after each call ends and completes post-call processing. This includes comprehensive feedback such as transcript, summary, evaluation metrics, strengths, weaknesses, and ratings.
497
+
498
+ ### How It Works
499
+
500
+ When a call ends, the SDK automatically:
501
+
502
+ 1. Triggers the `call-end` event
503
+ 2. Processes the call on the backend (post-call analysis)
504
+ 3. Fetches complete call details
505
+ 4. Emits the `call-details-ready` event with full `CallDTO` data
506
+
507
+ This happens automatically—you don't need to manually call `getCallDetails()` after each call.
508
+
509
+ ### Event Lifecycle
510
+
511
+ ```typescript
512
+ const call = await client.startCall(simulationId);
513
+
514
+ // 1. Call begins
515
+ call.on('call-start', () => {
516
+ console.log('Call started');
517
+ });
518
+
519
+ // 2. Real-time transcript messages during the call
520
+ call.on('message', message => {
521
+ console.log('Real-time:', message.transcript);
522
+ });
523
+
524
+ // 3. Call ends
525
+ call.on('call-end', () => {
526
+ console.log('Call ended - processing feedback...');
527
+ });
528
+
529
+ // 4. Post-call details are automatically fetched and ready
530
+ call.on('call-details-ready', callDetails => {
531
+ console.log('Post-call feedback is ready!');
532
+
533
+ // Access all call details
534
+ console.log('Summary:', callDetails.summary);
535
+ console.log('Full Transcript:', callDetails.transcript);
536
+ console.log('Call Duration:', callDetails.callDurationMs, 'ms');
537
+ console.log('Success:', callDetails.successEvaluation);
538
+ console.log('Score:', callDetails.score);
539
+
540
+ // Display evaluation metrics
541
+ console.log(`${callDetails.metric1}: ${callDetails.metric1Value}`);
542
+ console.log(`${callDetails.metric2}: ${callDetails.metric2Value}`);
543
+ console.log(`${callDetails.metric3}: ${callDetails.metric3Value}`);
544
+
545
+ // Show strengths and areas for improvement
546
+ callDetails.strengths?.forEach(strength => {
547
+ console.log('✓ Strength:', strength);
548
+ });
549
+
550
+ callDetails.weaknesses?.forEach(weakness => {
551
+ console.log('⚠ Area to improve:', weakness);
552
+ });
553
+
554
+ // Access recording
555
+ if (callDetails.recordingUrl) {
556
+ console.log('Recording:', callDetails.recordingUrl);
557
+ }
558
+ });
559
+ ```
560
+
561
+ ### Practical Use Cases
562
+
563
+ #### 1. Display Post-Call Feedback in UI
564
+
565
+ ```typescript
566
+ // Angular/React example
567
+ async startCall() {
568
+ const call = await this.client.startCall(this.simulationId);
569
+
570
+ // Automatically update UI when feedback is ready
571
+ call.on('call-details-ready', callDetails => {
572
+ this.callSummary = callDetails.summary;
573
+ this.callScore = callDetails.score;
574
+ this.strengths = callDetails.strengths;
575
+ this.weaknesses = callDetails.weaknesses;
576
+ this.showFeedbackModal = true; // Display feedback to user
577
+ });
578
+ }
579
+ ```
580
+
581
+ #### 2. Track Performance Analytics
582
+
583
+ ```typescript
584
+ call.on('call-details-ready', callDetails => {
585
+ // Send analytics to tracking service
586
+ analytics.track('call_completed', {
587
+ callId: callDetails._id,
588
+ duration: callDetails.callDurationMs,
589
+ score: callDetails.score,
590
+ success: callDetails.successEvaluation,
591
+ metrics: {
592
+ [callDetails.metric1]: callDetails.metric1Value,
593
+ [callDetails.metric2]: callDetails.metric2Value,
594
+ [callDetails.metric3]: callDetails.metric3Value,
595
+ },
596
+ });
597
+ });
598
+ ```
599
+
600
+ #### 3. Store Call History
601
+
602
+ ```typescript
603
+ call.on('call-details-ready', async callDetails => {
604
+ // Save to local storage or database
605
+ const callHistory = JSON.parse(localStorage.getItem('call_history') || '[]');
606
+ callHistory.push({
607
+ id: callDetails._id,
608
+ date: callDetails.createdAt,
609
+ summary: callDetails.summary,
610
+ score: callDetails.score,
611
+ });
612
+ localStorage.setItem('call_history', JSON.stringify(callHistory));
613
+ });
614
+ ```
615
+
616
+ #### 4. Generate Learning Insights
617
+
618
+ ```typescript
619
+ call.on('call-details-ready', callDetails => {
620
+ // Aggregate insights across multiple calls
621
+ if (callDetails.successEvaluation) {
622
+ this.successfulCalls++;
623
+ this.successStrategies.push(...(callDetails.strengths || []));
624
+ } else {
625
+ this.areasToImprove.push(...(callDetails.weaknesses || []));
626
+ }
627
+
628
+ this.updateLearningDashboard();
629
+ });
630
+ ```
631
+
632
+ ### Manual Fetching (Alternative Approach)
633
+
634
+ While the SDK automatically fetches call details after each call, you can also manually retrieve them later using the call ID:
635
+
636
+ ```typescript
637
+ // Get call details at any time
638
+ const callDetails = await client.getCallDetails(callId);
639
+ ```
640
+
641
+ This is useful when:
642
+
643
+ - Viewing historical calls
644
+ - Refreshing data after updates
645
+ - Building a call history view
646
+
647
+ ### Error Handling
648
+
649
+ If fetching call details fails after a call ends, the error is logged but does not prevent the `call-end` event from completing. The call will still end gracefully.
650
+
651
+ ```typescript
652
+ call.on('call-end', () => {
653
+ console.log('Call ended successfully');
654
+ // This will always fire, even if call-details-ready fails
655
+ });
656
+
657
+ call.on('call-details-ready', callDetails => {
658
+ // This may not fire if post-call processing fails
659
+ // In that case, you can manually fetch later using getCallDetails()
660
+ });
394
661
  ```
395
662
 
663
+ ### Best Practices
664
+
665
+ 1. **Always subscribe to `call-details-ready`** to capture post-call feedback automatically
666
+ 2. **Show loading state** between `call-end` and `call-details-ready` events
667
+ 3. **Handle missing data gracefully** - some fields may be `null` or `undefined` depending on call status
668
+ 4. **Store call IDs** for later retrieval using `getCallDetails()` if needed
669
+ 5. **Use the event data** to provide immediate feedback to users rather than making additional API calls
670
+
671
+ ### Timing Considerations
672
+
673
+ - `call-end`: Fires immediately when the call stops
674
+ - `call-details-ready`: Fires after backend processing completes (typically 2-5 seconds after call ends)
675
+
676
+ Plan your UX accordingly—show a loading/processing state between these two events.
677
+
396
678
  ## Data Types
397
679
 
680
+ ### CallDTO
681
+
682
+ Complete call details returned by `call-details-ready` event and `getCallDetails()` method:
683
+
684
+ ```typescript
685
+ interface CallDTO {
686
+ _id: string; // MongoDB ID of the call
687
+ callId: string; // Vapi call ID
688
+ assistantId: string; // ID of the AI assistant used
689
+ summary?: string; // AI-generated summary of the conversation
690
+ transcript?: string; // Full transcript of the call
691
+ recordingUrl?: string; // URL to the call recording
692
+ rating?: number; // User-provided rating (0-5)
693
+ successEvaluation?: boolean; // Whether the call was successful
694
+ score?: number; // Overall score for the call
695
+ strengths?: string[]; // Array of identified strengths
696
+ weaknesses?: string[]; // Array of areas for improvement
697
+ metric1?: string; // Name of evaluation metric 1
698
+ metric1Value?: number; // Value for metric 1
699
+ metric2?: string; // Name of evaluation metric 2
700
+ metric2Value?: number; // Value for metric 2
701
+ metric3?: string; // Name of evaluation metric 3
702
+ metric3Value?: number; // Value for metric 3
703
+ createdAt: Date; // When the call was created
704
+ endedAt?: Date; // When the call ended
705
+ callDurationMs?: number; // Duration in milliseconds
706
+ // Additional fields may be present depending on call status
707
+ }
708
+ ```
709
+
398
710
  ### CreateSimulationDto
399
711
 
400
712
  Configuration for creating a simulation:
@@ -408,6 +720,8 @@ interface CreateSimulationDto {
408
720
  objectives?: string;
409
721
  anticipatedObjections?: string;
410
722
  trainingConfiguration: TrainingConfigurationDto;
723
+ imageId: string;
724
+ avatarLanguage: AvatarLanguage;
411
725
  }
412
726
  ```
413
727
 
@@ -489,6 +803,79 @@ interface ImprovementAreaDto {
489
803
  }
490
804
  ```
491
805
 
806
+ ### PdfSlidesDto
807
+
808
+ Simplified data structure for PDF slide records (used in lists):
809
+
810
+ ```typescript
811
+ interface PdfSlidesDto {
812
+ _id: string;
813
+ originalFilename: string;
814
+ totalSlides?: number;
815
+ lessonOverview?: string;
816
+ createdAt: Date;
817
+ updatedAt: Date;
818
+ }
819
+ ```
820
+
821
+ ### PdfSlideDto
822
+
823
+ Detailed data structure for a single PDF slide analysis:
824
+
825
+ ```typescript
826
+ interface PdfSlideDto {
827
+ _id: string;
828
+ originalFilename: string;
829
+ totalSlides?: number;
830
+ lessonOverview?: string;
831
+ slideAnalysis?: Array<{
832
+ slideNumber: number;
833
+ title: string;
834
+ textExtraction: string;
835
+ }>;
836
+ createdAt: Date;
837
+ updatedAt: Date;
838
+ }
839
+ ```
840
+
841
+ ### PdfSlidesAnalysisQueryDto
842
+
843
+ Query parameters for retrieving slide analysis records:
844
+
845
+ ```typescript
846
+ interface PdfSlidesAnalysisQueryDto {
847
+ limit?: 5 | 10 | 25;
848
+ page?: number;
849
+ sort?: 'asc' | 'desc';
850
+ sortBy?: 'createdAt' | 'originalFilename' | 'totalSlides';
851
+ }
852
+ ```
853
+
854
+ ### AssistantImageDto
855
+
856
+ Data structure for assistant images:
857
+
858
+ ```typescript
859
+ interface AssistantImageDto {
860
+ _id: string;
861
+ imageUrl: string;
862
+ }
863
+ ```
864
+
865
+ ### AvatarLanguage
866
+
867
+ Enum representing available avatar languages:
868
+
869
+ ```typescript
870
+ enum AvatarLanguage {
871
+ English = 'en',
872
+ German = 'de',
873
+ Spanish = 'es',
874
+ Italian = 'it',
875
+ French = 'fr',
876
+ }
877
+ ```
878
+
492
879
  ## Error Handling
493
880
 
494
881
  The SDK throws errors for invalid configurations and API failures:
package/package.json CHANGED
@@ -1,10 +1,11 @@
1
1
  {
2
2
  "name": "@ctchealth/plato-sdk",
3
- "version": "0.0.11",
3
+ "version": "0.0.13",
4
4
  "dependencies": {
5
5
  "tslib": "^2.3.0",
6
6
  "@vapi-ai/web": "2.1.8",
7
- "axios": "^1.7.9"
7
+ "axios": "^1.7.9",
8
+ "pdf-lib": "^1.17.1"
8
9
  },
9
10
  "type": "commonjs",
10
11
  "main": "./src/index.js",
@@ -12,5 +13,5 @@
12
13
  "publishConfig": {
13
14
  "access": "public"
14
15
  },
15
- "types": "./src/index.d.ts"
16
+ "types": "./../../apps/plato-lx-api/libs/plato-sdk/src/index.d.ts"
16
17
  }
@@ -0,0 +1,16 @@
1
+ /**
2
+ * Copyright (c) 2025 ctcHealth. All rights reserved.
3
+ *
4
+ * This file is part of the ctcHealth Plato Platform, a proprietary software system developed by ctcHealth.
5
+ *
6
+ * This source code and all related materials are confidential and proprietary to ctcHealth.
7
+ * Unauthorized access, use, copying, modification, distribution, or disclosure is strictly prohibited
8
+ * and may result in disciplinary action and civil and/or criminal penalties.
9
+ *
10
+ * This software is intended solely for authorized use within ctcHealth and its designated partners.
11
+ *
12
+ * For internal use only.
13
+ */
14
+ export declare const MAX_PDF_FILE_SIZE: number;
15
+ export declare const ALLOWED_PDF_MIME_TYPES: string[];
16
+ export declare const MAX_PDF_PAGES = 100;
@@ -0,0 +1,20 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.MAX_PDF_PAGES = exports.ALLOWED_PDF_MIME_TYPES = exports.MAX_PDF_FILE_SIZE = void 0;
4
+ /**
5
+ * Copyright (c) 2025 ctcHealth. All rights reserved.
6
+ *
7
+ * This file is part of the ctcHealth Plato Platform, a proprietary software system developed by ctcHealth.
8
+ *
9
+ * This source code and all related materials are confidential and proprietary to ctcHealth.
10
+ * Unauthorized access, use, copying, modification, distribution, or disclosure is strictly prohibited
11
+ * and may result in disciplinary action and civil and/or criminal penalties.
12
+ *
13
+ * This software is intended solely for authorized use within ctcHealth and its designated partners.
14
+ *
15
+ * For internal use only.
16
+ */
17
+ exports.MAX_PDF_FILE_SIZE = 20 * 1024 * 1024; // 20MB
18
+ exports.ALLOWED_PDF_MIME_TYPES = ['application/pdf'];
19
+ exports.MAX_PDF_PAGES = 100;
20
+ //# sourceMappingURL=constants.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"constants.js","sourceRoot":"","sources":["../../../../../libs/plato-sdk/src/lib/constants.ts"],"names":[],"mappings":";;;AAAA;;;;;;;;;;;;GAYG;AACU,QAAA,iBAAiB,GAAG,EAAE,GAAG,IAAI,GAAG,IAAI,CAAC,CAAC,OAAO;AAC7C,QAAA,sBAAsB,GAAG,CAAC,iBAAiB,CAAC,CAAC;AAC7C,QAAA,aAAa,GAAG,GAAG,CAAC"}
@@ -35,6 +35,13 @@ export declare enum AssistantVoiceGender {
35
35
  Male = "Male",
36
36
  Female = "Female"
37
37
  }
38
+ export declare enum AvatarLanguage {
39
+ English = "en",
40
+ German = "de",
41
+ Spanish = "es",
42
+ Italian = "it",
43
+ French = "fr"
44
+ }
38
45
  export declare class PersonalityAndBehaviourDto {
39
46
  riskTolerance: number;
40
47
  researchOrientation: number;
@@ -72,6 +79,8 @@ export declare class CreateSimulationDto {
72
79
  scenario: string;
73
80
  objectives?: string;
74
81
  anticipatedObjections?: string;
82
+ imageId: string;
83
+ avatarLanguage: AvatarLanguage;
75
84
  }
76
85
  export type RecordingsLimit = 5 | 10 | 25;
77
86
  export declare class SimulationRecordingsQueryDto {
@@ -213,25 +222,18 @@ export declare enum CreationPhase {
213
222
  ERROR = "ERROR"
214
223
  }
215
224
  /**
216
- * Response DTO for PDF file upload.
225
+ * Presigned POST data for S3 upload.
217
226
  */
218
- export interface UploadPdfSlidesResponseDto {
219
- /**
220
- * The S3 object key where the PDF was saved
221
- */
227
+ export interface PresignedPost {
228
+ url: string;
229
+ fields: Record<string, string>;
230
+ }
231
+ /**
232
+ * Response for requesting a PDF upload.
233
+ */
234
+ export interface RequestPdfUploadResponse {
235
+ presignedPost: PresignedPost;
222
236
  objectKey: string;
223
- /**
224
- * The original filename
225
- */
226
- filename: string;
227
- /**
228
- * The file size in bytes
229
- */
230
- size: number;
231
- /**
232
- * The content type of the file
233
- */
234
- contentType: string;
235
237
  }
236
238
  export interface SimulationDetailsDto {
237
239
  simulationId: string;
@@ -267,3 +269,41 @@ export interface RecommendationsResponseDto {
267
269
  callsAnalyzed: number;
268
270
  generatedAt: Date;
269
271
  }
272
+ export declare enum PdfSlidesSortField {
273
+ CREATED_AT = "createdAt",
274
+ FILENAME = "originalFilename",
275
+ TOTAL_SLIDES = "totalSlides"
276
+ }
277
+ export declare class PdfSlidesAnalysisQueryDto {
278
+ limit?: RecordingsLimit;
279
+ page?: number;
280
+ sort?: SortOrder;
281
+ sortBy?: PdfSlidesSortField;
282
+ }
283
+ export interface SlideAnalysis {
284
+ slideNumber: number;
285
+ title?: string;
286
+ textExtraction?: string;
287
+ visualDescription?: string;
288
+ }
289
+ export interface PdfSlidesDto {
290
+ _id: string;
291
+ originalFilename: string;
292
+ totalSlides?: number;
293
+ lessonOverview?: string;
294
+ createdAt: Date;
295
+ updatedAt: Date;
296
+ }
297
+ export interface PdfSlideDto {
298
+ _id: string;
299
+ originalFilename: string;
300
+ totalSlides?: number;
301
+ lessonOverview?: string;
302
+ slideAnalysis?: SlideAnalysis[];
303
+ createdAt: Date;
304
+ updatedAt: Date;
305
+ }
306
+ export interface AssistantImageDto {
307
+ _id: string;
308
+ imageUrl: string;
309
+ }
@@ -1,6 +1,6 @@
1
1
  "use strict";
2
2
  Object.defineProperty(exports, "__esModule", { value: true });
3
- exports.RecommendationPriority = exports.CreationPhase = exports.SimulationRecordingsDto = exports.RecordingStatus = exports.SortOrder = exports.SimulationRecordingsQueryDto = exports.CreateSimulationDto = exports.ProductConfig = exports.CharacterCreateDto = exports.ContextDto = exports.ProfessionalProfileDto = exports.PersonalityAndBehaviourDto = exports.AssistantVoiceGender = exports.SegmentType = exports.PracticeType = exports.YearOfExperience = void 0;
3
+ exports.PdfSlidesAnalysisQueryDto = exports.PdfSlidesSortField = exports.RecommendationPriority = exports.CreationPhase = exports.SimulationRecordingsDto = exports.RecordingStatus = exports.SortOrder = exports.SimulationRecordingsQueryDto = exports.CreateSimulationDto = exports.ProductConfig = exports.CharacterCreateDto = exports.ContextDto = exports.ProfessionalProfileDto = exports.PersonalityAndBehaviourDto = exports.AvatarLanguage = exports.AssistantVoiceGender = exports.SegmentType = exports.PracticeType = exports.YearOfExperience = void 0;
4
4
  /**
5
5
  * Copyright (c) 2025 ctcHealth. All rights reserved.
6
6
  *
@@ -42,6 +42,14 @@ var AssistantVoiceGender;
42
42
  AssistantVoiceGender["Male"] = "Male";
43
43
  AssistantVoiceGender["Female"] = "Female";
44
44
  })(AssistantVoiceGender || (exports.AssistantVoiceGender = AssistantVoiceGender = {}));
45
+ var AvatarLanguage;
46
+ (function (AvatarLanguage) {
47
+ AvatarLanguage["English"] = "en";
48
+ AvatarLanguage["German"] = "de";
49
+ AvatarLanguage["Spanish"] = "es";
50
+ AvatarLanguage["Italian"] = "it";
51
+ AvatarLanguage["French"] = "fr";
52
+ })(AvatarLanguage || (exports.AvatarLanguage = AvatarLanguage = {}));
45
53
  class PersonalityAndBehaviourDto {
46
54
  riskTolerance;
47
55
  researchOrientation;
@@ -84,6 +92,8 @@ class CreateSimulationDto {
84
92
  scenario;
85
93
  objectives;
86
94
  anticipatedObjections;
95
+ imageId;
96
+ avatarLanguage;
87
97
  }
88
98
  exports.CreateSimulationDto = CreateSimulationDto;
89
99
  class SimulationRecordingsQueryDto {
@@ -127,4 +137,17 @@ var RecommendationPriority;
127
137
  RecommendationPriority["MEDIUM"] = "medium";
128
138
  RecommendationPriority["LOW"] = "low";
129
139
  })(RecommendationPriority || (exports.RecommendationPriority = RecommendationPriority = {}));
140
+ var PdfSlidesSortField;
141
+ (function (PdfSlidesSortField) {
142
+ PdfSlidesSortField["CREATED_AT"] = "createdAt";
143
+ PdfSlidesSortField["FILENAME"] = "originalFilename";
144
+ PdfSlidesSortField["TOTAL_SLIDES"] = "totalSlides";
145
+ })(PdfSlidesSortField || (exports.PdfSlidesSortField = PdfSlidesSortField = {}));
146
+ class PdfSlidesAnalysisQueryDto {
147
+ limit;
148
+ page;
149
+ sort;
150
+ sortBy;
151
+ }
152
+ exports.PdfSlidesAnalysisQueryDto = PdfSlidesAnalysisQueryDto;
130
153
  //# sourceMappingURL=plato-intefaces.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"plato-intefaces.js","sourceRoot":"","sources":["../../../../../libs/plato-sdk/src/lib/plato-intefaces.ts"],"names":[],"mappings":";;;AAAA;;;;;;;;;;;;GAYG;AACH,IAAY,gBAKX;AALD,WAAY,gBAAgB;IAC1B,qCAAmB,CAAA;IACnB,uCAAqB,CAAA;IACrB,yCAAuB,CAAA;IACvB,qCAAmB,CAAA;AACrB,CAAC,EALW,gBAAgB,gCAAhB,gBAAgB,QAK3B;AAED,IAAY,YAKX;AALD,WAAY,YAAY;IACtB,4CAA4B,CAAA;IAC5B,qCAAqB,CAAA;IACrB,iEAAiD,CAAA;IACjD,iCAAiB,CAAA;AACnB,CAAC,EALW,YAAY,4BAAZ,YAAY,QAKvB;AACD,IAAY,WAOX;AAPD,WAAY,WAAW;IACrB,oDAAqC,CAAA;IACrC,0CAA2B,CAAA;IAC3B,0EAA2D,CAAA;IAC3D,gFAAiE,CAAA;IACjE,qDAAsC,CAAA;IACtC,wEAAyD,CAAA;AAC3D,CAAC,EAPW,WAAW,2BAAX,WAAW,QAOtB;AAED,IAAY,oBAGX;AAHD,WAAY,oBAAoB;IAC9B,qCAAa,CAAA;IACb,yCAAiB,CAAA;AACnB,CAAC,EAHW,oBAAoB,oCAApB,oBAAoB,QAG/B;AAED,MAAa,0BAA0B;IACrC,aAAa,CAAU;IACvB,mBAAmB,CAAU;IAC7B,eAAe,CAAU;IACzB,YAAY,CAAU;IACtB,cAAc,CAAU;CACzB;AAND,gEAMC;AAED,MAAa,sBAAsB;IACjC,gBAAgB,CAAU;IAC1B,gBAAgB,CAAU;IAC1B,uBAAuB,CAAU;IACjC,QAAQ,CAAU;CACnB;AALD,wDAKC;AAED,MAAa,UAAU;IACrB,2BAA2B,CAAU;IACrC,iBAAiB,CAAU;IAC3B,kBAAkB,CAAU;CAC7B;AAJD,gCAIC;AAED,MAAa,kBAAkB;IAC7B,IAAI,CAAU;IACd,mBAAmB,CAA0B;IAC7C,OAAO,CAAe;IACtB,uBAAuB,CAA8B;IACrD,OAAO,CAAc;IACrB,eAAe,CAAwB;CACxC;AAPD,gDAOC;AAED,MAAa,aAAa;IACxB,IAAI,CAAU;IACd,WAAW,CAAU;CACtB;AAHD,sCAGC;AAED,MAAa,mBAAmB;IAC9B,OAAO,CAAsB;IAC7B,OAAO,CAAiB;IACxB,YAAY,CAAU;IACtB,QAAQ,CAAU;IAClB,UAAU,CAAU;IACpB,qBAAqB,CAAU;CAChC;AAPD,kDAOC;AAID,MAAa,4BAA4B;IACvC,KAAK,CAAmB;IACxB,IAAI,CAAU;IACd,IAAI,CAAa;CAClB;AAJD,oEAIC;AAED,IAAY,SAGX;AAHD,WAAY,SAAS;IACnB,wBAAW,CAAA;IACX,0BAAa,CAAA;AACf,CAAC,EAHW,SAAS,yBAAT,SAAS,QAGpB;AAED,IAAY,eAKX;AALD,WAAY,eAAe;IACzB,sCAAmB,CAAA;IACnB,4CAAyB,CAAA;IACzB,wCAAqB,CAAA;IACrB,oCAAiB,CAAA;AACnB,CAAC,EALW,eAAe,+BAAf,eAAe,QAK1B;AAED,MAAa,uBAAuB;IAClC,GAAG,CAAU;IACb,SAAS,CAAQ;IACjB,eAAe,CAAmB;CACnC;AAJD,0DAIC;AAiHD,IAAY,aASX;AATD,WAAY,aAAa;IACvB,sCAAqB,CAAA;IACrB,8BAAa,CAAA;IACb,0CAAyB,CAAA;IACzB,0DAAyC,CAAA;IACzC,kEAAiD,CAAA;IACjD,kCAAiB,CAAA;IACjB,sCAAqB,CAAA;IACrB,gCAAe,CAAA;AACjB,CAAC,EATW,aAAa,6BAAb,aAAa,QASxB;AAiCD,IAAY,sBAIX;AAJD,WAAY,sBAAsB;IAChC,uCAAa,CAAA;IACb,2CAAiB,CAAA;IACjB,qCAAW,CAAA;AACb,CAAC,EAJW,sBAAsB,sCAAtB,sBAAsB,QAIjC"}
1
+ {"version":3,"file":"plato-intefaces.js","sourceRoot":"","sources":["../../../../../libs/plato-sdk/src/lib/plato-intefaces.ts"],"names":[],"mappings":"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"}
@@ -1,4 +1,4 @@
1
- import { CallDTO, CreateSimulationDto, CreationPhase, SimulationRecordingsDto, SimulationRecordingsQueryDto, UploadPdfSlidesResponseDto, SimulationDetailsDto, RecommendationsResponseDto } from './plato-intefaces';
1
+ import { CallDTO, CreateSimulationDto, CreationPhase, SimulationRecordingsDto, SimulationRecordingsQueryDto, SimulationDetailsDto, RecommendationsResponseDto, PdfSlidesDto, PdfSlideDto, PdfSlidesAnalysisQueryDto, AssistantImageDto } from './plato-intefaces';
2
2
  export interface ApiClientConfig {
3
3
  baseUrl: string;
4
4
  token?: string;
@@ -35,6 +35,7 @@ export interface CallEventMap {
35
35
  [key: string]: unknown;
36
36
  };
37
37
  'volume-level': number;
38
+ 'call-details-ready': CallDTO;
38
39
  }
39
40
  export type CallEventNames = keyof CallEventMap;
40
41
  export type CallEventListener<K extends CallEventNames> = (payload: CallEventMap[K]) => void;
@@ -44,6 +45,8 @@ export declare class PlatoApiClient {
44
45
  private eventListeners;
45
46
  private callControllerInstance?;
46
47
  private eventsAttached;
48
+ private currentCallId?;
49
+ private vapiEventNames;
47
50
  eventNames: CallEventNames[];
48
51
  constructor(config: ApiClientConfig);
49
52
  /**
@@ -62,6 +65,10 @@ export declare class PlatoApiClient {
62
65
  * Internal: Attach event listeners and propagate to registered listeners.
63
66
  */
64
67
  private attachEvents;
68
+ /**
69
+ * Internal: Emit SDK-specific events that are not part of Vapi.
70
+ */
71
+ private emit;
65
72
  createSimulation(createSimulationParams: CreateSimulationDto): Promise<{
66
73
  simulationId: string;
67
74
  phase: CreationPhase;
@@ -97,7 +104,12 @@ export declare class PlatoApiClient {
97
104
  */
98
105
  off: <K extends CallEventNames>(event: K, listener: CallEventListener<K>) => void;
99
106
  }>;
107
+ private onCallEnded;
100
108
  private createCall;
101
- uploadPdfSlides(file: File | Blob): Promise<UploadPdfSlidesResponseDto>;
109
+ uploadPdfSlides(file: File | Blob): Promise<string>;
102
110
  getRecommendations(): Promise<RecommendationsResponseDto>;
111
+ getSlidesAnalysis(queryParams: PdfSlidesAnalysisQueryDto): Promise<PdfSlidesDto[]>;
112
+ getSlideAnalysis(id: string): Promise<PdfSlideDto>;
113
+ deleteSlideAnalysis(id: string): Promise<void>;
114
+ getAssistantImages(): Promise<AssistantImageDto[]>;
103
115
  }
@@ -17,6 +17,8 @@ const tslib_1 = require("tslib");
17
17
  */
18
18
  const axios_1 = tslib_1.__importDefault(require("axios"));
19
19
  const web_1 = tslib_1.__importDefault(require("@vapi-ai/web"));
20
+ const utils_1 = require("./utils");
21
+ const constants_1 = require("./constants");
20
22
  class PlatoApiClient {
21
23
  config;
22
24
  http;
@@ -24,6 +26,19 @@ class PlatoApiClient {
24
26
  eventListeners = {};
25
27
  callControllerInstance;
26
28
  eventsAttached = false;
29
+ currentCallId;
30
+ // Vapi-native events (events that Vapi SDK supports)
31
+ // Exclude our custom SDK events from this list
32
+ vapiEventNames = [
33
+ 'call-start',
34
+ 'call-end',
35
+ 'speech-start',
36
+ 'speech-end',
37
+ 'error',
38
+ 'message',
39
+ 'volume-level',
40
+ ];
41
+ // All event names including SDK-specific events
27
42
  eventNames = [
28
43
  'call-start',
29
44
  'call-end',
@@ -32,6 +47,7 @@ class PlatoApiClient {
32
47
  'error',
33
48
  'message',
34
49
  'volume-level',
50
+ 'call-details-ready',
35
51
  ];
36
52
  constructor(config) {
37
53
  this.config = config;
@@ -91,12 +107,22 @@ class PlatoApiClient {
91
107
  return;
92
108
  this.eventsAttached = true;
93
109
  const vapi = this.callControllerInstance;
94
- this.eventNames.forEach(event => {
110
+ // Only attach Vapi-native events to the Vapi instance
111
+ this.vapiEventNames.forEach(event => {
95
112
  vapi.on(event, (payload) => {
96
113
  (this.eventListeners[event] || []).forEach(listener => listener(payload));
97
114
  });
98
115
  });
99
116
  }
117
+ /**
118
+ * Internal: Emit SDK-specific events that are not part of Vapi.
119
+ */
120
+ emit(event, payload) {
121
+ const listeners = this.eventListeners[event];
122
+ if (listeners) {
123
+ listeners.forEach(listener => listener(payload));
124
+ }
125
+ }
100
126
  async createSimulation(createSimulationParams) {
101
127
  try {
102
128
  const res = await this.http.post('/api/v1/simulation', {
@@ -202,6 +228,12 @@ class PlatoApiClient {
202
228
  if (!this.eventsAttached) {
203
229
  this.attachEvents();
204
230
  }
231
+ // Internal call-end listener
232
+ this.callControllerInstance.on('call-end', () => {
233
+ this.onCallEnded().catch(error => {
234
+ console.error('Error in onCallEnded: ', error);
235
+ });
236
+ });
205
237
  const { data } = await this.http.get(`/api/v1/simulation/${simulationId}`);
206
238
  const assistantId = data;
207
239
  const call = await this.callControllerInstance.start(assistantId);
@@ -213,6 +245,8 @@ class PlatoApiClient {
213
245
  callId: call.id,
214
246
  assistantId: call.assistantId,
215
247
  });
248
+ // Store the callId for use in onCallEnded
249
+ this.currentCallId = apiCall._id;
216
250
  // Return stopCall, callId, and event subscription methods with strict typing
217
251
  return {
218
252
  stopCall: () => {
@@ -240,6 +274,41 @@ class PlatoApiClient {
240
274
  throw e;
241
275
  }
242
276
  }
277
+ async onCallEnded() {
278
+ let callIdForRetry;
279
+ try {
280
+ if (!this.currentCallId) {
281
+ return;
282
+ }
283
+ callIdForRetry = this.currentCallId;
284
+ // First attempt
285
+ let response = await this.http.post('/api/v1/postcall/call-ended', {
286
+ callId: callIdForRetry,
287
+ });
288
+ // If status is "processing", retry once immediately
289
+ if (response.data?.status === 'processing') {
290
+ response = await this.http.post('/api/v1/postcall/call-ended', {
291
+ callId: callIdForRetry,
292
+ });
293
+ }
294
+ // After onCallEnded completes successfully, fetch and emit call details
295
+ try {
296
+ const callDetails = await this.getCallDetails(callIdForRetry);
297
+ this.emit('call-details-ready', callDetails);
298
+ }
299
+ catch (error) {
300
+ console.error('Error fetching call details after call ended:', error);
301
+ // Don't throw - we don't want to break the onCallEnded flow
302
+ }
303
+ }
304
+ catch {
305
+ // Silently handle errors in post-call processing
306
+ }
307
+ finally {
308
+ // Clean up the callId after processing (success or failure)
309
+ this.currentCallId = undefined;
310
+ }
311
+ }
243
312
  async createCall(payload) {
244
313
  const response = await this.http.post('/api/v1/simulation/call', {
245
314
  ...payload,
@@ -247,10 +316,56 @@ class PlatoApiClient {
247
316
  return response.data;
248
317
  }
249
318
  async uploadPdfSlides(file) {
250
- const formData = new FormData();
251
- formData.append('file', file);
252
- const response = await this.http.post('/api/v1/pdfSlides/upload', formData);
253
- return response.data;
319
+ try {
320
+ const checkResult = (0, utils_1.checkFile)(file, constants_1.MAX_PDF_FILE_SIZE, constants_1.ALLOWED_PDF_MIME_TYPES);
321
+ if (checkResult !== true) {
322
+ throw new Error(checkResult);
323
+ }
324
+ // Check PDF page count before proceeding
325
+ const pageCount = await (0, utils_1.getPdfPageCount)(file);
326
+ if (pageCount > constants_1.MAX_PDF_PAGES) {
327
+ throw new Error(`PDF has ${pageCount} pages, which exceeds the maximum allowed page count of ${constants_1.MAX_PDF_PAGES} pages.`);
328
+ }
329
+ const contentHash = await (0, utils_1.calculateHash)(file);
330
+ const filename = file instanceof File ? file.name : file.filename;
331
+ if (!filename) {
332
+ throw new Error('Invalid input: could not extract filename from the provided file or blob.');
333
+ }
334
+ if (/[^a-zA-Z0-9._ -]/.test(filename)) {
335
+ throw new Error('Filename contains invalid characters. Only English letters, numbers, dots, hyphens, and underscores are allowed.');
336
+ }
337
+ const { presignedPost } = (await this.http.post('/api/v1/pdfSlides/request-upload', {
338
+ contentHash,
339
+ filename,
340
+ })).data;
341
+ const formData = new FormData();
342
+ Object.entries(presignedPost.fields).forEach(([key, value]) => {
343
+ formData.append(key, value);
344
+ });
345
+ formData.append('file', file);
346
+ await axios_1.default.post(presignedPost.url, formData, {
347
+ headers: {
348
+ 'Content-Type': 'multipart/form-data',
349
+ },
350
+ });
351
+ /*
352
+ // replace const { presignedPost } with const { presignedPost, objectKey }
353
+ // Uncomment this block if you are testing locally without AWS EventBridge
354
+ await this.http.post('/api/v1/pdfSlides/test-event-bridge', {
355
+ s3Name: objectKey,
356
+ });
357
+ */
358
+ return 'PDF upload successful';
359
+ }
360
+ catch (e) {
361
+ if (axios_1.default.isAxiosError(e)) {
362
+ console.error('Error uploading PDF slides:', e.response?.data?.message || e.message);
363
+ }
364
+ else {
365
+ console.error('Error uploading PDF slides:', e instanceof Error ? e.message : 'Unknown error');
366
+ }
367
+ throw e;
368
+ }
254
369
  }
255
370
  async getRecommendations() {
256
371
  try {
@@ -264,6 +379,55 @@ class PlatoApiClient {
264
379
  throw e;
265
380
  }
266
381
  }
382
+ async getSlidesAnalysis(queryParams) {
383
+ try {
384
+ const res = await this.http.get('/api/v1/pdfSlides', {
385
+ params: queryParams,
386
+ });
387
+ return res.data;
388
+ }
389
+ catch (e) {
390
+ if (axios_1.default.isAxiosError(e)) {
391
+ console.error('Error getting PDF slides analysis:', e.response?.data.message);
392
+ }
393
+ throw e;
394
+ }
395
+ }
396
+ async getSlideAnalysis(id) {
397
+ try {
398
+ const res = await this.http.get(`/api/v1/pdfSlides/${id}`);
399
+ return res.data;
400
+ }
401
+ catch (e) {
402
+ if (axios_1.default.isAxiosError(e)) {
403
+ console.error('Error getting PDF slide analysis by ID:', e.response?.data.message);
404
+ }
405
+ throw e;
406
+ }
407
+ }
408
+ async deleteSlideAnalysis(id) {
409
+ try {
410
+ await this.http.delete(`/api/v1/pdfSlides/${id}`);
411
+ }
412
+ catch (e) {
413
+ if (axios_1.default.isAxiosError(e)) {
414
+ console.error('Error deleting PDF slide analysis:', e.response?.data.message);
415
+ }
416
+ throw e;
417
+ }
418
+ }
419
+ async getAssistantImages() {
420
+ try {
421
+ const res = await this.http.get('/api/v1/assistant-images');
422
+ return res.data;
423
+ }
424
+ catch (e) {
425
+ if (axios_1.default.isAxiosError(e)) {
426
+ console.error('Error getting assistant images:', e.response?.data.message);
427
+ }
428
+ throw e;
429
+ }
430
+ }
267
431
  }
268
432
  exports.PlatoApiClient = PlatoApiClient;
269
433
  //# sourceMappingURL=plato-sdk.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"plato-sdk.js","sourceRoot":"","sources":["../../../../../libs/plato-sdk/src/lib/plato-sdk.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"plato-sdk.js","sourceRoot":"","sources":["../../../../../libs/plato-sdk/src/lib/plato-sdk.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,24 @@
1
+ /**
2
+ * Validates a file against size and type constraints.
3
+ *
4
+ * @param file - The file to check.
5
+ * @param maxFileSize - The maximum allowed file size in bytes.
6
+ * @param allowedMimeTypes - An array of allowed MIME types.
7
+ * @returns true if valid, or a descriptive error message if invalid.
8
+ */
9
+ export declare function checkFile(file: File | Blob, maxFileSize: number, allowedMimeTypes: string[]): true | string;
10
+ /**
11
+ * Calculates the SHA-256 hash of a file or blob.
12
+ *
13
+ * @param file - The file or blob to hash.
14
+ * @returns A promise that resolves to the hexadecimal SHA-256 hash.
15
+ */
16
+ export declare function calculateHash(file: File | Blob): Promise<string>;
17
+ /**
18
+ * Gets the page count of a PDF file.
19
+ *
20
+ * @param file - The PDF file or blob to check.
21
+ * @returns A promise that resolves to the number of pages in the PDF.
22
+ * @throws Error if the PDF cannot be parsed.
23
+ */
24
+ export declare function getPdfPageCount(file: File | Blob): Promise<number>;
@@ -0,0 +1,70 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.checkFile = checkFile;
4
+ exports.calculateHash = calculateHash;
5
+ exports.getPdfPageCount = getPdfPageCount;
6
+ /**
7
+ * Copyright (c) 2025 ctcHealth. All rights reserved.
8
+ *
9
+ * This file is part of the ctcHealth Plato Platform, a proprietary software system developed by ctcHealth.
10
+ *
11
+ * This source code and all related materials are confidential and proprietary to ctcHealth.
12
+ * Unauthorized access, use, copying, modification, distribution, or disclosure is strictly prohibited
13
+ * and may result in disciplinary action and civil and/or criminal penalties.
14
+ *
15
+ * This software is intended solely for authorized use within ctcHealth and its designated partners.
16
+ *
17
+ * For internal use only.
18
+ */
19
+ const pdf_lib_1 = require("pdf-lib");
20
+ /**
21
+ * Validates a file against size and type constraints.
22
+ *
23
+ * @param file - The file to check.
24
+ * @param maxFileSize - The maximum allowed file size in bytes.
25
+ * @param allowedMimeTypes - An array of allowed MIME types.
26
+ * @returns true if valid, or a descriptive error message if invalid.
27
+ */
28
+ function checkFile(file, maxFileSize, allowedMimeTypes) {
29
+ if (file.size > maxFileSize) {
30
+ const uploadedSizeMB = (file.size / (1024 * 1024)).toFixed(2);
31
+ const maxSizeMB = (maxFileSize / (1024 * 1024)).toFixed(2);
32
+ return `File size (${uploadedSizeMB} MB) exceeds the maximum allowed size of ${maxSizeMB} MB.`;
33
+ }
34
+ if (!allowedMimeTypes.includes(file.type)) {
35
+ return `Invalid file type: ${file.type}. Allowed types are: ${allowedMimeTypes.join(', ')}.`;
36
+ }
37
+ return true;
38
+ }
39
+ /**
40
+ * Calculates the SHA-256 hash of a file or blob.
41
+ *
42
+ * @param file - The file or blob to hash.
43
+ * @returns A promise that resolves to the hexadecimal SHA-256 hash.
44
+ */
45
+ async function calculateHash(file) {
46
+ const arrayBuffer = await file.arrayBuffer();
47
+ const hashBuffer = await crypto.subtle.digest('SHA-256', arrayBuffer);
48
+ const hashArray = Array.from(new Uint8Array(hashBuffer));
49
+ const hashHex = hashArray.map(b => b.toString(16).padStart(2, '0')).join('');
50
+ return hashHex;
51
+ }
52
+ /**
53
+ * Gets the page count of a PDF file.
54
+ *
55
+ * @param file - The PDF file or blob to check.
56
+ * @returns A promise that resolves to the number of pages in the PDF.
57
+ * @throws Error if the PDF cannot be parsed.
58
+ */
59
+ async function getPdfPageCount(file) {
60
+ try {
61
+ const arrayBuffer = await file.arrayBuffer();
62
+ const pdf = await pdf_lib_1.PDFDocument.load(arrayBuffer);
63
+ return pdf.getPageCount();
64
+ }
65
+ catch (err) {
66
+ const message = err instanceof Error ? err.message : 'Unknown error';
67
+ throw new Error(`Failed to read PDF page count: ${message}`);
68
+ }
69
+ }
70
+ //# sourceMappingURL=utils.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"utils.js","sourceRoot":"","sources":["../../../../../libs/plato-sdk/src/lib/utils.ts"],"names":[],"mappings":";;AAuBA,8BAgBC;AAQD,sCAMC;AASD,0CASC;AAvED;;;;;;;;;;;;GAYG;AACH,qCAAsC;AAEtC;;;;;;;GAOG;AACH,SAAgB,SAAS,CACvB,IAAiB,EACjB,WAAmB,EACnB,gBAA0B;IAE1B,IAAI,IAAI,CAAC,IAAI,GAAG,WAAW,EAAE,CAAC;QAC5B,MAAM,cAAc,GAAG,CAAC,IAAI,CAAC,IAAI,GAAG,CAAC,IAAI,GAAG,IAAI,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC;QAC9D,MAAM,SAAS,GAAG,CAAC,WAAW,GAAG,CAAC,IAAI,GAAG,IAAI,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC;QAC3D,OAAO,cAAc,cAAc,4CAA4C,SAAS,MAAM,CAAC;IACjG,CAAC;IAED,IAAI,CAAC,gBAAgB,CAAC,QAAQ,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC;QAC1C,OAAO,sBAAsB,IAAI,CAAC,IAAI,wBAAwB,gBAAgB,CAAC,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC;IAC/F,CAAC;IAED,OAAO,IAAI,CAAC;AACd,CAAC;AAED;;;;;GAKG;AACI,KAAK,UAAU,aAAa,CAAC,IAAiB;IACnD,MAAM,WAAW,GAAG,MAAM,IAAI,CAAC,WAAW,EAAE,CAAC;IAC7C,MAAM,UAAU,GAAG,MAAM,MAAM,CAAC,MAAM,CAAC,MAAM,CAAC,SAAS,EAAE,WAAW,CAAC,CAAC;IACtE,MAAM,SAAS,GAAG,KAAK,CAAC,IAAI,CAAC,IAAI,UAAU,CAAC,UAAU,CAAC,CAAC,CAAC;IACzD,MAAM,OAAO,GAAG,SAAS,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,QAAQ,CAAC,EAAE,CAAC,CAAC,QAAQ,CAAC,CAAC,EAAE,GAAG,CAAC,CAAC,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;IAC7E,OAAO,OAAO,CAAC;AACjB,CAAC;AAED;;;;;;GAMG;AACI,KAAK,UAAU,eAAe,CAAC,IAAiB;IACrD,IAAI,CAAC;QACH,MAAM,WAAW,GAAG,MAAM,IAAI,CAAC,WAAW,EAAE,CAAC;QAC7C,MAAM,GAAG,GAAG,MAAM,qBAAW,CAAC,IAAI,CAAC,WAAW,CAAC,CAAC;QAChD,OAAO,GAAG,CAAC,YAAY,EAAE,CAAC;IAC5B,CAAC;IAAC,OAAO,GAAY,EAAE,CAAC;QACtB,MAAM,OAAO,GAAG,GAAG,YAAY,KAAK,CAAC,CAAC,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,eAAe,CAAC;QACrE,MAAM,IAAI,KAAK,CAAC,kCAAkC,OAAO,EAAE,CAAC,CAAC;IAC/D,CAAC;AACH,CAAC"}