diff --git a/index.html b/index.html
new file mode 100644
index 0000000..14c9b23
--- /dev/null
+++ b/index.html
@@ -0,0 +1,75 @@
+
+
+
+
+
+ Websocket tutorial
+
+
+
+ WebSocket Broadcast Console
+ Connecting...
+
+
+ Live Steam Logs:
+
+
+
+
\ No newline at end of file
diff --git a/package-lock.json b/package-lock.json
index 8a69ea6..eed8bd6 100644
--- a/package-lock.json
+++ b/package-lock.json
@@ -9,7 +9,8 @@
"version": "1.0.0",
"license": "ISC",
"dependencies": {
- "ws": "^8.19.0"
+ "ws": "^8.19.0",
+ "wscat": "^6.1.0"
},
"devDependencies": {
"@types/node": "^25.1.0",
@@ -36,6 +37,81 @@
"@types/node": "*"
}
},
+ "node_modules/agent-base": {
+ "version": "7.1.4",
+ "resolved": "https://registry.npmjs.org/agent-base/-/agent-base-7.1.4.tgz",
+ "integrity": "sha512-MnA+YT8fwfJPgBx3m60MNqakm30XOkyIoH1y6huTQvC0PwZG7ki8NacLBcrPbNoo8vEZy7Jpuk7+jMO+CUovTQ==",
+ "license": "MIT",
+ "engines": {
+ "node": ">= 14"
+ }
+ },
+ "node_modules/commander": {
+ "version": "12.1.0",
+ "resolved": "https://registry.npmjs.org/commander/-/commander-12.1.0.tgz",
+ "integrity": "sha512-Vw8qHK3bZM9y/P10u3Vib8o/DdkvA2OtPtZvD871QKjy74Wj1WSKFILMPRPSdUSx5RFK1arlJzEtA4PkFgnbuA==",
+ "license": "MIT",
+ "engines": {
+ "node": ">=18"
+ }
+ },
+ "node_modules/debug": {
+ "version": "4.4.3",
+ "resolved": "https://registry.npmjs.org/debug/-/debug-4.4.3.tgz",
+ "integrity": "sha512-RGwwWnwQvkVfavKVt22FGLw+xYSdzARwm0ru6DhTVA3umU5hZc28V3kO4stgYryrTlLpuvgI9GiijltAjNbcqA==",
+ "license": "MIT",
+ "dependencies": {
+ "ms": "^2.1.3"
+ },
+ "engines": {
+ "node": ">=6.0"
+ },
+ "peerDependenciesMeta": {
+ "supports-color": {
+ "optional": true
+ }
+ }
+ },
+ "node_modules/https-proxy-agent": {
+ "version": "7.0.6",
+ "resolved": "https://registry.npmjs.org/https-proxy-agent/-/https-proxy-agent-7.0.6.tgz",
+ "integrity": "sha512-vK9P5/iUfdl95AI+JVyUuIcVtd4ofvtrOr3HNtM2yxC9bnMbEdp3x01OhQNnjb8IJYi38VlTE3mBXwcfvywuSw==",
+ "license": "MIT",
+ "dependencies": {
+ "agent-base": "^7.1.2",
+ "debug": "4"
+ },
+ "engines": {
+ "node": ">= 14"
+ }
+ },
+ "node_modules/ms": {
+ "version": "2.1.3",
+ "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz",
+ "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==",
+ "license": "MIT"
+ },
+ "node_modules/mute-stream": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/mute-stream/-/mute-stream-2.0.0.tgz",
+ "integrity": "sha512-WWdIxpyjEn+FhQJQQv9aQAYlHoNVdzIzUySNV1gHUPDSdZJ3yZn7pAAbQcV7B56Mvu881q9FZV+0Vx2xC44VWA==",
+ "license": "ISC",
+ "engines": {
+ "node": "^18.17.0 || >=20.5.0"
+ }
+ },
+ "node_modules/read": {
+ "version": "4.1.0",
+ "resolved": "https://registry.npmjs.org/read/-/read-4.1.0.tgz",
+ "integrity": "sha512-uRfX6K+f+R8OOrYScaM3ixPY4erg69f8DN6pgTvMcA9iRc8iDhwrA4m3Yu8YYKsXJgVvum+m8PkRboZwwuLzYA==",
+ "license": "ISC",
+ "dependencies": {
+ "mute-stream": "^2.0.0"
+ },
+ "engines": {
+ "node": "^18.17.0 || >=20.5.0"
+ }
+ },
"node_modules/undici-types": {
"version": "7.16.0",
"resolved": "https://registry.npmjs.org/undici-types/-/undici-types-7.16.0.tgz",
@@ -63,6 +139,24 @@
"optional": true
}
}
+ },
+ "node_modules/wscat": {
+ "version": "6.1.0",
+ "resolved": "https://registry.npmjs.org/wscat/-/wscat-6.1.0.tgz",
+ "integrity": "sha512-x6gEZvITvqWslR38DoBfnMi37ZBUGsG9rTkGc/200sEfSs1JwgKLZYQeqa0vlu3bxXQV7hEHI4NF7KQmYIzB2A==",
+ "license": "MIT",
+ "dependencies": {
+ "commander": "^12.1.0",
+ "https-proxy-agent": "^7.0.5",
+ "read": "^4.0.0",
+ "ws": "^8.0.0"
+ },
+ "bin": {
+ "wscat": "bin/wscat"
+ },
+ "engines": {
+ "node": ">=18"
+ }
}
}
}
diff --git a/package.json b/package.json
index 7497f93..bbdf3af 100644
--- a/package.json
+++ b/package.json
@@ -2,9 +2,10 @@
"name": "websocketcourse",
"version": "1.0.0",
"description": "",
- "main": "index.js",
+ "main": "server.js",
+ "type": "module",
"scripts": {
- "test": "echo \"Error: no test specified\" && exit 1"
+ "dev": "node --watch server.js"
},
"repository": {
"type": "git",
@@ -13,9 +14,9 @@
"keywords": [],
"author": "",
"license": "ISC",
- "type": "commonjs",
"dependencies": {
- "ws": "^8.19.0"
+ "ws": "^8.19.0",
+ "wscat": "^6.1.0"
},
"devDependencies": {
"@types/node": "^25.1.0",
diff --git a/server.js b/server.js
index f983973..d0b8249 100644
--- a/server.js
+++ b/server.js
@@ -1,8 +1,16 @@
-import {WebSocketServer} from 'ws'
+import {WebSocketServer, WebSocket} from 'ws'
const wss = new WebSocketServer({port: 8081})
-// conmnection event
+// connection event
+
+/**
+ * Connection types
+ * 0: connecting
+ * 1: open (the only state where you can safely .send())
+ * 2: Closing
+ * 3: closed
+ */
wss.on('connection', (s, r)=>{
const ip = r.socket.remoteAddress
@@ -11,8 +19,19 @@ wss.on('connection', (s, r)=>{
const message = rawData.toString()
console.log({rawData})
- wss.clients.forEach((c)=>{
- if(c.readyState === 1) c.send(`Server Broadcast: ${message}`)
+ wss.clients.forEach((client)=>{
+ // can use readyState to be === 1 or WebSocket.OPEN they mean the same thing
+ if(client.readyState === WebSocket.OPEN) client.send(`Server Broadcast: ${message}`)
})
})
-})
\ No newline at end of file
+
+ s.on("error", ()=>{
+ console.error(`Error: ${err.message}: ${ip}`)
+ })
+
+ s.on('close', ()=>{
+ console.log('Client Disconnected')
+ })
+})
+
+console.log("Server Running on 8081")
\ No newline at end of file