|  |  |  | /* global window */ | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | /* eslint-disable more/no-then */ | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | // eslint-disable-next-line func-names
 | 
					
						
							|  |  |  | (function() { | 
					
						
							|  |  |  |   window.textsecure = window.textsecure || {}; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |   window.textsecure.createTaskWithTimeout = (task, id, options = {}) => { | 
					
						
							|  |  |  |     const timeout = options.timeout || 1000 * 60 * 3; // three minutes
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     const errorForStack = new Error('for stack'); | 
					
						
							|  |  |  |     return () => | 
					
						
							|  |  |  |       new Promise((resolve, reject) => { | 
					
						
							|  |  |  |         let complete = false; | 
					
						
							|  |  |  |         let timer = setTimeout(() => { | 
					
						
							|  |  |  |           if (!complete) { | 
					
						
							|  |  |  |             const message = `${id || ''} task did not complete in time. Calling stack: ${ | 
					
						
							|  |  |  |               errorForStack.stack | 
					
						
							|  |  |  |             }`;
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |             window.log.error(message); | 
					
						
							|  |  |  |             return reject(new Error(message)); | 
					
						
							|  |  |  |           } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |           return null; | 
					
						
							|  |  |  |         }, timeout); | 
					
						
							|  |  |  |         const clearTimer = () => { | 
					
						
							|  |  |  |           try { | 
					
						
							|  |  |  |             const localTimer = timer; | 
					
						
							|  |  |  |             if (localTimer) { | 
					
						
							|  |  |  |               timer = null; | 
					
						
							|  |  |  |               clearTimeout(localTimer); | 
					
						
							|  |  |  |             } | 
					
						
							|  |  |  |           } catch (error) { | 
					
						
							|  |  |  |             window.log.error( | 
					
						
							|  |  |  |               id || '', | 
					
						
							|  |  |  |               'task ran into problem canceling timer. Calling stack:', | 
					
						
							|  |  |  |               errorForStack.stack | 
					
						
							|  |  |  |             ); | 
					
						
							|  |  |  |           } | 
					
						
							|  |  |  |         }; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |         const success = result => { | 
					
						
							|  |  |  |           clearTimer(); | 
					
						
							|  |  |  |           complete = true; | 
					
						
							|  |  |  |           return resolve(result); | 
					
						
							|  |  |  |         }; | 
					
						
							|  |  |  |         const failure = error => { | 
					
						
							|  |  |  |           clearTimer(); | 
					
						
							|  |  |  |           complete = true; | 
					
						
							|  |  |  |           return reject(error); | 
					
						
							|  |  |  |         }; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |         let promise; | 
					
						
							|  |  |  |         try { | 
					
						
							|  |  |  |           promise = task(); | 
					
						
							|  |  |  |         } catch (error) { | 
					
						
							|  |  |  |           clearTimer(); | 
					
						
							|  |  |  |           throw error; | 
					
						
							|  |  |  |         } | 
					
						
							|  |  |  |         if (!promise || !promise.then) { | 
					
						
							|  |  |  |           clearTimer(); | 
					
						
							|  |  |  |           complete = true; | 
					
						
							|  |  |  |           return resolve(promise); | 
					
						
							|  |  |  |         } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |         return promise.then(success, failure); | 
					
						
							|  |  |  |       }); | 
					
						
							|  |  |  |   }; | 
					
						
							|  |  |  | })(); |