adding entry point for extending services
This commit is contained in:
parent
1c37667485
commit
ef41f13a7b
|
@ -43,7 +43,11 @@ data class ServiceDependencies(
|
|||
|
||||
interface MatrixServiceInstaller {
|
||||
fun serializers(builder: SerializersModuleBuilder.() -> Unit)
|
||||
fun install(factory: MatrixService.Factory)
|
||||
fun <T : MatrixService> install(factory: MatrixService.Factory): InstallExtender<T>
|
||||
}
|
||||
|
||||
interface InstallExtender<T : MatrixService> {
|
||||
fun proxy(proxy: (T) -> T)
|
||||
}
|
||||
|
||||
interface MatrixServiceProvider {
|
||||
|
|
|
@ -11,15 +11,22 @@ internal class ServiceInstaller {
|
|||
private val services = mutableMapOf<Any, MatrixService>()
|
||||
private val serviceInstaller = object : MatrixServiceInstaller {
|
||||
|
||||
val serviceCollector = mutableListOf<MatrixService.Factory>()
|
||||
val serviceCollector = mutableListOf<Pair<MatrixService.Factory, (MatrixService) -> MatrixService>>()
|
||||
val serializers = mutableListOf<SerializersModuleBuilder.() -> Unit>()
|
||||
|
||||
override fun serializers(builder: SerializersModuleBuilder.() -> Unit) {
|
||||
serializers.add(builder)
|
||||
}
|
||||
|
||||
override fun install(factory: MatrixService.Factory) {
|
||||
serviceCollector.add(factory)
|
||||
override fun <T : MatrixService> install(factory: MatrixService.Factory): InstallExtender<T> {
|
||||
val mutableProxy = MutableProxy<T>()
|
||||
return object : InstallExtender<T> {
|
||||
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 <T : MatrixService> getService(key: ServiceKey) = this@ServiceInstaller.getService<T>(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<T : MatrixService> : (MatrixService) -> MatrixService {
|
||||
|
||||
var value: (T) -> T = { it }
|
||||
|
||||
@Suppress("UNCHECKED_CAST")
|
||||
override fun invoke(service: MatrixService) = value(service as T)
|
||||
|
||||
}
|
|
@ -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<AuthService> {
|
||||
return this.install { (httpClient, json) ->
|
||||
SERVICE_KEY to DefaultAuthService(httpClient, credentialsStore, json)
|
||||
}
|
||||
}
|
||||
|
|
|
@ -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<RoomMembersProvider>,
|
||||
base64: Base64,
|
||||
coroutineDispatchers: CoroutineDispatchers,
|
||||
) {
|
||||
this.install { (_, _, services, logger) ->
|
||||
): InstallExtender<CryptoService> {
|
||||
return this.install { (_, _, services, logger) ->
|
||||
val deviceService = services.deviceService()
|
||||
val accountCryptoUseCase = FetchAccountCryptoUseCaseImpl(credentialsStore, olm, deviceService)
|
||||
|
||||
|
|
|
@ -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<DeviceService> {
|
||||
return this.install { (httpClient, _, _, logger) ->
|
||||
SERVICE_KEY to DefaultDeviceService(httpClient, logger, knownDeviceStore)
|
||||
}
|
||||
}
|
||||
|
|
|
@ -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<MessageEncrypter> = ServiceDepFactory { MissingMessageEncrypter },
|
||||
mediaEncrypter: ServiceDepFactory<MediaEncrypter> = ServiceDepFactory { MissingMediaEncrypter },
|
||||
) {
|
||||
this.install { (httpClient, _, installedServices) ->
|
||||
): InstallExtender<MessageService> {
|
||||
return this.install { (httpClient, _, installedServices) ->
|
||||
SERVICE_KEY to DefaultMessageService(
|
||||
httpClient,
|
||||
localEchoStore,
|
||||
|
|
|
@ -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<ProfileService> {
|
||||
return this.install { (httpClient, _, _, logger) ->
|
||||
SERVICE_KEY to DefaultProfileService(httpClient, logger, profileStore, singletonFlows, credentialsStore)
|
||||
}
|
||||
}
|
||||
|
|
|
@ -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<PushService> {
|
||||
return this.install { (httpClient, _, _, logger) ->
|
||||
SERVICE_KEY to DefaultPushService(httpClient, credentialsStore, logger)
|
||||
}
|
||||
}
|
||||
|
|
|
@ -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<RoomMessenger>,
|
||||
roomInviteRemover: RoomInviteRemover,
|
||||
) {
|
||||
this.install { (httpClient, _, services, logger) ->
|
||||
): InstallExtender<RoomService> {
|
||||
return this.install { (httpClient, _, services, logger) ->
|
||||
SERVICE_KEY to DefaultRoomService(
|
||||
httpClient,
|
||||
logger,
|
||||
|
|
|
@ -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<SyncService> {
|
||||
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,
|
||||
|
|
Loading…
Reference in New Issue