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 }