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