Skip to content

Commit c44a37a

Browse files
committed
Fix mockttp admin stream monitoring and actively restart on disconnection
This isn't great, but it's better than the current result where the app effectively breaks silently, and then crashes and resets your rules whenever any rule change is saved.
1 parent 479571d commit c44a37a

File tree

2 files changed

+18
-3
lines changed

2 files changed

+18
-3
lines changed

src/model/proxy-store.ts

Lines changed: 17 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -37,6 +37,7 @@ import { lazyObservablePromise } from '../util/observable';
3737
import { persist, hydrate } from '../util/mobx-persist/persist';
3838
import { isValidPort } from './network';
3939
import { serverVersion } from '../services/service-versions';
40+
import { DesktopApi } from '../services/desktop-api';
4041

4142
type HtkAdminClient =
4243
// WebRTC is only supported for new servers:
@@ -224,16 +225,29 @@ export class ProxyStore {
224225
});
225226

226227
private monitorRemoteClientConnection(client: PluggableAdmin.AdminClient<{}>) {
227-
client.on('admin-client:stream-error', (err) => {
228+
client.on('stream-error', (err) => {
228229
console.log('Admin client stream error');
229230
logError(err.message ? err : new Error('Client stream error'), { cause: err });
230231
});
231-
client.on('admin-client:subscription-error', (err) => {
232+
client.on('subscription-error', (err) => {
232233
console.log('Admin client subscription error');
233234
logError(err.message ? err : new Error('Client subscription error'), { cause: err });
234235
});
235-
client.on('admin-client:stream-reconnect-failed', (err) => {
236+
client.on('stream-reconnect-failed', (err) => {
236237
logError(err.message ? err : new Error('Client reconnect error'), { cause: err });
238+
239+
alert("Server disconnected unexpectedly, app restart required.\n\nPlease report this at github.com/httptoolkit/httptoolkit.");
240+
setTimeout(() => { // Tiny wait for any other UI events to fire (error reporting/logging/other UI responsiveness)
241+
if (DesktopApi.restartApp) {
242+
// Where possible (recent desktop release) we restart the whole app directly
243+
DesktopApi.restartApp();
244+
} else if (!navigator.platform?.startsWith('Mac')) {
245+
// If not, on Windows & Linux we just close the window (which restarts)
246+
window.close();
247+
}
248+
// On Mac, app exit is independent from window exit, so we can't force that here,
249+
// but hopefully this alert will lead the user to do so themselves.
250+
}, 10);
237251
});
238252
}
239253

src/services/desktop-api.ts

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -30,6 +30,7 @@ declare global {
3030
interface DesktopApi {
3131
selectApplication?: () => Promise<string | undefined>;
3232
openContextMenu?: (options: NativeContextMenuDefinition) => Promise<string | undefined>;
33+
restartApp?: () => Promise<void>;
3334
}
3435

3536
interface NativeContextMenuDefinition {

0 commit comments

Comments
 (0)