--- /dev/null
+package net.pterodactylus.sone.freenet
+
+import freenet.client.*
+import freenet.keys.*
+import kotlinx.coroutines.*
+import net.pterodactylus.sone.core.*
+
+class AsyncFreenetInterface(private val freenetClient: FreenetClient) {
+
+ suspend fun fetchUri(freenetUri: FreenetURI): Fetched {
+ var currentUri = freenetUri
+ var result: FetchResult? = null
+ while (result == null) {
+ try {
+ result = withContext(Dispatchers.Default) { freenetClient.fetch(currentUri) }
+ } catch (fetchException: FetchException) {
+ if (fetchException.mode == FetchException.FetchExceptionMode.PERMANENT_REDIRECT) {
+ currentUri = fetchException.newURI
+ continue
+ } else
+ throw fetchException
+ }
+ }
+ return Fetched(currentUri, result)
+ }
+
+}