Path: blob/main/components/supervisor/frontend/src/ide/ide-frontend-service-impl.ts
2501 views
/**1* Copyright (c) 2020 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 { IDEFrontendService, IDEFrontendState } from "@gitpod/gitpod-protocol/lib/ide-frontend-service";7import { Disposable, DisposableCollection } from "@gitpod/gitpod-protocol/lib/util/disposable";8import { Emitter } from "@gitpod/gitpod-protocol/lib/util/event";910interface IDEFrontendCapabilities {11/**12* Controls whether IDE window can provide the IDE frontend service.13*/14readonly service?: boolean;15}1617let state: IDEFrontendState = "init";18window.addEventListener(19"beforeunload",20(e) => {21if (state === "terminated") {22// workspace is stopping or stopped avoid to prompt a user with confirmation dialogs23e.stopImmediatePropagation();24}25},26{ capture: true },27);2829export function create(): IDEFrontendService {30let failureCause: Error | undefined;31let capabilities: IDEFrontendCapabilities = { service: false };32const onDidChangeEmitter = new Emitter<void>();33let _delegate: IDEFrontendService | undefined;34const toStop = new DisposableCollection();35toStop.push(onDidChangeEmitter);36const doStart = () => {37if (!_delegate || state !== "ready") {38return;39}40try {41toStop.push(_delegate.start());42} catch (e) {43console.error("supervisor frontend: IDE frontend start failed:", e);44failureCause = e;45state = "terminated";46onDidChangeEmitter.fire();47}48};49const service: IDEFrontendService = {50get state() {51if (state === "terminated") {52return "terminated";53}54if (capabilities.service) {55return _delegate?.state || "init";56}57return state;58},59get failureCause() {60return _delegate?.failureCause || failureCause;61},62onDidChange: onDidChangeEmitter.event,63start: () => {64if (state === "terminated") {65throw new Error("IDE frontend has been stopped");66}67state = "ready";68toStop.push(69Disposable.create(() => {70state = "terminated";71onDidChangeEmitter.fire();72}),73);74doStart();75return toStop;76},77};78const capabilitiesElementAttribute = document79.getElementById("gitpod-ide-capabilities")80?.getAttribute("data-settings");81capabilities = (capabilitiesElementAttribute && JSON.parse(capabilitiesElementAttribute)) || capabilities;82Object.defineProperty(window.gitpod, "ideService", {83get() {84return _delegate;85},86set(delegate: IDEFrontendService) {87if (_delegate) {88console.error(new Error("ideService is already set"));89return;90}91_delegate = delegate;92doStart();93onDidChangeEmitter.fire();94delegate.onDidChange(() => onDidChangeEmitter.fire());95},96});97return service;98}99100101