@@ -3,9 +3,23 @@ const EventEmitter = require('events');
33const ServerDescription = require ( './server_description' ) . ServerDescription ;
44const TopologyDescription = require ( './topology_description' ) . TopologyDescription ;
55const TopologyType = require ( './topology_description' ) . TopologyType ;
6+ const monitoring = require ( './monitoring' ) ;
7+
8+ // Global state
9+ let globalTopologyCounter = 0 ;
610
711/**
812 * A container of server instances representing a connection to a MongoDB topology.
13+ *
14+ * @fires Topology#serverOpening
15+ * @fires Topology#serverClosed
16+ * @fires Topology#serverDescriptionChanged
17+ * @fires Topology#topologyOpening
18+ * @fires Topology#topologyClosed
19+ * @fires Topology#topologyDescriptionChanged
20+ * @fires Topology#serverHeartbeatStarted
21+ * @fires Topology#serverHeartbeatSucceeded
22+ * @fires Topology#serverHeartbeatFailed
923 */
1024class Topology extends EventEmitter {
1125 /**
@@ -26,13 +40,16 @@ class Topology extends EventEmitter {
2640 ? TopologyType . ReplicaSetNoPrimary
2741 : TopologyType . Unknown ;
2842
43+ const topologyId = globalTopologyCounter ++ ;
2944 const serverDescriptions = seedlist . reduce ( ( result , seed ) => {
3045 const address = seed . port ? `${ seed . host } :${ seed . port } ` : `${ seed . host } :27017` ;
3146 result [ address ] = new ServerDescription ( address ) ;
3247 return result ;
3348 } , { } ) ;
3449
3550 this . s = {
51+ // the id of this topology
52+ id : topologyId ,
3653 // passed in options
3754 options : Object . assign ( { } , options ) ,
3855 // initial seedlist of servers to connect to
@@ -58,11 +75,37 @@ class Topology extends EventEmitter {
5875
5976 /**
6077 * Initiate server connect
61- * @method
62- * @param {array } [options.auth=null] Array of auth options to apply on connect
78+ *
79+ * @param {Object } [options] Optional settings
80+ * @param {Array } [options.auth=null] Array of auth options to apply on connect
6381 */
6482 connect ( /* options */ ) {
65- return ;
83+ // emit SDAM monitoring events
84+ this . emit ( 'topologyOpening' , new monitoring . TopologyOpeningEvent ( this . s . id ) ) ;
85+
86+ // emit an event for the topology change
87+ this . emit (
88+ 'topologyDescriptionChanged' ,
89+ new monitoring . TopologyDescriptionChangedEvent (
90+ this . s . id ,
91+ new TopologyDescription ( TopologyType . Unknown ) , // initial is always Unknown
92+ this . s . description
93+ )
94+ ) ;
95+
96+ // emit ServerOpeningEvents for each server in our topology
97+ Object . keys ( this . s . description . servers ) . forEach ( serverAddress => {
98+ // publish an open event for each ServerDescription created
99+ this . emit ( 'serverOpening' , new monitoring . ServerOpeningEvent ( this . s . id , serverAddress ) ) ;
100+ } ) ;
101+ }
102+
103+ /**
104+ * Close this topology
105+ */
106+ close ( ) {
107+ // emit an event for close
108+ this . emit ( 'topologyClosed' , new monitoring . TopologyClosedEvent ( this . s . id ) ) ;
66109 }
67110
68111 /**
@@ -81,10 +124,99 @@ class Topology extends EventEmitter {
81124 * @param {object } serverDescription the server to update
82125 */
83126 update ( serverDescription ) {
127+ // these will be used for monitoring events later
128+ const previousTopologyDescription = this . s . description ;
129+ const previousServerDescription = this . s . description . servers [ serverDescription . address ] ;
130+
84131 // first update the TopologyDescription
85132 this . s . description = this . s . description . update ( serverDescription ) ;
133+
134+ // emit monitoring events for this change
135+ this . emit (
136+ 'serverDescriptionChanged' ,
137+ new monitoring . ServerDescriptionChangedEvent (
138+ this . s . id ,
139+ serverDescription . address ,
140+ previousServerDescription ,
141+ this . s . description . servers [ serverDescription . address ]
142+ )
143+ ) ;
144+
145+ this . emit (
146+ 'topologyDescriptionChanged' ,
147+ new monitoring . TopologyDescriptionChangedEvent (
148+ this . s . id ,
149+ previousTopologyDescription ,
150+ this . s . description
151+ )
152+ ) ;
86153 }
87154}
88155
89- module . exports . Topology = Topology ;
90- module . exports . ServerDescription = ServerDescription ;
156+ /**
157+ * A server opening SDAM monitoring event
158+ *
159+ * @event Topology#serverOpening
160+ * @type {ServerOpeningEvent }
161+ */
162+
163+ /**
164+ * A server closed SDAM monitoring event
165+ *
166+ * @event Topology#serverClosed
167+ * @type {ServerClosedEvent }
168+ */
169+
170+ /**
171+ * A server description SDAM change monitoring event
172+ *
173+ * @event Topology#serverDescriptionChanged
174+ * @type {ServerDescriptionChangedEvent }
175+ */
176+
177+ /**
178+ * A topology open SDAM event
179+ *
180+ * @event Topology#topologyOpening
181+ * @type {TopologyOpeningEvent }
182+ */
183+
184+ /**
185+ * A topology closed SDAM event
186+ *
187+ * @event Topology#topologyClosed
188+ * @type {TopologyClosedEvent }
189+ */
190+
191+ /**
192+ * A topology structure SDAM change event
193+ *
194+ * @event Topology#topologyDescriptionChanged
195+ * @type {TopologyDescriptionChangedEvent }
196+ */
197+
198+ /**
199+ * A topology serverHeartbeatStarted SDAM event
200+ *
201+ * @event Topology#serverHeartbeatStarted
202+ * @type {ServerHeartbeatStartedEvent }
203+ */
204+
205+ /**
206+ * A topology serverHeartbeatFailed SDAM event
207+ *
208+ * @event Topology#serverHeartbeatFailed
209+ * @type {ServerHearbeatFailedEvent }
210+ */
211+
212+ /**
213+ * A topology serverHeartbeatSucceeded SDAM change event
214+ *
215+ * @event Topology#serverHeartbeatSucceeded
216+ * @type {ServerHeartbeatSucceededEvent }
217+ */
218+
219+ module . exports = {
220+ Topology,
221+ ServerDescription
222+ } ;
0 commit comments