From 08e698d409920eedc702b7f273c60f21e54c3cc3 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Abdussamed=20ULUTA=C5=9E?= Date: Sun, 27 Nov 2022 19:36:47 +0300 Subject: [PATCH 01/37] Add typescriot --- package-lock.json | 18 +++++ package.json | 1 + script/status.xml | 29 ------- script/wsjs.js | 194 ---------------------------------------------- tsconfig.json | 107 +++++++++++++++++++++++++ 5 files changed, 126 insertions(+), 223 deletions(-) delete mode 100644 script/status.xml delete mode 100644 script/wsjs.js create mode 100644 tsconfig.json diff --git a/package-lock.json b/package-lock.json index 4b875d3..289300d 100644 --- a/package-lock.json +++ b/package-lock.json @@ -15,6 +15,7 @@ "knex": "^2.3.0", "sqlite3": "^5.1.2", "terminal-kit": "^3.0.0", + "typescript": "^4.9.3", "websocket": "^1.0.34" } }, @@ -2174,6 +2175,18 @@ "is-typedarray": "^1.0.0" } }, + "node_modules/typescript": { + "version": "4.9.3", + "resolved": "https://registry.npmjs.org/typescript/-/typescript-4.9.3.tgz", + "integrity": "sha512-CIfGzTelbKNEnLpLdGFgdyKhG23CKdKgQPOBc+OUNrkJ2vr+KSzsSV5kq5iWhEQbok+quxgGzrAtGWCyU7tHnA==", + "bin": { + "tsc": "bin/tsc", + "tsserver": "bin/tsserver" + }, + "engines": { + "node": ">=4.2.0" + } + }, "node_modules/uniq": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/uniq/-/uniq-1.0.1.tgz", @@ -3995,6 +4008,11 @@ "is-typedarray": "^1.0.0" } }, + "typescript": { + "version": "4.9.3", + "resolved": "https://registry.npmjs.org/typescript/-/typescript-4.9.3.tgz", + "integrity": "sha512-CIfGzTelbKNEnLpLdGFgdyKhG23CKdKgQPOBc+OUNrkJ2vr+KSzsSV5kq5iWhEQbok+quxgGzrAtGWCyU7tHnA==" + }, "uniq": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/uniq/-/uniq-1.0.1.tgz", diff --git a/package.json b/package.json index 8518325..be22882 100644 --- a/package.json +++ b/package.json @@ -25,6 +25,7 @@ "knex": "^2.3.0", "sqlite3": "^5.1.2", "terminal-kit": "^3.0.0", + "typescript": "^4.9.3", "websocket": "^1.0.34" } } diff --git a/script/status.xml b/script/status.xml deleted file mode 100644 index 78ea849..0000000 --- a/script/status.xml +++ /dev/null @@ -1,29 +0,0 @@ - - - - - 304e17d899c067afe3c439f92c5bd29869dfbde06ceca4f65e2128a93e7366c078bb0af1b14cb516008683df14c00107cadcce4d980f149da932bdba4a9892841b004ae877b2c7733e2d326d5586a4b2225384afbab6d00900852f5feb47ebd234ad95ec6957dbbbe585c86126f02e47cff3dc6d4ac9d321efbbd39a28655110fa850caca24a9b82984b60d0c517f3d8400594a17ba4a5fd0fcf19711c4b0ef503d698e8597c841eb099118d23e8cc8bc4db907d5093ca73e68f85c3dae629876b5d2fa49ed283591972559ae7da1b99489715c355f068c689c7cb4690ea4d4f3d1f364367b352bd74a0a57a541bfac90fe69d9b6d2fe941707c7316b067f5287c6aff01c86cbb23c2ac5e202cb497c203437c80159454b20dcadec7f2080b286c6b4e76826952b963f856e3c7e9ad89e50b76e2dd22f7bc1fbc8366a965cb76dc862d5c9b5b52802e431d2490079a7396db1bc279099a68a9b250135020e3906bc8c159b773a7dbb3d5beb54a30746fc776a07aeeb4f1f170d688b15742f530901959e4a4cd8ed869249e95a58c3cc45bc323aee66aec9090f4c938411c348b72d6ae4c3169c0049d84e88f4c26318136353db77519d7c060df07f7da78df71f13ed7be5916b2973fa712b4d826527911a04923dc763630306d04e09229584370e670c24d6af48bee2ead5525f55b8bd66083314b11d1dede385bfbdcaacd0b577c1d37f7bbcbb8d24f461723713570537abbcdfd8b96c9dcfc0f8c0afd7e6e43620dbfb88442cacd15a6cb28ee2d318e56d023af40a832010e8e2cb1d2d5223fd465616094fca6fecd92ff66e398f3ac8ac091beb3635dfacea5147848514c94ecdc011180cda61f977f9c59265682c77dc7af662e1c50386ac50835c6802adb86f941ec3d05316e505f7183bf8dc048685af48f6514726d993e789cfe13e28bd0ce7ea0e0e97f19364ec8567e63f28afcdf07de02fa8c79a850ffc4e9da3786ecec269aff4995ed5e3029a2abcba65ba62990e0842714688ca48162510449ebaf80878405c7373534aa6e688f4c56569f15e349272db874f3846eb3cea77f8de261628c285e93ff7c38aba3d65df19bf8dd8732068e817e90b92ddf7be29ec844f6b90af2547daf00093e4f2241c2d419e60c9b6d64e4278a2baa0a0396e98ccafebd131a6c5374baaf4a3e715c6c4d2c647de1cd0610cf9bcf3a9e857bef77a0ed51dc297ba914a5c41c5243cc72308b9de7908ec8955b52c9328b1d8efdd28d570c010f1329b7f0c40669004dc77cc87a34348310f444ba799fb0ed00687ae16681dc7eab7d1884213b59ff1e2e3cefa64676587fd37db308f4de795cb46b468948e38d340981e32ca2222cbff42bc3852f1657a690bfba8b918cfa05bd3f6a7bbc284e15ba39b114e8619b666748325e0b87514eff2b48a70ea906ca0ecf6f0f2c6438ffa8106239b94231f008339069fd420978e0f8103c94fcfb8a48018353443e8cbe131dc4261ef79945471cdaec9868954e420f4f43f738c098e3ee3378c5890409bc9e4f191e85f3318c5a125f48e8bc3a9eb67f413742c2b030847b3461bd9659e62af48aca3a456ae4f99beacd3df943608956fbadde816733edc9f2a107a8d92592b9690aeb69b48bfd9231ba345f1c71dcb6aae1c13cf1ab91942938db056a1569c6399cf57dd02032ef43f64f6e3ee3de56d11b7dc07f3bdb899714b912d6e8a45be8e2f6413ad51ef93aa75c5bd9c4a8c86231b31a5e68892bc8ec01de40db5d6ec87160c8d5d14b3725160407a9a7484bb794dee73e0a87cceeb874ed6d96941406f18b8634886c23d5be' - - - 304e17d899c067afe3c439f92c5bd29869dfbde06ceca4f65e2128a93e7366c078bb0af1b14cb516008683df14c00107cadcce4d980f149da932bdba4a9892841b004ae877b2c7733e2d326d5586a4b2225384afbab6d00900852f5feb47ebd234ad95ec6957dbbbe585c86126f02e47cff3dc6d4ac9d321efbbd39a28655110fa850caca24a9b82984b60d0c517f3d8400594a17ba4a5fd0fcf19711c4b0ef503d698e8597c841eb099118d23e8cc8bc4db907d5093ca73e68f85c3dae629876b5d2fa49ed283591972559ae7da1b99489715c355f068c689c7cb4690ea4d4f3d1f364367b352bd74a0a57a541bfac90fe69d9b6d2fe941707c7316b067f5287c6aff01c86cbb23c2ac5e202cb497c203437c80159454b20dcadec7f2080b286c6b4e76826952b963f856e3c7e9ad89e50b76e2dd22f7bc1fbc8366a965cb76dc862d5c9b5b52802e431d2490079a7396db1bc279099a68a9b250135020e3906bc8c159b773a7dbb3d5beb54a30746fc776a07aeeb4f1f170d688b15742f530901959e4a4cd8ed869249e95a58c3cc45bc323aee66aec9090f4c938411c348b72d6ae4c3169c0049d84e88f4c26318136353db77519d7c060df07f7da78df71f13ed7be5916b2973fa712b4d826527911a04923dc763630306d04e09229584370e670c24d6af48bee2ead5525f55b8bd66083314b11d1dede385bfbdcaacd0b577c1d37f7bbcbb8d24f461723713570537abbcdfd8b96c9dcfc0f8c0afd7e6e43620dbfb88442cacd15a6cb28ee2d318e56d023af40a832010e8e2cb1d2d5223fd465616094fca6fecd92ff66e398f3ac8ac091beb3635dfacea5147848514c94ecdc011180cda61f977f9c59265682c77dc7af662e1c50386ac50835c6802adb86f941ec3d05316e505f7183bf8dc048685af48f6514726d993e789cfe13e28bd0ce7ea0e0e97f19364ec8567e63f28afcdf07de02fa8c79a850ffc4e9da3786ecec269aff4995ed5e3029a2abcba65ba62990e0842714688ca48162510449ebaf80878405c7373534aa6e688f4c56569f15e349272db874f3846eb3cea77f8de261628c285e93ff7c38aba3d65df19bf8dd8732068e817e90b92ddf7be29ec844f6b90af2547daf00093e4f2241c2d419e60c9b6d64e4278a2baa0a0396e98ccafebd131a6c5374baaf4a3e715c6c4d2c647de1cd0610cf9bcf3a9e857bef77a0ed51dc297ba914a5c41c5243cc72308b9de7908ec8955b52c9328b1d8efdd28d570c010f1329b7f0c40669004dc77cc87a34348310f444ba799fb0ed00687ae16681dc7eab7d1884213b59ff1e2e3cefa64676587fd37db308f4de795cb46b468948e38d340981e32ca2222cbff42bc3852f1657a690bfba8b918cfa05bd3f6a7bbc284e15ba39b114e8619b666748325e0b87514eff2b48a70ea906ca0ecf6f0f2c6438ffa8106239b94231f008339069fd420978e0f8103c94fcfb8a48018353443e8cbe131dc4261ef79945471cdaec9868954e420f4f43f738c098e3ee3378c5890409bc9e4f191e85f3318c5a125f48e8bc3a9eb67f413742c2b030847b3461bd9659e62af48aca3a456ae4f99beacd3df943608956fbadde816733edc9f2a107a8d92592b9690aeb69b48bfd9231ba345f1c71dcb6aae1c13cf1ab91942938db056a1569c6399cf57dd02032ef43f64f6e3ee3de56d11b7dc07f3bdb899714b912d6e8a45be8e2f6413ad51ef93aa75c5bd9c4a8c86231b31a5e68892bc8ec01de40db5d6ec87160c8d5d14b3725160407a9a7484bb794dee73e0a87cceeb874ed6d96941406f18b8634886c23d5be' - - - 35b9ea4d98445d6fda595e42c921269e0699ed78a2655b169fcaffef66521e649c1818cb71fb5a2ef4c0f453786de08c9cf81cdc4f6bcb8a7af68f23d9a4b3dc4a84950a13261e929ef4aa41a53819b8fc98582250533b476e46d6d0894a0003f315a6d8612d2d46eebe367330ae4587635daa4d4b929a33de91dfdb30b1aa3b3bded0ab06741786b19564b74e3b0d86a3d056bf9662fa004d2609a62b862caea7f6448a5257689a0de69798ac8eaf6186799c1e5de7ba124493365a76ded957d0f133190608b49c940cd7db6bdcb6b98739dfe6dc44b4736ebb10a3563ac7a4c6c63177cb292f32be6be3041cd2c27fef4c9f3ec2005041f80df142941185c57114d90500c744d9442f4507e43c91bbacc4205ee8dc4dbbc0656a6bf948309c446ffc67844f8e49171672ebbf380368979e20dcd114f889936f5a6ae0fdc393d4292659ee8f00070c0b6f01781e9c9d64a1ef7dc43912de5666d2f3495d9e4f3b478621e0e7e2ade6728e2de162aaf06b000ef5c514ba8004ed28cdbb9893a2b9e024a3ffedf98b920ff94130f31775cbc6a4f7a0dd361c40a8ca0956bf7fa4047bb00ab51c8aae729cce29a5427b8f80e28fcd5163a6f070c654ef05b85671fd1c9a2a2e52e8737b3cc04d6e95e0690b5e7d711b23c45a065f66193ab6d070a23efa56654f9427ec05e4e32a79e43869db3f3b61ca5c4fed04f2926e4bdb99367b15068868d0fb232359ea3c9e9c64150b4058a592b59943a7e23b69813bf08e637cca4ea1e5e996613a1db2684386a5e5f0dcbbea04b312f69512bab31db7e9ef94b6905a79690193f7289851821d135974af3696a2e0439585a960b3d8a31568bca8de1271a14cd30ed1a7b85adf23f9d76f5b62149242296677fea61288a4b58d2e38889b2bbd9926672df36b46fd6463bf0c0f7b1db1a7312071ef8e39a5a7deea4e47b6cda985de2cc5133337633b3db6d0cb54d56795a8a76fef2edf93debc3cbea6d0b902a0c710e73fa443c4842ec1646b4934514d2700eaa48b1320f0477f992ac0849bfd1fa628fd2b85a8997c5c2128bcb8135718b62180ede1ee8d4bf375c053a5419173b6adf54ab6f5943a377f7b2b4b81807fba3460b6acd28ef6d4be2bb015d9d5ea9b3c2d22389d7c688dd871e0a9fe295389711bf19804eeb68a86204fed691fe7493db9e0d2bce3f6ae4df5debe4cd4b4c668111146dc82b638080da9fa26d47d00f37538ee2a4a2930d39d1f734537a79d0d34f6cfab7893e2ebe71ec110e82f63a7d5c246737acadf1fc75c777faaa150164fc204c7ad3261fc9563a1b5bac908905d53fb7f37060dc1c5750634b200b31fbfaf4de1fefbc687b4c808968065e9cb567f003e1bd06b77e6442a7e5d3f54ff98d12d03d3f8705fdeb9614764acd153fc15a8763e5dc95e2c19ce478b8da93744680f2bfca75e50bebabc0cbb609575bb1000141dc35da3f4b5f5141899ff9ef856b7904baf5a828d2e4f576a58e505c5c9f3e5bc0e1ecfaf4ef36a7dee842aaf155db65912cd8dfccd11b188f5da5ea10035d47f17e0996791b0aacefa38799708198e4780846c7b1cf60aa9172a3a5935338bdb71e33a20b96181e487dd5caeeeff0446bc945ac2a83c3ca0ded82939d314073711c2afce8cc2a94fc6d46e28ea5bbafcd6adb517dedc9fa99446be727718bc41122214b6b788641e785ba0bee6530c61f9a9a58c14c6a5c477fd6f2117c67b1a2d8ca20e3aaef5c2d4e1f2b525fc8516ac90654880e72b4d87916e76592691d154a89f4125db6d9635e553955797f77ec00797f130f43b6245bf97cb88c93a641c78cbc352cf4816b075c81133cff364f4120399e3beb8cb6aae362a33de38c0d14d919a1939c00d46cd7ec2368620378fa490dd7d746361df3ee49b19a848035f619b08a66271fd97cb805ec834d85355495f003e39b6284b1ff52d5fbfeca7f7676f2a780c0b649abe6574da5867b2949af7d01e33fb9ffdee - - - 2fe9827b8286e6e5329cc9af2bb910f78b57ec5d073e6ef061360d7103f1c38245e04f804f431da3b51887a6e16cfee2a69534f4ab8ded57b74029beba7ccd2347b962d8f0d2d8bc93771a52ef4688fdf9759d33be9ba18b306a86fd3848b8ca8fe61abdd9ea2b9018c31554122172488166517e67276384b23239f02f4b5c4d8290dc542f0af54a66874a34bb8cd6114d7d5bce7404294f2c41ec20b85b942e5dca6e7b94fdea2e3dcd98777d0d7b631246c2222b69bd0547dc56d4c7990e0f803c32593cd218f4d655998ddd90e488a5d12aa7ef868f7641dc6a6df0bb0abfc0e76335ab682d909d117d863c90f6e21ebdb3ff8a7126bde4b14c524afe31fad20d1b000356cd25ab2276a2adf82638a5bf20304e2ad1a2f28cd7490e818fbec3566514cdeb412ce63d421738b038e40f70073d50352307de058b40d6215f6af1ce09cf6b954be69c7ef0f8030449a20faa5c2dd9b8d0f1adf911371156dc65b470fb02a092975af2f9080f689dd56cc3cd0f4c0434537e32b80cc22bd19743b1145d713422fed681b3bb9a09c5e5ec8f739631a8ffe2a49cebb2f13634b9414da48845948473616f18814447f63e018015b3d385cc592cc80c1f5a54d04029766572be94991d3e96b952961813e35fdc3f86a2d5fbfcd48a12d531be0f68ffcf48f1eb0e14623a6cfbdea026dd766fab9bbbc442468e6559d934959f0643c963c0799fcc3f98ccfa38b84cfb962a77cf5008037c81934425f0d7f4d1b7093adfc109918a7a130f1b3d5073a1517ac1c5b6dfe962917c8704e0d94d68795355f4ac341f84124bddd270c1da1a180ca101fb5f0bd4204e11461dce54d96827dcaa3e3a3889a621734268cf27ac18fe8c0df23108f3ef949fc68fd54122f3ea5fd5b2131b1ab7264006d730a7c4b90493b6858d78f5dfcf2cddbe8f1aa2b5da1de0580862ae16e01c5bce21a537ce0a8dfec8379c5152c0a3af41e09b7d35ed8920ad0f01abf1495b6e3e565cc8734ecf22a839212626f8f46cee5b90a742d43c2de2a280a2b1ffbe7e8285d8632bbf1137c28590f0420b3e75809c71f8b0e9bd8ed8995ba81003386d9c206ff5d3db014353d9565d1ac859f9335146cd3d2c8a04b4c3a1e7fa2e37a067ea2cb8fd4826010ecc5915114301fd7b2c7c72a222618c424797fe690cc9af7bc0a609c17a1dc8de4603df8ecbcc08d09bdd382b440fb29d11c822319b8572727592915fdcc1d9f7f3a025bec58834d5c55505c8013a5daf7f6e312b509500c2adc8e664c56031666124ab3f997185ae4f9286e7e6760ca8a106484fc68e50da961819fce231fca20330729b80be767c75006b1f8b796d60da0636d8fec8bd4c69671a8681f11f21f2b104ab4961c50b50f6b2b5fc59f78b674de891652d91f32ba60deaabf554158a38989438b67fb1713a14b4a2b58843a8b2df832d0969309f23ce4e07504a6be8aba05d8d79af93f41cf70fe0ef7b20ad603e4bd4c9261b0c3a007b46663c7b16ad77e8b8029d4d76fc4941205134d4cc9b7b7f9cc961ce5651afe8b308fa982cfdd57e9c21e1c65b2e906001f98f63cea267c44032c28348655541242b2092bfe8cb521bc491d376d989baa75c8f3c588089956f0736a71245c7acf0654dbaaad04803f8d8096d9a2c786a4c96ab99e4bc38119171839b718cffba4f8503d624cdfc2209597505da520878e2a10a9a7b0cd1e54ca09cf8c1ec9898735ea38e0886c940d8390d4581d205e4d9eb03d280071c6428bcee962122094af10e3784150651c5c4a583d8814c9e14810e021c659bf8cb66f82141d9a87248b20cba5cc212b2c0cd6dd085e690e549b31376babf1f3b19581956e26b1107f198975502 - - - 74f4e96bbc0f84de1f5f481c7e3257243edfcec173663557469a90ef23c067b8606774b867568db7dfe5209aada24cc96fcf93faa7a95180ffe2a20154898e82b27e27d01358c42c1857f9bdcb4a83ee1709226e2fc117c3a93cd3cb139777fc9295b4602c5d7c76f5a47d2f574009959a274f49d36e7435ed61e755768551859dfc34277df224c2dc9365112b9459e26235e7ce8619d0d1457954de93f604a200b0e9368b53aa7a3313b4f020d28625c646b6ca7bc6feadc7297b5a51f7eeb77adb016f346ca3bd2f4878a92dcef4abad57b0e5c8a10087f717e813892f55ed4e248cc6bdf0ea1edcaa1d42adbec7d2832c184d2185fdb66f0ee0043ce0a6035a151b22d81eafcf4cf9a8ce962e6ce1f6571b6df0a86dc221b770974f5bbfe960efbfb8c148f590584fbefae0b5cb95545bf69e4e5c9a39b431155649468ef093127aba424654ee0bb46d194ad17e61b022c43671dfef0eae98ec6ba6cd2924279fb592ac1d3babb61c0befddf6521efc38d4d75007499864cced0c8ee14cb5fd37b79626f636753b585ccfcf583ee92784850f0cacd3389c3546827bf3e7ef2719b25819f0208dcf7c3493edfc048a6fa3d35511e6f9c2a367cb87ad74c0f41bf853b6ba35f51fadfd5632012bde0180585dff6a7f114a2a958ce7ecbe484304dba2f138a86c4b0aad337c0047b1cb9dcd358300155d09b72d6c0ed4c53778e86fbdc7674d37a1441c1d38bf8f4c9976540090575863c41a8211c9b9450f28edd514ed8d51e3565de2fd30d6f0bf02fcfb79319ff04e7c4ad452be372fd9fe64021c8af6e566076b78f9c6d553848f9e1bf2ad3955c94470cfb8b6ba4aa81c53acc82395870ef9677b634515c4e4bd8de971292c3aa0c150516c546f8b172613dd1e314d4caf46ebd1770bb0d73b6ea2d53969 - - - 8305f8dd0b412a4b95ef71a44a2cb069890895668054436640b9dffd2b0db4d84e21788b2cf8d609eb95773b4ef3c926335bc93bdc4df971a95f4c4c68ee627402c8935aa619ad276a6994004babf0bb41a8ca9fd5d22e76ec68f662eeb449ad9cdbd37f78b52fb88101e86a54323be7cd4777fdab26ada1cbba1ff0b08b6f451aa45daadcf9ef35a0a24039f2b1d5ca88ad64057afdbfe7c2bba6033380208d8d7c6c5f822a5f8bf19b5ee4f16efe068bd914d2e6ca831af24d53fa330c5d8150eb52fdd29518c14ecbc9af7e68a6e5f7a866150ecccf2b598fd6ba78521d5fe815797a6430ea09d6b394abe630df9510046bc983d9c41e3213868aeaa9dd531220959dd6305a1c582bde1a3e01d9b4be5d09150c1f4a84aa35c995103e6c6e3b6bb5345759b2219a31d05626373653d8151130ba1abef2aa78494f736792c0a462f54ebd86d2a110ae27ad1ad413baca5c7c4a302252da1423e44647cd57399e92cc805a60ce43bbda7a74797be1ad0275c0b270be2f117bd9ccc07bee42e247d178b15ba233535bffbb1c641cdd9ca3d387985b7980e8aed9752dbe30313f8a4b911f0ac7d8fd9352e3be80cdfaa3fd20ac5771c9f918d456b88cd3155de13a3f71bbcc627e766a16a86cac17f83fde98a2e7742bee4144ad235e23c76459522a96812819585155b6fcb6a08dafb19ccf93de37cb6738c803f73b0876e583d47ea3c59d6aba7b168c8de113a8f04cb813847a79682574ee71f6d9a5987b5e3be7169bf3bd82fbda4f5899e31b55b8c257f989516bbc879e60a49a4c5370230b4f728dd9389a059b481ea61046230e1382046955dae636005db580ec4a0540ee382fbc74b78b00ec821a19778fc119b673496df2bc2f11639922141d4cbb8fe22833f6fb210801419ab1b43f77a2baf892055a41c57e529026d4784aad469a4d2b530e81780f2aaea6b37b44243fa0f5e60a99391c6cf2e8a0f263a38566bfa56f761684b754bb8fa95aed80511332bff4673d600b6a09852cba34faca550f0652241a9eb04ca9652c4a19c20d37d6772604c3bbd34c82fa913a1a95e33b811f33952f4618d3600165574e29c44f7f748c05f90105791906e5920b356c4a8ce133dc2a809f0e47aa0ca2537a09688d2b92d49fa6b1f25165b6d2905ea99d1d6d56b2c39b08167df0cf18ce0f593228abbdbba718f05de4700ffa54067cb01fa65d9e378c0bc88d5f4d7bc153db964920e3c0dab30c02e87d957c369c6492bba7b240c27541d80bf0d39cbe62c077bdf6b1fb252d470cc39f9e43a13a95c08788dd5fe4e62fa3b07be01496bc977c6e1fe62977a2a8b72197fb3ad812369e96e3dd2ad329f134aaa4baee81c2ebd1b2c39e55fd9afcc554633ffb04a827ac75f7b26e49bcc341ea062ba13f672cd0a1dfd79a093273a5187e3adb6ece0e460555dc872c49b95e5054ffb772a4301feecdb072d6087345814b4af54de55d413eee562be25741a041bbdcb2850281 - - - 8305f8dd0b412a4b95ef71a44a2cb069890895668054436640b9dffd2b0db4d84e21788b2cf8d609eb95773b4ef3c926335bc93bdc4df971a95f4c4c68ee627402c8935aa619ad276a6994004babf0bb41a8ca9fd5d22e76ec68f662eeb449ad9cdbd37f78b52fb88101e86a54323be7cd4777fdab26ada1cbba1ff0b08b6f451aa45daadcf9ef35a0a24039f2b1d5ca88ad64057afdbfe7c2bba6033380208d8d7c6c5f822a5f8bf19b5ee4f16efe068bd914d2e6ca831af24d53fa330c5d8150eb52fdd29518c14ecbc9af7e68a6e5f7a866150ecccf2b598fd6ba78521d5fe815797a6430ea09d6b394abe630df9510046bc983d9c41e3213868aeaa9dd531220959dd6305a1c582bde1a3e01d9b4be5d09150c1f4a84aa35c995103e6c6e3b6bb5345759b2219a31d05626373653d8151130ba1abef2aa78494f736792c0a462f54ebd86d2a110ae27ad1ad413baca5c7c4a302252da1423e44647cd57399e92cc805a60ce43bbda7a74797be1ad0275c0b270be2f117bd9ccc07bee42e247d178b15ba233535bffbb1c641cdd9ca3d387985b7980e8aed9752dbe30313f8a4b911f0ac7d8fd9352e3be80cdfaa3fd20ac5771c9f918d456b88cd3155de13a3f71bbcc627e766a16a86cac17f83fde98a2e7742bee4144ad235e23c76459522a96812819585155b6fcb6a08dafb19ccf93de37cb6738c803f73b0876e583d47ea3c59d6aba7b168c8de113a8f04cb813847a79682574ee71f6d9a5987b5e3be7169bf3bd82fbda4f5899e31b55b8c257f989516bbc879e60a49a4c5370230b4f728dd9389a059b481ea61046230e1382046955dae636005db580ec4a0540ee382fbc74b78b00ec821a19778fc119b673496df2bc2f11639922141d4cbb8fe22833f6fb210801419ab1b43f77a2baf892055a41c57e529026d4784aad469a4d2b530e81780f2aaea6b37b44243fa0f5e60a99391c6cf2e8a0f263a38566bfa56f761684b754bb8fa95aed80511332bff4673d600b6a09852cba34faca550f0652241a9eb04ca9652c4a19c20d37d6772604c3bbd34c82fa913a1a95e33b811f33952f4618d3600165574e29c44f7f748c05f90105791906e5920b356c4a8ce133dc2a809f0e47aa0ca2537a09688d2b92d49fa6b1f25165b6d2905ea99d1d6d56b2c39b08167df0cf18ce0f593228abbdbba718f05de4700ffa54067cb01fa65d9e378c0bc88d5f4d7bc153db964920e3c0dab30c02e87d957c369c6492bba7b240c27541d80bf0d39cbe62c077bdf6b1fb252d470cc39f9e43a13a95c08788dd5fe4e62fa3b07be01496bc977c6e1fe62977a2a8b72197fb3ad812369e96e3dd2ad329f134aaa4baee81c2ebd1b2c39e55fd9afcc554633ffb04a827ac75f7b26e49bcc341ea062ba13f672cd0a1dfd79a093273a5187e3adb6ece0e460555dc872c49b95e5054ffb772a4301feecdb072d6087345814b4af54de55d413eee562be25741a041bbdcb2850281 - - - fb7d736ac8ee7a3a74f952551e8856a34c05d564ee0408ca0eea47a86e833b5b30a732b9d3ca954e56231908beb9022aec02c756c3e075bd9086f9ade0381b953185b4d3ed332d5c4b454abe5d2ccbeb48b473f956d543bde4f48c1978f129da7bf481b629a8da09941e5ea66d069617f6c82ac3a685b9e6cf75d8d4faf0b2ca0b52df201372c6e2d08dbcb2b724da94c733590165282e6faefd7bb89bb5be76d452f84b50a557d4b0f45192fc562f3682aba1098818ed3ddfaf72181d66f1f7b59be2b31759b66c - - - \ No newline at end of file diff --git a/script/wsjs.js b/script/wsjs.js deleted file mode 100644 index 3e41c97..0000000 --- a/script/wsjs.js +++ /dev/null @@ -1,194 +0,0 @@ -function WSJS() -{ - this.isActive = false; - this.ws = WSJS.activeWS || null; - this.endpoint = null; -}; -WSJS.activeWS = null; -WSJS.prototype.connect = function(url){ - this.ws = new WebSocket(url); - this.addListeners(); -} -WSJS.prototype.addListeners = function(){ - this.ws.addEventListener("close", this.closedEvent.bind(this)); - this.ws.addEventListener("message", this.messageEvent.bind(this)); - this.ws.addEventListener("open", this.openMessage.bind(this)); -} -WSJS.prototype.closedEvent = function(){ - WSJS.activeWS = null; - this.isActive = false; - this.ws = null; - this.events.dispatchEvent(new Event("close")); -} -WSJS.prototype.openMessage = function(){ - WSJS.activeWS = this.ws; - this.isActive = true; - this.events.dispatchEvent(new Event("open")); -} -WSJS.prototype.messageEvent = function({data}){ - let [payload, id, action] = JSON.parse(data); - if(typeof id === 'number') - { - if(this.requests.has(id)) - { - this.requests.get(id)(payload, action); - switch(action) - { - case 'E':{ // [E]ND flag - this.requests.delete(id); - break; - } - case 'S': // [S]TREAM flag - default:{ - break; - } - } - }else console.warn("Missing event sended from server"); - }else{ - if(this.signals.has(id)) - { - for (const callback of this.signals.get(id)) { - callback(payload); - } - }else console.warn("Missing event sended from server"); - } -} -WSJS.prototype.events = new EventTarget(); -WSJS.prototype.scope = function(func){ - if(this.isActive) - { - func(); - }else this.events.addEventListener("open", func); -} - -WSJS.prototype.sendOnly = function(obj){ - if(this.isActive) - { - this.sendRaw([obj,'R']); - }else throw new Error(`socket could be a active`); -} -WSJS.prototype.requests = new Map(); -WSJS.prototype.requestCount = 0; -WSJS.prototype.request = async function(obj){ - if(this.isActive) - { - return await new Promise(ok => { - let id = ++this.requestCount; - this.sendRaw([obj,id,'R']); - this.requests.set(id,data => { - ok(data); - }); - }) - }else throw new Error(`socket could be a active`); -} -WSJS.prototype.stream = async function(obj,callback){ - if(this.isActive) - { - let id = ++this.requestCount; - this.sendRaw([obj, id, 'S']); - this.requests.set(id,data => { - callback(data); - }); - }else throw new Error(`socket could be a active`); -} -WSJS.prototype.signals = new Map(); -WSJS.prototype.signal = async function(name, callback){ - if(!this.signals.has(name)) - { - this.signals.set(name, [callback]); - }else{ - this.signals.get(name).push(callback); - } -} -WSJS.prototype.slot = async function(name, obj){ - if(this.isActive) - { - if(typeof name == "string") - { - this.sendOnly([obj,name]); - }else{ - throw new Error(`name could be a string, gived ${typeof name}`); - } - }else throw new Error(`socket could be a active`); -} -WSJS.prototype.sendRaw = function(obj){ - if(this.isActive) - { - this.ws.send(JSON.stringify(obj)) - }; -}; - - - - - - - -WSJS.prototype.authWith = async function(username, password){ - await this.request({ - type: 'auth/login', - username, - password - }); -}; -WSJS.prototype.fetchMyRoomInfo = async function(){ - return await this.request({ - type: 'myroom-info' - }); -}; -WSJS.prototype.createRoom = async function(options){ - let result = await this.request({ - type: 'create-room', - accessType: options.accessType || "private", - notifyActionInvite: options.notifyActionInvite === undefined ? true : options.notifyActionInvite, - notifyActionJoined: options.notifyActionJoined === undefined ? true : options.notifyActionJoined, - notifyActionEjected: options.notifyActionEjected === undefined ? true : options.notifyActionEjected, - joinType: options.joinType || "free", - description: options.description || "No Description", - name: options.name || "No", - credential: options.credential || undefined - }); - return result; -}; -WSJS.prototype.roomInfo = async function(name){ - let result = await this.request({ - type: 'room-info', - name - }); - return result; -}; -WSJS.prototype.joinRoom = async function(options){ - let result = await this.request({ - ...options, - type: 'joinroom' - }); - return result; -}; -WSJS.prototype.joinedRooms = new Map(); -WSJS.prototype.getJoinedRooms = async function(){ - return await this.request({ - type: 'joinedrooms' - }); -}; -WSJS.prototype.getRoomPeers = async function(id){ - return await this.request({ - type: 'room-peers', - roomId: id - }); -}; -WSJS.prototype.sendPackToPeer = async function(roomId, pack){ - return await this.sendOnly({ - type: 'pack/to', - to: roomId, - pack, - handshake: false - }); -}; -WSJS.prototype.sendPackToRoom = async function(roomId, pack){ - return await this.sendOnly({ - type: 'pack/room', - to: roomId, - pack, - handshake: false - }); -}; \ No newline at end of file diff --git a/tsconfig.json b/tsconfig.json new file mode 100644 index 0000000..7c6f03e --- /dev/null +++ b/tsconfig.json @@ -0,0 +1,107 @@ +{ + "include": [ + "./frontend/**/*.ts", + "./frontend/*.ts" + ], + "compilerOptions": { + /* Visit https://aka.ms/tsconfig to read more about this file */ + + /* Projects */ + // "incremental": true, /* Save .tsbuildinfo files to allow for incremental compilation of projects. */ + // "composite": true, /* Enable constraints that allow a TypeScript project to be used with project references. */ + // "tsBuildInfoFile": "./.tsbuildinfo", /* Specify the path to .tsbuildinfo incremental compilation file. */ + // "disableSourceOfProjectReferenceRedirect": true, /* Disable preferring source files instead of declaration files when referencing composite projects. */ + // "disableSolutionSearching": true, /* Opt a project out of multi-project reference checking when editing. */ + // "disableReferencedProjectLoad": true, /* Reduce the number of projects loaded automatically by TypeScript. */ + + /* Language and Environment */ + "target": "es2015", /* Set the JavaScript language version for emitted JavaScript and include compatible library declarations. */ + "lib": ["DOM","ES2015","ES2015.Promise"], /* Specify a set of bundled library declaration files that describe the target runtime environment. */ + // "jsx": "preserve", /* Specify what JSX code is generated. */ + // "experimentalDecorators": true, /* Enable experimental support for TC39 stage 2 draft decorators. */ + // "emitDecoratorMetadata": true, /* Emit design-type metadata for decorated declarations in source files. */ + // "jsxFactory": "", /* Specify the JSX factory function used when targeting React JSX emit, e.g. 'React.createElement' or 'h'. */ + // "jsxFragmentFactory": "", /* Specify the JSX Fragment reference used for fragments when targeting React JSX emit e.g. 'React.Fragment' or 'Fragment'. */ + // "jsxImportSource": "", /* Specify module specifier used to import the JSX factory functions when using 'jsx: react-jsx*'. */ + // "reactNamespace": "", /* Specify the object invoked for 'createElement'. This only applies when targeting 'react' JSX emit. */ + // "noLib": true, /* Disable including any library files, including the default lib.d.ts. */ + // "useDefineForClassFields": true, /* Emit ECMAScript-standard-compliant class fields. */ + // "moduleDetection": "auto", /* Control what method is used to detect module-format JS files. */ + + /* Modules */ + "module": "ES2015", /* Specify what module code is generated. */ + "rootDir": "./frontend", /* Specify the root folder within your source files. */ + "moduleResolution": "node", /* Specify how TypeScript looks up a file from a given module specifier. */ + "baseUrl": "./", /* Specify the base directory to resolve non-relative module names. */ + // "paths": {}, /* Specify a set of entries that re-map imports to additional lookup locations. */ + // "rootDirs": [], /* Allow multiple folders to be treated as one when resolving modules. */ + // "typeRoots": [], /* Specify multiple folders that act like './node_modules/@types'. */ + // "types": [], /* Specify type package names to be included without being referenced in a source file. */ + // "allowUmdGlobalAccess": true, /* Allow accessing UMD globals from modules. */ + // "moduleSuffixes": [], /* List of file name suffixes to search when resolving a module. */ + "resolveJsonModule": true, /* Enable importing .json files. */ + // "noResolve": true, /* Disallow 'import's, 'require's or ''s from expanding the number of files TypeScript should add to a project. */ + + /* JavaScript Support */ + "allowJs": true, /* Allow JavaScript files to be a part of your program. Use the 'checkJS' option to get errors from these files. */ + "checkJs": true, /* Enable error reporting in type-checked JavaScript files. */ + // "maxNodeModuleJsDepth": 1, /* Specify the maximum folder depth used for checking JavaScript files from 'node_modules'. Only applicable with 'allowJs'. */ + + /* Emit */ + "declaration": true, /* Generate .d.ts files from TypeScript and JavaScript files in your project. */ + "declarationMap": true, /* Create sourcemaps for d.ts files. */ + // "emitDeclarationOnly": true, /* Only output d.ts files and not JavaScript files. */ + // "sourceMap": true, /* Create source map files for emitted JavaScript files. */ + // "outFile": "./script", /* Specify a file that bundles all outputs into one JavaScript file. If 'declaration' is true, also designates a file that bundles all .d.ts output. */ + "outDir": "./script", /* Specify an output folder for all emitted files. */ + "removeComments": true, /* Disable emitting comments. */ + // "noEmit": true, /* Disable emitting files from a compilation. */ + "importHelpers": true, /* Allow importing helper functions from tslib once per project, instead of including them per-file. */ + "importsNotUsedAsValues": "remove", /* Specify emit/checking behavior for imports that are only used for types. */ + // "downlevelIteration": true, /* Emit more compliant, but verbose and less performant JavaScript for iteration. */ + // "sourceRoot": "", /* Specify the root path for debuggers to find the reference source code. */ + // "mapRoot": "", /* Specify the location where debugger should locate map files instead of generated locations. */ + "inlineSourceMap": true, /* Include sourcemap files inside the emitted JavaScript. */ + "inlineSources": true, /* Include source code in the sourcemaps inside the emitted JavaScript. */ + // "emitBOM": true, /* Emit a UTF-8 Byte Order Mark (BOM) in the beginning of output files. */ + // "newLine": "crlf", /* Set the newline character for emitting files. */ + // "stripInternal": true, /* Disable emitting declarations that have '@internal' in their JSDoc comments. */ + // "noEmitHelpers": true, /* Disable generating custom helper functions like '__extends' in compiled output. */ + // "noEmitOnError": true, /* Disable emitting files if any type checking errors are reported. */ + // "preserveConstEnums": true, /* Disable erasing 'const enum' declarations in generated code. */ + "declarationDir": "./script", /* Specify the output directory for generated declaration files. */ + // "preserveValueImports": true, /* Preserve unused imported values in the JavaScript output that would otherwise be removed. */ + + /* Interop Constraints */ + // "isolatedModules": true, /* Ensure that each file can be safely transpiled without relying on other imports. */ + "allowSyntheticDefaultImports": true, /* Allow 'import x from y' when a module doesn't have a default export. */ + "esModuleInterop": true, /* Emit additional JavaScript to ease support for importing CommonJS modules. This enables 'allowSyntheticDefaultImports' for type compatibility. */ + // "preserveSymlinks": true, /* Disable resolving symlinks to their realpath. This correlates to the same flag in node. */ + "forceConsistentCasingInFileNames": true, /* Ensure that casing is correct in imports. */ + + /* Type Checking */ + "strict": true, /* Enable all strict type-checking options. */ + "noImplicitAny": true, /* Enable error reporting for expressions and declarations with an implied 'any' type. */ + "strictNullChecks": true, /* When type checking, take into account 'null' and 'undefined'. */ + "strictFunctionTypes": true, /* When assigning functions, check to ensure parameters and the return values are subtype-compatible. */ + "strictBindCallApply": true, /* Check that the arguments for 'bind', 'call', and 'apply' methods match the original function. */ + "strictPropertyInitialization": true, /* Check for class properties that are declared but not set in the constructor. */ + "noImplicitThis": true, /* Enable error reporting when 'this' is given the type 'any'. */ + // "useUnknownInCatchVariables": true, /* Default catch clause variables as 'unknown' instead of 'any'. */ + "alwaysStrict": true, /* Ensure 'use strict' is always emitted. */ + "noUnusedLocals": true, /* Enable error reporting when local variables aren't read. */ + "noUnusedParameters": true, /* Raise an error when a function parameter isn't read. */ + // "exactOptionalPropertyTypes": true, /* Interpret optional property types as written, rather than adding 'undefined'. */ + // "noImplicitReturns": true, /* Enable error reporting for codepaths that do not explicitly return in a function. */ + // "noFallthroughCasesInSwitch": true, /* Enable error reporting for fallthrough cases in switch statements. */ + // "noUncheckedIndexedAccess": true, /* Add 'undefined' to a type when accessed using an index. */ + // "noImplicitOverride": true, /* Ensure overriding members in derived classes are marked with an override modifier. */ + // "noPropertyAccessFromIndexSignature": true, /* Enforces using indexed accessors for keys declared using an indexed type. */ + "allowUnusedLabels": false, /* Disable error reporting for unused labels. */ + "allowUnreachableCode": false, /* Disable error reporting for unreachable code. */ + + /* Completeness */ + // "skipDefaultLibCheck": true, /* Skip type checking .d.ts files that are included with TypeScript. */ + "skipLibCheck": true /* Skip type checking all .d.ts files. */ + } +} -- 2.25.1 From cbabeee30b02004b9b4b26d17aa5d76eaa47842a Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Abdussamed=20ULUTA=C5=9E?= Date: Sun, 27 Nov 2022 19:38:38 +0300 Subject: [PATCH 02/37] Auto watching file system compiling --- frontend/index.ts | 3 +++ package.json | 2 +- script/index.d.ts | 3 +++ script/index.d.ts.map | 1 + script/index.js | 3 +++ 5 files changed, 11 insertions(+), 1 deletion(-) create mode 100644 frontend/index.ts create mode 100644 script/index.d.ts create mode 100644 script/index.d.ts.map create mode 100644 script/index.js diff --git a/frontend/index.ts b/frontend/index.ts new file mode 100644 index 0000000..4a960aa --- /dev/null +++ b/frontend/index.ts @@ -0,0 +1,3 @@ +namespace WSTS { + +}; \ No newline at end of file diff --git a/package.json b/package.json index be22882..860aa58 100644 --- a/package.json +++ b/package.json @@ -4,7 +4,7 @@ "description": "Mikro WebSocket Engine", "main": "Source/index.js", "scripts": { - "test": "echo \"Error: no test specified\" && exit 1" + "compile":"tsc -p tsconfig.json -w" }, "repository": { "type": "git", diff --git a/script/index.d.ts b/script/index.d.ts new file mode 100644 index 0000000..07445f1 --- /dev/null +++ b/script/index.d.ts @@ -0,0 +1,3 @@ +declare namespace WSTS { +} +//# sourceMappingURL=index.d.ts.map \ No newline at end of file diff --git a/script/index.d.ts.map b/script/index.d.ts.map new file mode 100644 index 0000000..3546fde --- /dev/null +++ b/script/index.d.ts.map @@ -0,0 +1 @@ +{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../frontend/index.ts"],"names":[],"mappings":"AAAA,kBAAU,IAAI,CAAC;CAEd"} \ No newline at end of file diff --git a/script/index.js b/script/index.js new file mode 100644 index 0000000..161d85f --- /dev/null +++ b/script/index.js @@ -0,0 +1,3 @@ +"use strict"; +; +//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi9mcm9udGVuZC9pbmRleC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiO0FBRUMsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbIm5hbWVzcGFjZSBXU1RTIHtcclxuXHJcbn07Il19 \ No newline at end of file -- 2.25.1 From 73c164b65e4ed532202905803b2edde52018d4a7 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Abdussamed=20ULUTA=C5=9E?= Date: Sun, 27 Nov 2022 22:17:31 +0300 Subject: [PATCH 03/37] Ver 1 --- frontend/Connection.ts | 61 ++++++++++++ frontend/index.ts | 6 +- frontend/index.txt | 194 +++++++++++++++++++++++++++++++++++++ package-lock.json | 11 +++ package.json | 3 +- script/Connection.d.ts | 22 +++++ script/Connection.d.ts.map | 1 + script/Connection.js | 52 ++++++++++ script/index.d.ts | 3 +- script/index.d.ts.map | 2 +- script/index.js | 10 +- test.html | 96 +++++++++--------- tsconfig.json | 8 +- 13 files changed, 408 insertions(+), 61 deletions(-) create mode 100644 frontend/Connection.ts create mode 100644 frontend/index.txt create mode 100644 script/Connection.d.ts create mode 100644 script/Connection.d.ts.map create mode 100644 script/Connection.js diff --git a/frontend/Connection.ts b/frontend/Connection.ts new file mode 100644 index 0000000..5e65c35 --- /dev/null +++ b/frontend/Connection.ts @@ -0,0 +1,61 @@ +interface IConnection{ + endpoint: string; + autoPair?: boolean; +} +export default class Connection +{ + public ws! : WebSocket; + public endpoint : URL; + public autoPair : boolean = false; + public connected : boolean = false; + constructor(options: IConnection){ + this.endpoint = new URL(options.endpoint); + this.autoPair = options.autoPair || false; + this.connect(); + } + public connect() + { + this.ws = new WebSocket(this.endpoint.href); + this.addWSEvents(); + } + public addWSEvents() + { + this.ws.addEventListener("open", () => this.eventOpen()); + this.ws.addEventListener("close", () => this.eventClose()); + this.ws.addEventListener("error", () => this.eventError()); + this.ws.addEventListener("message", ({data}) => this.eventMessage(data as string | ArrayBuffer)); + } + private eventOpen() + { + this.connected = true; + } + private eventClose() + { + this.connected = false; + } + private eventError() + { + this.connected = false; + } + private recaivePackEvent : ((data:any) => any)[] = []; + public onRecaivePack(func:(data:any) => any) + { + this.recaivePackEvent.push(func); + } + private eventMessage(data: string | ArrayBuffer) + { + if(typeof data == "string") + { + for (const callback of this.recaivePackEvent) { + callback(JSON.parse(data)); + } + } + } + public tranferToServer(data:any) + { + if(this.connected) + { + this.ws.send(JSON.stringify(data)); + } + } +} \ No newline at end of file diff --git a/frontend/index.ts b/frontend/index.ts index 4a960aa..3673e81 100644 --- a/frontend/index.ts +++ b/frontend/index.ts @@ -1,3 +1,3 @@ -namespace WSTS { - -}; \ No newline at end of file +export default class WSTS { + public connection? : Connection; +} \ No newline at end of file diff --git a/frontend/index.txt b/frontend/index.txt new file mode 100644 index 0000000..3e41c97 --- /dev/null +++ b/frontend/index.txt @@ -0,0 +1,194 @@ +function WSJS() +{ + this.isActive = false; + this.ws = WSJS.activeWS || null; + this.endpoint = null; +}; +WSJS.activeWS = null; +WSJS.prototype.connect = function(url){ + this.ws = new WebSocket(url); + this.addListeners(); +} +WSJS.prototype.addListeners = function(){ + this.ws.addEventListener("close", this.closedEvent.bind(this)); + this.ws.addEventListener("message", this.messageEvent.bind(this)); + this.ws.addEventListener("open", this.openMessage.bind(this)); +} +WSJS.prototype.closedEvent = function(){ + WSJS.activeWS = null; + this.isActive = false; + this.ws = null; + this.events.dispatchEvent(new Event("close")); +} +WSJS.prototype.openMessage = function(){ + WSJS.activeWS = this.ws; + this.isActive = true; + this.events.dispatchEvent(new Event("open")); +} +WSJS.prototype.messageEvent = function({data}){ + let [payload, id, action] = JSON.parse(data); + if(typeof id === 'number') + { + if(this.requests.has(id)) + { + this.requests.get(id)(payload, action); + switch(action) + { + case 'E':{ // [E]ND flag + this.requests.delete(id); + break; + } + case 'S': // [S]TREAM flag + default:{ + break; + } + } + }else console.warn("Missing event sended from server"); + }else{ + if(this.signals.has(id)) + { + for (const callback of this.signals.get(id)) { + callback(payload); + } + }else console.warn("Missing event sended from server"); + } +} +WSJS.prototype.events = new EventTarget(); +WSJS.prototype.scope = function(func){ + if(this.isActive) + { + func(); + }else this.events.addEventListener("open", func); +} + +WSJS.prototype.sendOnly = function(obj){ + if(this.isActive) + { + this.sendRaw([obj,'R']); + }else throw new Error(`socket could be a active`); +} +WSJS.prototype.requests = new Map(); +WSJS.prototype.requestCount = 0; +WSJS.prototype.request = async function(obj){ + if(this.isActive) + { + return await new Promise(ok => { + let id = ++this.requestCount; + this.sendRaw([obj,id,'R']); + this.requests.set(id,data => { + ok(data); + }); + }) + }else throw new Error(`socket could be a active`); +} +WSJS.prototype.stream = async function(obj,callback){ + if(this.isActive) + { + let id = ++this.requestCount; + this.sendRaw([obj, id, 'S']); + this.requests.set(id,data => { + callback(data); + }); + }else throw new Error(`socket could be a active`); +} +WSJS.prototype.signals = new Map(); +WSJS.prototype.signal = async function(name, callback){ + if(!this.signals.has(name)) + { + this.signals.set(name, [callback]); + }else{ + this.signals.get(name).push(callback); + } +} +WSJS.prototype.slot = async function(name, obj){ + if(this.isActive) + { + if(typeof name == "string") + { + this.sendOnly([obj,name]); + }else{ + throw new Error(`name could be a string, gived ${typeof name}`); + } + }else throw new Error(`socket could be a active`); +} +WSJS.prototype.sendRaw = function(obj){ + if(this.isActive) + { + this.ws.send(JSON.stringify(obj)) + }; +}; + + + + + + + +WSJS.prototype.authWith = async function(username, password){ + await this.request({ + type: 'auth/login', + username, + password + }); +}; +WSJS.prototype.fetchMyRoomInfo = async function(){ + return await this.request({ + type: 'myroom-info' + }); +}; +WSJS.prototype.createRoom = async function(options){ + let result = await this.request({ + type: 'create-room', + accessType: options.accessType || "private", + notifyActionInvite: options.notifyActionInvite === undefined ? true : options.notifyActionInvite, + notifyActionJoined: options.notifyActionJoined === undefined ? true : options.notifyActionJoined, + notifyActionEjected: options.notifyActionEjected === undefined ? true : options.notifyActionEjected, + joinType: options.joinType || "free", + description: options.description || "No Description", + name: options.name || "No", + credential: options.credential || undefined + }); + return result; +}; +WSJS.prototype.roomInfo = async function(name){ + let result = await this.request({ + type: 'room-info', + name + }); + return result; +}; +WSJS.prototype.joinRoom = async function(options){ + let result = await this.request({ + ...options, + type: 'joinroom' + }); + return result; +}; +WSJS.prototype.joinedRooms = new Map(); +WSJS.prototype.getJoinedRooms = async function(){ + return await this.request({ + type: 'joinedrooms' + }); +}; +WSJS.prototype.getRoomPeers = async function(id){ + return await this.request({ + type: 'room-peers', + roomId: id + }); +}; +WSJS.prototype.sendPackToPeer = async function(roomId, pack){ + return await this.sendOnly({ + type: 'pack/to', + to: roomId, + pack, + handshake: false + }); +}; +WSJS.prototype.sendPackToRoom = async function(roomId, pack){ + return await this.sendOnly({ + type: 'pack/room', + to: roomId, + pack, + handshake: false + }); +}; \ No newline at end of file diff --git a/package-lock.json b/package-lock.json index 289300d..f724c49 100644 --- a/package-lock.json +++ b/package-lock.json @@ -14,6 +14,7 @@ "joi": "^17.7.0", "knex": "^2.3.0", "sqlite3": "^5.1.2", + "systemjs": "^6.13.0", "terminal-kit": "^3.0.0", "typescript": "^4.9.3", "websocket": "^1.0.34" @@ -2082,6 +2083,11 @@ "url": "https://github.com/sponsors/ljharb" } }, + "node_modules/systemjs": { + "version": "6.13.0", + "resolved": "https://registry.npmjs.org/systemjs/-/systemjs-6.13.0.tgz", + "integrity": "sha512-P3cgh2bpaPvAO2NE3uRp/n6hmk4xPX4DQf+UzTlCAycssKdqhp6hjw+ENWe+aUS7TogKRFtptMosTSFeC6R55g==" + }, "node_modules/tar": { "version": "6.1.12", "resolved": "https://registry.npmjs.org/tar/-/tar-6.1.12.tgz", @@ -3933,6 +3939,11 @@ "resolved": "https://registry.npmjs.org/supports-preserve-symlinks-flag/-/supports-preserve-symlinks-flag-1.0.0.tgz", "integrity": "sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w==" }, + "systemjs": { + "version": "6.13.0", + "resolved": "https://registry.npmjs.org/systemjs/-/systemjs-6.13.0.tgz", + "integrity": "sha512-P3cgh2bpaPvAO2NE3uRp/n6hmk4xPX4DQf+UzTlCAycssKdqhp6hjw+ENWe+aUS7TogKRFtptMosTSFeC6R55g==" + }, "tar": { "version": "6.1.12", "resolved": "https://registry.npmjs.org/tar/-/tar-6.1.12.tgz", diff --git a/package.json b/package.json index 860aa58..7811606 100644 --- a/package.json +++ b/package.json @@ -4,7 +4,7 @@ "description": "Mikro WebSocket Engine", "main": "Source/index.js", "scripts": { - "compile":"tsc -p tsconfig.json -w" + "compile": "tsc -p tsconfig.json -w" }, "repository": { "type": "git", @@ -24,6 +24,7 @@ "joi": "^17.7.0", "knex": "^2.3.0", "sqlite3": "^5.1.2", + "systemjs": "^6.13.0", "terminal-kit": "^3.0.0", "typescript": "^4.9.3", "websocket": "^1.0.34" diff --git a/script/Connection.d.ts b/script/Connection.d.ts new file mode 100644 index 0000000..c1c74b2 --- /dev/null +++ b/script/Connection.d.ts @@ -0,0 +1,22 @@ +interface IConnection { + endpoint: string; + autoPair?: boolean; +} +export default class Connection { + ws: WebSocket; + endpoint: URL; + autoPair: boolean; + connected: boolean; + constructor(options: IConnection); + connect(): void; + addWSEvents(): void; + private eventOpen; + private eventClose; + private eventError; + private recaivePackEvent; + onRecaivePack(func: (data: any) => any): void; + private eventMessage; + tranferToServer(data: any): void; +} +export {}; +//# sourceMappingURL=Connection.d.ts.map \ No newline at end of file diff --git a/script/Connection.d.ts.map b/script/Connection.d.ts.map new file mode 100644 index 0000000..e1214e6 --- /dev/null +++ b/script/Connection.d.ts.map @@ -0,0 +1 @@ +{"version":3,"file":"Connection.d.ts","sourceRoot":"","sources":["../frontend/Connection.ts"],"names":[],"mappings":"AAAA,UAAU,WAAW;IACjB,QAAQ,EAAE,MAAM,CAAC;IACjB,QAAQ,CAAC,EAAE,OAAO,CAAC;CACtB;AACD,MAAM,CAAC,OAAO,OAAO,UAAU;IAEpB,EAAE,EAAI,SAAS,CAAC;IAChB,QAAQ,EAAG,GAAG,CAAC;IACf,QAAQ,EAAG,OAAO,CAAS;IAC3B,SAAS,EAAG,OAAO,CAAS;gBACvB,OAAO,EAAE,WAAW;IAKzB,OAAO;IAKP,WAAW;IAOlB,OAAO,CAAC,SAAS;IAIjB,OAAO,CAAC,UAAU;IAIlB,OAAO,CAAC,UAAU;IAIlB,OAAO,CAAC,gBAAgB,CAA8B;IAC/C,aAAa,CAAC,IAAI,EAAC,CAAC,IAAI,EAAC,GAAG,KAAK,GAAG;IAI3C,OAAO,CAAC,YAAY;IASb,eAAe,CAAC,IAAI,EAAC,GAAG;CAOlC"} \ No newline at end of file diff --git a/script/Connection.js b/script/Connection.js new file mode 100644 index 0000000..8ca945d --- /dev/null +++ b/script/Connection.js @@ -0,0 +1,52 @@ +var Connection = (function () { + function Connection(options) { + this.autoPair = false; + this.connected = false; + this.recaivePackEvent = []; + this.endpoint = new URL(options.endpoint); + this.autoPair = options.autoPair || false; + this.connect(); + } + Connection.prototype.connect = function () { + this.ws = new WebSocket(this.endpoint.href); + this.addWSEvents(); + }; + Connection.prototype.addWSEvents = function () { + var _this = this; + this.ws.addEventListener("open", function () { return _this.eventOpen(); }); + this.ws.addEventListener("close", function () { return _this.eventClose(); }); + this.ws.addEventListener("error", function () { return _this.eventError(); }); + this.ws.addEventListener("message", function (_a) { + var data = _a.data; + return _this.eventMessage(data); + }); + }; + Connection.prototype.eventOpen = function () { + this.connected = true; + }; + Connection.prototype.eventClose = function () { + this.connected = false; + }; + Connection.prototype.eventError = function () { + this.connected = false; + }; + Connection.prototype.onRecaivePack = function (func) { + this.recaivePackEvent.push(func); + }; + Connection.prototype.eventMessage = function (data) { + if (typeof data == "string") { + for (var _i = 0, _a = this.recaivePackEvent; _i < _a.length; _i++) { + var callback = _a[_i]; + callback(JSON.parse(data)); + } + } + }; + Connection.prototype.tranferToServer = function (data) { + if (this.connected) { + this.ws.send(JSON.stringify(data)); + } + }; + return Connection; +}()); +export default Connection; +//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiQ29ubmVjdGlvbi5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uL2Zyb250ZW5kL0Nvbm5lY3Rpb24udHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBSUE7SUFNSSxvQkFBWSxPQUFvQjtRQUZ6QixhQUFRLEdBQWEsS0FBSyxDQUFDO1FBQzNCLGNBQVMsR0FBYSxLQUFLLENBQUM7UUE4QjNCLHFCQUFnQixHQUEyQixFQUFFLENBQUM7UUE1QmxELElBQUksQ0FBQyxRQUFRLEdBQUcsSUFBSSxHQUFHLENBQUMsT0FBTyxDQUFDLFFBQVEsQ0FBQyxDQUFDO1FBQzFDLElBQUksQ0FBQyxRQUFRLEdBQUcsT0FBTyxDQUFDLFFBQVEsSUFBSSxLQUFLLENBQUM7UUFDMUMsSUFBSSxDQUFDLE9BQU8sRUFBRSxDQUFDO0lBQ25CLENBQUM7SUFDTSw0QkFBTyxHQUFkO1FBRUksSUFBSSxDQUFDLEVBQUUsR0FBRyxJQUFJLFNBQVMsQ0FBQyxJQUFJLENBQUMsUUFBUSxDQUFDLElBQUksQ0FBQyxDQUFDO1FBQzVDLElBQUksQ0FBQyxXQUFXLEVBQUUsQ0FBQztJQUN2QixDQUFDO0lBQ00sZ0NBQVcsR0FBbEI7UUFBQSxpQkFNQztRQUpHLElBQUksQ0FBQyxFQUFFLENBQUMsZ0JBQWdCLENBQUMsTUFBTSxFQUFFLGNBQU0sT0FBQSxLQUFJLENBQUMsU0FBUyxFQUFFLEVBQWhCLENBQWdCLENBQUMsQ0FBQztRQUN6RCxJQUFJLENBQUMsRUFBRSxDQUFDLGdCQUFnQixDQUFDLE9BQU8sRUFBRSxjQUFNLE9BQUEsS0FBSSxDQUFDLFVBQVUsRUFBRSxFQUFqQixDQUFpQixDQUFDLENBQUM7UUFDM0QsSUFBSSxDQUFDLEVBQUUsQ0FBQyxnQkFBZ0IsQ0FBQyxPQUFPLEVBQUUsY0FBTSxPQUFBLEtBQUksQ0FBQyxVQUFVLEVBQUUsRUFBakIsQ0FBaUIsQ0FBQyxDQUFDO1FBQzNELElBQUksQ0FBQyxFQUFFLENBQUMsZ0JBQWdCLENBQUMsU0FBUyxFQUFFLFVBQUMsRUFBTTtnQkFBTCxJQUFJLFVBQUE7WUFBTSxPQUFBLEtBQUksQ0FBQyxZQUFZLENBQUMsSUFBNEIsQ0FBQztRQUEvQyxDQUErQyxDQUFDLENBQUM7SUFDckcsQ0FBQztJQUNPLDhCQUFTLEdBQWpCO1FBRUksSUFBSSxDQUFDLFNBQVMsR0FBRyxJQUFJLENBQUM7SUFDMUIsQ0FBQztJQUNPLCtCQUFVLEdBQWxCO1FBRUksSUFBSSxDQUFDLFNBQVMsR0FBRyxLQUFLLENBQUM7SUFDM0IsQ0FBQztJQUNPLCtCQUFVLEdBQWxCO1FBRUksSUFBSSxDQUFDLFNBQVMsR0FBRyxLQUFLLENBQUM7SUFDM0IsQ0FBQztJQUVNLGtDQUFhLEdBQXBCLFVBQXFCLElBQXNCO1FBRXZDLElBQUksQ0FBQyxnQkFBZ0IsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUM7SUFDckMsQ0FBQztJQUNPLGlDQUFZLEdBQXBCLFVBQXFCLElBQTBCO1FBRTNDLElBQUcsT0FBTyxJQUFJLElBQUksUUFBUSxFQUMxQjtZQUNJLEtBQXVCLFVBQXFCLEVBQXJCLEtBQUEsSUFBSSxDQUFDLGdCQUFnQixFQUFyQixjQUFxQixFQUFyQixJQUFxQixFQUFFO2dCQUF6QyxJQUFNLFFBQVEsU0FBQTtnQkFDZixRQUFRLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDO2FBQzlCO1NBQ0o7SUFDTCxDQUFDO0lBQ00sb0NBQWUsR0FBdEIsVUFBdUIsSUFBUTtRQUUzQixJQUFHLElBQUksQ0FBQyxTQUFTLEVBQ2pCO1lBQ0ksSUFBSSxDQUFDLEVBQUUsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLFNBQVMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDO1NBQ3RDO0lBQ0wsQ0FBQztJQUNMLGlCQUFDO0FBQUQsQ0FBQyxBQXhERCxJQXdEQyIsInNvdXJjZXNDb250ZW50IjpbImludGVyZmFjZSBJQ29ubmVjdGlvbntcclxuICAgIGVuZHBvaW50OiBzdHJpbmc7XHJcbiAgICBhdXRvUGFpcj86IGJvb2xlYW47XHJcbn1cclxuZXhwb3J0IGRlZmF1bHQgY2xhc3MgQ29ubmVjdGlvblxyXG57XHJcbiAgICBwdWJsaWMgd3MhIDogV2ViU29ja2V0O1xyXG4gICAgcHVibGljIGVuZHBvaW50IDogVVJMO1xyXG4gICAgcHVibGljIGF1dG9QYWlyIDogYm9vbGVhbiA9IGZhbHNlO1xyXG4gICAgcHVibGljIGNvbm5lY3RlZCA6IGJvb2xlYW4gPSBmYWxzZTtcclxuICAgIGNvbnN0cnVjdG9yKG9wdGlvbnM6IElDb25uZWN0aW9uKXtcclxuICAgICAgICB0aGlzLmVuZHBvaW50ID0gbmV3IFVSTChvcHRpb25zLmVuZHBvaW50KTtcclxuICAgICAgICB0aGlzLmF1dG9QYWlyID0gb3B0aW9ucy5hdXRvUGFpciB8fCBmYWxzZTtcclxuICAgICAgICB0aGlzLmNvbm5lY3QoKTtcclxuICAgIH1cclxuICAgIHB1YmxpYyBjb25uZWN0KClcclxuICAgIHtcclxuICAgICAgICB0aGlzLndzID0gbmV3IFdlYlNvY2tldCh0aGlzLmVuZHBvaW50LmhyZWYpO1xyXG4gICAgICAgIHRoaXMuYWRkV1NFdmVudHMoKTtcclxuICAgIH1cclxuICAgIHB1YmxpYyBhZGRXU0V2ZW50cygpXHJcbiAgICB7XHJcbiAgICAgICAgdGhpcy53cy5hZGRFdmVudExpc3RlbmVyKFwib3BlblwiLCAoKSA9PiB0aGlzLmV2ZW50T3BlbigpKTtcclxuICAgICAgICB0aGlzLndzLmFkZEV2ZW50TGlzdGVuZXIoXCJjbG9zZVwiLCAoKSA9PiB0aGlzLmV2ZW50Q2xvc2UoKSk7XHJcbiAgICAgICAgdGhpcy53cy5hZGRFdmVudExpc3RlbmVyKFwiZXJyb3JcIiwgKCkgPT4gdGhpcy5ldmVudEVycm9yKCkpO1xyXG4gICAgICAgIHRoaXMud3MuYWRkRXZlbnRMaXN0ZW5lcihcIm1lc3NhZ2VcIiwgKHtkYXRhfSkgPT4gdGhpcy5ldmVudE1lc3NhZ2UoZGF0YSBhcyBzdHJpbmcgfCBBcnJheUJ1ZmZlcikpO1xyXG4gICAgfVxyXG4gICAgcHJpdmF0ZSBldmVudE9wZW4oKVxyXG4gICAge1xyXG4gICAgICAgIHRoaXMuY29ubmVjdGVkID0gdHJ1ZTtcclxuICAgIH1cclxuICAgIHByaXZhdGUgZXZlbnRDbG9zZSgpXHJcbiAgICB7XHJcbiAgICAgICAgdGhpcy5jb25uZWN0ZWQgPSBmYWxzZTtcclxuICAgIH1cclxuICAgIHByaXZhdGUgZXZlbnRFcnJvcigpXHJcbiAgICB7XHJcbiAgICAgICAgdGhpcy5jb25uZWN0ZWQgPSBmYWxzZTtcclxuICAgIH1cclxuICAgIHByaXZhdGUgcmVjYWl2ZVBhY2tFdmVudCA6ICgoZGF0YTphbnkpID0+IGFueSlbXSA9IFtdO1xyXG4gICAgcHVibGljIG9uUmVjYWl2ZVBhY2soZnVuYzooZGF0YTphbnkpID0+IGFueSlcclxuICAgIHtcclxuICAgICAgICB0aGlzLnJlY2FpdmVQYWNrRXZlbnQucHVzaChmdW5jKTtcclxuICAgIH1cclxuICAgIHByaXZhdGUgZXZlbnRNZXNzYWdlKGRhdGE6IHN0cmluZyB8IEFycmF5QnVmZmVyKVxyXG4gICAge1xyXG4gICAgICAgIGlmKHR5cGVvZiBkYXRhID09IFwic3RyaW5nXCIpXHJcbiAgICAgICAge1xyXG4gICAgICAgICAgICBmb3IgKGNvbnN0IGNhbGxiYWNrIG9mIHRoaXMucmVjYWl2ZVBhY2tFdmVudCkge1xyXG4gICAgICAgICAgICAgICAgY2FsbGJhY2soSlNPTi5wYXJzZShkYXRhKSk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9XHJcbiAgICB9XHJcbiAgICBwdWJsaWMgdHJhbmZlclRvU2VydmVyKGRhdGE6YW55KVxyXG4gICAge1xyXG4gICAgICAgIGlmKHRoaXMuY29ubmVjdGVkKVxyXG4gICAgICAgIHtcclxuICAgICAgICAgICAgdGhpcy53cy5zZW5kKEpTT04uc3RyaW5naWZ5KGRhdGEpKTtcclxuICAgICAgICB9XHJcbiAgICB9XHJcbn0iXX0= \ No newline at end of file diff --git a/script/index.d.ts b/script/index.d.ts index 07445f1..6c5b8ec 100644 --- a/script/index.d.ts +++ b/script/index.d.ts @@ -1,3 +1,4 @@ -declare namespace WSTS { +export default class WSTS { + connection?: Connection; } //# sourceMappingURL=index.d.ts.map \ No newline at end of file diff --git a/script/index.d.ts.map b/script/index.d.ts.map index 3546fde..50b148e 100644 --- a/script/index.d.ts.map +++ b/script/index.d.ts.map @@ -1 +1 @@ -{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../frontend/index.ts"],"names":[],"mappings":"AAAA,kBAAU,IAAI,CAAC;CAEd"} \ No newline at end of file +{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../frontend/index.ts"],"names":[],"mappings":"AAAA,MAAM,CAAC,OAAO,OAAO,IAAI;IACd,UAAU,CAAC,EAAG,UAAU,CAAC;CACnC"} \ No newline at end of file diff --git a/script/index.js b/script/index.js index 161d85f..fafaa59 100644 --- a/script/index.js +++ b/script/index.js @@ -1,3 +1,7 @@ -"use strict"; -; -//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi9mcm9udGVuZC9pbmRleC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiO0FBRUMsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbIm5hbWVzcGFjZSBXU1RTIHtcclxuXHJcbn07Il19 \ No newline at end of file +var WSTS = (function () { + function WSTS() { + } + return WSTS; +}()); +export default WSTS; +//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi9mcm9udGVuZC9pbmRleC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQTtJQUFBO0lBRUEsQ0FBQztJQUFELFdBQUM7QUFBRCxDQUFDLEFBRkQsSUFFQyIsInNvdXJjZXNDb250ZW50IjpbImV4cG9ydCBkZWZhdWx0IGNsYXNzIFdTVFMge1xyXG4gICAgcHVibGljIGNvbm5lY3Rpb24/IDogQ29ubmVjdGlvbjtcclxufSJdfQ== \ No newline at end of file diff --git a/test.html b/test.html index aaa0108..43e3582 100644 --- a/test.html +++ b/test.html @@ -9,61 +9,61 @@ + \ No newline at end of file -- 2.25.1 From ba05a83286f119b2de9010e1a5cffa463bda9c18 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Abdussamed=20ULUTA=C5=9E?= Date: Fri, 16 Dec 2022 23:16:14 +0300 Subject: [PATCH 08/37] P2P Messaging complete --- Source/Services/Auth.js | 19 +++++- Source/Services/DataTransfer.js | 6 ++ frontend/Connection.ts | 3 +- frontend/EventTarget.ts | 32 ++++++++++ frontend/Peer.ts | 60 ++++++++++++++++-- frontend/WSTSProtocol.ts | 2 +- frontend/index.ts | 39 +++++++++++- package-lock.json | 15 ++++- package.json | 9 +-- script/index.js | 107 +++++++++++++++++++++++++++++--- script/index.js.map | 2 +- test.html | 29 +++++++-- tsconfig.json | 4 +- 13 files changed, 298 insertions(+), 29 deletions(-) create mode 100644 frontend/EventTarget.ts diff --git a/Source/Services/Auth.js b/Source/Services/Auth.js index 4f0097a..eb7a6b5 100644 --- a/Source/Services/Auth.js +++ b/Source/Services/Auth.js @@ -13,9 +13,26 @@ addService(({ end, next })=>{ - let {type,username,password,to} = message; + let {type,username,password,to,value} = message; switch(type) { + case "auth/pair-system":{ + if(value == 'everybody') + { + client.requiredPair = true; + end({status:"success"}); + } + if(value == 'disable') + { + client.requiredPair = false; + end({status:"success"}); + } + break; + } + case "my/socketid":{ + end(client.id); + break; + } case 'auth/public':{ client.requiredPair = false; return end({ diff --git a/Source/Services/DataTransfer.js b/Source/Services/DataTransfer.js index 6ef7388..ffe1b0f 100644 --- a/Source/Services/DataTransfer.js +++ b/Source/Services/DataTransfer.js @@ -30,6 +30,12 @@ addService(({ if(Client.clients.has(to)) { let otherPeer = Client.clients.get(to); + if(otherPeer.requiredPair && !otherPeer.pairs.has(to)) + { + return handshake && end({ + type: 'fail' + }) + } otherPeer.send([{ from: client.id, pack: pack diff --git a/frontend/Connection.ts b/frontend/Connection.ts index cd327c2..9d2adca 100644 --- a/frontend/Connection.ts +++ b/frontend/Connection.ts @@ -62,8 +62,9 @@ export class Connection { if(typeof data == "string") { + let $data = JSON.parse(data); for (const callback of this.recaivePackEvent) { - callback(JSON.parse(data)); + callback($data); } } } diff --git a/frontend/EventTarget.ts b/frontend/EventTarget.ts new file mode 100644 index 0000000..a1b76d7 --- /dev/null +++ b/frontend/EventTarget.ts @@ -0,0 +1,32 @@ +export default class EventTarget +{ + private events : {[key:string]:Function[]} = {}; + public emit(eventName :string, ...args:any[]) + { + if(this.events[eventName]) + { + for (const callback of this.events[eventName]) { + callback(...args); + } + } + } + public on(eventName :string, callback:Function) + { + if(this.events[eventName]) + { + this.events[eventName].push(callback) + }else{ + this.events[eventName] = [callback]; + } + } + public activeScope : boolean = false; + scope(f:Function) + { + if(this.activeScope) + { + f() + }else{ + this.on('scope', f) + } + } +} \ No newline at end of file diff --git a/frontend/Peer.ts b/frontend/Peer.ts index f5ac22a..aa9a7ac 100644 --- a/frontend/Peer.ts +++ b/frontend/Peer.ts @@ -1,17 +1,67 @@ +import EventTarget from "./EventTarget"; import MWSE from "./index"; interface IPeerOptions{ }; +interface IPeerMetadata{ -export default class Peer +}; + +export default class Peer extends EventTarget { - public wsts : MWSE; + public mwse : MWSE; public options! : IPeerOptions; + public socketId? : string; + public selfSocket : boolean = false; + public active : boolean = false; constructor(wsts:MWSE){ - this.wsts = wsts; + super(); + this.mwse = wsts; } - setPeerOptions(options:IPeerOptions){ - this.options = options; + setPeerOptions(options: string | IPeerOptions){ + if(typeof options == "string") + { + this.setSocketId(options) + }else{ + this.options = options; + } + } + setSocketId(uuid: string){ + this.socketId = uuid; + } + async metadata() : Promise + { + if(this.socketId == 'me') + { + let result = await this.mwse.EventPooling.request({ + type:'my/socketid' + }); + this.selfSocket = true; + this.active ||= true; + this.socketId = result; + this.emit('scope'); + this.activeScope = true; + return result; + } + } + async enablePairAuth(){ + await this.mwse.EventPooling.request({ + type:'auth/pair-system', + value: 'everybody' + }); + } + async disablePairAuth(){ + await this.mwse.EventPooling.request({ + type:'auth/pair-system', + value: 'disable' + }); + } + async send(pack: any){ + await this.mwse.EventPooling.request({ + type:'pack/to', + pack, + to: this.socketId + }); } } \ No newline at end of file diff --git a/frontend/WSTSProtocol.ts b/frontend/WSTSProtocol.ts index a2321ea..3556b27 100644 --- a/frontend/WSTSProtocol.ts +++ b/frontend/WSTSProtocol.ts @@ -34,7 +34,7 @@ export default class WSTSProtocol } public PackAnalyze(data:any) { - let [payload, id, action] = JSON.parse(data); + let [payload, id, action] = data; if(typeof id === 'number') { let callback = this.mwse.EventPooling.events.get(id); diff --git a/frontend/index.ts b/frontend/index.ts index 351e29e..0f42725 100644 --- a/frontend/index.ts +++ b/frontend/index.ts @@ -1,19 +1,42 @@ import {Connection,IConnection} from "./Connection"; import EventPool from "./EventPool"; +import EventTarget from "./EventTarget"; import Peer from "./Peer"; import Room, { IRoomOptions } from "./Room"; import WSTSProtocol from "./WSTSProtocol"; -export default class MWSE { +export default class MWSE extends EventTarget { public server! : Connection; public WSTSProtocol! : WSTSProtocol; public EventPooling! : EventPool; public rooms : Map = new Map(); public pairs : Map = new Map(); + public peers : Map = new Map(); + public me! : Peer; constructor(options: IConnection){ + super(); this.server = new Connection(options); this.server.connect(); this.WSTSProtocol = new WSTSProtocol(this); this.EventPooling = new EventPool(this); + this.me = new Peer(this); + this.me.scope(()=>{ + this.peers.set('me', this.me); + this.peers.set(this.me.socketId as string, this.me); + }) + this.server.onActive(async ()=>{ + this.me.setSocketId('me'); + await this.me.metadata(); + this.emit('scope'); + this.activeScope = true; + }); + this.packMessagingSystem(); + } + private packMessagingSystem() + { + this.EventPooling.signal('pack',(payload : {to:string,pack:any}) => { + let {to,pack} = payload; + this.peer(to).emit('message', pack); + }) } public room(options: IRoomOptions) { @@ -21,10 +44,22 @@ export default class MWSE { room.setRoomOptions(options); return room; } - public peer(options: IRoomOptions) + public peer(options: string | IRoomOptions) : Peer { + if(typeof options == "string") + { + if(this.peers.has(options)) + { + return this.peers.get(options) as Peer + } + if(this.pairs.has(options)) + { + return this.pairs.get(options) as Peer + } + } let peer = new Peer(this); peer.setPeerOptions(options); + this.emit('peer', peer); return peer; } }; diff --git a/package-lock.json b/package-lock.json index e5ea925..bcc09b1 100644 --- a/package-lock.json +++ b/package-lock.json @@ -21,7 +21,8 @@ }, "devDependencies": { "@parcel/packager-ts": "^2.7.0", - "@parcel/transformer-typescript-types": "^2.7.0" + "@parcel/transformer-typescript-types": "^2.7.0", + "tslib": "^2.4.1" } }, "node_modules/@cronvel/get-pixels": { @@ -3484,6 +3485,12 @@ "resolved": "https://registry.npmjs.org/tree-kit/-/tree-kit-0.7.4.tgz", "integrity": "sha512-Of3tPmVs3b6BhzyUJ7t0olisf47kYr9qAm0XaUpURMjdBn6TwiVaaMuTFoKkkvPGojd9trKAHlrGGcGKcdR1DA==" }, + "node_modules/tslib": { + "version": "2.4.1", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.4.1.tgz", + "integrity": "sha512-tGyy4dAjRIEwI7BzsB0lynWgOpfqjUdq91XXAlIWD2OwKBH7oCl/GZG/HT4BOHrTlPMOASlMQ7veyTqpmRcrNA==", + "dev": true + }, "node_modules/type": { "version": "1.2.0", "resolved": "https://registry.npmjs.org/type/-/type-1.2.0.tgz", @@ -6233,6 +6240,12 @@ "resolved": "https://registry.npmjs.org/tree-kit/-/tree-kit-0.7.4.tgz", "integrity": "sha512-Of3tPmVs3b6BhzyUJ7t0olisf47kYr9qAm0XaUpURMjdBn6TwiVaaMuTFoKkkvPGojd9trKAHlrGGcGKcdR1DA==" }, + "tslib": { + "version": "2.4.1", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.4.1.tgz", + "integrity": "sha512-tGyy4dAjRIEwI7BzsB0lynWgOpfqjUdq91XXAlIWD2OwKBH7oCl/GZG/HT4BOHrTlPMOASlMQ7veyTqpmRcrNA==", + "dev": true + }, "type": { "version": "1.2.0", "resolved": "https://registry.npmjs.org/type/-/type-1.2.0.tgz", diff --git a/package.json b/package.json index 870014e..e219209 100644 --- a/package.json +++ b/package.json @@ -6,9 +6,9 @@ "compile": "parcel watch --no-hmr" }, "source": "./frontend/index.ts", - "targets":{ - "default":{ - "distDir" : "./script/", + "targets": { + "default": { + "distDir": "./script/", "publicUrl": "./", "sourceMap": true, "outputFormat": "global", @@ -50,6 +50,7 @@ }, "devDependencies": { "@parcel/packager-ts": "^2.7.0", - "@parcel/transformer-typescript-types": "^2.7.0" + "@parcel/transformer-typescript-types": "^2.7.0", + "tslib": "^2.4.1" } } diff --git a/script/index.js b/script/index.js index b1c7c1a..e18d7d9 100644 --- a/script/index.js +++ b/script/index.js @@ -148,20 +148,42 @@ parcelHelpers.defineInteropFlag(exports); var _connection = require("./Connection"); var _eventPool = require("./EventPool"); var _eventPoolDefault = parcelHelpers.interopDefault(_eventPool); +var _eventTarget = require("./EventTarget"); +var _eventTargetDefault = parcelHelpers.interopDefault(_eventTarget); var _peer = require("./Peer"); var _peerDefault = parcelHelpers.interopDefault(_peer); var _room = require("./Room"); var _roomDefault = parcelHelpers.interopDefault(_room); var _wstsprotocol = require("./WSTSProtocol"); var _wstsprotocolDefault = parcelHelpers.interopDefault(_wstsprotocol); -class MWSE { +class MWSE extends (0, _eventTargetDefault.default) { rooms = new Map(); pairs = new Map(); + peers = new Map(); constructor(options){ + super(); this.server = new (0, _connection.Connection)(options); this.server.connect(); this.WSTSProtocol = new (0, _wstsprotocolDefault.default)(this); this.EventPooling = new (0, _eventPoolDefault.default)(this); + this.me = new (0, _peerDefault.default)(this); + this.me.scope(()=>{ + this.peers.set("me", this.me); + this.peers.set(this.me.socketId, this.me); + }); + this.server.onActive(async ()=>{ + this.me.setSocketId("me"); + await this.me.metadata(); + this.emit("scope"); + this.activeScope = true; + }); + this.packMessagingSystem(); + } + packMessagingSystem() { + this.EventPooling.signal("pack", (payload)=>{ + let { to , pack } = payload; + this.peer(to).emit("message", pack); + }); } room(options) { let room = new (0, _roomDefault.default)(this); @@ -169,15 +191,20 @@ class MWSE { return room; } peer(options) { + if (typeof options == "string") { + if (this.peers.has(options)) return this.peers.get(options); + if (this.pairs.has(options)) return this.pairs.get(options); + } let peer = new (0, _peerDefault.default)(this); peer.setPeerOptions(options); + this.emit("peer", peer); return peer; } } exports.default = MWSE; window.MWSE = MWSE; -},{"./Connection":"dzYK1","./EventPool":"37Faq","./Peer":"bVhKw","./Room":"7qlv2","./WSTSProtocol":"3kvWC","@parcel/transformer-js/src/esmodule-helpers.js":"i1YYE"}],"dzYK1":[function(require,module,exports) { +},{"./Connection":"dzYK1","./EventPool":"37Faq","./Peer":"bVhKw","./Room":"7qlv2","./WSTSProtocol":"3kvWC","@parcel/transformer-js/src/esmodule-helpers.js":"i1YYE","./EventTarget":"lleyn"}],"dzYK1":[function(require,module,exports) { var parcelHelpers = require("@parcel/transformer-js/src/esmodule-helpers.js"); parcelHelpers.defineInteropFlag(exports); parcelHelpers.export(exports, "Connection", ()=>Connection); @@ -221,7 +248,10 @@ class Connection { else this.activeConnectionEvent.push(func); } eventMessage(data) { - if (typeof data == "string") for (const callback of this.recaivePackEvent)callback(JSON.parse(data)); + if (typeof data == "string") { + let $data = JSON.parse(data); + for (const callback of this.recaivePackEvent)callback($data); + } } tranferToServer(data) { if (this.connected) this.ws.send(JSON.stringify(data)); @@ -305,16 +335,79 @@ exports.default = EventPool; },{"@parcel/transformer-js/src/esmodule-helpers.js":"i1YYE"}],"bVhKw":[function(require,module,exports) { var parcelHelpers = require("@parcel/transformer-js/src/esmodule-helpers.js"); parcelHelpers.defineInteropFlag(exports); -class Peer { +var _eventTarget = require("./EventTarget"); +var _eventTargetDefault = parcelHelpers.interopDefault(_eventTarget); +class Peer extends (0, _eventTargetDefault.default) { + selfSocket = false; + active = false; constructor(wsts){ - this.wsts = wsts; + super(); + this.mwse = wsts; } setPeerOptions(options) { - this.options = options; + if (typeof options == "string") this.setSocketId(options); + else this.options = options; + } + setSocketId(uuid) { + this.socketId = uuid; + } + async metadata() { + if (this.socketId == "me") { + let result = await this.mwse.EventPooling.request({ + type: "my/socketid" + }); + this.selfSocket = true; + this.active ||= true; + this.socketId = result; + this.emit("scope"); + this.activeScope = true; + return result; + } + } + async enablePairAuth() { + await this.mwse.EventPooling.request({ + type: "auth/pair-system", + value: "everybody" + }); + } + async disablePairAuth() { + await this.mwse.EventPooling.request({ + type: "auth/pair-system", + value: "disable" + }); + } + async send(pack) { + await this.mwse.EventPooling.request({ + type: "pack/to", + pack, + to: this.socketId + }); } } exports.default = Peer; +},{"./EventTarget":"lleyn","@parcel/transformer-js/src/esmodule-helpers.js":"i1YYE"}],"lleyn":[function(require,module,exports) { +var parcelHelpers = require("@parcel/transformer-js/src/esmodule-helpers.js"); +parcelHelpers.defineInteropFlag(exports); +class EventTarget { + events = {}; + emit(eventName, ...args) { + if (this.events[eventName]) for (const callback of this.events[eventName])callback(...args); + } + on(eventName, callback) { + if (this.events[eventName]) this.events[eventName].push(callback); + else this.events[eventName] = [ + callback + ]; + } + activeScope = false; + scope(f) { + if (this.activeScope) f(); + else this.on("scope", f); + } +} +exports.default = EventTarget; + },{"@parcel/transformer-js/src/esmodule-helpers.js":"i1YYE"}],"7qlv2":[function(require,module,exports) { var parcelHelpers = require("@parcel/transformer-js/src/esmodule-helpers.js"); parcelHelpers.defineInteropFlag(exports); @@ -375,7 +468,7 @@ class WSTSProtocol { ]); } PackAnalyze(data) { - let [payload, id, action] = JSON.parse(data); + let [payload, id, action] = data; if (typeof id === "number") { let callback = this.mwse.EventPooling.events.get(id); if (callback) { diff --git a/script/index.js.map b/script/index.js.map index fa15f8d..555528a 100644 --- a/script/index.js.map +++ b/script/index.js.map @@ -1 +1 @@ -{"mappings":"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","sources":["frontend/index.ts","frontend/Connection.ts","../../../AppData/Roaming/npm/node_modules/parcel/node_modules/@parcel/transformer-js/src/esmodule-helpers.js","frontend/EventPool.ts","frontend/Peer.ts","frontend/Room.ts","frontend/WSTSProtocol.ts"],"sourcesContent":["import {Connection,IConnection} from \"./Connection\";\r\nimport EventPool from \"./EventPool\";\r\nimport Peer from \"./Peer\";\r\nimport Room, { IRoomOptions } from \"./Room\";\r\nimport WSTSProtocol from \"./WSTSProtocol\";\r\nexport default class MWSE {\r\n public server! : Connection;\r\n public WSTSProtocol! : WSTSProtocol;\r\n public EventPooling! : EventPool;\r\n public rooms : Map = new Map();\r\n public pairs : Map = new Map();\r\n constructor(options: IConnection){\r\n this.server = new Connection(options);\r\n this.server.connect();\r\n this.WSTSProtocol = new WSTSProtocol(this);\r\n this.EventPooling = new EventPool(this);\r\n }\r\n public room(options: IRoomOptions)\r\n {\r\n let room = new Room(this);\r\n room.setRoomOptions(options);\r\n return room;\r\n }\r\n public peer(options: IRoomOptions)\r\n {\r\n let peer = new Peer(this);\r\n peer.setPeerOptions(options);\r\n return peer;\r\n }\r\n};\r\n\r\ndeclare global {\r\n interface Window {\r\n MWSE: any;\r\n }\r\n}\r\n\r\nwindow.MWSE = MWSE;","export interface IConnection{\r\n endpoint: string;\r\n autoPair?: boolean;\r\n}\r\nexport class Connection\r\n{\r\n public ws! : WebSocket;\r\n public endpoint : URL;\r\n public autoPair : boolean = false;\r\n public connected : boolean = false;\r\n constructor(options: IConnection){\r\n this.endpoint = new URL(options.endpoint);\r\n this.autoPair = options.autoPair || false;\r\n }\r\n public connect()\r\n {\r\n this.ws = new WebSocket(this.endpoint.href);\r\n this.addWSEvents();\r\n }\r\n public disconnect()\r\n {\r\n this.ws.close();\r\n }\r\n public addWSEvents()\r\n {\r\n this.ws.addEventListener(\"open\", () => this.eventOpen());\r\n this.ws.addEventListener(\"close\", () => this.eventClose());\r\n this.ws.addEventListener(\"error\", () => this.eventError());\r\n this.ws.addEventListener(\"message\", ({data}) => this.eventMessage(data as string | ArrayBuffer));\r\n }\r\n private eventOpen()\r\n {\r\n this.connected = true;\r\n for (const callback of this.activeConnectionEvent) {\r\n callback(void 0);\r\n }\r\n }\r\n private eventClose()\r\n {\r\n this.connected = false;\r\n }\r\n private eventError()\r\n {\r\n this.connected = false;\r\n }\r\n private recaivePackEvent : ((data:any) => any)[] = [];\r\n public onRecaivePack(func:(data:any) => any)\r\n {\r\n this.recaivePackEvent.push(func);\r\n }\r\n private activeConnectionEvent : Function[] = [];\r\n public onActive(func:Function)\r\n {\r\n if(this.connected)\r\n {\r\n func()\r\n }else{\r\n this.activeConnectionEvent.push(func);\r\n }\r\n }\r\n private eventMessage(data: string | ArrayBuffer)\r\n {\r\n if(typeof data == \"string\")\r\n {\r\n for (const callback of this.recaivePackEvent) {\r\n callback(JSON.parse(data));\r\n }\r\n }\r\n }\r\n public tranferToServer(data:any)\r\n {\r\n if(this.connected)\r\n {\r\n this.ws.send(JSON.stringify(data));\r\n }\r\n }\r\n}","exports.interopDefault = function (a) {\n return a && a.__esModule ? a : {default: a};\n};\n\nexports.defineInteropFlag = function (a) {\n Object.defineProperty(a, '__esModule', {value: true});\n};\n\nexports.exportAll = function (source, dest) {\n Object.keys(source).forEach(function (key) {\n if (key === 'default' || key === '__esModule' || dest.hasOwnProperty(key)) {\n return;\n }\n\n Object.defineProperty(dest, key, {\n enumerable: true,\n get: function () {\n return source[key];\n },\n });\n });\n\n return dest;\n};\n\nexports.export = function (dest, destName, get) {\n Object.defineProperty(dest, destName, {\n enumerable: true,\n get: get,\n });\n};\n","import MWSE from \"./index\";\r\nimport { Message } from \"./WSTSProtocol\";\r\n\r\nexport default class EventPool\r\n{\r\n public wsts : MWSE;\r\n public events : Map = new Map();\r\n public signals : Map = new Map();\r\n public count = 0;\r\n constructor(wsts:MWSE){\r\n this.wsts = wsts;\r\n }\r\n public request(msg: Message) : Promise\r\n {\r\n return new Promise((ok,rej) => {\r\n let id = ++this.count;\r\n this.wsts.WSTSProtocol.SendRequest(msg, id);\r\n this.events.set(id,[\r\n (data:any) => {\r\n ok(data);\r\n },\r\n (data:any) => {\r\n rej(data);\r\n }\r\n ]);\r\n })\r\n }\r\n public stream(msg: Message, callback: Function)\r\n {\r\n let id = ++this.count;\r\n this.wsts.WSTSProtocol.StartStream(msg, id);\r\n this.events.set(id,[\r\n (data:any) => {\r\n callback(data);\r\n },\r\n () => { }\r\n ]);\r\n }\r\n public signal(event: string, callback: Function)\r\n {\r\n let T = this.signals.get(event);\r\n if(!T)\r\n {\r\n this.signals.set(event, [callback]);\r\n }else{\r\n T.push(callback);\r\n }\r\n }\r\n}","import MWSE from \"./index\";\r\n\r\ninterface IPeerOptions{\r\n\r\n};\r\n\r\nexport default class Peer\r\n{\r\n public wsts : MWSE;\r\n public options! : IPeerOptions;\r\n constructor(wsts:MWSE){\r\n this.wsts = wsts;\r\n }\r\n setPeerOptions(options:IPeerOptions){\r\n this.options = options;\r\n }\r\n}","import MWSE from \"./index\";\r\n\r\nexport interface IRoomOptions\r\n{\r\n name: string;\r\n description?:string;\r\n joinType: \"free\"|\"invite\"|\"password\"|\"lock\";\r\n credential?: string;\r\n ifexistsJoin?: boolean;\r\n accessType?: \"public\"|\"private\";\r\n notifyActionInvite?: boolean;\r\n notifyActionJoined?: boolean;\r\n notifyActionEjected?: boolean;\r\n}\r\n\r\n\r\nexport default class Room\r\n{\r\n public mwse : MWSE;\r\n public options! : IRoomOptions;\r\n public events : {[key:string]:Function[]} = {};\r\n constructor(wsts:MWSE){\r\n this.mwse = wsts;\r\n }\r\n public setRoomOptions(options : IRoomOptions)\r\n {\r\n this.options = options;\r\n }\r\n private emit(eventName :string, ...args:any[])\r\n {\r\n if(this.events[eventName])\r\n {\r\n for (const callback of this.events[eventName]) {\r\n callback(...args);\r\n }\r\n }\r\n }\r\n public on(eventName :string, callback:Function)\r\n {\r\n if(this.events[eventName])\r\n {\r\n this.events[eventName].push(callback)\r\n }else{\r\n this.events[eventName] = [callback];\r\n }\r\n }\r\n}","import MWSE from \"./index\";\r\n\r\nexport interface Message {\r\n [key:string|number]:any;\r\n}\r\nexport default class WSTSProtocol\r\n{\r\n public mwse : MWSE;\r\n constructor(wsts:MWSE){\r\n this.mwse = wsts;\r\n this.addListener();\r\n }\r\n public addListener()\r\n {\r\n this.mwse.server?.onRecaivePack((pack)=>{\r\n this.PackAnalyze(pack)\r\n })\r\n }\r\n public SendRaw(pack: Message)\r\n {\r\n this.mwse.server.tranferToServer(pack);\r\n }\r\n public SendOnly(pack: Message)\r\n {\r\n this.mwse.server.tranferToServer([pack,'R']);\r\n }\r\n public SendRequest(pack: Message, id: number)\r\n {\r\n this.mwse.server.tranferToServer([pack, id, 'R']);\r\n }\r\n public StartStream(pack: Message, id: number)\r\n {\r\n this.mwse.server.tranferToServer([pack, id, 'S']);\r\n }\r\n public PackAnalyze(data:any)\r\n {\r\n let [payload, id, action] = JSON.parse(data);\r\n if(typeof id === 'number')\r\n {\r\n let callback = this.mwse.EventPooling.events.get(id);\r\n if(callback)\r\n {\r\n callback[0](payload, action);\r\n switch(action)\r\n {\r\n case 'E':{ // [E]ND flag\r\n this.mwse.EventPooling.events.delete(id);\r\n break;\r\n }\r\n case 'S': // [S]TREAM flag\r\n default:{\r\n break;\r\n }\r\n }\r\n }else console.warn(\"Missing event sended from server\");\r\n }else{\r\n let signals = this.mwse.EventPooling.signals.get(id);\r\n if(signals)\r\n {\r\n for (const callback of signals) {\r\n callback(payload);\r\n }\r\n }else console.warn(\"Missing event sended from server\");\r\n }\r\n }\r\n}"],"names":[],"version":3,"file":"index.js.map","sourceRoot":"../"} \ No newline at end of file +{"mappings":"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","sources":["frontend/index.ts","frontend/Connection.ts","../../../AppData/Roaming/npm/node_modules/parcel/node_modules/@parcel/transformer-js/src/esmodule-helpers.js","frontend/EventPool.ts","frontend/Peer.ts","frontend/EventTarget.ts","frontend/Room.ts","frontend/WSTSProtocol.ts"],"sourcesContent":["import {Connection,IConnection} from \"./Connection\";\r\nimport EventPool from \"./EventPool\";\r\nimport EventTarget from \"./EventTarget\";\r\nimport Peer from \"./Peer\";\r\nimport Room, { IRoomOptions } from \"./Room\";\r\nimport WSTSProtocol from \"./WSTSProtocol\";\r\nexport default class MWSE extends EventTarget {\r\n public server! : Connection;\r\n public WSTSProtocol! : WSTSProtocol;\r\n public EventPooling! : EventPool;\r\n public rooms : Map = new Map();\r\n public pairs : Map = new Map();\r\n public peers : Map = new Map();\r\n public me! : Peer;\r\n constructor(options: IConnection){\r\n super();\r\n this.server = new Connection(options);\r\n this.server.connect();\r\n this.WSTSProtocol = new WSTSProtocol(this);\r\n this.EventPooling = new EventPool(this);\r\n this.me = new Peer(this);\r\n this.me.scope(()=>{\r\n this.peers.set('me', this.me);\r\n this.peers.set(this.me.socketId as string, this.me);\r\n })\r\n this.server.onActive(async ()=>{\r\n this.me.setSocketId('me');\r\n await this.me.metadata();\r\n this.emit('scope');\r\n this.activeScope = true;\r\n });\r\n this.packMessagingSystem();\r\n }\r\n private packMessagingSystem()\r\n {\r\n this.EventPooling.signal('pack',(payload : {to:string,pack:any}) => {\r\n let {to,pack} = payload;\r\n this.peer(to).emit('message', pack);\r\n })\r\n }\r\n public room(options: IRoomOptions)\r\n {\r\n let room = new Room(this);\r\n room.setRoomOptions(options);\r\n return room;\r\n }\r\n public peer(options: string | IRoomOptions) : Peer\r\n {\r\n if(typeof options == \"string\")\r\n {\r\n if(this.peers.has(options))\r\n {\r\n return this.peers.get(options) as Peer\r\n }\r\n if(this.pairs.has(options))\r\n {\r\n return this.pairs.get(options) as Peer\r\n }\r\n }\r\n let peer = new Peer(this);\r\n peer.setPeerOptions(options);\r\n this.emit('peer', peer);\r\n return peer;\r\n }\r\n};\r\n\r\ndeclare global {\r\n interface Window {\r\n MWSE: any;\r\n }\r\n}\r\n\r\nwindow.MWSE = MWSE;","export interface IConnection{\r\n endpoint: string;\r\n autoPair?: boolean;\r\n}\r\nexport class Connection\r\n{\r\n public ws! : WebSocket;\r\n public endpoint : URL;\r\n public autoPair : boolean = false;\r\n public connected : boolean = false;\r\n constructor(options: IConnection){\r\n this.endpoint = new URL(options.endpoint);\r\n this.autoPair = options.autoPair || false;\r\n }\r\n public connect()\r\n {\r\n this.ws = new WebSocket(this.endpoint.href);\r\n this.addWSEvents();\r\n }\r\n public disconnect()\r\n {\r\n this.ws.close();\r\n }\r\n public addWSEvents()\r\n {\r\n this.ws.addEventListener(\"open\", () => this.eventOpen());\r\n this.ws.addEventListener(\"close\", () => this.eventClose());\r\n this.ws.addEventListener(\"error\", () => this.eventError());\r\n this.ws.addEventListener(\"message\", ({data}) => this.eventMessage(data as string | ArrayBuffer));\r\n }\r\n private eventOpen()\r\n {\r\n this.connected = true;\r\n for (const callback of this.activeConnectionEvent) {\r\n callback(void 0);\r\n }\r\n }\r\n private eventClose()\r\n {\r\n this.connected = false;\r\n }\r\n private eventError()\r\n {\r\n this.connected = false;\r\n }\r\n private recaivePackEvent : ((data:any) => any)[] = [];\r\n public onRecaivePack(func:(data:any) => any)\r\n {\r\n this.recaivePackEvent.push(func);\r\n }\r\n private activeConnectionEvent : Function[] = [];\r\n public onActive(func:Function)\r\n {\r\n if(this.connected)\r\n {\r\n func()\r\n }else{\r\n this.activeConnectionEvent.push(func);\r\n }\r\n }\r\n private eventMessage(data: string | ArrayBuffer)\r\n {\r\n if(typeof data == \"string\")\r\n {\r\n let $data = JSON.parse(data);\r\n for (const callback of this.recaivePackEvent) {\r\n callback($data);\r\n }\r\n }\r\n }\r\n public tranferToServer(data:any)\r\n {\r\n if(this.connected)\r\n {\r\n this.ws.send(JSON.stringify(data));\r\n }\r\n }\r\n}","exports.interopDefault = function (a) {\n return a && a.__esModule ? a : {default: a};\n};\n\nexports.defineInteropFlag = function (a) {\n Object.defineProperty(a, '__esModule', {value: true});\n};\n\nexports.exportAll = function (source, dest) {\n Object.keys(source).forEach(function (key) {\n if (key === 'default' || key === '__esModule' || dest.hasOwnProperty(key)) {\n return;\n }\n\n Object.defineProperty(dest, key, {\n enumerable: true,\n get: function () {\n return source[key];\n },\n });\n });\n\n return dest;\n};\n\nexports.export = function (dest, destName, get) {\n Object.defineProperty(dest, destName, {\n enumerable: true,\n get: get,\n });\n};\n","import MWSE from \"./index\";\r\nimport { Message } from \"./WSTSProtocol\";\r\n\r\nexport default class EventPool\r\n{\r\n public wsts : MWSE;\r\n public events : Map = new Map();\r\n public signals : Map = new Map();\r\n public count = 0;\r\n constructor(wsts:MWSE){\r\n this.wsts = wsts;\r\n }\r\n public request(msg: Message) : Promise\r\n {\r\n return new Promise((ok,rej) => {\r\n let id = ++this.count;\r\n this.wsts.WSTSProtocol.SendRequest(msg, id);\r\n this.events.set(id,[\r\n (data:any) => {\r\n ok(data);\r\n },\r\n (data:any) => {\r\n rej(data);\r\n }\r\n ]);\r\n })\r\n }\r\n public stream(msg: Message, callback: Function)\r\n {\r\n let id = ++this.count;\r\n this.wsts.WSTSProtocol.StartStream(msg, id);\r\n this.events.set(id,[\r\n (data:any) => {\r\n callback(data);\r\n },\r\n () => { }\r\n ]);\r\n }\r\n public signal(event: string, callback: Function)\r\n {\r\n let T = this.signals.get(event);\r\n if(!T)\r\n {\r\n this.signals.set(event, [callback]);\r\n }else{\r\n T.push(callback);\r\n }\r\n }\r\n}","import EventTarget from \"./EventTarget\";\r\nimport MWSE from \"./index\";\r\n\r\ninterface IPeerOptions{\r\n\r\n};\r\ninterface IPeerMetadata{\r\n\r\n};\r\n\r\nexport default class Peer extends EventTarget\r\n{\r\n public mwse : MWSE;\r\n public options! : IPeerOptions;\r\n public socketId? : string;\r\n public selfSocket : boolean = false;\r\n public active : boolean = false;\r\n constructor(wsts:MWSE){\r\n super();\r\n this.mwse = wsts;\r\n }\r\n setPeerOptions(options: string | IPeerOptions){\r\n if(typeof options == \"string\")\r\n {\r\n this.setSocketId(options)\r\n }else{\r\n this.options = options;\r\n }\r\n }\r\n setSocketId(uuid: string){\r\n this.socketId = uuid;\r\n }\r\n async metadata() : Promise\r\n {\r\n if(this.socketId == 'me')\r\n {\r\n let result = await this.mwse.EventPooling.request({\r\n type:'my/socketid'\r\n });\r\n this.selfSocket = true;\r\n this.active ||= true;\r\n this.socketId = result;\r\n this.emit('scope');\r\n this.activeScope = true;\r\n return result;\r\n }\r\n }\r\n async enablePairAuth(){\r\n await this.mwse.EventPooling.request({\r\n type:'auth/pair-system',\r\n value: 'everybody'\r\n });\r\n }\r\n async disablePairAuth(){\r\n await this.mwse.EventPooling.request({\r\n type:'auth/pair-system',\r\n value: 'disable'\r\n });\r\n }\r\n async send(pack: any){\r\n await this.mwse.EventPooling.request({\r\n type:'pack/to',\r\n pack,\r\n to: this.socketId\r\n });\r\n }\r\n}","export default class EventTarget\r\n{\r\n private events : {[key:string]:Function[]} = {};\r\n public emit(eventName :string, ...args:any[])\r\n {\r\n if(this.events[eventName])\r\n {\r\n for (const callback of this.events[eventName]) {\r\n callback(...args);\r\n }\r\n }\r\n }\r\n public on(eventName :string, callback:Function)\r\n {\r\n if(this.events[eventName])\r\n {\r\n this.events[eventName].push(callback)\r\n }else{\r\n this.events[eventName] = [callback];\r\n }\r\n }\r\n public activeScope : boolean = false;\r\n scope(f:Function)\r\n {\r\n if(this.activeScope)\r\n {\r\n f()\r\n }else{\r\n this.on('scope', f)\r\n }\r\n }\r\n}","import MWSE from \"./index\";\r\n\r\nexport interface IRoomOptions\r\n{\r\n name: string;\r\n description?:string;\r\n joinType: \"free\"|\"invite\"|\"password\"|\"lock\";\r\n credential?: string;\r\n ifexistsJoin?: boolean;\r\n accessType?: \"public\"|\"private\";\r\n notifyActionInvite?: boolean;\r\n notifyActionJoined?: boolean;\r\n notifyActionEjected?: boolean;\r\n}\r\n\r\n\r\nexport default class Room\r\n{\r\n public mwse : MWSE;\r\n public options! : IRoomOptions;\r\n public events : {[key:string]:Function[]} = {};\r\n constructor(wsts:MWSE){\r\n this.mwse = wsts;\r\n }\r\n public setRoomOptions(options : IRoomOptions)\r\n {\r\n this.options = options;\r\n }\r\n private emit(eventName :string, ...args:any[])\r\n {\r\n if(this.events[eventName])\r\n {\r\n for (const callback of this.events[eventName]) {\r\n callback(...args);\r\n }\r\n }\r\n }\r\n public on(eventName :string, callback:Function)\r\n {\r\n if(this.events[eventName])\r\n {\r\n this.events[eventName].push(callback)\r\n }else{\r\n this.events[eventName] = [callback];\r\n }\r\n }\r\n}","import MWSE from \"./index\";\r\n\r\nexport interface Message {\r\n [key:string|number]:any;\r\n}\r\nexport default class WSTSProtocol\r\n{\r\n public mwse : MWSE;\r\n constructor(wsts:MWSE){\r\n this.mwse = wsts;\r\n this.addListener();\r\n }\r\n public addListener()\r\n {\r\n this.mwse.server?.onRecaivePack((pack)=>{\r\n this.PackAnalyze(pack)\r\n })\r\n }\r\n public SendRaw(pack: Message)\r\n {\r\n this.mwse.server.tranferToServer(pack);\r\n }\r\n public SendOnly(pack: Message)\r\n {\r\n this.mwse.server.tranferToServer([pack,'R']);\r\n }\r\n public SendRequest(pack: Message, id: number)\r\n {\r\n this.mwse.server.tranferToServer([pack, id, 'R']);\r\n }\r\n public StartStream(pack: Message, id: number)\r\n {\r\n this.mwse.server.tranferToServer([pack, id, 'S']);\r\n }\r\n public PackAnalyze(data:any)\r\n {\r\n let [payload, id, action] = data;\r\n if(typeof id === 'number')\r\n {\r\n let callback = this.mwse.EventPooling.events.get(id);\r\n if(callback)\r\n {\r\n callback[0](payload, action);\r\n switch(action)\r\n {\r\n case 'E':{ // [E]ND flag\r\n this.mwse.EventPooling.events.delete(id);\r\n break;\r\n }\r\n case 'S': // [S]TREAM flag\r\n default:{\r\n break;\r\n }\r\n }\r\n }else console.warn(\"Missing event sended from server\");\r\n }else{\r\n let signals = this.mwse.EventPooling.signals.get(id);\r\n if(signals)\r\n {\r\n for (const callback of signals) {\r\n callback(payload);\r\n }\r\n }else console.warn(\"Missing event sended from server\");\r\n }\r\n }\r\n}"],"names":[],"version":3,"file":"index.js.map","sourceRoot":"../"} \ No newline at end of file diff --git a/test.html b/test.html index 3d2208d..93bf2cd 100644 --- a/test.html +++ b/test.html @@ -9,10 +9,31 @@ \ No newline at end of file diff --git a/tsconfig.json b/tsconfig.json index 1ba353a..0e7a88c 100644 --- a/tsconfig.json +++ b/tsconfig.json @@ -46,7 +46,7 @@ "allowJs": true, /* Allow JavaScript files to be a part of your program. Use the 'checkJS' option to get errors from these files. */ "checkJs": true, /* Enable error reporting in type-checked JavaScript files. */ // "maxNodeModuleJsDepth": 1, /* Specify the maximum folder depth used for checking JavaScript files from 'node_modules'. Only applicable with 'allowJs'. */ - + /* Emit */ "declaration": true, /* Generate .d.ts files from TypeScript and JavaScript files in your project. */ "declarationMap": true, /* Create sourcemaps for d.ts files. */ @@ -56,7 +56,7 @@ "outDir": "./script", /* Specify an output folder for all emitted files. */ "removeComments": true, /* Disable emitting comments. */ // "noEmit": true, /* Disable emitting files from a compilation. */ - "importHelpers": true, /* Allow importing helper functions from tslib once per project, instead of including them per-file. */ + "importHelpers": false, /* Allow importing helper functions from tslib once per project, instead of including them per-file. */ "importsNotUsedAsValues": "remove", /* Specify emit/checking behavior for imports that are only used for types. */ // "downlevelIteration": true, /* Emit more compliant, but verbose and less performant JavaScript for iteration. */ // "sourceRoot": "", /* Specify the root path for debuggers to find the reference source code. */ -- 2.25.1 From d0712ad198b6a985e2c729bf182ad4190928bb7f Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Abdussamed=20ULUTA=C5=9E?= Date: Fri, 16 Dec 2022 23:54:10 +0300 Subject: [PATCH 09/37] Room Messaging complete --- Source/Services/DataTransfer.js | 4 +- Source/Services/Room.js | 10 ++-- frontend/Peer.ts | 2 - frontend/Room.ts | 84 +++++++++++++++++++++++++-------- frontend/index.ts | 19 +++++++- script/index.js | 68 +++++++++++++++++++++----- script/index.js.map | 2 +- test.html | 27 +++++++---- 8 files changed, 167 insertions(+), 49 deletions(-) diff --git a/Source/Services/DataTransfer.js b/Source/Services/DataTransfer.js index ffe1b0f..2cbb360 100644 --- a/Source/Services/DataTransfer.js +++ b/Source/Services/DataTransfer.js @@ -51,7 +51,7 @@ addService(({ break; } case "pack/room":{ - let {to,pack, handshake} = message; + let {to,pack, handshake,wom} = message; if(Room.rooms.has(to)) { if(!client.rooms.has(to)) @@ -63,7 +63,7 @@ addService(({ Room.rooms.get(to).send([{ from: client.id, pack: pack - }, 'pack']); + }, 'pack'], wom ? client.id : void 0); handshake && end({ type: 'success' }) diff --git a/Source/Services/Room.js b/Source/Services/Room.js index 37f12c9..04a8693 100644 --- a/Source/Services/Room.js +++ b/Source/Services/Room.js @@ -83,9 +83,12 @@ Room.prototype.toJSON = function(){ obj.waitingInvited = [...this.waitingInvited]; return obj; }; -Room.prototype.send = function(obj){ +Room.prototype.send = function(obj, withOut){ for (const client of this.clients.values()) { - client.send(obj); + if(client.id != withOut) + { + client.send(obj); + } } term.green("Room bulk message ").white(this.name," in ").yellow(this.clients.size + "").white(" clients")('\n'); }; @@ -171,7 +174,8 @@ let CreateRoomVerify = joi.object({ joinType: joi.string().pattern(/^free$|^invite$|^password$|^lock$/).required(), description: joi.string().required(), name: joi.string().required(), - credential: joi.string().optional() + credential: joi.string().optional(), + ifexistsJoin: joi.boolean().optional() }); addService(({ diff --git a/frontend/Peer.ts b/frontend/Peer.ts index aa9a7ac..933c1ca 100644 --- a/frontend/Peer.ts +++ b/frontend/Peer.ts @@ -4,9 +4,7 @@ import MWSE from "./index"; interface IPeerOptions{ }; -interface IPeerMetadata{ -}; export default class Peer extends EventTarget { diff --git a/frontend/Room.ts b/frontend/Room.ts index 3a4dd34..fb7bfef 100644 --- a/frontend/Room.ts +++ b/frontend/Room.ts @@ -1,3 +1,4 @@ +import EventTarget from "./EventTarget"; import MWSE from "./index"; export interface IRoomOptions @@ -14,34 +15,79 @@ export interface IRoomOptions } -export default class Room +export default class Room extends EventTarget { public mwse : MWSE; public options! : IRoomOptions; - public events : {[key:string]:Function[]} = {}; + public roomId? : string; + + public accessType? : "public"|"private"; + public description? : string; + public joinType? : "free"|"invite"|"password"|"lock"; + public name? : string; + public owner? : string; + constructor(wsts:MWSE){ + super(); this.mwse = wsts; } - public setRoomOptions(options : IRoomOptions) + public setRoomOptions(options : IRoomOptions | string) { - this.options = options; - } - private emit(eventName :string, ...args:any[]) - { - if(this.events[eventName]) + if(typeof options == "string") { - for (const callback of this.events[eventName]) { - callback(...args); - } - } - } - public on(eventName :string, callback:Function) - { - if(this.events[eventName]) - { - this.events[eventName].push(callback) + this.roomId = options; }else{ - this.events[eventName] = [callback]; + this.options = options; } } + + setRoomId(uuid: string){ + this.roomId = uuid; + } + async createRoom(roomOptions : IRoomOptions){ + let options = this.options || roomOptions; + let result = await this.mwse.EventPooling.request({ + type:'create-room', + ...options + }); + if(result.status == 'fail') + { + if(result.message == "ALREADY-EXISTS") + { + return this.join(); + } + throw new Error(result.message || result.messages); + }else{ + this.options = { + ...this.options, + ...result.room + }; + this.roomId = result.room.id; + } + } + async join(){ + let result = await this.mwse.EventPooling.request({ + type:'joinroom', + name: this.options.name, + credential: this.options.credential + }); + if(result.status == 'fail') + { + throw new Error(result.message); + }else{ + this.options = { + ...this.options, + ...result.room + }; + this.roomId = result.room.id; + } + } + async send(pack: any, wom:boolean = false){ + await this.mwse.EventPooling.request({ + type:'pack/room', + pack, + to: this.roomId, + wom + }); + } } \ No newline at end of file diff --git a/frontend/index.ts b/frontend/index.ts index 0f42725..28d8097 100644 --- a/frontend/index.ts +++ b/frontend/index.ts @@ -37,11 +37,28 @@ export default class MWSE extends EventTarget { let {to,pack} = payload; this.peer(to).emit('message', pack); }) + this.EventPooling.signal('pack/room',(payload : {to:string,pack:any}) => { + let {to,pack} = payload; + this.room(to).emit('message', pack); + }) + } - public room(options: IRoomOptions) + public room(options: IRoomOptions | string) : Room { + if(typeof options == "string") + { + if(this.rooms.has(options)) + { + return this.rooms.get(options) as Room + } + if(this.rooms.has(options)) + { + return this.rooms.get(options) as Room + } + } let room = new Room(this); room.setRoomOptions(options); + this.emit('room'); return room; } public peer(options: string | IRoomOptions) : Peer diff --git a/script/index.js b/script/index.js index e18d7d9..046e3eb 100644 --- a/script/index.js +++ b/script/index.js @@ -184,10 +184,19 @@ class MWSE extends (0, _eventTargetDefault.default) { let { to , pack } = payload; this.peer(to).emit("message", pack); }); + this.EventPooling.signal("pack/room", (payload)=>{ + let { to , pack } = payload; + this.room(to).emit("message", pack); + }); } room(options) { + if (typeof options == "string") { + if (this.rooms.has(options)) return this.rooms.get(options); + if (this.rooms.has(options)) return this.rooms.get(options); + } let room = new (0, _roomDefault.default)(this); room.setRoomOptions(options); + this.emit("room"); return room; } peer(options) { @@ -411,27 +420,64 @@ exports.default = EventTarget; },{"@parcel/transformer-js/src/esmodule-helpers.js":"i1YYE"}],"7qlv2":[function(require,module,exports) { var parcelHelpers = require("@parcel/transformer-js/src/esmodule-helpers.js"); parcelHelpers.defineInteropFlag(exports); -class Room { - events = {}; +var _eventTarget = require("./EventTarget"); +var _eventTargetDefault = parcelHelpers.interopDefault(_eventTarget); +class Room extends (0, _eventTargetDefault.default) { constructor(wsts){ + super(); this.mwse = wsts; } setRoomOptions(options) { - this.options = options; + if (typeof options == "string") this.roomId = options; + else this.options = options; } - emit(eventName, ...args) { - if (this.events[eventName]) for (const callback of this.events[eventName])callback(...args); + setRoomId(uuid) { + this.roomId = uuid; } - on(eventName, callback) { - if (this.events[eventName]) this.events[eventName].push(callback); - else this.events[eventName] = [ - callback - ]; + async createRoom(roomOptions) { + let options = this.options || roomOptions; + let result = await this.mwse.EventPooling.request({ + type: "create-room", + ...options + }); + if (result.status == "fail") { + if (result.message == "ALREADY-EXISTS") return this.join(); + throw new Error(result.message || result.messages); + } else { + this.options = { + ...this.options, + ...result.room + }; + this.roomId = result.room.id; + } + } + async join() { + let result = await this.mwse.EventPooling.request({ + type: "joinroom", + name: this.options.name, + credential: this.options.credential + }); + if (result.status == "fail") throw new Error(result.message); + else { + this.options = { + ...this.options, + ...result.room + }; + this.roomId = result.room.id; + } + } + async send(pack, wom = false) { + await this.mwse.EventPooling.request({ + type: "pack/room", + pack, + to: this.roomId, + wom + }); } } exports.default = Room; -},{"@parcel/transformer-js/src/esmodule-helpers.js":"i1YYE"}],"3kvWC":[function(require,module,exports) { +},{"@parcel/transformer-js/src/esmodule-helpers.js":"i1YYE","./EventTarget":"lleyn"}],"3kvWC":[function(require,module,exports) { var parcelHelpers = require("@parcel/transformer-js/src/esmodule-helpers.js"); parcelHelpers.defineInteropFlag(exports); class WSTSProtocol { diff --git a/script/index.js.map b/script/index.js.map index 555528a..2f93e22 100644 --- a/script/index.js.map +++ b/script/index.js.map @@ -1 +1 @@ -{"mappings":"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","sources":["frontend/index.ts","frontend/Connection.ts","../../../AppData/Roaming/npm/node_modules/parcel/node_modules/@parcel/transformer-js/src/esmodule-helpers.js","frontend/EventPool.ts","frontend/Peer.ts","frontend/EventTarget.ts","frontend/Room.ts","frontend/WSTSProtocol.ts"],"sourcesContent":["import {Connection,IConnection} from \"./Connection\";\r\nimport EventPool from \"./EventPool\";\r\nimport EventTarget from \"./EventTarget\";\r\nimport Peer from \"./Peer\";\r\nimport Room, { IRoomOptions } from \"./Room\";\r\nimport WSTSProtocol from \"./WSTSProtocol\";\r\nexport default class MWSE extends EventTarget {\r\n public server! : Connection;\r\n public WSTSProtocol! : WSTSProtocol;\r\n public EventPooling! : EventPool;\r\n public rooms : Map = new Map();\r\n public pairs : Map = new Map();\r\n public peers : Map = new Map();\r\n public me! : Peer;\r\n constructor(options: IConnection){\r\n super();\r\n this.server = new Connection(options);\r\n this.server.connect();\r\n this.WSTSProtocol = new WSTSProtocol(this);\r\n this.EventPooling = new EventPool(this);\r\n this.me = new Peer(this);\r\n this.me.scope(()=>{\r\n this.peers.set('me', this.me);\r\n this.peers.set(this.me.socketId as string, this.me);\r\n })\r\n this.server.onActive(async ()=>{\r\n this.me.setSocketId('me');\r\n await this.me.metadata();\r\n this.emit('scope');\r\n this.activeScope = true;\r\n });\r\n this.packMessagingSystem();\r\n }\r\n private packMessagingSystem()\r\n {\r\n this.EventPooling.signal('pack',(payload : {to:string,pack:any}) => {\r\n let {to,pack} = payload;\r\n this.peer(to).emit('message', pack);\r\n })\r\n }\r\n public room(options: IRoomOptions)\r\n {\r\n let room = new Room(this);\r\n room.setRoomOptions(options);\r\n return room;\r\n }\r\n public peer(options: string | IRoomOptions) : Peer\r\n {\r\n if(typeof options == \"string\")\r\n {\r\n if(this.peers.has(options))\r\n {\r\n return this.peers.get(options) as Peer\r\n }\r\n if(this.pairs.has(options))\r\n {\r\n return this.pairs.get(options) as Peer\r\n }\r\n }\r\n let peer = new Peer(this);\r\n peer.setPeerOptions(options);\r\n this.emit('peer', peer);\r\n return peer;\r\n }\r\n};\r\n\r\ndeclare global {\r\n interface Window {\r\n MWSE: any;\r\n }\r\n}\r\n\r\nwindow.MWSE = MWSE;","export interface IConnection{\r\n endpoint: string;\r\n autoPair?: boolean;\r\n}\r\nexport class Connection\r\n{\r\n public ws! : WebSocket;\r\n public endpoint : URL;\r\n public autoPair : boolean = false;\r\n public connected : boolean = false;\r\n constructor(options: IConnection){\r\n this.endpoint = new URL(options.endpoint);\r\n this.autoPair = options.autoPair || false;\r\n }\r\n public connect()\r\n {\r\n this.ws = new WebSocket(this.endpoint.href);\r\n this.addWSEvents();\r\n }\r\n public disconnect()\r\n {\r\n this.ws.close();\r\n }\r\n public addWSEvents()\r\n {\r\n this.ws.addEventListener(\"open\", () => this.eventOpen());\r\n this.ws.addEventListener(\"close\", () => this.eventClose());\r\n this.ws.addEventListener(\"error\", () => this.eventError());\r\n this.ws.addEventListener(\"message\", ({data}) => this.eventMessage(data as string | ArrayBuffer));\r\n }\r\n private eventOpen()\r\n {\r\n this.connected = true;\r\n for (const callback of this.activeConnectionEvent) {\r\n callback(void 0);\r\n }\r\n }\r\n private eventClose()\r\n {\r\n this.connected = false;\r\n }\r\n private eventError()\r\n {\r\n this.connected = false;\r\n }\r\n private recaivePackEvent : ((data:any) => any)[] = [];\r\n public onRecaivePack(func:(data:any) => any)\r\n {\r\n this.recaivePackEvent.push(func);\r\n }\r\n private activeConnectionEvent : Function[] = [];\r\n public onActive(func:Function)\r\n {\r\n if(this.connected)\r\n {\r\n func()\r\n }else{\r\n this.activeConnectionEvent.push(func);\r\n }\r\n }\r\n private eventMessage(data: string | ArrayBuffer)\r\n {\r\n if(typeof data == \"string\")\r\n {\r\n let $data = JSON.parse(data);\r\n for (const callback of this.recaivePackEvent) {\r\n callback($data);\r\n }\r\n }\r\n }\r\n public tranferToServer(data:any)\r\n {\r\n if(this.connected)\r\n {\r\n this.ws.send(JSON.stringify(data));\r\n }\r\n }\r\n}","exports.interopDefault = function (a) {\n return a && a.__esModule ? a : {default: a};\n};\n\nexports.defineInteropFlag = function (a) {\n Object.defineProperty(a, '__esModule', {value: true});\n};\n\nexports.exportAll = function (source, dest) {\n Object.keys(source).forEach(function (key) {\n if (key === 'default' || key === '__esModule' || dest.hasOwnProperty(key)) {\n return;\n }\n\n Object.defineProperty(dest, key, {\n enumerable: true,\n get: function () {\n return source[key];\n },\n });\n });\n\n return dest;\n};\n\nexports.export = function (dest, destName, get) {\n Object.defineProperty(dest, destName, {\n enumerable: true,\n get: get,\n });\n};\n","import MWSE from \"./index\";\r\nimport { Message } from \"./WSTSProtocol\";\r\n\r\nexport default class EventPool\r\n{\r\n public wsts : MWSE;\r\n public events : Map = new Map();\r\n public signals : Map = new Map();\r\n public count = 0;\r\n constructor(wsts:MWSE){\r\n this.wsts = wsts;\r\n }\r\n public request(msg: Message) : Promise\r\n {\r\n return new Promise((ok,rej) => {\r\n let id = ++this.count;\r\n this.wsts.WSTSProtocol.SendRequest(msg, id);\r\n this.events.set(id,[\r\n (data:any) => {\r\n ok(data);\r\n },\r\n (data:any) => {\r\n rej(data);\r\n }\r\n ]);\r\n })\r\n }\r\n public stream(msg: Message, callback: Function)\r\n {\r\n let id = ++this.count;\r\n this.wsts.WSTSProtocol.StartStream(msg, id);\r\n this.events.set(id,[\r\n (data:any) => {\r\n callback(data);\r\n },\r\n () => { }\r\n ]);\r\n }\r\n public signal(event: string, callback: Function)\r\n {\r\n let T = this.signals.get(event);\r\n if(!T)\r\n {\r\n this.signals.set(event, [callback]);\r\n }else{\r\n T.push(callback);\r\n }\r\n }\r\n}","import EventTarget from \"./EventTarget\";\r\nimport MWSE from \"./index\";\r\n\r\ninterface IPeerOptions{\r\n\r\n};\r\ninterface IPeerMetadata{\r\n\r\n};\r\n\r\nexport default class Peer extends EventTarget\r\n{\r\n public mwse : MWSE;\r\n public options! : IPeerOptions;\r\n public socketId? : string;\r\n public selfSocket : boolean = false;\r\n public active : boolean = false;\r\n constructor(wsts:MWSE){\r\n super();\r\n this.mwse = wsts;\r\n }\r\n setPeerOptions(options: string | IPeerOptions){\r\n if(typeof options == \"string\")\r\n {\r\n this.setSocketId(options)\r\n }else{\r\n this.options = options;\r\n }\r\n }\r\n setSocketId(uuid: string){\r\n this.socketId = uuid;\r\n }\r\n async metadata() : Promise\r\n {\r\n if(this.socketId == 'me')\r\n {\r\n let result = await this.mwse.EventPooling.request({\r\n type:'my/socketid'\r\n });\r\n this.selfSocket = true;\r\n this.active ||= true;\r\n this.socketId = result;\r\n this.emit('scope');\r\n this.activeScope = true;\r\n return result;\r\n }\r\n }\r\n async enablePairAuth(){\r\n await this.mwse.EventPooling.request({\r\n type:'auth/pair-system',\r\n value: 'everybody'\r\n });\r\n }\r\n async disablePairAuth(){\r\n await this.mwse.EventPooling.request({\r\n type:'auth/pair-system',\r\n value: 'disable'\r\n });\r\n }\r\n async send(pack: any){\r\n await this.mwse.EventPooling.request({\r\n type:'pack/to',\r\n pack,\r\n to: this.socketId\r\n });\r\n }\r\n}","export default class EventTarget\r\n{\r\n private events : {[key:string]:Function[]} = {};\r\n public emit(eventName :string, ...args:any[])\r\n {\r\n if(this.events[eventName])\r\n {\r\n for (const callback of this.events[eventName]) {\r\n callback(...args);\r\n }\r\n }\r\n }\r\n public on(eventName :string, callback:Function)\r\n {\r\n if(this.events[eventName])\r\n {\r\n this.events[eventName].push(callback)\r\n }else{\r\n this.events[eventName] = [callback];\r\n }\r\n }\r\n public activeScope : boolean = false;\r\n scope(f:Function)\r\n {\r\n if(this.activeScope)\r\n {\r\n f()\r\n }else{\r\n this.on('scope', f)\r\n }\r\n }\r\n}","import MWSE from \"./index\";\r\n\r\nexport interface IRoomOptions\r\n{\r\n name: string;\r\n description?:string;\r\n joinType: \"free\"|\"invite\"|\"password\"|\"lock\";\r\n credential?: string;\r\n ifexistsJoin?: boolean;\r\n accessType?: \"public\"|\"private\";\r\n notifyActionInvite?: boolean;\r\n notifyActionJoined?: boolean;\r\n notifyActionEjected?: boolean;\r\n}\r\n\r\n\r\nexport default class Room\r\n{\r\n public mwse : MWSE;\r\n public options! : IRoomOptions;\r\n public events : {[key:string]:Function[]} = {};\r\n constructor(wsts:MWSE){\r\n this.mwse = wsts;\r\n }\r\n public setRoomOptions(options : IRoomOptions)\r\n {\r\n this.options = options;\r\n }\r\n private emit(eventName :string, ...args:any[])\r\n {\r\n if(this.events[eventName])\r\n {\r\n for (const callback of this.events[eventName]) {\r\n callback(...args);\r\n }\r\n }\r\n }\r\n public on(eventName :string, callback:Function)\r\n {\r\n if(this.events[eventName])\r\n {\r\n this.events[eventName].push(callback)\r\n }else{\r\n this.events[eventName] = [callback];\r\n }\r\n }\r\n}","import MWSE from \"./index\";\r\n\r\nexport interface Message {\r\n [key:string|number]:any;\r\n}\r\nexport default class WSTSProtocol\r\n{\r\n public mwse : MWSE;\r\n constructor(wsts:MWSE){\r\n this.mwse = wsts;\r\n this.addListener();\r\n }\r\n public addListener()\r\n {\r\n this.mwse.server?.onRecaivePack((pack)=>{\r\n this.PackAnalyze(pack)\r\n })\r\n }\r\n public SendRaw(pack: Message)\r\n {\r\n this.mwse.server.tranferToServer(pack);\r\n }\r\n public SendOnly(pack: Message)\r\n {\r\n this.mwse.server.tranferToServer([pack,'R']);\r\n }\r\n public SendRequest(pack: Message, id: number)\r\n {\r\n this.mwse.server.tranferToServer([pack, id, 'R']);\r\n }\r\n public StartStream(pack: Message, id: number)\r\n {\r\n this.mwse.server.tranferToServer([pack, id, 'S']);\r\n }\r\n public PackAnalyze(data:any)\r\n {\r\n let [payload, id, action] = data;\r\n if(typeof id === 'number')\r\n {\r\n let callback = this.mwse.EventPooling.events.get(id);\r\n if(callback)\r\n {\r\n callback[0](payload, action);\r\n switch(action)\r\n {\r\n case 'E':{ // [E]ND flag\r\n this.mwse.EventPooling.events.delete(id);\r\n break;\r\n }\r\n case 'S': // [S]TREAM flag\r\n default:{\r\n break;\r\n }\r\n }\r\n }else console.warn(\"Missing event sended from server\");\r\n }else{\r\n let signals = this.mwse.EventPooling.signals.get(id);\r\n if(signals)\r\n {\r\n for (const callback of signals) {\r\n callback(payload);\r\n }\r\n }else console.warn(\"Missing event sended from server\");\r\n }\r\n }\r\n}"],"names":[],"version":3,"file":"index.js.map","sourceRoot":"../"} \ No newline at end of file +{"mappings":"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","sources":["frontend/index.ts","frontend/Connection.ts","../../../AppData/Roaming/npm/node_modules/parcel/node_modules/@parcel/transformer-js/src/esmodule-helpers.js","frontend/EventPool.ts","frontend/Peer.ts","frontend/EventTarget.ts","frontend/Room.ts","frontend/WSTSProtocol.ts"],"sourcesContent":["import {Connection,IConnection} from \"./Connection\";\r\nimport EventPool from \"./EventPool\";\r\nimport EventTarget from \"./EventTarget\";\r\nimport Peer from \"./Peer\";\r\nimport Room, { IRoomOptions } from \"./Room\";\r\nimport WSTSProtocol from \"./WSTSProtocol\";\r\nexport default class MWSE extends EventTarget {\r\n public server! : Connection;\r\n public WSTSProtocol! : WSTSProtocol;\r\n public EventPooling! : EventPool;\r\n public rooms : Map = new Map();\r\n public pairs : Map = new Map();\r\n public peers : Map = new Map();\r\n public me! : Peer;\r\n constructor(options: IConnection){\r\n super();\r\n this.server = new Connection(options);\r\n this.server.connect();\r\n this.WSTSProtocol = new WSTSProtocol(this);\r\n this.EventPooling = new EventPool(this);\r\n this.me = new Peer(this);\r\n this.me.scope(()=>{\r\n this.peers.set('me', this.me);\r\n this.peers.set(this.me.socketId as string, this.me);\r\n })\r\n this.server.onActive(async ()=>{\r\n this.me.setSocketId('me');\r\n await this.me.metadata();\r\n this.emit('scope');\r\n this.activeScope = true;\r\n });\r\n this.packMessagingSystem();\r\n }\r\n private packMessagingSystem()\r\n {\r\n this.EventPooling.signal('pack',(payload : {to:string,pack:any}) => {\r\n let {to,pack} = payload;\r\n this.peer(to).emit('message', pack);\r\n })\r\n this.EventPooling.signal('pack/room',(payload : {to:string,pack:any}) => {\r\n let {to,pack} = payload;\r\n this.room(to).emit('message', pack);\r\n })\r\n \r\n }\r\n public room(options: IRoomOptions | string) : Room\r\n {\r\n if(typeof options == \"string\")\r\n {\r\n if(this.rooms.has(options))\r\n {\r\n return this.rooms.get(options) as Room\r\n }\r\n if(this.rooms.has(options))\r\n {\r\n return this.rooms.get(options) as Room\r\n }\r\n }\r\n let room = new Room(this);\r\n room.setRoomOptions(options);\r\n this.emit('room');\r\n return room;\r\n }\r\n public peer(options: string | IRoomOptions) : Peer\r\n {\r\n if(typeof options == \"string\")\r\n {\r\n if(this.peers.has(options))\r\n {\r\n return this.peers.get(options) as Peer\r\n }\r\n if(this.pairs.has(options))\r\n {\r\n return this.pairs.get(options) as Peer\r\n }\r\n }\r\n let peer = new Peer(this);\r\n peer.setPeerOptions(options);\r\n this.emit('peer', peer);\r\n return peer;\r\n }\r\n};\r\n\r\ndeclare global {\r\n interface Window {\r\n MWSE: any;\r\n }\r\n}\r\n\r\nwindow.MWSE = MWSE;","export interface IConnection{\r\n endpoint: string;\r\n autoPair?: boolean;\r\n}\r\nexport class Connection\r\n{\r\n public ws! : WebSocket;\r\n public endpoint : URL;\r\n public autoPair : boolean = false;\r\n public connected : boolean = false;\r\n constructor(options: IConnection){\r\n this.endpoint = new URL(options.endpoint);\r\n this.autoPair = options.autoPair || false;\r\n }\r\n public connect()\r\n {\r\n this.ws = new WebSocket(this.endpoint.href);\r\n this.addWSEvents();\r\n }\r\n public disconnect()\r\n {\r\n this.ws.close();\r\n }\r\n public addWSEvents()\r\n {\r\n this.ws.addEventListener(\"open\", () => this.eventOpen());\r\n this.ws.addEventListener(\"close\", () => this.eventClose());\r\n this.ws.addEventListener(\"error\", () => this.eventError());\r\n this.ws.addEventListener(\"message\", ({data}) => this.eventMessage(data as string | ArrayBuffer));\r\n }\r\n private eventOpen()\r\n {\r\n this.connected = true;\r\n for (const callback of this.activeConnectionEvent) {\r\n callback(void 0);\r\n }\r\n }\r\n private eventClose()\r\n {\r\n this.connected = false;\r\n }\r\n private eventError()\r\n {\r\n this.connected = false;\r\n }\r\n private recaivePackEvent : ((data:any) => any)[] = [];\r\n public onRecaivePack(func:(data:any) => any)\r\n {\r\n this.recaivePackEvent.push(func);\r\n }\r\n private activeConnectionEvent : Function[] = [];\r\n public onActive(func:Function)\r\n {\r\n if(this.connected)\r\n {\r\n func()\r\n }else{\r\n this.activeConnectionEvent.push(func);\r\n }\r\n }\r\n private eventMessage(data: string | ArrayBuffer)\r\n {\r\n if(typeof data == \"string\")\r\n {\r\n let $data = JSON.parse(data);\r\n for (const callback of this.recaivePackEvent) {\r\n callback($data);\r\n }\r\n }\r\n }\r\n public tranferToServer(data:any)\r\n {\r\n if(this.connected)\r\n {\r\n this.ws.send(JSON.stringify(data));\r\n }\r\n }\r\n}","exports.interopDefault = function (a) {\n return a && a.__esModule ? a : {default: a};\n};\n\nexports.defineInteropFlag = function (a) {\n Object.defineProperty(a, '__esModule', {value: true});\n};\n\nexports.exportAll = function (source, dest) {\n Object.keys(source).forEach(function (key) {\n if (key === 'default' || key === '__esModule' || dest.hasOwnProperty(key)) {\n return;\n }\n\n Object.defineProperty(dest, key, {\n enumerable: true,\n get: function () {\n return source[key];\n },\n });\n });\n\n return dest;\n};\n\nexports.export = function (dest, destName, get) {\n Object.defineProperty(dest, destName, {\n enumerable: true,\n get: get,\n });\n};\n","import MWSE from \"./index\";\r\nimport { Message } from \"./WSTSProtocol\";\r\n\r\nexport default class EventPool\r\n{\r\n public wsts : MWSE;\r\n public events : Map = new Map();\r\n public signals : Map = new Map();\r\n public count = 0;\r\n constructor(wsts:MWSE){\r\n this.wsts = wsts;\r\n }\r\n public request(msg: Message) : Promise\r\n {\r\n return new Promise((ok,rej) => {\r\n let id = ++this.count;\r\n this.wsts.WSTSProtocol.SendRequest(msg, id);\r\n this.events.set(id,[\r\n (data:any) => {\r\n ok(data);\r\n },\r\n (data:any) => {\r\n rej(data);\r\n }\r\n ]);\r\n })\r\n }\r\n public stream(msg: Message, callback: Function)\r\n {\r\n let id = ++this.count;\r\n this.wsts.WSTSProtocol.StartStream(msg, id);\r\n this.events.set(id,[\r\n (data:any) => {\r\n callback(data);\r\n },\r\n () => { }\r\n ]);\r\n }\r\n public signal(event: string, callback: Function)\r\n {\r\n let T = this.signals.get(event);\r\n if(!T)\r\n {\r\n this.signals.set(event, [callback]);\r\n }else{\r\n T.push(callback);\r\n }\r\n }\r\n}","import EventTarget from \"./EventTarget\";\r\nimport MWSE from \"./index\";\r\n\r\ninterface IPeerOptions{\r\n\r\n};\r\n\r\n\r\nexport default class Peer extends EventTarget\r\n{\r\n public mwse : MWSE;\r\n public options! : IPeerOptions;\r\n public socketId? : string;\r\n public selfSocket : boolean = false;\r\n public active : boolean = false;\r\n constructor(wsts:MWSE){\r\n super();\r\n this.mwse = wsts;\r\n }\r\n setPeerOptions(options: string | IPeerOptions){\r\n if(typeof options == \"string\")\r\n {\r\n this.setSocketId(options)\r\n }else{\r\n this.options = options;\r\n }\r\n }\r\n setSocketId(uuid: string){\r\n this.socketId = uuid;\r\n }\r\n async metadata() : Promise\r\n {\r\n if(this.socketId == 'me')\r\n {\r\n let result = await this.mwse.EventPooling.request({\r\n type:'my/socketid'\r\n });\r\n this.selfSocket = true;\r\n this.active ||= true;\r\n this.socketId = result;\r\n this.emit('scope');\r\n this.activeScope = true;\r\n return result;\r\n }\r\n }\r\n async enablePairAuth(){\r\n await this.mwse.EventPooling.request({\r\n type:'auth/pair-system',\r\n value: 'everybody'\r\n });\r\n }\r\n async disablePairAuth(){\r\n await this.mwse.EventPooling.request({\r\n type:'auth/pair-system',\r\n value: 'disable'\r\n });\r\n }\r\n async send(pack: any){\r\n await this.mwse.EventPooling.request({\r\n type:'pack/to',\r\n pack,\r\n to: this.socketId\r\n });\r\n }\r\n}","export default class EventTarget\r\n{\r\n private events : {[key:string]:Function[]} = {};\r\n public emit(eventName :string, ...args:any[])\r\n {\r\n if(this.events[eventName])\r\n {\r\n for (const callback of this.events[eventName]) {\r\n callback(...args);\r\n }\r\n }\r\n }\r\n public on(eventName :string, callback:Function)\r\n {\r\n if(this.events[eventName])\r\n {\r\n this.events[eventName].push(callback)\r\n }else{\r\n this.events[eventName] = [callback];\r\n }\r\n }\r\n public activeScope : boolean = false;\r\n scope(f:Function)\r\n {\r\n if(this.activeScope)\r\n {\r\n f()\r\n }else{\r\n this.on('scope', f)\r\n }\r\n }\r\n}","import EventTarget from \"./EventTarget\";\r\nimport MWSE from \"./index\";\r\n\r\nexport interface IRoomOptions\r\n{\r\n name: string;\r\n description?:string;\r\n joinType: \"free\"|\"invite\"|\"password\"|\"lock\";\r\n credential?: string;\r\n ifexistsJoin?: boolean;\r\n accessType?: \"public\"|\"private\";\r\n notifyActionInvite?: boolean;\r\n notifyActionJoined?: boolean;\r\n notifyActionEjected?: boolean;\r\n}\r\n\r\n\r\nexport default class Room extends EventTarget\r\n{\r\n public mwse : MWSE;\r\n public options! : IRoomOptions;\r\n public roomId? : string;\r\n\r\n public accessType? : \"public\"|\"private\";\r\n public description? : string;\r\n public joinType? : \"free\"|\"invite\"|\"password\"|\"lock\";\r\n public name? : string;\r\n public owner? : string;\r\n\r\n constructor(wsts:MWSE){\r\n super();\r\n this.mwse = wsts;\r\n }\r\n public setRoomOptions(options : IRoomOptions | string)\r\n {\r\n if(typeof options == \"string\")\r\n {\r\n this.roomId = options;\r\n }else{\r\n this.options = options;\r\n }\r\n }\r\n \r\n setRoomId(uuid: string){\r\n this.roomId = uuid;\r\n }\r\n async createRoom(roomOptions : IRoomOptions){\r\n let options = this.options || roomOptions;\r\n let result = await this.mwse.EventPooling.request({\r\n type:'create-room',\r\n ...options\r\n });\r\n if(result.status == 'fail')\r\n {\r\n if(result.message == \"ALREADY-EXISTS\")\r\n {\r\n return this.join();\r\n }\r\n throw new Error(result.message || result.messages);\r\n }else{\r\n this.options = {\r\n ...this.options,\r\n ...result.room\r\n };\r\n this.roomId = result.room.id;\r\n }\r\n }\r\n async join(){\r\n let result = await this.mwse.EventPooling.request({\r\n type:'joinroom',\r\n name: this.options.name,\r\n credential: this.options.credential\r\n });\r\n if(result.status == 'fail')\r\n {\r\n throw new Error(result.message);\r\n }else{\r\n this.options = {\r\n ...this.options,\r\n ...result.room\r\n };\r\n this.roomId = result.room.id;\r\n }\r\n }\r\n async send(pack: any, wom:boolean = false){\r\n await this.mwse.EventPooling.request({\r\n type:'pack/room',\r\n pack,\r\n to: this.roomId,\r\n wom\r\n });\r\n }\r\n}","import MWSE from \"./index\";\r\n\r\nexport interface Message {\r\n [key:string|number]:any;\r\n}\r\nexport default class WSTSProtocol\r\n{\r\n public mwse : MWSE;\r\n constructor(wsts:MWSE){\r\n this.mwse = wsts;\r\n this.addListener();\r\n }\r\n public addListener()\r\n {\r\n this.mwse.server?.onRecaivePack((pack)=>{\r\n this.PackAnalyze(pack)\r\n })\r\n }\r\n public SendRaw(pack: Message)\r\n {\r\n this.mwse.server.tranferToServer(pack);\r\n }\r\n public SendOnly(pack: Message)\r\n {\r\n this.mwse.server.tranferToServer([pack,'R']);\r\n }\r\n public SendRequest(pack: Message, id: number)\r\n {\r\n this.mwse.server.tranferToServer([pack, id, 'R']);\r\n }\r\n public StartStream(pack: Message, id: number)\r\n {\r\n this.mwse.server.tranferToServer([pack, id, 'S']);\r\n }\r\n public PackAnalyze(data:any)\r\n {\r\n let [payload, id, action] = data;\r\n if(typeof id === 'number')\r\n {\r\n let callback = this.mwse.EventPooling.events.get(id);\r\n if(callback)\r\n {\r\n callback[0](payload, action);\r\n switch(action)\r\n {\r\n case 'E':{ // [E]ND flag\r\n this.mwse.EventPooling.events.delete(id);\r\n break;\r\n }\r\n case 'S': // [S]TREAM flag\r\n default:{\r\n break;\r\n }\r\n }\r\n }else console.warn(\"Missing event sended from server\");\r\n }else{\r\n let signals = this.mwse.EventPooling.signals.get(id);\r\n if(signals)\r\n {\r\n for (const callback of signals) {\r\n callback(payload);\r\n }\r\n }else console.warn(\"Missing event sended from server\");\r\n }\r\n }\r\n}"],"names":[],"version":3,"file":"index.js.map","sourceRoot":"../"} \ No newline at end of file diff --git a/test.html b/test.html index 93bf2cd..d0ecd7a 100644 --- a/test.html +++ b/test.html @@ -9,18 +9,30 @@ \ No newline at end of file -- 2.25.1 From 5a1ca121f6aae44dc12cfca0a867fef3f69613de Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Abdussamed=20ULUTA=C5=9E?= Date: Fri, 16 Dec 2022 23:55:06 +0300 Subject: [PATCH 10/37] Room Messaging complete --- Source/HTTPServer.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Source/HTTPServer.js b/Source/HTTPServer.js index d543589..c0759c7 100644 --- a/Source/HTTPServer.js +++ b/Source/HTTPServer.js @@ -17,7 +17,7 @@ exports.http = server; let {resolve} = require("path"); app.get("/script",(request, response)=>{ - response.sendFile(resolve("./script/wsjs.js")) + response.sendFile(resolve("./script/index.js")) }); app.get("*",(request, response)=>{ response.sendFile(resolve("./script/status.xml")) -- 2.25.1 From e19a58f17485298b87735a2f163c59a591cc878f Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Abdussamed=20ULUTA=C5=9E?= Date: Sat, 17 Dec 2022 00:02:17 +0300 Subject: [PATCH 11/37] Room Messaging complete --- Source/HTTPServer.js | 6 +++--- Source/Services/Auth.js | 6 ------ Source/Services/DataTransfer.js | 1 - Source/Services/Room.js | 13 +++++++------ Source/WebSocket.js | 6 +++--- Source/config.js | 1 + 6 files changed, 14 insertions(+), 19 deletions(-) create mode 100644 Source/config.js diff --git a/Source/HTTPServer.js b/Source/HTTPServer.js index c0759c7..a28c886 100644 --- a/Source/HTTPServer.js +++ b/Source/HTTPServer.js @@ -3,6 +3,8 @@ let http = require("http"); let express = require("express"); let compression = require("compression"); +let {resolve} = require("path"); +const { termoutput } = require("./config"); let server = http.createServer(); let app = express(); server.addListener("request", app); @@ -10,12 +12,10 @@ app.use(compression({ level: 9 })); server.listen(7707,'0.0.0.0',() => { - console.log("HTTP Service Running..."); + termoutput && console.log("HTTP Service Running..."); }); exports.http = server; - -let {resolve} = require("path"); app.get("/script",(request, response)=>{ response.sendFile(resolve("./script/index.js")) }); diff --git a/Source/Services/Auth.js b/Source/Services/Auth.js index eb7a6b5..2254b1b 100644 --- a/Source/Services/Auth.js +++ b/Source/Services/Auth.js @@ -1,12 +1,6 @@ const { Client } = require("../Client.js"); let {addService, addListener} = require("../WebSocket.js"); -addListener('disconnect',(global, xClient)=>{ - for (const pair of xClient.pairs) { - - } -}) - addService(({ client, message, diff --git a/Source/Services/DataTransfer.js b/Source/Services/DataTransfer.js index 2cbb360..a97f32e 100644 --- a/Source/Services/DataTransfer.js +++ b/Source/Services/DataTransfer.js @@ -2,7 +2,6 @@ const { Client } = require("../Client.js"); let {randomUUID} = require("crypto"); let {addService,addListener} = require("../WebSocket.js"); const { Room } = require("./Room.js"); -let term = require("terminal-kit").terminal; /* Peer to peer veri aktarımı diff --git a/Source/Services/Room.js b/Source/Services/Room.js index 04a8693..98a1a43 100644 --- a/Source/Services/Room.js +++ b/Source/Services/Room.js @@ -2,6 +2,7 @@ const { Client } = require("../Client.js"); let {randomUUID,createHash} = require("crypto"); const joi = require("joi"); let {addService,addListener} = require("../WebSocket.js"); +const { termoutput } = require("../config.js"); let term = require("terminal-kit").terminal; function Sha256(update) @@ -69,7 +70,7 @@ function Room() */ Room.prototype.publish = function(room){ Room.rooms.set(this.id, this); - term.green("Room Published ").white(this.name," in ").yellow(this.clients.size).white(" clients")('\n'); + termoutput && term.green("Room Published ").white(this.name," in ").yellow(this.clients.size).white(" clients")('\n'); }; Room.prototype.toJSON = function(){ let obj = {}; @@ -90,7 +91,7 @@ Room.prototype.send = function(obj, withOut){ client.send(obj); } } - term.green("Room bulk message ").white(this.name," in ").yellow(this.clients.size + "").white(" clients")('\n'); + termoutput && term.green("Room bulk message ").white(this.name," in ").yellow(this.clients.size + "").white(" clients")('\n'); }; /** * @param {Client} client @@ -106,10 +107,10 @@ Room.prototype.join = function(client){ }; client.rooms.add(this.id); this.clients.set(client.id, client); - term.green("Client Room joined ").white(this.name," in ").yellow(this.clients.size + "").white(" clients")('\n'); + termoutput && term.green("Client Room joined ").white(this.name," in ").yellow(this.clients.size + "").white(" clients")('\n'); }; Room.prototype.down = function(){ - term.red("Room is downed ").red(this.name," in ").yellow(this.clients.size + "").red(" clients")('\n'); + termoutput && term.red("Room is downed ").red(this.name," in ").yellow(this.clients.size + "").red(" clients")('\n'); this.send([{ roomid: this.id, ownerid: this.owner.id @@ -134,10 +135,10 @@ Room.prototype.eject = function(client){ if(this.clients.size == 0) { this.down(); - term.red("Client Room closed ").red(this.name," at 0 clients")('\n'); + termoutput && term.red("Client Room closed ").red(this.name," at 0 clients")('\n'); } - term.red("Client Room ejected ").red(this.name," in ").yellow(this.clients.size + "").red(" clients")('\n'); + termoutput && term.red("Client Room ejected ").red(this.name," in ").yellow(this.clients.size + "").red(" clients")('\n'); }; /** diff --git a/Source/WebSocket.js b/Source/WebSocket.js index 5f6c1c6..6d94da1 100644 --- a/Source/WebSocket.js +++ b/Source/WebSocket.js @@ -4,11 +4,11 @@ let websocket = require("websocket"); let {http} = require("./HTTPServer"); let {randomUUID} = require("crypto"); const { Client } = require("./Client.js"); - -console.log("Web Socket Protocol is ready"); +const { termoutput } = require("./config"); +termoutput && console.log("Web Socket Protocol is ready"); http.addListener("upgrade",() => { - console.log("HTTP Upgrading to WebSocket"); + termoutput && console.log("HTTP Upgrading to WebSocket"); }) let wsServer = new websocket.server({ diff --git a/Source/config.js b/Source/config.js new file mode 100644 index 0000000..81463b8 --- /dev/null +++ b/Source/config.js @@ -0,0 +1 @@ +exports.termoutput = false; \ No newline at end of file -- 2.25.1 From 99e16ca9d5ec398cbc9c30423d7a4231b542038e Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Abdussamed=20ULUTA=C5=9E?= Date: Sat, 17 Dec 2022 00:06:07 +0300 Subject: [PATCH 12/37] Status.xml added --- script/status.xml | 82 +++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 82 insertions(+) create mode 100644 script/status.xml diff --git a/script/status.xml b/script/status.xml new file mode 100644 index 0000000..ad3b6f1 --- /dev/null +++ b/script/status.xml @@ -0,0 +1,82 @@ + + + + + + 304e17d899c067afe3c439f92c5bd29869dfbde06ceca4f65e2128a93e7366c078bb0af1b14cb516008683df14c00107cadcce4d980f149da932bdba4a9892841b004ae877b2c7733e2d326d5586a4b2225384afbab6d00900852f5feb47ebd234ad95ec6957dbbbe585c86126f02e47cff3dc6d4ac9d321efbbd39a28655110fa850caca24a9b82984b60d0c517f3d8400594a17ba4a5fd0fcf19711c4b0ef503d698e8597c841eb099118d23e8cc8bc4db907d5093ca73e68f85c3dae629876b5d2fa49ed283591972559ae7da1b99489715c355f068c689c7cb4690ea4d4f3d1f364367b352bd74a0a57a541bfac90fe69d9b6d2fe941707c7316b067f5287c6aff01c86cbb23c2ac5e202cb497c203437c80159454b20dcadec7f2080b286c6b4e76826952b963f856e3c7e9ad89e50b76e2dd22f7bc1fbc8366a965cb76dc862d5c9b5b52802e431d2490079a7396db1bc279099a68a9b250135020e3906bc8c159b773a7dbb3d5beb54a30746fc776a07aeeb4f1f170d688b15742f530901959e4a4cd8ed869249e95a58c3cc45bc323aee66aec9090f4c938411c348b72d6ae4c3169c0049d84e88f4c26318136353db77519d7c060df07f7da78df71f13ed7be5916b2973fa712b4d826527911a04923dc763630306d04e09229584370e670c24d6af48bee2ead5525f55b8bd66083314b11d1dede385bfbdcaacd0b577c1d37f7bbcbb8d24f461723713570537abbcdfd8b96c9dcfc0f8c0afd7e6e43620dbfb88442cacd15a6cb28ee2d318e56d023af40a832010e8e2cb1d2d5223fd465616094fca6fecd92ff66e398f3ac8ac091beb3635dfacea5147848514c94ecdc011180cda61f977f9c59265682c77dc7af662e1c50386ac50835c6802adb86f941ec3d05316e505f7183bf8dc048685af48f6514726d993e789cfe13e28bd0ce7ea0e0e97f19364ec8567e63f28afcdf07de02fa8c79a850ffc4e9da3786ecec269aff4995ed5e3029a2abcba65ba62990e0842714688ca48162510449ebaf80878405c7373534aa6e688f4c56569f15e349272db874f3846eb3cea77f8de261628c285e93ff7c38aba3d65df19bf8dd8732068e817e90b92ddf7be29ec844f6b90af2547daf00093e4f2241c2d419e60c9b6d64e4278a2baa0a0396e98ccafebd131a6c5374baaf4a3e715c6c4d2c647de1cd0610cf9bcf3a9e857bef77a0ed51dc297ba914a5c41c5243cc72308b9de7908ec8955b52c9328b1d8efdd28d570c010f1329b7f0c40669004dc77cc87a34348310f444ba799fb0ed00687ae16681dc7eab7d1884213b59ff1e2e3cefa64676587fd37db308f4de795cb46b468948e38d340981e32ca2222cbff42bc3852f1657a690bfba8b918cfa05bd3f6a7bbc284e15ba39b114e8619b666748325e0b87514eff2b48a70ea906ca0ecf6f0f2c6438ffa8106239b94231f008339069fd420978e0f8103c94fcfb8a48018353443e8cbe131dc4261ef79945471cdaec9868954e420f4f43f738c098e3ee3378c5890409bc9e4f191e85f3318c5a125f48e8bc3a9eb67f413742c2b030847b3461bd9659e62af48aca3a456ae4f99beacd3df943608956fbadde816733edc9f2a107a8d92592b9690aeb69b48bfd9231ba345f1c71dcb6aae1c13cf1ab91942938db056a1569c6399cf57dd02032ef43f64f6e3ee3de56d11b7dc07f3bdb899714b912d6e8a45be8e2f6413ad51ef93aa75c5bd9c4a8c86231b31a5e68892bc8ec01de40db5d6ec87160c8d5d14b3725160407a9a7484bb794dee73e0a87cceeb874ed6d96941406f18b8634886c23d5be' + + + 304e17d899c067afe3c439f92c5bd29869dfbde06ceca4f65e2128a93e7366c078bb0af1b14cb516008683df14c00107cadcce4d980f149da932bdba4a9892841b004ae877b2c7733e2d326d5586a4b2225384afbab6d00900852f5feb47ebd234ad95ec6957dbbbe585c86126f02e47cff3dc6d4ac9d321efbbd39a28655110fa850caca24a9b82984b60d0c517f3d8400594a17ba4a5fd0fcf19711c4b0ef503d698e8597c841eb099118d23e8cc8bc4db907d5093ca73e68f85c3dae629876b5d2fa49ed283591972559ae7da1b99489715c355f068c689c7cb4690ea4d4f3d1f364367b352bd74a0a57a541bfac90fe69d9b6d2fe941707c7316b067f5287c6aff01c86cbb23c2ac5e202cb497c203437c80159454b20dcadec7f2080b286c6b4e76826952b963f856e3c7e9ad89e50b76e2dd22f7bc1fbc8366a965cb76dc862d5c9b5b52802e431d2490079a7396db1bc279099a68a9b250135020e3906bc8c159b773a7dbb3d5beb54a30746fc776a07aeeb4f1f170d688b15742f530901959e4a4cd8ed869249e95a58c3cc45bc323aee66aec9090f4c938411c348b72d6ae4c3169c0049d84e88f4c26318136353db77519d7c060df07f7da78df71f13ed7be5916b2973fa712b4d826527911a04923dc763630306d04e09229584370e670c24d6af48bee2ead5525f55b8bd66083314b11d1dede385bfbdcaacd0b577c1d37f7bbcbb8d24f461723713570537abbcdfd8b96c9dcfc0f8c0afd7e6e43620dbfb88442cacd15a6cb28ee2d318e56d023af40a832010e8e2cb1d2d5223fd465616094fca6fecd92ff66e398f3ac8ac091beb3635dfacea5147848514c94ecdc011180cda61f977f9c59265682c77dc7af662e1c50386ac50835c6802adb86f941ec3d05316e505f7183bf8dc048685af48f6514726d993e789cfe13e28bd0ce7ea0e0e97f19364ec8567e63f28afcdf07de02fa8c79a850ffc4e9da3786ecec269aff4995ed5e3029a2abcba65ba62990e0842714688ca48162510449ebaf80878405c7373534aa6e688f4c56569f15e349272db874f3846eb3cea77f8de261628c285e93ff7c38aba3d65df19bf8dd8732068e817e90b92ddf7be29ec844f6b90af2547daf00093e4f2241c2d419e60c9b6d64e4278a2baa0a0396e98ccafebd131a6c5374baaf4a3e715c6c4d2c647de1cd0610cf9bcf3a9e857bef77a0ed51dc297ba914a5c41c5243cc72308b9de7908ec8955b52c9328b1d8efdd28d570c010f1329b7f0c40669004dc77cc87a34348310f444ba799fb0ed00687ae16681dc7eab7d1884213b59ff1e2e3cefa64676587fd37db308f4de795cb46b468948e38d340981e32ca2222cbff42bc3852f1657a690bfba8b918cfa05bd3f6a7bbc284e15ba39b114e8619b666748325e0b87514eff2b48a70ea906ca0ecf6f0f2c6438ffa8106239b94231f008339069fd420978e0f8103c94fcfb8a48018353443e8cbe131dc4261ef79945471cdaec9868954e420f4f43f738c098e3ee3378c5890409bc9e4f191e85f3318c5a125f48e8bc3a9eb67f413742c2b030847b3461bd9659e62af48aca3a456ae4f99beacd3df943608956fbadde816733edc9f2a107a8d92592b9690aeb69b48bfd9231ba345f1c71dcb6aae1c13cf1ab91942938db056a1569c6399cf57dd02032ef43f64f6e3ee3de56d11b7dc07f3bdb899714b912d6e8a45be8e2f6413ad51ef93aa75c5bd9c4a8c86231b31a5e68892bc8ec01de40db5d6ec87160c8d5d14b3725160407a9a7484bb794dee73e0a87cceeb874ed6d96941406f18b8634886c23d5be' + + + 35b9ea4d98445d6fda595e42c921269e0699ed78a2655b169fcaffef66521e649c1818cb71fb5a2ef4c0f453786de08c9cf81cdc4f6bcb8a7af68f23d9a4b3dc4a84950a13261e929ef4aa41a53819b8fc98582250533b476e46d6d0894a0003f315a6d8612d2d46eebe367330ae4587635daa4d4b929a33de91dfdb30b1aa3b3bded0ab06741786b19564b74e3b0d86a3d056bf9662fa004d2609a62b862caea7f6448a5257689a0de69798ac8eaf6186799c1e5de7ba124493365a76ded957d0f133190608b49c940cd7db6bdcb6b98739dfe6dc44b4736ebb10a3563ac7a4c6c63177cb292f32be6be3041cd2c27fef4c9f3ec2005041f80df142941185c57114d90500c744d9442f4507e43c91bbacc4205ee8dc4dbbc0656a6bf948309c446ffc67844f8e49171672ebbf380368979e20dcd114f889936f5a6ae0fdc393d4292659ee8f00070c0b6f01781e9c9d64a1ef7dc43912de5666d2f3495d9e4f3b478621e0e7e2ade6728e2de162aaf06b000ef5c514ba8004ed28cdbb9893a2b9e024a3ffedf98b920ff94130f31775cbc6a4f7a0dd361c40a8ca0956bf7fa4047bb00ab51c8aae729cce29a5427b8f80e28fcd5163a6f070c654ef05b85671fd1c9a2a2e52e8737b3cc04d6e95e0690b5e7d711b23c45a065f66193ab6d070a23efa56654f9427ec05e4e32a79e43869db3f3b61ca5c4fed04f2926e4bdb99367b15068868d0fb232359ea3c9e9c64150b4058a592b59943a7e23b69813bf08e637cca4ea1e5e996613a1db2684386a5e5f0dcbbea04b312f69512bab31db7e9ef94b6905a79690193f7289851821d135974af3696a2e0439585a960b3d8a31568bca8de1271a14cd30ed1a7b85adf23f9d76f5b62149242296677fea61288a4b58d2e38889b2bbd9926672df36b46fd6463bf0c0f7b1db1a7312071ef8e39a5a7deea4e47b6cda985de2cc5133337633b3db6d0cb54d56795a8a76fef2edf93debc3cbea6d0b902a0c710e73fa443c4842ec1646b4934514d2700eaa48b1320f0477f992ac0849bfd1fa628fd2b85a8997c5c2128bcb8135718b62180ede1ee8d4bf375c053a5419173b6adf54ab6f5943a377f7b2b4b81807fba3460b6acd28ef6d4be2bb015d9d5ea9b3c2d22389d7c688dd871e0a9fe295389711bf19804eeb68a86204fed691fe7493db9e0d2bce3f6ae4df5debe4cd4b4c668111146dc82b638080da9fa26d47d00f37538ee2a4a2930d39d1f734537a79d0d34f6cfab7893e2ebe71ec110e82f63a7d5c246737acadf1fc75c777faaa150164fc204c7ad3261fc9563a1b5bac908905d53fb7f37060dc1c5750634b200b31fbfaf4de1fefbc687b4c808968065e9cb567f003e1bd06b77e6442a7e5d3f54ff98d12d03d3f8705fdeb9614764acd153fc15a8763e5dc95e2c19ce478b8da93744680f2bfca75e50bebabc0cbb609575bb1000141dc35da3f4b5f5141899ff9ef856b7904baf5a828d2e4f576a58e505c5c9f3e5bc0e1ecfaf4ef36a7dee842aaf155db65912cd8dfccd11b188f5da5ea10035d47f17e0996791b0aacefa38799708198e4780846c7b1cf60aa9172a3a5935338bdb71e33a20b96181e487dd5caeeeff0446bc945ac2a83c3ca0ded82939d314073711c2afce8cc2a94fc6d46e28ea5bbafcd6adb517dedc9fa99446be727718bc41122214b6b788641e785ba0bee6530c61f9a9a58c14c6a5c477fd6f2117c67b1a2d8ca20e3aaef5c2d4e1f2b525fc8516ac90654880e72b4d87916e76592691d154a89f4125db6d9635e553955797f77ec00797f130f43b6245bf97cb88c93a641c78cbc352cf4816b075c81133cff364f4120399e3beb8cb6aae362a33de38c0d14d919a1939c00d46cd7ec2368620378fa490dd7d746361df3ee49b19a848035f619b08a66271fd97cb805ec834d85355495f003e39b6284b1ff52d5fbfeca7f7676f2a780c0b649abe6574da5867b2949af7d01e33fb9ffdee + + + 2fe9827b8286e6e5329cc9af2bb910f78b57ec5d073e6ef061360d7103f1c38245e04f804f431da3b51887a6e16cfee2a69534f4ab8ded57b74029beba7ccd2347b962d8f0d2d8bc93771a52ef4688fdf9759d33be9ba18b306a86fd3848b8ca8fe61abdd9ea2b9018c31554122172488166517e67276384b23239f02f4b5c4d8290dc542f0af54a66874a34bb8cd6114d7d5bce7404294f2c41ec20b85b942e5dca6e7b94fdea2e3dcd98777d0d7b631246c2222b69bd0547dc56d4c7990e0f803c32593cd218f4d655998ddd90e488a5d12aa7ef868f7641dc6a6df0bb0abfc0e76335ab682d909d117d863c90f6e21ebdb3ff8a7126bde4b14c524afe31fad20d1b000356cd25ab2276a2adf82638a5bf20304e2ad1a2f28cd7490e818fbec3566514cdeb412ce63d421738b038e40f70073d50352307de058b40d6215f6af1ce09cf6b954be69c7ef0f8030449a20faa5c2dd9b8d0f1adf911371156dc65b470fb02a092975af2f9080f689dd56cc3cd0f4c0434537e32b80cc22bd19743b1145d713422fed681b3bb9a09c5e5ec8f739631a8ffe2a49cebb2f13634b9414da48845948473616f18814447f63e018015b3d385cc592cc80c1f5a54d04029766572be94991d3e96b952961813e35fdc3f86a2d5fbfcd48a12d531be0f68ffcf48f1eb0e14623a6cfbdea026dd766fab9bbbc442468e6559d934959f0643c963c0799fcc3f98ccfa38b84cfb962a77cf5008037c81934425f0d7f4d1b7093adfc109918a7a130f1b3d5073a1517ac1c5b6dfe962917c8704e0d94d68795355f4ac341f84124bddd270c1da1a180ca101fb5f0bd4204e11461dce54d96827dcaa3e3a3889a621734268cf27ac18fe8c0df23108f3ef949fc68fd54122f3ea5fd5b2131b1ab7264006d730a7c4b90493b6858d78f5dfcf2cddbe8f1aa2b5da1de0580862ae16e01c5bce21a537ce0a8dfec8379c5152c0a3af41e09b7d35ed8920ad0f01abf1495b6e3e565cc8734ecf22a839212626f8f46cee5b90a742d43c2de2a280a2b1ffbe7e8285d8632bbf1137c28590f0420b3e75809c71f8b0e9bd8ed8995ba81003386d9c206ff5d3db014353d9565d1ac859f9335146cd3d2c8a04b4c3a1e7fa2e37a067ea2cb8fd4826010ecc5915114301fd7b2c7c72a222618c424797fe690cc9af7bc0a609c17a1dc8de4603df8ecbcc08d09bdd382b440fb29d11c822319b8572727592915fdcc1d9f7f3a025bec58834d5c55505c8013a5daf7f6e312b509500c2adc8e664c56031666124ab3f997185ae4f9286e7e6760ca8a106484fc68e50da961819fce231fca20330729b80be767c75006b1f8b796d60da0636d8fec8bd4c69671a8681f11f21f2b104ab4961c50b50f6b2b5fc59f78b674de891652d91f32ba60deaabf554158a38989438b67fb1713a14b4a2b58843a8b2df832d0969309f23ce4e07504a6be8aba05d8d79af93f41cf70fe0ef7b20ad603e4bd4c9261b0c3a007b46663c7b16ad77e8b8029d4d76fc4941205134d4cc9b7b7f9cc961ce5651afe8b308fa982cfdd57e9c21e1c65b2e906001f98f63cea267c44032c28348655541242b2092bfe8cb521bc491d376d989baa75c8f3c588089956f0736a71245c7acf0654dbaaad04803f8d8096d9a2c786a4c96ab99e4bc38119171839b718cffba4f8503d624cdfc2209597505da520878e2a10a9a7b0cd1e54ca09cf8c1ec9898735ea38e0886c940d8390d4581d205e4d9eb03d280071c6428bcee962122094af10e3784150651c5c4a583d8814c9e14810e021c659bf8cb66f82141d9a87248b20cba5cc212b2c0cd6dd085e690e549b31376babf1f3b19581956e26b1107f198975502 + + + 74f4e96bbc0f84de1f5f481c7e3257243edfcec173663557469a90ef23c067b8606774b867568db7dfe5209aada24cc96fcf93faa7a95180ffe2a20154898e82b27e27d01358c42c1857f9bdcb4a83ee1709226e2fc117c3a93cd3cb139777fc9295b4602c5d7c76f5a47d2f574009959a274f49d36e7435ed61e755768551859dfc34277df224c2dc9365112b9459e26235e7ce8619d0d1457954de93f604a200b0e9368b53aa7a3313b4f020d28625c646b6ca7bc6feadc7297b5a51f7eeb77adb016f346ca3bd2f4878a92dcef4abad57b0e5c8a10087f717e813892f55ed4e248cc6bdf0ea1edcaa1d42adbec7d2832c184d2185fdb66f0ee0043ce0a6035a151b22d81eafcf4cf9a8ce962e6ce1f6571b6df0a86dc221b770974f5bbfe960efbfb8c148f590584fbefae0b5cb95545bf69e4e5c9a39b431155649468ef093127aba424654ee0bb46d194ad17e61b022c43671dfef0eae98ec6ba6cd2924279fb592ac1d3babb61c0befddf6521efc38d4d75007499864cced0c8ee14cb5fd37b79626f636753b585ccfcf583ee92784850f0cacd3389c3546827bf3e7ef2719b25819f0208dcf7c3493edfc048a6fa3d35511e6f9c2a367cb87ad74c0f41bf853b6ba35f51fadfd5632012bde0180585dff6a7f114a2a958ce7ecbe484304dba2f138a86c4b0aad337c0047b1cb9dcd358300155d09b72d6c0ed4c53778e86fbdc7674d37a1441c1d38bf8f4c9976540090575863c41a8211c9b9450f28edd514ed8d51e3565de2fd30d6f0bf02fcfb79319ff04e7c4ad452be372fd9fe64021c8af6e566076b78f9c6d553848f9e1bf2ad3955c94470cfb8b6ba4aa81c53acc82395870ef9677b634515c4e4bd8de971292c3aa0c150516c546f8b172613dd1e314d4caf46ebd1770bb0d73b6ea2d53969 + + + 8305f8dd0b412a4b95ef71a44a2cb069890895668054436640b9dffd2b0db4d84e21788b2cf8d609eb95773b4ef3c926335bc93bdc4df971a95f4c4c68ee627402c8935aa619ad276a6994004babf0bb41a8ca9fd5d22e76ec68f662eeb449ad9cdbd37f78b52fb88101e86a54323be7cd4777fdab26ada1cbba1ff0b08b6f451aa45daadcf9ef35a0a24039f2b1d5ca88ad64057afdbfe7c2bba6033380208d8d7c6c5f822a5f8bf19b5ee4f16efe068bd914d2e6ca831af24d53fa330c5d8150eb52fdd29518c14ecbc9af7e68a6e5f7a866150ecccf2b598fd6ba78521d5fe815797a6430ea09d6b394abe630df9510046bc983d9c41e3213868aeaa9dd531220959dd6305a1c582bde1a3e01d9b4be5d09150c1f4a84aa35c995103e6c6e3b6bb5345759b2219a31d05626373653d8151130ba1abef2aa78494f736792c0a462f54ebd86d2a110ae27ad1ad413baca5c7c4a302252da1423e44647cd57399e92cc805a60ce43bbda7a74797be1ad0275c0b270be2f117bd9ccc07bee42e247d178b15ba233535bffbb1c641cdd9ca3d387985b7980e8aed9752dbe30313f8a4b911f0ac7d8fd9352e3be80cdfaa3fd20ac5771c9f918d456b88cd3155de13a3f71bbcc627e766a16a86cac17f83fde98a2e7742bee4144ad235e23c76459522a96812819585155b6fcb6a08dafb19ccf93de37cb6738c803f73b0876e583d47ea3c59d6aba7b168c8de113a8f04cb813847a79682574ee71f6d9a5987b5e3be7169bf3bd82fbda4f5899e31b55b8c257f989516bbc879e60a49a4c5370230b4f728dd9389a059b481ea61046230e1382046955dae636005db580ec4a0540ee382fbc74b78b00ec821a19778fc119b673496df2bc2f11639922141d4cbb8fe22833f6fb210801419ab1b43f77a2baf892055a41c57e529026d4784aad469a4d2b530e81780f2aaea6b37b44243fa0f5e60a99391c6cf2e8a0f263a38566bfa56f761684b754bb8fa95aed80511332bff4673d600b6a09852cba34faca550f0652241a9eb04ca9652c4a19c20d37d6772604c3bbd34c82fa913a1a95e33b811f33952f4618d3600165574e29c44f7f748c05f90105791906e5920b356c4a8ce133dc2a809f0e47aa0ca2537a09688d2b92d49fa6b1f25165b6d2905ea99d1d6d56b2c39b08167df0cf18ce0f593228abbdbba718f05de4700ffa54067cb01fa65d9e378c0bc88d5f4d7bc153db964920e3c0dab30c02e87d957c369c6492bba7b240c27541d80bf0d39cbe62c077bdf6b1fb252d470cc39f9e43a13a95c08788dd5fe4e62fa3b07be01496bc977c6e1fe62977a2a8b72197fb3ad812369e96e3dd2ad329f134aaa4baee81c2ebd1b2c39e55fd9afcc554633ffb04a827ac75f7b26e49bcc341ea062ba13f672cd0a1dfd79a093273a5187e3adb6ece0e460555dc872c49b95e5054ffb772a4301feecdb072d6087345814b4af54de55d413eee562be25741a041bbdcb2850281 + + + 8305f8dd0b412a4b95ef71a44a2cb069890895668054436640b9dffd2b0db4d84e21788b2cf8d609eb95773b4ef3c926335bc93bdc4df971a95f4c4c68ee627402c8935aa619ad276a6994004babf0bb41a8ca9fd5d22e76ec68f662eeb449ad9cdbd37f78b52fb88101e86a54323be7cd4777fdab26ada1cbba1ff0b08b6f451aa45daadcf9ef35a0a24039f2b1d5ca88ad64057afdbfe7c2bba6033380208d8d7c6c5f822a5f8bf19b5ee4f16efe068bd914d2e6ca831af24d53fa330c5d8150eb52fdd29518c14ecbc9af7e68a6e5f7a866150ecccf2b598fd6ba78521d5fe815797a6430ea09d6b394abe630df9510046bc983d9c41e3213868aeaa9dd531220959dd6305a1c582bde1a3e01d9b4be5d09150c1f4a84aa35c995103e6c6e3b6bb5345759b2219a31d05626373653d8151130ba1abef2aa78494f736792c0a462f54ebd86d2a110ae27ad1ad413baca5c7c4a302252da1423e44647cd57399e92cc805a60ce43bbda7a74797be1ad0275c0b270be2f117bd9ccc07bee42e247d178b15ba233535bffbb1c641cdd9ca3d387985b7980e8aed9752dbe30313f8a4b911f0ac7d8fd9352e3be80cdfaa3fd20ac5771c9f918d456b88cd3155de13a3f71bbcc627e766a16a86cac17f83fde98a2e7742bee4144ad235e23c76459522a96812819585155b6fcb6a08dafb19ccf93de37cb6738c803f73b0876e583d47ea3c59d6aba7b168c8de113a8f04cb813847a79682574ee71f6d9a5987b5e3be7169bf3bd82fbda4f5899e31b55b8c257f989516bbc879e60a49a4c5370230b4f728dd9389a059b481ea61046230e1382046955dae636005db580ec4a0540ee382fbc74b78b00ec821a19778fc119b673496df2bc2f11639922141d4cbb8fe22833f6fb210801419ab1b43f77a2baf892055a41c57e529026d4784aad469a4d2b530e81780f2aaea6b37b44243fa0f5e60a99391c6cf2e8a0f263a38566bfa56f761684b754bb8fa95aed80511332bff4673d600b6a09852cba34faca550f0652241a9eb04ca9652c4a19c20d37d6772604c3bbd34c82fa913a1a95e33b811f33952f4618d3600165574e29c44f7f748c05f90105791906e5920b356c4a8ce133dc2a809f0e47aa0ca2537a09688d2b92d49fa6b1f25165b6d2905ea99d1d6d56b2c39b08167df0cf18ce0f593228abbdbba718f05de4700ffa54067cb01fa65d9e378c0bc88d5f4d7bc153db964920e3c0dab30c02e87d957c369c6492bba7b240c27541d80bf0d39cbe62c077bdf6b1fb252d470cc39f9e43a13a95c08788dd5fe4e62fa3b07be01496bc977c6e1fe62977a2a8b72197fb3ad812369e96e3dd2ad329f134aaa4baee81c2ebd1b2c39e55fd9afcc554633ffb04a827ac75f7b26e49bcc341ea062ba13f672cd0a1dfd79a093273a5187e3adb6ece0e460555dc872c49b95e5054ffb772a4301feecdb072d6087345814b4af54de55d413eee562be25741a041bbdcb2850281 + + + fb7d736ac8ee7a3a74f952551e8856a34c05d564ee0408ca0eea47a86e833b5b30a732b9d3ca954e56231908beb9022aec02c756c3e075bd9086f9ade0381b953185b4d3ed332d5c4b454abe5d2ccbeb48b473f956d543bde4f48c1978f129da7bf481b629a8da09941e5ea66d069617f6c82ac3a685b9e6cf75d8d4faf0b2ca0b52df201372c6e2d08dbcb2b724da94c733590165282e6faefd7bb89bb5be76d452f84b50a557d4b0f45192fc562f3682aba1098818ed3ddfaf72181d66f1f7b59be2b31759b66c + + + + + 304e17d899c067afe3c439f92c5bd29869dfbde06ceca4f65e2128a93e7366c078bb0af1b14cb516008683df14c00107cadcce4d980f149da932bdba4a9892841b004ae877b2c7733e2d326d5586a4b2225384afbab6d00900852f5feb47ebd234ad95ec6957dbbbe585c86126f02e47cff3dc6d4ac9d321efbbd39a28655110fa850caca24a9b82984b60d0c517f3d8400594a17ba4a5fd0fcf19711c4b0ef503d698e8597c841eb099118d23e8cc8bc4db907d5093ca73e68f85c3dae629876b5d2fa49ed283591972559ae7da1b99489715c355f068c689c7cb4690ea4d4f3d1f364367b352bd74a0a57a541bfac90fe69d9b6d2fe941707c7316b067f5287c6aff01c86cbb23c2ac5e202cb497c203437c80159454b20dcadec7f2080b286c6b4e76826952b963f856e3c7e9ad89e50b76e2dd22f7bc1fbc8366a965cb76dc862d5c9b5b52802e431d2490079a7396db1bc279099a68a9b250135020e3906bc8c159b773a7dbb3d5beb54a30746fc776a07aeeb4f1f170d688b15742f530901959e4a4cd8ed869249e95a58c3cc45bc323aee66aec9090f4c938411c348b72d6ae4c3169c0049d84e88f4c26318136353db77519d7c060df07f7da78df71f13ed7be5916b2973fa712b4d826527911a04923dc763630306d04e09229584370e670c24d6af48bee2ead5525f55b8bd66083314b11d1dede385bfbdcaacd0b577c1d37f7bbcbb8d24f461723713570537abbcdfd8b96c9dcfc0f8c0afd7e6e43620dbfb88442cacd15a6cb28ee2d318e56d023af40a832010e8e2cb1d2d5223fd465616094fca6fecd92ff66e398f3ac8ac091beb3635dfacea5147848514c94ecdc011180cda61f977f9c59265682c77dc7af662e1c50386ac50835c6802adb86f941ec3d05316e505f7183bf8dc048685af48f6514726d993e789cfe13e28bd0ce7ea0e0e97f19364ec8567e63f28afcdf07de02fa8c79a850ffc4e9da3786ecec269aff4995ed5e3029a2abcba65ba62990e0842714688ca48162510449ebaf80878405c7373534aa6e688f4c56569f15e349272db874f3846eb3cea77f8de261628c285e93ff7c38aba3d65df19bf8dd8732068e817e90b92ddf7be29ec844f6b90af2547daf00093e4f2241c2d419e60c9b6d64e4278a2baa0a0396e98ccafebd131a6c5374baaf4a3e715c6c4d2c647de1cd0610cf9bcf3a9e857bef77a0ed51dc297ba914a5c41c5243cc72308b9de7908ec8955b52c9328b1d8efdd28d570c010f1329b7f0c40669004dc77cc87a34348310f444ba799fb0ed00687ae16681dc7eab7d1884213b59ff1e2e3cefa64676587fd37db308f4de795cb46b468948e38d340981e32ca2222cbff42bc3852f1657a690bfba8b918cfa05bd3f6a7bbc284e15ba39b114e8619b666748325e0b87514eff2b48a70ea906ca0ecf6f0f2c6438ffa8106239b94231f008339069fd420978e0f8103c94fcfb8a48018353443e8cbe131dc4261ef79945471cdaec9868954e420f4f43f738c098e3ee3378c5890409bc9e4f191e85f3318c5a125f48e8bc3a9eb67f413742c2b030847b3461bd9659e62af48aca3a456ae4f99beacd3df943608956fbadde816733edc9f2a107a8d92592b9690aeb69b48bfd9231ba345f1c71dcb6aae1c13cf1ab91942938db056a1569c6399cf57dd02032ef43f64f6e3ee3de56d11b7dc07f3bdb899714b912d6e8a45be8e2f6413ad51ef93aa75c5bd9c4a8c86231b31a5e68892bc8ec01de40db5d6ec87160c8d5d14b3725160407a9a7484bb794dee73e0a87cceeb874ed6d96941406f18b8634886c23d5be' + + + 304e17d899c067afe3c439f92c5bd29869dfbde06ceca4f65e2128a93e7366c078bb0af1b14cb516008683df14c00107cadcce4d980f149da932bdba4a9892841b004ae877b2c7733e2d326d5586a4b2225384afbab6d00900852f5feb47ebd234ad95ec6957dbbbe585c86126f02e47cff3dc6d4ac9d321efbbd39a28655110fa850caca24a9b82984b60d0c517f3d8400594a17ba4a5fd0fcf19711c4b0ef503d698e8597c841eb099118d23e8cc8bc4db907d5093ca73e68f85c3dae629876b5d2fa49ed283591972559ae7da1b99489715c355f068c689c7cb4690ea4d4f3d1f364367b352bd74a0a57a541bfac90fe69d9b6d2fe941707c7316b067f5287c6aff01c86cbb23c2ac5e202cb497c203437c80159454b20dcadec7f2080b286c6b4e76826952b963f856e3c7e9ad89e50b76e2dd22f7bc1fbc8366a965cb76dc862d5c9b5b52802e431d2490079a7396db1bc279099a68a9b250135020e3906bc8c159b773a7dbb3d5beb54a30746fc776a07aeeb4f1f170d688b15742f530901959e4a4cd8ed869249e95a58c3cc45bc323aee66aec9090f4c938411c348b72d6ae4c3169c0049d84e88f4c26318136353db77519d7c060df07f7da78df71f13ed7be5916b2973fa712b4d826527911a04923dc763630306d04e09229584370e670c24d6af48bee2ead5525f55b8bd66083314b11d1dede385bfbdcaacd0b577c1d37f7bbcbb8d24f461723713570537abbcdfd8b96c9dcfc0f8c0afd7e6e43620dbfb88442cacd15a6cb28ee2d318e56d023af40a832010e8e2cb1d2d5223fd465616094fca6fecd92ff66e398f3ac8ac091beb3635dfacea5147848514c94ecdc011180cda61f977f9c59265682c77dc7af662e1c50386ac50835c6802adb86f941ec3d05316e505f7183bf8dc048685af48f6514726d993e789cfe13e28bd0ce7ea0e0e97f19364ec8567e63f28afcdf07de02fa8c79a850ffc4e9da3786ecec269aff4995ed5e3029a2abcba65ba62990e0842714688ca48162510449ebaf80878405c7373534aa6e688f4c56569f15e349272db874f3846eb3cea77f8de261628c285e93ff7c38aba3d65df19bf8dd8732068e817e90b92ddf7be29ec844f6b90af2547daf00093e4f2241c2d419e60c9b6d64e4278a2baa0a0396e98ccafebd131a6c5374baaf4a3e715c6c4d2c647de1cd0610cf9bcf3a9e857bef77a0ed51dc297ba914a5c41c5243cc72308b9de7908ec8955b52c9328b1d8efdd28d570c010f1329b7f0c40669004dc77cc87a34348310f444ba799fb0ed00687ae16681dc7eab7d1884213b59ff1e2e3cefa64676587fd37db308f4de795cb46b468948e38d340981e32ca2222cbff42bc3852f1657a690bfba8b918cfa05bd3f6a7bbc284e15ba39b114e8619b666748325e0b87514eff2b48a70ea906ca0ecf6f0f2c6438ffa8106239b94231f008339069fd420978e0f8103c94fcfb8a48018353443e8cbe131dc4261ef79945471cdaec9868954e420f4f43f738c098e3ee3378c5890409bc9e4f191e85f3318c5a125f48e8bc3a9eb67f413742c2b030847b3461bd9659e62af48aca3a456ae4f99beacd3df943608956fbadde816733edc9f2a107a8d92592b9690aeb69b48bfd9231ba345f1c71dcb6aae1c13cf1ab91942938db056a1569c6399cf57dd02032ef43f64f6e3ee3de56d11b7dc07f3bdb899714b912d6e8a45be8e2f6413ad51ef93aa75c5bd9c4a8c86231b31a5e68892bc8ec01de40db5d6ec87160c8d5d14b3725160407a9a7484bb794dee73e0a87cceeb874ed6d96941406f18b8634886c23d5be' + + + 35b9ea4d98445d6fda595e42c921269e0699ed78a2655b169fcaffef66521e649c1818cb71fb5a2ef4c0f453786de08c9cf81cdc4f6bcb8a7af68f23d9a4b3dc4a84950a13261e929ef4aa41a53819b8fc98582250533b476e46d6d0894a0003f315a6d8612d2d46eebe367330ae4587635daa4d4b929a33de91dfdb30b1aa3b3bded0ab06741786b19564b74e3b0d86a3d056bf9662fa004d2609a62b862caea7f6448a5257689a0de69798ac8eaf6186799c1e5de7ba124493365a76ded957d0f133190608b49c940cd7db6bdcb6b98739dfe6dc44b4736ebb10a3563ac7a4c6c63177cb292f32be6be3041cd2c27fef4c9f3ec2005041f80df142941185c57114d90500c744d9442f4507e43c91bbacc4205ee8dc4dbbc0656a6bf948309c446ffc67844f8e49171672ebbf380368979e20dcd114f889936f5a6ae0fdc393d4292659ee8f00070c0b6f01781e9c9d64a1ef7dc43912de5666d2f3495d9e4f3b478621e0e7e2ade6728e2de162aaf06b000ef5c514ba8004ed28cdbb9893a2b9e024a3ffedf98b920ff94130f31775cbc6a4f7a0dd361c40a8ca0956bf7fa4047bb00ab51c8aae729cce29a5427b8f80e28fcd5163a6f070c654ef05b85671fd1c9a2a2e52e8737b3cc04d6e95e0690b5e7d711b23c45a065f66193ab6d070a23efa56654f9427ec05e4e32a79e43869db3f3b61ca5c4fed04f2926e4bdb99367b15068868d0fb232359ea3c9e9c64150b4058a592b59943a7e23b69813bf08e637cca4ea1e5e996613a1db2684386a5e5f0dcbbea04b312f69512bab31db7e9ef94b6905a79690193f7289851821d135974af3696a2e0439585a960b3d8a31568bca8de1271a14cd30ed1a7b85adf23f9d76f5b62149242296677fea61288a4b58d2e38889b2bbd9926672df36b46fd6463bf0c0f7b1db1a7312071ef8e39a5a7deea4e47b6cda985de2cc5133337633b3db6d0cb54d56795a8a76fef2edf93debc3cbea6d0b902a0c710e73fa443c4842ec1646b4934514d2700eaa48b1320f0477f992ac0849bfd1fa628fd2b85a8997c5c2128bcb8135718b62180ede1ee8d4bf375c053a5419173b6adf54ab6f5943a377f7b2b4b81807fba3460b6acd28ef6d4be2bb015d9d5ea9b3c2d22389d7c688dd871e0a9fe295389711bf19804eeb68a86204fed691fe7493db9e0d2bce3f6ae4df5debe4cd4b4c668111146dc82b638080da9fa26d47d00f37538ee2a4a2930d39d1f734537a79d0d34f6cfab7893e2ebe71ec110e82f63a7d5c246737acadf1fc75c777faaa150164fc204c7ad3261fc9563a1b5bac908905d53fb7f37060dc1c5750634b200b31fbfaf4de1fefbc687b4c808968065e9cb567f003e1bd06b77e6442a7e5d3f54ff98d12d03d3f8705fdeb9614764acd153fc15a8763e5dc95e2c19ce478b8da93744680f2bfca75e50bebabc0cbb609575bb1000141dc35da3f4b5f5141899ff9ef856b7904baf5a828d2e4f576a58e505c5c9f3e5bc0e1ecfaf4ef36a7dee842aaf155db65912cd8dfccd11b188f5da5ea10035d47f17e0996791b0aacefa38799708198e4780846c7b1cf60aa9172a3a5935338bdb71e33a20b96181e487dd5caeeeff0446bc945ac2a83c3ca0ded82939d314073711c2afce8cc2a94fc6d46e28ea5bbafcd6adb517dedc9fa99446be727718bc41122214b6b788641e785ba0bee6530c61f9a9a58c14c6a5c477fd6f2117c67b1a2d8ca20e3aaef5c2d4e1f2b525fc8516ac90654880e72b4d87916e76592691d154a89f4125db6d9635e553955797f77ec00797f130f43b6245bf97cb88c93a641c78cbc352cf4816b075c81133cff364f4120399e3beb8cb6aae362a33de38c0d14d919a1939c00d46cd7ec2368620378fa490dd7d746361df3ee49b19a848035f619b08a66271fd97cb805ec834d85355495f003e39b6284b1ff52d5fbfeca7f7676f2a780c0b649abe6574da5867b2949af7d01e33fb9ffdee + + + 2fe9827b8286e6e5329cc9af2bb910f78b57ec5d073e6ef061360d7103f1c38245e04f804f431da3b51887a6e16cfee2a69534f4ab8ded57b74029beba7ccd2347b962d8f0d2d8bc93771a52ef4688fdf9759d33be9ba18b306a86fd3848b8ca8fe61abdd9ea2b9018c31554122172488166517e67276384b23239f02f4b5c4d8290dc542f0af54a66874a34bb8cd6114d7d5bce7404294f2c41ec20b85b942e5dca6e7b94fdea2e3dcd98777d0d7b631246c2222b69bd0547dc56d4c7990e0f803c32593cd218f4d655998ddd90e488a5d12aa7ef868f7641dc6a6df0bb0abfc0e76335ab682d909d117d863c90f6e21ebdb3ff8a7126bde4b14c524afe31fad20d1b000356cd25ab2276a2adf82638a5bf20304e2ad1a2f28cd7490e818fbec3566514cdeb412ce63d421738b038e40f70073d50352307de058b40d6215f6af1ce09cf6b954be69c7ef0f8030449a20faa5c2dd9b8d0f1adf911371156dc65b470fb02a092975af2f9080f689dd56cc3cd0f4c0434537e32b80cc22bd19743b1145d713422fed681b3bb9a09c5e5ec8f739631a8ffe2a49cebb2f13634b9414da48845948473616f18814447f63e018015b3d385cc592cc80c1f5a54d04029766572be94991d3e96b952961813e35fdc3f86a2d5fbfcd48a12d531be0f68ffcf48f1eb0e14623a6cfbdea026dd766fab9bbbc442468e6559d934959f0643c963c0799fcc3f98ccfa38b84cfb962a77cf5008037c81934425f0d7f4d1b7093adfc109918a7a130f1b3d5073a1517ac1c5b6dfe962917c8704e0d94d68795355f4ac341f84124bddd270c1da1a180ca101fb5f0bd4204e11461dce54d96827dcaa3e3a3889a621734268cf27ac18fe8c0df23108f3ef949fc68fd54122f3ea5fd5b2131b1ab7264006d730a7c4b90493b6858d78f5dfcf2cddbe8f1aa2b5da1de0580862ae16e01c5bce21a537ce0a8dfec8379c5152c0a3af41e09b7d35ed8920ad0f01abf1495b6e3e565cc8734ecf22a839212626f8f46cee5b90a742d43c2de2a280a2b1ffbe7e8285d8632bbf1137c28590f0420b3e75809c71f8b0e9bd8ed8995ba81003386d9c206ff5d3db014353d9565d1ac859f9335146cd3d2c8a04b4c3a1e7fa2e37a067ea2cb8fd4826010ecc5915114301fd7b2c7c72a222618c424797fe690cc9af7bc0a609c17a1dc8de4603df8ecbcc08d09bdd382b440fb29d11c822319b8572727592915fdcc1d9f7f3a025bec58834d5c55505c8013a5daf7f6e312b509500c2adc8e664c56031666124ab3f997185ae4f9286e7e6760ca8a106484fc68e50da961819fce231fca20330729b80be767c75006b1f8b796d60da0636d8fec8bd4c69671a8681f11f21f2b104ab4961c50b50f6b2b5fc59f78b674de891652d91f32ba60deaabf554158a38989438b67fb1713a14b4a2b58843a8b2df832d0969309f23ce4e07504a6be8aba05d8d79af93f41cf70fe0ef7b20ad603e4bd4c9261b0c3a007b46663c7b16ad77e8b8029d4d76fc4941205134d4cc9b7b7f9cc961ce5651afe8b308fa982cfdd57e9c21e1c65b2e906001f98f63cea267c44032c28348655541242b2092bfe8cb521bc491d376d989baa75c8f3c588089956f0736a71245c7acf0654dbaaad04803f8d8096d9a2c786a4c96ab99e4bc38119171839b718cffba4f8503d624cdfc2209597505da520878e2a10a9a7b0cd1e54ca09cf8c1ec9898735ea38e0886c940d8390d4581d205e4d9eb03d280071c6428bcee962122094af10e3784150651c5c4a583d8814c9e14810e021c659bf8cb66f82141d9a87248b20cba5cc212b2c0cd6dd085e690e549b31376babf1f3b19581956e26b1107f198975502 + + + 74f4e96bbc0f84de1f5f481c7e3257243edfcec173663557469a90ef23c067b8606774b867568db7dfe5209aada24cc96fcf93faa7a95180ffe2a20154898e82b27e27d01358c42c1857f9bdcb4a83ee1709226e2fc117c3a93cd3cb139777fc9295b4602c5d7c76f5a47d2f574009959a274f49d36e7435ed61e755768551859dfc34277df224c2dc9365112b9459e26235e7ce8619d0d1457954de93f604a200b0e9368b53aa7a3313b4f020d28625c646b6ca7bc6feadc7297b5a51f7eeb77adb016f346ca3bd2f4878a92dcef4abad57b0e5c8a10087f717e813892f55ed4e248cc6bdf0ea1edcaa1d42adbec7d2832c184d2185fdb66f0ee0043ce0a6035a151b22d81eafcf4cf9a8ce962e6ce1f6571b6df0a86dc221b770974f5bbfe960efbfb8c148f590584fbefae0b5cb95545bf69e4e5c9a39b431155649468ef093127aba424654ee0bb46d194ad17e61b022c43671dfef0eae98ec6ba6cd2924279fb592ac1d3babb61c0befddf6521efc38d4d75007499864cced0c8ee14cb5fd37b79626f636753b585ccfcf583ee92784850f0cacd3389c3546827bf3e7ef2719b25819f0208dcf7c3493edfc048a6fa3d35511e6f9c2a367cb87ad74c0f41bf853b6ba35f51fadfd5632012bde0180585dff6a7f114a2a958ce7ecbe484304dba2f138a86c4b0aad337c0047b1cb9dcd358300155d09b72d6c0ed4c53778e86fbdc7674d37a1441c1d38bf8f4c9976540090575863c41a8211c9b9450f28edd514ed8d51e3565de2fd30d6f0bf02fcfb79319ff04e7c4ad452be372fd9fe64021c8af6e566076b78f9c6d553848f9e1bf2ad3955c94470cfb8b6ba4aa81c53acc82395870ef9677b634515c4e4bd8de971292c3aa0c150516c546f8b172613dd1e314d4caf46ebd1770bb0d73b6ea2d53969 + + + 8305f8dd0b412a4b95ef71a44a2cb069890895668054436640b9dffd2b0db4d84e21788b2cf8d609eb95773b4ef3c926335bc93bdc4df971a95f4c4c68ee627402c8935aa619ad276a6994004babf0bb41a8ca9fd5d22e76ec68f662eeb449ad9cdbd37f78b52fb88101e86a54323be7cd4777fdab26ada1cbba1ff0b08b6f451aa45daadcf9ef35a0a24039f2b1d5ca88ad64057afdbfe7c2bba6033380208d8d7c6c5f822a5f8bf19b5ee4f16efe068bd914d2e6ca831af24d53fa330c5d8150eb52fdd29518c14ecbc9af7e68a6e5f7a866150ecccf2b598fd6ba78521d5fe815797a6430ea09d6b394abe630df9510046bc983d9c41e3213868aeaa9dd531220959dd6305a1c582bde1a3e01d9b4be5d09150c1f4a84aa35c995103e6c6e3b6bb5345759b2219a31d05626373653d8151130ba1abef2aa78494f736792c0a462f54ebd86d2a110ae27ad1ad413baca5c7c4a302252da1423e44647cd57399e92cc805a60ce43bbda7a74797be1ad0275c0b270be2f117bd9ccc07bee42e247d178b15ba233535bffbb1c641cdd9ca3d387985b7980e8aed9752dbe30313f8a4b911f0ac7d8fd9352e3be80cdfaa3fd20ac5771c9f918d456b88cd3155de13a3f71bbcc627e766a16a86cac17f83fde98a2e7742bee4144ad235e23c76459522a96812819585155b6fcb6a08dafb19ccf93de37cb6738c803f73b0876e583d47ea3c59d6aba7b168c8de113a8f04cb813847a79682574ee71f6d9a5987b5e3be7169bf3bd82fbda4f5899e31b55b8c257f989516bbc879e60a49a4c5370230b4f728dd9389a059b481ea61046230e1382046955dae636005db580ec4a0540ee382fbc74b78b00ec821a19778fc119b673496df2bc2f11639922141d4cbb8fe22833f6fb210801419ab1b43f77a2baf892055a41c57e529026d4784aad469a4d2b530e81780f2aaea6b37b44243fa0f5e60a99391c6cf2e8a0f263a38566bfa56f761684b754bb8fa95aed80511332bff4673d600b6a09852cba34faca550f0652241a9eb04ca9652c4a19c20d37d6772604c3bbd34c82fa913a1a95e33b811f33952f4618d3600165574e29c44f7f748c05f90105791906e5920b356c4a8ce133dc2a809f0e47aa0ca2537a09688d2b92d49fa6b1f25165b6d2905ea99d1d6d56b2c39b08167df0cf18ce0f593228abbdbba718f05de4700ffa54067cb01fa65d9e378c0bc88d5f4d7bc153db964920e3c0dab30c02e87d957c369c6492bba7b240c27541d80bf0d39cbe62c077bdf6b1fb252d470cc39f9e43a13a95c08788dd5fe4e62fa3b07be01496bc977c6e1fe62977a2a8b72197fb3ad812369e96e3dd2ad329f134aaa4baee81c2ebd1b2c39e55fd9afcc554633ffb04a827ac75f7b26e49bcc341ea062ba13f672cd0a1dfd79a093273a5187e3adb6ece0e460555dc872c49b95e5054ffb772a4301feecdb072d6087345814b4af54de55d413eee562be25741a041bbdcb2850281 + + + 8305f8dd0b412a4b95ef71a44a2cb069890895668054436640b9dffd2b0db4d84e21788b2cf8d609eb95773b4ef3c926335bc93bdc4df971a95f4c4c68ee627402c8935aa619ad276a6994004babf0bb41a8ca9fd5d22e76ec68f662eeb449ad9cdbd37f78b52fb88101e86a54323be7cd4777fdab26ada1cbba1ff0b08b6f451aa45daadcf9ef35a0a24039f2b1d5ca88ad64057afdbfe7c2bba6033380208d8d7c6c5f822a5f8bf19b5ee4f16efe068bd914d2e6ca831af24d53fa330c5d8150eb52fdd29518c14ecbc9af7e68a6e5f7a866150ecccf2b598fd6ba78521d5fe815797a6430ea09d6b394abe630df9510046bc983d9c41e3213868aeaa9dd531220959dd6305a1c582bde1a3e01d9b4be5d09150c1f4a84aa35c995103e6c6e3b6bb5345759b2219a31d05626373653d8151130ba1abef2aa78494f736792c0a462f54ebd86d2a110ae27ad1ad413baca5c7c4a302252da1423e44647cd57399e92cc805a60ce43bbda7a74797be1ad0275c0b270be2f117bd9ccc07bee42e247d178b15ba233535bffbb1c641cdd9ca3d387985b7980e8aed9752dbe30313f8a4b911f0ac7d8fd9352e3be80cdfaa3fd20ac5771c9f918d456b88cd3155de13a3f71bbcc627e766a16a86cac17f83fde98a2e7742bee4144ad235e23c76459522a96812819585155b6fcb6a08dafb19ccf93de37cb6738c803f73b0876e583d47ea3c59d6aba7b168c8de113a8f04cb813847a79682574ee71f6d9a5987b5e3be7169bf3bd82fbda4f5899e31b55b8c257f989516bbc879e60a49a4c5370230b4f728dd9389a059b481ea61046230e1382046955dae636005db580ec4a0540ee382fbc74b78b00ec821a19778fc119b673496df2bc2f11639922141d4cbb8fe22833f6fb210801419ab1b43f77a2baf892055a41c57e529026d4784aad469a4d2b530e81780f2aaea6b37b44243fa0f5e60a99391c6cf2e8a0f263a38566bfa56f761684b754bb8fa95aed80511332bff4673d600b6a09852cba34faca550f0652241a9eb04ca9652c4a19c20d37d6772604c3bbd34c82fa913a1a95e33b811f33952f4618d3600165574e29c44f7f748c05f90105791906e5920b356c4a8ce133dc2a809f0e47aa0ca2537a09688d2b92d49fa6b1f25165b6d2905ea99d1d6d56b2c39b08167df0cf18ce0f593228abbdbba718f05de4700ffa54067cb01fa65d9e378c0bc88d5f4d7bc153db964920e3c0dab30c02e87d957c369c6492bba7b240c27541d80bf0d39cbe62c077bdf6b1fb252d470cc39f9e43a13a95c08788dd5fe4e62fa3b07be01496bc977c6e1fe62977a2a8b72197fb3ad812369e96e3dd2ad329f134aaa4baee81c2ebd1b2c39e55fd9afcc554633ffb04a827ac75f7b26e49bcc341ea062ba13f672cd0a1dfd79a093273a5187e3adb6ece0e460555dc872c49b95e5054ffb772a4301feecdb072d6087345814b4af54de55d413eee562be25741a041bbdcb2850281 + + + fb7d736ac8ee7a3a74f952551e8856a34c05d564ee0408ca0eea47a86e833b5b30a732b9d3ca954e56231908beb9022aec02c756c3e075bd9086f9ade0381b953185b4d3ed332d5c4b454abe5d2ccbeb48b473f956d543bde4f48c1978f129da7bf481b629a8da09941e5ea66d069617f6c82ac3a685b9e6cf75d8d4faf0b2ca0b52df201372c6e2d08dbcb2b724da94c733590165282e6faefd7bb89bb5be76d452f84b50a557d4b0f45192fc562f3682aba1098818ed3ddfaf72181d66f1f7b59be2b31759b66c + + + + + 304e17d899c067afe3c439f92c5bd29869dfbde06ceca4f65e2128a93e7366c078bb0af1b14cb516008683df14c00107cadcce4d980f149da932bdba4a9892841b004ae877b2c7733e2d326d5586a4b2225384afbab6d00900852f5feb47ebd234ad95ec6957dbbbe585c86126f02e47cff3dc6d4ac9d321efbbd39a28655110fa850caca24a9b82984b60d0c517f3d8400594a17ba4a5fd0fcf19711c4b0ef503d698e8597c841eb099118d23e8cc8bc4db907d5093ca73e68f85c3dae629876b5d2fa49ed283591972559ae7da1b99489715c355f068c689c7cb4690ea4d4f3d1f364367b352bd74a0a57a541bfac90fe69d9b6d2fe941707c7316b067f5287c6aff01c86cbb23c2ac5e202cb497c203437c80159454b20dcadec7f2080b286c6b4e76826952b963f856e3c7e9ad89e50b76e2dd22f7bc1fbc8366a965cb76dc862d5c9b5b52802e431d2490079a7396db1bc279099a68a9b250135020e3906bc8c159b773a7dbb3d5beb54a30746fc776a07aeeb4f1f170d688b15742f530901959e4a4cd8ed869249e95a58c3cc45bc323aee66aec9090f4c938411c348b72d6ae4c3169c0049d84e88f4c26318136353db77519d7c060df07f7da78df71f13ed7be5916b2973fa712b4d826527911a04923dc763630306d04e09229584370e670c24d6af48bee2ead5525f55b8bd66083314b11d1dede385bfbdcaacd0b577c1d37f7bbcbb8d24f461723713570537abbcdfd8b96c9dcfc0f8c0afd7e6e43620dbfb88442cacd15a6cb28ee2d318e56d023af40a832010e8e2cb1d2d5223fd465616094fca6fecd92ff66e398f3ac8ac091beb3635dfacea5147848514c94ecdc011180cda61f977f9c59265682c77dc7af662e1c50386ac50835c6802adb86f941ec3d05316e505f7183bf8dc048685af48f6514726d993e789cfe13e28bd0ce7ea0e0e97f19364ec8567e63f28afcdf07de02fa8c79a850ffc4e9da3786ecec269aff4995ed5e3029a2abcba65ba62990e0842714688ca48162510449ebaf80878405c7373534aa6e688f4c56569f15e349272db874f3846eb3cea77f8de261628c285e93ff7c38aba3d65df19bf8dd8732068e817e90b92ddf7be29ec844f6b90af2547daf00093e4f2241c2d419e60c9b6d64e4278a2baa0a0396e98ccafebd131a6c5374baaf4a3e715c6c4d2c647de1cd0610cf9bcf3a9e857bef77a0ed51dc297ba914a5c41c5243cc72308b9de7908ec8955b52c9328b1d8efdd28d570c010f1329b7f0c40669004dc77cc87a34348310f444ba799fb0ed00687ae16681dc7eab7d1884213b59ff1e2e3cefa64676587fd37db308f4de795cb46b468948e38d340981e32ca2222cbff42bc3852f1657a690bfba8b918cfa05bd3f6a7bbc284e15ba39b114e8619b666748325e0b87514eff2b48a70ea906ca0ecf6f0f2c6438ffa8106239b94231f008339069fd420978e0f8103c94fcfb8a48018353443e8cbe131dc4261ef79945471cdaec9868954e420f4f43f738c098e3ee3378c5890409bc9e4f191e85f3318c5a125f48e8bc3a9eb67f413742c2b030847b3461bd9659e62af48aca3a456ae4f99beacd3df943608956fbadde816733edc9f2a107a8d92592b9690aeb69b48bfd9231ba345f1c71dcb6aae1c13cf1ab91942938db056a1569c6399cf57dd02032ef43f64f6e3ee3de56d11b7dc07f3bdb899714b912d6e8a45be8e2f6413ad51ef93aa75c5bd9c4a8c86231b31a5e68892bc8ec01de40db5d6ec87160c8d5d14b3725160407a9a7484bb794dee73e0a87cceeb874ed6d96941406f18b8634886c23d5be' + + + 304e17d899c067afe3c439f92c5bd29869dfbde06ceca4f65e2128a93e7366c078bb0af1b14cb516008683df14c00107cadcce4d980f149da932bdba4a9892841b004ae877b2c7733e2d326d5586a4b2225384afbab6d00900852f5feb47ebd234ad95ec6957dbbbe585c86126f02e47cff3dc6d4ac9d321efbbd39a28655110fa850caca24a9b82984b60d0c517f3d8400594a17ba4a5fd0fcf19711c4b0ef503d698e8597c841eb099118d23e8cc8bc4db907d5093ca73e68f85c3dae629876b5d2fa49ed283591972559ae7da1b99489715c355f068c689c7cb4690ea4d4f3d1f364367b352bd74a0a57a541bfac90fe69d9b6d2fe941707c7316b067f5287c6aff01c86cbb23c2ac5e202cb497c203437c80159454b20dcadec7f2080b286c6b4e76826952b963f856e3c7e9ad89e50b76e2dd22f7bc1fbc8366a965cb76dc862d5c9b5b52802e431d2490079a7396db1bc279099a68a9b250135020e3906bc8c159b773a7dbb3d5beb54a30746fc776a07aeeb4f1f170d688b15742f530901959e4a4cd8ed869249e95a58c3cc45bc323aee66aec9090f4c938411c348b72d6ae4c3169c0049d84e88f4c26318136353db77519d7c060df07f7da78df71f13ed7be5916b2973fa712b4d826527911a04923dc763630306d04e09229584370e670c24d6af48bee2ead5525f55b8bd66083314b11d1dede385bfbdcaacd0b577c1d37f7bbcbb8d24f461723713570537abbcdfd8b96c9dcfc0f8c0afd7e6e43620dbfb88442cacd15a6cb28ee2d318e56d023af40a832010e8e2cb1d2d5223fd465616094fca6fecd92ff66e398f3ac8ac091beb3635dfacea5147848514c94ecdc011180cda61f977f9c59265682c77dc7af662e1c50386ac50835c6802adb86f941ec3d05316e505f7183bf8dc048685af48f6514726d993e789cfe13e28bd0ce7ea0e0e97f19364ec8567e63f28afcdf07de02fa8c79a850ffc4e9da3786ecec269aff4995ed5e3029a2abcba65ba62990e0842714688ca48162510449ebaf80878405c7373534aa6e688f4c56569f15e349272db874f3846eb3cea77f8de261628c285e93ff7c38aba3d65df19bf8dd8732068e817e90b92ddf7be29ec844f6b90af2547daf00093e4f2241c2d419e60c9b6d64e4278a2baa0a0396e98ccafebd131a6c5374baaf4a3e715c6c4d2c647de1cd0610cf9bcf3a9e857bef77a0ed51dc297ba914a5c41c5243cc72308b9de7908ec8955b52c9328b1d8efdd28d570c010f1329b7f0c40669004dc77cc87a34348310f444ba799fb0ed00687ae16681dc7eab7d1884213b59ff1e2e3cefa64676587fd37db308f4de795cb46b468948e38d340981e32ca2222cbff42bc3852f1657a690bfba8b918cfa05bd3f6a7bbc284e15ba39b114e8619b666748325e0b87514eff2b48a70ea906ca0ecf6f0f2c6438ffa8106239b94231f008339069fd420978e0f8103c94fcfb8a48018353443e8cbe131dc4261ef79945471cdaec9868954e420f4f43f738c098e3ee3378c5890409bc9e4f191e85f3318c5a125f48e8bc3a9eb67f413742c2b030847b3461bd9659e62af48aca3a456ae4f99beacd3df943608956fbadde816733edc9f2a107a8d92592b9690aeb69b48bfd9231ba345f1c71dcb6aae1c13cf1ab91942938db056a1569c6399cf57dd02032ef43f64f6e3ee3de56d11b7dc07f3bdb899714b912d6e8a45be8e2f6413ad51ef93aa75c5bd9c4a8c86231b31a5e68892bc8ec01de40db5d6ec87160c8d5d14b3725160407a9a7484bb794dee73e0a87cceeb874ed6d96941406f18b8634886c23d5be' + + + 35b9ea4d98445d6fda595e42c921269e0699ed78a2655b169fcaffef66521e649c1818cb71fb5a2ef4c0f453786de08c9cf81cdc4f6bcb8a7af68f23d9a4b3dc4a84950a13261e929ef4aa41a53819b8fc98582250533b476e46d6d0894a0003f315a6d8612d2d46eebe367330ae4587635daa4d4b929a33de91dfdb30b1aa3b3bded0ab06741786b19564b74e3b0d86a3d056bf9662fa004d2609a62b862caea7f6448a5257689a0de69798ac8eaf6186799c1e5de7ba124493365a76ded957d0f133190608b49c940cd7db6bdcb6b98739dfe6dc44b4736ebb10a3563ac7a4c6c63177cb292f32be6be3041cd2c27fef4c9f3ec2005041f80df142941185c57114d90500c744d9442f4507e43c91bbacc4205ee8dc4dbbc0656a6bf948309c446ffc67844f8e49171672ebbf380368979e20dcd114f889936f5a6ae0fdc393d4292659ee8f00070c0b6f01781e9c9d64a1ef7dc43912de5666d2f3495d9e4f3b478621e0e7e2ade6728e2de162aaf06b000ef5c514ba8004ed28cdbb9893a2b9e024a3ffedf98b920ff94130f31775cbc6a4f7a0dd361c40a8ca0956bf7fa4047bb00ab51c8aae729cce29a5427b8f80e28fcd5163a6f070c654ef05b85671fd1c9a2a2e52e8737b3cc04d6e95e0690b5e7d711b23c45a065f66193ab6d070a23efa56654f9427ec05e4e32a79e43869db3f3b61ca5c4fed04f2926e4bdb99367b15068868d0fb232359ea3c9e9c64150b4058a592b59943a7e23b69813bf08e637cca4ea1e5e996613a1db2684386a5e5f0dcbbea04b312f69512bab31db7e9ef94b6905a79690193f7289851821d135974af3696a2e0439585a960b3d8a31568bca8de1271a14cd30ed1a7b85adf23f9d76f5b62149242296677fea61288a4b58d2e38889b2bbd9926672df36b46fd6463bf0c0f7b1db1a7312071ef8e39a5a7deea4e47b6cda985de2cc5133337633b3db6d0cb54d56795a8a76fef2edf93debc3cbea6d0b902a0c710e73fa443c4842ec1646b4934514d2700eaa48b1320f0477f992ac0849bfd1fa628fd2b85a8997c5c2128bcb8135718b62180ede1ee8d4bf375c053a5419173b6adf54ab6f5943a377f7b2b4b81807fba3460b6acd28ef6d4be2bb015d9d5ea9b3c2d22389d7c688dd871e0a9fe295389711bf19804eeb68a86204fed691fe7493db9e0d2bce3f6ae4df5debe4cd4b4c668111146dc82b638080da9fa26d47d00f37538ee2a4a2930d39d1f734537a79d0d34f6cfab7893e2ebe71ec110e82f63a7d5c246737acadf1fc75c777faaa150164fc204c7ad3261fc9563a1b5bac908905d53fb7f37060dc1c5750634b200b31fbfaf4de1fefbc687b4c808968065e9cb567f003e1bd06b77e6442a7e5d3f54ff98d12d03d3f8705fdeb9614764acd153fc15a8763e5dc95e2c19ce478b8da93744680f2bfca75e50bebabc0cbb609575bb1000141dc35da3f4b5f5141899ff9ef856b7904baf5a828d2e4f576a58e505c5c9f3e5bc0e1ecfaf4ef36a7dee842aaf155db65912cd8dfccd11b188f5da5ea10035d47f17e0996791b0aacefa38799708198e4780846c7b1cf60aa9172a3a5935338bdb71e33a20b96181e487dd5caeeeff0446bc945ac2a83c3ca0ded82939d314073711c2afce8cc2a94fc6d46e28ea5bbafcd6adb517dedc9fa99446be727718bc41122214b6b788641e785ba0bee6530c61f9a9a58c14c6a5c477fd6f2117c67b1a2d8ca20e3aaef5c2d4e1f2b525fc8516ac90654880e72b4d87916e76592691d154a89f4125db6d9635e553955797f77ec00797f130f43b6245bf97cb88c93a641c78cbc352cf4816b075c81133cff364f4120399e3beb8cb6aae362a33de38c0d14d919a1939c00d46cd7ec2368620378fa490dd7d746361df3ee49b19a848035f619b08a66271fd97cb805ec834d85355495f003e39b6284b1ff52d5fbfeca7f7676f2a780c0b649abe6574da5867b2949af7d01e33fb9ffdee + + + 2fe9827b8286e6e5329cc9af2bb910f78b57ec5d073e6ef061360d7103f1c38245e04f804f431da3b51887a6e16cfee2a69534f4ab8ded57b74029beba7ccd2347b962d8f0d2d8bc93771a52ef4688fdf9759d33be9ba18b306a86fd3848b8ca8fe61abdd9ea2b9018c31554122172488166517e67276384b23239f02f4b5c4d8290dc542f0af54a66874a34bb8cd6114d7d5bce7404294f2c41ec20b85b942e5dca6e7b94fdea2e3dcd98777d0d7b631246c2222b69bd0547dc56d4c7990e0f803c32593cd218f4d655998ddd90e488a5d12aa7ef868f7641dc6a6df0bb0abfc0e76335ab682d909d117d863c90f6e21ebdb3ff8a7126bde4b14c524afe31fad20d1b000356cd25ab2276a2adf82638a5bf20304e2ad1a2f28cd7490e818fbec3566514cdeb412ce63d421738b038e40f70073d50352307de058b40d6215f6af1ce09cf6b954be69c7ef0f8030449a20faa5c2dd9b8d0f1adf911371156dc65b470fb02a092975af2f9080f689dd56cc3cd0f4c0434537e32b80cc22bd19743b1145d713422fed681b3bb9a09c5e5ec8f739631a8ffe2a49cebb2f13634b9414da48845948473616f18814447f63e018015b3d385cc592cc80c1f5a54d04029766572be94991d3e96b952961813e35fdc3f86a2d5fbfcd48a12d531be0f68ffcf48f1eb0e14623a6cfbdea026dd766fab9bbbc442468e6559d934959f0643c963c0799fcc3f98ccfa38b84cfb962a77cf5008037c81934425f0d7f4d1b7093adfc109918a7a130f1b3d5073a1517ac1c5b6dfe962917c8704e0d94d68795355f4ac341f84124bddd270c1da1a180ca101fb5f0bd4204e11461dce54d96827dcaa3e3a3889a621734268cf27ac18fe8c0df23108f3ef949fc68fd54122f3ea5fd5b2131b1ab7264006d730a7c4b90493b6858d78f5dfcf2cddbe8f1aa2b5da1de0580862ae16e01c5bce21a537ce0a8dfec8379c5152c0a3af41e09b7d35ed8920ad0f01abf1495b6e3e565cc8734ecf22a839212626f8f46cee5b90a742d43c2de2a280a2b1ffbe7e8285d8632bbf1137c28590f0420b3e75809c71f8b0e9bd8ed8995ba81003386d9c206ff5d3db014353d9565d1ac859f9335146cd3d2c8a04b4c3a1e7fa2e37a067ea2cb8fd4826010ecc5915114301fd7b2c7c72a222618c424797fe690cc9af7bc0a609c17a1dc8de4603df8ecbcc08d09bdd382b440fb29d11c822319b8572727592915fdcc1d9f7f3a025bec58834d5c55505c8013a5daf7f6e312b509500c2adc8e664c56031666124ab3f997185ae4f9286e7e6760ca8a106484fc68e50da961819fce231fca20330729b80be767c75006b1f8b796d60da0636d8fec8bd4c69671a8681f11f21f2b104ab4961c50b50f6b2b5fc59f78b674de891652d91f32ba60deaabf554158a38989438b67fb1713a14b4a2b58843a8b2df832d0969309f23ce4e07504a6be8aba05d8d79af93f41cf70fe0ef7b20ad603e4bd4c9261b0c3a007b46663c7b16ad77e8b8029d4d76fc4941205134d4cc9b7b7f9cc961ce5651afe8b308fa982cfdd57e9c21e1c65b2e906001f98f63cea267c44032c28348655541242b2092bfe8cb521bc491d376d989baa75c8f3c588089956f0736a71245c7acf0654dbaaad04803f8d8096d9a2c786a4c96ab99e4bc38119171839b718cffba4f8503d624cdfc2209597505da520878e2a10a9a7b0cd1e54ca09cf8c1ec9898735ea38e0886c940d8390d4581d205e4d9eb03d280071c6428bcee962122094af10e3784150651c5c4a583d8814c9e14810e021c659bf8cb66f82141d9a87248b20cba5cc212b2c0cd6dd085e690e549b31376babf1f3b19581956e26b1107f198975502 + + + 74f4e96bbc0f84de1f5f481c7e3257243edfcec173663557469a90ef23c067b8606774b867568db7dfe5209aada24cc96fcf93faa7a95180ffe2a20154898e82b27e27d01358c42c1857f9bdcb4a83ee1709226e2fc117c3a93cd3cb139777fc9295b4602c5d7c76f5a47d2f574009959a274f49d36e7435ed61e755768551859dfc34277df224c2dc9365112b9459e26235e7ce8619d0d1457954de93f604a200b0e9368b53aa7a3313b4f020d28625c646b6ca7bc6feadc7297b5a51f7eeb77adb016f346ca3bd2f4878a92dcef4abad57b0e5c8a10087f717e813892f55ed4e248cc6bdf0ea1edcaa1d42adbec7d2832c184d2185fdb66f0ee0043ce0a6035a151b22d81eafcf4cf9a8ce962e6ce1f6571b6df0a86dc221b770974f5bbfe960efbfb8c148f590584fbefae0b5cb95545bf69e4e5c9a39b431155649468ef093127aba424654ee0bb46d194ad17e61b022c43671dfef0eae98ec6ba6cd2924279fb592ac1d3babb61c0befddf6521efc38d4d75007499864cced0c8ee14cb5fd37b79626f636753b585ccfcf583ee92784850f0cacd3389c3546827bf3e7ef2719b25819f0208dcf7c3493edfc048a6fa3d35511e6f9c2a367cb87ad74c0f41bf853b6ba35f51fadfd5632012bde0180585dff6a7f114a2a958ce7ecbe484304dba2f138a86c4b0aad337c0047b1cb9dcd358300155d09b72d6c0ed4c53778e86fbdc7674d37a1441c1d38bf8f4c9976540090575863c41a8211c9b9450f28edd514ed8d51e3565de2fd30d6f0bf02fcfb79319ff04e7c4ad452be372fd9fe64021c8af6e566076b78f9c6d553848f9e1bf2ad3955c94470cfb8b6ba4aa81c53acc82395870ef9677b634515c4e4bd8de971292c3aa0c150516c546f8b172613dd1e314d4caf46ebd1770bb0d73b6ea2d53969 + + + 8305f8dd0b412a4b95ef71a44a2cb069890895668054436640b9dffd2b0db4d84e21788b2cf8d609eb95773b4ef3c926335bc93bdc4df971a95f4c4c68ee627402c8935aa619ad276a6994004babf0bb41a8ca9fd5d22e76ec68f662eeb449ad9cdbd37f78b52fb88101e86a54323be7cd4777fdab26ada1cbba1ff0b08b6f451aa45daadcf9ef35a0a24039f2b1d5ca88ad64057afdbfe7c2bba6033380208d8d7c6c5f822a5f8bf19b5ee4f16efe068bd914d2e6ca831af24d53fa330c5d8150eb52fdd29518c14ecbc9af7e68a6e5f7a866150ecccf2b598fd6ba78521d5fe815797a6430ea09d6b394abe630df9510046bc983d9c41e3213868aeaa9dd531220959dd6305a1c582bde1a3e01d9b4be5d09150c1f4a84aa35c995103e6c6e3b6bb5345759b2219a31d05626373653d8151130ba1abef2aa78494f736792c0a462f54ebd86d2a110ae27ad1ad413baca5c7c4a302252da1423e44647cd57399e92cc805a60ce43bbda7a74797be1ad0275c0b270be2f117bd9ccc07bee42e247d178b15ba233535bffbb1c641cdd9ca3d387985b7980e8aed9752dbe30313f8a4b911f0ac7d8fd9352e3be80cdfaa3fd20ac5771c9f918d456b88cd3155de13a3f71bbcc627e766a16a86cac17f83fde98a2e7742bee4144ad235e23c76459522a96812819585155b6fcb6a08dafb19ccf93de37cb6738c803f73b0876e583d47ea3c59d6aba7b168c8de113a8f04cb813847a79682574ee71f6d9a5987b5e3be7169bf3bd82fbda4f5899e31b55b8c257f989516bbc879e60a49a4c5370230b4f728dd9389a059b481ea61046230e1382046955dae636005db580ec4a0540ee382fbc74b78b00ec821a19778fc119b673496df2bc2f11639922141d4cbb8fe22833f6fb210801419ab1b43f77a2baf892055a41c57e529026d4784aad469a4d2b530e81780f2aaea6b37b44243fa0f5e60a99391c6cf2e8a0f263a38566bfa56f761684b754bb8fa95aed80511332bff4673d600b6a09852cba34faca550f0652241a9eb04ca9652c4a19c20d37d6772604c3bbd34c82fa913a1a95e33b811f33952f4618d3600165574e29c44f7f748c05f90105791906e5920b356c4a8ce133dc2a809f0e47aa0ca2537a09688d2b92d49fa6b1f25165b6d2905ea99d1d6d56b2c39b08167df0cf18ce0f593228abbdbba718f05de4700ffa54067cb01fa65d9e378c0bc88d5f4d7bc153db964920e3c0dab30c02e87d957c369c6492bba7b240c27541d80bf0d39cbe62c077bdf6b1fb252d470cc39f9e43a13a95c08788dd5fe4e62fa3b07be01496bc977c6e1fe62977a2a8b72197fb3ad812369e96e3dd2ad329f134aaa4baee81c2ebd1b2c39e55fd9afcc554633ffb04a827ac75f7b26e49bcc341ea062ba13f672cd0a1dfd79a093273a5187e3adb6ece0e460555dc872c49b95e5054ffb772a4301feecdb072d6087345814b4af54de55d413eee562be25741a041bbdcb2850281 + + + 8305f8dd0b412a4b95ef71a44a2cb069890895668054436640b9dffd2b0db4d84e21788b2cf8d609eb95773b4ef3c926335bc93bdc4df971a95f4c4c68ee627402c8935aa619ad276a6994004babf0bb41a8ca9fd5d22e76ec68f662eeb449ad9cdbd37f78b52fb88101e86a54323be7cd4777fdab26ada1cbba1ff0b08b6f451aa45daadcf9ef35a0a24039f2b1d5ca88ad64057afdbfe7c2bba6033380208d8d7c6c5f822a5f8bf19b5ee4f16efe068bd914d2e6ca831af24d53fa330c5d8150eb52fdd29518c14ecbc9af7e68a6e5f7a866150ecccf2b598fd6ba78521d5fe815797a6430ea09d6b394abe630df9510046bc983d9c41e3213868aeaa9dd531220959dd6305a1c582bde1a3e01d9b4be5d09150c1f4a84aa35c995103e6c6e3b6bb5345759b2219a31d05626373653d8151130ba1abef2aa78494f736792c0a462f54ebd86d2a110ae27ad1ad413baca5c7c4a302252da1423e44647cd57399e92cc805a60ce43bbda7a74797be1ad0275c0b270be2f117bd9ccc07bee42e247d178b15ba233535bffbb1c641cdd9ca3d387985b7980e8aed9752dbe30313f8a4b911f0ac7d8fd9352e3be80cdfaa3fd20ac5771c9f918d456b88cd3155de13a3f71bbcc627e766a16a86cac17f83fde98a2e7742bee4144ad235e23c76459522a96812819585155b6fcb6a08dafb19ccf93de37cb6738c803f73b0876e583d47ea3c59d6aba7b168c8de113a8f04cb813847a79682574ee71f6d9a5987b5e3be7169bf3bd82fbda4f5899e31b55b8c257f989516bbc879e60a49a4c5370230b4f728dd9389a059b481ea61046230e1382046955dae636005db580ec4a0540ee382fbc74b78b00ec821a19778fc119b673496df2bc2f11639922141d4cbb8fe22833f6fb210801419ab1b43f77a2baf892055a41c57e529026d4784aad469a4d2b530e81780f2aaea6b37b44243fa0f5e60a99391c6cf2e8a0f263a38566bfa56f761684b754bb8fa95aed80511332bff4673d600b6a09852cba34faca550f0652241a9eb04ca9652c4a19c20d37d6772604c3bbd34c82fa913a1a95e33b811f33952f4618d3600165574e29c44f7f748c05f90105791906e5920b356c4a8ce133dc2a809f0e47aa0ca2537a09688d2b92d49fa6b1f25165b6d2905ea99d1d6d56b2c39b08167df0cf18ce0f593228abbdbba718f05de4700ffa54067cb01fa65d9e378c0bc88d5f4d7bc153db964920e3c0dab30c02e87d957c369c6492bba7b240c27541d80bf0d39cbe62c077bdf6b1fb252d470cc39f9e43a13a95c08788dd5fe4e62fa3b07be01496bc977c6e1fe62977a2a8b72197fb3ad812369e96e3dd2ad329f134aaa4baee81c2ebd1b2c39e55fd9afcc554633ffb04a827ac75f7b26e49bcc341ea062ba13f672cd0a1dfd79a093273a5187e3adb6ece0e460555dc872c49b95e5054ffb772a4301feecdb072d6087345814b4af54de55d413eee562be25741a041bbdcb2850281 + + + fb7d736ac8ee7a3a74f952551e8856a34c05d564ee0408ca0eea47a86e833b5b30a732b9d3ca954e56231908beb9022aec02c756c3e075bd9086f9ade0381b953185b4d3ed332d5c4b454abe5d2ccbeb48b473f956d543bde4f48c1978f129da7bf481b629a8da09941e5ea66d069617f6c82ac3a685b9e6cf75d8d4faf0b2ca0b52df201372c6e2d08dbcb2b724da94c733590165282e6faefd7bb89bb5be76d452f84b50a557d4b0f45192fc562f3682aba1098818ed3ddfaf72181d66f1f7b59be2b31759b66c + + + \ No newline at end of file -- 2.25.1 From f7158a83cf323940ef96c42d359389b4fe3a28e1 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Abdussamed=20ULUTA=C5=9E?= Date: Sat, 17 Dec 2022 00:09:13 +0300 Subject: [PATCH 13/37] Status.xml added --- script/status.xml | 1 - 1 file changed, 1 deletion(-) diff --git a/script/status.xml b/script/status.xml index ad3b6f1..8e89bfc 100644 --- a/script/status.xml +++ b/script/status.xml @@ -1,4 +1,3 @@ - -- 2.25.1 From 454b820669cf429251541e52284440f93ae4189e Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Abdussamed=20ULUTA=C5=9E?= Date: Thu, 22 Dec 2022 22:44:57 +0300 Subject: [PATCH 14/37] Stage 255 --- Source/Services/Auth.js | 15 ++ frontend/Peer.ts | 7 + frontend/Room.ts | 24 ++ frontend/index.ts | 25 +- package.json | 3 +- script/index.js | 542 +--------------------------------------- script/index.js.map | 2 +- 7 files changed, 70 insertions(+), 548 deletions(-) diff --git a/Source/Services/Auth.js b/Source/Services/Auth.js index 2254b1b..e12e256 100644 --- a/Source/Services/Auth.js +++ b/Source/Services/Auth.js @@ -127,6 +127,21 @@ addService(({ }) break; } + case 'is/reachable':{ + if(Client.clients.has(to)) + { + let otherPeer = Client.clients.get(to); + if(otherPeer.requiredPair && !otherPeer.pairs.has(to)) + { + end(false); + }else{ + end(true); + } + }else{ + end(false); + } + break; + } case 'auth/check':{ let auth = client.store.has('user'); return end({ diff --git a/frontend/Peer.ts b/frontend/Peer.ts index 933c1ca..f4de61d 100644 --- a/frontend/Peer.ts +++ b/frontend/Peer.ts @@ -43,6 +43,13 @@ export default class Peer extends EventTarget return result; } } + async isReachable() + { + return await this.mwse.EventPooling.request({ + type:'is/reachable', + to: this.socketId + }); + } async enablePairAuth(){ await this.mwse.EventPooling.request({ type:'auth/pair-system', diff --git a/frontend/Room.ts b/frontend/Room.ts index fb7bfef..fba2356 100644 --- a/frontend/Room.ts +++ b/frontend/Room.ts @@ -1,5 +1,6 @@ import EventTarget from "./EventTarget"; import MWSE from "./index"; +import Peer from "./Peer"; export interface IRoomOptions { @@ -26,6 +27,7 @@ export default class Room extends EventTarget public joinType? : "free"|"invite"|"password"|"lock"; public name? : string; public owner? : string; + public peers? : Map; constructor(wsts:MWSE){ super(); @@ -37,6 +39,14 @@ export default class Room extends EventTarget { this.roomId = options; }else{ + Object.assign({ + joinType: "free", + ifexistsJoin: true, + accessType: "private", + notifyActionInvite: true, + notifyActionJoined: true, + notifyActionEjected: true + },options); this.options = options; } } @@ -90,4 +100,18 @@ export default class Room extends EventTarget wom }); } + async fetchAllPeers(){ + let {type, peers} = await this.mwse.EventPooling.request({ + type:'room-peers', + roomId: this.roomId + }) as {type:"success"|"fail", peers: string[]}; + if(type == 'fail') + { + throw new Error("Cant using peers on room") + }else if(type == 'success'){ + for (const peer of peers) { + this.mwse.peer(peer); + } + } + } } \ No newline at end of file diff --git a/frontend/index.ts b/frontend/index.ts index 28d8097..2c32f80 100644 --- a/frontend/index.ts +++ b/frontend/index.ts @@ -41,7 +41,24 @@ export default class MWSE extends EventTarget { let {to,pack} = payload; this.room(to).emit('message', pack); }) - + this.EventPooling.signal('room/joined',(payload : {id:string,roomid:any,ownerid:string}) => { + let {id,roomid} = payload; + let room = this.room(roomid); + let peer = this.peer(id); + room.emit('join', peer); + }) + this.EventPooling.signal('room/ejected',(payload : {id:string,roomid:any,ownerid:string}) => { + let {id,roomid} = payload; + let room = this.room(roomid); + let peer = this.peer(id); + room.emit('eject', peer); + }) + this.EventPooling.signal('room/closed',(payload : {roomid:any}) => { + let {roomid} = payload; + let room = this.room(roomid); + room.emit('close'); + this.rooms.delete(roomid); + }) } public room(options: IRoomOptions | string) : Room { @@ -51,13 +68,10 @@ export default class MWSE extends EventTarget { { return this.rooms.get(options) as Room } - if(this.rooms.has(options)) - { - return this.rooms.get(options) as Room - } } let room = new Room(this); room.setRoomOptions(options); + this.rooms.set(room.roomId as string, room); this.emit('room'); return room; } @@ -76,6 +90,7 @@ export default class MWSE extends EventTarget { } let peer = new Peer(this); peer.setPeerOptions(options); + this.peers.set(peer.socketId as string, peer); this.emit('peer', peer); return peer; } diff --git a/package.json b/package.json index e219209..6095ce2 100644 --- a/package.json +++ b/package.json @@ -3,7 +3,8 @@ "version": "0.1.0", "description": "Mikro WebSocket Engine", "scripts": { - "compile": "parcel watch --no-hmr" + "compile": "parcel watch --no-hmr", + "build": "parcel build" }, "source": "./frontend/index.ts", "targets": { diff --git a/script/index.js b/script/index.js index 046e3eb..df3c438 100644 --- a/script/index.js +++ b/script/index.js @@ -1,542 +1,2 @@ -// modules are defined as an array -// [ module function, map of requires ] -// -// map of requires is short require name -> numeric require -// -// anything defined in a previous bundle is accessed via the -// orig method which is the require for previous bundles - -(function (modules, entry, mainEntry, parcelRequireName, globalName) { - /* eslint-disable no-undef */ - var globalObject = - typeof globalThis !== 'undefined' - ? globalThis - : typeof self !== 'undefined' - ? self - : typeof window !== 'undefined' - ? window - : typeof global !== 'undefined' - ? global - : {}; - /* eslint-enable no-undef */ - - // Save the require from previous bundle to this closure if any - var previousRequire = - typeof globalObject[parcelRequireName] === 'function' && - globalObject[parcelRequireName]; - - var cache = previousRequire.cache || {}; - // Do not use `require` to prevent Webpack from trying to bundle this call - var nodeRequire = - typeof module !== 'undefined' && - typeof module.require === 'function' && - module.require.bind(module); - - function newRequire(name, jumped) { - if (!cache[name]) { - if (!modules[name]) { - // if we cannot find the module within our internal map or - // cache jump to the current global require ie. the last bundle - // that was added to the page. - var currentRequire = - typeof globalObject[parcelRequireName] === 'function' && - globalObject[parcelRequireName]; - if (!jumped && currentRequire) { - return currentRequire(name, true); - } - - // If there are other bundles on this page the require from the - // previous one is saved to 'previousRequire'. Repeat this as - // many times as there are bundles until the module is found or - // we exhaust the require chain. - if (previousRequire) { - return previousRequire(name, true); - } - - // Try the node require function if it exists. - if (nodeRequire && typeof name === 'string') { - return nodeRequire(name); - } - - var err = new Error("Cannot find module '" + name + "'"); - err.code = 'MODULE_NOT_FOUND'; - throw err; - } - - localRequire.resolve = resolve; - localRequire.cache = {}; - - var module = (cache[name] = new newRequire.Module(name)); - - modules[name][0].call( - module.exports, - localRequire, - module, - module.exports, - this - ); - } - - return cache[name].exports; - - function localRequire(x) { - var res = localRequire.resolve(x); - return res === false ? {} : newRequire(res); - } - - function resolve(x) { - var id = modules[name][1][x]; - return id != null ? id : x; - } - } - - function Module(moduleName) { - this.id = moduleName; - this.bundle = newRequire; - this.exports = {}; - } - - newRequire.isParcelRequire = true; - newRequire.Module = Module; - newRequire.modules = modules; - newRequire.cache = cache; - newRequire.parent = previousRequire; - newRequire.register = function (id, exports) { - modules[id] = [ - function (require, module) { - module.exports = exports; - }, - {}, - ]; - }; - - Object.defineProperty(newRequire, 'root', { - get: function () { - return globalObject[parcelRequireName]; - }, - }); - - globalObject[parcelRequireName] = newRequire; - - for (var i = 0; i < entry.length; i++) { - newRequire(entry[i]); - } - - if (mainEntry) { - // Expose entry point to Node, AMD or browser globals - // Based on https://github.com/ForbesLindesay/umd/blob/master/template.js - var mainExports = newRequire(mainEntry); - - // CommonJS - if (typeof exports === 'object' && typeof module !== 'undefined') { - module.exports = mainExports; - - // RequireJS - } else if (typeof define === 'function' && define.amd) { - define(function () { - return mainExports; - }); - - //