Dart DocumentationpubsubPubsub

Pubsub class

class Pubsub {
	static final Pubsub _singleton = new Pubsub._internal();
	static final Map<String, PubsubStream> _channels = new Map<String, PubsubStream>();
	static final Logger logger = new Logger('Pubsub');

	factory Pubsub() {
		return _singleton;
	}

	static subscribe(String channel, Function cb) {
		List<String> channels = _get_parent_channels(channel);
		for(String c in channels) {
			_check_or_create(c);
			_channels[c].add(cb);
		}
	}

	static final publish = new VarargsFunction((arguments, kwargs) {
		List args = new List.from(arguments);
		String channel = args.removeAt(0);
		List<String> parents = _get_parent_channels(channel);
		List<String> children = _get_child_channels(channel);
		for(String p in parents) {
			final PubsubMessage message = new PubsubMessage(p, args, kwargs);
			_publish(p, message);
			for(String c in children) {
				_publish(c, message);
			}
		}
	});

	static _publish(String channel, PubsubMessage msg) {
		_check_or_create(channel);
		_channels[channel].fire(msg);
	}

	static unsubscribe(String channel, Function cb) {
		List<String> channels = _get_parent_channels(channel);
		for(String c in channels) {
			if(!_channels.containsKey(c)) continue;
			_channels[c].remove(cb);
			if(!_channels[c].hasListeners) {
				_channels.remove(c);
			}
		}
	}

	static _check_or_create(String channel) {
		if(!_channels.containsKey(channel)) {
			PubsubStream stream = new PubsubStream();
			_channels[channel] = stream;
		}
	}

	static List<String> _get_parent_channels(String channel) {
		return channel.split(' ');
	}

	static List<String> _get_child_channels(String channel) {
		List<String> topics = channel.split(' ');
		List<String> channels = new List<String>();
		for(int i=0; i<topics.length; i++) {
			List<String> topic_array = topics[i].split('.');
			topic_array.removeLast();

			while(topic_array.length > 0) {
				String topic = topic_array.join('.');
				topic_array.removeLast();
				channels.add(topic);
			}

			if(!channels.contains('*')) {
				channels.add('*');
			}
		}

		return channels;
	}

	static _debug(PubsubMessage msg) {
		logger.finest(msg.channel);
	}

	Pubsub._internal();
}

Static Properties

final Logger logger #

static final Logger logger = new Logger('Pubsub')

final publish #

static final publish = new VarargsFunction((arguments, kwargs) {
		List args = new List.from(arguments);
		String channel = args.removeAt(0);
		List<String> parents = _get_parent_channels(channel);
		List<String> children = _get_child_channels(channel);
		for(String p in parents) {
			final PubsubMessage message = new PubsubMessage(p, args, kwargs);
			_publish(p, message);
			for(String c in children) {
				_publish(c, message);
			}
		}
	})

Static Methods

dynamic subscribe(String channel, Function cb) #

static subscribe(String channel, Function cb) {
		List<String> channels = _get_parent_channels(channel);
		for(String c in channels) {
			_check_or_create(c);
			_channels[c].add(cb);
		}
	}

dynamic unsubscribe(String channel, Function cb) #

static unsubscribe(String channel, Function cb) {
		List<String> channels = _get_parent_channels(channel);
		for(String c in channels) {
			if(!_channels.containsKey(c)) continue;
			_channels[c].remove(cb);
			if(!_channels[c].hasListeners) {
				_channels.remove(c);
			}
		}
	}

Constructors

factory Pubsub() #

Creates a new Object instance.

Object instances have no meaningful state, and are only useful through their identity. An Object instance is equal to itself only.

docs inherited from Object
factory Pubsub() {
		return _singleton;
	}