UNPKG

@bigfishtv/cockpit

Version:

75 lines (62 loc) 3.35 kB
'use strict'; 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);