@@ -3,9 +3,23 @@ const EventEmitter = require('events');
3
3
const ServerDescription = require ( './server_description' ) . ServerDescription ;
4
4
const TopologyDescription = require ( './topology_description' ) . TopologyDescription ;
5
5
const TopologyType = require ( './topology_description' ) . TopologyType ;
6
+ const monitoring = require ( './monitoring' ) ;
7
+
8
+ // Global state
9
+ let globalTopologyCounter = 0 ;
6
10
7
11
/**
8
12
* 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
9
23
*/
10
24
class Topology extends EventEmitter {
11
25
/**
@@ -26,13 +40,16 @@ class Topology extends EventEmitter {
26
40
? TopologyType . ReplicaSetNoPrimary
27
41
: TopologyType . Unknown ;
28
42
43
+ const topologyId = globalTopologyCounter ++ ;
29
44
const serverDescriptions = seedlist . reduce ( ( result , seed ) => {
30
45
const address = seed . port ? `${ seed . host } :${ seed . port } ` : `${ seed . host } :27017` ;
31
46
result [ address ] = new ServerDescription ( address ) ;
32
47
return result ;
33
48
} , { } ) ;
34
49
35
50
this . s = {
51
+ // the id of this topology
52
+ id : topologyId ,
36
53
// passed in options
37
54
options : Object . assign ( { } , options ) ,
38
55
// initial seedlist of servers to connect to
@@ -58,11 +75,37 @@ class Topology extends EventEmitter {
58
75
59
76
/**
60
77
* 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
63
81
*/
64
82
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 ) ) ;
66
109
}
67
110
68
111
/**
@@ -81,10 +124,99 @@ class Topology extends EventEmitter {
81
124
* @param {object } serverDescription the server to update
82
125
*/
83
126
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
+
84
131
// first update the TopologyDescription
85
132
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
+ ) ;
86
153
}
87
154
}
88
155
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