import { Constructor, delay } from './service_extension'; type SearchJobInterface = { sid?: string; status?: string; }; export type SearchServiceInterface = { getJob(sid: string): Promise; }; export type SearchServiceExtensions = { waitForJob(job: J, pollInterval?: number, callback?: (job: J) => object) : Promise; }; export function SearchServiceExtensions>(constructor: T) { class SearchService extends constructor { constructor(...args: any[]) { super(...args); } public async waitForJob(jobIn: J, pollInterval?: number, callback?: (job: J) => object) : Promise { const interval = pollInterval || 500; const sid = jobIn.sid; if (sid !== undefined) { let job = jobIn; do { await delay(interval); job = await this.getJob(sid) as J; if (callback) { callback(job); } } while (job.status !== 'done' && job.status !== 'failed'); return job; } return Promise.reject('No sid available on provided job'); } } return SearchService; }