packages feed

socketed-0.1.0.0: Network/Socketed/Template.hs

{-# LANGUAGE QuasiQuotes #-}

module Network.Socketed.Template (socketedScript, evalHtml) where

import Data.List (intercalate)

import Network.Socketed.Internal (SocketedOptions(..), showWSHost, stringQuote)

socketedScript :: String -> Int -> String -> String  -> String
socketedScript h ldrop hf ef = [stringQuote|
   <script>
   (function(host, linesToDrop, handleMessage, handleMessageError) {
      window.handleMessage = handleMessage;
      window.handleMessageError = handleMessageError;

      var retryCount;

      var connect = function(l) {
         var
            lineDropped = 0,
            socket = new WebSocket(host);

         socket.onopen = function(e) {
            console.log('connected');
            retryCount = 0;
         };

         socket.onclose = function(e) {
            console.log('socket closed: ', e);

            if (++retryCount > 20) {
               window.document.body.textContent = 'disconnected...';
            } else {
               setTimeout(function() {
                  console.log('reconnecting...');
                  connect(linesToDrop);
               }, 2000);
            }
         };

         socket.onmessage = function(event) {
            if (++lineDropped > l) {
               try {
                  window.handleMessage(event);
               } catch(error) {
                  window.handleMessageError(event, error);
               }
            } else {
               console.log('drops: ', event.data)
            }
         };
      };

      connect(0);
   })(|]
   ++ intercalate "," ["'" ++ h ++ "'", show ldrop, hf, ef]
   ++ [stringQuote|)</script>|]

wrapHtml :: String -> String
wrapHtml inner = [stringQuote|
      <!DOCTYPE html><html><body>
   |]
   ++ inner
   ++ [stringQuote|
      </body></html>
   |]

evalHtml :: Int -> SocketedOptions -> String
evalHtml r (SocketedOptions h p) = wrapHtml $ socketedScript
   (showWSHost h p)
   r
   [stringQuote|
      function(event) {
         eval(event.data);
      }
   |]
   [stringQuote|
      function(event, error) {
         var c = document.createElement('div');
         c.textContent = 'failed to eval: '+ event.data;
         window.document.body.appendChild(c);
      }
   |]