@@ -26,6 +26,7 @@ module.exports = Server;
2626 */
2727
2828var clientSource = undefined ;
29+ var clientSourceMap = undefined ;
2930
3031/**
3132 * Server constructor.
@@ -98,6 +99,11 @@ Server.prototype.serveClient = function(v){
9899
99100 if ( v && ! clientSource ) {
100101 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+ }
101107 }
102108
103109 return this ;
@@ -255,11 +261,14 @@ Server.prototype.attach = function(srv, opts){
255261Server . prototype . attachServe = function ( srv ) {
256262 debug ( 'attaching client serving req handler' ) ;
257263 var url = this . _path + '/socket.io.js' ;
264+ var urlMap = this . _path + '/socket.io.js.map' ;
258265 var evs = srv . listeners ( 'request' ) . slice ( 0 ) ;
259266 var self = this ;
260267 srv . removeAllListeners ( 'request' ) ;
261268 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 ) ) {
263272 self . serve ( req , res ) ;
264273 } else {
265274 for ( var i = 0 ; i < evs . length ; i ++ ) {
@@ -299,6 +308,36 @@ Server.prototype.serve = function(req, res){
299308 res . end ( clientSource ) ;
300309} ;
301310
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+
302341/**
303342 * Binds socket.io to an engine.io instance.
304343 *
0 commit comments