<?xml version="1.0"?>
<feed xmlns="http://www.w3.org/2005/Atom" xml:lang="en">
	<id>https://wiki.mozilla.org/api.php?action=feedcontributions&amp;feedformat=atom&amp;user=IsaacSchlueter</id>
	<title>MozillaWiki - User contributions [en]</title>
	<link rel="self" type="application/atom+xml" href="https://wiki.mozilla.org/api.php?action=feedcontributions&amp;feedformat=atom&amp;user=IsaacSchlueter"/>
	<link rel="alternate" type="text/html" href="https://wiki.mozilla.org/Special:Contributions/IsaacSchlueter"/>
	<updated>2026-04-12T16:29:41Z</updated>
	<subtitle>User contributions</subtitle>
	<generator>MediaWiki 1.39.10</generator>
	<entry>
		<id>https://wiki.mozilla.org/index.php?title=ServerJS/HTTP_Client/A&amp;diff=166525</id>
		<title>ServerJS/HTTP Client/A</title>
		<link rel="alternate" type="text/html" href="https://wiki.mozilla.org/index.php?title=ServerJS/HTTP_Client/A&amp;diff=166525"/>
		<updated>2009-09-04T03:07:30Z</updated>

		<summary type="html">&lt;p&gt;IsaacSchlueter: /* Example Implementation */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Proposal A, Draft 1&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Status: Proposal&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
The &amp;quot;http-client&amp;quot; module exposes an HTTPClient constructor that creates an HTTP Client object.&lt;br /&gt;
&lt;br /&gt;
== Constructor: HTTPClient(settings) ==&lt;br /&gt;
&lt;br /&gt;
If called as a simple function, then return a new HTTPClient(settings).&lt;br /&gt;
&lt;br /&gt;
Set all protected members to the default values.&lt;br /&gt;
&lt;br /&gt;
If a settings object is included, call this.set(settings).&lt;br /&gt;
&lt;br /&gt;
== Object Methods ==&lt;br /&gt;
&lt;br /&gt;
All methods return &amp;quot;this&amp;quot; except where otherwise specified.&lt;br /&gt;
&lt;br /&gt;
=== set([settings object | key, value]) ===&lt;br /&gt;
&lt;br /&gt;
Set the body, headers, method, or url, or any combination thereof in the settings object.  Attribute validity is enforced (see valid settings on members, below.)&lt;br /&gt;
&lt;br /&gt;
=== setHeader(key, val) ===&lt;br /&gt;
&lt;br /&gt;
Set a header on the header object in a case-insensitive manner.  That is, if the user sets &amp;quot;content-type&amp;quot;, and then later sets &amp;quot;Content-Type&amp;quot;, then the first setting is lost.&lt;br /&gt;
&lt;br /&gt;
=== setHeaders(headers:Object) ===&lt;br /&gt;
&lt;br /&gt;
Set a bunch of headers expressed as name-value pairs.&lt;br /&gt;
&lt;br /&gt;
=== write(data:toByteString-able) ===&lt;br /&gt;
&lt;br /&gt;
Append data to the outgoing request.  (That is, to the iterable body object.)&lt;br /&gt;
&lt;br /&gt;
Implementers MAY require the body object to expose a push() method, and call this push() method to append data to the request.&lt;br /&gt;
&lt;br /&gt;
=== connect() ===&lt;br /&gt;
&lt;br /&gt;
Open the connection to the URL using the method supplied.  If the method or url is missing, throw an error.&lt;br /&gt;
&lt;br /&gt;
After connecting, write() will have no effect.&lt;br /&gt;
&lt;br /&gt;
Calling connect() SHOULD NOT block the application, but MUST initiate the HTTP request.&lt;br /&gt;
&lt;br /&gt;
=== read() ===&lt;br /&gt;
&lt;br /&gt;
Read the request and return a JSGI-style object consisting of &amp;lt;code&amp;gt;{status:Integer, headers:Objecct, body:Iterable&amp;lt;ByteString&amp;gt;}&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Calling read() SHOULD NOT block the application until the request is completed, but it MUST open the input stream such that the data can be read.&lt;br /&gt;
&lt;br /&gt;
=== finish() ===&lt;br /&gt;
&lt;br /&gt;
Alias for .connect().read()&lt;br /&gt;
&lt;br /&gt;
== Static Methods ==&lt;br /&gt;
&lt;br /&gt;
=== decode(response[, encoding]) ===&lt;br /&gt;
&lt;br /&gt;
Return a response object where the body has been wrapped in a decoder middleware.&lt;br /&gt;
&lt;br /&gt;
For example:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;resp.body = {forEach : function (block) {&lt;br /&gt;
    raw.forEach(function (i) {&lt;br /&gt;
        block(i.decodeToString(encoding));&lt;br /&gt;
    });&lt;br /&gt;
}};&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Make a best-guess attempt to determine the appropriate encoding based on the response headers if no encoding is specified.  The ultimate fallback encoding SHOULD be UTF-8.  &lt;br /&gt;
&lt;br /&gt;
=== unDecode(response) ===&lt;br /&gt;
&lt;br /&gt;
Replace the decoded body with the original body.  This is useful when the decoded content is clearly invalid and the consumer wants to backtrack.&lt;br /&gt;
&lt;br /&gt;
== Members ==&lt;br /&gt;
&lt;br /&gt;
All members below are required and SHOULD be protected.&lt;br /&gt;
&lt;br /&gt;
=== body ===&lt;br /&gt;
&lt;br /&gt;
An iterable (that is &amp;lt;code&amp;gt;forEach&amp;lt;/code&amp;gt;-able) object where forEach iterates over items with a &amp;lt;code&amp;gt;toByteString&amp;lt;/code&amp;gt; method.&lt;br /&gt;
&lt;br /&gt;
Implementers MAY require that the body member expose a &amp;lt;code&amp;gt;push&amp;lt;/code&amp;gt; method in order for the write function to operate properly.&lt;br /&gt;
&lt;br /&gt;
Default value: []&lt;br /&gt;
&lt;br /&gt;
=== headers ===&lt;br /&gt;
&lt;br /&gt;
A hash of request headers.  Care SHOULD be taken to ensure that keys are added in a case-insensitive manner.&lt;br /&gt;
&lt;br /&gt;
Default value: {&amp;quot;X-Requested-With&amp;quot; : &amp;quot;CommonJS HTTP Client&amp;quot;}&lt;br /&gt;
&lt;br /&gt;
=== method ===&lt;br /&gt;
&lt;br /&gt;
The request method as a string.&lt;br /&gt;
&lt;br /&gt;
Default value: &amp;quot;GET&amp;quot;&lt;br /&gt;
&lt;br /&gt;
=== url ===&lt;br /&gt;
&lt;br /&gt;
URL as a string&lt;br /&gt;
&lt;br /&gt;
Default value: none&lt;br /&gt;
&lt;br /&gt;
== Example Implementation ==&lt;br /&gt;
&lt;br /&gt;
* Isaac&#039;s Narwhal fork: [http://github.com/isaacs/narwhal/blob/master/lib/http-client.js code], [http://github.com/isaacs/narwhal-playground/blob/master/http-client.js usage], [http://github.com/isaacs/narwhal-playground/blob/master/http-client-blocking-test.js concurrent demonstration]&lt;/div&gt;</summary>
		<author><name>IsaacSchlueter</name></author>
	</entry>
	<entry>
		<id>https://wiki.mozilla.org/index.php?title=ServerJS/HTTP_Client/A&amp;diff=166524</id>
		<title>ServerJS/HTTP Client/A</title>
		<link rel="alternate" type="text/html" href="https://wiki.mozilla.org/index.php?title=ServerJS/HTTP_Client/A&amp;diff=166524"/>
		<updated>2009-09-04T03:06:32Z</updated>

		<summary type="html">&lt;p&gt;IsaacSchlueter: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Proposal A, Draft 1&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Status: Proposal&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
The &amp;quot;http-client&amp;quot; module exposes an HTTPClient constructor that creates an HTTP Client object.&lt;br /&gt;
&lt;br /&gt;
== Constructor: HTTPClient(settings) ==&lt;br /&gt;
&lt;br /&gt;
If called as a simple function, then return a new HTTPClient(settings).&lt;br /&gt;
&lt;br /&gt;
Set all protected members to the default values.&lt;br /&gt;
&lt;br /&gt;
If a settings object is included, call this.set(settings).&lt;br /&gt;
&lt;br /&gt;
== Object Methods ==&lt;br /&gt;
&lt;br /&gt;
All methods return &amp;quot;this&amp;quot; except where otherwise specified.&lt;br /&gt;
&lt;br /&gt;
=== set([settings object | key, value]) ===&lt;br /&gt;
&lt;br /&gt;
Set the body, headers, method, or url, or any combination thereof in the settings object.  Attribute validity is enforced (see valid settings on members, below.)&lt;br /&gt;
&lt;br /&gt;
=== setHeader(key, val) ===&lt;br /&gt;
&lt;br /&gt;
Set a header on the header object in a case-insensitive manner.  That is, if the user sets &amp;quot;content-type&amp;quot;, and then later sets &amp;quot;Content-Type&amp;quot;, then the first setting is lost.&lt;br /&gt;
&lt;br /&gt;
=== setHeaders(headers:Object) ===&lt;br /&gt;
&lt;br /&gt;
Set a bunch of headers expressed as name-value pairs.&lt;br /&gt;
&lt;br /&gt;
=== write(data:toByteString-able) ===&lt;br /&gt;
&lt;br /&gt;
Append data to the outgoing request.  (That is, to the iterable body object.)&lt;br /&gt;
&lt;br /&gt;
Implementers MAY require the body object to expose a push() method, and call this push() method to append data to the request.&lt;br /&gt;
&lt;br /&gt;
=== connect() ===&lt;br /&gt;
&lt;br /&gt;
Open the connection to the URL using the method supplied.  If the method or url is missing, throw an error.&lt;br /&gt;
&lt;br /&gt;
After connecting, write() will have no effect.&lt;br /&gt;
&lt;br /&gt;
Calling connect() SHOULD NOT block the application, but MUST initiate the HTTP request.&lt;br /&gt;
&lt;br /&gt;
=== read() ===&lt;br /&gt;
&lt;br /&gt;
Read the request and return a JSGI-style object consisting of &amp;lt;code&amp;gt;{status:Integer, headers:Objecct, body:Iterable&amp;lt;ByteString&amp;gt;}&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Calling read() SHOULD NOT block the application until the request is completed, but it MUST open the input stream such that the data can be read.&lt;br /&gt;
&lt;br /&gt;
=== finish() ===&lt;br /&gt;
&lt;br /&gt;
Alias for .connect().read()&lt;br /&gt;
&lt;br /&gt;
== Static Methods ==&lt;br /&gt;
&lt;br /&gt;
=== decode(response[, encoding]) ===&lt;br /&gt;
&lt;br /&gt;
Return a response object where the body has been wrapped in a decoder middleware.&lt;br /&gt;
&lt;br /&gt;
For example:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;resp.body = {forEach : function (block) {&lt;br /&gt;
    raw.forEach(function (i) {&lt;br /&gt;
        block(i.decodeToString(encoding));&lt;br /&gt;
    });&lt;br /&gt;
}};&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Make a best-guess attempt to determine the appropriate encoding based on the response headers if no encoding is specified.  The ultimate fallback encoding SHOULD be UTF-8.  &lt;br /&gt;
&lt;br /&gt;
=== unDecode(response) ===&lt;br /&gt;
&lt;br /&gt;
Replace the decoded body with the original body.  This is useful when the decoded content is clearly invalid and the consumer wants to backtrack.&lt;br /&gt;
&lt;br /&gt;
== Members ==&lt;br /&gt;
&lt;br /&gt;
All members below are required and SHOULD be protected.&lt;br /&gt;
&lt;br /&gt;
=== body ===&lt;br /&gt;
&lt;br /&gt;
An iterable (that is &amp;lt;code&amp;gt;forEach&amp;lt;/code&amp;gt;-able) object where forEach iterates over items with a &amp;lt;code&amp;gt;toByteString&amp;lt;/code&amp;gt; method.&lt;br /&gt;
&lt;br /&gt;
Implementers MAY require that the body member expose a &amp;lt;code&amp;gt;push&amp;lt;/code&amp;gt; method in order for the write function to operate properly.&lt;br /&gt;
&lt;br /&gt;
Default value: []&lt;br /&gt;
&lt;br /&gt;
=== headers ===&lt;br /&gt;
&lt;br /&gt;
A hash of request headers.  Care SHOULD be taken to ensure that keys are added in a case-insensitive manner.&lt;br /&gt;
&lt;br /&gt;
Default value: {&amp;quot;X-Requested-With&amp;quot; : &amp;quot;CommonJS HTTP Client&amp;quot;}&lt;br /&gt;
&lt;br /&gt;
=== method ===&lt;br /&gt;
&lt;br /&gt;
The request method as a string.&lt;br /&gt;
&lt;br /&gt;
Default value: &amp;quot;GET&amp;quot;&lt;br /&gt;
&lt;br /&gt;
=== url ===&lt;br /&gt;
&lt;br /&gt;
URL as a string&lt;br /&gt;
&lt;br /&gt;
Default value: none&lt;br /&gt;
&lt;br /&gt;
== Example Implementation ==&lt;br /&gt;
&lt;br /&gt;
* Isaac&#039;s Narwhal fork: [http://github.com/isaacs/narwhal/blob/master/lib/http-client.js code], [http://github.com/isaacs/narwhal-playground/blob/master/http-client.js usage]&lt;/div&gt;</summary>
		<author><name>IsaacSchlueter</name></author>
	</entry>
	<entry>
		<id>https://wiki.mozilla.org/index.php?title=ServerJS/HTTP_Client/A&amp;diff=166522</id>
		<title>ServerJS/HTTP Client/A</title>
		<link rel="alternate" type="text/html" href="https://wiki.mozilla.org/index.php?title=ServerJS/HTTP_Client/A&amp;diff=166522"/>
		<updated>2009-09-04T03:03:01Z</updated>

		<summary type="html">&lt;p&gt;IsaacSchlueter: /* Example Implementation */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Proposal A, Draft 1&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Status: Proposal&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
The &amp;quot;http-client&amp;quot; module exposes an HTTPClient constructor that creates an HTTP Client object.&lt;br /&gt;
&lt;br /&gt;
== Object Methods ==&lt;br /&gt;
&lt;br /&gt;
All methods return &amp;quot;this&amp;quot; except where otherwise specified.&lt;br /&gt;
&lt;br /&gt;
=== set([settings object | key, value]) ===&lt;br /&gt;
&lt;br /&gt;
Set the body, headers, method, or url, or any combination thereof in the settings object.  Attribute validity is enforced (see valid settings on members, below.)&lt;br /&gt;
&lt;br /&gt;
=== setHeader(key, val) ===&lt;br /&gt;
&lt;br /&gt;
Set a header on the header object in a case-insensitive manner.  That is, if the user sets &amp;quot;content-type&amp;quot;, and then later sets &amp;quot;Content-Type&amp;quot;, then the first setting is lost.&lt;br /&gt;
&lt;br /&gt;
=== setHeaders(headers:Object) ===&lt;br /&gt;
&lt;br /&gt;
Set a bunch of headers expressed as name-value pairs.&lt;br /&gt;
&lt;br /&gt;
=== write(data:toByteString-able) ===&lt;br /&gt;
&lt;br /&gt;
Append data to the outgoing request.  (That is, to the iterable body object.)&lt;br /&gt;
&lt;br /&gt;
Implementers MAY require the body object to expose a push() method, and call this push() method to append data to the request.&lt;br /&gt;
&lt;br /&gt;
=== connect() ===&lt;br /&gt;
&lt;br /&gt;
Open the connection to the URL using the method supplied.  If the method or url is missing, throw an error.&lt;br /&gt;
&lt;br /&gt;
After connecting, write() will have no effect.&lt;br /&gt;
&lt;br /&gt;
Calling connect() SHOULD NOT block the application, but MUST initiate the HTTP request.&lt;br /&gt;
&lt;br /&gt;
=== read() ===&lt;br /&gt;
&lt;br /&gt;
Read the request and return a JSGI-style object consisting of &amp;lt;code&amp;gt;{status:Integer, headers:Objecct, body:Iterable&amp;lt;ByteString&amp;gt;}&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Calling read() SHOULD NOT block the application until the request is completed, but it MUST open the input stream such that the data can be read.&lt;br /&gt;
&lt;br /&gt;
=== finish() ===&lt;br /&gt;
&lt;br /&gt;
Alias for .connect().read()&lt;br /&gt;
&lt;br /&gt;
== Static Methods ==&lt;br /&gt;
&lt;br /&gt;
=== decode(response[, encoding]) ===&lt;br /&gt;
&lt;br /&gt;
Return a response object where the body has been wrapped in a decoder middleware.&lt;br /&gt;
&lt;br /&gt;
For example:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;resp.body = {forEach : function (block) {&lt;br /&gt;
    raw.forEach(function (i) {&lt;br /&gt;
        block(i.decodeToString(encoding));&lt;br /&gt;
    });&lt;br /&gt;
}};&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Make a best-guess attempt to determine the appropriate encoding based on the response headers if no encoding is specified.  The ultimate fallback encoding SHOULD be UTF-8.  &lt;br /&gt;
&lt;br /&gt;
=== unDecode(response) ===&lt;br /&gt;
&lt;br /&gt;
Replace the decoded body with the original body.  This is useful when the decoded content is clearly invalid and the consumer wants to backtrack.&lt;br /&gt;
&lt;br /&gt;
== Members ==&lt;br /&gt;
&lt;br /&gt;
All members below are required and SHOULD be protected.&lt;br /&gt;
&lt;br /&gt;
=== body ===&lt;br /&gt;
&lt;br /&gt;
An iterable (that is &amp;lt;code&amp;gt;forEach&amp;lt;/code&amp;gt;-able) object where forEach iterates over items with a &amp;lt;code&amp;gt;toByteString&amp;lt;/code&amp;gt; method.&lt;br /&gt;
&lt;br /&gt;
Implementers MAY require that the body member expose a &amp;lt;code&amp;gt;push&amp;lt;/code&amp;gt; method in order for the write function to operate properly.&lt;br /&gt;
&lt;br /&gt;
Default value: []&lt;br /&gt;
&lt;br /&gt;
=== headers ===&lt;br /&gt;
&lt;br /&gt;
A hash of request headers.  Care SHOULD be taken to ensure that keys are added in a case-insensitive manner.&lt;br /&gt;
&lt;br /&gt;
Default value: {&amp;quot;X-Requested-With&amp;quot; : &amp;quot;CommonJS HTTP Client&amp;quot;}&lt;br /&gt;
&lt;br /&gt;
=== method ===&lt;br /&gt;
&lt;br /&gt;
The request method as a string.&lt;br /&gt;
&lt;br /&gt;
Default value: &amp;quot;GET&amp;quot;&lt;br /&gt;
&lt;br /&gt;
=== url ===&lt;br /&gt;
&lt;br /&gt;
URL as a string&lt;br /&gt;
&lt;br /&gt;
Default value: none&lt;br /&gt;
&lt;br /&gt;
== Example Implementation ==&lt;br /&gt;
&lt;br /&gt;
* Isaac&#039;s Narwhal fork: [http://github.com/isaacs/narwhal/blob/master/lib/http-client.js code], [http://github.com/isaacs/narwhal-playground/blob/master/http-client.js usage]&lt;/div&gt;</summary>
		<author><name>IsaacSchlueter</name></author>
	</entry>
	<entry>
		<id>https://wiki.mozilla.org/index.php?title=ServerJS/HTTP_Client/A&amp;diff=166521</id>
		<title>ServerJS/HTTP Client/A</title>
		<link rel="alternate" type="text/html" href="https://wiki.mozilla.org/index.php?title=ServerJS/HTTP_Client/A&amp;diff=166521"/>
		<updated>2009-09-04T03:02:40Z</updated>

		<summary type="html">&lt;p&gt;IsaacSchlueter: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Proposal A, Draft 1&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Status: Proposal&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
The &amp;quot;http-client&amp;quot; module exposes an HTTPClient constructor that creates an HTTP Client object.&lt;br /&gt;
&lt;br /&gt;
== Object Methods ==&lt;br /&gt;
&lt;br /&gt;
All methods return &amp;quot;this&amp;quot; except where otherwise specified.&lt;br /&gt;
&lt;br /&gt;
=== set([settings object | key, value]) ===&lt;br /&gt;
&lt;br /&gt;
Set the body, headers, method, or url, or any combination thereof in the settings object.  Attribute validity is enforced (see valid settings on members, below.)&lt;br /&gt;
&lt;br /&gt;
=== setHeader(key, val) ===&lt;br /&gt;
&lt;br /&gt;
Set a header on the header object in a case-insensitive manner.  That is, if the user sets &amp;quot;content-type&amp;quot;, and then later sets &amp;quot;Content-Type&amp;quot;, then the first setting is lost.&lt;br /&gt;
&lt;br /&gt;
=== setHeaders(headers:Object) ===&lt;br /&gt;
&lt;br /&gt;
Set a bunch of headers expressed as name-value pairs.&lt;br /&gt;
&lt;br /&gt;
=== write(data:toByteString-able) ===&lt;br /&gt;
&lt;br /&gt;
Append data to the outgoing request.  (That is, to the iterable body object.)&lt;br /&gt;
&lt;br /&gt;
Implementers MAY require the body object to expose a push() method, and call this push() method to append data to the request.&lt;br /&gt;
&lt;br /&gt;
=== connect() ===&lt;br /&gt;
&lt;br /&gt;
Open the connection to the URL using the method supplied.  If the method or url is missing, throw an error.&lt;br /&gt;
&lt;br /&gt;
After connecting, write() will have no effect.&lt;br /&gt;
&lt;br /&gt;
Calling connect() SHOULD NOT block the application, but MUST initiate the HTTP request.&lt;br /&gt;
&lt;br /&gt;
=== read() ===&lt;br /&gt;
&lt;br /&gt;
Read the request and return a JSGI-style object consisting of &amp;lt;code&amp;gt;{status:Integer, headers:Objecct, body:Iterable&amp;lt;ByteString&amp;gt;}&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Calling read() SHOULD NOT block the application until the request is completed, but it MUST open the input stream such that the data can be read.&lt;br /&gt;
&lt;br /&gt;
=== finish() ===&lt;br /&gt;
&lt;br /&gt;
Alias for .connect().read()&lt;br /&gt;
&lt;br /&gt;
== Static Methods ==&lt;br /&gt;
&lt;br /&gt;
=== decode(response[, encoding]) ===&lt;br /&gt;
&lt;br /&gt;
Return a response object where the body has been wrapped in a decoder middleware.&lt;br /&gt;
&lt;br /&gt;
For example:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;resp.body = {forEach : function (block) {&lt;br /&gt;
    raw.forEach(function (i) {&lt;br /&gt;
        block(i.decodeToString(encoding));&lt;br /&gt;
    });&lt;br /&gt;
}};&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Make a best-guess attempt to determine the appropriate encoding based on the response headers if no encoding is specified.  The ultimate fallback encoding SHOULD be UTF-8.  &lt;br /&gt;
&lt;br /&gt;
=== unDecode(response) ===&lt;br /&gt;
&lt;br /&gt;
Replace the decoded body with the original body.  This is useful when the decoded content is clearly invalid and the consumer wants to backtrack.&lt;br /&gt;
&lt;br /&gt;
== Members ==&lt;br /&gt;
&lt;br /&gt;
All members below are required and SHOULD be protected.&lt;br /&gt;
&lt;br /&gt;
=== body ===&lt;br /&gt;
&lt;br /&gt;
An iterable (that is &amp;lt;code&amp;gt;forEach&amp;lt;/code&amp;gt;-able) object where forEach iterates over items with a &amp;lt;code&amp;gt;toByteString&amp;lt;/code&amp;gt; method.&lt;br /&gt;
&lt;br /&gt;
Implementers MAY require that the body member expose a &amp;lt;code&amp;gt;push&amp;lt;/code&amp;gt; method in order for the write function to operate properly.&lt;br /&gt;
&lt;br /&gt;
Default value: []&lt;br /&gt;
&lt;br /&gt;
=== headers ===&lt;br /&gt;
&lt;br /&gt;
A hash of request headers.  Care SHOULD be taken to ensure that keys are added in a case-insensitive manner.&lt;br /&gt;
&lt;br /&gt;
Default value: {&amp;quot;X-Requested-With&amp;quot; : &amp;quot;CommonJS HTTP Client&amp;quot;}&lt;br /&gt;
&lt;br /&gt;
=== method ===&lt;br /&gt;
&lt;br /&gt;
The request method as a string.&lt;br /&gt;
&lt;br /&gt;
Default value: &amp;quot;GET&amp;quot;&lt;br /&gt;
&lt;br /&gt;
=== url ===&lt;br /&gt;
&lt;br /&gt;
URL as a string&lt;br /&gt;
&lt;br /&gt;
Default value: none&lt;br /&gt;
&lt;br /&gt;
== Example Implementation ==&lt;br /&gt;
&lt;br /&gt;
* Isaac&#039;s Narwhal branch on github: [http://github.com/isaacs/narwhal/blob/master/lib/http-client.js code], [http://github.com/isaacs/narwhal-playground/blob/master/http-client.js usage]&lt;/div&gt;</summary>
		<author><name>IsaacSchlueter</name></author>
	</entry>
	<entry>
		<id>https://wiki.mozilla.org/index.php?title=ServerJS/HTTP_Client/A&amp;diff=166519</id>
		<title>ServerJS/HTTP Client/A</title>
		<link rel="alternate" type="text/html" href="https://wiki.mozilla.org/index.php?title=ServerJS/HTTP_Client/A&amp;diff=166519"/>
		<updated>2009-09-04T02:58:16Z</updated>

		<summary type="html">&lt;p&gt;IsaacSchlueter: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Proposal A, Draft 1&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Status: Proposal&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
The &amp;quot;http-client&amp;quot; module exposes an HTTPClient constructor that creates an HTTP Client object.&lt;br /&gt;
&lt;br /&gt;
== Object Methods ==&lt;br /&gt;
&lt;br /&gt;
All methods return &amp;quot;this&amp;quot; except where otherwise specified.&lt;br /&gt;
&lt;br /&gt;
=== set([settings object | key, value]) ===&lt;br /&gt;
&lt;br /&gt;
Set the body, headers, method, or url, or any combination thereof in the settings object.  Attribute validity is enforced (see valid settings on members, below.)&lt;br /&gt;
&lt;br /&gt;
=== setHeader(key, val) ===&lt;br /&gt;
&lt;br /&gt;
Set a header on the header object in a case-insensitive manner.  That is, if the user sets &amp;quot;content-type&amp;quot;, and then later sets &amp;quot;Content-Type&amp;quot;, then the first setting is lost.&lt;br /&gt;
&lt;br /&gt;
=== setHeaders(headers:Object) ===&lt;br /&gt;
&lt;br /&gt;
Set a bunch of headers expressed as name-value pairs.&lt;br /&gt;
&lt;br /&gt;
=== write(data:toByteString-able) ===&lt;br /&gt;
&lt;br /&gt;
Append data to the outgoing request.  (That is, to the iterable body object.)&lt;br /&gt;
&lt;br /&gt;
Implementers MAY require the body object to expose a push() method, and call this push() method to append data to the request.&lt;br /&gt;
&lt;br /&gt;
=== connect() ===&lt;br /&gt;
&lt;br /&gt;
Open the connection to the URL using the method supplied.  If the method or url is missing, throw an error.&lt;br /&gt;
&lt;br /&gt;
After connecting, write() will have no effect.&lt;br /&gt;
&lt;br /&gt;
=== read() ===&lt;br /&gt;
&lt;br /&gt;
Read the request and return a JSGI-style object consisting of &amp;lt;code&amp;gt;{status:Integer, headers:Objecct, body:Iterable&amp;lt;ByteString&amp;gt;}&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
=== finish() ===&lt;br /&gt;
&lt;br /&gt;
Alias for .connect().read()&lt;br /&gt;
&lt;br /&gt;
== Static Methods ==&lt;br /&gt;
&lt;br /&gt;
=== decode(response[, encoding]) ===&lt;br /&gt;
&lt;br /&gt;
Return a response object where the body has been wrapped in a decoder middleware.&lt;br /&gt;
&lt;br /&gt;
For example:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;resp.body = {forEach : function (block) {&lt;br /&gt;
    raw.forEach(function (i) {&lt;br /&gt;
        block(i.decodeToString(encoding));&lt;br /&gt;
    });&lt;br /&gt;
}};&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Make a best-guess attempt to determine the appropriate encoding based on the response headers if no encoding is specified.  The ultimate fallback encoding SHOULD be UTF-8.  &lt;br /&gt;
&lt;br /&gt;
=== unDecode(response) ===&lt;br /&gt;
&lt;br /&gt;
Replace the decoded body with the original body.  This is useful when the decoded content is clearly invalid and the consumer wants to backtrack.&lt;br /&gt;
&lt;br /&gt;
== Members ==&lt;br /&gt;
&lt;br /&gt;
All members below are required and SHOULD be protected.&lt;br /&gt;
&lt;br /&gt;
=== body ===&lt;br /&gt;
&lt;br /&gt;
An iterable (that is &amp;lt;code&amp;gt;forEach&amp;lt;/code&amp;gt;-able) object where forEach iterates over items with a &amp;lt;code&amp;gt;toByteString&amp;lt;/code&amp;gt; method.&lt;br /&gt;
&lt;br /&gt;
Implementers MAY require that the body member expose a &amp;lt;code&amp;gt;push&amp;lt;/code&amp;gt; method in order for the write function to operate properly.&lt;br /&gt;
&lt;br /&gt;
Default value: []&lt;br /&gt;
&lt;br /&gt;
=== headers ===&lt;br /&gt;
&lt;br /&gt;
A hash of request headers.  Care SHOULD be taken to ensure that keys are added in a case-insensitive manner.&lt;br /&gt;
&lt;br /&gt;
Default value: {&amp;quot;X-Requested-With&amp;quot; : &amp;quot;CommonJS HTTP Client&amp;quot;}&lt;br /&gt;
&lt;br /&gt;
=== method ===&lt;br /&gt;
&lt;br /&gt;
The request method as a string.&lt;br /&gt;
&lt;br /&gt;
Default value: &amp;quot;GET&amp;quot;&lt;br /&gt;
&lt;br /&gt;
=== url ===&lt;br /&gt;
&lt;br /&gt;
URL as a string&lt;br /&gt;
&lt;br /&gt;
Default value: none&lt;/div&gt;</summary>
		<author><name>IsaacSchlueter</name></author>
	</entry>
	<entry>
		<id>https://wiki.mozilla.org/index.php?title=ServerJS/HTTP_Client/A&amp;diff=166518</id>
		<title>ServerJS/HTTP Client/A</title>
		<link rel="alternate" type="text/html" href="https://wiki.mozilla.org/index.php?title=ServerJS/HTTP_Client/A&amp;diff=166518"/>
		<updated>2009-09-04T02:57:15Z</updated>

		<summary type="html">&lt;p&gt;IsaacSchlueter: adding members&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Proposal A, Draft 1&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Status: Proposal&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
The &amp;quot;http-client&amp;quot; module exposes an HTTPClient constructor that creates an HTTP Client object.&lt;br /&gt;
&lt;br /&gt;
== Object Methods ==&lt;br /&gt;
&lt;br /&gt;
All methods return &amp;quot;this&amp;quot; except where otherwise specified.&lt;br /&gt;
&lt;br /&gt;
=== set([settings object | key, value]) ===&lt;br /&gt;
&lt;br /&gt;
Set the body, headers, method, or url, or any combination thereof in the settings object.  Attribute validity is enforced (see valid settings on members, below.)&lt;br /&gt;
&lt;br /&gt;
=== setHeader(key, val) ===&lt;br /&gt;
&lt;br /&gt;
Set a header on the header object in a case-insensitive manner.  That is, if the user sets &amp;quot;content-type&amp;quot;, and then later sets &amp;quot;Content-Type&amp;quot;, then the first setting is lost.&lt;br /&gt;
&lt;br /&gt;
=== setHeaders(headers:Object) ===&lt;br /&gt;
&lt;br /&gt;
Set a bunch of headers expressed as name-value pairs.&lt;br /&gt;
&lt;br /&gt;
=== write(data:toByteString-able) ===&lt;br /&gt;
&lt;br /&gt;
Append data to the outgoing request.  (That is, to the iterable body object.)&lt;br /&gt;
&lt;br /&gt;
Implementers MAY require the body object to expose a push() method, and call this push() method to append data to the request.&lt;br /&gt;
&lt;br /&gt;
=== connect() ===&lt;br /&gt;
&lt;br /&gt;
Open the connection to the URL using the method supplied.  If the method or url is missing, throw an error.&lt;br /&gt;
&lt;br /&gt;
After connecting, write() will have no effect.&lt;br /&gt;
&lt;br /&gt;
=== read() ===&lt;br /&gt;
&lt;br /&gt;
Read the request and return a JSGI-style object consisting of {status:Integer, headers:Objecct, body:Iterable&amp;amp;lt;ByteString&amp;gt;}.&lt;br /&gt;
&lt;br /&gt;
=== finish() ===&lt;br /&gt;
&lt;br /&gt;
Alias for .connect().read()&lt;br /&gt;
&lt;br /&gt;
== Static Methods ==&lt;br /&gt;
&lt;br /&gt;
=== decode(response[, encoding]) ===&lt;br /&gt;
&lt;br /&gt;
Return a response object where the body has been wrapped in a decoder middleware.&lt;br /&gt;
&lt;br /&gt;
For example:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&amp;lt;code&amp;gt;resp.body = {forEach : function (block) {&lt;br /&gt;
    raw.forEach(function (i) {&lt;br /&gt;
        block(i.decodeToString(encoding));&lt;br /&gt;
    });&lt;br /&gt;
}};&amp;lt;/code&amp;gt;&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Make a best-guess attempt to determine the appropriate encoding based on the response headers if no encoding is specified.  The ultimate fallback encoding SHOULD be UTF-8.  &lt;br /&gt;
&lt;br /&gt;
=== unDecode(response) ===&lt;br /&gt;
&lt;br /&gt;
Replace the decoded body with the original body.  This is useful when the decoded content is clearly invalid and the consumer wants to backtrack.&lt;br /&gt;
&lt;br /&gt;
== Members ==&lt;br /&gt;
&lt;br /&gt;
All members below are required and SHOULD be protected.&lt;br /&gt;
&lt;br /&gt;
=== body ===&lt;br /&gt;
&lt;br /&gt;
An iterable (that is &amp;lt;code&amp;gt;forEach&amp;lt;/code&amp;gt;-able) object where forEach iterates over items with a &amp;lt;code&amp;gt;toByteString&amp;lt;/code&amp;gt; method.&lt;br /&gt;
&lt;br /&gt;
Implementers MAY require that the body member expose a &amp;lt;code&amp;gt;push&amp;lt;/code&amp;gt; method in order for the write function to operate properly.&lt;br /&gt;
&lt;br /&gt;
Default value: []&lt;br /&gt;
&lt;br /&gt;
=== headers ===&lt;br /&gt;
&lt;br /&gt;
A hash of request headers.  Care SHOULD be taken to ensure that keys are added in a case-insensitive manner.&lt;br /&gt;
&lt;br /&gt;
Default value: {&amp;quot;X-Requested-With&amp;quot; : &amp;quot;CommonJS HTTP Client&amp;quot;}&lt;br /&gt;
&lt;br /&gt;
=== method ===&lt;br /&gt;
&lt;br /&gt;
The request method as a string.&lt;br /&gt;
&lt;br /&gt;
Default value: &amp;quot;GET&amp;quot;&lt;br /&gt;
&lt;br /&gt;
=== url ===&lt;br /&gt;
&lt;br /&gt;
URL as a string&lt;br /&gt;
&lt;br /&gt;
Default value: none&lt;/div&gt;</summary>
		<author><name>IsaacSchlueter</name></author>
	</entry>
	<entry>
		<id>https://wiki.mozilla.org/index.php?title=ServerJS/HTTP_Client/A&amp;diff=166516</id>
		<title>ServerJS/HTTP Client/A</title>
		<link rel="alternate" type="text/html" href="https://wiki.mozilla.org/index.php?title=ServerJS/HTTP_Client/A&amp;diff=166516"/>
		<updated>2009-09-04T02:52:47Z</updated>

		<summary type="html">&lt;p&gt;IsaacSchlueter: Initial draft&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Proposal A, Draft 1&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Status: Proposal&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
The &amp;quot;http-client&amp;quot; module exposes an HTTPClient constructor that creates an HTTP Client object.&lt;br /&gt;
&lt;br /&gt;
== Object Methods ==&lt;br /&gt;
&lt;br /&gt;
All methods return &amp;quot;this&amp;quot; except where otherwise specified.&lt;br /&gt;
&lt;br /&gt;
=== set([settings object | key, value]) ===&lt;br /&gt;
&lt;br /&gt;
Set the body, headers, method, or url, or any combination thereof in the settings object.  Attribute validity is enforced (see valid settings on members, below.)&lt;br /&gt;
&lt;br /&gt;
=== setHeader(key, val) ===&lt;br /&gt;
&lt;br /&gt;
Set a header on the header object in a case-insensitive manner.  That is, if the user sets &amp;quot;content-type&amp;quot;, and then later sets &amp;quot;Content-Type&amp;quot;, then the first setting is lost.&lt;br /&gt;
&lt;br /&gt;
=== setHeaders(headers:Object) ===&lt;br /&gt;
&lt;br /&gt;
Set a bunch of headers expressed as name-value pairs.&lt;br /&gt;
&lt;br /&gt;
=== write(data:toByteString-able) ===&lt;br /&gt;
&lt;br /&gt;
Append data to the outgoing request.  (That is, to the iterable body object.)&lt;br /&gt;
&lt;br /&gt;
Implementers MAY require the body object to expose a push() method, and call this push() method to append data to the request.&lt;br /&gt;
&lt;br /&gt;
=== connect() ===&lt;br /&gt;
&lt;br /&gt;
Open the connection to the URL using the method supplied.  If the method or url is missing, throw an error.&lt;br /&gt;
&lt;br /&gt;
After connecting, write() will have no effect.&lt;br /&gt;
&lt;br /&gt;
=== read() ===&lt;br /&gt;
&lt;br /&gt;
Read the request and return a JSGI-style object consisting of {status:Integer, headers:Objecct, body:Iterable&amp;amp;lt;ByteString&amp;gt;}.&lt;br /&gt;
&lt;br /&gt;
=== finish() ===&lt;br /&gt;
&lt;br /&gt;
Alias for .connect().read()&lt;br /&gt;
&lt;br /&gt;
== Static Methods ==&lt;br /&gt;
&lt;br /&gt;
=== decode(response[, encoding]) ===&lt;br /&gt;
&lt;br /&gt;
Return a response object where the body has been wrapped in a decoder middleware.&lt;br /&gt;
&lt;br /&gt;
For example:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&amp;lt;code&amp;gt;resp.body = {forEach : function (block) {&lt;br /&gt;
    raw.forEach(function (i) {&lt;br /&gt;
        block(i.decodeToString(encoding));&lt;br /&gt;
    });&lt;br /&gt;
}};&amp;lt;/code&amp;gt;&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Make a best-guess attempt to determine the appropriate encoding based on the response headers if no encoding is specified.  The ultimate fallback encoding SHOULD be UTF-8.  &lt;br /&gt;
&lt;br /&gt;
=== unDecode(response) ===&lt;br /&gt;
&lt;br /&gt;
Replace the decoded body with the original body.  This is useful when the decoded content is clearly invalid and the consumer wants to backtrack.&lt;/div&gt;</summary>
		<author><name>IsaacSchlueter</name></author>
	</entry>
	<entry>
		<id>https://wiki.mozilla.org/index.php?title=ServerJS/HTTP_Client/A&amp;diff=166510</id>
		<title>ServerJS/HTTP Client/A</title>
		<link rel="alternate" type="text/html" href="https://wiki.mozilla.org/index.php?title=ServerJS/HTTP_Client/A&amp;diff=166510"/>
		<updated>2009-09-04T02:36:30Z</updated>

		<summary type="html">&lt;p&gt;IsaacSchlueter: Created page with &amp;#039;nothing here yet.&amp;#039;&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;nothing here yet.&lt;/div&gt;</summary>
		<author><name>IsaacSchlueter</name></author>
	</entry>
	<entry>
		<id>https://wiki.mozilla.org/index.php?title=ServerJS/HTTP_Client&amp;diff=166509</id>
		<title>ServerJS/HTTP Client</title>
		<link rel="alternate" type="text/html" href="https://wiki.mozilla.org/index.php?title=ServerJS/HTTP_Client&amp;diff=166509"/>
		<updated>2009-09-04T02:35:57Z</updated>

		<summary type="html">&lt;p&gt;IsaacSchlueter: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;= HTTP Client API =&lt;br /&gt;
&lt;br /&gt;
Server side programs often need to grab information via HTTP. There should be an API that makes this as easy as possible.&lt;br /&gt;
&lt;br /&gt;
There are certainly other protocols that deserve support, but each protocol has its own purpose and interface and will be documented separately if it will become part of the stdlib.&lt;br /&gt;
&lt;br /&gt;
==  Requirements/Proposals ==&lt;br /&gt;
&lt;br /&gt;
[[ServerJS/HTTP_Client/A|HTTPClient Proposal A]]&lt;br /&gt;
&lt;br /&gt;
== Prior Art ==&lt;br /&gt;
&lt;br /&gt;
* [http://www.w3.org/TR/XMLHttpRequest/ XMLHttpRequest] is already the standard JS API for HTTP.&lt;br /&gt;
* [http://www.ejscript.org/products/ejs/doc/api/gen/ejscript/ejs.io-Http.html Here] is an extended HTTP API from Ejscript.&lt;br /&gt;
* v8cgi has a [http://code.google.com/p/v8cgi/wiki/API_HTTP HTTP] class&lt;br /&gt;
* Helma NG has a [http://dev.helma.org/trac/helma/browser/helma-ng/trunk/modules/helma/httpclient.js helma/httpclient module] ([http://helma.zumbrunn.com/reference/helma.Http.html Helma 1 reference docs]).&lt;/div&gt;</summary>
		<author><name>IsaacSchlueter</name></author>
	</entry>
	<entry>
		<id>https://wiki.mozilla.org/index.php?title=ServerJS/HTTP_Client&amp;diff=166508</id>
		<title>ServerJS/HTTP Client</title>
		<link rel="alternate" type="text/html" href="https://wiki.mozilla.org/index.php?title=ServerJS/HTTP_Client&amp;diff=166508"/>
		<updated>2009-09-04T02:35:25Z</updated>

		<summary type="html">&lt;p&gt;IsaacSchlueter: add link to proposal&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;= HTTP Client API =&lt;br /&gt;
&lt;br /&gt;
Server side programs often need to grab information via HTTP. There should be an API that makes this as easy as possible.&lt;br /&gt;
&lt;br /&gt;
There are certainly other protocols that deserve support, but each protocol has its own purpose and interface and will be documented separately if it will become part of the stdlib.&lt;br /&gt;
&lt;br /&gt;
==  Requirements/Proposals ==&lt;br /&gt;
&lt;br /&gt;
[[HTTP_Client/A]]&lt;br /&gt;
&lt;br /&gt;
== Prior Art ==&lt;br /&gt;
&lt;br /&gt;
* [http://www.w3.org/TR/XMLHttpRequest/ XMLHttpRequest] is already the standard JS API for HTTP.&lt;br /&gt;
* [http://www.ejscript.org/products/ejs/doc/api/gen/ejscript/ejs.io-Http.html Here] is an extended HTTP API from Ejscript.&lt;br /&gt;
* v8cgi has a [http://code.google.com/p/v8cgi/wiki/API_HTTP HTTP] class&lt;br /&gt;
* Helma NG has a [http://dev.helma.org/trac/helma/browser/helma-ng/trunk/modules/helma/httpclient.js helma/httpclient module] ([http://helma.zumbrunn.com/reference/helma.Http.html Helma 1 reference docs]).&lt;/div&gt;</summary>
		<author><name>IsaacSchlueter</name></author>
	</entry>
	<entry>
		<id>https://wiki.mozilla.org/index.php?title=User:IsaacSchlueter&amp;diff=166484</id>
		<title>User:IsaacSchlueter</title>
		<link rel="alternate" type="text/html" href="https://wiki.mozilla.org/index.php?title=User:IsaacSchlueter&amp;diff=166484"/>
		<updated>2009-09-04T00:31:49Z</updated>

		<summary type="html">&lt;p&gt;IsaacSchlueter: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Isaac Schlueter is a programmer who lives in Silicon Valley.  He is currently involved with [[ServerJS|the CommonJS group]], and works on [http://yuilibrary.com/ YUI] during the day.&lt;/div&gt;</summary>
		<author><name>IsaacSchlueter</name></author>
	</entry>
	<entry>
		<id>https://wiki.mozilla.org/index.php?title=User:IsaacSchlueter&amp;diff=166483</id>
		<title>User:IsaacSchlueter</title>
		<link rel="alternate" type="text/html" href="https://wiki.mozilla.org/index.php?title=User:IsaacSchlueter&amp;diff=166483"/>
		<updated>2009-09-04T00:31:21Z</updated>

		<summary type="html">&lt;p&gt;IsaacSchlueter: Created page with &amp;#039;Isaac Schlueter is a programmer who lives in Silicon Valley.  He is currently involved with the CommonJS group, and works on http://yuilibrary.com/ YUI during th…&amp;#039;&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Isaac Schlueter is a programmer who lives in Silicon Valley.  He is currently involved with [[ServerJS|the CommonJS group]], and works on [[http://yuilibrary.com/ YUI]] during the day.&lt;/div&gt;</summary>
		<author><name>IsaacSchlueter</name></author>
	</entry>
	<entry>
		<id>https://wiki.mozilla.org/index.php?title=ServerJS/ProposalProcess&amp;diff=166481</id>
		<title>ServerJS/ProposalProcess</title>
		<link rel="alternate" type="text/html" href="https://wiki.mozilla.org/index.php?title=ServerJS/ProposalProcess&amp;diff=166481"/>
		<updated>2009-09-04T00:25:39Z</updated>

		<summary type="html">&lt;p&gt;IsaacSchlueter: practically impractical!&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&#039;&#039;&#039;STATE: DISCUSSION&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
We adopt a [http://www.perlfoundation.org/perl5/index.cgi?jfdi JFDI] policy regarding adding proposals to CommonJS.&lt;br /&gt;
&lt;br /&gt;
As long as the page makes the level of acceptance clear with a line at the top, it&#039;s not a problem.&lt;br /&gt;
&lt;br /&gt;
== State 1: &amp;quot;Proposed&amp;quot; ==&lt;br /&gt;
&lt;br /&gt;
&amp;quot;Hay guys, I have an idea for a topic!&amp;quot;&lt;br /&gt;
&lt;br /&gt;
Don&#039;t say it, just do it.  Add a page to the wiki describing your proposal.&lt;br /&gt;
&lt;br /&gt;
Bonus points if you can point at working code.  It&#039;s not always prudent to implement something complicated before discussing with the group, since it might be misguided and difficult, but at the very least, rough sketch/prototype/proof of concept often helps crystallize the discussion.&lt;br /&gt;
&lt;br /&gt;
Congratulations.  You own the idea now.  You&#039;re responsible for maintaining the wiki page, counting votes, starting the discussion, etc.&lt;br /&gt;
&lt;br /&gt;
If it&#039;s not worth it to you to do the work, then it&#039;s probably not important enough to be in the spec.  This ensures that all ideas need to get over a bit of a hump to get accepted.&lt;br /&gt;
&lt;br /&gt;
== State 2: &amp;quot;Discussion&amp;quot; ==&lt;br /&gt;
&lt;br /&gt;
&amp;quot;Let&#039;s talk about my idea!&amp;quot;&lt;br /&gt;
&lt;br /&gt;
Send a message to [http://groups.google.com/group/commonjs CommonJS] with a link to the wiki page. We&#039;ll talk about it, build all kinds of bike sheds.&lt;br /&gt;
&lt;br /&gt;
This should last at least a few days, or however long necessary to flesh out any dissenting opinions.  People start weighing in with their votes.&lt;br /&gt;
&lt;br /&gt;
If you have an opinion, share it now.  If you don&#039;t care one way or the other, then stay out of it.&lt;br /&gt;
&lt;br /&gt;
=== Silence is not consent. ===&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;Some&#039;&#039; discussion must occur for the idea to progress to &amp;quot;official accepted&amp;quot; status.  If someone suggests something, and no one responds, then the idea remains open indefinitely.&lt;br /&gt;
&lt;br /&gt;
If you suggest something, and no one else speaks up in favor of it, that doesn&#039;t mean it&#039;s a bad idea.  However, this is probably something that you should just put in your own application, and it most likely does not belong in the CommonJS specification.  This bit of inertia prevents us from building specifications no one wants.&lt;br /&gt;
&lt;br /&gt;
The flip side of this: if someone suggests something, and you think it&#039;s a good idea, &#039;&#039;Speak up!&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
=== Unanimity is Suspect ===&lt;br /&gt;
&lt;br /&gt;
There may be cases when everyone involved in the discussion is in favor of the proposal.  This probably means that someone&#039;s voice isn&#039;t being heard.&lt;br /&gt;
&lt;br /&gt;
In the case of a completely one-sided discussion, make some effort to figure out who might be against it, and try to ping them directly, or at least wait until they weigh in on it before considering the issue closed.  It could be that they didn&#039;t feel strongly in the first place, or that they&#039;ve been swayed by the arguments from the other side.  But there was probably a reason for their initial resistance, and it should be heard.&lt;br /&gt;
&lt;br /&gt;
== State 3: &amp;quot;Decided&amp;quot; ==&lt;br /&gt;
&lt;br /&gt;
&amp;quot;We&#039;re talking in circles and here are the major ideas:...&amp;quot;&lt;br /&gt;
&lt;br /&gt;
Someone count the votes, and we make a decision.  Update the wiki page to the latest decision.&lt;br /&gt;
&lt;br /&gt;
Note that a simple vote count doesn&#039;t necessarily imply a decision.  If 15 people decide that it&#039;s a good idea to do something, and the 2 people who maintain that code rebut with valid reasons why it&#039;s impossible or impractical, then the 2 should outweigh the 15, and perhaps propose some kind of alternative to meet their needs.&lt;br /&gt;
&lt;br /&gt;
== State 4: &amp;quot;Implemented&amp;quot; ==&lt;br /&gt;
&lt;br /&gt;
At least a handful of the relevant projects have implemented the spec.  Add links to implementations to the wiki page.  At this point, it&#039;s considered final, and can only be changed by restarting this process.&lt;br /&gt;
&lt;br /&gt;
A proposal &#039;&#039;only&#039;&#039; reaches this state by virtue of being implemented in more than one library.  At this point, it is considered a standard, and implementers can rest assured that it will not change without good reason.&lt;/div&gt;</summary>
		<author><name>IsaacSchlueter</name></author>
	</entry>
	<entry>
		<id>https://wiki.mozilla.org/index.php?title=ServerJS/Process&amp;diff=166480</id>
		<title>ServerJS/Process</title>
		<link rel="alternate" type="text/html" href="https://wiki.mozilla.org/index.php?title=ServerJS/Process&amp;diff=166480"/>
		<updated>2009-09-04T00:23:21Z</updated>

		<summary type="html">&lt;p&gt;IsaacSchlueter: Add link to Proposal Process proposal&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;The goal of this project is to have something that people can run and build web frameworks and applications on.&lt;br /&gt;
&lt;br /&gt;
The process needs to support that goal, plus the goal of having a specification that allows people to make other JS interpreters/platforms compatible.&lt;br /&gt;
&lt;br /&gt;
There are two parts to the process:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;ol&amp;gt;&amp;lt;li&amp;gt;Creating the specs and code&amp;lt;li&amp;gt;Handling disagreements&amp;lt;/ol&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Number 1 is how things get done. Number 2 is how we ensure that number 1 is able to continue in face of inevitable disagreements.&lt;br /&gt;
&lt;br /&gt;
* [[ServerJS/ProposalProcess|CommonJS Proposal Process]]&lt;br /&gt;
&lt;br /&gt;
(to be continued...)&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Prior Art ==&lt;br /&gt;
&lt;br /&gt;
* [http://www.python.org/dev/peps/pep-0001/ Python Enhancement Proposal] (PEP). This process is not completely applicable, because Python has a dictator that keeps things from spiraling out of control.&lt;br /&gt;
* [http://srfi.schemers.org/ Scheme Requests For Implementation]&lt;br /&gt;
* [http://en.wikipedia.org/wiki/Request_for_Comments#RFC_production_and_evolution Request for Comments] (RFC)&lt;br /&gt;
* [http://www.apache.org/foundation/voting.html Apache Voting]&lt;br /&gt;
&lt;br /&gt;
== Related Discussions ==&lt;br /&gt;
&lt;br /&gt;
* [http://groups.google.com/group/commonjs/browse_thread/thread/280c8b0375783604 Organisation and Making Decisions]&lt;/div&gt;</summary>
		<author><name>IsaacSchlueter</name></author>
	</entry>
	<entry>
		<id>https://wiki.mozilla.org/index.php?title=ServerJS/Process&amp;diff=166479</id>
		<title>ServerJS/Process</title>
		<link rel="alternate" type="text/html" href="https://wiki.mozilla.org/index.php?title=ServerJS/Process&amp;diff=166479"/>
		<updated>2009-09-04T00:19:39Z</updated>

		<summary type="html">&lt;p&gt;IsaacSchlueter: fix broken link&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;The goal of this project is to have something that people can run and build web frameworks and applications on.&lt;br /&gt;
&lt;br /&gt;
The process needs to support that goal, plus the goal of having a specification that allows people to make other JS interpreters/platforms compatible.&lt;br /&gt;
&lt;br /&gt;
There are two parts to the process:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;ol&amp;gt;&amp;lt;li&amp;gt;Creating the specs and code&amp;lt;li&amp;gt;Handling disagreements&amp;lt;/ol&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Number 1 is how things get done. Number 2 is how we ensure that number 1 is able to continue in face of inevitable disagreements.&lt;br /&gt;
&lt;br /&gt;
(to be continued...)&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Prior Art ==&lt;br /&gt;
&lt;br /&gt;
* [http://www.python.org/dev/peps/pep-0001/ Python Enhancement Proposal] (PEP). This process is not completely applicable, because Python has a dictator that keeps things from spiraling out of control.&lt;br /&gt;
* [http://srfi.schemers.org/ Scheme Requests For Implementation]&lt;br /&gt;
* [http://en.wikipedia.org/wiki/Request_for_Comments#RFC_production_and_evolution Request for Comments] (RFC)&lt;br /&gt;
* [http://www.apache.org/foundation/voting.html Apache Voting]&lt;br /&gt;
&lt;br /&gt;
== Related Discussions ==&lt;br /&gt;
&lt;br /&gt;
* [http://groups.google.com/group/commonjs/browse_thread/thread/280c8b0375783604 Organisation and Making Decisions]&lt;/div&gt;</summary>
		<author><name>IsaacSchlueter</name></author>
	</entry>
	<entry>
		<id>https://wiki.mozilla.org/index.php?title=ServerJS/Process&amp;diff=166478</id>
		<title>ServerJS/Process</title>
		<link rel="alternate" type="text/html" href="https://wiki.mozilla.org/index.php?title=ServerJS/Process&amp;diff=166478"/>
		<updated>2009-09-04T00:18:22Z</updated>

		<summary type="html">&lt;p&gt;IsaacSchlueter: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;The goal of this project is to have something that people can run and build web frameworks and applications on.&lt;br /&gt;
&lt;br /&gt;
The process needs to support that goal, plus the goal of having a specification that allows people to make other JS interpreters/platforms compatible.&lt;br /&gt;
&lt;br /&gt;
There are two parts to the process:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;ol&amp;gt;&amp;lt;li&amp;gt;Creating the specs and code&amp;lt;li&amp;gt;Handling disagreements&amp;lt;/ol&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Number 1 is how things get done. Number 2 is how we ensure that number 1 is able to continue in face of inevitable disagreements.&lt;br /&gt;
&lt;br /&gt;
(to be continued...)&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Prior Art ==&lt;br /&gt;
&lt;br /&gt;
* [http://www.python.org/dev/peps/pep-0001/ Python Enhancement Proposal] (PEP). This process is not completely applicable, because Python has a dictator that keeps things from spiraling out of control.&lt;br /&gt;
* [http://srfi.schemers.org/ Scheme Requests For Implementation]&lt;br /&gt;
* [http://en.wikipedia.org/wiki/Request_for_Comments#RFC_production_and_evolution Request for Comments] (RFC)&lt;br /&gt;
* [http://www.apache.org/foundation/voting.html Apache Voting]&lt;br /&gt;
&lt;br /&gt;
== Related Discussions ==&lt;br /&gt;
&lt;br /&gt;
* [http://groups.google.com/group/serverjs/browse_thread/thread/280c8b0375783604 Organisation and Making Decisions]&lt;/div&gt;</summary>
		<author><name>IsaacSchlueter</name></author>
	</entry>
	<entry>
		<id>https://wiki.mozilla.org/index.php?title=ServerJS/ProposalProcess&amp;diff=166476</id>
		<title>ServerJS/ProposalProcess</title>
		<link rel="alternate" type="text/html" href="https://wiki.mozilla.org/index.php?title=ServerJS/ProposalProcess&amp;diff=166476"/>
		<updated>2009-09-04T00:15:18Z</updated>

		<summary type="html">&lt;p&gt;IsaacSchlueter: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&#039;&#039;&#039;STATE: DISCUSSION&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
We adopt a [http://www.perlfoundation.org/perl5/index.cgi?jfdi JFDI] policy regarding adding proposals to CommonJS.&lt;br /&gt;
&lt;br /&gt;
As long as the page makes the level of acceptance clear with a line at the top, it&#039;s not a problem.&lt;br /&gt;
&lt;br /&gt;
== State 1: &amp;quot;Proposed&amp;quot; ==&lt;br /&gt;
&lt;br /&gt;
&amp;quot;Hay guys, I have an idea for a topic!&amp;quot;&lt;br /&gt;
&lt;br /&gt;
Don&#039;t say it, just do it.  Add a page to the wiki describing your proposal.&lt;br /&gt;
&lt;br /&gt;
Bonus points if you can point at working code.  It&#039;s not always prudent to implement something complicated before discussing with the group, since it might be misguided and difficult, but at the very least, rough sketch/prototype/proof of concept often helps crystallize the discussion.&lt;br /&gt;
&lt;br /&gt;
Congratulations.  You own the idea now.  You&#039;re responsible for maintaining the wiki page, counting votes, starting the discussion, etc.&lt;br /&gt;
&lt;br /&gt;
If it&#039;s not worth it to you to do the work, then it&#039;s probably not important enough to be in the spec.  This ensures that all ideas need to get over a bit of a hump to get accepted.&lt;br /&gt;
&lt;br /&gt;
== State 2: &amp;quot;Discussion&amp;quot; ==&lt;br /&gt;
&lt;br /&gt;
&amp;quot;Let&#039;s talk about my idea!&amp;quot;&lt;br /&gt;
&lt;br /&gt;
Send a message to [http://groups.google.com/group/commonjs CommonJS] with a link to the wiki page. We&#039;ll talk about it, build all kinds of bike sheds.&lt;br /&gt;
&lt;br /&gt;
This should last at least a few days, or however long necessary to flesh out any dissenting opinions.  People start weighing in with their votes.&lt;br /&gt;
&lt;br /&gt;
If you have an opinion, share it now.  If you don&#039;t care one way or the other, then stay out of it.&lt;br /&gt;
&lt;br /&gt;
=== Silence is not consent. ===&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;Some&#039;&#039; discussion must occur for the idea to progress to &amp;quot;official accepted&amp;quot; status.  If someone suggests something, and no one responds, then the idea remains open indefinitely.&lt;br /&gt;
&lt;br /&gt;
If you suggest something, and no one else speaks up in favor of it, that doesn&#039;t mean it&#039;s a bad idea.  However, this is probably something that you should just put in your own application, and it most likely does not belong in the CommonJS specification.  This bit of inertia prevents us from building specifications no one wants.&lt;br /&gt;
&lt;br /&gt;
The flip side of this: if someone suggests something, and you think it&#039;s a good idea, &#039;&#039;Speak up!&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
=== Unanimity is Suspect ===&lt;br /&gt;
&lt;br /&gt;
There may be cases when everyone involved in the discussion is in favor of the proposal.  This probably means that someone&#039;s voice isn&#039;t being heard.&lt;br /&gt;
&lt;br /&gt;
In the case of a completely one-sided discussion, make some effort to figure out who might be against it, and try to ping them directly, or at least wait until they weigh in on it before considering the issue closed.  It could be that they didn&#039;t feel strongly in the first place, or that they&#039;ve been swayed by the arguments from the other side.  But there was probably a reason for their initial resistance, and it should be heard.&lt;br /&gt;
&lt;br /&gt;
== State 3: &amp;quot;Decided&amp;quot; ==&lt;br /&gt;
&lt;br /&gt;
&amp;quot;We&#039;re talking in circles and here are the major ideas:...&amp;quot;&lt;br /&gt;
&lt;br /&gt;
Someone count the votes, and we make a decision.  Update the wiki page to the latest decision.&lt;br /&gt;
&lt;br /&gt;
Note that a simple vote count doesn&#039;t necessarily imply a decision.  If 15 people decide that it&#039;s a good idea to do something, and the 2 people who maintain that code rebut with valid practical reasons why it&#039;s impossible or impractical, then the 2 should outweigh the 15, and perhaps propose some kind of alternative to meet their needs.&lt;br /&gt;
&lt;br /&gt;
== State 4: &amp;quot;Implemented&amp;quot; ==&lt;br /&gt;
&lt;br /&gt;
At least a handful of the relevant projects have implemented the spec.  Add links to implementations to the wiki page.  At this point, it&#039;s considered final, and can only be changed by restarting this process.&lt;br /&gt;
&lt;br /&gt;
A proposal &#039;&#039;only&#039;&#039; reaches this state by virtue of being implemented in more than one library.  At this point, it is considered a standard, and implementers can rest assured that it will not change without good reason.&lt;/div&gt;</summary>
		<author><name>IsaacSchlueter</name></author>
	</entry>
	<entry>
		<id>https://wiki.mozilla.org/index.php?title=ServerJS/ProposalProcess&amp;diff=166469</id>
		<title>ServerJS/ProposalProcess</title>
		<link rel="alternate" type="text/html" href="https://wiki.mozilla.org/index.php?title=ServerJS/ProposalProcess&amp;diff=166469"/>
		<updated>2009-09-03T23:44:25Z</updated>

		<summary type="html">&lt;p&gt;IsaacSchlueter: Input from Kris Kowal&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;STATE: DISCUSSION&lt;br /&gt;
&lt;br /&gt;
I propose that we adopt a [http://www.perlfoundation.org/perl5/index.cgi?jfdi JFDI] policy regarding adding proposals CommonJS.&lt;br /&gt;
&lt;br /&gt;
As long as the page makes the level of acceptance clear with a link at the top, it shouldn&#039;t be a problem.&lt;br /&gt;
&lt;br /&gt;
== State 1: &amp;quot;Proposed&amp;quot; ==&lt;br /&gt;
&lt;br /&gt;
&amp;quot;Hay guys, I have an idea for a topic!&amp;quot;&lt;br /&gt;
&lt;br /&gt;
Don&#039;t say it, just do it.  Add a page to the wiki describing your proposal.&lt;br /&gt;
&lt;br /&gt;
Bonus points if you can point at working code.  It&#039;s not always prudent to implement something complicated before discussing with the group, since it might be misguided and difficult, but at the very least, rough sketch/prototype/proof of concept often helps crystallize the discussion.&lt;br /&gt;
&lt;br /&gt;
Congratulations.  You own the idea now.  You&#039;re responsible for maintaining the wiki page, counting votes, starting the discussion, etc.&lt;br /&gt;
&lt;br /&gt;
If it&#039;s not worth it to you to do the work, then it&#039;s probably not important enough to be in the spec.  This ensures that all ideas need to get over a bit of a hump to get accepted.&lt;br /&gt;
&lt;br /&gt;
== State 2: &amp;quot;Discussion&amp;quot; ==&lt;br /&gt;
&lt;br /&gt;
&amp;quot;Let&#039;s talk about my idea!&amp;quot;&lt;br /&gt;
&lt;br /&gt;
Send a message to [http://groups.google.com/group/commonjs CommonJS] with a link to the wiki page. We&#039;ll talk about it, build all kinds of bike sheds.&lt;br /&gt;
&lt;br /&gt;
This should last at least a few days, or however long necessary to flesh out any dissenting opinions.  People start weighing in with their votes.&lt;br /&gt;
&lt;br /&gt;
If you have an opinion, share it now.  If you don&#039;t care one way or the other, then stay out of it.&lt;br /&gt;
&lt;br /&gt;
=== Silence is not consent. ===&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;Some&#039;&#039; discussion must occur for the idea to progress to &amp;quot;official accepted&amp;quot; status.  If someone suggests something, and no one responds, then the idea remains open indefinitely.&lt;br /&gt;
&lt;br /&gt;
If you suggest something, and no one else speaks up in favor of it, that doesn&#039;t mean it&#039;s a bad idea.  However, this is probably something that you should just put in your own application, and it most likely does not belong in the CommonJS specification.  This bit of inertia prevents us from building specifications no one wants.&lt;br /&gt;
&lt;br /&gt;
The flip side of this: if someone suggests something, and you think it&#039;s a good idea, &#039;&#039;Speak up!&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
=== Unanimity is Suspect ===&lt;br /&gt;
&lt;br /&gt;
There may be cases when everyone involved in the discussion is in favor of the proposal.  This probably means that someone&#039;s voice isn&#039;t being heard.&lt;br /&gt;
&lt;br /&gt;
In the case of a completely one-sided discussion, make some effort to figure out who might be against it, and try to ping them directly, or at least wait until they weigh in on it before considering the issue closed.  It could be that they didn&#039;t feel strongly in the first place, or that they&#039;ve been swayed by the arguments from the other side.  But there was probably a reason for their initial resistance, and it should be heard.&lt;br /&gt;
&lt;br /&gt;
== State 3: &amp;quot;Decided&amp;quot; ==&lt;br /&gt;
&lt;br /&gt;
&amp;quot;We&#039;re talking in circles and here are the major ideas:...&amp;quot;&lt;br /&gt;
&lt;br /&gt;
Someone count the votes, and we make a decision.  Update the wiki page to the latest decision.&lt;br /&gt;
&lt;br /&gt;
Note that a simple vote count doesn&#039;t necessarily imply a decision.  If 15 people decide that it&#039;s a good idea to do something, and the 2 people who maintain that code rebut with valid practical reasons why it&#039;s impossible or impractical, then the 2 should outweigh the 15, and perhaps propose some kind of alternative to meet their needs.&lt;br /&gt;
&lt;br /&gt;
== State 4: &amp;quot;Implemented&amp;quot; ==&lt;br /&gt;
&lt;br /&gt;
At least a handful of the relevant projects have implemented the spec.  Add links to implementations to the wiki page.  At this point, it&#039;s considered final, and can only be changed by restarting this process.&lt;br /&gt;
&lt;br /&gt;
A proposal &#039;&#039;only&#039;&#039; reaches this state by virtue of being implemented in more than one library.  At this point, it is considered a standard, and implementers can rest assured that it will not change without good reason.&lt;/div&gt;</summary>
		<author><name>IsaacSchlueter</name></author>
	</entry>
	<entry>
		<id>https://wiki.mozilla.org/index.php?title=ServerJS/ProposalProcess&amp;diff=166468</id>
		<title>ServerJS/ProposalProcess</title>
		<link rel="alternate" type="text/html" href="https://wiki.mozilla.org/index.php?title=ServerJS/ProposalProcess&amp;diff=166468"/>
		<updated>2009-09-03T23:42:29Z</updated>

		<summary type="html">&lt;p&gt;IsaacSchlueter: Input from Kris Kowal&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;STATE: DISCUSSION&lt;br /&gt;
&lt;br /&gt;
I propose that we adopt a [http://www.perlfoundation.org/perl5/index.cgi?jfdi JFDI] policy regarding adding proposals CommonJS.&lt;br /&gt;
&lt;br /&gt;
As long as the page makes the level of acceptance clear with a link at the top, it shouldn&#039;t be a problem.&lt;br /&gt;
&lt;br /&gt;
== State 1: &amp;quot;Proposed&amp;quot; ==&lt;br /&gt;
&lt;br /&gt;
&amp;quot;Hay guys, I have an idea for a topic!&amp;quot;&lt;br /&gt;
&lt;br /&gt;
Don&#039;t say it, just do it.  Add a page to the wiki describing your proposal.&lt;br /&gt;
&lt;br /&gt;
Bonus points if you can point at working code.  It&#039;s not always prudent to implement something complicated before discussing with the group, since it might be misguided and difficult, but at the very least, rough sketch/prototype/proof of concept often helps crystallize the discussion.&lt;br /&gt;
&lt;br /&gt;
Congratulations.  You own the idea now.  You&#039;re responsible for maintaining the wiki page, counting votes, starting the discussion, etc.&lt;br /&gt;
&lt;br /&gt;
If it&#039;s not worth it to you to do the work, then it&#039;s probably not important enough to be in the spec.  This ensures that all ideas need to get over a bit of a hump to get accepted.&lt;br /&gt;
&lt;br /&gt;
== State 2: &amp;quot;Discussion&amp;quot; ==&lt;br /&gt;
&lt;br /&gt;
&amp;quot;Let&#039;s talk about my idea!&amp;quot;&lt;br /&gt;
&lt;br /&gt;
Send a message to [http://groups.google.com/group/commonjs CommonJS] with a link to the wiki page. We&#039;ll talk about it, build all kinds of bike sheds.&lt;br /&gt;
&lt;br /&gt;
This should last at least a few days, or however long necessary to flesh out any dissenting opinions.  People start weighing in with their votes.&lt;br /&gt;
&lt;br /&gt;
If you have an opinion, share it now.  If you don&#039;t care one way or the other, then stay out of it.&lt;br /&gt;
&lt;br /&gt;
=== Silence is not consent. ===&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;Some&#039;&#039; discussion must occur for the idea to progress to &amp;quot;official accepted&amp;quot; status.  If someone suggests something, and no one responds, then the idea remains open indefinitely.&lt;br /&gt;
&lt;br /&gt;
If you suggest something, and no one else speaks up in favor of it, that doesn&#039;t mean it&#039;s a bad idea.  However, this is probably something that you should just put in your own application, and it most likely does not belong in the CommonJS specification.  This bit of inertia prevents us from building specifications no one wants.&lt;br /&gt;
&lt;br /&gt;
The flip side of this: if someone suggests something, and you think it&#039;s a good idea, &#039;&#039;Speak up!&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
=== Unanimity is Suspect ===&lt;br /&gt;
&lt;br /&gt;
There may be cases when everyone involved in the discussion is in favor of the proposal.  This probably means that someone&#039;s voice isn&#039;t being heard.&lt;br /&gt;
&lt;br /&gt;
In the case of a completely one-sided discussion, make some effort to figure out who might be against it, and try to ping them directly, or at least wait until they weigh in on it before considering the issue closed.  It could be that they didn&#039;t feel strongly in the first place, or that they&#039;ve been swayed by the arguments from the other side.  But there was probably a reason for their initial resistance, and it should be heard.&lt;br /&gt;
&lt;br /&gt;
== State 3: &amp;quot;Decided&amp;quot; ==&lt;br /&gt;
&lt;br /&gt;
&amp;quot;We&#039;re talking in circles and here are the major ideas:...&amp;quot;&lt;br /&gt;
&lt;br /&gt;
Someone count the votes, and we make a decision.  Update the wiki page to the latest decision.&lt;br /&gt;
&lt;br /&gt;
Note that a simple vote count doesn&#039;t necessarily imply a decision.  If 15 people decide that it&#039;s a good idea to do something, and the 2 people who maintain that code rebut with valid practical reasons why it&#039;s impossible or impractical, then the 2 should outweigh the 15, and perhaps propose some kind of alternative to meet their needs.&lt;br /&gt;
&lt;br /&gt;
== State 4: &amp;quot;Implemented&amp;quot; ==&lt;br /&gt;
&lt;br /&gt;
At least a handful of the relevant projects have implemented the spec.  Add links to implementations to the wiki page.  At this point, it&#039;s considered final, and can only be changed by restarting this process.&lt;/div&gt;</summary>
		<author><name>IsaacSchlueter</name></author>
	</entry>
	<entry>
		<id>https://wiki.mozilla.org/index.php?title=ServerJS/ProposalProcess&amp;diff=166425</id>
		<title>ServerJS/ProposalProcess</title>
		<link rel="alternate" type="text/html" href="https://wiki.mozilla.org/index.php?title=ServerJS/ProposalProcess&amp;diff=166425"/>
		<updated>2009-09-03T19:55:10Z</updated>

		<summary type="html">&lt;p&gt;IsaacSchlueter: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;STATE: DISCUSSION&lt;br /&gt;
&lt;br /&gt;
I propose that we adopt a [http://www.perlfoundation.org/perl5/index.cgi?jfdi JFDI] policy regarding adding proposals CommonJS.&lt;br /&gt;
&lt;br /&gt;
As long as the page makes the level of acceptance clear with a link at the top, it shouldn&#039;t be a problem.&lt;br /&gt;
&lt;br /&gt;
== State 1: &amp;quot;Proposed&amp;quot; ==&lt;br /&gt;
&lt;br /&gt;
&amp;quot;Hay guys, I have an idea for a topic!&amp;quot;&lt;br /&gt;
&lt;br /&gt;
Don&#039;t say it, just do it.  Add a page to the wiki describing your proposal.&lt;br /&gt;
&lt;br /&gt;
Bonus points if you can point at working code.  It&#039;s not always prudent to implement something complicated before discussing with the group, since it might be misguided and difficult, but at the very least, rough sketch/prototype/proof of concept often helps crystallize the discussion.&lt;br /&gt;
&lt;br /&gt;
Congratulations.  You own the idea now.  You&#039;re responsible for maintaining the wiki page, counting votes, starting the discussion, etc.&lt;br /&gt;
&lt;br /&gt;
If it&#039;s not worth it to you to do the work, then it&#039;s probably not important enough to be in the spec.  This ensures that all ideas need to get over a bit of a hump to get accepted.&lt;br /&gt;
&lt;br /&gt;
== State 2: &amp;quot;Discussion&amp;quot; ==&lt;br /&gt;
&lt;br /&gt;
&amp;quot;Let&#039;s talk about my idea!&amp;quot;&lt;br /&gt;
&lt;br /&gt;
Send a message to [http://groups.google.com/group/commonjs CommonJS] with a link to the wiki page. We&#039;ll talk about it, build all kinds of bike sheds.&lt;br /&gt;
&lt;br /&gt;
This should last at least a few days, or however long necessary to flesh out any dissenting opinions.  People start weighing in with their votes.&lt;br /&gt;
&lt;br /&gt;
Speak now or forever hold your peace.&lt;br /&gt;
&lt;br /&gt;
== State 3: &amp;quot;Decided&amp;quot; ==&lt;br /&gt;
&lt;br /&gt;
&amp;quot;We&#039;re talking in circles and here are the major ideas:...&amp;quot;&lt;br /&gt;
&lt;br /&gt;
Someone count the votes, and we make a decision.  Update the wiki page to the latest decision.&lt;br /&gt;
&lt;br /&gt;
Note that a simple vote count doesn&#039;t necessarily imply a decision.  If 15 people decide that it&#039;s a good idea to do something, and the 2 people who maintain that code rebut with valid practical reasons why it&#039;s impossible or impractical, then the 2 should outweigh the 15, and perhaps propose some kind of alternative to meet their needs.&lt;br /&gt;
&lt;br /&gt;
== State 4: &amp;quot;Implemented&amp;quot; ==&lt;br /&gt;
&lt;br /&gt;
At least a handful of the relevant projects have implemented the spec.  Add links to implementations to the wiki page.  At this point, it&#039;s considered final, and can only be changed by restarting this process.&lt;/div&gt;</summary>
		<author><name>IsaacSchlueter</name></author>
	</entry>
	<entry>
		<id>https://wiki.mozilla.org/index.php?title=ServerJS/ProposalProcess&amp;diff=166424</id>
		<title>ServerJS/ProposalProcess</title>
		<link rel="alternate" type="text/html" href="https://wiki.mozilla.org/index.php?title=ServerJS/ProposalProcess&amp;diff=166424"/>
		<updated>2009-09-03T19:52:03Z</updated>

		<summary type="html">&lt;p&gt;IsaacSchlueter: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;STATE: PROPOSED&lt;br /&gt;
&lt;br /&gt;
I propose that we adopt a [http://www.perlfoundation.org/perl5/index.cgi?jfdi JFDI] policy regarding adding proposals CommonJS.&lt;br /&gt;
&lt;br /&gt;
As long as the page makes the level of acceptance clear with a link at the top, it shouldn&#039;t be a problem.&lt;br /&gt;
&lt;br /&gt;
== State 1: &amp;quot;Proposed&amp;quot; ==&lt;br /&gt;
&lt;br /&gt;
&amp;quot;Hay guys, I have an idea for a topic!&amp;quot;&lt;br /&gt;
&lt;br /&gt;
Don&#039;t say it, just do it.  Add a page to the wiki describing your proposal.&lt;br /&gt;
&lt;br /&gt;
Bonus points if you can point at working code.  It&#039;s not always prudent to implement something complicated before discussing with the group, since it might be misguided and difficult, but at the very least, rough sketch/prototype/proof of concept often helps crystallize the discussion.&lt;br /&gt;
&lt;br /&gt;
Congratulations.  You own the idea now.  You&#039;re responsible for maintaining the wiki page, counting votes, starting the discussion, etc.&lt;br /&gt;
&lt;br /&gt;
If it&#039;s not worth it to you to do the work, then it&#039;s probably not important enough to be in the spec.  This ensures that all ideas need to get over a bit of a hump to get accepted.&lt;br /&gt;
&lt;br /&gt;
== State 2: &amp;quot;In Discussion&amp;quot; ==&lt;br /&gt;
&lt;br /&gt;
&amp;quot;Let&#039;s talk about my idea!&amp;quot;&lt;br /&gt;
&lt;br /&gt;
Send a message to [http://groups.google.com/group/commonjs CommonJS] with a link to the wiki page. We&#039;ll talk about it, build all kinds of bike sheds.&lt;br /&gt;
&lt;br /&gt;
This should last at least a few days, or however long necessary to flesh out any dissenting opinions.  People start weighing in with their votes.&lt;br /&gt;
&lt;br /&gt;
Speak now or forever hold your peace.&lt;br /&gt;
&lt;br /&gt;
== State 3: &amp;quot;Decided&amp;quot; ==&lt;br /&gt;
&lt;br /&gt;
&amp;quot;We&#039;re talking in circles and here are the major ideas:...&amp;quot;&lt;br /&gt;
&lt;br /&gt;
Someone count the votes, and we make a decision.  Update the wiki page to the latest decision.&lt;br /&gt;
&lt;br /&gt;
Note that a simple vote count doesn&#039;t necessarily imply a decision.  If 15 people decide that it&#039;s a good idea to do something, and the 2 people who maintain that code rebut with valid practical reasons why it&#039;s impossible or impractical, then the 2 should outweigh the 15, and perhaps propose some kind of alternative to meet their needs.&lt;br /&gt;
&lt;br /&gt;
== State 4: &amp;quot;Implemented&amp;quot; ==&lt;br /&gt;
&lt;br /&gt;
At least a handful of the relevant projects have implemented the spec.  Add links to implementations to the wiki page.  At this point, it&#039;s considered final, and can only be changed by restarting this process.&lt;/div&gt;</summary>
		<author><name>IsaacSchlueter</name></author>
	</entry>
	<entry>
		<id>https://wiki.mozilla.org/index.php?title=ServerJS/ProposalProcess&amp;diff=166423</id>
		<title>ServerJS/ProposalProcess</title>
		<link rel="alternate" type="text/html" href="https://wiki.mozilla.org/index.php?title=ServerJS/ProposalProcess&amp;diff=166423"/>
		<updated>2009-09-03T19:51:23Z</updated>

		<summary type="html">&lt;p&gt;IsaacSchlueter: A modest proposal for proposals&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;STATE: PROPOSED&lt;br /&gt;
&lt;br /&gt;
I propose that we adopt a [http://www.perlfoundation.org/perl5/index.cgi?jfdi JFDI] policy regarding adding proposals CommonJS.&lt;br /&gt;
&lt;br /&gt;
As long as the page makes the level of acceptance clear with a link at the top, it shouldn&#039;t be a problem.&lt;br /&gt;
&lt;br /&gt;
== State 1: &amp;quot;Proposed&amp;quot; ==&lt;br /&gt;
&lt;br /&gt;
&amp;quot;Hay guys, I have an idea for a topic!&amp;quot;&lt;br /&gt;
&lt;br /&gt;
Don&#039;t say it, just do it.  Add a page to the wiki describing your proposal.&lt;br /&gt;
&lt;br /&gt;
Bonus points if you can point at working code.  It&#039;s not always prudent to implement something complicated before discussing with the group, since it might be misguided and difficult, but at the very least, rough sketch/prototype/proof of concept often helps crystallize the discussion.&lt;br /&gt;
&lt;br /&gt;
Congratulations.  You own the idea now.  You&#039;re responsible for maintaining the wiki page, counting votes, starting the discussion, etc.&lt;br /&gt;
&lt;br /&gt;
If it&#039;s not worth it to you to do the work, then it&#039;s probably not important enough to be in the spec.  This ensures that all ideas need to get over a bit of a hump to get accepted.&lt;br /&gt;
&lt;br /&gt;
== Stage 2: &amp;quot;In Discussion&amp;quot; ==&lt;br /&gt;
&lt;br /&gt;
&amp;quot;Let&#039;s talk about my idea!&amp;quot;&lt;br /&gt;
&lt;br /&gt;
Send a message to [http://groups.google.com/group/commonjs CommonJS] with a link to the wiki page. We&#039;ll talk about it, build all kinds of bike sheds.&lt;br /&gt;
&lt;br /&gt;
This should last at least a few days, or however long necessary to flesh out any dissenting opinions.  People start weighing in with their votes.&lt;br /&gt;
&lt;br /&gt;
Speak now or forever hold your peace.&lt;br /&gt;
&lt;br /&gt;
== Stage 3: &amp;quot;Decided&amp;quot; ==&lt;br /&gt;
&lt;br /&gt;
&amp;quot;We&#039;re talking in circles and here are the major ideas:...&amp;quot;&lt;br /&gt;
&lt;br /&gt;
Someone count the votes, and we make a decision.  Update the wiki page to the latest decision.&lt;br /&gt;
&lt;br /&gt;
Note that a simple vote count doesn&#039;t necessarily imply a decision.  If 15 people decide that it&#039;s a good idea to do something, and the 2 people who maintain that code rebut with valid practical reasons why it&#039;s impossible or impractical, then the 2 should outweigh the 15, and perhaps propose some kind of alternative to meet their needs.&lt;br /&gt;
&lt;br /&gt;
== Stage 4: &amp;quot;Implemented&amp;quot; ==&lt;br /&gt;
&lt;br /&gt;
At least a handful of the relevant projects have implemented the spec.  Add links to implementations to the wiki page.  At this point, it&#039;s considered final, and can only be changed by restarting this process.&lt;/div&gt;</summary>
		<author><name>IsaacSchlueter</name></author>
	</entry>
</feed>