From 1f6e5c613e679138a53c8525322607d16b67718d Mon Sep 17 00:00:00 2001 From: marlon-erler Date: Thu, 2 Apr 2026 21:25:39 +0000 Subject: [PATCH] show explicit ids and urls in stats --- index.ts | 22 +- package-lock.json | 754 ----------------------- package.json | 5 +- static/dist/index.js | 1366 ++++++++++++++++++------------------------ static/src/model.tsx | 13 +- utility.ts | 10 +- websocket-handler.ts | 17 +- 7 files changed, 604 insertions(+), 1583 deletions(-) delete mode 100644 package-lock.json diff --git a/index.ts b/index.ts index c185688..7d0fdad 100755 --- a/index.ts +++ b/index.ts @@ -13,8 +13,8 @@ import { createFileResponse, getVersionNumber, writeError, - writeStatNumber, - writeStatString, + writeSeparator, + writeStat, writeSuccess, } from "./utility"; @@ -121,20 +121,20 @@ async function main() { function updateCLI() { console.clear(); - console.log(Colors.bold.bgWhite("UNIVERSAL DECENTRALIZED NETWORK")); + console.log(Colors.bold.bgBlue("UNIVERSAL DECENTRALIZED NETWORK")); console.log( Colors.yellow("relevant output is available in the 'logs' file"), ); - console.log(); + writeSeparator(); - console.log(new Date().toLocaleString()); - console.log(); + console.log(new Date().toISOString()); + writeSeparator(); - getServerStats().forEach((entry) => writeStatString(...entry)); - console.log(); + getServerStats().forEach((entry) => writeStat(...entry)); + writeSeparator(); - getWebSocketStats().forEach((entry) => writeStatNumber(...entry)); - console.log(); + getWebSocketStats().forEach((entry) => writeStat(...entry)); + writeSeparator(); } // LOOP @@ -148,7 +148,7 @@ async function main() { }, 5000); // FINISH - writeSuccess(`###\nstarted up ${new Date().toLocaleString()}`); + writeSuccess(`###\nstarted up ${new Date().toISOString()}`); } main(); diff --git a/package-lock.json b/package-lock.json deleted file mode 100644 index 7ae8c6c..0000000 --- a/package-lock.json +++ /dev/null @@ -1,754 +0,0 @@ -{ - "name": "udn", - "version": "1.0.0-beta13", - "lockfileVersion": 3, - "requires": true, - "packages": { - "": { - "name": "udn", - "version": "1.0.0-beta13", - "license": "SEE LICENSE IN LICENSE", - "dependencies": { - "@types/bun": "^1.1.6", - "colors": "^1.4.0", - "express": "^4.19.2", - "ip": "^2.0.1" - }, - "bin": { - "start": "index.ts" - } - }, - "node_modules/@types/bun": { - "version": "1.1.6", - "resolved": "https://registry.npmjs.org/@types/bun/-/bun-1.1.6.tgz", - "integrity": "sha512-uJgKjTdX0GkWEHZzQzFsJkWp5+43ZS7HC8sZPFnOwnSo1AsNl2q9o2bFeS23disNDqbggEgyFkKCHl/w8iZsMA==", - "dependencies": { - "bun-types": "1.1.17" - } - }, - "node_modules/@types/node": { - "version": "20.12.14", - "resolved": "https://registry.npmjs.org/@types/node/-/node-20.12.14.tgz", - "integrity": "sha512-scnD59RpYD91xngrQQLGkE+6UrHUPzeKZWhhjBSa3HSkwjbQc38+q3RoIVEwxQGRw3M+j5hpNAM+lgV3cVormg==", - "dependencies": { - "undici-types": "~5.26.4" - } - }, - "node_modules/@types/ws": { - "version": "8.5.10", - "resolved": "https://registry.npmjs.org/@types/ws/-/ws-8.5.10.tgz", - "integrity": "sha512-vmQSUcfalpIq0R9q7uTo2lXs6eGIpt9wtnLdMv9LVpIjCA/+ufZRozlVoVelIYixx1ugCBKDhn89vnsEGOCx9A==", - "dependencies": { - "@types/node": "*" - } - }, - "node_modules/accepts": { - "version": "1.3.8", - "resolved": "https://registry.npmjs.org/accepts/-/accepts-1.3.8.tgz", - "integrity": "sha512-PYAthTa2m2VKxuvSD3DPC/Gy+U+sOA1LAuT8mkmRuvw+NACSaeXEQ+NHcVF7rONl6qcaxV3Uuemwawk+7+SJLw==", - "dependencies": { - "mime-types": "~2.1.34", - "negotiator": "0.6.3" - }, - "engines": { - "node": ">= 0.6" - } - }, - "node_modules/array-flatten": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/array-flatten/-/array-flatten-1.1.1.tgz", - "integrity": "sha512-PCVAQswWemu6UdxsDFFX/+gVeYqKAod3D3UVm91jHwynguOwAvYPhx8nNlM++NqRcK6CxxpUafjmhIdKiHibqg==" - }, - "node_modules/body-parser": { - "version": "1.20.2", - "resolved": "https://registry.npmjs.org/body-parser/-/body-parser-1.20.2.tgz", - "integrity": "sha512-ml9pReCu3M61kGlqoTm2umSXTlRTuGTx0bfYj+uIUKKYycG5NtSbeetV3faSU6R7ajOPw0g/J1PvK4qNy7s5bA==", - "dependencies": { - "bytes": "3.1.2", - "content-type": "~1.0.5", - "debug": "2.6.9", - "depd": "2.0.0", - "destroy": "1.2.0", - "http-errors": "2.0.0", - "iconv-lite": "0.4.24", - "on-finished": "2.4.1", - "qs": "6.11.0", - "raw-body": "2.5.2", - "type-is": "~1.6.18", - "unpipe": "1.0.0" - }, - "engines": { - "node": ">= 0.8", - "npm": "1.2.8000 || >= 1.4.16" - } - }, - "node_modules/bun-types": { - "version": "1.1.17", - "resolved": "https://registry.npmjs.org/bun-types/-/bun-types-1.1.17.tgz", - "integrity": "sha512-Z4+OplcSd/YZq7ZsrfD00DKJeCwuNY96a1IDJyR73+cTBaFIS7SC6LhpY/W3AMEXO9iYq5NJ58WAwnwL1p5vKg==", - "dependencies": { - "@types/node": "~20.12.8", - "@types/ws": "~8.5.10" - } - }, - "node_modules/bytes": { - "version": "3.1.2", - "resolved": "https://registry.npmjs.org/bytes/-/bytes-3.1.2.tgz", - "integrity": "sha512-/Nf7TyzTx6S3yRJObOAV7956r8cr2+Oj8AC5dt8wSP3BQAoeX58NoHyCU8P8zGkNXStjTSi6fzO6F0pBdcYbEg==", - "engines": { - "node": ">= 0.8" - } - }, - "node_modules/call-bind": { - "version": "1.0.7", - "resolved": "https://registry.npmjs.org/call-bind/-/call-bind-1.0.7.tgz", - "integrity": "sha512-GHTSNSYICQ7scH7sZ+M2rFopRoLh8t2bLSW6BbgrtLsahOIB5iyAVJf9GjWK3cYTDaMj4XdBpM1cA6pIS0Kv2w==", - "dependencies": { - "es-define-property": "^1.0.0", - "es-errors": "^1.3.0", - "function-bind": "^1.1.2", - "get-intrinsic": "^1.2.4", - "set-function-length": "^1.2.1" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/colors": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/colors/-/colors-1.4.0.tgz", - "integrity": "sha512-a+UqTh4kgZg/SlGvfbzDHpgRu7AAQOmmqRHJnxhRZICKFUT91brVhNNt58CMWU9PsBbv3PDCZUHbVxuDiH2mtA==", - "engines": { - "node": ">=0.1.90" - } - }, - "node_modules/content-disposition": { - "version": "0.5.4", - "resolved": "https://registry.npmjs.org/content-disposition/-/content-disposition-0.5.4.tgz", - "integrity": "sha512-FveZTNuGw04cxlAiWbzi6zTAL/lhehaWbTtgluJh4/E95DqMwTmha3KZN1aAWA8cFIhHzMZUvLevkw5Rqk+tSQ==", - "dependencies": { - "safe-buffer": "5.2.1" - }, - "engines": { - "node": ">= 0.6" - } - }, - "node_modules/content-type": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/content-type/-/content-type-1.0.5.tgz", - "integrity": "sha512-nTjqfcBFEipKdXCv4YDQWCfmcLZKm81ldF0pAopTvyrFGVbcR6P/VAAd5G7N+0tTr8QqiU0tFadD6FK4NtJwOA==", - "engines": { - "node": ">= 0.6" - } - }, - "node_modules/cookie": { - "version": "0.6.0", - "resolved": "https://registry.npmjs.org/cookie/-/cookie-0.6.0.tgz", - "integrity": "sha512-U71cyTamuh1CRNCfpGY6to28lxvNwPG4Guz/EVjgf3Jmzv0vlDp1atT9eS5dDjMYHucpHbWns6Lwf3BKz6svdw==", - "engines": { - "node": ">= 0.6" - } - }, - "node_modules/cookie-signature": { - "version": "1.0.6", - "resolved": "https://registry.npmjs.org/cookie-signature/-/cookie-signature-1.0.6.tgz", - "integrity": "sha512-QADzlaHc8icV8I7vbaJXJwod9HWYp8uCqf1xa4OfNu1T7JVxQIrUgOWtHdNDtPiywmFbiS12VjotIXLrKM3orQ==" - }, - "node_modules/debug": { - "version": "2.6.9", - "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", - "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", - "dependencies": { - "ms": "2.0.0" - } - }, - "node_modules/define-data-property": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/define-data-property/-/define-data-property-1.1.4.tgz", - "integrity": "sha512-rBMvIzlpA8v6E+SJZoo++HAYqsLrkg7MSfIinMPFhmkorw7X+dOXVJQs+QT69zGkzMyfDnIMN2Wid1+NbL3T+A==", - "dependencies": { - "es-define-property": "^1.0.0", - "es-errors": "^1.3.0", - "gopd": "^1.0.1" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/depd": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/depd/-/depd-2.0.0.tgz", - "integrity": "sha512-g7nH6P6dyDioJogAAGprGpCtVImJhpPk/roCzdb3fIh61/s/nPsfR6onyMwkCAR/OlC3yBC0lESvUoQEAssIrw==", - "engines": { - "node": ">= 0.8" - } - }, - "node_modules/destroy": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/destroy/-/destroy-1.2.0.tgz", - "integrity": "sha512-2sJGJTaXIIaR1w4iJSNoN0hnMY7Gpc/n8D4qSCJw8QqFWXf7cuAgnEHxBpweaVcPevC2l3KpjYCx3NypQQgaJg==", - "engines": { - "node": ">= 0.8", - "npm": "1.2.8000 || >= 1.4.16" - } - }, - "node_modules/ee-first": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/ee-first/-/ee-first-1.1.1.tgz", - "integrity": "sha512-WMwm9LhRUo+WUaRN+vRuETqG89IgZphVSNkdFgeb6sS/E4OrDIN7t48CAewSHXc6C8lefD8KKfr5vY61brQlow==" - }, - "node_modules/encodeurl": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/encodeurl/-/encodeurl-1.0.2.tgz", - "integrity": "sha512-TPJXq8JqFaVYm2CWmPvnP2Iyo4ZSM7/QKcSmuMLDObfpH5fi7RUGmd/rTDf+rut/saiDiQEeVTNgAmJEdAOx0w==", - "engines": { - "node": ">= 0.8" - } - }, - "node_modules/es-define-property": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/es-define-property/-/es-define-property-1.0.0.tgz", - "integrity": "sha512-jxayLKShrEqqzJ0eumQbVhTYQM27CfT1T35+gCgDFoL82JLsXqTJ76zv6A0YLOgEnLUMvLzsDsGIrl8NFpT2gQ==", - "dependencies": { - "get-intrinsic": "^1.2.4" - }, - "engines": { - "node": ">= 0.4" - } - }, - "node_modules/es-errors": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/es-errors/-/es-errors-1.3.0.tgz", - "integrity": "sha512-Zf5H2Kxt2xjTvbJvP2ZWLEICxA6j+hAmMzIlypy4xcBg1vKVnx89Wy0GbS+kf5cwCVFFzdCFh2XSCFNULS6csw==", - "engines": { - "node": ">= 0.4" - } - }, - "node_modules/escape-html": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/escape-html/-/escape-html-1.0.3.tgz", - "integrity": "sha512-NiSupZ4OeuGwr68lGIeym/ksIZMJodUGOSCZ/FSnTxcrekbvqrgdUxlJOMpijaKZVjAJrWrGs/6Jy8OMuyj9ow==" - }, - "node_modules/etag": { - "version": "1.8.1", - "resolved": "https://registry.npmjs.org/etag/-/etag-1.8.1.tgz", - "integrity": "sha512-aIL5Fx7mawVa300al2BnEE4iNvo1qETxLrPI/o05L7z6go7fCw1J6EQmbK4FmJ2AS7kgVF/KEZWufBfdClMcPg==", - "engines": { - "node": ">= 0.6" - } - }, - "node_modules/express": { - "version": "4.19.2", - "resolved": "https://registry.npmjs.org/express/-/express-4.19.2.tgz", - "integrity": "sha512-5T6nhjsT+EOMzuck8JjBHARTHfMht0POzlA60WV2pMD3gyXw2LZnZ+ueGdNxG+0calOJcWKbpFcuzLZ91YWq9Q==", - "dependencies": { - "accepts": "~1.3.8", - "array-flatten": "1.1.1", - "body-parser": "1.20.2", - "content-disposition": "0.5.4", - "content-type": "~1.0.4", - "cookie": "0.6.0", - "cookie-signature": "1.0.6", - "debug": "2.6.9", - "depd": "2.0.0", - "encodeurl": "~1.0.2", - "escape-html": "~1.0.3", - "etag": "~1.8.1", - "finalhandler": "1.2.0", - "fresh": "0.5.2", - "http-errors": "2.0.0", - "merge-descriptors": "1.0.1", - "methods": "~1.1.2", - "on-finished": "2.4.1", - "parseurl": "~1.3.3", - "path-to-regexp": "0.1.7", - "proxy-addr": "~2.0.7", - "qs": "6.11.0", - "range-parser": "~1.2.1", - "safe-buffer": "5.2.1", - "send": "0.18.0", - "serve-static": "1.15.0", - "setprototypeof": "1.2.0", - "statuses": "2.0.1", - "type-is": "~1.6.18", - "utils-merge": "1.0.1", - "vary": "~1.1.2" - }, - "engines": { - "node": ">= 0.10.0" - } - }, - "node_modules/finalhandler": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/finalhandler/-/finalhandler-1.2.0.tgz", - "integrity": "sha512-5uXcUVftlQMFnWC9qu/svkWv3GTd2PfUhK/3PLkYNAe7FbqJMt3515HaxE6eRL74GdsriiwujiawdaB1BpEISg==", - "dependencies": { - "debug": "2.6.9", - "encodeurl": "~1.0.2", - "escape-html": "~1.0.3", - "on-finished": "2.4.1", - "parseurl": "~1.3.3", - "statuses": "2.0.1", - "unpipe": "~1.0.0" - }, - "engines": { - "node": ">= 0.8" - } - }, - "node_modules/forwarded": { - "version": "0.2.0", - "resolved": "https://registry.npmjs.org/forwarded/-/forwarded-0.2.0.tgz", - "integrity": "sha512-buRG0fpBtRHSTCOASe6hD258tEubFoRLb4ZNA6NxMVHNw2gOcwHo9wyablzMzOA5z9xA9L1KNjk/Nt6MT9aYow==", - "engines": { - "node": ">= 0.6" - } - }, - "node_modules/fresh": { - "version": "0.5.2", - "resolved": "https://registry.npmjs.org/fresh/-/fresh-0.5.2.tgz", - "integrity": "sha512-zJ2mQYM18rEFOudeV4GShTGIQ7RbzA7ozbU9I/XBpm7kqgMywgmylMwXHxZJmkVoYkna9d2pVXVXPdYTP9ej8Q==", - "engines": { - "node": ">= 0.6" - } - }, - "node_modules/function-bind": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.2.tgz", - "integrity": "sha512-7XHNxH7qX9xG5mIwxkhumTox/MIRNcOgDrxWsMt2pAr23WHp6MrRlN7FBSFpCpr+oVO0F744iUgR82nJMfG2SA==", - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/get-intrinsic": { - "version": "1.2.4", - "resolved": "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.2.4.tgz", - "integrity": "sha512-5uYhsJH8VJBTv7oslg4BznJYhDoRI6waYCxMmCdnTrcCrHA/fCFKoTFz2JKKE0HdDFUF7/oQuhzumXJK7paBRQ==", - "dependencies": { - "es-errors": "^1.3.0", - "function-bind": "^1.1.2", - "has-proto": "^1.0.1", - "has-symbols": "^1.0.3", - "hasown": "^2.0.0" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/gopd": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/gopd/-/gopd-1.0.1.tgz", - "integrity": "sha512-d65bNlIadxvpb/A2abVdlqKqV563juRnZ1Wtk6s1sIR8uNsXR70xqIzVqxVf1eTqDunwT2MkczEeaezCKTZhwA==", - "dependencies": { - "get-intrinsic": "^1.1.3" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/has-property-descriptors": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/has-property-descriptors/-/has-property-descriptors-1.0.2.tgz", - "integrity": "sha512-55JNKuIW+vq4Ke1BjOTjM2YctQIvCT7GFzHwmfZPGo5wnrgkid0YQtnAleFSqumZm4az3n2BS+erby5ipJdgrg==", - "dependencies": { - "es-define-property": "^1.0.0" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/has-proto": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/has-proto/-/has-proto-1.0.3.tgz", - "integrity": "sha512-SJ1amZAJUiZS+PhsVLf5tGydlaVB8EdFpaSO4gmiUKUOxk8qzn5AIy4ZeJUmh22znIdk/uMAUT2pl3FxzVUH+Q==", - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/has-symbols": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.0.3.tgz", - "integrity": "sha512-l3LCuF6MgDNwTDKkdYGEihYjt5pRPbEg46rtlmnSPlUbgmB8LOIrKJbYYFBSbnPaJexMKtiPO8hmeRjRz2Td+A==", - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/hasown": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/hasown/-/hasown-2.0.2.tgz", - "integrity": "sha512-0hJU9SCPvmMzIBdZFqNPXWa6dqh7WdH0cII9y+CyS8rG3nL48Bclra9HmKhVVUHyPWNH5Y7xDwAB7bfgSjkUMQ==", - "dependencies": { - "function-bind": "^1.1.2" - }, - "engines": { - "node": ">= 0.4" - } - }, - "node_modules/http-errors": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/http-errors/-/http-errors-2.0.0.tgz", - "integrity": "sha512-FtwrG/euBzaEjYeRqOgly7G0qviiXoJWnvEH2Z1plBdXgbyjv34pHTSb9zoeHMyDy33+DWy5Wt9Wo+TURtOYSQ==", - "dependencies": { - "depd": "2.0.0", - "inherits": "2.0.4", - "setprototypeof": "1.2.0", - "statuses": "2.0.1", - "toidentifier": "1.0.1" - }, - "engines": { - "node": ">= 0.8" - } - }, - "node_modules/iconv-lite": { - "version": "0.4.24", - "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.4.24.tgz", - "integrity": "sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA==", - "dependencies": { - "safer-buffer": ">= 2.1.2 < 3" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/inherits": { - "version": "2.0.4", - "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz", - "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==" - }, - "node_modules/ip": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/ip/-/ip-2.0.1.tgz", - "integrity": "sha512-lJUL9imLTNi1ZfXT+DU6rBBdbiKGBuay9B6xGSPVjUeQwaH1RIGqef8RZkUtHioLmSNpPR5M4HVKJGm1j8FWVQ==" - }, - "node_modules/ipaddr.js": { - "version": "1.9.1", - "resolved": "https://registry.npmjs.org/ipaddr.js/-/ipaddr.js-1.9.1.tgz", - "integrity": "sha512-0KI/607xoxSToH7GjN1FfSbLoU0+btTicjsQSWQlh/hZykN8KpmMf7uYwPW3R+akZ6R/w18ZlXSHBYXiYUPO3g==", - "engines": { - "node": ">= 0.10" - } - }, - "node_modules/media-typer": { - "version": "0.3.0", - "resolved": "https://registry.npmjs.org/media-typer/-/media-typer-0.3.0.tgz", - "integrity": "sha512-dq+qelQ9akHpcOl/gUVRTxVIOkAJ1wR3QAvb4RsVjS8oVoFjDGTc679wJYmUmknUF5HwMLOgb5O+a3KxfWapPQ==", - "engines": { - "node": ">= 0.6" - } - }, - "node_modules/merge-descriptors": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/merge-descriptors/-/merge-descriptors-1.0.1.tgz", - "integrity": "sha512-cCi6g3/Zr1iqQi6ySbseM1Xvooa98N0w31jzUYrXPX2xqObmFGHJ0tQ5u74H3mVh7wLouTseZyYIq39g8cNp1w==" - }, - "node_modules/methods": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/methods/-/methods-1.1.2.tgz", - "integrity": "sha512-iclAHeNqNm68zFtnZ0e+1L2yUIdvzNoauKU4WBA3VvH/vPFieF7qfRlwUZU+DA9P9bPXIS90ulxoUoCH23sV2w==", - "engines": { - "node": ">= 0.6" - } - }, - "node_modules/mime": { - "version": "1.6.0", - "resolved": "https://registry.npmjs.org/mime/-/mime-1.6.0.tgz", - "integrity": "sha512-x0Vn8spI+wuJ1O6S7gnbaQg8Pxh4NNHb7KSINmEWKiPE4RKOplvijn+NkmYmmRgP68mc70j2EbeTFRsrswaQeg==", - "bin": { - "mime": "cli.js" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/mime-db": { - "version": "1.52.0", - "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.52.0.tgz", - "integrity": "sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg==", - "engines": { - "node": ">= 0.6" - } - }, - "node_modules/mime-types": { - "version": "2.1.35", - "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.35.tgz", - "integrity": "sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw==", - "dependencies": { - "mime-db": "1.52.0" - }, - "engines": { - "node": ">= 0.6" - } - }, - "node_modules/ms": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", - "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==" - }, - "node_modules/negotiator": { - "version": "0.6.3", - "resolved": "https://registry.npmjs.org/negotiator/-/negotiator-0.6.3.tgz", - "integrity": "sha512-+EUsqGPLsM+j/zdChZjsnX51g4XrHFOIXwfnCVPGlQk/k5giakcKsuxCObBRu6DSm9opw/O6slWbJdghQM4bBg==", - "engines": { - "node": ">= 0.6" - } - }, - "node_modules/object-inspect": { - "version": "1.13.2", - "resolved": "https://registry.npmjs.org/object-inspect/-/object-inspect-1.13.2.tgz", - "integrity": "sha512-IRZSRuzJiynemAXPYtPe5BoI/RESNYR7TYm50MC5Mqbd3Jmw5y790sErYw3V6SryFJD64b74qQQs9wn5Bg/k3g==", - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/on-finished": { - "version": "2.4.1", - "resolved": "https://registry.npmjs.org/on-finished/-/on-finished-2.4.1.tgz", - "integrity": "sha512-oVlzkg3ENAhCk2zdv7IJwd/QUD4z2RxRwpkcGY8psCVcCYZNq4wYnVWALHM+brtuJjePWiYF/ClmuDr8Ch5+kg==", - "dependencies": { - "ee-first": "1.1.1" - }, - "engines": { - "node": ">= 0.8" - } - }, - "node_modules/parseurl": { - "version": "1.3.3", - "resolved": "https://registry.npmjs.org/parseurl/-/parseurl-1.3.3.tgz", - "integrity": "sha512-CiyeOxFT/JZyN5m0z9PfXw4SCBJ6Sygz1Dpl0wqjlhDEGGBP1GnsUVEL0p63hoG1fcj3fHynXi9NYO4nWOL+qQ==", - "engines": { - "node": ">= 0.8" - } - }, - "node_modules/path-to-regexp": { - "version": "0.1.7", - "resolved": "https://registry.npmjs.org/path-to-regexp/-/path-to-regexp-0.1.7.tgz", - "integrity": "sha512-5DFkuoqlv1uYQKxy8omFBeJPQcdoE07Kv2sferDCrAq1ohOU+MSDswDIbnx3YAM60qIOnYa53wBhXW0EbMonrQ==" - }, - "node_modules/proxy-addr": { - "version": "2.0.7", - "resolved": "https://registry.npmjs.org/proxy-addr/-/proxy-addr-2.0.7.tgz", - "integrity": "sha512-llQsMLSUDUPT44jdrU/O37qlnifitDP+ZwrmmZcoSKyLKvtZxpyV0n2/bD/N4tBAAZ/gJEdZU7KMraoK1+XYAg==", - "dependencies": { - "forwarded": "0.2.0", - "ipaddr.js": "1.9.1" - }, - "engines": { - "node": ">= 0.10" - } - }, - "node_modules/qs": { - "version": "6.11.0", - "resolved": "https://registry.npmjs.org/qs/-/qs-6.11.0.tgz", - "integrity": "sha512-MvjoMCJwEarSbUYk5O+nmoSzSutSsTwF85zcHPQ9OrlFoZOYIjaqBAJIqIXjptyD5vThxGq52Xu/MaJzRkIk4Q==", - "dependencies": { - "side-channel": "^1.0.4" - }, - "engines": { - "node": ">=0.6" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/range-parser": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/range-parser/-/range-parser-1.2.1.tgz", - "integrity": "sha512-Hrgsx+orqoygnmhFbKaHE6c296J+HTAQXoxEF6gNupROmmGJRoyzfG3ccAveqCBrwr/2yxQ5BVd/GTl5agOwSg==", - "engines": { - "node": ">= 0.6" - } - }, - "node_modules/raw-body": { - "version": "2.5.2", - "resolved": "https://registry.npmjs.org/raw-body/-/raw-body-2.5.2.tgz", - "integrity": "sha512-8zGqypfENjCIqGhgXToC8aB2r7YrBX+AQAfIPs/Mlk+BtPTztOvTS01NRW/3Eh60J+a48lt8qsCzirQ6loCVfA==", - "dependencies": { - "bytes": "3.1.2", - "http-errors": "2.0.0", - "iconv-lite": "0.4.24", - "unpipe": "1.0.0" - }, - "engines": { - "node": ">= 0.8" - } - }, - "node_modules/safe-buffer": { - "version": "5.2.1", - "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.1.tgz", - "integrity": "sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==", - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/feross" - }, - { - "type": "patreon", - "url": "https://www.patreon.com/feross" - }, - { - "type": "consulting", - "url": "https://feross.org/support" - } - ] - }, - "node_modules/safer-buffer": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/safer-buffer/-/safer-buffer-2.1.2.tgz", - "integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==" - }, - "node_modules/send": { - "version": "0.18.0", - "resolved": "https://registry.npmjs.org/send/-/send-0.18.0.tgz", - "integrity": "sha512-qqWzuOjSFOuqPjFe4NOsMLafToQQwBSOEpS+FwEt3A2V3vKubTquT3vmLTQpFgMXp8AlFWFuP1qKaJZOtPpVXg==", - "dependencies": { - "debug": "2.6.9", - "depd": "2.0.0", - "destroy": "1.2.0", - "encodeurl": "~1.0.2", - "escape-html": "~1.0.3", - "etag": "~1.8.1", - "fresh": "0.5.2", - "http-errors": "2.0.0", - "mime": "1.6.0", - "ms": "2.1.3", - "on-finished": "2.4.1", - "range-parser": "~1.2.1", - "statuses": "2.0.1" - }, - "engines": { - "node": ">= 0.8.0" - } - }, - "node_modules/send/node_modules/ms": { - "version": "2.1.3", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz", - "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==" - }, - "node_modules/serve-static": { - "version": "1.15.0", - "resolved": "https://registry.npmjs.org/serve-static/-/serve-static-1.15.0.tgz", - "integrity": "sha512-XGuRDNjXUijsUL0vl6nSD7cwURuzEgglbOaFuZM9g3kwDXOWVTck0jLzjPzGD+TazWbboZYu52/9/XPdUgne9g==", - "dependencies": { - "encodeurl": "~1.0.2", - "escape-html": "~1.0.3", - "parseurl": "~1.3.3", - "send": "0.18.0" - }, - "engines": { - "node": ">= 0.8.0" - } - }, - "node_modules/set-function-length": { - "version": "1.2.2", - "resolved": "https://registry.npmjs.org/set-function-length/-/set-function-length-1.2.2.tgz", - "integrity": "sha512-pgRc4hJ4/sNjWCSS9AmnS40x3bNMDTknHgL5UaMBTMyJnU90EgWh1Rz+MC9eFu4BuN/UwZjKQuY/1v3rM7HMfg==", - "dependencies": { - "define-data-property": "^1.1.4", - "es-errors": "^1.3.0", - "function-bind": "^1.1.2", - "get-intrinsic": "^1.2.4", - "gopd": "^1.0.1", - "has-property-descriptors": "^1.0.2" - }, - "engines": { - "node": ">= 0.4" - } - }, - "node_modules/setprototypeof": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/setprototypeof/-/setprototypeof-1.2.0.tgz", - "integrity": "sha512-E5LDX7Wrp85Kil5bhZv46j8jOeboKq5JMmYM3gVGdGH8xFpPWXUMsNrlODCrkoxMEeNi/XZIwuRvY4XNwYMJpw==" - }, - "node_modules/side-channel": { - "version": "1.0.6", - "resolved": "https://registry.npmjs.org/side-channel/-/side-channel-1.0.6.tgz", - "integrity": "sha512-fDW/EZ6Q9RiO8eFG8Hj+7u/oW+XrPTIChwCOM2+th2A6OblDtYYIpve9m+KvI9Z4C9qSEXlaGR6bTEYHReuglA==", - "dependencies": { - "call-bind": "^1.0.7", - "es-errors": "^1.3.0", - "get-intrinsic": "^1.2.4", - "object-inspect": "^1.13.1" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/statuses": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/statuses/-/statuses-2.0.1.tgz", - "integrity": "sha512-RwNA9Z/7PrK06rYLIzFMlaF+l73iwpzsqRIFgbMLbTcLD6cOao82TaWefPXQvB2fOC4AjuYSEndS7N/mTCbkdQ==", - "engines": { - "node": ">= 0.8" - } - }, - "node_modules/toidentifier": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/toidentifier/-/toidentifier-1.0.1.tgz", - "integrity": "sha512-o5sSPKEkg/DIQNmH43V0/uerLrpzVedkUh8tGNvaeXpfpuwjKenlSox/2O/BTlZUtEe+JG7s5YhEz608PlAHRA==", - "engines": { - "node": ">=0.6" - } - }, - "node_modules/type-is": { - "version": "1.6.18", - "resolved": "https://registry.npmjs.org/type-is/-/type-is-1.6.18.tgz", - "integrity": "sha512-TkRKr9sUTxEH8MdfuCSP7VizJyzRNMjj2J2do2Jr3Kym598JVdEksuzPQCnlFPW4ky9Q+iA+ma9BGm06XQBy8g==", - "dependencies": { - "media-typer": "0.3.0", - "mime-types": "~2.1.24" - }, - "engines": { - "node": ">= 0.6" - } - }, - "node_modules/undici-types": { - "version": "5.26.5", - "resolved": "https://registry.npmjs.org/undici-types/-/undici-types-5.26.5.tgz", - "integrity": "sha512-JlCMO+ehdEIKqlFxk6IfVoAUVmgz7cU7zD/h9XZ0qzeosSHmUJVOzSQvvYSYWXkFXC+IfLKSIffhv0sVZup6pA==" - }, - "node_modules/unpipe": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/unpipe/-/unpipe-1.0.0.tgz", - "integrity": "sha512-pjy2bYhSsufwWlKwPc+l3cN7+wuJlK6uz0YdJEOlQDbl6jo/YlPi4mb8agUkVC8BF7V8NuzeyPNqRksA3hztKQ==", - "engines": { - "node": ">= 0.8" - } - }, - "node_modules/utils-merge": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/utils-merge/-/utils-merge-1.0.1.tgz", - "integrity": "sha512-pMZTvIkT1d+TFGvDOqodOclx0QWkkgi6Tdoa8gC8ffGAAqz9pzPTZWAybbsHHoED/ztMtkv/VoYTYyShUn81hA==", - "engines": { - "node": ">= 0.4.0" - } - }, - "node_modules/vary": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/vary/-/vary-1.1.2.tgz", - "integrity": "sha512-BNGbWLfd0eUPabhkXUVm0j8uuvREyTh5ovRa/dyow/BqAbZJyC+5fU+IzQOzmAKzYqYRAISoRhdQr3eIZ/PXqg==", - "engines": { - "node": ">= 0.8" - } - } - } -} diff --git a/package.json b/package.json index 7d17d11..ab6482e 100644 --- a/package.json +++ b/package.json @@ -1,10 +1,13 @@ { "name": "udn", - "version": "1.0.0", + "version": "1.0.1", "description": "A websocket-based infrastructure for decentralized networks ", "bin": { "start": "index.ts" }, + "scripts": { + "build": "esbuild static/src/index.tsx --bundle --outdir=static/dist" + }, "repository": { "type": "git", "url": "git+https://github.com/marlon-erler/universal-decentralized-network.git" diff --git a/static/dist/index.js b/static/dist/index.js index 53bee8f..d469943 100644 --- a/static/dist/index.js +++ b/static/dist/index.js @@ -1,814 +1,582 @@ (() => { - // node_modules/bloatless-react/index.ts - var State = class { - _value; - _bindings = /* @__PURE__ */ new Set(); - // init - constructor(initialValue) { - this._value = initialValue; - } - // value - get value() { - return this._value; - } - set value(newValue) { - if (this._value == newValue) return; - this._value = newValue; - this.callSubscriptions(); - } - // subscriptions - callSubscriptions() { - this._bindings.forEach((fn) => fn(this._value)); - } - subscribe(fn) { - this._bindings.add(fn); - fn(this._value); - } - // stringify - toString() { - return JSON.stringify(this._value); - } - }; - var ListState = class extends State { - additionHandlers = /* @__PURE__ */ new Set(); - removalHandlers = /* @__PURE__ */ new Map(); - // init - constructor(initialItems) { - super(new Set(initialItems)); - } - // list - add(...items) { - items.forEach((item) => { - this.value.add(item); - this.additionHandlers.forEach((handler) => handler(item)); - }); - this.callSubscriptions(); - } - remove(...items) { - items.forEach((item) => { - this.value.delete(item); - if (!this.removalHandlers.has(item)) return; - this.removalHandlers.get(item)(item); - this.removalHandlers.delete(item); - }); - this.callSubscriptions(); - } - clear() { - this.remove(...this.value.values()); - } - // handlers - handleAddition(handler) { - this.additionHandlers.add(handler); - [...this.value.values()].forEach(handler); - } - handleRemoval(item, handler) { - this.removalHandlers.set(item, handler); - } - // stringification - toString() { - const array = [...this.value]; - const json = JSON.stringify(array); - return json; - } - }; - function createProxyState(statesToSubscibe, fn) { - const proxyState = new State(fn()); - statesToSubscibe.forEach((state) => - state.subscribe(() => (proxyState.value = fn())), - ); - return proxyState; + // static/node_modules/bloatless-react/index.ts + var State = class { + _value; + _bindings = /* @__PURE__ */ new Set(); + // init + constructor(initialValue) { + this._value = initialValue; } - function persistState(localStorageKey, state) { - state.subscribe(() => { - const stringifiedValue = state.toString(); - localStorage.setItem(localStorageKey, stringifiedValue); - }); + // value + get value() { + return this._value; } - function restoreState(localStorageKey, initialStateValue) { - const storedString = - localStorage.getItem(localStorageKey) ?? - JSON.stringify(initialStateValue); - const convertedValue = JSON.parse(storedString); - const state = new State(convertedValue); - persistState(localStorageKey, state); - return state; + set value(newValue) { + if (this._value == newValue) return; + this._value = newValue; + this.callSubscriptions(); } - function createElement(tagName, attributes = {}, ...children) { - const element = document.createElement(tagName); - if (attributes != null) - Object.entries(attributes).forEach((entry) => { - const [attributename, value] = entry; - const [directiveKey, directiveValue] = attributename.split(":"); - switch (directiveKey) { - case "on": { - switch (directiveValue) { - case "enter": { - element.addEventListener("keydown", (e) => { - if (e.key != "Enter") return; - value(); - }); - break; - } - default: { - element.addEventListener(directiveValue, value); - } - } - break; - } - case "subscribe": { - if (directiveValue == "children") { - element.style.scrollBehavior = "smooth"; - try { - const [listState, toElement] = value; - listState.handleAddition((newItem) => { - const child = toElement(newItem); - listState.handleRemoval(newItem, () => - child.remove(), - ); - element.append(child); - element.scrollTop = element.scrollHeight; - }); - } catch { - throw `error: cannot process subscribe:children directive because ListItemConverter is not defined. Usage: "subscribe:children={[list, converter]}"; you can find a more detailed example in the documentation`; - } - } else { - const state = value; - state.subscribe( - (newValue) => - (element[directiveValue] = newValue), - ); - } - break; - } - case "bind": { - const state = value; - state.subscribe( - (newValue) => (element[directiveValue] = newValue), - ); - element.addEventListener( - "input", - () => (state.value = element[directiveValue]), - ); - break; - } - case "toggle": { - if (value.subscribe) { - const state = value; - state.subscribe((newValue) => - element.toggleAttribute( - directiveValue, - newValue, - ), - ); - } else { - element.toggleAttribute(directiveValue, value); - } - break; - } - case "set": { - const state = value; - state.subscribe((newValue) => - element.setAttribute(directiveValue, newValue), - ); - break; - } - default: - element.setAttribute(attributename, value); - } - }); - children.filter((x) => x).forEach((child) => element.append(child)); - return element; + // subscriptions + callSubscriptions() { + this._bindings.forEach((fn) => fn(this._value)); } - - // node_modules/udn-frontend/index.ts - var UDNFrontend = class { - ws; - // HANDLERS - connectionHandler = () => {}; - disconnectionHandler = () => {}; - messageHandler = (data) => {}; - mailboxHandler = (mailboxId2) => {}; - mailboxConnectionHandler = (mailboxId2) => {}; - mailboxDeleteHandler = (mailboxId2) => {}; - // INIT - set onconnect(handler) { - this.connectionHandler = handler; - } - set ondisconnect(handler) { - this.disconnectionHandler = handler; - } - set onmessage(handler) { - this.messageHandler = handler; - } - set onmailboxcreate(handler) { - this.mailboxHandler = handler; - } - set onmailboxconnect(handler) { - this.mailboxConnectionHandler = handler; - } - set onmailboxdelete(handler) { - this.mailboxDeleteHandler = handler; - } - // UTILITY METHODS - send(messageObject) { - if (this.ws == void 0) return false; - const messageString = JSON.stringify(messageObject); - this.ws.send(messageString); - return true; - } - // PUBLIC METHODS - // connection - connect(address) { - try { - this.disconnect(); - this.ws = new WebSocket(address); - this.ws.addEventListener("open", this.connectionHandler); - this.ws.addEventListener("close", this.disconnectionHandler); - this.ws.addEventListener("message", (message) => { - const dataString = message.data.toString(); - const data = JSON.parse(dataString); - if (data.assignedMailboxId) { - return this.mailboxHandler(data.assignedMailboxId); - } else if (data.connectedMailboxId) { - return this.mailboxConnectionHandler( - data.connectedMailboxId, - ); - } else if (data.deletedMailbox) { - return this.mailboxDeleteHandler(data.deletedMailbox); - } else { - this.messageHandler(data); - } + subscribe(fn) { + this._bindings.add(fn); + fn(this._value); + } + // stringify + toString() { + return JSON.stringify(this._value); + } + }; + var ListState = class extends State { + additionHandlers = /* @__PURE__ */ new Set(); + removalHandlers = /* @__PURE__ */ new Map(); + // init + constructor(initialItems) { + super(new Set(initialItems)); + } + // list + add(...items) { + items.forEach((item) => { + this.value.add(item); + this.additionHandlers.forEach((handler) => handler(item)); + }); + this.callSubscriptions(); + } + remove(...items) { + items.forEach((item) => { + this.value.delete(item); + if (!this.removalHandlers.has(item)) return; + this.removalHandlers.get(item)(item); + this.removalHandlers.delete(item); + }); + this.callSubscriptions(); + } + clear() { + this.remove(...this.value.values()); + } + // handlers + handleAddition(handler) { + this.additionHandlers.add(handler); + [...this.value.values()].forEach(handler); + } + handleRemoval(item, handler) { + this.removalHandlers.set(item, handler); + } + // stringification + toString() { + const array = [...this.value]; + const json = JSON.stringify(array); + return json; + } + }; + function createProxyState(statesToSubscibe, fn) { + const proxyState = new State(fn()); + statesToSubscibe.forEach( + (state) => state.subscribe(() => proxyState.value = fn()) + ); + return proxyState; + } + function persistState(localStorageKey, state) { + state.subscribe(() => { + const stringifiedValue = state.toString(); + localStorage.setItem(localStorageKey, stringifiedValue); + }); + } + function restoreState(localStorageKey, initialStateValue) { + const storedString = localStorage.getItem(localStorageKey) ?? JSON.stringify(initialStateValue); + const convertedValue = JSON.parse(storedString); + const state = new State(convertedValue); + persistState(localStorageKey, state); + return state; + } + function createElement(tagName, attributes = {}, ...children) { + const element = document.createElement(tagName); + if (attributes != null) + Object.entries(attributes).forEach((entry) => { + const [attributename, value] = entry; + const [directiveKey, directiveValue] = attributename.split(":"); + switch (directiveKey) { + case "on": { + switch (directiveValue) { + case "enter": { + element.addEventListener("keydown", (e) => { + if (e.key != "Enter") return; + value(); }); - } catch (error) { - console.error(error); + break; + } + default: { + element.addEventListener(directiveValue, value); + } } - } - disconnect() { - this.ws?.close(); - } - // message - sendMessage(channel, body) { - const messageObject = { - messageChannel: channel, - messageBody: body, - }; - return this.send(messageObject); - } - // subscription - subscribe(channel) { - const messageObject = { - subscribeChannel: channel, - }; - return this.send(messageObject); - } - unsubscribe(channel) { - const messageObject = { - unsubscribeChannel: channel, - }; - return this.send(messageObject); - } - // mailbox - requestMailbox() { - const messageObject = { - requestingMailboxSetup: true, - }; - return this.send(messageObject); - } - connectMailbox(mailboxId2) { - const messageObject = { - requestedMailbox: mailboxId2, - }; - return this.send(messageObject); - } - deleteMailbox(mailboxId2) { - const messageObject = { - deletingMailbox: mailboxId2, - }; - return this.send(messageObject); - } - }; - - // src/translations.tsx - var staticTextEnglish = { - mailbox: "Mailbox", - requestMailbox: "Request", - deleteMailbox: "Delete", - mailboxConnected: "Mailbox active", - channel: "Channel", - channel_placeholder: "my-channel", - disconnected: "Server disconnected", - reconnecting: "Reconnecting...", - info: "Info", - message: "Message", - messages: "Messages", - message_placeholder: "Hello, world!", - message_placeholder_generic: "Type a message...", - noMessagesReceived: "No messages received", - messageLastReceived: "Last received message", - messagesReceived: "Received Messages", - send: "Send", - serverInfo: "Server Info", - settings: "Settings", - subscribeToChannel: "Subscribe to channel", - subscribe: "Subscribe", - unsubscribe: "Unubscribe", - }; - var allTranslations = { - en: staticTextEnglish, - es: { - mailbox: "Buz\xF3n", - requestMailbox: "Solicitar", - deleteMailbox: "Eliminar", - mailboxConnected: "Buz\xF3n activado", - channel: "Canal", - channel_placeholder: "mi-canal", - disconnected: "Sin coneci\xF3n", - reconnecting: "Conectando...", - info: "Info", - message: "Mensaje", - messages: "Mensajes", - message_placeholder: "Hola!", - message_placeholder_generic: "Nuevo mensaje", - noMessagesReceived: "Sin mensajes", - messageLastReceived: "\xDAltimo mensaje", - messagesReceived: "Todos los Mensajes", - send: "Enviar", - serverInfo: "Informaci\xF3n", - settings: "Configuraci\xF3n", - subscribeToChannel: "Suscribirse a un canal", - subscribe: "Suscribirse", - unsubscribe: "Cancelar", - }, - de: { - mailbox: "Briefkasten", - requestMailbox: "Beantragen", - deleteMailbox: "L\xF6schen", - mailboxConnected: "Briefkasten aktiv", - channel: "Kanal", - channel_placeholder: "mein-kanal", - disconnected: "Verbindung getrennt", - reconnecting: "Verbindung wird hergestellt...", - info: "Daten", - message: "Nachricht", - messages: "Nachrichten", - message_placeholder: "Hallo!", - message_placeholder_generic: "Neue Nachricht", - noMessagesReceived: "Keine Nachrichten", - messageLastReceived: "Letzte Nachricht", - messagesReceived: "Empfangene Nachrichten", - send: "Senden", - serverInfo: "Serverdaten", - settings: "Einstellungen", - subscribeToChannel: "Kanal beitreten", - subscribe: "Beitreten", - unsubscribe: "Verlassen", - }, - }; - var language = navigator.language.substring(0, 2); - var translations = allTranslations[language]; - - // src/model.tsx - var Message = class { - constructor(channel, body) { - this.channel = channel; - this.body = body; - } - }; - var isDisconnected = new State(true); - var mailboxId = restoreState("mailbox-id", ""); - var isMailboxDisonnected = new State(true); - var messages = new ListState(); - var lastReceivedMessage = new State(translations.noMessagesReceived); - var statHTMLString = new State(""); - async function updateStats() { - const response = await fetch( - `${window.location.protocol}//${window.location.host}/stats`, - ); - const data = await response.json(); - let html = ""; - data.forEach((item) => { - const tile = /* @__PURE__ */ createElement( - "div", - { class: "tile" }, - /* @__PURE__ */ createElement( - "span", - { class: "secondary flex width-100" }, - item[0].toString(), - ), - /* @__PURE__ */ createElement("b", null, item[1].toString()), + break; + } + case "subscribe": { + if (directiveValue == "children") { + element.style.scrollBehavior = "smooth"; + try { + const [listState, toElement] = value; + listState.handleAddition((newItem) => { + const child = toElement(newItem); + listState.handleRemoval( + newItem, + () => child.remove() + ); + element.append(child); + element.scrollTop = element.scrollHeight; + }); + } catch { + throw `error: cannot process subscribe:children directive because ListItemConverter is not defined. Usage: "subscribe:children={[list, converter]}"; you can find a more detailed example in the documentation`; + } + } else { + const state = value; + state.subscribe( + (newValue) => element[directiveValue] = newValue + ); + } + break; + } + case "bind": { + const state = value; + state.subscribe( + (newValue) => element[directiveValue] = newValue ); - html += tile.outerHTML; + element.addEventListener( + "input", + () => state.value = element[directiveValue] + ); + break; + } + case "toggle": { + if (value.subscribe) { + const state = value; + state.subscribe( + (newValue) => element.toggleAttribute(directiveValue, newValue) + ); + } else { + element.toggleAttribute(directiveValue, value); + } + break; + } + case "set": { + const state = value; + state.subscribe( + (newValue) => element.setAttribute(directiveValue, newValue) + ); + break; + } + default: + element.setAttribute(attributename, value); + } + }); + children.filter((x) => x).forEach((child) => element.append(child)); + return element; + } + + // static/node_modules/udn-frontend/index.ts + var UDNFrontend = class { + ws; + // HANDLERS + connectionHandler = () => { + }; + disconnectionHandler = () => { + }; + messageHandler = (data) => { + }; + mailboxHandler = (mailboxId2) => { + }; + mailboxConnectionHandler = (mailboxId2) => { + }; + mailboxDeleteHandler = (mailboxId2) => { + }; + // INIT + set onconnect(handler) { + this.connectionHandler = handler; + } + set ondisconnect(handler) { + this.disconnectionHandler = handler; + } + set onmessage(handler) { + this.messageHandler = handler; + } + set onmailboxcreate(handler) { + this.mailboxHandler = handler; + } + set onmailboxconnect(handler) { + this.mailboxConnectionHandler = handler; + } + set onmailboxdelete(handler) { + this.mailboxDeleteHandler = handler; + } + // UTILITY METHODS + send(messageObject) { + if (this.ws == void 0) return false; + const messageString = JSON.stringify(messageObject); + this.ws.send(messageString); + return true; + } + // PUBLIC METHODS + // connection + connect(address) { + try { + this.disconnect(); + this.ws = new WebSocket(address); + this.ws.addEventListener("open", this.connectionHandler); + this.ws.addEventListener("close", this.disconnectionHandler); + this.ws.addEventListener("message", (message) => { + const dataString = message.data.toString(); + const data = JSON.parse(dataString); + if (data.assignedMailboxId) { + return this.mailboxHandler(data.assignedMailboxId); + } else if (data.connectedMailboxId) { + return this.mailboxConnectionHandler(data.connectedMailboxId); + } else if (data.deletedMailbox) { + return this.mailboxDeleteHandler(data.deletedMailbox); + } else { + this.messageHandler(data); + } }); - statHTMLString.value = html; + } catch (error) { + console.error(error); + } } - var subscriptionChannel = new State(""); - var newMessageChannel = new State(""); - var newMessageBody = new State(""); - var isMessageEmpty = createProxyState( - [newMessageChannel, newMessageBody], - () => newMessageChannel.value == "" || newMessageBody.value == "", + disconnect() { + this.ws?.close(); + } + // message + sendMessage(channel, body) { + const messageObject = { + messageChannel: channel, + messageBody: body + }; + return this.send(messageObject); + } + // subscription + subscribe(channel) { + const messageObject = { + subscribeChannel: channel + }; + return this.send(messageObject); + } + unsubscribe(channel) { + const messageObject = { + unsubscribeChannel: channel + }; + return this.send(messageObject); + } + // mailbox + requestMailbox() { + const messageObject = { + requestingMailboxSetup: true + }; + return this.send(messageObject); + } + connectMailbox(mailboxId2) { + const messageObject = { + requestedMailbox: mailboxId2 + }; + return this.send(messageObject); + } + deleteMailbox(mailboxId2) { + const messageObject = { + deletingMailbox: mailboxId2 + }; + return this.send(messageObject); + } + }; + + // static/src/translations.tsx + var staticTextEnglish = { + mailbox: "Mailbox", + requestMailbox: "Request", + deleteMailbox: "Delete", + mailboxConnected: "Mailbox active", + channel: "Channel", + channel_placeholder: "my-channel", + disconnected: "Server disconnected", + reconnecting: "Reconnecting...", + info: "Info", + message: "Message", + messages: "Messages", + message_placeholder: "Hello, world!", + message_placeholder_generic: "Type a message...", + noMessagesReceived: "No messages received", + messageLastReceived: "Last received message", + messagesReceived: "Received Messages", + send: "Send", + serverInfo: "Server Info", + settings: "Settings", + subscribeToChannel: "Subscribe to channel", + subscribe: "Subscribe", + unsubscribe: "Unubscribe" + }; + var allTranslations = { + en: staticTextEnglish, + es: { + mailbox: "Buz\xF3n", + requestMailbox: "Solicitar", + deleteMailbox: "Eliminar", + mailboxConnected: "Buz\xF3n activado", + channel: "Canal", + channel_placeholder: "mi-canal", + disconnected: "Sin coneci\xF3n", + reconnecting: "Conectando...", + info: "Info", + message: "Mensaje", + messages: "Mensajes", + message_placeholder: "Hola!", + message_placeholder_generic: "Nuevo mensaje", + noMessagesReceived: "Sin mensajes", + messageLastReceived: "\xDAltimo mensaje", + messagesReceived: "Todos los Mensajes", + send: "Enviar", + serverInfo: "Informaci\xF3n", + settings: "Configuraci\xF3n", + subscribeToChannel: "Suscribirse a un canal", + subscribe: "Suscribirse", + unsubscribe: "Cancelar" + }, + de: { + mailbox: "Briefkasten", + requestMailbox: "Beantragen", + deleteMailbox: "L\xF6schen", + mailboxConnected: "Briefkasten aktiv", + channel: "Kanal", + channel_placeholder: "mein-kanal", + disconnected: "Verbindung getrennt", + reconnecting: "Verbindung wird hergestellt...", + info: "Daten", + message: "Nachricht", + messages: "Nachrichten", + message_placeholder: "Hallo!", + message_placeholder_generic: "Neue Nachricht", + noMessagesReceived: "Keine Nachrichten", + messageLastReceived: "Letzte Nachricht", + messagesReceived: "Empfangene Nachrichten", + send: "Senden", + serverInfo: "Serverdaten", + settings: "Einstellungen", + subscribeToChannel: "Kanal beitreten", + subscribe: "Beitreten", + unsubscribe: "Verlassen" + } + }; + var language = navigator.language.substring(0, 2); + var translations = allTranslations[language]; + + // static/src/model.tsx + var Message = class { + constructor(channel, body) { + this.channel = channel; + this.body = body; + } + }; + var isDisconnected = new State(true); + var mailboxId = restoreState("mailbox-id", ""); + var isMailboxDisonnected = new State(true); + var messages = new ListState(); + var lastReceivedMessage = new State( + translations.noMessagesReceived + ); + var statHTMLString = new State(""); + async function updateStats() { + const response = await fetch( + `${window.location.protocol}//${window.location.host}/stats` ); - var UDN = new UDNFrontend(); - UDN.onconnect = () => { - isDisconnected.value = false; - updateStats(); - if (mailboxId.value != "") { - UDN.connectMailbox(mailboxId.value); - } - }; - UDN.onmessage = (data) => { - lastReceivedMessage.value = JSON.stringify(data, null, 4); - const { messageChannel, messageBody } = data; - if (messageChannel && messageBody) { - const messageObject = new Message(messageChannel, messageBody); - if (messageBody) messages.add(messageObject); - } - }; - UDN.onmailboxcreate = (id) => { - console.log(id); - mailboxId.value = id; - UDN.connectMailbox(id); - }; - UDN.onmailboxconnect = () => { - isMailboxDisonnected.value = false; - }; - UDN.onmailboxdelete = () => { - isMailboxDisonnected.value = true; - }; - UDN.ondisconnect = () => { - isDisconnected.value = true; - isMailboxDisonnected.value = true; - setTimeout(connect, 1e3); - }; - function connect() { - UDN.connect( - `${window.location.protocol.replace("http", "ws")}//${window.location.host}`, - ); + const data = await response.json(); + let html = ""; + data.forEach((item) => { + const tile = /* @__PURE__ */ createElement("div", { class: "tile" }, /* @__PURE__ */ createElement("div", { class: "flex-column align-start" }, /* @__PURE__ */ createElement("span", { class: "secondary flex width-100" }, item[0].toString()), ...item[1].toString().split("\n").map((string) => /* @__PURE__ */ createElement("b", null, string)))); + html += tile.outerHTML; + }); + statHTMLString.value = html; + } + var subscriptionChannel = new State(""); + var newMessageChannel = new State(""); + var newMessageBody = new State(""); + var isMessageEmpty = createProxyState( + [newMessageChannel, newMessageBody], + () => newMessageChannel.value == "" || newMessageBody.value == "" + ); + var UDN = new UDNFrontend(); + UDN.onconnect = () => { + isDisconnected.value = false; + updateStats(); + if (mailboxId.value != "") { + UDN.connectMailbox(mailboxId.value); } - connect(); - function subscribe() { - UDN.subscribe(subscriptionChannel.value); + }; + UDN.onmessage = (data) => { + lastReceivedMessage.value = JSON.stringify(data, null, 4); + const { messageChannel, messageBody } = data; + if (messageChannel && messageBody) { + const messageObject = new Message(messageChannel, messageBody); + if (messageBody) messages.add(messageObject); } - function unsubscribe() { - UDN.unsubscribe(subscriptionChannel.value); - } - function sendMessage() { - if (isMessageEmpty.value == true) return; - UDN.sendMessage(newMessageChannel.value, newMessageBody.value); - newMessageBody.value = ""; - } - function requestMailbox() { - UDN.requestMailbox(); - } - function deleteMailbox() { - console.log("test"); - UDN.deleteMailbox(mailboxId.value); - } - - // src/infoScreen.tsx - function InfoScreen() { - return /* @__PURE__ */ createElement( - "article", - { id: "info-screen" }, - /* @__PURE__ */ createElement( - "header", - null, - translations.serverInfo, - /* @__PURE__ */ createElement( - "span", - null, - /* @__PURE__ */ createElement( - "button", - { "on:click": updateStats }, - /* @__PURE__ */ createElement( - "span", - { class: "icon" }, - "refresh", - ), - ), - ), - ), - /* @__PURE__ */ createElement( - "div", - null, - /* @__PURE__ */ createElement("div", { - class: "flex-column gap", - "subscribe:innerHTML": statHTMLString, - }), - ), - ); - } - - // src/mainScreen.tsx - function MainScreen() { - return /* @__PURE__ */ createElement( - "article", - { id: "main-screen" }, - /* @__PURE__ */ createElement( - "header", - null, - translations.settings, - ), - /* @__PURE__ */ createElement( - "div", - null, - /* @__PURE__ */ createElement( - "div", - { class: "tile width-input" }, - /* @__PURE__ */ createElement( - "div", - null, - /* @__PURE__ */ createElement( - "b", - null, - translations.messageLastReceived, - ), - /* @__PURE__ */ createElement("p", { - class: "secondary", - "subscribe:innerText": lastReceivedMessage, - }), - ), - ), - /* @__PURE__ */ createElement("hr", null), - /* @__PURE__ */ createElement( - "div", - { class: "tile width-input" }, - /* @__PURE__ */ createElement( - "div", - null, - /* @__PURE__ */ createElement( - "b", - null, - translations.mailbox, - ), - /* @__PURE__ */ createElement( - "p", - { - class: "secondary", - "toggle:hidden": isMailboxDisonnected, - }, - translations.mailboxConnected, - ), - ), - ), - /* @__PURE__ */ createElement( - "div", - { class: "flex-row width-input justify-end" }, - /* @__PURE__ */ createElement( - "button", - { - class: "danger width-50", - "on:click": deleteMailbox, - "toggle:disabled": isMailboxDisonnected, - }, - translations.deleteMailbox, - ), - /* @__PURE__ */ createElement( - "button", - { - class: "primary width-50", - "on:click": requestMailbox, - "toggle:disabled": isDisconnected, - }, - translations.requestMailbox, - /* @__PURE__ */ createElement( - "span", - { class: "icon" }, - "inbox", - ), - ), - ), - /* @__PURE__ */ createElement("hr", null), - /* @__PURE__ */ createElement( - "label", - { class: "tile" }, - /* @__PURE__ */ createElement( - "div", - null, - /* @__PURE__ */ createElement( - "span", - null, - translations.subscribeToChannel, - ), - /* @__PURE__ */ createElement("input", { - placeholder: translations.channel_placeholder, - "bind:value": subscriptionChannel, - "on:enter": subscribe, - }), - ), - ), - /* @__PURE__ */ createElement( - "div", - { class: "flex-row width-input justify-end" }, - /* @__PURE__ */ createElement( - "button", - { class: "danger width-50", "on:click": unsubscribe }, - translations.unsubscribe, - ), - /* @__PURE__ */ createElement( - "button", - { class: "primary width-50", "on:click": subscribe }, - translations.subscribe, - /* @__PURE__ */ createElement( - "span", - { class: "icon" }, - "arrow_forward", - ), - ), - ), - /* @__PURE__ */ createElement("hr", null), - /* @__PURE__ */ createElement( - "label", - { class: "tile" }, - /* @__PURE__ */ createElement( - "div", - null, - /* @__PURE__ */ createElement( - "span", - null, - translations.channel, - ), - /* @__PURE__ */ createElement("input", { - placeholder: translations.channel_placeholder, - "bind:value": newMessageChannel, - "on:enter": sendMessage, - }), - ), - ), - /* @__PURE__ */ createElement( - "label", - { class: "tile" }, - /* @__PURE__ */ createElement( - "div", - null, - /* @__PURE__ */ createElement( - "span", - null, - translations.message, - ), - /* @__PURE__ */ createElement("input", { - placeholder: translations.message_placeholder, - "bind:value": newMessageBody, - "on:enter": sendMessage, - }), - ), - ), - /* @__PURE__ */ createElement( - "div", - { class: "flex-row width-input justify-end" }, - /* @__PURE__ */ createElement( - "button", - { - class: "primary width-50", - "on:click": sendMessage, - "toggle:disabled": isMessageEmpty, - }, - translations.send, - /* @__PURE__ */ createElement( - "span", - { class: "icon" }, - "send", - ), - ), - ), - ), - ); - } - - // src/messageScreen.tsx - var convertMessageToElement = (message) => { - return /* @__PURE__ */ createElement( - "div", - { class: "tile", style: "flex: 0" }, - /* @__PURE__ */ createElement( - "div", - null, - /* @__PURE__ */ createElement( - "span", - { class: "secondary" }, - message.channel, - ), - /* @__PURE__ */ createElement("b", null, message.body), - ), - ); - }; - function MessageScreen() { - return /* @__PURE__ */ createElement( - "article", - { id: "message-screen" }, - /* @__PURE__ */ createElement( - "header", - null, - translations.messagesReceived, - ), - /* @__PURE__ */ createElement( - "div", - null, - /* @__PURE__ */ createElement("div", { - class: "flex-column gap", - "subscribe:children": [messages, convertMessageToElement], - }), - ), - /* @__PURE__ */ createElement( - "footer", - null, - /* @__PURE__ */ createElement("input", { - style: "max-width: unset", - placeholder: translations.message_placeholder_generic, - "bind:value": newMessageBody, - "on:enter": sendMessage, - }), - /* @__PURE__ */ createElement( - "button", - { - class: "primary", - "on:click": sendMessage, - "toggle:disabled": isMessageEmpty, - }, - /* @__PURE__ */ createElement( - "span", - { class: "icon" }, - "send", - ), - ), - ), - ); - } - - // src/index.tsx - document.body.prepend( - /* @__PURE__ */ createElement( - "menu", - null, - /* @__PURE__ */ createElement( - "a", - { class: "tab-link", href: "#info-screen", active: true }, - /* @__PURE__ */ createElement( - "span", - { class: "icon" }, - "info", - ), - translations.info, - ), - /* @__PURE__ */ createElement( - "a", - { class: "tab-link", href: "#main-screen" }, - /* @__PURE__ */ createElement( - "span", - { class: "icon" }, - "settings", - ), - translations.settings, - ), - /* @__PURE__ */ createElement( - "a", - { class: "tab-link", href: "#message-screen" }, - /* @__PURE__ */ createElement( - "span", - { class: "icon" }, - "chat", - ), - translations.messages, - ), - ), - ); - document - .querySelector("main") - .append(InfoScreen(), MainScreen(), MessageScreen()); - document.body.append( - /* @__PURE__ */ createElement( - "div", - { class: "modal", "toggle:open": isDisconnected }, - /* @__PURE__ */ createElement( - "div", - null, - /* @__PURE__ */ createElement( - "main", - null, - /* @__PURE__ */ createElement( - "div", - { - class: "flex-column align-center justify-center width-100 height-100", - style: "gap: 1rem", - }, - /* @__PURE__ */ createElement( - "span", - { class: "icon error", style: "font-size: 3rem" }, - "signal_disconnected", - ), - /* @__PURE__ */ createElement( - "h1", - { class: "error" }, - translations.disconnected, - ), - /* @__PURE__ */ createElement( - "p", - { class: "secondary" }, - translations.reconnecting, - ), - ), - ), - ), - ), + }; + UDN.onmailboxcreate = (id) => { + console.log(id); + mailboxId.value = id; + UDN.connectMailbox(id); + }; + UDN.onmailboxconnect = () => { + isMailboxDisonnected.value = false; + }; + UDN.onmailboxdelete = () => { + isMailboxDisonnected.value = true; + }; + UDN.ondisconnect = () => { + isDisconnected.value = true; + isMailboxDisonnected.value = true; + setTimeout(connect, 1e3); + }; + function connect() { + UDN.connect( + `${window.location.protocol.replace("http", "ws")}//${window.location.host}` ); + } + connect(); + function subscribe() { + UDN.subscribe(subscriptionChannel.value); + } + function unsubscribe() { + UDN.unsubscribe(subscriptionChannel.value); + } + function sendMessage() { + if (isMessageEmpty.value == true) return; + UDN.sendMessage(newMessageChannel.value, newMessageBody.value); + newMessageBody.value = ""; + } + function requestMailbox() { + UDN.requestMailbox(); + } + function deleteMailbox() { + UDN.deleteMailbox(mailboxId.value); + } + + // static/src/infoScreen.tsx + function InfoScreen() { + return /* @__PURE__ */ createElement("article", { id: "info-screen" }, /* @__PURE__ */ createElement("header", null, translations.serverInfo, /* @__PURE__ */ createElement("span", null, /* @__PURE__ */ createElement("button", { "on:click": updateStats }, /* @__PURE__ */ createElement("span", { class: "icon" }, "refresh")))), /* @__PURE__ */ createElement("div", null, /* @__PURE__ */ createElement( + "div", + { + class: "flex-column gap", + "subscribe:innerHTML": statHTMLString + } + ))); + } + + // static/src/mainScreen.tsx + function MainScreen() { + return /* @__PURE__ */ createElement("article", { id: "main-screen" }, /* @__PURE__ */ createElement("header", null, translations.settings), /* @__PURE__ */ createElement("div", null, /* @__PURE__ */ createElement("div", { class: "tile width-input" }, /* @__PURE__ */ createElement("div", null, /* @__PURE__ */ createElement("b", null, translations.messageLastReceived), /* @__PURE__ */ createElement( + "p", + { + class: "secondary", + "subscribe:innerText": lastReceivedMessage + } + ))), /* @__PURE__ */ createElement("hr", null), /* @__PURE__ */ createElement("div", { class: "tile width-input" }, /* @__PURE__ */ createElement("div", null, /* @__PURE__ */ createElement("b", null, translations.mailbox), /* @__PURE__ */ createElement( + "p", + { + class: "secondary", + "toggle:hidden": isMailboxDisonnected + }, + translations.mailboxConnected + ))), /* @__PURE__ */ createElement("div", { class: "flex-row width-input justify-end" }, /* @__PURE__ */ createElement( + "button", + { + class: "danger width-50", + "on:click": deleteMailbox, + "toggle:disabled": isMailboxDisonnected + }, + translations.deleteMailbox + ), /* @__PURE__ */ createElement( + "button", + { + class: "primary width-50", + "on:click": requestMailbox, + "toggle:disabled": isDisconnected + }, + translations.requestMailbox, + /* @__PURE__ */ createElement("span", { class: "icon" }, "inbox") + )), /* @__PURE__ */ createElement("hr", null), /* @__PURE__ */ createElement("label", { class: "tile" }, /* @__PURE__ */ createElement("div", null, /* @__PURE__ */ createElement("span", null, translations.subscribeToChannel), /* @__PURE__ */ createElement( + "input", + { + placeholder: translations.channel_placeholder, + "bind:value": subscriptionChannel, + "on:enter": subscribe + } + ))), /* @__PURE__ */ createElement("div", { class: "flex-row width-input justify-end" }, /* @__PURE__ */ createElement("button", { class: "danger width-50", "on:click": unsubscribe }, translations.unsubscribe), /* @__PURE__ */ createElement("button", { class: "primary width-50", "on:click": subscribe }, translations.subscribe, /* @__PURE__ */ createElement("span", { class: "icon" }, "arrow_forward"))), /* @__PURE__ */ createElement("hr", null), /* @__PURE__ */ createElement("label", { class: "tile" }, /* @__PURE__ */ createElement("div", null, /* @__PURE__ */ createElement("span", null, translations.channel), /* @__PURE__ */ createElement( + "input", + { + placeholder: translations.channel_placeholder, + "bind:value": newMessageChannel, + "on:enter": sendMessage + } + ))), /* @__PURE__ */ createElement("label", { class: "tile" }, /* @__PURE__ */ createElement("div", null, /* @__PURE__ */ createElement("span", null, translations.message), /* @__PURE__ */ createElement( + "input", + { + placeholder: translations.message_placeholder, + "bind:value": newMessageBody, + "on:enter": sendMessage + } + ))), /* @__PURE__ */ createElement("div", { class: "flex-row width-input justify-end" }, /* @__PURE__ */ createElement( + "button", + { + class: "primary width-50", + "on:click": sendMessage, + "toggle:disabled": isMessageEmpty + }, + translations.send, + /* @__PURE__ */ createElement("span", { class: "icon" }, "send") + )))); + } + + // static/src/messageScreen.tsx + var convertMessageToElement = (message) => { + return /* @__PURE__ */ createElement("div", { class: "tile", style: "flex: 0" }, /* @__PURE__ */ createElement("div", null, /* @__PURE__ */ createElement("span", { class: "secondary" }, message.channel), /* @__PURE__ */ createElement("b", null, message.body))); + }; + function MessageScreen() { + return /* @__PURE__ */ createElement("article", { id: "message-screen" }, /* @__PURE__ */ createElement("header", null, translations.messagesReceived), /* @__PURE__ */ createElement("div", null, /* @__PURE__ */ createElement( + "div", + { + class: "flex-column gap", + "subscribe:children": [messages, convertMessageToElement] + } + )), /* @__PURE__ */ createElement("footer", null, /* @__PURE__ */ createElement( + "input", + { + style: "max-width: unset", + placeholder: translations.message_placeholder_generic, + "bind:value": newMessageBody, + "on:enter": sendMessage + } + ), /* @__PURE__ */ createElement( + "button", + { + class: "primary", + "on:click": sendMessage, + "toggle:disabled": isMessageEmpty + }, + /* @__PURE__ */ createElement("span", { class: "icon" }, "send") + ))); + } + + // static/src/index.tsx + document.body.prepend( + /* @__PURE__ */ createElement("menu", null, /* @__PURE__ */ createElement("a", { class: "tab-link", href: "#info-screen", active: true }, /* @__PURE__ */ createElement("span", { class: "icon" }, "info"), translations.info), /* @__PURE__ */ createElement("a", { class: "tab-link", href: "#main-screen" }, /* @__PURE__ */ createElement("span", { class: "icon" }, "settings"), translations.settings), /* @__PURE__ */ createElement("a", { class: "tab-link", href: "#message-screen" }, /* @__PURE__ */ createElement("span", { class: "icon" }, "chat"), translations.messages)) + ); + document.querySelector("main").append(InfoScreen(), MainScreen(), MessageScreen()); + document.body.append( + /* @__PURE__ */ createElement("div", { class: "modal", "toggle:open": isDisconnected }, /* @__PURE__ */ createElement("div", null, /* @__PURE__ */ createElement("main", null, /* @__PURE__ */ createElement( + "div", + { + class: "flex-column align-center justify-center width-100 height-100", + style: "gap: 1rem" + }, + /* @__PURE__ */ createElement("span", { class: "icon error", style: "font-size: 3rem" }, "signal_disconnected"), + /* @__PURE__ */ createElement("h1", { class: "error" }, translations.disconnected), + /* @__PURE__ */ createElement("p", { class: "secondary" }, translations.reconnecting) + )))) + ); })(); diff --git a/static/src/model.tsx b/static/src/model.tsx index 6807e54..8c99e0b 100644 --- a/static/src/model.tsx +++ b/static/src/model.tsx @@ -36,10 +36,15 @@ export async function updateStats() { data.forEach((item) => { const tile = (
- - {item[0].toString()} - - {item[1].toString()} +
+ + {item[0].toString()} + + {...item[1] + .toString() + .split("\n") + .map((string) => {string})} +
); html += tile.outerHTML; diff --git a/utility.ts b/utility.ts index a1f0fa9..5976688 100644 --- a/utility.ts +++ b/utility.ts @@ -36,16 +36,14 @@ async function writeToLogFile(message: string): Promise { } // stats -export function writeStatString(label: string, value: string): void { +export function writeStat(label: string, value: string | number): void { console.log( - `${label.padEnd(STAT_INDENT, " ")} ${Colors.bold.green(value)}`, + `${Colors.bold.green(label.padEnd(STAT_INDENT, " "))}\n${value.toString()}\n` ); } -export function writeStatNumber(label: string, value: number): void { - console.log( - `${label.padEnd(STAT_INDENT, " ")} ${Colors.bold.blue(value.toString())}`, - ); +export function writeSeparator(): void { + console.log(Colors.gray("-----") + "\n") } // logging diff --git a/websocket-handler.ts b/websocket-handler.ts index 454b297..a8a9911 100644 --- a/websocket-handler.ts +++ b/websocket-handler.ts @@ -51,10 +51,6 @@ export const serversConnectedAsClient = new Set(); export const serversConnected = new Set(); export const serversDisconnected = new Set(); -export function getServerCount() { - return serversConnected.size + serversConnectedAsClient.size; -} - export function trackConnection(ws: WS) { clientsConnected.add(ws); } @@ -82,13 +78,18 @@ export function forgetSubscription( } // AUDIT -export function getWebSocketStats(): [string, number][] { +export function getWebSocketStats(): [string, string|number][] { + function listString(list: Set|Map, map: (x: T) => string): string { + if (list.size == 0) return ""; + return [...list.values()].map(map).join("\n"); + } + return [ ["channels", subscriptionMap.subscribersPerChannel.size], ["clients connected", clientsConnected.size], - ["mailboxes", mailboxes.size], - ["servers connected", getServerCount()], - ["servers disconnected", serversDisconnected.size], + ["mailboxes", listString(mailboxes, x => x.id)], + ["servers connected", listString(serversConnected, x => x.url)], + ["servers disconnected", listString(serversDisconnected, x => x)], ]; }