delay execute till after stream ready (#143)

This commit is contained in:
Kurt Hutten
2023-06-23 14:19:15 +10:00
committed by GitHub
parent fb3c34d5f3
commit 3510abfcb9
6 changed files with 43 additions and 27 deletions

View File

@ -29,14 +29,11 @@ export function App() {
setEditorView,
setSelectionRanges,
selectionRanges,
guiMode,
lastGuiMode,
addLog,
code,
setCode,
setAst,
setError,
errorState,
setProgramMemory,
resetLogs,
selectionRangeTypeMap,
@ -47,20 +44,19 @@ export function App() {
setCursor2,
sourceRangeMap,
setMediaStream,
setIsStreamReady,
isStreamReady,
} = useStore((s) => ({
editorView: s.editorView,
setEditorView: s.setEditorView,
setSelectionRanges: s.setSelectionRanges,
selectionRanges: s.selectionRanges,
guiMode: s.guiMode,
setGuiMode: s.setGuiMode,
addLog: s.addLog,
code: s.code,
setCode: s.setCode,
setAst: s.setAst,
lastGuiMode: s.lastGuiMode,
setError: s.setError,
errorState: s.errorState,
setProgramMemory: s.setProgramMemory,
resetLogs: s.resetLogs,
selectionRangeTypeMap: s.selectionRangeTypeMap,
@ -72,7 +68,9 @@ export function App() {
setCursor: s.setCursor,
setCursor2: s.setCursor2,
sourceRangeMap: s.sourceRangeMap,
setMediaStream: s.setMediaStream
setMediaStream: s.setMediaStream,
isStreamReady: s.isStreamReady,
setIsStreamReady: s.setIsStreamReady,
}))
// const onChange = React.useCallback((value: string, viewUpdate: ViewUpdate) => {
const onChange = (value: string, viewUpdate: ViewUpdate) => {
@ -137,7 +135,10 @@ export function App() {
codeBasedSelections,
})
}
const engineCommandManager = useMemo(() => new EngineCommandManager(setMediaStream), [])
const engineCommandManager = useMemo(() => new EngineCommandManager({
setMediaStream,
setIsStreamReady,
}), [])
useEffect(() => {
return () => {
engineCommandManager.tearDown()
@ -145,6 +146,7 @@ export function App() {
}, [])
useEffect(() => {
if (!isStreamReady) return
const asyncWrap = async () => {
try {
if (!code) {
@ -242,7 +244,7 @@ export function App() {
}
}
asyncWrap()
}, [code])
}, [code, isStreamReady])
return (
<div className="h-screen">
<ModalContainer />

View File

@ -90,7 +90,13 @@ export class EngineCommandManager {
onClickCallback: (selection: SelectionsArgs) => void = () => {}
onCursorsSelectedCallback: (selections: CursorSelectionsArgs) => void =
() => {}
constructor(setMediaStream: (stream: MediaStream) => void) {
constructor({
setMediaStream,
setIsStreamReady,
}: {
setMediaStream: (stream: MediaStream) => void
setIsStreamReady: (isStreamReady: boolean) => void
}) {
const url = 'wss://api.dev.kittycad.io/ws/modeling/commands'
this.socket = new WebSocket(url)
this.pc = new RTCPeerConnection()
@ -178,6 +184,7 @@ export class EngineCommandManager {
this.lossyDataChannel = event.channel
console.log('accepted lossy data channel', event.channel.label)
this.lossyDataChannel.addEventListener('open', (event) => {
setIsStreamReady(true)
console.log('lossy data channel opened', event)
})
this.lossyDataChannel.addEventListener('close', (event) => {

View File

@ -47,7 +47,7 @@ export const extrude: InternalFn = (
target: sketch.id,
distance: length,
cap: true,
}
},
},
cmd_id: id,
file_id: uuidv4(),

View File

@ -293,7 +293,7 @@ export const line: SketchLineHelper = {
},
cmd_id: id,
file_id: uuidv4(),
}
},
})
const currentPath: Path = {
type: 'toPoint',
@ -1603,7 +1603,7 @@ export const close: InternalFn = (
},
cmd_id: id,
file_id: uuidv4(),
}
},
})
const currentPath: Path = {

View File

@ -6,7 +6,10 @@ export async function executor(
ast: Program,
pm: ProgramMemory = { root: {}, pendingMemory: {} }
): Promise<ProgramMemory> {
const engineCommandManager = new EngineCommandManager(() => {})
const engineCommandManager = new EngineCommandManager({
setIsStreamReady: () => {},
setMediaStream: () => {},
})
engineCommandManager.startNewSession()
const programMemory = await _executor(ast, pm, engineCommandManager)
await engineCommandManager.waitForAllCommands()

View File

@ -148,6 +148,8 @@ export interface StoreState {
setEngineCommandManager: (engineCommandManager: EngineCommandManager) => void
mediaStream?: MediaStream
setMediaStream: (mediaStream: MediaStream) => void
isStreamReady: boolean
setIsStreamReady: (isStreamReady: boolean) => void
// tauri specific app settings
defaultDir: DefaultDir
@ -300,6 +302,8 @@ export const useStore = create<StoreState>()(
setEngineCommandManager: (engineCommandManager) =>
set({ engineCommandManager }),
setMediaStream: (mediaStream) => set({ mediaStream }),
isStreamReady: false,
setIsStreamReady: (isStreamReady) => set({ isStreamReady }),
// tauri specific app settings
defaultDir: {