├── .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 |
--------------------------------------------------------------------------------