Skip to content

chore: add support for one-way WebSockets to UI #16855

New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Merged
merged 24 commits into from
Mar 28, 2025
Merged
Changes from 1 commit
Commits
Show all changes
24 commits
Select commit Hold shift + click to select a range
b8cfe76
feat: add support for one-way websockets to UI
Parkreiner Mar 7, 2025
367906d
fix: apply formatting
Parkreiner Mar 7, 2025
09f5e95
docs: remove outdated comment
Parkreiner Mar 7, 2025
04a3846
fix: add missing clear call
Parkreiner Mar 7, 2025
ca8e94f
fix: streamline biome fixes
Parkreiner Mar 7, 2025
81a723a
fix: resolve Storybook metadata setup bug
Parkreiner Mar 12, 2025
4364a3d
docs: make warning more obvious
Parkreiner Mar 12, 2025
ecb2940
fix: beef up socket retry logic
Parkreiner Mar 12, 2025
bfe4d9f
fix: make it harder to initialize OWWS
Parkreiner Mar 12, 2025
6cdfc21
fix: apply feedback
Parkreiner Mar 12, 2025
682e2f4
fix: update JSDoc
Parkreiner Mar 12, 2025
20ad778
Merge branch 'main' into mes/one-way-ws-02
Parkreiner Mar 18, 2025
9b19ceb
chore: add missing socket unit tests
Parkreiner Mar 18, 2025
423910f
fix: update notifications code to use OWWS
Parkreiner Mar 18, 2025
247dbb6
Merge branch 'mes/one-way-ws-01' into mes/one-way-ws-02
Parkreiner Mar 18, 2025
6e3e0d8
fix: remove comment about what to test
Parkreiner Mar 18, 2025
c422379
fix: make class fields readonly
Parkreiner Mar 19, 2025
0824dd4
fix: sort imports
Parkreiner Mar 19, 2025
db448d7
Merge branch 'mes/one-way-ws-01' into mes/one-way-ws-02
Parkreiner Mar 19, 2025
60bf505
Merge branch 'mes/one-way-ws-01' into mes/one-way-ws-02
Parkreiner Mar 25, 2025
c1cee57
refactor: make tests more maintainable
Parkreiner Mar 25, 2025
70b74e2
fix: remove unused type alias
Parkreiner Mar 25, 2025
8e34e91
fix: make mock publisher more robust
Parkreiner Mar 25, 2025
8db068a
Merge branch 'mes/one-way-ws-01' into mes/one-way-ws-02
Parkreiner Mar 28, 2025
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Prev Previous commit
Next Next commit
fix: beef up socket retry logic
  • Loading branch information
Parkreiner committed Mar 12, 2025
commit ecb29401b5f9547031fa84d49b0b25b2fccb949a
29 changes: 16 additions & 13 deletions site/src/modules/resources/AgentMetadata.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -64,35 +64,38 @@ export const AgentMetadata: FC<AgentMetadataProps> = ({
}

let timeoutId: number | undefined = undefined;
let latestSocket: OneWayWebSocket | undefined = undefined;
let activeSocket: OneWayWebSocket | undefined = undefined;
let retries = 0;

const createNewConnection = () => {
Copy link
Member Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

The previous create function was super weird because it was responsible for three things

  • Creating a new WebSocket connection from the outside effect
  • Being able to create new connections by calling itself recursively
  • Also acting as a useEffect cleanup function

Figured it'd be better to split up those responsibilities

const socket = watchAgentMetadata(agent.id);
latestSocket = socket;
activeSocket = socket;

socket.addEventListener("error", () => {
setActiveMetadata(undefined);
window.clearTimeout(timeoutId);

// The error event is supposed to fire when an error happens
// with the connection itself, which implies that the connection
// would auto-close. Couldn't find a definitive answer on MDN,
// though, so closing it manually just to be safe
socket.close();
activeSocket = undefined;

retries++;
if (retries < maxSocketErrorRetryCount) {
if (retries >= maxSocketErrorRetryCount) {
displayError(
"Unexpected disconnect while watching Metadata changes. Creating new connection...",
"Unexpected disconnect while watching Metadata changes. Please try refreshing the page.",
);
timeoutId = window.setTimeout(() => {
createNewConnection();
}, 3_000);
return;
}

displayError(
"Unexpected disconnect while watching Metadata changes. Cannot connect to server",
"Unexpected disconnect while watching Metadata changes. Creating new connection...",
);
// The socket should already be closed by this point, but doing
// this just to be thorough
socket.close();
latestSocket = undefined;
timeoutId = window.setTimeout(() => {
createNewConnection();
}, 3_000);
});

socket.addEventListener("message", (e) => {
Expand All @@ -112,7 +115,7 @@ export const AgentMetadata: FC<AgentMetadataProps> = ({
createNewConnection();
return () => {
window.clearTimeout(timeoutId);
latestSocket?.close();
activeSocket?.close();
};
}, [agent.id, storybookMetadata]);

Expand Down
Loading