@eka-care/ekascribe-ts-sdk 1.5.47 → 1.5.50
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/dist/audio-chunker/audio-file-manager.js +9 -0
- package/dist/aws-services/upload-file-to-s3.d.ts +2 -1
- package/dist/aws-services/upload-file-to-s3.js +1 -4
- package/dist/constants/constant.d.ts +0 -1
- package/dist/constants/constant.js +0 -1
- package/dist/fetch-client/helper.d.ts +1 -0
- package/dist/fetch-client/helper.js +1 -0
- package/dist/index.d.ts +4 -2
- package/dist/index.js +9 -1
- package/dist/shared-worker/s3-file-upload.js +2 -1
- package/dist/shared-worker/s3-file-upload.ts +3 -1
- package/dist/utils/search-past-sessions.d.ts +19 -0
- package/dist/utils/search-past-sessions.js +70 -0
- package/package.json +1 -1
|
@@ -5,6 +5,7 @@ import { configureAWS } from '../aws-services/configure-aws';
|
|
|
5
5
|
import { CALLBACK_TYPE, SHARED_WORKER_ACTION } from '../constants/enums';
|
|
6
6
|
import compressAudioToMp3 from '../utils/compress-mp3-audio';
|
|
7
7
|
import EkaScribeStore from '../store/store';
|
|
8
|
+
import { GET_S3_BUCKET_NAME } from '../fetch-client/helper';
|
|
8
9
|
class AudioFileManager {
|
|
9
10
|
initialiseClassInstance() {
|
|
10
11
|
this.audioChunks = [];
|
|
@@ -308,8 +309,10 @@ class AudioFileManager {
|
|
|
308
309
|
},
|
|
309
310
|
});
|
|
310
311
|
}
|
|
312
|
+
const s3BucketName = GET_S3_BUCKET_NAME();
|
|
311
313
|
// Push upload promise to track status
|
|
312
314
|
const uploadPromise = pushFileToS3({
|
|
315
|
+
s3BucketName,
|
|
313
316
|
fileBlob: audioBlob,
|
|
314
317
|
fileName: s3FileName,
|
|
315
318
|
txnID: this.txnID,
|
|
@@ -397,9 +400,11 @@ class AudioFileManager {
|
|
|
397
400
|
},
|
|
398
401
|
});
|
|
399
402
|
}
|
|
403
|
+
const s3BucketName = GET_S3_BUCKET_NAME();
|
|
400
404
|
this.sharedWorkerInstance?.port.postMessage({
|
|
401
405
|
action: SHARED_WORKER_ACTION.UPLOAD_FILE_WITH_WORKER,
|
|
402
406
|
payload: {
|
|
407
|
+
s3BucketName,
|
|
403
408
|
audioFrames,
|
|
404
409
|
fileName: s3FileName,
|
|
405
410
|
txnID: this.txnID,
|
|
@@ -541,6 +546,7 @@ class AudioFileManager {
|
|
|
541
546
|
return [];
|
|
542
547
|
}
|
|
543
548
|
const onEventCallback = EkaScribeStore.eventCallback;
|
|
549
|
+
const s3BucketName = GET_S3_BUCKET_NAME();
|
|
544
550
|
if (this.sharedWorkerInstance) {
|
|
545
551
|
this.audioChunks.forEach((chunk, index) => {
|
|
546
552
|
const { fileName, fileBlob, status, audioFrames } = chunk;
|
|
@@ -549,6 +555,7 @@ class AudioFileManager {
|
|
|
549
555
|
this.sharedWorkerInstance?.port.postMessage({
|
|
550
556
|
action: SHARED_WORKER_ACTION.UPLOAD_FILE_WITH_WORKER,
|
|
551
557
|
payload: {
|
|
558
|
+
s3BucketName,
|
|
552
559
|
audioFrames,
|
|
553
560
|
fileBlob,
|
|
554
561
|
fileName: `${this.filePath}/${fileName}`,
|
|
@@ -575,6 +582,7 @@ class AudioFileManager {
|
|
|
575
582
|
},
|
|
576
583
|
});
|
|
577
584
|
}
|
|
585
|
+
const s3BucketName = GET_S3_BUCKET_NAME();
|
|
578
586
|
this.audioChunks.forEach((chunk, index) => {
|
|
579
587
|
const { fileName, fileBlob, status, audioFrames } = chunk;
|
|
580
588
|
if (status != 'success') {
|
|
@@ -591,6 +599,7 @@ class AudioFileManager {
|
|
|
591
599
|
}
|
|
592
600
|
if (failedFileBlob) {
|
|
593
601
|
const uploadPromise = pushFileToS3({
|
|
602
|
+
s3BucketName,
|
|
594
603
|
fileBlob: failedFileBlob,
|
|
595
604
|
fileName: `${this.filePath}/${fileName}`,
|
|
596
605
|
txnID: this.txnID,
|
|
@@ -1,4 +1,5 @@
|
|
|
1
|
-
declare const pushFileToS3: ({ fileBlob, fileName, txnID, businessID, is_shared_worker, }: {
|
|
1
|
+
declare const pushFileToS3: ({ s3BucketName, fileBlob, fileName, txnID, businessID, is_shared_worker, }: {
|
|
2
|
+
s3BucketName: string;
|
|
2
3
|
fileBlob: Blob;
|
|
3
4
|
fileName: string;
|
|
4
5
|
txnID: string;
|
|
@@ -1,11 +1,8 @@
|
|
|
1
1
|
// @ts-nocheck
|
|
2
2
|
import * as AWS from 'aws-sdk';
|
|
3
3
|
import s3RetryWrapper from './s3-retry-wrapper';
|
|
4
|
-
|
|
5
|
-
const pushFileToS3 = async ({ fileBlob, fileName, txnID, businessID, is_shared_worker = false, }) => {
|
|
4
|
+
const pushFileToS3 = async ({ s3BucketName, fileBlob, fileName, txnID, businessID, is_shared_worker = false, }) => {
|
|
6
5
|
try {
|
|
7
|
-
const s3BucketName = GET_S3_BUCKET_NAME();
|
|
8
|
-
console.log('s3BucketName', s3BucketName);
|
|
9
6
|
const requestBody = {
|
|
10
7
|
Bucket: s3BucketName,
|
|
11
8
|
Key: fileName,
|
|
@@ -16,7 +16,6 @@ export declare const CHANNELS = 1;
|
|
|
16
16
|
export declare const AUDIO_BUFFER_SIZE_IN_S: number;
|
|
17
17
|
export declare const OUTPUT_FORMAT = "mp3";
|
|
18
18
|
export declare const AUDIO_EXTENSION_TYPE_MAP: Record<string, string>;
|
|
19
|
-
export declare const S3_BUCKET_NAME = "m-prod-voice-record";
|
|
20
19
|
export declare const SDK_STATUS_CODE: {
|
|
21
20
|
AUDIO_ERROR: number;
|
|
22
21
|
SUCCESS: number;
|
|
@@ -12,4 +12,5 @@ export declare const GET_EKA_VOICE_HOST_V3: () => string;
|
|
|
12
12
|
export declare const GET_COOK_HOST_V1: () => string;
|
|
13
13
|
export declare const GET_COG_HOST: () => string;
|
|
14
14
|
export declare const GET_EKA_HOST: () => string;
|
|
15
|
+
export declare const GET_CURRENT_ENV: () => "PROD" | "DEV";
|
|
15
16
|
export default setEnv;
|
|
@@ -40,4 +40,5 @@ export const GET_EKA_VOICE_HOST_V3 = () => envVar.EKA_VOICE_HOST_V3;
|
|
|
40
40
|
export const GET_COOK_HOST_V1 = () => envVar.COOK_V1;
|
|
41
41
|
export const GET_COG_HOST = () => envVar.COG_HOST;
|
|
42
42
|
export const GET_EKA_HOST = () => envVar.EKA_HOST;
|
|
43
|
+
export const GET_CURRENT_ENV = () => (envVar === PROD ? 'PROD' : 'DEV');
|
|
43
44
|
export default setEnv;
|
package/dist/index.d.ts
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
import { TGetStatusResponse } from './api/transaction/get-voice-api-v3-status';
|
|
2
2
|
import { TEndRecordingResponse, TEventCallback, TGetTransactionHistoryResponse, TPatchTransactionRequest, TPatchVoiceApiV2ConfigRequest, TPatchVoiceApiV3StatusRequest, TPostTransactionResponse, TPostV1ConvertToTemplateRequest, TPostV1TemplateRequest, TPostV1TemplateSectionRequest, TPostV1UploadAudioFilesRequest, TStartRecordingRequest, TVadFrameProcessedCallback, TVadFramesCallback } from './constants/types';
|
|
3
|
-
import { TSearchSessionsByPatientRequest } from './utils/search-sessions
|
|
3
|
+
import { TSearchSessionsByPatientRequest, TSearchSessionsRequest } from './utils/search-past-sessions';
|
|
4
4
|
declare class EkaScribe {
|
|
5
5
|
private static instance;
|
|
6
6
|
private vadInstance;
|
|
@@ -66,7 +66,9 @@ declare class EkaScribe {
|
|
|
66
66
|
updateTemplateSection(templateSection: TPostV1TemplateSectionRequest): Promise<import("./constants/types").TPostV1TemplateSectionResponse>;
|
|
67
67
|
deleteTemplateSection(section_id: string): Promise<import("./constants/types").TPostV1TemplateSectionResponse>;
|
|
68
68
|
postTransactionConvertToTemplate({ txn_id, template_id }: TPostV1ConvertToTemplateRequest): Promise<import("./constants/types").TPostV1ConvertToTemplateResponse>;
|
|
69
|
-
|
|
69
|
+
searchPastSessions(request: TSearchSessionsRequest): Promise<import("./constants/types").TSessionHistoryData[]>;
|
|
70
|
+
searchSessionsByPatientName(request: TSearchSessionsByPatientRequest): Promise<import("./constants/types").TSessionHistoryData[]>;
|
|
71
|
+
searchSessionsBySessionId(request: TSearchSessionsByPatientRequest): Promise<import("./constants/types").TSessionHistoryData[]>;
|
|
70
72
|
uploadAudioWithPresignedUrl(request: TPostV1UploadAudioFilesRequest): Promise<import("./main/upload-full-audio-with-presigned-url").TFullAudioUploadResponse>;
|
|
71
73
|
updateResultSummary(request: TPatchVoiceApiV3StatusRequest): Promise<import("./constants/types").TPatchVoiceApiV3StatusResponse>;
|
|
72
74
|
}
|
package/dist/index.js
CHANGED
|
@@ -28,9 +28,9 @@ import deleteV1TemplateSection from './api/template-sections/delete-v1-template-
|
|
|
28
28
|
import patchVoiceApiV2Config from './api/config/patch-voice-api-v2-config';
|
|
29
29
|
import cookV1MediaAiCreateTemplate from './api/templates/cook-v1-medai-ai-create-template';
|
|
30
30
|
import postV1ConvertToTemplate from './api/templates/post-transaction-convert-to-template';
|
|
31
|
-
import searchSessionsByPatient from './utils/search-sessions-by-patient-name';
|
|
32
31
|
import { postV1UploadAudioFiles } from './main/upload-full-audio-with-presigned-url';
|
|
33
32
|
import { patchVoiceApiV3Status } from './api/transaction/patch-voice-api-v3-status';
|
|
33
|
+
import searchSessions, { searchSessionsByPatient, searchSessionsBySessionId, } from './utils/search-past-sessions';
|
|
34
34
|
class EkaScribe {
|
|
35
35
|
// Private constructor to prevent direct instantiation
|
|
36
36
|
constructor() {
|
|
@@ -336,10 +336,18 @@ class EkaScribe {
|
|
|
336
336
|
const convertToTemplateResponse = await postV1ConvertToTemplate({ txn_id, template_id });
|
|
337
337
|
return convertToTemplateResponse;
|
|
338
338
|
}
|
|
339
|
+
async searchPastSessions(request) {
|
|
340
|
+
const searchSessionsResponse = await searchSessions(request);
|
|
341
|
+
return searchSessionsResponse;
|
|
342
|
+
}
|
|
339
343
|
async searchSessionsByPatientName(request) {
|
|
340
344
|
const searchSessionsByPatientNameResponse = await searchSessionsByPatient(request);
|
|
341
345
|
return searchSessionsByPatientNameResponse;
|
|
342
346
|
}
|
|
347
|
+
async searchSessionsBySessionId(request) {
|
|
348
|
+
const searchSessionsBySessionIdResponse = await searchSessionsBySessionId(request);
|
|
349
|
+
return searchSessionsBySessionIdResponse;
|
|
350
|
+
}
|
|
343
351
|
async uploadAudioWithPresignedUrl(request) {
|
|
344
352
|
const uploadAudioFilesResponse = await postV1UploadAudioFiles(request);
|
|
345
353
|
return uploadAudioFilesResponse;
|
|
@@ -41,7 +41,7 @@ onconnect = function (event) {
|
|
|
41
41
|
return;
|
|
42
42
|
}
|
|
43
43
|
case SHARED_WORKER_ACTION.UPLOAD_FILE_WITH_WORKER: {
|
|
44
|
-
const { fileName, audioFrames, txnID, businessID, fileBlob } = workerData.payload;
|
|
44
|
+
const { fileName, audioFrames, txnID, businessID, fileBlob, s3BucketName } = workerData.payload;
|
|
45
45
|
uploadRequestReceived++;
|
|
46
46
|
let audioBlob;
|
|
47
47
|
let compressedAudioBuffer;
|
|
@@ -55,6 +55,7 @@ onconnect = function (event) {
|
|
|
55
55
|
});
|
|
56
56
|
}
|
|
57
57
|
await pushFileToS3({
|
|
58
|
+
s3BucketName,
|
|
58
59
|
fileBlob: audioBlob,
|
|
59
60
|
fileName,
|
|
60
61
|
txnID,
|
|
@@ -49,7 +49,8 @@ onconnect = function (event: MessageEvent) {
|
|
|
49
49
|
}
|
|
50
50
|
|
|
51
51
|
case SHARED_WORKER_ACTION.UPLOAD_FILE_WITH_WORKER: {
|
|
52
|
-
const { fileName, audioFrames, txnID, businessID, fileBlob } =
|
|
52
|
+
const { fileName, audioFrames, txnID, businessID, fileBlob, s3BucketName } =
|
|
53
|
+
workerData.payload;
|
|
53
54
|
uploadRequestReceived++;
|
|
54
55
|
|
|
55
56
|
let audioBlob: Blob;
|
|
@@ -66,6 +67,7 @@ onconnect = function (event: MessageEvent) {
|
|
|
66
67
|
}
|
|
67
68
|
|
|
68
69
|
await pushFileToS3({
|
|
70
|
+
s3BucketName,
|
|
69
71
|
fileBlob: audioBlob,
|
|
70
72
|
fileName,
|
|
71
73
|
txnID,
|
|
@@ -0,0 +1,19 @@
|
|
|
1
|
+
import { TSessionHistoryData } from '../constants/types';
|
|
2
|
+
export type TSearchCriteria = {
|
|
3
|
+
patientName?: string;
|
|
4
|
+
sessionId?: string;
|
|
5
|
+
};
|
|
6
|
+
export type TSearchSessionsRequest = {
|
|
7
|
+
sessions: TSessionHistoryData[];
|
|
8
|
+
searchCriteria: TSearchCriteria;
|
|
9
|
+
};
|
|
10
|
+
export type TSearchSessionsByPatientRequest = {
|
|
11
|
+
sessions: TSessionHistoryData[];
|
|
12
|
+
patientName: string;
|
|
13
|
+
sessionId: string;
|
|
14
|
+
};
|
|
15
|
+
declare const searchSessions: ({ sessions, searchCriteria, }: TSearchSessionsRequest) => Promise<TSessionHistoryData[]>;
|
|
16
|
+
declare const searchSessionsByPatient: ({ sessions, patientName, }: TSearchSessionsByPatientRequest) => Promise<TSessionHistoryData[]>;
|
|
17
|
+
declare const searchSessionsBySessionId: ({ sessions, sessionId, }: TSearchSessionsByPatientRequest) => Promise<TSessionHistoryData[]>;
|
|
18
|
+
export default searchSessions;
|
|
19
|
+
export { searchSessionsByPatient, searchSessionsBySessionId };
|
|
@@ -0,0 +1,70 @@
|
|
|
1
|
+
// Generic debounce utility function
|
|
2
|
+
function debounce(func, delay) {
|
|
3
|
+
let timeoutId;
|
|
4
|
+
return (...args) => {
|
|
5
|
+
return new Promise((resolve) => {
|
|
6
|
+
clearTimeout(timeoutId);
|
|
7
|
+
timeoutId = setTimeout(() => {
|
|
8
|
+
resolve(func(...args));
|
|
9
|
+
}, delay);
|
|
10
|
+
});
|
|
11
|
+
};
|
|
12
|
+
}
|
|
13
|
+
// Modular search functions
|
|
14
|
+
const searchByPatientName = (sessions, patientName) => {
|
|
15
|
+
if (!patientName.trim()) {
|
|
16
|
+
return sessions;
|
|
17
|
+
}
|
|
18
|
+
const searchTerm = patientName.toLowerCase().trim();
|
|
19
|
+
return sessions.filter((session) => {
|
|
20
|
+
if (!session.patient_details?.username)
|
|
21
|
+
return false;
|
|
22
|
+
return session.patient_details.username.toLowerCase().includes(searchTerm);
|
|
23
|
+
});
|
|
24
|
+
};
|
|
25
|
+
const searchBySessionId = (sessions, sessionId) => {
|
|
26
|
+
if (!sessionId.trim()) {
|
|
27
|
+
return sessions;
|
|
28
|
+
}
|
|
29
|
+
const searchTerm = sessionId.toLowerCase().trim();
|
|
30
|
+
return sessions.filter((session) => {
|
|
31
|
+
return session.txn_id.toLowerCase().includes(searchTerm);
|
|
32
|
+
});
|
|
33
|
+
};
|
|
34
|
+
// Combined search function that applies multiple criteria
|
|
35
|
+
const performSearch = (sessions, searchCriteria) => {
|
|
36
|
+
let filteredSessions = sessions;
|
|
37
|
+
// Apply patient name filter if provided
|
|
38
|
+
if (searchCriteria.patientName) {
|
|
39
|
+
filteredSessions = searchByPatientName(filteredSessions, searchCriteria.patientName);
|
|
40
|
+
}
|
|
41
|
+
// Apply session ID filter if provided
|
|
42
|
+
if (searchCriteria.sessionId) {
|
|
43
|
+
filteredSessions = searchBySessionId(filteredSessions, searchCriteria.sessionId);
|
|
44
|
+
}
|
|
45
|
+
// If no search criteria provided, return all sessions
|
|
46
|
+
if (!searchCriteria.patientName && !searchCriteria.sessionId) {
|
|
47
|
+
return sessions;
|
|
48
|
+
}
|
|
49
|
+
return filteredSessions;
|
|
50
|
+
};
|
|
51
|
+
// Debounced search function
|
|
52
|
+
const debouncedSearch = debounce(performSearch, 300);
|
|
53
|
+
// Main search function
|
|
54
|
+
const searchSessions = async ({ sessions, searchCriteria, }) => {
|
|
55
|
+
return debouncedSearch(sessions, searchCriteria);
|
|
56
|
+
};
|
|
57
|
+
const searchSessionsByPatient = async ({ sessions, patientName, }) => {
|
|
58
|
+
return searchSessions({
|
|
59
|
+
sessions,
|
|
60
|
+
searchCriteria: { patientName },
|
|
61
|
+
});
|
|
62
|
+
};
|
|
63
|
+
const searchSessionsBySessionId = async ({ sessions, sessionId, }) => {
|
|
64
|
+
return searchSessions({
|
|
65
|
+
sessions,
|
|
66
|
+
searchCriteria: { sessionId },
|
|
67
|
+
});
|
|
68
|
+
};
|
|
69
|
+
export default searchSessions;
|
|
70
|
+
export { searchSessionsByPatient, searchSessionsBySessionId };
|