From 4289bfecdcfedc5c5135c228e2220743dda1aba2 Mon Sep 17 00:00:00 2001
From: Pascal Bleser
Date: Thu, 18 Sep 2025 19:21:22 +0200
Subject: [PATCH] feat(groupware): add WebsocketEndpoint to the JMAP Session
---
pkg/jmap/jmap_session.go | 43 ++++++++++++++++++++++++++++------------
1 file changed, 30 insertions(+), 13 deletions(-)
diff --git a/pkg/jmap/jmap_session.go b/pkg/jmap/jmap_session.go
index 67a5ec4c14..b2d02bf90d 100644
--- a/pkg/jmap/jmap_session.go
+++ b/pkg/jmap/jmap_session.go
@@ -48,15 +48,19 @@ type Session struct {
// An identifier of the DownloadUrlTemplate to use in metrics and tracing
DownloadEndpoint string
+ WebsocketEndpoint *url.URL
+ SupportsWebsocketPush bool
+
SessionResponse
}
var (
- invalidSessionResponseErrorMissingUsername = SimpleError{code: JmapErrorInvalidSessionResponse, err: errors.New("JMAP session response does not provide a username")}
- invalidSessionResponseErrorMissingApiUrl = SimpleError{code: JmapErrorInvalidSessionResponse, err: errors.New("JMAP session response does not provide an API URL")}
- invalidSessionResponseErrorInvalidApiUrl = SimpleError{code: JmapErrorInvalidSessionResponse, err: errors.New("JMAP session response provides an invalid API URL")}
- invalidSessionResponseErrorMissingUploadUrl = SimpleError{code: JmapErrorInvalidSessionResponse, err: errors.New("JMAP session response does not provide an upload URL")}
- invalidSessionResponseErrorMissingDownloadUrl = SimpleError{code: JmapErrorInvalidSessionResponse, err: errors.New("JMAP session response does not provide a download URL")}
+ invalidSessionResponseErrorMissingUsername = SimpleError{code: JmapErrorInvalidSessionResponse, err: errors.New("JMAP session response does not provide a username")}
+ invalidSessionResponseErrorMissingApiUrl = SimpleError{code: JmapErrorInvalidSessionResponse, err: errors.New("JMAP session response does not provide an API URL")}
+ invalidSessionResponseErrorInvalidApiUrl = SimpleError{code: JmapErrorInvalidSessionResponse, err: errors.New("JMAP session response provides an invalid API URL")}
+ invalidSessionResponseErrorMissingUploadUrl = SimpleError{code: JmapErrorInvalidSessionResponse, err: errors.New("JMAP session response does not provide an upload URL")}
+ invalidSessionResponseErrorMissingDownloadUrl = SimpleError{code: JmapErrorInvalidSessionResponse, err: errors.New("JMAP session response does not provide a download URL")}
+ invalidSessionResponseErrorInvalidWebsocketUrl = SimpleError{code: JmapErrorInvalidSessionResponse, err: errors.New("JMAP session response provides an invalid Websocket URL")}
)
// Create a new Session from a SessionResponse.
@@ -87,15 +91,28 @@ func newSession(sessionResponse SessionResponse) (Session, Error) {
}
downloadEndpoint := toEndpoint(downloadUrl)
+ var websocketEndpoint *url.URL = nil
+ supportsWebsocketPush := false
+ websocketUrl := sessionResponse.Capabilities.Websocket.Url
+ if websocketUrl != "" {
+ websocketEndpoint, err = url.Parse(websocketUrl)
+ if err != nil {
+ return Session{}, invalidSessionResponseErrorInvalidWebsocketUrl
+ }
+ supportsWebsocketPush = sessionResponse.Capabilities.Websocket.SupportsPush
+ }
+
return Session{
- Username: username,
- JmapUrl: *apiUrl,
- JmapEndpoint: apiEndpoint,
- UploadUrlTemplate: uploadUrl,
- UploadEndpoint: uploadEndpoint,
- DownloadUrlTemplate: downloadUrl,
- DownloadEndpoint: downloadEndpoint,
- SessionResponse: sessionResponse,
+ Username: username,
+ JmapUrl: *apiUrl,
+ JmapEndpoint: apiEndpoint,
+ UploadUrlTemplate: uploadUrl,
+ UploadEndpoint: uploadEndpoint,
+ DownloadUrlTemplate: downloadUrl,
+ DownloadEndpoint: downloadEndpoint,
+ WebsocketEndpoint: websocketEndpoint,
+ SupportsWebsocketPush: supportsWebsocketPush,
+ SessionResponse: sessionResponse,
}, nil
}