diff --git a/extend.php b/extend.php
index bd72804..0e9c940 100644
--- a/extend.php
+++ b/extend.php
@@ -13,6 +13,7 @@ namespace GlowingBlue\RedisSetup;
use Flarum\Extend;
use GlowingBlue\RedisSetup\Extend\EnableRedis;
+use GlowingBlue\RedisSetup\Provider\QueueProvider;
return [
(new Extend\Frontend('admin'))
@@ -20,5 +21,8 @@ return [
new Extend\Locales(__DIR__.'/resources/locale'),
+ (new Extend\ServiceProvider())
+ ->register(QueueProvider::class),
+
new EnableRedis()
];
diff --git a/js/src/admin/index.js b/js/src/admin/index.js
index 670c9a1..73869b4 100644
--- a/js/src/admin/index.js
+++ b/js/src/admin/index.js
@@ -1,4 +1,6 @@
import app from 'flarum/admin/app';
+import { extend } from 'flarum/common/extend';
+import StatusWidget from 'flarum/admin/components/StatusWidget';
app.initializers.add('glowingblue-redis-setup', () => {
app.extensionData
@@ -20,4 +22,21 @@ app.initializers.add('glowingblue-redis-setup', () => {
type: 'boolean',
label: app.translator.trans('glowingblue-redis-setup.admin.settings.enable_queue'),
});
+
+ extend(StatusWidget.prototype, 'items', (items) => {
+ const loads = app.data.blomstraQueuesLoad;
+
+ if (loads === undefined) {
+ return;
+ }
+
+ for (let queue of app.data.blomstraQueuesSeen) {
+ const load = loads[queue] || null;
+ items.add('blomstra-queue-size-' + queue, [
+ Queue {queue},
+
,
+ load || '0',
+ ]);
+ }
+ });
});
diff --git a/src/Provider/QueueProvider.php b/src/Provider/QueueProvider.php
new file mode 100644
index 0000000..a257a29
--- /dev/null
+++ b/src/Provider/QueueProvider.php
@@ -0,0 +1,73 @@
+get('glowingblue-redis.enableQueue', false)) {
+ return;
+ }
+
+ /** @var ExtensionManager $extensions */
+ $extensions = resolve(ExtensionManager::class);
+
+ (new Frontend('admin'))
+ ->content([$this, 'adminWidgetAttributes'])
+ ->extend($this->container, $extensions->getExtension('glowingblue-redis-setup'));
+
+ /** @var Dispatcher $dispatcher */
+ $dispatcher = $this->container->make(Dispatcher::class);
+ $dispatcher->listen(Looping::class, [$this, 'trackQueues']);
+ }
+
+ public function adminWidgetAttributes(Document $document)
+ {
+ /** @var Store $cache */
+ $cache = resolve('cache.store');
+ /** @var QueueContract $queue */
+ $queue = resolve(QueueContract::class);
+
+ $queues = $cache->get('blomstra.queue.queues-seen') ?? [];
+
+ if ($queue instanceof RedisQueue) {
+ $load = [];
+
+ foreach ($queues as $name) {
+ $load[$name] = $queue->getRedis()
+ ->connection($this->connection)
+ ->llen('queues:' . $name);
+ }
+ }
+
+ $document->payload['blomstraQueuesSeen'] = $queues;
+ $document->payload['blomstraQueuesLoad'] = $load ?? null;
+ }
+
+ public function trackQueues(Looping $event)
+ {
+ /** @var Store $cache */
+ $cache = resolve('cache.store');
+
+ $queues = $cache->get('blomstra.queue.queues-seen') ?? [];
+ $queues = array_merge($queues, (array) explode(',', $event->queue));
+ $cache->put('blomstra.queue.queues-seen', array_unique($queues), 60);
+ }
+}