()
| 1229 | |
| 1230 | let idleEventPromise = undefined |
| 1231 | function continueTasks() { |
| 1232 | if (typeof navigator?.scheduling?.isInputPending === "function") { |
| 1233 | const inputPendingOptions = { |
| 1234 | // Report mouse/pointer move events when queue is empty. |
| 1235 | // Delay idle after mouse moves stops. |
| 1236 | includeContinuous: Boolean(task_queue.size <= 0 && concurrent_generators.size <= 0), |
| 1237 | } |
| 1238 | if (navigator.scheduling.isInputPending(inputPendingOptions)) { |
| 1239 | // Browser/User still active. |
| 1240 | return asyncDelay(CONCURRENT_TASK_INTERVAL) |
| 1241 | } |
| 1242 | } |
| 1243 | const serverCapacity = getServerCapacity() |
| 1244 | if (task_queue.size <= 0 && concurrent_generators.size <= 0) { |
| 1245 | if (!idleEventPromise?.isPending) { |
| 1246 | idleEventPromise = makeQuerablePromise( |
| 1247 | eventSource.fireEvent(EVENT_IDLE, { capacity: serverCapacity, idle: true }) |
| 1248 | ) |
| 1249 | } |
| 1250 | // Calling idle could result in task being added to queue. |
| 1251 | // if (task_queue.size <= 0 && concurrent_generators.size <= 0) { |
| 1252 | // return asyncDelay(IDLE_COOLDOWN).then(() => idleEventPromise) |
| 1253 | // } |
| 1254 | } |
| 1255 | if (task_queue.size < serverCapacity) { |
| 1256 | if (!idleEventPromise?.isPending) { |
| 1257 | idleEventPromise = makeQuerablePromise( |
| 1258 | eventSource.fireEvent(EVENT_IDLE, { capacity: serverCapacity - task_queue.size }) |
| 1259 | ) |
| 1260 | } |
| 1261 | } |
| 1262 | const completedTasks = [] |
| 1263 | for (let [generator, promise] of concurrent_generators.entries()) { |
| 1264 | if (promise.isPending) { |
| 1265 | continue |
| 1266 | } |
| 1267 | let value = promise.resolvedValue?.value || promise.resolvedValue |
| 1268 | if (promise.isRejected) { |
| 1269 | console.error(promise.rejectReason) |
| 1270 | const event = { generator, reason: promise.rejectReason } |
| 1271 | eventSource.fireEvent(EVENT_UNHANDLED_REJECTION, event) |
| 1272 | if ("continueWith" in event) { |
| 1273 | value = Promise.resolve(event.continueWith) |
| 1274 | } else { |
| 1275 | concurrent_generators.delete(generator) |
| 1276 | completedTasks.push({ generator, promise }) |
| 1277 | continue |
| 1278 | } |
| 1279 | } |
| 1280 | if (value instanceof Promise) { |
| 1281 | promise = makeQuerablePromise(value.then((val) => ({ done: promise.resolvedValue?.done, value: val }))) |
| 1282 | concurrent_generators.set(generator, promise) |
| 1283 | continue |
| 1284 | } |
| 1285 | weak_results.set(generator, value) |
| 1286 | if (promise.resolvedValue?.done) { |
| 1287 | concurrent_generators.delete(generator) |
| 1288 | completedTasks.push({ generator, promise }) |
no test coverage detected