mirror of
https://codeberg.org/demostf/inspector.git
synced 2026-06-03 18:14:08 +02:00
wip
This commit is contained in:
parent
57650faeac
commit
a47bd90a75
6 changed files with 518 additions and 313 deletions
|
|
@ -3,6 +3,50 @@
|
|||
<head>
|
||||
<meta charset="utf-8">
|
||||
<title>Hello wasm-pack!</title>
|
||||
<style>
|
||||
span.tick {
|
||||
display: inline-block;
|
||||
width: 50px;
|
||||
text-align: right;
|
||||
padding-right: 5px;
|
||||
}
|
||||
span.type {
|
||||
vertical-align: top;
|
||||
word-wrap: break-word;
|
||||
}
|
||||
div.details {
|
||||
display: inline-block;
|
||||
width: calc(100vw - 210px);
|
||||
height: 100vh;
|
||||
overflow: auto;
|
||||
}
|
||||
div.list {
|
||||
display: inline-block;
|
||||
}
|
||||
#root {
|
||||
display: flex;
|
||||
flex-direction: row;
|
||||
}
|
||||
table {
|
||||
table-layout: fixed;
|
||||
}
|
||||
tr {
|
||||
height: 30px;
|
||||
}
|
||||
td.type {
|
||||
vertical-align: top;
|
||||
width: 160px;
|
||||
}
|
||||
p {
|
||||
margin: 8px 0;
|
||||
}
|
||||
html, body, #root {
|
||||
padding: 0;
|
||||
margin: 0;
|
||||
height: 100%;
|
||||
width: 100%;
|
||||
}
|
||||
</style>
|
||||
</head>
|
||||
<body>
|
||||
<noscript>This page contains webassembly and javascript content, please enable javascript in your browser.</noscript>
|
||||
|
|
|
|||
346
www/package-lock.json
generated
346
www/package-lock.json
generated
|
|
@ -11,7 +11,9 @@
|
|||
"demo-inspector": "file:../pkg",
|
||||
"react": "^17.0.2",
|
||||
"react-dom": "^17.0.2",
|
||||
"react-dropzone": "^11.3.4"
|
||||
"react-dropzone": "^11.3.4",
|
||||
"react-virtualized-auto-sizer": "^1.0.5",
|
||||
"react-window": "^1.8.6"
|
||||
},
|
||||
"bin": {
|
||||
"create-wasm-app": ".bin/create-wasm-app.js"
|
||||
|
|
@ -19,19 +21,31 @@
|
|||
"devDependencies": {
|
||||
"@types/react": "^17.0.15",
|
||||
"@types/react-dom": "^17.0.9",
|
||||
"@types/react-virtualized-auto-sizer": "^1.0.1",
|
||||
"@types/react-window": "^1.8.4",
|
||||
"copy-webpack-plugin": "^9.0.1",
|
||||
"ts-loader": "^9.2.4",
|
||||
"typescript": "^4.3.5",
|
||||
"webpack": "^5.46.0",
|
||||
"webpack-cli": "^4.7.2",
|
||||
"webpack-dev-server": "^3.11.2",
|
||||
"worker-loader": "^3.0.8"
|
||||
"webpack-dev-server": "^3.11.2"
|
||||
}
|
||||
},
|
||||
"../pkg": {
|
||||
"name": "demo-inspector",
|
||||
"version": "0.1.0"
|
||||
},
|
||||
"node_modules/@babel/runtime": {
|
||||
"version": "7.14.8",
|
||||
"resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.14.8.tgz",
|
||||
"integrity": "sha512-twj3L8Og5SaCRCErB4x4ajbvBIVV77CGeFglHpeg5WC5FF8TZzBWXtTJ4MqaD9QszLYTtr+IsaAL2rEUevb+eg==",
|
||||
"dependencies": {
|
||||
"regenerator-runtime": "^0.13.4"
|
||||
},
|
||||
"engines": {
|
||||
"node": ">=6.9.0"
|
||||
}
|
||||
},
|
||||
"node_modules/@discoveryjs/json-ext": {
|
||||
"version": "0.5.3",
|
||||
"resolved": "https://registry.npmjs.org/@discoveryjs/json-ext/-/json-ext-0.5.3.tgz",
|
||||
|
|
@ -163,6 +177,24 @@
|
|||
"@types/react": "*"
|
||||
}
|
||||
},
|
||||
"node_modules/@types/react-virtualized-auto-sizer": {
|
||||
"version": "1.0.1",
|
||||
"resolved": "https://registry.npmjs.org/@types/react-virtualized-auto-sizer/-/react-virtualized-auto-sizer-1.0.1.tgz",
|
||||
"integrity": "sha512-GH8sAnBEM5GV9LTeiz56r4ZhMOUSrP43tAQNSRVxNexDjcNKLCEtnxusAItg1owFUFE6k0NslV26gqVClVvong==",
|
||||
"dev": true,
|
||||
"dependencies": {
|
||||
"@types/react": "*"
|
||||
}
|
||||
},
|
||||
"node_modules/@types/react-window": {
|
||||
"version": "1.8.4",
|
||||
"resolved": "https://registry.npmjs.org/@types/react-window/-/react-window-1.8.4.tgz",
|
||||
"integrity": "sha512-rFJ0h1nYffFBNi6N80CFORAQNNr+440RtGCAmKyn81U99pXRoxS2goi/fkYnUJtk+LcvWCp8cmP16M8loJJsjw==",
|
||||
"dev": true,
|
||||
"dependencies": {
|
||||
"@types/react": "*"
|
||||
}
|
||||
},
|
||||
"node_modules/@types/scheduler": {
|
||||
"version": "0.16.2",
|
||||
"resolved": "https://registry.npmjs.org/@types/scheduler/-/scheduler-0.16.2.tgz",
|
||||
|
|
@ -664,15 +696,6 @@
|
|||
"integrity": "sha1-3DQxT05nkxgJP8dgJyUl+UvyXBY=",
|
||||
"dev": true
|
||||
},
|
||||
"node_modules/big.js": {
|
||||
"version": "5.2.2",
|
||||
"resolved": "https://registry.npmjs.org/big.js/-/big.js-5.2.2.tgz",
|
||||
"integrity": "sha512-vyL2OymJxmarO8gxMr0mhChsO9QGwhynfuu4+MHTAW6czfq9humCB7rKpUjDd9YUiDPU4mzpyupFSvOClAwbmQ==",
|
||||
"dev": true,
|
||||
"engines": {
|
||||
"node": "*"
|
||||
}
|
||||
},
|
||||
"node_modules/binary-extensions": {
|
||||
"version": "1.11.0",
|
||||
"resolved": "https://registry.npmjs.org/binary-extensions/-/binary-extensions-1.11.0.tgz",
|
||||
|
|
@ -1517,15 +1540,6 @@
|
|||
"integrity": "sha512-CwBLREIQ7LvYFB0WyRvwhq5N5qPhc6PMjD6bYggFlI5YyDgl+0vxq5VHbMOFqLg7hfWzmu8T5Z1QofhmTIhItA==",
|
||||
"dev": true
|
||||
},
|
||||
"node_modules/emojis-list": {
|
||||
"version": "3.0.0",
|
||||
"resolved": "https://registry.npmjs.org/emojis-list/-/emojis-list-3.0.0.tgz",
|
||||
"integrity": "sha512-/kyM18EfinwXZbno9FyUGeFh87KC8HRQBQGildHZbEuRyWFOmv1U10o9BBp8XVZDVNNuQKyIGIu5ZYAAXJ0V2Q==",
|
||||
"dev": true,
|
||||
"engines": {
|
||||
"node": ">= 4"
|
||||
}
|
||||
},
|
||||
"node_modules/encodeurl": {
|
||||
"version": "1.0.2",
|
||||
"resolved": "https://registry.npmjs.org/encodeurl/-/encodeurl-1.0.2.tgz",
|
||||
|
|
@ -3262,43 +3276,6 @@
|
|||
"node": ">=6"
|
||||
}
|
||||
},
|
||||
"node_modules/import-local/node_modules/find-up": {
|
||||
"version": "3.0.0",
|
||||
"resolved": "https://registry.npmjs.org/find-up/-/find-up-3.0.0.tgz",
|
||||
"integrity": "sha512-1yD6RmLI1XBfxugvORwlck6f75tYL+iR0jqwsOrOxMZyGYqUuDhJ0l4AXdO1iX/FTs9cBAMEk1gWSEx1kSbylg==",
|
||||
"dev": true,
|
||||
"dependencies": {
|
||||
"locate-path": "^3.0.0"
|
||||
},
|
||||
"engines": {
|
||||
"node": ">=6"
|
||||
}
|
||||
},
|
||||
"node_modules/import-local/node_modules/locate-path": {
|
||||
"version": "3.0.0",
|
||||
"resolved": "https://registry.npmjs.org/locate-path/-/locate-path-3.0.0.tgz",
|
||||
"integrity": "sha512-7AO748wWnIhNqAuaty2ZWHkQHRSNfPVIsPIfwEOWO22AmaoVrWavlOcMR5nzTLNYvp36X220/maaRsrec1G65A==",
|
||||
"dev": true,
|
||||
"dependencies": {
|
||||
"p-locate": "^3.0.0",
|
||||
"path-exists": "^3.0.0"
|
||||
},
|
||||
"engines": {
|
||||
"node": ">=6"
|
||||
}
|
||||
},
|
||||
"node_modules/import-local/node_modules/p-locate": {
|
||||
"version": "3.0.0",
|
||||
"resolved": "https://registry.npmjs.org/p-locate/-/p-locate-3.0.0.tgz",
|
||||
"integrity": "sha512-x+12w/To+4GFfgJhBEpiDcLozRJGegY+Ei7/z0tSLkMmxGZNybVMSfWj9aJn8Z5Fc7dBUNJOOVgPv2H7IwulSQ==",
|
||||
"dev": true,
|
||||
"dependencies": {
|
||||
"p-limit": "^2.0.0"
|
||||
},
|
||||
"engines": {
|
||||
"node": ">=6"
|
||||
}
|
||||
},
|
||||
"node_modules/import-local/node_modules/pkg-dir": {
|
||||
"version": "3.0.0",
|
||||
"resolved": "https://registry.npmjs.org/pkg-dir/-/pkg-dir-3.0.0.tgz",
|
||||
|
|
@ -3751,27 +3728,6 @@
|
|||
"integrity": "sha512-c7/8mbUsKigAbLkD5B010BK4D9LZm7A1pNItkEwiUZRpIN66exu/e7YQWysGun+TRKaJp8MhemM+VkfWv42aCA==",
|
||||
"dev": true
|
||||
},
|
||||
"node_modules/json5": {
|
||||
"version": "2.2.0",
|
||||
"resolved": "https://registry.npmjs.org/json5/-/json5-2.2.0.tgz",
|
||||
"integrity": "sha512-f+8cldu7X/y7RAJurMEJmdoKXGB/X550w2Nr3tTbezL6RwEE/iMcm+tZnXeoZtKuOq6ft8+CqzEkrIgx1fPoQA==",
|
||||
"dev": true,
|
||||
"dependencies": {
|
||||
"minimist": "^1.2.5"
|
||||
},
|
||||
"bin": {
|
||||
"json5": "lib/cli.js"
|
||||
},
|
||||
"engines": {
|
||||
"node": ">=6"
|
||||
}
|
||||
},
|
||||
"node_modules/json5/node_modules/minimist": {
|
||||
"version": "1.2.5",
|
||||
"resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.5.tgz",
|
||||
"integrity": "sha512-FM9nNUYrRBAELZQT3xeZQ7fmMOBg6nWNmJKTcgsJeaLstP/UODVpGsr5OhXhhXg6f+qtJ8uiZ+PUxkDWcgIXLw==",
|
||||
"dev": true
|
||||
},
|
||||
"node_modules/killable": {
|
||||
"version": "1.0.1",
|
||||
"resolved": "https://registry.npmjs.org/killable/-/killable-1.0.1.tgz",
|
||||
|
|
@ -3796,20 +3752,6 @@
|
|||
"node": ">=6.11.5"
|
||||
}
|
||||
},
|
||||
"node_modules/loader-utils": {
|
||||
"version": "2.0.0",
|
||||
"resolved": "https://registry.npmjs.org/loader-utils/-/loader-utils-2.0.0.tgz",
|
||||
"integrity": "sha512-rP4F0h2RaWSvPEkD7BLDFQnvSf+nK+wr3ESUjNTyAGobqrijmW92zc+SO6d4p4B1wh7+B/Jg1mkQe5NYUEHtHQ==",
|
||||
"dev": true,
|
||||
"dependencies": {
|
||||
"big.js": "^5.2.2",
|
||||
"emojis-list": "^3.0.0",
|
||||
"json5": "^2.1.2"
|
||||
},
|
||||
"engines": {
|
||||
"node": ">=8.9.0"
|
||||
}
|
||||
},
|
||||
"node_modules/locate-path": {
|
||||
"version": "3.0.0",
|
||||
"resolved": "https://registry.npmjs.org/locate-path/-/locate-path-3.0.0.tgz",
|
||||
|
|
@ -3879,6 +3821,11 @@
|
|||
"node": ">= 0.6"
|
||||
}
|
||||
},
|
||||
"node_modules/memoize-one": {
|
||||
"version": "5.2.1",
|
||||
"resolved": "https://registry.npmjs.org/memoize-one/-/memoize-one-5.2.1.tgz",
|
||||
"integrity": "sha512-zYiwtZUcYyXKo/np96AGZAckk+FWWsUdJ3cHGGmld7+AhvcWmQyGCYUh1hc4Q/pkOhb65dQR/pqCyK0cOaHz4Q=="
|
||||
},
|
||||
"node_modules/memory-fs": {
|
||||
"version": "0.4.1",
|
||||
"resolved": "https://registry.npmjs.org/memory-fs/-/memory-fs-0.4.1.tgz",
|
||||
|
|
@ -4787,6 +4734,34 @@
|
|||
"resolved": "https://registry.npmjs.org/react-is/-/react-is-16.13.1.tgz",
|
||||
"integrity": "sha512-24e6ynE2H+OKt4kqsOvNd8kBpV65zoxbA4BVsEOB3ARVWQki/DHzaUoC5KuON/BiccDaCCTZBuOcfZs70kR8bQ=="
|
||||
},
|
||||
"node_modules/react-virtualized-auto-sizer": {
|
||||
"version": "1.0.5",
|
||||
"resolved": "https://registry.npmjs.org/react-virtualized-auto-sizer/-/react-virtualized-auto-sizer-1.0.5.tgz",
|
||||
"integrity": "sha512-kivjYVWX15TX2IUrm8F1jaCEX8EXrpy3DD+u41WGqJ1ZqbljWpiwscV+VxOM1l7sSIM1jwi2LADjhhAJkJ9dxA==",
|
||||
"engines": {
|
||||
"node": ">8.0.0"
|
||||
},
|
||||
"peerDependencies": {
|
||||
"react": "^15.3.0 || ^16.0.0-alpha || ^17.0.0",
|
||||
"react-dom": "^15.3.0 || ^16.0.0-alpha || ^17.0.0"
|
||||
}
|
||||
},
|
||||
"node_modules/react-window": {
|
||||
"version": "1.8.6",
|
||||
"resolved": "https://registry.npmjs.org/react-window/-/react-window-1.8.6.tgz",
|
||||
"integrity": "sha512-8VwEEYyjz6DCnGBsd+MgkD0KJ2/OXFULyDtorIiTz+QzwoP94tBoA7CnbtyXMm+cCeAUER5KJcPtWl9cpKbOBg==",
|
||||
"dependencies": {
|
||||
"@babel/runtime": "^7.0.0",
|
||||
"memoize-one": ">=3.1.1 <6"
|
||||
},
|
||||
"engines": {
|
||||
"node": ">8.0.0"
|
||||
},
|
||||
"peerDependencies": {
|
||||
"react": "^15.0.0 || ^16.0.0 || ^17.0.0",
|
||||
"react-dom": "^15.0.0 || ^16.0.0 || ^17.0.0"
|
||||
}
|
||||
},
|
||||
"node_modules/readable-stream": {
|
||||
"version": "2.3.6",
|
||||
"resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.6.tgz",
|
||||
|
|
@ -4828,6 +4803,11 @@
|
|||
"node": ">= 0.10"
|
||||
}
|
||||
},
|
||||
"node_modules/regenerator-runtime": {
|
||||
"version": "0.13.9",
|
||||
"resolved": "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.13.9.tgz",
|
||||
"integrity": "sha512-p3VT+cOEgxFsRRA9X4lkI1E+k2/CtnKtU4gcxyaCUreilL/vqI6CdZ3wxVUx3UOUg+gnUOQQcRI7BmSI656MYA=="
|
||||
},
|
||||
"node_modules/regex-not": {
|
||||
"version": "1.0.2",
|
||||
"resolved": "https://registry.npmjs.org/regex-not/-/regex-not-1.0.2.tgz",
|
||||
|
|
@ -6755,44 +6735,6 @@
|
|||
"integrity": "sha512-JcKqAHLPxcdb9KM49dufGXn2x3ssnfjbcaQdLlfZsL9rH9wgDQjUtDxbo8NE0F6SFvydeu1VhZe7hZuHsB2/pw==",
|
||||
"dev": true
|
||||
},
|
||||
"node_modules/worker-loader": {
|
||||
"version": "3.0.8",
|
||||
"resolved": "https://registry.npmjs.org/worker-loader/-/worker-loader-3.0.8.tgz",
|
||||
"integrity": "sha512-XQyQkIFeRVC7f7uRhFdNMe/iJOdO6zxAaR3EWbDp45v3mDhrTi+++oswKNxShUNjPC/1xUp5DB29YKLhFo129g==",
|
||||
"dev": true,
|
||||
"dependencies": {
|
||||
"loader-utils": "^2.0.0",
|
||||
"schema-utils": "^3.0.0"
|
||||
},
|
||||
"engines": {
|
||||
"node": ">= 10.13.0"
|
||||
},
|
||||
"funding": {
|
||||
"type": "opencollective",
|
||||
"url": "https://opencollective.com/webpack"
|
||||
},
|
||||
"peerDependencies": {
|
||||
"webpack": "^4.0.0 || ^5.0.0"
|
||||
}
|
||||
},
|
||||
"node_modules/worker-loader/node_modules/schema-utils": {
|
||||
"version": "3.1.1",
|
||||
"resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-3.1.1.tgz",
|
||||
"integrity": "sha512-Y5PQxS4ITlC+EahLuXaY86TXfR7Dc5lw294alXOq86JAHCihAIZfqv8nNCWvaEJvaC51uN9hbLGeV0cFBdH+Fw==",
|
||||
"dev": true,
|
||||
"dependencies": {
|
||||
"@types/json-schema": "^7.0.8",
|
||||
"ajv": "^6.12.5",
|
||||
"ajv-keywords": "^3.5.2"
|
||||
},
|
||||
"engines": {
|
||||
"node": ">= 10.13.0"
|
||||
},
|
||||
"funding": {
|
||||
"type": "opencollective",
|
||||
"url": "https://opencollective.com/webpack"
|
||||
}
|
||||
},
|
||||
"node_modules/wrap-ansi": {
|
||||
"version": "5.1.0",
|
||||
"resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-5.1.0.tgz",
|
||||
|
|
@ -6891,6 +6833,14 @@
|
|||
}
|
||||
},
|
||||
"dependencies": {
|
||||
"@babel/runtime": {
|
||||
"version": "7.14.8",
|
||||
"resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.14.8.tgz",
|
||||
"integrity": "sha512-twj3L8Og5SaCRCErB4x4ajbvBIVV77CGeFglHpeg5WC5FF8TZzBWXtTJ4MqaD9QszLYTtr+IsaAL2rEUevb+eg==",
|
||||
"requires": {
|
||||
"regenerator-runtime": "^0.13.4"
|
||||
}
|
||||
},
|
||||
"@discoveryjs/json-ext": {
|
||||
"version": "0.5.3",
|
||||
"resolved": "https://registry.npmjs.org/@discoveryjs/json-ext/-/json-ext-0.5.3.tgz",
|
||||
|
|
@ -7010,6 +6960,24 @@
|
|||
"@types/react": "*"
|
||||
}
|
||||
},
|
||||
"@types/react-virtualized-auto-sizer": {
|
||||
"version": "1.0.1",
|
||||
"resolved": "https://registry.npmjs.org/@types/react-virtualized-auto-sizer/-/react-virtualized-auto-sizer-1.0.1.tgz",
|
||||
"integrity": "sha512-GH8sAnBEM5GV9LTeiz56r4ZhMOUSrP43tAQNSRVxNexDjcNKLCEtnxusAItg1owFUFE6k0NslV26gqVClVvong==",
|
||||
"dev": true,
|
||||
"requires": {
|
||||
"@types/react": "*"
|
||||
}
|
||||
},
|
||||
"@types/react-window": {
|
||||
"version": "1.8.4",
|
||||
"resolved": "https://registry.npmjs.org/@types/react-window/-/react-window-1.8.4.tgz",
|
||||
"integrity": "sha512-rFJ0h1nYffFBNi6N80CFORAQNNr+440RtGCAmKyn81U99pXRoxS2goi/fkYnUJtk+LcvWCp8cmP16M8loJJsjw==",
|
||||
"dev": true,
|
||||
"requires": {
|
||||
"@types/react": "*"
|
||||
}
|
||||
},
|
||||
"@types/scheduler": {
|
||||
"version": "0.16.2",
|
||||
"resolved": "https://registry.npmjs.org/@types/scheduler/-/scheduler-0.16.2.tgz",
|
||||
|
|
@ -7425,12 +7393,6 @@
|
|||
"integrity": "sha1-3DQxT05nkxgJP8dgJyUl+UvyXBY=",
|
||||
"dev": true
|
||||
},
|
||||
"big.js": {
|
||||
"version": "5.2.2",
|
||||
"resolved": "https://registry.npmjs.org/big.js/-/big.js-5.2.2.tgz",
|
||||
"integrity": "sha512-vyL2OymJxmarO8gxMr0mhChsO9QGwhynfuu4+MHTAW6czfq9humCB7rKpUjDd9YUiDPU4mzpyupFSvOClAwbmQ==",
|
||||
"dev": true
|
||||
},
|
||||
"binary-extensions": {
|
||||
"version": "1.11.0",
|
||||
"resolved": "https://registry.npmjs.org/binary-extensions/-/binary-extensions-1.11.0.tgz",
|
||||
|
|
@ -8126,12 +8088,6 @@
|
|||
"integrity": "sha512-CwBLREIQ7LvYFB0WyRvwhq5N5qPhc6PMjD6bYggFlI5YyDgl+0vxq5VHbMOFqLg7hfWzmu8T5Z1QofhmTIhItA==",
|
||||
"dev": true
|
||||
},
|
||||
"emojis-list": {
|
||||
"version": "3.0.0",
|
||||
"resolved": "https://registry.npmjs.org/emojis-list/-/emojis-list-3.0.0.tgz",
|
||||
"integrity": "sha512-/kyM18EfinwXZbno9FyUGeFh87KC8HRQBQGildHZbEuRyWFOmv1U10o9BBp8XVZDVNNuQKyIGIu5ZYAAXJ0V2Q==",
|
||||
"dev": true
|
||||
},
|
||||
"encodeurl": {
|
||||
"version": "1.0.2",
|
||||
"resolved": "https://registry.npmjs.org/encodeurl/-/encodeurl-1.0.2.tgz",
|
||||
|
|
@ -9541,34 +9497,6 @@
|
|||
"resolve-cwd": "^2.0.0"
|
||||
},
|
||||
"dependencies": {
|
||||
"find-up": {
|
||||
"version": "3.0.0",
|
||||
"resolved": "https://registry.npmjs.org/find-up/-/find-up-3.0.0.tgz",
|
||||
"integrity": "sha512-1yD6RmLI1XBfxugvORwlck6f75tYL+iR0jqwsOrOxMZyGYqUuDhJ0l4AXdO1iX/FTs9cBAMEk1gWSEx1kSbylg==",
|
||||
"dev": true,
|
||||
"requires": {
|
||||
"locate-path": "^3.0.0"
|
||||
}
|
||||
},
|
||||
"locate-path": {
|
||||
"version": "3.0.0",
|
||||
"resolved": "https://registry.npmjs.org/locate-path/-/locate-path-3.0.0.tgz",
|
||||
"integrity": "sha512-7AO748wWnIhNqAuaty2ZWHkQHRSNfPVIsPIfwEOWO22AmaoVrWavlOcMR5nzTLNYvp36X220/maaRsrec1G65A==",
|
||||
"dev": true,
|
||||
"requires": {
|
||||
"p-locate": "^3.0.0",
|
||||
"path-exists": "^3.0.0"
|
||||
}
|
||||
},
|
||||
"p-locate": {
|
||||
"version": "3.0.0",
|
||||
"resolved": "https://registry.npmjs.org/p-locate/-/p-locate-3.0.0.tgz",
|
||||
"integrity": "sha512-x+12w/To+4GFfgJhBEpiDcLozRJGegY+Ei7/z0tSLkMmxGZNybVMSfWj9aJn8Z5Fc7dBUNJOOVgPv2H7IwulSQ==",
|
||||
"dev": true,
|
||||
"requires": {
|
||||
"p-limit": "^2.0.0"
|
||||
}
|
||||
},
|
||||
"pkg-dir": {
|
||||
"version": "3.0.0",
|
||||
"resolved": "https://registry.npmjs.org/pkg-dir/-/pkg-dir-3.0.0.tgz",
|
||||
|
|
@ -9922,23 +9850,6 @@
|
|||
"integrity": "sha512-c7/8mbUsKigAbLkD5B010BK4D9LZm7A1pNItkEwiUZRpIN66exu/e7YQWysGun+TRKaJp8MhemM+VkfWv42aCA==",
|
||||
"dev": true
|
||||
},
|
||||
"json5": {
|
||||
"version": "2.2.0",
|
||||
"resolved": "https://registry.npmjs.org/json5/-/json5-2.2.0.tgz",
|
||||
"integrity": "sha512-f+8cldu7X/y7RAJurMEJmdoKXGB/X550w2Nr3tTbezL6RwEE/iMcm+tZnXeoZtKuOq6ft8+CqzEkrIgx1fPoQA==",
|
||||
"dev": true,
|
||||
"requires": {
|
||||
"minimist": "^1.2.5"
|
||||
},
|
||||
"dependencies": {
|
||||
"minimist": {
|
||||
"version": "1.2.5",
|
||||
"resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.5.tgz",
|
||||
"integrity": "sha512-FM9nNUYrRBAELZQT3xeZQ7fmMOBg6nWNmJKTcgsJeaLstP/UODVpGsr5OhXhhXg6f+qtJ8uiZ+PUxkDWcgIXLw==",
|
||||
"dev": true
|
||||
}
|
||||
}
|
||||
},
|
||||
"killable": {
|
||||
"version": "1.0.1",
|
||||
"resolved": "https://registry.npmjs.org/killable/-/killable-1.0.1.tgz",
|
||||
|
|
@ -9957,17 +9868,6 @@
|
|||
"integrity": "sha512-92+huvxMvYlMzMt0iIOukcwYBFpkYJdpl2xsZ7LrlayO7E8SOv+JJUEK17B/dJIHAOLMfh2dZZ/Y18WgmGtYNw==",
|
||||
"dev": true
|
||||
},
|
||||
"loader-utils": {
|
||||
"version": "2.0.0",
|
||||
"resolved": "https://registry.npmjs.org/loader-utils/-/loader-utils-2.0.0.tgz",
|
||||
"integrity": "sha512-rP4F0h2RaWSvPEkD7BLDFQnvSf+nK+wr3ESUjNTyAGobqrijmW92zc+SO6d4p4B1wh7+B/Jg1mkQe5NYUEHtHQ==",
|
||||
"dev": true,
|
||||
"requires": {
|
||||
"big.js": "^5.2.2",
|
||||
"emojis-list": "^3.0.0",
|
||||
"json5": "^2.1.2"
|
||||
}
|
||||
},
|
||||
"locate-path": {
|
||||
"version": "3.0.0",
|
||||
"resolved": "https://registry.npmjs.org/locate-path/-/locate-path-3.0.0.tgz",
|
||||
|
|
@ -10019,6 +9919,11 @@
|
|||
"integrity": "sha1-hxDXrwqmJvj/+hzgAWhUUmMlV0g=",
|
||||
"dev": true
|
||||
},
|
||||
"memoize-one": {
|
||||
"version": "5.2.1",
|
||||
"resolved": "https://registry.npmjs.org/memoize-one/-/memoize-one-5.2.1.tgz",
|
||||
"integrity": "sha512-zYiwtZUcYyXKo/np96AGZAckk+FWWsUdJ3cHGGmld7+AhvcWmQyGCYUh1hc4Q/pkOhb65dQR/pqCyK0cOaHz4Q=="
|
||||
},
|
||||
"memory-fs": {
|
||||
"version": "0.4.1",
|
||||
"resolved": "https://registry.npmjs.org/memory-fs/-/memory-fs-0.4.1.tgz",
|
||||
|
|
@ -10722,6 +10627,21 @@
|
|||
"resolved": "https://registry.npmjs.org/react-is/-/react-is-16.13.1.tgz",
|
||||
"integrity": "sha512-24e6ynE2H+OKt4kqsOvNd8kBpV65zoxbA4BVsEOB3ARVWQki/DHzaUoC5KuON/BiccDaCCTZBuOcfZs70kR8bQ=="
|
||||
},
|
||||
"react-virtualized-auto-sizer": {
|
||||
"version": "1.0.5",
|
||||
"resolved": "https://registry.npmjs.org/react-virtualized-auto-sizer/-/react-virtualized-auto-sizer-1.0.5.tgz",
|
||||
"integrity": "sha512-kivjYVWX15TX2IUrm8F1jaCEX8EXrpy3DD+u41WGqJ1ZqbljWpiwscV+VxOM1l7sSIM1jwi2LADjhhAJkJ9dxA==",
|
||||
"requires": {}
|
||||
},
|
||||
"react-window": {
|
||||
"version": "1.8.6",
|
||||
"resolved": "https://registry.npmjs.org/react-window/-/react-window-1.8.6.tgz",
|
||||
"integrity": "sha512-8VwEEYyjz6DCnGBsd+MgkD0KJ2/OXFULyDtorIiTz+QzwoP94tBoA7CnbtyXMm+cCeAUER5KJcPtWl9cpKbOBg==",
|
||||
"requires": {
|
||||
"@babel/runtime": "^7.0.0",
|
||||
"memoize-one": ">=3.1.1 <6"
|
||||
}
|
||||
},
|
||||
"readable-stream": {
|
||||
"version": "2.3.6",
|
||||
"resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.6.tgz",
|
||||
|
|
@ -10757,6 +10677,11 @@
|
|||
"resolve": "^1.9.0"
|
||||
}
|
||||
},
|
||||
"regenerator-runtime": {
|
||||
"version": "0.13.9",
|
||||
"resolved": "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.13.9.tgz",
|
||||
"integrity": "sha512-p3VT+cOEgxFsRRA9X4lkI1E+k2/CtnKtU4gcxyaCUreilL/vqI6CdZ3wxVUx3UOUg+gnUOQQcRI7BmSI656MYA=="
|
||||
},
|
||||
"regex-not": {
|
||||
"version": "1.0.2",
|
||||
"resolved": "https://registry.npmjs.org/regex-not/-/regex-not-1.0.2.tgz",
|
||||
|
|
@ -12271,29 +12196,6 @@
|
|||
"integrity": "sha512-JcKqAHLPxcdb9KM49dufGXn2x3ssnfjbcaQdLlfZsL9rH9wgDQjUtDxbo8NE0F6SFvydeu1VhZe7hZuHsB2/pw==",
|
||||
"dev": true
|
||||
},
|
||||
"worker-loader": {
|
||||
"version": "3.0.8",
|
||||
"resolved": "https://registry.npmjs.org/worker-loader/-/worker-loader-3.0.8.tgz",
|
||||
"integrity": "sha512-XQyQkIFeRVC7f7uRhFdNMe/iJOdO6zxAaR3EWbDp45v3mDhrTi+++oswKNxShUNjPC/1xUp5DB29YKLhFo129g==",
|
||||
"dev": true,
|
||||
"requires": {
|
||||
"loader-utils": "^2.0.0",
|
||||
"schema-utils": "^3.0.0"
|
||||
},
|
||||
"dependencies": {
|
||||
"schema-utils": {
|
||||
"version": "3.1.1",
|
||||
"resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-3.1.1.tgz",
|
||||
"integrity": "sha512-Y5PQxS4ITlC+EahLuXaY86TXfR7Dc5lw294alXOq86JAHCihAIZfqv8nNCWvaEJvaC51uN9hbLGeV0cFBdH+Fw==",
|
||||
"dev": true,
|
||||
"requires": {
|
||||
"@types/json-schema": "^7.0.8",
|
||||
"ajv": "^6.12.5",
|
||||
"ajv-keywords": "^3.5.2"
|
||||
}
|
||||
}
|
||||
}
|
||||
},
|
||||
"wrap-ansi": {
|
||||
"version": "5.1.0",
|
||||
"resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-5.1.0.tgz",
|
||||
|
|
|
|||
|
|
@ -14,11 +14,15 @@
|
|||
"demo-inspector": "file:../pkg",
|
||||
"react": "^17.0.2",
|
||||
"react-dom": "^17.0.2",
|
||||
"react-dropzone": "^11.3.4"
|
||||
"react-dropzone": "^11.3.4",
|
||||
"react-virtualized-auto-sizer": "^1.0.5",
|
||||
"react-window": "^1.8.6"
|
||||
},
|
||||
"devDependencies": {
|
||||
"@types/react": "^17.0.15",
|
||||
"@types/react-dom": "^17.0.9",
|
||||
"@types/react-virtualized-auto-sizer": "^1.0.1",
|
||||
"@types/react-window": "^1.8.4",
|
||||
"copy-webpack-plugin": "^9.0.1",
|
||||
"ts-loader": "^9.2.4",
|
||||
"typescript": "^4.3.5",
|
||||
|
|
|
|||
|
|
@ -3,20 +3,25 @@ import React, {useCallback, Component} from 'react'
|
|||
import {useDropzone} from 'react-dropzone'
|
||||
import ReactDOM from "react-dom";
|
||||
import {Header} from "./header";
|
||||
import {PacketDetails, PacketTable} from "./table";
|
||||
|
||||
class App extends Component<{}, {
|
||||
interface AppState {
|
||||
loading: boolean,
|
||||
header: Header | null,
|
||||
packets: Packet[]
|
||||
}> {
|
||||
state: {
|
||||
loading: boolean,
|
||||
header: Header | null,
|
||||
packets: Packet[]
|
||||
} = {
|
||||
packets: Packet[],
|
||||
prop_names: Map<number, { table: String, prop: String }>,
|
||||
class_names: Map<number, String>,
|
||||
active: Packet | null,
|
||||
}
|
||||
|
||||
class App extends Component<{}, AppState> {
|
||||
state: AppState = {
|
||||
loading: false,
|
||||
header: null,
|
||||
packets: []
|
||||
packets: [],
|
||||
prop_names: new Map(),
|
||||
class_names: new Map(),
|
||||
active: null,
|
||||
}
|
||||
|
||||
load(data: ArrayBuffer) {
|
||||
|
|
@ -33,6 +38,19 @@ class App extends Component<{}, {
|
|||
let packets = this.state.packets;
|
||||
packets.push(packet);
|
||||
this.setState({packets});
|
||||
if (packet.type == "DataTables") {
|
||||
let prop_names = this.state.prop_names;
|
||||
let class_names = this.state.class_names;
|
||||
for (let table of packet.tables) {
|
||||
for (let prop of table.props) {
|
||||
prop_names.set(prop.identifier, {table: table.name, prop: prop.name});
|
||||
}
|
||||
}
|
||||
for (let server_class of packet.server_classes) {
|
||||
class_names.set(server_class.id, server_class.name);
|
||||
}
|
||||
this.setState({class_names, prop_names});
|
||||
}
|
||||
break;
|
||||
case "done":
|
||||
this.setState({loading: false});
|
||||
|
|
@ -46,40 +64,60 @@ class App extends Component<{}, {
|
|||
render() {
|
||||
if (this.state.loading && this.state.header && this.state.packets.length) {
|
||||
return (
|
||||
<div>
|
||||
<>
|
||||
<h1>Loading</h1>
|
||||
<p>{this.state.packets.slice(-1)[0].tick}/{this.state.header.ticks}</p>
|
||||
</div>
|
||||
</>
|
||||
)
|
||||
} else if (this.state.loading) {
|
||||
return (
|
||||
<div>
|
||||
<>
|
||||
<h1>Loading</h1>
|
||||
</div>
|
||||
</>
|
||||
)
|
||||
} else if (this.state.packets.length) {
|
||||
let active = <></>;
|
||||
if (this.state.active) {
|
||||
active = <div className="details"><PacketDetails packet={this.state.active}
|
||||
prop_names={this.state.prop_names}
|
||||
class_names={this.state.class_names}/></div>
|
||||
}
|
||||
return (
|
||||
<div>
|
||||
<h1>{this.state.packets.length}</h1>
|
||||
</div>
|
||||
<>
|
||||
<PacketTable packets={this.state.packets} class_names={this.state.class_names}
|
||||
prop_names={this.state.prop_names} onClick={active => this.setState({active})}/>
|
||||
{active}
|
||||
</>
|
||||
)
|
||||
} else {
|
||||
}
|
||||
else
|
||||
{
|
||||
return (
|
||||
<div>
|
||||
<>
|
||||
<DemoDropzone onDrop={(data) => this.load(data)}/>
|
||||
</div>
|
||||
</>
|
||||
)
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
ReactDOM.render(
|
||||
<App/>,
|
||||
<App/>
|
||||
,
|
||||
document.getElementById("root")
|
||||
);
|
||||
|
||||
|
||||
function DemoDropzone({onDrop}: { onDrop: (data: ArrayBuffer) => void }) {
|
||||
function DemoDropzone(
|
||||
{
|
||||
onDrop
|
||||
}
|
||||
:
|
||||
{
|
||||
onDrop: (data: ArrayBuffer) => void
|
||||
}
|
||||
)
|
||||
{
|
||||
const onDropCb = useCallback(acceptedFiles => {
|
||||
let reader = new FileReader();
|
||||
reader.readAsArrayBuffer(acceptedFiles[0]);
|
||||
|
|
|
|||
79
www/src/parser.d.ts
vendored
79
www/src/parser.d.ts
vendored
|
|
@ -204,25 +204,51 @@ export type Message =
|
|||
}
|
||||
| (
|
||||
| {
|
||||
SayText2: SayText2Message;
|
||||
client: number;
|
||||
from?: string | null;
|
||||
kind: ChatMessageKind;
|
||||
raw: number;
|
||||
text: string;
|
||||
type: "SayText2";
|
||||
[k: string]: unknown;
|
||||
}
|
||||
| {
|
||||
Text: TextMessage;
|
||||
location: HudTextLocation;
|
||||
substitute: [string, string, string, string];
|
||||
text: string;
|
||||
type: "Text";
|
||||
[k: string]: unknown;
|
||||
}
|
||||
| {
|
||||
ResetHUD: ResetHudMessage;
|
||||
data: number;
|
||||
type: "ResetHUD";
|
||||
[k: string]: unknown;
|
||||
}
|
||||
| {
|
||||
Train: TrainMessage;
|
||||
data: number;
|
||||
type: "Train";
|
||||
[k: string]: unknown;
|
||||
}
|
||||
| {
|
||||
VoiceSubtitle: VoiceSubtitleMessage;
|
||||
client: number;
|
||||
item: number;
|
||||
menu: number;
|
||||
type: "VoiceSubtitle";
|
||||
[k: string]: unknown;
|
||||
}
|
||||
| {
|
||||
Shake: ShakeMessage;
|
||||
amplitude: number;
|
||||
command: number;
|
||||
duration: number;
|
||||
frequency: number;
|
||||
type: "Shake";
|
||||
[k: string]: unknown;
|
||||
}
|
||||
| {
|
||||
Unknown: [number, UnknownUserMessage];
|
||||
data: BitReadStream;
|
||||
raw_type: number;
|
||||
type: "Unknown";
|
||||
[k: string]: unknown;
|
||||
}
|
||||
)
|
||||
| {
|
||||
|
|
@ -3251,45 +3277,6 @@ export interface Vector {
|
|||
z: number;
|
||||
[k: string]: unknown;
|
||||
}
|
||||
export interface SayText2Message {
|
||||
client: number;
|
||||
from?: string | null;
|
||||
kind: ChatMessageKind;
|
||||
raw: number;
|
||||
text: string;
|
||||
[k: string]: unknown;
|
||||
}
|
||||
export interface TextMessage {
|
||||
location: HudTextLocation;
|
||||
substitute: [string, string, string, string];
|
||||
text: string;
|
||||
[k: string]: unknown;
|
||||
}
|
||||
export interface ResetHudMessage {
|
||||
data: number;
|
||||
[k: string]: unknown;
|
||||
}
|
||||
export interface TrainMessage {
|
||||
data: number;
|
||||
[k: string]: unknown;
|
||||
}
|
||||
export interface VoiceSubtitleMessage {
|
||||
client: number;
|
||||
item: number;
|
||||
menu: number;
|
||||
[k: string]: unknown;
|
||||
}
|
||||
export interface ShakeMessage {
|
||||
amplitude: number;
|
||||
command: number;
|
||||
duration: number;
|
||||
frequency: number;
|
||||
[k: string]: unknown;
|
||||
}
|
||||
export interface UnknownUserMessage {
|
||||
data: BitReadStream;
|
||||
[k: string]: unknown;
|
||||
}
|
||||
export interface PacketEntity {
|
||||
delay?: number | null;
|
||||
entity_index: EntityId;
|
||||
|
|
|
|||
230
www/src/table.tsx
Normal file
230
www/src/table.tsx
Normal file
|
|
@ -0,0 +1,230 @@
|
|||
import React, {CSSProperties, JSXElementConstructor, ReactElement} from 'react';
|
||||
import {GameEventDefinition, Message, Packet, PacketEntity, SendPropValue, UserCmd} from "./parser";
|
||||
import {FixedSizeList as List} from 'react-window';
|
||||
|
||||
interface TableProps {
|
||||
packets: Packet[],
|
||||
prop_names: Map<number, { table: String, prop: String }>,
|
||||
class_names: Map<number, String>,
|
||||
onClick: (packet: Packet) => void,
|
||||
}
|
||||
|
||||
export function PacketTable({packets, prop_names, class_names, onClick}: TableProps) {
|
||||
const Row: (props: { index: number, style: CSSProperties }) => any = ({index, style}) => (
|
||||
<PacketRowMemo style={style} key={index} i={index} packet={packets[index]} class_names={class_names}
|
||||
prop_names={prop_names}
|
||||
onClick={onClick}
|
||||
expanded={false}/>
|
||||
);
|
||||
|
||||
return (
|
||||
<>
|
||||
<List className="list" height={window.innerHeight} itemCount={packets.length} itemSize={30} width={210}>
|
||||
{Row}
|
||||
</List>
|
||||
</>
|
||||
)
|
||||
}
|
||||
|
||||
interface RowProps {
|
||||
style: CSSProperties,
|
||||
i: number,
|
||||
packet: Packet,
|
||||
prop_names: Map<number, { table: String, prop: String }>,
|
||||
class_names: Map<number, String>,
|
||||
expanded: boolean,
|
||||
onClick: (packet: Packet) => void,
|
||||
}
|
||||
|
||||
export function PacketRow({style, i, packet, onClick}: RowProps) {
|
||||
switch (packet.type) {
|
||||
case "Sigon":
|
||||
case "Message":
|
||||
return <div onClick={() => {
|
||||
onClick(packet)
|
||||
}} style={style} key={`packet-${i}`}>
|
||||
<span className="tick">{packet.tick}</span>
|
||||
<span className="type">{packet.type}</span>
|
||||
</div>
|
||||
case "SyncTick":
|
||||
return <div onClick={() => {
|
||||
onClick(packet)
|
||||
}} style={style} key={`packet-${i}`}>
|
||||
<span className="tick">{packet.tick}</span>
|
||||
<span className="type">{packet.type}</span>
|
||||
</div>;
|
||||
case "ConsoleCmd":
|
||||
return <div onClick={() => {
|
||||
onClick(packet)
|
||||
}} style={style} key={`packet-${i}`}>
|
||||
<span className="tick">{packet.tick}</span>
|
||||
<span className="type">{packet.type}</span>
|
||||
</div>;
|
||||
case "UserCmd":
|
||||
return <div onClick={() => {
|
||||
onClick(packet)
|
||||
}} style={style} key={`packet-${i}`}>
|
||||
<span className="tick">{packet.tick}</span>
|
||||
<span className="type">{packet.type}</span>
|
||||
</div>;
|
||||
case "DataTables":
|
||||
return <div onClick={() => {
|
||||
onClick(packet)
|
||||
}} style={style} key={`packet-${i}`}>
|
||||
<span className="tick">{packet.tick}</span>
|
||||
<span className="type">{packet.type}</span>
|
||||
</div>;
|
||||
case "Stop":
|
||||
return <div onClick={() => {
|
||||
onClick(packet)
|
||||
}} style={style} key={`packet-${i}`}>
|
||||
<span className="tick">{packet.tick}</span>
|
||||
<span className="type">{packet.type}</span>
|
||||
</div>;
|
||||
case "StringTables":
|
||||
return <div onClick={() => {
|
||||
onClick(packet)
|
||||
}} style={style} key={`packet-${i}`}>
|
||||
<span className="tick">{packet.tick}</span>
|
||||
<span className="type">{packet.type}</span>
|
||||
</div>;
|
||||
}
|
||||
}
|
||||
|
||||
interface DetailProps {
|
||||
packet: Packet,
|
||||
prop_names: Map<number, { table: String, prop: String }>,
|
||||
class_names: Map<number, String>,
|
||||
}
|
||||
|
||||
export function PacketDetails({packet, prop_names, class_names}: DetailProps) {
|
||||
switch (packet.type) {
|
||||
case "Sigon":
|
||||
case "Message":
|
||||
let rows = packet.messages.map((message, y) => <tr key={y}>
|
||||
<td className="type">{message.type}</td>
|
||||
<td>{messageInfoText(message, prop_names, class_names)}</td>
|
||||
</tr>)
|
||||
return (
|
||||
<table>
|
||||
<tbody>
|
||||
{rows}
|
||||
</tbody>
|
||||
</table>
|
||||
)
|
||||
case "SyncTick":
|
||||
return <></>
|
||||
case "ConsoleCmd":
|
||||
return <>{packet.command}</>
|
||||
case "UserCmd":
|
||||
return <>{formatUserCmd(packet.cmd)}</>
|
||||
case "DataTables":
|
||||
return <>{packet.tables.length}</>
|
||||
case "Stop":
|
||||
return <></>
|
||||
case "StringTables":
|
||||
return <>{packet.tables.length}</>
|
||||
}
|
||||
}
|
||||
|
||||
const PacketRowMemo = React.memo(PacketRow, (a, b) => a.i == b.i);
|
||||
|
||||
function messageInfoText(msg: Message, prop_names: Map<number, { table: String, prop: String }>, class_names: Map<number, String>) {
|
||||
switch (msg.type) {
|
||||
case "Print":
|
||||
return <>msg.value</>
|
||||
case "ServerInfo":
|
||||
return <>stv: {msg.stv ? 'true' : 'false'}, map: {msg.map}, player count: {msg.player_count},
|
||||
map: {msg.map}</>
|
||||
case "NetTick":
|
||||
return <>Tick {msg.tick}, frame time: {msg.frame_time}, std_dev: {msg.std_dev}</>
|
||||
case "ParseSounds":
|
||||
return <>{msg.reliable ? 'reliable' : 'unreliable'} {msg.num} sounds: {msg.length} bits</>
|
||||
case "VoiceInit":
|
||||
return <>{msg.codec} at quality {msg.quality} and sampling rage {msg.sampling_rate}</>
|
||||
case "SigOnState":
|
||||
return <>state: {msg.state}, count: {msg.count}</>
|
||||
case "SetConVar":
|
||||
return <>{msg.vars.map(cvar => `${cvar.key}=${cvar.value}`).join(', ')}</>
|
||||
case "SetView":
|
||||
return <>set view to entity {msg.index}</>
|
||||
case "GameEventList":
|
||||
return <>{msg.event_list.map(formatEventDefinition).map((str, i) => (<p key={i}>{str}</p>))}</>
|
||||
case "PacketEntities":
|
||||
let entities = msg.entities.map(entity => formatEntity(entity, prop_names, class_names)).map((str, i) => <p
|
||||
key={i}>{str}</p>);
|
||||
let deleted = <></>
|
||||
if (msg.removed_entities.length > 0) {
|
||||
deleted = <>deleted: {msg.removed_entities.join(', ')}</>
|
||||
}
|
||||
return <>
|
||||
{entities}
|
||||
{deleted}
|
||||
</>
|
||||
default:
|
||||
let json = msg;
|
||||
delete json.type;
|
||||
return <>{JSON.stringify(json)}</>
|
||||
}
|
||||
}
|
||||
|
||||
function formatUserCmd(cmd: UserCmd): string {
|
||||
let out = `${cmd.command_number} - tick ${cmd.tick_count}: `;
|
||||
|
||||
const formatOptionNum = (x: number | null) => x === null ? 0 : x;
|
||||
const anyNonNull = (xs: (number | null)[]) => xs.findIndex(x => x !== null) != -1;
|
||||
|
||||
let parts = [];
|
||||
|
||||
if (anyNonNull(cmd.view_angles)) {
|
||||
parts.push(`view angles: ${cmd.view_angles.map(formatOptionNum).join(',')}`);
|
||||
}
|
||||
if (anyNonNull(cmd.movement)) {
|
||||
parts.push(`movement: ${cmd.movement.map(formatOptionNum).join(',')}`);
|
||||
}
|
||||
if (cmd.mouse_dx !== null || cmd.mouse_dy !== null) {
|
||||
parts.push(`mouse: ${[cmd.mouse_dx, cmd.mouse_dy].map(formatOptionNum).join(',')}`);
|
||||
}
|
||||
if (cmd.impulse) {
|
||||
parts.push(`impulse ${cmd.impulse}`)
|
||||
}
|
||||
if (cmd.buttons) {
|
||||
parts.push(`buttons ${cmd.buttons}`)
|
||||
}
|
||||
if (cmd.weapon_select) {
|
||||
parts.push(`weapon ${cmd.weapon_select.select}(${cmd.weapon_select.subtype})`)
|
||||
}
|
||||
if (parts.length == 0) {
|
||||
parts.push(`no data`)
|
||||
}
|
||||
|
||||
return out + parts.join(', ');
|
||||
}
|
||||
|
||||
function formatPropValue(value: SendPropValue): string {
|
||||
if (Array.isArray(value)) {
|
||||
return '[' + value.map(formatPropValue).join(',') + ']'
|
||||
} else if (typeof value === "number" || typeof value === "string") {
|
||||
return `${value}`
|
||||
} else {
|
||||
return JSON.stringify(value)
|
||||
}
|
||||
}
|
||||
|
||||
function formatEntity(entity: PacketEntity, prop_names: Map<number, { table: String, prop: String }>, class_names: Map<number, String>,): string {
|
||||
let class_name = class_names.get(entity.server_class);
|
||||
let props = entity.props.map(prop => {
|
||||
let names = prop_names.get(prop.identifier);
|
||||
if (names) {
|
||||
return `${names.table}.${names.prop}=${formatPropValue(prop.value)}`;
|
||||
} else {
|
||||
return `[unknown prop]=${prop.value}`;
|
||||
}
|
||||
})
|
||||
return `entity ${entity.entity_index}(${class_name}) ${entity.pvs}: ` + props.join(', ');
|
||||
}
|
||||
|
||||
function formatEventDefinition(event: GameEventDefinition): string {
|
||||
let values = event.entries.map(entry => `${entry.name}: ${entry.kind}`);
|
||||
return `${event.event_type}{${values.join(', ')}}`;
|
||||
}
|
||||
Loading…
Add table
Add a link
Reference in a new issue