Thrift Javascript Library
=========================
This browser based Apache Thrift implementation supports
RPC clients using the JSON protocol over Http[s] with XHR
and WebSocket.

License
-------
Licensed to the Apache Software Foundation (ASF) under one
or more contributor license agreements. See the NOTICE file
distributed with this work for additional information
regarding copyright ownership. The ASF licenses this file
to you under the Apache License, Version 2.0 (the
"License"); you may not use this file except in compliance
with the License. You may obtain a copy of the License at

  http://www.apache.org/licenses/LICENSE-2.0

Unless required by applicable law or agreed to in writing,
software distributed under the License is distributed on an
"AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
KIND, either express or implied. See the License for the
specific language governing permissions and limitations
under the License.

Grunt Build
------------
The is the base directory for the Apache Thrift JavaScript
library. This directory contains a Gruntfile.js and a
package.json. Many of the build and test tools used here
require a recent version of Node.js to be installed. To 
install the support files for the Grunt build tool execute
the command:
   $ npm install
This reads the package.json and pulls in the appropriate
sources from the internet. To build the JavaScript branch
of Apache Thrift execute the command:
   $ grunt
This runs the grunt build tool, linting all of the source 
files, setting up and running the tests, concatenating and
minifying the main libraries and generating the html 
documentation.

Tree
----
The following directories are present (some only after the
grunt build):
  /src  - The JavaScript Apache Thrift source
  /doc - HTML documentation
  /dist - Distribution files (thrift.js and thrift.min.js)
  /test - Various tests, this is a good place to look for
          example code
  /node_modules - Build support files installed by npm


Example JavaScript Client and Server
------------------------------------
The listing below demonstrates a simple browser based JavaScript
Thrift client and Node.js JavaScript server for the hello_svc 
service. 

### hello.thrift - Service IDL 
### build with: $ thrift -gen js -gen js:node hello.thrift
    service hello_svc {
      string get_message(1: string name)
    }

### hello.html - Browser Client
    <!DOCTYPE html>
    <html lang="en">
      <head>
        <meta charset="utf-8">
        <title>Hello Thrift</title>
      </head>
      <body>
        Name: <input type="text" id="name_in">
        <input type="button" id="get_msg" value="Get Message" >
        <div id="output"></div>
  
        <script src="thrift.js"></script>
        <script src="gen-js/hello_svc.js"></script>
        <script>
          (function() {
            var transport = new Thrift.Transport("/hello");
            var protocol  = new Thrift.Protocol(transport);
            var client    = new hello_svcClient(protocol);
            var nameElement = document.getElementById("name_in");
            var outputElement = document.getElementById("output");
            document.getElementById("get_msg")
              .addEventListener("click", function(){
                client.get_message(nameElement.value, function(result) {
                  outputElement.innerHTML = result;
                });
              });
          })();
        </script>
      </body>
    </html>

### hello.js - Node Server
    var Thrift = require('thrift');
    var TBufferedTransport = require('thrift/lib/thrift/transport').TBufferedTransport;
    var TJSONProtocol = require('thrift/lib/thrift/protocol').TJSONProtocol;
    var hello_svc = require('./gen-nodejs/hello_svc.js');
    
    var hello_handler = {
      get_message: function(name, result) {
        var msg = "Hello " + name + "!";
        result(null, msg);
      }
    }
    
    var hello_svc_opt = {
      transport: TBufferedTransport,
      protocol: TJSONProtocol,
      cls: hello_svc,
      handler: hello_handler
    };
    
    var server_opt = {
      staticFilePath: ".",
      services: {
        "/hello": hello_svc_opt
      }
    }
    
    var server = Thrift.createThriftWebServer(server_opt);
    var port = 9099;
    server.listen(port);
    console.log("Http/Thrift Server running on port: " + port);

