import { replyToAction } from '../../../bus/publishActionReply.js' import { parseSimTime } from '../../actionsHelper.js' import { Frustum } from '../../frustum.js' export const actions = { async action_GETAGENTPOSITION(action, payload, reqid, sender, roles) { const reader = this.observerSrv.gpsStorageReader if(!reader) { replyToAction(this, { action, reqid, sender, success: false, err: 'GPS storage reader not ready' }) return } if(!this.observerSrv.isLive()) { replyToAction(this, { action, reqid, sender, success: false, err: 'Simulation not live' }) return } const agentId = payload?.agentId if(!agentId || typeof(agentId) !== 'string') { replyToAction(this, { action, reqid, sender, success: false, err: 'Missing or invalid agentId' }) return } const at = parseSimTime(payload, () => this.observerSrv.now()) if(at === null) { replyToAction(this, { action, reqid, sender, success: false, err: 'Invalid simulation time' }) return } const agent = await reader.getAgentPosition(agentId, at) if(!agent) { replyToAction(this, { action, reqid, sender, success: false, err: `Unknown agent: ${agentId}` }) return } replyToAction(this, { action, reqid, sender, success: true, payload: { agent } }) }, async action_GETAGENTSINFRUSTUM(action, payload, reqid, sender, roles) { const registry = this.observerSrv.requestorRegistry if(!registry) { replyToAction(this, { action, reqid, sender, success: false, err: 'Requestor registry not ready' }) return } if(!this.observerSrv.isLive()) { replyToAction(this, { action, reqid, sender, success: false, err: 'Simulation not live' }) return } const frustum = Frustum.fromPlanes(payload?.planes) if(!frustum) { replyToAction(this, { action, reqid, sender, success: false, err: 'Missing or invalid frustum planes (expected 6)' }) return } const at = parseSimTime(payload, () => this.observerSrv.now()) if(at === null) { replyToAction(this, { action, reqid, sender, success: false, err: 'Invalid simulation time' }) return } const result = await registry.evaluateOnce({ frustum, t: at }) if(!result.ok) { replyToAction(this, { action, reqid, sender, success: false, err: result.err }) return } replyToAction(this, { action, reqid, sender, success: true, payload: { agents: result.agents, t: result.t, }, }) }, async action_SUBSCRIBEFRUSTUM(action, payload, reqid, sender, roles) { const registry = this.observerSrv.requestorRegistry if(!registry) { replyToAction(this, { action, reqid, sender, success: false, err: 'Requestor registry not ready' }) return } if(!this.observerSrv.isLive()) { replyToAction(this, { action, reqid, sender, success: false, err: 'Simulation not live' }) return } const result = await registry.subscribeFrustum(sender, { planes: payload?.planes, frequency: payload?.frequency, }) if(!result.ok) { replyToAction(this, { action, reqid, sender, success: false, err: result.err }) return } replyToAction(this, { action, reqid, sender, success: true, payload: { frequency: result.frequency, t: result.t, }, }) }, }