Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
27 changes: 27 additions & 0 deletions core/src/main/kotlin/dev/usbharu/multim/MultiM.kt
Original file line number Diff line number Diff line change
@@ -0,0 +1,27 @@
package dev.usbharu.multim

import dev.usbharu.multim.api.NodeinfoApi
import dev.usbharu.multim.factory.MultiMApis
import dev.usbharu.multim.factory.PlatformApiFactory
import io.ktor.client.*
import io.ktor.client.engine.cio.*

object MultiM {



// todo 認証等を何とかするために、返却するのはAPIをクライアントではなくAPIクライアントのビルダーにする。
/**
* URLにアクセスして実装を推測し、自動でAPIクライアントを作成します。.
* URLからの推測にはwell-known/nodeinfoを使用しています。
*
* @param url 使用するURLの末尾にスラッシュを付けてください。
* @param factory 使用するファクトリークラスのインスタンス。
* @return 作成されたAPIクライアント
*/
suspend fun createClient(url:String, factory: PlatformApiFactory):MultiMApis{
val httpClient = HttpClient(CIO)
val nodeinfo = NodeinfoApi(httpClient).nodeinfo(url)
return factory.factory(nodeInfo = nodeinfo, httpClient, "", url)
}
}
1 change: 0 additions & 1 deletion core/src/main/kotlin/dev/usbharu/multim/api/ApiClient.kt
Original file line number Diff line number Diff line change
Expand Up @@ -19,7 +19,6 @@ abstract class ApiClient(var baseUrl: String, val client: HttpClient) {
return post.body()
}

@OptIn(InternalAPI::class)
suspend inline fun <reified T, reified R> post(
content: T,
path: String,
Expand Down
29 changes: 29 additions & 0 deletions core/src/main/kotlin/dev/usbharu/multim/api/NodeinfoApi.kt
Original file line number Diff line number Diff line change
@@ -0,0 +1,29 @@
package dev.usbharu.multim.api

import dev.usbharu.multim.model.wellknown.NodeinfoList
import dev.usbharu.multim.model.wellknown.nodeinfo.NodeInfo
import io.ktor.client.*
import io.ktor.client.call.*
import io.ktor.client.request.*

// todo well-knwonだけでパッケージ作ったほうがいいかも
class NodeinfoApi(val httpClient: HttpClient) {
suspend fun wellKnownNodeinfo(url:String): NodeinfoList {
return httpClient.get("$url.well-known/nodeinfo").body()
}

fun nodeinfoLink(nodeinfoList: NodeinfoList): NodeinfoList.NodeinfoLink {
return nodeinfoList.links.sortedBy { it.rel.substringAfterLast("/", "0").toFloat() }.first()
}


// todo 強制で2.0のが返ってくるのでバージョンを識別する
suspend fun nodeinfo(nodeinfoLink: NodeinfoList.NodeinfoLink): NodeInfo {

return httpClient.get(nodeinfoLink.href).body()
}

suspend fun nodeinfo(url:String):NodeInfo{
return nodeinfo(nodeinfoLink(wellKnownNodeinfo(url)))
}
}
Original file line number Diff line number Diff line change
@@ -1,7 +1,7 @@
package dev.usbharu.multim.factory

import dev.usbharu.multim.api.PlatformApis
import dev.usbharu.multim.model.nodeinfo.NodeInfo
import dev.usbharu.multim.model.wellknown.nodeinfo.NodeInfo
import io.ktor.client.*

interface PlatformApiFactory {
Expand Down
187 changes: 0 additions & 187 deletions core/src/main/kotlin/dev/usbharu/multim/model/nodeinfo/NodeInfo.kt

This file was deleted.

Original file line number Diff line number Diff line change
@@ -0,0 +1,10 @@
package dev.usbharu.multim.model.wellknown

import kotlinx.serialization.Serializable

@Serializable
data class NodeinfoList(val links: List<NodeinfoLink>) {

@Serializable
data class NodeinfoLink(val href: String, val rel: String)
}
Loading