From e381f835129865e023db10db5a50024742dd6ce2 Mon Sep 17 00:00:00 2001
From: Torsten Grote <t@grobox.de>
Date: Wed, 19 Sep 2018 17:59:36 -0300
Subject: [PATCH] Last code cleanup before submitting merge request

---
 .../account/HeadlessAccountManager.java       | 19 ---------
 .../account/HeadlessAccountModule.java        | 18 --------
 .../bramble/identity/OutputAuthor.kt          |  4 ++
 .../briar/headless/BriarHeadlessApp.java      | 25 -----------
 .../briar/headless/BriarHeadlessApp.kt        | 24 +++++++++++
 .../briar/headless/BriarService.kt            |  2 +-
 .../briarproject/briar/headless/Extensions.kt | 12 ------
 .../headless/HeadlessDatabaseConfig.java      | 32 --------------
 .../briar/headless/HeadlessDatabaseConfig.kt  | 21 ++++++++++
 .../briar/headless/HeadlessModule.kt          |  2 +-
 .../org/briarproject/briar/headless/Main.kt   | 14 +++----
 .../org/briarproject/briar/headless/Router.kt |  2 +-
 .../briar/headless/WebSocketControllerImpl.kt |  1 -
 .../briar/headless/blogs/Extensions.kt        |  5 ---
 .../briar/headless/blogs/OutputBlogPost.kt    |  7 +++-
 .../briar/headless/contact/Extensions.kt      |  5 ---
 .../briar/headless/contact/OutputContact.kt   |  4 +-
 .../briar/headless/forums/Extensions.kt       |  7 ----
 .../briar/headless/forums/OutputForum.kt      |  4 ++
 .../briar/headless/messaging/Extensions.kt    | 42 -------------------
 .../messaging/OutputPrivateMessage.kt         | 12 ++++++
 .../messaging/OutputPrivateRequest.kt         | 11 +++++
 .../messaging/OutputPrivateResponse.kt        | 10 ++++-
 .../headless/blogs/BlogControllerTest.kt      |  2 +-
 .../headless/contact/ContactControllerTest.kt |  2 +-
 25 files changed, 106 insertions(+), 181 deletions(-)
 delete mode 100644 briar-headless/src/main/java/org/briarproject/bramble/account/HeadlessAccountManager.java
 delete mode 100644 briar-headless/src/main/java/org/briarproject/bramble/account/HeadlessAccountModule.java
 delete mode 100644 briar-headless/src/main/java/org/briarproject/briar/headless/BriarHeadlessApp.java
 create mode 100644 briar-headless/src/main/java/org/briarproject/briar/headless/BriarHeadlessApp.kt
 delete mode 100644 briar-headless/src/main/java/org/briarproject/briar/headless/Extensions.kt
 delete mode 100644 briar-headless/src/main/java/org/briarproject/briar/headless/HeadlessDatabaseConfig.java
 create mode 100644 briar-headless/src/main/java/org/briarproject/briar/headless/HeadlessDatabaseConfig.kt
 delete mode 100644 briar-headless/src/main/java/org/briarproject/briar/headless/blogs/Extensions.kt
 delete mode 100644 briar-headless/src/main/java/org/briarproject/briar/headless/contact/Extensions.kt
 delete mode 100644 briar-headless/src/main/java/org/briarproject/briar/headless/forums/Extensions.kt
 delete mode 100644 briar-headless/src/main/java/org/briarproject/briar/headless/messaging/Extensions.kt

diff --git a/briar-headless/src/main/java/org/briarproject/bramble/account/HeadlessAccountManager.java b/briar-headless/src/main/java/org/briarproject/bramble/account/HeadlessAccountManager.java
deleted file mode 100644
index 0186fd9147..0000000000
--- a/briar-headless/src/main/java/org/briarproject/bramble/account/HeadlessAccountManager.java
+++ /dev/null
@@ -1,19 +0,0 @@
-package org.briarproject.bramble.account;
-
-import org.briarproject.bramble.api.account.AccountManager;
-import org.briarproject.bramble.api.crypto.CryptoComponent;
-import org.briarproject.bramble.api.db.DatabaseConfig;
-import org.briarproject.bramble.api.identity.IdentityManager;
-
-import javax.inject.Inject;
-
-class HeadlessAccountManager extends AccountManagerImpl
-		implements AccountManager {
-
-	@Inject
-	HeadlessAccountManager(DatabaseConfig databaseConfig,
-			CryptoComponent crypto, IdentityManager identityManager) {
-		super(databaseConfig, crypto, identityManager);
-	}
-
-}
diff --git a/briar-headless/src/main/java/org/briarproject/bramble/account/HeadlessAccountModule.java b/briar-headless/src/main/java/org/briarproject/bramble/account/HeadlessAccountModule.java
deleted file mode 100644
index 4780aaac84..0000000000
--- a/briar-headless/src/main/java/org/briarproject/bramble/account/HeadlessAccountModule.java
+++ /dev/null
@@ -1,18 +0,0 @@
-package org.briarproject.bramble.account;
-
-import org.briarproject.bramble.api.account.AccountManager;
-
-import javax.inject.Singleton;
-
-import dagger.Module;
-import dagger.Provides;
-
-@Module
-public class HeadlessAccountModule {
-
-	@Provides
-	@Singleton
-	AccountManager provideAccountManager(HeadlessAccountManager accountManager) {
-		return accountManager;
-	}
-}
diff --git a/briar-headless/src/main/java/org/briarproject/bramble/identity/OutputAuthor.kt b/briar-headless/src/main/java/org/briarproject/bramble/identity/OutputAuthor.kt
index 17e6b802a2..2b498c7126 100644
--- a/briar-headless/src/main/java/org/briarproject/bramble/identity/OutputAuthor.kt
+++ b/briar-headless/src/main/java/org/briarproject/bramble/identity/OutputAuthor.kt
@@ -15,3 +15,7 @@ data class OutputAuthor(
         publicKey = author.publicKey
     )
 }
+
+fun Author.output() = OutputAuthor(this)
+
+fun Author.Status.output() = name.toLowerCase()
diff --git a/briar-headless/src/main/java/org/briarproject/briar/headless/BriarHeadlessApp.java b/briar-headless/src/main/java/org/briarproject/briar/headless/BriarHeadlessApp.java
deleted file mode 100644
index ac3897e319..0000000000
--- a/briar-headless/src/main/java/org/briarproject/briar/headless/BriarHeadlessApp.java
+++ /dev/null
@@ -1,25 +0,0 @@
-package org.briarproject.briar.headless;
-
-import org.briarproject.bramble.BrambleCoreEagerSingletons;
-import org.briarproject.bramble.BrambleCoreModule;
-import org.briarproject.bramble.account.HeadlessAccountModule;
-import org.briarproject.bramble.system.DesktopSecureRandomModule;
-import org.briarproject.briar.BriarCoreEagerSingletons;
-import org.briarproject.briar.BriarCoreModule;
-
-import javax.inject.Singleton;
-
-import dagger.Component;
-
-@Component(modules = {
-		BrambleCoreModule.class,
-		BriarCoreModule.class,
-		DesktopSecureRandomModule.class,
-		HeadlessAccountModule.class,
-		HeadlessModule.class
-})
-@Singleton
-public interface BriarHeadlessApp
-		extends BrambleCoreEagerSingletons, BriarCoreEagerSingletons {
-	Router router();
-}
\ No newline at end of file
diff --git a/briar-headless/src/main/java/org/briarproject/briar/headless/BriarHeadlessApp.kt b/briar-headless/src/main/java/org/briarproject/briar/headless/BriarHeadlessApp.kt
new file mode 100644
index 0000000000..0ba5a0b6f9
--- /dev/null
+++ b/briar-headless/src/main/java/org/briarproject/briar/headless/BriarHeadlessApp.kt
@@ -0,0 +1,24 @@
+package org.briarproject.briar.headless
+
+import dagger.Component
+import org.briarproject.bramble.BrambleCoreEagerSingletons
+import org.briarproject.bramble.BrambleCoreModule
+import org.briarproject.bramble.account.AccountModule
+import org.briarproject.bramble.system.DesktopSecureRandomModule
+import org.briarproject.briar.BriarCoreEagerSingletons
+import org.briarproject.briar.BriarCoreModule
+import javax.inject.Singleton
+
+@Component(
+    modules = [
+        BrambleCoreModule::class,
+        BriarCoreModule::class,
+        DesktopSecureRandomModule::class,
+        AccountModule::class,
+        HeadlessModule::class
+    ]
+)
+@Singleton
+internal interface BriarHeadlessApp : BrambleCoreEagerSingletons, BriarCoreEagerSingletons {
+    fun router(): Router
+}
diff --git a/briar-headless/src/main/java/org/briarproject/briar/headless/BriarService.kt b/briar-headless/src/main/java/org/briarproject/briar/headless/BriarService.kt
index 292fcc8b57..f89136467e 100644
--- a/briar-headless/src/main/java/org/briarproject/briar/headless/BriarService.kt
+++ b/briar-headless/src/main/java/org/briarproject/briar/headless/BriarService.kt
@@ -15,7 +15,7 @@ import javax.inject.Singleton
 
 @Immutable
 @Singleton
-class BriarService @Inject
+internal class BriarService @Inject
 constructor(
     private val accountManager: AccountManager,
     private val lifecycleManager: LifecycleManager,
diff --git a/briar-headless/src/main/java/org/briarproject/briar/headless/Extensions.kt b/briar-headless/src/main/java/org/briarproject/briar/headless/Extensions.kt
deleted file mode 100644
index 9aa992271c..0000000000
--- a/briar-headless/src/main/java/org/briarproject/briar/headless/Extensions.kt
+++ /dev/null
@@ -1,12 +0,0 @@
-package org.briarproject.briar.headless
-
-import org.briarproject.bramble.api.identity.Author
-import org.briarproject.bramble.identity.OutputAuthor
-import org.briarproject.briar.api.blog.MessageType
-
-fun Author.output() = OutputAuthor(this)
-
-fun Author.Status.output() = name.toLowerCase()
-
-fun MessageType.output() = name.toLowerCase()
-
diff --git a/briar-headless/src/main/java/org/briarproject/briar/headless/HeadlessDatabaseConfig.java b/briar-headless/src/main/java/org/briarproject/briar/headless/HeadlessDatabaseConfig.java
deleted file mode 100644
index 2db2817056..0000000000
--- a/briar-headless/src/main/java/org/briarproject/briar/headless/HeadlessDatabaseConfig.java
+++ /dev/null
@@ -1,32 +0,0 @@
-package org.briarproject.briar.headless;
-
-import org.briarproject.bramble.api.db.DatabaseConfig;
-import org.briarproject.bramble.api.nullsafety.NotNullByDefault;
-
-import java.io.File;
-
-@NotNullByDefault
-class HeadlessDatabaseConfig implements DatabaseConfig {
-
-	private final File dbDir, keyDir;
-
-	HeadlessDatabaseConfig(File dbDir, File keyDir) {
-		this.dbDir = dbDir;
-		this.keyDir = keyDir;
-	}
-
-	@Override
-	public File getDatabaseDirectory() {
-		return dbDir;
-	}
-
-	@Override
-	public File getDatabaseKeyDirectory() {
-		return keyDir;
-	}
-
-	@Override
-	public long getMaxSize() {
-		return Long.MAX_VALUE;
-	}
-}
diff --git a/briar-headless/src/main/java/org/briarproject/briar/headless/HeadlessDatabaseConfig.kt b/briar-headless/src/main/java/org/briarproject/briar/headless/HeadlessDatabaseConfig.kt
new file mode 100644
index 0000000000..31bd59c508
--- /dev/null
+++ b/briar-headless/src/main/java/org/briarproject/briar/headless/HeadlessDatabaseConfig.kt
@@ -0,0 +1,21 @@
+package org.briarproject.briar.headless
+
+import org.briarproject.bramble.api.db.DatabaseConfig
+import java.io.File
+import java.lang.Long.MAX_VALUE
+
+internal class HeadlessDatabaseConfig(private val dbDir: File, private val keyDir: File) :
+    DatabaseConfig {
+
+    override fun getDatabaseDirectory(): File {
+        return dbDir
+    }
+
+    override fun getDatabaseKeyDirectory(): File {
+        return keyDir
+    }
+
+    override fun getMaxSize(): Long {
+        return MAX_VALUE
+    }
+}
diff --git a/briar-headless/src/main/java/org/briarproject/briar/headless/HeadlessModule.kt b/briar-headless/src/main/java/org/briarproject/briar/headless/HeadlessModule.kt
index a9c08fc0b9..d12a7a833d 100644
--- a/briar-headless/src/main/java/org/briarproject/briar/headless/HeadlessModule.kt
+++ b/briar-headless/src/main/java/org/briarproject/briar/headless/HeadlessModule.kt
@@ -40,7 +40,7 @@ import javax.net.SocketFactory
         MessagingModule::class
     ]
 )
-class HeadlessModule(private val appDir: File) {
+internal class HeadlessModule(private val appDir: File) {
 
     @Provides
     @Singleton
diff --git a/briar-headless/src/main/java/org/briarproject/briar/headless/Main.kt b/briar-headless/src/main/java/org/briarproject/briar/headless/Main.kt
index 74abc50f7d..10b1b2febb 100644
--- a/briar-headless/src/main/java/org/briarproject/briar/headless/Main.kt
+++ b/briar-headless/src/main/java/org/briarproject/briar/headless/Main.kt
@@ -24,7 +24,7 @@ import java.util.logging.LogManager
 private const val DEFAULT_PORT = 7000
 private val DEFAULT_DATA_DIR = getProperty("user.home") + separator + ".briar"
 
-class Main : CliktCommand(
+private class Main : CliktCommand(
     name = "briar-headless",
     help = "A Briar client without GUI that exposes a REST and Websocket API"
 ) {
@@ -61,7 +61,7 @@ class Main : CliktCommand(
             1 -> INFO
             else -> ALL
         }
-        setProperty(DEFAULT_LOG_LEVEL_KEY, levelSlf4j);
+        setProperty(DEFAULT_LOG_LEVEL_KEY, levelSlf4j)
         LogManager.getLogManager().getLogger("").level = level
 
         val dataDir = getDataDir()
@@ -84,11 +84,11 @@ class Main : CliktCommand(
         } else if (!file.isDirectory) {
             throw IOException("Data dir is not a directory: ${file.absolutePath}")
         }
-        val perms = HashSet<PosixFilePermission>();
-        perms.add(OWNER_READ);
-        perms.add(OWNER_WRITE);
-        perms.add(OWNER_EXECUTE);
-        setPosixFilePermissions(file.toPath(), perms);
+        val perms = HashSet<PosixFilePermission>()
+        perms.add(OWNER_READ)
+        perms.add(OWNER_WRITE)
+        perms.add(OWNER_EXECUTE)
+        setPosixFilePermissions(file.toPath(), perms)
         return file
     }
 
diff --git a/briar-headless/src/main/java/org/briarproject/briar/headless/Router.kt b/briar-headless/src/main/java/org/briarproject/briar/headless/Router.kt
index 05df5a3494..512d377599 100644
--- a/briar-headless/src/main/java/org/briarproject/briar/headless/Router.kt
+++ b/briar-headless/src/main/java/org/briarproject/briar/headless/Router.kt
@@ -19,7 +19,7 @@ import kotlin.system.exitProcess
 
 @Immutable
 @Singleton
-class Router @Inject
+internal class Router @Inject
 constructor(
     private val briarService: BriarService,
     private val webSocketController: WebSocketController,
diff --git a/briar-headless/src/main/java/org/briarproject/briar/headless/WebSocketControllerImpl.kt b/briar-headless/src/main/java/org/briarproject/briar/headless/WebSocketControllerImpl.kt
index c196f18ee0..6e75d3bef5 100644
--- a/briar-headless/src/main/java/org/briarproject/briar/headless/WebSocketControllerImpl.kt
+++ b/briar-headless/src/main/java/org/briarproject/briar/headless/WebSocketControllerImpl.kt
@@ -24,7 +24,6 @@ internal class WebSocketControllerImpl @Inject constructor() : WebSocketControll
 }
 
 @Immutable
-@Suppress("unused")
 internal class OutputEvent(val name: String, val data: Any) {
     val type = "event"
 }
diff --git a/briar-headless/src/main/java/org/briarproject/briar/headless/blogs/Extensions.kt b/briar-headless/src/main/java/org/briarproject/briar/headless/blogs/Extensions.kt
deleted file mode 100644
index eccf602016..0000000000
--- a/briar-headless/src/main/java/org/briarproject/briar/headless/blogs/Extensions.kt
+++ /dev/null
@@ -1,5 +0,0 @@
-package org.briarproject.briar.headless.blogs
-
-import org.briarproject.briar.api.blog.BlogPostHeader
-
-internal fun BlogPostHeader.output(body: String) = OutputBlogPost(this, body)
diff --git a/briar-headless/src/main/java/org/briarproject/briar/headless/blogs/OutputBlogPost.kt b/briar-headless/src/main/java/org/briarproject/briar/headless/blogs/OutputBlogPost.kt
index f3eea1ab3e..5ac53ea420 100644
--- a/briar-headless/src/main/java/org/briarproject/briar/headless/blogs/OutputBlogPost.kt
+++ b/briar-headless/src/main/java/org/briarproject/briar/headless/blogs/OutputBlogPost.kt
@@ -1,8 +1,9 @@
 package org.briarproject.briar.headless.blogs
 
 import org.briarproject.bramble.identity.OutputAuthor
+import org.briarproject.bramble.identity.output
 import org.briarproject.briar.api.blog.BlogPostHeader
-import org.briarproject.briar.headless.output
+import org.briarproject.briar.api.blog.MessageType
 import javax.annotation.concurrent.Immutable
 
 @Immutable
@@ -31,3 +32,7 @@ internal data class OutputBlogPost(
         timestampReceived = header.timeReceived
     )
 }
+
+internal fun BlogPostHeader.output(body: String) = OutputBlogPost(this, body)
+
+internal fun MessageType.output() = name.toLowerCase()
diff --git a/briar-headless/src/main/java/org/briarproject/briar/headless/contact/Extensions.kt b/briar-headless/src/main/java/org/briarproject/briar/headless/contact/Extensions.kt
deleted file mode 100644
index ed90d3c04e..0000000000
--- a/briar-headless/src/main/java/org/briarproject/briar/headless/contact/Extensions.kt
+++ /dev/null
@@ -1,5 +0,0 @@
-package org.briarproject.briar.headless.contact
-
-import org.briarproject.bramble.api.contact.Contact
-
-internal fun Contact.output() = OutputContact(this)
diff --git a/briar-headless/src/main/java/org/briarproject/briar/headless/contact/OutputContact.kt b/briar-headless/src/main/java/org/briarproject/briar/headless/contact/OutputContact.kt
index e318c73392..823d5d9de7 100644
--- a/briar-headless/src/main/java/org/briarproject/briar/headless/contact/OutputContact.kt
+++ b/briar-headless/src/main/java/org/briarproject/briar/headless/contact/OutputContact.kt
@@ -2,7 +2,7 @@ package org.briarproject.briar.headless.contact
 
 import org.briarproject.bramble.api.contact.Contact
 import org.briarproject.bramble.identity.OutputAuthor
-import org.briarproject.briar.headless.output
+import org.briarproject.bramble.identity.output
 import javax.annotation.concurrent.Immutable
 
 @Immutable
@@ -17,3 +17,5 @@ internal data class OutputContact(
         verified = c.isVerified
     )
 }
+
+internal fun Contact.output() = OutputContact(this)
diff --git a/briar-headless/src/main/java/org/briarproject/briar/headless/forums/Extensions.kt b/briar-headless/src/main/java/org/briarproject/briar/headless/forums/Extensions.kt
deleted file mode 100644
index 6c1d38cfa4..0000000000
--- a/briar-headless/src/main/java/org/briarproject/briar/headless/forums/Extensions.kt
+++ /dev/null
@@ -1,7 +0,0 @@
-package org.briarproject.briar.headless.forums
-
-import org.briarproject.briar.api.forum.Forum
-
-internal fun Forum.output() = OutputForum(this)
-
-internal fun Collection<Forum>.output() = map { it.output() }
diff --git a/briar-headless/src/main/java/org/briarproject/briar/headless/forums/OutputForum.kt b/briar-headless/src/main/java/org/briarproject/briar/headless/forums/OutputForum.kt
index 17a9be8d3a..d06d26c113 100644
--- a/briar-headless/src/main/java/org/briarproject/briar/headless/forums/OutputForum.kt
+++ b/briar-headless/src/main/java/org/briarproject/briar/headless/forums/OutputForum.kt
@@ -13,3 +13,7 @@ internal data class OutputForum(
         id = forum.id.bytes
     )
 }
+
+internal fun Forum.output() = OutputForum(this)
+
+internal fun Collection<Forum>.output() = map { it.output() }
diff --git a/briar-headless/src/main/java/org/briarproject/briar/headless/messaging/Extensions.kt b/briar-headless/src/main/java/org/briarproject/briar/headless/messaging/Extensions.kt
deleted file mode 100644
index c0ee4a1499..0000000000
--- a/briar-headless/src/main/java/org/briarproject/briar/headless/messaging/Extensions.kt
+++ /dev/null
@@ -1,42 +0,0 @@
-package org.briarproject.briar.headless.messaging
-
-import org.briarproject.bramble.api.contact.ContactId
-import org.briarproject.briar.api.introduction.IntroductionRequest
-import org.briarproject.briar.api.introduction.IntroductionResponse
-import org.briarproject.briar.api.messaging.PrivateMessage
-import org.briarproject.briar.api.messaging.PrivateMessageHeader
-import org.briarproject.briar.api.messaging.PrivateRequest
-import org.briarproject.briar.api.messaging.PrivateResponse
-import org.briarproject.briar.api.messaging.event.PrivateMessageReceivedEvent
-import org.briarproject.briar.api.sharing.InvitationRequest
-import org.briarproject.briar.api.sharing.InvitationResponse
-
-internal fun PrivateMessageHeader.output(
-    contactId: ContactId,
-    body: String?
-) = OutputPrivateMessageHeader(this, contactId, body)
-
-internal fun PrivateMessage.output(contactId: ContactId, body: String) =
-    OutputPrivateMessageHeader(this, contactId, body)
-
-internal fun PrivateMessageReceivedEvent<*>.output(body: String) =
-    messageHeader.output(contactId, body)
-
-internal fun IntroductionRequest.output(contactId: ContactId) =
-    OutputIntroductionRequest(this, contactId)
-
-internal fun PrivateRequest<*>.output(contactId: ContactId): OutputPrivateMessage {
-    return when (this) {
-        is IntroductionRequest -> OutputIntroductionRequest(this, contactId)
-        is InvitationRequest -> OutputInvitationRequest(this, contactId)
-        else -> throw AssertionError("Unknown PrivateRequest")
-    }
-}
-
-internal fun PrivateResponse.output(contactId: ContactId): OutputPrivateMessage {
-    return when (this) {
-        is IntroductionResponse -> OutputIntroductionResponse(this, contactId)
-        is InvitationResponse -> OutputInvitationResponse(this, contactId)
-        else -> throw AssertionError("Unknown PrivateResponse")
-    }
-}
diff --git a/briar-headless/src/main/java/org/briarproject/briar/headless/messaging/OutputPrivateMessage.kt b/briar-headless/src/main/java/org/briarproject/briar/headless/messaging/OutputPrivateMessage.kt
index a4f2e19af5..49455e9aea 100644
--- a/briar-headless/src/main/java/org/briarproject/briar/headless/messaging/OutputPrivateMessage.kt
+++ b/briar-headless/src/main/java/org/briarproject/briar/headless/messaging/OutputPrivateMessage.kt
@@ -3,6 +3,7 @@ package org.briarproject.briar.headless.messaging
 import org.briarproject.bramble.api.contact.ContactId
 import org.briarproject.briar.api.messaging.PrivateMessage
 import org.briarproject.briar.api.messaging.PrivateMessageHeader
+import org.briarproject.briar.api.messaging.event.PrivateMessageReceivedEvent
 import javax.annotation.concurrent.Immutable
 
 @Immutable
@@ -48,3 +49,14 @@ internal data class OutputPrivateMessageHeader(
         ), contactId, body
     )
 }
+
+internal fun PrivateMessageHeader.output(
+    contactId: ContactId,
+    body: String?
+) = OutputPrivateMessageHeader(this, contactId, body)
+
+internal fun PrivateMessage.output(contactId: ContactId, body: String) =
+    OutputPrivateMessageHeader(this, contactId, body)
+
+internal fun PrivateMessageReceivedEvent<*>.output(body: String) =
+    messageHeader.output(contactId, body)
diff --git a/briar-headless/src/main/java/org/briarproject/briar/headless/messaging/OutputPrivateRequest.kt b/briar-headless/src/main/java/org/briarproject/briar/headless/messaging/OutputPrivateRequest.kt
index 1b2bb98da9..b197b499bd 100644
--- a/briar-headless/src/main/java/org/briarproject/briar/headless/messaging/OutputPrivateRequest.kt
+++ b/briar-headless/src/main/java/org/briarproject/briar/headless/messaging/OutputPrivateRequest.kt
@@ -46,3 +46,14 @@ internal data class OutputInvitationRequest(
     val canBeOpened get() = iHeader.canBeOpened()
 
 }
+
+internal fun PrivateRequest<*>.output(contactId: ContactId): OutputPrivateMessage {
+    return when (this) {
+        is IntroductionRequest -> OutputIntroductionRequest(this, contactId)
+        is InvitationRequest -> OutputInvitationRequest(this, contactId)
+        else -> throw AssertionError("Unknown PrivateRequest")
+    }
+}
+
+internal fun IntroductionRequest.output(contactId: ContactId) =
+    OutputIntroductionRequest(this, contactId)
diff --git a/briar-headless/src/main/java/org/briarproject/briar/headless/messaging/OutputPrivateResponse.kt b/briar-headless/src/main/java/org/briarproject/briar/headless/messaging/OutputPrivateResponse.kt
index 5ac7152556..ded18502d1 100644
--- a/briar-headless/src/main/java/org/briarproject/briar/headless/messaging/OutputPrivateResponse.kt
+++ b/briar-headless/src/main/java/org/briarproject/briar/headless/messaging/OutputPrivateResponse.kt
@@ -3,13 +3,13 @@
 package org.briarproject.briar.headless.messaging
 
 import org.briarproject.bramble.api.contact.ContactId
+import org.briarproject.bramble.identity.output
 import org.briarproject.briar.api.blog.BlogInvitationResponse
 import org.briarproject.briar.api.forum.ForumInvitationResponse
 import org.briarproject.briar.api.introduction.IntroductionResponse
 import org.briarproject.briar.api.messaging.PrivateResponse
 import org.briarproject.briar.api.privategroup.invitation.GroupInvitationResponse
 import org.briarproject.briar.api.sharing.InvitationResponse
-import org.briarproject.briar.headless.output
 import javax.annotation.concurrent.Immutable
 
 @Immutable
@@ -45,3 +45,11 @@ internal data class OutputInvitationResponse(
     }
     val shareableId: ByteArray get() = iHeader.shareableId.bytes
 }
+
+internal fun PrivateResponse.output(contactId: ContactId): OutputPrivateMessage {
+    return when (this) {
+        is IntroductionResponse -> OutputIntroductionResponse(this, contactId)
+        is InvitationResponse -> OutputInvitationResponse(this, contactId)
+        else -> throw AssertionError("Unknown PrivateResponse")
+    }
+}
diff --git a/briar-headless/src/test/java/org/briarproject/briar/headless/blogs/BlogControllerTest.kt b/briar-headless/src/test/java/org/briarproject/briar/headless/blogs/BlogControllerTest.kt
index df951fa034..fbd76b6977 100644
--- a/briar-headless/src/test/java/org/briarproject/briar/headless/blogs/BlogControllerTest.kt
+++ b/briar-headless/src/test/java/org/briarproject/briar/headless/blogs/BlogControllerTest.kt
@@ -8,12 +8,12 @@ import io.mockk.just
 import io.mockk.mockk
 import org.briarproject.bramble.api.identity.Author.Status.OURSELVES
 import org.briarproject.bramble.api.sync.MessageId
+import org.briarproject.bramble.identity.output
 import org.briarproject.bramble.util.StringUtils.getRandomString
 import org.briarproject.briar.api.blog.*
 import org.briarproject.briar.api.blog.BlogConstants.MAX_BLOG_POST_BODY_LENGTH
 import org.briarproject.briar.api.blog.MessageType.POST
 import org.briarproject.briar.headless.ControllerTest
-import org.briarproject.briar.headless.output
 import org.junit.jupiter.api.Assertions.assertThrows
 import org.junit.jupiter.api.Test
 
diff --git a/briar-headless/src/test/java/org/briarproject/briar/headless/contact/ContactControllerTest.kt b/briar-headless/src/test/java/org/briarproject/briar/headless/contact/ContactControllerTest.kt
index c16e708dc2..76cff58115 100644
--- a/briar-headless/src/test/java/org/briarproject/briar/headless/contact/ContactControllerTest.kt
+++ b/briar-headless/src/test/java/org/briarproject/briar/headless/contact/ContactControllerTest.kt
@@ -3,8 +3,8 @@ package org.briarproject.briar.headless.contact
 import io.javalin.json.JavalinJson.toJson
 import io.mockk.every
 import org.briarproject.bramble.api.contact.Contact
+import org.briarproject.bramble.identity.output
 import org.briarproject.briar.headless.ControllerTest
-import org.briarproject.briar.headless.output
 import org.junit.jupiter.api.Test
 
 internal class ContactControllerTest : ControllerTest() {
-- 
GitLab