engine.io
Advanced tools
Comparing version 6.4.1 to 6.4.2
@@ -116,7 +116,7 @@ /// <reference types="node" /> | ||
*/ | ||
declare type Middleware = (req: IncomingMessage, res: ServerResponse, next: () => void) => void; | ||
declare type Middleware = (req: IncomingMessage, res: ServerResponse, next: (err?: any) => void) => void; | ||
export declare abstract class BaseServer extends EventEmitter { | ||
opts: ServerOptions; | ||
protected clients: any; | ||
private clientsCount; | ||
clientsCount: number; | ||
protected middlewares: Middleware[]; | ||
@@ -162,3 +162,3 @@ /** | ||
*/ | ||
use(fn: Middleware): void; | ||
use(fn: any): void; | ||
/** | ||
@@ -172,3 +172,3 @@ * Apply the middlewares to the request. | ||
*/ | ||
protected _applyMiddlewares(req: IncomingMessage, res: ServerResponse, callback: () => void): void; | ||
protected _applyMiddlewares(req: IncomingMessage, res: ServerResponse, callback: (err?: any) => void): void; | ||
/** | ||
@@ -175,0 +175,0 @@ * Closes all clients. |
@@ -182,3 +182,6 @@ "use strict"; | ||
debug("applying middleware n°%d", i + 1); | ||
this.middlewares[i](req, res, () => { | ||
this.middlewares[i](req, res, (err) => { | ||
if (err) { | ||
return callback(err); | ||
} | ||
if (i + 1 < this.middlewares.length) { | ||
@@ -457,4 +460,9 @@ apply(i + 1); | ||
}; | ||
this._applyMiddlewares(req, res, () => { | ||
this.verify(req, false, callback); | ||
this._applyMiddlewares(req, res, (err) => { | ||
if (err) { | ||
callback(Server.errors.BAD_REQUEST, { name: "MIDDLEWARE_FAILURE" }); | ||
} | ||
else { | ||
this.verify(req, false, callback); | ||
} | ||
}); | ||
@@ -470,24 +478,30 @@ } | ||
const res = new WebSocketResponse(req, socket); | ||
this._applyMiddlewares(req, res, () => { | ||
this.verify(req, true, (errorCode, errorContext) => { | ||
if (errorCode) { | ||
this.emit("connection_error", { | ||
req, | ||
code: errorCode, | ||
message: Server.errorMessages[errorCode], | ||
context: errorContext, | ||
}); | ||
abortUpgrade(socket, errorCode, errorContext); | ||
return; | ||
} | ||
const head = Buffer.from(upgradeHead); | ||
upgradeHead = null; | ||
// some middlewares (like express-session) wait for the writeHead() call to flush their headers | ||
// see https://github.com/expressjs/session/blob/1010fadc2f071ddf2add94235d72224cf65159c6/index.js#L220-L244 | ||
res.writeHead(); | ||
// delegate to ws | ||
this.ws.handleUpgrade(req, socket, head, (websocket) => { | ||
this.onWebSocket(req, socket, websocket); | ||
const callback = (errorCode, errorContext) => { | ||
if (errorCode !== undefined) { | ||
this.emit("connection_error", { | ||
req, | ||
code: errorCode, | ||
message: Server.errorMessages[errorCode], | ||
context: errorContext, | ||
}); | ||
abortUpgrade(socket, errorCode, errorContext); | ||
return; | ||
} | ||
const head = Buffer.from(upgradeHead); | ||
upgradeHead = null; | ||
// some middlewares (like express-session) wait for the writeHead() call to flush their headers | ||
// see https://github.com/expressjs/session/blob/1010fadc2f071ddf2add94235d72224cf65159c6/index.js#L220-L244 | ||
res.writeHead(); | ||
// delegate to ws | ||
this.ws.handleUpgrade(req, socket, head, (websocket) => { | ||
this.onWebSocket(req, socket, websocket); | ||
}); | ||
}; | ||
this._applyMiddlewares(req, res, (err) => { | ||
if (err) { | ||
callback(Server.errors.BAD_REQUEST, { name: "MIDDLEWARE_FAILURE" }); | ||
} | ||
else { | ||
this.verify(req, true, callback); | ||
} | ||
}); | ||
@@ -494,0 +508,0 @@ } |
@@ -63,4 +63,3 @@ "use strict"; | ||
this.onError("overlap from client"); | ||
// TODO for the next major release: use an HTTP 400 status code (https://github.com/socketio/engine.io/issues/650) | ||
res.writeHead(500); | ||
res.writeHead(400); | ||
res.end(); | ||
@@ -98,4 +97,3 @@ return; | ||
this.onError("data request overlap from client"); | ||
// TODO for the next major release: use an HTTP 400 status code (https://github.com/socketio/engine.io/issues/650) | ||
res.writeHead(500); | ||
res.writeHead(400); | ||
res.end(); | ||
@@ -102,0 +100,0 @@ return; |
@@ -35,3 +35,3 @@ import { AttachOptions, BaseServer } from "./server"; | ||
attach(app: any, options?: AttachOptions & uOptions): void; | ||
_applyMiddlewares(req: any, res: any, callback: () => void): void; | ||
_applyMiddlewares(req: any, res: any, callback: (err?: any) => void): void; | ||
private handleRequest; | ||
@@ -38,0 +38,0 @@ private handleUpgrade; |
@@ -70,7 +70,7 @@ "use strict"; | ||
req.res = new ResponseWrapper(res); | ||
super._applyMiddlewares(req, req.res, () => { | ||
super._applyMiddlewares(req, req.res, (err) => { | ||
// some middlewares (like express-session) wait for the writeHead() call to flush their headers | ||
// see https://github.com/expressjs/session/blob/1010fadc2f071ddf2add94235d72224cf65159c6/index.js#L220-L244 | ||
req.res.writeHead(); | ||
callback(); | ||
callback(err); | ||
}); | ||
@@ -82,23 +82,29 @@ } | ||
req.res = res; | ||
this._applyMiddlewares(req, res, () => { | ||
this.verify(req, false, (errorCode, errorContext) => { | ||
if (errorCode !== undefined) { | ||
this.emit("connection_error", { | ||
req, | ||
code: errorCode, | ||
message: server_1.Server.errorMessages[errorCode], | ||
context: errorContext, | ||
}); | ||
this.abortRequest(req.res, errorCode, errorContext); | ||
return; | ||
} | ||
if (req._query.sid) { | ||
debug("setting new request for existing client"); | ||
this.clients[req._query.sid].transport.onRequest(req); | ||
} | ||
else { | ||
const closeConnection = (errorCode, errorContext) => this.abortRequest(res, errorCode, errorContext); | ||
this.handshake(req._query.transport, req, closeConnection); | ||
} | ||
}); | ||
const callback = (errorCode, errorContext) => { | ||
if (errorCode !== undefined) { | ||
this.emit("connection_error", { | ||
req, | ||
code: errorCode, | ||
message: server_1.Server.errorMessages[errorCode], | ||
context: errorContext, | ||
}); | ||
this.abortRequest(req.res, errorCode, errorContext); | ||
return; | ||
} | ||
if (req._query.sid) { | ||
debug("setting new request for existing client"); | ||
this.clients[req._query.sid].transport.onRequest(req); | ||
} | ||
else { | ||
const closeConnection = (errorCode, errorContext) => this.abortRequest(res, errorCode, errorContext); | ||
this.handshake(req._query.transport, req, closeConnection); | ||
} | ||
}; | ||
this._applyMiddlewares(req, res, (err) => { | ||
if (err) { | ||
callback(server_1.Server.errors.BAD_REQUEST, { name: "MIDDLEWARE_FAILURE" }); | ||
} | ||
else { | ||
this.verify(req, false, callback); | ||
} | ||
}); | ||
@@ -110,48 +116,54 @@ } | ||
req.res = res; | ||
this._applyMiddlewares(req, res, () => { | ||
this.verify(req, true, async (errorCode, errorContext) => { | ||
if (errorCode) { | ||
this.emit("connection_error", { | ||
req, | ||
code: errorCode, | ||
message: server_1.Server.errorMessages[errorCode], | ||
context: errorContext, | ||
}); | ||
this.abortRequest(res, errorCode, errorContext); | ||
return; | ||
const callback = async (errorCode, errorContext) => { | ||
if (errorCode !== undefined) { | ||
this.emit("connection_error", { | ||
req, | ||
code: errorCode, | ||
message: server_1.Server.errorMessages[errorCode], | ||
context: errorContext, | ||
}); | ||
this.abortRequest(res, errorCode, errorContext); | ||
return; | ||
} | ||
const id = req._query.sid; | ||
let transport; | ||
if (id) { | ||
const client = this.clients[id]; | ||
if (!client) { | ||
debug("upgrade attempt for closed client"); | ||
res.close(); | ||
} | ||
const id = req._query.sid; | ||
let transport; | ||
if (id) { | ||
const client = this.clients[id]; | ||
if (!client) { | ||
debug("upgrade attempt for closed client"); | ||
res.close(); | ||
} | ||
else if (client.upgrading) { | ||
debug("transport has already been trying to upgrade"); | ||
res.close(); | ||
} | ||
else if (client.upgraded) { | ||
debug("transport had already been upgraded"); | ||
res.close(); | ||
} | ||
else { | ||
debug("upgrading existing transport"); | ||
transport = this.createTransport(req._query.transport, req); | ||
client.maybeUpgrade(transport); | ||
} | ||
else if (client.upgrading) { | ||
debug("transport has already been trying to upgrade"); | ||
res.close(); | ||
} | ||
else if (client.upgraded) { | ||
debug("transport had already been upgraded"); | ||
res.close(); | ||
} | ||
else { | ||
transport = await this.handshake(req._query.transport, req, (errorCode, errorContext) => this.abortRequest(res, errorCode, errorContext)); | ||
if (!transport) { | ||
return; | ||
} | ||
debug("upgrading existing transport"); | ||
transport = this.createTransport(req._query.transport, req); | ||
client.maybeUpgrade(transport); | ||
} | ||
// calling writeStatus() triggers the flushing of any header added in a middleware | ||
req.res.writeStatus("101 Switching Protocols"); | ||
res.upgrade({ | ||
transport, | ||
}, req.getHeader("sec-websocket-key"), req.getHeader("sec-websocket-protocol"), req.getHeader("sec-websocket-extensions"), context); | ||
}); | ||
} | ||
else { | ||
transport = await this.handshake(req._query.transport, req, (errorCode, errorContext) => this.abortRequest(res, errorCode, errorContext)); | ||
if (!transport) { | ||
return; | ||
} | ||
} | ||
// calling writeStatus() triggers the flushing of any header added in a middleware | ||
req.res.writeStatus("101 Switching Protocols"); | ||
res.upgrade({ | ||
transport, | ||
}, req.getHeader("sec-websocket-key"), req.getHeader("sec-websocket-protocol"), req.getHeader("sec-websocket-extensions"), context); | ||
}; | ||
this._applyMiddlewares(req, res, (err) => { | ||
if (err) { | ||
callback(server_1.Server.errors.BAD_REQUEST, { name: "MIDDLEWARE_FAILURE" }); | ||
} | ||
else { | ||
this.verify(req, true, callback); | ||
} | ||
}); | ||
@@ -210,2 +222,3 @@ } | ||
this.writeBufferedHeaders(); | ||
return this; | ||
} | ||
@@ -212,0 +225,0 @@ writeHeader(key, value) { |
{ | ||
"name": "engine.io", | ||
"version": "6.4.1", | ||
"version": "6.4.2", | ||
"description": "The realtime engine behind Socket.IO. Provides the foundation of a bidirectional connection between client and server", | ||
@@ -5,0 +5,0 @@ "type": "commonjs", |
155028
4263