├── .gitignore ├── README.md ├── email ├── client.php ├── composer.json ├── composer.lock └── server.php ├── multiple ├── articles │ └── index.php ├── client.php ├── composer.json ├── composer.lock ├── media │ └── index.php ├── notifications │ └── index.php └── servers │ ├── media_server.php │ └── notification_server.php ├── rest ├── .gitignore ├── client.php ├── composer.json ├── composer.lock └── server.php ├── security ├── authbearer │ └── AuthBearer.php ├── authentication_service │ ├── functions.php │ └── server.php ├── client.php ├── composer.json ├── composer.lock ├── index.php ├── payment_server │ ├── functions.php │ └── server.php └── tests │ ├── AuthenticationServerTest.php │ └── PaymentSeverTest.php ├── socket_vs_http ├── client.php ├── composer.json ├── composer.lock ├── http_server │ ├── get.php │ └── index.php └── socket_server │ └── server.php └── video ├── client.php ├── composer.json ├── composer.lock └── server.php /.gitignore: -------------------------------------------------------------------------------- 1 | static_test/vendor/* 2 | email/vendor/* 3 | rest/vendor/* 4 | video/vendor/* 5 | multiple/vendor/* 6 | security/vendor/* 7 | socket_vs_http/vendor/* 8 | .DS_STORE 9 | .settings 10 | .project 11 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | # PHP MicroServices Examples 2 | This is a repo of example MicroServices using PHP. Areas of topics will include: 3 | - Socket Programming 4 | - RabbitMQ Example 5 | - RESTFUL Example 6 | - Authentication and Authorization Example 7 | - Functional Programming Example 8 | 9 | Many of the examples use [ProdigyView Toolkit](https://github.com/ProdigyView-Toolkit/prodigyview "ProdigyView Toolkit") for development. 10 | 11 | #### Requirements To Run Test 12 | 1. Composer 13 | 2. PHP7 14 | 3. PHP Sockets Extensions Installed 15 | 16 | ## E-Mail and Socket Programming 17 | #### Overview 18 | The mail microservice uses basic socket communication between a socket server and service. For explanation, please read: [PHP Microservices — Send Emails Over Sockets](https://medium.com/@BlackMage1987/php-microservices-send-emails-over-sockets-977e9f8f3c3d "PHP Microservices — Send Emails Over Sockets") 19 | #### How To Run 20 | 1. Go to the `email` folder 21 | 2. Run `composer install` to install required packages 22 | 3. Open up two tabs in your console 23 | 4. In one tab, run `php server.php` 24 | 5. In the other tab, run `php client.php` 25 | 26 | 27 | ## Video Processing and RabbitMQ 28 | #### Overview 29 | The services shows a basic example of how to create a service for processing videos with RabbitMQ. For detailed explanation of the service, please visit: [PHP Microservices — Video Processing With RabbitMQ](https://medium.com/@BlackMage1987/php-microservices-video-processing-with-rabbitmq-76deba359768 "PHP Microservices — Video Processing With RabbitMQ") 30 | 31 | #### How To Run 32 | 1. Ensure RabbitMQ is installed and running locally 33 | 2. Go to the `video` folder 34 | 3. Run `composer install` to install required packages 35 | 4. Open up two tabs in your console 36 | 5. In one tab, run `php server.php` 37 | 6. In the other tab, run `php client.php` 38 | 39 | ## Restful Crud API 40 | #### Overview 41 | This tutorial will demonstrate how to create a basic REST api for processing CRUD operation at an endpoint. For detailed information, please visit: [PHP Microservices — Creating A Basic Restful Crud API](https://medium.com/@BlackMage1987/php-microservices-creating-a-basic-restful-crud-api-dabb1a1941a5 "PHP Microservices — Creating A Basic Restful Crud API") 42 | 43 | #### How To Run 44 | 1. Go to the `rest` folder 45 | 2. Run `composer install` to install required packages 46 | 3. Open up two tabs in your console 47 | 4. In one tab, we need to start a php server with `php -S 127.0.0.1:8080` 48 | 5. In the other tab, run `php client.php` 49 | 50 | 51 | ## Organizing Access To Microservices 52 | #### Overview 53 | This section will show how to organize and manage multiple microservices. The past 3 examples have been combined into one, with the addition of sending pushing notifications and image processing. The goal is to give each service their own resources, and organize calling them via REST API. 54 | 55 | For detailed work through please read [Organizing Access To Multiple Services](https://medium.com/helium-mvc/php-microservices-organizing-access-to-multiple-services-a841a4d639e1 "Organizing Access To Multiple Services"). 56 | 57 | #### How To Run 58 | We will need **four** tabs to effectively run this example. 59 | 60 | 1. Start your RabbitMQ Server 61 | 2. Go the the `multiple` folder 62 | 3. Run `composer install` to install required packages 63 | 4. Have your four tabs open to this folder 64 | 5. Start the webserver with `php -S 127.0.0.1:8090` in one tab 65 | 6. Start the notification server with `php servers/notification_server.php` in the 2nd tab 66 | 7. Start the media server with `php servers/media_server.php` in the 3rd tab 67 | 8. Execute the tests by running `php client.php` in the last tab 68 | 69 | ## Authentication, Authorization, Functional Programming and Unit Tests 70 | 71 | #### Overview 72 | This part of the tutorials covers how to perform Authentication and Authorization between microservices. It also includes an additional information on how to do function programming and unit test. Accompanying tutorial are as followings: 73 | * [Authentication And Authorization](https://medium.com/helium-mvc/php-microservices-authentication-and-authorization-fff02b231803 "Authentication And Authorization") 74 | * [Functional Programming and Unit Testing](https://medium.com/helium-mvc/php-microservices-functional-programming-and-unit-testing-2cdc09a86198 "Functional Programming and Unit Testing") 75 | 76 | #### How To Run The Microservice 77 | Running this example requires 4 tabs on your console. 78 | 79 | 1. Go to the `security` folder. 80 | 2. Run `composer install` to install required packages 81 | 3. Make sure your 4 tabs are open in this directory 82 | 4. Start the web server with `php -S 127.0.0.1:8000` 83 | 5. Start the authentications server with `php authentication_service/server.php` 84 | 6. Start the purchase server with `php payment_server/server.php` 85 | 7. Run the client with `php client.php` in the final tab 86 | 87 | #### How To Run Tests 88 | 1. Go to the `security` folder. 89 | 2. Run `composer install` to install required packages 90 | 3. Type `./vendor/bin/phpunit --bootstrap vendor/autoload.php tests/AuthenticationServerTest.php` for Authentication Tests. 91 | 92 | ## Socket vs HTTP Performance 93 | #### Overview 94 | This tutorial and test will bring you through comparing the performance of a RESTFUL API vs Sockets. You may read along about the tests here: [REST vs Socket Performance Benchmarks](https://medium.com/helium-mvc/php-microservices-rest-vs-socket-performance-benchmarks-64d271900ca5 "REST vs Socket Performance Benchmarks") 95 | 96 | #### How To Run 97 | This test will require that 3 tabs open. 98 | 1. Go to the `socket_vs_http` folder. 99 | 2. Run `composer install` to install required packages 100 | 3. Have your 3 tabs open 101 | 4. In your first tab, start the web server with `php -S 127.0.0.1:8000 -t http_server/` 102 | 5. In the second tab, start the socket with `php socket_server/server.php` 103 | 6. In the final tab, run the client with `php client.php` 104 | 105 | -------------------------------------------------------------------------------- /email/client.php: -------------------------------------------------------------------------------- 1 | 'Jane Doe', 11 | 'email' => 'jane@example.com', 12 | 'subject' => 'Hello Jane', 13 | 'message_html'=> '

Dear Jane

You Are The Best!

', 14 | 'message_text'=> 'Dear Jane, You Are The Best!', 15 | ); 16 | 17 | //Add Token To Check 18 | $data['token'] = 'ABC123-NotRealToken'; 19 | 20 | //JSON encode the message 21 | $message = json_encode($data); 22 | 23 | //Encrypt The Message 24 | Security::init(); 25 | $message = Security::encrypt($message); 26 | 27 | //Send The Message To Our Server 28 | $host = '127.0.0.1'; 29 | $port = 8002; 30 | $socket = new Socket($host, $port, array('connect' => true)); 31 | 32 | $response = $socket->send($message); 33 | 34 | $response = Security::decrypt($response); 35 | 36 | echo "$response \n"; 37 | -------------------------------------------------------------------------------- /email/composer.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "microservices/email", 3 | "description": "Email Microservice", 4 | "type": "project", 5 | "authors": [ 6 | { 7 | "name": "Devin Dixon", 8 | "email": "ddixon@bingewave.com" 9 | } 10 | ], 11 | "minimum-stability" : "dev", 12 | "prefer-stable": true, 13 | "require": { 14 | "prodigyview/prodigyview": "dev-master", 15 | "phpmailer/phpmailer": "^6.0" 16 | } 17 | } 18 | -------------------------------------------------------------------------------- /email/server.php: -------------------------------------------------------------------------------- 1 | true, 13 | 'listen' => true 14 | )); 15 | 16 | $server->startServer('', function($message) { 17 | 18 | echo "Processing...\n"; 19 | 20 | //Decrypt our encrypted message 21 | Security::init(); 22 | $message = Security::decrypt($message); 23 | 24 | //Turn the data into an array 25 | $data = json_decode($message, true); 26 | 27 | $response = 'Not Sent'; 28 | 29 | //Verify that the correct token is being used 30 | if(isset($data['token']) && $data['token']=='ABC123-NotRealToken') { 31 | 32 | try{ 33 | $mail = new PHPMailer(true); 34 | 35 | $mail->Host = 'smtp1.example.com;smtp2.example.com'; 36 | $mail->SMTPAuth = true; 37 | $mail->Username = 'user@example.com'; 38 | $mail->Password = 'secret'; 39 | $mail->SMTPSecure = 'tls'; 40 | $mail->Port = 587; 41 | 42 | $mail->setFrom('from@example.com', 'Mailer'); 43 | $mail->addAddress($data['email'], $data['to']); 44 | 45 | $mail->isHTML(true); 46 | $mail->Subject = $data['subject']; 47 | $mail->Body = $data['message_html']; 48 | $mail->AltBody = $data['message_text']; 49 | 50 | $mail->send(); 51 | 52 | $response = 'Message Sent'; 53 | } catch (Exception $e) { 54 | echo 'Log the error somewhere'; 55 | } 56 | } 57 | 58 | //Return an encrypted message 59 | return Security::encrypt($response); 60 | 61 | }, 'closure'); 62 | -------------------------------------------------------------------------------- /multiple/articles/index.php: -------------------------------------------------------------------------------- 1 | array('title' => 'Little Red Riding Hood', 'description' => 'A sweet innocent girl meets a werewolf'), 10 | 2 => array('title' => 'Snow White and the Seven Dwarfs', 'description' => 'A sweet girl, a delicious apple, and lots of little men.'), 11 | 3 => array('title' => 'Gingerbread Man', 'description' => 'A man who actively avoids kitchens and hungry children.'), 12 | ); 13 | 14 | //Create And Process The Current Request 15 | $request = new Request(); 16 | 17 | //Get The Request Method(GET, POST, PUT, DELETE) 18 | $method = strtolower($request->getRequestMethod()); 19 | 20 | //RETRIEVE Data From The Request 21 | $data = $request->getRequestData('array'); 22 | 23 | //Route The Request 24 | if ($method === 'get') { 25 | get($data); 26 | } else if ($method === 'post') { 27 | post($data); 28 | } else if ($method === 'put') { 29 | parse_str($data,$data); 30 | put($data); 31 | } else if ($method === 'delete') { 32 | parse_str($data,$data); 33 | delete($data); 34 | } 35 | 36 | /** 37 | * Process all GET data to find information 38 | */ 39 | function get(array $data = array()) { 40 | global $articles; 41 | 42 | $response = array(); 43 | 44 | if(isset($data['id']) && isset($articles[$data['id']])) { 45 | $response = $articles[$data['id']]; 46 | } else { 47 | $response = $articles; 48 | } 49 | 50 | echo Response::createResponse(200, json_encode($response)); 51 | exit(); 52 | }; 53 | 54 | /** 55 | * Process all POST data to create data 56 | */ 57 | function post(array $data = array()) { 58 | global $articles; 59 | 60 | $response = array(); 61 | 62 | if(isset($data['title']) && isset($data['description'])) { 63 | $articles[] = $data; 64 | $response = array('status' => 'Article Successfully Added'); 65 | } else { 66 | $response = array('status' => 'Unable To Add Article'); 67 | } 68 | 69 | echo Response::createResponse(200, json_encode($response)); 70 | exit(); 71 | 72 | }; 73 | 74 | /** 75 | * Process all PUT data to update information 76 | */ 77 | function put(array $data = array()) { 78 | global $articles; 79 | 80 | $response = array(); 81 | 82 | if(isset($data['id']) && isset($articles[$data['id']])) { 83 | if(isset($data['title'])) { 84 | $articles[$data['id']]['title'] = $data['title']; 85 | } 86 | 87 | if(isset($data['description'])) { 88 | $articles[$data['id']]['description'] = $data['description']; 89 | } 90 | $response = array('status' => 'Article Successfully Updated', 'content' => $articles[$data['id']]); 91 | } else { 92 | $response = array('status' => 'Unable To Update Article'); 93 | } 94 | 95 | echo Response::createResponse(200, json_encode($response)); 96 | exit(); 97 | 98 | }; 99 | 100 | /** 101 | * Process DELETE to remove data 102 | */ 103 | function delete(array $data = array()) { 104 | global $articles; 105 | 106 | $response = array(); 107 | 108 | if(isset($data['id']) && isset($articles[$data['id']])) { 109 | unset($articles[$data['id']]); 110 | $response = array('status' => 'Article Deleted', 'content' => $articles); 111 | } else{ 112 | $response = array('status' => 'Unable To Delete Article'); 113 | } 114 | 115 | echo Response::createResponse(200, json_encode($response)); 116 | exit(); 117 | 118 | }; 119 | -------------------------------------------------------------------------------- /multiple/client.php: -------------------------------------------------------------------------------- 1 | send('get'); 19 | echo $curl->getResponse(); 20 | echo "\n\n"; 21 | 22 | //Attempts To Send Email 23 | $curl = new Curl($notifications_route); 24 | $curl->send('post', array( 25 | 'to' => 'Jane Doe', 26 | 'email' => 'jane@example.com', 27 | 'message_html' => 'Jane You Rock', 28 | 'message_text' => 'Jane You Rock' 29 | )); 30 | echo $curl->getResponse(); 31 | echo "\n\n"; 32 | 33 | //Attempts To Send Push Notification 34 | $curl = new Curl($notifications_route); 35 | $curl->send('put', array( 36 | 'payload' => array('type'=>'pop_up', 'message'=> 'Hello World'), 37 | 'device_token' => 'abc123', 38 | )); 39 | echo $curl->getResponse(); 40 | echo "\n\n"; 41 | 42 | echo "Media\n\n"; 43 | 44 | //Send Image To Be Processed 45 | $curl = new Curl($media_route); 46 | $curl->send('put', array( 47 | 'url' => 'https://images.unsplash.com/photo-1546441201-69837cbe526c?ixlib=rb-1.2.1&ixid=eyJhcHBfaWQiOjEyMDd9&auto=format&fit=crop&w=750&q=80', 48 | )); 49 | echo $curl->getResponse(); 50 | echo "\n\n"; 51 | 52 | 53 | //Send Video To Be Processed 54 | $curl = new Curl($media_route); 55 | $curl->send('post', array( 56 | 'url' => 'https://sample-videos.com/video123/mp4/720/big_buck_bunny_720p_20mb.mp4', 57 | 'convert_to' => 'mov', 58 | )); 59 | echo $curl->getResponse(); 60 | echo "\n\n"; 61 | 62 | echo "Testing The Articles\n\n"; 63 | 64 | //Retrive All Stories 65 | $curl = new Curl($article_route); 66 | $curl->send('get'); 67 | echo $curl->getResponse(); 68 | echo "\n\n"; 69 | 70 | //Retrieve A Single Story 71 | $curl = new Curl($article_route); 72 | $curl->send('get', array('id' => 1)); 73 | echo $curl->getResponse(); 74 | echo "\n\n"; 75 | 76 | //Unsuccessful Post 77 | $curl = new Curl($article_route); 78 | $curl->send('post', array('POST' => 'CREATE')); 79 | echo $curl->getResponse(); 80 | echo "\n\n"; 81 | 82 | //Successfully Creates A Story 83 | $curl = new Curl($article_route); 84 | $curl->send('post', array( 85 | 'title' => 'Robin Hood', 86 | 'description' => 'Steal from the rich and give to me.' 87 | )); 88 | echo $curl->getResponse(); 89 | echo "\n\n"; 90 | 91 | //Successfully Updates A Story 92 | $curl = new Curl($article_route); 93 | $curl->send('put', array( 94 | 'id' => '2', 95 | 'title' => 'All About Me' 96 | )); 97 | echo $curl->getResponse(); 98 | echo "\n\n"; 99 | 100 | //Unsuccessfuly Deletes A Story 101 | $curl = new Curl($article_route); 102 | $curl->send('delete', array('delete' => 'me')); 103 | echo $curl->getResponse(); 104 | echo "\n\n"; 105 | 106 | //Successfuly Deletes A Story 107 | $curl = new Curl($article_route); 108 | $curl->send('delete', array('id' => 1)); 109 | echo $curl->getResponse(); 110 | echo "\n\n"; 111 | -------------------------------------------------------------------------------- /multiple/composer.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "microservices/email", 3 | "description": "Email Microservice", 4 | "type": "project", 5 | "authors": [ 6 | { 7 | "name": "Devin Dixon", 8 | "email": "ddixon@bingewave.com" 9 | } 10 | ], 11 | "minimum-stability" : "dev", 12 | "prefer-stable": true, 13 | "require": { 14 | "prodigyview/prodigyview": "dev-master", 15 | "phpmailer/phpmailer": "^6.0", 16 | "php-amqplib/php-amqplib": "v2.8.1", 17 | "aws/aws-sdk-php": "^3.52" 18 | } 19 | } 20 | -------------------------------------------------------------------------------- /multiple/composer.lock: -------------------------------------------------------------------------------- 1 | { 2 | "_readme": [ 3 | "This file locks the dependencies of your project to a known state", 4 | "Read more about it at https://getcomposer.org/doc/01-basic-usage.md#installing-dependencies", 5 | "This file is @generated automatically" 6 | ], 7 | "content-hash": "d09deef22db6df99f81ee18cf053ae67", 8 | "packages": [ 9 | { 10 | "name": "aws/aws-sdk-php", 11 | "version": "3.82.5", 12 | "source": { 13 | "type": "git", 14 | "url": "https://github.com/aws/aws-sdk-php.git", 15 | "reference": "5382f946b12eaaab830cb9fc1098b28d2efb0cff" 16 | }, 17 | "dist": { 18 | "type": "zip", 19 | "url": "https://api.github.com/repos/aws/aws-sdk-php/zipball/5382f946b12eaaab830cb9fc1098b28d2efb0cff", 20 | "reference": "5382f946b12eaaab830cb9fc1098b28d2efb0cff", 21 | "shasum": "" 22 | }, 23 | "require": { 24 | "ext-json": "*", 25 | "ext-pcre": "*", 26 | "ext-simplexml": "*", 27 | "ext-spl": "*", 28 | "guzzlehttp/guzzle": "^5.3.3|^6.2.1", 29 | "guzzlehttp/promises": "~1.0", 30 | "guzzlehttp/psr7": "^1.4.1", 31 | "mtdowling/jmespath.php": "~2.2", 32 | "php": ">=5.5" 33 | }, 34 | "require-dev": { 35 | "andrewsville/php-token-reflection": "^1.4", 36 | "aws/aws-php-sns-message-validator": "~1.0", 37 | "behat/behat": "~3.0", 38 | "doctrine/cache": "~1.4", 39 | "ext-dom": "*", 40 | "ext-openssl": "*", 41 | "ext-pcntl": "*", 42 | "ext-sockets": "*", 43 | "nette/neon": "^2.3", 44 | "phpunit/phpunit": "^4.8.35|^5.4.3", 45 | "psr/cache": "^1.0" 46 | }, 47 | "suggest": { 48 | "aws/aws-php-sns-message-validator": "To validate incoming SNS notifications", 49 | "doctrine/cache": "To use the DoctrineCacheAdapter", 50 | "ext-curl": "To send requests using cURL", 51 | "ext-openssl": "Allows working with CloudFront private distributions and verifying received SNS messages", 52 | "ext-sockets": "To use client-side monitoring" 53 | }, 54 | "type": "library", 55 | "extra": { 56 | "branch-alias": { 57 | "dev-master": "3.0-dev" 58 | } 59 | }, 60 | "autoload": { 61 | "psr-4": { 62 | "Aws\\": "src/" 63 | }, 64 | "files": [ 65 | "src/functions.php" 66 | ] 67 | }, 68 | "notification-url": "https://packagist.org/downloads/", 69 | "license": [ 70 | "Apache-2.0" 71 | ], 72 | "authors": [ 73 | { 74 | "name": "Amazon Web Services", 75 | "homepage": "http://aws.amazon.com" 76 | } 77 | ], 78 | "description": "AWS SDK for PHP - Use Amazon Web Services in your PHP project", 79 | "homepage": "http://aws.amazon.com/sdkforphp", 80 | "keywords": [ 81 | "amazon", 82 | "aws", 83 | "cloud", 84 | "dynamodb", 85 | "ec2", 86 | "glacier", 87 | "s3", 88 | "sdk" 89 | ], 90 | "time": "2019-01-03T22:54:10+00:00" 91 | }, 92 | { 93 | "name": "guzzlehttp/guzzle", 94 | "version": "6.3.3", 95 | "source": { 96 | "type": "git", 97 | "url": "https://github.com/guzzle/guzzle.git", 98 | "reference": "407b0cb880ace85c9b63c5f9551db498cb2d50ba" 99 | }, 100 | "dist": { 101 | "type": "zip", 102 | "url": "https://api.github.com/repos/guzzle/guzzle/zipball/407b0cb880ace85c9b63c5f9551db498cb2d50ba", 103 | "reference": "407b0cb880ace85c9b63c5f9551db498cb2d50ba", 104 | "shasum": "" 105 | }, 106 | "require": { 107 | "guzzlehttp/promises": "^1.0", 108 | "guzzlehttp/psr7": "^1.4", 109 | "php": ">=5.5" 110 | }, 111 | "require-dev": { 112 | "ext-curl": "*", 113 | "phpunit/phpunit": "^4.8.35 || ^5.7 || ^6.4 || ^7.0", 114 | "psr/log": "^1.0" 115 | }, 116 | "suggest": { 117 | "psr/log": "Required for using the Log middleware" 118 | }, 119 | "type": "library", 120 | "extra": { 121 | "branch-alias": { 122 | "dev-master": "6.3-dev" 123 | } 124 | }, 125 | "autoload": { 126 | "files": [ 127 | "src/functions_include.php" 128 | ], 129 | "psr-4": { 130 | "GuzzleHttp\\": "src/" 131 | } 132 | }, 133 | "notification-url": "https://packagist.org/downloads/", 134 | "license": [ 135 | "MIT" 136 | ], 137 | "authors": [ 138 | { 139 | "name": "Michael Dowling", 140 | "email": "mtdowling@gmail.com", 141 | "homepage": "https://github.com/mtdowling" 142 | } 143 | ], 144 | "description": "Guzzle is a PHP HTTP client library", 145 | "homepage": "http://guzzlephp.org/", 146 | "keywords": [ 147 | "client", 148 | "curl", 149 | "framework", 150 | "http", 151 | "http client", 152 | "rest", 153 | "web service" 154 | ], 155 | "time": "2018-04-22T15:46:56+00:00" 156 | }, 157 | { 158 | "name": "guzzlehttp/promises", 159 | "version": "v1.3.1", 160 | "source": { 161 | "type": "git", 162 | "url": "https://github.com/guzzle/promises.git", 163 | "reference": "a59da6cf61d80060647ff4d3eb2c03a2bc694646" 164 | }, 165 | "dist": { 166 | "type": "zip", 167 | "url": "https://api.github.com/repos/guzzle/promises/zipball/a59da6cf61d80060647ff4d3eb2c03a2bc694646", 168 | "reference": "a59da6cf61d80060647ff4d3eb2c03a2bc694646", 169 | "shasum": "" 170 | }, 171 | "require": { 172 | "php": ">=5.5.0" 173 | }, 174 | "require-dev": { 175 | "phpunit/phpunit": "^4.0" 176 | }, 177 | "type": "library", 178 | "extra": { 179 | "branch-alias": { 180 | "dev-master": "1.4-dev" 181 | } 182 | }, 183 | "autoload": { 184 | "psr-4": { 185 | "GuzzleHttp\\Promise\\": "src/" 186 | }, 187 | "files": [ 188 | "src/functions_include.php" 189 | ] 190 | }, 191 | "notification-url": "https://packagist.org/downloads/", 192 | "license": [ 193 | "MIT" 194 | ], 195 | "authors": [ 196 | { 197 | "name": "Michael Dowling", 198 | "email": "mtdowling@gmail.com", 199 | "homepage": "https://github.com/mtdowling" 200 | } 201 | ], 202 | "description": "Guzzle promises library", 203 | "keywords": [ 204 | "promise" 205 | ], 206 | "time": "2016-12-20T10:07:11+00:00" 207 | }, 208 | { 209 | "name": "guzzlehttp/psr7", 210 | "version": "1.5.2", 211 | "source": { 212 | "type": "git", 213 | "url": "https://github.com/guzzle/psr7.git", 214 | "reference": "9f83dded91781a01c63574e387eaa769be769115" 215 | }, 216 | "dist": { 217 | "type": "zip", 218 | "url": "https://api.github.com/repos/guzzle/psr7/zipball/9f83dded91781a01c63574e387eaa769be769115", 219 | "reference": "9f83dded91781a01c63574e387eaa769be769115", 220 | "shasum": "" 221 | }, 222 | "require": { 223 | "php": ">=5.4.0", 224 | "psr/http-message": "~1.0", 225 | "ralouphie/getallheaders": "^2.0.5" 226 | }, 227 | "provide": { 228 | "psr/http-message-implementation": "1.0" 229 | }, 230 | "require-dev": { 231 | "phpunit/phpunit": "~4.8.36 || ^5.7.27 || ^6.5.8" 232 | }, 233 | "type": "library", 234 | "extra": { 235 | "branch-alias": { 236 | "dev-master": "1.5-dev" 237 | } 238 | }, 239 | "autoload": { 240 | "psr-4": { 241 | "GuzzleHttp\\Psr7\\": "src/" 242 | }, 243 | "files": [ 244 | "src/functions_include.php" 245 | ] 246 | }, 247 | "notification-url": "https://packagist.org/downloads/", 248 | "license": [ 249 | "MIT" 250 | ], 251 | "authors": [ 252 | { 253 | "name": "Michael Dowling", 254 | "email": "mtdowling@gmail.com", 255 | "homepage": "https://github.com/mtdowling" 256 | }, 257 | { 258 | "name": "Tobias Schultze", 259 | "homepage": "https://github.com/Tobion" 260 | } 261 | ], 262 | "description": "PSR-7 message implementation that also provides common utility methods", 263 | "keywords": [ 264 | "http", 265 | "message", 266 | "psr-7", 267 | "request", 268 | "response", 269 | "stream", 270 | "uri", 271 | "url" 272 | ], 273 | "time": "2018-12-04T20:46:45+00:00" 274 | }, 275 | { 276 | "name": "mtdowling/jmespath.php", 277 | "version": "2.4.0", 278 | "source": { 279 | "type": "git", 280 | "url": "https://github.com/jmespath/jmespath.php.git", 281 | "reference": "adcc9531682cf87dfda21e1fd5d0e7a41d292fac" 282 | }, 283 | "dist": { 284 | "type": "zip", 285 | "url": "https://api.github.com/repos/jmespath/jmespath.php/zipball/adcc9531682cf87dfda21e1fd5d0e7a41d292fac", 286 | "reference": "adcc9531682cf87dfda21e1fd5d0e7a41d292fac", 287 | "shasum": "" 288 | }, 289 | "require": { 290 | "php": ">=5.4.0" 291 | }, 292 | "require-dev": { 293 | "phpunit/phpunit": "~4.0" 294 | }, 295 | "bin": [ 296 | "bin/jp.php" 297 | ], 298 | "type": "library", 299 | "extra": { 300 | "branch-alias": { 301 | "dev-master": "2.0-dev" 302 | } 303 | }, 304 | "autoload": { 305 | "psr-4": { 306 | "JmesPath\\": "src/" 307 | }, 308 | "files": [ 309 | "src/JmesPath.php" 310 | ] 311 | }, 312 | "notification-url": "https://packagist.org/downloads/", 313 | "license": [ 314 | "MIT" 315 | ], 316 | "authors": [ 317 | { 318 | "name": "Michael Dowling", 319 | "email": "mtdowling@gmail.com", 320 | "homepage": "https://github.com/mtdowling" 321 | } 322 | ], 323 | "description": "Declaratively specify how to extract elements from a JSON document", 324 | "keywords": [ 325 | "json", 326 | "jsonpath" 327 | ], 328 | "time": "2016-12-03T22:08:25+00:00" 329 | }, 330 | { 331 | "name": "php-amqplib/php-amqplib", 332 | "version": "v2.8.1", 333 | "source": { 334 | "type": "git", 335 | "url": "https://github.com/php-amqplib/php-amqplib.git", 336 | "reference": "84449ffd3f5a7466bbee3946facb3746ff11f075" 337 | }, 338 | "dist": { 339 | "type": "zip", 340 | "url": "https://api.github.com/repos/php-amqplib/php-amqplib/zipball/84449ffd3f5a7466bbee3946facb3746ff11f075", 341 | "reference": "84449ffd3f5a7466bbee3946facb3746ff11f075", 342 | "shasum": "" 343 | }, 344 | "require": { 345 | "ext-bcmath": "*", 346 | "ext-sockets": "*", 347 | "php": ">=5.4.0" 348 | }, 349 | "replace": { 350 | "videlalvaro/php-amqplib": "self.version" 351 | }, 352 | "require-dev": { 353 | "phpdocumentor/phpdocumentor": "^2.9", 354 | "phpunit/phpunit": "^4.8", 355 | "scrutinizer/ocular": "^1.1", 356 | "squizlabs/php_codesniffer": "^2.5" 357 | }, 358 | "type": "library", 359 | "extra": { 360 | "branch-alias": { 361 | "dev-master": "2.8-dev" 362 | } 363 | }, 364 | "autoload": { 365 | "psr-4": { 366 | "PhpAmqpLib\\": "PhpAmqpLib/" 367 | } 368 | }, 369 | "notification-url": "https://packagist.org/downloads/", 370 | "license": [ 371 | "LGPL-2.1-or-later" 372 | ], 373 | "authors": [ 374 | { 375 | "name": "Alvaro Videla", 376 | "role": "Original Maintainer" 377 | }, 378 | { 379 | "name": "John Kelly", 380 | "email": "johnmkelly86@gmail.com", 381 | "role": "Maintainer" 382 | }, 383 | { 384 | "name": "Raúl Araya", 385 | "email": "nubeiro@gmail.com", 386 | "role": "Maintainer" 387 | }, 388 | { 389 | "name": "Luke Bakken", 390 | "email": "luke@bakken.io", 391 | "role": "Maintainer" 392 | } 393 | ], 394 | "description": "Formerly videlalvaro/php-amqplib. This library is a pure PHP implementation of the AMQP protocol. It's been tested against RabbitMQ.", 395 | "homepage": "https://github.com/php-amqplib/php-amqplib/", 396 | "keywords": [ 397 | "message", 398 | "queue", 399 | "rabbitmq" 400 | ], 401 | "time": "2018-11-13T09:35:17+00:00" 402 | }, 403 | { 404 | "name": "phpmailer/phpmailer", 405 | "version": "v6.0.6", 406 | "source": { 407 | "type": "git", 408 | "url": "https://github.com/PHPMailer/PHPMailer.git", 409 | "reference": "8190d73eb5def11a43cfb020b7f36db65330698c" 410 | }, 411 | "dist": { 412 | "type": "zip", 413 | "url": "https://api.github.com/repos/PHPMailer/PHPMailer/zipball/8190d73eb5def11a43cfb020b7f36db65330698c", 414 | "reference": "8190d73eb5def11a43cfb020b7f36db65330698c", 415 | "shasum": "" 416 | }, 417 | "require": { 418 | "ext-ctype": "*", 419 | "ext-filter": "*", 420 | "php": ">=5.5.0" 421 | }, 422 | "require-dev": { 423 | "doctrine/annotations": "1.2.*", 424 | "friendsofphp/php-cs-fixer": "^2.2", 425 | "phpdocumentor/phpdocumentor": "2.*", 426 | "phpunit/phpunit": "^4.8 || ^5.7", 427 | "zendframework/zend-eventmanager": "3.0.*", 428 | "zendframework/zend-i18n": "2.7.3", 429 | "zendframework/zend-serializer": "2.7.*" 430 | }, 431 | "suggest": { 432 | "ext-mbstring": "Needed to send email in multibyte encoding charset", 433 | "hayageek/oauth2-yahoo": "Needed for Yahoo XOAUTH2 authentication", 434 | "league/oauth2-google": "Needed for Google XOAUTH2 authentication", 435 | "psr/log": "For optional PSR-3 debug logging", 436 | "stevenmaguire/oauth2-microsoft": "Needed for Microsoft XOAUTH2 authentication", 437 | "symfony/polyfill-mbstring": "To support UTF-8 if the Mbstring PHP extension is not enabled (^1.2)" 438 | }, 439 | "type": "library", 440 | "autoload": { 441 | "psr-4": { 442 | "PHPMailer\\PHPMailer\\": "src/" 443 | } 444 | }, 445 | "notification-url": "https://packagist.org/downloads/", 446 | "license": [ 447 | "LGPL-2.1" 448 | ], 449 | "authors": [ 450 | { 451 | "name": "Jim Jagielski", 452 | "email": "jimjag@gmail.com" 453 | }, 454 | { 455 | "name": "Marcus Bointon", 456 | "email": "phpmailer@synchromedia.co.uk" 457 | }, 458 | { 459 | "name": "Andy Prevost", 460 | "email": "codeworxtech@users.sourceforge.net" 461 | }, 462 | { 463 | "name": "Brent R. Matzelle" 464 | } 465 | ], 466 | "description": "PHPMailer is a full-featured email creation and transfer class for PHP", 467 | "time": "2018-11-16T00:41:32+00:00" 468 | }, 469 | { 470 | "name": "prodigyview/prodigyview", 471 | "version": "dev-master", 472 | "source": { 473 | "type": "git", 474 | "url": "https://github.com/ProdigyView-Toolkit/prodigyview.git", 475 | "reference": "d8462f722c5426fea3f66f4b87a01cdd89a8ec3f" 476 | }, 477 | "dist": { 478 | "type": "zip", 479 | "url": "https://api.github.com/repos/ProdigyView-Toolkit/prodigyview/zipball/d8462f722c5426fea3f66f4b87a01cdd89a8ec3f", 480 | "reference": "d8462f722c5426fea3f66f4b87a01cdd89a8ec3f", 481 | "shasum": "" 482 | }, 483 | "require": { 484 | "php": ">=7.0.0" 485 | }, 486 | "require-dev": { 487 | "guzzlehttp/guzzle": "^6.3", 488 | "phpunit/php-code-coverage": "^6.1", 489 | "phpunit/phpunit": "^7" 490 | }, 491 | "type": "library", 492 | "autoload": { 493 | "psr-4": { 494 | "prodigyview\\": "src/" 495 | } 496 | }, 497 | "notification-url": "https://packagist.org/downloads/", 498 | "license": [ 499 | "MIT" 500 | ], 501 | "authors": [ 502 | { 503 | "name": "Devin Dixon", 504 | "email": "ddixon@prodigyview.com", 505 | "homepage": "http://www.prodigyview.com", 506 | "role": "Entrepreneur & Developer" 507 | } 508 | ], 509 | "description": "Complete PHP Toolkit", 510 | "homepage": "https://github.com/ProdigyView-Toolkit/prodigyview", 511 | "keywords": [ 512 | "mvc", 513 | "php" 514 | ], 515 | "time": "2019-01-03T13:59:56+00:00" 516 | }, 517 | { 518 | "name": "psr/http-message", 519 | "version": "1.0.1", 520 | "source": { 521 | "type": "git", 522 | "url": "https://github.com/php-fig/http-message.git", 523 | "reference": "f6561bf28d520154e4b0ec72be95418abe6d9363" 524 | }, 525 | "dist": { 526 | "type": "zip", 527 | "url": "https://api.github.com/repos/php-fig/http-message/zipball/f6561bf28d520154e4b0ec72be95418abe6d9363", 528 | "reference": "f6561bf28d520154e4b0ec72be95418abe6d9363", 529 | "shasum": "" 530 | }, 531 | "require": { 532 | "php": ">=5.3.0" 533 | }, 534 | "type": "library", 535 | "extra": { 536 | "branch-alias": { 537 | "dev-master": "1.0.x-dev" 538 | } 539 | }, 540 | "autoload": { 541 | "psr-4": { 542 | "Psr\\Http\\Message\\": "src/" 543 | } 544 | }, 545 | "notification-url": "https://packagist.org/downloads/", 546 | "license": [ 547 | "MIT" 548 | ], 549 | "authors": [ 550 | { 551 | "name": "PHP-FIG", 552 | "homepage": "http://www.php-fig.org/" 553 | } 554 | ], 555 | "description": "Common interface for HTTP messages", 556 | "homepage": "https://github.com/php-fig/http-message", 557 | "keywords": [ 558 | "http", 559 | "http-message", 560 | "psr", 561 | "psr-7", 562 | "request", 563 | "response" 564 | ], 565 | "time": "2016-08-06T14:39:51+00:00" 566 | }, 567 | { 568 | "name": "ralouphie/getallheaders", 569 | "version": "2.0.5", 570 | "source": { 571 | "type": "git", 572 | "url": "https://github.com/ralouphie/getallheaders.git", 573 | "reference": "5601c8a83fbba7ef674a7369456d12f1e0d0eafa" 574 | }, 575 | "dist": { 576 | "type": "zip", 577 | "url": "https://api.github.com/repos/ralouphie/getallheaders/zipball/5601c8a83fbba7ef674a7369456d12f1e0d0eafa", 578 | "reference": "5601c8a83fbba7ef674a7369456d12f1e0d0eafa", 579 | "shasum": "" 580 | }, 581 | "require": { 582 | "php": ">=5.3" 583 | }, 584 | "require-dev": { 585 | "phpunit/phpunit": "~3.7.0", 586 | "satooshi/php-coveralls": ">=1.0" 587 | }, 588 | "type": "library", 589 | "autoload": { 590 | "files": [ 591 | "src/getallheaders.php" 592 | ] 593 | }, 594 | "notification-url": "https://packagist.org/downloads/", 595 | "license": [ 596 | "MIT" 597 | ], 598 | "authors": [ 599 | { 600 | "name": "Ralph Khattar", 601 | "email": "ralph.khattar@gmail.com" 602 | } 603 | ], 604 | "description": "A polyfill for getallheaders.", 605 | "time": "2016-02-11T07:05:27+00:00" 606 | } 607 | ], 608 | "packages-dev": [], 609 | "aliases": [], 610 | "minimum-stability": "dev", 611 | "stability-flags": { 612 | "prodigyview/prodigyview": 20 613 | }, 614 | "prefer-stable": true, 615 | "prefer-lowest": false, 616 | "platform": [], 617 | "platform-dev": [] 618 | } 619 | -------------------------------------------------------------------------------- /multiple/media/index.php: -------------------------------------------------------------------------------- 1 | getRequestMethod()); 16 | 17 | //RETRIEVE Data From The Request 18 | $data = $request->getRequestData('array'); 19 | 20 | //Connect To RabbitMQ 21 | $connection = new AMQPStreamConnection('localhost', 5672, 'guest', 'guest'); 22 | $channel = $connection->channel(); 23 | 24 | //Route The Requests 25 | if ($method === 'post') { 26 | post($data, $channel); 27 | } else if ($method === 'put') { 28 | parse_str($data,$data); 29 | put($data, $channel); 30 | } else { 31 | sendResponse(json_encode(array('status' => 'No Service Found'))); 32 | } 33 | 34 | 35 | /** 36 | * Process the post request, which handles videos 37 | */ 38 | function post(array $data = array(), AMQPChannel $channel) { 39 | $queue = 'video_processing'; 40 | $channel->queue_declare($queue, false, true, false, false); 41 | send(json_encode($data), $channel, $queue); 42 | } 43 | 44 | /** 45 | * Process the put request, which handles images 46 | */ 47 | function put(array $data = array(), AMQPChannel $channel) { 48 | $queue = 'image_processing'; 49 | $channel->queue_declare($queue, false, true, false, false); 50 | send(json_encode($data),$channel, $queue); 51 | } 52 | 53 | /** 54 | * Sends the media to the server for process 55 | */ 56 | function send(string $message, AMQPChannel $channel, string $queue) { 57 | global $connection; 58 | 59 | $msg = new AMQPMessage($message, array('delivery_mode' => AMQPMessage::DELIVERY_MODE_PERSISTENT)); 60 | $channel->basic_publish($msg, '', $queue); 61 | $channel->close(); 62 | $connection->close(); 63 | } 64 | -------------------------------------------------------------------------------- /multiple/notifications/index.php: -------------------------------------------------------------------------------- 1 | getRequestMethod()); 14 | 15 | //RETRIEVE Data From The Request 16 | $data = $request->getRequestData('array'); 17 | 18 | //Create A Socket Connection 19 | $socket = getSocket(); 20 | 21 | //Route The Methods 22 | if ($method === 'post') { 23 | post($data, $socket); 24 | } else if ($method === 'put') { 25 | parse_str($data,$data); 26 | put($data, $socket); 27 | } else { 28 | sendResponse(json_encode(array('status' => 'No Service Found'))); 29 | } 30 | 31 | /** 32 | * Process the post request for sending an email 33 | */ 34 | function post(array $data = array(), Socket $socket) { 35 | 36 | $response = array(); 37 | 38 | if ($data) { 39 | //Add Token To Check 40 | $data['token'] = 'ABC123-NotRealToken'; 41 | $data['type']='email'; 42 | 43 | //JSON encode the message 44 | $message = json_encode($data); 45 | 46 | //Send The Message 47 | $result = sendMessage($message, $socket); 48 | 49 | //Create a response from the microservice 50 | $response = array('status' => $result); 51 | } else { 52 | $response = array('status' => 'Unable To Send Email'); 53 | } 54 | 55 | //Send response to client who accessed the API 56 | sendResponse(json_encode($response)); 57 | }; 58 | 59 | /** 60 | * Process the put request for sending a push notification 61 | */ 62 | function put(array $data = array(), Socket $socket) { 63 | 64 | $response = array(); 65 | 66 | if ($data) { 67 | //Add Token To Check 68 | $data['token'] = 'ABC123-NotRealToken'; 69 | $data['type']='push_notification'; 70 | 71 | //JSON encode the message 72 | $message = json_encode($data); 73 | 74 | //Send The Message 75 | $result = sendMessage($message, $socket); 76 | 77 | //Create a response from the microservice 78 | $response = array('status' => $result); 79 | } else { 80 | $response = array('status' => 'Unable To Send Email'); 81 | } 82 | 83 | //Send response to client who accessed the API 84 | sendResponse(json_encode($response)); 85 | }; 86 | 87 | /** 88 | * Open a socket to the microservice 89 | */ 90 | function getSocket() { 91 | $host = '127.0.0.1'; 92 | $port = 8502; 93 | $socket = new Socket($host, $port, array('connect' => true)); 94 | 95 | return $socket; 96 | } 97 | 98 | /** 99 | * Send the message to microservice 100 | */ 101 | function sendMessage(string $message, Socket $socket) { 102 | //Encrypt The Message 103 | Security::init(); 104 | $message = Security::encrypt($message); 105 | 106 | //Send Data To Email Processing 107 | $result = $socket->send($message); 108 | 109 | //Decrypt the Encrypted message 110 | $result = Security::decrypt($result); 111 | 112 | $socket->close(); 113 | 114 | return $result; 115 | } 116 | 117 | /** 118 | * Send a response to the api client 119 | */ 120 | function sendResponse(string $message, int $status = 200) { 121 | echo Response::createResponse(200, $message); 122 | } 123 | -------------------------------------------------------------------------------- /multiple/servers/media_server.php: -------------------------------------------------------------------------------- 1 | channel(); 18 | 19 | //Create The Queues to listen too 20 | $channel->queue_declare('video_processing', false, true, false, false); 21 | $channel->queue_declare('image_processing', false, true, false, false); 22 | 23 | 24 | /** 25 | * Execute the callback for video processing 26 | */ 27 | $channel->basic_consume('video_processing', '', false, false, false, false, function($msg) { 28 | //Convert the data to array 29 | $data = json_decode($msg->body, true); 30 | 31 | if ($file = download_file($data['url'])) { 32 | 33 | echo "Converting Video....\n"; 34 | 35 | //Rename file with extension 36 | $new_file = $file . getExtenstion($file); 37 | rename($file, $new_file); 38 | 39 | exec("man ffmpeg", $ffmpeg_exist); 40 | 41 | if ($ffmpeg_exist) { 42 | //Run a conversion using ffmpeg 43 | Video::convertVideoFile('video.mp4', 'video.' . $data['convert_to']); 44 | } else { 45 | echo "Sorry No Conversion Software Exist On Server\n"; 46 | } 47 | 48 | //Upload to Cloud 49 | //uploadToStorage($new_file); 50 | } 51 | 52 | echo "Finished Converting Video\n"; 53 | }); 54 | 55 | /** 56 | * Execute The Callback For Image Processing 57 | */ 58 | $channel->basic_consume('image_processing', '', false, false, false, false, function($msg) { 59 | //Convert the data to array 60 | 61 | $data = json_decode($msg->body, true); 62 | 63 | if ($file = download_file($data['url'])) { 64 | echo "Converting Image....\n"; 65 | 66 | //Rename file with extension 67 | $new_file = $file . getExtenstion($file); 68 | rename($file, $new_file); 69 | 70 | if (class_exists("Imagick")) { 71 | //If Imagic Installed, Add A Watermark 72 | $image = Image::watermarkImageWithText($new_file, 'Hello Puppy'); 73 | $image->writeImage($new_file); 74 | } else { 75 | //If No Imagic, Just Reize It 76 | Image::resizeImageGD($new_file, $new_file, 200, 200); 77 | } 78 | 79 | //Upload to Cloud 80 | //uploadToStorage($new_file); 81 | 82 | } 83 | 84 | echo "Finished Processing\n"; 85 | }); 86 | 87 | /** 88 | * Download the file from a server 89 | */ 90 | function download_file(string $file) { 91 | //Detect if wget and ffmpeg are installed 92 | exec("man wget", $wget_exist); 93 | 94 | //Get file name from url and save to unique name 95 | $filename = uniqid('file_', false); 96 | 97 | if ($wget_exist) { 98 | //Use wget to download the video. 99 | exec("wget -O {$filename} {$file}"); 100 | } else { 101 | //Use ProdigyView's FileManager as backup 102 | FileManager::copyFileFromUrl($file, getcwd() . '/', $filename); 103 | } 104 | 105 | if (file_exists(getcwd() . '/' . $filename)) { 106 | return getcwd() . '/' . $filename; 107 | } 108 | 109 | return false; 110 | } 111 | 112 | /** 113 | * Retrieves the exenstion of the downloaed file 114 | */ 115 | function getExtenstion(string $file) { 116 | $extension = pathinfo($file, PATHINFO_EXTENSION); 117 | 118 | //If pathinfo was unable to find it, brute force find by mime_type 119 | if (!$extension) { 120 | 121 | $mime_type = FileManager::getFileMimeType($file); 122 | 123 | Validator::init(); 124 | 125 | if (Validator::check('image_file', $mime_type)) { 126 | 127 | if (Validator::check('jpg_file', $mime_type)) { 128 | $extension = '.jpg'; 129 | } else if (Validator::check('png_file', $mime_type)) { 130 | $extension = '.png'; 131 | } else if (Validator::check('gif_file', $mime_type)) { 132 | $extension = '.gif'; 133 | } 134 | } else if (Validator::check('video_file', $mime_type)) { 135 | 136 | if (Validator::check('mpeg_file', $mime_type)) { 137 | $extension = '.mpeg'; 138 | } else if (Validator::check('mov_file', $mime_type)) { 139 | $extension = '.png'; 140 | } else if (Validator::check('avi_file', $mime_type)) { 141 | $extension = '.avi'; 142 | } else if (Validator::isMp4File($mime_type)) { 143 | $extension = '.mp4'; 144 | } else if (Validator::check('ogv_file', $mime_type)) { 145 | $extension = '.ogv'; 146 | } 147 | } 148 | 149 | } 150 | 151 | return $extension; 152 | } 153 | 154 | /** 155 | * Upload the file to AmazonS3 156 | */ 157 | function uploadToStorage(string $file) { 158 | 159 | $s3 = S3Client::factory(array( 160 | 'credentials' => array( 161 | 'secret' => '', 162 | 'key' => '' 163 | ), 164 | 'region' => 'us-west-2', 165 | 'version' => '2006-03-01', 166 | 'timeout' => 12000, 167 | )); 168 | 169 | //Upload in Chunks, not the whole file 170 | $uploader = new MultipartUploader($s3, $body, [ 171 | 'bucket' => '', 172 | 'key' => $file, 173 | 'acl' => 'public-read', 174 | 'concurrency' => 2, 175 | 'part_size' => (50 * 1024 * 1024), 176 | ]); 177 | 178 | $result = $uploader->upload(); 179 | 180 | return (isset($result['Location'])) ? $result['Location'] : false; 181 | 182 | } 183 | 184 | //Listen to requests 185 | while (count($channel->callbacks)) { 186 | $channel->wait(); 187 | } 188 | -------------------------------------------------------------------------------- /multiple/servers/notification_server.php: -------------------------------------------------------------------------------- 1 | Host = 'smtp1.example.com;smtp2.example.com'; 24 | $mail->SMTPAuth = true; 25 | $mail->Username = 'user@example.com'; 26 | $mail->Password = 'secret'; 27 | $mail->SMTPSecure = 'tls'; 28 | $mail->Port = 587; 29 | 30 | $mail->setFrom('from@example.com', 'Mailer'); 31 | $mail->addAddress($data['email'], $data['to']); 32 | 33 | $mail->isHTML(true); 34 | $mail->Subject = $data['subject']; 35 | $mail->Body = $data['message_html']; 36 | $mail->AltBody = $data['message_text']; 37 | 38 | $mail->send(); 39 | 40 | $response = 'Email Sent'; 41 | } 42 | catch (Exception $e) { 43 | $response = 'Email Not Sent'; 44 | } 45 | 46 | return $response; 47 | } 48 | 49 | } 50 | 51 | /** 52 | * The class for sending push notifications 53 | */ 54 | class PushNotification { 55 | 56 | public function send($data) { 57 | 58 | $curl = new Curl('https://fcm.googleapis.com/fcm/send'); 59 | 60 | $curl->addHeader('Authorization', 'key='); 61 | $curl->addHeader('Content-Type', 'application/json'); 62 | 63 | $curl->send('post', array( 64 | 'notification' => json_encode($data['payload']), 65 | 'priority' => 10 66 | )); 67 | 68 | if ($curl->hasError) { 69 | return $curl->getError(); 70 | } else { 71 | return $curl->getResponse(); 72 | } 73 | 74 | } 75 | 76 | } 77 | 78 | //Start The Server 79 | $server = new Socket('127.0.0.1', 8502, array( 80 | 'bind' => true, 81 | 'listen' => true 82 | )); 83 | 84 | 85 | $server->startServer('', function($message) { 86 | 87 | echo "Processing...\n"; 88 | 89 | //Decrypt our encrypted message 90 | Security::init(); 91 | $message = Security::decrypt($message); 92 | 93 | //Turn the data into an array 94 | $data = json_decode($message, true); 95 | 96 | $response = 'Not Sent'; 97 | 98 | //Verify that the correct token is being used 99 | if (isset($data['token']) && $data['token'] == 'ABC123-NotRealToken') { 100 | 101 | /** 102 | * Route the request based on the type 103 | */ 104 | if ($data['type'] == 'email') { 105 | $email = new Emailer(); 106 | $response = $email->send($data); 107 | } else if ($data['type'] == 'push_notification') { 108 | $notification = new PushNotification(); 109 | $response = $notification->send($data); 110 | } 111 | } 112 | 113 | //Return an encrypted message 114 | return Security::encrypt($response); 115 | 116 | }, 'closure'); 117 | -------------------------------------------------------------------------------- /rest/.gitignore: -------------------------------------------------------------------------------- 1 | data/* 2 | vendor/* 3 | app/config/config.php 4 | .settings 5 | .DS_STORE 6 | -------------------------------------------------------------------------------- /rest/client.php: -------------------------------------------------------------------------------- 1 | send('get'); 15 | echo $curl->getResponse(); 16 | echo "\n\n"; 17 | 18 | //Retrieve A Single Story 19 | $curl = new Curl($host); 20 | $curl-> send('get', array('id'=>1)); 21 | echo $curl->getResponse(); 22 | echo "\n\n"; 23 | 24 | //Unsuccessful Post 25 | $curl = new Curl($host); 26 | $curl-> send('post',array('POST' => 'CREATE')); 27 | echo $curl->getResponse(); 28 | echo "\n\n"; 29 | 30 | //Successfully Creates A Story 31 | $curl = new Curl($host); 32 | $curl-> send('post',array('title' => 'Robin Hood', 'description' => 'Steal from the rich and give to me.')); 33 | echo $curl->getResponse(); 34 | echo "\n\n"; 35 | 36 | //Successfully Updates A Story 37 | $curl = new Curl($host); 38 | $curl-> send('put',array('id' => '2', 'title' => 'All About Me')); 39 | echo $curl->getResponse(); 40 | echo "\n\n"; 41 | 42 | //Unsuccessfuly Deletes A Story 43 | $curl = new Curl($host); 44 | $curl-> send('delete',array('delete' => 'me')); 45 | echo $curl->getResponse(); 46 | echo "\n\n"; 47 | 48 | //Successfuly Deletes A Story 49 | $curl = new Curl($host); 50 | $curl-> send('delete',array('id' => 1)); 51 | echo $curl->getResponse(); 52 | echo "\n\n"; 53 | 54 | 55 | -------------------------------------------------------------------------------- /rest/composer.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "microservices/email", 3 | "description": "Email Microservice", 4 | "type": "project", 5 | "authors": [ 6 | { 7 | "name": "Devin Dixon", 8 | "email": "ddixon@bingewave.com" 9 | } 10 | ], 11 | "minimum-stability" : "dev", 12 | "prefer-stable": true, 13 | "require": { 14 | "prodigyview/prodigyview": "dev-master" 15 | } 16 | } 17 | -------------------------------------------------------------------------------- /rest/composer.lock: -------------------------------------------------------------------------------- 1 | { 2 | "_readme": [ 3 | "This file locks the dependencies of your project to a known state", 4 | "Read more about it at https://getcomposer.org/doc/01-basic-usage.md#installing-dependencies", 5 | "This file is @generated automatically" 6 | ], 7 | "content-hash": "7ce302282131aa19e7a7749fda1a24df", 8 | "packages": [ 9 | { 10 | "name": "prodigyview/prodigyview", 11 | "version": "0.9.1", 12 | "source": { 13 | "type": "git", 14 | "url": "https://github.com/ProdigyView-Toolkit/prodigyview.git", 15 | "reference": "aa7e4adfbc70656c3ffb6f46b378b5dab3b5348a" 16 | }, 17 | "dist": { 18 | "type": "zip", 19 | "url": "https://api.github.com/repos/ProdigyView-Toolkit/prodigyview/zipball/aa7e4adfbc70656c3ffb6f46b378b5dab3b5348a", 20 | "reference": "aa7e4adfbc70656c3ffb6f46b378b5dab3b5348a", 21 | "shasum": "" 22 | }, 23 | "require": { 24 | "php": ">=7.0.0" 25 | }, 26 | "require-dev": { 27 | "guzzlehttp/guzzle": "^6.3", 28 | "phpunit/php-code-coverage": "^6.1", 29 | "phpunit/phpunit": "^7" 30 | }, 31 | "type": "library", 32 | "autoload": { 33 | "psr-4": { 34 | "prodigyview\\": "src/" 35 | } 36 | }, 37 | "notification-url": "https://packagist.org/downloads/", 38 | "license": [ 39 | "MIT" 40 | ], 41 | "authors": [ 42 | { 43 | "name": "Devin Dixon", 44 | "email": "ddixon@prodigyview.com", 45 | "homepage": "http://www.prodigyview.com", 46 | "role": "Entrepreneur & Developer" 47 | } 48 | ], 49 | "description": "Complete PHP Toolkit", 50 | "homepage": "https://github.com/ProdigyView-Toolkit/prodigyview", 51 | "keywords": [ 52 | "mvc", 53 | "php" 54 | ], 55 | "time": "2019-01-02T04:56:57+00:00" 56 | } 57 | ], 58 | "packages-dev": [], 59 | "aliases": [], 60 | "minimum-stability": "dev", 61 | "stability-flags": [], 62 | "prefer-stable": true, 63 | "prefer-lowest": false, 64 | "platform": [], 65 | "platform-dev": [] 66 | } 67 | -------------------------------------------------------------------------------- /rest/server.php: -------------------------------------------------------------------------------- 1 | array('title' => 'Little Red Riding Hood', 'description' => 'A sweet innocent girl meets a werewolf'), 11 | 2 => array('title' => 'Snow White and the Seven Dwarfs', 'description' => 'A sweet girl, a delicious apple, and lots of little men.'), 12 | 3 => array('title' => 'Gingerbread Man', 'description' => 'A man who actively avoids kitchens and hungry children.'), 13 | ); 14 | 15 | //Create And Process The Current Request 16 | $request = new Request(); 17 | 18 | //Get The Request Method(GET, POST, PUT, DELETE) 19 | $method = strtolower($request->getRequestMethod()); 20 | 21 | //RETRIEVE Data From The Request 22 | $data = $request->getRequestData('array'); 23 | 24 | //Route The Request 25 | if ($method == 'get') { 26 | get($data); 27 | } else if ($method == 'post') { 28 | post($data); 29 | } else if ($method == 'put') { 30 | parse_str($data,$data); 31 | put($data); 32 | } else if ($method == 'delete') { 33 | parse_str($data,$data); 34 | delete($data); 35 | } 36 | 37 | /** 38 | * Process all GET data to find information 39 | */ 40 | function get($data) { 41 | global $articles; 42 | 43 | $response = array(); 44 | 45 | if(isset($data['id']) && isset($articles[$data['id']])) { 46 | $response = $articles[$data['id']]; 47 | } else { 48 | $response = $articles; 49 | } 50 | 51 | echo Response::createResponse(200, json_encode($response)); 52 | exit(); 53 | }; 54 | 55 | /** 56 | * Process all POST data to create data 57 | */ 58 | function post($data) { 59 | global $articles; 60 | 61 | $response = array(); 62 | 63 | if(isset($data['title']) && isset($data['description'])) { 64 | $articles[] = $data; 65 | $response = array('status' => 'Article Successfully Added'); 66 | } else { 67 | $response = array('status' => 'Unable To Add Article'); 68 | } 69 | 70 | echo Response::createResponse(200, json_encode($response)); 71 | exit(); 72 | 73 | }; 74 | 75 | /** 76 | * Process all PUT data to update information 77 | */ 78 | function put($data) { 79 | global $articles; 80 | 81 | $response = array(); 82 | 83 | if(isset($data['id']) && isset($articles[$data['id']])) { 84 | if(isset($data['title'])) { 85 | $articles[$data['id']]['title'] = $data['title']; 86 | } 87 | 88 | if(isset($data['description'])) { 89 | $articles[$data['id']]['description'] = $data['description']; 90 | } 91 | $response = array('status' => 'Article Successfully Updated', 'content' => $articles[$data['id']]); 92 | } else { 93 | $response = array('status' => 'Unable To Update Article'); 94 | } 95 | 96 | echo Response::createResponse(200, json_encode($response)); 97 | exit(); 98 | 99 | }; 100 | 101 | /** 102 | * Process DELETE to remove data 103 | */ 104 | function delete($data) { 105 | global $articles; 106 | 107 | $response = array(); 108 | 109 | if(isset($data['id']) && isset($articles[$data['id']])) { 110 | unset($articles[$data['id']]); 111 | $response = array('status' => 'Article Deleted', 'content' => $articles); 112 | } else{ 113 | $response = array('status' => 'Unable To Delete Article'); 114 | } 115 | 116 | echo Response::createResponse(200, json_encode($response)); 117 | exit(); 118 | 119 | }; 120 | -------------------------------------------------------------------------------- /security/authbearer/AuthBearer.php: -------------------------------------------------------------------------------- 1 | true)); 23 | 24 | //JSON encode a message requesting a token and sending the login and password 25 | $message = json_encode(array('login'=> $login, 'password' => $password, 'request' => 'authenticate')); 26 | 27 | //Encrypt The Message 28 | $message = Security::encrypt($message); 29 | 30 | //Send Data To Email Processing 31 | $result = $socket->send($message); 32 | 33 | //Decrypt the Encrypted message 34 | $result = Security::decrypt($result); 35 | 36 | //Close the conection 37 | $socket->close(); 38 | 39 | $response = json_decode($result, true); 40 | 41 | if(isset($response['error'])) { 42 | return false; 43 | } else { 44 | return $response['token']; 45 | } 46 | } 47 | 48 | /** 49 | * Checks to see if the token has the correct access with the associated action. 50 | * 51 | * @param string $token 52 | * @param string $action 53 | * 54 | * @return bolean Returns true if the token is valid, otherwise false 55 | */ 56 | public static function hasAccess(string $token, string $action){ 57 | 58 | //Special socket that goes to our authentication service 59 | $socket = new Socket('localhost', 8600, array('connect' => true)); 60 | 61 | //JSON encode a message requesting a token and sending the login and password 62 | $message = json_encode(array('token'=> $token,'request' => 'authorize', 'action' => $action)); 63 | 64 | //Encrypt The Message 65 | $message = Security::encrypt($message); 66 | 67 | //Send Data To Email Processing 68 | $result = $socket->send($message); 69 | 70 | //Decrypt the Encrypted message 71 | $result = Security::decrypt($result); 72 | 73 | //Close the conection 74 | $socket->close(); 75 | 76 | $response = json_decode($result, true); 77 | 78 | if(isset($response['error'])) { 79 | return false; 80 | } else { 81 | return true; 82 | } 83 | } 84 | 85 | } -------------------------------------------------------------------------------- /security/authentication_service/functions.php: -------------------------------------------------------------------------------- 1 | = $array_size) { 17 | return false; 18 | } 19 | 20 | $account = $logins[$index]; 21 | 22 | if($login = $account['login'] && $password == $account['password']) { 23 | return $index; 24 | } 25 | 26 | return authenticate($login, $password, $logins, $index + 1); 27 | } 28 | 29 | /** 30 | * Creates a unique token to be used 31 | * 32 | * @return string $token 33 | */ 34 | function generateToken($mode = 'mock') : string{ 35 | 36 | if($mode == 'mock') { 37 | return '39e9289a5b8328ecc4286da11076748716c41ec'; 38 | } else { 39 | //Use in production example 40 | $token = prodigyview\system\Security::generateToken(65); 41 | return $token; 42 | } 43 | } 44 | 45 | /** 46 | * Consume the token so that is no longer can be used 47 | * 48 | * @param string token 49 | * @param array A database of tokens 50 | */ 51 | function consumeToken(string $token, array &$tokens) { 52 | unset($tokens[$token]); 53 | } 54 | 55 | /** 56 | * Checks to see if the token passed is valid; 57 | * 58 | * @param string $token The token to check against 59 | * @param string $privilege The privilege being request 60 | * 61 | * @return boolean Return true if the token is valid, otherwise false 62 | */ 63 | function validateToken(string $token, string $privileges = '', array $tokens, int $current_time) : bool { 64 | 65 | if(!isset($tokens[$token])) { 66 | return false; 67 | } 68 | 69 | if(hasExpired($token, $tokens, $current_time)) { 70 | return false; 71 | } 72 | 73 | return checkPrivileges($token,$privileges, $tokens); 74 | } 75 | 76 | /** 77 | * Checks to see if the token has expired 78 | * 79 | * @param string $token 80 | * @param array $tokens The tokens 81 | * 82 | * @return bool Return true if has expired or does not exist, otherwise false 83 | */ 84 | function hasExpired(string $token, array $tokens, int $current_time) : bool { 85 | 86 | if(!isset($tokens[$token])) { 87 | return true; 88 | } 89 | 90 | if($tokens[$token]['expiration'] < $current_time) { 91 | return true; 92 | } 93 | 94 | return false; 95 | } 96 | 97 | /** 98 | * Check to see if the token has the correct privileges to access action 99 | * 100 | * @param string $token The token to check against 101 | * @param string $requested_privilege The request privilege from the service 102 | * @param array $tokens A database of tokens to check against 103 | * 104 | * 105 | * @return boolean Return true if token has privileges, otherwise false 106 | */ 107 | function checkPrivileges(string $token, string $requested_privilege, array $tokens) : bool { 108 | 109 | if(!isset($tokens[$token])) { 110 | return false; 111 | } 112 | 113 | foreach($tokens[$token]['privileges'] as $privilege) { 114 | 115 | if($privilege === '*') { 116 | return true; 117 | } else if($privilege == $requested_privilege) { 118 | return true; 119 | } 120 | 121 | return false; 122 | }//end foreach 123 | } 124 | 125 | /** 126 | * Create an access token associated a login 127 | * 128 | * @param array $login The login data 129 | * @param array $logins A token database 130 | * 131 | * @return string The token 132 | */ 133 | function createAccessToken(array $login, array &$tokens, int $expiration) : string { 134 | 135 | $token = generateToken(); 136 | 137 | storeToken($token, $tokens,$expiration, $login['privileges']); 138 | 139 | return $token; 140 | } 141 | 142 | /** 143 | * Adds the token to the "database" to validate later 144 | * 145 | * @param string $token The token generated 146 | * @param array $tokens A database of tokens 147 | * @param array $privileges Privileges to token for access control 148 | * @param int $expiration A timestamp of when the tokenw will expire 149 | */ 150 | function storeToken(string $token, array &$tokens, int $expiration, array $privileges = array('*')) { 151 | 152 | //Set token in the token "database" 153 | $tokens[$token] = array( 154 | 'expiration' => $expiration, 155 | 'privileges' => $privileges 156 | ); 157 | 158 | } -------------------------------------------------------------------------------- /security/authentication_service/server.php: -------------------------------------------------------------------------------- 1 | array('login' =>'user1', 'password'=>'abc123' , 'privileges' => array('*')), 11 | '2'=> array('login' =>'user2', 'password'=>'123456' , 'privileges' => array('send_notification', 'send_email')), 12 | '3'=> array('login' =>'user3', 'password'=>'qwerty', 'privileges' => array('purchase', 'refund')), 13 | ); 14 | 15 | //Mock tokens for the system. Should also be stored in a database 16 | $tokens = array(); 17 | 18 | include('functions.php'); 19 | 20 | //For the demo, we are going to store a mock token 21 | storeToken('39e9289a5b8328ecc4286da11076748716c41ec', $tokens, strtotime('+1 minute')); 22 | 23 | 24 | //Create The Server 25 | $server = new Socket('localhost', 8600, array( 26 | 'bind' => true, 27 | 'listen' => true 28 | )); 29 | 30 | //Start The Server 31 | $server->startServer('', function($message) { 32 | 33 | echo "Processing...\n"; 34 | 35 | //Decrypt our encrypted message 36 | Security::init(); 37 | $message = Security::decrypt($message); 38 | 39 | //Turn the data into an array 40 | $data = json_decode($message, true); 41 | 42 | //Default response 43 | $response = array('status' => 'error', 'message' => 'Nothing found.'); 44 | 45 | //Execute A Request If Exist 46 | if(isset($data['request'])) { 47 | 48 | //Request A Token 49 | if($data['request'] == 'authenticate') { 50 | global $logins; 51 | global $tokens; 52 | if($id = authenticate($data['login'], $data['password'], $logins )) { 53 | $token = createAccessToken($logins[$id], $tokens, strtotime('+1 minute')); 54 | $response = array('status' => 'success', 'token' => $token); 55 | } else { 56 | $response = array('status' => 'error', 'message' => 'Invalid Login'); 57 | } 58 | 59 | } 60 | //Authorize a token based action 61 | else if($data['request'] == 'authorize') { 62 | global $tokens; 63 | 64 | if(validateToken($data['token'], $data['action'], $tokens, time())) { 65 | consumeToken($data['token'], $tokens); 66 | $response = array('status' => 'success', 'message' => 'Access Granted'); 67 | } else { 68 | $response = array('status' => 'error', 'message' => 'Invalid Token On Authorization'); 69 | } 70 | 71 | } 72 | 73 | } 74 | 75 | //JSON encode the response 76 | $response =json_encode($response); 77 | 78 | //Return an encrypted message 79 | return Security::encrypt($response); 80 | 81 | }, 'closure'); 82 | 83 | 84 | 85 | -------------------------------------------------------------------------------- /security/client.php: -------------------------------------------------------------------------------- 1 | send('post', array( 15 | 'amount' => '20.00', 16 | 'nounce' => 'abc123', 17 | )); 18 | echo $curl->getResponse(); 19 | echo "\n\n"; 20 | 21 | //Valid Nounce 22 | $curl = new Curl($product_route.'/purchase'); 23 | $curl->send('post', array( 24 | 'amount' => '20.00', 25 | 'nounce' => '1c46538c712e9b5bf0fe43d692', 26 | )); 27 | echo $curl->getResponse(); 28 | echo "\n\n"; 29 | 30 | //Valid Refund 31 | $curl = new Curl($product_route.'/refund'); 32 | $curl->send('post', array( 33 | 'id' => '123456', 34 | )); 35 | echo $curl->getResponse(); 36 | echo "\n\n"; 37 | 38 | //Invalid Refund 39 | $curl = new Curl($product_route.'/refund'); 40 | $curl->send('post', array( 41 | 'id' => '123456', 42 | )); 43 | echo $curl->getResponse(); 44 | echo "\n\n"; 45 | 46 | -------------------------------------------------------------------------------- /security/composer.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "microservices/email", 3 | "description": "Email Microservice", 4 | "type": "project", 5 | "authors": [ 6 | { 7 | "name": "Devin Dixon", 8 | "email": "ddixon@bingewave.com" 9 | } 10 | ], 11 | "minimum-stability" : "dev", 12 | "prefer-stable": true, 13 | "require": { 14 | "prodigyview/prodigyview": "dev-master", 15 | "phpunit/phpunit": "^7" 16 | } 17 | } 18 | -------------------------------------------------------------------------------- /security/composer.lock: -------------------------------------------------------------------------------- 1 | { 2 | "_readme": [ 3 | "This file locks the dependencies of your project to a known state", 4 | "Read more about it at https://getcomposer.org/doc/01-basic-usage.md#installing-dependencies", 5 | "This file is @generated automatically" 6 | ], 7 | "content-hash": "5d61454981df951fad854b9676a009e7", 8 | "packages": [ 9 | { 10 | "name": "doctrine/instantiator", 11 | "version": "1.1.0", 12 | "source": { 13 | "type": "git", 14 | "url": "https://github.com/doctrine/instantiator.git", 15 | "reference": "185b8868aa9bf7159f5f953ed5afb2d7fcdc3bda" 16 | }, 17 | "dist": { 18 | "type": "zip", 19 | "url": "https://api.github.com/repos/doctrine/instantiator/zipball/185b8868aa9bf7159f5f953ed5afb2d7fcdc3bda", 20 | "reference": "185b8868aa9bf7159f5f953ed5afb2d7fcdc3bda", 21 | "shasum": "" 22 | }, 23 | "require": { 24 | "php": "^7.1" 25 | }, 26 | "require-dev": { 27 | "athletic/athletic": "~0.1.8", 28 | "ext-pdo": "*", 29 | "ext-phar": "*", 30 | "phpunit/phpunit": "^6.2.3", 31 | "squizlabs/php_codesniffer": "^3.0.2" 32 | }, 33 | "type": "library", 34 | "extra": { 35 | "branch-alias": { 36 | "dev-master": "1.2.x-dev" 37 | } 38 | }, 39 | "autoload": { 40 | "psr-4": { 41 | "Doctrine\\Instantiator\\": "src/Doctrine/Instantiator/" 42 | } 43 | }, 44 | "notification-url": "https://packagist.org/downloads/", 45 | "license": [ 46 | "MIT" 47 | ], 48 | "authors": [ 49 | { 50 | "name": "Marco Pivetta", 51 | "email": "ocramius@gmail.com", 52 | "homepage": "http://ocramius.github.com/" 53 | } 54 | ], 55 | "description": "A small, lightweight utility to instantiate objects in PHP without invoking their constructors", 56 | "homepage": "https://github.com/doctrine/instantiator", 57 | "keywords": [ 58 | "constructor", 59 | "instantiate" 60 | ], 61 | "time": "2017-07-22T11:58:36+00:00" 62 | }, 63 | { 64 | "name": "myclabs/deep-copy", 65 | "version": "1.8.1", 66 | "source": { 67 | "type": "git", 68 | "url": "https://github.com/myclabs/DeepCopy.git", 69 | "reference": "3e01bdad3e18354c3dce54466b7fbe33a9f9f7f8" 70 | }, 71 | "dist": { 72 | "type": "zip", 73 | "url": "https://api.github.com/repos/myclabs/DeepCopy/zipball/3e01bdad3e18354c3dce54466b7fbe33a9f9f7f8", 74 | "reference": "3e01bdad3e18354c3dce54466b7fbe33a9f9f7f8", 75 | "shasum": "" 76 | }, 77 | "require": { 78 | "php": "^7.1" 79 | }, 80 | "replace": { 81 | "myclabs/deep-copy": "self.version" 82 | }, 83 | "require-dev": { 84 | "doctrine/collections": "^1.0", 85 | "doctrine/common": "^2.6", 86 | "phpunit/phpunit": "^7.1" 87 | }, 88 | "type": "library", 89 | "autoload": { 90 | "psr-4": { 91 | "DeepCopy\\": "src/DeepCopy/" 92 | }, 93 | "files": [ 94 | "src/DeepCopy/deep_copy.php" 95 | ] 96 | }, 97 | "notification-url": "https://packagist.org/downloads/", 98 | "license": [ 99 | "MIT" 100 | ], 101 | "description": "Create deep copies (clones) of your objects", 102 | "keywords": [ 103 | "clone", 104 | "copy", 105 | "duplicate", 106 | "object", 107 | "object graph" 108 | ], 109 | "time": "2018-06-11T23:09:50+00:00" 110 | }, 111 | { 112 | "name": "phar-io/manifest", 113 | "version": "1.0.3", 114 | "source": { 115 | "type": "git", 116 | "url": "https://github.com/phar-io/manifest.git", 117 | "reference": "7761fcacf03b4d4f16e7ccb606d4879ca431fcf4" 118 | }, 119 | "dist": { 120 | "type": "zip", 121 | "url": "https://api.github.com/repos/phar-io/manifest/zipball/7761fcacf03b4d4f16e7ccb606d4879ca431fcf4", 122 | "reference": "7761fcacf03b4d4f16e7ccb606d4879ca431fcf4", 123 | "shasum": "" 124 | }, 125 | "require": { 126 | "ext-dom": "*", 127 | "ext-phar": "*", 128 | "phar-io/version": "^2.0", 129 | "php": "^5.6 || ^7.0" 130 | }, 131 | "type": "library", 132 | "extra": { 133 | "branch-alias": { 134 | "dev-master": "1.0.x-dev" 135 | } 136 | }, 137 | "autoload": { 138 | "classmap": [ 139 | "src/" 140 | ] 141 | }, 142 | "notification-url": "https://packagist.org/downloads/", 143 | "license": [ 144 | "BSD-3-Clause" 145 | ], 146 | "authors": [ 147 | { 148 | "name": "Arne Blankerts", 149 | "email": "arne@blankerts.de", 150 | "role": "Developer" 151 | }, 152 | { 153 | "name": "Sebastian Heuer", 154 | "email": "sebastian@phpeople.de", 155 | "role": "Developer" 156 | }, 157 | { 158 | "name": "Sebastian Bergmann", 159 | "email": "sebastian@phpunit.de", 160 | "role": "Developer" 161 | } 162 | ], 163 | "description": "Component for reading phar.io manifest information from a PHP Archive (PHAR)", 164 | "time": "2018-07-08T19:23:20+00:00" 165 | }, 166 | { 167 | "name": "phar-io/version", 168 | "version": "2.0.1", 169 | "source": { 170 | "type": "git", 171 | "url": "https://github.com/phar-io/version.git", 172 | "reference": "45a2ec53a73c70ce41d55cedef9063630abaf1b6" 173 | }, 174 | "dist": { 175 | "type": "zip", 176 | "url": "https://api.github.com/repos/phar-io/version/zipball/45a2ec53a73c70ce41d55cedef9063630abaf1b6", 177 | "reference": "45a2ec53a73c70ce41d55cedef9063630abaf1b6", 178 | "shasum": "" 179 | }, 180 | "require": { 181 | "php": "^5.6 || ^7.0" 182 | }, 183 | "type": "library", 184 | "autoload": { 185 | "classmap": [ 186 | "src/" 187 | ] 188 | }, 189 | "notification-url": "https://packagist.org/downloads/", 190 | "license": [ 191 | "BSD-3-Clause" 192 | ], 193 | "authors": [ 194 | { 195 | "name": "Arne Blankerts", 196 | "email": "arne@blankerts.de", 197 | "role": "Developer" 198 | }, 199 | { 200 | "name": "Sebastian Heuer", 201 | "email": "sebastian@phpeople.de", 202 | "role": "Developer" 203 | }, 204 | { 205 | "name": "Sebastian Bergmann", 206 | "email": "sebastian@phpunit.de", 207 | "role": "Developer" 208 | } 209 | ], 210 | "description": "Library for handling version information and constraints", 211 | "time": "2018-07-08T19:19:57+00:00" 212 | }, 213 | { 214 | "name": "phpdocumentor/reflection-common", 215 | "version": "1.0.1", 216 | "source": { 217 | "type": "git", 218 | "url": "https://github.com/phpDocumentor/ReflectionCommon.git", 219 | "reference": "21bdeb5f65d7ebf9f43b1b25d404f87deab5bfb6" 220 | }, 221 | "dist": { 222 | "type": "zip", 223 | "url": "https://api.github.com/repos/phpDocumentor/ReflectionCommon/zipball/21bdeb5f65d7ebf9f43b1b25d404f87deab5bfb6", 224 | "reference": "21bdeb5f65d7ebf9f43b1b25d404f87deab5bfb6", 225 | "shasum": "" 226 | }, 227 | "require": { 228 | "php": ">=5.5" 229 | }, 230 | "require-dev": { 231 | "phpunit/phpunit": "^4.6" 232 | }, 233 | "type": "library", 234 | "extra": { 235 | "branch-alias": { 236 | "dev-master": "1.0.x-dev" 237 | } 238 | }, 239 | "autoload": { 240 | "psr-4": { 241 | "phpDocumentor\\Reflection\\": [ 242 | "src" 243 | ] 244 | } 245 | }, 246 | "notification-url": "https://packagist.org/downloads/", 247 | "license": [ 248 | "MIT" 249 | ], 250 | "authors": [ 251 | { 252 | "name": "Jaap van Otterdijk", 253 | "email": "opensource@ijaap.nl" 254 | } 255 | ], 256 | "description": "Common reflection classes used by phpdocumentor to reflect the code structure", 257 | "homepage": "http://www.phpdoc.org", 258 | "keywords": [ 259 | "FQSEN", 260 | "phpDocumentor", 261 | "phpdoc", 262 | "reflection", 263 | "static analysis" 264 | ], 265 | "time": "2017-09-11T18:02:19+00:00" 266 | }, 267 | { 268 | "name": "phpdocumentor/reflection-docblock", 269 | "version": "4.3.0", 270 | "source": { 271 | "type": "git", 272 | "url": "https://github.com/phpDocumentor/ReflectionDocBlock.git", 273 | "reference": "94fd0001232e47129dd3504189fa1c7225010d08" 274 | }, 275 | "dist": { 276 | "type": "zip", 277 | "url": "https://api.github.com/repos/phpDocumentor/ReflectionDocBlock/zipball/94fd0001232e47129dd3504189fa1c7225010d08", 278 | "reference": "94fd0001232e47129dd3504189fa1c7225010d08", 279 | "shasum": "" 280 | }, 281 | "require": { 282 | "php": "^7.0", 283 | "phpdocumentor/reflection-common": "^1.0.0", 284 | "phpdocumentor/type-resolver": "^0.4.0", 285 | "webmozart/assert": "^1.0" 286 | }, 287 | "require-dev": { 288 | "doctrine/instantiator": "~1.0.5", 289 | "mockery/mockery": "^1.0", 290 | "phpunit/phpunit": "^6.4" 291 | }, 292 | "type": "library", 293 | "extra": { 294 | "branch-alias": { 295 | "dev-master": "4.x-dev" 296 | } 297 | }, 298 | "autoload": { 299 | "psr-4": { 300 | "phpDocumentor\\Reflection\\": [ 301 | "src/" 302 | ] 303 | } 304 | }, 305 | "notification-url": "https://packagist.org/downloads/", 306 | "license": [ 307 | "MIT" 308 | ], 309 | "authors": [ 310 | { 311 | "name": "Mike van Riel", 312 | "email": "me@mikevanriel.com" 313 | } 314 | ], 315 | "description": "With this component, a library can provide support for annotations via DocBlocks or otherwise retrieve information that is embedded in a DocBlock.", 316 | "time": "2017-11-30T07:14:17+00:00" 317 | }, 318 | { 319 | "name": "phpdocumentor/type-resolver", 320 | "version": "0.4.0", 321 | "source": { 322 | "type": "git", 323 | "url": "https://github.com/phpDocumentor/TypeResolver.git", 324 | "reference": "9c977708995954784726e25d0cd1dddf4e65b0f7" 325 | }, 326 | "dist": { 327 | "type": "zip", 328 | "url": "https://api.github.com/repos/phpDocumentor/TypeResolver/zipball/9c977708995954784726e25d0cd1dddf4e65b0f7", 329 | "reference": "9c977708995954784726e25d0cd1dddf4e65b0f7", 330 | "shasum": "" 331 | }, 332 | "require": { 333 | "php": "^5.5 || ^7.0", 334 | "phpdocumentor/reflection-common": "^1.0" 335 | }, 336 | "require-dev": { 337 | "mockery/mockery": "^0.9.4", 338 | "phpunit/phpunit": "^5.2||^4.8.24" 339 | }, 340 | "type": "library", 341 | "extra": { 342 | "branch-alias": { 343 | "dev-master": "1.0.x-dev" 344 | } 345 | }, 346 | "autoload": { 347 | "psr-4": { 348 | "phpDocumentor\\Reflection\\": [ 349 | "src/" 350 | ] 351 | } 352 | }, 353 | "notification-url": "https://packagist.org/downloads/", 354 | "license": [ 355 | "MIT" 356 | ], 357 | "authors": [ 358 | { 359 | "name": "Mike van Riel", 360 | "email": "me@mikevanriel.com" 361 | } 362 | ], 363 | "time": "2017-07-14T14:27:02+00:00" 364 | }, 365 | { 366 | "name": "phpspec/prophecy", 367 | "version": "1.8.0", 368 | "source": { 369 | "type": "git", 370 | "url": "https://github.com/phpspec/prophecy.git", 371 | "reference": "4ba436b55987b4bf311cb7c6ba82aa528aac0a06" 372 | }, 373 | "dist": { 374 | "type": "zip", 375 | "url": "https://api.github.com/repos/phpspec/prophecy/zipball/4ba436b55987b4bf311cb7c6ba82aa528aac0a06", 376 | "reference": "4ba436b55987b4bf311cb7c6ba82aa528aac0a06", 377 | "shasum": "" 378 | }, 379 | "require": { 380 | "doctrine/instantiator": "^1.0.2", 381 | "php": "^5.3|^7.0", 382 | "phpdocumentor/reflection-docblock": "^2.0|^3.0.2|^4.0", 383 | "sebastian/comparator": "^1.1|^2.0|^3.0", 384 | "sebastian/recursion-context": "^1.0|^2.0|^3.0" 385 | }, 386 | "require-dev": { 387 | "phpspec/phpspec": "^2.5|^3.2", 388 | "phpunit/phpunit": "^4.8.35 || ^5.7 || ^6.5 || ^7.1" 389 | }, 390 | "type": "library", 391 | "extra": { 392 | "branch-alias": { 393 | "dev-master": "1.8.x-dev" 394 | } 395 | }, 396 | "autoload": { 397 | "psr-0": { 398 | "Prophecy\\": "src/" 399 | } 400 | }, 401 | "notification-url": "https://packagist.org/downloads/", 402 | "license": [ 403 | "MIT" 404 | ], 405 | "authors": [ 406 | { 407 | "name": "Konstantin Kudryashov", 408 | "email": "ever.zet@gmail.com", 409 | "homepage": "http://everzet.com" 410 | }, 411 | { 412 | "name": "Marcello Duarte", 413 | "email": "marcello.duarte@gmail.com" 414 | } 415 | ], 416 | "description": "Highly opinionated mocking framework for PHP 5.3+", 417 | "homepage": "https://github.com/phpspec/prophecy", 418 | "keywords": [ 419 | "Double", 420 | "Dummy", 421 | "fake", 422 | "mock", 423 | "spy", 424 | "stub" 425 | ], 426 | "time": "2018-08-05T17:53:17+00:00" 427 | }, 428 | { 429 | "name": "phpunit/php-code-coverage", 430 | "version": "6.1.4", 431 | "source": { 432 | "type": "git", 433 | "url": "https://github.com/sebastianbergmann/php-code-coverage.git", 434 | "reference": "807e6013b00af69b6c5d9ceb4282d0393dbb9d8d" 435 | }, 436 | "dist": { 437 | "type": "zip", 438 | "url": "https://api.github.com/repos/sebastianbergmann/php-code-coverage/zipball/807e6013b00af69b6c5d9ceb4282d0393dbb9d8d", 439 | "reference": "807e6013b00af69b6c5d9ceb4282d0393dbb9d8d", 440 | "shasum": "" 441 | }, 442 | "require": { 443 | "ext-dom": "*", 444 | "ext-xmlwriter": "*", 445 | "php": "^7.1", 446 | "phpunit/php-file-iterator": "^2.0", 447 | "phpunit/php-text-template": "^1.2.1", 448 | "phpunit/php-token-stream": "^3.0", 449 | "sebastian/code-unit-reverse-lookup": "^1.0.1", 450 | "sebastian/environment": "^3.1 || ^4.0", 451 | "sebastian/version": "^2.0.1", 452 | "theseer/tokenizer": "^1.1" 453 | }, 454 | "require-dev": { 455 | "phpunit/phpunit": "^7.0" 456 | }, 457 | "suggest": { 458 | "ext-xdebug": "^2.6.0" 459 | }, 460 | "type": "library", 461 | "extra": { 462 | "branch-alias": { 463 | "dev-master": "6.1-dev" 464 | } 465 | }, 466 | "autoload": { 467 | "classmap": [ 468 | "src/" 469 | ] 470 | }, 471 | "notification-url": "https://packagist.org/downloads/", 472 | "license": [ 473 | "BSD-3-Clause" 474 | ], 475 | "authors": [ 476 | { 477 | "name": "Sebastian Bergmann", 478 | "email": "sebastian@phpunit.de", 479 | "role": "lead" 480 | } 481 | ], 482 | "description": "Library that provides collection, processing, and rendering functionality for PHP code coverage information.", 483 | "homepage": "https://github.com/sebastianbergmann/php-code-coverage", 484 | "keywords": [ 485 | "coverage", 486 | "testing", 487 | "xunit" 488 | ], 489 | "time": "2018-10-31T16:06:48+00:00" 490 | }, 491 | { 492 | "name": "phpunit/php-file-iterator", 493 | "version": "2.0.2", 494 | "source": { 495 | "type": "git", 496 | "url": "https://github.com/sebastianbergmann/php-file-iterator.git", 497 | "reference": "050bedf145a257b1ff02746c31894800e5122946" 498 | }, 499 | "dist": { 500 | "type": "zip", 501 | "url": "https://api.github.com/repos/sebastianbergmann/php-file-iterator/zipball/050bedf145a257b1ff02746c31894800e5122946", 502 | "reference": "050bedf145a257b1ff02746c31894800e5122946", 503 | "shasum": "" 504 | }, 505 | "require": { 506 | "php": "^7.1" 507 | }, 508 | "require-dev": { 509 | "phpunit/phpunit": "^7.1" 510 | }, 511 | "type": "library", 512 | "extra": { 513 | "branch-alias": { 514 | "dev-master": "2.0.x-dev" 515 | } 516 | }, 517 | "autoload": { 518 | "classmap": [ 519 | "src/" 520 | ] 521 | }, 522 | "notification-url": "https://packagist.org/downloads/", 523 | "license": [ 524 | "BSD-3-Clause" 525 | ], 526 | "authors": [ 527 | { 528 | "name": "Sebastian Bergmann", 529 | "email": "sebastian@phpunit.de", 530 | "role": "lead" 531 | } 532 | ], 533 | "description": "FilterIterator implementation that filters files based on a list of suffixes.", 534 | "homepage": "https://github.com/sebastianbergmann/php-file-iterator/", 535 | "keywords": [ 536 | "filesystem", 537 | "iterator" 538 | ], 539 | "time": "2018-09-13T20:33:42+00:00" 540 | }, 541 | { 542 | "name": "phpunit/php-text-template", 543 | "version": "1.2.1", 544 | "source": { 545 | "type": "git", 546 | "url": "https://github.com/sebastianbergmann/php-text-template.git", 547 | "reference": "31f8b717e51d9a2afca6c9f046f5d69fc27c8686" 548 | }, 549 | "dist": { 550 | "type": "zip", 551 | "url": "https://api.github.com/repos/sebastianbergmann/php-text-template/zipball/31f8b717e51d9a2afca6c9f046f5d69fc27c8686", 552 | "reference": "31f8b717e51d9a2afca6c9f046f5d69fc27c8686", 553 | "shasum": "" 554 | }, 555 | "require": { 556 | "php": ">=5.3.3" 557 | }, 558 | "type": "library", 559 | "autoload": { 560 | "classmap": [ 561 | "src/" 562 | ] 563 | }, 564 | "notification-url": "https://packagist.org/downloads/", 565 | "license": [ 566 | "BSD-3-Clause" 567 | ], 568 | "authors": [ 569 | { 570 | "name": "Sebastian Bergmann", 571 | "email": "sebastian@phpunit.de", 572 | "role": "lead" 573 | } 574 | ], 575 | "description": "Simple template engine.", 576 | "homepage": "https://github.com/sebastianbergmann/php-text-template/", 577 | "keywords": [ 578 | "template" 579 | ], 580 | "time": "2015-06-21T13:50:34+00:00" 581 | }, 582 | { 583 | "name": "phpunit/php-timer", 584 | "version": "2.0.0", 585 | "source": { 586 | "type": "git", 587 | "url": "https://github.com/sebastianbergmann/php-timer.git", 588 | "reference": "8b8454ea6958c3dee38453d3bd571e023108c91f" 589 | }, 590 | "dist": { 591 | "type": "zip", 592 | "url": "https://api.github.com/repos/sebastianbergmann/php-timer/zipball/8b8454ea6958c3dee38453d3bd571e023108c91f", 593 | "reference": "8b8454ea6958c3dee38453d3bd571e023108c91f", 594 | "shasum": "" 595 | }, 596 | "require": { 597 | "php": "^7.1" 598 | }, 599 | "require-dev": { 600 | "phpunit/phpunit": "^7.0" 601 | }, 602 | "type": "library", 603 | "extra": { 604 | "branch-alias": { 605 | "dev-master": "2.0-dev" 606 | } 607 | }, 608 | "autoload": { 609 | "classmap": [ 610 | "src/" 611 | ] 612 | }, 613 | "notification-url": "https://packagist.org/downloads/", 614 | "license": [ 615 | "BSD-3-Clause" 616 | ], 617 | "authors": [ 618 | { 619 | "name": "Sebastian Bergmann", 620 | "email": "sebastian@phpunit.de", 621 | "role": "lead" 622 | } 623 | ], 624 | "description": "Utility class for timing", 625 | "homepage": "https://github.com/sebastianbergmann/php-timer/", 626 | "keywords": [ 627 | "timer" 628 | ], 629 | "time": "2018-02-01T13:07:23+00:00" 630 | }, 631 | { 632 | "name": "phpunit/php-token-stream", 633 | "version": "3.0.1", 634 | "source": { 635 | "type": "git", 636 | "url": "https://github.com/sebastianbergmann/php-token-stream.git", 637 | "reference": "c99e3be9d3e85f60646f152f9002d46ed7770d18" 638 | }, 639 | "dist": { 640 | "type": "zip", 641 | "url": "https://api.github.com/repos/sebastianbergmann/php-token-stream/zipball/c99e3be9d3e85f60646f152f9002d46ed7770d18", 642 | "reference": "c99e3be9d3e85f60646f152f9002d46ed7770d18", 643 | "shasum": "" 644 | }, 645 | "require": { 646 | "ext-tokenizer": "*", 647 | "php": "^7.1" 648 | }, 649 | "require-dev": { 650 | "phpunit/phpunit": "^7.0" 651 | }, 652 | "type": "library", 653 | "extra": { 654 | "branch-alias": { 655 | "dev-master": "3.0-dev" 656 | } 657 | }, 658 | "autoload": { 659 | "classmap": [ 660 | "src/" 661 | ] 662 | }, 663 | "notification-url": "https://packagist.org/downloads/", 664 | "license": [ 665 | "BSD-3-Clause" 666 | ], 667 | "authors": [ 668 | { 669 | "name": "Sebastian Bergmann", 670 | "email": "sebastian@phpunit.de" 671 | } 672 | ], 673 | "description": "Wrapper around PHP's tokenizer extension.", 674 | "homepage": "https://github.com/sebastianbergmann/php-token-stream/", 675 | "keywords": [ 676 | "tokenizer" 677 | ], 678 | "time": "2018-10-30T05:52:18+00:00" 679 | }, 680 | { 681 | "name": "phpunit/phpunit", 682 | "version": "7.5.1", 683 | "source": { 684 | "type": "git", 685 | "url": "https://github.com/sebastianbergmann/phpunit.git", 686 | "reference": "c23d78776ad415d5506e0679723cb461d71f488f" 687 | }, 688 | "dist": { 689 | "type": "zip", 690 | "url": "https://api.github.com/repos/sebastianbergmann/phpunit/zipball/c23d78776ad415d5506e0679723cb461d71f488f", 691 | "reference": "c23d78776ad415d5506e0679723cb461d71f488f", 692 | "shasum": "" 693 | }, 694 | "require": { 695 | "doctrine/instantiator": "^1.1", 696 | "ext-dom": "*", 697 | "ext-json": "*", 698 | "ext-libxml": "*", 699 | "ext-mbstring": "*", 700 | "ext-xml": "*", 701 | "myclabs/deep-copy": "^1.7", 702 | "phar-io/manifest": "^1.0.2", 703 | "phar-io/version": "^2.0", 704 | "php": "^7.1", 705 | "phpspec/prophecy": "^1.7", 706 | "phpunit/php-code-coverage": "^6.0.7", 707 | "phpunit/php-file-iterator": "^2.0.1", 708 | "phpunit/php-text-template": "^1.2.1", 709 | "phpunit/php-timer": "^2.0", 710 | "sebastian/comparator": "^3.0", 711 | "sebastian/diff": "^3.0", 712 | "sebastian/environment": "^4.0", 713 | "sebastian/exporter": "^3.1", 714 | "sebastian/global-state": "^2.0", 715 | "sebastian/object-enumerator": "^3.0.3", 716 | "sebastian/resource-operations": "^2.0", 717 | "sebastian/version": "^2.0.1" 718 | }, 719 | "conflict": { 720 | "phpunit/phpunit-mock-objects": "*" 721 | }, 722 | "require-dev": { 723 | "ext-pdo": "*" 724 | }, 725 | "suggest": { 726 | "ext-soap": "*", 727 | "ext-xdebug": "*", 728 | "phpunit/php-invoker": "^2.0" 729 | }, 730 | "bin": [ 731 | "phpunit" 732 | ], 733 | "type": "library", 734 | "extra": { 735 | "branch-alias": { 736 | "dev-master": "7.5-dev" 737 | } 738 | }, 739 | "autoload": { 740 | "classmap": [ 741 | "src/" 742 | ] 743 | }, 744 | "notification-url": "https://packagist.org/downloads/", 745 | "license": [ 746 | "BSD-3-Clause" 747 | ], 748 | "authors": [ 749 | { 750 | "name": "Sebastian Bergmann", 751 | "email": "sebastian@phpunit.de", 752 | "role": "lead" 753 | } 754 | ], 755 | "description": "The PHP Unit Testing framework.", 756 | "homepage": "https://phpunit.de/", 757 | "keywords": [ 758 | "phpunit", 759 | "testing", 760 | "xunit" 761 | ], 762 | "time": "2018-12-12T07:20:32+00:00" 763 | }, 764 | { 765 | "name": "prodigyview/prodigyview", 766 | "version": "dev-master", 767 | "source": { 768 | "type": "git", 769 | "url": "https://github.com/ProdigyView-Toolkit/prodigyview.git", 770 | "reference": "77f726149374f49e5c8ea460dd5eb18da7189f3a" 771 | }, 772 | "dist": { 773 | "type": "zip", 774 | "url": "https://api.github.com/repos/ProdigyView-Toolkit/prodigyview/zipball/77f726149374f49e5c8ea460dd5eb18da7189f3a", 775 | "reference": "77f726149374f49e5c8ea460dd5eb18da7189f3a", 776 | "shasum": "" 777 | }, 778 | "require": { 779 | "php": ">=7.0.0" 780 | }, 781 | "require-dev": { 782 | "guzzlehttp/guzzle": "^6.3", 783 | "phpunit/php-code-coverage": "^6.1", 784 | "phpunit/phpunit": "^7" 785 | }, 786 | "type": "library", 787 | "autoload": { 788 | "psr-4": { 789 | "prodigyview\\": "src/" 790 | } 791 | }, 792 | "notification-url": "https://packagist.org/downloads/", 793 | "license": [ 794 | "MIT" 795 | ], 796 | "authors": [ 797 | { 798 | "name": "Devin Dixon", 799 | "email": "ddixon@prodigyview.com", 800 | "homepage": "http://www.prodigyview.com", 801 | "role": "Entrepreneur & Developer" 802 | } 803 | ], 804 | "description": "Complete PHP Toolkit", 805 | "homepage": "https://github.com/ProdigyView-Toolkit/prodigyview", 806 | "keywords": [ 807 | "mvc", 808 | "php" 809 | ], 810 | "time": "2019-01-06T20:12:56+00:00" 811 | }, 812 | { 813 | "name": "sebastian/code-unit-reverse-lookup", 814 | "version": "1.0.1", 815 | "source": { 816 | "type": "git", 817 | "url": "https://github.com/sebastianbergmann/code-unit-reverse-lookup.git", 818 | "reference": "4419fcdb5eabb9caa61a27c7a1db532a6b55dd18" 819 | }, 820 | "dist": { 821 | "type": "zip", 822 | "url": "https://api.github.com/repos/sebastianbergmann/code-unit-reverse-lookup/zipball/4419fcdb5eabb9caa61a27c7a1db532a6b55dd18", 823 | "reference": "4419fcdb5eabb9caa61a27c7a1db532a6b55dd18", 824 | "shasum": "" 825 | }, 826 | "require": { 827 | "php": "^5.6 || ^7.0" 828 | }, 829 | "require-dev": { 830 | "phpunit/phpunit": "^5.7 || ^6.0" 831 | }, 832 | "type": "library", 833 | "extra": { 834 | "branch-alias": { 835 | "dev-master": "1.0.x-dev" 836 | } 837 | }, 838 | "autoload": { 839 | "classmap": [ 840 | "src/" 841 | ] 842 | }, 843 | "notification-url": "https://packagist.org/downloads/", 844 | "license": [ 845 | "BSD-3-Clause" 846 | ], 847 | "authors": [ 848 | { 849 | "name": "Sebastian Bergmann", 850 | "email": "sebastian@phpunit.de" 851 | } 852 | ], 853 | "description": "Looks up which function or method a line of code belongs to", 854 | "homepage": "https://github.com/sebastianbergmann/code-unit-reverse-lookup/", 855 | "time": "2017-03-04T06:30:41+00:00" 856 | }, 857 | { 858 | "name": "sebastian/comparator", 859 | "version": "3.0.2", 860 | "source": { 861 | "type": "git", 862 | "url": "https://github.com/sebastianbergmann/comparator.git", 863 | "reference": "5de4fc177adf9bce8df98d8d141a7559d7ccf6da" 864 | }, 865 | "dist": { 866 | "type": "zip", 867 | "url": "https://api.github.com/repos/sebastianbergmann/comparator/zipball/5de4fc177adf9bce8df98d8d141a7559d7ccf6da", 868 | "reference": "5de4fc177adf9bce8df98d8d141a7559d7ccf6da", 869 | "shasum": "" 870 | }, 871 | "require": { 872 | "php": "^7.1", 873 | "sebastian/diff": "^3.0", 874 | "sebastian/exporter": "^3.1" 875 | }, 876 | "require-dev": { 877 | "phpunit/phpunit": "^7.1" 878 | }, 879 | "type": "library", 880 | "extra": { 881 | "branch-alias": { 882 | "dev-master": "3.0-dev" 883 | } 884 | }, 885 | "autoload": { 886 | "classmap": [ 887 | "src/" 888 | ] 889 | }, 890 | "notification-url": "https://packagist.org/downloads/", 891 | "license": [ 892 | "BSD-3-Clause" 893 | ], 894 | "authors": [ 895 | { 896 | "name": "Jeff Welch", 897 | "email": "whatthejeff@gmail.com" 898 | }, 899 | { 900 | "name": "Volker Dusch", 901 | "email": "github@wallbash.com" 902 | }, 903 | { 904 | "name": "Bernhard Schussek", 905 | "email": "bschussek@2bepublished.at" 906 | }, 907 | { 908 | "name": "Sebastian Bergmann", 909 | "email": "sebastian@phpunit.de" 910 | } 911 | ], 912 | "description": "Provides the functionality to compare PHP values for equality", 913 | "homepage": "https://github.com/sebastianbergmann/comparator", 914 | "keywords": [ 915 | "comparator", 916 | "compare", 917 | "equality" 918 | ], 919 | "time": "2018-07-12T15:12:46+00:00" 920 | }, 921 | { 922 | "name": "sebastian/diff", 923 | "version": "3.0.1", 924 | "source": { 925 | "type": "git", 926 | "url": "https://github.com/sebastianbergmann/diff.git", 927 | "reference": "366541b989927187c4ca70490a35615d3fef2dce" 928 | }, 929 | "dist": { 930 | "type": "zip", 931 | "url": "https://api.github.com/repos/sebastianbergmann/diff/zipball/366541b989927187c4ca70490a35615d3fef2dce", 932 | "reference": "366541b989927187c4ca70490a35615d3fef2dce", 933 | "shasum": "" 934 | }, 935 | "require": { 936 | "php": "^7.1" 937 | }, 938 | "require-dev": { 939 | "phpunit/phpunit": "^7.0", 940 | "symfony/process": "^2 || ^3.3 || ^4" 941 | }, 942 | "type": "library", 943 | "extra": { 944 | "branch-alias": { 945 | "dev-master": "3.0-dev" 946 | } 947 | }, 948 | "autoload": { 949 | "classmap": [ 950 | "src/" 951 | ] 952 | }, 953 | "notification-url": "https://packagist.org/downloads/", 954 | "license": [ 955 | "BSD-3-Clause" 956 | ], 957 | "authors": [ 958 | { 959 | "name": "Kore Nordmann", 960 | "email": "mail@kore-nordmann.de" 961 | }, 962 | { 963 | "name": "Sebastian Bergmann", 964 | "email": "sebastian@phpunit.de" 965 | } 966 | ], 967 | "description": "Diff implementation", 968 | "homepage": "https://github.com/sebastianbergmann/diff", 969 | "keywords": [ 970 | "diff", 971 | "udiff", 972 | "unidiff", 973 | "unified diff" 974 | ], 975 | "time": "2018-06-10T07:54:39+00:00" 976 | }, 977 | { 978 | "name": "sebastian/environment", 979 | "version": "4.0.1", 980 | "source": { 981 | "type": "git", 982 | "url": "https://github.com/sebastianbergmann/environment.git", 983 | "reference": "febd209a219cea7b56ad799b30ebbea34b71eb8f" 984 | }, 985 | "dist": { 986 | "type": "zip", 987 | "url": "https://api.github.com/repos/sebastianbergmann/environment/zipball/febd209a219cea7b56ad799b30ebbea34b71eb8f", 988 | "reference": "febd209a219cea7b56ad799b30ebbea34b71eb8f", 989 | "shasum": "" 990 | }, 991 | "require": { 992 | "php": "^7.1" 993 | }, 994 | "require-dev": { 995 | "phpunit/phpunit": "^7.4" 996 | }, 997 | "type": "library", 998 | "extra": { 999 | "branch-alias": { 1000 | "dev-master": "4.0-dev" 1001 | } 1002 | }, 1003 | "autoload": { 1004 | "classmap": [ 1005 | "src/" 1006 | ] 1007 | }, 1008 | "notification-url": "https://packagist.org/downloads/", 1009 | "license": [ 1010 | "BSD-3-Clause" 1011 | ], 1012 | "authors": [ 1013 | { 1014 | "name": "Sebastian Bergmann", 1015 | "email": "sebastian@phpunit.de" 1016 | } 1017 | ], 1018 | "description": "Provides functionality to handle HHVM/PHP environments", 1019 | "homepage": "http://www.github.com/sebastianbergmann/environment", 1020 | "keywords": [ 1021 | "Xdebug", 1022 | "environment", 1023 | "hhvm" 1024 | ], 1025 | "time": "2018-11-25T09:31:21+00:00" 1026 | }, 1027 | { 1028 | "name": "sebastian/exporter", 1029 | "version": "3.1.0", 1030 | "source": { 1031 | "type": "git", 1032 | "url": "https://github.com/sebastianbergmann/exporter.git", 1033 | "reference": "234199f4528de6d12aaa58b612e98f7d36adb937" 1034 | }, 1035 | "dist": { 1036 | "type": "zip", 1037 | "url": "https://api.github.com/repos/sebastianbergmann/exporter/zipball/234199f4528de6d12aaa58b612e98f7d36adb937", 1038 | "reference": "234199f4528de6d12aaa58b612e98f7d36adb937", 1039 | "shasum": "" 1040 | }, 1041 | "require": { 1042 | "php": "^7.0", 1043 | "sebastian/recursion-context": "^3.0" 1044 | }, 1045 | "require-dev": { 1046 | "ext-mbstring": "*", 1047 | "phpunit/phpunit": "^6.0" 1048 | }, 1049 | "type": "library", 1050 | "extra": { 1051 | "branch-alias": { 1052 | "dev-master": "3.1.x-dev" 1053 | } 1054 | }, 1055 | "autoload": { 1056 | "classmap": [ 1057 | "src/" 1058 | ] 1059 | }, 1060 | "notification-url": "https://packagist.org/downloads/", 1061 | "license": [ 1062 | "BSD-3-Clause" 1063 | ], 1064 | "authors": [ 1065 | { 1066 | "name": "Jeff Welch", 1067 | "email": "whatthejeff@gmail.com" 1068 | }, 1069 | { 1070 | "name": "Volker Dusch", 1071 | "email": "github@wallbash.com" 1072 | }, 1073 | { 1074 | "name": "Bernhard Schussek", 1075 | "email": "bschussek@2bepublished.at" 1076 | }, 1077 | { 1078 | "name": "Sebastian Bergmann", 1079 | "email": "sebastian@phpunit.de" 1080 | }, 1081 | { 1082 | "name": "Adam Harvey", 1083 | "email": "aharvey@php.net" 1084 | } 1085 | ], 1086 | "description": "Provides the functionality to export PHP variables for visualization", 1087 | "homepage": "http://www.github.com/sebastianbergmann/exporter", 1088 | "keywords": [ 1089 | "export", 1090 | "exporter" 1091 | ], 1092 | "time": "2017-04-03T13:19:02+00:00" 1093 | }, 1094 | { 1095 | "name": "sebastian/global-state", 1096 | "version": "2.0.0", 1097 | "source": { 1098 | "type": "git", 1099 | "url": "https://github.com/sebastianbergmann/global-state.git", 1100 | "reference": "e8ba02eed7bbbb9e59e43dedd3dddeff4a56b0c4" 1101 | }, 1102 | "dist": { 1103 | "type": "zip", 1104 | "url": "https://api.github.com/repos/sebastianbergmann/global-state/zipball/e8ba02eed7bbbb9e59e43dedd3dddeff4a56b0c4", 1105 | "reference": "e8ba02eed7bbbb9e59e43dedd3dddeff4a56b0c4", 1106 | "shasum": "" 1107 | }, 1108 | "require": { 1109 | "php": "^7.0" 1110 | }, 1111 | "require-dev": { 1112 | "phpunit/phpunit": "^6.0" 1113 | }, 1114 | "suggest": { 1115 | "ext-uopz": "*" 1116 | }, 1117 | "type": "library", 1118 | "extra": { 1119 | "branch-alias": { 1120 | "dev-master": "2.0-dev" 1121 | } 1122 | }, 1123 | "autoload": { 1124 | "classmap": [ 1125 | "src/" 1126 | ] 1127 | }, 1128 | "notification-url": "https://packagist.org/downloads/", 1129 | "license": [ 1130 | "BSD-3-Clause" 1131 | ], 1132 | "authors": [ 1133 | { 1134 | "name": "Sebastian Bergmann", 1135 | "email": "sebastian@phpunit.de" 1136 | } 1137 | ], 1138 | "description": "Snapshotting of global state", 1139 | "homepage": "http://www.github.com/sebastianbergmann/global-state", 1140 | "keywords": [ 1141 | "global state" 1142 | ], 1143 | "time": "2017-04-27T15:39:26+00:00" 1144 | }, 1145 | { 1146 | "name": "sebastian/object-enumerator", 1147 | "version": "3.0.3", 1148 | "source": { 1149 | "type": "git", 1150 | "url": "https://github.com/sebastianbergmann/object-enumerator.git", 1151 | "reference": "7cfd9e65d11ffb5af41198476395774d4c8a84c5" 1152 | }, 1153 | "dist": { 1154 | "type": "zip", 1155 | "url": "https://api.github.com/repos/sebastianbergmann/object-enumerator/zipball/7cfd9e65d11ffb5af41198476395774d4c8a84c5", 1156 | "reference": "7cfd9e65d11ffb5af41198476395774d4c8a84c5", 1157 | "shasum": "" 1158 | }, 1159 | "require": { 1160 | "php": "^7.0", 1161 | "sebastian/object-reflector": "^1.1.1", 1162 | "sebastian/recursion-context": "^3.0" 1163 | }, 1164 | "require-dev": { 1165 | "phpunit/phpunit": "^6.0" 1166 | }, 1167 | "type": "library", 1168 | "extra": { 1169 | "branch-alias": { 1170 | "dev-master": "3.0.x-dev" 1171 | } 1172 | }, 1173 | "autoload": { 1174 | "classmap": [ 1175 | "src/" 1176 | ] 1177 | }, 1178 | "notification-url": "https://packagist.org/downloads/", 1179 | "license": [ 1180 | "BSD-3-Clause" 1181 | ], 1182 | "authors": [ 1183 | { 1184 | "name": "Sebastian Bergmann", 1185 | "email": "sebastian@phpunit.de" 1186 | } 1187 | ], 1188 | "description": "Traverses array structures and object graphs to enumerate all referenced objects", 1189 | "homepage": "https://github.com/sebastianbergmann/object-enumerator/", 1190 | "time": "2017-08-03T12:35:26+00:00" 1191 | }, 1192 | { 1193 | "name": "sebastian/object-reflector", 1194 | "version": "1.1.1", 1195 | "source": { 1196 | "type": "git", 1197 | "url": "https://github.com/sebastianbergmann/object-reflector.git", 1198 | "reference": "773f97c67f28de00d397be301821b06708fca0be" 1199 | }, 1200 | "dist": { 1201 | "type": "zip", 1202 | "url": "https://api.github.com/repos/sebastianbergmann/object-reflector/zipball/773f97c67f28de00d397be301821b06708fca0be", 1203 | "reference": "773f97c67f28de00d397be301821b06708fca0be", 1204 | "shasum": "" 1205 | }, 1206 | "require": { 1207 | "php": "^7.0" 1208 | }, 1209 | "require-dev": { 1210 | "phpunit/phpunit": "^6.0" 1211 | }, 1212 | "type": "library", 1213 | "extra": { 1214 | "branch-alias": { 1215 | "dev-master": "1.1-dev" 1216 | } 1217 | }, 1218 | "autoload": { 1219 | "classmap": [ 1220 | "src/" 1221 | ] 1222 | }, 1223 | "notification-url": "https://packagist.org/downloads/", 1224 | "license": [ 1225 | "BSD-3-Clause" 1226 | ], 1227 | "authors": [ 1228 | { 1229 | "name": "Sebastian Bergmann", 1230 | "email": "sebastian@phpunit.de" 1231 | } 1232 | ], 1233 | "description": "Allows reflection of object attributes, including inherited and non-public ones", 1234 | "homepage": "https://github.com/sebastianbergmann/object-reflector/", 1235 | "time": "2017-03-29T09:07:27+00:00" 1236 | }, 1237 | { 1238 | "name": "sebastian/recursion-context", 1239 | "version": "3.0.0", 1240 | "source": { 1241 | "type": "git", 1242 | "url": "https://github.com/sebastianbergmann/recursion-context.git", 1243 | "reference": "5b0cd723502bac3b006cbf3dbf7a1e3fcefe4fa8" 1244 | }, 1245 | "dist": { 1246 | "type": "zip", 1247 | "url": "https://api.github.com/repos/sebastianbergmann/recursion-context/zipball/5b0cd723502bac3b006cbf3dbf7a1e3fcefe4fa8", 1248 | "reference": "5b0cd723502bac3b006cbf3dbf7a1e3fcefe4fa8", 1249 | "shasum": "" 1250 | }, 1251 | "require": { 1252 | "php": "^7.0" 1253 | }, 1254 | "require-dev": { 1255 | "phpunit/phpunit": "^6.0" 1256 | }, 1257 | "type": "library", 1258 | "extra": { 1259 | "branch-alias": { 1260 | "dev-master": "3.0.x-dev" 1261 | } 1262 | }, 1263 | "autoload": { 1264 | "classmap": [ 1265 | "src/" 1266 | ] 1267 | }, 1268 | "notification-url": "https://packagist.org/downloads/", 1269 | "license": [ 1270 | "BSD-3-Clause" 1271 | ], 1272 | "authors": [ 1273 | { 1274 | "name": "Jeff Welch", 1275 | "email": "whatthejeff@gmail.com" 1276 | }, 1277 | { 1278 | "name": "Sebastian Bergmann", 1279 | "email": "sebastian@phpunit.de" 1280 | }, 1281 | { 1282 | "name": "Adam Harvey", 1283 | "email": "aharvey@php.net" 1284 | } 1285 | ], 1286 | "description": "Provides functionality to recursively process PHP variables", 1287 | "homepage": "http://www.github.com/sebastianbergmann/recursion-context", 1288 | "time": "2017-03-03T06:23:57+00:00" 1289 | }, 1290 | { 1291 | "name": "sebastian/resource-operations", 1292 | "version": "2.0.1", 1293 | "source": { 1294 | "type": "git", 1295 | "url": "https://github.com/sebastianbergmann/resource-operations.git", 1296 | "reference": "4d7a795d35b889bf80a0cc04e08d77cedfa917a9" 1297 | }, 1298 | "dist": { 1299 | "type": "zip", 1300 | "url": "https://api.github.com/repos/sebastianbergmann/resource-operations/zipball/4d7a795d35b889bf80a0cc04e08d77cedfa917a9", 1301 | "reference": "4d7a795d35b889bf80a0cc04e08d77cedfa917a9", 1302 | "shasum": "" 1303 | }, 1304 | "require": { 1305 | "php": "^7.1" 1306 | }, 1307 | "type": "library", 1308 | "extra": { 1309 | "branch-alias": { 1310 | "dev-master": "2.0-dev" 1311 | } 1312 | }, 1313 | "autoload": { 1314 | "classmap": [ 1315 | "src/" 1316 | ] 1317 | }, 1318 | "notification-url": "https://packagist.org/downloads/", 1319 | "license": [ 1320 | "BSD-3-Clause" 1321 | ], 1322 | "authors": [ 1323 | { 1324 | "name": "Sebastian Bergmann", 1325 | "email": "sebastian@phpunit.de" 1326 | } 1327 | ], 1328 | "description": "Provides a list of PHP built-in functions that operate on resources", 1329 | "homepage": "https://www.github.com/sebastianbergmann/resource-operations", 1330 | "time": "2018-10-04T04:07:39+00:00" 1331 | }, 1332 | { 1333 | "name": "sebastian/version", 1334 | "version": "2.0.1", 1335 | "source": { 1336 | "type": "git", 1337 | "url": "https://github.com/sebastianbergmann/version.git", 1338 | "reference": "99732be0ddb3361e16ad77b68ba41efc8e979019" 1339 | }, 1340 | "dist": { 1341 | "type": "zip", 1342 | "url": "https://api.github.com/repos/sebastianbergmann/version/zipball/99732be0ddb3361e16ad77b68ba41efc8e979019", 1343 | "reference": "99732be0ddb3361e16ad77b68ba41efc8e979019", 1344 | "shasum": "" 1345 | }, 1346 | "require": { 1347 | "php": ">=5.6" 1348 | }, 1349 | "type": "library", 1350 | "extra": { 1351 | "branch-alias": { 1352 | "dev-master": "2.0.x-dev" 1353 | } 1354 | }, 1355 | "autoload": { 1356 | "classmap": [ 1357 | "src/" 1358 | ] 1359 | }, 1360 | "notification-url": "https://packagist.org/downloads/", 1361 | "license": [ 1362 | "BSD-3-Clause" 1363 | ], 1364 | "authors": [ 1365 | { 1366 | "name": "Sebastian Bergmann", 1367 | "email": "sebastian@phpunit.de", 1368 | "role": "lead" 1369 | } 1370 | ], 1371 | "description": "Library that helps with managing the version number of Git-hosted PHP projects", 1372 | "homepage": "https://github.com/sebastianbergmann/version", 1373 | "time": "2016-10-03T07:35:21+00:00" 1374 | }, 1375 | { 1376 | "name": "symfony/polyfill-ctype", 1377 | "version": "v1.10.0", 1378 | "source": { 1379 | "type": "git", 1380 | "url": "https://github.com/symfony/polyfill-ctype.git", 1381 | "reference": "e3d826245268269cd66f8326bd8bc066687b4a19" 1382 | }, 1383 | "dist": { 1384 | "type": "zip", 1385 | "url": "https://api.github.com/repos/symfony/polyfill-ctype/zipball/e3d826245268269cd66f8326bd8bc066687b4a19", 1386 | "reference": "e3d826245268269cd66f8326bd8bc066687b4a19", 1387 | "shasum": "" 1388 | }, 1389 | "require": { 1390 | "php": ">=5.3.3" 1391 | }, 1392 | "suggest": { 1393 | "ext-ctype": "For best performance" 1394 | }, 1395 | "type": "library", 1396 | "extra": { 1397 | "branch-alias": { 1398 | "dev-master": "1.9-dev" 1399 | } 1400 | }, 1401 | "autoload": { 1402 | "psr-4": { 1403 | "Symfony\\Polyfill\\Ctype\\": "" 1404 | }, 1405 | "files": [ 1406 | "bootstrap.php" 1407 | ] 1408 | }, 1409 | "notification-url": "https://packagist.org/downloads/", 1410 | "license": [ 1411 | "MIT" 1412 | ], 1413 | "authors": [ 1414 | { 1415 | "name": "Symfony Community", 1416 | "homepage": "https://symfony.com/contributors" 1417 | }, 1418 | { 1419 | "name": "Gert de Pagter", 1420 | "email": "BackEndTea@gmail.com" 1421 | } 1422 | ], 1423 | "description": "Symfony polyfill for ctype functions", 1424 | "homepage": "https://symfony.com", 1425 | "keywords": [ 1426 | "compatibility", 1427 | "ctype", 1428 | "polyfill", 1429 | "portable" 1430 | ], 1431 | "time": "2018-08-06T14:22:27+00:00" 1432 | }, 1433 | { 1434 | "name": "theseer/tokenizer", 1435 | "version": "1.1.0", 1436 | "source": { 1437 | "type": "git", 1438 | "url": "https://github.com/theseer/tokenizer.git", 1439 | "reference": "cb2f008f3f05af2893a87208fe6a6c4985483f8b" 1440 | }, 1441 | "dist": { 1442 | "type": "zip", 1443 | "url": "https://api.github.com/repos/theseer/tokenizer/zipball/cb2f008f3f05af2893a87208fe6a6c4985483f8b", 1444 | "reference": "cb2f008f3f05af2893a87208fe6a6c4985483f8b", 1445 | "shasum": "" 1446 | }, 1447 | "require": { 1448 | "ext-dom": "*", 1449 | "ext-tokenizer": "*", 1450 | "ext-xmlwriter": "*", 1451 | "php": "^7.0" 1452 | }, 1453 | "type": "library", 1454 | "autoload": { 1455 | "classmap": [ 1456 | "src/" 1457 | ] 1458 | }, 1459 | "notification-url": "https://packagist.org/downloads/", 1460 | "license": [ 1461 | "BSD-3-Clause" 1462 | ], 1463 | "authors": [ 1464 | { 1465 | "name": "Arne Blankerts", 1466 | "email": "arne@blankerts.de", 1467 | "role": "Developer" 1468 | } 1469 | ], 1470 | "description": "A small library for converting tokenized PHP source code into XML and potentially other formats", 1471 | "time": "2017-04-07T12:08:54+00:00" 1472 | }, 1473 | { 1474 | "name": "webmozart/assert", 1475 | "version": "1.4.0", 1476 | "source": { 1477 | "type": "git", 1478 | "url": "https://github.com/webmozart/assert.git", 1479 | "reference": "83e253c8e0be5b0257b881e1827274667c5c17a9" 1480 | }, 1481 | "dist": { 1482 | "type": "zip", 1483 | "url": "https://api.github.com/repos/webmozart/assert/zipball/83e253c8e0be5b0257b881e1827274667c5c17a9", 1484 | "reference": "83e253c8e0be5b0257b881e1827274667c5c17a9", 1485 | "shasum": "" 1486 | }, 1487 | "require": { 1488 | "php": "^5.3.3 || ^7.0", 1489 | "symfony/polyfill-ctype": "^1.8" 1490 | }, 1491 | "require-dev": { 1492 | "phpunit/phpunit": "^4.6", 1493 | "sebastian/version": "^1.0.1" 1494 | }, 1495 | "type": "library", 1496 | "extra": { 1497 | "branch-alias": { 1498 | "dev-master": "1.3-dev" 1499 | } 1500 | }, 1501 | "autoload": { 1502 | "psr-4": { 1503 | "Webmozart\\Assert\\": "src/" 1504 | } 1505 | }, 1506 | "notification-url": "https://packagist.org/downloads/", 1507 | "license": [ 1508 | "MIT" 1509 | ], 1510 | "authors": [ 1511 | { 1512 | "name": "Bernhard Schussek", 1513 | "email": "bschussek@gmail.com" 1514 | } 1515 | ], 1516 | "description": "Assertions to validate method input/output with nice error messages.", 1517 | "keywords": [ 1518 | "assert", 1519 | "check", 1520 | "validate" 1521 | ], 1522 | "time": "2018-12-25T11:19:39+00:00" 1523 | } 1524 | ], 1525 | "packages-dev": [], 1526 | "aliases": [], 1527 | "minimum-stability": "dev", 1528 | "stability-flags": { 1529 | "prodigyview/prodigyview": 20 1530 | }, 1531 | "prefer-stable": true, 1532 | "prefer-lowest": false, 1533 | "platform": [], 1534 | "platform-dev": [] 1535 | } 1536 | -------------------------------------------------------------------------------- /security/index.php: -------------------------------------------------------------------------------- 1 | function(Request $request){ 16 | 17 | $response = array(); 18 | 19 | //RETRIEVE Data From The Request 20 | $data = $request->getRequestData('array'); 21 | 22 | 23 | if ($data) { 24 | $data['type']='charge'; 25 | 26 | //Send The Message 27 | $result = sendToPurchaseService($data); 28 | 29 | //Create a response from the microservice 30 | $response = array('status' => $result); 31 | } else { 32 | $response = array('status' => 'Unable To Send Email'); 33 | } 34 | 35 | //Send response to client who accessed the API 36 | sendResponse(json_encode($response)); 37 | })); 38 | 39 | Router::post('/products/refund', array('callback'=>function(Request $request){ 40 | //RETRIEVE Data From The Request 41 | $data = $request->getRequestData('array'); 42 | 43 | $response = array(); 44 | 45 | if ($data) { 46 | 47 | $data['type']='refund'; 48 | 49 | //Send The Message 50 | $result = sendToPurchaseService($data); 51 | 52 | //Create a response from the microservice 53 | $response = array('status' => $result); 54 | } else { 55 | $response = array('status' => 'Unable To Perform Refund'); 56 | } 57 | 58 | //Send response to client who accessed the API 59 | sendResponse(json_encode($response)); 60 | })); 61 | 62 | Router::setRoute(); 63 | 64 | /** 65 | * Open a socket to the microservice 66 | */ 67 | function getSocket() { 68 | $host = '127.0.0.1'; 69 | $port = 8502; 70 | $socket = new Socket($host, $port, array('connect' => true)); 71 | 72 | return $socket; 73 | } 74 | 75 | /** 76 | * Send the message to microservice 77 | */ 78 | function sendToPurchaseService(array $message) { 79 | 80 | //Get the token and attached to message 81 | $token = AuthBearer::getToken('user1', 'abc123'); 82 | $message['token']=$token; 83 | 84 | $socket = new Socket('127.0.0.1', 8601, array('connect' => true)); 85 | 86 | $message = json_encode($message); 87 | //Encrypt The Message 88 | Security::init(); 89 | $message = Security::encrypt($message); 90 | 91 | //Send Data To Email Processing 92 | $result = $socket->send($message); 93 | 94 | //Decrypt the Encrypted message 95 | $result = Security::decrypt($result); 96 | 97 | $socket->close(); 98 | 99 | return $result; 100 | } 101 | 102 | /** 103 | * Send a response to the api client 104 | */ 105 | function sendResponse(string $message, int $status = 200) { 106 | echo Response::createResponse(200, $message); 107 | } 108 | 109 | 110 | -------------------------------------------------------------------------------- /security/payment_server/functions.php: -------------------------------------------------------------------------------- 1 | $amount, 29 | 'status' => 'charged', 30 | 'meta' => $meta 31 | ); 32 | 33 | return $id; 34 | } 35 | 36 | /** 37 | * Refunds an item that has been purchased 38 | * 39 | * @param string $id The id of the time that was purchased 40 | * @param array $charges A database array of charges 41 | * 42 | * @return boolean Returns true of the item was deleted, otherwise false 43 | */ 44 | function refund($id, array &$charges) : bool { 45 | 46 | if(isset($charges[$id]) && $charges[$id]['status']=='charged') { 47 | unset($charges[$id]); 48 | return true; 49 | } 50 | 51 | return false; 52 | 53 | } 54 | 55 | /** 56 | * Checkes to see if a charge exist 57 | * 58 | * @param string $id The id of a charge to check if it exist 59 | * @param array $charges A database of charges to check against 60 | * 61 | * @return boolean Returns true of the charge exist, otherwise false 62 | */ 63 | function chargeExist($id, array &$charges) : bool { 64 | return isset($charges[$id]); 65 | } 66 | -------------------------------------------------------------------------------- /security/payment_server/server.php: -------------------------------------------------------------------------------- 1 | array( 11 | 'amount' => '10', 12 | 'status' => 'charged', 13 | 'meta' => array('product_id'=> 'x3c3', 'account_id'=>1) 14 | ), 15 | '789012'=> array( 16 | 'amount' => '20', 17 | 'status' => 'refunded', 18 | 'meta' => array('product_id'=> 'c8d0', 'account_id'=>2) 19 | ), 20 | ); 21 | 22 | $nounces = array( 23 | '1c46538c712e9b5bf0fe43d692', 24 | '004f617b494d004e29daaf' 25 | ); 26 | 27 | //Mock tokens for the system. Should also be stored in a database 28 | $tokens = array(); 29 | 30 | include('functions.php'); 31 | include_once (dirname(__FILE__) . '/../authbearer/AuthBearer.php'); 32 | 33 | //Create The Server 34 | $server = new Socket('localhost', 8601, array( 35 | 'bind' => true, 36 | 'listen' => true 37 | )); 38 | 39 | //Start The Server 40 | $server->startServer('', function($message) { 41 | global $nounces; 42 | global $charges; 43 | 44 | echo "Processing...\n"; 45 | 46 | //Decrypt our encrypted message 47 | Security::init(); 48 | $message = Security::decrypt($message); 49 | 50 | //Turn the data into an array 51 | $data = json_decode($message, true); 52 | 53 | $response = array('status' => 'error', 'message' => 'Invalid Command'); 54 | 55 | $type = (isset($data['type'])) ? $data['type'] : ''; 56 | 57 | //Verify that the correct token is being used 58 | if (isset($data['token']) && AuthBearer::hasAccess($data['token'], $type)) { 59 | 60 | if($type == 'charge' && checkNounce($data['nounce'], $nounces)) { 61 | $id = charge($data['amount'], $data['nounce'], array('product' => 'Shoes'), $charges); 62 | $response = array('status' => 'success', 'message' => $id); 63 | }else if($type == 'charge') { 64 | $response = array('status' => 'error', 'message' => 'Invalid Nounce'); 65 | } else if($type == 'refund' && refund($data['id'], $charges)) { 66 | $response = array('status' => 'success', 'message' => 'Refund Successful'); 67 | } else if($type == 'refund') { 68 | $response = array('status' => 'error', 'message' => 'Unable To Peform Refund'); 69 | } 70 | 71 | } else{ 72 | $response = array('status' => 'error', 'message' => 'Invalid Token On Purchase'); 73 | } 74 | 75 | //JSON Encode 76 | $response = json_encode($response); 77 | 78 | //Return an encrypted message 79 | return Security::encrypt($response); 80 | 81 | }, 'closure'); 82 | 83 | 84 | 85 | -------------------------------------------------------------------------------- /security/tests/AuthenticationServerTest.php: -------------------------------------------------------------------------------- 1 | array('login' =>'user1', 'password'=>'abc123' , 'privileges' => array('*')), 12 | '2'=> array('login' =>'user2', 'password'=>'123456' , 'privileges' => array('send_notification', 'send_email')), 13 | '3'=> array('login' =>'user3', 'password'=>'qwerty', 'privileges' => array('videos', 'images')), 14 | ); 15 | 16 | private $_tokens = array(); 17 | 18 | public function testAuthenticationPass() { 19 | 20 | $id = authenticate('user1', 'abc123', $this ->_logins); 21 | 22 | $this->assertEquals(1, $id); 23 | } 24 | 25 | public function testAuthenticationFail() { 26 | 27 | $id = authenticate('user1', 'abc1234', $this ->_logins); 28 | 29 | 30 | $this->assertFalse($id); 31 | } 32 | 33 | public function testTokenGeneration() { 34 | $token = generateToken(false); 35 | 36 | $this->assertTrue(true); 37 | } 38 | 39 | public function testStoringToken() { 40 | 41 | $token = generateToken(false); 42 | 43 | storeToken($token, $this->_tokens, strtotime('+1 minute')); 44 | 45 | 46 | $this->assertTrue(isset($this->_tokens[$token])); 47 | } 48 | 49 | public function testConsumingToken() { 50 | 51 | $token = generateToken(false); 52 | 53 | storeToken($token, $this->_tokens, strtotime('+1 minute')); 54 | 55 | consumeToken($token, $this->_tokens); 56 | 57 | $this->assertFalse(isset($this->tokens[$token])); 58 | } 59 | 60 | public function testHasExpiredFalse() { 61 | 62 | $token = generateToken(false); 63 | 64 | storeToken($token, $this->_tokens,time() + 5); 65 | 66 | $expired = hasExpired($token, $this->_tokens, time()); 67 | 68 | $this->assertFalse($expired); 69 | 70 | 71 | } 72 | 73 | public function testHasExpiredTrue() { 74 | 75 | $token = generateToken(false); 76 | 77 | storeToken($token, $this->_tokens, time() + 4); 78 | 79 | //Wait 5 seconds 80 | sleep(5); 81 | 82 | //Set to expire in 4 seconds 83 | $expired = hasExpired($token, $this->_tokens, time()); 84 | 85 | $this->assertTrue($expired); 86 | } 87 | 88 | public function testHasPriviligesAll() { 89 | $token = generateToken(false); 90 | 91 | storeToken($token, $this->_tokens, strtotime('+1 minute')); 92 | 93 | $hasAccess = checkPrivileges($token, 'video', $this->_tokens); 94 | 95 | $this->assertTrue($hasAccess); 96 | } 97 | 98 | public function testHasPriviligesVideoTrue() { 99 | $token = generateToken(false); 100 | 101 | storeToken($token, $this->_tokens, strtotime('+1 minute'), array('video','image', 'messenging')); 102 | 103 | $hasAccess = checkPrivileges($token, 'video', $this->_tokens); 104 | 105 | $this->assertTrue($hasAccess); 106 | } 107 | 108 | public function testHasPriviligesVideoFalse() { 109 | $token = generateToken(false); 110 | 111 | storeToken($token, $this->_tokens, strtotime('+1 minute'), array('image', 'messenging')); 112 | 113 | $hasAccess = checkPrivileges($token, 'video', $this->_tokens); 114 | 115 | $this->assertFalse($hasAccess); 116 | } 117 | 118 | public function testValidToken() { 119 | $token = generateToken(false); 120 | 121 | storeToken($token, $this->_tokens, strtotime('+1 minute')); 122 | 123 | $hasAccess = validateToken($token, 'video', $this->_tokens, time()); 124 | 125 | $this->assertTrue($hasAccess); 126 | } 127 | 128 | public function testValidTokenPrivilegesFalse() { 129 | $token = generateToken(false); 130 | 131 | storeToken($token, $this->_tokens, strtotime('+1 minute'), array('image', 'messenging')); 132 | 133 | $hasAccess = validateToken($token, 'video', $this->_tokens, time()); 134 | 135 | $this->assertFalse($hasAccess); 136 | } 137 | 138 | public function testValidTokenPrivilegesExpired() { 139 | $token = generateToken(false); 140 | 141 | storeToken($token, $this->_tokens, time()+4, array('*')); 142 | 143 | sleep(5); 144 | $hasAccess = validateToken($token, 'video', $this->_tokens, time()); 145 | 146 | $this->assertFalse($hasAccess); 147 | } 148 | 149 | 150 | } 151 | -------------------------------------------------------------------------------- /security/tests/PaymentSeverTest.php: -------------------------------------------------------------------------------- 1 | array( 12 | 'amount' => '10', 13 | 'status' => 'charged', 14 | 'meta' => array('product_id'=> 'x3c3', 'account_id'=>1) 15 | ), 16 | '789012'=> array( 17 | 'amount' => '20', 18 | 'status' => 'refunded', 19 | 'meta' => array('product_id'=> 'c8d0', 'account_id'=>2) 20 | ), 21 | ); 22 | 23 | private $_nounces = array( 24 | '1c46538c712e9b5bf0fe43d692', 25 | '004f617b494d004e29daaf' 26 | ); 27 | 28 | public function testNounceExistTrue() { 29 | 30 | $result = checkNounce('1c46538c712e9b5bf0fe43d692', $this -> _nounces); 31 | 32 | $this->assertTrue($result); 33 | } 34 | 35 | public function testNounceExistFalse() { 36 | 37 | $result = checkNounce('abc123', $this -> _nounces); 38 | 39 | $this->assertFalse($result); 40 | } 41 | 42 | public function testChargeExistTrue() { 43 | 44 | $result = chargeExist('123456', $this->_charges); 45 | 46 | $this->assertTrue($result); 47 | 48 | } 49 | 50 | public function testChargeExistFalse() { 51 | 52 | $result = chargeExist('doe123P', $this->_charges); 53 | 54 | $this->assertFalse($result); 55 | 56 | } 57 | 58 | public function testChargeExistAfterPayment() { 59 | $result = charge(5.00, 'abc123', array('product' => 'radio1'), $this->_charges); 60 | 61 | $this->assertTrue(chargeExist($result, $this->_charges)); 62 | } 63 | 64 | public function testRefundTrue() { 65 | $refunded = refund('123456', $this->_charges); 66 | 67 | $this->assertTrue($refunded); 68 | } 69 | 70 | public function testRefundFalse() { 71 | $refunded = refund('789012', $this->_charges); 72 | 73 | $this->assertFalse($refunded); 74 | } 75 | 76 | 77 | 78 | 79 | } 80 | -------------------------------------------------------------------------------- /socket_vs_http/client.php: -------------------------------------------------------------------------------- 1 | 'string','ofdata' => 'to send'); 13 | Security::init(); 14 | 15 | $start = microtime(true); 16 | for($i =0; $i<$request; $i++) { 17 | $curl = new Curl('127.0.0.1:8000/callme'); 18 | $curl->send('get',$data ); 19 | $curl->getResponse(); 20 | } 21 | 22 | echo 'HTTP Routing Time: ' . (microtime(true) - $start) . "\n"; 23 | 24 | 25 | $start = microtime(true); 26 | for($i =0; $i<$request; $i++) { 27 | $curl = new Curl('http://127.0.0.1:8000/get.php'); 28 | $curl->send('get',$data ); 29 | $curl->getResponse(); 30 | } 31 | 32 | echo 'HTTP GET Time (No Routing): ' . (microtime(true) - $start) . "\n"; 33 | 34 | $start = microtime(true); 35 | for($i =0; $i<$request; $i++) { 36 | //Connect To Server 1, send message 37 | $socket = new Socket('localhost', 8650, array('connect' => true)); 38 | $message = Security::encrypt(json_encode($data)); 39 | $response = $socket->send($message); 40 | $socket->close(); 41 | } 42 | 43 | echo 'Socket Test Time: ' . (microtime(true) - $start) . "\n"; 44 | 45 | 46 | 47 | -------------------------------------------------------------------------------- /socket_vs_http/composer.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "microservices/email", 3 | "description": "Email Microservice", 4 | "type": "project", 5 | "authors": [ 6 | { 7 | "name": "Devin Dixon", 8 | "email": "ddixon@bingewave.com" 9 | } 10 | ], 11 | "minimum-stability" : "dev", 12 | "prefer-stable": true, 13 | "require": { 14 | "prodigyview/prodigyview": "dev-master" 15 | } 16 | } 17 | -------------------------------------------------------------------------------- /socket_vs_http/composer.lock: -------------------------------------------------------------------------------- 1 | { 2 | "_readme": [ 3 | "This file locks the dependencies of your project to a known state", 4 | "Read more about it at https://getcomposer.org/doc/01-basic-usage.md#installing-dependencies", 5 | "This file is @generated automatically" 6 | ], 7 | "content-hash": "47ba22966b0aad2e6368fc0e21018347", 8 | "packages": [ 9 | { 10 | "name": "prodigyview/prodigyview", 11 | "version": "dev-master", 12 | "source": { 13 | "type": "git", 14 | "url": "https://github.com/ProdigyView-Toolkit/prodigyview.git", 15 | "reference": "77f726149374f49e5c8ea460dd5eb18da7189f3a" 16 | }, 17 | "dist": { 18 | "type": "zip", 19 | "url": "https://api.github.com/repos/ProdigyView-Toolkit/prodigyview/zipball/77f726149374f49e5c8ea460dd5eb18da7189f3a", 20 | "reference": "77f726149374f49e5c8ea460dd5eb18da7189f3a", 21 | "shasum": "" 22 | }, 23 | "require": { 24 | "php": ">=7.0.0" 25 | }, 26 | "require-dev": { 27 | "guzzlehttp/guzzle": "^6.3", 28 | "phpunit/php-code-coverage": "^6.1", 29 | "phpunit/phpunit": "^7" 30 | }, 31 | "type": "library", 32 | "autoload": { 33 | "psr-4": { 34 | "prodigyview\\": "src/" 35 | } 36 | }, 37 | "notification-url": "https://packagist.org/downloads/", 38 | "license": [ 39 | "MIT" 40 | ], 41 | "authors": [ 42 | { 43 | "name": "Devin Dixon", 44 | "email": "ddixon@prodigyview.com", 45 | "homepage": "http://www.prodigyview.com", 46 | "role": "Entrepreneur & Developer" 47 | } 48 | ], 49 | "description": "Complete PHP Toolkit", 50 | "homepage": "https://github.com/ProdigyView-Toolkit/prodigyview", 51 | "keywords": [ 52 | "mvc", 53 | "php" 54 | ], 55 | "time": "2019-01-06T20:12:56+00:00" 56 | } 57 | ], 58 | "packages-dev": [], 59 | "aliases": [], 60 | "minimum-stability": "dev", 61 | "stability-flags": { 62 | "prodigyview/prodigyview": 20 63 | }, 64 | "prefer-stable": true, 65 | "prefer-lowest": false, 66 | "platform": [], 67 | "platform-dev": [] 68 | } 69 | -------------------------------------------------------------------------------- /socket_vs_http/http_server/get.php: -------------------------------------------------------------------------------- 1 | 'success', 'message' => 'Responding'); 7 | echo Response::createResponse(200, json_encode($response)); -------------------------------------------------------------------------------- /socket_vs_http/http_server/index.php: -------------------------------------------------------------------------------- 1 | function(Request $request){ 11 | 12 | $response = array('status' => 'success', 'message' => 'Responding'); 13 | echo Response::createResponse(200, json_encode($response)); 14 | })); 15 | 16 | Router::setRoute(); 17 | -------------------------------------------------------------------------------- /socket_vs_http/socket_server/server.php: -------------------------------------------------------------------------------- 1 | true, 10 | 'listen' => true 11 | )); 12 | 13 | //Start The Server 14 | $server->startServer('', function($message) { 15 | 16 | //Decrypt our encrypted message 17 | Security::init(); 18 | $message = Security::decrypt($message); 19 | 20 | //Turn the data into an array 21 | $data = json_decode($message, true); 22 | 23 | //Default response 24 | $response = array('status' => 'success', 'message' => 'Responding'); 25 | 26 | //JSON encode the response 27 | $response =json_encode($response); 28 | 29 | //Return an encrypted message 30 | return Security::encrypt($response); 31 | 32 | }, 'closure'); 33 | 34 | 35 | 36 | -------------------------------------------------------------------------------- /video/client.php: -------------------------------------------------------------------------------- 1 | channel(); 10 | 11 | //Create the queue 12 | $channel->queue_declare('video_queue', //$queue - Either sets the queue or creates it if not exist 13 | false, //$passive - Do not modify the servers state 14 | true, //$durable - Data will persist if crash or restart occurs 15 | false, //$exclusive - Only one connection will use queue, and deleted when closed 16 | false //$auto_delete - Queue is deleted when consumer is no longer subscribes 17 | ); 18 | 19 | $data = array( 20 | 'video_url' => 'https://sample-videos.com/video123/mp4/720/big_buck_bunny_720p_20mb.mp4', 21 | 'convert_to' => 'mov' 22 | ); 23 | 24 | //Create the message, set the delivery to be persistant for crashes and restarts 25 | $msg = new AMQPMessage(json_encode($data), array('delivery_mode' => AMQPMessage::DELIVERY_MODE_PERSISTENT)); 26 | $channel->basic_publish($msg, '', 'video_queue'); 27 | 28 | echo "Sent Video To Server!'\n"; 29 | 30 | $channel->close(); 31 | $connection->close(); 32 | -------------------------------------------------------------------------------- /video/composer.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "microservices/email", 3 | "description": "Email Microservice", 4 | "type": "project", 5 | "authors": [ 6 | { 7 | "name": "Devin Dixon", 8 | "email": "ddixon@bingewave.com" 9 | } 10 | ], 11 | "minimum-stability" : "dev", 12 | "prefer-stable": true, 13 | "require": { 14 | "prodigyview/prodigyview": "^0.9.0", 15 | "php-amqplib/php-amqplib": "v2.8.1" 16 | } 17 | } 18 | -------------------------------------------------------------------------------- /video/composer.lock: -------------------------------------------------------------------------------- 1 | { 2 | "_readme": [ 3 | "This file locks the dependencies of your project to a known state", 4 | "Read more about it at https://getcomposer.org/doc/01-basic-usage.md#installing-dependencies", 5 | "This file is @generated automatically" 6 | ], 7 | "content-hash": "83671cc51da8afd3a060fe7d49f15c57", 8 | "packages": [ 9 | { 10 | "name": "php-amqplib/php-amqplib", 11 | "version": "v2.8.1", 12 | "source": { 13 | "type": "git", 14 | "url": "https://github.com/php-amqplib/php-amqplib.git", 15 | "reference": "84449ffd3f5a7466bbee3946facb3746ff11f075" 16 | }, 17 | "dist": { 18 | "type": "zip", 19 | "url": "https://api.github.com/repos/php-amqplib/php-amqplib/zipball/84449ffd3f5a7466bbee3946facb3746ff11f075", 20 | "reference": "84449ffd3f5a7466bbee3946facb3746ff11f075", 21 | "shasum": "" 22 | }, 23 | "require": { 24 | "ext-bcmath": "*", 25 | "ext-sockets": "*", 26 | "php": ">=5.4.0" 27 | }, 28 | "replace": { 29 | "videlalvaro/php-amqplib": "self.version" 30 | }, 31 | "require-dev": { 32 | "phpdocumentor/phpdocumentor": "^2.9", 33 | "phpunit/phpunit": "^4.8", 34 | "scrutinizer/ocular": "^1.1", 35 | "squizlabs/php_codesniffer": "^2.5" 36 | }, 37 | "type": "library", 38 | "extra": { 39 | "branch-alias": { 40 | "dev-master": "2.8-dev" 41 | } 42 | }, 43 | "autoload": { 44 | "psr-4": { 45 | "PhpAmqpLib\\": "PhpAmqpLib/" 46 | } 47 | }, 48 | "notification-url": "https://packagist.org/downloads/", 49 | "license": [ 50 | "LGPL-2.1-or-later" 51 | ], 52 | "authors": [ 53 | { 54 | "name": "Alvaro Videla", 55 | "role": "Original Maintainer" 56 | }, 57 | { 58 | "name": "John Kelly", 59 | "email": "johnmkelly86@gmail.com", 60 | "role": "Maintainer" 61 | }, 62 | { 63 | "name": "Raúl Araya", 64 | "email": "nubeiro@gmail.com", 65 | "role": "Maintainer" 66 | }, 67 | { 68 | "name": "Luke Bakken", 69 | "email": "luke@bakken.io", 70 | "role": "Maintainer" 71 | } 72 | ], 73 | "description": "Formerly videlalvaro/php-amqplib. This library is a pure PHP implementation of the AMQP protocol. It's been tested against RabbitMQ.", 74 | "homepage": "https://github.com/php-amqplib/php-amqplib/", 75 | "keywords": [ 76 | "message", 77 | "queue", 78 | "rabbitmq" 79 | ], 80 | "time": "2018-11-13T09:35:17+00:00" 81 | }, 82 | { 83 | "name": "prodigyview/prodigyview", 84 | "version": "0.9.0", 85 | "source": { 86 | "type": "git", 87 | "url": "https://github.com/ProdigyView-Toolkit/prodigyview.git", 88 | "reference": "49a626b5b1928fa42a89f53a53c67ff366c9b067" 89 | }, 90 | "dist": { 91 | "type": "zip", 92 | "url": "https://api.github.com/repos/ProdigyView-Toolkit/prodigyview/zipball/49a626b5b1928fa42a89f53a53c67ff366c9b067", 93 | "reference": "49a626b5b1928fa42a89f53a53c67ff366c9b067", 94 | "shasum": "" 95 | }, 96 | "require": { 97 | "php": ">=7.0.0" 98 | }, 99 | "require-dev": { 100 | "guzzlehttp/guzzle": "^6.3", 101 | "phpunit/php-code-coverage": "^6.1", 102 | "phpunit/phpunit": "^7" 103 | }, 104 | "type": "library", 105 | "autoload": { 106 | "psr-4": { 107 | "prodigyview\\": "src/" 108 | } 109 | }, 110 | "notification-url": "https://packagist.org/downloads/", 111 | "license": [ 112 | "MIT" 113 | ], 114 | "authors": [ 115 | { 116 | "name": "Devin Dixon", 117 | "email": "ddixon@prodigyview.com", 118 | "homepage": "http://www.prodigyview.com", 119 | "role": "Entrepreneur & Developer" 120 | } 121 | ], 122 | "description": "Complete PHP Toolkit", 123 | "homepage": "https://github.com/ProdigyView-Toolkit/prodigyview", 124 | "keywords": [ 125 | "mvc", 126 | "php" 127 | ], 128 | "time": "2019-01-01T17:44:17+00:00" 129 | } 130 | ], 131 | "packages-dev": [ 132 | { 133 | "name": "doctrine/instantiator", 134 | "version": "1.1.0", 135 | "source": { 136 | "type": "git", 137 | "url": "https://github.com/doctrine/instantiator.git", 138 | "reference": "185b8868aa9bf7159f5f953ed5afb2d7fcdc3bda" 139 | }, 140 | "dist": { 141 | "type": "zip", 142 | "url": "https://api.github.com/repos/doctrine/instantiator/zipball/185b8868aa9bf7159f5f953ed5afb2d7fcdc3bda", 143 | "reference": "185b8868aa9bf7159f5f953ed5afb2d7fcdc3bda", 144 | "shasum": "" 145 | }, 146 | "require": { 147 | "php": "^7.1" 148 | }, 149 | "require-dev": { 150 | "athletic/athletic": "~0.1.8", 151 | "ext-pdo": "*", 152 | "ext-phar": "*", 153 | "phpunit/phpunit": "^6.2.3", 154 | "squizlabs/php_codesniffer": "^3.0.2" 155 | }, 156 | "type": "library", 157 | "extra": { 158 | "branch-alias": { 159 | "dev-master": "1.2.x-dev" 160 | } 161 | }, 162 | "autoload": { 163 | "psr-4": { 164 | "Doctrine\\Instantiator\\": "src/Doctrine/Instantiator/" 165 | } 166 | }, 167 | "notification-url": "https://packagist.org/downloads/", 168 | "license": [ 169 | "MIT" 170 | ], 171 | "authors": [ 172 | { 173 | "name": "Marco Pivetta", 174 | "email": "ocramius@gmail.com", 175 | "homepage": "http://ocramius.github.com/" 176 | } 177 | ], 178 | "description": "A small, lightweight utility to instantiate objects in PHP without invoking their constructors", 179 | "homepage": "https://github.com/doctrine/instantiator", 180 | "keywords": [ 181 | "constructor", 182 | "instantiate" 183 | ], 184 | "time": "2017-07-22T11:58:36+00:00" 185 | }, 186 | { 187 | "name": "myclabs/deep-copy", 188 | "version": "1.8.1", 189 | "source": { 190 | "type": "git", 191 | "url": "https://github.com/myclabs/DeepCopy.git", 192 | "reference": "3e01bdad3e18354c3dce54466b7fbe33a9f9f7f8" 193 | }, 194 | "dist": { 195 | "type": "zip", 196 | "url": "https://api.github.com/repos/myclabs/DeepCopy/zipball/3e01bdad3e18354c3dce54466b7fbe33a9f9f7f8", 197 | "reference": "3e01bdad3e18354c3dce54466b7fbe33a9f9f7f8", 198 | "shasum": "" 199 | }, 200 | "require": { 201 | "php": "^7.1" 202 | }, 203 | "replace": { 204 | "myclabs/deep-copy": "self.version" 205 | }, 206 | "require-dev": { 207 | "doctrine/collections": "^1.0", 208 | "doctrine/common": "^2.6", 209 | "phpunit/phpunit": "^7.1" 210 | }, 211 | "type": "library", 212 | "autoload": { 213 | "psr-4": { 214 | "DeepCopy\\": "src/DeepCopy/" 215 | }, 216 | "files": [ 217 | "src/DeepCopy/deep_copy.php" 218 | ] 219 | }, 220 | "notification-url": "https://packagist.org/downloads/", 221 | "license": [ 222 | "MIT" 223 | ], 224 | "description": "Create deep copies (clones) of your objects", 225 | "keywords": [ 226 | "clone", 227 | "copy", 228 | "duplicate", 229 | "object", 230 | "object graph" 231 | ], 232 | "time": "2018-06-11T23:09:50+00:00" 233 | }, 234 | { 235 | "name": "phar-io/manifest", 236 | "version": "1.0.3", 237 | "source": { 238 | "type": "git", 239 | "url": "https://github.com/phar-io/manifest.git", 240 | "reference": "7761fcacf03b4d4f16e7ccb606d4879ca431fcf4" 241 | }, 242 | "dist": { 243 | "type": "zip", 244 | "url": "https://api.github.com/repos/phar-io/manifest/zipball/7761fcacf03b4d4f16e7ccb606d4879ca431fcf4", 245 | "reference": "7761fcacf03b4d4f16e7ccb606d4879ca431fcf4", 246 | "shasum": "" 247 | }, 248 | "require": { 249 | "ext-dom": "*", 250 | "ext-phar": "*", 251 | "phar-io/version": "^2.0", 252 | "php": "^5.6 || ^7.0" 253 | }, 254 | "type": "library", 255 | "extra": { 256 | "branch-alias": { 257 | "dev-master": "1.0.x-dev" 258 | } 259 | }, 260 | "autoload": { 261 | "classmap": [ 262 | "src/" 263 | ] 264 | }, 265 | "notification-url": "https://packagist.org/downloads/", 266 | "license": [ 267 | "BSD-3-Clause" 268 | ], 269 | "authors": [ 270 | { 271 | "name": "Arne Blankerts", 272 | "email": "arne@blankerts.de", 273 | "role": "Developer" 274 | }, 275 | { 276 | "name": "Sebastian Heuer", 277 | "email": "sebastian@phpeople.de", 278 | "role": "Developer" 279 | }, 280 | { 281 | "name": "Sebastian Bergmann", 282 | "email": "sebastian@phpunit.de", 283 | "role": "Developer" 284 | } 285 | ], 286 | "description": "Component for reading phar.io manifest information from a PHP Archive (PHAR)", 287 | "time": "2018-07-08T19:23:20+00:00" 288 | }, 289 | { 290 | "name": "phar-io/version", 291 | "version": "2.0.1", 292 | "source": { 293 | "type": "git", 294 | "url": "https://github.com/phar-io/version.git", 295 | "reference": "45a2ec53a73c70ce41d55cedef9063630abaf1b6" 296 | }, 297 | "dist": { 298 | "type": "zip", 299 | "url": "https://api.github.com/repos/phar-io/version/zipball/45a2ec53a73c70ce41d55cedef9063630abaf1b6", 300 | "reference": "45a2ec53a73c70ce41d55cedef9063630abaf1b6", 301 | "shasum": "" 302 | }, 303 | "require": { 304 | "php": "^5.6 || ^7.0" 305 | }, 306 | "type": "library", 307 | "autoload": { 308 | "classmap": [ 309 | "src/" 310 | ] 311 | }, 312 | "notification-url": "https://packagist.org/downloads/", 313 | "license": [ 314 | "BSD-3-Clause" 315 | ], 316 | "authors": [ 317 | { 318 | "name": "Arne Blankerts", 319 | "email": "arne@blankerts.de", 320 | "role": "Developer" 321 | }, 322 | { 323 | "name": "Sebastian Heuer", 324 | "email": "sebastian@phpeople.de", 325 | "role": "Developer" 326 | }, 327 | { 328 | "name": "Sebastian Bergmann", 329 | "email": "sebastian@phpunit.de", 330 | "role": "Developer" 331 | } 332 | ], 333 | "description": "Library for handling version information and constraints", 334 | "time": "2018-07-08T19:19:57+00:00" 335 | }, 336 | { 337 | "name": "phpdocumentor/reflection-common", 338 | "version": "1.0.1", 339 | "source": { 340 | "type": "git", 341 | "url": "https://github.com/phpDocumentor/ReflectionCommon.git", 342 | "reference": "21bdeb5f65d7ebf9f43b1b25d404f87deab5bfb6" 343 | }, 344 | "dist": { 345 | "type": "zip", 346 | "url": "https://api.github.com/repos/phpDocumentor/ReflectionCommon/zipball/21bdeb5f65d7ebf9f43b1b25d404f87deab5bfb6", 347 | "reference": "21bdeb5f65d7ebf9f43b1b25d404f87deab5bfb6", 348 | "shasum": "" 349 | }, 350 | "require": { 351 | "php": ">=5.5" 352 | }, 353 | "require-dev": { 354 | "phpunit/phpunit": "^4.6" 355 | }, 356 | "type": "library", 357 | "extra": { 358 | "branch-alias": { 359 | "dev-master": "1.0.x-dev" 360 | } 361 | }, 362 | "autoload": { 363 | "psr-4": { 364 | "phpDocumentor\\Reflection\\": [ 365 | "src" 366 | ] 367 | } 368 | }, 369 | "notification-url": "https://packagist.org/downloads/", 370 | "license": [ 371 | "MIT" 372 | ], 373 | "authors": [ 374 | { 375 | "name": "Jaap van Otterdijk", 376 | "email": "opensource@ijaap.nl" 377 | } 378 | ], 379 | "description": "Common reflection classes used by phpdocumentor to reflect the code structure", 380 | "homepage": "http://www.phpdoc.org", 381 | "keywords": [ 382 | "FQSEN", 383 | "phpDocumentor", 384 | "phpdoc", 385 | "reflection", 386 | "static analysis" 387 | ], 388 | "time": "2017-09-11T18:02:19+00:00" 389 | }, 390 | { 391 | "name": "phpdocumentor/reflection-docblock", 392 | "version": "4.3.0", 393 | "source": { 394 | "type": "git", 395 | "url": "https://github.com/phpDocumentor/ReflectionDocBlock.git", 396 | "reference": "94fd0001232e47129dd3504189fa1c7225010d08" 397 | }, 398 | "dist": { 399 | "type": "zip", 400 | "url": "https://api.github.com/repos/phpDocumentor/ReflectionDocBlock/zipball/94fd0001232e47129dd3504189fa1c7225010d08", 401 | "reference": "94fd0001232e47129dd3504189fa1c7225010d08", 402 | "shasum": "" 403 | }, 404 | "require": { 405 | "php": "^7.0", 406 | "phpdocumentor/reflection-common": "^1.0.0", 407 | "phpdocumentor/type-resolver": "^0.4.0", 408 | "webmozart/assert": "^1.0" 409 | }, 410 | "require-dev": { 411 | "doctrine/instantiator": "~1.0.5", 412 | "mockery/mockery": "^1.0", 413 | "phpunit/phpunit": "^6.4" 414 | }, 415 | "type": "library", 416 | "extra": { 417 | "branch-alias": { 418 | "dev-master": "4.x-dev" 419 | } 420 | }, 421 | "autoload": { 422 | "psr-4": { 423 | "phpDocumentor\\Reflection\\": [ 424 | "src/" 425 | ] 426 | } 427 | }, 428 | "notification-url": "https://packagist.org/downloads/", 429 | "license": [ 430 | "MIT" 431 | ], 432 | "authors": [ 433 | { 434 | "name": "Mike van Riel", 435 | "email": "me@mikevanriel.com" 436 | } 437 | ], 438 | "description": "With this component, a library can provide support for annotations via DocBlocks or otherwise retrieve information that is embedded in a DocBlock.", 439 | "time": "2017-11-30T07:14:17+00:00" 440 | }, 441 | { 442 | "name": "phpdocumentor/type-resolver", 443 | "version": "0.4.0", 444 | "source": { 445 | "type": "git", 446 | "url": "https://github.com/phpDocumentor/TypeResolver.git", 447 | "reference": "9c977708995954784726e25d0cd1dddf4e65b0f7" 448 | }, 449 | "dist": { 450 | "type": "zip", 451 | "url": "https://api.github.com/repos/phpDocumentor/TypeResolver/zipball/9c977708995954784726e25d0cd1dddf4e65b0f7", 452 | "reference": "9c977708995954784726e25d0cd1dddf4e65b0f7", 453 | "shasum": "" 454 | }, 455 | "require": { 456 | "php": "^5.5 || ^7.0", 457 | "phpdocumentor/reflection-common": "^1.0" 458 | }, 459 | "require-dev": { 460 | "mockery/mockery": "^0.9.4", 461 | "phpunit/phpunit": "^5.2||^4.8.24" 462 | }, 463 | "type": "library", 464 | "extra": { 465 | "branch-alias": { 466 | "dev-master": "1.0.x-dev" 467 | } 468 | }, 469 | "autoload": { 470 | "psr-4": { 471 | "phpDocumentor\\Reflection\\": [ 472 | "src/" 473 | ] 474 | } 475 | }, 476 | "notification-url": "https://packagist.org/downloads/", 477 | "license": [ 478 | "MIT" 479 | ], 480 | "authors": [ 481 | { 482 | "name": "Mike van Riel", 483 | "email": "me@mikevanriel.com" 484 | } 485 | ], 486 | "time": "2017-07-14T14:27:02+00:00" 487 | }, 488 | { 489 | "name": "phpspec/prophecy", 490 | "version": "1.8.0", 491 | "source": { 492 | "type": "git", 493 | "url": "https://github.com/phpspec/prophecy.git", 494 | "reference": "4ba436b55987b4bf311cb7c6ba82aa528aac0a06" 495 | }, 496 | "dist": { 497 | "type": "zip", 498 | "url": "https://api.github.com/repos/phpspec/prophecy/zipball/4ba436b55987b4bf311cb7c6ba82aa528aac0a06", 499 | "reference": "4ba436b55987b4bf311cb7c6ba82aa528aac0a06", 500 | "shasum": "" 501 | }, 502 | "require": { 503 | "doctrine/instantiator": "^1.0.2", 504 | "php": "^5.3|^7.0", 505 | "phpdocumentor/reflection-docblock": "^2.0|^3.0.2|^4.0", 506 | "sebastian/comparator": "^1.1|^2.0|^3.0", 507 | "sebastian/recursion-context": "^1.0|^2.0|^3.0" 508 | }, 509 | "require-dev": { 510 | "phpspec/phpspec": "^2.5|^3.2", 511 | "phpunit/phpunit": "^4.8.35 || ^5.7 || ^6.5 || ^7.1" 512 | }, 513 | "type": "library", 514 | "extra": { 515 | "branch-alias": { 516 | "dev-master": "1.8.x-dev" 517 | } 518 | }, 519 | "autoload": { 520 | "psr-0": { 521 | "Prophecy\\": "src/" 522 | } 523 | }, 524 | "notification-url": "https://packagist.org/downloads/", 525 | "license": [ 526 | "MIT" 527 | ], 528 | "authors": [ 529 | { 530 | "name": "Konstantin Kudryashov", 531 | "email": "ever.zet@gmail.com", 532 | "homepage": "http://everzet.com" 533 | }, 534 | { 535 | "name": "Marcello Duarte", 536 | "email": "marcello.duarte@gmail.com" 537 | } 538 | ], 539 | "description": "Highly opinionated mocking framework for PHP 5.3+", 540 | "homepage": "https://github.com/phpspec/prophecy", 541 | "keywords": [ 542 | "Double", 543 | "Dummy", 544 | "fake", 545 | "mock", 546 | "spy", 547 | "stub" 548 | ], 549 | "time": "2018-08-05T17:53:17+00:00" 550 | }, 551 | { 552 | "name": "phpunit/php-code-coverage", 553 | "version": "6.1.4", 554 | "source": { 555 | "type": "git", 556 | "url": "https://github.com/sebastianbergmann/php-code-coverage.git", 557 | "reference": "807e6013b00af69b6c5d9ceb4282d0393dbb9d8d" 558 | }, 559 | "dist": { 560 | "type": "zip", 561 | "url": "https://api.github.com/repos/sebastianbergmann/php-code-coverage/zipball/807e6013b00af69b6c5d9ceb4282d0393dbb9d8d", 562 | "reference": "807e6013b00af69b6c5d9ceb4282d0393dbb9d8d", 563 | "shasum": "" 564 | }, 565 | "require": { 566 | "ext-dom": "*", 567 | "ext-xmlwriter": "*", 568 | "php": "^7.1", 569 | "phpunit/php-file-iterator": "^2.0", 570 | "phpunit/php-text-template": "^1.2.1", 571 | "phpunit/php-token-stream": "^3.0", 572 | "sebastian/code-unit-reverse-lookup": "^1.0.1", 573 | "sebastian/environment": "^3.1 || ^4.0", 574 | "sebastian/version": "^2.0.1", 575 | "theseer/tokenizer": "^1.1" 576 | }, 577 | "require-dev": { 578 | "phpunit/phpunit": "^7.0" 579 | }, 580 | "suggest": { 581 | "ext-xdebug": "^2.6.0" 582 | }, 583 | "type": "library", 584 | "extra": { 585 | "branch-alias": { 586 | "dev-master": "6.1-dev" 587 | } 588 | }, 589 | "autoload": { 590 | "classmap": [ 591 | "src/" 592 | ] 593 | }, 594 | "notification-url": "https://packagist.org/downloads/", 595 | "license": [ 596 | "BSD-3-Clause" 597 | ], 598 | "authors": [ 599 | { 600 | "name": "Sebastian Bergmann", 601 | "email": "sebastian@phpunit.de", 602 | "role": "lead" 603 | } 604 | ], 605 | "description": "Library that provides collection, processing, and rendering functionality for PHP code coverage information.", 606 | "homepage": "https://github.com/sebastianbergmann/php-code-coverage", 607 | "keywords": [ 608 | "coverage", 609 | "testing", 610 | "xunit" 611 | ], 612 | "time": "2018-10-31T16:06:48+00:00" 613 | }, 614 | { 615 | "name": "phpunit/php-file-iterator", 616 | "version": "2.0.2", 617 | "source": { 618 | "type": "git", 619 | "url": "https://github.com/sebastianbergmann/php-file-iterator.git", 620 | "reference": "050bedf145a257b1ff02746c31894800e5122946" 621 | }, 622 | "dist": { 623 | "type": "zip", 624 | "url": "https://api.github.com/repos/sebastianbergmann/php-file-iterator/zipball/050bedf145a257b1ff02746c31894800e5122946", 625 | "reference": "050bedf145a257b1ff02746c31894800e5122946", 626 | "shasum": "" 627 | }, 628 | "require": { 629 | "php": "^7.1" 630 | }, 631 | "require-dev": { 632 | "phpunit/phpunit": "^7.1" 633 | }, 634 | "type": "library", 635 | "extra": { 636 | "branch-alias": { 637 | "dev-master": "2.0.x-dev" 638 | } 639 | }, 640 | "autoload": { 641 | "classmap": [ 642 | "src/" 643 | ] 644 | }, 645 | "notification-url": "https://packagist.org/downloads/", 646 | "license": [ 647 | "BSD-3-Clause" 648 | ], 649 | "authors": [ 650 | { 651 | "name": "Sebastian Bergmann", 652 | "email": "sebastian@phpunit.de", 653 | "role": "lead" 654 | } 655 | ], 656 | "description": "FilterIterator implementation that filters files based on a list of suffixes.", 657 | "homepage": "https://github.com/sebastianbergmann/php-file-iterator/", 658 | "keywords": [ 659 | "filesystem", 660 | "iterator" 661 | ], 662 | "time": "2018-09-13T20:33:42+00:00" 663 | }, 664 | { 665 | "name": "phpunit/php-text-template", 666 | "version": "1.2.1", 667 | "source": { 668 | "type": "git", 669 | "url": "https://github.com/sebastianbergmann/php-text-template.git", 670 | "reference": "31f8b717e51d9a2afca6c9f046f5d69fc27c8686" 671 | }, 672 | "dist": { 673 | "type": "zip", 674 | "url": "https://api.github.com/repos/sebastianbergmann/php-text-template/zipball/31f8b717e51d9a2afca6c9f046f5d69fc27c8686", 675 | "reference": "31f8b717e51d9a2afca6c9f046f5d69fc27c8686", 676 | "shasum": "" 677 | }, 678 | "require": { 679 | "php": ">=5.3.3" 680 | }, 681 | "type": "library", 682 | "autoload": { 683 | "classmap": [ 684 | "src/" 685 | ] 686 | }, 687 | "notification-url": "https://packagist.org/downloads/", 688 | "license": [ 689 | "BSD-3-Clause" 690 | ], 691 | "authors": [ 692 | { 693 | "name": "Sebastian Bergmann", 694 | "email": "sebastian@phpunit.de", 695 | "role": "lead" 696 | } 697 | ], 698 | "description": "Simple template engine.", 699 | "homepage": "https://github.com/sebastianbergmann/php-text-template/", 700 | "keywords": [ 701 | "template" 702 | ], 703 | "time": "2015-06-21T13:50:34+00:00" 704 | }, 705 | { 706 | "name": "phpunit/php-timer", 707 | "version": "2.0.0", 708 | "source": { 709 | "type": "git", 710 | "url": "https://github.com/sebastianbergmann/php-timer.git", 711 | "reference": "8b8454ea6958c3dee38453d3bd571e023108c91f" 712 | }, 713 | "dist": { 714 | "type": "zip", 715 | "url": "https://api.github.com/repos/sebastianbergmann/php-timer/zipball/8b8454ea6958c3dee38453d3bd571e023108c91f", 716 | "reference": "8b8454ea6958c3dee38453d3bd571e023108c91f", 717 | "shasum": "" 718 | }, 719 | "require": { 720 | "php": "^7.1" 721 | }, 722 | "require-dev": { 723 | "phpunit/phpunit": "^7.0" 724 | }, 725 | "type": "library", 726 | "extra": { 727 | "branch-alias": { 728 | "dev-master": "2.0-dev" 729 | } 730 | }, 731 | "autoload": { 732 | "classmap": [ 733 | "src/" 734 | ] 735 | }, 736 | "notification-url": "https://packagist.org/downloads/", 737 | "license": [ 738 | "BSD-3-Clause" 739 | ], 740 | "authors": [ 741 | { 742 | "name": "Sebastian Bergmann", 743 | "email": "sebastian@phpunit.de", 744 | "role": "lead" 745 | } 746 | ], 747 | "description": "Utility class for timing", 748 | "homepage": "https://github.com/sebastianbergmann/php-timer/", 749 | "keywords": [ 750 | "timer" 751 | ], 752 | "time": "2018-02-01T13:07:23+00:00" 753 | }, 754 | { 755 | "name": "phpunit/php-token-stream", 756 | "version": "3.0.1", 757 | "source": { 758 | "type": "git", 759 | "url": "https://github.com/sebastianbergmann/php-token-stream.git", 760 | "reference": "c99e3be9d3e85f60646f152f9002d46ed7770d18" 761 | }, 762 | "dist": { 763 | "type": "zip", 764 | "url": "https://api.github.com/repos/sebastianbergmann/php-token-stream/zipball/c99e3be9d3e85f60646f152f9002d46ed7770d18", 765 | "reference": "c99e3be9d3e85f60646f152f9002d46ed7770d18", 766 | "shasum": "" 767 | }, 768 | "require": { 769 | "ext-tokenizer": "*", 770 | "php": "^7.1" 771 | }, 772 | "require-dev": { 773 | "phpunit/phpunit": "^7.0" 774 | }, 775 | "type": "library", 776 | "extra": { 777 | "branch-alias": { 778 | "dev-master": "3.0-dev" 779 | } 780 | }, 781 | "autoload": { 782 | "classmap": [ 783 | "src/" 784 | ] 785 | }, 786 | "notification-url": "https://packagist.org/downloads/", 787 | "license": [ 788 | "BSD-3-Clause" 789 | ], 790 | "authors": [ 791 | { 792 | "name": "Sebastian Bergmann", 793 | "email": "sebastian@phpunit.de" 794 | } 795 | ], 796 | "description": "Wrapper around PHP's tokenizer extension.", 797 | "homepage": "https://github.com/sebastianbergmann/php-token-stream/", 798 | "keywords": [ 799 | "tokenizer" 800 | ], 801 | "time": "2018-10-30T05:52:18+00:00" 802 | }, 803 | { 804 | "name": "phpunit/phpunit", 805 | "version": "7.5.1", 806 | "source": { 807 | "type": "git", 808 | "url": "https://github.com/sebastianbergmann/phpunit.git", 809 | "reference": "c23d78776ad415d5506e0679723cb461d71f488f" 810 | }, 811 | "dist": { 812 | "type": "zip", 813 | "url": "https://api.github.com/repos/sebastianbergmann/phpunit/zipball/c23d78776ad415d5506e0679723cb461d71f488f", 814 | "reference": "c23d78776ad415d5506e0679723cb461d71f488f", 815 | "shasum": "" 816 | }, 817 | "require": { 818 | "doctrine/instantiator": "^1.1", 819 | "ext-dom": "*", 820 | "ext-json": "*", 821 | "ext-libxml": "*", 822 | "ext-mbstring": "*", 823 | "ext-xml": "*", 824 | "myclabs/deep-copy": "^1.7", 825 | "phar-io/manifest": "^1.0.2", 826 | "phar-io/version": "^2.0", 827 | "php": "^7.1", 828 | "phpspec/prophecy": "^1.7", 829 | "phpunit/php-code-coverage": "^6.0.7", 830 | "phpunit/php-file-iterator": "^2.0.1", 831 | "phpunit/php-text-template": "^1.2.1", 832 | "phpunit/php-timer": "^2.0", 833 | "sebastian/comparator": "^3.0", 834 | "sebastian/diff": "^3.0", 835 | "sebastian/environment": "^4.0", 836 | "sebastian/exporter": "^3.1", 837 | "sebastian/global-state": "^2.0", 838 | "sebastian/object-enumerator": "^3.0.3", 839 | "sebastian/resource-operations": "^2.0", 840 | "sebastian/version": "^2.0.1" 841 | }, 842 | "conflict": { 843 | "phpunit/phpunit-mock-objects": "*" 844 | }, 845 | "require-dev": { 846 | "ext-pdo": "*" 847 | }, 848 | "suggest": { 849 | "ext-soap": "*", 850 | "ext-xdebug": "*", 851 | "phpunit/php-invoker": "^2.0" 852 | }, 853 | "bin": [ 854 | "phpunit" 855 | ], 856 | "type": "library", 857 | "extra": { 858 | "branch-alias": { 859 | "dev-master": "7.5-dev" 860 | } 861 | }, 862 | "autoload": { 863 | "classmap": [ 864 | "src/" 865 | ] 866 | }, 867 | "notification-url": "https://packagist.org/downloads/", 868 | "license": [ 869 | "BSD-3-Clause" 870 | ], 871 | "authors": [ 872 | { 873 | "name": "Sebastian Bergmann", 874 | "email": "sebastian@phpunit.de", 875 | "role": "lead" 876 | } 877 | ], 878 | "description": "The PHP Unit Testing framework.", 879 | "homepage": "https://phpunit.de/", 880 | "keywords": [ 881 | "phpunit", 882 | "testing", 883 | "xunit" 884 | ], 885 | "time": "2018-12-12T07:20:32+00:00" 886 | }, 887 | { 888 | "name": "sebastian/code-unit-reverse-lookup", 889 | "version": "1.0.1", 890 | "source": { 891 | "type": "git", 892 | "url": "https://github.com/sebastianbergmann/code-unit-reverse-lookup.git", 893 | "reference": "4419fcdb5eabb9caa61a27c7a1db532a6b55dd18" 894 | }, 895 | "dist": { 896 | "type": "zip", 897 | "url": "https://api.github.com/repos/sebastianbergmann/code-unit-reverse-lookup/zipball/4419fcdb5eabb9caa61a27c7a1db532a6b55dd18", 898 | "reference": "4419fcdb5eabb9caa61a27c7a1db532a6b55dd18", 899 | "shasum": "" 900 | }, 901 | "require": { 902 | "php": "^5.6 || ^7.0" 903 | }, 904 | "require-dev": { 905 | "phpunit/phpunit": "^5.7 || ^6.0" 906 | }, 907 | "type": "library", 908 | "extra": { 909 | "branch-alias": { 910 | "dev-master": "1.0.x-dev" 911 | } 912 | }, 913 | "autoload": { 914 | "classmap": [ 915 | "src/" 916 | ] 917 | }, 918 | "notification-url": "https://packagist.org/downloads/", 919 | "license": [ 920 | "BSD-3-Clause" 921 | ], 922 | "authors": [ 923 | { 924 | "name": "Sebastian Bergmann", 925 | "email": "sebastian@phpunit.de" 926 | } 927 | ], 928 | "description": "Looks up which function or method a line of code belongs to", 929 | "homepage": "https://github.com/sebastianbergmann/code-unit-reverse-lookup/", 930 | "time": "2017-03-04T06:30:41+00:00" 931 | }, 932 | { 933 | "name": "sebastian/comparator", 934 | "version": "3.0.2", 935 | "source": { 936 | "type": "git", 937 | "url": "https://github.com/sebastianbergmann/comparator.git", 938 | "reference": "5de4fc177adf9bce8df98d8d141a7559d7ccf6da" 939 | }, 940 | "dist": { 941 | "type": "zip", 942 | "url": "https://api.github.com/repos/sebastianbergmann/comparator/zipball/5de4fc177adf9bce8df98d8d141a7559d7ccf6da", 943 | "reference": "5de4fc177adf9bce8df98d8d141a7559d7ccf6da", 944 | "shasum": "" 945 | }, 946 | "require": { 947 | "php": "^7.1", 948 | "sebastian/diff": "^3.0", 949 | "sebastian/exporter": "^3.1" 950 | }, 951 | "require-dev": { 952 | "phpunit/phpunit": "^7.1" 953 | }, 954 | "type": "library", 955 | "extra": { 956 | "branch-alias": { 957 | "dev-master": "3.0-dev" 958 | } 959 | }, 960 | "autoload": { 961 | "classmap": [ 962 | "src/" 963 | ] 964 | }, 965 | "notification-url": "https://packagist.org/downloads/", 966 | "license": [ 967 | "BSD-3-Clause" 968 | ], 969 | "authors": [ 970 | { 971 | "name": "Jeff Welch", 972 | "email": "whatthejeff@gmail.com" 973 | }, 974 | { 975 | "name": "Volker Dusch", 976 | "email": "github@wallbash.com" 977 | }, 978 | { 979 | "name": "Bernhard Schussek", 980 | "email": "bschussek@2bepublished.at" 981 | }, 982 | { 983 | "name": "Sebastian Bergmann", 984 | "email": "sebastian@phpunit.de" 985 | } 986 | ], 987 | "description": "Provides the functionality to compare PHP values for equality", 988 | "homepage": "https://github.com/sebastianbergmann/comparator", 989 | "keywords": [ 990 | "comparator", 991 | "compare", 992 | "equality" 993 | ], 994 | "time": "2018-07-12T15:12:46+00:00" 995 | }, 996 | { 997 | "name": "sebastian/diff", 998 | "version": "3.0.1", 999 | "source": { 1000 | "type": "git", 1001 | "url": "https://github.com/sebastianbergmann/diff.git", 1002 | "reference": "366541b989927187c4ca70490a35615d3fef2dce" 1003 | }, 1004 | "dist": { 1005 | "type": "zip", 1006 | "url": "https://api.github.com/repos/sebastianbergmann/diff/zipball/366541b989927187c4ca70490a35615d3fef2dce", 1007 | "reference": "366541b989927187c4ca70490a35615d3fef2dce", 1008 | "shasum": "" 1009 | }, 1010 | "require": { 1011 | "php": "^7.1" 1012 | }, 1013 | "require-dev": { 1014 | "phpunit/phpunit": "^7.0", 1015 | "symfony/process": "^2 || ^3.3 || ^4" 1016 | }, 1017 | "type": "library", 1018 | "extra": { 1019 | "branch-alias": { 1020 | "dev-master": "3.0-dev" 1021 | } 1022 | }, 1023 | "autoload": { 1024 | "classmap": [ 1025 | "src/" 1026 | ] 1027 | }, 1028 | "notification-url": "https://packagist.org/downloads/", 1029 | "license": [ 1030 | "BSD-3-Clause" 1031 | ], 1032 | "authors": [ 1033 | { 1034 | "name": "Kore Nordmann", 1035 | "email": "mail@kore-nordmann.de" 1036 | }, 1037 | { 1038 | "name": "Sebastian Bergmann", 1039 | "email": "sebastian@phpunit.de" 1040 | } 1041 | ], 1042 | "description": "Diff implementation", 1043 | "homepage": "https://github.com/sebastianbergmann/diff", 1044 | "keywords": [ 1045 | "diff", 1046 | "udiff", 1047 | "unidiff", 1048 | "unified diff" 1049 | ], 1050 | "time": "2018-06-10T07:54:39+00:00" 1051 | }, 1052 | { 1053 | "name": "sebastian/environment", 1054 | "version": "4.0.1", 1055 | "source": { 1056 | "type": "git", 1057 | "url": "https://github.com/sebastianbergmann/environment.git", 1058 | "reference": "febd209a219cea7b56ad799b30ebbea34b71eb8f" 1059 | }, 1060 | "dist": { 1061 | "type": "zip", 1062 | "url": "https://api.github.com/repos/sebastianbergmann/environment/zipball/febd209a219cea7b56ad799b30ebbea34b71eb8f", 1063 | "reference": "febd209a219cea7b56ad799b30ebbea34b71eb8f", 1064 | "shasum": "" 1065 | }, 1066 | "require": { 1067 | "php": "^7.1" 1068 | }, 1069 | "require-dev": { 1070 | "phpunit/phpunit": "^7.4" 1071 | }, 1072 | "type": "library", 1073 | "extra": { 1074 | "branch-alias": { 1075 | "dev-master": "4.0-dev" 1076 | } 1077 | }, 1078 | "autoload": { 1079 | "classmap": [ 1080 | "src/" 1081 | ] 1082 | }, 1083 | "notification-url": "https://packagist.org/downloads/", 1084 | "license": [ 1085 | "BSD-3-Clause" 1086 | ], 1087 | "authors": [ 1088 | { 1089 | "name": "Sebastian Bergmann", 1090 | "email": "sebastian@phpunit.de" 1091 | } 1092 | ], 1093 | "description": "Provides functionality to handle HHVM/PHP environments", 1094 | "homepage": "http://www.github.com/sebastianbergmann/environment", 1095 | "keywords": [ 1096 | "Xdebug", 1097 | "environment", 1098 | "hhvm" 1099 | ], 1100 | "time": "2018-11-25T09:31:21+00:00" 1101 | }, 1102 | { 1103 | "name": "sebastian/exporter", 1104 | "version": "3.1.0", 1105 | "source": { 1106 | "type": "git", 1107 | "url": "https://github.com/sebastianbergmann/exporter.git", 1108 | "reference": "234199f4528de6d12aaa58b612e98f7d36adb937" 1109 | }, 1110 | "dist": { 1111 | "type": "zip", 1112 | "url": "https://api.github.com/repos/sebastianbergmann/exporter/zipball/234199f4528de6d12aaa58b612e98f7d36adb937", 1113 | "reference": "234199f4528de6d12aaa58b612e98f7d36adb937", 1114 | "shasum": "" 1115 | }, 1116 | "require": { 1117 | "php": "^7.0", 1118 | "sebastian/recursion-context": "^3.0" 1119 | }, 1120 | "require-dev": { 1121 | "ext-mbstring": "*", 1122 | "phpunit/phpunit": "^6.0" 1123 | }, 1124 | "type": "library", 1125 | "extra": { 1126 | "branch-alias": { 1127 | "dev-master": "3.1.x-dev" 1128 | } 1129 | }, 1130 | "autoload": { 1131 | "classmap": [ 1132 | "src/" 1133 | ] 1134 | }, 1135 | "notification-url": "https://packagist.org/downloads/", 1136 | "license": [ 1137 | "BSD-3-Clause" 1138 | ], 1139 | "authors": [ 1140 | { 1141 | "name": "Jeff Welch", 1142 | "email": "whatthejeff@gmail.com" 1143 | }, 1144 | { 1145 | "name": "Volker Dusch", 1146 | "email": "github@wallbash.com" 1147 | }, 1148 | { 1149 | "name": "Bernhard Schussek", 1150 | "email": "bschussek@2bepublished.at" 1151 | }, 1152 | { 1153 | "name": "Sebastian Bergmann", 1154 | "email": "sebastian@phpunit.de" 1155 | }, 1156 | { 1157 | "name": "Adam Harvey", 1158 | "email": "aharvey@php.net" 1159 | } 1160 | ], 1161 | "description": "Provides the functionality to export PHP variables for visualization", 1162 | "homepage": "http://www.github.com/sebastianbergmann/exporter", 1163 | "keywords": [ 1164 | "export", 1165 | "exporter" 1166 | ], 1167 | "time": "2017-04-03T13:19:02+00:00" 1168 | }, 1169 | { 1170 | "name": "sebastian/global-state", 1171 | "version": "2.0.0", 1172 | "source": { 1173 | "type": "git", 1174 | "url": "https://github.com/sebastianbergmann/global-state.git", 1175 | "reference": "e8ba02eed7bbbb9e59e43dedd3dddeff4a56b0c4" 1176 | }, 1177 | "dist": { 1178 | "type": "zip", 1179 | "url": "https://api.github.com/repos/sebastianbergmann/global-state/zipball/e8ba02eed7bbbb9e59e43dedd3dddeff4a56b0c4", 1180 | "reference": "e8ba02eed7bbbb9e59e43dedd3dddeff4a56b0c4", 1181 | "shasum": "" 1182 | }, 1183 | "require": { 1184 | "php": "^7.0" 1185 | }, 1186 | "require-dev": { 1187 | "phpunit/phpunit": "^6.0" 1188 | }, 1189 | "suggest": { 1190 | "ext-uopz": "*" 1191 | }, 1192 | "type": "library", 1193 | "extra": { 1194 | "branch-alias": { 1195 | "dev-master": "2.0-dev" 1196 | } 1197 | }, 1198 | "autoload": { 1199 | "classmap": [ 1200 | "src/" 1201 | ] 1202 | }, 1203 | "notification-url": "https://packagist.org/downloads/", 1204 | "license": [ 1205 | "BSD-3-Clause" 1206 | ], 1207 | "authors": [ 1208 | { 1209 | "name": "Sebastian Bergmann", 1210 | "email": "sebastian@phpunit.de" 1211 | } 1212 | ], 1213 | "description": "Snapshotting of global state", 1214 | "homepage": "http://www.github.com/sebastianbergmann/global-state", 1215 | "keywords": [ 1216 | "global state" 1217 | ], 1218 | "time": "2017-04-27T15:39:26+00:00" 1219 | }, 1220 | { 1221 | "name": "sebastian/object-enumerator", 1222 | "version": "3.0.3", 1223 | "source": { 1224 | "type": "git", 1225 | "url": "https://github.com/sebastianbergmann/object-enumerator.git", 1226 | "reference": "7cfd9e65d11ffb5af41198476395774d4c8a84c5" 1227 | }, 1228 | "dist": { 1229 | "type": "zip", 1230 | "url": "https://api.github.com/repos/sebastianbergmann/object-enumerator/zipball/7cfd9e65d11ffb5af41198476395774d4c8a84c5", 1231 | "reference": "7cfd9e65d11ffb5af41198476395774d4c8a84c5", 1232 | "shasum": "" 1233 | }, 1234 | "require": { 1235 | "php": "^7.0", 1236 | "sebastian/object-reflector": "^1.1.1", 1237 | "sebastian/recursion-context": "^3.0" 1238 | }, 1239 | "require-dev": { 1240 | "phpunit/phpunit": "^6.0" 1241 | }, 1242 | "type": "library", 1243 | "extra": { 1244 | "branch-alias": { 1245 | "dev-master": "3.0.x-dev" 1246 | } 1247 | }, 1248 | "autoload": { 1249 | "classmap": [ 1250 | "src/" 1251 | ] 1252 | }, 1253 | "notification-url": "https://packagist.org/downloads/", 1254 | "license": [ 1255 | "BSD-3-Clause" 1256 | ], 1257 | "authors": [ 1258 | { 1259 | "name": "Sebastian Bergmann", 1260 | "email": "sebastian@phpunit.de" 1261 | } 1262 | ], 1263 | "description": "Traverses array structures and object graphs to enumerate all referenced objects", 1264 | "homepage": "https://github.com/sebastianbergmann/object-enumerator/", 1265 | "time": "2017-08-03T12:35:26+00:00" 1266 | }, 1267 | { 1268 | "name": "sebastian/object-reflector", 1269 | "version": "1.1.1", 1270 | "source": { 1271 | "type": "git", 1272 | "url": "https://github.com/sebastianbergmann/object-reflector.git", 1273 | "reference": "773f97c67f28de00d397be301821b06708fca0be" 1274 | }, 1275 | "dist": { 1276 | "type": "zip", 1277 | "url": "https://api.github.com/repos/sebastianbergmann/object-reflector/zipball/773f97c67f28de00d397be301821b06708fca0be", 1278 | "reference": "773f97c67f28de00d397be301821b06708fca0be", 1279 | "shasum": "" 1280 | }, 1281 | "require": { 1282 | "php": "^7.0" 1283 | }, 1284 | "require-dev": { 1285 | "phpunit/phpunit": "^6.0" 1286 | }, 1287 | "type": "library", 1288 | "extra": { 1289 | "branch-alias": { 1290 | "dev-master": "1.1-dev" 1291 | } 1292 | }, 1293 | "autoload": { 1294 | "classmap": [ 1295 | "src/" 1296 | ] 1297 | }, 1298 | "notification-url": "https://packagist.org/downloads/", 1299 | "license": [ 1300 | "BSD-3-Clause" 1301 | ], 1302 | "authors": [ 1303 | { 1304 | "name": "Sebastian Bergmann", 1305 | "email": "sebastian@phpunit.de" 1306 | } 1307 | ], 1308 | "description": "Allows reflection of object attributes, including inherited and non-public ones", 1309 | "homepage": "https://github.com/sebastianbergmann/object-reflector/", 1310 | "time": "2017-03-29T09:07:27+00:00" 1311 | }, 1312 | { 1313 | "name": "sebastian/recursion-context", 1314 | "version": "3.0.0", 1315 | "source": { 1316 | "type": "git", 1317 | "url": "https://github.com/sebastianbergmann/recursion-context.git", 1318 | "reference": "5b0cd723502bac3b006cbf3dbf7a1e3fcefe4fa8" 1319 | }, 1320 | "dist": { 1321 | "type": "zip", 1322 | "url": "https://api.github.com/repos/sebastianbergmann/recursion-context/zipball/5b0cd723502bac3b006cbf3dbf7a1e3fcefe4fa8", 1323 | "reference": "5b0cd723502bac3b006cbf3dbf7a1e3fcefe4fa8", 1324 | "shasum": "" 1325 | }, 1326 | "require": { 1327 | "php": "^7.0" 1328 | }, 1329 | "require-dev": { 1330 | "phpunit/phpunit": "^6.0" 1331 | }, 1332 | "type": "library", 1333 | "extra": { 1334 | "branch-alias": { 1335 | "dev-master": "3.0.x-dev" 1336 | } 1337 | }, 1338 | "autoload": { 1339 | "classmap": [ 1340 | "src/" 1341 | ] 1342 | }, 1343 | "notification-url": "https://packagist.org/downloads/", 1344 | "license": [ 1345 | "BSD-3-Clause" 1346 | ], 1347 | "authors": [ 1348 | { 1349 | "name": "Jeff Welch", 1350 | "email": "whatthejeff@gmail.com" 1351 | }, 1352 | { 1353 | "name": "Sebastian Bergmann", 1354 | "email": "sebastian@phpunit.de" 1355 | }, 1356 | { 1357 | "name": "Adam Harvey", 1358 | "email": "aharvey@php.net" 1359 | } 1360 | ], 1361 | "description": "Provides functionality to recursively process PHP variables", 1362 | "homepage": "http://www.github.com/sebastianbergmann/recursion-context", 1363 | "time": "2017-03-03T06:23:57+00:00" 1364 | }, 1365 | { 1366 | "name": "sebastian/resource-operations", 1367 | "version": "2.0.1", 1368 | "source": { 1369 | "type": "git", 1370 | "url": "https://github.com/sebastianbergmann/resource-operations.git", 1371 | "reference": "4d7a795d35b889bf80a0cc04e08d77cedfa917a9" 1372 | }, 1373 | "dist": { 1374 | "type": "zip", 1375 | "url": "https://api.github.com/repos/sebastianbergmann/resource-operations/zipball/4d7a795d35b889bf80a0cc04e08d77cedfa917a9", 1376 | "reference": "4d7a795d35b889bf80a0cc04e08d77cedfa917a9", 1377 | "shasum": "" 1378 | }, 1379 | "require": { 1380 | "php": "^7.1" 1381 | }, 1382 | "type": "library", 1383 | "extra": { 1384 | "branch-alias": { 1385 | "dev-master": "2.0-dev" 1386 | } 1387 | }, 1388 | "autoload": { 1389 | "classmap": [ 1390 | "src/" 1391 | ] 1392 | }, 1393 | "notification-url": "https://packagist.org/downloads/", 1394 | "license": [ 1395 | "BSD-3-Clause" 1396 | ], 1397 | "authors": [ 1398 | { 1399 | "name": "Sebastian Bergmann", 1400 | "email": "sebastian@phpunit.de" 1401 | } 1402 | ], 1403 | "description": "Provides a list of PHP built-in functions that operate on resources", 1404 | "homepage": "https://www.github.com/sebastianbergmann/resource-operations", 1405 | "time": "2018-10-04T04:07:39+00:00" 1406 | }, 1407 | { 1408 | "name": "sebastian/version", 1409 | "version": "2.0.1", 1410 | "source": { 1411 | "type": "git", 1412 | "url": "https://github.com/sebastianbergmann/version.git", 1413 | "reference": "99732be0ddb3361e16ad77b68ba41efc8e979019" 1414 | }, 1415 | "dist": { 1416 | "type": "zip", 1417 | "url": "https://api.github.com/repos/sebastianbergmann/version/zipball/99732be0ddb3361e16ad77b68ba41efc8e979019", 1418 | "reference": "99732be0ddb3361e16ad77b68ba41efc8e979019", 1419 | "shasum": "" 1420 | }, 1421 | "require": { 1422 | "php": ">=5.6" 1423 | }, 1424 | "type": "library", 1425 | "extra": { 1426 | "branch-alias": { 1427 | "dev-master": "2.0.x-dev" 1428 | } 1429 | }, 1430 | "autoload": { 1431 | "classmap": [ 1432 | "src/" 1433 | ] 1434 | }, 1435 | "notification-url": "https://packagist.org/downloads/", 1436 | "license": [ 1437 | "BSD-3-Clause" 1438 | ], 1439 | "authors": [ 1440 | { 1441 | "name": "Sebastian Bergmann", 1442 | "email": "sebastian@phpunit.de", 1443 | "role": "lead" 1444 | } 1445 | ], 1446 | "description": "Library that helps with managing the version number of Git-hosted PHP projects", 1447 | "homepage": "https://github.com/sebastianbergmann/version", 1448 | "time": "2016-10-03T07:35:21+00:00" 1449 | }, 1450 | { 1451 | "name": "symfony/polyfill-ctype", 1452 | "version": "v1.10.0", 1453 | "source": { 1454 | "type": "git", 1455 | "url": "https://github.com/symfony/polyfill-ctype.git", 1456 | "reference": "e3d826245268269cd66f8326bd8bc066687b4a19" 1457 | }, 1458 | "dist": { 1459 | "type": "zip", 1460 | "url": "https://api.github.com/repos/symfony/polyfill-ctype/zipball/e3d826245268269cd66f8326bd8bc066687b4a19", 1461 | "reference": "e3d826245268269cd66f8326bd8bc066687b4a19", 1462 | "shasum": "" 1463 | }, 1464 | "require": { 1465 | "php": ">=5.3.3" 1466 | }, 1467 | "suggest": { 1468 | "ext-ctype": "For best performance" 1469 | }, 1470 | "type": "library", 1471 | "extra": { 1472 | "branch-alias": { 1473 | "dev-master": "1.9-dev" 1474 | } 1475 | }, 1476 | "autoload": { 1477 | "psr-4": { 1478 | "Symfony\\Polyfill\\Ctype\\": "" 1479 | }, 1480 | "files": [ 1481 | "bootstrap.php" 1482 | ] 1483 | }, 1484 | "notification-url": "https://packagist.org/downloads/", 1485 | "license": [ 1486 | "MIT" 1487 | ], 1488 | "authors": [ 1489 | { 1490 | "name": "Symfony Community", 1491 | "homepage": "https://symfony.com/contributors" 1492 | }, 1493 | { 1494 | "name": "Gert de Pagter", 1495 | "email": "BackEndTea@gmail.com" 1496 | } 1497 | ], 1498 | "description": "Symfony polyfill for ctype functions", 1499 | "homepage": "https://symfony.com", 1500 | "keywords": [ 1501 | "compatibility", 1502 | "ctype", 1503 | "polyfill", 1504 | "portable" 1505 | ], 1506 | "time": "2018-08-06T14:22:27+00:00" 1507 | }, 1508 | { 1509 | "name": "theseer/tokenizer", 1510 | "version": "1.1.0", 1511 | "source": { 1512 | "type": "git", 1513 | "url": "https://github.com/theseer/tokenizer.git", 1514 | "reference": "cb2f008f3f05af2893a87208fe6a6c4985483f8b" 1515 | }, 1516 | "dist": { 1517 | "type": "zip", 1518 | "url": "https://api.github.com/repos/theseer/tokenizer/zipball/cb2f008f3f05af2893a87208fe6a6c4985483f8b", 1519 | "reference": "cb2f008f3f05af2893a87208fe6a6c4985483f8b", 1520 | "shasum": "" 1521 | }, 1522 | "require": { 1523 | "ext-dom": "*", 1524 | "ext-tokenizer": "*", 1525 | "ext-xmlwriter": "*", 1526 | "php": "^7.0" 1527 | }, 1528 | "type": "library", 1529 | "autoload": { 1530 | "classmap": [ 1531 | "src/" 1532 | ] 1533 | }, 1534 | "notification-url": "https://packagist.org/downloads/", 1535 | "license": [ 1536 | "BSD-3-Clause" 1537 | ], 1538 | "authors": [ 1539 | { 1540 | "name": "Arne Blankerts", 1541 | "email": "arne@blankerts.de", 1542 | "role": "Developer" 1543 | } 1544 | ], 1545 | "description": "A small library for converting tokenized PHP source code into XML and potentially other formats", 1546 | "time": "2017-04-07T12:08:54+00:00" 1547 | }, 1548 | { 1549 | "name": "webmozart/assert", 1550 | "version": "1.4.0", 1551 | "source": { 1552 | "type": "git", 1553 | "url": "https://github.com/webmozart/assert.git", 1554 | "reference": "83e253c8e0be5b0257b881e1827274667c5c17a9" 1555 | }, 1556 | "dist": { 1557 | "type": "zip", 1558 | "url": "https://api.github.com/repos/webmozart/assert/zipball/83e253c8e0be5b0257b881e1827274667c5c17a9", 1559 | "reference": "83e253c8e0be5b0257b881e1827274667c5c17a9", 1560 | "shasum": "" 1561 | }, 1562 | "require": { 1563 | "php": "^5.3.3 || ^7.0", 1564 | "symfony/polyfill-ctype": "^1.8" 1565 | }, 1566 | "require-dev": { 1567 | "phpunit/phpunit": "^4.6", 1568 | "sebastian/version": "^1.0.1" 1569 | }, 1570 | "type": "library", 1571 | "extra": { 1572 | "branch-alias": { 1573 | "dev-master": "1.3-dev" 1574 | } 1575 | }, 1576 | "autoload": { 1577 | "psr-4": { 1578 | "Webmozart\\Assert\\": "src/" 1579 | } 1580 | }, 1581 | "notification-url": "https://packagist.org/downloads/", 1582 | "license": [ 1583 | "MIT" 1584 | ], 1585 | "authors": [ 1586 | { 1587 | "name": "Bernhard Schussek", 1588 | "email": "bschussek@gmail.com" 1589 | } 1590 | ], 1591 | "description": "Assertions to validate method input/output with nice error messages.", 1592 | "keywords": [ 1593 | "assert", 1594 | "check", 1595 | "validate" 1596 | ], 1597 | "time": "2018-12-25T11:19:39+00:00" 1598 | } 1599 | ], 1600 | "aliases": [], 1601 | "minimum-stability": "dev", 1602 | "stability-flags": [], 1603 | "prefer-stable": true, 1604 | "prefer-lowest": false, 1605 | "platform": [], 1606 | "platform-dev": [] 1607 | } 1608 | -------------------------------------------------------------------------------- /video/server.php: -------------------------------------------------------------------------------- 1 | channel(); 11 | 12 | $channel->queue_declare('video_queue', //$queue - Either sets the queue or creates it if not exist 13 | false, //$passive - Do not modify the servers state 14 | true, //$durable - Data will persist if crash or restart occurs 15 | false, //$exclusive - Only one connection will usee, and deleted when closed 16 | false //$auto_delete - Queue is deleted when consumer is no longer subscribes 17 | ); 18 | 19 | /** 20 | * Define the callback function 21 | */ 22 | $callback = function($msg) { 23 | //Convert the data to array 24 | $data = json_decode($msg->body, true); 25 | 26 | //Detect if wget and ffmpeg are installed 27 | exec("man wget", $wget_exist); 28 | exec("man ffmpeg", $ffmpeg_exist); 29 | 30 | if ($wget_exist) { 31 | //Use wget to download the video. 32 | exec("wget -O video.mp4 {$data['video_url']}"); 33 | } else { 34 | //Use ProdigyView's FileManager as backup 35 | FileManager::copyFileFromUrl($data['video_url'], getcwd() . '/', 'video.mp4'); 36 | } 37 | 38 | if ($ffmpeg_exist) { 39 | //Run a conversion using ffmpeg 40 | Video::convertVideoFile('video.mp4', 'video.' . $data['convert_to']); 41 | } else { 42 | echo "Sorry No Conversion Software Exist On Server\n"; 43 | } 44 | 45 | echo "Finished Processing\n"; 46 | }; 47 | 48 | //Pass the callback 49 | $channel->basic_consume('video_queue', '', false, false, false, false, $callback); 50 | 51 | //Listen to requests 52 | while (count($channel->callbacks)) { 53 | $channel->wait(); 54 | } 55 | --------------------------------------------------------------------------------