Type safe websockets
This commit is contained in:
parent
a8dbb30795
commit
81c620f191
3 changed files with 48 additions and 14 deletions
|
@ -1,5 +1,6 @@
|
||||||
import { useEffect } from "react"
|
import { useEffect } from "react"
|
||||||
import { io } from "socket.io-client"
|
import { io, Socket } from "socket.io-client"
|
||||||
|
import { ClientToServerEvents, ServerToClientEvents } from "../pages/api/ws"
|
||||||
|
|
||||||
function SocketIO() {
|
function SocketIO() {
|
||||||
useEffect(() => {
|
useEffect(() => {
|
||||||
|
@ -9,7 +10,7 @@ function SocketIO() {
|
||||||
const socketInitializer = async () => {
|
const socketInitializer = async () => {
|
||||||
await fetch("/api/ws")
|
await fetch("/api/ws")
|
||||||
|
|
||||||
const socket = io()
|
const socket: Socket<ServerToClientEvents, ClientToServerEvents> = io()
|
||||||
socket.on("test2", (warst) => {
|
socket.on("test2", (warst) => {
|
||||||
console.log("Test2:", warst, socket.id)
|
console.log("Test2:", warst, socket.id)
|
||||||
})
|
})
|
||||||
|
|
|
@ -4,42 +4,74 @@ import { NextApiResponseWithSocket } from "../../interfaces/NextApiSocket"
|
||||||
import checkTokenIsValid from "../../lib/backend/components/checkTokenIsValid"
|
import checkTokenIsValid from "../../lib/backend/components/checkTokenIsValid"
|
||||||
import prisma from "../../lib/prisma"
|
import prisma from "../../lib/prisma"
|
||||||
|
|
||||||
|
export interface ServerToClientEvents {
|
||||||
|
// noArg: () => void
|
||||||
|
// basicEmit: (a: number, b: string, c: Buffer) => void
|
||||||
|
// withAck: (d: string, callback: (e: number) => void) => void
|
||||||
|
"update-input": (msg: string) => void
|
||||||
|
unauthenticated: () => void
|
||||||
|
authenticated: () => void
|
||||||
|
test2: (test: string) => void
|
||||||
|
test: () => void
|
||||||
|
}
|
||||||
|
|
||||||
|
export interface ClientToServerEvents {
|
||||||
|
// hello: () => void
|
||||||
|
"input-change": (msg: string) => void
|
||||||
|
authenticate: (payload: { token: string }) => void
|
||||||
|
test: (payload: any) => void
|
||||||
|
}
|
||||||
|
|
||||||
|
interface InterServerEvents {
|
||||||
|
// ping: () => void
|
||||||
|
}
|
||||||
|
|
||||||
|
interface SocketData {
|
||||||
|
// name: string
|
||||||
|
// age: number
|
||||||
|
isAuthenticated: boolean
|
||||||
|
}
|
||||||
|
|
||||||
|
// const authenticate = (socket, next) => {
|
||||||
|
// socket.isAuthenticated = false
|
||||||
|
// next()
|
||||||
|
// }
|
||||||
|
|
||||||
const SocketHandler = (req: NextApiRequest, res: NextApiResponseWithSocket) => {
|
const SocketHandler = (req: NextApiRequest, res: NextApiResponseWithSocket) => {
|
||||||
if (res.socket.server.io) {
|
if (res.socket.server.io) {
|
||||||
console.log("Socket is already running " + req.url)
|
console.log("Socket is already running " + req.url)
|
||||||
} else {
|
} else {
|
||||||
console.log("Socket is initializing " + req.url)
|
console.log("Socket is initializing " + req.url)
|
||||||
const io = new Server(res.socket.server)
|
const io = new Server<
|
||||||
|
ClientToServerEvents,
|
||||||
|
ServerToClientEvents,
|
||||||
|
InterServerEvents,
|
||||||
|
SocketData
|
||||||
|
>(res.socket.server)
|
||||||
res.socket.server.io = io
|
res.socket.server.io = io
|
||||||
|
|
||||||
|
// io.use(authenticate)
|
||||||
io.on("connection", (socket) => {
|
io.on("connection", (socket) => {
|
||||||
const connection = { id: socket.id, authenticated: false }
|
|
||||||
|
|
||||||
socket.on("input-change", (msg) => {
|
socket.on("input-change", (msg) => {
|
||||||
if (!connection.authenticated) socket.emit("unauthenticated")
|
if (!socket.data.isAuthenticated) socket.emit("unauthenticated")
|
||||||
// socket.broadcast.emit("update-input", msg)
|
// socket.broadcast.emit("update-input", msg)
|
||||||
io.emit("update-input", msg)
|
io.emit("update-input", msg)
|
||||||
})
|
})
|
||||||
|
|
||||||
socket.on("authenticate", (payload) => {
|
socket.on("authenticate", (payload) => {
|
||||||
// console.log("warst", payload)
|
|
||||||
// console.log(payload())
|
|
||||||
checkTokenIsValid({
|
checkTokenIsValid({
|
||||||
token: payload.token,
|
token: payload.token,
|
||||||
tokenType: "ACCESS",
|
tokenType: "ACCESS",
|
||||||
})
|
})
|
||||||
.then(async ({ tokenBody }) => {
|
.then(async ({ tokenBody }) => {
|
||||||
// console.log(tokenBody)
|
|
||||||
const token = await prisma.token.findUnique({
|
const token = await prisma.token.findUnique({
|
||||||
where: { id: tokenBody.id },
|
where: { id: tokenBody.id },
|
||||||
})
|
})
|
||||||
// console.log(!token , token.used)
|
|
||||||
if (!token || token.used) {
|
if (!token || token.used) {
|
||||||
socket.emit("unauthenticated")
|
socket.emit("unauthenticated")
|
||||||
// console.log(token)
|
|
||||||
} else {
|
} else {
|
||||||
socket.emit("authenticated")
|
socket.emit("authenticated")
|
||||||
connection.authenticated = true
|
socket.data.isAuthenticated = true
|
||||||
}
|
}
|
||||||
})
|
})
|
||||||
.catch((err) => console.log("cat", err.message))
|
.catch((err) => console.log("cat", err.message))
|
||||||
|
|
|
@ -1,7 +1,8 @@
|
||||||
import { ChangeEventHandler, useEffect, useState } from "react"
|
import { ChangeEventHandler, useEffect, useState } from "react"
|
||||||
import { io } from "socket.io-client"
|
import { io, Socket } from "socket.io-client"
|
||||||
import getAccessToken from "../../lib/frontend/getAccessToken"
|
import getAccessToken from "../../lib/frontend/getAccessToken"
|
||||||
let socket: ReturnType<typeof io>
|
import { ClientToServerEvents, ServerToClientEvents } from "../api/ws"
|
||||||
|
let socket: Socket<ServerToClientEvents, ClientToServerEvents>
|
||||||
|
|
||||||
const Home = () => {
|
const Home = () => {
|
||||||
const [input, setInput] = useState("")
|
const [input, setInput] = useState("")
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue