You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
107 lines
2.4 KiB
107 lines
2.4 KiB
5 years ago
|
<?php
|
||
|
/**
|
||
|
* Nextcloud - Gallery
|
||
|
*
|
||
|
* This file is licensed under the Affero General Public License version 3 or
|
||
|
* later. See the COPYING file.
|
||
|
*
|
||
|
* @author Bart Visscher <bartv@thisnet.nl>
|
||
|
* @author Felix Moeller <mail@felixmoeller.de>
|
||
|
* @author Morris Jobke <hey@morrisjobke.de>
|
||
|
* @author Robin Appelman <robin@icewind.nl>
|
||
|
* @author Thomas Müller <thomas.mueller@tmit.eu>
|
||
|
* @author Vincent Petry <pvince81@owncloud.com>
|
||
|
* @author Olivier Paroz <galleryapps@oparoz.com>
|
||
|
*
|
||
|
* @copyright Copyright (c) 2015, ownCloud, Inc.
|
||
|
* @copyright Olivier Paroz 2017
|
||
|
*/
|
||
|
|
||
|
namespace OCA\Gallery\Utility;
|
||
|
|
||
|
/**
|
||
|
* Class EventSource
|
||
|
*
|
||
|
* Wrapper for server side events (http://en.wikipedia.org/wiki/Server-sent_events)
|
||
|
*
|
||
|
* This version is tailored for the Gallery app, do not use elsewhere!
|
||
|
* @link https://github.com/owncloud/core/blob/master/lib/private/eventsource.php
|
||
|
*
|
||
|
* @todo Replace with a library
|
||
|
*
|
||
|
* @package OCA\Gallery\Controller
|
||
|
*/
|
||
|
class EventSource implements \OCP\IEventSource {
|
||
|
|
||
|
/**
|
||
|
* @var bool
|
||
|
*/
|
||
|
private $started = false;
|
||
|
|
||
|
protected function init() {
|
||
|
if ($this->started) {
|
||
|
return;
|
||
|
}
|
||
|
$this->started = true;
|
||
|
|
||
|
// prevent php output buffering, caching and nginx buffering
|
||
|
while (ob_get_level()) {
|
||
|
ob_end_clean();
|
||
|
}
|
||
|
header('Cache-Control: no-cache');
|
||
|
header('X-Accel-Buffering: no');
|
||
|
header("Content-Type: text/event-stream");
|
||
|
flush();
|
||
|
}
|
||
|
|
||
|
/**
|
||
|
* Sends a message to the client
|
||
|
*
|
||
|
* If only one parameter is given, a typeless message will be sent with that parameter as data
|
||
|
*
|
||
|
* @param string $type
|
||
|
* @param mixed $data
|
||
|
*
|
||
|
* @throws \BadMethodCallException
|
||
|
*/
|
||
|
public function send($type, $data = null) {
|
||
|
$this->validateMessage($type, $data);
|
||
|
$this->init();
|
||
|
if (is_null($data)) {
|
||
|
$data = $type;
|
||
|
$type = null;
|
||
|
}
|
||
|
|
||
|
if (!empty($type)) {
|
||
|
echo 'event: ' . $type . PHP_EOL;
|
||
|
}
|
||
|
echo 'data: ' . json_encode($data) . PHP_EOL;
|
||
|
|
||
|
echo PHP_EOL;
|
||
|
flush();
|
||
|
}
|
||
|
|
||
|
/**
|
||
|
* Closes the connection of the event source
|
||
|
*
|
||
|
* It's best to let the client close the stream
|
||
|
*/
|
||
|
public function close() {
|
||
|
$this->send(
|
||
|
'__internal__', 'close'
|
||
|
);
|
||
|
}
|
||
|
|
||
|
/**
|
||
|
* Makes sure we have a message we can use
|
||
|
*
|
||
|
* @param string $type
|
||
|
* @param mixed $data
|
||
|
*/
|
||
|
private function validateMessage($type, $data) {
|
||
|
if ($data && !preg_match('/^[A-Za-z0-9_]+$/', $type)) {
|
||
|
throw new \BadMethodCallException('Type needs to be alphanumeric (' . $type . ')');
|
||
|
}
|
||
|
}
|
||
|
}
|