1+ /**
2+ * Server sample to allow sub topic on multiplexed SockJS
3+ *
4+ * @author GregoryDepuille
5+ */
6+
7+ var _ = require ( 'underscore-node' ) ;
8+ var http = require ( 'http' ) ;
9+ var express = require ( 'express' ) ;
10+ var sockjs = require ( 'sockjs' ) ;
11+ var multiplex_server = require ( 'websocket-multiplex' ) ;
12+ var log4js = require ( 'log4js' ) ;
13+ var random = require ( "random-js" ) ( ) ;
14+
15+ log4js . configure ( 'log4js.json' ) ;
16+ var logger = log4js . getLogger ( "sub-topic-sample" ) ;
17+
18+ // Registered connection by topic
19+ var aSockets = [ ] ;
20+ var bSockets = [ ] ;
21+
22+ function makeChannel ( sockJsMux , channelName ) {
23+ logger . info ( "Add channel " + channelName ) ;
24+ return sockJsMux . registerChannel ( channelName ) ;
25+ }
26+
27+ function filterTopicPredicate ( topicSocket ) {
28+ return this === topicSocket . conn ;
29+ }
30+
31+ function cleanTopic ( connection , arrays ) {
32+ var f = _ . filter ( arrays , filterTopicPredicate , connection ) ;
33+ for ( var i = 0 ; i < f . length ; i ++ ) {
34+ var idx = arrays . indexOf ( f [ i ] ) ;
35+ arrays . splice ( idx , 1 ) ;
36+ }
37+ }
38+
39+ function configureMasterEvents ( sockJsServer ) {
40+ sockJsServer . on ( 'connection' , function ( socket ) {
41+ logger . info ( "Main socket opened " + socket ) ;
42+
43+ // Manage closed connection from browser
44+ socket . on ( 'close' , function ( ) {
45+ logger . info ( "Main socket closed " + socket ) ;
46+
47+ // Remove sockets.
48+ cleanTopic ( socket , aSockets ) ;
49+ cleanTopic ( socket , bSockets ) ;
50+ } ) ;
51+ } ) ;
52+ }
53+
54+ function configureChannelEvents ( channel , arrays ) {
55+ channel . on ( 'connection' , function ( socket ) {
56+ logger . info ( "Opened connection to " + socket . topic + " " + socket . conn ) ;
57+ arrays . push ( socket ) ;
58+ } ) ;
59+ }
60+
61+ function notifyA ( subTopic ) {
62+ for ( var i = 0 ; i < aSockets . length ; i ++ ) {
63+ var socket = aSockets [ i ] ;
64+ if ( socket . topic === "a." + subTopic ) {
65+ var message = {
66+ paris : random . integer ( 1 , 200 ) ,
67+ newYork : random . integer ( 1 , 200 ) ,
68+ london : random . integer ( 1 , 200 ) ,
69+ berlin : random . integer ( 1 , 200 )
70+ } ;
71+
72+ socket . write ( JSON . stringify ( message ) ) ;
73+ logger . info ( "Send a message on a." + subTopic + " channel to " + socket . conn ) ;
74+ }
75+ }
76+ }
77+
78+
79+ function notifyB ( subTopic ) {
80+ for ( var i = 0 ; i < bSockets . length ; i ++ ) {
81+ var socket = bSockets [ i ] ;
82+ if ( socket . topic === "b." + subTopic ) {
83+ socket . write ( JSON . stringify ( { value : random . integer ( 1 , 20 ) } ) ) ;
84+ logger . info ( "Send a message on b." + subTopic + " channel to " + socket . conn ) ;
85+ }
86+ }
87+ }
88+
89+
90+ logger . info ( 'Init sample' )
91+ var sockJsServer = sockjs . createServer ( ) ;
92+ var sockJsMux = new multiplex_server . MultiplexServer ( sockJsServer , { allowSubTopic : true } ) ;
93+
94+ configureMasterEvents ( sockJsServer ) ;
95+ configureChannelEvents ( makeChannel ( sockJsMux , 'a' ) , aSockets ) ;
96+ configureChannelEvents ( makeChannel ( sockJsMux , 'b' ) , bSockets ) ;
97+
98+ var app = express ( ) ;
99+ var httpServer = http . createServer ( app ) ;
100+ sockJsServer . installHandlers ( httpServer , { prefix :'/multiplex' } ) ;
101+ httpServer . listen ( 9999 , '0.0.0.0' ) ;
102+
103+ app . get ( '/' , function ( req , res ) {
104+ res . sendfile ( __dirname + '/index.html' ) ;
105+ } ) ;
106+
107+ app . get ( '/js/app.js' , function ( req , res ) {
108+ res . sendfile ( __dirname + '/js/app.js' ) ;
109+ } ) ;
110+
111+ app . get ( '/js/Chart.min.js' , function ( req , res ) {
112+ res . sendfile ( __dirname + '/js/Chart.min.js' ) ;
113+ } ) ;
114+
115+ app . get ( '/js/angular-chartjs.min.js' , function ( req , res ) {
116+ res . sendfile ( __dirname + '/js/angular-chartjs.min.js' ) ;
117+ } ) ;
118+
119+ app . get ( '/js/random.min.js' , function ( req , res ) {
120+ res . sendfile ( __dirname + '/js/random.min.js' ) ;
121+ } ) ;
122+
123+ setInterval ( function ( ) {
124+ var a = random . integer ( 1 , 20 ) ;
125+ notifyA ( a ) ;
126+
127+ var b = random . integer ( 1 , 20 ) ;
128+ notifyB ( b ) ;
129+ } , 500 ) ;
0 commit comments