Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
60 changes: 30 additions & 30 deletions apps/rush/src/RushFrontend.ts
Original file line number Diff line number Diff line change
Expand Up @@ -47,59 +47,59 @@ export interface IRushFrontendProcessLifecycle {
}

class RushFrontendReporterLifecycle {
private readonly _reporterHost: IInitializedRushReporterHost;
private readonly _processLifecycle: IRushFrontendProcessLifecycle;
private _disposeBeforeExit: (() => void) | undefined;
private readonly _disposeSignalHandlers: Array<() => void> = [];
private _closePromise: Promise<void> | undefined;
readonly #reporterHost: IInitializedRushReporterHost;
readonly #processLifecycle: IRushFrontendProcessLifecycle;
#disposeBeforeExit: (() => void) | undefined;
readonly #disposeSignalHandlers: Array<() => void> = [];
#closePromise: Promise<void> | undefined;

public constructor(
reporterHost: IInitializedRushReporterHost,
processLifecycle: IRushFrontendProcessLifecycle
) {
this._reporterHost = reporterHost;
this._processLifecycle = processLifecycle;
this.#reporterHost = reporterHost;
this.#processLifecycle = processLifecycle;
}

public start(): void {
this._disposeBeforeExit = this._processLifecycle.registerBeforeExit(() => {
this.#disposeBeforeExit = this.#processLifecycle.registerBeforeExit(() => {
void this.closeAsync().catch((error: Error) => {
this._processLifecycle.reportCloseError(error);
this._processLifecycle.setExitCode(1);
this.#processLifecycle.reportCloseError(error);
this.#processLifecycle.setExitCode(1);
});
});
for (const signal of ['SIGINT', 'SIGTERM'] as const) {
this._disposeSignalHandlers.push(
this._processLifecycle.registerSignal(signal, () => {
this._disposeSignals();
void this._closeForSignalAsync(signal);
this.#disposeSignalHandlers.push(
this.#processLifecycle.registerSignal(signal, () => {
this.#disposeSignals();
void this.#closeForSignalAsync(signal);
})
);
}
}

public closeAsync(timeoutMs?: number): Promise<void> {
if (!this._closePromise) {
this._closePromise = Promise.resolve()
.then(() => this._reporterHost.closeAsync(timeoutMs))
.finally(() => this._dispose());
if (!this.#closePromise) {
this.#closePromise = Promise.resolve()
.then(() => this.#reporterHost.closeAsync(timeoutMs))
.finally(() => this.#dispose());
}
return this._closePromise;
return this.#closePromise;
}

private _dispose(): void {
this._disposeBeforeExit?.();
this._disposeBeforeExit = undefined;
this._disposeSignals();
#dispose(): void {
this.#disposeBeforeExit?.();
this.#disposeBeforeExit = undefined;
this.#disposeSignals();
}

private _disposeSignals(): void {
for (const dispose of this._disposeSignalHandlers.splice(0)) {
#disposeSignals(): void {
for (const dispose of this.#disposeSignalHandlers.splice(0)) {
dispose();
}
}

private async _closeForSignalAsync(signal: RushTerminationSignal): Promise<void> {
async #closeForSignalAsync(signal: RushTerminationSignal): Promise<void> {
const closeResult: Promise<Error | undefined> = this.closeAsync(DEFAULT_SIGNAL_FLUSH_TIMEOUT_MS).then(
() => undefined,
(error: Error) => error
Expand All @@ -114,14 +114,14 @@ class RushFrontendReporterLifecycle {
clearTimeout(timeout);
}
if (result === 'deadline') {
this._processLifecycle.reportCloseError(
this.#processLifecycle.reportCloseError(
new Error(`Reporter close exceeded the ${DEFAULT_SIGNAL_FLUSH_TIMEOUT_MS}ms signal deadline.`)
);
} else if (result) {
this._processLifecycle.reportCloseError(result);
this.#processLifecycle.reportCloseError(result);
}
this._dispose();
this._processLifecycle.terminate(signal);
this.#dispose();
this.#processLifecycle.terminate(signal);
}
}

Expand Down
70 changes: 35 additions & 35 deletions apps/rush/src/RushReporterHost.ts
Original file line number Diff line number Diff line change
Expand Up @@ -90,42 +90,42 @@ interface IParsedReporterControls {
class LogLevelReporter implements IReporter {
public readonly name: string;

private readonly _reporter: IReporter;
private readonly _logLevel: ReporterLogLevel;
readonly #reporter: IReporter;
readonly #logLevel: ReporterLogLevel;

public constructor(reporter: IReporter, logLevel: ReporterLogLevel) {
this._reporter = reporter;
this._logLevel = logLevel;
this.#reporter = reporter;
this.#logLevel = logLevel;
this.name = reporter.name;
}

public initializeAsync(context: IReporterContext): Promise<void> {
return this._reporter.initializeAsync(context);
return this.#reporter.initializeAsync(context);
}

public report(event: IReporterEventEnvelope<unknown>): void {
if (shouldRenderAtLogLevel(this._logLevel, event)) {
this._reporter.report(event);
if (shouldRenderAtLogLevel(this.#logLevel, event)) {
this.#reporter.report(event);
}
}

public flushAsync(): Promise<void> {
return this._reporter.flushAsync();
return this.#reporter.flushAsync();
}

public closeAsync(): Promise<void> {
return this._reporter.closeAsync();
return this.#reporter.closeAsync();
}
}

class ExplicitOutputReporter implements IReporter {
public readonly name: string;

private readonly _reporter: JsonReporter;
private readonly _filteredReporter: LogLevelReporter;
private readonly _outputPath: string;
private readonly _outputStream: IRushReporterOutputStream | undefined;
private _fileDescriptor: number | undefined;
readonly #reporter: JsonReporter;
readonly #filteredReporter: LogLevelReporter;
readonly #outputPath: string;
readonly #outputStream: IRushReporterOutputStream | undefined;
#fileDescriptor: number | undefined;

public constructor(
reporterName: string,
Expand All @@ -134,49 +134,49 @@ class ExplicitOutputReporter implements IReporter {
outputStream?: IRushReporterOutputStream
) {
this.name = `${reporterName}-output`;
this._outputPath = outputPath;
this._outputStream = outputStream;
this._reporter = new JsonReporter({
this.#outputPath = outputPath;
this.#outputStream = outputStream;
this.#reporter = new JsonReporter({
write: (text: string) => {
if (this._outputStream) {
this._outputStream.write(text);
if (this.#outputStream) {
this.#outputStream.write(text);
return;
}
if (this._fileDescriptor === undefined) {
throw new Error(`Reporter output ${JSON.stringify(this._outputPath)} is not initialized.`);
if (this.#fileDescriptor === undefined) {
throw new Error(`Reporter output ${JSON.stringify(this.#outputPath)} is not initialized.`);
}
fs.writeSync(this._fileDescriptor, text);
fs.writeSync(this.#fileDescriptor, text);
}
});
this._filteredReporter = new LogLevelReporter(this._reporter, logLevel);
this.#filteredReporter = new LogLevelReporter(this.#reporter, logLevel);
}

public async initializeAsync(context: IReporterContext): Promise<void> {
if (!this._outputStream) {
await fs.promises.mkdir(path.dirname(this._outputPath), { recursive: true });
this._fileDescriptor = fs.openSync(this._outputPath, 'w', 0o600);
if (!this.#outputStream) {
await fs.promises.mkdir(path.dirname(this.#outputPath), { recursive: true });
this.#fileDescriptor = fs.openSync(this.#outputPath, 'w', 0o600);
}
await this._filteredReporter.initializeAsync(context);
await this.#filteredReporter.initializeAsync(context);
}

public report(event: IReporterEventEnvelope<unknown>): void {
this._filteredReporter.report(event);
this.#filteredReporter.report(event);
}

public async flushAsync(): Promise<void> {
await this._filteredReporter.flushAsync();
if (this._fileDescriptor !== undefined) {
fs.fsyncSync(this._fileDescriptor);
await this.#filteredReporter.flushAsync();
if (this.#fileDescriptor !== undefined) {
fs.fsyncSync(this.#fileDescriptor);
}
}

public async closeAsync(): Promise<void> {
try {
await this._filteredReporter.closeAsync();
await this.#filteredReporter.closeAsync();
} finally {
if (this._fileDescriptor !== undefined) {
fs.closeSync(this._fileDescriptor);
this._fileDescriptor = undefined;
if (this.#fileDescriptor !== undefined) {
fs.closeSync(this.#fileDescriptor);
this.#fileDescriptor = undefined;
}
}
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -5,16 +5,16 @@
// https://jestjs.io/docs/en/es6-class-mocks

export class SoundPlayer {
private _foo: string;
#foo: string;

public constructor() {
this._foo = 'bar';
this.#foo = 'bar';
}

public playSoundFile(fileName: string): void {
// eslint-disable-next-line no-console
console.log('Playing sound file ' + fileName);
// eslint-disable-next-line no-console
console.log('Foo=' + this._foo);
console.log('Foo=' + this.#foo);
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -7,13 +7,13 @@
import { SoundPlayer } from './SoundPlayer';

export class SoundPlayerConsumer {
private _soundPlayer: SoundPlayer;
#soundPlayer: SoundPlayer;
public constructor() {
this._soundPlayer = new SoundPlayer();
this.#soundPlayer = new SoundPlayer();
}

public playSomethingCool(): void {
const coolSoundFileName: string = 'song.mp3';
this._soundPlayer.playSoundFile(coolSoundFileName);
this.#soundPlayer.playSoundFile(coolSoundFileName);
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -5,16 +5,16 @@
// https://jestjs.io/docs/en/es6-class-mocks

export class SoundPlayer {
private _foo: string;
#foo: string;

public constructor() {
this._foo = 'bar';
this.#foo = 'bar';
}

public playSoundFile(fileName: string): void {
// eslint-disable-next-line no-console
console.log('Playing sound file ' + fileName);
// eslint-disable-next-line no-console
console.log('Foo=' + this._foo);
console.log('Foo=' + this.#foo);
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -7,13 +7,13 @@
import { SoundPlayer } from './SoundPlayer';

export class SoundPlayerConsumer {
private _soundPlayer: SoundPlayer;
#soundPlayer: SoundPlayer;
public constructor() {
this._soundPlayer = new SoundPlayer();
this.#soundPlayer = new SoundPlayer();
}

public playSomethingCool(): void {
const coolSoundFileName: string = 'song.mp3';
this._soundPlayer.playSoundFile(coolSoundFileName);
this.#soundPlayer.playSoundFile(coolSoundFileName);
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -31,7 +31,7 @@ export class ExampleApp extends React.Component {
// React event handlers should be represented as fields instead of methods to ensure the "this" pointer
// is bound correctly. This form does not work with virtual/override inheritance, so use regular methods
// everywhere else.
private _onToggle = (sender: ToggleSwitch, args: IToggleEventArgs): void => {
protected _onToggle = (sender: ToggleSwitch, args: IToggleEventArgs): void => {
// eslint-disable-next-line no-console
console.log('Toggle switch changed: ' + args.sliderPosition);
};
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -91,7 +91,7 @@ export class ToggleSwitch extends React.Component<IToggleSwitchProps, IToggleSwi
// React event handlers should be represented as fields instead of methods to ensure the "this" pointer
// is bound correctly. This form does not work with virtual/override inheritance, so use regular methods
// everywhere else.
private _onClickSlider = (event: React.MouseEvent): void => {
protected _onClickSlider = (event: React.MouseEvent): void => {
if (this.state.sliderPosition === ToggleSwitchPosition.Left) {
this.setState({ sliderPosition: ToggleSwitchPosition.Right });
} else {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -22,7 +22,7 @@ export class ExampleApp extends React.Component {
<div style={appStyle}>
<h2>Hello, world!</h2>
Here is an example control:
<ToggleSwitch leftColor={'#800000'} rightColor={'#008000'} onToggle={this._onToggle} />
<ToggleSwitch leftColor={'#800000'} rightColor={'#008000'} onToggle={this.#onToggle} />
</div>
</div>
);
Expand All @@ -31,7 +31,7 @@ export class ExampleApp extends React.Component {
// React event handlers should be represented as fields instead of methods to ensure the "this" pointer
// is bound correctly. This form does not work with virtual/override inheritance, so use regular methods
// everywhere else.
private _onToggle = (sender: ToggleSwitch, args: IToggleEventArgs): void => {
#onToggle = (sender: ToggleSwitch, args: IToggleEventArgs): void => {
// eslint-disable-next-line no-console
console.log('Toggle switch changed: ' + args.sliderPosition);
};
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -82,7 +82,7 @@ export class ToggleSwitch extends React.Component<IToggleSwitchProps, IToggleSwi
}

return (
<div style={frameStyle} onClick={this._onClickSlider}>
<div style={frameStyle} onClick={this.#onClickSlider}>
<div style={sliderStyle} />
</div>
);
Expand All @@ -91,7 +91,7 @@ export class ToggleSwitch extends React.Component<IToggleSwitchProps, IToggleSwi
// React event handlers should be represented as fields instead of methods to ensure the "this" pointer
// is bound correctly. This form does not work with virtual/override inheritance, so use regular methods
// everywhere else.
private _onClickSlider = (event: React.MouseEvent): void => {
#onClickSlider = (event: React.MouseEvent): void => {
if (this.state.sliderPosition === ToggleSwitchPosition.Left) {
this.setState({ sliderPosition: ToggleSwitchPosition.Right });
} else {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -34,7 +34,7 @@ export class ExampleApp extends React.Component {
// React event handlers should be represented as fields instead of methods to ensure the "this" pointer
// is bound correctly. This form does not work with virtual/override inheritance, so use regular methods
// everywhere else.
private _onToggle = (sender: ToggleSwitch, args: IToggleEventArgs): void => {
protected _onToggle = (sender: ToggleSwitch, args: IToggleEventArgs): void => {
// eslint-disable-next-line no-console
console.log('Toggle switch changed: ' + args.sliderPosition);
};
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -98,7 +98,7 @@ export class ToggleSwitch extends React.Component<IToggleSwitchProps, IToggleSwi
// React event handlers should be represented as fields instead of methods to ensure the "this" pointer
// is bound correctly. This form does not work with virtual/override inheritance, so use regular methods
// everywhere else.
private _onClickSlider = (event: React.MouseEvent): void => {
protected _onClickSlider = (event: React.MouseEvent): void => {
if (this.state.sliderPosition === ToggleSwitchPosition.Left) {
this.setState({ sliderPosition: ToggleSwitchPosition.Right });
} else {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -31,7 +31,7 @@ export class ExampleApp extends React.Component {
// React event handlers should be represented as fields instead of methods to ensure the "this" pointer
// is bound correctly. This form does not work with virtual/override inheritance, so use regular methods
// everywhere else.
private _onToggle = (sender: ToggleSwitch, args: IToggleEventArgs): void => {
protected _onToggle = (sender: ToggleSwitch, args: IToggleEventArgs): void => {
// eslint-disable-next-line no-console
console.log('Toggle switch changed: ' + args.sliderPosition);
};
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -91,7 +91,7 @@ export class ToggleSwitch extends React.Component<IToggleSwitchProps, IToggleSwi
// React event handlers should be represented as fields instead of methods to ensure the "this" pointer
// is bound correctly. This form does not work with virtual/override inheritance, so use regular methods
// everywhere else.
private _onClickSlider = (event: React.MouseEvent): void => {
protected _onClickSlider = (event: React.MouseEvent): void => {
if (this.state.sliderPosition === ToggleSwitchPosition.Left) {
this.setState({ sliderPosition: ToggleSwitchPosition.Right });
} else {
Expand Down
Loading