[headless] make events related to adding contacts available via websocket

This commit is contained in:
Torsten Grote
2019-05-14 16:15:47 -03:00
parent c6211be488
commit 3770a9f217
8 changed files with 190 additions and 19 deletions

View File

@@ -5,8 +5,14 @@ import io.javalin.Context
import io.javalin.NotFoundResponse
import org.briarproject.bramble.api.contact.ContactManager
import org.briarproject.bramble.api.contact.PendingContactId
import org.briarproject.bramble.api.contact.event.ContactAddedRemotelyEvent
import org.briarproject.bramble.api.contact.event.PendingContactRemovedEvent
import org.briarproject.bramble.api.contact.event.PendingContactStateChangedEvent
import org.briarproject.bramble.api.db.NoSuchContactException
import org.briarproject.bramble.api.db.NoSuchPendingContactException
import org.briarproject.bramble.api.event.Event
import org.briarproject.bramble.api.event.EventListener
import org.briarproject.briar.headless.event.WebSocketController
import org.briarproject.briar.headless.getContactIdFromPathParam
import org.briarproject.briar.headless.getFromJson
import org.briarproject.briar.headless.json.JsonDict
@@ -16,12 +22,33 @@ import javax.annotation.concurrent.Immutable
import javax.inject.Inject
import javax.inject.Singleton
internal const val EVENT_CONTACT_ADDED_REMOTELY = "ContactAddedRemotelyEvent"
internal const val EVENT_PENDING_CONTACT_STATE_CHANGED = "PendingContactStateChangedEvent"
internal const val EVENT_PENDING_CONTACT_REMOVED = "PendingContactRemovedEvent"
@Immutable
@Singleton
internal class ContactControllerImpl
@Inject
constructor(private val contactManager: ContactManager, private val objectMapper: ObjectMapper) :
ContactController {
constructor(
private val contactManager: ContactManager,
private val objectMapper: ObjectMapper,
private val webSocket: WebSocketController
) : ContactController, EventListener {
override fun eventOccurred(e: Event) = when (e) {
is ContactAddedRemotelyEvent -> {
webSocket.sendEvent(EVENT_CONTACT_ADDED_REMOTELY, e.output())
}
is PendingContactStateChangedEvent -> {
webSocket.sendEvent(EVENT_PENDING_CONTACT_STATE_CHANGED, e.output())
}
is PendingContactRemovedEvent -> {
webSocket.sendEvent(EVENT_PENDING_CONTACT_REMOVED, e.output())
}
else -> {
}
}
override fun list(ctx: Context): Context {
val contacts = contactManager.contacts.map { contact ->

View File

@@ -2,6 +2,7 @@ package org.briarproject.briar.headless.contact
import dagger.Module
import dagger.Provides
import org.briarproject.bramble.api.event.EventBus
import javax.inject.Singleton
@Module
@@ -9,7 +10,11 @@ class HeadlessContactModule {
@Provides
@Singleton
internal fun provideContactController(contactController: ContactControllerImpl): ContactController {
internal fun provideContactController(
eventBus: EventBus,
contactController: ContactControllerImpl
): ContactController {
eventBus.addListener(contactController)
return contactController
}

View File

@@ -1,6 +1,7 @@
package org.briarproject.briar.headless.contact
import org.briarproject.bramble.api.contact.Contact
import org.briarproject.bramble.api.contact.event.ContactAddedRemotelyEvent
import org.briarproject.bramble.identity.output
import org.briarproject.briar.headless.json.JsonDict
@@ -8,4 +9,6 @@ internal fun Contact.output() = JsonDict(
"contactId" to id.int,
"author" to author.output(),
"verified" to isVerified
)
)
internal fun ContactAddedRemotelyEvent.output() = contact.output()

View File

@@ -1,18 +1,32 @@
package org.briarproject.briar.headless.contact
import org.briarproject.bramble.api.contact.PendingContact
import org.briarproject.bramble.api.contact.PendingContactState
import org.briarproject.bramble.api.contact.PendingContactState.*
import org.briarproject.bramble.api.contact.event.PendingContactRemovedEvent
import org.briarproject.bramble.api.contact.event.PendingContactStateChangedEvent
import org.briarproject.briar.headless.json.JsonDict
internal fun PendingContact.output() = JsonDict(
"pendingContactId" to id.bytes,
"alias" to alias,
"state" to when(state) {
WAITING_FOR_CONNECTION -> "waiting_for_connection"
CONNECTED -> "connected"
ADDING_CONTACT -> "adding_contact"
FAILED -> "failed"
else -> throw AssertionError()
},
"state" to state.output(),
"timestamp" to timestamp
)
)
internal fun PendingContactState.output() = when(this) {
WAITING_FOR_CONNECTION -> "waiting_for_connection"
CONNECTED -> "connected"
ADDING_CONTACT -> "adding_contact"
FAILED -> "failed"
else -> throw AssertionError()
}
internal fun PendingContactStateChangedEvent.output() = JsonDict(
"pendingContactId" to id.bytes,
"state" to pendingContactState.output()
)
internal fun PendingContactRemovedEvent.output() = JsonDict(
"pendingContactId" to id.bytes
)