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.
		
		
		
		
		
			
		
			
				
					56 lines
				
				1.1 KiB
			
		
		
			
		
	
	
					56 lines
				
				1.1 KiB
			| 
											3 years ago
										 | 'use strict'; | ||
|  | 
 | ||
|  | /** | ||
|  |  * Calculate data maxRate | ||
|  |  * @param {Number} [samplesCount= 10] | ||
|  |  * @param {Number} [min= 1000] | ||
|  |  * @returns {Function} | ||
|  |  */ | ||
|  | function speedometer(samplesCount, min) { | ||
|  |   samplesCount = samplesCount || 10; | ||
|  |   const bytes = new Array(samplesCount); | ||
|  |   const timestamps = new Array(samplesCount); | ||
|  |   let head = 0; | ||
|  |   let tail = 0; | ||
|  |   let firstSampleTS; | ||
|  | 
 | ||
|  |   min = min !== undefined ? min : 1000; | ||
|  | 
 | ||
|  |   return function push(chunkLength) { | ||
|  |     const now = Date.now(); | ||
|  | 
 | ||
|  |     const startedAt = timestamps[tail]; | ||
|  | 
 | ||
|  |     if (!firstSampleTS) { | ||
|  |       firstSampleTS = now; | ||
|  |     } | ||
|  | 
 | ||
|  |     bytes[head] = chunkLength; | ||
|  |     timestamps[head] = now; | ||
|  | 
 | ||
|  |     let i = tail; | ||
|  |     let bytesCount = 0; | ||
|  | 
 | ||
|  |     while (i !== head) { | ||
|  |       bytesCount += bytes[i++]; | ||
|  |       i = i % samplesCount; | ||
|  |     } | ||
|  | 
 | ||
|  |     head = (head + 1) % samplesCount; | ||
|  | 
 | ||
|  |     if (head === tail) { | ||
|  |       tail = (tail + 1) % samplesCount; | ||
|  |     } | ||
|  | 
 | ||
|  |     if (now - firstSampleTS < min) { | ||
|  |       return; | ||
|  |     } | ||
|  | 
 | ||
|  |     const passed = startedAt && now - startedAt; | ||
|  | 
 | ||
|  |     return passed ? Math.round(bytesCount * 1000 / passed) : undefined; | ||
|  |   }; | ||
|  | } | ||
|  | 
 | ||
|  | export default speedometer; |