|
16 | 16 | -- with this program. If not, see <https://www.gnu.org/licenses/>. |
17 | 17 |
|
18 | 18 | module Cannon.API.Public |
19 | | - ( sitemap, |
20 | | - apiDocs, |
| 19 | + ( API, |
| 20 | + publicAPIServer, |
21 | 21 | ) |
22 | 22 | where |
23 | 23 |
|
24 | | -import Cannon.App |
| 24 | +import Cannon.App (wsapp) |
25 | 25 | import Cannon.Types |
26 | 26 | import Cannon.WS |
27 | | -import Data.Id (ClientId, ConnId, UserId) |
28 | | -import Data.Swagger.Build.Api hiding (Response) |
29 | | -import Imports |
30 | | -import Network.HTTP.Types |
31 | | -import Network.Wai |
32 | | -import Network.Wai.Handler.WebSockets |
33 | | -import Network.Wai.Predicate |
34 | | -import Network.Wai.Routing |
35 | | -import Network.Wai.Utilities |
36 | | -import Network.Wai.Utilities.Swagger |
37 | | -import qualified Network.WebSockets as Ws |
| 27 | +import Control.Monad.IO.Class |
| 28 | +import Data.Id |
| 29 | +import GHC.Base |
| 30 | +import Network.WebSockets.Connection |
| 31 | +import Servant |
| 32 | +import Wire.API.Routes.Public.Cannon |
38 | 33 |
|
39 | | -sitemap :: Routes ApiBuilder Cannon () |
40 | | -sitemap = do |
41 | | - get "/await" (continue awaitH) $ |
42 | | - header "Z-User" |
43 | | - .&. header "Z-Connection" |
44 | | - .&. opt (query "client") |
45 | | - .&. request |
46 | | - document "GET" "await" $ do |
47 | | - summary "Establish websocket connection" |
48 | | - parameter Header "Upgrade" (string $ enum ["websocket"]) end |
49 | | - parameter Header "Connection" (string $ enum ["upgrade"]) end |
50 | | - parameter Header "Sec-WebSocket-Key" bytes' $ |
51 | | - description "16-bytes base64 encoded nonce" |
52 | | - parameter Header "Sec-WebSocket-Version" (int32 $ enum [13]) end |
53 | | - parameter Query "client" string' $ do |
54 | | - optional |
55 | | - description "Client ID" |
56 | | - response 426 "Upgrade required" end |
| 34 | +type API = ServantAPI :<|> Raw |
57 | 35 |
|
58 | | -apiDocs :: Routes ApiBuilder Cannon () |
59 | | -apiDocs = do |
60 | | - get "/await/api-docs" (continue docsH) $ |
61 | | - accept "application" "json" |
62 | | - .&. query "base_url" |
| 36 | +publicAPIServer :: ServerT ServantAPI Cannon |
| 37 | +publicAPIServer = streamData |
63 | 38 |
|
64 | | -docsH :: Media "application" "json" ::: Text -> Cannon Response |
65 | | -docsH (_ ::: url) = do |
66 | | - let doc = mkSwaggerApi url [] sitemap |
67 | | - return $ json doc |
68 | | - |
69 | | -awaitH :: UserId ::: ConnId ::: Maybe ClientId ::: Request -> Cannon Response |
70 | | -awaitH (u ::: a ::: c ::: r) = do |
| 39 | +streamData :: UserId -> ConnId -> Maybe ClientId -> PendingConnection -> Cannon () |
| 40 | +streamData userId connId clientId con = do |
71 | 41 | e <- wsenv |
72 | | - case websocketsApp wsoptions (wsapp (mkKey u a) c e) r of |
73 | | - Nothing -> return $ errorRs status426 "request-error" "websocket upgrade required" |
74 | | - Just rs -> return rs -- ensure all middlewares ignore RawResponse - see Note [Raw Response] |
75 | | - where |
76 | | - status426 = mkStatus 426 "Upgrade Required" |
77 | | - wsoptions = Ws.defaultConnectionOptions |
| 42 | + liftIO $ wsapp (mkKey userId connId) clientId e con |
0 commit comments