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
66 changes: 6 additions & 60 deletions src/extension/commands/networkInspector.ts
Original file line number Diff line number Diff line change
Expand Up @@ -3,32 +3,20 @@

import assert = require("assert");
import * as nls from "vscode-nls";
import * as vscode from "vscode";
import { ErrorHelper } from "../../common/error/errorHelper";
import { InternalErrorCode } from "../../common/error/internalErrorCode";
import { AdbHelper } from "../android/adb";
import { AndroidDeviceTracker } from "../android/androidDeviceTracker";
import { IOSDeviceTracker } from "../ios/iOSDeviceTracker";
import { OutputChannelLogger } from "../log/OutputChannelLogger";
import { NetworkInspectorServer } from "../networkInspector/networkInspectorServer";
import { CONTEXT_VARIABLES_NAMES } from "../../common/contextVariablesNames";
import { InspectorViewFactory } from "../networkInspector/views/inspectorViewFactory";
import { Command } from "./util/command";
import { NetworkInspectorManager } from "./networkInspectorManager";

nls.config({
messageFormat: nls.MessageFormat.bundle,
bundleFormat: nls.BundleFormat.standalone,
})();
const localize = nls.loadMessageBundle();

interface NetworkInspectorModule {
networkInspector: NetworkInspectorServer;
androidDeviceTracker: AndroidDeviceTracker;
iOSDeviceTracker: IOSDeviceTracker | undefined;
}

// #todo!> commands should not maintain state
let networkInspectorModule: NetworkInspectorModule | undefined;
// Singleton instance of the Network Inspector Manager
const inspectorManager = new NetworkInspectorManager();

export class StartNetworkInspector extends Command {
codeName = "startNetworkInspector";
Expand All @@ -41,7 +29,7 @@ export class StartNetworkInspector extends Command {

const logger = OutputChannelLogger.getMainChannel();

if (networkInspectorModule) {
if (inspectorManager.isRunning()) {
logger.info(
localize(
"AnotherNetworkInspectorAlreadyRun",
Expand All @@ -51,36 +39,7 @@ export class StartNetworkInspector extends Command {
return;
}

const adbHelper = new AdbHelper(
this.project.getPackager().getProjectPath(),
this.project.getOrUpdateNodeModulesRoot(),
);
const networkInspector = new NetworkInspectorServer();
const androidDeviceTracker = new AndroidDeviceTracker(adbHelper);
const iOSDeviceTracker =
(process.platform === "darwin" && new IOSDeviceTracker()) || undefined;

networkInspectorModule = {
networkInspector,
androidDeviceTracker,
iOSDeviceTracker,
};

try {
if (iOSDeviceTracker) {
await iOSDeviceTracker.start();
}
await androidDeviceTracker.start();
await networkInspector.start(adbHelper);
void vscode.commands.executeCommand(
"setContext",
CONTEXT_VARIABLES_NAMES.IS_RNT_NETWORK_INSPECTOR_RUNNING,
true,
);
} catch (err) {
await stopNetworkInspector();
throw err;
}
await inspectorManager.start(this.project);
}
}

Expand All @@ -91,19 +50,6 @@ export class StopNetworkInspector extends Command {
error = ErrorHelper.getInternalError(InternalErrorCode.CouldNotStopNetworkInspector);

async baseFn(): Promise<void> {
await stopNetworkInspector();
await inspectorManager.stop();
}
}

async function stopNetworkInspector() {
networkInspectorModule?.androidDeviceTracker?.stop();
networkInspectorModule?.iOSDeviceTracker?.stop();
await networkInspectorModule?.networkInspector?.stop();
networkInspectorModule = undefined;
InspectorViewFactory.clearCache();
void vscode.commands.executeCommand(
"setContext",
CONTEXT_VARIABLES_NAMES.IS_RNT_NETWORK_INSPECTOR_RUNNING,
false,
);
}
96 changes: 96 additions & 0 deletions src/extension/commands/networkInspectorManager.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,96 @@
// Copyright (c) Microsoft Corporation. All rights reserved.
// Licensed under the MIT license. See LICENSE file in the project root for details.

import * as vscode from "vscode";
import { AdbHelper } from "../android/adb";
import { AndroidDeviceTracker } from "../android/androidDeviceTracker";
import { IOSDeviceTracker } from "../ios/iOSDeviceTracker";
import { NetworkInspectorServer } from "../networkInspector/networkInspectorServer";
import { CONTEXT_VARIABLES_NAMES } from "../../common/contextVariablesNames";
import { InspectorViewFactory } from "../networkInspector/views/inspectorViewFactory";
import { AppLauncher } from "../appLauncher";

interface NetworkInspectorModule {
networkInspector: NetworkInspectorServer;
androidDeviceTracker: AndroidDeviceTracker;
iOSDeviceTracker: IOSDeviceTracker | undefined;
}

/**
* Manages the lifecycle of Network Inspector module.
* Responsible for starting, stopping, and tracking the state of network inspection.
*/
export class NetworkInspectorManager {
private networkInspectorModule: NetworkInspectorModule | undefined;

/**
* Starts the Network Inspector module.
* @param project The app launcher project
* @throws Error if Network Inspector is already running
*/
async start(project: AppLauncher): Promise<void> {
if (this.networkInspectorModule) {
throw new Error("Network Inspector is already running");
}

const adbHelper = new AdbHelper(
project.getPackager().getProjectPath(),
project.getOrUpdateNodeModulesRoot(),
);
const networkInspector = new NetworkInspectorServer();
const androidDeviceTracker = new AndroidDeviceTracker(adbHelper);
const iOSDeviceTracker =
(process.platform === "darwin" && new IOSDeviceTracker()) || undefined;

this.networkInspectorModule = {
networkInspector,
androidDeviceTracker,
iOSDeviceTracker,
};

try {
if (iOSDeviceTracker) {
await iOSDeviceTracker.start();
}
await androidDeviceTracker.start();
await networkInspector.start(adbHelper);
void vscode.commands.executeCommand(
"setContext",
CONTEXT_VARIABLES_NAMES.IS_RNT_NETWORK_INSPECTOR_RUNNING,
true,
);
} catch (err) {
await this.stop();
throw err;
}
}

/**
* Stops the Network Inspector module and cleans up resources.
*/
async stop(): Promise<void> {
if (!this.networkInspectorModule) {
return;
}

this.networkInspectorModule.androidDeviceTracker?.stop();
this.networkInspectorModule.iOSDeviceTracker?.stop();
await this.networkInspectorModule.networkInspector?.stop();
this.networkInspectorModule = undefined;
InspectorViewFactory.clearCache();

void vscode.commands.executeCommand(
"setContext",
CONTEXT_VARIABLES_NAMES.IS_RNT_NETWORK_INSPECTOR_RUNNING,
false,
);
}

/**
* Checks if the Network Inspector module is currently running.
* @returns true if running, false otherwise
*/
isRunning(): boolean {
return !!this.networkInspectorModule;
}
}
Loading