From ef41f13a7b1224b673d4470694650a1074242ebb Mon Sep 17 00:00:00 2001 From: Adam Brown Date: Tue, 27 Sep 2022 20:41:32 +0100 Subject: [PATCH] adding entry point for extending services --- .../kotlin/app/dapk/st/matrix/MatrixClient.kt | 6 +++- .../app/dapk/st/matrix/ServiceInstaller.kt | 28 +++++++++++++++---- .../app/dapk/st/matrix/auth/AuthService.kt | 5 ++-- .../dapk/st/matrix/crypto/CryptoService.kt | 9 ++---- .../dapk/st/matrix/device/DeviceService.kt | 5 ++-- .../dapk/st/matrix/message/MessageService.kt | 9 ++---- .../app/dapk/st/matrix/room/ProfileService.kt | 5 ++-- .../app/dapk/st/matrix/push/PushService.kt | 5 ++-- .../app/dapk/st/matrix/room/RoomService.kt | 9 ++---- .../app/dapk/st/matrix/sync/SyncService.kt | 9 ++---- 10 files changed, 51 insertions(+), 39 deletions(-) diff --git a/matrix/matrix/src/main/kotlin/app/dapk/st/matrix/MatrixClient.kt b/matrix/matrix/src/main/kotlin/app/dapk/st/matrix/MatrixClient.kt index 24294eb..695dff4 100644 --- a/matrix/matrix/src/main/kotlin/app/dapk/st/matrix/MatrixClient.kt +++ b/matrix/matrix/src/main/kotlin/app/dapk/st/matrix/MatrixClient.kt @@ -43,7 +43,11 @@ data class ServiceDependencies( interface MatrixServiceInstaller { fun serializers(builder: SerializersModuleBuilder.() -> Unit) - fun install(factory: MatrixService.Factory) + fun install(factory: MatrixService.Factory): InstallExtender +} + +interface InstallExtender { + fun proxy(proxy: (T) -> T) } interface MatrixServiceProvider { diff --git a/matrix/matrix/src/main/kotlin/app/dapk/st/matrix/ServiceInstaller.kt b/matrix/matrix/src/main/kotlin/app/dapk/st/matrix/ServiceInstaller.kt index 2e59c9c..a2d6a1c 100644 --- a/matrix/matrix/src/main/kotlin/app/dapk/st/matrix/ServiceInstaller.kt +++ b/matrix/matrix/src/main/kotlin/app/dapk/st/matrix/ServiceInstaller.kt @@ -11,15 +11,22 @@ internal class ServiceInstaller { private val services = mutableMapOf() private val serviceInstaller = object : MatrixServiceInstaller { - val serviceCollector = mutableListOf() + val serviceCollector = mutableListOf MatrixService>>() val serializers = mutableListOf Unit>() override fun serializers(builder: SerializersModuleBuilder.() -> Unit) { serializers.add(builder) } - override fun install(factory: MatrixService.Factory) { - serviceCollector.add(factory) + override fun install(factory: MatrixService.Factory): InstallExtender { + val mutableProxy = MutableProxy() + return object : InstallExtender { + override fun proxy(proxy: (T) -> T) { + mutableProxy.value = proxy + } + }.also { + serviceCollector.add(factory to mutableProxy) + } } } @@ -39,9 +46,9 @@ internal class ServiceInstaller { val serviceProvider = object : MatrixServiceProvider { override fun getService(key: ServiceKey) = this@ServiceInstaller.getService(key) } - serviceInstaller.serviceCollector.forEach { - val (key, service) = it.create(ServiceDependencies(httpClient, json, serviceProvider, logger)) - services[key] = service + serviceInstaller.serviceCollector.forEach { (factory, extender) -> + val (key, service) = factory.create(ServiceDependencies(httpClient, json, serviceProvider, logger)) + services[key] = extender(service) } } @@ -57,4 +64,13 @@ internal class ServiceInstaller { ?: throw IllegalArgumentException("No service available to handle ${task.type}") } +} + +internal class MutableProxy : (MatrixService) -> MatrixService { + + var value: (T) -> T = { it } + + @Suppress("UNCHECKED_CAST") + override fun invoke(service: MatrixService) = value(service as T) + } \ No newline at end of file diff --git a/matrix/services/auth/src/main/kotlin/app/dapk/st/matrix/auth/AuthService.kt b/matrix/services/auth/src/main/kotlin/app/dapk/st/matrix/auth/AuthService.kt index 95db7f4..348df96 100644 --- a/matrix/services/auth/src/main/kotlin/app/dapk/st/matrix/auth/AuthService.kt +++ b/matrix/services/auth/src/main/kotlin/app/dapk/st/matrix/auth/AuthService.kt @@ -1,5 +1,6 @@ package app.dapk.st.matrix.auth +import app.dapk.st.matrix.InstallExtender import app.dapk.st.matrix.MatrixClient import app.dapk.st.matrix.MatrixService import app.dapk.st.matrix.MatrixServiceInstaller @@ -25,8 +26,8 @@ interface AuthService : MatrixService { fun MatrixServiceInstaller.installAuthService( credentialsStore: CredentialsStore, -) { - this.install { (httpClient, json) -> +): InstallExtender { + return this.install { (httpClient, json) -> SERVICE_KEY to DefaultAuthService(httpClient, credentialsStore, json) } } diff --git a/matrix/services/crypto/src/main/kotlin/app/dapk/st/matrix/crypto/CryptoService.kt b/matrix/services/crypto/src/main/kotlin/app/dapk/st/matrix/crypto/CryptoService.kt index becaf3b..ba5936b 100644 --- a/matrix/services/crypto/src/main/kotlin/app/dapk/st/matrix/crypto/CryptoService.kt +++ b/matrix/services/crypto/src/main/kotlin/app/dapk/st/matrix/crypto/CryptoService.kt @@ -2,10 +2,7 @@ package app.dapk.st.matrix.crypto import app.dapk.st.core.Base64 import app.dapk.st.core.CoroutineDispatchers -import app.dapk.st.matrix.MatrixService -import app.dapk.st.matrix.MatrixServiceInstaller -import app.dapk.st.matrix.MatrixServiceProvider -import app.dapk.st.matrix.ServiceDepFactory +import app.dapk.st.matrix.* import app.dapk.st.matrix.common.* import app.dapk.st.matrix.crypto.internal.* import app.dapk.st.matrix.device.deviceService @@ -136,8 +133,8 @@ fun MatrixServiceInstaller.installCryptoService( roomMembersProvider: ServiceDepFactory, base64: Base64, coroutineDispatchers: CoroutineDispatchers, -) { - this.install { (_, _, services, logger) -> +): InstallExtender { + return this.install { (_, _, services, logger) -> val deviceService = services.deviceService() val accountCryptoUseCase = FetchAccountCryptoUseCaseImpl(credentialsStore, olm, deviceService) diff --git a/matrix/services/device/src/main/kotlin/app/dapk/st/matrix/device/DeviceService.kt b/matrix/services/device/src/main/kotlin/app/dapk/st/matrix/device/DeviceService.kt index c69d8d4..1244c65 100644 --- a/matrix/services/device/src/main/kotlin/app/dapk/st/matrix/device/DeviceService.kt +++ b/matrix/services/device/src/main/kotlin/app/dapk/st/matrix/device/DeviceService.kt @@ -1,5 +1,6 @@ package app.dapk.st.matrix.device +import app.dapk.st.matrix.InstallExtender import app.dapk.st.matrix.MatrixService import app.dapk.st.matrix.MatrixServiceInstaller import app.dapk.st.matrix.MatrixServiceProvider @@ -122,8 +123,8 @@ sealed class ToDevicePayload { sealed interface VerificationPayload } -fun MatrixServiceInstaller.installEncryptionService(knownDeviceStore: KnownDeviceStore) { - this.install { (httpClient, _, _, logger) -> +fun MatrixServiceInstaller.installEncryptionService(knownDeviceStore: KnownDeviceStore): InstallExtender { + return this.install { (httpClient, _, _, logger) -> SERVICE_KEY to DefaultDeviceService(httpClient, logger, knownDeviceStore) } } diff --git a/matrix/services/message/src/main/kotlin/app/dapk/st/matrix/message/MessageService.kt b/matrix/services/message/src/main/kotlin/app/dapk/st/matrix/message/MessageService.kt index 23fdb98..35b6297 100644 --- a/matrix/services/message/src/main/kotlin/app/dapk/st/matrix/message/MessageService.kt +++ b/matrix/services/message/src/main/kotlin/app/dapk/st/matrix/message/MessageService.kt @@ -1,10 +1,7 @@ package app.dapk.st.matrix.message import app.dapk.st.core.Base64 -import app.dapk.st.matrix.MatrixService -import app.dapk.st.matrix.MatrixServiceInstaller -import app.dapk.st.matrix.MatrixServiceProvider -import app.dapk.st.matrix.ServiceDepFactory +import app.dapk.st.matrix.* import app.dapk.st.matrix.common.AlgorithmName import app.dapk.st.matrix.common.EventId import app.dapk.st.matrix.common.MessageType @@ -132,8 +129,8 @@ fun MatrixServiceInstaller.installMessageService( imageContentReader: ImageContentReader, messageEncrypter: ServiceDepFactory = ServiceDepFactory { MissingMessageEncrypter }, mediaEncrypter: ServiceDepFactory = ServiceDepFactory { MissingMediaEncrypter }, -) { - this.install { (httpClient, _, installedServices) -> +): InstallExtender { + return this.install { (httpClient, _, installedServices) -> SERVICE_KEY to DefaultMessageService( httpClient, localEchoStore, diff --git a/matrix/services/profile/src/main/kotlin/app/dapk/st/matrix/room/ProfileService.kt b/matrix/services/profile/src/main/kotlin/app/dapk/st/matrix/room/ProfileService.kt index 28ba329..73e4768 100644 --- a/matrix/services/profile/src/main/kotlin/app/dapk/st/matrix/room/ProfileService.kt +++ b/matrix/services/profile/src/main/kotlin/app/dapk/st/matrix/room/ProfileService.kt @@ -1,6 +1,7 @@ package app.dapk.st.matrix.room import app.dapk.st.core.SingletonFlows +import app.dapk.st.matrix.InstallExtender import app.dapk.st.matrix.MatrixService import app.dapk.st.matrix.MatrixServiceInstaller import app.dapk.st.matrix.MatrixServiceProvider @@ -29,8 +30,8 @@ fun MatrixServiceInstaller.installProfileService( profileStore: ProfileStore, singletonFlows: SingletonFlows, credentialsStore: CredentialsStore, -) { - this.install { (httpClient, _, _, logger) -> +): InstallExtender { + return this.install { (httpClient, _, _, logger) -> SERVICE_KEY to DefaultProfileService(httpClient, logger, profileStore, singletonFlows, credentialsStore) } } diff --git a/matrix/services/push/src/main/kotlin/app/dapk/st/matrix/push/PushService.kt b/matrix/services/push/src/main/kotlin/app/dapk/st/matrix/push/PushService.kt index 5402ed3..34026a6 100644 --- a/matrix/services/push/src/main/kotlin/app/dapk/st/matrix/push/PushService.kt +++ b/matrix/services/push/src/main/kotlin/app/dapk/st/matrix/push/PushService.kt @@ -1,5 +1,6 @@ package app.dapk.st.matrix.push +import app.dapk.st.matrix.InstallExtender import app.dapk.st.matrix.MatrixClient import app.dapk.st.matrix.MatrixService import app.dapk.st.matrix.MatrixServiceInstaller @@ -38,8 +39,8 @@ interface PushService : MatrixService { fun MatrixServiceInstaller.installPushService( credentialsStore: CredentialsStore, -) { - this.install { (httpClient, _, _, logger) -> +): InstallExtender { + return this.install { (httpClient, _, _, logger) -> SERVICE_KEY to DefaultPushService(httpClient, credentialsStore, logger) } } diff --git a/matrix/services/room/src/main/kotlin/app/dapk/st/matrix/room/RoomService.kt b/matrix/services/room/src/main/kotlin/app/dapk/st/matrix/room/RoomService.kt index 1f933a9..56ba0a1 100644 --- a/matrix/services/room/src/main/kotlin/app/dapk/st/matrix/room/RoomService.kt +++ b/matrix/services/room/src/main/kotlin/app/dapk/st/matrix/room/RoomService.kt @@ -1,9 +1,6 @@ package app.dapk.st.matrix.room -import app.dapk.st.matrix.MatrixService -import app.dapk.st.matrix.MatrixServiceInstaller -import app.dapk.st.matrix.MatrixServiceProvider -import app.dapk.st.matrix.ServiceDepFactory +import app.dapk.st.matrix.* import app.dapk.st.matrix.common.EventId import app.dapk.st.matrix.common.RoomId import app.dapk.st.matrix.common.RoomMember @@ -42,8 +39,8 @@ fun MatrixServiceInstaller.installRoomService( memberStore: MemberStore, roomMessenger: ServiceDepFactory, roomInviteRemover: RoomInviteRemover, -) { - this.install { (httpClient, _, services, logger) -> +): InstallExtender { + return this.install { (httpClient, _, services, logger) -> SERVICE_KEY to DefaultRoomService( httpClient, logger, diff --git a/matrix/services/sync/src/main/kotlin/app/dapk/st/matrix/sync/SyncService.kt b/matrix/services/sync/src/main/kotlin/app/dapk/st/matrix/sync/SyncService.kt index f0c8530..d0487d3 100644 --- a/matrix/services/sync/src/main/kotlin/app/dapk/st/matrix/sync/SyncService.kt +++ b/matrix/services/sync/src/main/kotlin/app/dapk/st/matrix/sync/SyncService.kt @@ -2,10 +2,7 @@ package app.dapk.st.matrix.sync import app.dapk.st.core.CoroutineDispatchers import app.dapk.st.core.extensions.ErrorTracker -import app.dapk.st.matrix.MatrixClient -import app.dapk.st.matrix.MatrixService -import app.dapk.st.matrix.MatrixServiceInstaller -import app.dapk.st.matrix.ServiceDepFactory +import app.dapk.st.matrix.* import app.dapk.st.matrix.common.* import app.dapk.st.matrix.sync.internal.DefaultSyncService import app.dapk.st.matrix.sync.internal.request.* @@ -49,7 +46,7 @@ fun MatrixServiceInstaller.installSyncService( errorTracker: ErrorTracker, coroutineDispatchers: CoroutineDispatchers, syncConfig: SyncConfig = SyncConfig(), -) { +): InstallExtender { this.serializers { polymorphicDefault(ApiTimelineEvent::class) { ApiTimelineEvent.Ignored.serializer() @@ -71,7 +68,7 @@ fun MatrixServiceInstaller.installSyncService( } } - this.install { (httpClient, json, services, logger) -> + return this.install { (httpClient, json, services, logger) -> SERVICE_KEY to DefaultSyncService( httpClient = httpClient, syncStore = syncStore,