Skip to content

Commit 544c054

Browse files
committed
progress [ci skip]
1 parent b31b65f commit 544c054

4 files changed

Lines changed: 82 additions & 89 deletions

File tree

vscode/extension/src/extension.ts

Lines changed: 8 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -19,7 +19,7 @@ import { signIn } from "./commands/signin";
1919
import { signInSpecifyFlow } from "./commands/signinSpecifyFlow";
2020
import { isErr } from "./utilities/functional/result";
2121
import { handleNotSginedInError } from "./utilities/errors";
22-
import { startWebServer, WebServer } from "./web-server/server";
22+
import { WebServer } from "./web-server/server";
2323
import { LineagePanel } from "./webviews/lineagePanel";
2424

2525
let lspClient: LSPClient | undefined;
@@ -53,6 +53,8 @@ export async function activate(context: vscode.ExtensionContext) {
5353
);
5454
traceInfo("Authentication provider registered");
5555

56+
webServer = new WebServer(webServerOutputChannel);
57+
5658
context.subscriptions.push(
5759
vscode.commands.registerCommand("sqlmesh.signin", signIn(authProvider))
5860
);
@@ -87,23 +89,15 @@ export async function activate(context: vscode.ExtensionContext) {
8789
}
8890
context.subscriptions.push(lspClient);
8991

90-
// start web server
91-
const webServerResult = await startWebServer(webServerOutputChannel);
92-
if (!isErr(webServerResult)) {
93-
webServer = webServerResult.value;
94-
} else {
95-
traceError("Failed to start web server", webServerResult.error);
96-
}
92+
await webServer.start();
93+
context.subscriptions.push(webServer);
9794

9895
const restart = async () => {
9996
if (webServer) {
10097
webServer.stop();
101-
webServer = undefined;
102-
const webServerResult = await startWebServer(webServerOutputChannel);
103-
if (!isErr(webServerResult)) {
104-
webServer = webServerResult.value;
105-
} else {
106-
traceError("Failed to start web server", webServerResult.error);
98+
const startResult = await webServer.start();
99+
if (isErr(startResult)) {
100+
traceError("Failed to start web server", startResult.error);
107101
}
108102
}
109103
if (lspClient) {
Lines changed: 65 additions & 60 deletions
Original file line numberDiff line numberDiff line change
@@ -1,73 +1,78 @@
1-
import { ChildProcess, spawn } from "child_process"
2-
import { err, isErr, ok, Result } from "../utilities/functional/result"
3-
import { sqlmesh_exec } from "../utilities/sqlmesh/sqlmesh"
4-
import * as vscode from 'vscode'
5-
import { isProduction } from "../utilities/isDev"
6-
import getPort from "../utilities/getPort"
7-
import { ErrorType } from "../utilities/errors"
1+
import { ChildProcess, spawn } from "child_process";
2+
import { err, isErr, ok, Result } from "../utilities/functional/result";
3+
import { sqlmesh_exec } from "../utilities/sqlmesh/sqlmesh";
4+
import * as vscode from "vscode";
5+
import { isProduction } from "../utilities/isDev";
6+
import getPort from "../utilities/getPort";
7+
import { ErrorType } from "../utilities/errors";
88

9-
export interface Server {
10-
stop: () => void;
11-
get_url: () => string
12-
}
9+
export type WebServerDetails = {
10+
url: string;
11+
process: ChildProcess;
12+
};
1313

14-
export const startWebServer = async (outputChannel: vscode.OutputChannel): Promise<Result<WebServer, ErrorType>> => {
15-
const sqlmesh = await sqlmesh_exec()
16-
if (isErr(sqlmesh)) {
17-
return sqlmesh
18-
}
19-
const port = !isProduction() ? 5174 : await getPort()
20-
const { bin, workspacePath, env } = sqlmesh.value
21-
const process = spawn(bin, ['ui', '--port', port.toString()], {
22-
cwd: workspacePath,
23-
env,
24-
})
25-
26-
process.stdout.on('data', (data) => {
27-
outputChannel.append(data.toString())
28-
})
29-
process.stderr.on('data', (data) => {
30-
outputChannel.append(data.toString())
31-
})
32-
33-
return ok(new WebServer(port, `http://localhost:${port}`, process))
34-
}
14+
export class WebServer implements vscode.Disposable {
15+
private details: WebServerDetails | undefined;
16+
private outputChannel: vscode.OutputChannel;
3517

36-
export class WebServer implements Server {
37-
port: number
38-
url: string
39-
process: ChildProcess
18+
constructor(outputChannel: vscode.OutputChannel) {
19+
this.details = undefined;
20+
this.outputChannel = outputChannel;
21+
}
4022

41-
constructor(port: number, url: string, process: ChildProcess) {
42-
this.port = port
43-
this.url = url
44-
this.process = process
23+
async start(): Promise<Result<undefined, ErrorType>> {
24+
const sqlmesh = await sqlmesh_exec();
25+
if (isErr(sqlmesh)) {
26+
return sqlmesh;
4527
}
46-
47-
get_url() {
48-
return this.url
28+
const port = !isProduction() ? 5174 : await getPort();
29+
const { bin, workspacePath, env } = sqlmesh.value;
30+
const process = spawn(bin, ["ui", "--port", port.toString()], {
31+
cwd: workspacePath,
32+
env,
33+
});
34+
process.stdout.on("data", (data) => this.outputChannel.append(data.toString()))
35+
process.stderr.on("data", (data) => this.outputChannel.append(data.toString()))
36+
this.details = {
37+
url: `http://localhost:${port}`,
38+
process
4939
}
40+
return ok(undefined)
41+
}
42+
43+
get_url(): string | undefined {
44+
return this.details?.url;
45+
}
5046

51-
stop() {
52-
this.process.kill()
47+
stop() {
48+
if (this.details) {
49+
this.details.process.kill();
50+
this.details = undefined;
5351
}
52+
}
53+
54+
dispose() {
55+
this.stop();
56+
}
5457
}
5558

5659
export const queryServer = async (
57-
root_url: string,
58-
path: string,
59-
body: any,
60-
method: string
60+
root_url: string,
61+
path: string,
62+
body: any | undefined,
63+
method: string | undefined
6164
): Promise<Result<Object, string>> => {
62-
try {
63-
const url = `${root_url}${path}`
64-
console.log('making request', url, method, body)
65+
try {
66+
const requestMethod = method ?? "GET";
67+
const requestBody = body ?? undefined;
68+
const url = `${root_url}${path}`;
69+
console.log("making request", url, requestMethod, requestBody);
6570
const response = await fetch(url, {
66-
method,
67-
body,
68-
})
69-
return response.json()
70-
} catch (e) {
71-
return err("error o")
72-
}
73-
}
71+
method: requestMethod,
72+
body: requestBody,
73+
});
74+
return response.json();
75+
} catch (e) {
76+
return err("error o");
77+
}
78+
};

vscode/extension/src/webviews/lineagePanel.ts

Lines changed: 8 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -27,14 +27,13 @@ export class LineagePanel implements WebviewViewProvider, Disposable {
2727

2828
public constructor(
2929
extensionUri: Uri,
30-
webServer: WebServer | undefined,
30+
webServer: WebServer,
3131
) {
3232
this._extensionUri = extensionUri;
3333
this.webServer = webServer;
3434

3535
if (this.panel) {
36-
const { externalUrl, externalAuthority } = this.externalUrlAndAutority();
37-
this.panel.webview.html = this.getHtml(externalUrl, externalAuthority);
36+
this.panel.webview.html = isProduction() ? this.getProductionHTML(this.panel.webview) : this.getHtml();
3837
}
3938

4039
window.onDidChangeActiveTextEditor((editor) => {
@@ -103,21 +102,21 @@ export class LineagePanel implements WebviewViewProvider, Disposable {
103102
undefined,
104103
[]
105104
);
106-
const { externalUrl, externalAuthority } = this.externalUrlAndAutority();
107-
webviewView.webview.html = isProduction() ? this.getProductionHTML(webviewView.webview) : this.getHtml(externalUrl, externalAuthority);
105+
webviewView.webview.html = isProduction() ? this.getProductionHTML(webviewView.webview) : this.getHtml();
108106
}
109107

110108
externalUrlAndAutority(): { externalUrl: string; externalAuthority: string } {
111109
const isProd = isProduction();
112-
if (!isProd) {
113-
throw new Error("external url and authority is not supported in dev mode")
110+
if (isProd) {
111+
throw new Error("External url and authority is not supported in production mode")
114112
}
115113
const externalUrl = "http://localhost:5173/lineage"
116114
const externalAuthority = new URL(externalUrl).origin;
117115
return { externalUrl, externalAuthority };
118116
}
119117

120-
getHtml(externalUrl: string, externalAuthority: string) {
118+
getHtml() {
119+
const { externalUrl, externalAuthority } = this.externalUrlAndAutority();
121120
// The CSP is too restrictive - it only allows frame-src but no other resources
122121
// Adding connect-src for API calls, img-src for images, and style-src for CSS
123122
return `
@@ -186,6 +185,7 @@ export class LineagePanel implements WebviewViewProvider, Disposable {
186185

187186
console.log("querying server")
188187
const url = this.webServer?.get_url()
188+
console.log("url", url)
189189
if (!url) {
190190
throw new Error("web server not found")
191191
}

vscode/react/src/pages/lineage.tsx

Lines changed: 1 addition & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -54,22 +54,16 @@ export function LineagePage() {
5454
}
5555

5656
function Lineage() {
57-
const selectedModel = 'sushi.customers'
58-
59-
const { data, isLoading } = useApiModelLineage(selectedModel)
6057
const { data: models, isLoading: isLoadingModels } = useApiModels()
61-
if (isLoading) {
62-
return <div>Loading...</div>
63-
}
6458
if (isLoadingModels) {
6559
return <div>Loading models...</div>
6660
}
6761
console.log('models', models)
68-
console.log('data', data)
6962
const modelsRecord = models?.reduce((acc, model) => {
7063
acc[model.name] = model
7164
return acc
7265
}, {} as Record<string, Model>)
66+
const selectedModel = Object.keys(modelsRecord)[0]
7367

7468
return (
7569
<LineageComponentFromWeb

0 commit comments

Comments
 (0)