<div dir="ltr"><p style="margin-top:0px;font-family:Helvetica,Arial,sans-serif;font-size:14px"><strong>Core Problem Statement</strong> Processor functions that subscribe to events via a topic string may need to be prioritized for processing based on the topic itself. Conversely, certain events may be more numerous but should not limit the ability of the JS environment to respond and process other events, that may be more critical to either the User Experience (UX) or integrity of the system (e.g. events that trigger saving data to a back-end).</p><p style="font-family:Helvetica,Arial,sans-serif;font-size:14px"><strong>Background Information</strong> As Browser/CommonJS environments bring paradigms like UI event handling and back-end event handling into the same problem space, it is useful to apply common patterns used in Message-based Publish-Subscribe environments with message brokers, which is what the JS execution context often behaves as. The use case here is to ensure that one kind of event (e.g. event listeners for a ‘mouseMove’ event) don’t saturate or delay execution of other events (e.g. ‘dataAvailableForAutosave’) due to massive differences in event volume or conversely, expensive operations that block the execution thread in question.</p><p style="font-family:Helvetica,Arial,sans-serif;font-size:14px"><strong>Proposed Solution</strong> Add metering options to the <code style="font-family:Consolas,Menlo,Monaco,"Lucida Console","Liberation Mono","DejaVu Sans Mono","Bitstream Vera Sans Mono","Courier New",monospace;font-size:1em;color:rgb(51,51,51);background:rgb(248,248,248)">addEventListener</code> <strong>Options</strong> <wbr>configuration object. These options control how the JS execution environment controls the throttling/firing of event handler instances in response to events that match the topic string of the subscription created by <code style="font-family:Consolas,Menlo,Monaco,"Lucida Console","Liberation Mono","DejaVu Sans Mono","Bitstream Vera Sans Mono","Courier New",monospace;font-size:1em;color:rgb(51,51,51);background:rgb(248,248,248)">addEventListener</code>.</p><p style="font-family:Helvetica,Arial,sans-serif;font-size:14px">Proposed options:</p><ul style="margin:0px;padding:0px 0px 0px 40px;clear:both;font-family:Helvetica,Arial,sans-serif;font-size:14px"><li style="margin-left:15px"><code style="font-family:Consolas,Menlo,Monaco,"Lucida Console","Liberation Mono","DejaVu Sans Mono","Bitstream Vera Sans Mono","Courier New",monospace;font-size:1em;color:rgb(51,51,51);background:rgb(248,248,248)">maxInstances</code> [Number / Function] used to decide how many event listeners can be invoked before throttling occurs. Throttling does not lose events but simply queues them.</li><li style="margin-left:15px"><code style="font-family:Consolas,Menlo,Monaco,"Lucida Console","Liberation Mono","DejaVu Sans Mono","Bitstream Vera Sans Mono","Courier New",monospace;font-size:1em;color:rgb(51,51,51);background:rgb(248,248,248)">throttlingQueueLength</code> [Number] used to maintain an in-memory queue of un-processed events per Topic string, after throttling kicks in.</li><li style="margin-left:15px"><code style="font-family:Consolas,Menlo,Monaco,"Lucida Console","Liberation Mono","DejaVu Sans Mono","Bitstream Vera Sans Mono","Courier New",monospace;font-size:1em;color:rgb(51,51,51);background:rgb(248,248,248)">throttlingQueuePolicy</code> [String] Values could be <code style="font-family:Consolas,Menlo,Monaco,"Lucida Console","Liberation Mono","DejaVu Sans Mono","Bitstream Vera Sans Mono","Courier New",monospace;font-size:1em;color:rgb(51,51,51);background:rgb(248,248,248)">exception</code> - throws an exception when the queue length is exceeded, <code style="font-family:Consolas,Menlo,Monaco,"Lucida Console","Liberation Mono","DejaVu Sans Mono","Bitstream Vera Sans Mono","Courier New",monospace;font-size:1em;color:rgb(51,51,51);background:rgb(248,248,248)">rolling</code> - drops the oldest events and pushes newer ones into the queue, <code style="font-family:Consolas,Menlo,Monaco,"Lucida Console","Liberation Mono","DejaVu Sans Mono","Bitstream Vera Sans Mono","Courier New",monospace;font-size:1em;color:rgb(51,51,51);background:rgb(248,248,248)">expand</code>- allow the queue to expand to cover all events.</li></ul><p style="font-family:Helvetica,Arial,sans-serif;font-size:14px"><strong>Additional Options</strong> It might be even more useful if the options allowed targeting or creation of Web Workers (or Node child processes, depending on the execution context) based on the event handler configuration. This could potentially target CPU cores and/or O/S child processes / threads (depending on the O/S terminology for parallel execution).</p><p style="font-family:Helvetica,Arial,sans-serif;font-size:14px"><strong>Related Thread</strong> The proposal identified in the link below (by <span style="background-color:rgba(255,255,255,0.85);font-size:1.071em;white-space:nowrap">Šime Vidas)</span> could be part of this solution as it defines other metering options around debounce (which improves scale around event handling, which is in the same problem space) and handling throttling through frequency, which should be one of the alternatives in addition to my proposal above (as I believe they are orthogonal): <a href="https://discourse.wicg.io/t/add-event-throttling-and-debouncing-to-addeventlisteneroptions/2436/19" target="_blank" style="background:transparent;color:rgb(0,136,204);text-decoration-line:none;word-wrap:break-word">https://<wbr>discourse.wicg.io/t/add-event-<wbr>throttling-and-debouncing-to-<wbr>addeventlisteneroptions/2436/<wbr>19</a></p><p style="font-family:Helvetica,Arial,sans-serif;font-size:14px">Sai Prakash<br>@SylonZero</p></div>