diff --git a/soloncode-cli/src/main/java/org/noear/solon/codecli/portal/desktop/DesktopStreamHub.java b/soloncode-cli/src/main/java/org/noear/solon/codecli/portal/desktop/DesktopStreamHub.java new file mode 100644 index 0000000000000000000000000000000000000000..af158149ce411e524a3fe031898eac01144f4f16 --- /dev/null +++ b/soloncode-cli/src/main/java/org/noear/solon/codecli/portal/desktop/DesktopStreamHub.java @@ -0,0 +1,174 @@ +/* + * Copyright 2017-2026 noear.org and authors + * + * Licensed under the Apache License, Version 2.0 (the "License"); + */ +package org.noear.solon.codecli.portal.desktop; + +import org.noear.snack4.ONode; +import org.noear.solon.net.websocket.WebSocket; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + +import java.util.ArrayDeque; +import java.util.ArrayList; +import java.util.HashSet; +import java.util.List; +import java.util.Map; +import java.util.Set; +import java.util.concurrent.ConcurrentHashMap; + +/** + * 桌面端流式消息中转站。 + * + *
Agent 运行不再绑定首次建立的 WebSocket。每个会话保留一个有界增量缓冲区, + * 新连接可以从最后确认的 sequence 继续回放,再无缝接收实时消息。
+ */ +final class DesktopStreamHub { + private static final Logger LOG = LoggerFactory.getLogger(DesktopStreamHub.class); + private static final int MAX_REPLAY_MESSAGES = 4096; + private static final long COMPLETED_TTL_MILLIS = 5 * 60 * 1000L; + + private final Map