Recommend this page to a friend! |
![]() ![]() |
Info | ![]() |
![]() |
![]() ![]() |
Reputation | Support forum | Blog | Links |
Last Updated | Ratings | Unique User Downloads | Download Rankings | |||||
2022-08-08 (2 months ago) ![]() | Not yet rated by the users | Total: 41 | All time: 10,477 This week: 229![]() |
Version | License | PHP version | Categories | |||
publishsubscribe 1.1.0 | Artistic License | 5 | PHP 5, Language |
Description | Author | ||||||||||||||
This package can register and call handlers of events by name. |
|
A simple and flexible publish-subscribe pattern implementation for PHP, Python, Node/XPCOM/JS
Supports nested topics, tagged topics and namespaced topics.
PublishSubscribe.js, PublishSubscribe.min.js
see also:
Topic/Event structure:
[Topic1[/SubTopic11/SubTopic111 ...]][#Tag1[#Tag2 ...]][@NAMESPACE1[@NAMESPACE2 ...]]
Namespaces work similarly to (for example) jQuery namespaces (so handlers can be un-binded based on namespaces etc..).
The difference between tags and namespaces is that when just a topic is triggered (without tags and namespaces), handlers which match the topic will be called regardless if they have namespaces or not, while handlers that match the topic but also have tags will not be called.
All topic separators (i.e "/", "#", "@") are configurable per instance.
During the publishing process, an event can be stopped and/or cancell the bubble propagation.
Methods (javascript)
var pb = new PublishSubscribe( );
// set topic/tag/namespace separators for this pb instance
// defaults are:
// Topic separator = "/"
// Tag separator = "#"
// Namespace separator = "@"
pb.setSeparators(["/", "#", "@"]);
// add/subscribe a handler for a topic with (optional) tags and (optional) namespaces
pb.on( topic_with_tags_namespaces, handlerFunc );
// add/subscribe a handler only once for a topic with (optional) tags and (optional) namespaces
// handler automatically is unsubscribed after it is called once
pb.one( topic_with_tags_namespaces, handlerFunc );
// add/subscribe a handler on top (first) for a topic with (optional) tags and (optional) namespaces
pb.on1( topic_with_tags_namespaces, handlerFunc );
// add/subscribe a handler only once on top (first) for a topic with (optional) tags and (optional) namespaces
// handler automatically is unsubscribed after it is called once
pb.one1( topic_with_tags_namespaces, handlerFunc );
// remove/unsubscribe a specific handler or all handlers matching topic with (optional) tags and (optional) namespaces
pb.off( topic_with_tags_namespaces [, handlerFunc=null ] );
// trigger/publish a topic with (optional) tags and (optional) namespaces and pass any data as well
pb.trigger( topic_with_tags_namespaces, data );
// pipeline allows to call subscribers (of given topic/message) asynchronously via a pipeline
// each subscriber calls next subscriber via the (passed) event's .next() method
// pipeline can be aborted via the (passed) event's .abort() method
// optional finish_callback will be called when the pipeline finishes the chain or event is aborted
pb.pipeline( topic_with_tags_namespaces, data [, abort_callback [, finish_callback]] );
// dispose PublishSubscribe instance
pb.disposePubSub( );
example (javascript)
var PublishSubscribe = require('../src/js/PublishSubscribe.js');
console.log('PublishSubscribe.VERSION = ' + PublishSubscribe.VERSION);
function _log(evt)
{
console.log({topic: evt.topic, originalTopic: evt.originalTopic, tags: evt.tags, namespaces: evt.namespaces, timestamp: evt.timestamp});
console.log(evt.data);
}
var handler1 = function(evt){
console.log('Handler1');
_log(evt);
// event abort
//evt.abort( );
// stop bubble propagation
//evt.propagate( false );
// stop propagation on same event
//evt.stop( );
//return false;
};
var handler2 = function(evt){
console.log('Handler2');
_log(evt);
};
var handler3 = function(evt){
console.log('Handler3');
_log(evt);
};
var handler4 = function(evt){
console.log('Handler4');
_log(evt);
};
var pb = new PublishSubscribe( )
.on('Topic1/SubTopic11#Tag1#Tag2', handler1)
.on1('Topic1/SubTopic11#Tag1#Tag2@NS1', handler2)
.on('Topic1/SubTopic11#Tag1#Tag2@NS1@NS2', handler3)
.off('@NS1@NS2')
.trigger('Topic1/SubTopic11#Tag2#Tag1', {key1: 'value1'})
.trigger('Topic1/SubTopic11#Tag2#Tag1@NS1', {key1: 'value1'})
;
output
PublishSubscribe.VERSION = 1.0.0
Handler2
{ topic: [ 'Topic1', 'SubTopic11' ],
originalTopic: [ 'Topic1', 'SubTopic11' ],
tags: [ 'Tag1', 'Tag2' ],
namespaces: [],
timestamp: 1413370469838 }
{ key1: 'value1' }
Handler1
{ topic: [ 'Topic1', 'SubTopic11' ],
originalTopic: [ 'Topic1', 'SubTopic11' ],
tags: [ 'Tag1', 'Tag2' ],
namespaces: [],
timestamp: 1413370469838 }
{ key1: 'value1' }
Handler2
{ topic: [ 'Topic1', 'SubTopic11' ],
originalTopic: [ 'Topic1', 'SubTopic11' ],
tags: [ 'Tag1', 'Tag2' ],
namespaces: [ 'NS1' ],
timestamp: 1413370469840 }
{ key1: 'value1' }
![]() |
File | Role | Description | ||
---|---|---|---|---|
![]() |
||||
![]() |
||||
![]() ![]() |
Icon | Icon image | ||
![]() ![]() |
Doc. | Documentation |
Version Control | Unique User Downloads | Download Rankings | |||||||||||||||
100% |
|
|
Applications that use this package |
If you know an application of this package, send a message to the author to add a link here.