[go: nahoru, domu]

Skip to content

Commit

Permalink
Implement stream issues from emulator (#7123)
Browse files Browse the repository at this point in the history
  • Loading branch information
hlshen committed May 7, 2024
1 parent c80f5a8 commit 652b0d0
Show file tree
Hide file tree
Showing 4 changed files with 144 additions and 10 deletions.
8 changes: 3 additions & 5 deletions firebase-vscode/src/core/emulators.ts
Original file line number Diff line number Diff line change
Expand Up @@ -15,6 +15,7 @@ import {
} from "../../common/messaging/protocol";
import { firebaseRC } from "./config";
import { EmulatorUiSelections } from "../messaging/types";
import { emulatorOutputChannel } from "../data-connect/emulator-stream";

export class EmulatorsController implements Disposable {
constructor(private broker: ExtensionBrokerImpl) {
Expand Down Expand Up @@ -108,9 +109,6 @@ export class EmulatorsController implements Disposable {
this.stopEmulators.bind(this)
);

readonly outputChannel =
vscode.window.createOutputChannel("Firebase Emulators");

// TODO(christhompson): Load UI selections from the current workspace.
// Requires context object.
readonly uiSelections = signal(DEFAULT_EMULATOR_UI_SELECTIONS);
Expand Down Expand Up @@ -206,7 +204,7 @@ export class EmulatorsController implements Disposable {
);

dataConnectEmulatorDetails.instance.stdout?.on("data", (data) => {
this.outputChannel.appendLine("DEBUG: " + data.toString());
emulatorOutputChannel.appendLine("DEBUG: " + data.toString());
});
dataConnectEmulatorDetails.instance.stderr?.on("data", (data) => {
if (data.toString().includes("Finished reloading")) {
Expand All @@ -215,7 +213,7 @@ export class EmulatorsController implements Disposable {
"firebase.dataConnect.executeIntrospection"
);
} else {
this.outputChannel.appendLine("ERROR: " + data.toString());
emulatorOutputChannel.appendLine("ERROR: " + data.toString());
}
});
}
Expand Down
9 changes: 5 additions & 4 deletions firebase-vscode/src/data-connect/core-compiler.ts
Original file line number Diff line number Diff line change
Expand Up @@ -95,14 +95,14 @@ export async function getCompilerStream(
"Content-Type": "application/json",
"x-mantle-admin": "all",
},
}
)
},
),
);

function fromStream(
stream: NodeJS.ReadableStream,
finishEventName = "end",
dataEventName = "data"
dataEventName = "data",
): Observable<CompilerResponse> {
stream.pause();

Expand Down Expand Up @@ -133,7 +133,8 @@ export async function getCompilerStream(
});
}
return fromStream(resp.body!);
} catch {
} catch (err) {
console.log("Stream failed to connect with error: ", err);
return of({});
}
}
134 changes: 134 additions & 0 deletions firebase-vscode/src/data-connect/emulator-stream.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,134 @@
import * as vscode from "vscode";
import fetch from "node-fetch";
import { Observable, of } from "rxjs";
import { backOff } from "exponential-backoff";
import { ResolvedDataConnectConfigs } from "./config";

enum Kind {
KIND_UNSPECIFIED = "KIND_UNSPECIFIED",
SQL_CONNECTION = "SQL_CONNECTION",
SQL_MIGRATION = "SQL_MIGRATION",
VERTEX_AI = "VERTEX_AI",
}
enum Severity {
SEVERITY_UNSPECIFIED = "SEVERITY_UNSPECIFIED",
DEBUG = "DEBUG",
NOTICE = "NOTICE",
ALERT = "ALERT",
}
interface EmulatorIssue {
kind: Kind;
severity: Severity;
message: string;
}

type EmulatorIssueResponse = { result?: { issues?: EmulatorIssue[] } };

export const emulatorOutputChannel =
vscode.window.createOutputChannel("Firebase Emulators");

/**
*
* @param fdcEndpoint FDC Emulator endpoint
*/
export async function runEmulatorIssuesStream(
configs: ResolvedDataConnectConfigs,
fdcEndpoint: string,
) {
const obsErrors = await getEmulatorIssuesStream(configs, fdcEndpoint);
const obsConverter = {
next(nextCompilerResponse: CompilerResponse) {
if (nextCompilerResponse.result?.issues?.length) {
for (const issue of nextCompilerResponse.result.issues) {
displayIssue(issue);
}
}
},
error(e: Error) {
console.log("Stream closed with: ", e);
},
complete() {
console.log("Stream Closed");
},
};
obsErrors.subscribe(obsConverter);
}

/**
* Based on the severity of the issue, either log, display notification, or display interactive popup to the user
*/
export function displayIssue(issue: EmulatorIssue) {
const issueMessage = `Data Connect Emulator: ${issue.kind.toString()} - ${issue.message}`;
if (issue.severity === Severity.ALERT) {
vscode.window.showErrorMessage(issueMessage);
} else if (issue.severity === Severity.NOTICE) {
vscode.window.showWarningMessage(issueMessage);
}
emulatorOutputChannel.appendLine(issueMessage);
}

/**
* Calls the DataConnect.StreamEmulatorIssues api.
* Converts ReadableStream into Observable
*
*/
export async function getEmulatorIssuesStream(
configs: ResolvedDataConnectConfigs,
dataConnectEndpoint: string,
): Promise<Observable<EmulatorIssueResponse>> {
try {
// TODO: eventually support multiple services
const serviceId = configs.serviceIds[0];

const resp = await backOff(() =>
fetch(
dataConnectEndpoint + `/emulator/stream_issues?serviceId=${serviceId}`,
{
headers: {
Accept: "application/json",
"Content-Type": "application/json",
"x-mantle-admin": "all",
},
},
),
);

function fromStream(
stream: NodeJS.ReadableStream,
finishEventName = "end",
dataEventName = "data",
): Observable<EmulatorIssueResponse> {
stream.pause();

return new Observable((observer) => {
function dataHandler(data: any) {
observer.next(JSON.parse(data));
}

function errorHandler(err: any) {
observer.error(JSON.parse(err));
}

function endHandler() {
observer.complete();
}

stream.addListener(dataEventName, dataHandler);
stream.addListener("error", errorHandler);
stream.addListener(finishEventName, endHandler);

stream.resume();

return () => {
stream.removeListener(dataEventName, dataHandler);
stream.removeListener("error", errorHandler);
stream.removeListener(finishEventName, endHandler);
};
});
}
return fromStream(resp.body!);
} catch (err) {
console.log("Stream failed to connect with error: ", err);
return of({});
}
}
3 changes: 2 additions & 1 deletion firebase-vscode/src/data-connect/index.ts
Original file line number Diff line number Diff line change
Expand Up @@ -29,6 +29,7 @@ import { runDataConnectCompiler } from "./core-compiler";
import { setVSCodeEnvVars } from "../../../src/utils";
import { Result } from "../result";
import { setTerminalEnvVars } from "./terminal";
import { runEmulatorIssuesStream } from "./emulator-stream";

class CodeActionsProvider implements vscode.CodeActionProvider {
constructor(
Expand Down Expand Up @@ -169,7 +170,7 @@ export function registerFdc(
vscode.commands.executeCommand(
"firebase.dataConnect.executeIntrospection",
);

runEmulatorIssuesStream(configs,fdcService.localEndpoint.value);
runDataConnectCompiler(configs, fdcService.localEndpoint.value);
}
}),
Expand Down

0 comments on commit 652b0d0

Please sign in to comment.