-
Notifications
You must be signed in to change notification settings - Fork 4
Expand file tree
/
Copy pathdevMiddleware.ts
More file actions
98 lines (82 loc) · 2.21 KB
/
devMiddleware.ts
File metadata and controls
98 lines (82 loc) · 2.21 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
import {
acceptWebSocket,
} from "./deps.js";
export const create = function () {
let devSockets: any = [];
const clientCode =
`const socket = new WebSocket('ws://' + location.host + '/nexoDev');
socket.onopen = () => {
console.info('Connected to Nexo Dev Server');
};
socket.onmessage = (msg) => {
if (msg.data === 'reload') {
let tries = 0;
let maxTries = 15;
const reconnect = async function() {
let res;
try {
const res = await fetch('/nexoDev')
if (res.status === 200) {
location.reload(true);
}
}
catch(err) {
console.dir(err);
}
tries++;
if (tries === maxTries) {
console.error('Failed to reconnect to Nexo Dev Server')
return;
}
setTimeout(function() {
reconnect()
}, 1000)
}
reconnect()
}
};`;
const middleware = async function (ctx: any, next: any) {
if (ctx.request.url.pathname !== "/nexoDev") {
return await next();
}
if (ctx.request.headers.get("upgrade") !== "websocket") {
ctx.response.status = 200;
return;
}
const { conn, r: bufReader, w: bufWriter, headers } =
ctx.request.serverRequest;
try {
const sock = await acceptWebSocket({
conn,
bufReader,
bufWriter,
headers,
});
let idx = devSockets.push(sock) - 1;
try {
for await (const ev of sock) {
}
devSockets.splice(idx, 1);
} catch (err) {
console.error(`Dev Server failed to receive frame: ${err}`);
if (!sock.isClosed) {
await sock.close(1000).catch(console.error);
}
}
} catch (err) {
console.error(`Dev Server failed to accept websocket: ${err}`);
ctx.response.status = 400;
}
};
const sendReload = async function () {
for (const sock of devSockets) {
await sock.send("reload");
await sock.close(1000);
}
// A horrible workaround because closing sockets in an oak request needs "some extra time"
await new Promise(function (res) {
setTimeout(res);
});
};
return { middleware, clientCode, sendReload };
};