sonic-ws 1.3.1 → 1.3.2

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -2,201 +2,5 @@
2
2
  * Copyright 2026 Lily (liwybloc)
3
3
  * Licensed under the Apache License, Version 2.0.
4
4
  */
5
- "use strict";
6
5
 
7
- var __importDefault = (this && this.__importDefault) || function (mod) {
8
- return (mod && mod.__esModule) ? mod : { "default": mod };
9
- };
10
- Object.defineProperty(exports, "__esModule", { value: true });
11
- exports.DebugServer = void 0;
12
- const Connection_1 = require("../Connection");
13
- const PacketType_1 = require("../packets/PacketType");
14
- const SonicWSServer_1 = require("../server/SonicWSServer");
15
- const PacketUtils_1 = require("../util/packets/PacketUtils");
16
- const http_1 = __importDefault(require("http"));
17
- const open_1 = __importDefault(require("open"));
18
- const EnumHandler_1 = require("../util/enums/EnumHandler");
19
- class DebugServer {
20
- constructor(host, data) {
21
- data.port ??= 0;
22
- data.password ??= "";
23
- if (data.port < 0 || data.port >= 65536)
24
- throw new Error("Port out of range!");
25
-
26
- const server = http_1.default.createServer((req, res) => {
27
- res.writeHead(200, { 'Content-Type': 'text/html' });
28
- res.end(`<!doctypehtml><meta charset=UTF-8><script src=https://cdn.jsdelivr.net/gh/liwybloc/sonic-ws/bundled/SonicWS_bundle.js></script><title>SonicWS Debug Menu</title><style>body{margin:0;font-family:Inter,Arial,sans-serif;background:#0f1115;color:#e6e6e6;height:100vh;display:flex}#sidebar{width:260px;background:#141821;border-right:1px solid #1f2533;display:flex;flex-direction:column}#sidebar-header{padding:16px;font-weight:600;font-size:18px;border-bottom:1px solid #1f2533;cursor:pointer;transition:color .2s}#sidebar-header:hover{color:#ddd}#socket-list{flex:1;overflow-y:auto}.socket-item{padding:10px 14px;cursor:pointer;border-bottom:1px solid #1f2533}.socket-item:hover{background:#1b2030}.socket-item.active{background:#22294a}.socket-id{font-size:12px;opacity:.7}#main{flex:1;display:flex;flex-direction:column}#main-header{padding:17px;border-bottom:1px solid #1f2533;display:flex;justify-content:space-between;align-items:center}#stats{display:flex;gap:20px;font-size:13px}#packets{flex:1;overflow-y:auto;padding:12px}.packet{background:#1a1f2e;border-radius:6px;padding:6px 8px;margin-bottom:4px;font-size:12px;cursor:pointer}.packet.sent{border-left:3px solid #3cff7a}.packet.recv{border-left:3px solid #ff5a5a}.packet-details{display:none;margin-top:4px;opacity:.75;font-size:11px}.packet.expanded .packet-details{display:block}button{background:0 0}</style><div id=sidebar><div id=sidebar-header>Sonic WS Debug Menu</div><div id=socket-list></div></div><div id=main><div id=main-header><button id=close-socket style=display:none>❌</button><div id=socket-title>Server Home</div><div id=stats></div></div><div id=home style=display:block;padding:16px><h2>Server Dashboard</h2><div id=global-stats style=margin-bottom:16px></div><h3>Connection Logs</h3><ul id=connection-logs style=max-height:200px;overflow-y:auto;padding-left:16px></ul><div style=margin-top:16px><table style=width:100%;border-collapse:collapse><thead><tr><th style="border-bottom:1px solid #444;text-align:left">Socket ID<th style="border-bottom:1px solid #444;text-align:left">Name<th style="border-bottom:1px solid #444;text-align:left">Status<tbody id=connection-table></table></div></div><div id=packets></div></div><script>const socketList=document.getElementById("socket-list"),packetsDiv=document.getElementById("packets"),socketTitle=document.getElementById("socket-title"),debugTitle=document.getElementById("sidebar-header"),statsDiv=document.getElementById("stats"),home=document.getElementById("home"),closeSocketBtn=document.getElementById("close-socket");debugTitle.onclick=()=>{null!==activeId&&(activeId=null,packetsDiv.style.display="none",home.style.display="block",closeSocketBtn.style.display="none",renderGlobalStats())};const globalStats={totalSockets:0,totalSent:0,totalRecv:0,totalSentBytes:0,totalRecvBytes:0,totalSaved:0,startTime:0};function formatMilliseconds(e){if(e<1)return"0.0s";const t=[{label:"week",value:6048e5},{label:"day",value:864e5},{label:"hour",value:36e5},{label:"minute",value:6e4}],s=[];for(const{label:o,value:n}of t){const t=Math.floor(e/n);t>0&&(s.push(t+" "+o+(1!==t?"s":"")),e-=t*n)}if(e>0||0===s.length){const t=(e/1e3).toFixed(1);s.push(t+"s")}if(1===s.length)return s[0];const o=s.pop();return s.join(", ")+" and "+o}const globalStatsDiv=document.getElementById("global-stats");function renderGlobalStats(){const e=globalStats,t=formatMilliseconds(Date.now()-e.startTime);globalStatsDiv.innerHTML="<div><strong>Total Sockets:</strong> "+e.totalSockets+"</div><div><strong>Total Sent Packets:</strong> "+e.totalSent+"</div><div><strong>Total Received Packets:</strong> "+e.totalRecv+"</div><div><strong>Total Sent Bytes:</strong> "+e.totalSentBytes+" B</div><div><strong>Total Received Bytes:</strong> "+e.totalRecvBytes+" B</div><div><strong>Total Bandwidth Saved:</strong> "+e.totalSaved+" B</div><div><strong>Uptime:</strong> "+t+"</div>"}function updateConnectionTable(){const e=document.getElementById("connection-table");e.innerHTML="",sockets.forEach((t=>{const s=document.createElement("tr");s.innerHTML="<td>"+t.id+"</td><td>"+t.name+'</td><td style="color:'+(t.el.style.color||"#0f0")+'">'+("#f00"===t.el.style.color?"Disconnected":"Connected")+"</td>",e.appendChild(s)}))}setInterval(renderGlobalStats,50),setInterval(updateConnectionTable,1e3);const sockets=new Map;let activeId=null;function selectSocket(e){activeId=e,[...socketList.children].forEach((t=>t.classList.toggle("active",t.dataset.id==e)));const t=sockets.get(e);socketTitle.textContent=t.name,packetsDiv.innerHTML="",t.packets.forEach((e=>packetsDiv.appendChild(e.el))),renderStats(t),home.style.display="none",packetsDiv.style.display="block",closeSocketBtn.style.display="block"}function renderStats(e){statsDiv.innerHTML="<div>Sent: "+e.sent+"</div><div>Recv: "+e.recv+"</div><div>Sent bytes: "+e.sentBytes+"</div><div>Recv bytes: "+e.recvBytes+"</div><div>Saved: "+e.saved+"</div>"}function addSocket(e,t){const s=document.createElement("div");s.className="socket-item",s.dataset.id=e,s.innerHTML="<div>"+t+'</div><div class="socket-id">#'+e+"</div>",s.onclick=()=>selectSocket(e),socketList.appendChild(s),sockets.set(e,{id:e,name:t,el:s,packets:[],sent:0,recv:0,sentBytes:0,recvBytes:0,saved:0})}function removeSocket(e,t,s,o){const n=sockets.get(e);if(!n)return console.error("Unknown socket!!",e);n.el.dataset.id=e+"-closed",n.el.onclick=()=>selectSocket(e+"-closed"),sockets.set(e+"-closed",n),sockets.delete(e),activeId==e&&(activeId=e+"-closed");const c=n.el.childNodes[0];c.style.color="#f00";let l=document.createElement("span");l.style.display="inline-block",l.style.width="10px",l.style.height="10px",l.style.borderRadius="50%",l.style.background="#ff5a5a",l.style.marginLeft="8px",c.appendChild(l);const a=document.createElement("li");a.textContent="Socket #"+e+" disconnected — Code: "+t+", Reason: "+s+", Closure Cause: "+o,document.getElementById("connection-logs").appendChild(a),requestAnimationFrame((()=>l.style.width="100%")),setTimeout((()=>{l.remove(),n.el.remove(),activeId==e+"-closed"&&(packetsDiv.style.display="none",home.style.display="block",closeSocketBtn.style.display="none")}),3e4)}function addPacket(e,t,s,o,n,c,l,a){const d=sockets.get(e);if(!d)return console.error("Unknown socket!!",e);const i=document.createElement("div");i.className="packet "+("sent"===t?"sent":"recv"),i.innerHTML="<div>"+s+("undefined"!==c?" — "+c:"")+'</div><div class="packet-details">Raw Bytes: '+o+"b (saved: ~"+n+"b)<br>Processed At: "+new Date(l).toISOString()+"<br>Processing Time: "+a.toFixed(2)+"ms</div>",i.onclick=()=>i.classList.toggle("expanded"),d.packets.push({el:i}),"sent"===t?(d.sent++,d.sentBytes+=o):(d.recv++,d.recvBytes+=o),d.saved+=n,activeId===e&&(packetsDiv.appendChild(i),renderStats(d))}function setStat(e,t){globalStats[Object.keys(globalStats)[e]]=t,null===activeId&&renderGlobalStats()}closeSocketBtn.onclick=()=>{null!==activeId&&ws.send("close",Number(activeId))};const ws=new SonicWS("ws://"+location.host);ws.on("connection",(e=>addSocket(e,"Socket "+e))),ws.on("disconnection",(([e,t],[s,o])=>removeSocket(e,t,s,o))),ws.on("nameChange",(([e],[t])=>{const s=sockets.get(e);if(!s)return console.error("Unknown socket!!",e);s.name=t,s.el.firstChild.textContent=t,activeId===e&&(socketTitle.textContent=t)})),ws.on("packet",(([e,t,s],[o],[n],[c],[l,a])=>{console.log("Received packet",{id:e,size:t,saved:s,dir:o,tag:n,values:c,time:l,processTime:a}),addPacket(e,o,n,t,s,c,l,a)})),ws.on("stats",(e=>{console.log("Received stats",e),e.forEach(((e,t)=>setStat(t,e)))})),ws.on("stat",((e,t)=>setStat(e,t)));const lastKnownPassword=localStorage.getItem("password"),empty=!localStorage.getItem("req");let usedPass="";ws.on_ready((()=>{empty?ws.send("password",""):ws.send("password",usedPass=lastKnownPassword??prompt("Please enter password"))})),ws.on_close((()=>{window.location.reload()})),ws.on("authenticated",(e=>{e?(localStorage.setItem("req",usedPass.length>0),localStorage.setItem("password",usedPass)):(localStorage.setItem("req",!0),localStorage.removeItem("password"),window.location.reload())}));</script>`);
29
- });
30
- const TYPE_ENUM = (0, EnumHandler_1.DefineEnum)("type", ["sent", "recv"]);
31
- const wss = new SonicWSServer_1.SonicWSServer({
32
- clientPackets: [
33
- (0, PacketUtils_1.CreatePacket)({ tag: "password", type: PacketType_1.PacketType.STRINGS_UTF16 }),
34
- (0, PacketUtils_1.CreatePacket)({ tag: "close", type: PacketType_1.PacketType.UVARINT }),
35
- ],
36
- serverPackets: [
37
- (0, PacketUtils_1.CreatePacket)({ tag: "authenticated", type: PacketType_1.PacketType.BOOLEANS }),
38
- (0, PacketUtils_1.CreatePacket)({ tag: "connection", type: PacketType_1.PacketType.UVARINT }),
39
- (0, PacketUtils_1.CreateObjPacket)({ tag: "disconnection", types: [PacketType_1.PacketType.UVARINT, PacketType_1.PacketType.STRINGS], noDataRange: true }),
40
- (0, PacketUtils_1.CreateObjPacket)({ tag: "nameChange", types: [PacketType_1.PacketType.UVARINT, PacketType_1.PacketType.STRINGS_UTF16], noDataRange: true }),
41
- (0, PacketUtils_1.CreateObjPacket)({
42
- tag: "packet",
43
- types: [
44
- PacketType_1.PacketType.VARINT,
45
- TYPE_ENUM,
46
- PacketType_1.PacketType.STRINGS_UTF16,
47
- PacketType_1.PacketType.STRINGS_UTF16,
48
- PacketType_1.PacketType.FLOATS,
49
- ],
50
- noDataRange: true,
51
- dataBatching: 50,
52
- maxBatchSize: 0,
53
- }),
54
- (0, PacketUtils_1.CreatePacket)({ tag: "stats", type: PacketType_1.PacketType.UVARINT, noDataRange: true, dontSpread: true }),
55
- (0, PacketUtils_1.CreatePacket)({ tag: "stat", type: PacketType_1.PacketType.UVARINT, dataMax: 2 }),
56
- ],
57
- websocketOptions: { server },
58
- });
59
- const globalStats = new Proxy({
60
- totalSockets: 0,
61
- totalSent: 0,
62
- totalRecv: 0,
63
- totalSentBytes: 0,
64
- totalRecvBytes: 0,
65
- totalSaved: 0,
66
- startTime: Date.now(),
67
- }, {
68
- set(target, prop, value) {
69
- const key = String(prop);
70
- if (target[key] !== value) {
71
- target[key] = value;
72
- wss.broadcast("stat", Object.keys(globalStats).indexOf(key), value);
73
- }
74
- return true;
75
- }
76
- });
77
-
78
- const storedPacketData = {};
79
- wss.on_connect(ws => {
80
- let authenticated = false;
81
- const ogs = ws.send.bind(ws);
82
- let queue = [];
83
- ws.send = async (tag, ...values) => {
84
- console.log(authenticated, tag, values);
85
- if (!authenticated)
86
- queue.push([tag, values]);
87
- else
88
- ogs(tag, ...values);
89
- };
90
- ws.send("stats", ...Object.values(globalStats));
91
- host.connections.forEach(conn => {
92
- ws.send("connection", conn.id);
93
- ws.send("nameChange", conn.id, conn.getName());
94
- storedPacketData[conn.id]?.forEach((data) => {
95
- ws.send("packet", ...data);
96
- });
97
- });
98
- ws.on("password", (pword) => {
99
- if (data.password != pword) {
100
- ogs("authenticated", false);
101
- setTimeout(() => ws.close(1008), 1000);
102
- }
103
- else {
104
- authenticated = true;
105
- ws.send("authenticated", true);
106
- queue.forEach(([tag, values]) => ogs(tag, ...values));
107
- }
108
- });
109
- ws.on("close", (id) => {
110
- if (!authenticated)
111
- return;
112
- host.connectionMap[id]?.close(Connection_1.CloseCodes.MANUAL_SHUTDOWN);
113
- });
114
- });
115
- const innerConns = [];
116
- const broadcastSends = {};
117
- const textEncoder = new TextEncoder();
118
- const length = (values) => textEncoder.encode(JSON.stringify(values) ?? "[]").length;
119
- host.addMiddleware(new (class {
120
- onClientConnect(connection) {
121
- globalStats.totalSockets++;
122
- storedPacketData[connection.id] = [];
123
- innerConns.push(connection);
124
- wss.broadcast("connection", connection.id);
125
- const packetsSend = {};
126
- const packetsRecv = {};
127
- connection.addMiddleware(new (class {
128
- onNameChange(name) {
129
- wss.broadcast("nameChange", connection.id, name);
130
- }
131
- onSend_pre(tag, values, date, perfTime) {
132
- packetsSend[tag] ??= [];
133
- packetsSend[tag].push([values, perfTime, date]);
134
- }
135
- onSend_post(tag, data, sendSize) {
136
- globalStats.totalSentBytes += sendSize;
137
- globalStats.totalSent++;
138
- const [values, perfTime, date] = packetsSend[tag].shift();
139
- const jsonLength = length(values);
140
- const saved = jsonLength - sendSize;
141
- globalStats.totalSaved += saved;
142
- const record = [
143
- [connection.id, sendSize + 1, saved],
144
- TYPE_ENUM.wrap("sent"),
145
- tag,
146
- JSON.stringify(values),
147
- [date, performance.now() - perfTime],
148
- ];
149
- storedPacketData[connection.id].push(record);
150
- wss.broadcast("packet", ...record);
151
- }
152
- onReceive_pre(tag, data, recvSize) {
153
- globalStats.totalRecvBytes += recvSize;
154
- globalStats.totalRecv++;
155
- packetsRecv[tag] ??= [];
156
- packetsRecv[tag].push([data, performance.now(), Date.now()]);
157
- }
158
- onReceive_post(tag, values) {
159
- const [data, time, date] = packetsRecv[tag].shift();
160
- const jsonLength = length(values);
161
- const saved = jsonLength - data.length;
162
- globalStats.totalSaved += saved;
163
- const record = [
164
- [connection.id, data.length + 1, saved],
165
- TYPE_ENUM.wrap("recv"),
166
- tag,
167
- JSON.stringify(values),
168
- [date, performance.now() - time],
169
- ];
170
- storedPacketData[connection.id].push(record);
171
- wss.broadcast("packet", ...record);
172
- }
173
- })());
174
- }
175
- onClientDisconnect(connection, code, reason) {
176
- globalStats.totalSockets--;
177
- wss.broadcast("disconnection", [connection.id, code], [reason?.toString() ?? "UNKNOWN", (0, Connection_1.getClosureCause)(code)]);
178
- delete storedPacketData[connection.id];
179
- innerConns.splice(innerConns.indexOf(connection), 1);
180
- }
181
- onPacketBroadcast_pre(tag, info, ...values) {
182
- broadcastSends[tag] ??= [];
183
- broadcastSends[tag].push([values, performance.now(), Date.now()]);
184
- }
185
- onPacketBroadcast_post(tag, info, data, sendSize) {
186
- const [values, time, date] = broadcastSends[tag].shift();
187
- info.recipients.forEach(k => {
188
- if (innerConns.includes(k)) {
189
- k.callMiddleware("onSend_pre", tag, values, date, time);
190
- k.callMiddleware("onSend_post", tag, data, sendSize);
191
- }
192
- });
193
- }
194
- })());
195
- server.listen(data.port, () => {
196
- const address = server.address();
197
- console.log(`SWS Debug server running at http://localhost:${address.port}`);
198
- (0, open_1.default)(`http://localhost:${address.port}`);
199
- });
200
- }
201
- }
202
- exports.DebugServer = DebugServer;
6
+ var e=this&&this.__importDefault||function(e){return e&&e.__esModule?e:{default:e}};Object.defineProperty(exports,"__esModule",{value:!0}),exports.DebugServer=void 0;const t=require("../Connection"),o=require("../packets/PacketType"),s=require("../server/SonicWSServer"),n=require("../util/packets/PacketUtils"),a=e(require("http")),c=e(require("open")),d=require("../util/enums/EnumHandler");exports.DebugServer=class{constructor(e,i){if(i.port??=0,i.password??="",i.port<0||i.port>=65536)throw new Error("Port out of range!");const l=a.default.createServer((e,t)=>{t.writeHead(200,{"Content-Type":"text/html"}),t.end('<!doctypehtml><meta charset=UTF-8><script src=https://cdn.jsdelivr.net/gh/liwybloc/sonic-ws/bundled/SonicWS_bundle.js><\/script><title>SonicWS Debug Menu</title><style>body{margin:0;font-family:Inter,Arial,sans-serif;background:#0f1115;color:#e6e6e6;height:100vh;display:flex}#sidebar{width:260px;background:#141821;border-right:1px solid #1f2533;display:flex;flex-direction:column}#sidebar-header{padding:16px;font-weight:600;font-size:18px;border-bottom:1px solid #1f2533;cursor:pointer;transition:color .2s}#sidebar-header:hover{color:#ddd}#socket-list{flex:1;overflow-y:auto}.socket-item{padding:10px 14px;cursor:pointer;border-bottom:1px solid #1f2533}.socket-item:hover{background:#1b2030}.socket-item.active{background:#22294a}.socket-id{font-size:12px;opacity:.7}#main{flex:1;display:flex;flex-direction:column}#main-header{padding:17px;border-bottom:1px solid #1f2533;display:flex;justify-content:space-between;align-items:center}#stats{display:flex;gap:20px;font-size:13px}#packets{flex:1;overflow-y:auto;padding:12px}.packet{background:#1a1f2e;border-radius:6px;padding:6px 8px;margin-bottom:4px;font-size:12px;cursor:pointer}.packet.sent{border-left:3px solid #3cff7a}.packet.recv{border-left:3px solid #ff5a5a}.packet-details{display:none;margin-top:4px;opacity:.75;font-size:11px}.packet.expanded .packet-details{display:block}button{background:0 0}</style><div id=sidebar><div id=sidebar-header>Sonic WS Debug Menu</div><div id=socket-list></div></div><div id=main><div id=main-header><button id=close-socket style=display:none>❌</button><div id=socket-title>Server Home</div><div id=stats></div></div><div id=home style=display:block;padding:16px><h2>Server Dashboard</h2><div id=global-stats style=margin-bottom:16px></div><h3>Connection Logs</h3><ul id=connection-logs style=max-height:200px;overflow-y:auto;padding-left:16px></ul><div style=margin-top:16px><table style=width:100%;border-collapse:collapse><thead><tr><th style="border-bottom:1px solid #444;text-align:left">Socket ID<th style="border-bottom:1px solid #444;text-align:left">Name<th style="border-bottom:1px solid #444;text-align:left">Status<tbody id=connection-table></table></div></div><div id=packets></div></div><script>const socketList=document.getElementById("socket-list"),packetsDiv=document.getElementById("packets"),socketTitle=document.getElementById("socket-title"),debugTitle=document.getElementById("sidebar-header"),statsDiv=document.getElementById("stats"),home=document.getElementById("home"),closeSocketBtn=document.getElementById("close-socket");debugTitle.onclick=()=>{null!==activeId&&(activeId=null,packetsDiv.style.display="none",home.style.display="block",closeSocketBtn.style.display="none",renderGlobalStats())};const globalStats={totalSockets:0,totalSent:0,totalRecv:0,totalSentBytes:0,totalRecvBytes:0,totalSaved:0,startTime:0};function formatMilliseconds(e){if(e<1)return"0.0s";const t=[{label:"week",value:6048e5},{label:"day",value:864e5},{label:"hour",value:36e5},{label:"minute",value:6e4}],s=[];for(const{label:o,value:n}of t){const t=Math.floor(e/n);t>0&&(s.push(t+" "+o+(1!==t?"s":"")),e-=t*n)}if(e>0||0===s.length){const t=(e/1e3).toFixed(1);s.push(t+"s")}if(1===s.length)return s[0];const o=s.pop();return s.join(", ")+" and "+o}const globalStatsDiv=document.getElementById("global-stats");function renderGlobalStats(){const e=globalStats,t=formatMilliseconds(Date.now()-e.startTime);globalStatsDiv.innerHTML="<div><strong>Total Sockets:</strong> "+e.totalSockets+"</div><div><strong>Total Sent Packets:</strong> "+e.totalSent+"</div><div><strong>Total Received Packets:</strong> "+e.totalRecv+"</div><div><strong>Total Sent Bytes:</strong> "+e.totalSentBytes+" B</div><div><strong>Total Received Bytes:</strong> "+e.totalRecvBytes+" B</div><div><strong>Total Bandwidth Saved:</strong> "+e.totalSaved+" B</div><div><strong>Uptime:</strong> "+t+"</div>"}function updateConnectionTable(){const e=document.getElementById("connection-table");e.innerHTML="",sockets.forEach((t=>{const s=document.createElement("tr");s.innerHTML="<td>"+t.id+"</td><td>"+t.name+\'</td><td style="color:\'+(t.el.style.color||"#0f0")+\'">\'+("#f00"===t.el.style.color?"Disconnected":"Connected")+"</td>",e.appendChild(s)}))}setInterval(renderGlobalStats,50),setInterval(updateConnectionTable,1e3);const sockets=new Map;let activeId=null;function selectSocket(e){activeId=e,[...socketList.children].forEach((t=>t.classList.toggle("active",t.dataset.id==e)));const t=sockets.get(e);socketTitle.textContent=t.name,packetsDiv.innerHTML="",t.packets.forEach((e=>packetsDiv.appendChild(e.el))),renderStats(t),home.style.display="none",packetsDiv.style.display="block",closeSocketBtn.style.display="block"}function renderStats(e){statsDiv.innerHTML="<div>Sent: "+e.sent+"</div><div>Recv: "+e.recv+"</div><div>Sent bytes: "+e.sentBytes+"</div><div>Recv bytes: "+e.recvBytes+"</div><div>Saved: "+e.saved+"</div>"}function addSocket(e,t){const s=document.createElement("div");s.className="socket-item",s.dataset.id=e,s.innerHTML="<div>"+t+\'</div><div class="socket-id">#\'+e+"</div>",s.onclick=()=>selectSocket(e),socketList.appendChild(s),sockets.set(e,{id:e,name:t,el:s,packets:[],sent:0,recv:0,sentBytes:0,recvBytes:0,saved:0})}function removeSocket(e,t,s,o){const n=sockets.get(e);if(!n)return console.error("Unknown socket!!",e);n.el.dataset.id=e+"-closed",n.el.onclick=()=>selectSocket(e+"-closed"),sockets.set(e+"-closed",n),sockets.delete(e),activeId==e&&(activeId=e+"-closed");const c=n.el.childNodes[0];c.style.color="#f00";let l=document.createElement("span");l.style.display="inline-block",l.style.width="10px",l.style.height="10px",l.style.borderRadius="50%",l.style.background="#ff5a5a",l.style.marginLeft="8px",c.appendChild(l);const a=document.createElement("li");a.textContent="Socket #"+e+" disconnected — Code: "+t+", Reason: "+s+", Closure Cause: "+o,document.getElementById("connection-logs").appendChild(a),requestAnimationFrame((()=>l.style.width="100%")),setTimeout((()=>{l.remove(),n.el.remove(),activeId==e+"-closed"&&(packetsDiv.style.display="none",home.style.display="block",closeSocketBtn.style.display="none")}),3e4)}function addPacket(e,t,s,o,n,c,l,a){const d=sockets.get(e);if(!d)return console.error("Unknown socket!!",e);const i=document.createElement("div");i.className="packet "+("sent"===t?"sent":"recv"),i.innerHTML="<div>"+s+("undefined"!==c?" — "+c:"")+\'</div><div class="packet-details">Raw Bytes: \'+o+"b (saved: ~"+n+"b)<br>Processed At: "+new Date(l).toISOString()+"<br>Processing Time: "+a.toFixed(2)+"ms</div>",i.onclick=()=>i.classList.toggle("expanded"),d.packets.push({el:i}),"sent"===t?(d.sent++,d.sentBytes+=o):(d.recv++,d.recvBytes+=o),d.saved+=n,activeId===e&&(packetsDiv.appendChild(i),renderStats(d))}function setStat(e,t){globalStats[Object.keys(globalStats)[e]]=t,null===activeId&&renderGlobalStats()}closeSocketBtn.onclick=()=>{null!==activeId&&ws.send("close",Number(activeId))};const ws=new SonicWS("ws://"+location.host);ws.on("connection",(e=>addSocket(e,"Socket "+e))),ws.on("disconnection",(([e,t],[s,o])=>removeSocket(e,t,s,o))),ws.on("nameChange",(([e],[t])=>{const s=sockets.get(e);if(!s)return console.error("Unknown socket!!",e);s.name=t,s.el.firstChild.textContent=t,activeId===e&&(socketTitle.textContent=t)})),ws.on("packet",(([e,t,s],[o],[n],[c],[l,a])=>{console.log("Received packet",{id:e,size:t,saved:s,dir:o,tag:n,values:c,time:l,processTime:a}),addPacket(e,o,n,t,s,c,l,a)})),ws.on("stats",(e=>{console.log("Received stats",e),e.forEach(((e,t)=>setStat(t,e)))})),ws.on("stat",((e,t)=>setStat(e,t)));const lastKnownPassword=localStorage.getItem("password"),empty=!localStorage.getItem("req");let usedPass="";ws.on_ready((()=>{empty?ws.send("password",""):ws.send("password",usedPass=lastKnownPassword??prompt("Please enter password"))})),ws.on_close((()=>{window.location.reload()})),ws.on("authenticated",(e=>{e?(localStorage.setItem("req",usedPass.length>0),localStorage.setItem("password",usedPass)):(localStorage.setItem("req",!0),localStorage.removeItem("password"),window.location.reload())}));<\/script>')}),r=(0,d.DefineEnum)("type",["sent","recv"]),p=new s.SonicWSServer({clientPackets:[(0,n.CreatePacket)({tag:"password",type:o.PacketType.STRINGS_UTF16}),(0,n.CreatePacket)({tag:"close",type:o.PacketType.UVARINT})],serverPackets:[(0,n.CreatePacket)({tag:"authenticated",type:o.PacketType.BOOLEANS}),(0,n.CreatePacket)({tag:"connection",type:o.PacketType.UVARINT}),(0,n.CreateObjPacket)({tag:"disconnection",types:[o.PacketType.UVARINT,o.PacketType.STRINGS],noDataRange:!0}),(0,n.CreateObjPacket)({tag:"nameChange",types:[o.PacketType.UVARINT,o.PacketType.STRINGS_UTF16],noDataRange:!0}),(0,n.CreateObjPacket)({tag:"packet",types:[o.PacketType.VARINT,r,o.PacketType.STRINGS_UTF16,o.PacketType.STRINGS_UTF16,o.PacketType.FLOATS],noDataRange:!0,dataBatching:50,maxBatchSize:0}),(0,n.CreatePacket)({tag:"stats",type:o.PacketType.UVARINT,noDataRange:!0,dontSpread:!0}),(0,n.CreatePacket)({tag:"stat",type:o.PacketType.UVARINT,dataMax:2})],websocketOptions:{server:l}}),v=new Proxy({totalSockets:0,totalSent:0,totalRecv:0,totalSentBytes:0,totalRecvBytes:0,totalSaved:0,startTime:Date.now()},{set(e,t,o){const s=String(t);return e[s]!==o&&(e[s]=o,p.broadcast("stat",Object.keys(v).indexOf(s),o)),!0}}),k={};p.on_connect(o=>{let s=!1;const n=o.send.bind(o);let a=[];o.send=async(e,...t)=>{console.log(s,e,t),s?n(e,...t):a.push([e,t])},o.send("stats",...Object.values(v)),e.connections.forEach(e=>{o.send("connection",e.id),o.send("nameChange",e.id,e.getName()),k[e.id]?.forEach(e=>{o.send("packet",...e)})}),o.on("password",e=>{i.password!=e?(n("authenticated",!1),setTimeout(()=>o.close(1008),1e3)):(s=!0,o.send("authenticated",!0),a.forEach(([e,t])=>n(e,...t)))}),o.on("close",o=>{s&&e.connectionMap[o]?.close(t.CloseCodes.MANUAL_SHUTDOWN)})});const u=[],g={},y=new TextEncoder,m=e=>y.encode(JSON.stringify(e)??"[]").length;e.addMiddleware(new class{onClientConnect(e){v.totalSockets++,k[e.id]=[],u.push(e),p.broadcast("connection",e.id);const t={},o={};e.addMiddleware(new class{onNameChange(t){p.broadcast("nameChange",e.id,t)}onSend_pre(e,o,s,n){t[e]??=[],t[e].push([o,n,s])}onSend_post(o,s,n){v.totalSentBytes+=n,v.totalSent++;const[a,c,d]=t[o].shift(),i=m(a)-n;v.totalSaved+=i;const l=[[e.id,n+1,i],r.wrap("sent"),o,JSON.stringify(a),[d,performance.now()-c]];k[e.id].push(l),p.broadcast("packet",...l)}onReceive_pre(e,t,s){v.totalRecvBytes+=s,v.totalRecv++,o[e]??=[],o[e].push([t,performance.now(),Date.now()])}onReceive_post(t,s){const[n,a,c]=o[t].shift(),d=m(s)-n.length;v.totalSaved+=d;const i=[[e.id,n.length+1,d],r.wrap("recv"),t,JSON.stringify(s),[c,performance.now()-a]];k[e.id].push(i),p.broadcast("packet",...i)}})}onClientDisconnect(e,o,s){v.totalSockets--,p.broadcast("disconnection",[e.id,o],[s?.toString()??"UNKNOWN",(0,t.getClosureCause)(o)]),delete k[e.id],u.splice(u.indexOf(e),1)}onPacketBroadcast_pre(e,t,...o){g[e]??=[],g[e].push([o,performance.now(),Date.now()])}onPacketBroadcast_post(e,t,o,s){const[n,a,c]=g[e].shift();t.recipients.forEach(t=>{u.includes(t)&&(t.callMiddleware("onSend_pre",e,n,c,a),t.callMiddleware("onSend_post",e,o,s))})}}),l.listen(i.port,()=>{const e=l.address();console.log(`SWS Debug server running at http://localhost:${e.port}`),(0,c.default)(`http://localhost:${e.port}`)})}};
@@ -8,7 +8,7 @@ import { PacketType } from "./PacketType";
8
8
  export type PacketTypeValidator = (data: Uint8Array, index: number) => Promise<[Uint8Array, false | any]>;
9
9
  export type PacketReceiveProcessor = (data: Uint8Array, validationResult: any, index: number) => any;
10
10
  export type PacketSendProcessor = (ident: string, ...data: any[]) => Promise<Uint8Array>;
11
- export declare function createValidator<T extends PacketType>(type: T, dataCap: number, dataMin: number, packet: Packet<T | T[]>, gzipCompression: boolean): PacketTypeValidator;
11
+ export declare function createValidator<T extends PacketType>(type: T, dataCap: number, dataMin: number, packet: Packet<T> | Packet<T[]>, gzipCompression: boolean): PacketTypeValidator;
12
12
  export declare function createReceiveProcessor(type: PacketType, enumData: EnumPackage[], cap: number): PacketReceiveProcessor;
13
13
  /** Creates a function that processes a packet type */
14
14
  export declare function createSendProcessor(type: PacketType, gzipCompression: boolean, batchedData: boolean): PacketSendProcessor;
@@ -2,306 +2,5 @@
2
2
  * Copyright 2026 Lily (liwybloc)
3
3
  * Licensed under the Apache License, Version 2.0.
4
4
  */
5
- "use strict";
6
5
 
7
- Object.defineProperty(exports, "__esModule", { value: true });
8
- exports.createValidator = createValidator;
9
- exports.createReceiveProcessor = createReceiveProcessor;
10
- exports.createSendProcessor = createSendProcessor;
11
- exports.createObjSendProcessor = createObjSendProcessor;
12
- exports.createObjReceiveProcessor = createObjReceiveProcessor;
13
- exports.createObjValidator = createObjValidator;
14
- const BufferUtil_1 = require("../util/BufferUtil");
15
- const CompressionUtil_1 = require("../util/packets/CompressionUtil");
16
- const PacketType_1 = require("./PacketType");
17
- const BufferUtil_2 = require("../util/BufferUtil");
18
- const StringUtil_1 = require("../util/StringUtil");
19
- const JSONUtil_1 = require("../util/packets/JSONUtil");
20
- function BYTE_LEN(cap, min) {
21
- return (data) => data.length >= min && data.length <= cap;
22
- }
23
- function SHORT_LEN(cap, min) {
24
- min *= 2;
25
- cap *= 2;
26
- return (data) => data.length >= min && data.length <= cap && data.length % 2 == 0;
27
- }
28
- function VARINT_VERIF(cap, min) {
29
- return (data) => {
30
- if (data.length == 0)
31
- return min <= 0 ? [] : false;
32
- let sectors = 0, i = 0, computed = [];
33
- while (i < data.length) {
34
- const [off, varint] = (0, CompressionUtil_1.readVarInt)(data, i);
35
- i = off;
36
- computed.push(varint);
37
- if (++sectors > cap)
38
- return false;
39
- }
40
- if (sectors < min)
41
- return false;
42
- return computed;
43
- };
44
- }
45
- ;
46
- function createValidator(type, dataCap, dataMin, packet, gzipCompression) {
47
- function genFunc() {
48
- switch (type) {
49
- case PacketType_1.PacketType.NONE: return (data) => data.length == 0;
50
- case PacketType_1.PacketType.RAW: return () => undefined;
51
- case PacketType_1.PacketType.ENUMS: return (data, index) => {
52
- if (data.length < dataMin || data.length > dataCap || index >= packet.enumData.length)
53
- return false;
54
- const pkg = packet.enumData[index];
55
- for (let i = 0; i < data.length; i++) {
56
- if (pkg.values.length <= data[i])
57
- return false;
58
- }
59
- };
60
- case PacketType_1.PacketType.BYTES: return BYTE_LEN(dataCap, dataMin);
61
- case PacketType_1.PacketType.UBYTES: return BYTE_LEN(dataCap, dataMin);
62
- case PacketType_1.PacketType.HEX: return BYTE_LEN(dataCap, dataMin);
63
- case PacketType_1.PacketType.SHORTS: return SHORT_LEN(dataCap, dataMin);
64
- case PacketType_1.PacketType.USHORTS: return SHORT_LEN(dataCap, dataMin);
65
- case PacketType_1.PacketType.VARINT: return VARINT_VERIF(dataCap, dataMin);
66
- case PacketType_1.PacketType.UVARINT: return VARINT_VERIF(dataCap, dataMin);
67
- case PacketType_1.PacketType.DELTAS: return VARINT_VERIF(dataCap, dataMin);
68
- case PacketType_1.PacketType.FLOATS: return (data) => {
69
- if (data.length % 4 !== 0)
70
- return false;
71
- const sectors = data.length * CompressionUtil_1.ONE_FOURTH;
72
- if (sectors > dataCap || sectors < dataMin)
73
- return false;
74
- return undefined;
75
- };
76
- case PacketType_1.PacketType.DOUBLES: return (data) => {
77
- if (data.length % 8 !== 0)
78
- return false;
79
- const sectors = data.length * CompressionUtil_1.ONE_EIGHT;
80
- if (sectors > dataCap || sectors < dataMin)
81
- return false;
82
- return undefined;
83
- };
84
- case PacketType_1.PacketType.BOOLEANS:
85
- {
86
- const min = Math.ceil(dataMin * CompressionUtil_1.ONE_EIGHT);
87
- const cap = Math.ceil(dataCap * CompressionUtil_1.ONE_EIGHT);
88
- return (data) => data.length >= min && data.length <= cap;
89
- }
90
- ;
91
- case PacketType_1.PacketType.STRINGS_ASCII: return (data) => {
92
- let index = 0;
93
- const [offCount, stringCount] = (0, CompressionUtil_1.readVarInt)(data, index);
94
- index = offCount;
95
- if (stringCount < dataMin || stringCount > dataCap)
96
- return false;
97
- const lengths = [];
98
- let totalLength = 0;
99
- for (let i = 0; i < stringCount; i++) {
100
- const [offLen, strLen] = (0, CompressionUtil_1.readVarInt)(data, index);
101
- index = offLen;
102
- lengths.push(strLen);
103
- totalLength += strLen;
104
- }
105
- if (index + Math.ceil(totalLength / 8) > data.length)
106
- return false;
107
- return [stringCount, lengths, index];
108
- };
109
- case PacketType_1.PacketType.STRINGS_UTF16: return (data) => {
110
- let sectors = 0, index = 0, computed = [];
111
- while (index < data.length) {
112
- sectors++;
113
- if (sectors > dataCap)
114
- return false;
115
- const [off, strLength] = (0, CompressionUtil_1.readVarInt)(data, index);
116
- index = off;
117
- let string = [];
118
- for (let i = 0; i < strLength; i++) {
119
- const [newOff, char] = (0, CompressionUtil_1.readVarInt)(data, index);
120
- index = newOff;
121
- if (index > data.length)
122
- return false;
123
- string.push(char);
124
- }
125
- computed.push(string);
126
- }
127
- if (sectors < dataMin)
128
- return false;
129
- return computed;
130
- };
131
- case PacketType_1.PacketType.JSON: return (data) => {
132
- try {
133
- return (0, JSONUtil_1.decompressJSON)(data);
134
- }
135
- catch {
136
- return false;
137
- }
138
- };
139
- default: throw new Error("Unknown type: " + type);
140
- }
141
- }
142
- const fn = genFunc();
143
- return gzipCompression && packet.dataBatching == 0
144
- ? async (data, index) => {
145
- try {
146
- const dec = await (0, CompressionUtil_1.decompressGzip)(data);
147
- return [dec, fn(dec, index)];
148
- }
149
- catch {
150
- return [data, false];
151
- }
152
- }
153
- : async (data, index) => {
154
- return [data, fn(data, index)];
155
- };
156
- }
157
- function createReceiveProcessor(type, enumData, cap) {
158
- switch (type) {
159
- case PacketType_1.PacketType.NONE: return () => undefined;
160
- case PacketType_1.PacketType.RAW: return (data) => data;
161
- case PacketType_1.PacketType.BYTES: return (data) => Array.from(data).map(CompressionUtil_1.demapZigZag);
162
- case PacketType_1.PacketType.UBYTES: return (data) => Array.from(data);
163
- case PacketType_1.PacketType.HEX: return (data) => (0, CompressionUtil_1.bytesToHex)(data);
164
- case PacketType_1.PacketType.SHORTS: return (data) => (0, BufferUtil_2.splitBuffer)(data, 2).map(v => (0, CompressionUtil_1.demapShort_ZZ)(v));
165
- case PacketType_1.PacketType.USHORTS: return (data) => (0, BufferUtil_2.splitBuffer)(data, 2).map(v => (0, CompressionUtil_1.fromShort)(v));
166
- case PacketType_1.PacketType.VARINT: return (_, computed) => computed.map(CompressionUtil_1.demapZigZag);
167
- case PacketType_1.PacketType.UVARINT: return (_, computed) => computed;
168
- case PacketType_1.PacketType.DELTAS: return (_, computed) => computed.map((x, i) => computed[i] = (computed[i - 1] || 0) + (0, CompressionUtil_1.demapZigZag)(x));
169
- case PacketType_1.PacketType.FLOATS: return (data) => (0, BufferUtil_2.splitBuffer)(data, 4).map(CompressionUtil_1.deconvertFloat);
170
- case PacketType_1.PacketType.DOUBLES: return (data) => (0, BufferUtil_2.splitBuffer)(data, 8).map(CompressionUtil_1.deconvertDouble);
171
- case PacketType_1.PacketType.BOOLEANS: return (data) => Array.from(data).map(d => (0, CompressionUtil_1.decompressBools)(d)).flat().splice(0, cap);
172
- case PacketType_1.PacketType.ENUMS: return (data, _, index) => {
173
- const pkg = enumData[index];
174
- return Array.from(data).map(code => pkg.values[code]);
175
- };
176
- case PacketType_1.PacketType.STRINGS_ASCII: return (data, validationResult) => {
177
- const [stringCount, lengths, dataStart] = validationResult;
178
- const bitString = (0, CompressionUtil_1.bytesToBits)(data.subarray(dataStart));
179
- const decoded = (0, StringUtil_1.decodeHuffman)(bitString);
180
- if (!decoded)
181
- return [];
182
- const strings = [];
183
- let offset = 0;
184
- for (let i = 0; i < stringCount; i++) {
185
- strings.push(decoded.slice(offset, offset + lengths[i]));
186
- offset += lengths[i];
187
- }
188
- return strings;
189
- };
190
- case PacketType_1.PacketType.STRINGS_UTF16: return (_, computed) => {
191
- return computed.map(codes => String.fromCodePoint(...codes));
192
- };
193
- case PacketType_1.PacketType.JSON: return (_, computed) => computed;
194
- default: throw new Error("Unknown type: " + type);
195
- }
196
- }
197
-
198
- function createSendProcessor(type, gzipCompression, batchedData) {
199
- function genFunc() {
200
- switch (type) {
201
- case PacketType_1.PacketType.NONE: return () => [];
202
- case PacketType_1.PacketType.RAW: return (data) => Array.from(data);
203
- case PacketType_1.PacketType.ENUMS: return (enums) => enums;
204
- case PacketType_1.PacketType.BYTES: return (numbers) => numbers.map(CompressionUtil_1.mapZigZag);
205
- case PacketType_1.PacketType.UBYTES: return (numbers) => numbers.map(CompressionUtil_1.toByte);
206
- case PacketType_1.PacketType.HEX: return (hex) => {
207
- if (typeof hex != "string") {
208
- if (hex instanceof Array && hex.length == 1)
209
- return (0, CompressionUtil_1.hexToBytes)(hex[0]);
210
- throw new Error("Cannot send more than 1 hex string; this packet is equivalent to UBYTES: " + JSON.stringify(hex));
211
- }
212
- return (0, CompressionUtil_1.hexToBytes)(hex);
213
- };
214
- case PacketType_1.PacketType.SHORTS: return (numbers) => numbers.map(CompressionUtil_1.mapShort_ZZ).flat();
215
- case PacketType_1.PacketType.USHORTS: return (numbers) => numbers.map(CompressionUtil_1.toShort).flat();
216
- case PacketType_1.PacketType.VARINT: return (numbers) => numbers.map(n => (0, CompressionUtil_1.convertVarInt)((0, CompressionUtil_1.mapZigZag)(n))).flat();
217
- case PacketType_1.PacketType.UVARINT: return (numbers) => numbers.map(CompressionUtil_1.convertVarInt).flat();
218
- case PacketType_1.PacketType.DELTAS: return (numbers) => numbers.map((n, i) => (0, CompressionUtil_1.convertVarInt)((0, CompressionUtil_1.mapZigZag)(n - (numbers[i - 1] || 0)))).flat();
219
- case PacketType_1.PacketType.FLOATS: return (singles) => singles.map(CompressionUtil_1.convertFloat).flat();
220
- case PacketType_1.PacketType.DOUBLES: return (doubles) => doubles.map(CompressionUtil_1.convertDouble).flat();
221
- case PacketType_1.PacketType.BOOLEANS: return (bools) => (0, BufferUtil_1.splitArray)(bools, 8).map((bools) => (0, CompressionUtil_1.compressBools)(bools)).flat();
222
- case PacketType_1.PacketType.STRINGS_ASCII: return (strings) => {
223
- return [
224
- ...(0, CompressionUtil_1.convertVarInt)(strings.length),
225
- ...strings.map(str => (0, CompressionUtil_1.convertVarInt)(str.length)).flat(),
226
- ...(0, StringUtil_1.encodeHuffman)(strings.reduce((a, b) => a + String(b), "")),
227
- ];
228
- };
229
- case PacketType_1.PacketType.STRINGS_UTF16: return (strings) => {
230
- const res = [];
231
- for (const v of strings) {
232
- const string = String(v);
233
- const charCodes = (0, StringUtil_1.processCharCodes)(string);
234
-
235
- const length = charCodes.length;
236
- res.push(...(0, CompressionUtil_1.convertVarInt)(length));
237
- res.push(...charCodes.map(CompressionUtil_1.convertVarInt).flat());
238
- }
239
- return res;
240
- };
241
- case PacketType_1.PacketType.JSON: return (value) => Array.from((0, JSONUtil_1.compressJSON)(value));
242
- default: throw new Error("Unknown type: " + type);
243
- }
244
- }
245
- const fn = genFunc();
246
- if (!gzipCompression || batchedData) {
247
- return async (_, data) => {
248
- return new Uint8Array(fn(data));
249
- };
250
- }
251
- return async (ident, data) => {
252
- return (0, CompressionUtil_1.compressGzip)(new Uint8Array(fn(data)), ident);
253
- };
254
- }
255
- function createObjSendProcessor(packet) {
256
- const size = packet.type.length;
257
-
258
- const processors = packet.type.map(t => createSendProcessor(t, false, false));
259
- return async (ident, data) => {
260
- let result = [];
261
- for (let i = 0; i < size; i++) {
262
- const sectorData = data[i];
263
- const d = await processors[i](ident, Array.isArray(sectorData) ? sectorData : [sectorData]);
264
- if (d.length > CompressionUtil_1.MAX_UVARINT)
265
- throw new Error(`Cannot send ${d.length}/${CompressionUtil_1.MAX_UVARINT} bytes of data!`);
266
- result.push(...(0, CompressionUtil_1.convertVarInt)(d.length));
267
- d.forEach(val => result.push(val));
268
- }
269
- return new Uint8Array(result);
270
- };
271
- }
272
- function createObjReceiveProcessor(packet) {
273
- const processors = packet.type.map((t, i) => createReceiveProcessor(t, packet.enumData, packet.dataMax[i]));
274
- return (data, validationResult) => {
275
- let index = 0, enums = 0, result = [];
276
- while (index < data.length) {
277
-
278
- const [off, sectorLength] = (0, CompressionUtil_1.readVarInt)(data, index);
279
- index = off;
280
- const sector = data.subarray(index, index += sectorLength);
281
-
282
-
283
- result.push(processors[result.length](sector, validationResult[result.length], packet.type[result.length] == PacketType_1.PacketType.ENUMS ? enums++ : 0));
284
- }
285
- return result;
286
- };
287
- }
288
- function createObjValidator(packet) {
289
- const validators = packet.type.map((t, i) => createValidator(t, packet.dataMax[i], packet.dataMin[i], packet, false));
290
- return async (data) => {
291
- let index = 0, enums = 0, computedData = [];
292
- while (index < data.length) {
293
- if (computedData.length > packet.type.length)
294
- return [data, false];
295
- const [off, sectorLength] = (0, CompressionUtil_1.readVarInt)(data, index);
296
- index = off;
297
- if (sectorLength + index > data.length)
298
- return [data, false];
299
- const sector = data.subarray(index, index += sectorLength);
300
- const [, result] = await validators[computedData.length](sector, packet.type[computedData.length] == PacketType_1.PacketType.ENUMS ? enums++ : 0);
301
- if (result === false)
302
- return [data, false];
303
- computedData.push(result);
304
- }
305
- return [data, computedData];
306
- };
307
- }
6
+ Object.defineProperty(exports,"__esModule",{value:!0}),exports.createValidator=p,exports.createReceiveProcessor=l,exports.createSendProcessor=T,exports.createObjSendProcessor=function(e){const r=e.type.length,a=e.type.map(e=>T(e,!1,!1));return async(e,n)=>{let c=[];for(let s=0;s<r;s++){const r=n[s],o=await a[s](e,Array.isArray(r)?r:[r]);if(o.length>t.MAX_UVARINT)throw new Error(`Cannot send ${o.length}/${t.MAX_UVARINT} bytes of data!`);c.push(...(0,t.convertVarInt)(o.length)),o.forEach(e=>c.push(e))}return new Uint8Array(c)}},exports.createObjReceiveProcessor=function(e){const a=e.type.map((t,r)=>l(t,e.enumData,e.dataMax[r]));return(n,c)=>{let s=0,o=0,u=[];for(;s<n.length;){const[p,l]=(0,t.readVarInt)(n,s);s=p;const T=n.subarray(s,s+=l);u.push(a[u.length](T,c[u.length],e.type[u.length]==r.PacketType.ENUMS?o++:0))}return u}},exports.createObjValidator=function(e){const a=e.type.map((t,r)=>p(t,e.dataMax[r],e.dataMin[r],e,!1));return async n=>{let c=0,s=0,o=[];for(;c<n.length;){if(o.length>e.type.length)return[n,!1];const[u,p]=(0,t.readVarInt)(n,c);if(c=u,p+c>n.length)return[n,!1];const l=n.subarray(c,c+=p),[,T]=await a[o.length](l,e.type[o.length]==r.PacketType.ENUMS?s++:0);if(!1===T)return[n,!1];o.push(T)}return[n,o]}};const e=require("../util/BufferUtil"),t=require("../util/packets/CompressionUtil"),r=require("./PacketType"),a=require("../util/BufferUtil"),n=require("../util/StringUtil"),c=require("../util/packets/JSONUtil");function s(e,t){return r=>r.length>=t&&r.length<=e}function o(e,t){return t*=2,e*=2,r=>r.length>=t&&r.length<=e&&r.length%2==0}function u(e,r){return a=>{if(0==a.length)return r<=0&&[];let n=0,c=0,s=[];for(;c<a.length;){const[r,o]=(0,t.readVarInt)(a,c);if(c=r,s.push(o),++n>e)return!1}return!(n<r)&&s}}function p(e,a,n,p,l){const T=function(){switch(e){case r.PacketType.NONE:return e=>0==e.length;case r.PacketType.RAW:return()=>{};case r.PacketType.ENUMS:return(e,t)=>{if(e.length<n||e.length>a||t>=p.enumData.length)return!1;const r=p.enumData[t];for(let t=0;t<e.length;t++)if(r.values.length<=e[t])return!1};case r.PacketType.BYTES:case r.PacketType.UBYTES:case r.PacketType.HEX:return s(a,n);case r.PacketType.SHORTS:case r.PacketType.USHORTS:return o(a,n);case r.PacketType.VARINT:case r.PacketType.UVARINT:case r.PacketType.DELTAS:return u(a,n);case r.PacketType.FLOATS:return e=>{if(e.length%4!=0)return!1;const r=e.length*t.ONE_FOURTH;return!(r>a||r<n)&&void 0};case r.PacketType.DOUBLES:return e=>{if(e.length%8!=0)return!1;const r=e.length*t.ONE_EIGHT;return!(r>a||r<n)&&void 0};case r.PacketType.BOOLEANS:{const e=Math.ceil(n*t.ONE_EIGHT),r=Math.ceil(a*t.ONE_EIGHT);return t=>t.length>=e&&t.length<=r}case r.PacketType.STRINGS_ASCII:return e=>{let r=0;const[c,s]=(0,t.readVarInt)(e,r);if(r=c,s<n||s>a)return!1;const o=[];let u=0;for(let a=0;a<s;a++){const[a,n]=(0,t.readVarInt)(e,r);r=a,o.push(n),u+=n}return!(r+Math.ceil(u/8)>e.length)&&[s,o,r]};case r.PacketType.STRINGS_UTF16:return e=>{let r=0,c=0,s=[];for(;c<e.length;){if(r++,r>a)return!1;const[n,o]=(0,t.readVarInt)(e,c);c=n;let u=[];for(let r=0;r<o;r++){const[r,a]=(0,t.readVarInt)(e,c);if(c=r,c>e.length)return!1;u.push(a)}s.push(u)}return!(r<n)&&s};case r.PacketType.JSON:return e=>{try{return(0,c.decompressJSON)(e)}catch{return!1}};default:throw new Error("Unknown type: "+e)}}();return l&&0==p.dataBatching?async(e,r)=>{try{const a=await(0,t.decompressGzip)(e);return[a,T(a,r)]}catch{return[e,!1]}}:async(e,t)=>[e,T(e,t)]}function l(e,c,s){switch(e){case r.PacketType.NONE:return()=>{};case r.PacketType.RAW:return e=>e;case r.PacketType.BYTES:return e=>Array.from(e).map(t.demapZigZag);case r.PacketType.UBYTES:return e=>Array.from(e);case r.PacketType.HEX:return e=>(0,t.bytesToHex)(e);case r.PacketType.SHORTS:return e=>(0,a.splitBuffer)(e,2).map(e=>(0,t.demapShort_ZZ)(e));case r.PacketType.USHORTS:return e=>(0,a.splitBuffer)(e,2).map(e=>(0,t.fromShort)(e));case r.PacketType.VARINT:return(e,r)=>r.map(t.demapZigZag);case r.PacketType.UVARINT:return(e,t)=>t;case r.PacketType.DELTAS:return(e,r)=>r.map((e,a)=>r[a]=(r[a-1]||0)+(0,t.demapZigZag)(e));case r.PacketType.FLOATS:return e=>(0,a.splitBuffer)(e,4).map(t.deconvertFloat);case r.PacketType.DOUBLES:return e=>(0,a.splitBuffer)(e,8).map(t.deconvertDouble);case r.PacketType.BOOLEANS:return e=>Array.from(e).map(e=>(0,t.decompressBools)(e)).flat().splice(0,s);case r.PacketType.ENUMS:return(e,t,r)=>{const a=c[r];return Array.from(e).map(e=>a.values[e])};case r.PacketType.STRINGS_ASCII:return(e,r)=>{const[a,c,s]=r,o=(0,t.bytesToBits)(e.subarray(s)),u=(0,n.decodeHuffman)(o);if(!u)return[];const p=[];let l=0;for(let e=0;e<a;e++)p.push(u.slice(l,l+c[e])),l+=c[e];return p};case r.PacketType.STRINGS_UTF16:return(e,t)=>t.map(e=>String.fromCodePoint(...e));case r.PacketType.JSON:return(e,t)=>t;default:throw new Error("Unknown type: "+e)}}function T(a,s,o){const u=function(){switch(a){case r.PacketType.NONE:return()=>[];case r.PacketType.RAW:return e=>Array.from(e);case r.PacketType.ENUMS:return e=>e;case r.PacketType.BYTES:return e=>e.map(t.mapZigZag);case r.PacketType.UBYTES:return e=>e.map(t.toByte);case r.PacketType.HEX:return e=>{if("string"!=typeof e){if(e instanceof Array&&1==e.length)return(0,t.hexToBytes)(e[0]);throw new Error("Cannot send more than 1 hex string; this packet is equivalent to UBYTES: "+JSON.stringify(e))}return(0,t.hexToBytes)(e)};case r.PacketType.SHORTS:return e=>e.map(t.mapShort_ZZ).flat();case r.PacketType.USHORTS:return e=>e.map(t.toShort).flat();case r.PacketType.VARINT:return e=>e.map(e=>(0,t.convertVarInt)((0,t.mapZigZag)(e))).flat();case r.PacketType.UVARINT:return e=>e.map(t.convertVarInt).flat();case r.PacketType.DELTAS:return e=>e.map((r,a)=>(0,t.convertVarInt)((0,t.mapZigZag)(r-(e[a-1]||0)))).flat();case r.PacketType.FLOATS:return e=>e.map(t.convertFloat).flat();case r.PacketType.DOUBLES:return e=>e.map(t.convertDouble).flat();case r.PacketType.BOOLEANS:return r=>(0,e.splitArray)(r,8).map(e=>(0,t.compressBools)(e)).flat();case r.PacketType.STRINGS_ASCII:return e=>[...(0,t.convertVarInt)(e.length),...e.map(e=>(0,t.convertVarInt)(e.length)).flat(),...(0,n.encodeHuffman)(e.reduce((e,t)=>e+String(t),""))];case r.PacketType.STRINGS_UTF16:return e=>{const r=[];for(const a of e){const e=String(a),c=(0,n.processCharCodes)(e),s=c.length;r.push(...(0,t.convertVarInt)(s)),r.push(...c.map(t.convertVarInt).flat())}return r};case r.PacketType.JSON:return e=>Array.from((0,c.compressJSON)(e));default:throw new Error("Unknown type: "+a)}}();return!s||o?async(e,t)=>new Uint8Array(u(t)):async(e,r)=>(0,t.compressGzip)(new Uint8Array(u(r)),e)}
@@ -2,50 +2,5 @@
2
2
  * Copyright 2026 Lily (liwybloc)
3
3
  * Licensed under the Apache License, Version 2.0.
4
4
  */
5
- "use strict";
6
5
 
7
- Object.defineProperty(exports, "__esModule", { value: true });
8
- exports.PacketType = void 0;
9
-
10
-
11
- var PacketType;
12
- (function (PacketType) {
13
-
14
- PacketType[PacketType["NONE"] = 0] = "NONE";
15
-
16
- PacketType[PacketType["RAW"] = 1] = "RAW";
17
-
18
- PacketType[PacketType["STRINGS_ASCII"] = 2] = "STRINGS_ASCII";
19
-
20
- PacketType[PacketType["STRINGS_UTF16"] = 3] = "STRINGS_UTF16";
21
-
22
- PacketType[PacketType["STRINGS"] = 2] = "STRINGS";
23
-
24
- PacketType[PacketType["ENUMS"] = 4] = "ENUMS";
25
-
26
- PacketType[PacketType["BYTES"] = 5] = "BYTES";
27
-
28
- PacketType[PacketType["UBYTES"] = 6] = "UBYTES";
29
-
30
- PacketType[PacketType["SHORTS"] = 7] = "SHORTS";
31
-
32
- PacketType[PacketType["USHORTS"] = 8] = "USHORTS";
33
-
34
- PacketType[PacketType["VARINT"] = 9] = "VARINT";
35
-
36
- PacketType[PacketType["UVARINT"] = 10] = "UVARINT";
37
-
38
- PacketType[PacketType["DELTAS"] = 11] = "DELTAS";
39
-
40
- PacketType[PacketType["FLOATS"] = 12] = "FLOATS";
41
-
42
- PacketType[PacketType["DOUBLES"] = 13] = "DOUBLES";
43
-
44
- PacketType[PacketType["BOOLEANS"] = 14] = "BOOLEANS";
45
-
46
- PacketType[PacketType["KEY_EFFECTIVE"] = 15] = "KEY_EFFECTIVE";
47
-
48
- PacketType[PacketType["JSON"] = 16] = "JSON";
49
-
50
- PacketType[PacketType["HEX"] = 17] = "HEX";
51
- })(PacketType || (exports.PacketType = PacketType = {}));
6
+ var S;Object.defineProperty(exports,"__esModule",{value:!0}),exports.PacketType=void 0,function(S){S[S.NONE=0]="NONE",S[S.RAW=1]="RAW",S[S.STRINGS_ASCII=2]="STRINGS_ASCII",S[S.STRINGS_UTF16=3]="STRINGS_UTF16",S[S.STRINGS=2]="STRINGS",S[S.ENUMS=4]="ENUMS",S[S.BYTES=5]="BYTES",S[S.UBYTES=6]="UBYTES",S[S.SHORTS=7]="SHORTS",S[S.USHORTS=8]="USHORTS",S[S.VARINT=9]="VARINT",S[S.UVARINT=10]="UVARINT",S[S.DELTAS=11]="DELTAS",S[S.FLOATS=12]="FLOATS",S[S.DOUBLES=13]="DOUBLES",S[S.BOOLEANS=14]="BOOLEANS",S[S.KEY_EFFECTIVE=15]="KEY_EFFECTIVE",S[S.JSON=16]="JSON",S[S.HEX=17]="HEX"}(S||(exports.PacketType=S={}));