wsocket.js
v1.0.0
Published
WSocket是基于WebSocket(后简称ws)的封装,在ws的基础上,提供了鉴权、心跳、消息分发、远程调用等功能。
Readme
WSocket
WSocket是基于WebSocket(后简称ws)的封装,在ws的基础上,提供了鉴权、心跳、消息分发、远程调用等功能。
由于基于https的ws本身具有传输内容加密的功能,因此,WSocket没有额外实现传输安全层。
开始
导入
// ES模块导入方法
import { Client, Server, ServerStore } from "wsocket";
// Nodejs导入方法
const { Client, Server, ServerStore } = require("wsocket");
// 从编译文件导入
const { Client, Server, ServerStore } = require("bundle.js");服务器
const ws = require("ws")
const http = require("http");
const url = require("url");
const { Server, ServerStore } = require("./dist/bundle")
function debug(...args) {
console.log(new Date(), ...args)
}
const handler = new ws.WebSocketServer({ noServer: true })
handler.on("connection", (ws, request) => {
const server = new Server(ws, {
authorizeHandler: (data) => {
return Promise.resolve({ code: 0, error: undefined })
},
authorizedCallback: (data) => {
const servers = ServerStore.getServers()
for (const v of servers) {
if (
v.authorizationConfig?.id === server.authorizationConfig?.id &&
v !== server
) {
v.close(3100, "repeat landing")
}
}
}
})
ws.on("close", () => {
ServerStore.removeServer(server)
})
})
const server = http.createServer()
server.on("upgrade", (request, socket, head) => {
const { pathname } = url.parse(request.url)
if (pathname === "/") {
handler.handleUpgrade(request, socket, head, (ws) => {
debug(`${request.socket.remoteFamily}:${request.socket.remoteAddress}:${request.socket.remotePort} connection establishing`)
ws.on("close", (e) => {
debug(`${request.socket.remoteFamily}:${request.socket.remoteAddress}:${request.socket.remotePort} websocket closed ${JSON.stringify(e)}`)
})
ws.on("error", (e) => {
debug(`${request.socket.remoteFamily}:${request.socket.remoteAddress}:${request.socket.remotePort} websocket errored ${JSON.stringify(e)}`)
})
handler.emit("connection", ws, request)
})
}
})
server.listen(8090, "0.0.0.0")客户端
NodeJS环境
const { Client } = require("./dist/bundle")
// Must export websocket to global environment.
const ws = require("ws")
global.WebSocket = ws.WebSocket
const client = new Client("ws://127.0.0.1:8090", {
config: {
id: "123",
token: "123",
}
})
client.watch((evt) => {
console.log(evt.data)
})
client.onclose = (evt) => {
console.log(evt)
}
client.onopen = (evt) => {
console.log("onopen")
}
client.onmessage = (evt) => {
console.log(evt.data)
}
client.send("1234")
client.observer.emit("/test", "1234", 1234)
client.rpc.invoke("/test", "1234", 1234, "1234").then((v) => {
console.log(v)
})浏览器环境
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Title</title>
<script src="dist/bundle.js"></script>
<script>
const client = new WSocket.Client("ws://127.0.0.1:8090", {
config: {
id: "your_id",
token: "your_token",
data: "your_data",
}
})
client.onclose = (evt) => {
console.log(evt)
}
client.onopen = (evt) => {
console.log("onopen")
}
client.send("test_data")
client.observer.emit("/test", "1234", 1234)
client.rpc.invoke("/test", "1234", 1234, "1234").then((v) => {
console.log(v)
})
</script>
</head>
<body>
</body>
</html>