Book a Demo!
CoCalc Logo Icon
StoreFeaturesDocsShareSupportNewsAboutPoliciesSign UpSign In
gitpod-io
GitHub Repository: gitpod-io/gitpod
Path: blob/main/components/dashboard/src/service/json-rpc-prebuild-client.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
7
import { PartialMessage } from "@bufbuild/protobuf";
8
import { CallOptions, PromiseClient } from "@connectrpc/connect";
9
import { PrebuildService } from "@gitpod/public-api/lib/gitpod/v1/prebuild_connect";
10
import {
11
StartPrebuildRequest,
12
GetPrebuildRequest,
13
ListPrebuildsRequest,
14
WatchPrebuildRequest,
15
StartPrebuildResponse,
16
GetPrebuildResponse,
17
ListPrebuildsResponse,
18
WatchPrebuildResponse,
19
CancelPrebuildRequest,
20
CancelPrebuildResponse,
21
ListOrganizationPrebuildsRequest,
22
ListOrganizationPrebuildsResponse,
23
} from "@gitpod/public-api/lib/gitpod/v1/prebuild_pb";
24
import { getGitpodService } from "./service";
25
import { converter } from "./public-api";
26
import { PrebuildWithStatus } from "@gitpod/gitpod-protocol";
27
import { generateAsyncGenerator } from "@gitpod/gitpod-protocol/lib/generate-async-generator";
28
import { ApplicationError, ErrorCodes } from "@gitpod/gitpod-protocol/lib/messaging/error";
29
30
export class JsonRpcPrebuildClient implements PromiseClient<typeof PrebuildService> {
31
async startPrebuild(
32
request: PartialMessage<StartPrebuildRequest>,
33
options?: CallOptions,
34
): Promise<StartPrebuildResponse> {
35
if (!request.configurationId) {
36
throw new ApplicationError(ErrorCodes.BAD_REQUEST, "configurationId is required");
37
}
38
const result = await getGitpodService().server.triggerPrebuild(request.configurationId, request.gitRef || null);
39
return new StartPrebuildResponse({
40
prebuildId: result.prebuildId,
41
});
42
}
43
44
async cancelPrebuild(
45
request: PartialMessage<CancelPrebuildRequest>,
46
options?: CallOptions,
47
): Promise<CancelPrebuildResponse> {
48
const response = await this.getPrebuild(request, options);
49
await getGitpodService().server.cancelPrebuild(response.prebuild!.configurationId, response.prebuild!.id);
50
return new CancelPrebuildResponse();
51
}
52
53
get gitpodHost(): string {
54
return window.location.protocol + "//" + window.location.host;
55
}
56
57
async getPrebuild(
58
request: PartialMessage<GetPrebuildRequest>,
59
options?: CallOptions,
60
): Promise<GetPrebuildResponse> {
61
if (!request.prebuildId) {
62
throw new ApplicationError(ErrorCodes.BAD_REQUEST, "prebuildId is required");
63
}
64
const result = await getGitpodService().server.getPrebuild(request.prebuildId);
65
if (!result) {
66
throw new ApplicationError(ErrorCodes.NOT_FOUND, `prebuild ${request.prebuildId} not found`);
67
}
68
return new GetPrebuildResponse({
69
prebuild: converter.toPrebuild(this.gitpodHost, result),
70
});
71
}
72
73
async listPrebuilds(
74
request: PartialMessage<ListPrebuildsRequest>,
75
options?: CallOptions,
76
): Promise<ListPrebuildsResponse> {
77
if (request.workspaceId) {
78
const pbws = await getGitpodService().server.findPrebuildByWorkspaceID(request.workspaceId);
79
if (pbws) {
80
const prebuild = await getGitpodService().server.getPrebuild(pbws.id);
81
if (prebuild) {
82
return new ListPrebuildsResponse({
83
prebuilds: [converter.toPrebuild(this.gitpodHost, prebuild)],
84
});
85
}
86
}
87
return new ListPrebuildsResponse({
88
prebuilds: [],
89
});
90
}
91
if (!request.configurationId) {
92
throw new ApplicationError(ErrorCodes.BAD_REQUEST, "configurationId is required");
93
}
94
const result = await getGitpodService().server.findPrebuilds({
95
projectId: request.configurationId,
96
branch: request.gitRef || undefined,
97
limit: request.pagination?.pageSize || undefined,
98
});
99
return new ListPrebuildsResponse({
100
prebuilds: converter.toPrebuilds(this.gitpodHost, result),
101
});
102
}
103
104
async *watchPrebuild(
105
request: PartialMessage<WatchPrebuildRequest>,
106
options?: CallOptions,
107
): AsyncIterable<WatchPrebuildResponse> {
108
if (!options?.signal) {
109
throw new ApplicationError(ErrorCodes.BAD_REQUEST, "signal is required");
110
}
111
if (!request.scope?.value) {
112
throw new ApplicationError(ErrorCodes.BAD_REQUEST, "scope is required");
113
}
114
if (request.scope.case === "prebuildId") {
115
const prebuild = await this.getPrebuild({ prebuildId: request.scope.value }, options);
116
yield new WatchPrebuildResponse({
117
prebuild: prebuild.prebuild,
118
});
119
}
120
const it = generateAsyncGenerator<PrebuildWithStatus>(
121
(queue) => {
122
try {
123
const dispose = getGitpodService().registerClient({
124
onPrebuildUpdate: (prebuild) => {
125
queue.push(prebuild);
126
},
127
});
128
return () => {
129
dispose.dispose();
130
};
131
} catch (e) {
132
queue.fail(e);
133
}
134
},
135
{ signal: options.signal },
136
);
137
for await (const pb of it) {
138
if (request.scope.case === "prebuildId") {
139
if (pb.info.id !== request.scope.value) {
140
continue;
141
}
142
} else if (pb.info.projectId !== request.scope.value) {
143
continue;
144
}
145
const prebuild = converter.toPrebuild(this.gitpodHost, pb);
146
if (prebuild) {
147
yield new WatchPrebuildResponse({ prebuild });
148
}
149
}
150
}
151
152
async listOrganizationPrebuilds(
153
request: PartialMessage<ListOrganizationPrebuildsRequest>,
154
): Promise<ListOrganizationPrebuildsResponse> {
155
throw new ApplicationError(ErrorCodes.UNIMPLEMENTED, "Not implemented (for jrpc)");
156
}
157
}
158
159