From 9834684402467dfe0e1f875f95dbd519ba2ea1e9 Mon Sep 17 00:00:00 2001 From: lukinovec Date: Wed, 7 Dec 2022 09:38:44 +0100 Subject: [PATCH] Add BroadcastTenancyBootstrapper and TenancyBroadcastManager --- .../BroadcastTenancyBootstrapper.php | 86 +++++++++++++++++++ src/Bootstrappers/TenancyBroadcastManager.php | 54 ++++++++++++ 2 files changed, 140 insertions(+) create mode 100644 src/Bootstrappers/BroadcastTenancyBootstrapper.php create mode 100644 src/Bootstrappers/TenancyBroadcastManager.php diff --git a/src/Bootstrappers/BroadcastTenancyBootstrapper.php b/src/Bootstrappers/BroadcastTenancyBootstrapper.php new file mode 100644 index 00000000..15f78f9d --- /dev/null +++ b/src/Bootstrappers/BroadcastTenancyBootstrapper.php @@ -0,0 +1,86 @@ + 'tenant_property', + * ] + */ + public static array $credentialsMap = []; + + public static string|null $broadcaster = null; + + protected array $originalConfig = []; + + public static array $mapPresets = [ + 'pusher' => [ + 'broadcasting.connections.pusher.key' => 'pusher_key', + 'broadcasting.connections.pusher.secret' => 'pusher_secret', + 'broadcasting.connections.pusher.app_id' => 'pusher_app_id', + 'broadcasting.connections.pusher.options.cluster' => 'pusher_cluster', + ], + 'ably' => [ + 'broadcasting.connections.ably.key' => 'ably_key', + 'broadcasting.connections.ably.public' => 'ably_public', + ], + ]; + + public function __construct( + protected Repository $config, + protected Application $app + ) { + static::$broadcaster ??= $config->get('broadcasting.default'); + static::$credentialsMap = array_merge(static::$credentialsMap, static::$mapPresets[static::$broadcaster] ?? []); + } + + public function bootstrap(Tenant $tenant): void + { + $this->setConfig($tenant); + + $this->app->extend(BroadcastManager::class, function (BroadcastManager $broadcastManager) { + $tenancyBroadcastManager = new TenancyBroadcastManager($this->app); + + return $tenancyBroadcastManager->setDriver($broadcastManager->getDefaultDriver(), $broadcastManager->driver()); + }); + } + + public function revert(): void + { + $this->unsetConfig(); + } + + protected function setConfig(Tenant $tenant): void + { + foreach (static::$credentialsMap as $configKey => $storageKey) { + $override = $tenant->$storageKey; + + if (array_key_exists($storageKey, $tenant->getAttributes())) { + $this->originalConfig[$configKey] ??= $this->config->get($configKey); + + $this->config->set($configKey, $override); + } + } + } + + protected function unsetConfig(): void + { + foreach ($this->originalConfig as $key => $value) { + $this->config->set($key, $value); + } + } +} diff --git a/src/Bootstrappers/TenancyBroadcastManager.php b/src/Bootstrappers/TenancyBroadcastManager.php new file mode 100644 index 00000000..36762091 --- /dev/null +++ b/src/Bootstrappers/TenancyBroadcastManager.php @@ -0,0 +1,54 @@ +drivers[$name] ?? null; + + $this->app->forgetInstance(BroadcasterContract::class); + + /** @var Broadcaster $broadcaster */ + $broadcaster = $this->resolve($name); + + if ($cachedBroadcaster) { + $cachedBroadcaster = invade($cachedBroadcaster); + + foreach ($cachedBroadcaster->channels as $channel => $callback) { + $broadcaster->channel($channel, $callback, $cachedBroadcaster->retrieveChannelOptions($channel)); + } + } + + return $broadcaster; + } + + return parent::get($name); + } + + public function setDriver(string $name, BroadcasterContract $broadcaster): static + { + $this->drivers[$name] = $broadcaster; + + return $this; + } +}