1- package org.ntqqrev.saltify.core
2-
3- import io.ktor.client.*
4- import io.ktor.client.call.*
5- import io.ktor.client.plugins.*
6- import io.ktor.client.plugins.contentnegotiation.*
7- import io.ktor.client.plugins.sse.*
8- import io.ktor.client.plugins.websocket.*
9- import io.ktor.client.request.*
10- import io.ktor.http.*
11- import io.ktor.serialization.kotlinx.*
12- import io.ktor.serialization.kotlinx.json.*
13- import io.ktor.util.logging.*
14- import kotlinx.coroutines.*
15- import kotlinx.coroutines.flow.*
1+ package org.ntqqrev.saltify
2+
3+ import io.ktor.client.HttpClient
4+ import io.ktor.client.call.body
5+ import io.ktor.client.plugins.contentnegotiation.ContentNegotiation
6+ import io.ktor.client.plugins.defaultRequest
7+ import io.ktor.client.plugins.sse.SSE
8+ import io.ktor.client.plugins.timeout
9+ import io.ktor.client.plugins.websocket.WebSockets
10+ import io.ktor.client.request.header
11+ import io.ktor.client.request.post
12+ import io.ktor.client.request.setBody
13+ import io.ktor.http.ContentType
14+ import io.ktor.http.HttpHeaders
15+ import io.ktor.http.contentType
16+ import io.ktor.serialization.kotlinx.KotlinxWebsocketSerializationConverter
17+ import io.ktor.serialization.kotlinx.json.json
18+ import io.ktor.util.logging.KtorSimpleLogger
19+ import kotlinx.coroutines.CoroutineScope
20+ import kotlinx.coroutines.SupervisorJob
21+ import kotlinx.coroutines.cancel
22+ import kotlinx.coroutines.flow.MutableSharedFlow
23+ import kotlinx.coroutines.flow.MutableStateFlow
24+ import kotlinx.coroutines.flow.SharedFlow
25+ import kotlinx.coroutines.flow.StateFlow
26+ import kotlinx.coroutines.flow.asSharedFlow
27+ import kotlinx.coroutines.flow.asStateFlow
28+ import kotlinx.coroutines.job
29+ import kotlinx.coroutines.joinAll
30+ import kotlinx.coroutines.launch
1631import kotlinx.serialization.json.decodeFromJsonElement
17- import org.ntqqrev.milky.*
32+ import org.ntqqrev.milky.ApiEmptyStruct
33+ import org.ntqqrev.milky.ApiEndpoint
34+ import org.ntqqrev.milky.ApiGeneralResponse
35+ import org.ntqqrev.milky.Event
36+ import org.ntqqrev.milky.milkyJsonModule
1837import org.ntqqrev.saltify.annotation.WithApiExtension
19- import org.ntqqrev.saltify.dsl.SaltifyPluginContext
20- import org.ntqqrev.saltify.dsl.config.SaltifyApplicationConfig
21- import org.ntqqrev.saltify.entity.InstalledPlugin
22- import org.ntqqrev.saltify.entity.RegisteredCommandInfo
38+ import org.ntqqrev.saltify.dsl.PluginBuilder
39+ import org.ntqqrev.saltify.dsl.config.ApplicationConfig
40+ import org.ntqqrev.saltify.internal.util.InstalledPlugin
41+ import org.ntqqrev.saltify.runtime.SaltifyComponent
42+ import org.ntqqrev.saltify.internal.util.ExceptionHandlerProvider
43+ import org.ntqqrev.saltify.runtime.command.RegisteredCommand
2344import org.ntqqrev.saltify.exception.ApiCallException
24- import org.ntqqrev.saltify.model.EventConnectionState
25- import org.ntqqrev.saltify.model.EventConnectionType
45+ import org.ntqqrev.saltify.internal.app.SaltifyApplicationSSE
46+ import org.ntqqrev.saltify.internal.app.SaltifyApplicationWebSocket
2647import org.ntqqrev.saltify.model.SaltifyComponentType
27- import org.ntqqrev.saltify.util.coroutine.SaltifyComponent
28- import org.ntqqrev.saltify.util.coroutine.SaltifyExceptionHandlerProvider
48+ import org.ntqqrev.saltify.model.event.EventConnectionState
49+ import org.ntqqrev.saltify.model.event.EventConnectionType
2950import kotlin.coroutines.CoroutineContext
3051import kotlin.time.Clock
3152
3253/* *
3354 * 一个 Saltify 应用实例
3455 */
3556@WithApiExtension
36- public sealed class SaltifyApplication (@PublishedApi internal val config : SaltifyApplicationConfig ) : AutoCloseable {
57+ public abstract class SaltifyApplication internal constructor(
58+ @PublishedApi internal val config : ApplicationConfig
59+ ) : AutoCloseable {
3760 public companion object {
3861 /* *
3962 * 创建一个 Saltify 应用实例。
4063 */
41- public operator fun invoke (block : SaltifyApplicationConfig .() -> Unit ): SaltifyApplication {
42- val config = SaltifyApplicationConfig ().apply (block)
64+ public operator fun invoke (block : ApplicationConfig .() -> Unit ): SaltifyApplication {
65+ val config = ApplicationConfig ().apply (block)
4366 return when (config.connection.event.type) {
4467 EventConnectionType .WebSocket -> SaltifyApplicationWebSocket (config)
4568 EventConnectionType .SSE -> SaltifyApplicationSSE (config)
@@ -50,12 +73,12 @@ public sealed class SaltifyApplication(@PublishedApi internal val config: Saltif
5073 internal val logger = KtorSimpleLogger (" Saltify/main" )
5174
5275 @PublishedApi
53- internal val exceptionHandlerProvider: SaltifyExceptionHandlerProvider = SaltifyExceptionHandlerProvider ()
76+ internal val exceptionHandlerProvider: ExceptionHandlerProvider = ExceptionHandlerProvider ()
5477
5578 /* *
5679 * 全局异常流。
5780 *
58- * 可以通过 [SaltifyComponent] 判断异常抛出位置。
81+ * 可以通过 [org.ntqqrev.saltify.runtime. SaltifyComponent] 判断异常抛出位置。
5982 *
6083 * ```kotlin
6184 * client.exceptionFlow.collect { (context, exception) ->
@@ -77,7 +100,7 @@ public sealed class SaltifyApplication(@PublishedApi internal val config: Saltif
77100
78101 internal val applicationScope: CoroutineScope = CoroutineScope (
79102 SaltifyComponent (SaltifyComponentType .Application , " SaltifyApplication" ) +
80- exceptionHandlerProvider.handler
103+ exceptionHandlerProvider.handler
81104 )
82105
83106 protected val events: MutableSharedFlow <Event > = MutableSharedFlow (extraBufferCapacity = 64 )
@@ -92,15 +115,15 @@ public sealed class SaltifyApplication(@PublishedApi internal val config: Saltif
92115 @PublishedApi
93116 internal val extensionScope: CoroutineScope = CoroutineScope (
94117 applicationScope.coroutineContext +
95- SupervisorJob (applicationScope.coroutineContext.job) +
96- SaltifyComponent (SaltifyComponentType .Extension , " SaltifyExtension" )
118+ SupervisorJob (applicationScope.coroutineContext.job) +
119+ SaltifyComponent (SaltifyComponentType .Extension , " SaltifyExtension" )
97120 )
98121
99122 protected val addressBaseNormalized: String = config.connection.baseUrl.trimEnd(' /' )
100123
101- private val loadedPlugins = mutableListOf<SaltifyPluginContext >()
124+ private val loadedPlugins = mutableListOf<PluginBuilder >()
102125
103- internal val commandRegistry: MutableList <RegisteredCommandInfo > = mutableListOf ()
126+ internal val commandRegistry: MutableList <RegisteredCommand > = mutableListOf ()
104127
105128 @PublishedApi
106129 internal val accessToken: String? = config.connection.accessToken
@@ -138,11 +161,11 @@ public sealed class SaltifyApplication(@PublishedApi internal val config: Saltif
138161
139162 val pluginScope = CoroutineScope (
140163 applicationScope.coroutineContext +
141- SupervisorJob (applicationScope.coroutineContext.job) +
142- SaltifyComponent (SaltifyComponentType .Plugin , plugin.name)
164+ SupervisorJob (applicationScope.coroutineContext.job) +
165+ SaltifyComponent (SaltifyComponentType .Plugin , plugin.name)
143166 )
144167
145- val context = SaltifyPluginContext (plugin.name, this , pluginScope)
168+ val context = PluginBuilder ( this , pluginScope, plugin.name )
146169
147170 plugin.setup(context, configInstance)
148171 loadedPlugins.add(context)
0 commit comments