maestro refacto to grrom, getpositions actions transfered to Observer, changed to frustum, with subscription
This commit is contained in:
@@ -1,5 +1,4 @@
|
||||
import { methods as utilities, construct as utilitiesConstruct } from './utilities.js'
|
||||
import { methods as positions } from './positions.js'
|
||||
import { dispatchMessage } from './dispatch.js'
|
||||
|
||||
export const afterLoginMethods = [
|
||||
@@ -7,6 +6,5 @@ export const afterLoginMethods = [
|
||||
]
|
||||
export const meshActions = {
|
||||
...utilities,
|
||||
...positions,
|
||||
}
|
||||
export { dispatchMessage }
|
||||
|
||||
@@ -1,152 +0,0 @@
|
||||
import { publishActionReply, parseSimTime } from '../../actionsHelper.js'
|
||||
|
||||
export const methods = {
|
||||
|
||||
/* Event-Rx:
|
||||
{
|
||||
"action": "GETAGENTPOSITION",
|
||||
"reqid": "6az5e4r6a",
|
||||
"payload": {
|
||||
"agentId": "agent42",
|
||||
"t": 12.5
|
||||
}
|
||||
}
|
||||
Event-Tx:
|
||||
{
|
||||
"action": "GETAGENTPOSITION",
|
||||
"success": true,
|
||||
"reqid": "6az5e4r6a",
|
||||
"payload": {
|
||||
"agent": {
|
||||
"id": "agent42",
|
||||
"position": { "x": 1, "y": 2, "z": 3 },
|
||||
"vector": { "x": 0, "y": 0, "z": 0 },
|
||||
"since": 0,
|
||||
"generation": 2,
|
||||
"t": 12.5
|
||||
}
|
||||
}
|
||||
}
|
||||
*/
|
||||
async action_GETAGENTPOSITION(action, payload, reqid, sender, roles) {
|
||||
const replyOpts = {
|
||||
action,
|
||||
reqid,
|
||||
sender,
|
||||
replyChannel: this.config.gps.gpsActionsReply,
|
||||
}
|
||||
if(!this.accessRights.canDo(roles, action)) {
|
||||
publishActionReply(this, { ...replyOpts, reply: {
|
||||
success: false,
|
||||
err: 'Unauthorized action !',
|
||||
} })
|
||||
return
|
||||
}
|
||||
|
||||
if(!this.gpsSrv.isLive()) {
|
||||
publishActionReply(this, { ...replyOpts, reply: {
|
||||
success: false,
|
||||
err: 'Simulation not live',
|
||||
} })
|
||||
return
|
||||
}
|
||||
|
||||
const agentId = payload?.agentId
|
||||
if(!agentId || typeof(agentId) !== 'string') {
|
||||
publishActionReply(this, { ...replyOpts, reply: {
|
||||
success: false,
|
||||
err: 'Missing or invalid agentId',
|
||||
} })
|
||||
return
|
||||
}
|
||||
|
||||
const at = parseSimTime(payload, () => this.gpsSrv.now())
|
||||
if(at === null) {
|
||||
publishActionReply(this, { ...replyOpts, reply: {
|
||||
success: false,
|
||||
err: 'Invalid simulation time',
|
||||
} })
|
||||
return
|
||||
}
|
||||
|
||||
const agent = this.gpsSrv.getAgentPosition(agentId, at)
|
||||
if(!agent) {
|
||||
publishActionReply(this, { ...replyOpts, reply: {
|
||||
success: false,
|
||||
err: `Unknown agent: ${agentId}`,
|
||||
} })
|
||||
return
|
||||
}
|
||||
|
||||
publishActionReply(this, { ...replyOpts, reply: {
|
||||
success: true,
|
||||
payload: { agent },
|
||||
} })
|
||||
},
|
||||
|
||||
/* Event-Rx:
|
||||
{
|
||||
"action": "GETAGENTSINPRISM",
|
||||
"reqid": "6az5e4r6a",
|
||||
"payload": {
|
||||
"prism": {
|
||||
"xMin": -10, "xMax": 10,
|
||||
"yMin": -10, "yMax": 10,
|
||||
"zMin": 0, "zMax": 5
|
||||
},
|
||||
"t": 0
|
||||
}
|
||||
}
|
||||
*/
|
||||
async action_GETAGENTSINPRISM(action, payload, reqid, sender, roles) {
|
||||
const replyOpts = {
|
||||
action,
|
||||
reqid,
|
||||
sender,
|
||||
replyChannel: this.config.gps.gpsActionsReply,
|
||||
}
|
||||
if(!this.accessRights.canDo(roles, action)) {
|
||||
publishActionReply(this, { ...replyOpts, reply: {
|
||||
success: false,
|
||||
err: 'Unauthorized action !',
|
||||
} })
|
||||
return
|
||||
}
|
||||
|
||||
if(!this.gpsSrv.isLive()) {
|
||||
publishActionReply(this, { ...replyOpts, reply: {
|
||||
success: false,
|
||||
err: 'Simulation not live',
|
||||
} })
|
||||
return
|
||||
}
|
||||
|
||||
const prism = payload?.prism
|
||||
if(!this.gpsSrv.isValidPrism(prism)) {
|
||||
publishActionReply(this, { ...replyOpts, reply: {
|
||||
success: false,
|
||||
err: 'Missing or invalid prism bounds',
|
||||
} })
|
||||
return
|
||||
}
|
||||
|
||||
const at = parseSimTime(payload, () => this.gpsSrv.now())
|
||||
if(at === null) {
|
||||
publishActionReply(this, { ...replyOpts, reply: {
|
||||
success: false,
|
||||
err: 'Invalid simulation time',
|
||||
} })
|
||||
return
|
||||
}
|
||||
|
||||
const agents = this.gpsSrv.getAgentsInPrism(prism, at)
|
||||
publishActionReply(this, { ...replyOpts, reply: {
|
||||
success: true,
|
||||
payload: {
|
||||
agents,
|
||||
t: at,
|
||||
},
|
||||
} })
|
||||
},
|
||||
|
||||
}
|
||||
+11
-11
@@ -1,23 +1,23 @@
|
||||
|
||||
export class AgentStore {
|
||||
|
||||
constructor(systemCnx, storage, debug = false) {
|
||||
constructor(systemCnx, gpsStorage, debug = false) {
|
||||
this.cnx = systemCnx
|
||||
this.storage = storage
|
||||
this.gpsStorage = gpsStorage
|
||||
this.debug = debug
|
||||
}
|
||||
|
||||
agentHashKey(agentId) {
|
||||
return(this.storage.agentHashKey.replace(/\[UID\]/g, agentId))
|
||||
return(this.gpsStorage.agentHashKey.replace(/\[UID\]/g, agentId))
|
||||
}
|
||||
|
||||
async clearAll() {
|
||||
try {
|
||||
const ids = await this.cnx.redisSmembers(this.storage.agentsIndexKey)
|
||||
const ids = await this.cnx.redisSmembers(this.gpsStorage.agentsIndexKey)
|
||||
for(const id of ids) {
|
||||
await this.cnx.redisDel(this.agentHashKey(id))
|
||||
}
|
||||
await this.cnx.redisDel(this.storage.agentsIndexKey)
|
||||
await this.cnx.redisDel(this.gpsStorage.agentsIndexKey)
|
||||
if(this.debug) console.log(`[GPS] Cleared system agent store (${ids.length} agent(s))`)
|
||||
} catch(err) {
|
||||
console.error('[GPS] Failed to clear system agent store:', err)
|
||||
@@ -37,11 +37,11 @@ export class AgentStore {
|
||||
simulationId,
|
||||
}
|
||||
await this.cnx.redisHset(this.agentHashKey(agent.id), 'segment', record)
|
||||
await this.cnx.redisSadd(this.storage.agentsIndexKey, agent.id)
|
||||
await this.cnx.redisSadd(this.gpsStorage.agentsIndexKey, agent.id)
|
||||
await this.cnx.redisXadd(
|
||||
this.storage.positionsStream,
|
||||
this.gpsStorage.positionsStream,
|
||||
record,
|
||||
this.storage.streamMaxLen ?? ''
|
||||
this.gpsStorage.streamMaxLen ?? ''
|
||||
)
|
||||
if(this.debug) console.log(`[GPS] Exported segment ${agent.id} (${eventType})`)
|
||||
} catch(err) {
|
||||
@@ -57,11 +57,11 @@ export class AgentStore {
|
||||
t: simT,
|
||||
}
|
||||
await this.cnx.redisDel(this.agentHashKey(agentId))
|
||||
await this.cnx.redisSrem(this.storage.agentsIndexKey, agentId)
|
||||
await this.cnx.redisSrem(this.gpsStorage.agentsIndexKey, agentId)
|
||||
await this.cnx.redisXadd(
|
||||
this.storage.positionsStream,
|
||||
this.gpsStorage.positionsStream,
|
||||
record,
|
||||
this.storage.streamMaxLen ?? ''
|
||||
this.gpsStorage.streamMaxLen ?? ''
|
||||
)
|
||||
if(this.debug) console.log(`[GPS] Exported remove ${agentId}`)
|
||||
} catch(err) {
|
||||
|
||||
@@ -1,9 +1,9 @@
|
||||
|
||||
export class ArenaAgentLoader {
|
||||
|
||||
constructor(arenaCnx, storage, debug = false) {
|
||||
constructor(arenaCnx, arenaStorage, debug = false) {
|
||||
this.cnx = arenaCnx
|
||||
this.storage = storage
|
||||
this.arenaStorage = arenaStorage
|
||||
this.debug = debug
|
||||
}
|
||||
|
||||
@@ -45,11 +45,11 @@ export class ArenaAgentLoader {
|
||||
|
||||
async #listAgentIds(expectedIds = null) {
|
||||
if(Array.isArray(expectedIds) && expectedIds.length) return([...expectedIds])
|
||||
return(await this.cnx.redisSmembers(this.storage.agentsIndexKey))
|
||||
return(await this.cnx.redisSmembers(this.arenaStorage.agentsIndexKey))
|
||||
}
|
||||
|
||||
async #loadAgentFromHash(agentId) {
|
||||
const key = this.storage.agentHashKey.replace(/\[UID\]/g, agentId)
|
||||
const key = this.arenaStorage.agentHashKey.replace(/\[UID\]/g, agentId)
|
||||
const positionRaw = await this.cnx.redisHget(key, 'position')
|
||||
const vectorRaw = await this.cnx.redisHget(key, 'vector')
|
||||
let position = this.#parseHashField(positionRaw)
|
||||
|
||||
+3
-3
@@ -89,9 +89,9 @@ export class gpsServer {
|
||||
}
|
||||
|
||||
initAgentStore() {
|
||||
const storage = this.gpsConfig.gps?.storage
|
||||
if(storage && this.systemCnx) {
|
||||
this.agentStore = new AgentStore(this.systemCnx, storage, this.debug)
|
||||
const gpsStorage = this.gpsConfig.gps?.GPSstorage
|
||||
if(gpsStorage && this.systemCnx) {
|
||||
this.agentStore = new AgentStore(this.systemCnx, gpsStorage, this.debug)
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
@@ -1,6 +1,8 @@
|
||||
#!/bin/sh
|
||||
|
||||
set -a
|
||||
. /etc/p42/secrets.env
|
||||
set +a
|
||||
|
||||
daemon=p42Gps
|
||||
logfile=gps.log
|
||||
|
||||
Reference in New Issue
Block a user