Skip to content

Commit

Permalink
Deno serveHttp attempts
Browse files Browse the repository at this point in the history
  • Loading branch information
dalcib committed Apr 17, 2021
1 parent fc0511a commit 6a153fc
Show file tree
Hide file tree
Showing 7 changed files with 204 additions and 7,103 deletions.
1 change: 1 addition & 0 deletions example-deno/.vscode/settings.json
Original file line number Diff line number Diff line change
@@ -0,0 +1 @@
{ "deno.enable": true }
1 change: 1 addition & 0 deletions example-deno/bundle.js
Original file line number Diff line number Diff line change
@@ -1,3 +1,4 @@
(() => new EventSource("/esbuild").onmessage = () => location.reload())();
// deno-cache:https://cdn.skypack.dev/-/[email protected]/dist=es2020,mode=imports/optimized/object-assign.js
/*
object-assign
Expand Down
78 changes: 78 additions & 0 deletions example-deno/serve.js
Original file line number Diff line number Diff line change
@@ -0,0 +1,78 @@
// deno run --allow-env --allow-read --allow-write --allow-net --allow-run server.js
import * as esbuild from 'https://deno.land/x/esbuild/mod.js'
import { cache } from './../deno/mod.ts'
import { listenAndServe, serve } from 'https://deno.land/std/http/server.ts'

const importmap = {
imports: {
react: 'https://cdn.skypack.dev/react',
'react-dom': 'https://cdn.skypack.dev/react-dom',
},
}
const clients = []

esbuild
.build({
entryPoints: ['./index.tsx'],
bundle: true,
format: 'esm',
plugins: [cache({ importmap, directory: './cache' })],
outfile: 'bundle.js',
banner: { js: ' (() => new EventSource("/esbuild").onmessage = () => location.reload())();' },
watch: {
onRebuild(error, result) {
clients.forEach((controller) => {
controller.enqueue(new TextEncoder().encode('data: update\n\n'))
controller.close()
})
clients.length = 0
console.log(error ? error : '...')
},
},
})
.then((result, error) => {})
.catch(() => process.exit(1))

const sseResponse = new Response(
new ReadableStream({
start(controller) {
console.log('start')
clients.push(controller)
},
}),
{
status: 200,
headers: {
Connection: 'Keep-Alive',
'Content-Type': 'text/event-stream',
'Cache-Control': 'no-cache',
'Keep-Alive': `timeout=${Number.MAX_SAFE_INTEGER}`,
},
}
)

esbuild.serve({ servedir: './' }, {}).then(async () => {
for await (const conn of Deno.listen({ port: 3000 })) {
;(async () => {
for await (const { request, respondWith } of Deno.serveHttp(conn)) {
const { url } = request
if (url === '/esbuild') {
await respondWith(sseResponse)
} else {
const path = ~url.split('/').pop().indexOf('.') ? url : `/index.html` //for PWA with router
const res = await fetch('http://localhost:8000' + path, request)
const text = await res.text()
try {
await respondWith(new Response(text, res))
} catch (error) {
console.error('%cResponse failed%c:', 'color: #909000', '', error)
}
}
}
})()
}
setTimeout(() => {
const open = { darwin: ['open'], linux: ['xdg-open'], windows: ['cmd', '/c', 'start'] }
if (clients.length === 0) Deno.run({ cmd: [...open[Deno.build.os], 'http://localhost:3000'] })
}, 2000) //open the default browser only if it is not opened yet
})
3 changes: 2 additions & 1 deletion example-deno/server.js
Original file line number Diff line number Diff line change
Expand Up @@ -48,8 +48,9 @@ esbuild.serve({ servedir: './' }, {}).then(() => {
const text = await res.text()
await req.respond({ body: text, statusCode: res.statusCode, headers: res.headers })
})

setTimeout(() => {
const open = { darwin: ['open'], linux: ['xdg-open'], windows: ['cmd', '/c', 'start'] }
if (clients.length === 0) Deno.run({ cmd: [...open[Deno.build.os], 'http://localhost:3000'] })
}, 2000) //open the browser only if it is not opened yet
}, 2000) //open the default browser only if it is not opened yet
})
81 changes: 81 additions & 0 deletions example-deno/sseExample.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,81 @@
const INDEX_HTML = `<!DOCTYPE html>
<html>
<head></head>
<body>
<h1>Hello world!</h1>
<ul id="events"></ul>
<script>
const sse = new EventSource("/sse");
const ul = document.getElementById("events");
sse.onmessage = (evt) => {
const li = document.createElement("li");
li.textContent = \`message: \${evt.data}\`;
ul.appendChild(li);
};
</script>
</body>
</html>
`

const encoder = new TextEncoder()

let body

function handleRequest({ request, respondWith }: Deno.RequestEvent) {
let respond: (response: Response) => void
const p = new Promise<Response>((r) => (respond = r))
const respondWithPromise = respondWith(p)
if (request.url === '/sse') {
let id = 0
let interval = 0
body = new ReadableStream({
start(controller) {
console.log('start')
interval = setInterval(() => {
controller.enqueue(
encoder.encode(`event: message\nid: ${++id}\ndata: { "hello": "deno" }\n\n`)
)
}, 1000)
},
cancel() {
console.log('cancelled')
clearInterval(interval)
},
})
respond!(
new Response(body, {
headers: {
Connection: 'Keep-Alive',
'Content-Type': 'text/event-stream',
'Cache-Control': 'no-cache',
'Keep-Alive': `timeout=${Number.MAX_SAFE_INTEGER}`,
},
})
)
} else {
respond!(
new Response(INDEX_HTML, {
headers: {
'content-type': 'text/html',
},
})
)
}
return respondWithPromise
}

for await (const conn of Deno.listen({ port: 8000 })) {
const httpConn = Deno.serveHttp(conn)
;(async () => {
for await (const requestEvent of httpConn) {
try {
await handleRequest(requestEvent)
//await respondWith(new Response(body))
} catch (error) {
console.error('%cResponse failed%c:', 'color: #909000', '', error)
}
}
})()
}

console.log('started')
Loading

0 comments on commit 6a153fc

Please sign in to comment.