1 |
|
2 |
|
3 |
|
4 |
|
5 |
|
6 |
|
7 |
|
8 |
|
9 |
|
10 |
|
11 | const defer = require('p-defer');
|
12 | const WebSocket = require('ws');
|
13 |
|
14 | const socketServer = new WebSocket.Server({ noServer: true });
|
15 |
|
16 |
|
17 | const middleware = async (ctx, next) => {
|
18 | const deferred = defer();
|
19 | const { upgrade = '' } = ctx.request.headers;
|
20 | const upgradable = upgrade
|
21 | .split(',')
|
22 | .map((header) => header.trim())
|
23 | .includes('websocket');
|
24 |
|
25 | if (upgradable) {
|
26 | ctx.ws = async () => {
|
27 | socketServer.handleUpgrade(ctx.req, ctx.request.socket, Buffer.alloc(0), deferred.resolve);
|
28 | ctx.respond = false;
|
29 |
|
30 | return deferred.promise;
|
31 | };
|
32 | }
|
33 |
|
34 | await next();
|
35 | };
|
36 |
|
37 | module.exports = { middleware };
|