rough tauri auth (#167)

This commit is contained in:
Kurt Hutten
2023-07-11 20:34:09 +10:00
committed by GitHub
parent 4f8fe2d155
commit 317dc6d0b2
5 changed files with 66 additions and 11 deletions

View File

@ -20,6 +20,7 @@ import { Stream } from './components/Stream'
import ModalContainer from 'react-modal-promise' import ModalContainer from 'react-modal-promise'
import { EngineCommandManager } from './lang/std/engineConnection' import { EngineCommandManager } from './lang/std/engineConnection'
import { isOverlap } from './lib/utils' import { isOverlap } from './lib/utils'
import { SetToken } from './components/TokenInput'
export function App() { export function App() {
const cam = useRef() const cam = useRef()
@ -46,6 +47,7 @@ export function App() {
setMediaStream, setMediaStream,
setIsStreamReady, setIsStreamReady,
isStreamReady, isStreamReady,
token,
} = useStore((s) => ({ } = useStore((s) => ({
editorView: s.editorView, editorView: s.editorView,
setEditorView: s.setEditorView, setEditorView: s.setEditorView,
@ -71,6 +73,7 @@ export function App() {
setMediaStream: s.setMediaStream, setMediaStream: s.setMediaStream,
isStreamReady: s.isStreamReady, isStreamReady: s.isStreamReady,
setIsStreamReady: s.setIsStreamReady, setIsStreamReady: s.setIsStreamReady,
token: s.token
})) }))
// const onChange = React.useCallback((value: string, viewUpdate: ViewUpdate) => { // const onChange = React.useCallback((value: string, viewUpdate: ViewUpdate) => {
const onChange = (value: string, viewUpdate: ViewUpdate) => { const onChange = (value: string, viewUpdate: ViewUpdate) => {
@ -135,15 +138,18 @@ export function App() {
codeBasedSelections, codeBasedSelections,
}) })
} }
const engineCommandManager = useMemo(() => new EngineCommandManager({ const engineCommandManager = useMemo(() => {
return new EngineCommandManager({
setMediaStream, setMediaStream,
setIsStreamReady, setIsStreamReady,
}), []) token,
})
}, [token])
useEffect(() => { useEffect(() => {
return () => { return () => {
engineCommandManager.tearDown() engineCommandManager?.tearDown()
} }
}, []) }, [engineCommandManager])
useEffect(() => { useEffect(() => {
if (!isStreamReady) return if (!isStreamReady) return
@ -249,7 +255,9 @@ export function App() {
<div className="h-screen"> <div className="h-screen">
<ModalContainer /> <ModalContainer />
<Allotment snap={true}> <Allotment snap={true}>
<Allotment vertical defaultSizes={[400, 1, 1]} minSize={20}>
<Allotment vertical defaultSizes={[5, 400, 1, 1]} minSize={20}>
<SetToken />
<div className="h-full flex flex-col items-start"> <div className="h-full flex flex-col items-start">
<PanelHeader title="Editor" /> <PanelHeader title="Editor" />
{/* <button {/* <button

View File

@ -2,12 +2,22 @@ import useSWR from 'swr'
import fetcher from './lib/fetcher' import fetcher from './lib/fetcher'
import withBaseUrl from './lib/withBaseURL' import withBaseUrl from './lib/withBaseURL'
import { App } from './App' import { App } from './App'
import { SetToken } from './components/TokenInput'
import { useStore } from './useStore'
export const Auth = () => { export const Auth = () => {
const { data: user } = useSWR(withBaseUrl('/user'), fetcher) as any const { data: user } = useSWR(withBaseUrl('/user'), fetcher) as any
const {token} = useStore((s) => ({
token: s.token
}))
const isLocalHost = const isLocalHost =
typeof window !== 'undefined' && window.location.hostname === 'localhost' typeof window !== 'undefined' && window.location.hostname === 'localhost'
if ((window as any).__TAURI__ && !token) {
return <SetToken />
}
if (!user && !isLocalHost) { if (!user && !isLocalHost) {
return ( return (
<> <>

View File

@ -0,0 +1,26 @@
import { useStore } from '../useStore'
export const SetToken = () => {
const { token, setToken } = useStore((s) => ({
token: s.token,
setToken: s.setToken,
}))
if (!(window as any).__TAURI__) {
return <div />
}
return (
<div className="w-full flex gap-2">
token:
<input
type="text"
className="flex-grow font-mono"
value={token}
onChange={(e) => {
setToken(e.target.value)
}}
placeholder="<your-token>"
/>
</div>
)
}

View File

@ -95,9 +95,11 @@ export class EngineCommandManager {
constructor({ constructor({
setMediaStream, setMediaStream,
setIsStreamReady, setIsStreamReady,
token,
}: { }: {
setMediaStream: (stream: MediaStream) => void setMediaStream: (stream: MediaStream) => void
setIsStreamReady: (isStreamReady: boolean) => void setIsStreamReady: (isStreamReady: boolean) => void
token?: string
}) { }) {
this.waitForReady = new Promise((resolve) => { this.waitForReady = new Promise((resolve) => {
this.resolveReady = resolve this.resolveReady = resolve
@ -109,8 +111,11 @@ export class EngineCommandManager {
this.pc.createDataChannel('unreliable_modeling_cmds') this.pc.createDataChannel('unreliable_modeling_cmds')
this.socket.addEventListener('open', (event) => { this.socket.addEventListener('open', (event) => {
console.log('Connected to websocket, waiting for ICE servers') console.log('Connected to websocket, waiting for ICE servers')
setIsStreamReady(true) if (token) {
this.resolveReady() this.socket?.send(
JSON.stringify({ headers: { Authorization: `Bearer ${token}` } })
)
}
}) })
this.socket.addEventListener('close', (event) => { this.socket.addEventListener('close', (event) => {
@ -122,7 +127,7 @@ export class EngineCommandManager {
}) })
this?.socket?.addEventListener('message', (event) => { this?.socket?.addEventListener('message', (event) => {
if (!this.socket) return if (!this.socket || !this.pc) return
//console.log('Message from server ', event.data); //console.log('Message from server ', event.data);
if (event.data instanceof Blob) { if (event.data instanceof Blob) {
@ -192,6 +197,8 @@ export class EngineCommandManager {
this.lossyDataChannel = event.channel this.lossyDataChannel = event.channel
console.log('accepted lossy data channel', event.channel.label) console.log('accepted lossy data channel', event.channel.label)
this.lossyDataChannel.addEventListener('open', (event) => { this.lossyDataChannel.addEventListener('open', (event) => {
setIsStreamReady(true)
this.resolveReady()
console.log('lossy data channel opened', event) console.log('lossy data channel opened', event)
}) })
this.lossyDataChannel.addEventListener('close', (event) => { this.lossyDataChannel.addEventListener('close', (event) => {

View File

@ -161,6 +161,8 @@ export interface StoreState {
path: string path: string
}[] }[]
setHomeMenuItems: (items: { name: string; path: string }[]) => void setHomeMenuItems: (items: { name: string; path: string }[]) => void
token: string
setToken: (token: string) => void
} }
let pendingAstUpdates: number[] = [] let pendingAstUpdates: number[] = []
@ -314,12 +316,14 @@ export const useStore = create<StoreState>()(
setHomeShowMenu: (showHomeMenu) => set({ showHomeMenu }), setHomeShowMenu: (showHomeMenu) => set({ showHomeMenu }),
homeMenuItems: [], homeMenuItems: [],
setHomeMenuItems: (homeMenuItems) => set({ homeMenuItems }), setHomeMenuItems: (homeMenuItems) => set({ homeMenuItems }),
token: '',
setToken: (token) => set({ token }),
}), }),
{ {
name: 'store', name: 'store',
partialize: (state) => partialize: (state) =>
Object.fromEntries( Object.fromEntries(
Object.entries(state).filter(([key]) => ['code', 'defaultDir'].includes(key)) Object.entries(state).filter(([key]) => ['code', 'defaultDir', 'token'].includes(key))
), ),
} }
) )