Skip to content

Commit 0ef55b2

Browse files
paraditedarrachequesne
authored andcommitted
[feature] serve sourcemap for socket.io-client (socketio#2482)
1 parent 4d8e2d3 commit 0ef55b2

File tree

1 file changed

+40
-1
lines changed

1 file changed

+40
-1
lines changed

lib/index.js

+40-1
Original file line numberDiff line numberDiff line change
@@ -26,6 +26,7 @@ module.exports = Server;
2626
*/
2727

2828
var 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){
255261
Server.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

Comments
 (0)