You are viewing a plain text version of this content. The canonical link for it is here.
Posted to notifications@james.apache.org by bt...@apache.org on 2021/02/09 04:29:52 UTC
[james-project] 24/33: JAMES-3491 WebSocketPushEnable defaults to
`all`
This is an automated email from the ASF dual-hosted git repository.
btellier pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/james-project.git
commit fe9e7ce4246ea4199522962592e391ee5e41992f
Author: Benoit Tellier <bt...@linagora.com>
AuthorDate: Fri Feb 5 11:21:12 2021 +0700
JAMES-3491 WebSocketPushEnable defaults to `all`
https://tools.ietf.org/html/rfc8887 4.3.5.2.
```
If null, changes will be
pushed for all supported data types.
```
---
.../jmap/rfc8621/contract/WebSocketContract.scala | 93 +++++++++++++++++++---
.../org/apache/james/jmap/change/StateChange.scala | 4 +
.../james/jmap/core/WebSocketTransport.scala | 2 +-
.../apache/james/jmap/routes/WebSocketRoutes.scala | 4 +-
4 files changed, 88 insertions(+), 15 deletions(-)
diff --git a/server/protocols/jmap-rfc-8621-integration-tests/jmap-rfc-8621-integration-tests-common/src/main/scala/org/apache/james/jmap/rfc8621/contract/WebSocketContract.scala b/server/protocols/jmap-rfc-8621-integration-tests/jmap-rfc-8621-integration-tests-common/src/main/scala/org/apache/james/jmap/rfc8621/contract/WebSocketContract.scala
index f47f734..e1fcb87 100644
--- a/server/protocols/jmap-rfc-8621-integration-tests/jmap-rfc-8621-integration-tests-common/src/main/scala/org/apache/james/jmap/rfc8621/contract/WebSocketContract.scala
+++ b/server/protocols/jmap-rfc-8621-integration-tests/jmap-rfc-8621-integration-tests-common/src/main/scala/org/apache/james/jmap/rfc8621/contract/WebSocketContract.scala
@@ -466,18 +466,87 @@ trait WebSocketContract {
|}""".stripMargin))
List(
- ws.receive()
- .map { case t: Text =>
- t.payload
- },
- ws.receive()
- .map { case t: Text =>
- t.payload
- },
- ws.receive()
- .map { case t: Text =>
- t.payload
- })
+ ws.receive()
+ .map { case t: Text =>
+ t.payload
+ },
+ ws.receive()
+ .map { case t: Text =>
+ t.payload
+ },
+ ws.receive()
+ .map { case t: Text =>
+ t.payload
+ })
+ })
+ .send(backend)
+ .body
+
+ Thread.sleep(100)
+
+ val jmapGuiceProbe: JmapGuiceProbe = server.getProbe(classOf[JmapGuiceProbe])
+ val emailState: String = jmapGuiceProbe.getLatestEmailState(accountId).getValue.toString
+ val mailboxState: String = jmapGuiceProbe.getLatestMailboxState(accountId).getValue.toString
+
+ val mailboxStateChange: String = s"""{"@type":"StateChange","changed":{"$ACCOUNT_ID":{"Mailbox":"$mailboxState"}}}"""
+ val emailStateChange: String = s"""{"@type":"StateChange","changed":{"$ACCOUNT_ID":{"Email":"$emailState"}}}"""
+
+ assertThat(response.toOption.get.asJava)
+ .hasSize(3) // email notification + mailbox notification + API response
+ .contains(mailboxStateChange, emailStateChange)
+ }
+
+ @Test
+ def dataTypesShouldDefaultToAll(server: GuiceJamesServer): Unit = {
+ val bobPath = MailboxPath.inbox(BOB)
+ val accountId: AccountId = AccountId.fromUsername(BOB)
+ val mailboxId = server.getProbe(classOf[MailboxProbeImpl]).createMailbox(bobPath)
+
+ Thread.sleep(100)
+
+ val response: Either[String, List[String]] =
+ authenticatedRequest(server)
+ .response(asWebSocket[Identity, List[String]] {
+ ws =>
+ ws.send(WebSocketFrame.text(
+ """{
+ | "@type": "WebSocketPushEnable",
+ | "dataTypes": null
+ |}""".stripMargin))
+
+ Thread.sleep(100)
+
+ ws.send(WebSocketFrame.text(
+ s"""{
+ | "@type": "Request",
+ | "requestId": "req-36",
+ | "using": ["urn:ietf:params:jmap:core", "urn:ietf:params:jmap:mail"],
+ | "methodCalls": [
+ | ["Email/set", {
+ | "accountId": "$ACCOUNT_ID",
+ | "create": {
+ | "aaaaaa":{
+ | "mailboxIds": {
+ | "${mailboxId.serialize}": true
+ | }
+ | }
+ | }
+ | }, "c1"]]
+ |}""".stripMargin))
+
+ List(
+ ws.receive()
+ .map { case t: Text =>
+ t.payload
+ },
+ ws.receive()
+ .map { case t: Text =>
+ t.payload
+ },
+ ws.receive()
+ .map { case t: Text =>
+ t.payload
+ })
})
.send(backend)
.body
diff --git a/server/protocols/jmap-rfc-8621/src/main/scala/org/apache/james/jmap/change/StateChange.scala b/server/protocols/jmap-rfc-8621/src/main/scala/org/apache/james/jmap/change/StateChange.scala
index 101b592..73ab7e2 100644
--- a/server/protocols/jmap-rfc-8621/src/main/scala/org/apache/james/jmap/change/StateChange.scala
+++ b/server/protocols/jmap-rfc-8621/src/main/scala/org/apache/james/jmap/change/StateChange.scala
@@ -24,6 +24,10 @@ import org.apache.james.events.Event
import org.apache.james.events.Event.EventId
import org.apache.james.jmap.core.{AccountId, State, StateChange}
+object TypeName {
+ val ALL: Set[TypeName] = Set(EmailTypeName, MailboxTypeName)
+}
+
sealed trait TypeName {
def asMap(maybeState: Option[State]): Map[TypeName, State] =
maybeState.map(state => Map[TypeName, State](this -> state))
diff --git a/server/protocols/jmap-rfc-8621/src/main/scala/org/apache/james/jmap/core/WebSocketTransport.scala b/server/protocols/jmap-rfc-8621/src/main/scala/org/apache/james/jmap/core/WebSocketTransport.scala
index dd40f12..90ca138 100644
--- a/server/protocols/jmap-rfc-8621/src/main/scala/org/apache/james/jmap/core/WebSocketTransport.scala
+++ b/server/protocols/jmap-rfc-8621/src/main/scala/org/apache/james/jmap/core/WebSocketTransport.scala
@@ -43,4 +43,4 @@ case class StateChange(changes: Map[AccountId, TypeState]) extends WebSocketOutb
.map(StateChange)
}
-case class WebSocketPushEnable(dataTypes: Set[TypeName]) extends WebSocketInboundMessage
\ No newline at end of file
+case class WebSocketPushEnable(dataTypes: Option[Set[TypeName]]) extends WebSocketInboundMessage
\ No newline at end of file
diff --git a/server/protocols/jmap-rfc-8621/src/main/scala/org/apache/james/jmap/routes/WebSocketRoutes.scala b/server/protocols/jmap-rfc-8621/src/main/scala/org/apache/james/jmap/routes/WebSocketRoutes.scala
index bd038a5..d6d2c40 100644
--- a/server/protocols/jmap-rfc-8621/src/main/scala/org/apache/james/jmap/routes/WebSocketRoutes.scala
+++ b/server/protocols/jmap-rfc-8621/src/main/scala/org/apache/james/jmap/routes/WebSocketRoutes.scala
@@ -30,7 +30,7 @@ import javax.inject.{Inject, Named}
import org.apache.james.events.{EventBus, Registration}
import org.apache.james.jmap.HttpConstants.JSON_CONTENT_TYPE
import org.apache.james.jmap.JMAPUrls.JMAP_WS
-import org.apache.james.jmap.change.{AccountIdRegistrationKey, StateChangeListener}
+import org.apache.james.jmap.change.{AccountIdRegistrationKey, StateChangeListener, TypeName}
import org.apache.james.jmap.core.{ProblemDetails, RequestId, WebSocketError, WebSocketOutboundMessage, WebSocketPushEnable, WebSocketRequest, WebSocketResponse}
import org.apache.james.jmap.http.rfc8621.InjectionKeys
import org.apache.james.jmap.http.{Authenticator, UserProvisioning}
@@ -129,7 +129,7 @@ class WebSocketRoutes @Inject() (@Named(InjectionKeys.RFC_8621) val authenticato
.`then`()
case pushEnable: WebSocketPushEnable =>
SMono(eventBus.register(
- StateChangeListener(pushEnable.dataTypes, clientContext.outbound),
+ StateChangeListener(pushEnable.dataTypes.getOrElse(TypeName.ALL), clientContext.outbound),
AccountIdRegistrationKey.of(clientContext.session.getUser)))
.doOnNext(newRegistration => clientContext.withRegistration(newRegistration))
.`then`()
---------------------------------------------------------------------
To unsubscribe, e-mail: notifications-unsubscribe@james.apache.org
For additional commands, e-mail: notifications-help@james.apache.org