Skip to content

Commit 116b8d7

Browse files
committed
Stack multiple web socket events
1 parent 2a2f35a commit 116b8d7

File tree

4 files changed

+41
-33
lines changed

4 files changed

+41
-33
lines changed

site/src/@types/storybook.d.ts

Lines changed: 2 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -3,15 +3,11 @@ import type { QueryKey } from "react-query";
33
import type { Experiments, FeatureName } from "api/typesGenerated";
44

55
declare module "@storybook/react" {
6+
type WebSocketEvent = { event: "message"; data: string } | { event: "error" };
67
interface Parameters {
78
features?: FeatureName[];
89
experiments?: Experiments;
910
queries?: { key: QueryKey; data: unknown }[];
10-
webSocket?:
11-
| {
12-
event: "message";
13-
messages: string[];
14-
}
15-
| { event: "error" };
11+
webSocket?: WebSocketEvent[];
1612
}
1713
}

site/src/pages/CreateTemplatePage/BuildLogsDrawer.stories.tsx

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -46,9 +46,9 @@ export const Logs: Story = {
4646
},
4747
decorators: [withWebSocket],
4848
parameters: {
49-
webSocket: {
49+
webSocket: MockWorkspaceBuildLogs.map((log) => ({
5050
event: "message",
51-
messages: MockWorkspaceBuildLogs.map((log) => JSON.stringify(log)),
52-
},
51+
data: JSON.stringify(log),
52+
})),
5353
},
5454
};

site/src/pages/TerminalPage/TerminalPage.stories.tsx

Lines changed: 12 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -87,13 +87,13 @@ export const OnMessage: Story = {
8787
decorators: [withWebSocket],
8888
parameters: {
8989
...meta.parameters,
90-
webSocket: {
91-
event: "message",
92-
// Copied and pasted this from browser
93-
messages: [
94-
`[H[2J[1m[32m➜ [36mcoder[C[34mgit:([31mbq/refactor-web-term-notifications[34m) [33m✗`,
95-
],
96-
},
90+
webSocket: [
91+
{
92+
event: "message",
93+
// Copied and pasted this from browser
94+
data: `[H[2J[1m[32m➜ [36mcoder[C[34mgit:([31mbq/refactor-web-term-notifications[34m) [33m✗`,
95+
},
96+
],
9797
queries: [...meta.parameters.queries, readyWorkspaceQuery],
9898
},
9999
};
@@ -102,9 +102,11 @@ export const OnError: Story = {
102102
decorators: [withWebSocket],
103103
parameters: {
104104
...meta.parameters,
105-
webSocket: {
106-
event: "error",
107-
},
105+
webSocket: [
106+
{
107+
event: "error",
108+
},
109+
],
108110
queries: [...meta.parameters.queries, readyWorkspaceQuery],
109111
},
110112
};

site/src/testHelpers/storybook.tsx

Lines changed: 24 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -45,29 +45,39 @@ export const withDashboardProvider = (
4545
);
4646
};
4747

48+
type MessageEvent = Record<"data", string>;
49+
type CallbackFn = (ev?: MessageEvent) => void;
50+
4851
export const withWebSocket = (Story: FC, { parameters }: StoryContext) => {
49-
const webSocketConfig = parameters.webSocket;
52+
const events = parameters.webSocket;
5053

51-
if (!webSocketConfig) {
54+
if (!events) {
5255
console.warn("Your forgot to add the `parameters.webSocket` to your story");
5356
return <Story />;
5457
}
5558

59+
const listeners = new Map<string, CallbackFn>();
60+
let callEventsDelay: number;
61+
5662
// @ts-expect-error -- TS doesn't know about the global WebSocket
5763
window.WebSocket = function () {
5864
return {
59-
addEventListener: (
60-
type: string,
61-
callback: (ev?: Record<"data", string>) => void,
62-
) => {
63-
if (type === "message" && webSocketConfig.event === "message") {
64-
webSocketConfig.messages.forEach((message) => {
65-
callback({ data: message });
66-
});
67-
}
68-
if (type === "error" && webSocketConfig.event === "error") {
69-
callback();
70-
}
65+
addEventListener: (type: string, callback: CallbackFn) => {
66+
listeners.set(type, callback);
67+
68+
// Runs when the last event listener is added
69+
clearTimeout(callEventsDelay);
70+
callEventsDelay = window.setTimeout(() => {
71+
for (const entry of events) {
72+
const callback = listeners.get(entry.event);
73+
74+
if (callback) {
75+
entry.event === "message"
76+
? callback({ data: entry.data })
77+
: callback();
78+
}
79+
}
80+
}, 0);
7181
},
7282
close: () => {},
7383
};

0 commit comments

Comments
 (0)