summaryrefslogtreecommitdiff
path: root/ui/lib/runs.js
diff options
context:
space:
mode:
authorOwen Jacobson <owen@grimoire.ca>2025-03-23 14:33:07 -0400
committerOwen Jacobson <owen@grimoire.ca>2025-03-23 14:33:07 -0400
commit876472299d67f8fe3a789b7777b9d8ee44297b23 (patch)
treedb62f5d1e15d871f8a73ce20b40cd53053d12f85 /ui/lib/runs.js
parentfa0f653f141efee3f5a01e1fa696d29140ec12c2 (diff)
parentf788ea84e25a4f7216ca0604aeb216346403b6ef (diff)
Merge branch 'prop/restartable-state'
Diffstat (limited to 'ui/lib/runs.js')
-rw-r--r--ui/lib/runs.js25
1 files changed, 25 insertions, 0 deletions
diff --git a/ui/lib/runs.js b/ui/lib/runs.js
new file mode 100644
index 0000000..f4e90be
--- /dev/null
+++ b/ui/lib/runs.js
@@ -0,0 +1,25 @@
+import * as iter from './iterator.js';
+
+const RUN_COALESCE_MAX_INTERVAL = 10 /* min */ * 60 /* sec */ * 1000; /* ms */
+
+export function runs(messages, self) {
+ const bareRuns = iter.chunkBy(messages, runKey, continueRun);
+ return iter.map(bareRuns, (run) => summarizeRun(self, run));
+}
+
+function summarizeRun(self, { key, chunk }) {
+ const [sender, at] = key;
+ return {
+ sender: sender.name,
+ ownMessage: sender.id === self.id,
+ messages: chunk
+ };
+}
+
+function runKey(message) {
+ return [message.sender, message.at];
+}
+
+function continueRun([lastSender, lastAt], [newSender, newAt]) {
+ return lastSender === newSender && newAt - lastAt < RUN_COALESCE_MAX_INTERVAL;
+}