@sussudio/platform
Version:
Internal APIs for VS Code's service injection the base services.
199 lines (197 loc) • 7.37 kB
text/typescript
/*---------------------------------------------------------------------------------------------
* Copyright (c) Microsoft Corporation. All rights reserved.
* Licensed under the MIT License. See License.txt in the project root for license information.
*--------------------------------------------------------------------------------------------*/
import { Event } from '@sussudio/base/common/event.mjs';
import { Disposable } from '@sussudio/base/common/lifecycle.mjs';
import { NativeParsedArgs } from '../../environment/common/argv.mjs';
import { ILogService } from '../../log/common/log.mjs';
import { IStateMainService } from '../../state/electron-main/state.mjs';
import { ICodeWindow, LoadReason, UnloadReason } from '../../window/electron-main/window.mjs';
import { ISingleFolderWorkspaceIdentifier, IWorkspaceIdentifier } from '../../workspace/common/workspace.mjs';
import { IEnvironmentMainService } from '../../environment/electron-main/environmentMainService.mjs';
export declare const ILifecycleMainService: import('../../instantiation/common/instantiation.mjs').ServiceIdentifier<ILifecycleMainService>;
interface WindowLoadEvent {
/**
* The window that is loaded to a new workspace.
*/
readonly window: ICodeWindow;
/**
* The workspace the window is loaded into.
*/
readonly workspace: IWorkspaceIdentifier | ISingleFolderWorkspaceIdentifier | undefined;
/**
* More details why the window loads to a new workspace.
*/
readonly reason: LoadReason;
}
export declare const enum ShutdownReason {
/**
* The application exits normally.
*/
QUIT = 1,
/**
* The application exits abnormally and is being
* killed with an exit code (e.g. from integration
* test run)
*/
KILL = 2,
}
export interface ShutdownEvent {
/**
* More details why the application is shutting down.
*/
reason: ShutdownReason;
/**
* Allows to join the shutdown. The promise can be a long running operation but it
* will block the application from closing.
*/
join(promise: Promise<void>): void;
}
export interface ILifecycleMainService {
readonly _serviceBrand: undefined;
/**
* Will be true if the program was restarted (e.g. due to explicit request or update).
*/
readonly wasRestarted: boolean;
/**
* Will be true if the program was requested to quit.
*/
readonly quitRequested: boolean;
/**
* A flag indicating in what phase of the lifecycle we currently are.
*/
phase: LifecycleMainPhase;
/**
* An event that fires when the application is about to shutdown before any window is closed.
* The shutdown can still be prevented by any window that vetos this event.
*/
readonly onBeforeShutdown: Event<void>;
/**
* An event that fires after the onBeforeShutdown event has been fired and after no window has
* vetoed the shutdown sequence. At this point listeners are ensured that the application will
* quit without veto.
*/
readonly onWillShutdown: Event<ShutdownEvent>;
/**
* An event that fires when a window is loading. This can either be a window opening for the
* first time or a window reloading or changing to another URL.
*/
readonly onWillLoadWindow: Event<WindowLoadEvent>;
/**
* An event that fires before a window closes. This event is fired after any veto has been dealt
* with so that listeners know for sure that the window will close without veto.
*/
readonly onBeforeCloseWindow: Event<ICodeWindow>;
/**
* Make a `ICodeWindow` known to the lifecycle main service.
*/
registerWindow(window: ICodeWindow): void;
/**
* Reload a window. All lifecycle event handlers are triggered.
*/
reload(window: ICodeWindow, cli?: NativeParsedArgs): Promise<void>;
/**
* Unload a window for the provided reason. All lifecycle event handlers are triggered.
*/
unload(window: ICodeWindow, reason: UnloadReason): Promise<boolean>;
/**
* Restart the application with optional arguments (CLI). All lifecycle event handlers are triggered.
*/
relaunch(options?: { addArgs?: string[]; removeArgs?: string[] }): Promise<void>;
/**
* Shutdown the application normally. All lifecycle event handlers are triggered.
*/
quit(willRestart?: boolean): Promise<boolean>;
/**
* Forcefully shutdown the application and optionally set an exit code.
*
* This method should only be used in rare situations where it is important
* to set an exit code (e.g. running tests) or when the application is
* not in a healthy state and should terminate asap.
*
* This method does not fire the normal lifecycle events to the windows,
* that normally can be vetoed. Windows are destroyed without a chance
* of components to participate. The only lifecycle event handler that
* is triggered is `onWillShutdown` in the main process.
*/
kill(code?: number): Promise<void>;
/**
* Returns a promise that resolves when a certain lifecycle phase
* has started.
*/
when(phase: LifecycleMainPhase): Promise<void>;
}
export declare const enum LifecycleMainPhase {
/**
* The first phase signals that we are about to startup.
*/
Starting = 1,
/**
* Services are ready and first window is about to open.
*/
Ready = 2,
/**
* This phase signals a point in time after the window has opened
* and is typically the best place to do work that is not required
* for the window to open.
*/
AfterWindowOpen = 3,
/**
* The last phase after a window has opened and some time has passed
* (2-5 seconds).
*/
Eventually = 4,
}
export declare class LifecycleMainService extends Disposable implements ILifecycleMainService {
private readonly logService;
private readonly stateMainService;
private readonly environmentMainService;
readonly _serviceBrand: undefined;
private static readonly QUIT_AND_RESTART_KEY;
private readonly _onBeforeShutdown;
readonly onBeforeShutdown: Event<void>;
private readonly _onWillShutdown;
readonly onWillShutdown: Event<ShutdownEvent>;
private readonly _onWillLoadWindow;
readonly onWillLoadWindow: Event<WindowLoadEvent>;
private readonly _onBeforeCloseWindow;
readonly onBeforeCloseWindow: Event<ICodeWindow>;
private _quitRequested;
get quitRequested(): boolean;
private _wasRestarted;
get wasRestarted(): boolean;
private _phase;
get phase(): LifecycleMainPhase;
private readonly windowToCloseRequest;
private oneTimeListenerTokenGenerator;
private windowCounter;
private pendingQuitPromise;
private pendingQuitPromiseResolve;
private pendingWillShutdownPromise;
private readonly mapWindowIdToPendingUnload;
private readonly phaseWhen;
constructor(
logService: ILogService,
stateMainService: IStateMainService,
environmentMainService: IEnvironmentMainService,
);
private resolveRestarted;
private registerListeners;
private fireOnWillShutdown;
set phase(value: LifecycleMainPhase);
when(phase: LifecycleMainPhase): Promise<void>;
registerWindow(window: ICodeWindow): void;
reload(window: ICodeWindow, cli?: NativeParsedArgs): Promise<void>;
unload(window: ICodeWindow, reason: UnloadReason): Promise<boolean>;
private doUnload;
private handleWindowUnloadVeto;
private resolvePendingQuitPromise;
private onBeforeUnloadWindowInRenderer;
private onWillUnloadWindowInRenderer;
quit(willRestart?: boolean): Promise<boolean>;
private trace;
relaunch(options?: { addArgs?: string[]; removeArgs?: string[] }): Promise<void>;
kill(code?: number): Promise<void>;
}
export {};