Against The Day. Thomas Pynchon.
Nature Girl. Carl Hiaasen.
HaltinG StatE. Charles Stross.
Sunday, July 27, 2008
May through July Reading List
Tuesday, July 1, 2008
TCP in the browser?
Allen brought to my attention a blog post by Michael Carter about how Orbited now offers a JavaScript API for making TCP connections. I'm not sure how useful this is right now (and I actually mean that I'm not sure, not that I think it's useless and am trying to avoid saying so), though I can see how if, at some future date it's possible to make TCP connections without going through a proxy, apps written this way will suddenly make a lot of sense and be easy to port from apps already based on an API like this.
Anyhow, I thought this would be simple to implement with Athena, but I wanted to see how simple. Five minutes later I had this untested code:
# athenatcp.py
from twisted.internet.protocol import ClientCreator, Protocol
from twisted.internet import reactor
from nevow.athena import LiveElement, expose
class TCPElement(LiveElement):
jsClass = 'Network.TCP'
@expose
def connect(self, host, port):
def connected(proto):
self.proto = proto
self.proto.dataReceived = self.dataReceived
self.proto.connectionLost = self.connectionLost
cc = ClientCreator(reactor, Protocol)
d = cc.connectTCP(host, port)
d.addCallback(connected)
return d
@expose
def write(self, bytes):
self.proto.transport.write(bytes)
def dataReceived(self, data):
self.callRemote('dataReceived', data)
def connectionLost(self, reason):
self.callRemote('connectionLost', reason.getErrorMessage())
// athenatcp.js
// import Nevow.Athena
Network.TCP = Nevow.Athena.Widget.subclass('Network.TCP');
Network.TCP.methods(
function connect(self, host, port) {
return self.callRemote('connect', host, port);
},
function dataReceived(self, bytes) {
// override this
},
function connectionLost(self, reason) {
// override this
});
It'd probably be better if connect
were actually a factory function returning TCP
instances, but the general idea would be the same. Anyone think this is a really great idea? Anyone want to turn this spike into a real library for Athena?