@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.
@@ -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
- import { GET_S3_BUCKET_NAME } from '../fetch-client/helper';
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;
@@ -22,7 +22,6 @@ export const AUDIO_EXTENSION_TYPE_MAP = {
22
22
  wav: 'audio/wav',
23
23
  mp3: 'audio/mpeg',
24
24
  };
25
- export const S3_BUCKET_NAME = 'm-prod-voice-record';
26
25
  export const SDK_STATUS_CODE = {
27
26
  AUDIO_ERROR: 1001,
28
27
  SUCCESS: 200,
@@ -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-by-patient-name';
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
- searchSessionsByPatientName(request: TSearchSessionsByPatientRequest): Promise<unknown>;
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 } = workerData.payload;
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 };
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@eka-care/ekascribe-ts-sdk",
3
- "version": "1.5.47",
3
+ "version": "1.5.50",
4
4
  "main": "dist/index.js",
5
5
  "repository": "git@github.com:eka-care/eka-js-sdk.git",
6
6
  "author": "Sanikagoyal28 <sanikagoyal9@gmail.com>",