/**
  * Service bus should broadcast messages using given driver.
  */
 public function testBroadcast()
 {
     $request = new Request('', null);
     $this->driver->expects($this->once())->method('broadcast')->with($request);
     $this->serviceBus->broadcast($request);
 }
<?php

require_once __DIR__ . '/../vendor/autoload.php';
use Seven\Component\MessageBusClient\ServiceBus;
use Seven\Component\MessageBusClient\Encoder\JsonEncoder;
use Seven\Component\MessageBusClient\Message\Request;
use Seven\Component\MessageBusClient\Protocol\AMQP;
use PhpAmqpLib\Connection\AMQPStreamConnection;
$env = function ($key, $default = null) {
    return isset($_SERVER[$key]) ? $_SERVER[$key] : $default;
};
$connection = new AMQPStreamConnection($env('AMQP_HOST', 'localhost'), $env('AMQP_PORT', 5672), $env('AMQP_USER', 'guest'), $env('AMQP_PASSWORD', 'guest'), $env('AMQP_VHOST', '/'));
$channel = $connection->channel();
$driver = new AMQP\Driver($channel, 'outbox', new JsonEncoder());
$bus = new ServiceBus($driver);
// Broadcast a message to all subscribers
$bus->broadcast(new Request('category_repository.updated', '1.0', ['category' => ['name' => 'Fruits', 'position' => 10]]));
<?php

require_once __DIR__ . '/../vendor/autoload.php';
use Seven\Component\MessageBusClient\Binding\CallbackBinding;
use Seven\Component\MessageBusClient\ServiceBus;
use Seven\Component\MessageBusClient\Encoder\JsonEncoder;
use Seven\Component\MessageBusClient\Message\Request;
use Seven\Component\MessageBusClient\Protocol\AMQP;
use PhpAmqpLib\Connection\AMQPStreamConnection;
$env = function ($key, $default = null) {
    return isset($_SERVER[$key]) ? $_SERVER[$key] : $default;
};
$connection = new AMQPStreamConnection($env('AMQP_HOST', 'localhost'), $env('AMQP_PORT', 5672), $env('AMQP_USER', 'guest'), $env('AMQP_PASSWORD', 'guest'), $env('AMQP_VHOST', '/'));
$channel = $connection->channel();
$driver = new AMQP\Driver($channel, 'outbox', new JsonEncoder());
$bus = new ServiceBus($driver);
// Define a service and few versions of the same method
$service = $bus->define('calc')->bind((new CallbackBinding())->on('add', '1', function ($a, $b) {
    return $a + $b;
})->on('add', '1.1', function (Request $request) {
    return array_sum($request->getArguments());
}));
// Call add, version 1.0
$result = $service->call(new Request('add', '1.0', ['a' => 2, 'b' => 10, 'c' => 9]))->resolve()->getValue();
var_export($result);
// gives 12
// Call add, version 1.1
$result = $service->call(new Request('add', '1.1', [2, 10, 9]))->resolve()->getValue();
var_export($result);
// gives 21
<?php

require_once __DIR__ . '/../vendor/autoload.php';
use Seven\Component\MessageBusClient\ServiceBus;
use Seven\Component\MessageBusClient\Message\Request;
use Seven\Component\MessageBusClient\Protocol\JSONRPC;
$env = function ($key, $default = null) {
    return isset($_SERVER[$key]) ? $_SERVER[$key] : $default;
};
$driver = new JSONRPC\Driver($env('JSON_RPC_URL', 'http://localhost:8000/json-rpc'));
$bus = new ServiceBus($driver);
// Make a call
$promise = $bus->discover('calc')->call(new Request('div', '1', ['a' => 10, 'b' => 5]));
// Wait for response
$response = $promise->resolve();
// Should be 2
var_export($response->getValue());
echo PHP_EOL;
<?php

require_once __DIR__ . '/../vendor/autoload.php';
use Seven\Component\MessageBusClient\ServiceBus;
use Seven\Component\MessageBusClient\Encoder\JsonEncoder;
use Seven\Component\MessageBusClient\Message\Request;
use Seven\Component\MessageBusClient\Protocol\AMQP;
use PhpAmqpLib\Connection\AMQPStreamConnection;
$env = function ($key, $default = null) {
    return isset($_SERVER[$key]) ? $_SERVER[$key] : $default;
};
$connection = new AMQPStreamConnection($env('AMQP_HOST', 'localhost'), $env('AMQP_PORT', 5672), $env('AMQP_USER', 'guest'), $env('AMQP_PASSWORD', 'guest'), $env('AMQP_VHOST', '/'));
$channel = $connection->channel();
$driver = new AMQP\Driver($channel, 'outbox', new JsonEncoder());
$bus = new ServiceBus($driver);
// Make a call
$promise = $bus->discover('category_repository')->call(new Request('category_repository.find', '1.0', ['query' => ['offset' => 10, 'size' => 10]]));
// Wait for response
$response = $promise->resolve();
<?php

require_once __DIR__ . '/../vendor/autoload.php';
use Seven\Component\MessageBusClient\ServiceBus;
use Seven\Component\MessageBusClient\Encoder\JsonEncoder;
use Seven\Component\MessageBusClient\Message\Request;
use Seven\Component\MessageBusClient\Protocol\AMQP;
use PhpAmqpLib\Connection\AMQPStreamConnection;
$env = function ($key, $default = null) {
    return isset($_SERVER[$key]) ? $_SERVER[$key] : $default;
};
$connection = new AMQPStreamConnection($env('AMQP_HOST', 'localhost'), $env('AMQP_PORT', 5672), $env('AMQP_USER', 'guest'), $env('AMQP_PASSWORD', 'guest'), $env('AMQP_VHOST', '/'));
$channel = $connection->channel();
$driver = new AMQP\Driver($channel, 'outbox', new JsonEncoder());
$bus = new ServiceBus($driver);
// Publish a message asynchronously
$bus->discover('category_repository')->publish(new Request('category_repository.updated', '1.0', ['category' => ['name' => 'Fruits', 'position' => 10]]));
<?php

require_once __DIR__ . '/../vendor/autoload.php';
use Seven\Component\MessageBusClient\Driver\SplitDriver;
use Seven\Component\MessageBusClient\ServiceBus;
use Seven\Component\MessageBusClient\Encoder\JsonEncoder;
use Seven\Component\MessageBusClient\Message\Request;
use Seven\Component\MessageBusClient\Protocol\AMQP;
use Seven\Component\MessageBusClient\Protocol\JSONRPC;
use PhpAmqpLib\Connection\AMQPStreamConnection;
$env = function ($key, $default = null) {
    return isset($_SERVER[$key]) ? $_SERVER[$key] : $default;
};
// Build AMQP Driver
$connection = new AMQPStreamConnection($env('AMQP_HOST', 'localhost'), $env('AMQP_PORT', 5672), $env('AMQP_USER', 'guest'), $env('AMQP_PASSWORD', 'guest'), $env('AMQP_VHOST', '/'));
$channel = $connection->channel();
$amqp = new AMQP\Driver($channel, 'outbox', new JsonEncoder());
// Build JSON RPC Driver
$jsonrpc = new JSONRPC\Driver($env('JSON_RPC_URL', 'http://localhost:8000/json-rpc'));
// Create instance of split driver and use JSON RPC as sync and AMQP as async
$bus = new ServiceBus(new SplitDriver($jsonrpc, $amqp));
// Asynchronously published message will use AMPQ driver
$bus->discover('category_repository')->publish(new Request('category_repository.updated', '1.0', ['category' => ['name' => 'Fruits', 'position' => 10]]));
// Synchronously published message will use JSON RPC driver
$response = $bus->discover('category_repository')->call(new Request('category_repository.updated', '1.0', ['category' => ['name' => 'Fruits', 'position' => 10]]))->resolve();