Skip to content

Commit 26df86b

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

File tree

4 files changed

+29
-4
lines changed

4 files changed

+29
-4
lines changed

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

+1
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

+4
Original file line numberDiff line numberDiff line change
@@ -1172,6 +1172,8 @@ export class CliRepl implements MongoshIOProvider {
11721172
const analytics = this.toggleableAnalytics;
11731173
let flushError: string | null = null;
11741174
let flushDuration: number | null = null;
1175+
this.loggingAndTelemetry?.flush();
1176+
11751177
if (analytics) {
11761178
const flushStart = Date.now();
11771179
try {
@@ -1194,6 +1196,7 @@ export class CliRepl implements MongoshIOProvider {
11941196
}
11951197
);
11961198
await this.logWriter?.flush();
1199+
11971200
markTime(TimingCategories.Logging, 'flushed log writer');
11981201
this.bus.emit('mongosh:closed');
11991202
})());
@@ -1211,6 +1214,7 @@ export class CliRepl implements MongoshIOProvider {
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

+22-4
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,19 +135,34 @@ 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;
139+
this.isBufferingBusEvents = true;
137140

138141
this.setupTelemetryPromise = this.setupTelemetry();
139142
this.setupBusEventListeners();
140143

141144
this.isSetup = true;
142145
}
143146

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

174192
public detachLogger() {
175193
this.log = LoggingAndTelemetry.dummyLogger;
176-
// Still run any remaining pending events with the dummy log for telemetry purposes.
177-
this.runAndClearPendingBusEvents();
194+
195+
this.flush();
178196
}
179197

180198
private runAndClearPendingBusEvents() {

packages/logging/src/types.ts

+2
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)