diff --git a/src/App.tsx b/src/App.tsx index 70bf80d6d..8dcc3ded0 100644 --- a/src/App.tsx +++ b/src/App.tsx @@ -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 (
diff --git a/src/lang/std/engineConnection.ts b/src/lang/std/engineConnection.ts index f4099b623..5acd95d43 100644 --- a/src/lang/std/engineConnection.ts +++ b/src/lang/std/engineConnection.ts @@ -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) => { diff --git a/src/lang/std/extrude.ts b/src/lang/std/extrude.ts index 9cbb9cd99..296caa00e 100644 --- a/src/lang/std/extrude.ts +++ b/src/lang/std/extrude.ts @@ -47,13 +47,13 @@ export const extrude: InternalFn = ( target: sketch.id, distance: length, cap: true, - } + }, }, cmd_id: id, file_id: uuidv4(), }, }) - + return { type: 'extrudeGroup', value: extrudeSurfaces, // TODO, this is just an empty array now, should be deleted. diff --git a/src/lang/std/sketch.ts b/src/lang/std/sketch.ts index 97cc3d8e0..52001ca68 100644 --- a/src/lang/std/sketch.ts +++ b/src/lang/std/sketch.ts @@ -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 = { @@ -1678,20 +1678,20 @@ export const startSketchAt: InternalFn = ( }, }) engineCommandManager.sendSceneCommand({ - type: 'ModelingCmdReq', - cmd: { - MovePathPen: { - path: pathId, - to: { - x: lineData.to[0], - y: lineData.to[1], - z: 0, - }, + type: 'ModelingCmdReq', + cmd: { + MovePathPen: { + path: pathId, + to: { + x: lineData.to[0], + y: lineData.to[1], + z: 0, }, }, - cmd_id: id, - file_id: uuidv4(), - }) + }, + cmd_id: id, + file_id: uuidv4(), + }) const currentPath: Path = { type: 'base', to, diff --git a/src/lib/testHelpers.ts b/src/lib/testHelpers.ts index 1ec7b5097..b7467f5af 100644 --- a/src/lib/testHelpers.ts +++ b/src/lib/testHelpers.ts @@ -6,7 +6,10 @@ export async function executor( ast: Program, pm: ProgramMemory = { root: {}, pendingMemory: {} } ): Promise { - const engineCommandManager = new EngineCommandManager(() => {}) + const engineCommandManager = new EngineCommandManager({ + setIsStreamReady: () => {}, + setMediaStream: () => {}, + }) engineCommandManager.startNewSession() const programMemory = await _executor(ast, pm, engineCommandManager) await engineCommandManager.waitForAllCommands() diff --git a/src/useStore.ts b/src/useStore.ts index a250d7aeb..5f9ba6931 100644 --- a/src/useStore.ts +++ b/src/useStore.ts @@ -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()( setEngineCommandManager: (engineCommandManager) => set({ engineCommandManager }), setMediaStream: (mediaStream) => set({ mediaStream }), + isStreamReady: false, + setIsStreamReady: (isStreamReady) => set({ isStreamReady }), // tauri specific app settings defaultDir: {