@@ -26,6 +26,7 @@ module.exports = Server;
26
26
*/
27
27
28
28
var clientSource = undefined ;
29
+ var clientSourceMap = undefined ;
29
30
30
31
/**
31
32
* Server constructor.
@@ -98,6 +99,11 @@ Server.prototype.serveClient = function(v){
98
99
99
100
if ( v && ! clientSource ) {
100
101
clientSource = read ( require . resolve ( 'socket.io-client/socket.io.js' ) , 'utf-8' ) ;
102
+ try {
103
+ clientSourceMap = read ( require . resolve ( 'socket.io-client/socket.io.js.map' ) , 'utf-8' ) ;
104
+ } catch ( err ) {
105
+ debug ( 'could not load sourcemap file' ) ;
106
+ }
101
107
}
102
108
103
109
return this ;
@@ -255,11 +261,14 @@ Server.prototype.attach = function(srv, opts){
255
261
Server . prototype . attachServe = function ( srv ) {
256
262
debug ( 'attaching client serving req handler' ) ;
257
263
var url = this . _path + '/socket.io.js' ;
264
+ var urlMap = this . _path + '/socket.io.js.map' ;
258
265
var evs = srv . listeners ( 'request' ) . slice ( 0 ) ;
259
266
var self = this ;
260
267
srv . removeAllListeners ( 'request' ) ;
261
268
srv . on ( 'request' , function ( req , res ) {
262
- if ( 0 === req . url . indexOf ( url ) ) {
269
+ if ( 0 === req . url . indexOf ( urlMap ) ) {
270
+ self . serveMap ( req , res ) ;
271
+ } else if ( 0 === req . url . indexOf ( url ) ) {
263
272
self . serve ( req , res ) ;
264
273
} else {
265
274
for ( var i = 0 ; i < evs . length ; i ++ ) {
@@ -299,6 +308,36 @@ Server.prototype.serve = function(req, res){
299
308
res . end ( clientSource ) ;
300
309
} ;
301
310
311
+ /**
312
+ * Handles a request serving `/socket.io.js.map`
313
+ *
314
+ * @param {http.Request } req
315
+ * @param {http.Response } res
316
+ * @api private
317
+ */
318
+
319
+ Server . prototype . serveMap = function ( req , res ) {
320
+ // Per the standard, ETags must be quoted:
321
+ // https://tools.ietf.org/html/rfc7232#section-2.3
322
+ var expectedEtag = '"' + clientVersion + '"' ;
323
+
324
+ var etag = req . headers [ 'if-none-match' ] ;
325
+ if ( etag ) {
326
+ if ( expectedEtag == etag ) {
327
+ debug ( 'serve client 304' ) ;
328
+ res . writeHead ( 304 ) ;
329
+ res . end ( ) ;
330
+ return ;
331
+ }
332
+ }
333
+
334
+ debug ( 'serve client sourcemap' ) ;
335
+ res . setHeader ( 'Content-Type' , 'application/json' ) ;
336
+ res . setHeader ( 'ETag' , expectedEtag ) ;
337
+ res . writeHead ( 200 ) ;
338
+ res . end ( clientSourceMap ) ;
339
+ } ;
340
+
302
341
/**
303
342
* Binds socket.io to an engine.io instance.
304
343
*
0 commit comments