diff --git a/data/src/main/java/com/anytypeio/anytype/data/auth/repo/block/BlockDataRepository.kt b/data/src/main/java/com/anytypeio/anytype/data/auth/repo/block/BlockDataRepository.kt index 2c516e114b..edc003fc52 100644 --- a/data/src/main/java/com/anytypeio/anytype/data/auth/repo/block/BlockDataRepository.kt +++ b/data/src/main/java/com/anytypeio/anytype/data/auth/repo/block/BlockDataRepository.kt @@ -888,4 +888,8 @@ class BlockDataRepository( override suspend fun createTemplateFromObject(ctx: Id): Id { return remote.createTemplateFromObject(ctx) } + + override suspend fun debugStackGoroutines(path: String) { + return remote.debugStackGoroutines(path) + } } \ No newline at end of file diff --git a/data/src/main/java/com/anytypeio/anytype/data/auth/repo/block/BlockRemote.kt b/data/src/main/java/com/anytypeio/anytype/data/auth/repo/block/BlockRemote.kt index 9da0783c1c..a579a37631 100644 --- a/data/src/main/java/com/anytypeio/anytype/data/auth/repo/block/BlockRemote.kt +++ b/data/src/main/java/com/anytypeio/anytype/data/auth/repo/block/BlockRemote.kt @@ -379,4 +379,5 @@ interface BlockRemote { suspend fun duplicateObjectsList(ids: List): List suspend fun createTemplateFromObject(ctx: Id): Id + suspend fun debugStackGoroutines(path: String) } \ No newline at end of file diff --git a/domain/src/main/java/com/anytypeio/anytype/domain/block/repo/BlockRepository.kt b/domain/src/main/java/com/anytypeio/anytype/domain/block/repo/BlockRepository.kt index 6924c9aa59..9a7b82a44d 100644 --- a/domain/src/main/java/com/anytypeio/anytype/domain/block/repo/BlockRepository.kt +++ b/domain/src/main/java/com/anytypeio/anytype/domain/block/repo/BlockRepository.kt @@ -427,4 +427,5 @@ interface BlockRepository { suspend fun setInternalFlags(command: Command.SetInternalFlags): Payload suspend fun duplicateObjectsList(ids: List): List suspend fun createTemplateFromObject(ctx: Id): Id + suspend fun debugStackGoroutines(path: String) } \ No newline at end of file diff --git a/domain/src/main/java/com/anytypeio/anytype/domain/debugging/DebugGoroutines.kt b/domain/src/main/java/com/anytypeio/anytype/domain/debugging/DebugGoroutines.kt new file mode 100644 index 0000000000..3e22cf5040 --- /dev/null +++ b/domain/src/main/java/com/anytypeio/anytype/domain/debugging/DebugGoroutines.kt @@ -0,0 +1,18 @@ +package com.anytypeio.anytype.domain.debugging + +import com.anytypeio.anytype.domain.base.AppCoroutineDispatchers +import com.anytypeio.anytype.domain.base.ResultInteractor +import com.anytypeio.anytype.domain.block.repo.BlockRepository +import javax.inject.Inject + +class DebugGoroutines @Inject constructor( + private val repo: BlockRepository, + dispatchers: AppCoroutineDispatchers +) : ResultInteractor(dispatchers.io) { + + override suspend fun doWork(params: Params) { + repo.debugStackGoroutines(params.path) + } + + data class Params(val path: String) +} \ No newline at end of file diff --git a/middleware/src/main/java/com/anytypeio/anytype/middleware/block/BlockMiddleware.kt b/middleware/src/main/java/com/anytypeio/anytype/middleware/block/BlockMiddleware.kt index 684f8e5dc7..4e8d74b419 100644 --- a/middleware/src/main/java/com/anytypeio/anytype/middleware/block/BlockMiddleware.kt +++ b/middleware/src/main/java/com/anytypeio/anytype/middleware/block/BlockMiddleware.kt @@ -850,4 +850,8 @@ class BlockMiddleware( override suspend fun createTemplateFromObject(ctx: Id): Id { return middleware.createTemplateFromObject(ctx) } + + override suspend fun debugStackGoroutines(path: String) { + return middleware.debugStackGoroutines(path) + } } \ No newline at end of file diff --git a/middleware/src/main/java/com/anytypeio/anytype/middleware/interactor/Middleware.kt b/middleware/src/main/java/com/anytypeio/anytype/middleware/interactor/Middleware.kt index 4da08f174b..73c38ee870 100644 --- a/middleware/src/main/java/com/anytypeio/anytype/middleware/interactor/Middleware.kt +++ b/middleware/src/main/java/com/anytypeio/anytype/middleware/interactor/Middleware.kt @@ -2329,6 +2329,16 @@ class Middleware @Inject constructor( return response.id } + @Throws(Exception::class) + fun debugStackGoroutines(path: String) { + val request = Rpc.Debug.StackGoroutines.Request( + path = path + ) + if (BuildConfig.DEBUG) logRequest(request) + val response = service.debugStackGoroutines(request) + if (BuildConfig.DEBUG) logResponse(response) + } + private fun logRequest(any: Any) { logger.logRequest(any).also { if (BuildConfig.DEBUG && threadInfo.isOnMainThread()) { diff --git a/middleware/src/main/java/com/anytypeio/anytype/middleware/service/MiddlewareService.kt b/middleware/src/main/java/com/anytypeio/anytype/middleware/service/MiddlewareService.kt index 9a72102a86..fe7c8afe97 100644 --- a/middleware/src/main/java/com/anytypeio/anytype/middleware/service/MiddlewareService.kt +++ b/middleware/src/main/java/com/anytypeio/anytype/middleware/service/MiddlewareService.kt @@ -436,6 +436,9 @@ interface MiddlewareService { @Throws(Exception::class) fun debugSubscriptions(request: Rpc.Debug.Subscriptions.Request): Rpc.Debug.Subscriptions.Response + @Throws(Exception::class) + fun debugStackGoroutines(request: Rpc.Debug.StackGoroutines.Request): Rpc.Debug.StackGoroutines.Response + //endregion //region WIDGETS commands diff --git a/middleware/src/main/java/com/anytypeio/anytype/middleware/service/MiddlewareServiceImplementation.kt b/middleware/src/main/java/com/anytypeio/anytype/middleware/service/MiddlewareServiceImplementation.kt index ed7231ddc3..e5566b6487 100644 --- a/middleware/src/main/java/com/anytypeio/anytype/middleware/service/MiddlewareServiceImplementation.kt +++ b/middleware/src/main/java/com/anytypeio/anytype/middleware/service/MiddlewareServiceImplementation.kt @@ -1719,4 +1719,17 @@ class MiddlewareServiceImplementation @Inject constructor( return response } } + + override fun debugStackGoroutines(request: Rpc.Debug.StackGoroutines.Request): Rpc.Debug.StackGoroutines.Response { + val encoded = Service.debugStackGoroutines( + Rpc.Debug.StackGoroutines.Request.ADAPTER.encode(request) + ) + val response = Rpc.Debug.StackGoroutines.Response.ADAPTER.decode(encoded) + val error = response.error + if (error != null && error.code != Rpc.Debug.StackGoroutines.Response.Error.Code.NULL) { + throw Exception(error.description) + } else { + return response + } + } } \ No newline at end of file