Api PHP to Javascript
From Yate Documentation
Api script to call functions in Yate Javascript.
Contents |
Usage
Use api from yate javascript
init.js
#require "api.js" var a = 'b'; var b = 1; var c = ['1',2,'3']; var d = {'str':'test', 'num':b, 'arr':c, 'obj':{'test':'test'}}; function apiOnCommand(req){ if(!req.act) return false; switch (req.act){ case 'autodial': return createAllAD(); break; case 'test0': return a; break; case 'test1': return b; break; case 'test2': return c; break; case 'test3': return d; break; } return false; }
Use api from php
api.php
require_once('./yate.api.class.php');
$yate = new YateApi();
$res = $yate->api(array('act'=>'test0'));
print_r($res);
result:
string(1) b
$res = $yate->api(array('act'=>'test1'));
print_r($res);
result:
int(1) 1
$res = $yate->api(array('act'=>'test2'));
print_r($res);
result:
Array ( [0] => 1 - string(1) [1] => 2 - int(1) [2] => 3 - string(1) )
$res = $yate->api(array('act'=>'test3'));
print_r($res);
result:
Array
(
[str] => test
[num] => 1
[arr] => Array
(
[0] => 1
[1] => 2
[2] => 3
)
[obj] => Array
(
[test] => test
)
)
Yate Setup
javascript.conf
[general] scripts_dir=/your/dir/where/js/files/
[scripts] init=init.js
Code: api.js
function qs2obj(str){
str = str.trim();
var vsks = str.split("&");
var ret = {};
for(var kv in vsks){
var s = vsks[kv];
s = s.split("=");
ret[s[0]] = s[1];
}
return ret;
}
function json2str(obj){
var res = ;
var prolog = '{';
var epilog = '}';
var type = 0;
var e = [];
switch (typeof(obj)) {
case 'string':
res += '"'+obj+'"';
break;
case 'number':
res = obj;
break;
case 'object':
for(var i in obj){
if(i==0){
prolog = '[';
epilog = ']';
type = 1;
}
if(type){
var o = json2str(obj[i]);
} else {
var o = '"'+i+'":'+json2str(obj[i]);
}
e.push(o);
}
res = prolog+e.join(',')+epilog;
break;
}
return res;
}
//function apiOnCommand(res){}
function apiCommand(msg){
if(!msg.line) return false;
var obj = qs2obj(msg.line);
var res = apiOnCommand(obj);
if(!res) return false;
msg.retValue('[' + json2str(res) + ']' + "\r\n");
return true;
}
Message.install(apiCommand, 'engine.command', 150);
Code: yate.api.class.php
<?
class YateApi extends Socket
{
/**
Commands
status
uptime
reload
restart
stop
.... -> will be mapped into an engine.command
*/
function stop()
{
return self::command('stop');
}
function restart()
{
return self::command('restart');
}
function reload()
{
return self::command('reload');
}
function api($arr = array())
{
$res = self::command(http_build_query($arr));
$arr = json_decode($res, true);
if(!json_last_error()) return $arr[0];
return array('error'=>true, 'message'=>'invalid-json', 'response'=>$res);
}
function status()
{
return self::command('status');
}
function daytime($sec)
{
$arr = array();
$arr['d'] = floor($sec / 86400);
$arr['H'] = floor(($sec % 86400) / 3600);
$arr['i'] = floor(($sec % 3600) / 60);
$arr['s'] = $sec % 60;
return $arr;
}
function uptime()
{
$return = self::command('uptime');
if(preg_match("/\((.*)\)/",$return, $arr))
{
$sec = (int)$arr[1];
return array(
'start' => date('d.m.Y H:i:s', time()-$sec),
'seconds' => $sec,
'daytime' => $this->daytime($sec)
);
}
return false;
}
}
class Socket
{
var $error = array();
var $socket = false;
function __construct($ip = '127.0.0.1', $port = '5038', $ssl = false) // default settings
{
if($ssl && !in_array("ssl", stream_get_transports()))
{
$this->error[] = 'No support ssl protocol';
return false;
}
if(!$this->socket = @fsockopen($ip,$port,$errno,$errstr,30))
{
$this->error[] = "Web page can't connect to ip=$ip, port=$port [$errno] \"".$errstr."\"";
return false;
}
else
{
$line1 = $this->read();
}
return true;
}
function read($marker_end = "\r\n")
{
if(!$this->socket) return false;
$keep_trying = true;
$line = "";
while($keep_trying)
{
$line .= fgets($this->socket,8192);
if($line === false) continue;
if(substr($line, -strlen($marker_end)) == $marker_end) $keep_trying = false;
}
$line = str_replace("\r\n", "", $line);
return $line;
}
function write($str)
{
if(!$this->socket) return false;
return fwrite($this->socket, $str."\r\n");
}
function close()
{
if(!$this->socket) return false;
return fclose($this->socket);
}
function __destruct()
{
return $this->close();
}
function command($command, $marker_end = "\r\n")
{
if(!$this->socket) return false;
$this->write($command);
return $this->read($marker_end);
}
}
?>
See also: