From 7e48987b5cb0a6d659ae00860cb52eb08c85514b Mon Sep 17 00:00:00 2001 From: yarrum Date: Tue, 29 Mar 2022 15:16:08 -0500 Subject: [PATCH] initial commit --- ScratchNotes.txt | 50 + cert/chromeExported.cer | Bin 0 -> 863 bytes cert/old/cert.pem | 20 + cert/old/chromeExported-2.cer | Bin 0 -> 863 bytes cert/old/chromeExported-3.cer | Bin 0 -> 863 bytes cert/old/chromeExported.cer | Bin 0 -> 863 bytes cert/old/key.pem | 27 + cert/old/keytmp.pem | 30 + cert/server.cert | 22 + cert/server.key | 28 + components/common/randomString.js | 14 + components/common/sleep.js | 16 + components/common/wrtColor.js | 58 + components/objectDefinitions.js | 29 + components/players/playerCleanup.js | 32 + components/players/playerMgmtFuncs.js | 66 + components/serverMgmt.js | 52 + components/stateMonitor.js | 22 + components/testFunctions.js | 90 ++ config/serverConfig.js | 18 + log/state.json | 5 + package-lock.json | 1681 +++++++++++++++++++++++++ package.json | 19 + server.js | 44 + 24 files changed, 2323 insertions(+) create mode 100644 ScratchNotes.txt create mode 100644 cert/chromeExported.cer create mode 100644 cert/old/cert.pem create mode 100644 cert/old/chromeExported-2.cer create mode 100644 cert/old/chromeExported-3.cer create mode 100644 cert/old/chromeExported.cer create mode 100644 cert/old/key.pem create mode 100644 cert/old/keytmp.pem create mode 100644 cert/server.cert create mode 100644 cert/server.key create mode 100644 components/common/randomString.js create mode 100644 components/common/sleep.js create mode 100644 components/common/wrtColor.js create mode 100644 components/objectDefinitions.js create mode 100644 components/players/playerCleanup.js create mode 100644 components/players/playerMgmtFuncs.js create mode 100644 components/serverMgmt.js create mode 100644 components/stateMonitor.js create mode 100644 components/testFunctions.js create mode 100644 config/serverConfig.js create mode 100644 log/state.json create mode 100644 package-lock.json create mode 100644 package.json create mode 100644 server.js diff --git a/ScratchNotes.txt b/ScratchNotes.txt new file mode 100644 index 0000000..87dcb31 --- /dev/null +++ b/ScratchNotes.txt @@ -0,0 +1,50 @@ +Recreate Love Letter as Browser Game (not for profit) + +Design Envisioned UI +Pick Modules around it + Express + Socket.IO + +Design Data Format + - Handle Multiple Games + - Allow Invites to Game +Design Backend +Design FrontEnd +Design an Invite Feature +Make it reconnectable + No logins, but have unique IDs +Make it https +Animations +Design Chat +Design Guide on how to play +Design Bots to play against + +#Basic setup with socket.io + Express +https://medium.com/@raj_36650/integrate-socket-io-with-node-js-express-2292ca13d891 + +#Guide for HTTPs on Express, SSL Cert +https://medium.com/@nitinpatel_20236/how-to-create-an-https-server-on-localhost-using-express-366435d61f28 + +#Socket.IO handling Cleaner +https://socket.io/docs/v4/server-application-structure/ + +#Automatic Node Reload on changes +https://stackoverflow.com/questions/45622125/how-can-i-add-live-reload-to-my-nodejs-server + +#socket.io, socket attributes +https://socket.io/docs/v4/client-socket-instance/ + +#MEVN stack. MongoDB, Express, VueJS, NodeJs +https://vegibit.com/vue-js-express-tutorial/ +https://mfikri.com/en/blog/nodejs-express-mysql-vue + +Install VUE Global +npm install -g @vue/cli +vue --version + + +___________________________________________________________________ + + + + diff --git a/cert/chromeExported.cer b/cert/chromeExported.cer new file mode 100644 index 0000000000000000000000000000000000000000..e5856394afe0fb4573da0809927bb7e3cc920056 GIT binary patch literal 863 zcmXqLVvaUwVsc)<%*4pV#94jq>EfBi`_3{N@Un4gwRyCC=VfH%W@RuCF%&WoU}Fwt zVHW1h$xlwq$;dA*F_07IH8L_VHZU|YG%z$Zih^*B4UG)ITpYTZ7?qHXXJlnyZerwT zFlb`rVrpV!WLQ}%v}2p{C0FU%yNuTVjx9>BOkbVy#OR4Xi{!yS&N~l0N}N3Po%Ygy zj|`8j`^uA%n9JF3vGz{H;qUD0PdrIaDwvRz+ohYI+g1HcIxdo7Bwj&t>!Z zkIrrmc{(+d;bXk*!x!b76c3oc=VLTXdA;&bLWA6th7gBW?k{=fE?fdo6|4;7S!yRvPGNk*=_CM7S6n8Q( zF6~|9(zE~cRE^Kp3}<#duuOJeoPH#|`0DP>%R)}u#F@D4ID6V~%|xeShrL%M`rUX% z&n<{doFXRwmuJth_!nzeX6JuUWMXDyU|ig|-k@=f0S_?DWrbN-4VW1j{~K_Fc>F9Z z%uGyQ3=BaWRTeD+4K@yKHbz!fc4kI6iwVwRhO;;fVnA91Swanhn-HPX7B8<-SFFl{Q)4Bgf|3+88>b}ymiW177xT^N-5A$tZ z(V)!w_^QrFbIDJ|3toKuxym?Zv7ep&V%aZ=7xolx3BDRUW8IG0x`ig;FSgycXo}c< z_PCaN=*`=jdbcd}Cx^%E7Wpz)q&#yj*Se~mI~H6`)^;}k^?Om$C($pg+az9!VNIR9;mak{rtQ*iuRLWde)ll&Ot?a|u1+h<%)ZNoUx#X2e*)P|%SDqbA H&xrv5aV1Ty literal 0 HcmV?d00001 diff --git a/cert/old/cert.pem b/cert/old/cert.pem new file mode 100644 index 0000000..3aa2fa8 --- /dev/null +++ b/cert/old/cert.pem @@ -0,0 +1,20 @@ +-----BEGIN CERTIFICATE----- +MIIDWzCCAkOgAwIBAgIURu8OfAXOa5Hi1BdJO2SxEgrItuMwDQYJKoZIhvcNAQEL +BQAwPTELMAkGA1UEBhMCVVMxCzAJBgNVBAgMAk1PMSEwHwYDVQQKDBhJbnRlcm5l +dCBXaWRnaXRzIFB0eSBMdGQwHhcNMjIwMjI1MTcwODUzWhcNMjMwMjI1MTcwODUz +WjA9MQswCQYDVQQGEwJVUzELMAkGA1UECAwCTU8xITAfBgNVBAoMGEludGVybmV0 +IFdpZGdpdHMgUHR5IEx0ZDCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEB +ANBWoQWSX8iyRuuMzN78ALkVLoEDGhQivpAj18n5VT4WNhpT3z7Gj2B2w6w3vsKv +XN28qILNBUcApzHMCawk4XyGgkTrFQzs2jTm5DKuU6dhn7lioMNzDgRVGieBuA0N +La3qa0gwem+fhJoT0Dm4tDeEoFEJeura6y0u/XRLm+uKSiLyo0tX12OYjgbbWh8Q +32aE6p0QqcHdFYRnUs5iy/SLkmYoMqNBrQWGAmjkYbHhwc2LhwvWEhv6HACE8Fk7 +QkAScf8V2CX/xpgqjJWgAhTp5zE/YKWQc4RH0hF2wMmVnMEDB7vmRPSuuRBlo+7y +DZTMPjg5KZ3jAwfzbQOLew8CAwEAAaNTMFEwHQYDVR0OBBYEFM582p8EGMRs3IVj +Q7pq20cNc+FWMB8GA1UdIwQYMBaAFM582p8EGMRs3IVjQ7pq20cNc+FWMA8GA1Ud +EwEB/wQFMAMBAf8wDQYJKoZIhvcNAQELBQADggEBAA2d+WnGBysGoZMOkLt4hkb+ +UNp6oFcGNa/kd06UuEpFinsa82JPsAZWSNDNLqzTfTaUWFXCQkIGk2k/57NXOjXZ +3PhMJfjeR9jH3XRswxK9Dp8KaVyf1GTMbI6K+IKEULK/w2sOCAHEHVntIEPo5tCo +P4NAEmc0woPmm4NTqHU98zRR8Mqxu+112tOg3u+f6fr1YCI4o2jJeaDRdgivFYSr +V68YHq3GthzHxXLqynZBTReX8vF6fTzc7jaB79UFkgIuBwPscVYubk3PPJI0TQ38 +rR7nHmC6yB60Zsg+1TuCG5czS/TZuJUMoqj3hjTXVxPTaLgnga7vBBa+Gw21OYQ= +-----END CERTIFICATE----- diff --git a/cert/old/chromeExported-2.cer b/cert/old/chromeExported-2.cer new file mode 100644 index 0000000000000000000000000000000000000000..591ce22c2db0bfe338affa8b2f157725443d436e GIT binary patch literal 863 zcmXqLVvaUwVsc)<%*4pVB;xj-uZHzp_QXe5#67K3HVSc_*!I|fmyJ`a&7|jP#2IeM4eg=akMlPl%Mn;AU zVGCI&#h=*Z_PXcHy*~^)MfDn)r9_nWO;Emm@@J@>n3+`YeY<1*31x@ZnD0BZKIZP8 z6-{SZ-5Hh}p5a`h^020@$>p^u&zoB&&z=~q3tpZ$e`nHy!^M0op;GFNJ9v3@*S^a3 zFsRC(-!e=1g5{1a<}C{XIjdgXdabMXx5Rt)>n<;)Pm8_7uP4vwW4j$CFK|Dt<<(q) zl?U&NwxkE0OFI3fds3Q)(PGE7tZhsgPZBpiJb1Rdo%@=Q^e-8PmJgBEP7Xqa|3z=8 z{y#QDt7qy0CXtuV4eb+_PAG11za&_8;N;Xf2btM-KXduAZl^%%;&-2Tr<}2~u+*IU zn3?@^E^~J^KNB+}1LNXggFpjWU`)yKv52vVoU6GtpGD$G&Yjj|=UrL1-Fb^2hJhne zR+&Y@K&%0~0)CKwVMfOPEUX61Kngk7f$0Po?2HV&bAM(YW7lR|IGJz4?us_Ie*w3u z7KF2zu76VQH)V&HYge_@=Oq6PY+)W3&g!kXTx&KZBJ_}x6WioW`{$d(txRv;`QfAb zbkXw6f zo6PZ}MXyekIr@rE|Man{*5=MTv&Q#VStl{+u`|CZ4AaZ=J#RC~#FzKaTDj+P3A;|n uZAm*}ch$N{db+Xqmzz7L@+?~Mz0Kr$xbWqS9qNti-m{49ljhxO*#ZD&NKj+| literal 0 HcmV?d00001 diff --git a/cert/old/chromeExported-3.cer b/cert/old/chromeExported-3.cer new file mode 100644 index 0000000000000000000000000000000000000000..591ce22c2db0bfe338affa8b2f157725443d436e GIT binary patch literal 863 zcmXqLVvaUwVsc)<%*4pVB;xj-uZHzp_QXe5#67K3HVSc_*!I|fmyJ`a&7|jP#2IeM4eg=akMlPl%Mn;AU zVGCI&#h=*Z_PXcHy*~^)MfDn)r9_nWO;Emm@@J@>n3+`YeY<1*31x@ZnD0BZKIZP8 z6-{SZ-5Hh}p5a`h^020@$>p^u&zoB&&z=~q3tpZ$e`nHy!^M0op;GFNJ9v3@*S^a3 zFsRC(-!e=1g5{1a<}C{XIjdgXdabMXx5Rt)>n<;)Pm8_7uP4vwW4j$CFK|Dt<<(q) zl?U&NwxkE0OFI3fds3Q)(PGE7tZhsgPZBpiJb1Rdo%@=Q^e-8PmJgBEP7Xqa|3z=8 z{y#QDt7qy0CXtuV4eb+_PAG11za&_8;N;Xf2btM-KXduAZl^%%;&-2Tr<}2~u+*IU zn3?@^E^~J^KNB+}1LNXggFpjWU`)yKv52vVoU6GtpGD$G&Yjj|=UrL1-Fb^2hJhne zR+&Y@K&%0~0)CKwVMfOPEUX61Kngk7f$0Po?2HV&bAM(YW7lR|IGJz4?us_Ie*w3u z7KF2zu76VQH)V&HYge_@=Oq6PY+)W3&g!kXTx&KZBJ_}x6WioW`{$d(txRv;`QfAb zbkXw6f zo6PZ}MXyekIr@rE|Man{*5=MTv&Q#VStl{+u`|CZ4AaZ=J#RC~#FzKaTDj+P3A;|n uZAm*}ch$N{db+Xqmzz7L@+?~Mz0Kr$xbWqS9qNti-m{49ljhxO*#ZD&NKj+| literal 0 HcmV?d00001 diff --git a/cert/old/chromeExported.cer b/cert/old/chromeExported.cer new file mode 100644 index 0000000000000000000000000000000000000000..e5856394afe0fb4573da0809927bb7e3cc920056 GIT binary patch literal 863 zcmXqLVvaUwVsc)<%*4pV#94jq>EfBi`_3{N@Un4gwRyCC=VfH%W@RuCF%&WoU}Fwt zVHW1h$xlwq$;dA*F_07IH8L_VHZU|YG%z$Zih^*B4UG)ITpYTZ7?qHXXJlnyZerwT zFlb`rVrpV!WLQ}%v}2p{C0FU%yNuTVjx9>BOkbVy#OR4Xi{!yS&N~l0N}N3Po%Ygy zj|`8j`^uA%n9JF3vGz{H;qUD0PdrIaDwvRz+ohYI+g1HcIxdo7Bwj&t>!Z zkIrrmc{(+d;bXk*!x!b76c3oc=VLTXdA;&bLWA6th7gBW?k{=fE?fdo6|4;7S!yRvPGNk*=_CM7S6n8Q( zF6~|9(zE~cRE^Kp3}<#duuOJeoPH#|`0DP>%R)}u#F@D4ID6V~%|xeShrL%M`rUX% z&n<{doFXRwmuJth_!nzeX6JuUWMXDyU|ig|-k@=f0S_?DWrbN-4VW1j{~K_Fc>F9Z z%uGyQ3=BaWRTeD+4K@yKHbz!fc4kI6iwVwRhO;;fVnA91Swanhn-HPX7B8<-SFFl{Q)4Bgf|3+88>b}ymiW177xT^N-5A$tZ z(V)!w_^QrFbIDJ|3toKuxym?Zv7ep&V%aZ=7xolx3BDRUW8IG0x`ig;FSgycXo}c< z_PCaN=*`=jdbcd}Cx^%E7Wpz)q&#yj*Se~mI~H6`)^;}k^?Om$C($pg+az9!VNIR9;mak{rtQ*iuRLWde)ll&Ot?a|u1+h<%)ZNoUx#X2e*)P|%SDqbA H&xrv5aV1Ty literal 0 HcmV?d00001 diff --git a/cert/old/key.pem b/cert/old/key.pem new file mode 100644 index 0000000..27fbe1e --- /dev/null +++ b/cert/old/key.pem @@ -0,0 +1,27 @@ +-----BEGIN RSA PRIVATE KEY----- +MIIEogIBAAKCAQEA0FahBZJfyLJG64zM3vwAuRUugQMaFCK+kCPXyflVPhY2GlPf +PsaPYHbDrDe+wq9c3byogs0FRwCnMcwJrCThfIaCROsVDOzaNObkMq5Tp2GfuWKg +w3MOBFUaJ4G4DQ0treprSDB6b5+EmhPQObi0N4SgUQl66trrLS79dEub64pKIvKj +S1fXY5iOBttaHxDfZoTqnRCpwd0VhGdSzmLL9IuSZigyo0GtBYYCaORhseHBzYuH +C9YSG/ocAITwWTtCQBJx/xXYJf/GmCqMlaACFOnnMT9gpZBzhEfSEXbAyZWcwQMH +u+ZE9K65EGWj7vINlMw+ODkpneMDB/NtA4t7DwIDAQABAoIBAAYoWVAB2ITlCAWU +PsXkat0NjDdR8SZhNIKsHIeir+tK2sSCcBm54qj2OahQaXn1lugS2GQtTRehJE/r +eOm2mVeF3jnNPO0J3xUrMdlxn5VV5FOlX50HPIXSQhii097G4e+++vbCQAwmidPH +/CKInAL8D4T1o8VnPQYz2lfimDQo7361mCytz0VEoPqAtXEHiyxq3ID9YZxFUGg1 +XFo63IhFp7fJU+mjmDLcSmCO+IAz7avdPWRKr2Fz7tI0+AipaaZSi8M+ej0IqHZs +nRzhxwVz60aVmVgdZsOfemqBR9+b9TTLSxyN4j7cjPv69w1g2pUki3rtFAuyPs/x +iaifp4kCgYEA+062Qic13JvI1werJqdE/UAIbEDOt5KGHJVpLnhScwqer7q3RmCs +xKZND4WJ64WfW9z+vkinswPfPgruNok/x8qVf673PGDEXimK2/jkRy0CKzLzdcHr +3tgRRTcu5Ejr1u/VIV+9axcmmODlHUYAUbRDssqf80g6jy+e7ra2/YMCgYEA1DqE +sCN5WJsnTnA6pjhcLcC3UQxQZ5d+iCEc/nWfYRcZsKdWh7A1xY2MDEiLWqj28x4G +mtThfu1f879t/N4yasQ7QA16RBQlquY4qfBGYcwoqY5e9V4xFg6kgTl6bgdcFc7/ +p7wcUm6KqD5PnxCSlOOwPlCUuPELHHXSf1YKQoUCgYBr/GGiwXiKiEJf68KmhF/H +trkn0x1AkmygYa9lsXw0RM71UfUo/6edhJw+XDJsiul0Lt0j5NJywOovncDInGdU +sX9V81f3kNkwYQdzCFsHHpb8+xLUefShuBSLum+i1pbIsBvUEHCzUKpcLN8mmgrP +EPe6HwlmH5ZSKrNPfiHZgwKBgGCRxCDV83hzGR6jCLzr9l3HTGLvxIJut9+/mY7b +/MrUFReB/Wi+sKkU8H4CYI6/Rad4qS644Wa9IqUqHSUsAir84a0StOjXdhBes7f4 +Ij6MBJCqvODPnGxZ+1blzaTVanxt9Xzgps6HiEZoHBjYFKr1NBQW3KWO4SxxHHhe +sUp1AoGADiduIMYTCQK9tTwzC+wi8L9ZzRzg8Bv9WoJwlOJ9UzebxZuoSE079WZy +R83WGVMfrGoRvt5o5zPPjXE1OVb1ZH/zqVxMqtXyNKpkaNA3zg3B+yd0t6j7r6KF +3rmR4RZQ4tvG4zSvoB6wRnQCMu5yT4Hy5UCO2okxUf/9ipkBxrI= +-----END RSA PRIVATE KEY----- diff --git a/cert/old/keytmp.pem b/cert/old/keytmp.pem new file mode 100644 index 0000000..eff2113 --- /dev/null +++ b/cert/old/keytmp.pem @@ -0,0 +1,30 @@ +-----BEGIN ENCRYPTED PRIVATE KEY----- +MIIFHDBOBgkqhkiG9w0BBQ0wQTApBgkqhkiG9w0BBQwwHAQIe3/Wm4HexdMCAggA +MAwGCCqGSIb3DQIJBQAwFAYIKoZIhvcNAwcECHFVtycBEqVCBIIEyLgm/RkRojyc +D/pETZ9wG1BLaZC3ej6Gf1hYz3YN2ZAqXnRlNJcgniFw55QrxJxo1v9xQHacl8XR +BHTHozqegvbZBGV2ejrvHC5Ej0iFcoGez2Xo7UF+C7+qwPc1d6JjYTyev0hdfPN3 +jfqbpIhVG2iErG+VJeJm/HHDd6u3ikpxevfExwscDIC/LP9jMkvJQEvoSZIOjt1u +IU+i4OZa/ex+7rVtye+g+kXIzAF+hX6xf98Ra7grjc7MltRnvELXvFTgh42q5BeS +IWYgZDTDavsplMFp9khSBaweK1Lg7nNvRJ+3xhJmqQK9IBuO24SCPSP7eDlmdHds +KuOSa2wLHLl0Wj0ogd8TBV+Lu9RJplVrTuHumBVUrCgin0pgMT5pvrGNZBaF7lyf +oSMTTCizQglsXU/PaoS7MfAtTVM6QqPGKfdFS/QhdfWgeb6RXu1Uhc0e4FxrMBYF +nJPw+8InXRygXjLO9oGPmW2w9KycuxIxtsT7hFWEUqRS5zjXKE643DEgrRFuBaTT +08Tsd5W1H6Na9Madj48OHJ/lp4O27HsJn5WebbkQQhS2g+OTObgYX7FvLs8DFyQ9 +6OfIE9jMmTdxwI1EuIyDsTlRhGcF7K8gs7Zpt8F0VBE3U1zQNxdtwS0sR5azZa1+ +mU1Twp5TfYW10jvWGES4VPNiwTIcPLhIBr8t+x4wqejBvpW5Ya4M2uEBSi30TKSk +YGAx1++Xmm8zKXnr42S7Xk8FfmXNmOOj0hHerdqw7vMwnQt/4n5xNafsvAL3Yd3e +6X1n6wiRF/KtkBi9CtQc+yL8+QZSAr0S1V6rfwi3arZG5QxAi3bAtPghll+XeICl +W/UDus9QCWKU6MjStXH7X7hAIHOJrr7+9WxAHFG1KNVg18Xb/D5dKP6+6GDptXHG +sH/K43cqJu50pwTxk9/wyfmUOrxYuSauwX42hIahppnxLKh3MPZ2PsVLegT/KDhR +KX+QBKup0+0oqGoATe91GWIQZXFcPCYQabQegL+p9fFjDiW3kCbJAa5wnxxI4dCk +W044AsQdg+80qZckJmJ6+LwmPsKzxwgwOoCrVp8e4XIsl9IGKkOBRj4BdN1OqjJa +dH/ogI1rIst8lbfiEbk6jilFr/gsDDQwuZNU9QbHWTj+/HjPEIEL4QCQDPCSOyTP +5+FWqxrn04k7ThqMegPzwXPMvPtA6BmCZ4Vl4eKS1S0u9WfitDOYyng+H42/u3Ji +73GUVEmZ73RT4jPPDjS02y/Owvx5FLa9bs0rcd9fBVJay+dPovHmrQknj4lcziC4 +ly9AzaQByEHIoViiJuagU1MjxA9EJUa0FJ12g1lOr0HfeypWzCsleHQCPkGTyJQX +FyrQq8q0Jf38L5h2KEtF6Po1bUL+F7S6cwpkFkYGgsAYM+zpMVT2kXA0pP75Ca+g +w+HKRhXgbMmqKDuJTbs4UHgeofqrb+T3rXyk4gfgjNXmNfzwaoENKDVHiv7yp8Og +6qs2vdphNaxSf4iKd/ybaCAzCJlWnWEGUqyhYfKYaFJAmQx8fhw7zGRD2I8lKGz+ +YW7hGnmLUB68M7i1QUHHDBm8hxLSaSJPyOIHnKhX06DTuHyIsPmfi8i3VAkzkiaV +t4drORAApx1BSzNTI0xTWg== +-----END ENCRYPTED PRIVATE KEY----- diff --git a/cert/server.cert b/cert/server.cert new file mode 100644 index 0000000..9a7c5e7 --- /dev/null +++ b/cert/server.cert @@ -0,0 +1,22 @@ +-----BEGIN CERTIFICATE----- +MIIDpzCCAo+gAwIBAgIUVgja2cJarOptGTXo5bwdUx2WGLswDQYJKoZIhvcNAQEL +BQAwYzELMAkGA1UEBhMCVVMxCzAJBgNVBAgMAk1PMQswCQYDVQQHDAJLQzESMBAG +A1UECgwJbG9jYWxob3N0MRIwEAYDVQQLDAlsb2NhbGhvc3QxEjAQBgNVBAMMCWxv +Y2FsaG9zdDAeFw0yMjAzMjkxNzU5MjVaFw0yMjA0MjgxNzU5MjVaMGMxCzAJBgNV +BAYTAlVTMQswCQYDVQQIDAJNTzELMAkGA1UEBwwCS0MxEjAQBgNVBAoMCWxvY2Fs +aG9zdDESMBAGA1UECwwJbG9jYWxob3N0MRIwEAYDVQQDDAlsb2NhbGhvc3QwggEi +MA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQDpc68E8r32hLbMPUawJZwTaQn2 +RoGMHoOSzfHqOXcjF0D0QIOgeO2uMYJ6nMh4AfSKjRkOK2oJO4fknp72ArrK+S7x +KVaMg6T0FaVsffFYJO8/aujUBhnEyF+dAtyveABfMrJwU+/uTuwKJAJz7wvOl+3/ +7Idop49PAWo64HYlJkl3iQUuVmBL2kpyrHLNnTIT8HBKsLJVnO2IzozQnTrI0CnF +PFgdqjdPyTurJYhIYRNsSL1ZpTBdWoeZPCWIjYGr9X4Om4aaAkD3bWmaPNYwIaja +GwBaCfKTnGw9+EWDXrQxZfpOqVJp/19ZFTsoMGIJo0LtPRgmOwAFkjSfXwArAgMB +AAGjUzBRMB0GA1UdDgQWBBRFm+iZPyUN8ZMfGfnWO3iBbas15DAfBgNVHSMEGDAW +gBRFm+iZPyUN8ZMfGfnWO3iBbas15DAPBgNVHRMBAf8EBTADAQH/MA0GCSqGSIb3 +DQEBCwUAA4IBAQDacoUJOm0Y8vm8hwqgqres3kYD2sQAYMsU146hfUeNfcRXIYYK +TLFiu6/bEc+85riZerZQCDFzPcVGJT4NPTkQkofYhkPG8UpDdEH/o8kZn5icDYoX +KcB/V8mOtSi+zN3Hol88XmfMkFDxeNYkUvI2vfycAE8PR21pKcnR6UROZBkMuCMC +p/wJY6cmaPNKwZGaGLWqlNcOFV1xEYQnFYm3IYsBjnQslhyU4Wpnd6MiZQ3uoerk +9fl4IGsu3BAkTkdAaibsnmUp4/SorvGoYi+hGJ/NvPherMjsINVP5MNH+uUqf2QT +f6nor/JgODkq1BXSAYJxY4xtD6hYNm/qWh6w +-----END CERTIFICATE----- diff --git a/cert/server.key b/cert/server.key new file mode 100644 index 0000000..e0d6aae --- /dev/null +++ b/cert/server.key @@ -0,0 +1,28 @@ +-----BEGIN PRIVATE KEY----- +MIIEwAIBADANBgkqhkiG9w0BAQEFAASCBKowggSmAgEAAoIBAQDpc68E8r32hLbM +PUawJZwTaQn2RoGMHoOSzfHqOXcjF0D0QIOgeO2uMYJ6nMh4AfSKjRkOK2oJO4fk +np72ArrK+S7xKVaMg6T0FaVsffFYJO8/aujUBhnEyF+dAtyveABfMrJwU+/uTuwK +JAJz7wvOl+3/7Idop49PAWo64HYlJkl3iQUuVmBL2kpyrHLNnTIT8HBKsLJVnO2I +zozQnTrI0CnFPFgdqjdPyTurJYhIYRNsSL1ZpTBdWoeZPCWIjYGr9X4Om4aaAkD3 +bWmaPNYwIajaGwBaCfKTnGw9+EWDXrQxZfpOqVJp/19ZFTsoMGIJo0LtPRgmOwAF +kjSfXwArAgMBAAECggEBANlkzfXYqod3HNbitQHxc/8rUIiTLa4y+ClsOLv6GXSH +AgiyTyDPm94b4rqVZ6VBhNzE+jEUwqCoXCrMf5DuB85d75XJ/fvJ14Eo6yw1t9py +Qo0W3IwcxkBWq5sGAEYyhH4iMsKhl4ue2PW0hMg7Mg6Hsq0hMROG/c//rFH5lmuO +DXuTG+iaJXbQn+TT/i2aSESuXDdKFM9LfB4k4VS+OCKYxFT38fFEI/lzeABc2tsh +g48PGdVgZjfcjVLzziwyG0TL7XjPuqSe4rFTTea79LTbXp/ck50ivqKT4TpdD7Ck +7kPTFkrXxyg74V+brD0vpJpmu54sFU2/G0z4CDZIGOECgYEA+IOEMTIqBDFtPrEc +IbBZWodfKMaOJqRq1ifypcMsZeSXNS2zjg4isdonh0WXsZXMUq04T1yh2d1MPcjP +Glc16dfpsEzF/f96ujjCJ7RA+QjQQ3K8mVAfjLr9hRbrqCMVHLo5DQ+rw5Uw5C6o +6z8ZeexFxLsHKh341akKi0waKHECgYEA8HwDfOhtsCySbSW65+h2y77K4s+EYyPh +6V0fGrIDrUtGVkAfmkpMEpjU+qempklKt5/mFqkWkXbjGUD+vz413ZMObsXaEPKU +JZ+XGuD9D80vfxqZp7w3Fjhzh8A23jYICFv3joZ0qs5M5jV67nFCW0ffh4ehD6dZ +o5N/CUuMoFsCgYEAzJ8tl3xgkDdKZlZafXrA+AOC3QYwQa0bst4Ns2MzCWrg/g51 +S8Bj3OFtrroknzpilKjANshlFAhdIHpZ3Kx2XedEKb/tPqi/mtnlM9/9p5AUO5Ub +qXkJoUzONmma/ER2u8Kx+wkuOsp7CUdKGvlHttZO1B/TVGB9ZR/c6LluyGECgYEA +v9iPB8R8TMEiBwTEeGFQ8/U+8XXPDTAA9yQcvjUpDcQxVnlNPM7spSFbNqMsJRfv +DVH4QjeeE2meffUFxRch7aN1LhWUg1ShruoDp6O4/jQYIfPchJ137LgYIkHLA7Zi +7hhAA2lsBR8S5cvgR/v+jcdmoT4n1M8SiZYPECE/DGUCgYEAnh5lIWpDdw2vcnW4 +/lgb1I9oXRZcLIYha+WhC6PXHAUqdTAk+afefmjF1QEIgu2lYZQU28TZDcTn2OgN +PVPuKItJjoTz/c6npgLABkn6dDuRfnAfFV2tj6mPmqQ70A9B8B4ql3f3tbiQOQPC +ZXPCc/cVEOJnBGT7wtZTdhP6eV8= +-----END PRIVATE KEY----- diff --git a/components/common/randomString.js b/components/common/randomString.js new file mode 100644 index 0000000..55b262a --- /dev/null +++ b/components/common/randomString.js @@ -0,0 +1,14 @@ +let validCharacters = ['0','1','2','3','4','5','6','7','8','9','a','b','c','d','e','f','g','h','i','j','k','l','m','n','o','p','q','r','s','t','u','v','w','x','y','z'] + +genRandomString = (stringLength) => { + let newString = '' + for (let i = 0; i < stringLength; i++) { + $index = Math.floor(Math.random() * 35) + newString += validCharacters[$index] + } + return newString +} + +module.exports = { + genRandomString: genRandomString +} \ No newline at end of file diff --git a/components/common/sleep.js b/components/common/sleep.js new file mode 100644 index 0000000..7288db3 --- /dev/null +++ b/components/common/sleep.js @@ -0,0 +1,16 @@ +// // sleep function +// const sleep = (milliseconds) => { +// const date = Date.now() +// let currentDate = null +// do { +// currentDate = Date.now() +// } while (currentDate - date < milliseconds) +// } + +const sleep = (ms) => { + return new Promise(resolve => setTimeout(resolve, ms)) +} + +module.exports = { + sleep: sleep +} \ No newline at end of file diff --git a/components/common/wrtColor.js b/components/common/wrtColor.js new file mode 100644 index 0000000..be8be5c --- /dev/null +++ b/components/common/wrtColor.js @@ -0,0 +1,58 @@ +// Make console colors +// based on what I found here: +// https://www.kindacode.com/article/node-js-colorizing-console-log-output/ +// color chart found here: +// https://en.m.wikipedia.org/wiki/ANSI_escape_code#Colors + +// // red +// console.log('\x1b[31m%s\x1b[0m', 'I am red') +// // green +// console.log('\x1b[32m%s\x1b[0m', 'I am green') +// // yellow +// console.log('\x1b[33m%s\x1b[0m', 'I am yellow') +// // blue +// console.log('\x1b[34m%s\x1b[0m', 'I am blue') +// // magenta +// console.log('\x1b[35m%s\x1b[0m', 'I am magenta') +// // cyan +// console.log('\x1b[36m%s\x1b[0m', 'I am cyan') + +const wrtColorRed = (text) => { + console.log('\x1b[31m%s\x1b[0m', text) +} +const wrtColorGreen = (text) => { + console.log('\x1b[32m%s\x1b[0m', text) +} +const wrtColorYellow = (text) => { + console.log('\x1b[33m%s\x1b[0m', text) +} +const wrtColorBlue = (text) => { + console.log('\x1b[34m%s\x1b[0m', text) +} +const wrtColorMagenta = (text) => { + console.log('\x1b[35m%s\x1b[0m', text) +} +const wrtColorCyan = (text) => { + console.log('\x1b[36m%s\x1b[0m', text) +} +const wrtErr = (text) => { //Black on Red + console.log('\x1b[30;41m%s\x1b[0m', text) +} +const wrtWarn = (text) => { //Black on Red + console.log('\x1b[30;43m%s\x1b[0m', text) +} +const wrtTest = (text) => { // Green on Black + console.log('\x1b[92;100m%s\x1b[0m', text) +} + +module.exports = { + red: wrtColorRed, + green: wrtColorGreen, + yellow: wrtColorYellow, + blue: wrtColorBlue, + magenta: wrtColorMagenta, + cyan: wrtColorCyan, + err: wrtErr, + warn: wrtWarn, + test: wrtTest, +} \ No newline at end of file diff --git a/components/objectDefinitions.js b/components/objectDefinitions.js new file mode 100644 index 0000000..ca87651 --- /dev/null +++ b/components/objectDefinitions.js @@ -0,0 +1,29 @@ +// Object Definitions +class player { + constructor (userid, + username, + gameid, + lastActivity, + connected) { + this.userid = userid + this.username = username + this.gameid = gameid + this.lastActivity = lastActivity + this.connected = connected + } +} +class table { +} +class game { +} +// Object Initialization +let state = { + players:[], + tables:[], + games:[] +} + +module.exports = { + state: state, + players: state.players +} \ No newline at end of file diff --git a/components/players/playerCleanup.js b/components/players/playerCleanup.js new file mode 100644 index 0000000..d88c166 --- /dev/null +++ b/components/players/playerCleanup.js @@ -0,0 +1,32 @@ +const serverConfig = require('../../config/serverConfig.js') // Server Config +const wrtColor = require('../common/wrtColor') +// const { sleep } = require('./common/sleep') + +function filterExpired(player) { + // let diff = ((new Date())-player.lastActivity) + // console.log(`${player.username} diff: ${diff}`) + if (((new Date())-player.lastActivity) <= serverConfig.playerExpiration) { + return player + } else { + // console.log(`Expired Session: ${player.username}`) + wrtColor.magenta(`Expired Session: ${player.username}`) + } +} + +function playerCleanup (state) { + // setInterval(function() { //<--This works, but I'm concerned about Memory Leak. I need to learn more. + // console.log(state) + // state.players = state.players.filter(checkExpired) + // }, serverConfig.cleanupInterval) + + //setTimeout Version self-calling function + let timerId = setTimeout(function tick() { + // console.log(state) + state.players = state.players.filter(filterExpired) + timerId = setTimeout(tick, serverConfig.cleanupInterval) + }, serverConfig.cleanupInterval) +} + +module.exports = { + playerCleanup: playerCleanup +} diff --git a/components/players/playerMgmtFuncs.js b/components/players/playerMgmtFuncs.js new file mode 100644 index 0000000..5bd12b5 --- /dev/null +++ b/components/players/playerMgmtFuncs.js @@ -0,0 +1,66 @@ +// Sends Updates to socket when players change +const wrtColor = require('../common/wrtColor') + +function mapRemoveLastActivityProp (player) { + // Make this specific by props to remove + let {lastActivity, ...other} = player + // return { + // id: player.id, + // username: player.username, + // gameid: player.gameid + // } + return other +} + +function continuousEmitPlayers (state,io) { + let previousPlayersRelevant = [] + let timerId = setTimeout(function tick() { + // get players excluding the "lastActivity" because it is constantly updating + playersRelevant = state.players.map(mapRemoveLastActivityProp) + // console.log(playersRelevant) + // convert to string for comparison + if ((JSON.stringify(playersRelevant)) !== (JSON.stringify(previousPlayersRelevant))) { + // if changes happen, emit to all sockets + // wrtColor.blue('change to Players. Push to Sockets') + io.emit('playersUpdate', playersRelevant) + } + previousPlayersRelevant = playersRelevant + timerId = setTimeout(tick, 1000) + }, 1000) +} + +function socketGetPlayers (state,socket) { + playersRelevant = state.players.map(mapRemoveLastActivityProp) + socket.emit('playersUpdate', playersRelevant) +} + +function checkValidPlayerName(players,name) { + + let response = { + valid: true, + reason: "" + } + + // Returns True/False + // 15 character limit + // No special characters + // name not in use already + + +} + +function socketRegisterPlayer (io,state,data) { + wrtColor.warn('socketRegisterPlayer') + console.log(data) + //console.log(state.players) + io.emit('msg',{poop:"salad"}) + let checkResult = checkValidPlayerName(state.players, name) + console.log(checkResult) + // add them to state.players +} + +module.exports = { + continuousEmitPlayers: continuousEmitPlayers, + socketGetPlayers: socketGetPlayers, + socketRegisterPlayer: socketRegisterPlayer, +} \ No newline at end of file diff --git a/components/serverMgmt.js b/components/serverMgmt.js new file mode 100644 index 0000000..608e930 --- /dev/null +++ b/components/serverMgmt.js @@ -0,0 +1,52 @@ +// const serverConfig = require('../config/serverConfig.js') +const wrtColor = require('./common/wrtColor') + +//Load Object Definitions and Initialize them +require('./objectDefinitions') +let { state } = require('./objectDefinitions') + + +// TODO: TEST FUNCTIONS +require('./testFunctions') +const { addTestPlayers, addFluxPlayers } = require('./testFunctions') +wrtColor.test('adding Test Players') +addTestPlayers(state.players) +addFluxPlayers(state) + + + +//--- Socket Handling --- +const { socketGetPlayers } = require('./players/playerMgmtFuncs') +const { continuousEmitPlayers } = require ('./players/playerMgmtFuncs') +const { socketRegisterPlayer } = require ('./players/playerMgmtFuncs') +function socketHandler (io) { + io.on('connection', function (socket) { + //--- Connection --- + wrtColor.cyan(`socket connection established, id ${socket.id}`) + + //--- Register other socket event handler functions --- + socket.on('getPlayers', () => socketGetPlayers(state,socket)) + socket.on('registerPlayer', (data) => socketRegisterPlayer(io,state,data)) + //......// + + //--- Disconnection --- + socket.on('disconnect', (reason) => { wrtColor.yellow(`socket disconnected, ${socket.id}, ${reason}`)}) + }) + + //--- Continuous Processes for Sockets --- + continuousEmitPlayers(state,io) +} + + +//--- Continuous Server Side Processes --- +const { playerCleanup } = require('./players/playerCleanup') +const { stateMonitor } = require('./stateMonitor') +playerCleanup(state) +stateMonitor(state) + + + +module.exports = { + socketHandler: socketHandler +} + diff --git a/components/stateMonitor.js b/components/stateMonitor.js new file mode 100644 index 0000000..ef040ca --- /dev/null +++ b/components/stateMonitor.js @@ -0,0 +1,22 @@ +const serverConfig = require('../config/serverConfig.js') // Server Config +const wrtColor = require('./common/wrtColor') +const fs = require('fs') + + + +function stateMonitor (state) { + setInterval(function() { + // Convert to string + let stateString = JSON.stringify(state, null, 2) + fs.writeFile(serverConfig.stateJsonPath, stateString, (err) => { + if (err) { + throw err + } + // wrtColor.blue("state.json saved") + }) + }, serverConfig.stateMonitorRate) +} + +module.exports = { + stateMonitor: stateMonitor +} \ No newline at end of file diff --git a/components/testFunctions.js b/components/testFunctions.js new file mode 100644 index 0000000..7a45882 --- /dev/null +++ b/components/testFunctions.js @@ -0,0 +1,90 @@ +const { genRandomString } = require('./common/randomString') +const serverConfig = require('../config/serverConfig.js') +const wrtColor = require('./common/wrtColor') +const { state } = require('./objectDefinitions') + +let t = new Date() +let m15 = t.setSeconds(t.getSeconds()-15) +let p30 = t.setSeconds(t.getSeconds()+30) +let p45 = t.setSeconds(t.getSeconds()+45) +let p60 = t.setSeconds(t.getSeconds()+60) + + +function addTestPlayers(players) { + players.push({ + id: genRandomString(serverConfig.playerIdLength), + username: 'Charlie', + gameid: 222, + lastActivity: p30, + connected: false + }) + players.push({ + id: genRandomString(serverConfig.playerIdLength), + username: 'Dee', + gameid: 222, + lastActivity: p45, + connected: false + }) + players.push({ + id: genRandomString(serverConfig.playerIdLength), + username: 'Dennis', + gameid: 222, + lastActivity: p60, + connected: false + }) + players.push({ + id: genRandomString(serverConfig.playerIdLength), + username: 'Frank', + gameid: 222, + lastActivity: m15, + connected: true + }) + players.push({ + id: genRandomString(serverConfig.playerIdLength), + username: 'Mac', + gameid: 222, + lastActivity: p30, + connected: true + }) +} + +function addFluxPlayers (state) { + // Add and remove Pondy from players every 5 seconds + setInterval(function () { + // PONDY + // console.log(players) + let pondyFound = false + for (let i = 0; i < state.players.length; i++) { + if (state.players[i].username === 'Pondy') { + pondyFound = true + break + } + } + if (pondyFound) { + // wrtColor.yellow('Pondy Found, removing') + let pondyFilteredPlayers = state.players.filter( function (player) { + if (player.username !== 'Pondy') { + return player + } + }) + // console.log(pondyFilteredPlayers) + state.players = pondyFilteredPlayers + } else { + // wrtColor.yellow('Pondy Not Found, adding') + let t = new Date() + let p30 = t.setSeconds(t.getSeconds()+30) + state.players.push({ + id: genRandomString(serverConfig.playerIdLength), + username: 'Pondy', + gameid: 222, + lastActivity: p30, + connected: true + }) + } + }, 5000) +} + +module.exports = { + addTestPlayers: addTestPlayers, + addFluxPlayers: addFluxPlayers +} \ No newline at end of file diff --git a/config/serverConfig.js b/config/serverConfig.js new file mode 100644 index 0000000..1e414fa --- /dev/null +++ b/config/serverConfig.js @@ -0,0 +1,18 @@ +module.exports = { + // Server + certKeyPath: './cert/server.key', //Called by server.js + certPath: './cert/server.cert', //Called by server.js + httpsPort: 9000, + frontEndUrl: 'https://localhost', // Vue running from https + //PlayerCleanup + cleanupInterval: 5000, // runs every 5 seconds + playerExpiration: 60000, //300000, // 5 minutes without activity before being removed + //State Monitor + stateJsonPath: './log/state.json', + stateMonitorRate: 1000, + //Player Settings + playersUpdateCheckRate: 500, // Rate between checks to send player updates to sockets + + playerNameMaxLength: 15, + playerIdLength: 6, +} \ No newline at end of file diff --git a/log/state.json b/log/state.json new file mode 100644 index 0000000..d314f22 --- /dev/null +++ b/log/state.json @@ -0,0 +1,5 @@ +{ + "players": [], + "tables": [], + "games": [] +} \ No newline at end of file diff --git a/package-lock.json b/package-lock.json new file mode 100644 index 0000000..b2bc35e --- /dev/null +++ b/package-lock.json @@ -0,0 +1,1681 @@ +{ + "name": "loveletter", + "version": "1.0.0", + "lockfileVersion": 2, + "requires": true, + "packages": { + "": { + "name": "loveletter", + "version": "1.0.0", + "license": "ISC", + "dependencies": { + "cors": "^2.8.5", + "express": "^4.17.3", + "socket.io": "^4.4.1", + "vue-router": "^4.0.13" + } + }, + "node_modules/@babel/parser": { + "version": "7.17.3", + "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.17.3.tgz", + "integrity": "sha512-7yJPvPV+ESz2IUTPbOL+YkIGyCqOyNIzdguKQuJGnH7bg1WTIifuM21YqokFt/THWh1AkCRn9IgoykTRCBVpzA==", + "peer": true, + "bin": { + "parser": "bin/babel-parser.js" + }, + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/@socket.io/base64-arraybuffer": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/@socket.io/base64-arraybuffer/-/base64-arraybuffer-1.0.2.tgz", + "integrity": "sha512-dOlCBKnDw4iShaIsH/bxujKTM18+2TOAsYz+KSc11Am38H4q5Xw8Bbz97ZYdrVNM+um3p7w86Bvvmcn9q+5+eQ==", + "engines": { + "node": ">= 0.6.0" + } + }, + "node_modules/@types/component-emitter": { + "version": "1.2.11", + "resolved": "https://registry.npmjs.org/@types/component-emitter/-/component-emitter-1.2.11.tgz", + "integrity": "sha512-SRXjM+tfsSlA9VuG8hGO2nft2p8zjXCK1VcC6N4NXbBbYbSia9kzCChYQajIjzIqOOOuh5Ock6MmV2oux4jDZQ==" + }, + "node_modules/@types/cookie": { + "version": "0.4.1", + "resolved": "https://registry.npmjs.org/@types/cookie/-/cookie-0.4.1.tgz", + "integrity": "sha512-XW/Aa8APYr6jSVVA1y/DEIZX0/GMKLEVekNG727R8cs56ahETkRAy/3DR7+fJyh7oUgGwNQaRfXCun0+KbWY7Q==" + }, + "node_modules/@types/cors": { + "version": "2.8.12", + "resolved": "https://registry.npmjs.org/@types/cors/-/cors-2.8.12.tgz", + "integrity": "sha512-vt+kDhq/M2ayberEtJcIN/hxXy1Pk+59g2FV/ZQceeaTyCtCucjL2Q7FXlFjtWn4n15KCr1NE2lNNFhp0lEThw==" + }, + "node_modules/@types/node": { + "version": "17.0.21", + "resolved": "https://registry.npmjs.org/@types/node/-/node-17.0.21.tgz", + "integrity": "sha512-DBZCJbhII3r90XbQxI8Y9IjjiiOGlZ0Hr32omXIZvwwZ7p4DMMXGrKXVyPfuoBOri9XNtL0UK69jYIBIsRX3QQ==" + }, + "node_modules/@vue/compiler-core": { + "version": "3.2.31", + "resolved": "https://registry.npmjs.org/@vue/compiler-core/-/compiler-core-3.2.31.tgz", + "integrity": "sha512-aKno00qoA4o+V/kR6i/pE+aP+esng5siNAVQ422TkBNM6qA4veXiZbSe8OTXHXquEi/f6Akc+nLfB4JGfe4/WQ==", + "peer": true, + "dependencies": { + "@babel/parser": "^7.16.4", + "@vue/shared": "3.2.31", + "estree-walker": "^2.0.2", + "source-map": "^0.6.1" + } + }, + "node_modules/@vue/compiler-dom": { + "version": "3.2.31", + "resolved": "https://registry.npmjs.org/@vue/compiler-dom/-/compiler-dom-3.2.31.tgz", + "integrity": "sha512-60zIlFfzIDf3u91cqfqy9KhCKIJgPeqxgveH2L+87RcGU/alT6BRrk5JtUso0OibH3O7NXuNOQ0cDc9beT0wrg==", + "peer": true, + "dependencies": { + "@vue/compiler-core": "3.2.31", + "@vue/shared": "3.2.31" + } + }, + "node_modules/@vue/compiler-sfc": { + "version": "3.2.31", + "resolved": "https://registry.npmjs.org/@vue/compiler-sfc/-/compiler-sfc-3.2.31.tgz", + "integrity": "sha512-748adc9msSPGzXgibHiO6T7RWgfnDcVQD+VVwYgSsyyY8Ans64tALHZANrKtOzvkwznV/F4H7OAod/jIlp/dkQ==", + "peer": true, + "dependencies": { + "@babel/parser": "^7.16.4", + "@vue/compiler-core": "3.2.31", + "@vue/compiler-dom": "3.2.31", + "@vue/compiler-ssr": "3.2.31", + "@vue/reactivity-transform": "3.2.31", + "@vue/shared": "3.2.31", + "estree-walker": "^2.0.2", + "magic-string": "^0.25.7", + "postcss": "^8.1.10", + "source-map": "^0.6.1" + } + }, + "node_modules/@vue/compiler-ssr": { + "version": "3.2.31", + "resolved": "https://registry.npmjs.org/@vue/compiler-ssr/-/compiler-ssr-3.2.31.tgz", + "integrity": "sha512-mjN0rqig+A8TVDnsGPYJM5dpbjlXeHUm2oZHZwGyMYiGT/F4fhJf/cXy8QpjnLQK4Y9Et4GWzHn9PS8AHUnSkw==", + "peer": true, + "dependencies": { + "@vue/compiler-dom": "3.2.31", + "@vue/shared": "3.2.31" + } + }, + "node_modules/@vue/devtools-api": { + "version": "6.0.12", + "resolved": "https://registry.npmjs.org/@vue/devtools-api/-/devtools-api-6.0.12.tgz", + "integrity": "sha512-iO/4FIezHKXhiDBdKySCvJVh8/mZPxHpiQrTy+PXVqJZgpTPTdHy4q8GXulaY+UKEagdkBb0onxNQZ0LNiqVhw==" + }, + "node_modules/@vue/reactivity": { + "version": "3.2.31", + "resolved": "https://registry.npmjs.org/@vue/reactivity/-/reactivity-3.2.31.tgz", + "integrity": "sha512-HVr0l211gbhpEKYr2hYe7hRsV91uIVGFYNHj73njbARVGHQvIojkImKMaZNDdoDZOIkMsBc9a1sMqR+WZwfSCw==", + "peer": true, + "dependencies": { + "@vue/shared": "3.2.31" + } + }, + "node_modules/@vue/reactivity-transform": { + "version": "3.2.31", + "resolved": "https://registry.npmjs.org/@vue/reactivity-transform/-/reactivity-transform-3.2.31.tgz", + "integrity": "sha512-uS4l4z/W7wXdI+Va5pgVxBJ345wyGFKvpPYtdSgvfJfX/x2Ymm6ophQlXXB6acqGHtXuBqNyyO3zVp9b1r0MOA==", + "peer": true, + "dependencies": { + "@babel/parser": "^7.16.4", + "@vue/compiler-core": "3.2.31", + "@vue/shared": "3.2.31", + "estree-walker": "^2.0.2", + "magic-string": "^0.25.7" + } + }, + "node_modules/@vue/runtime-core": { + "version": "3.2.31", + "resolved": "https://registry.npmjs.org/@vue/runtime-core/-/runtime-core-3.2.31.tgz", + "integrity": "sha512-Kcog5XmSY7VHFEMuk4+Gap8gUssYMZ2+w+cmGI6OpZWYOEIcbE0TPzzPHi+8XTzAgx1w/ZxDFcXhZeXN5eKWsA==", + "peer": true, + "dependencies": { + "@vue/reactivity": "3.2.31", + "@vue/shared": "3.2.31" + } + }, + "node_modules/@vue/runtime-dom": { + "version": "3.2.31", + "resolved": "https://registry.npmjs.org/@vue/runtime-dom/-/runtime-dom-3.2.31.tgz", + "integrity": "sha512-N+o0sICVLScUjfLG7u9u5XCjvmsexAiPt17GNnaWHJUfsKed5e85/A3SWgKxzlxx2SW/Hw7RQxzxbXez9PtY3g==", + "peer": true, + "dependencies": { + "@vue/runtime-core": "3.2.31", + "@vue/shared": "3.2.31", + "csstype": "^2.6.8" + } + }, + "node_modules/@vue/server-renderer": { + "version": "3.2.31", + "resolved": "https://registry.npmjs.org/@vue/server-renderer/-/server-renderer-3.2.31.tgz", + "integrity": "sha512-8CN3Zj2HyR2LQQBHZ61HexF5NReqngLT3oahyiVRfSSvak+oAvVmu8iNLSu6XR77Ili2AOpnAt1y8ywjjqtmkg==", + "peer": true, + "dependencies": { + "@vue/compiler-ssr": "3.2.31", + "@vue/shared": "3.2.31" + }, + "peerDependencies": { + "vue": "3.2.31" + } + }, + "node_modules/@vue/shared": { + "version": "3.2.31", + "resolved": "https://registry.npmjs.org/@vue/shared/-/shared-3.2.31.tgz", + "integrity": "sha512-ymN2pj6zEjiKJZbrf98UM2pfDd6F2H7ksKw7NDt/ZZ1fh5Ei39X5tABugtT03ZRlWd9imccoK0hE8hpjpU7irQ==", + "peer": true + }, + "node_modules/accepts": { + "version": "1.3.8", + "resolved": "https://registry.npmjs.org/accepts/-/accepts-1.3.8.tgz", + "integrity": "sha512-PYAthTa2m2VKxuvSD3DPC/Gy+U+sOA1LAuT8mkmRuvw+NACSaeXEQ+NHcVF7rONl6qcaxV3Uuemwawk+7+SJLw==", + "dependencies": { + "mime-types": "~2.1.34", + "negotiator": "0.6.3" + }, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/array-flatten": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/array-flatten/-/array-flatten-1.1.1.tgz", + "integrity": "sha1-ml9pkFGx5wczKPKgCJaLZOopVdI=" + }, + "node_modules/base64id": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/base64id/-/base64id-2.0.0.tgz", + "integrity": "sha512-lGe34o6EHj9y3Kts9R4ZYs/Gr+6N7MCaMlIFA3F1R2O5/m7K06AxfSeO5530PEERE6/WyEg3lsuyw4GHlPZHog==", + "engines": { + "node": "^4.5.0 || >= 5.9" + } + }, + "node_modules/body-parser": { + "version": "1.19.2", + "resolved": "https://registry.npmjs.org/body-parser/-/body-parser-1.19.2.tgz", + "integrity": "sha512-SAAwOxgoCKMGs9uUAUFHygfLAyaniaoun6I8mFY9pRAJL9+Kec34aU+oIjDhTycub1jozEfEwx1W1IuOYxVSFw==", + "dependencies": { + "bytes": "3.1.2", + "content-type": "~1.0.4", + "debug": "2.6.9", + "depd": "~1.1.2", + "http-errors": "1.8.1", + "iconv-lite": "0.4.24", + "on-finished": "~2.3.0", + "qs": "6.9.7", + "raw-body": "2.4.3", + "type-is": "~1.6.18" + }, + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/bytes": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/bytes/-/bytes-3.1.2.tgz", + "integrity": "sha512-/Nf7TyzTx6S3yRJObOAV7956r8cr2+Oj8AC5dt8wSP3BQAoeX58NoHyCU8P8zGkNXStjTSi6fzO6F0pBdcYbEg==", + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/component-emitter": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/component-emitter/-/component-emitter-1.3.0.tgz", + "integrity": "sha512-Rd3se6QB+sO1TwqZjscQrurpEPIfO0/yYnSin6Q/rD3mOutHvUrCAhJub3r90uNb+SESBuE0QYoB90YdfatsRg==" + }, + "node_modules/content-disposition": { + "version": "0.5.4", + "resolved": "https://registry.npmjs.org/content-disposition/-/content-disposition-0.5.4.tgz", + "integrity": "sha512-FveZTNuGw04cxlAiWbzi6zTAL/lhehaWbTtgluJh4/E95DqMwTmha3KZN1aAWA8cFIhHzMZUvLevkw5Rqk+tSQ==", + "dependencies": { + "safe-buffer": "5.2.1" + }, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/content-type": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/content-type/-/content-type-1.0.4.tgz", + "integrity": "sha512-hIP3EEPs8tB9AT1L+NUqtwOAps4mk2Zob89MWXMHjHWg9milF/j4osnnQLXBCBFBk/tvIG/tUc9mOUJiPBhPXA==", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/cookie": { + "version": "0.4.2", + "resolved": "https://registry.npmjs.org/cookie/-/cookie-0.4.2.tgz", + "integrity": "sha512-aSWTXFzaKWkvHO1Ny/s+ePFpvKsPnjc551iI41v3ny/ow6tBG5Vd+FuqGNhh1LxOmVzOlGUriIlOaokOvhaStA==", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/cookie-signature": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/cookie-signature/-/cookie-signature-1.0.6.tgz", + "integrity": "sha1-4wOogrNCzD7oylE6eZmXNNqzriw=" + }, + "node_modules/cors": { + "version": "2.8.5", + "resolved": "https://registry.npmjs.org/cors/-/cors-2.8.5.tgz", + "integrity": "sha512-KIHbLJqu73RGr/hnbrO9uBeixNGuvSQjul/jdFvS/KFSIH1hWVd1ng7zOHx+YrEfInLG7q4n6GHQ9cDtxv/P6g==", + "dependencies": { + "object-assign": "^4", + "vary": "^1" + }, + "engines": { + "node": ">= 0.10" + } + }, + "node_modules/csstype": { + "version": "2.6.19", + "resolved": "https://registry.npmjs.org/csstype/-/csstype-2.6.19.tgz", + "integrity": "sha512-ZVxXaNy28/k3kJg0Fou5MiYpp88j7H9hLZp8PDC3jV0WFjfH5E9xHb56L0W59cPbKbcHXeP4qyT8PrHp8t6LcQ==", + "peer": true + }, + "node_modules/debug": { + "version": "2.6.9", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", + "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", + "dependencies": { + "ms": "2.0.0" + } + }, + "node_modules/depd": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/depd/-/depd-1.1.2.tgz", + "integrity": "sha1-m81S4UwJd2PnSbJ0xDRu0uVgtak=", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/destroy": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/destroy/-/destroy-1.0.4.tgz", + "integrity": "sha1-l4hXRCxEdJ5CBmE+N5RiBYJqvYA=" + }, + "node_modules/ee-first": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/ee-first/-/ee-first-1.1.1.tgz", + "integrity": "sha1-WQxhFWsK4vTwJVcyoViyZrxWsh0=" + }, + "node_modules/encodeurl": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/encodeurl/-/encodeurl-1.0.2.tgz", + "integrity": "sha1-rT/0yG7C0CkyL1oCw6mmBslbP1k=", + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/engine.io": { + "version": "6.1.3", + "resolved": "https://registry.npmjs.org/engine.io/-/engine.io-6.1.3.tgz", + "integrity": "sha512-rqs60YwkvWTLLnfazqgZqLa/aKo+9cueVfEi/dZ8PyGyaf8TLOxj++4QMIgeG3Gn0AhrWiFXvghsoY9L9h25GA==", + "dependencies": { + "@types/cookie": "^0.4.1", + "@types/cors": "^2.8.12", + "@types/node": ">=10.0.0", + "accepts": "~1.3.4", + "base64id": "2.0.0", + "cookie": "~0.4.1", + "cors": "~2.8.5", + "debug": "~4.3.1", + "engine.io-parser": "~5.0.3", + "ws": "~8.2.3" + }, + "engines": { + "node": ">=10.0.0" + } + }, + "node_modules/engine.io-parser": { + "version": "5.0.3", + "resolved": "https://registry.npmjs.org/engine.io-parser/-/engine.io-parser-5.0.3.tgz", + "integrity": "sha512-BtQxwF27XUNnSafQLvDi0dQ8s3i6VgzSoQMJacpIcGNrlUdfHSKbgm3jmjCVvQluGzqwujQMPAoMai3oYSTurg==", + "dependencies": { + "@socket.io/base64-arraybuffer": "~1.0.2" + }, + "engines": { + "node": ">=10.0.0" + } + }, + "node_modules/engine.io/node_modules/debug": { + "version": "4.3.3", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.3.tgz", + "integrity": "sha512-/zxw5+vh1Tfv+4Qn7a5nsbcJKPaSvCDhojn6FEl9vupwK2VCSDtEiEtqr8DFtzYFOdz63LBkxec7DYuc2jon6Q==", + "dependencies": { + "ms": "2.1.2" + }, + "engines": { + "node": ">=6.0" + }, + "peerDependenciesMeta": { + "supports-color": { + "optional": true + } + } + }, + "node_modules/engine.io/node_modules/ms": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", + "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==" + }, + "node_modules/escape-html": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/escape-html/-/escape-html-1.0.3.tgz", + "integrity": "sha1-Aljq5NPQwJdN4cFpGI7wBR0dGYg=" + }, + "node_modules/estree-walker": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/estree-walker/-/estree-walker-2.0.2.tgz", + "integrity": "sha512-Rfkk/Mp/DL7JVje3u18FxFujQlTNR2q6QfMSMB7AvCBx91NGj/ba3kCfza0f6dVDbw7YlRf/nDrn7pQrCCyQ/w==", + "peer": true + }, + "node_modules/etag": { + "version": "1.8.1", + "resolved": "https://registry.npmjs.org/etag/-/etag-1.8.1.tgz", + "integrity": "sha1-Qa4u62XvpiJorr/qg6x9eSmbCIc=", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/express": { + "version": "4.17.3", + "resolved": "https://registry.npmjs.org/express/-/express-4.17.3.tgz", + "integrity": "sha512-yuSQpz5I+Ch7gFrPCk4/c+dIBKlQUxtgwqzph132bsT6qhuzss6I8cLJQz7B3rFblzd6wtcI0ZbGltH/C4LjUg==", + "dependencies": { + "accepts": "~1.3.8", + "array-flatten": "1.1.1", + "body-parser": "1.19.2", + "content-disposition": "0.5.4", + "content-type": "~1.0.4", + "cookie": "0.4.2", + "cookie-signature": "1.0.6", + "debug": "2.6.9", + "depd": "~1.1.2", + "encodeurl": "~1.0.2", + "escape-html": "~1.0.3", + "etag": "~1.8.1", + "finalhandler": "~1.1.2", + "fresh": "0.5.2", + "merge-descriptors": "1.0.1", + "methods": "~1.1.2", + "on-finished": "~2.3.0", + "parseurl": "~1.3.3", + "path-to-regexp": "0.1.7", + "proxy-addr": "~2.0.7", + "qs": "6.9.7", + "range-parser": "~1.2.1", + "safe-buffer": "5.2.1", + "send": "0.17.2", + "serve-static": "1.14.2", + "setprototypeof": "1.2.0", + "statuses": "~1.5.0", + "type-is": "~1.6.18", + "utils-merge": "1.0.1", + "vary": "~1.1.2" + }, + "engines": { + "node": ">= 0.10.0" + } + }, + "node_modules/finalhandler": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/finalhandler/-/finalhandler-1.1.2.tgz", + "integrity": "sha512-aAWcW57uxVNrQZqFXjITpW3sIUQmHGG3qSb9mUah9MgMC4NeWhNOlNjXEYq3HjRAvL6arUviZGGJsBg6z0zsWA==", + "dependencies": { + "debug": "2.6.9", + "encodeurl": "~1.0.2", + "escape-html": "~1.0.3", + "on-finished": "~2.3.0", + "parseurl": "~1.3.3", + "statuses": "~1.5.0", + "unpipe": "~1.0.0" + }, + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/forwarded": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/forwarded/-/forwarded-0.2.0.tgz", + "integrity": "sha512-buRG0fpBtRHSTCOASe6hD258tEubFoRLb4ZNA6NxMVHNw2gOcwHo9wyablzMzOA5z9xA9L1KNjk/Nt6MT9aYow==", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/fresh": { + "version": "0.5.2", + "resolved": "https://registry.npmjs.org/fresh/-/fresh-0.5.2.tgz", + "integrity": "sha1-PYyt2Q2XZWn6g1qx+OSyOhBWBac=", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/http-errors": { + "version": "1.8.1", + "resolved": "https://registry.npmjs.org/http-errors/-/http-errors-1.8.1.tgz", + "integrity": "sha512-Kpk9Sm7NmI+RHhnj6OIWDI1d6fIoFAtFt9RLaTMRlg/8w49juAStsrBgp0Dp4OdxdVbRIeKhtCUvoi/RuAhO4g==", + "dependencies": { + "depd": "~1.1.2", + "inherits": "2.0.4", + "setprototypeof": "1.2.0", + "statuses": ">= 1.5.0 < 2", + "toidentifier": "1.0.1" + }, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/iconv-lite": { + "version": "0.4.24", + "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.4.24.tgz", + "integrity": "sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA==", + "dependencies": { + "safer-buffer": ">= 2.1.2 < 3" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/inherits": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz", + "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==" + }, + "node_modules/ipaddr.js": { + "version": "1.9.1", + "resolved": "https://registry.npmjs.org/ipaddr.js/-/ipaddr.js-1.9.1.tgz", + "integrity": "sha512-0KI/607xoxSToH7GjN1FfSbLoU0+btTicjsQSWQlh/hZykN8KpmMf7uYwPW3R+akZ6R/w18ZlXSHBYXiYUPO3g==", + "engines": { + "node": ">= 0.10" + } + }, + "node_modules/magic-string": { + "version": "0.25.7", + "resolved": "https://registry.npmjs.org/magic-string/-/magic-string-0.25.7.tgz", + "integrity": "sha512-4CrMT5DOHTDk4HYDlzmwu4FVCcIYI8gauveasrdCu2IKIFOJ3f0v/8MDGJCDL9oD2ppz/Av1b0Nj345H9M+XIA==", + "peer": true, + "dependencies": { + "sourcemap-codec": "^1.4.4" + } + }, + "node_modules/media-typer": { + "version": "0.3.0", + "resolved": "https://registry.npmjs.org/media-typer/-/media-typer-0.3.0.tgz", + "integrity": "sha1-hxDXrwqmJvj/+hzgAWhUUmMlV0g=", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/merge-descriptors": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/merge-descriptors/-/merge-descriptors-1.0.1.tgz", + "integrity": "sha1-sAqqVW3YtEVoFQ7J0blT8/kMu2E=" + }, + "node_modules/methods": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/methods/-/methods-1.1.2.tgz", + "integrity": "sha1-VSmk1nZUE07cxSZmVoNbD4Ua/O4=", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/mime": { + "version": "1.6.0", + "resolved": "https://registry.npmjs.org/mime/-/mime-1.6.0.tgz", + "integrity": "sha512-x0Vn8spI+wuJ1O6S7gnbaQg8Pxh4NNHb7KSINmEWKiPE4RKOplvijn+NkmYmmRgP68mc70j2EbeTFRsrswaQeg==", + "bin": { + "mime": "cli.js" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/mime-db": { + "version": "1.51.0", + "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.51.0.tgz", + "integrity": "sha512-5y8A56jg7XVQx2mbv1lu49NR4dokRnhZYTtL+KGfaa27uq4pSTXkwQkFJl4pkRMyNFz/EtYDSkiiEHx3F7UN6g==", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/mime-types": { + "version": "2.1.34", + "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.34.tgz", + "integrity": "sha512-6cP692WwGIs9XXdOO4++N+7qjqv0rqxxVvJ3VHPh/Sc9mVZcQP+ZGhkKiTvWMQRr2tbHkJP/Yn7Y0npb3ZBs4A==", + "dependencies": { + "mime-db": "1.51.0" + }, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/ms": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=" + }, + "node_modules/nanoid": { + "version": "3.3.1", + "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-3.3.1.tgz", + "integrity": "sha512-n6Vs/3KGyxPQd6uO0eH4Bv0ojGSUvuLlIHtC3Y0kEO23YRge8H9x1GCzLn28YX0H66pMkxuaeESFq4tKISKwdw==", + "peer": true, + "bin": { + "nanoid": "bin/nanoid.cjs" + }, + "engines": { + "node": "^10 || ^12 || ^13.7 || ^14 || >=15.0.1" + } + }, + "node_modules/negotiator": { + "version": "0.6.3", + "resolved": "https://registry.npmjs.org/negotiator/-/negotiator-0.6.3.tgz", + "integrity": "sha512-+EUsqGPLsM+j/zdChZjsnX51g4XrHFOIXwfnCVPGlQk/k5giakcKsuxCObBRu6DSm9opw/O6slWbJdghQM4bBg==", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/object-assign": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz", + "integrity": "sha1-IQmtx5ZYh8/AXLvUQsrIv7s2CGM=", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/on-finished": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/on-finished/-/on-finished-2.3.0.tgz", + "integrity": "sha1-IPEzZIGwg811M3mSoWlxqi2QaUc=", + "dependencies": { + "ee-first": "1.1.1" + }, + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/parseurl": { + "version": "1.3.3", + "resolved": "https://registry.npmjs.org/parseurl/-/parseurl-1.3.3.tgz", + "integrity": "sha512-CiyeOxFT/JZyN5m0z9PfXw4SCBJ6Sygz1Dpl0wqjlhDEGGBP1GnsUVEL0p63hoG1fcj3fHynXi9NYO4nWOL+qQ==", + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/path-to-regexp": { + "version": "0.1.7", + "resolved": "https://registry.npmjs.org/path-to-regexp/-/path-to-regexp-0.1.7.tgz", + "integrity": "sha1-32BBeABfUi8V60SQ5yR6G/qmf4w=" + }, + "node_modules/picocolors": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-1.0.0.tgz", + "integrity": "sha512-1fygroTLlHu66zi26VoTDv8yRgm0Fccecssto+MhsZ0D/DGW2sm8E8AjW7NU5VVTRt5GxbeZ5qBuJr+HyLYkjQ==", + "peer": true + }, + "node_modules/postcss": { + "version": "8.4.7", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.4.7.tgz", + "integrity": "sha512-L9Ye3r6hkkCeOETQX6iOaWZgjp3LL6Lpqm6EtgbKrgqGGteRMNb9vzBfRL96YOSu8o7x3MfIH9Mo5cPJFGrW6A==", + "peer": true, + "dependencies": { + "nanoid": "^3.3.1", + "picocolors": "^1.0.0", + "source-map-js": "^1.0.2" + }, + "engines": { + "node": "^10 || ^12 || >=14" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/postcss/" + } + }, + "node_modules/proxy-addr": { + "version": "2.0.7", + "resolved": "https://registry.npmjs.org/proxy-addr/-/proxy-addr-2.0.7.tgz", + "integrity": "sha512-llQsMLSUDUPT44jdrU/O37qlnifitDP+ZwrmmZcoSKyLKvtZxpyV0n2/bD/N4tBAAZ/gJEdZU7KMraoK1+XYAg==", + "dependencies": { + "forwarded": "0.2.0", + "ipaddr.js": "1.9.1" + }, + "engines": { + "node": ">= 0.10" + } + }, + "node_modules/qs": { + "version": "6.9.7", + "resolved": "https://registry.npmjs.org/qs/-/qs-6.9.7.tgz", + "integrity": "sha512-IhMFgUmuNpyRfxA90umL7ByLlgRXu6tIfKPpF5TmcfRLlLCckfP/g3IQmju6jjpu+Hh8rA+2p6A27ZSPOOHdKw==", + "engines": { + "node": ">=0.6" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/range-parser": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/range-parser/-/range-parser-1.2.1.tgz", + "integrity": "sha512-Hrgsx+orqoygnmhFbKaHE6c296J+HTAQXoxEF6gNupROmmGJRoyzfG3ccAveqCBrwr/2yxQ5BVd/GTl5agOwSg==", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/raw-body": { + "version": "2.4.3", + "resolved": "https://registry.npmjs.org/raw-body/-/raw-body-2.4.3.tgz", + "integrity": "sha512-UlTNLIcu0uzb4D2f4WltY6cVjLi+/jEN4lgEUj3E04tpMDpUlkBo/eSn6zou9hum2VMNpCCUone0O0WeJim07g==", + "dependencies": { + "bytes": "3.1.2", + "http-errors": "1.8.1", + "iconv-lite": "0.4.24", + "unpipe": "1.0.0" + }, + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/safe-buffer": { + "version": "5.2.1", + "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.1.tgz", + "integrity": "sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ] + }, + "node_modules/safer-buffer": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/safer-buffer/-/safer-buffer-2.1.2.tgz", + "integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==" + }, + "node_modules/send": { + "version": "0.17.2", + "resolved": "https://registry.npmjs.org/send/-/send-0.17.2.tgz", + "integrity": "sha512-UJYB6wFSJE3G00nEivR5rgWp8c2xXvJ3OPWPhmuteU0IKj8nKbG3DrjiOmLwpnHGYWAVwA69zmTm++YG0Hmwww==", + "dependencies": { + "debug": "2.6.9", + "depd": "~1.1.2", + "destroy": "~1.0.4", + "encodeurl": "~1.0.2", + "escape-html": "~1.0.3", + "etag": "~1.8.1", + "fresh": "0.5.2", + "http-errors": "1.8.1", + "mime": "1.6.0", + "ms": "2.1.3", + "on-finished": "~2.3.0", + "range-parser": "~1.2.1", + "statuses": "~1.5.0" + }, + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/send/node_modules/ms": { + "version": "2.1.3", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz", + "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==" + }, + "node_modules/serve-static": { + "version": "1.14.2", + "resolved": "https://registry.npmjs.org/serve-static/-/serve-static-1.14.2.tgz", + "integrity": "sha512-+TMNA9AFxUEGuC0z2mevogSnn9MXKb4fa7ngeRMJaaGv8vTwnIEkKi+QGvPt33HSnf8pRS+WGM0EbMtCJLKMBQ==", + "dependencies": { + "encodeurl": "~1.0.2", + "escape-html": "~1.0.3", + "parseurl": "~1.3.3", + "send": "0.17.2" + }, + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/setprototypeof": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/setprototypeof/-/setprototypeof-1.2.0.tgz", + "integrity": "sha512-E5LDX7Wrp85Kil5bhZv46j8jOeboKq5JMmYM3gVGdGH8xFpPWXUMsNrlODCrkoxMEeNi/XZIwuRvY4XNwYMJpw==" + }, + "node_modules/socket.io": { + "version": "4.4.1", + "resolved": "https://registry.npmjs.org/socket.io/-/socket.io-4.4.1.tgz", + "integrity": "sha512-s04vrBswdQBUmuWJuuNTmXUVJhP0cVky8bBDhdkf8y0Ptsu7fKU2LuLbts9g+pdmAdyMMn8F/9Mf1/wbtUN0fg==", + "dependencies": { + "accepts": "~1.3.4", + "base64id": "~2.0.0", + "debug": "~4.3.2", + "engine.io": "~6.1.0", + "socket.io-adapter": "~2.3.3", + "socket.io-parser": "~4.0.4" + }, + "engines": { + "node": ">=10.0.0" + } + }, + "node_modules/socket.io-adapter": { + "version": "2.3.3", + "resolved": "https://registry.npmjs.org/socket.io-adapter/-/socket.io-adapter-2.3.3.tgz", + "integrity": "sha512-Qd/iwn3VskrpNO60BeRyCyr8ZWw9CPZyitW4AQwmRZ8zCiyDiL+znRnWX6tDHXnWn1sJrM1+b6Mn6wEDJJ4aYQ==" + }, + "node_modules/socket.io-parser": { + "version": "4.0.4", + "resolved": "https://registry.npmjs.org/socket.io-parser/-/socket.io-parser-4.0.4.tgz", + "integrity": "sha512-t+b0SS+IxG7Rxzda2EVvyBZbvFPBCjJoyHuE0P//7OAsN23GItzDRdWa6ALxZI/8R5ygK7jAR6t028/z+7295g==", + "dependencies": { + "@types/component-emitter": "^1.2.10", + "component-emitter": "~1.3.0", + "debug": "~4.3.1" + }, + "engines": { + "node": ">=10.0.0" + } + }, + "node_modules/socket.io-parser/node_modules/debug": { + "version": "4.3.3", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.3.tgz", + "integrity": "sha512-/zxw5+vh1Tfv+4Qn7a5nsbcJKPaSvCDhojn6FEl9vupwK2VCSDtEiEtqr8DFtzYFOdz63LBkxec7DYuc2jon6Q==", + "dependencies": { + "ms": "2.1.2" + }, + "engines": { + "node": ">=6.0" + }, + "peerDependenciesMeta": { + "supports-color": { + "optional": true + } + } + }, + "node_modules/socket.io-parser/node_modules/ms": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", + "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==" + }, + "node_modules/socket.io/node_modules/debug": { + "version": "4.3.3", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.3.tgz", + "integrity": "sha512-/zxw5+vh1Tfv+4Qn7a5nsbcJKPaSvCDhojn6FEl9vupwK2VCSDtEiEtqr8DFtzYFOdz63LBkxec7DYuc2jon6Q==", + "dependencies": { + "ms": "2.1.2" + }, + "engines": { + "node": ">=6.0" + }, + "peerDependenciesMeta": { + "supports-color": { + "optional": true + } + } + }, + "node_modules/socket.io/node_modules/ms": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", + "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==" + }, + "node_modules/source-map": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", + "peer": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/source-map-js": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/source-map-js/-/source-map-js-1.0.2.tgz", + "integrity": "sha512-R0XvVJ9WusLiqTCEiGCmICCMplcCkIwwR11mOSD9CR5u+IXYdiseeEuXCVAjS54zqwkLcPNnmU4OeJ6tUrWhDw==", + "peer": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/sourcemap-codec": { + "version": "1.4.8", + "resolved": "https://registry.npmjs.org/sourcemap-codec/-/sourcemap-codec-1.4.8.tgz", + "integrity": "sha512-9NykojV5Uih4lgo5So5dtw+f0JgJX30KCNI8gwhz2J9A15wD0Ml6tjHKwf6fTSa6fAdVBdZeNOs9eJ71qCk8vA==", + "peer": true + }, + "node_modules/statuses": { + "version": "1.5.0", + "resolved": "https://registry.npmjs.org/statuses/-/statuses-1.5.0.tgz", + "integrity": "sha1-Fhx9rBd2Wf2YEfQ3cfqZOBR4Yow=", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/toidentifier": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/toidentifier/-/toidentifier-1.0.1.tgz", + "integrity": "sha512-o5sSPKEkg/DIQNmH43V0/uerLrpzVedkUh8tGNvaeXpfpuwjKenlSox/2O/BTlZUtEe+JG7s5YhEz608PlAHRA==", + "engines": { + "node": ">=0.6" + } + }, + "node_modules/type-is": { + "version": "1.6.18", + "resolved": "https://registry.npmjs.org/type-is/-/type-is-1.6.18.tgz", + "integrity": "sha512-TkRKr9sUTxEH8MdfuCSP7VizJyzRNMjj2J2do2Jr3Kym598JVdEksuzPQCnlFPW4ky9Q+iA+ma9BGm06XQBy8g==", + "dependencies": { + "media-typer": "0.3.0", + "mime-types": "~2.1.24" + }, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/unpipe": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/unpipe/-/unpipe-1.0.0.tgz", + "integrity": "sha1-sr9O6FFKrmFltIF4KdIbLvSZBOw=", + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/utils-merge": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/utils-merge/-/utils-merge-1.0.1.tgz", + "integrity": "sha1-n5VxD1CiZ5R7LMwSR0HBAoQn5xM=", + "engines": { + "node": ">= 0.4.0" + } + }, + "node_modules/vary": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/vary/-/vary-1.1.2.tgz", + "integrity": "sha1-IpnwLG3tMNSllhsLn3RSShj2NPw=", + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/vue": { + "version": "3.2.31", + "resolved": "https://registry.npmjs.org/vue/-/vue-3.2.31.tgz", + "integrity": "sha512-odT3W2tcffTiQCy57nOT93INw1auq5lYLLYtWpPYQQYQOOdHiqFct9Xhna6GJ+pJQaF67yZABraH47oywkJgFw==", + "peer": true, + "dependencies": { + "@vue/compiler-dom": "3.2.31", + "@vue/compiler-sfc": "3.2.31", + "@vue/runtime-dom": "3.2.31", + "@vue/server-renderer": "3.2.31", + "@vue/shared": "3.2.31" + } + }, + "node_modules/vue-router": { + "version": "4.0.13", + "resolved": "https://registry.npmjs.org/vue-router/-/vue-router-4.0.13.tgz", + "integrity": "sha512-LmXrC+BkDRLak+d5xTMgUYraT3Nj0H/vCbP+7usGvIl9Viqd1UP6AsP0i69pSbn9O0dXK/xCdp4yPw21HqV9Jw==", + "dependencies": { + "@vue/devtools-api": "^6.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/posva" + }, + "peerDependencies": { + "vue": "^3.2.0" + } + }, + "node_modules/ws": { + "version": "8.2.3", + "resolved": "https://registry.npmjs.org/ws/-/ws-8.2.3.tgz", + "integrity": "sha512-wBuoj1BDpC6ZQ1B7DWQBYVLphPWkm8i9Y0/3YdHjHKHiohOJ1ws+3OccDWtH+PoC9DZD5WOTrJvNbWvjS6JWaA==", + "engines": { + "node": ">=10.0.0" + }, + "peerDependencies": { + "bufferutil": "^4.0.1", + "utf-8-validate": "^5.0.2" + }, + "peerDependenciesMeta": { + "bufferutil": { + "optional": true + }, + "utf-8-validate": { + "optional": true + } + } + } + }, + "dependencies": { + "@babel/parser": { + "version": "7.17.3", + "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.17.3.tgz", + "integrity": "sha512-7yJPvPV+ESz2IUTPbOL+YkIGyCqOyNIzdguKQuJGnH7bg1WTIifuM21YqokFt/THWh1AkCRn9IgoykTRCBVpzA==", + "peer": true + }, + "@socket.io/base64-arraybuffer": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/@socket.io/base64-arraybuffer/-/base64-arraybuffer-1.0.2.tgz", + "integrity": "sha512-dOlCBKnDw4iShaIsH/bxujKTM18+2TOAsYz+KSc11Am38H4q5Xw8Bbz97ZYdrVNM+um3p7w86Bvvmcn9q+5+eQ==" + }, + "@types/component-emitter": { + "version": "1.2.11", + "resolved": "https://registry.npmjs.org/@types/component-emitter/-/component-emitter-1.2.11.tgz", + "integrity": "sha512-SRXjM+tfsSlA9VuG8hGO2nft2p8zjXCK1VcC6N4NXbBbYbSia9kzCChYQajIjzIqOOOuh5Ock6MmV2oux4jDZQ==" + }, + "@types/cookie": { + "version": "0.4.1", + "resolved": "https://registry.npmjs.org/@types/cookie/-/cookie-0.4.1.tgz", + "integrity": "sha512-XW/Aa8APYr6jSVVA1y/DEIZX0/GMKLEVekNG727R8cs56ahETkRAy/3DR7+fJyh7oUgGwNQaRfXCun0+KbWY7Q==" + }, + "@types/cors": { + "version": "2.8.12", + "resolved": "https://registry.npmjs.org/@types/cors/-/cors-2.8.12.tgz", + "integrity": "sha512-vt+kDhq/M2ayberEtJcIN/hxXy1Pk+59g2FV/ZQceeaTyCtCucjL2Q7FXlFjtWn4n15KCr1NE2lNNFhp0lEThw==" + }, + "@types/node": { + "version": "17.0.21", + "resolved": "https://registry.npmjs.org/@types/node/-/node-17.0.21.tgz", + "integrity": "sha512-DBZCJbhII3r90XbQxI8Y9IjjiiOGlZ0Hr32omXIZvwwZ7p4DMMXGrKXVyPfuoBOri9XNtL0UK69jYIBIsRX3QQ==" + }, + "@vue/compiler-core": { + "version": "3.2.31", + "resolved": "https://registry.npmjs.org/@vue/compiler-core/-/compiler-core-3.2.31.tgz", + "integrity": "sha512-aKno00qoA4o+V/kR6i/pE+aP+esng5siNAVQ422TkBNM6qA4veXiZbSe8OTXHXquEi/f6Akc+nLfB4JGfe4/WQ==", + "peer": true, + "requires": { + "@babel/parser": "^7.16.4", + "@vue/shared": "3.2.31", + "estree-walker": "^2.0.2", + "source-map": "^0.6.1" + } + }, + "@vue/compiler-dom": { + "version": "3.2.31", + "resolved": "https://registry.npmjs.org/@vue/compiler-dom/-/compiler-dom-3.2.31.tgz", + "integrity": "sha512-60zIlFfzIDf3u91cqfqy9KhCKIJgPeqxgveH2L+87RcGU/alT6BRrk5JtUso0OibH3O7NXuNOQ0cDc9beT0wrg==", + "peer": true, + "requires": { + "@vue/compiler-core": "3.2.31", + "@vue/shared": "3.2.31" + } + }, + "@vue/compiler-sfc": { + "version": "3.2.31", + "resolved": "https://registry.npmjs.org/@vue/compiler-sfc/-/compiler-sfc-3.2.31.tgz", + "integrity": "sha512-748adc9msSPGzXgibHiO6T7RWgfnDcVQD+VVwYgSsyyY8Ans64tALHZANrKtOzvkwznV/F4H7OAod/jIlp/dkQ==", + "peer": true, + "requires": { + "@babel/parser": "^7.16.4", + "@vue/compiler-core": "3.2.31", + "@vue/compiler-dom": "3.2.31", + "@vue/compiler-ssr": "3.2.31", + "@vue/reactivity-transform": "3.2.31", + "@vue/shared": "3.2.31", + "estree-walker": "^2.0.2", + "magic-string": "^0.25.7", + "postcss": "^8.1.10", + "source-map": "^0.6.1" + } + }, + "@vue/compiler-ssr": { + "version": "3.2.31", + "resolved": "https://registry.npmjs.org/@vue/compiler-ssr/-/compiler-ssr-3.2.31.tgz", + "integrity": "sha512-mjN0rqig+A8TVDnsGPYJM5dpbjlXeHUm2oZHZwGyMYiGT/F4fhJf/cXy8QpjnLQK4Y9Et4GWzHn9PS8AHUnSkw==", + "peer": true, + "requires": { + "@vue/compiler-dom": "3.2.31", + "@vue/shared": "3.2.31" + } + }, + "@vue/devtools-api": { + "version": "6.0.12", + "resolved": "https://registry.npmjs.org/@vue/devtools-api/-/devtools-api-6.0.12.tgz", + "integrity": "sha512-iO/4FIezHKXhiDBdKySCvJVh8/mZPxHpiQrTy+PXVqJZgpTPTdHy4q8GXulaY+UKEagdkBb0onxNQZ0LNiqVhw==" + }, + "@vue/reactivity": { + "version": "3.2.31", + "resolved": "https://registry.npmjs.org/@vue/reactivity/-/reactivity-3.2.31.tgz", + "integrity": "sha512-HVr0l211gbhpEKYr2hYe7hRsV91uIVGFYNHj73njbARVGHQvIojkImKMaZNDdoDZOIkMsBc9a1sMqR+WZwfSCw==", + "peer": true, + "requires": { + "@vue/shared": "3.2.31" + } + }, + "@vue/reactivity-transform": { + "version": "3.2.31", + "resolved": "https://registry.npmjs.org/@vue/reactivity-transform/-/reactivity-transform-3.2.31.tgz", + "integrity": "sha512-uS4l4z/W7wXdI+Va5pgVxBJ345wyGFKvpPYtdSgvfJfX/x2Ymm6ophQlXXB6acqGHtXuBqNyyO3zVp9b1r0MOA==", + "peer": true, + "requires": { + "@babel/parser": "^7.16.4", + "@vue/compiler-core": "3.2.31", + "@vue/shared": "3.2.31", + "estree-walker": "^2.0.2", + "magic-string": "^0.25.7" + } + }, + "@vue/runtime-core": { + "version": "3.2.31", + "resolved": "https://registry.npmjs.org/@vue/runtime-core/-/runtime-core-3.2.31.tgz", + "integrity": "sha512-Kcog5XmSY7VHFEMuk4+Gap8gUssYMZ2+w+cmGI6OpZWYOEIcbE0TPzzPHi+8XTzAgx1w/ZxDFcXhZeXN5eKWsA==", + "peer": true, + "requires": { + "@vue/reactivity": "3.2.31", + "@vue/shared": "3.2.31" + } + }, + "@vue/runtime-dom": { + "version": "3.2.31", + "resolved": "https://registry.npmjs.org/@vue/runtime-dom/-/runtime-dom-3.2.31.tgz", + "integrity": "sha512-N+o0sICVLScUjfLG7u9u5XCjvmsexAiPt17GNnaWHJUfsKed5e85/A3SWgKxzlxx2SW/Hw7RQxzxbXez9PtY3g==", + "peer": true, + "requires": { + "@vue/runtime-core": "3.2.31", + "@vue/shared": "3.2.31", + "csstype": "^2.6.8" + } + }, + "@vue/server-renderer": { + "version": "3.2.31", + "resolved": "https://registry.npmjs.org/@vue/server-renderer/-/server-renderer-3.2.31.tgz", + "integrity": "sha512-8CN3Zj2HyR2LQQBHZ61HexF5NReqngLT3oahyiVRfSSvak+oAvVmu8iNLSu6XR77Ili2AOpnAt1y8ywjjqtmkg==", + "peer": true, + "requires": { + "@vue/compiler-ssr": "3.2.31", + "@vue/shared": "3.2.31" + } + }, + "@vue/shared": { + "version": "3.2.31", + "resolved": "https://registry.npmjs.org/@vue/shared/-/shared-3.2.31.tgz", + "integrity": "sha512-ymN2pj6zEjiKJZbrf98UM2pfDd6F2H7ksKw7NDt/ZZ1fh5Ei39X5tABugtT03ZRlWd9imccoK0hE8hpjpU7irQ==", + "peer": true + }, + "accepts": { + "version": "1.3.8", + "resolved": "https://registry.npmjs.org/accepts/-/accepts-1.3.8.tgz", + "integrity": "sha512-PYAthTa2m2VKxuvSD3DPC/Gy+U+sOA1LAuT8mkmRuvw+NACSaeXEQ+NHcVF7rONl6qcaxV3Uuemwawk+7+SJLw==", + "requires": { + "mime-types": "~2.1.34", + "negotiator": "0.6.3" + } + }, + "array-flatten": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/array-flatten/-/array-flatten-1.1.1.tgz", + "integrity": "sha1-ml9pkFGx5wczKPKgCJaLZOopVdI=" + }, + "base64id": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/base64id/-/base64id-2.0.0.tgz", + "integrity": "sha512-lGe34o6EHj9y3Kts9R4ZYs/Gr+6N7MCaMlIFA3F1R2O5/m7K06AxfSeO5530PEERE6/WyEg3lsuyw4GHlPZHog==" + }, + "body-parser": { + "version": "1.19.2", + "resolved": "https://registry.npmjs.org/body-parser/-/body-parser-1.19.2.tgz", + "integrity": "sha512-SAAwOxgoCKMGs9uUAUFHygfLAyaniaoun6I8mFY9pRAJL9+Kec34aU+oIjDhTycub1jozEfEwx1W1IuOYxVSFw==", + "requires": { + "bytes": "3.1.2", + "content-type": "~1.0.4", + "debug": "2.6.9", + "depd": "~1.1.2", + "http-errors": "1.8.1", + "iconv-lite": "0.4.24", + "on-finished": "~2.3.0", + "qs": "6.9.7", + "raw-body": "2.4.3", + "type-is": "~1.6.18" + } + }, + "bytes": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/bytes/-/bytes-3.1.2.tgz", + "integrity": "sha512-/Nf7TyzTx6S3yRJObOAV7956r8cr2+Oj8AC5dt8wSP3BQAoeX58NoHyCU8P8zGkNXStjTSi6fzO6F0pBdcYbEg==" + }, + "component-emitter": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/component-emitter/-/component-emitter-1.3.0.tgz", + "integrity": "sha512-Rd3se6QB+sO1TwqZjscQrurpEPIfO0/yYnSin6Q/rD3mOutHvUrCAhJub3r90uNb+SESBuE0QYoB90YdfatsRg==" + }, + "content-disposition": { + "version": "0.5.4", + "resolved": "https://registry.npmjs.org/content-disposition/-/content-disposition-0.5.4.tgz", + "integrity": "sha512-FveZTNuGw04cxlAiWbzi6zTAL/lhehaWbTtgluJh4/E95DqMwTmha3KZN1aAWA8cFIhHzMZUvLevkw5Rqk+tSQ==", + "requires": { + "safe-buffer": "5.2.1" + } + }, + "content-type": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/content-type/-/content-type-1.0.4.tgz", + "integrity": "sha512-hIP3EEPs8tB9AT1L+NUqtwOAps4mk2Zob89MWXMHjHWg9milF/j4osnnQLXBCBFBk/tvIG/tUc9mOUJiPBhPXA==" + }, + "cookie": { + "version": "0.4.2", + "resolved": "https://registry.npmjs.org/cookie/-/cookie-0.4.2.tgz", + "integrity": "sha512-aSWTXFzaKWkvHO1Ny/s+ePFpvKsPnjc551iI41v3ny/ow6tBG5Vd+FuqGNhh1LxOmVzOlGUriIlOaokOvhaStA==" + }, + "cookie-signature": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/cookie-signature/-/cookie-signature-1.0.6.tgz", + "integrity": "sha1-4wOogrNCzD7oylE6eZmXNNqzriw=" + }, + "cors": { + "version": "2.8.5", + "resolved": "https://registry.npmjs.org/cors/-/cors-2.8.5.tgz", + "integrity": "sha512-KIHbLJqu73RGr/hnbrO9uBeixNGuvSQjul/jdFvS/KFSIH1hWVd1ng7zOHx+YrEfInLG7q4n6GHQ9cDtxv/P6g==", + "requires": { + "object-assign": "^4", + "vary": "^1" + } + }, + "csstype": { + "version": "2.6.19", + "resolved": "https://registry.npmjs.org/csstype/-/csstype-2.6.19.tgz", + "integrity": "sha512-ZVxXaNy28/k3kJg0Fou5MiYpp88j7H9hLZp8PDC3jV0WFjfH5E9xHb56L0W59cPbKbcHXeP4qyT8PrHp8t6LcQ==", + "peer": true + }, + "debug": { + "version": "2.6.9", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", + "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", + "requires": { + "ms": "2.0.0" + } + }, + "depd": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/depd/-/depd-1.1.2.tgz", + "integrity": "sha1-m81S4UwJd2PnSbJ0xDRu0uVgtak=" + }, + "destroy": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/destroy/-/destroy-1.0.4.tgz", + "integrity": "sha1-l4hXRCxEdJ5CBmE+N5RiBYJqvYA=" + }, + "ee-first": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/ee-first/-/ee-first-1.1.1.tgz", + "integrity": "sha1-WQxhFWsK4vTwJVcyoViyZrxWsh0=" + }, + "encodeurl": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/encodeurl/-/encodeurl-1.0.2.tgz", + "integrity": "sha1-rT/0yG7C0CkyL1oCw6mmBslbP1k=" + }, + "engine.io": { + "version": "6.1.3", + "resolved": "https://registry.npmjs.org/engine.io/-/engine.io-6.1.3.tgz", + "integrity": "sha512-rqs60YwkvWTLLnfazqgZqLa/aKo+9cueVfEi/dZ8PyGyaf8TLOxj++4QMIgeG3Gn0AhrWiFXvghsoY9L9h25GA==", + "requires": { + "@types/cookie": "^0.4.1", + "@types/cors": "^2.8.12", + "@types/node": ">=10.0.0", + "accepts": "~1.3.4", + "base64id": "2.0.0", + "cookie": "~0.4.1", + "cors": "~2.8.5", + "debug": "~4.3.1", + "engine.io-parser": "~5.0.3", + "ws": "~8.2.3" + }, + "dependencies": { + "debug": { + "version": "4.3.3", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.3.tgz", + "integrity": "sha512-/zxw5+vh1Tfv+4Qn7a5nsbcJKPaSvCDhojn6FEl9vupwK2VCSDtEiEtqr8DFtzYFOdz63LBkxec7DYuc2jon6Q==", + "requires": { + "ms": "2.1.2" + } + }, + "ms": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", + "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==" + } + } + }, + "engine.io-parser": { + "version": "5.0.3", + "resolved": "https://registry.npmjs.org/engine.io-parser/-/engine.io-parser-5.0.3.tgz", + "integrity": "sha512-BtQxwF27XUNnSafQLvDi0dQ8s3i6VgzSoQMJacpIcGNrlUdfHSKbgm3jmjCVvQluGzqwujQMPAoMai3oYSTurg==", + "requires": { + "@socket.io/base64-arraybuffer": "~1.0.2" + } + }, + "escape-html": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/escape-html/-/escape-html-1.0.3.tgz", + "integrity": "sha1-Aljq5NPQwJdN4cFpGI7wBR0dGYg=" + }, + "estree-walker": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/estree-walker/-/estree-walker-2.0.2.tgz", + "integrity": "sha512-Rfkk/Mp/DL7JVje3u18FxFujQlTNR2q6QfMSMB7AvCBx91NGj/ba3kCfza0f6dVDbw7YlRf/nDrn7pQrCCyQ/w==", + "peer": true + }, + "etag": { + "version": "1.8.1", + "resolved": "https://registry.npmjs.org/etag/-/etag-1.8.1.tgz", + "integrity": "sha1-Qa4u62XvpiJorr/qg6x9eSmbCIc=" + }, + "express": { + "version": "4.17.3", + "resolved": "https://registry.npmjs.org/express/-/express-4.17.3.tgz", + "integrity": "sha512-yuSQpz5I+Ch7gFrPCk4/c+dIBKlQUxtgwqzph132bsT6qhuzss6I8cLJQz7B3rFblzd6wtcI0ZbGltH/C4LjUg==", + "requires": { + "accepts": "~1.3.8", + "array-flatten": "1.1.1", + "body-parser": "1.19.2", + "content-disposition": "0.5.4", + "content-type": "~1.0.4", + "cookie": "0.4.2", + "cookie-signature": "1.0.6", + "debug": "2.6.9", + "depd": "~1.1.2", + "encodeurl": "~1.0.2", + "escape-html": "~1.0.3", + "etag": "~1.8.1", + "finalhandler": "~1.1.2", + "fresh": "0.5.2", + "merge-descriptors": "1.0.1", + "methods": "~1.1.2", + "on-finished": "~2.3.0", + "parseurl": "~1.3.3", + "path-to-regexp": "0.1.7", + "proxy-addr": "~2.0.7", + "qs": "6.9.7", + "range-parser": "~1.2.1", + "safe-buffer": "5.2.1", + "send": "0.17.2", + "serve-static": "1.14.2", + "setprototypeof": "1.2.0", + "statuses": "~1.5.0", + "type-is": "~1.6.18", + "utils-merge": "1.0.1", + "vary": "~1.1.2" + } + }, + "finalhandler": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/finalhandler/-/finalhandler-1.1.2.tgz", + "integrity": "sha512-aAWcW57uxVNrQZqFXjITpW3sIUQmHGG3qSb9mUah9MgMC4NeWhNOlNjXEYq3HjRAvL6arUviZGGJsBg6z0zsWA==", + "requires": { + "debug": "2.6.9", + "encodeurl": "~1.0.2", + "escape-html": "~1.0.3", + "on-finished": "~2.3.0", + "parseurl": "~1.3.3", + "statuses": "~1.5.0", + "unpipe": "~1.0.0" + } + }, + "forwarded": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/forwarded/-/forwarded-0.2.0.tgz", + "integrity": "sha512-buRG0fpBtRHSTCOASe6hD258tEubFoRLb4ZNA6NxMVHNw2gOcwHo9wyablzMzOA5z9xA9L1KNjk/Nt6MT9aYow==" + }, + "fresh": { + "version": "0.5.2", + "resolved": "https://registry.npmjs.org/fresh/-/fresh-0.5.2.tgz", + "integrity": "sha1-PYyt2Q2XZWn6g1qx+OSyOhBWBac=" + }, + "http-errors": { + "version": "1.8.1", + "resolved": "https://registry.npmjs.org/http-errors/-/http-errors-1.8.1.tgz", + "integrity": "sha512-Kpk9Sm7NmI+RHhnj6OIWDI1d6fIoFAtFt9RLaTMRlg/8w49juAStsrBgp0Dp4OdxdVbRIeKhtCUvoi/RuAhO4g==", + "requires": { + "depd": "~1.1.2", + "inherits": "2.0.4", + "setprototypeof": "1.2.0", + "statuses": ">= 1.5.0 < 2", + "toidentifier": "1.0.1" + } + }, + "iconv-lite": { + "version": "0.4.24", + "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.4.24.tgz", + "integrity": "sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA==", + "requires": { + "safer-buffer": ">= 2.1.2 < 3" + } + }, + "inherits": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz", + "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==" + }, + "ipaddr.js": { + "version": "1.9.1", + "resolved": "https://registry.npmjs.org/ipaddr.js/-/ipaddr.js-1.9.1.tgz", + "integrity": "sha512-0KI/607xoxSToH7GjN1FfSbLoU0+btTicjsQSWQlh/hZykN8KpmMf7uYwPW3R+akZ6R/w18ZlXSHBYXiYUPO3g==" + }, + "magic-string": { + "version": "0.25.7", + "resolved": "https://registry.npmjs.org/magic-string/-/magic-string-0.25.7.tgz", + "integrity": "sha512-4CrMT5DOHTDk4HYDlzmwu4FVCcIYI8gauveasrdCu2IKIFOJ3f0v/8MDGJCDL9oD2ppz/Av1b0Nj345H9M+XIA==", + "peer": true, + "requires": { + "sourcemap-codec": "^1.4.4" + } + }, + "media-typer": { + "version": "0.3.0", + "resolved": "https://registry.npmjs.org/media-typer/-/media-typer-0.3.0.tgz", + "integrity": "sha1-hxDXrwqmJvj/+hzgAWhUUmMlV0g=" + }, + "merge-descriptors": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/merge-descriptors/-/merge-descriptors-1.0.1.tgz", + "integrity": "sha1-sAqqVW3YtEVoFQ7J0blT8/kMu2E=" + }, + "methods": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/methods/-/methods-1.1.2.tgz", + "integrity": "sha1-VSmk1nZUE07cxSZmVoNbD4Ua/O4=" + }, + "mime": { + "version": "1.6.0", + "resolved": "https://registry.npmjs.org/mime/-/mime-1.6.0.tgz", + "integrity": "sha512-x0Vn8spI+wuJ1O6S7gnbaQg8Pxh4NNHb7KSINmEWKiPE4RKOplvijn+NkmYmmRgP68mc70j2EbeTFRsrswaQeg==" + }, + "mime-db": { + "version": "1.51.0", + "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.51.0.tgz", + "integrity": "sha512-5y8A56jg7XVQx2mbv1lu49NR4dokRnhZYTtL+KGfaa27uq4pSTXkwQkFJl4pkRMyNFz/EtYDSkiiEHx3F7UN6g==" + }, + "mime-types": { + "version": "2.1.34", + "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.34.tgz", + "integrity": "sha512-6cP692WwGIs9XXdOO4++N+7qjqv0rqxxVvJ3VHPh/Sc9mVZcQP+ZGhkKiTvWMQRr2tbHkJP/Yn7Y0npb3ZBs4A==", + "requires": { + "mime-db": "1.51.0" + } + }, + "ms": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=" + }, + "nanoid": { + "version": "3.3.1", + "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-3.3.1.tgz", + "integrity": "sha512-n6Vs/3KGyxPQd6uO0eH4Bv0ojGSUvuLlIHtC3Y0kEO23YRge8H9x1GCzLn28YX0H66pMkxuaeESFq4tKISKwdw==", + "peer": true + }, + "negotiator": { + "version": "0.6.3", + "resolved": "https://registry.npmjs.org/negotiator/-/negotiator-0.6.3.tgz", + "integrity": "sha512-+EUsqGPLsM+j/zdChZjsnX51g4XrHFOIXwfnCVPGlQk/k5giakcKsuxCObBRu6DSm9opw/O6slWbJdghQM4bBg==" + }, + "object-assign": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz", + "integrity": "sha1-IQmtx5ZYh8/AXLvUQsrIv7s2CGM=" + }, + "on-finished": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/on-finished/-/on-finished-2.3.0.tgz", + "integrity": "sha1-IPEzZIGwg811M3mSoWlxqi2QaUc=", + "requires": { + "ee-first": "1.1.1" + } + }, + "parseurl": { + "version": "1.3.3", + "resolved": "https://registry.npmjs.org/parseurl/-/parseurl-1.3.3.tgz", + "integrity": "sha512-CiyeOxFT/JZyN5m0z9PfXw4SCBJ6Sygz1Dpl0wqjlhDEGGBP1GnsUVEL0p63hoG1fcj3fHynXi9NYO4nWOL+qQ==" + }, + "path-to-regexp": { + "version": "0.1.7", + "resolved": "https://registry.npmjs.org/path-to-regexp/-/path-to-regexp-0.1.7.tgz", + "integrity": "sha1-32BBeABfUi8V60SQ5yR6G/qmf4w=" + }, + "picocolors": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-1.0.0.tgz", + "integrity": "sha512-1fygroTLlHu66zi26VoTDv8yRgm0Fccecssto+MhsZ0D/DGW2sm8E8AjW7NU5VVTRt5GxbeZ5qBuJr+HyLYkjQ==", + "peer": true + }, + "postcss": { + "version": "8.4.7", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.4.7.tgz", + "integrity": "sha512-L9Ye3r6hkkCeOETQX6iOaWZgjp3LL6Lpqm6EtgbKrgqGGteRMNb9vzBfRL96YOSu8o7x3MfIH9Mo5cPJFGrW6A==", + "peer": true, + "requires": { + "nanoid": "^3.3.1", + "picocolors": "^1.0.0", + "source-map-js": "^1.0.2" + } + }, + "proxy-addr": { + "version": "2.0.7", + "resolved": "https://registry.npmjs.org/proxy-addr/-/proxy-addr-2.0.7.tgz", + "integrity": "sha512-llQsMLSUDUPT44jdrU/O37qlnifitDP+ZwrmmZcoSKyLKvtZxpyV0n2/bD/N4tBAAZ/gJEdZU7KMraoK1+XYAg==", + "requires": { + "forwarded": "0.2.0", + "ipaddr.js": "1.9.1" + } + }, + "qs": { + "version": "6.9.7", + "resolved": "https://registry.npmjs.org/qs/-/qs-6.9.7.tgz", + "integrity": "sha512-IhMFgUmuNpyRfxA90umL7ByLlgRXu6tIfKPpF5TmcfRLlLCckfP/g3IQmju6jjpu+Hh8rA+2p6A27ZSPOOHdKw==" + }, + "range-parser": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/range-parser/-/range-parser-1.2.1.tgz", + "integrity": "sha512-Hrgsx+orqoygnmhFbKaHE6c296J+HTAQXoxEF6gNupROmmGJRoyzfG3ccAveqCBrwr/2yxQ5BVd/GTl5agOwSg==" + }, + "raw-body": { + "version": "2.4.3", + "resolved": "https://registry.npmjs.org/raw-body/-/raw-body-2.4.3.tgz", + "integrity": "sha512-UlTNLIcu0uzb4D2f4WltY6cVjLi+/jEN4lgEUj3E04tpMDpUlkBo/eSn6zou9hum2VMNpCCUone0O0WeJim07g==", + "requires": { + "bytes": "3.1.2", + "http-errors": "1.8.1", + "iconv-lite": "0.4.24", + "unpipe": "1.0.0" + } + }, + "safe-buffer": { + "version": "5.2.1", + "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.1.tgz", + "integrity": "sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==" + }, + "safer-buffer": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/safer-buffer/-/safer-buffer-2.1.2.tgz", + "integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==" + }, + "send": { + "version": "0.17.2", + "resolved": "https://registry.npmjs.org/send/-/send-0.17.2.tgz", + "integrity": "sha512-UJYB6wFSJE3G00nEivR5rgWp8c2xXvJ3OPWPhmuteU0IKj8nKbG3DrjiOmLwpnHGYWAVwA69zmTm++YG0Hmwww==", + "requires": { + "debug": "2.6.9", + "depd": "~1.1.2", + "destroy": "~1.0.4", + "encodeurl": "~1.0.2", + "escape-html": "~1.0.3", + "etag": "~1.8.1", + "fresh": "0.5.2", + "http-errors": "1.8.1", + "mime": "1.6.0", + "ms": "2.1.3", + "on-finished": "~2.3.0", + "range-parser": "~1.2.1", + "statuses": "~1.5.0" + }, + "dependencies": { + "ms": { + "version": "2.1.3", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz", + "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==" + } + } + }, + "serve-static": { + "version": "1.14.2", + "resolved": "https://registry.npmjs.org/serve-static/-/serve-static-1.14.2.tgz", + "integrity": "sha512-+TMNA9AFxUEGuC0z2mevogSnn9MXKb4fa7ngeRMJaaGv8vTwnIEkKi+QGvPt33HSnf8pRS+WGM0EbMtCJLKMBQ==", + "requires": { + "encodeurl": "~1.0.2", + "escape-html": "~1.0.3", + "parseurl": "~1.3.3", + "send": "0.17.2" + } + }, + "setprototypeof": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/setprototypeof/-/setprototypeof-1.2.0.tgz", + "integrity": "sha512-E5LDX7Wrp85Kil5bhZv46j8jOeboKq5JMmYM3gVGdGH8xFpPWXUMsNrlODCrkoxMEeNi/XZIwuRvY4XNwYMJpw==" + }, + "socket.io": { + "version": "4.4.1", + "resolved": "https://registry.npmjs.org/socket.io/-/socket.io-4.4.1.tgz", + "integrity": "sha512-s04vrBswdQBUmuWJuuNTmXUVJhP0cVky8bBDhdkf8y0Ptsu7fKU2LuLbts9g+pdmAdyMMn8F/9Mf1/wbtUN0fg==", + "requires": { + "accepts": "~1.3.4", + "base64id": "~2.0.0", + "debug": "~4.3.2", + "engine.io": "~6.1.0", + "socket.io-adapter": "~2.3.3", + "socket.io-parser": "~4.0.4" + }, + "dependencies": { + "debug": { + "version": "4.3.3", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.3.tgz", + "integrity": "sha512-/zxw5+vh1Tfv+4Qn7a5nsbcJKPaSvCDhojn6FEl9vupwK2VCSDtEiEtqr8DFtzYFOdz63LBkxec7DYuc2jon6Q==", + "requires": { + "ms": "2.1.2" + } + }, + "ms": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", + "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==" + } + } + }, + "socket.io-adapter": { + "version": "2.3.3", + "resolved": "https://registry.npmjs.org/socket.io-adapter/-/socket.io-adapter-2.3.3.tgz", + "integrity": "sha512-Qd/iwn3VskrpNO60BeRyCyr8ZWw9CPZyitW4AQwmRZ8zCiyDiL+znRnWX6tDHXnWn1sJrM1+b6Mn6wEDJJ4aYQ==" + }, + "socket.io-parser": { + "version": "4.0.4", + "resolved": "https://registry.npmjs.org/socket.io-parser/-/socket.io-parser-4.0.4.tgz", + "integrity": "sha512-t+b0SS+IxG7Rxzda2EVvyBZbvFPBCjJoyHuE0P//7OAsN23GItzDRdWa6ALxZI/8R5ygK7jAR6t028/z+7295g==", + "requires": { + "@types/component-emitter": "^1.2.10", + "component-emitter": "~1.3.0", + "debug": "~4.3.1" + }, + "dependencies": { + "debug": { + "version": "4.3.3", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.3.tgz", + "integrity": "sha512-/zxw5+vh1Tfv+4Qn7a5nsbcJKPaSvCDhojn6FEl9vupwK2VCSDtEiEtqr8DFtzYFOdz63LBkxec7DYuc2jon6Q==", + "requires": { + "ms": "2.1.2" + } + }, + "ms": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", + "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==" + } + } + }, + "source-map": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", + "peer": true + }, + "source-map-js": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/source-map-js/-/source-map-js-1.0.2.tgz", + "integrity": "sha512-R0XvVJ9WusLiqTCEiGCmICCMplcCkIwwR11mOSD9CR5u+IXYdiseeEuXCVAjS54zqwkLcPNnmU4OeJ6tUrWhDw==", + "peer": true + }, + "sourcemap-codec": { + "version": "1.4.8", + "resolved": "https://registry.npmjs.org/sourcemap-codec/-/sourcemap-codec-1.4.8.tgz", + "integrity": "sha512-9NykojV5Uih4lgo5So5dtw+f0JgJX30KCNI8gwhz2J9A15wD0Ml6tjHKwf6fTSa6fAdVBdZeNOs9eJ71qCk8vA==", + "peer": true + }, + "statuses": { + "version": "1.5.0", + "resolved": "https://registry.npmjs.org/statuses/-/statuses-1.5.0.tgz", + "integrity": "sha1-Fhx9rBd2Wf2YEfQ3cfqZOBR4Yow=" + }, + "toidentifier": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/toidentifier/-/toidentifier-1.0.1.tgz", + "integrity": "sha512-o5sSPKEkg/DIQNmH43V0/uerLrpzVedkUh8tGNvaeXpfpuwjKenlSox/2O/BTlZUtEe+JG7s5YhEz608PlAHRA==" + }, + "type-is": { + "version": "1.6.18", + "resolved": "https://registry.npmjs.org/type-is/-/type-is-1.6.18.tgz", + "integrity": "sha512-TkRKr9sUTxEH8MdfuCSP7VizJyzRNMjj2J2do2Jr3Kym598JVdEksuzPQCnlFPW4ky9Q+iA+ma9BGm06XQBy8g==", + "requires": { + "media-typer": "0.3.0", + "mime-types": "~2.1.24" + } + }, + "unpipe": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/unpipe/-/unpipe-1.0.0.tgz", + "integrity": "sha1-sr9O6FFKrmFltIF4KdIbLvSZBOw=" + }, + "utils-merge": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/utils-merge/-/utils-merge-1.0.1.tgz", + "integrity": "sha1-n5VxD1CiZ5R7LMwSR0HBAoQn5xM=" + }, + "vary": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/vary/-/vary-1.1.2.tgz", + "integrity": "sha1-IpnwLG3tMNSllhsLn3RSShj2NPw=" + }, + "vue": { + "version": "3.2.31", + "resolved": "https://registry.npmjs.org/vue/-/vue-3.2.31.tgz", + "integrity": "sha512-odT3W2tcffTiQCy57nOT93INw1auq5lYLLYtWpPYQQYQOOdHiqFct9Xhna6GJ+pJQaF67yZABraH47oywkJgFw==", + "peer": true, + "requires": { + "@vue/compiler-dom": "3.2.31", + "@vue/compiler-sfc": "3.2.31", + "@vue/runtime-dom": "3.2.31", + "@vue/server-renderer": "3.2.31", + "@vue/shared": "3.2.31" + } + }, + "vue-router": { + "version": "4.0.13", + "resolved": "https://registry.npmjs.org/vue-router/-/vue-router-4.0.13.tgz", + "integrity": "sha512-LmXrC+BkDRLak+d5xTMgUYraT3Nj0H/vCbP+7usGvIl9Viqd1UP6AsP0i69pSbn9O0dXK/xCdp4yPw21HqV9Jw==", + "requires": { + "@vue/devtools-api": "^6.0.0" + } + }, + "ws": { + "version": "8.2.3", + "resolved": "https://registry.npmjs.org/ws/-/ws-8.2.3.tgz", + "integrity": "sha512-wBuoj1BDpC6ZQ1B7DWQBYVLphPWkm8i9Y0/3YdHjHKHiohOJ1ws+3OccDWtH+PoC9DZD5WOTrJvNbWvjS6JWaA==", + "requires": {} + } + } +} diff --git a/package.json b/package.json new file mode 100644 index 0000000..7400938 --- /dev/null +++ b/package.json @@ -0,0 +1,19 @@ +{ + "name": "loveletter", + "version": "1.0.0", + "description": "", + "main": "index.js", + "scripts": { + "test": "echo \"Error: no test specified\" && exit 1", + "start": "node server.js", + "live": "nodemon server.js --ignore ./log/" + }, + "author": "", + "license": "ISC", + "dependencies": { + "cors": "^2.8.5", + "express": "^4.17.3", + "socket.io": "^4.4.1", + "vue-router": "^4.0.13" + } +} diff --git a/server.js b/server.js new file mode 100644 index 0000000..f824b35 --- /dev/null +++ b/server.js @@ -0,0 +1,44 @@ +const path = require('path') +const fs = require('fs') +const express = require('express') +const serverConfig = require('./config/serverConfig.js') // Server Config +const wrtColor = require('./components/common/wrtColor') + +//Http 80 Route traffic to the frontend VUE application running with HTTPS +const http = require('http') +const httpApp = express() +httpApp.all('*', (req, res) => res.redirect(301, `${serverConfig.frontEndUrl}`)) //301 - Moved Permanently +const httpServer = http.createServer(httpApp) +httpServer.listen(80, () => { + //console.log(`http redirectiong 80 to Vue front end at ${serverConfig.frontEndUrl}`) + wrtColor.green(`http redirectiong 80 to Vue front end at ${serverConfig.frontEndUrl}`) +}) + +//Https to run socket.io +const https = require('https') +const httpsApp = express() +const keyPath = fs.readFileSync(path.resolve(__dirname, `${serverConfig.certKeyPath}`)) +const certPath = fs.readFileSync(path.resolve(__dirname, `${serverConfig.certPath}`)) +const servOptions = { + key: keyPath, + cert: certPath +} +const httpsServer = https.createServer(servOptions,httpsApp) +httpsServer.listen(serverConfig.httpsPort, () => { + //console.log(`https listening on ${serverConfig.httpsPort} to handle socket.io requests`) + wrtColor.green(`https listening on ${serverConfig.httpsPort} to handle socket.io requests`) +}) + +// Attach Socket.IO to https server +const io = require('socket.io') (httpsServer, { + cors: { //https://socket.io/docs/v3/handling-cors/ + origin: `${serverConfig.frontEndUrl}`, + methods: ["GET", "POST"] + } +}) + +//load gameManagement +require('./components/serverMgmt') +//pass socket.io connections to socketHandler +const { socketHandler } = require('./components/serverMgmt.js') +socketHandler(io)