|  | @@ -1,14 +1,134 @@
 | 
	
		
			
				|  |  | -This directory contains Protocol Buffer support for JavaScript.  This code works
 | 
	
		
			
				|  |  | -in browsers and in Node.js.
 | 
	
		
			
				|  |  | +Protocol Buffers - Google's data interchange format
 | 
	
		
			
				|  |  | +===================================================
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  | -The packaging work for this is still in-progress.  For now you can just run the
 | 
	
		
			
				|  |  | -tests.  First you need to build the main C++ distribution because the code
 | 
	
		
			
				|  |  | -generator for JavaScript is written in C++:
 | 
	
		
			
				|  |  | +[](https://travis-ci.org/google/protobuf)
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  | -   $ ./autogen.sh
 | 
	
		
			
				|  |  | -   $ ./configure
 | 
	
		
			
				|  |  | -   $ make
 | 
	
		
			
				|  |  | +Copyright 2008 Google Inc.
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  | -Then you can run the JavaScript tests in this directory:
 | 
	
		
			
				|  |  | +This directory contains the JavaScript Protocol Buffers runtime library.
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  | -   $ cd js && gulp test
 | 
	
		
			
				|  |  | +The library is currently compatible with:
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +1. CommonJS-style imports (eg. `var protos = require('my-protos');`)
 | 
	
		
			
				|  |  | +2. Closure-style imports (eg. `goog.require('my.package.MyProto');`)
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +Support for ES6-style imports is not implemented yet.  Browsers can
 | 
	
		
			
				|  |  | +be supported by using Browserify, webpack, Closure Compiler, etc. to
 | 
	
		
			
				|  |  | +resolve imports at compile time.
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +To use Protocol Buffers with JavaScript, you need two main components:
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +1. The protobuf runtime library.  You can install this with
 | 
	
		
			
				|  |  | +   `npm install google-protobuf`, or use the files in this directory.
 | 
	
		
			
				|  |  | +2. The Protocol Compiler `protoc`.  This translates `.proto` files
 | 
	
		
			
				|  |  | +   into `.js` files.  The compiler is not currently available via
 | 
	
		
			
				|  |  | +   npm -- you must download and compile it from GitHub or a tarball.
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +Setup
 | 
	
		
			
				|  |  | +=====
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +First, compile the Protocol Compiler.
 | 
	
		
			
				|  |  | +You can compile `protoc` from GitHub or a source tarball.  From the
 | 
	
		
			
				|  |  | +top level directory type:
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +    $ ./autogen.sh  (only necessary for GitHub)
 | 
	
		
			
				|  |  | +    $ ./configure
 | 
	
		
			
				|  |  | +    $ make
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +Once you have `protoc` compiled, you can run the tests by typing:
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +    $ npm install
 | 
	
		
			
				|  |  | +    $ npm test
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +This will run two separate copies of the tests: one that uses
 | 
	
		
			
				|  |  | +Closure Compiler style imports and one that uses CommonJS imports.
 | 
	
		
			
				|  |  | +You can see all the CommonJS files in `commonjs_out/`.
 | 
	
		
			
				|  |  | +If all of these tests pass, you know you have a working setup.
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +Using Protocol Buffers in your own project
 | 
	
		
			
				|  |  | +==========================================
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +To use Protocol Buffers in your own project, you need to integrate
 | 
	
		
			
				|  |  | +the Protocol Compiler into your build system.  The details are a
 | 
	
		
			
				|  |  | +little different depending on whether you are using Closure imports
 | 
	
		
			
				|  |  | +or CommonJS imports:
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +Closure Imports
 | 
	
		
			
				|  |  | +---------------
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +If you want to use Closure imports, your build should run a command
 | 
	
		
			
				|  |  | +like this:
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +    $ protoc --js_out=library=myproto_libs,binary:. messages.proto base.proto
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +For Closure imports, `protoc` will generate a single output file
 | 
	
		
			
				|  |  | +(`myproto_libs.js` in this example).  The generated file will `goog.provide()`
 | 
	
		
			
				|  |  | +all of the types defined in your .proto files.  For example, for the unit
 | 
	
		
			
				|  |  | +tests the generated files contain many `goog.provide` statements like:
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +    goog.provide('proto.google.protobuf.DescriptorProto');
 | 
	
		
			
				|  |  | +    goog.provide('proto.google.protobuf.DescriptorProto.ExtensionRange');
 | 
	
		
			
				|  |  | +    goog.provide('proto.google.protobuf.DescriptorProto.ReservedRange');
 | 
	
		
			
				|  |  | +    goog.provide('proto.google.protobuf.EnumDescriptorProto');
 | 
	
		
			
				|  |  | +    goog.provide('proto.google.protobuf.EnumOptions');
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +The generated code will also `goog.require()` many types in the core library,
 | 
	
		
			
				|  |  | +and they will require many types in the Google Closure library.  So make sure
 | 
	
		
			
				|  |  | +that your `goog.provide()` / `goog.require()` setup can find all of your
 | 
	
		
			
				|  |  | +generated code, the core library `.js` files in this directory, and the
 | 
	
		
			
				|  |  | +Google Closure library itself.
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +Once you've done this, you should be able to import your types with
 | 
	
		
			
				|  |  | +statements like:
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +    goog.require('proto.my.package.MyMessage');
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +    var message = proto.my.package.MyMessage();
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +CommonJS imports
 | 
	
		
			
				|  |  | +----------------
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +If you want to use CommonJS imports, your build should run a command
 | 
	
		
			
				|  |  | +like this:
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +    $ protoc --js_out=import_style=commonjs,binary:. messages.proto base.proto
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +For CommonJS imports, `protoc` will spit out one file per input file
 | 
	
		
			
				|  |  | +(so `messages_pb.js` and `base_pb.js` in this example).  The generated
 | 
	
		
			
				|  |  | +code will depend on the core runtime, which should be in a file called
 | 
	
		
			
				|  |  | +`google-protobuf.js`.  If you are installing from `npm`, this file should
 | 
	
		
			
				|  |  | +already be built and available.  If you are running from GitHub, you need
 | 
	
		
			
				|  |  | +to build it first by running:
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +    $ gulp dist
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +Once you've done this, you should be able to import your types with
 | 
	
		
			
				|  |  | +statements like:
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +    var messages = require('./messages_pb');
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +    var message = new messages.MyMessage();
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +API
 | 
	
		
			
				|  |  | +===
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +The API is not well-documented yet.  Here is a quick example to give you an
 | 
	
		
			
				|  |  | +idea of how the library generally works:
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +    var message = new MyMessage();
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +    message.setName("John Doe");
 | 
	
		
			
				|  |  | +    message.setAge(25);
 | 
	
		
			
				|  |  | +    message.setPhoneNumbers(["800-555-1212", "800-555-0000"]);
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +    // Serializes to a UInt8Array.
 | 
	
		
			
				|  |  | +    bytes = message.serializeBinary();
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +    var message2 = new MyMessage();
 | 
	
		
			
				|  |  | +    message2.deserializeBinary(bytes);
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +For more examples, see the tests.  You can also look at the generated code
 | 
	
		
			
				|  |  | +to see what methods are defined for your generated messages.
 |