Full-duplex web server compatible with goog.net.WebChannel (from closure-library) and written in Go.
|
1 year ago | |
---|---|---|
.gitignore | 7 years ago | |
LICENSE | 5 years ago | |
Makefile | 5 years ago | |
README.md | 5 years ago | |
bind.go | 1 year ago | |
forward.go | 1 year ago | |
gzip.go | 1 year ago | |
padder.go | 5 years ago | |
padder_test.go | 5 years ago | |
session.go | 1 year ago | |
sessionmanager.go | 1 year ago | |
sessionwrapper.go | 1 year ago | |
test.go | 4 years ago | |
wc.go | 1 year ago |
This library was used to build dropinchat.com for YC Hacks.
A Go web server compatible with closure-library's goog.net.WebChannel. A WebChannel represents a logical bi-directional communication channel between client and server. By exposing a generic communication interface which can be implemented over a variety of transports (eg: BrowserChannel, WebSockets, WebRTC, etc) WebChannel provides additional flexibility over programming directly on top of WebSockets.
The client-side portion of WebChannel is open sourced (APLv2) as part of closure-library. Unfortunately, Google has not released the server-side portion of the code required to use WebChannel meaningfully. The wc package provides an open source (BSD) licensed golang server-side library to fill this missing gap.
See the wcchat package for an example application.
From goog.net.WebChannel:
Similar to HTML5 WebSocket and Closure BrowserChannel, WebChannel offers an abstraction for point-to-point socket-like communication between a browser client and a remote origin.
WebChannels are created via
WebChannel
. Multiple WebChannels may be multiplexed over the same WebChannelTransport, which represents the underlying physical connectivity over standard wire protocols such as HTTP and SPDY.A WebChannels in turn represents a logical communication channel between the client and server end point. A WebChannel remains open for as long as the client or server end-point allows.
Messages may be delivered in-order or out-of-order, reliably or unreliably over the same WebChannel. Message delivery guarantees of a WebChannel is to be specified by the application code; and the choice of the underlying wire protocols is completely transparent to the API users.
Client-to-client messaging via WebRTC based transport may also be support via the same WebChannel API in future.
At the time of this writing (5/2014) the only WebChannel transport included in closure-library is BrowserChannel. As additional transports are added wc intends to add support for them as well.
From goog.net.BrowserChannel:
A BrowserChannel simulates a bidirectional socket over HTTP. It is the basis of the Gmail Chat IM connections to the server.
BrowserChannel works on all major browsers (including IE5.5+) using a variety of technologies including forever iframes (IE < 10) and XHR Streaming (IE10+ and non-IE).
To connect from the client:
goog.require('goog.net.createWebChannelTransport');
goog.require('goog.net.WebChannel');
/**
* @type {!goog.net.WebChannelTransport}
*/
var channelTransport = goog.net.createWebChannelTransport();
/**
* @type {!goog.net.WebChannel.Options}
*/
var options = { supportsCrossDomainXhr: true };
/**
* @type {!goog.net.WebChannel}
*/
var channel = channelTransport.createWebChannel('/channel', options);
/**
* Browser channel handler.
* @constructor
* @extends {goog.net.BrowserChannel.Handler}
*/
demo.ChannelHandler = function() {};
goog.inherits(demo.ChannelHandler, goog.net.BrowserChannel.Handler);
/** @inheritDoc */
demo.ChannelHandler.prototype.channelHandleArray = function(browserChannel, array) {
...
};
var handler = new demo.ChannelHandler();
var channelDebug = new goog.net.ChannelDebug();
var channel = new goog.net.BrowserChannel('8', ['<host prefix>', '<blocked prefix>']);
channel.setSupportsCrossDomainXhrs(true);
channel.setHandler(handler);
channel.setChannelDebug(channelDebug);
channel.connect('channel/test', 'channel/bind', {});
channel.sendMap(...);
channel.disconnect();
TODO(ahochhaus): Document
go get github.com/samegoal/wc