Skip to content

Commit 25f0710

Browse files
committed
fix: flush events when exiting cli-repl
1 parent 95d93a5 commit 25f0710

File tree

4 files changed

+28
-4
lines changed

4 files changed

+28
-4
lines changed

packages/cli-repl/src/cli-repl.spec.ts

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1695,6 +1695,7 @@ describe('CliRepl', function () {
16951695
cliRepl,
16961696
await testServer.connectionString()
16971697
);
1698+
16981699
expect(
16991700
requests
17001701
.flatMap((req) =>

packages/cli-repl/src/cli-repl.ts

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1194,6 +1194,7 @@ export class CliRepl implements MongoshIOProvider {
11941194
}
11951195
);
11961196
await this.logWriter?.flush();
1197+
11971198
markTime(TimingCategories.Logging, 'flushed log writer');
11981199
this.bus.emit('mongosh:closed');
11991200
})());
@@ -1206,11 +1207,14 @@ export class CliRepl implements MongoshIOProvider {
12061207
* @param code The user-provided exit code, if any.
12071208
*/
12081209
async exit(code?: number): Promise<never> {
1210+
this.loggingAndTelemetry?.flush();
1211+
12091212
await this.close();
12101213
await this.onExit(code);
12111214
// onExit never returns. If it does, that's a bug.
12121215
const error = new MongoshInternalError('onExit() unexpectedly returned');
12131216
this.bus.emit('mongosh:error', error, 'fatal');
1217+
12141218
throw error;
12151219
}
12161220

packages/logging/src/logging-and-telemetry.ts

Lines changed: 21 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -113,6 +113,9 @@ export class LoggingAndTelemetry implements MongoshLoggingAndTelemetry {
113113
/** @internal */
114114
public setupTelemetryPromise: Promise<void> = Promise.resolve();
115115

116+
// eslint-disable-next-line @typescript-eslint/no-empty-function
117+
private resolveDeviceId: (value: string) => void = () => {};
118+
116119
constructor({
117120
bus,
118121
analytics,
@@ -132,7 +135,6 @@ export class LoggingAndTelemetry implements MongoshLoggingAndTelemetry {
132135
if (this.isSetup) {
133136
throw new Error('Setup can only be called once.');
134137
}
135-
this.isBufferingBusEvents = true;
136138
this.isBufferingTelemetryEvents = true;
137139

138140
this.setupTelemetryPromise = this.setupTelemetry();
@@ -141,10 +143,25 @@ export class LoggingAndTelemetry implements MongoshLoggingAndTelemetry {
141143
this.isSetup = true;
142144
}
143145

146+
public flush(): void {
147+
// Run any telemetry events even if device ID hasn't been resolved yet
148+
this.runAndClearPendingTelemetryEvents();
149+
150+
// Run any other pending events with the set or dummy log for telemetry purposes.
151+
this.runAndClearPendingBusEvents();
152+
153+
this.resolveDeviceId('unknown');
154+
}
155+
144156
private async setupTelemetry(): Promise<void> {
145157
if (!this.deviceId) {
146158
try {
147-
this.deviceId ??= await getDeviceId();
159+
this.deviceId ??= await Promise.race([
160+
getDeviceId(),
161+
new Promise<string>((resolve) => {
162+
this.resolveDeviceId = resolve;
163+
}),
164+
]);
148165
} catch (error) {
149166
this.bus.emit('mongosh:error', error as Error, 'telemetry');
150167
this.deviceId = 'unknown';
@@ -173,8 +190,8 @@ export class LoggingAndTelemetry implements MongoshLoggingAndTelemetry {
173190

174191
public detachLogger() {
175192
this.log = LoggingAndTelemetry.dummyLogger;
176-
// Still run any remaining pending events with the dummy log for telemetry purposes.
177-
this.runAndClearPendingBusEvents();
193+
194+
this.flush();
178195
}
179196

180197
private runAndClearPendingBusEvents() {

packages/logging/src/types.ts

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,8 @@ import type { MultiSet } from './helpers';
66
export interface MongoshLoggingAndTelemetry {
77
attachLogger(logger: MongoLogWriter): void;
88
detachLogger(): void;
9+
/** Flush any remaining log or telemetry events. */
10+
flush(): void;
911
}
1012

1113
export type MongoshLoggingAndTelemetryArguments = {

0 commit comments

Comments
 (0)