-----------------------------------------------------------------------------
{-# LANGUAGE GeneralizedNewtypeDeriving #-}
{-# LANGUAGE TypeApplications           #-}
{-# LANGUAGE DeriveGeneric              #-}
{-# LANGUAGE LambdaCase                 #-}
{-# LANGUAGE CPP                        #-}
-----------------------------------------------------------------------------
-- |
-- Module      :  Miso.WebSocket
-- Copyright   :  (C) 2016-2025 David M. Johnson
-- License     :  BSD3-style (see the file LICENSE)
-- Maintainer  :  David M. Johnson <code@dmj.io>
-- Stability   :  experimental
-- Portability :  non-portable
----------------------------------------------------------------------------
module Miso.WebSocket
  ( -- *** WebSocket
    connect
  , connectJSON
  , connectText
  , connectBLOB
  , connectArrayBuffer
  , sendText
  , sendJSON
  , sendBLOB
  , sendArrayBuffer
  , close
  , socketState
  -- *** Defaults
  , emptyWebSocket
  -- *** Types
  , WebSocket   (..)
  , URL
  , SocketState (..)
  , CloseCode   (..)
  , Closed      (..)
  , Payload     (..)
  , Blob        (..)
  , ArrayBuffer (..)
  ) where
-----------------------------------------------------------------------------
import           Data.Aeson
-----------------------------------------------------------------------------
import           Miso.Effect
import           Miso.Runtime
import           Miso.String (MisoString)
import           Miso.FFI (Blob(..), ArrayBuffer(..))
-----------------------------------------------------------------------------
-- | <https://developer.mozilla.org/en-US/docs/Web/API/WebSocket/connect>
connect
  :: FromJSON json
  => URL
  -> (WebSocket -> action)
  -> (Closed -> action)
  -> (Payload json -> action)
  -> (MisoString -> action)
  -> Effect parent model action
connect :: forall json action parent model.
FromJSON json =>
URL
-> (WebSocket -> action)
-> (Closed -> action)
-> (Payload json -> action)
-> (URL -> action)
-> Effect parent model action
connect = URL
-> (WebSocket -> action)
-> (Closed -> action)
-> (Payload json -> action)
-> (URL -> action)
-> Effect parent model action
forall json action parent model.
FromJSON json =>
URL
-> (WebSocket -> action)
-> (Closed -> action)
-> (Payload json -> action)
-> (URL -> action)
-> Effect parent model action
websocketConnect
-----------------------------------------------------------------------------
-- | <https://developer.mozilla.org/en-US/docs/Web/API/WebSocket/connect>
connectJSON
  :: FromJSON json
  => URL
  -> (WebSocket -> action)
  -> (Closed -> action)
  -> (json -> action)
  -> (MisoString -> action)
  -> Effect parent model action
connectJSON :: forall json action parent model.
FromJSON json =>
URL
-> (WebSocket -> action)
-> (Closed -> action)
-> (json -> action)
-> (URL -> action)
-> Effect parent model action
connectJSON = URL
-> (WebSocket -> action)
-> (Closed -> action)
-> (json -> action)
-> (URL -> action)
-> Effect parent model action
forall json action parent model.
FromJSON json =>
URL
-> (WebSocket -> action)
-> (Closed -> action)
-> (json -> action)
-> (URL -> action)
-> Effect parent model action
websocketConnectJSON
-----------------------------------------------------------------------------
-- | <https://developer.mozilla.org/en-US/docs/Web/API/WebSocket/connect>
connectText
  :: URL
  -> (WebSocket -> action)
  -> (Closed -> action)
  -> (MisoString -> action)
  -> (MisoString -> action)
  -> Effect parent model action
connectText :: forall action parent model.
URL
-> (WebSocket -> action)
-> (Closed -> action)
-> (URL -> action)
-> (URL -> action)
-> Effect parent model action
connectText = URL
-> (WebSocket -> action)
-> (Closed -> action)
-> (URL -> action)
-> (URL -> action)
-> Effect parent model action
forall action parent model.
URL
-> (WebSocket -> action)
-> (Closed -> action)
-> (URL -> action)
-> (URL -> action)
-> Effect parent model action
websocketConnectText
-----------------------------------------------------------------------------
-- | <https://developer.mozilla.org/en-US/docs/Web/API/WebSocket/connect>
connectBLOB
  :: URL
  -> (WebSocket -> action)
  -> (Closed -> action)
  -> (Blob -> action)
  -> (MisoString -> action)
  -> Effect parent model action
connectBLOB :: forall action parent model.
URL
-> (WebSocket -> action)
-> (Closed -> action)
-> (Blob -> action)
-> (URL -> action)
-> Effect parent model action
connectBLOB = URL
-> (WebSocket -> action)
-> (Closed -> action)
-> (Blob -> action)
-> (URL -> action)
-> Effect parent model action
forall action parent model.
URL
-> (WebSocket -> action)
-> (Closed -> action)
-> (Blob -> action)
-> (URL -> action)
-> Effect parent model action
websocketConnectBLOB
-----------------------------------------------------------------------------
-- | <https://developer.mozilla.org/en-US/docs/Web/API/WebSocket/connect>
connectArrayBuffer
  :: URL
  -> (WebSocket -> action)
  -> (Closed -> action)
  -> (ArrayBuffer -> action)
  -> (MisoString -> action)
  -> Effect parent model action
connectArrayBuffer :: forall action parent model.
URL
-> (WebSocket -> action)
-> (Closed -> action)
-> (ArrayBuffer -> action)
-> (URL -> action)
-> Effect parent model action
connectArrayBuffer = URL
-> (WebSocket -> action)
-> (Closed -> action)
-> (ArrayBuffer -> action)
-> (URL -> action)
-> Effect parent model action
forall action parent model.
URL
-> (WebSocket -> action)
-> (Closed -> action)
-> (ArrayBuffer -> action)
-> (URL -> action)
-> Effect parent model action
websocketConnectArrayBuffer
-----------------------------------------------------------------------------
-- | <https://developer.mozilla.org/en-US/docs/Web/API/WebSocket/send>
sendJSON
  :: ToJSON json
  => WebSocket
  -> json
  -> Effect parent model action
sendJSON :: forall json parent model action.
ToJSON json =>
WebSocket -> json -> Effect parent model action
sendJSON WebSocket
socket json
x = WebSocket -> Payload json -> Effect parent model action
forall value parent model action.
ToJSON value =>
WebSocket -> Payload value -> Effect parent model action
websocketSend WebSocket
socket (json -> Payload json
forall value. value -> Payload value
JSON json
x)
-----------------------------------------------------------------------------
-- | <https://developer.mozilla.org/en-US/docs/Web/API/WebSocket/send>
sendBLOB
  :: WebSocket
  -> Blob
  -> Effect parent model action
sendBLOB :: forall parent model action.
WebSocket -> Blob -> Effect parent model action
sendBLOB WebSocket
socket Blob
x = forall value parent model action.
ToJSON value =>
WebSocket -> Payload value -> Effect parent model action
websocketSend @() WebSocket
socket (Blob -> Payload ()
forall value. Blob -> Payload value
blob Blob
x)
-----------------------------------------------------------------------------
-- | <https://developer.mozilla.org/en-US/docs/Web/API/WebSocket/send>
sendArrayBuffer
  :: WebSocket
  -> ArrayBuffer
  -> Effect parent model action
sendArrayBuffer :: forall parent model action.
WebSocket -> ArrayBuffer -> Effect parent model action
sendArrayBuffer WebSocket
socket ArrayBuffer
x = forall value parent model action.
ToJSON value =>
WebSocket -> Payload value -> Effect parent model action
websocketSend @() WebSocket
socket (ArrayBuffer -> Payload ()
forall value. ArrayBuffer -> Payload value
arrayBuffer ArrayBuffer
x)
-----------------------------------------------------------------------------
-- | <https://developer.mozilla.org/en-US/docs/Web/API/WebSocket/send>
sendText
  :: WebSocket
  -> MisoString
  -> Effect parent model action
sendText :: forall parent model action.
WebSocket -> URL -> Effect parent model action
sendText WebSocket
socket URL
x = forall value parent model action.
ToJSON value =>
WebSocket -> Payload value -> Effect parent model action
websocketSend @() WebSocket
socket (URL -> Payload ()
forall value. URL -> Payload value
TEXT URL
x)
-----------------------------------------------------------------------------
-- | <https://developer.mozilla.org/en-US/docs/Web/API/WebSocket/close>
close
  :: WebSocket
  -> Effect parent model action
close :: forall parent model action. WebSocket -> Effect parent model action
close = WebSocket -> Effect parent model action
forall parent model action. WebSocket -> Effect parent model action
websocketClose
-----------------------------------------------------------------------------