initial v0.8.0RC changes'

This commit is contained in:
Jim Cowart 2012-12-19 20:11:24 -05:00
parent c64c2ae119
commit 8530716096
6 changed files with 143 additions and 272 deletions

View file

@ -535,8 +535,8 @@ describe( "Postal", function () {
var msgReceivedCnt = 0,
msgData;
before( function () {
channel = postal.channel( { channel : "MyGlobalChannel", topic : "MyTopic" } );
subscription = channel.subscribe( function ( data ) {
channel = postal.channel( "MyGlobalChannel" );
subscription = channel.subscribe( "MyTopic", function ( data ) {
msgReceivedCnt++;
msgData = data;
} );
@ -604,43 +604,7 @@ describe( "Postal", function () {
describe( "With no channel name provided", function () {
describe( "Using string argument", function () {
before( function () {
gch = postal.channel( "SomeTopic" );
} );
after( function () {
gch = undefined;
} );
it( "channel should be of type ChannelDefinition", function () {
expect( gch instanceof ChannelDefinition ).to.be.ok();
} );
it( "should set channel name to DEFAULT_CHANNEL", function () {
expect( gch.channel ).to.be( DEFAULT_CHANNEL );
} );
it( "should set topic to SomeTopic", function () {
expect( gch._topic ).to.be( "SomeTopic" );
} );
} );
describe( "Using options (object) argument", function () {
before( function () {
gch = postal.channel( { topic : "SomeTopic" } );
} );
after( function () {
gch = undefined;
} );
it( "channel should be of type ChannelDefinition", function () {
expect( gch instanceof ChannelDefinition ).to.be.ok();
} );
it( "should set channel name to DEFAULT_CHANNEL", function () {
expect( gch.channel ).to.be( DEFAULT_CHANNEL );
} );
it( "should set topic to SomeTopic", function () {
expect( gch._topic ).to.be( "SomeTopic" );
} );
} );
} );
describe( "With channel name provided", function () {
describe( "Using string arguments", function () {
before( function () {
gch = postal.channel( "SomeChannel", "SomeTopic" );
gch = postal.channel( "SomeChannel" );
} );
after( function () {
gch = undefined;
@ -651,26 +615,6 @@ describe( "Postal", function () {
it( "should set channel name to SomeChannel", function () {
expect( gch.channel ).to.be( "SomeChannel" );
} );
it( "should set topic to SomeTopic", function () {
expect( gch._topic ).to.be( "SomeTopic" );
} );
} );
describe( "Using options (object) argument", function () {
before( function () {
gch = postal.channel( { channel : "SomeChannel", topic : "SomeTopic" } );
} );
after( function () {
gch = undefined;
} );
it( "channel should be of type ChannelDefinition", function () {
expect( gch instanceof ChannelDefinition ).to.be.ok();
} );
it( "should set channel name to SomeChannel", function () {
expect( gch.channel ).to.be( "SomeChannel" );
} );
it( "should set topic to SomeTopic", function () {
expect( gch._topic ).to.be( "SomeTopic" );
} );
} );
} );
} );
@ -705,124 +649,6 @@ describe( "Postal", function () {
expect( wireTapEnvelope[0].topic ).to.be( "Oh.Hai.There" );
} );
} );
describe( "When binding channel - one source to one destination", function () {
describe( "with only channel values provided", function () {
var destData = [],
destEnv = [],
linkages;
before( function () {
linkages = postal.linkChannels( { channel : "sourceChannel" }, { channel : "destinationChannel" } );
subscription = postal.subscribe( { channel : "destinationChannel", topic : "Oh.Hai.There", callback : function ( data, env ) {
destData.push( data );
destEnv.push( env );
}} );
postal.publish( "sourceChannel", "Oh.Hai.There", { data : "I'm in yer bus, linkin' to yer subscriptionz..."} );
linkages[0].unsubscribe();
postal.publish( "sourceChannel", "Oh.Hai.There", { data : "I'm in yer bus, linkin' to yer subscriptionz..."} );
} );
after( function () {
postal.utils.reset();
} );
it( "linked subscription should only have been invoked once", function () {
expect( destData.length ).to.be( 1 );
expect( destEnv.length ).to.be( 1 );
} );
it( "linked subscription data should match expected results", function () {
expect( destData[0].data ).to.be( "I'm in yer bus, linkin' to yer subscriptionz..." );
} );
it( "linked subscription envelope should match expected results", function () {
expect( destEnv[0].channel ).to.be( "destinationChannel" );
expect( destEnv[0].topic ).to.be( "Oh.Hai.There" );
} );
} );
describe( "with channel and static topic values provided", function () {
var destData = [],
destEnv = [],
linkages;
before( function () {
linkages = postal.linkChannels( { channel : "sourceChannel", topic : "Oh.Hai.There" }, { channel : "destinationChannel", topic : "kthxbye" } );
subscription = postal.subscribe( { channel : "destinationChannel", topic : "kthxbye", callback : function ( data, env ) {
destData.push( data );
destEnv.push( env );
}} );
postal.publish( "sourceChannel", "Oh.Hai.There", { data : "I'm in yer bus, linkin' to yer subscriptionz..."} );
linkages[0].unsubscribe();
postal.publish( "sourceChannel", "Oh.Hai.There", { data : "I'm in yer bus, linkin' to yer subscriptionz..."} );
} );
after( function () {
postal.utils.reset();
} );
it( "linked subscription should only have been invoked once", function () {
expect( destData.length ).to.be( 1 );
expect( destEnv.length ).to.be( 1 );
} );
it( "linked subscription data should match expected results", function () {
expect( destData[0].data ).to.be( "I'm in yer bus, linkin' to yer subscriptionz..." );
} );
it( "linked subscription envelope should match expected results", function () {
expect( destEnv[0].channel ).to.be( "destinationChannel" );
expect( destEnv[0].topic ).to.be( "kthxbye" );
} );
} );
describe( "with channel and topic transform values provided", function () {
var destData = [],
destEnv = [],
linkages;
before( function () {
linkages = postal.linkChannels( { channel : "sourceChannel" }, { channel : "destinationChannel", topic : function ( tpc ) {
return "NewTopic." + tpc;
} } );
subscription = postal.subscribe( { channel : "destinationChannel", topic : "NewTopic.Oh.Hai.There", callback : function ( data, env ) {
destData.push( data );
destEnv.push( env );
}} );
postal.publish( "sourceChannel", "Oh.Hai.There", { data : "I'm in yer bus, linkin' to yer subscriptionz..."} );
linkages[0].unsubscribe();
postal.publish( "sourceChannel", "Oh.Hai.There", { data : "I'm in yer bus, linkin' to yer subscriptionz..."} );
} );
after( function () {
postal.utils.reset();
} );
it( "linked subscription should only have been invoked once", function () {
expect( destData.length ).to.be( 1 );
expect( destEnv.length ).to.be( 1 );
} );
it( "linked subscription data should match expected results", function () {
expect( destData[0].data ).to.be( "I'm in yer bus, linkin' to yer subscriptionz..." );
} );
it( "linked subscription envelope should match expected results", function () {
expect( destEnv[0].channel ).to.be( "destinationChannel" );
expect( destEnv[0].topic ).to.be( "NewTopic.Oh.Hai.There" );
} );
} );
} );
describe( "When binding channel - one source to multiple destinations", function () {
var destData = [],
destEnv = [],
callback = function ( data, env ) {
destData.push( data );
destEnv.push( env );
};
before( function () {
linkages = postal.linkChannels(
{ channel : "sourceChannel", topic: "Oh.Hai.There" },
[
{ channel : "destinationChannel", topic: "NewTopic.Oh.Hai" },
{ channel : "destinationChannel", topic: "NewTopic.Oh.Hai.There" }
]);
postal.subscribe( { channel : "destinationChannel", topic : "NewTopic.Oh.Hai", callback : callback} );
postal.subscribe( { channel : "destinationChannel", topic : "NewTopic.Oh.Hai.There", callback : callback } );
postal.publish( "sourceChannel", "Oh.Hai.There", { data : "I'm in yer bus, linkin' to yer subscriptionz..."} );
} );
after( function () {
postal.utils.reset();
} );
it( "linked subscriptions should each have been called once", function () {
expect( destData.length ).to.be( 2 );
expect( destEnv.length ).to.be( 2 );
} );
});
describe( "When calling postal.utils.reset", function () {
var resolver;
before( function () {

View file

@ -31,6 +31,7 @@
<script type="text/javascript" src="BindingsResolver.spec.js"></script>
<script type="text/javascript" src="AmqpBindingsResolver.spec.js"></script>
<script type="text/javascript" src="Postal.spec.js"></script>
<script type="text/javascript" src="linkedChannels.spec.js"></script>
<script type="text/javascript">
mocha.run();
</script>

120
spec/linkedChannels.spec.js Normal file
View file

@ -0,0 +1,120 @@
describe("Linked Channels", function(){
describe( "When binding channel - one source to one destination", function () {
describe( "with only channel values provided", function () {
var destData = [],
destEnv = [],
linkages;
before( function () {
linkages = postal.linkChannels( { channel : "sourceChannel" }, { channel : "destinationChannel" } );
subscription = postal.subscribe( { channel : "destinationChannel", topic : "Oh.Hai.There", callback : function ( data, env ) {
destData.push( data );
destEnv.push( env );
}} );
postal.publish( "sourceChannel", "Oh.Hai.There", { data : "I'm in yer bus, linkin' to yer subscriptionz..."} );
linkages[0].unsubscribe();
postal.publish( "sourceChannel", "Oh.Hai.There", { data : "I'm in yer bus, linkin' to yer subscriptionz..."} );
} );
after( function () {
postal.utils.reset();
} );
it( "linked subscription should only have been invoked once", function () {
expect( destData.length ).to.be( 1 );
expect( destEnv.length ).to.be( 1 );
} );
it( "linked subscription data should match expected results", function () {
expect( destData[0].data ).to.be( "I'm in yer bus, linkin' to yer subscriptionz..." );
} );
it( "linked subscription envelope should match expected results", function () {
expect( destEnv[0].channel ).to.be( "destinationChannel" );
expect( destEnv[0].topic ).to.be( "Oh.Hai.There" );
} );
} );
describe( "with channel and static topic values provided", function () {
var destData = [],
destEnv = [],
linkages;
before( function () {
linkages = postal.linkChannels( { channel : "sourceChannel", topic : "Oh.Hai.There" }, { channel : "destinationChannel", topic : "kthxbye" } );
subscription = postal.subscribe( { channel : "destinationChannel", topic : "kthxbye", callback : function ( data, env ) {
destData.push( data );
destEnv.push( env );
}} );
postal.publish( "sourceChannel", "Oh.Hai.There", { data : "I'm in yer bus, linkin' to yer subscriptionz..."} );
linkages[0].unsubscribe();
postal.publish( "sourceChannel", "Oh.Hai.There", { data : "I'm in yer bus, linkin' to yer subscriptionz..."} );
} );
after( function () {
postal.utils.reset();
} );
it( "linked subscription should only have been invoked once", function () {
expect( destData.length ).to.be( 1 );
expect( destEnv.length ).to.be( 1 );
} );
it( "linked subscription data should match expected results", function () {
expect( destData[0].data ).to.be( "I'm in yer bus, linkin' to yer subscriptionz..." );
} );
it( "linked subscription envelope should match expected results", function () {
expect( destEnv[0].channel ).to.be( "destinationChannel" );
expect( destEnv[0].topic ).to.be( "kthxbye" );
} );
} );
describe( "with channel and topic transform values provided", function () {
var destData = [],
destEnv = [],
linkages;
before( function () {
linkages = postal.linkChannels( { channel : "sourceChannel" }, { channel : "destinationChannel", topic : function ( tpc ) {
return "NewTopic." + tpc;
} } );
subscription = postal.subscribe( { channel : "destinationChannel", topic : "NewTopic.Oh.Hai.There", callback : function ( data, env ) {
destData.push( data );
destEnv.push( env );
}} );
postal.publish( "sourceChannel", "Oh.Hai.There", { data : "I'm in yer bus, linkin' to yer subscriptionz..."} );
linkages[0].unsubscribe();
postal.publish( "sourceChannel", "Oh.Hai.There", { data : "I'm in yer bus, linkin' to yer subscriptionz..."} );
} );
after( function () {
postal.utils.reset();
} );
it( "linked subscription should only have been invoked once", function () {
expect( destData.length ).to.be( 1 );
expect( destEnv.length ).to.be( 1 );
} );
it( "linked subscription data should match expected results", function () {
expect( destData[0].data ).to.be( "I'm in yer bus, linkin' to yer subscriptionz..." );
} );
it( "linked subscription envelope should match expected results", function () {
expect( destEnv[0].channel ).to.be( "destinationChannel" );
expect( destEnv[0].topic ).to.be( "NewTopic.Oh.Hai.There" );
} );
} );
} );
describe( "When binding channel - one source to multiple destinations", function () {
var destData = [],
destEnv = [],
callback = function ( data, env ) {
destData.push( data );
destEnv.push( env );
};
before( function () {
linkages = postal.linkChannels(
{ channel : "sourceChannel", topic: "Oh.Hai.There" },
[
{ channel : "destinationChannel", topic: "NewTopic.Oh.Hai" },
{ channel : "destinationChannel", topic: "NewTopic.Oh.Hai.There" }
]);
postal.subscribe( { channel : "destinationChannel", topic : "NewTopic.Oh.Hai", callback : callback} );
postal.subscribe( { channel : "destinationChannel", topic : "NewTopic.Oh.Hai.There", callback : callback } );
postal.publish( "sourceChannel", "Oh.Hai.There", { data : "I'm in yer bus, linkin' to yer subscriptionz..."} );
} );
after( function () {
postal.utils.reset();
} );
it( "linked subscriptions should each have been called once", function () {
expect( destData.length ).to.be( 2 );
expect( destEnv.length ).to.be( 2 );
} );
});
});

View file

@ -1,52 +1,4 @@
var publishPicker = {
"1" : function ( envelope ) {
if ( !envelope ) {
throw new Error( "publishing from the 'global' postal.publish call requires a valid envelope." );
}
envelope.channel = envelope.channel || DEFAULT_CHANNEL;
envelope.timeStamp = new Date();
postal.configuration.bus.publish( envelope );
return envelope;
},
"2" : function ( topic, data ) {
var envelope = { channel : DEFAULT_CHANNEL, topic : topic, timeStamp : new Date(), data : data };
postal.configuration.bus.publish( envelope );
return envelope;
},
"3" : function ( channel, topic, data ) {
var envelope = { channel : channel, topic : topic, timeStamp : new Date(), data : data };
postal.configuration.bus.publish( envelope );
return envelope;
}
},
channelPicker = {
"1" : function ( chn ) {
var channel = chn, topic, options = {};
if ( Object.prototype.toString.call( channel ) === "[object String]" ) {
channel = DEFAULT_CHANNEL;
topic = chn;
}
else {
channel = chn.channel || DEFAULT_CHANNEL;
topic = chn.topic;
options = chn.options || options;
}
return new postal.channelTypes[ options.type || "local" ]( channel, topic );
},
"2" : function ( chn, tpc ) {
var channel = chn, topic = tpc, options = {};
if ( Object.prototype.toString.call( tpc ) === "[object Object]" ) {
channel = DEFAULT_CHANNEL;
topic = chn;
options = tpc;
}
return new postal.channelTypes[ options.type || "local" ]( channel, topic );
},
"3" : function ( channel, topic, options ) {
return new postal.channelTypes[ options.type || "local" ]( channel, topic );
}
},
sessionInfo = {};
var sessionInfo = {};
// save some setup time, albeit tiny
localBus.subscriptions[SYSTEM_CHANNEL] = {};
@ -61,29 +13,22 @@ var postal = {
SYSTEM_CHANNEL : SYSTEM_CHANNEL
},
channelTypes : {
local : ChannelDefinition
},
ChannelDefinition : ChannelDefinition,
channel : function () {
var len = arguments.length;
if ( channelPicker[len] ) {
return channelPicker[len].apply( this, arguments );
}
SubscriptionDefinition: SubscriptionDefinition,
channel : function ( channelName ) {
return new ChannelDefinition( channelName );
},
subscribe : function ( options ) {
var callback = options.callback,
topic = options.topic,
channel = options.channel || DEFAULT_CHANNEL;
return new SubscriptionDefinition( channel, topic, callback );
return new SubscriptionDefinition( options.channel || DEFAULT_CHANNEL, options.topic, options.callback );
},
publish : function () {
var len = arguments.length;
if ( publishPicker[len] ) {
return publishPicker[len].apply( this, arguments );
}
publish : function ( envelope ) {
envelope.channel = envelope.channel || DEFAULT_CHANNEL;
postal.configuration.bus.publish( envelope );
return envelope;
},
addWireTap : function ( callback ) {

View file

@ -1,40 +1,18 @@
var ChannelDefinition = function ( channelName, defaultTopic ) {
var ChannelDefinition = function ( channelName ) {
this.channel = channelName || DEFAULT_CHANNEL;
this._topic = defaultTopic || "";
};
ChannelDefinition.prototype = {
subscribe : function () {
var len = arguments.length;
if ( len === 1 ) {
return new SubscriptionDefinition( this.channel, this._topic, arguments[0] );
}
else if ( len === 2 ) {
return new SubscriptionDefinition( this.channel, arguments[0], arguments[1] );
}
return arguments.length === 1 ?
new SubscriptionDefinition( this.channel, arguments[0].topic, arguments[0].callback ) :
new SubscriptionDefinition( this.channel, arguments[0], arguments[1] );
},
publish : function ( obj ) {
var _obj = obj || {};
var envelope = {
channel : this.channel,
topic : this._topic,
data : _obj
};
// If this is an envelope....
if ( _obj.topic && _obj.data ) {
envelope = _obj;
envelope.channel = envelope.channel || this.channel;
}
envelope.timeStamp = new Date();
publish : function () {
var envelope = arguments.length === 1 ? arguments[0] : { topic: arguments[0], data: arguments[1] };
envelope.channel = this.channel;
postal.configuration.bus.publish( envelope );
return envelope;
},
topic : function ( topic ) {
if ( topic === this._topic ) {
return this;
}
return new ChannelDefinition( this.channel, topic );
}
};

View file

@ -30,6 +30,7 @@ var localBus = {
},
publish : function ( envelope ) {
envelope.timeStamp = new Date();
_.each( this.wireTaps, function ( tap ) {
tap( envelope.data, envelope );
} );