@bigfishtv/cockpit
Version:
73 lines (61 loc) • 2.86 kB
JavaScript
var _extends = Object.assign || function (target) { for (var i = 1; i < arguments.length; i++) { var source = arguments[i]; for (var key in source) { if (Object.prototype.hasOwnProperty.call(source, key)) { target[key] = source[key]; } } } return target; };
/**
* @module Reducers/imageRequestQueue
*/
import { ENABLE_IMAGE_REQUEST_QUEUE, DISABLE_IMAGE_REQUEST_QUEUE, REQUEST_GENERATED_IMAGE, CANCEL_GENERATED_IMAGE_REQUEST, GENERATED_IMAGE_REQUEST_FULFILLED } from '../constants/ActionTypes';
var MAX_ACTIVE_REQUESTS = 25;
var IMAGE_REQUEST_QUEUE_INTERVAL = 50; // ms
var IMAGE_REQUEST_INITIAL_DELAY = 250; // ms
var IMAGE_REQUEST_TIMEOUT = 5000; // ms
var initialState = { queue: [], enabled: false };
var queue = [];
var pendingAssets = 0;
var processQueue = function processQueue() {
if (!queue.length) return;
// filter out unresolved requests older than 5 seconds
var prePurgeCount = queue.length;
queue = queue.filter(function (_ref) {
var created = _ref.created;
return Date.now() - created < IMAGE_REQUEST_TIMEOUT;
});
var purgeCount = prePurgeCount - queue.length;
pendingAssets -= purgeCount;
// if (purgeCount) console.log('Purged ' + purgeCount + ' requests from the queue')
// Recheck queue length after oldie purge
if (!queue.length) return;
// Active requests at max, leave it for a tick
if (pendingAssets > MAX_ACTIVE_REQUESTS) return;
// Check if request is too young to be considered yet
var actionAge = Date.now() - queue[0].created;
if (actionAge < IMAGE_REQUEST_INITIAL_DELAY) return;
var action = queue.shift();
if (action.callback) {
// console.log('🏁 allowing this asset', action.key)
action.callback(action.url);
pendingAssets++;
}
};
setInterval(processQueue, IMAGE_REQUEST_QUEUE_INTERVAL);
export default function () {
var state = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : initialState;
var action = arguments[1];
switch (action.type) {
case ENABLE_IMAGE_REQUEST_QUEUE:
return _extends({}, state, { enabled: true });
case DISABLE_IMAGE_REQUEST_QUEUE:
return _extends({}, state, { enabled: false });
case REQUEST_GENERATED_IMAGE:
if (state.enabled) queue.push(_extends({}, action, { created: Date.now() }));else action.callback(action.url);
return _extends({}, state, { queue: queue });
case GENERATED_IMAGE_REQUEST_FULFILLED:
case CANCEL_GENERATED_IMAGE_REQUEST:
// if (action.type === GENERATED_IMAGE_REQUEST_FULFILLED) console.log('✅ asset request completed', action.key)
// if (action.type === CANCEL_GENERATED_IMAGE_REQUEST) console.log('🗑 cancel loading of this asset', action.key)
pendingAssets--;
if (state.enabled) queue = queue.filter(function (item) {
return item.callback !== action.callback;
});
return _extends({}, state, { queue: queue });
}
return _extends({}, state, { queue: queue });
}