Home

Awesome

Laravel Janus Gateway Client

Latest Version on Packagist Total Downloads Tests StyleCI License


This package provides a client to fluently interact with your Janus Gateway Server

Prerequisites

LaravelPHPjanus-client
8.x^7.4 ^8.0 ^8.1<= 1.0.0
9.x^8.0.2 ^8.1>= 1.1.0
10.x^8.1 ^8.2>= 1.2.0
11.x^8.2 ^8.3>= 1.3.0

Included


Fluent, convenient, clean.

use RTippin\Janus\Facades\Janus;

$ping = Janus::ping(); 

---------------------------------------

['pong' => true]

---------------------------------------

$room = Janus::videoRoom()->create([
    'description' => 'My first room!',
    'publishers' => 4,
]);

---------------------------------------

[
  'videoroom' => 'created',
  'room' => 6663183870503329,
  'permanent' => false,
  'pin' => 'TFQuls',
  'secret' => 'y2WaVehf7cOM',
]

Installation

Via Composer

composer require rtippin/janus-client

Publish the config file

php artisan vendor:publish --tag=janus

Config

'server_endpoint' => env('JANUS_SERVER_ENDPOINT'),
'admin_server_endpoint' => env('JANUS_ADMIN_SERVER_ENDPOINT'),
'verify_ssl' => env('JANUS_VERIFY_SSL', true),
'debug' => env('JANUS_DEBUG', false),
'admin_secret' => env('JANUS_ADMIN_SECRET'),
'api_secret' => env('JANUS_API_SECRET'),
'video_room_secret' => env('JANUS_VIDEO_ROOM_SECRET'),

General Usage

Notice, Janus is registered as a singleton. Once you instantiate our class, it will be kept in memory with its current state for that request cycle.

Obtaining the Janus client

Using Facade

use RTippin\Janus\Facades\Janus;

$info = Janus::info() || Janus::getInstance()->info();

Using Dependency Injection

<?php

namespace App\Http\Controllers;

use RTippin\Janus\Janus;

class JanusController
{
    private Janus $janus;

    public function __construct(Janus $janus)
    {
       $this->janus = $janus;
    }
}

info()

Janus::info();

ping()

Janus::ping();

debug(bool $debug = true)

use RTippin\Janus\Facades\Janus;

Route::get('test', function(){
    Janus::debug()->ping();
    dump('It dumps inline for each http call!');
});

//OUTPUT

"PAYLOAD"

array:3 [▼
  "transaction" => "q52xpYrZJ6e6"
  "apisecret" => "secret"
  "janus" => "ping"
]

"RESPONSE"

array:2 [▼
  "janus" => "pong"
  "transaction" => "q52xpYrZJ6e6"
]

"LATENCY"

16.0

"It dumps inline for each http call!"

connect()

Janus::connect();

attach(string $plugin)

Janus::attach('janus.plugin.name');

detach()

Janus::detach();

disconnect()

Janus::disconnect();

message(array $message, $jsep = null)

Janus::message(['request' => 'list']);

trickle($candidate)

Janus::trickle('candidate information');

server()

use RTippin\Janus\Facades\Janus;

$server = Janus::server()
    ->setServerEndpoint('http://test.com')
    ->setAdminServerEndpoint('http://test.com/admin')
    ->setApiSecret('secret');
    
Janus::connect();

$response = $server->getApiResponse();
$payload = $server->getApiPayload();
$latency = $server->getEndLatency();

Example Cycle

use RTippin\Janus\Facades\Janus;

//Send our command for the results we want.    
Janus::connect()
    ->attach('janus.plugin.videoroom')
    ->message(['request' => 'list']);

//Set the results from the last command sent.
$rooms = Janus::getApiResponse();

//Disconnect and reset all janus values.
Janus::disconnect();

Shared Plugin Methods

All Plugin methods will return the plugin response array from janus directly.

Examples using VideoRoom plugin

{JanusPlugin}->withoutDisconnect() | {JanusPlugin}->disconnect(bool $force = false)

Example video room call to remove all rooms

use RTippin\Janus\Facades\Janus;

//Disable disconnects for plugin calls.
Janus::videoRoom()->withoutDisconnect();

//Grab list of rooms.
$rooms = Janus::videoRoom()->list()['list'];

//Destroy each room.
foreach ($rooms as $room) {
    Janus::videoRoom()->destroy($room['room']);
}

//Now disconnect to remove our session/handle.
Janus::videoRoom()->disconnect(true); //Forced on current plugin instance.
---------------------------------------------------------------------------
Janus::disconnect(); //Main disconnect will always be run if called.

{JanusPlugin}->getPluginResponse(?string $key = null)

//Make plugin call. 
Janus::videoRoom()->list();

//Get response.
$list = Janus::videoRoom()->getPluginResponse('list');

{JanusPlugin}->getPluginPayload(?string $key = null)

//Make plugin call. 
Janus::videoRoom()->list();

//Get payload.
$payload = Janus::videoRoom()->getPluginPayload();

Video Room

For full docs relating to the video room plugin and its responses, please check the Official Docs

Using Facade

use RTippin\Janus\Facades\Janus;

$videoRoom = Janus::videoRoom();

Using Dependency Injection

<?php

namespace App\Http\Controllers;

use RTippin\Janus\Plugins\VideoRoom;

class VideoRoomController
{
    private VideoRoom $videoRoom;

    public function __construct(VideoRoom $videoRoom)
    {
       $this->videoRoom = $videoRoom;
    }
}

list()

$list = Janus::videoRoom()->list();

exists(int $room)

$exists = Janus::videoRoom()->exists(12345678);

create(array $params = [], bool $usePin = true, bool $useSecret = true)

$room = Janus::videoRoom()->create([
    'description' => 'My first room!',
    'publishers' => 10,
    'bitrate' => 1024000,
    'is_private' => true,
]);

edit(int $room, array $params, ?string $secret = null)

$newProperties = [
    'new_description' => 'First room!',
    'new_bitrate' => 600000,
];

$edit = Janus::videoRoom()->edit(12345678, $newProperties, 'SECRET');

allowed(int $room, string $action, ?array $allowed = null, ?string $secret = null)

$allowed = Janus::videoRoom()->allowed(12345678, 'remove', ['token'], 'SECRET');

kick(int $room, int $participantID, ?string $secret = null)

$kick = Janus::videoRoom()->kick(12345678, 987654321, 'SECRET');

listParticipants(int $room)

$participants = Janus::videoRoom()->listParticipants(12345678);

listForwarders(int $room, ?string $secret = null)

$forwarders = Janus::videoRoom()->listForwarders(12345678, 'SECRET');

destroy(int $room, ?string $secret = null)

$destroy = Janus::videoRoom()->destroy(12345678, 'SECRET');

moderate(int $room, int $participantID, bool $mute, ?string $mid = null, ?string $secret = null)

$moderate = Janus::videoRoom()->moderate(12345678, 987654321, true, 'm-line' 'SECRET');

enableRecording(int $room, bool $record, ?string $secret = null)

$record = Janus::videoRoom()->enableRecording(12345678, true, 'SECRET');

Example Cycle using many methods without disconnecting between them.

use RTippin\Janus\Facades\Janus;

//Disable disconnect between each method call.
Janus::videoRoom()->withoutDisconnect();

//Run methods as needed. Connect and attach will only be called once.
if (Janus::videoRoom()->exists(12345678)['exists']) {
    Janus::videoRoom()->destroy(12345678);
}

//Disconnect and reset all janus values.
Janus::disconnect();

Credits - Richard Tippin

License - MIT

Please see the license file for more information.