Fix up message structure to match the new Engine messages (#316)
* Fix up message structure to match the new Engine messages The types are still jacked up, I reckon we need to bump the node @KittyCAD dep. Signed-off-by: Paul Tagliamonte <paul@kittycad.io> * update types * fmt * export tsc * fmt again --------- Signed-off-by: Paul Tagliamonte <paul@kittycad.io> Co-authored-by: Kurt Hutten Irev-Dev <k.hutten@protonmail.ch>
This commit is contained in:
@ -8,7 +8,7 @@
|
||||
"@fortawesome/free-solid-svg-icons": "^6.4.2",
|
||||
"@fortawesome/react-fontawesome": "^0.2.0",
|
||||
"@headlessui/react": "^1.7.13",
|
||||
"@kittycad/lib": "^0.0.29",
|
||||
"@kittycad/lib": "^0.0.34",
|
||||
"@react-hook/resize-observer": "^1.2.6",
|
||||
"@tauri-apps/api": "^1.3.0",
|
||||
"@testing-library/jest-dom": "^5.14.1",
|
||||
|
@ -39,6 +39,7 @@ export const ExportButton = ({ children, className }: ExportButtonProps) => {
|
||||
const initialValues: OutputFormat = {
|
||||
type: defaultType,
|
||||
storage: 'embedded',
|
||||
presentation: 'compact',
|
||||
}
|
||||
const formik = useFormik({
|
||||
initialValues,
|
||||
@ -82,6 +83,8 @@ export const ExportButton = ({ children, className }: ExportButtonProps) => {
|
||||
},
|
||||
})
|
||||
|
||||
const yo = formik.values
|
||||
|
||||
return (
|
||||
<>
|
||||
<ActionButton
|
||||
@ -127,7 +130,9 @@ export const ExportButton = ({ children, className }: ExportButtonProps) => {
|
||||
id="storage"
|
||||
name="storage"
|
||||
onChange={formik.handleChange}
|
||||
value={formik.values.storage}
|
||||
value={
|
||||
'storage' in formik.values ? formik.values.storage : ''
|
||||
}
|
||||
className="bg-chalkboard-20 dark:bg-chalkboard-90 w-full"
|
||||
>
|
||||
{type === 'gltf' && (
|
||||
|
@ -37,11 +37,7 @@ interface NewTrackArgs {
|
||||
mediaStream: MediaStream
|
||||
}
|
||||
|
||||
export type EngineCommand = Models['WebSocketMessages_type']
|
||||
|
||||
type OkResponse = Models['OkModelingCmdResponse_type']
|
||||
|
||||
type WebSocketResponse = Models['WebSocketResponses_type']
|
||||
type WebSocketResponse = Models['OkWebSocketResponseData_type']
|
||||
|
||||
// EngineConnection encapsulates the connection(s) to the Engine
|
||||
// for the EngineCommandManager; namely, the underlying WebSocket
|
||||
@ -158,18 +154,32 @@ export class EngineConnection {
|
||||
return
|
||||
}
|
||||
|
||||
if (event.data.toLocaleLowerCase().startsWith('error')) {
|
||||
console.error('something went wrong: ', event.data)
|
||||
const message: Models['WebSocketResponse_type'] = JSON.parse(event.data)
|
||||
|
||||
if (!message.success) {
|
||||
if (message.request_id) {
|
||||
console.error(`Error in response to request ${message.request_id}:`)
|
||||
} else {
|
||||
console.error(`Error from server:`)
|
||||
}
|
||||
message.errors.forEach((error) => {
|
||||
console.error(` - ${error.error_code}: ${error.message}`)
|
||||
})
|
||||
return
|
||||
}
|
||||
|
||||
const message: WebSocketResponse = JSON.parse(event.data)
|
||||
let resp = message.resp
|
||||
if (!resp) {
|
||||
// If there's no body to the response, we can bail here.
|
||||
return
|
||||
}
|
||||
|
||||
if (resp.type === 'sdp_answer') {
|
||||
let answer = resp.data?.answer
|
||||
if (!answer || answer.type === 'unspecified') {
|
||||
return
|
||||
}
|
||||
|
||||
if (
|
||||
message.type === 'sdp_answer' &&
|
||||
message?.answer &&
|
||||
message?.answer?.type !== 'unspecified'
|
||||
) {
|
||||
if (this.pc?.signalingState !== 'stable') {
|
||||
// If the connection is stable, we shouldn't bother updating the
|
||||
// SDP, since we have a stable connection to the backend. If we
|
||||
@ -177,24 +187,26 @@ export class EngineConnection {
|
||||
// tore down.
|
||||
this.pc?.setRemoteDescription(
|
||||
new RTCSessionDescription({
|
||||
type: message.answer.type,
|
||||
sdp: message.answer.sdp,
|
||||
type: answer.type,
|
||||
sdp: answer.sdp,
|
||||
})
|
||||
)
|
||||
}
|
||||
} else if (message.type === 'trickle_ice') {
|
||||
this.pc?.addIceCandidate(message.candidate as RTCIceCandidateInit)
|
||||
} else if (message.type === 'ice_server_info' && this.pc) {
|
||||
} else if (resp.type === 'trickle_ice') {
|
||||
let candidate = resp.data?.candidate
|
||||
this.pc?.addIceCandidate(candidate as RTCIceCandidateInit)
|
||||
} else if (resp.type === 'ice_server_info' && this.pc) {
|
||||
console.log('received ice_server_info')
|
||||
let ice_servers = resp.data?.ice_servers
|
||||
|
||||
if (message?.ice_servers?.length > 0) {
|
||||
if (ice_servers?.length > 0) {
|
||||
// When we set the Configuration, we want to always force
|
||||
// iceTransportPolicy to 'relay', since we know the topology
|
||||
// of the ICE/STUN/TUN server and the engine. We don't wish to
|
||||
// talk to the engine in any configuration /other/ than relay
|
||||
// from a infra POV.
|
||||
this.pc.setConfiguration({
|
||||
iceServers: message.ice_servers,
|
||||
iceServers: ice_servers,
|
||||
iceTransportPolicy: 'relay',
|
||||
})
|
||||
} else {
|
||||
@ -215,13 +227,7 @@ export class EngineConnection {
|
||||
|
||||
this.pc.addEventListener('icecandidate', (event) => {
|
||||
if (!this.pc || !this.websocket) return
|
||||
if (event.candidate === null) {
|
||||
// console.log('sent sdp_offer')
|
||||
// this.send({
|
||||
// type: 'sdp_offer',
|
||||
// offer: this.pc.localDescription,
|
||||
// })
|
||||
} else {
|
||||
if (event.candidate !== null) {
|
||||
console.log('sending trickle ice candidate')
|
||||
const { candidate } = event
|
||||
this.send({
|
||||
@ -324,6 +330,8 @@ export class EngineConnection {
|
||||
}
|
||||
}
|
||||
|
||||
export type EngineCommand = Models['WebSocketRequest_type']
|
||||
|
||||
export class EngineCommandManager {
|
||||
artifactMap: ArtifactMap = {}
|
||||
sourceRangeMap: SourceRangeMap = {}
|
||||
@ -368,14 +376,16 @@ export class EngineCommandManager {
|
||||
let lossyDataChannel = event.channel
|
||||
|
||||
lossyDataChannel.addEventListener('message', (event) => {
|
||||
const result: OkResponse = JSON.parse(event.data)
|
||||
const result: Models['OkModelingCmdResponse_type'] = JSON.parse(
|
||||
event.data
|
||||
)
|
||||
if (
|
||||
result.type === 'highlight_set_entity' &&
|
||||
result.sequence &&
|
||||
result.sequence > this.inSequence
|
||||
result?.data?.sequence &&
|
||||
result.data.sequence > this.inSequence
|
||||
) {
|
||||
this.onHoverCallback(result.entity_id)
|
||||
this.inSequence = result.sequence
|
||||
this.onHoverCallback(result.data.entity_id)
|
||||
this.inSequence = result.data.sequence
|
||||
}
|
||||
})
|
||||
})
|
||||
@ -390,15 +400,15 @@ export class EngineCommandManager {
|
||||
// Pass this to our export function.
|
||||
exportSave(event.data)
|
||||
} else {
|
||||
if (event.data.toLocaleLowerCase().startsWith('error')) {
|
||||
// Errors are not JSON encoded; if we have an error we can bail
|
||||
// here; debugging the error to the console happens in the core
|
||||
// engine code.
|
||||
return
|
||||
}
|
||||
const message: WebSocketResponse = JSON.parse(event.data)
|
||||
if (message.type === 'modeling') {
|
||||
this.handleModelingCommand(message)
|
||||
const message: Models['WebSocketResponse_type'] = JSON.parse(
|
||||
event.data
|
||||
)
|
||||
if (
|
||||
message.success &&
|
||||
message.resp.type === 'modeling' &&
|
||||
message.request_id
|
||||
) {
|
||||
this.handleModelingCommand(message.resp, message.request_id)
|
||||
}
|
||||
}
|
||||
})
|
||||
@ -418,31 +428,28 @@ export class EngineCommandManager {
|
||||
|
||||
this.engineConnection?.connect()
|
||||
}
|
||||
handleModelingCommand(message: WebSocketResponse) {
|
||||
handleModelingCommand(message: WebSocketResponse, id: string) {
|
||||
if (message.type !== 'modeling') {
|
||||
return
|
||||
}
|
||||
const modelingResponse = message.data.modeling_response
|
||||
|
||||
const id = message.cmd_id
|
||||
const command = this.artifactMap[id]
|
||||
if ('ok' in message.result) {
|
||||
const result: OkResponse = message.result.ok
|
||||
if (result.type === 'select_with_point') {
|
||||
if (result.entity_id) {
|
||||
this.onClickCallback({
|
||||
id: result.entity_id,
|
||||
type: 'default',
|
||||
})
|
||||
} else {
|
||||
this.onClickCallback()
|
||||
}
|
||||
if (modelingResponse.type === 'select_with_point') {
|
||||
if (modelingResponse?.data?.entity_id) {
|
||||
this.onClickCallback({
|
||||
id: modelingResponse?.data?.entity_id,
|
||||
type: 'default',
|
||||
})
|
||||
} else {
|
||||
this.onClickCallback()
|
||||
}
|
||||
}
|
||||
if (command && command.type === 'pending') {
|
||||
const resolve = command.resolve
|
||||
this.artifactMap[id] = {
|
||||
type: 'result',
|
||||
data: message.result,
|
||||
data: modelingResponse,
|
||||
}
|
||||
resolve({
|
||||
id,
|
||||
@ -450,7 +457,7 @@ export class EngineCommandManager {
|
||||
} else {
|
||||
this.artifactMap[id] = {
|
||||
type: 'result',
|
||||
data: message.result,
|
||||
data: modelingResponse,
|
||||
}
|
||||
}
|
||||
}
|
||||
|
@ -1747,10 +1747,10 @@
|
||||
resolved "https://registry.yarnpkg.com/@juggle/resize-observer/-/resize-observer-3.4.0.tgz#08d6c5e20cf7e4cc02fd181c4b0c225cd31dbb60"
|
||||
integrity sha512-dfLbk+PwWvFzSxwk3n5ySL0hfBog779o8h68wK/7/APo/7cgyWp5jcXockbxdk5kFRkbeXWm4Fbi9FrdN381sA==
|
||||
|
||||
"@kittycad/lib@^0.0.29":
|
||||
version "0.0.29"
|
||||
resolved "https://registry.yarnpkg.com/@kittycad/lib/-/lib-0.0.29.tgz#e0c0751fc124dd0136f9731c6bb962cd8b8202f6"
|
||||
integrity sha512-YpyXyOfoUBItJk71AP8M9i4QGvNnNHiSO35dMDx2EsDKqEGwTLDHOBniwPEq+iJqrGcZf2CfBSOvAOnZCH790A==
|
||||
"@kittycad/lib@^0.0.34":
|
||||
version "0.0.34"
|
||||
resolved "https://registry.yarnpkg.com/@kittycad/lib/-/lib-0.0.34.tgz#c1f1021f6c77bd9f47caa685cfbff0ef358a0316"
|
||||
integrity sha512-9pUUuspJB/rayW4adfF7UqRYLw1pugBy3t0+V6qK3sWttG9flgv54fPw3JKewn7VFoEjRtNtoREMAoWb4ZrUIw==
|
||||
dependencies:
|
||||
node-fetch "3.3.2"
|
||||
openapi-types "^12.0.0"
|
||||
|
Reference in New Issue
Block a user