public function onMessage(ConnectionInterface $from, $msg)
 {
     echo 'Received data from ' . $from->resourceId . ' (' . strlen($msg) . ')' . "\n";
     try {
         $req = json_decode($msg, true);
         if (json_last_error() !== JSON_ERROR_NONE || empty($req)) {
             throw new \RuntimeException('Bad request: invalid JSON (#' . json_last_error() . '): ' . $input);
         }
         if (!isset($req['id']) || !is_int($req['id'])) {
             throw new \RuntimeException('Bad request: invalid request id');
         }
         if (!isset($req['data']) || !is_array($req['data'])) {
             throw new \RuntimeException('Bad request: invalid request data');
         }
         if (isset($req['http_headers']) && is_array($req['http_headers'])) {
             if (isset($req['http_headers']['Accept-Language'])) {
                 $_SERVER['HTTP_ACCEPT_LANGUAGE'] = $req['http_headers']['Accept-Language'];
             }
         }
         $reqId = $req['id'];
         if (isset($req['groupped']) && $req['groupped'] == true) {
             $resp = $this->_handleRequestGroup($from, $req['data']);
         } else {
             $resp = $this->_handleRequest($from, $req['data']);
         }
         $resp->setId($reqId);
     } catch (Exception $e) {
         $errMsg = $e->getMessage();
         $resp = new ApiResponse();
         $resp->setSuccess(false);
         $resp->setValue($errMsg);
         $resp->setChannel(2, $errMsg);
     }
     $output = $resp->generate();
     echo 'Sending data to ' . $from->resourceId . ' (' . strlen($output) . ')' . "\n";
     $from->send($output);
 }