/jsvar

JSVAR - a C library for web GUIs with websockets.

Primary LanguageCMIT LicenseMIT

JsVar is a C library for  Linux/Unix systems allowing easy creation of
web GUIs with websockets.

JsVar provides compact and lightweight web and websocket servers. When
a browser connects to JsVar a  websocket connection is open and can be
used for  bidirectional communication  between C  code running  on the
server side and Javascript code  running on the client (browser) side.
Data are transmitted to javascript  immediately after having been sent
(PUSH method).

JsVar  can  be  used  to  provide both  plain  (unencrypted)  and  SSL
connectivity.  It operates on both 'char*' and 'wchar_t*' strings.  It
allows to send both binary and  text websocket messages. It is written
in a common  subsets of C and  C++ languages and compiles  with both C
and C++ compilers.

JsVar can be useful in  education, embedded systems and anywhere where
a web GUI is an appropriate  option, especially if server is streaming
live data.   JsVar is  a single-thread  application.  It  is perfectly
suited for embedded systems and  professional use.  Originally, it was
developed for a  brokerage server streaming prices,  I've extracted it
from the  production version of that  software. In order to  use jsVar
one has to be familiar with HTML and Javascript programming language.


Creation of  basic web GUIs is  pretty simple, here is  a full example
from our sample set.

//////////////////////////////////////////////////////////////////////
//
// This program demonstrates howto dynamically  update web page from C
// using  the  function  'jsVarEvalAll'.   This  function  executes  a
// javascript code  on all connected  clients.
//
// The program launches a secure  webserver listening on port 4321 and
// dynamically  updates   current  (server)  time  on   all  connected
// browsers.
//
// URL: https://localhost:4321
//

#include <time.h>
#include "jsvar.h"

int main() {
    time_t          lastSentTime;
    
    // Create new web/websocket server showing the following html page
    // on each  request.  Note that "active" pages include  the script
    // "/jsvarmainjavascript.js"!
    jsVarNewSinglePageServer(
        4321, BAIO_SSL_YES, 0,
        "<html><body><script src='/jsvarmainjavascript.js'></script>"
        "Server Time: <span id=mainSpan>nothing here for now</span>"
        "</body></html>"
        );

    lastSentTime = 0;
    
    // The main loop
    for(;;) {
        if (lastSentTime != time(NULL)) {
            // Time changed.
            lastSentTime = time(NULL);
            // Send eval request to all connected clients. jsVarEvalAll
            // has variable number of  arguments with the same  meaning
            // as printf.
            jsVarEvalAll("document.getElementById('mainSpan').innerHTML = '%.20s';", ctime(&lastSentTime));
        }
        // Actually,  all previous  jsVar actions  were buffered.   To
        // perform real  I/O operations  one have to  call "baioPoll".
        // It shall be  called as often as possible.   It never blocks
        // execution on I/O. If there is no I/O to do  baioPoll  waits
        // until timeout, in this case 100000us aka 100ms.
        baioPoll(100000);
    }
}





//////////////////////////////////////////////////////////////////////


DEPENDENCIES
^^^^^^^^^^^^

If you want to use SSL you will need OpenSSL library.  You can install
it with the command:

  sudo apt-get install libssl-dev

JsVar uses  "sglib.h".  The file is  included in this package.  If you
want to  use jsVar in  your own directory you  will have to  copy this
file together with "jsvar.h" and "jsvar.c"




GETTING STARTED
^^^^^^^^^^^^^^^

After having downloaded  and unpacked the library  goto "examples" and
type:

  make e1 run

It will compile and run the example "e1".  Once running, open your web
browser and browse to the URL:

  https://localhost:4321


Do the  same for other examples  (e2, e3, etc.)  except  of "e8" which
demonstrates the use of plain (non SSL) server and you have to connect
to:

  http://localhost:4321



DOCUMENTATION
^^^^^^^^^^^^^

For the  moment the  documentation consists  of a  set of  very simple
commented examples.  Examples are short  and easy to understand.  They
demonstrate  the major  functions of  the library.   All examples  are
simplified  to   maximum,  there  are   no  bells  and   whistles,  no
overwhelming  safety  checks.  They  are  meant  to demonstrate  jsVar
features without  having any  meaning in  their own.   If there  is an
interest in  this library I'll  prepare a deeper documentation  of all
provided functionalities.

The list of examples:

e1 - The simplest example showing current server time.
e2 - Sending binary data through binary websocket messages
e3 - 'Installing' your custom SSL certificates
e4 - Bidirectional communication between C and Javascript
e5 - Multi-page web server with HTML files.
e6 - Multi-page web server without file system.
e7 - International wide characters wchar_t.
e8 - Plain server not linked with Open-SSL.
e9 - A multiuser web page with "login" and "content" pages showing how
     to add custom data to connection structure.