Add the Chat Rooms. Start working on the frontend app.
This commit is contained in:
commit
eb696faae0
3
chat-app/.editorconfig
Normal file
3
chat-app/.editorconfig
Normal file
@ -0,0 +1,3 @@
|
||||
[*.{js,ts,jsx,tsx,json,yaml}]
|
||||
indent_size = 2
|
||||
indent_tye = "space"
|
2
chat-app/.gitignore
vendored
Normal file
2
chat-app/.gitignore
vendored
Normal file
@ -0,0 +1,2 @@
|
||||
# deps
|
||||
node_modules/
|
11
chat-app/README.md
Normal file
11
chat-app/README.md
Normal file
@ -0,0 +1,11 @@
|
||||
To install dependencies:
|
||||
```sh
|
||||
bun install
|
||||
```
|
||||
|
||||
To run:
|
||||
```sh
|
||||
bun run dev
|
||||
```
|
||||
|
||||
open http://localhost:3000
|
BIN
chat-app/bun.lockb
Executable file
BIN
chat-app/bun.lockb
Executable file
Binary file not shown.
12
chat-app/package.json
Normal file
12
chat-app/package.json
Normal file
@ -0,0 +1,12 @@
|
||||
{
|
||||
"name": "chat-app",
|
||||
"scripts": {
|
||||
"dev": "bun run --hot src/index.ts"
|
||||
},
|
||||
"dependencies": {
|
||||
"hono": "^4.6.3"
|
||||
},
|
||||
"devDependencies": {
|
||||
"@types/bun": "latest"
|
||||
}
|
||||
}
|
44
chat-app/src/chat-room.ts
Normal file
44
chat-app/src/chat-room.ts
Normal file
@ -0,0 +1,44 @@
|
||||
import { EventEmitter } from "events";
|
||||
|
||||
export type Chatter = {
|
||||
name: string,
|
||||
};
|
||||
|
||||
export const chatters = new Array<Chatter>();
|
||||
|
||||
export type Message = {
|
||||
message: string,
|
||||
timestamp: Date
|
||||
chatter: Chatter
|
||||
};
|
||||
|
||||
export function createMessageString(message: Message): string {
|
||||
return `${message.chatter.name}: ${message.message}`;
|
||||
}
|
||||
|
||||
export class ChatRoom extends EventEmitter {
|
||||
protected messages: Message[];
|
||||
|
||||
public constructor() {
|
||||
this.message = new Array<Message>();
|
||||
}
|
||||
|
||||
public getMessages(): Message[] {
|
||||
return this.messages;
|
||||
}
|
||||
|
||||
public addMessage(message: Message) {
|
||||
this.messages.push(message);
|
||||
this.emit("message-added", { message });
|
||||
}
|
||||
|
||||
public getMessagesAsArray(): string[] {
|
||||
return this.messages.map(m => createMessageString(m));
|
||||
}
|
||||
|
||||
public getNewestMessage(): Message {
|
||||
const message = this.messages[this.messages - 1];
|
||||
}
|
||||
}
|
||||
|
||||
export const chatRomm = new ChatRoom();
|
43
chat-app/src/index.ts
Normal file
43
chat-app/src/index.ts
Normal file
@ -0,0 +1,43 @@
|
||||
import { Hono } from "hono";
|
||||
import { serveStatic, createBunWebSocket } from "hono/bun";
|
||||
import type { ServerWebSocket } from "hono";
|
||||
import { chatRoom, chatters } from "./chat-room.ts";
|
||||
|
||||
const app = new Hono();
|
||||
const users: string[] = [];
|
||||
|
||||
// Set up the chat socket
|
||||
const { upgradeWebSocket, websocket } = createBunWebSocket<ServerWebSocket>();
|
||||
app.get("/chat-socket", upgradeWebSocket((c) => {
|
||||
return {
|
||||
onMessage(event, ws) {
|
||||
const data = JSON.parse(event.data);
|
||||
if (!chatters.find(c => c.name == data.chatter.name)) {
|
||||
chatters.push(data.chatter);
|
||||
}
|
||||
chatRoom.addMessage({
|
||||
chatter: { data.chatter },
|
||||
message: data.message,
|
||||
timestamp: Date.now()
|
||||
});
|
||||
|
||||
ws.send(JSON.stringify(chatRoom.getMessage().message));
|
||||
},
|
||||
onClose() {
|
||||
console.log("Connection closed.");
|
||||
},
|
||||
onError(event) {
|
||||
console.log(event);
|
||||
}
|
||||
}
|
||||
}));
|
||||
|
||||
|
||||
// get the HTML and JS from the static repo
|
||||
app.use("/", serveStatic({ path: "/static/index.html" }));
|
||||
app.use("/*", serveStatic({ root: "/static" }));
|
||||
|
||||
Bun.serve({
|
||||
fetch: app.fetch,
|
||||
websocket
|
||||
});
|
20
chat-app/static/index.html
Normal file
20
chat-app/static/index.html
Normal file
@ -0,0 +1,20 @@
|
||||
<!DOCTYPE html>
|
||||
<html lang="en">
|
||||
<head>
|
||||
<title>A Dumb Chat Application</title>
|
||||
</head>
|
||||
<body>
|
||||
|
||||
<script src="https://unpkg.com/mithril/mithril.js"></script>
|
||||
<script src="/js/chat-service.js"></script>
|
||||
<script>
|
||||
// start the chat web socket
|
||||
initChatService();
|
||||
|
||||
// render the application
|
||||
|
||||
const root = document.body;
|
||||
m.render(root, m("h1", "A Stupid Chat"));
|
||||
</script>
|
||||
</body>
|
||||
</html>
|
17
chat-app/static/js/chat-service.js
Normal file
17
chat-app/static/js/chat-service.js
Normal file
@ -0,0 +1,17 @@
|
||||
function initChatService() {
|
||||
const ws = new WebSocket("ws://localhost:3000/chat-socket");
|
||||
|
||||
ws.onmessage = function (event) {
|
||||
console.log(event);
|
||||
};
|
||||
ws.onopen = function (event) {
|
||||
console.log("Opening the socket");
|
||||
ws.send(JSON.stringify({ hello: "world" }));
|
||||
};
|
||||
ws.onclose = function (event) {
|
||||
console.log("Closing the socket");
|
||||
};
|
||||
ws.onerror = function (event) {
|
||||
console.log(event);
|
||||
};
|
||||
}
|
7
chat-app/tsconfig.json
Normal file
7
chat-app/tsconfig.json
Normal file
@ -0,0 +1,7 @@
|
||||
{
|
||||
"compilerOptions": {
|
||||
"strict": true,
|
||||
"jsx": "react-jsx",
|
||||
"jsxImportSource": "hono/jsx"
|
||||
}
|
||||
}
|
67
notes.md
Normal file
67
notes.md
Normal file
@ -0,0 +1,67 @@
|
||||
# Deploying Dumb Ideas with Dokku
|
||||
|
||||
A talk describing how we can easily deploy applications with Dokku using a simple
|
||||
VPS and doing some DNS work.
|
||||
|
||||
* What is deployment when it comes to the web?
|
||||
* Talk about the VPS, how it works
|
||||
* Install Dokku the service on the VPS
|
||||
* Talk about the DNS setup
|
||||
* Do a cost breakdown
|
||||
|
||||
Deploy the talk on the blog as well
|
||||
|
||||
## The Dumb Idea
|
||||
|
||||
Simple application that does something, like a guess the number or tik-tak-toe
|
||||
Something with a frontend and backend to talk about deploying multiple applications.
|
||||
Or build it with React
|
||||
|
||||
A simple twitte clone
|
||||
Mesages on a timeline, living in memory.
|
||||
|
||||
Multiplayer tic-tac-toe?
|
||||
Chat?
|
||||
|
||||
|
||||
|
||||
## What is Deployment
|
||||
|
||||
What does a node.js application look like?
|
||||
Running express.js as a service on the server
|
||||
Maybe have a reverse proxy for the web service
|
||||
|
||||
Deploying the code in place, take the service down or deploy on another port
|
||||
and update the nginx config to point to the new service
|
||||
|
||||
DNS, and how DNS plays a role in pointing the domain to the server
|
||||
|
||||
show some diagrams
|
||||
|
||||
Talk about the SSL cert situation
|
||||
Talk about building VM images or containers for deployment
|
||||
|
||||
"What about K8s?" I don't know or really care
|
||||
|
||||
## What does Dokku do for us?
|
||||
|
||||
Reverse proxy
|
||||
SSL certificates
|
||||
Deploys the containers defined in the `Dockerfile`
|
||||
|
||||
Simple `git push` for deploying to Dokku
|
||||
|
||||
"Is deploying actually hard? Depends"
|
||||
|
||||
## Deploy
|
||||
|
||||
* Create the application and domain
|
||||
* Deploy the application to Dokku
|
||||
* Get everyone to look at it
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
Loading…
Reference in New Issue
Block a user