@difizen/mana-core
Version:
70 lines (58 loc) • 1.92 kB
text/typescript
import type { Event } from '@difizen/mana-common';
import { Emitter, Deferred } from '@difizen/mana-common';
import { prop } from '@difizen/mana-observable';
import { inject, singleton } from '@difizen/mana-syringe';
import { DebugService } from '../common/debug';
export enum ApplicationState {
Default = 'Default',
Initialized = 'Initialized',
Started = 'Started',
ViewStarted = 'ViewStarted',
Ready = 'Ready',
Closing = 'Closing',
}
()
export class ApplicationStateService {
()
state: ApplicationState = ApplicationState.Default;
protected readonly debugService: DebugService;
constructor(
(DebugService)
debugService: DebugService,
) {
this.debugService = debugService;
}
protected deferred: Record<string, Deferred<void>> = {};
protected readonly stateChanged = new Emitter<ApplicationState>();
setState(state: ApplicationState) {
if (state !== this.state) {
const oldState = this.state;
const oldDeferred = this.getStateDeferred(oldState);
oldDeferred.resolve();
const deferred = this.getStateDeferred(state);
this.state = state;
deferred.resolve();
this.deferred[state].resolve();
this.debugService(
`Changed application state from '${oldState}' to '${this.state}'.`,
);
}
}
get onStateChanged(): Event<ApplicationState> {
return this.stateChanged.event;
}
protected getStateDeferred(state: ApplicationState): Deferred<void> {
let deferred = this.deferred[state];
if (deferred === undefined) {
deferred = new Deferred();
this.deferred[state] = deferred;
}
return deferred;
}
reachedState(state: ApplicationState): Promise<void> {
return this.getStateDeferred(state).promise;
}
reachedAnyState(...states: ApplicationState[]): Promise<void> {
return Promise.race(states.map((s) => this.reachedState(s)));
}
}