-
Notifications
You must be signed in to change notification settings - Fork 2
/
Copy pathmorefun.js
executable file
·70 lines (59 loc) · 2.07 KB
/
morefun.js
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
'use strict'
const { Worker, isMainThread, parentPort } = require('worker_threads')
if (isMainThread) {
const http2 = require('http2')
const websocket = require('websocket-stream')
const WebSocket = require('ws')
const settings = { enableConnectProtocol: true }
const server = http2.createServer({ settings })
function createWebSocket(stream, headers) {
// Take the Http2Stream object and set it as the "socket" on a new
// ws module WebSocket object.. then wrap that using the websocket-stream...
// It's not quite a perfect fit yet... but we have to start somewhere to
// prove it works.
stream.setNoDelay = function() {} // fake it for now...
const ws = new WebSocket(null)
ws.setSocket(stream, headers, 100 * 1024 * 1024)
return websocket(ws)
}
const worker = new Worker(__filename)
server.on('stream', (stream, headers) => {
stream.respond({
'sec-websocket-protocol': headers['sec-websocket-protocol']
})
const ws = createWebSocket(stream, headers)
// Just for fun, let's use a worker to feed data into to the WebSocket
worker.on('message', (message) => {
ws.write(`Http2Stream ${stream.id} - ${message}`)
})
})
server.listen(0, () => {
const origin = `http://localhost:${server.address().port}`
const client = http2.connect(origin)
client.on('remoteSettings', (settings) => {
const reqheaders = {
':method': 'CONNECT',
':protocol': 'websocket',
':path': '/time',
'sec-websocket-protocol': 'time',
'sec-websocket-version': 13,
origin
}
// Let's get wild! 5 different WebSocket sessions over a single
// HTTP/2 connection...
for (let n = 0; n < 5; n++) {
const req = client.request(reqheaders)
req.on('response', (headers) => {
const ws = createWebSocket(req, headers)
ws.setEncoding('utf8')
ws.pipe(process.stdout)
})
}
})
})
} else {
// Worker Thread!
setInterval(() => {
parentPort.postMessage(`${new Date().toISOString()}\n`)
}, 1000)
}