Book a Demo!
CoCalc Logo Icon
StoreFeaturesDocsShareSupportNewsAboutPoliciesSign UpSign In
gitpod-io
GitHub Repository: gitpod-io/gitpod
Path: blob/main/components/gitpod-db/src/redis/publisher.ts
2500 views
1
/**
2
* Copyright (c) 2023 Gitpod GmbH. All rights reserved.
3
* Licensed under the GNU Affero General Public License (AGPL).
4
* See License.AGPL.txt in the project root for license information.
5
*/
6
import "reflect-metadata";
7
8
import { inject, injectable } from "inversify";
9
import { log } from "@gitpod/gitpod-protocol/lib/util/logging";
10
import {
11
HeadlessUpdatesChannel,
12
PrebuildUpdatesChannel,
13
RedisHeadlessUpdate,
14
RedisPrebuildUpdate,
15
RedisWorkspaceInstanceUpdate,
16
WorkspaceInstanceUpdatesChannel,
17
} from "@gitpod/gitpod-protocol";
18
import { Redis } from "ioredis";
19
import { reportUpdatePublished } from "./metrics";
20
21
@injectable()
22
export class RedisPublisher {
23
constructor(@inject(Redis) private readonly redis: Redis) {}
24
25
async publishPrebuildUpdate(update: RedisPrebuildUpdate): Promise<void> {
26
log.debug("[redis] Publish prebuild update invoked.");
27
28
let err: Error | undefined;
29
try {
30
const serialized = JSON.stringify(update);
31
await this.redis.publish(PrebuildUpdatesChannel, serialized);
32
log.debug("[redis] Successfully published prebuild update.", update);
33
} catch (e) {
34
err = e;
35
log.error("[redis] Failed to publish prebuild update.", e, update);
36
} finally {
37
reportUpdatePublished("prebuild", err);
38
}
39
}
40
41
async publishInstanceUpdate(update: RedisWorkspaceInstanceUpdate): Promise<void> {
42
let err: Error | undefined;
43
try {
44
const serialized = JSON.stringify(update);
45
await this.redis.publish(WorkspaceInstanceUpdatesChannel, serialized);
46
log.debug("[redis] Successfully published instance update.", update);
47
} catch (e) {
48
err = e;
49
log.error("[redis] Failed to publish instance update.", e, update);
50
} finally {
51
reportUpdatePublished("workspace-instance", err);
52
}
53
}
54
55
async publishHeadlessUpdate(update: RedisHeadlessUpdate): Promise<void> {
56
log.debug("[redis] Publish headless update invoked.");
57
58
let err: Error | undefined;
59
try {
60
const serialized = JSON.stringify(update);
61
await this.redis.publish(HeadlessUpdatesChannel, serialized);
62
log.debug("[redis] Successfully published headless update.", update);
63
} catch (e) {
64
err = e;
65
log.error("[redis] Failed to publish headless update.", e, update);
66
} finally {
67
reportUpdatePublished("headless", err);
68
}
69
}
70
}
71
72