@bigfishtv/cockpit
Version:
75 lines (62 loc) • 3.35 kB
JavaScript
;
exports.__esModule = true;
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
*/
exports.default = function () {
var state = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : initialState;
var action = arguments[1];
switch (action.type) {
case _ActionTypes.ENABLE_IMAGE_REQUEST_QUEUE:
return _extends({}, state, { enabled: true });
case _ActionTypes.DISABLE_IMAGE_REQUEST_QUEUE:
return _extends({}, state, { enabled: false });
case _ActionTypes.REQUEST_GENERATED_IMAGE:
if (state.enabled) queue.push(_extends({}, action, { created: Date.now() }));else action.callback(action.url);
return _extends({}, state, { queue: queue });
case _ActionTypes.GENERATED_IMAGE_REQUEST_FULFILLED:
case _ActionTypes.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 });
};
var _ActionTypes = require('../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);