import { CoError } from '../../../modules/co-error' import * as Promise from 'bluebird' import PresentationSettings from '../../../modules/presentation-settings' import { PresentationClient, ExportOptions, ExportData } from '../../../services/presentation' export default function run (ewizardCommands: any, presentationClient: PresentationClient, type: string, subtype: string, params: ExportOptions, presentationDir: string = process.cwd()): Promise { return pushPresentation(ewizardCommands, presentationDir) .then(getPresentationId(presentationDir)) .then(exportPresentation(presentationClient, type, subtype, params)) .catch(throwExportError(type, subtype)); } function pushPresentation(ewizardCommands: any, presentationDir: string): Promise { return ewizardCommands.push(presentationDir) .catch((err: CoError) => { if (err.code === 'ALREADY_UP_TO_DATE') { return; } throw err; }); } function getPresentationId (presentationDir: string): () => Promise { return function () { const presentationSettings = new PresentationSettings(presentationDir); return presentationSettings.get('id'); } } function exportPresentation (presentationClient: PresentationClient, type: string, subtype: string, params: ExportOptions): (id: string) => Promise { return function (id) { return new Promise((resolve, reject) => { const getExportPromise = () => presentationClient.export(id, type, subtype, params); runPromise(getExportPromise, resolve, reject, 5); }); } } function runPromise(promiseFn: Function, resolve: Function, reject: Function, countTries: number) { const retryDelay = 10000; promiseFn() .then(resolve) .catch((error: Error) => { countTries > 0 ? setTimeout(() => { runPromise(promiseFn, resolve, reject, countTries - 1); }, retryDelay) : reject(error); }); } function throwExportError (type: string, subtype: string): (err: Error) => never { return function (err) { throw new CoError('EXPORT_ERR', type, subtype, err.message) } }