From: Henrique Mendonça Date: Fri, 20 Sep 2013 17:38:03 +0000 (+0200) Subject: THRIFT-2190 Add the JavaScript thrift.js lib to the Bower registry X-Git-Url: https://source.supwisdom.com/gerrit/gitweb?a=commitdiff_plain;h=095ddb7ff8c9e503c2186e8452f2de7f7451212a;p=common%2Fthrift.git THRIFT-2190 Add the JavaScript thrift.js lib to the Bower registry Client: nodejs Patch: Randy Abernethy plus path changes --- diff --git a/lib/js/Gruntfile.js b/lib/js/Gruntfile.js new file mode 100644 index 00000000..dd6406b7 --- /dev/null +++ b/lib/js/Gruntfile.js @@ -0,0 +1,70 @@ +//To build dist/thrift.js, dist/thrift.min.js and doc/* +//run grunt at the command line in this directory. +//Prerequisites: +// Node Setup - nodejs.org +// Grunt Setup - npm install //reads the ./package.json and installs project dependencies + +module.exports = function(grunt) { + 'use strict'; + + grunt.initConfig({ + pkg: grunt.file.readJSON('package.json'), + concat: { + options: { + separator: ';' + }, + dist: { + src: ['src/**/*.js'], + dest: 'dist/<%= pkg.name %>.js' + } + }, + jsdoc : { + dist : { + src: ['src/*.js', './README'], + options: { + destination: 'doc' + } + } + }, + uglify: { + options: { + banner: '/*! <%= pkg.name %> <%= grunt.template.today("dd-mm-yyyy") %> */\n' + }, + dist: { + files: { + 'dist/<%= pkg.name %>.min.js': ['<%= concat.dist.dest %>'] + } + } + }, + qunit: { + all: { + options: { + urls: [ + 'http://localhost:8088/test.html' + ] + } + } + }, + jshint: { + files: ['Gruntfile.js', 'src/**/*.js', 'test/*.js'], + options: { + // options here to override JSHint defaults + globals: { + jQuery: true, + console: true, + module: true, + document: true + } + } + }, + }); + + grunt.loadNpmTasks('grunt-contrib-uglify'); + grunt.loadNpmTasks('grunt-contrib-jshint'); + grunt.loadNpmTasks('grunt-contrib-qunit'); + grunt.loadNpmTasks('grunt-contrib-concat'); + grunt.loadNpmTasks('grunt-jsdoc'); + + grunt.registerTask('test', ['jshint', 'qunit']); + grunt.registerTask('default', ['jshint', 'qunit', 'concat', 'uglify', 'jsdoc']); +}; \ No newline at end of file diff --git a/lib/js/README b/lib/js/README index fafdc431..98a1b547 100644 --- a/lib/js/README +++ b/lib/js/README @@ -1,8 +1,10 @@ Thrift Javascript Library +========================= +This browser based Apache Thrift implementation supports +RPC using the JSON protocol over Http[s] with XHR. 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 @@ -20,21 +22,53 @@ KIND, either express or implied. See the License for the specific language governing permissions and limitations under the License. -Using Thrift with Javascript -===================== - -Allows javascript client interfaces to Thrift services. -This is geared for use in a web browser. +Example +------- +The listing below demonstrates a simple browser based JavaScript +Thrift client and Node.js JavaScript server for the HelloSvc service. -This client can only speak the JSON Protocol and the only supported -transport is AJAX. +### hello.thrift - Service IDL + service HelloSvc { + string hello_func(), + } -There is a test httpd service in the test dir that requires -http://hc.apache.org under test dir +### hello.html - Browser Client + + + + + + + +

Apache Thrift JavaScript Browser Client Demo

+ + +

Server Response:

+ + -Dependencies -============ -A JavaScript enabled browser. Tested with: - *IE 6,7,8 - *FF 2,3 - *Safari 3 & 4 +### hello.js - Node Server + var thrift = require('thrift'); + var TJSONProtocol = require('thrift/protocol').TJSONProtocol; + var HelloSvc = require('./gen-nodejs/HelloSvc.js'); + + var call_counter = 0; + + var server = thrift.createHttpGetPostServer(HelloSvc, { + hello_func: function(result) { + console.log("Client call: " + (++call_counter)); + result(null, "Hello Apache Thrift for JavaScript " + call_counter); + } + }, {protocol: TJSONProtocol}); + + server.listen(8585); \ No newline at end of file diff --git a/lib/js/package.json b/lib/js/package.json new file mode 100644 index 00000000..5a8485b1 --- /dev/null +++ b/lib/js/package.json @@ -0,0 +1,12 @@ +{ + "name": "thrift", + "version": "1.0.0", + "devDependencies": { + "grunt": "~0.4.1", + "grunt-contrib-uglify": "~0.2.2", + "grunt-contrib-jshint": "~0.6.3", + "grunt-contrib-qunit": "~0.2.2", + "grunt-contrib-concat": "~0.3.0", + "grunt-jsdoc": "~0.4.0" + } +} \ No newline at end of file diff --git a/lib/js/thrift.js b/lib/js/src/thrift.js similarity index 56% rename from lib/js/thrift.js rename to lib/js/src/thrift.js index e59f07ff..3b489e57 100644 --- a/lib/js/thrift.js +++ b/lib/js/src/thrift.js @@ -16,16 +16,51 @@ * specific language governing permissions and limitations * under the License. */ + +/*jshint evil:true*/ + +/** + * The Thrift namespace houses the Apache Thrift JavaScript library + * elements providing JavaScript bindings for the Apache Thrift RPC + * system. Users will typically only directly make use of the + * Transport and Protocol constructors. + * @namespace + * @example + * var transport = new Thrift.Transport("http://localhost:8585"); + * var protocol = new Thrift.Protocol(transport); + * var client = new MyThriftSvcClient(protocol); + * var result = client.MyMethod(); + */ var Thrift = { + /** + * Thrift JavaScript library version. + * @readonly + * @const {string} Version + * @memberof Thrift + */ Version: '1.0.0-dev', -/* - Description: 'JavaScript bindings for the Apache Thrift RPC system', - License: 'http://www.apache.org/licenses/LICENSE-2.0', - Homepage: 'http://thrift.apache.org', - BugReports: 'https://issues.apache.org/jira/browse/THRIFT', - Maintainer: 'dev@thrift.apache.org', -*/ + /** + * Thrift IDL type string to Id mapping. + * @readonly + * @property {number} STOP - End of a set of fields. + * @property {number} VOID - No value (only legal for return types). + * @property {number} BOOL - True/False integer. + * @property {number} BYTE - Signed 8 bit integer. + * @property {number} I08 - Signed 8 bit integer. + * @property {number} DOUBLE - 64 bit IEEE 854 floating point. + * @property {number} I16 - Signed 16 bit integer. + * @property {number} I32 - Signed 32 bit integer. + * @property {number} I64 - Signed 64 bit integer. + * @property {number} STRING - Array of bytes representing a string of characters. + * @property {number} UTF7 - Array of bytes representing a string of UTF7 encoded characters. + * @property {number} STRUCT - A multifield type. + * @property {number} MAP - A collection type (map/associative-array/dictionary). + * @property {number} SET - A collection type (unordered and without repeated values). + * @property {number} LIST - A collection type (unordered). + * @property {number} UTF8 - Array of bytes representing a string of UTF8 encoded characters. + * @property {number} UTF16 - Array of bytes representing a string of UTF16 encoded characters. + */ Type: { 'STOP' : 0, 'VOID' : 1, @@ -46,12 +81,26 @@ var Thrift = { 'UTF16' : 17 }, + /** + * Thrift RPC message type string to Id mapping. + * @readonly + * @property {number} CALL - RPC call sent from client to server. + * @property {number} REPLY - RPC call normal response from server to client. + * @property {number} EXCEPTION - RPC call exception response from server to client. + * @property {number} ONEWAY - Oneway RPC call from client to server with no response. + */ MessageType: { 'CALL' : 1, 'REPLY' : 2, - 'EXCEPTION' : 3 + 'EXCEPTION' : 3, + 'ONEWAY' : 4 }, + /** + * Utility function returning the count of an object's own properties. + * @param {object} obj - Object to test. + * @returns {number} number of object's own properties + */ objectLength: function(obj) { var length = 0; for (var k in obj) { @@ -63,22 +112,57 @@ var Thrift = { return length; }, - inherits: function(constructor, superConstructor) { - //Prototypal Inheritance http://javascript.crockford.com/prototypal.html + /** + * Utility function to establish prototype inheritance. + * @see {@link http://javascript.crockford.com/prototypal.html|Prototypal Inheritance} + * @param {function} constructor - Contstructor function to set as derived. + * @param {function} superConstructor - Contstructor function to set as base. + * @param {string} [name] - Type name to set as name property in derived prototype. + */ + inherits: function(constructor, superConstructor, name) { function F() {} F.prototype = superConstructor.prototype; constructor.prototype = new F(); + constructor.prototype.name = name || ""; } }; - - +/** + * Initializes a Thrift TException instance. + * @constructor + * @augments Error + * @param {string} message - The TException message (distinct from the Error message). + * @classdesc TException is the base class for all Thrift exceptions types. + */ Thrift.TException = function(message) { this.message = message; }; -Thrift.inherits(Thrift.TException, Error); -Thrift.TException.prototype.name = 'TException'; +Thrift.inherits(Thrift.TException, Error, 'TException'); +/** + * Returns the message set on the exception. + * @readonly + * @returns {string} exception message + */ +Thrift.TException.prototype.getMessage = function() { + return this.message; +}; + +/** + * Thrift Application Exception type string to Id mapping. + * @readonly + * @property {number} UNKNOWN - Unknown/undefined. + * @property {number} UNKNOWN_METHOD - Client attempted to call a method unknown to the server. + * @property {number} INVALID_MESSAGE_TYPE - Client passed an unknown/unsupported MessageType. + * @property {number} WRONG_METHOD_NAME - Unused. + * @property {number} BAD_SEQUENCE_ID - Unused in Thrift RPC, used to flag proprietary sequence number errors. + * @property {number} MISSING_RESULT - Raised by a server processor if a handler fails to supply the required return result. + * @property {number} INTERNAL_ERROR - Something bad happened. + * @property {number} PROTOCOL_ERROR - The protocol layer failed to serialize or deserialize data. + * @property {number} INVALID_TRANSFORM - Unused. + * @property {number} INVALID_PROTOCOL - The protocol (or version) is not supported. + * @property {number} UNSUPPORTED_CLIENT_TYPE - Unused. + */ Thrift.TApplicationExceptionType = { 'UNKNOWN' : 0, 'UNKNOWN_METHOD' : 1, @@ -93,13 +177,24 @@ Thrift.TApplicationExceptionType = { 'UNSUPPORTED_CLIENT_TYPE' : 10 }; +/** + * Initializes a Thrift TApplicationException instance. + * @constructor + * @augments Thrift.TException + * @param {string} message - The TApplicationException message (distinct from the Error message). + * @param {Thrift.TApplicationExceptionType} [code] - The TApplicationExceptionType code. + * @classdesc TApplicationException is the exception class used to propagate exceptions from an RPC server back to a calling client. +*/ Thrift.TApplicationException = function(message, code) { this.message = message; - this.code = (code === null) ? 0 : code; + this.code = typeof code === "number" ? code : 0; }; -Thrift.inherits(Thrift.TApplicationException, Thrift.TException); -Thrift.TApplicationException.prototype.name = 'TApplicationException'; +Thrift.inherits(Thrift.TApplicationException, Thrift.TException, 'TApplicationException'); +/** + * Read a TApplicationException from the supplied protocol. + * @param {object} input - The input protocol to read from. + */ Thrift.TApplicationException.prototype.read = function(input) { while (1) { var ret = input.readFieldBegin(); @@ -138,9 +233,11 @@ Thrift.TApplicationException.prototype.read = function(input) { input.readStructEnd(); }; +/** + * Wite a TApplicationException to the supplied protocol. + * @param {object} output - The output protocol to write to. + */ Thrift.TApplicationException.prototype.write = function(output) { - var xfer = 0; - output.writeStructBegin('TApplicationException'); if (this.message) { @@ -159,17 +256,27 @@ Thrift.TApplicationException.prototype.write = function(output) { output.writeStructEnd(); }; +/** + * Returns the application exception code set on the exception. + * @readonly + * @returns {Thrift.TApplicationExceptionType} exception code + */ Thrift.TApplicationException.prototype.getCode = function() { return this.code; }; -Thrift.TApplicationException.prototype.getMessage = function() { - return this.message; -}; - /** - *If you do not specify a url then you must handle ajax on your own. - *This is how to use js bindings in a async fashion. + * Initializes a Thrift Http[s] transport instance. + * Note: If you do not specify a url then you must handle XHR on your own + * (this is how to use js bindings in a async fashion). + * @constructor + * @param {string} [url] - The URL to connect to. + * @classdesc The Apache Thrift Transport layer performs byte level I/O between RPC + * clients and servers. The JavaScript Transport object type uses Http[s]/XHR and is + * the sole browser based Thrift transport. Target servers must implement the http[s] + * transport (see: node.js example server). + * @example + * var transport = new Thrift.Transport("http://localhost:8585"); */ Thrift.Transport = function(url) { this.url = url; @@ -181,16 +288,27 @@ Thrift.Transport = function(url) { }; Thrift.Transport.prototype = { - - //Gets the browser specific XmlHttpRequest Object + /** + * Gets the browser specific XmlHttpRequest Object. + * @returns {object} the browser XHR interface object + */ getXmlHttpRequestObject: function() { try { return new XMLHttpRequest(); } catch (e1) { } try { return new ActiveXObject('Msxml2.XMLHTTP'); } catch (e2) { } try { return new ActiveXObject('Microsoft.XMLHTTP'); } catch (e3) { } - throw "Your browser doesn't support the XmlHttpRequest object."; + throw "Your browser doesn't support XHR."; }, + /** + * Sends the current XRH request if the transport was created with a URL and + * the async parameter if false. If the transport was not created with a URL + * or the async parameter is True or the URL is an empty string, the current + * send buffer is returned. + * @param {object} async - If true the current send buffer is returned. + * @returns {undefined|string} Nothing or the current send buffer. + * @throws {string} If XHR fails. + */ flush: function(async) { //async mode if (async || this.url === undefined || this.url === '') { @@ -220,6 +338,15 @@ Thrift.Transport.prototype = { this.rpos = 0; }, + /** + * Creates a jQuery XHR object to be used for a Thrift server call. + * @param {object} client - The Thrift Service client object generated by the IDL compiler. + * @param {object} postData - The message to send to the server. + * @param {function} args - The function to call if the request suceeds. + * @param {function} recv_method - The Thrift Service Client receive method for the call. + * @returns {object} A new jQuery XHR object. + * @throws {string} If the jQuery version is prior to 1.5 or if jQuery is not found. + */ jqRequest: function(client, postData, args, recv_method) { if (typeof jQuery === 'undefined' || typeof jQuery.Deferred === 'undefined') { @@ -249,6 +376,10 @@ Thrift.Transport.prototype = { return jqXHR; }, + /** + * Sets the buffer to use when receiving server responses. + * @param {string} buf - The buffer to receive server responses. + */ setRecvBuffer: function(buf) { this.recv_buf = buf; this.recv_buf_sz = this.recv_buf.length; @@ -256,14 +387,34 @@ Thrift.Transport.prototype = { this.rpos = 0; }, + /** + * Returns true if the transport is open, in browser based JavaScript + * this function always returns true. + * @readonly + * @returns {boolean} Always True. + */ isOpen: function() { return true; }, + /** + * Opens the transport connection, in browser based JavaScript + * this function is a nop. + */ open: function() {}, + /** + * Closes the transport connection, in browser based JavaScript + * this function is a nop. + */ close: function() {}, + /** + * Returns the specified number of characters from the response + * buffer. + * @param {number} len - The number of characters to return. + * @returns {string} Characters sent by the server. + */ read: function(len) { var avail = this.wpos - this.rpos; @@ -284,26 +435,52 @@ Thrift.Transport.prototype = { return ret; }, + /** + * Returns the entire response buffer. + * @returns {string} Characters sent by the server. + */ readAll: function() { return this.recv_buf; }, + /** + * Sets the send buffer to buf. + * @param {string} buf - The buffer to send. + */ write: function(buf) { this.send_buf = buf; }, + /** + * Returns the send buffer. + * @readonly + * @returns {string} The send buffer. + */ getSendBuffer: function() { return this.send_buf; } }; - - +/** + * Initializes a Thrift JSON protocol instance. + * @constructor + * @param {Thrift.Transport} transport - The transport to serialize to/from. + * @classdesc Apache Thrift Protocols perform serialization which enables cross + * language RPC. The Protocol type is the JavaScript browser implementation + * of the Apache Thrift TJSONProtocol. + * @example + * var protocol = new Thrift.Protocol(transport); + */ Thrift.Protocol = function(transport) { this.transport = transport; }; +/** + * Thrift IDL type Id to string mapping. + * @readonly + * @see {@link Thrift.Type} + */ Thrift.Protocol.Type = {}; Thrift.Protocol.Type[Thrift.Type.BOOL] = '"tf"'; Thrift.Protocol.Type[Thrift.Type.BYTE] = '"i8"'; @@ -317,7 +494,11 @@ Thrift.Protocol.Type[Thrift.Type.MAP] = '"map"'; Thrift.Protocol.Type[Thrift.Type.LIST] = '"lst"'; Thrift.Protocol.Type[Thrift.Type.SET] = '"set"'; - +/** + * Thrift IDL type string to Id mapping. + * @readonly + * @see {@link Thrift.Type} + */ Thrift.Protocol.RType = {}; Thrift.Protocol.RType.tf = Thrift.Type.BOOL; Thrift.Protocol.RType.i8 = Thrift.Type.BYTE; @@ -331,15 +512,30 @@ Thrift.Protocol.RType.map = Thrift.Type.MAP; Thrift.Protocol.RType.lst = Thrift.Type.LIST; Thrift.Protocol.RType.set = Thrift.Type.SET; -Thrift.Protocol.Version = 1; +/** + * The TJSONProtocol version number. + * @readonly + * @const {number} Version + * @memberof Thrift.Protocol + */ + Thrift.Protocol.Version = 1; Thrift.Protocol.prototype = { - + /** + * Returns the underlying transport. + * @readonly + * @returns {Thrift.Transport} The underlying transport. + */ getTransport: function() { return this.transport; }, - //Write functions + /** + * Serializes the beginning of a Thrift RPC message. + * @param {string} name - The service method to call. + * @param {Thrift.MessageType} messageType - The type of method call. + * @param {number} seqid - The sequence number of this call (always 0 in Apache Thrift). + */ writeMessageBegin: function(name, messageType, seqid) { this.tstack = []; this.tpos = []; @@ -348,6 +544,9 @@ Thrift.Protocol.prototype = { name + '"', messageType, seqid]); }, + /** + * Serializes the end of a Thrift RPC message. + */ writeMessageEnd: function() { var obj = this.tstack.pop(); @@ -360,11 +559,18 @@ Thrift.Protocol.prototype = { }, + /** + * Serializes the beginning of a struct. + * @param {string} name - The name of the struct. + */ writeStructBegin: function(name) { this.tpos.push(this.tstack.length); this.tstack.push({}); }, + /** + * Serializes the end of a struct. + */ writeStructEnd: function() { var p = this.tpos.pop(); @@ -385,6 +591,12 @@ Thrift.Protocol.prototype = { this.tstack[p] = str; }, + /** + * Serializes the beginning of a struct field. + * @param {string} name - The name of the field. + * @param {Thrift.Protocol.Type} fieldType - The data type of the field. + * @param {number} fieldId - The field's unique identifier. + */ writeFieldBegin: function(name, fieldType, fieldId) { this.tpos.push(this.tstack.length); this.tstack.push({ 'fieldId': '"' + @@ -393,6 +605,9 @@ Thrift.Protocol.prototype = { }, + /** + * Serializes the end of a field. + */ writeFieldEnd: function() { var value = this.tstack.pop(); var fieldInfo = this.tstack.pop(); @@ -402,17 +617,28 @@ Thrift.Protocol.prototype = { this.tpos.pop(); }, + /** + * Serializes the end of the set of fields for a struct. + */ writeFieldStop: function() { //na }, + /** + * Serializes the beginning of a map collection. + * @param {Thrift.Type} keyType - The data type of the key. + * @param {Thrift.Type} valType - The data type of the value. + * @param {number} [size] - The number of elements in the map (ignored). + */ writeMapBegin: function(keyType, valType, size) { - //size is invalid, we'll set it on end. this.tpos.push(this.tstack.length); this.tstack.push([Thrift.Protocol.Type[keyType], Thrift.Protocol.Type[valType], 0]); }, + /** + * Serializes the end of a map. + */ writeMapEnd: function() { var p = this.tpos.pop(); @@ -448,11 +674,19 @@ Thrift.Protocol.prototype = { this.tstack[p] = '[' + this.tstack[p].join(',') + ']'; }, + /** + * Serializes the beginning of a list collection. + * @param {Thrift.Type} elemType - The data type of the elements. + * @param {number} size - The number of elements in the list. + */ writeListBegin: function(elemType, size) { this.tpos.push(this.tstack.length); this.tstack.push([Thrift.Protocol.Type[elemType], size]); }, + /** + * Serializes the end of a list. + */ writeListEnd: function() { var p = this.tpos.pop(); @@ -465,11 +699,19 @@ Thrift.Protocol.prototype = { this.tstack[p] = '[' + this.tstack[p].join(',') + ']'; }, + /** + * Serializes the beginning of a set collection. + * @param {Thrift.Type} elemType - The data type of the elements. + * @param {number} size - The number of elements in the list. + */ writeSetBegin: function(elemType, size) { this.tpos.push(this.tstack.length); this.tstack.push([Thrift.Protocol.Type[elemType], size]); }, + /** + * Serializes the end of a set. + */ writeSetEnd: function() { var p = this.tpos.pop(); @@ -482,30 +724,37 @@ Thrift.Protocol.prototype = { this.tstack[p] = '[' + this.tstack[p].join(',') + ']'; }, + /** Serializes a boolean */ writeBool: function(value) { this.tstack.push(value ? 1 : 0); }, + /** Serializes a number */ writeByte: function(i8) { this.tstack.push(i8); }, + /** Serializes a number */ writeI16: function(i16) { this.tstack.push(i16); }, + /** Serializes a number */ writeI32: function(i32) { this.tstack.push(i32); }, + /** Serializes a number */ writeI64: function(i64) { this.tstack.push(i64); }, + /** Serializes a number */ writeDouble: function(dbl) { this.tstack.push(dbl); }, + /** Serializes a string */ writeString: function(str) { // We do not encode uri components for wire transfer: if (str === null) { @@ -545,13 +794,22 @@ Thrift.Protocol.prototype = { } }, + /** Serializes a string */ writeBinary: function(str) { this.writeString(str); }, - - - // Reading functions + /** + @class + @name AnonReadMessageBeginReturn + @property {string} fname - The name of the service method. + @property {Thrift.MessageType} mtype - The type of message call. + @property {number} rseqid - The sequence number of the message (0 in Thrift RPC). + */ + /** + * Deserializes the beginning of a message. + * @returns {AnonReadMessageBeginReturn} + */ readMessageBegin: function() { this.rstack = []; this.rpos = []; @@ -580,9 +838,15 @@ Thrift.Protocol.prototype = { return r; }, + /** Deserializes the end of a message. */ readMessageEnd: function() { }, + /** + * Deserializes the beginning of a struct. + * @param {string} [name] - The name of the struct (ignored) + * @returns {object} - An object with an empty string fname property + */ readStructBegin: function(name) { var r = {}; r.fname = ''; @@ -595,12 +859,24 @@ Thrift.Protocol.prototype = { return r; }, + /** Deserializes the end of a struct. */ readStructEnd: function() { if (this.rstack[this.rstack.length - 2] instanceof Array) { this.rstack.pop(); } }, + /** + @class + @name AnonReadFieldBeginReturn + @property {string} fname - The name of the field (always ''). + @property {Thrift.Type} ftype - The data type of the field. + @property {number} fid - The unique identifier of the field. + */ + /** + * Deserializes the beginning of a field. + * @returns {AnonReadFieldBeginReturn} + */ readFieldBegin: function() { var r = {}; @@ -648,6 +924,7 @@ Thrift.Protocol.prototype = { return r; }, + /** Deserializes the end of a field. */ readFieldEnd: function() { var pos = this.rpos.pop(); @@ -658,6 +935,17 @@ Thrift.Protocol.prototype = { }, + /** + @class + @name AnonReadMapBeginReturn + @property {Thrift.Type} ktype - The data type of the key. + @property {Thrift.Type} vtype - The data type of the value. + @property {number} size - The number of elements in the map. + */ + /** + * Deserializes the beginning of a map. + * @returns {AnonReadMapBeginReturn} + */ readMapBegin: function() { var map = this.rstack.pop(); @@ -673,10 +961,21 @@ Thrift.Protocol.prototype = { return r; }, + /** Deserializes the end of a map. */ readMapEnd: function() { this.readFieldEnd(); }, + /** + @class + @name AnonReadColBeginReturn + @property {Thrift.Type} etype - The data type of the element. + @property {number} size - The number of elements in the collection. + */ + /** + * Deserializes the beginning of a list. + * @returns {AnonReadColBeginReturn} + */ readListBegin: function() { var list = this.rstack[this.rstack.length - 1]; @@ -690,18 +989,27 @@ Thrift.Protocol.prototype = { return r; }, + /** Deserializes the end of a list. */ readListEnd: function() { this.readFieldEnd(); }, + /** + * Deserializes the beginning of a set. + * @returns {AnonReadColBeginReturn} + */ readSetBegin: function(elemType, size) { return this.readListBegin(elemType, size); }, + /** Deserializes the end of a set. */ readSetEnd: function() { return this.readListEnd(); }, + /** Returns an object with a value property set to + * False unless the next number in the protocol buffer + * is 1, in which case teh value property is True */ readBool: function() { var r = this.readI32(); @@ -714,14 +1022,20 @@ Thrift.Protocol.prototype = { return r; }, + /** Returns the an object with a value property set to the + next value found in the protocol buffer */ readByte: function() { return this.readI32(); }, + /** Returns the an object with a value property set to the + next value found in the protocol buffer */ readI16: function() { return this.readI32(); }, + /** Returns the an object with a value property set to the + next value found in the protocol buffer */ readI32: function(f) { if (f === undefined) { f = this.rstack[this.rstack.length - 1]; @@ -754,25 +1068,35 @@ Thrift.Protocol.prototype = { return r; }, + /** Returns the an object with a value property set to the + next value found in the protocol buffer */ readI64: function() { return this.readI32(); }, + /** Returns the an object with a value property set to the + next value found in the protocol buffer */ readDouble: function() { return this.readI32(); }, + /** Returns the an object with a value property set to the + next value found in the protocol buffer */ readString: function() { var r = this.readI32(); return r; }, + /** Returns the an object with a value property set to the + next value found in the protocol buffer */ readBinary: function() { return this.readString(); }, - - //Method to arbitrarily skip over data. + /** + * Method to arbitrarily skip over data (not implemented). + * @throws {string} this method is not implemented and always throws. + */ skip: function(type) { throw 'skip not supported yet'; } diff --git a/lib/js/test/build.xml b/lib/js/test/build.xml index 53bec58a..e302ea01 100755 --- a/lib/js/test/build.xml +++ b/lib/js/test/build.xml @@ -100,7 +100,7 @@ - + @@ -216,7 +216,7 @@ - + @@ -234,7 +234,7 @@ - + diff --git a/lib/js/test/phantomjs-qunit.js b/lib/js/test/phantomjs-qunit.js index d52b5227..027be401 100755 --- a/lib/js/test/phantomjs-qunit.js +++ b/lib/js/test/phantomjs-qunit.js @@ -1,3 +1,5 @@ +/*jshint evil:true*/ + /* This file is only used by the test suite. * * Origin: https://github.com/ariya/phantomjs/blob/master/examples/run-qunit.js @@ -35,12 +37,16 @@ function waitFor(testFx, onReady, timeOutMillis) { } else { // Condition fulfilled (timeout and/or condition is 'true') console.log("'waitFor()' finished in " + (new Date().getTime() - start) + "ms."); - typeof(onReady) === "string" ? eval(onReady) : onReady(); //< Do what it's supposed to do once the condition is fulfilled + if (typeof(onReady) === "string") { + eval(onReady); + } else { + onReady(); //< Do what it's supposed to do once the condition is fulfilled + } clearInterval(interval); //< Stop this interval } } }, 100); //< repeat check every 250ms -}; +} if (phantom.args.length === 0 || phantom.args.length > 2) { diff --git a/lib/js/test/test.html b/lib/js/test/test.html index 1c8fc9a6..93894c71 100755 --- a/lib/js/test/test.html +++ b/lib/js/test/test.html @@ -22,7 +22,7 @@ Thrift Javascript Bindings: Unit Test - + diff --git a/lib/js/test/test.js b/lib/js/test/test.js index 99fcc41d..b0904a91 100755 --- a/lib/js/test/test.js +++ b/lib/js/test/test.js @@ -16,7 +16,7 @@ * specific language governing permissions and limitations * under the License. */ - + /* jshint -W100 */ /* * JavaScript test suite @@ -401,6 +401,8 @@ module("Async"); .error(function(xhr, status, e){ equal(e.errorCode, 1001); equal(e.message, "Xception"); - QUnit.start(); + //QUnit.start(); + //Note start is not required here because: + //$(document).ajaxError( function() { QUnit.start(); } ); }); });