/**
* @NoAdminRequired
*/
public function poll($command, $args)
{
$response = new JSONResponse();
try {
$esId = isset($args['es_id']) ? $args['es_id'] : null;
$session = $this->loadSession($esId);
$memberId = isset($args['member_id']) ? $args['member_id'] : null;
$member = $this->loadMember($memberId);
$this->validateSession($session);
switch ($command) {
case 'sync_ops':
$seqHead = (string) isset($args['seq_head']) ? $args['seq_head'] : null;
if (!is_null($seqHead)) {
$ops = isset($args['client_ops']) ? $args['client_ops'] : [];
$op = new Db\Op();
$currentHead = $op->getHeadSeq($esId);
try {
$member->updateActivity($memberId);
} catch (\Exception $e) {
//Db error. Not critical
}
$response->setData($session->syncOps($memberId, $currentHead, $seqHead, $ops));
$inactiveMembers = $member->updateByTimeout($esId);
foreach ($inactiveMembers as $inactive) {
$op->removeCursor($esId, $inactive);
$op->removeMember($esId, $inactive);
}
} else {
// Error - no seq_head passed
throw new BadRequestException();
}
break;
default:
$ex = new BadRequestException();
$ex->setBody(implode(',', $this->request->getParams()));
throw $ex;
}
} catch (BadRequestException $e) {
$response->setStatus(Http::STATUS_BAD_REQUEST);
$response->setData(['err' => 'bad request:[' . $e->getBody() . ']']);
}
return $response;
}