Skip to content

Commit

Permalink
use setimeout
Browse files Browse the repository at this point in the history
  • Loading branch information
ericz committed Jul 15, 2012
1 parent 0aa178d commit a3d8e77
Show file tree
Hide file tree
Showing 6 changed files with 393 additions and 296 deletions.
228 changes: 130 additions & 98 deletions dist/binary.js
@@ -1,4 +1,4 @@
/*! binary.js build:0.0.0, development. Copyright(c) 2012 Eric Zhang <eric@ericzhang.com> MIT Licensed */
/*! binary.js build:0.0.1, development. Copyright(c) 2012 Eric Zhang <eric@ericzhang.com> MIT Licensed */
(function(exports){
/**
* EventEmitter v3.1.5
Expand Down Expand Up @@ -312,7 +312,36 @@ var util = {
},
info: console.log.bind(console),
pack: BinaryPack.pack,
unpack: BinaryPack.unpack
unpack: BinaryPack.unpack,
setZeroTimeout: (function(global) {
var timeouts = [];
var messageName = 'zero-timeout-message';

// Like setTimeout, but only takes a function argument. There's
// no time argument (always zero) and no arguments (you have to
// use a closure).
function setZeroTimeoutPostMessage(fn) {
timeouts.push(fn);
global.postMessage(messageName, '*');
}

function handleMessage(event) {
if (event.source == global && event.data == messageName) {
if (event.stopPropagation) {
event.stopPropagation();
}
if (timeouts.length) {
timeouts.shift()();
}
}
}
if (global.addEventListener) {
global.addEventListener('message', handleMessage, true);
} else if (global.attachEvent) {
global.attachEvent('onmessage', handleMessage);
}
return setZeroTimeoutPostMessage;
}(this))
};

// Stream shim for client side
Expand Down Expand Up @@ -456,102 +485,105 @@ function BinaryClient(socket) {
self.emit('close', code, message);
});
this._socket.addEventListener('message', function(data, flags){
// Message format
// [type, payload, bonus ]
//
// Reserved
// [ 0 , X , X ]
//
//
// New stream
// [ 1 , Meta , new streamId ]
//
//
// Data
// [ 2 , Data , streamId ]
//
//
// Pause
// [ 3 , null , streamId ]
//
//
// Resume
// [ 4 , null , streamId ]
//
//
// End
// [ 5 , null , streamId ]
//
//
// Close
// [ 6 , null , streamId ]
//

if(data.hasOwnProperty('data')){
data = data.data;
}

data = util.unpack(data);
switch(data[0]) {
case 0:
// Reserved
break;
case 1:
var meta = data[1];
var streamId = data[2];
var binaryStream = self._receiveStream(streamId);
self.emit('stream', binaryStream, meta);
break;
case 2:
var payload = data[1];
var streamId = data[2];
var binaryStream = self._streams[streamId];
if(binaryStream) {
binaryStream._onData(payload);
} else {
self.emit('error', 'Received `data` message for unknown stream: ' + streamId);
}
break;
case 3:
var streamId = data[2];
var binaryStream = self._streams[streamId];
if(binaryStream) {
binaryStream._onPause();
} else {
self.emit('error', 'Received `pause` message for unknown stream: ' + streamId);
}
break;
case 4:
var streamId = data[2];
var binaryStream = self._streams[streamId];
if(binaryStream) {
binaryStream._onResume();
} else {
self.emit('error', 'Received `resume` message for unknown stream: ' + streamId);
}
break;
case 5:
var streamId = data[2];
var binaryStream = self._streams[streamId];
if(binaryStream) {
binaryStream._onEnd();
} else {
self.emit('error', 'Received `end` message for unknown stream: ' + streamId);
}
break;
case 6:
var streamId = data[2];
var binaryStream = self._streams[streamId];
if(binaryStream) {
binaryStream._onClose();
delete self._streams[streamId];
} else {
self.emit('error', 'Received `close` message for unknown stream: ' + streamId);
}
break;
default:
self.emit('error', 'Unrecognized message type received: ' + data[0]);
}
util.setZeroTimeout(function(){

// Message format
// [type, payload, bonus ]
//
// Reserved
// [ 0 , X , X ]
//
//
// New stream
// [ 1 , Meta , new streamId ]
//
//
// Data
// [ 2 , Data , streamId ]
//
//
// Pause
// [ 3 , null , streamId ]
//
//
// Resume
// [ 4 , null , streamId ]
//
//
// End
// [ 5 , null , streamId ]
//
//
// Close
// [ 6 , null , streamId ]
//

if(data.hasOwnProperty('data')){
data = data.data;
}

data = util.unpack(data);
switch(data[0]) {
case 0:
// Reserved
break;
case 1:
var meta = data[1];
var streamId = data[2];
var binaryStream = self._receiveStream(streamId);
self.emit('stream', binaryStream, meta);
break;
case 2:
var payload = data[1];
var streamId = data[2];
var binaryStream = self._streams[streamId];
if(binaryStream) {
binaryStream._onData(payload);
} else {
self.emit('error', 'Received `data` message for unknown stream: ' + streamId);
}
break;
case 3:
var streamId = data[2];
var binaryStream = self._streams[streamId];
if(binaryStream) {
binaryStream._onPause();
} else {
self.emit('error', 'Received `pause` message for unknown stream: ' + streamId);
}
break;
case 4:
var streamId = data[2];
var binaryStream = self._streams[streamId];
if(binaryStream) {
binaryStream._onResume();
} else {
self.emit('error', 'Received `resume` message for unknown stream: ' + streamId);
}
break;
case 5:
var streamId = data[2];
var binaryStream = self._streams[streamId];
if(binaryStream) {
binaryStream._onEnd();
} else {
self.emit('error', 'Received `end` message for unknown stream: ' + streamId);
}
break;
case 6:
var streamId = data[2];
var binaryStream = self._streams[streamId];
if(binaryStream) {
binaryStream._onClose();
delete self._streams[streamId];
} else {
self.emit('error', 'Received `close` message for unknown stream: ' + streamId);
}
break;
default:
self.emit('error', 'Unrecognized message type received: ' + data[0]);
}
});

});
}
Expand Down
4 changes: 2 additions & 2 deletions dist/binary.min.js

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

0 comments on commit a3d8e77

Please sign in to comment.