You can not select more than 25 topics
			Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
		
		
		
		
			
				
					61 lines
				
				1.5 KiB
			
		
		
			
		
	
	
					61 lines
				
				1.5 KiB
			| 
								 
											4 years ago
										 
									 | 
							
								'use strict';
							 | 
						||
| 
								 | 
							
								const retry = require('retry');
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								class AbortError extends Error {
							 | 
						||
| 
								 | 
							
									constructor(message) {
							 | 
						||
| 
								 | 
							
										super();
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
										if (message instanceof Error) {
							 | 
						||
| 
								 | 
							
											this.originalError = message;
							 | 
						||
| 
								 | 
							
											({message} = message);
							 | 
						||
| 
								 | 
							
										} else {
							 | 
						||
| 
								 | 
							
											this.originalError = new Error(message);
							 | 
						||
| 
								 | 
							
											this.originalError.stack = this.stack;
							 | 
						||
| 
								 | 
							
										}
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
										this.name = 'AbortError';
							 | 
						||
| 
								 | 
							
										this.message = message;
							 | 
						||
| 
								 | 
							
									}
							 | 
						||
| 
								 | 
							
								}
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								function decorateErrorWithCounts(error, attemptNumber, options) {
							 | 
						||
| 
								 | 
							
									// Minus 1 from attemptNumber because the first attempt does not count as a retry
							 | 
						||
| 
								 | 
							
									const retriesLeft = options.retries - (attemptNumber - 1);
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
									error.attemptNumber = attemptNumber;
							 | 
						||
| 
								 | 
							
									error.retriesLeft = retriesLeft;
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
									return error;
							 | 
						||
| 
								 | 
							
								}
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								module.exports = (input, options) => new Promise((resolve, reject) => {
							 | 
						||
| 
								 | 
							
									options = Object.assign({
							 | 
						||
| 
								 | 
							
										onFailedAttempt: () => {},
							 | 
						||
| 
								 | 
							
										retries: 10
							 | 
						||
| 
								 | 
							
									}, options);
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
									const operation = retry.operation(options);
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
									operation.attempt(attemptNumber => Promise.resolve(attemptNumber)
							 | 
						||
| 
								 | 
							
										.then(input)
							 | 
						||
| 
								 | 
							
										.then(resolve, error => {
							 | 
						||
| 
								 | 
							
											if (error instanceof AbortError) {
							 | 
						||
| 
								 | 
							
												operation.stop();
							 | 
						||
| 
								 | 
							
												reject(error.originalError);
							 | 
						||
| 
								 | 
							
											} else if (error instanceof TypeError) {
							 | 
						||
| 
								 | 
							
												operation.stop();
							 | 
						||
| 
								 | 
							
												reject(error);
							 | 
						||
| 
								 | 
							
											} else if (operation.retry(error)) {
							 | 
						||
| 
								 | 
							
												decorateErrorWithCounts(error, attemptNumber, options);
							 | 
						||
| 
								 | 
							
												options.onFailedAttempt(error);
							 | 
						||
| 
								 | 
							
											} else {
							 | 
						||
| 
								 | 
							
												decorateErrorWithCounts(error, attemptNumber, options);
							 | 
						||
| 
								 | 
							
												options.onFailedAttempt(error);
							 | 
						||
| 
								 | 
							
												reject(operation.mainError());
							 | 
						||
| 
								 | 
							
											}
							 | 
						||
| 
								 | 
							
										})
							 | 
						||
| 
								 | 
							
									);
							 | 
						||
| 
								 | 
							
								});
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								module.exports.AbortError = AbortError;
							 |