First and foremost, I personally do not have time to make the JSGI standard. Take that with a grain of salt, because I also did not have time for Promises/A+, but many hands make light work.
There are several resources from which to start a promise-based JSGI spec.
Q-IO builds HTTP servers and clients using composable decorators (HTTP Apps) and forEachable streams. See "reader", "http", and "http-apps" for implementations, and the corresponding Jasmine specs. The README describes the type signatures of all the involved parts.
Botart is a project by Nathan Stott that uses Q and JSGI for declaring routes.
Joey is a similar project of mine that Motorola was kind enough to open-source. It is also a fluent API for configuring JSGI clients and servers with routes and negotiation.
Also, Michael Jackson started an effort called MachJS based on JSGI and promises. He hoped to enlist Tom Robinson and me to assist with building the specifications there.
https://github.com/machjs/mach
We certainly have enough experts to make a go of it.
As Dean points out, streams and back-pressure were the crux of much argument last time we had a go at this. I am still of the opinion that returning promises from the "write" method of "stream.forEach(write)" provides a great mechanism for signaling when you have finished consuming a bit of content. The Node community has also vetted high- and low-water-level buffering, which I think easily fit the promise/forEach model. By default, streams would pause, emit "write(data)", wait for the returned promise to be fulfilled, then resume. Accounting for "water-level", such a stream would down a semaphore on write(data) and up the semaphore on the resolution of the returned promise, pausing and resuming based on the number of outstanding promises. Since this would have control-flow implications, I’d elect to make the levels arguments of forEach. But that’s just guesswork at this point. I really need to revisit Q-IO in light of the changes to streams in Node.