Skip to content

Commit b797ea6

Browse files
authored
[server] Broadcast workspace instance update to listeners WEB-597 (#18212)
* [server] Broadcast workspace instance update to listeners * retest
1 parent a095ddb commit b797ea6

File tree

1 file changed

+32
-1
lines changed

1 file changed

+32
-1
lines changed

components/server/src/messaging/redis-subscriber.ts

Lines changed: 32 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -25,10 +25,14 @@ import {
2525
updateSubscribersRegistered,
2626
} from "../prometheus-metrics";
2727
import { Redis } from "ioredis";
28+
import { WorkspaceDB } from "@gitpod/gitpod-db/lib";
2829

2930
@injectable()
3031
export class RedisSubscriber implements LocalMessageBroker {
31-
constructor(@inject(Redis) private readonly redis: Redis) {}
32+
constructor(
33+
@inject(Redis) private readonly redis: Redis,
34+
@inject(WorkspaceDB) private readonly workspaceDB: WorkspaceDB,
35+
) {}
3236

3337
protected workspaceInstanceUpdateListeners: Map<string, WorkspaceInstanceUpdateListener[]> = new Map();
3438

@@ -79,6 +83,33 @@ export class RedisSubscriber implements LocalMessageBroker {
7983

8084
private async onInstanceUpdate(update: RedisWorkspaceInstanceUpdate): Promise<void> {
8185
log.debug("[redis] Received instance update", { update });
86+
87+
if (!update.ownerID || !update.instanceID) {
88+
return;
89+
}
90+
91+
const listeners = this.workspaceInstanceUpdateListeners.get(update.ownerID) || [];
92+
if (listeners.length === 0) {
93+
return;
94+
}
95+
96+
const ctx = {};
97+
const instance = await this.workspaceDB.findInstanceById(update.instanceID);
98+
if (!instance) {
99+
return;
100+
}
101+
102+
for (const l of listeners) {
103+
try {
104+
l(ctx, instance);
105+
} catch (err) {
106+
log.error(
107+
{ userId: update.ownerID, instanceId: instance.id, workspaceId: update.workspaceID },
108+
"Failed to broadcast workspace instance update.",
109+
err,
110+
);
111+
}
112+
}
82113
}
83114

84115
async stop() {

0 commit comments

Comments
 (0)