Skip to content

Commit 252a414

Browse files
committed
feat: Get tokens for Grafana Assistant via OAuth
1 parent 4d7c419 commit 252a414

File tree

11 files changed

+586
-29
lines changed

11 files changed

+586
-29
lines changed

package-lock.json

Lines changed: 1 addition & 29 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.
Lines changed: 82 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,82 @@
1+
import { ipcMain } from 'electron'
2+
import log from 'electron-log/main'
3+
4+
import { browserWindowFromEvent } from '@/utils/electron'
5+
6+
import { ConnectStateMachine } from './states'
7+
import {
8+
getConnection,
9+
getFirstStoredGrafanaUrl,
10+
removeConnection,
11+
} from './storage'
12+
import {
13+
ConnectResult,
14+
GrafanaAssistantConnection,
15+
GrafanaAssistantHandler,
16+
} from './types'
17+
18+
export function initialize() {
19+
let pending: ConnectStateMachine | null = null
20+
21+
ipcMain.handle(
22+
GrafanaAssistantHandler.Connect,
23+
async (event, grafanaUrl: string): Promise<ConnectResult> => {
24+
const browserWindow = browserWindowFromEvent(event)
25+
26+
try {
27+
if (pending !== null) {
28+
pending.abort()
29+
pending = null
30+
}
31+
32+
pending = new ConnectStateMachine(grafanaUrl)
33+
34+
pending.on('state-change', (state) => {
35+
browserWindow.webContents.send(
36+
GrafanaAssistantHandler.StateChange,
37+
state
38+
)
39+
})
40+
41+
return await pending.start()
42+
} catch (error) {
43+
log.error('Unexpected error during Grafana Assistant connect.', error)
44+
throw error
45+
} finally {
46+
pending = null
47+
}
48+
}
49+
)
50+
51+
ipcMain.handle(GrafanaAssistantHandler.Abort, () => {
52+
pending?.abort()
53+
pending = null
54+
})
55+
56+
ipcMain.handle(
57+
GrafanaAssistantHandler.GetConnection,
58+
async (
59+
_event,
60+
grafanaUrl?: string
61+
): Promise<GrafanaAssistantConnection | null> => {
62+
const url = grafanaUrl ?? (await getFirstStoredGrafanaUrl())
63+
if (!url) return null
64+
65+
const conn = await getConnection(url)
66+
if (!conn) return null
67+
68+
return {
69+
grafanaUrl: url,
70+
apiEndpoint: conn.apiEndpoint,
71+
expiresAt: conn.expiresAt,
72+
}
73+
}
74+
)
75+
76+
ipcMain.handle(
77+
GrafanaAssistantHandler.Disconnect,
78+
async (_event, grafanaUrl: string): Promise<void> => {
79+
await removeConnection(grafanaUrl)
80+
}
81+
)
82+
}
Lines changed: 41 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,41 @@
1+
import { ipcRenderer } from 'electron'
2+
3+
import { createListener } from '../utils'
4+
5+
import {
6+
ConnectProcessState,
7+
ConnectResult,
8+
GrafanaAssistantConnection,
9+
GrafanaAssistantHandler,
10+
} from './types'
11+
12+
export function connect(grafanaUrl: string): Promise<ConnectResult> {
13+
return ipcRenderer.invoke(
14+
GrafanaAssistantHandler.Connect,
15+
grafanaUrl
16+
) as Promise<ConnectResult>
17+
}
18+
19+
export function abort(): Promise<void> {
20+
return ipcRenderer.invoke(GrafanaAssistantHandler.Abort) as Promise<void>
21+
}
22+
23+
export function getConnection(
24+
grafanaUrl?: string
25+
): Promise<GrafanaAssistantConnection | null> {
26+
return ipcRenderer.invoke(
27+
GrafanaAssistantHandler.GetConnection,
28+
grafanaUrl
29+
) as Promise<GrafanaAssistantConnection | null>
30+
}
31+
32+
export function disconnect(grafanaUrl: string): Promise<void> {
33+
return ipcRenderer.invoke(
34+
GrafanaAssistantHandler.Disconnect,
35+
grafanaUrl
36+
) as Promise<void>
37+
}
38+
39+
export function onStateChange(callback: (state: ConnectProcessState) => void) {
40+
return createListener(GrafanaAssistantHandler.StateChange, callback)
41+
}

0 commit comments

Comments
 (0)