require([ 'dojo/aspect', 'dojo/json', 'dojo/topic' ], function (aspect, JSON, topic) { // Listen to calls to topic.subscribe aspect.after(topic, 'subscribe', function (topicName) { // Create a map of subscribed topics // The map simplifies ensuring unique elements in the array topic.subscriptionMap = topic.subscriptionMap || {}; if (!topic.subscriptionMap[topicName]) { topic.subscriptionMap[topicName] = true; // Create an array of subscribed topics topic.subscriptions = topic.subscriptions || []; topic.subscriptions.push(topicName); } }, true); // Listen to calls to topic.publish aspect.after(topic, 'publish', function (topicName) { topic.publishMap = topic.publishMap || {}; if (!topic.publishMap[topicName]) { topic.publishMap[topicName] = true; topic.publications = topic.publications || []; topic.publications.push(topicName); } }, true); // Subscribe to and publish some topics topic.subscribe('/test/topic1'); topic.subscribe('/test/topic2'); topic.subscribe('/test/topic1'); topic.publish('/test/topic3'); topic.publish('/test/topic4'); topic.publish('/test/topic3'); // Display the captured topics log('Subscribed topics:'); log(topic.subscriptions); log('Published topics:'); log(topic.publications); function log (info) { var node = document.createElement('div'); node.innerHTML = JSON.stringify(info); document.body.appendChild(node); } });