From f58da88801dbf9f44adf5a4f71ca977a3a96355e Mon Sep 17 00:00:00 2001 From: Benjamin Kraft Date: Sat, 18 Mar 2023 15:01:38 +0100 Subject: [PATCH] Init --- .gitignore | 1 + data/scripts/events.js | 33 -- data/scripts/init.js | 104 ----- changelog.txt => public/changelog.txt | 0 {data => public/data}/images/favicon.ico | Bin {data => public/data}/images/gem_border.png | Bin {data => public/data}/images/gem_content.png | Bin {data => public/data}/images/gem_full.png | Bin public/data/lib/socketiop2p.min.js | 4 + public/data/scripts/events.js | 14 + {data => public/data}/scripts/game.js | 94 ++-- public/data/scripts/init.js | 100 ++++ {data => public/data}/scripts/leaderboard.js | 10 +- {data => public/data}/scripts/online.js | 4 +- public/data/settings/get_port.php | 3 + {data => public/data}/settings/libraries.json | 0 {data => public/data}/settings/settings.json | 1 - {data => public/data}/styles/Tajawal/OFL.txt | 0 .../data}/styles/Tajawal/Tajawal-Black.ttf | Bin .../data}/styles/Tajawal/Tajawal-Bold.ttf | Bin .../styles/Tajawal/Tajawal-ExtraBold.ttf | Bin .../styles/Tajawal/Tajawal-ExtraLight.ttf | Bin .../data}/styles/Tajawal/Tajawal-Light.ttf | Bin .../data}/styles/Tajawal/Tajawal-Medium.ttf | Bin .../data}/styles/Tajawal/Tajawal-Regular.ttf | Bin {data => public/data}/styles/checkbox.css | 0 {data => public/data}/styles/color_picker.css | 0 {data => public/data}/styles/font.ttf | Bin {data => public/data}/styles/range_input.css | 0 index.html => public/index.html | 13 +- styles.css => public/styles.css | 0 public/thumbnail.png | Bin 0 -> 173102 bytes server/.gitignore | 3 + server/package-lock.json | 439 ++++++++++++++++++ server/package.json | 18 + server/src/chainreact.ts | 104 +++++ server/src/client.ts | 168 +++++++ server/src/definitions/serialized.d.ts | 20 + server/src/definitions/settings.d.ts | 74 +++ server/src/game_standard.ts | 37 ++ server/src/index.ts | 7 + server/src/logger.ts | 105 +++++ server/src/manager.ts | 148 ++++++ server/src/room.ts | 135 ++++++ server/src/start.ts | 39 ++ server/tsconfig.json | 11 + 46 files changed, 1488 insertions(+), 201 deletions(-) delete mode 100644 data/scripts/events.js delete mode 100644 data/scripts/init.js rename changelog.txt => public/changelog.txt (100%) rename {data => public/data}/images/favicon.ico (100%) rename {data => public/data}/images/gem_border.png (100%) rename {data => public/data}/images/gem_content.png (100%) rename {data => public/data}/images/gem_full.png (100%) create mode 100644 public/data/lib/socketiop2p.min.js create mode 100644 public/data/scripts/events.js rename {data => public/data}/scripts/game.js (85%) create mode 100644 public/data/scripts/init.js rename {data => public/data}/scripts/leaderboard.js (84%) rename {data => public/data}/scripts/online.js (99%) create mode 100644 public/data/settings/get_port.php rename {data => public/data}/settings/libraries.json (100%) rename {data => public/data}/settings/settings.json (95%) rename {data => public/data}/styles/Tajawal/OFL.txt (100%) rename {data => public/data}/styles/Tajawal/Tajawal-Black.ttf (100%) rename {data => public/data}/styles/Tajawal/Tajawal-Bold.ttf (100%) rename {data => public/data}/styles/Tajawal/Tajawal-ExtraBold.ttf (100%) rename {data => public/data}/styles/Tajawal/Tajawal-ExtraLight.ttf (100%) rename {data => public/data}/styles/Tajawal/Tajawal-Light.ttf (100%) rename {data => public/data}/styles/Tajawal/Tajawal-Medium.ttf (100%) rename {data => public/data}/styles/Tajawal/Tajawal-Regular.ttf (100%) rename {data => public/data}/styles/checkbox.css (100%) rename {data => public/data}/styles/color_picker.css (100%) rename {data => public/data}/styles/font.ttf (100%) rename {data => public/data}/styles/range_input.css (100%) rename index.html => public/index.html (91%) rename styles.css => public/styles.css (100%) create mode 100644 public/thumbnail.png create mode 100644 server/.gitignore create mode 100644 server/package-lock.json create mode 100644 server/package.json create mode 100644 server/src/chainreact.ts create mode 100644 server/src/client.ts create mode 100644 server/src/definitions/serialized.d.ts create mode 100644 server/src/definitions/settings.d.ts create mode 100644 server/src/game_standard.ts create mode 100644 server/src/index.ts create mode 100644 server/src/logger.ts create mode 100644 server/src/manager.ts create mode 100644 server/src/room.ts create mode 100644 server/src/start.ts create mode 100644 server/tsconfig.json diff --git a/.gitignore b/.gitignore index 485dee6..de03f38 100644 --- a/.gitignore +++ b/.gitignore @@ -1 +1,2 @@ .idea +.env diff --git a/data/scripts/events.js b/data/scripts/events.js deleted file mode 100644 index 652bc81..0000000 --- a/data/scripts/events.js +++ /dev/null @@ -1,33 +0,0 @@ -'use strict'; - -function keyPressed(){ - -} - -function keyReleased(){ - -} - -function mouseMoved(){ - -} - -function mouseDragged(){ - -} - -function mousePressed(){ - if (game) - if (!game.winId) - game.onMouseDown(); -} - -function mouseReleased(){ - -} - -window.onresize = () => { - let w = $('#canvas-holder').width(); - let h = $('#canvas-holder').height(); - resizeCanvas(w, h); -} \ No newline at end of file diff --git a/data/scripts/init.js b/data/scripts/init.js deleted file mode 100644 index 87bebc0..0000000 --- a/data/scripts/init.js +++ /dev/null @@ -1,104 +0,0 @@ -'use strict'; - -let projectName = "chainreact"; - -let debug = false, - productionMode = false, - font, - localSettings, - loader; - -//Only for online games -let socket; - -let game; -let gemContentImage; -let gemBorderImage; -let gemContentGraphics = {}; - -let antiCacheQuery = '?_=' + new Date().getTime(); - -function preload(){ - localSettings = loadJSON('data/settings/settings.json' + antiCacheQuery, json => { - console.log('Local settings loaded: ', json); - }, error => { - console.log('Local settings failed: ', error); - }); - - font = loadFont('data/styles/Tajawal/Tajawal-Regular.ttf', json => { - console.log('Local font loaded: ', json); - }, error => { - console.log('Local font failed: ', error); - }); - - gemContentImage = loadImage('data/images/gem_content.png', img => { - console.log('Image loaded: ', img); - }, error => { - console.log('Image failed: ' , error); - }); - - gemBorderImage = loadImage('data/images/gem_border.png', img => { - console.log('Image loaded: ', img); - }, error => { - console.log('Image failed: ' , error); - }); - - loadJSON('data/settings/libraries.json' + antiCacheQuery, json => { - loadScripts(json) - console.log('BenjoCraeft library scripts loaded: ', json) - }); -} - -function setup(){ - canvasSetup(); - interfaceSetup(); -} - -function draw(){ - background(0, 0, 10); - - if (game){ - game.display(); - game.update(); - } - - if (loader){ - loader.update(); - loader.display(); - } - - if (debug) debugInformation(); -} - -function canvasSetup(){ - setFrameRate(60); - let w = $('#canvas-holder').width(), - h = $('#canvas-holder').height(); - let canvas = createCanvas(w, h); - canvas.parent('canvas-holder'); - textFont(font); - textAlign(CENTER, CENTER); - imageMode(CENTER); - colorMode(HSB); -} - -function interfaceSetup(){ - window.onresize(); - setInterval(() => window.onresize(), 500); - $('#version').html(localSettings.project.version); - $('#start_feedback, #give_feedback').attr('disabled', 'disabled'); - nameTyped($('#main > input')); - - $('#main').fadeIn(menuesFadeTime); -} - -function loadScripts(libs){ - for (let script in libs){ - if (libs[script]){ - let url = '/lib/benjocraeft/' + script + '.js' - $.getScript(url, () => { - console.log('Successfully loaded script: ', url) - }); - } - } -} \ No newline at end of file diff --git a/changelog.txt b/public/changelog.txt similarity index 100% rename from changelog.txt rename to public/changelog.txt diff --git a/data/images/favicon.ico b/public/data/images/favicon.ico similarity index 100% rename from data/images/favicon.ico rename to public/data/images/favicon.ico diff --git a/data/images/gem_border.png b/public/data/images/gem_border.png similarity index 100% rename from data/images/gem_border.png rename to public/data/images/gem_border.png diff --git a/data/images/gem_content.png b/public/data/images/gem_content.png similarity index 100% rename from data/images/gem_content.png rename to public/data/images/gem_content.png diff --git a/data/images/gem_full.png b/public/data/images/gem_full.png similarity index 100% rename from data/images/gem_full.png rename to public/data/images/gem_full.png diff --git a/public/data/lib/socketiop2p.min.js b/public/data/lib/socketiop2p.min.js new file mode 100644 index 0000000..8c23f87 --- /dev/null +++ b/public/data/lib/socketiop2p.min.js @@ -0,0 +1,4 @@ +(function(e){if(typeof exports==="object"&&typeof module!=="undefined"){module.exports=e()}else if(typeof define==="function"&&define.amd){define([],e)}else{var t;if(typeof window!=="undefined"){t=window}else if(typeof global!=="undefined"){t=global}else if(typeof self!=="undefined"){t=self}else{t=this}t.P2P=e()}})(function(){var e,t,r;return function n(e,t,r){function i(a,s){if(!t[a]){if(!e[a]){var f=typeof require=="function"&&require;if(!s&&f)return f(a,!0);if(o)return o(a,!0);var c=new Error("Cannot find module '"+a+"'");throw c.code="MODULE_NOT_FOUND",c}var u=t[a]={exports:{}};e[a][0].call(u.exports,function(t){var r=e[a][1][t];return i(r?r:t)},u,u.exports,n,e,t,r)}return t[a].exports}var o=typeof require=="function"&&require;for(var a=0;aa)throw new RangeError("Attempt to allocate Buffer larger than maximum "+"size: 0x"+a.toString(16)+" bytes");if(i<0)i=0;else i>>>=0;var c=this;if(f.TYPED_ARRAY_SUPPORT){c=f._augment(new Uint8Array(i))}else{c.length=i;c._isBuffer=true}var u;if(f.TYPED_ARRAY_SUPPORT&&typeof e.byteLength==="number"){c._set(e)}else if(P(e)){if(f.isBuffer(e)){for(u=0;u0&&i<=f.poolSize)c.parent=s;return c}function c(e,t,r){if(!(this instanceof c))return new c(e,t,r);var n=new f(e,t,r);delete n.parent;return n}f.isBuffer=function(e){return!!(e!=null&&e._isBuffer)};f.compare=function(e,t){if(!f.isBuffer(e)||!f.isBuffer(t))throw new TypeError("Arguments must be Buffers");if(e===t)return 0;var r=e.length;var n=t.length;for(var i=0,o=Math.min(r,n);i>>1;break;case"utf8":case"utf-8":r=j(e).length;break;case"base64":r=O(e).length;break;default:r=e.length}return r};f.prototype.length=undefined;f.prototype.parent=undefined;f.prototype.toString=function(e,t,r){var n=false;t=t>>>0;r=r===undefined||r===Infinity?this.length:r>>>0;if(!e)e="utf8";if(t<0)t=0;if(r>this.length)r=this.length;if(r<=t)return"";while(true){switch(e){case"hex":return w(this,t,r);case"utf8":case"utf-8":return b(this,t,r);case"ascii":return y(this,t,r);case"binary":return m(this,t,r);case"base64":return v(this,t,r);case"ucs2":case"ucs-2":case"utf16le":case"utf-16le":return _(this,t,r);default:if(n)throw new TypeError("Unknown encoding: "+e);e=(e+"").toLowerCase();n=true}}};f.prototype.equals=function(e){if(!f.isBuffer(e))throw new TypeError("Argument must be a Buffer");if(this===e)return true;return f.compare(this,e)===0};f.prototype.inspect=function(){var e="";var t=r.INSPECT_MAX_BYTES;if(this.length>0){e=this.toString("hex",0,t).match(/.{2}/g).join(" ");if(this.length>t)e+=" ... "}return""};f.prototype.compare=function(e){if(!f.isBuffer(e))throw new TypeError("Argument must be a Buffer");if(this===e)return 0;return f.compare(this,e)};f.prototype.get=function(e){console.log(".get() is deprecated. Access using array indexes instead.");return this.readUInt8(e)};f.prototype.set=function(e,t){console.log(".set() is deprecated. Access using array indexes instead.");return this.writeUInt8(e,t)};function u(e,t,r,n){r=Number(r)||0;var i=e.length-r;if(!n){n=i}else{n=Number(n);if(n>i){n=i}}var o=t.length;if(o%2!==0)throw new Error("Invalid hex string");if(n>o/2){n=o/2}for(var a=0;athis.length)throw new RangeError("attempt to write outside buffer bounds");var o=this.length-t;if(!r){r=o}else{r=Number(r);if(r>o){r=o}}n=String(n||"utf8").toLowerCase();var a;switch(n){case"hex":a=u(this,e,t,r);break;case"utf8":case"utf-8":a=l(this,e,t,r);break;case"ascii":a=h(this,e,t,r);break;case"binary":a=d(this,e,t,r);break;case"base64":a=p(this,e,t,r);break;case"ucs2":case"ucs-2":case"utf16le":case"utf-16le":a=g(this,e,t,r);break;default:throw new TypeError("Unknown encoding: "+n)}return a};f.prototype.toJSON=function(){return{type:"Buffer",data:Array.prototype.slice.call(this._arr||this,0)}};function v(e,t,r){if(t===0&&r===e.length){return n.fromByteArray(e)}else{return n.fromByteArray(e.slice(t,r))}}function b(e,t,r){var n="";var i="";r=Math.min(e.length,r);for(var o=t;on)r=n;var i="";for(var o=t;or){e=r}if(t<0){t+=r;if(t<0)t=0}else if(t>r){t=r}if(tr)throw new RangeError("Trying to access beyond buffer length")}f.prototype.readUIntLE=function(e,t,r){e=e>>>0;t=t>>>0;if(!r)E(e,t,this.length);var n=this[e];var i=1;var o=0;while(++o>>0;t=t>>>0;if(!r)E(e,t,this.length);var n=this[e+--t];var i=1;while(t>0&&(i*=256))n+=this[e+--t]*i;return n};f.prototype.readUInt8=function(e,t){if(!t)E(e,1,this.length);return this[e]};f.prototype.readUInt16LE=function(e,t){if(!t)E(e,2,this.length);return this[e]|this[e+1]<<8};f.prototype.readUInt16BE=function(e,t){if(!t)E(e,2,this.length);return this[e]<<8|this[e+1]};f.prototype.readUInt32LE=function(e,t){if(!t)E(e,4,this.length);return(this[e]|this[e+1]<<8|this[e+2]<<16)+this[e+3]*16777216};f.prototype.readUInt32BE=function(e,t){if(!t)E(e,4,this.length);return this[e]*16777216+(this[e+1]<<16|this[e+2]<<8|this[e+3])};f.prototype.readIntLE=function(e,t,r){e=e>>>0;t=t>>>0;if(!r)E(e,t,this.length);var n=this[e];var i=1;var o=0;while(++o=i)n-=Math.pow(2,8*t);return n};f.prototype.readIntBE=function(e,t,r){e=e>>>0;t=t>>>0;if(!r)E(e,t,this.length);var n=t;var i=1;var o=this[e+--n];while(n>0&&(i*=256))o+=this[e+--n]*i;i*=128;if(o>=i)o-=Math.pow(2,8*t);return o};f.prototype.readInt8=function(e,t){if(!t)E(e,1,this.length);if(!(this[e]&128))return this[e];return(255-this[e]+1)*-1};f.prototype.readInt16LE=function(e,t){if(!t)E(e,2,this.length);var r=this[e]|this[e+1]<<8;return r&32768?r|4294901760:r};f.prototype.readInt16BE=function(e,t){if(!t)E(e,2,this.length);var r=this[e+1]|this[e]<<8;return r&32768?r|4294901760:r};f.prototype.readInt32LE=function(e,t){if(!t)E(e,4,this.length);return this[e]|this[e+1]<<8|this[e+2]<<16|this[e+3]<<24};f.prototype.readInt32BE=function(e,t){if(!t)E(e,4,this.length);return this[e]<<24|this[e+1]<<16|this[e+2]<<8|this[e+3]};f.prototype.readFloatLE=function(e,t){if(!t)E(e,4,this.length);return i.read(this,e,true,23,4)};f.prototype.readFloatBE=function(e,t){if(!t)E(e,4,this.length);return i.read(this,e,false,23,4)};f.prototype.readDoubleLE=function(e,t){if(!t)E(e,8,this.length);return i.read(this,e,true,52,8)};f.prototype.readDoubleBE=function(e,t){if(!t)E(e,8,this.length);return i.read(this,e,false,52,8)};function A(e,t,r,n,i,o){if(!f.isBuffer(e))throw new TypeError("buffer must be a Buffer instance");if(t>i||te.length)throw new RangeError("index out of range")}f.prototype.writeUIntLE=function(e,t,r,n){e=+e;t=t>>>0;r=r>>>0;if(!n)A(this,e,t,r,Math.pow(2,8*r),0);var i=1;var o=0;this[t]=e&255;while(++o>>0&255;return t+r};f.prototype.writeUIntBE=function(e,t,r,n){e=+e;t=t>>>0;r=r>>>0;if(!n)A(this,e,t,r,Math.pow(2,8*r),0);var i=r-1;var o=1;this[t+i]=e&255;while(--i>=0&&(o*=256))this[t+i]=e/o>>>0&255;return t+r};f.prototype.writeUInt8=function(e,t,r){e=+e;t=t>>>0;if(!r)A(this,e,t,1,255,0);if(!f.TYPED_ARRAY_SUPPORT)e=Math.floor(e);this[t]=e;return t+1};function C(e,t,r,n){if(t<0)t=65535+t+1;for(var i=0,o=Math.min(e.length-r,2);i>>(n?i:1-i)*8}}f.prototype.writeUInt16LE=function(e,t,r){e=+e;t=t>>>0;if(!r)A(this,e,t,2,65535,0);if(f.TYPED_ARRAY_SUPPORT){this[t]=e;this[t+1]=e>>>8}else C(this,e,t,true);return t+2};f.prototype.writeUInt16BE=function(e,t,r){e=+e;t=t>>>0;if(!r)A(this,e,t,2,65535,0);if(f.TYPED_ARRAY_SUPPORT){this[t]=e>>>8;this[t+1]=e}else C(this,e,t,false);return t+2};function k(e,t,r,n){if(t<0)t=4294967295+t+1;for(var i=0,o=Math.min(e.length-r,4);i>>(n?i:3-i)*8&255}}f.prototype.writeUInt32LE=function(e,t,r){e=+e;t=t>>>0;if(!r)A(this,e,t,4,4294967295,0);if(f.TYPED_ARRAY_SUPPORT){this[t+3]=e>>>24;this[t+2]=e>>>16;this[t+1]=e>>>8;this[t]=e}else k(this,e,t,true);return t+4};f.prototype.writeUInt32BE=function(e,t,r){e=+e;t=t>>>0;if(!r)A(this,e,t,4,4294967295,0);if(f.TYPED_ARRAY_SUPPORT){this[t]=e>>>24;this[t+1]=e>>>16;this[t+2]=e>>>8;this[t+3]=e}else k(this,e,t,false);return t+4};f.prototype.writeIntLE=function(e,t,r,n){e=+e;t=t>>>0;if(!n){A(this,e,t,r,Math.pow(2,8*r-1)-1,-Math.pow(2,8*r-1))}var i=0;var o=1;var a=e<0?1:0;this[t]=e&255;while(++i>0)-a&255;return t+r};f.prototype.writeIntBE=function(e,t,r,n){e=+e;t=t>>>0;if(!n){A(this,e,t,r,Math.pow(2,8*r-1)-1,-Math.pow(2,8*r-1))}var i=r-1;var o=1;var a=e<0?1:0;this[t+i]=e&255;while(--i>=0&&(o*=256))this[t+i]=(e/o>>0)-a&255;return t+r};f.prototype.writeInt8=function(e,t,r){e=+e;t=t>>>0;if(!r)A(this,e,t,1,127,-128);if(!f.TYPED_ARRAY_SUPPORT)e=Math.floor(e);if(e<0)e=255+e+1;this[t]=e;return t+1};f.prototype.writeInt16LE=function(e,t,r){e=+e;t=t>>>0;if(!r)A(this,e,t,2,32767,-32768);if(f.TYPED_ARRAY_SUPPORT){this[t]=e;this[t+1]=e>>>8}else C(this,e,t,true);return t+2};f.prototype.writeInt16BE=function(e,t,r){e=+e;t=t>>>0;if(!r)A(this,e,t,2,32767,-32768);if(f.TYPED_ARRAY_SUPPORT){this[t]=e>>>8;this[t+1]=e}else C(this,e,t,false);return t+2};f.prototype.writeInt32LE=function(e,t,r){e=+e;t=t>>>0;if(!r)A(this,e,t,4,2147483647,-2147483648);if(f.TYPED_ARRAY_SUPPORT){this[t]=e;this[t+1]=e>>>8;this[t+2]=e>>>16;this[t+3]=e>>>24}else k(this,e,t,true);return t+4};f.prototype.writeInt32BE=function(e,t,r){e=+e;t=t>>>0;if(!r)A(this,e,t,4,2147483647,-2147483648);if(e<0)e=4294967295+e+1;if(f.TYPED_ARRAY_SUPPORT){this[t]=e>>>24;this[t+1]=e>>>16;this[t+2]=e>>>8;this[t+3]=e}else k(this,e,t,false);return t+4};function S(e,t,r,n,i,o){if(t>i||te.length)throw new RangeError("index out of range");if(r<0)throw new RangeError("index out of range")}function R(e,t,r,n,o){if(!o)S(e,t,r,4,3.4028234663852886e38,-3.4028234663852886e38);i.write(e,t,r,n,23,4);return r+4}f.prototype.writeFloatLE=function(e,t,r){return R(this,e,t,true,r)};f.prototype.writeFloatBE=function(e,t,r){return R(this,e,t,false,r)};function T(e,t,r,n,o){if(!o)S(e,t,r,8,1.7976931348623157e308,-1.7976931348623157e308);i.write(e,t,r,n,52,8);return r+8}f.prototype.writeDoubleLE=function(e,t,r){return T(this,e,t,true,r)};f.prototype.writeDoubleBE=function(e,t,r){return T(this,e,t,false,r)};f.prototype.copy=function(e,t,r,n){var i=this;if(!r)r=0;if(!n&&n!==0)n=this.length;if(t>=e.length)t=e.length;if(!t)t=0;if(n>0&&n=i.length)throw new RangeError("sourceStart out of bounds");if(n<0)throw new RangeError("sourceEnd out of bounds");if(n>this.length)n=this.length;if(e.length-t=this.length)throw new RangeError("start out of bounds");if(r<0||r>this.length)throw new RangeError("end out of bounds");var n;if(typeof e==="number"){for(n=t;n55295&&r<57344){if(i){if(r<56320){if((t-=3)>-1)o.push(239,191,189);i=r;continue}else{r=i-55296<<10|r-56320|65536;i=null}}else{if(r>56319){if((t-=3)>-1)o.push(239,191,189);continue}else if(a+1===n){if((t-=3)>-1)o.push(239,191,189);continue}else{i=r;continue}}}else if(i){if((t-=3)>-1)o.push(239,191,189);i=null}if(r<128){if((t-=1)<0)break;o.push(r)}else if(r<2048){if((t-=2)<0)break;o.push(r>>6|192,r&63|128)}else if(r<65536){if((t-=3)<0)break;o.push(r>>12|224,r>>6&63|128,r&63|128)}else if(r<2097152){if((t-=4)<0)break;o.push(r>>18|240,r>>12&63|128,r>>6&63|128,r&63|128)}else{throw new Error("Invalid code point")}}return o}function U(e){var t=[];for(var r=0;r>8;i=r%256;o.push(i);o.push(n)}return o}function O(e){return n.toByteArray(B(e))}function D(e,t,r,n){for(var i=0;i=t.length||i>=e.length)break;t[i+r]=e[i]}return i}function Y(e){try{return decodeURIComponent(e)}catch(t){return String.fromCharCode(65533)}}},{"base64-js":3,ieee754:4,"is-array":5}],3:[function(e,t,r){var n="ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/";(function(e){"use strict";var t=typeof Uint8Array!=="undefined"?Uint8Array:Array;var r="+".charCodeAt(0);var i="/".charCodeAt(0);var o="0".charCodeAt(0);var a="a".charCodeAt(0);var s="A".charCodeAt(0);var f="-".charCodeAt(0);var c="_".charCodeAt(0);function u(e){var t=e.charCodeAt(0);if(t===r||t===f)return 62;if(t===i||t===c)return 63;if(t0){throw new Error("Invalid string. Length must be a multiple of 4")}var f=e.length;a="="===e.charAt(f-2)?2:"="===e.charAt(f-1)?1:0;s=new t(e.length*3/4-a);i=a>0?e.length-4:e.length;var c=0;function l(e){s[c++]=e}for(r=0,n=0;r>16);l((o&65280)>>8);l(o&255)}if(a===2){o=u(e.charAt(r))<<2|u(e.charAt(r+1))>>4;l(o&255)}else if(a===1){o=u(e.charAt(r))<<10|u(e.charAt(r+1))<<4|u(e.charAt(r+2))>>2;l(o>>8&255);l(o&255)}return s}function h(e){var t,r=e.length%3,i="",o,a;function s(e){return n.charAt(e)}function f(e){return s(e>>18&63)+s(e>>12&63)+s(e>>6&63)+s(e&63)}for(t=0,a=e.length-r;t>2);i+=s(o<<4&63);i+="==";break;case 2:o=(e[e.length-2]<<8)+e[e.length-1];i+=s(o>>10);i+=s(o>>4&63);i+=s(o<<2&63);i+="=";break}return i}e.toByteArray=l;e.fromByteArray=h})(typeof r==="undefined"?this.base64js={}:r)},{}],4:[function(e,t,r){r.read=function(e,t,r,n,i){var o,a,s=i*8-n-1,f=(1<>1,u=-7,l=r?i-1:0,h=r?-1:1,d=e[t+l];l+=h;o=d&(1<<-u)-1;d>>=-u;u+=s;for(;u>0;o=o*256+e[t+l],l+=h,u-=8);a=o&(1<<-u)-1;o>>=-u;u+=n;for(;u>0;a=a*256+e[t+l],l+=h,u-=8);if(o===0){o=1-c}else if(o===f){return a?NaN:(d?-1:1)*Infinity}else{a=a+Math.pow(2,n);o=o-c}return(d?-1:1)*a*Math.pow(2,o-n)};r.write=function(e,t,r,n,i,o){var a,s,f,c=o*8-i-1,u=(1<>1,h=i===23?Math.pow(2,-24)-Math.pow(2,-77):0,d=n?0:o-1,p=n?1:-1,g=t<0||t===0&&1/t<0?1:0;t=Math.abs(t);if(isNaN(t)||t===Infinity){s=isNaN(t)?1:0;a=u}else{a=Math.floor(Math.log(t)/Math.LN2);if(t*(f=Math.pow(2,-a))<1){a--;f*=2}if(a+l>=1){t+=h/f}else{t+=h*Math.pow(2,1-l)}if(t*f>=2){a++;f/=2}if(a+l>=u){s=0;a=u}else if(a+l>=1){s=(t*f-1)*Math.pow(2,i);a=a+l}else{s=t*Math.pow(2,l-1)*Math.pow(2,i);a=0}}for(;i>=8;e[r+d]=s&255,d+=p,s/=256,i-=8);a=a<0;e[r+d]=a&255,d+=p,a/=256,c-=8);e[r+d-p]|=g*128}},{}],5:[function(e,t,r){var n=Array.isArray;var i=Object.prototype.toString;t.exports=n||function(e){return!!e&&"[object Array]"==i.call(e)}},{}],6:[function(e,t,r){function n(){this._events=this._events||{};this._maxListeners=this._maxListeners||undefined}t.exports=n;n.EventEmitter=n;n.prototype._events=undefined;n.prototype._maxListeners=undefined;n.defaultMaxListeners=10;n.prototype.setMaxListeners=function(e){if(!o(e)||e<0||isNaN(e))throw TypeError("n must be a positive number");this._maxListeners=e;return this};n.prototype.emit=function(e){var t,r,n,o,f,c;if(!this._events)this._events={};if(e==="error"){if(!this._events.error||a(this._events.error)&&!this._events.error.length){t=arguments[1];if(t instanceof Error){throw t}throw TypeError('Uncaught, unspecified "error" event.')}}r=this._events[e];if(s(r))return false;if(i(r)){switch(arguments.length){case 1:r.call(this);break;case 2:r.call(this,arguments[1]);break;case 3:r.call(this,arguments[1],arguments[2]);break;default:n=arguments.length;o=new Array(n-1);for(f=1;f0&&this._events[e].length>r){this._events[e].warned=true;console.error("(node) warning: possible EventEmitter memory "+"leak detected. %d listeners added. "+"Use emitter.setMaxListeners() to increase limit.",this._events[e].length);if(typeof console.trace==="function"){console.trace()}}}return this};n.prototype.on=n.prototype.addListener;n.prototype.once=function(e,t){if(!i(t))throw TypeError("listener must be a function");var r=false;function n(){this.removeListener(e,n);if(!r){r=true;t.apply(this,arguments)}}n.listener=t;this.on(e,n);return this};n.prototype.removeListener=function(e,t){var r,n,o,s;if(!i(t))throw TypeError("listener must be a function");if(!this._events||!this._events[e])return this;r=this._events[e];o=r.length;n=-1;if(r===t||i(r.listener)&&r.listener===t){delete this._events[e];if(this._events.removeListener)this.emit("removeListener",e,t)}else if(a(r)){for(s=o;s-->0;){if(r[s]===t||r[s].listener&&r[s].listener===t){n=s;break}}if(n<0)return this;if(r.length===1){r.length=0;delete this._events[e]}else{r.splice(n,1)}if(this._events.removeListener)this.emit("removeListener",e,t)}return this};n.prototype.removeAllListeners=function(e){var t,r;if(!this._events)return this;if(!this._events.removeListener){if(arguments.length===0)this._events={};else if(this._events[e])delete this._events[e];return this}if(arguments.length===0){for(t in this._events){if(t==="removeListener")continue;this.removeAllListeners(t)}this.removeAllListeners("removeListener");this._events={};return this}r=this._events[e];if(i(r)){this.removeListener(e,r)}else{while(r.length)this.removeListener(e,r[r.length-1])}delete this._events[e];return this};n.prototype.listeners=function(e){var t;if(!this._events||!this._events[e])t=[];else if(i(this._events[e]))t=[this._events[e]];else t=this._events[e].slice();return t};n.listenerCount=function(e,t){var r;if(!e._events||!e._events[t])r=0;else if(i(e._events[t]))r=1;else r=e._events[t].length;return r};function i(e){return typeof e==="function"}function o(e){return typeof e==="number"}function a(e){return typeof e==="object"&&e!==null}function s(e){return e===void 0}},{}],7:[function(e,t,r){if(typeof Object.create==="function"){t.exports=function n(e,t){e.super_=t;e.prototype=Object.create(t.prototype,{constructor:{value:e,enumerable:false,writable:true,configurable:true}})}}else{t.exports=function i(e,t){e.super_=t;var r=function(){};r.prototype=t.prototype;e.prototype=new r;e.prototype.constructor=e}}},{}],8:[function(e,t,r){t.exports=Array.isArray||function(e){return Object.prototype.toString.call(e)=="[object Array]"}},{}],9:[function(e,t,r){var n=t.exports={};var i=[];var o=false;function a(){if(o){return}o=true;var e;var t=i.length;while(t){e=i;i=[];var r=-1;while(++r0){if(t.ended&&!i){var a=new Error("stream.push() after EOF");e.emit("error",a)}else if(t.endEmitted&&i){var a=new Error("stream.unshift() after end event");e.emit("error",a)}else{if(t.decoder&&!i&&!n)r=t.decoder.write(r);if(!i)t.reading=false;if(t.flowing&&t.length===0&&!t.sync){e.emit("data",r);e.read(0)}else{t.length+=t.objectMode?1:r.length;if(i)t.buffer.unshift(r);else t.buffer.push(r);if(t.needReadable)m(e)}_(e,t)}}else if(!i){t.reading=false}return d(t)}function d(e){return!e.ended&&(e.needReadable||e.length=p){e=p}else{e--;for(var t=1;t<32;t<<=1)e|=e>>t;e++}return e}function v(e,t){if(t.length===0&&t.ended)return 0;if(t.objectMode)return e===0?0:1;if(isNaN(e)||s.isNull(e)){if(t.flowing&&t.buffer.length)return t.buffer[0].length;else return t.length}if(e<=0)return 0;if(e>t.highWaterMark)t.highWaterMark=g(e);if(e>t.length){if(!t.ended){t.needReadable=true;return 0}else return t.length}return e}l.prototype.read=function(e){c("read",e);var t=this._readableState;var r=e;if(!s.isNumber(e)||e>0)t.emittedReadable=false;if(e===0&&t.needReadable&&(t.length>=t.highWaterMark||t.ended)){c("read: emitReadable",t.length,t.ended);if(t.length===0&&t.ended)T(this);else m(this);return null}e=v(e,t);if(e===0&&t.ended){if(t.length===0)T(this);return null}var n=t.needReadable;c("need readable",n);if(t.length===0||t.length-e0)i=R(e,t);else i=null;if(s.isNull(i)){t.needReadable=true;e=0}t.length-=e;if(t.length===0&&!t.ended)t.needReadable=true;if(r!==e&&t.ended&&t.length===0)T(this);if(!s.isNull(i))this.emit("data",i);return i};function b(e,t){var r=null;if(!s.isBuffer(t)&&!s.isString(t)&&!s.isNullOrUndefined(t)&&!e.objectMode){r=new TypeError("Invalid non-string/buffer chunk")}return r}function y(e,t){if(t.decoder&&!t.ended){var r=t.decoder.end();if(r&&r.length){t.buffer.push(r);t.length+=t.objectMode?1:r.length}}t.ended=true;m(e)}function m(e){var t=e._readableState;t.needReadable=false;if(!t.emittedReadable){c("emitReadable",t.flowing);t.emittedReadable=true;if(t.sync)r.nextTick(function(){w(e)});else w(e)}}function w(e){c("emit readable");e.emit("readable");S(e)}function _(e,t){if(!t.readingMore){t.readingMore=true;r.nextTick(function(){E(e,t)})}}function E(e,t){var r=t.length;while(!t.reading&&!t.flowing&&!t.ended&&t.length=n){if(o)s=r.join("");else s=i.concat(r,n);r.length=0}else{if(e0)throw new Error("endReadable called on non-empty stream");if(!t.endEmitted){t.ended=true;r.nextTick(function(){if(!t.endEmitted&&t.length===0){t.endEmitted=true;e.readable=false;e.emit("end")}})}}function I(e,t){for(var r=0,n=e.length;r1){var r=[];for(var n=0;n=this.charLength-this.charReceived?this.charLength-this.charReceived:e.length;e.copy(this.charBuffer,this.charReceived,0,r);this.charReceived+=r;if(this.charReceived=55296&&n<=56319){this.charLength+=this.surrogateSize;t="";continue}this.charReceived=this.charLength=0;if(e.length===0){return t}break}this.detectIncompleteChar(e);var i=e.length;if(this.charLength){e.copy(this.charBuffer,0,e.length-this.charReceived,i);i-=this.charReceived}t+=e.toString(this.encoding,0,i);var i=t.length-1;var n=t.charCodeAt(i);if(n>=55296&&n<=56319){var o=this.surrogateSize;this.charLength+=o;this.charReceived+=o;this.charBuffer.copy(this.charBuffer,o,0,o);e.copy(this.charBuffer,0,0,o);return t.substring(0,i)}return t};a.prototype.detectIncompleteChar=function(e){var t=e.length>=3?3:e.length;for(;t>0;t--){var r=e[e.length-t];if(t==1&&r>>5==6){this.charLength=2;break}if(t<=2&&r>>4==14){this.charLength=3;break}if(t<=3&&r>>3==30){this.charLength=4;break}}this.charReceived=t};a.prototype.end=function(e){var t="";if(e&&e.length)t=this.write(e);if(this.charReceived){var r=this.charReceived;var n=this.charBuffer;var i=this.encoding;t+=n.slice(0,r).toString(i)}return t};function s(e){return e.toString(this.encoding)}function f(e){this.charReceived=e.length%2;this.charLength=this.charReceived?2:0}function c(e){this.charReceived=e.length%3;this.charLength=this.charReceived?3:0}},{buffer:2}],23:[function(e,t,r){var n=[].slice;t.exports=function(e,t){if("string"==typeof t)t=e[t];if("function"!=typeof t)throw new Error("bind() requires a function");var r=n.call(arguments,2);return function(){return t.apply(e,r.concat(n.call(arguments)))}}},{}],24:[function(e,t,r){t.exports=n;function n(e){if(e)return i(e)}function i(e){for(var t in n.prototype){e[t]=n.prototype[t]}return e}n.prototype.on=n.prototype.addEventListener=function(e,t){this._callbacks=this._callbacks||{};(this._callbacks["$"+e]=this._callbacks["$"+e]||[]).push(t);return this};n.prototype.once=function(e,t){function r(){this.off(e,r);t.apply(this,arguments)}r.fn=t;this.on(e,r);return this};n.prototype.off=n.prototype.removeListener=n.prototype.removeAllListeners=n.prototype.removeEventListener=function(e,t){this._callbacks=this._callbacks||{};if(0==arguments.length){this._callbacks={};return this}var r=this._callbacks["$"+e];if(!r)return this;if(1==arguments.length){delete this._callbacks["$"+e];return this}var n;for(var i=0;i=31}r.formatters.j=function(e){return JSON.stringify(e)};function i(){var e=arguments;var t=this.useColors;e[0]=(t?"%c":"")+this.namespace+(t?" %c":" ")+e[0]+(t?"%c ":" ")+"+"+r.humanize(this.diff);if(!t)return e;var n="color: "+this.color;e=[e[0],n,"color: inherit"].concat(Array.prototype.slice.call(e,1));var i=0;var o=0;e[0].replace(/%[a-z%]/g,function(e){if("%%"===e)return;i++;if("%c"===e){o=i}});e.splice(o,0,n);return e}function o(){return"object"===typeof console&&console.log&&Function.prototype.apply.call(console.log,console,arguments)}function a(e){try{if(null==e){r.storage.removeItem("debug")}else{r.storage.debug=e}}catch(t){}}function s(){var e;try{e=r.storage.debug}catch(t){}return e}r.enable(s());function f(){try{return window.localStorage}catch(e){}}},{"./debug":26}],26:[function(e,t,r){r=t.exports=a;r.coerce=u;r.disable=f;r.enable=s;r.enabled=c;r.humanize=e("ms");r.names=[];r.skips=[];r.formatters={};var n=0;var i;function o(){return r.colors[n++%r.colors.length]}function a(e){function t(){}t.enabled=false;function n(){var e=n;var t=+new Date;var a=t-(i||t);e.diff=a;e.prev=i;e.curr=t;i=t;if(null==e.useColors)e.useColors=r.useColors();if(null==e.color&&e.useColors)e.color=o();var s=Array.prototype.slice.call(arguments);s[0]=r.coerce(s[0]);if("string"!==typeof s[0]){s=["%o"].concat(s)}var f=0;s[0]=s[0].replace(/%([a-z%])/g,function(t,n){if(t==="%%")return t;f++;var i=r.formatters[n];if("function"===typeof i){var o=s[f];t=i.call(e,o);s.splice(f,1);f--}return t});if("function"===typeof r.formatArgs){s=r.formatArgs.apply(e,s)}var c=n.log||r.log||console.log.bind(console);c.apply(e,s)}n.enabled=true;var a=r.enabled(e)?n:t;a.namespace=e;return a}function s(e){r.save(e);var t=(e||"").split(/[\s,]+/);var n=t.length;for(var i=0;i1e4)return;var t=/^((?:\d+)?\.?\d+) *(milliseconds?|msecs?|ms|seconds?|secs?|s|minutes?|mins?|m|hours?|hrs?|h|days?|d|years?|yrs?|y)?$/i.exec(e);if(!t)return;var r=parseFloat(t[1]);var f=(t[2]||"ms").toLowerCase();switch(f){case"years":case"year":case"yrs":case"yr":case"y":return r*s;case"days":case"day":case"d":return r*a;case"hours":case"hour":case"hrs":case"hr":case"h":return r*o;case"minutes":case"minute":case"mins":case"min":case"m":return r*i;case"seconds":case"second":case"secs":case"sec":case"s":return r*n;case"milliseconds":case"millisecond":case"msecs":case"msec":case"ms":return r}}function c(e){if(e>=a)return Math.round(e/a)+"d";if(e>=o)return Math.round(e/o)+"h";if(e>=i)return Math.round(e/i)+"m";if(e>=n)return Math.round(e/n)+"s";return e+"ms"}function u(e){return l(e,a,"day")||l(e,o,"hour")||l(e,i,"minute")||l(e,n,"second")||e+" ms"}function l(e,t,r){if(e=Math.pow(2,e)){return n(e,t)}else return a};n.rack=function(e,t,r){var i=function(i){var a=0;do{if(a++>10){if(r)e+=r;else throw new Error("too many ID collisions, use more bits")}var s=n(e,t)}while(Object.hasOwnProperty.call(o,s));o[s]=i;return s};var o=i.hats={};i.get=function(e){return i.hats[e]};i.set=function(e,t){i.hats[e]=t;return i};i.bits=e||128;i.base=t||16;return i}},{}],32:[function(e,t,r){arguments[4][7][0].apply(r,arguments)},{dup:7}],33:[function(e,t,r){(function(r){t.exports=l;var n=e("debug")("simple-peer");var i=e("get-browser-rtc");var o=e("hat");var a=e("inherits");var s=e("is-typedarray");var f=e("once");var c=e("stream");var u=e("typedarray-to-buffer");a(l,c.Duplex);function l(e){var t=this;if(!(t instanceof l))return new l(e);t._debug("new peer %o",e);if(!e)e={};e.allowHalfOpen=false;if(e.highWaterMark==null)e.highWaterMark=1024*1024;c.Duplex.call(t,e);t.initiator=e.initiator||false;t.channelConfig=e.channelConfig||l.channelConfig;t.channelName=e.channelName||o(160);if(!e.initiator)t.channelName=null;t.config=e.config||l.config;t.constraints=e.constraints||l.constraints;t.reconnectTimer=e.reconnectTimer||0;t.sdpTransform=e.sdpTransform||function(e){return e};t.stream=e.stream||false;t.trickle=e.trickle!==undefined?e.trickle:true;t.destroyed=false;t.connected=false;t.remoteAddress=undefined;t.remoteFamily=undefined;t.remotePort=undefined;t.localAddress=undefined;t.localPort=undefined;t._wrtc=e.wrtc||i();if(!t._wrtc){if(typeof window==="undefined"){throw new Error("No WebRTC support: Specify `opts.wrtc` option in this environment")}else{throw new Error("No WebRTC support: Not a supported browser")}}t._maxBufferedAmount=e.highWaterMark;t._pcReady=false;t._channelReady=false;t._iceComplete=false;t._channel=null;t._pendingCandidates=[];t._chunk=null;t._cb=null;t._interval=null;t._reconnectTimeout=null;t._pc=new t._wrtc.RTCPeerConnection(t.config,t.constraints);t._pc.oniceconnectionstatechange=t._onIceConnectionStateChange.bind(t);t._pc.onsignalingstatechange=t._onSignalingStateChange.bind(t);t._pc.onicecandidate=t._onIceCandidate.bind(t);if(t.stream)t._pc.addStream(t.stream);t._pc.onaddstream=t._onAddStream.bind(t);if(t.initiator){t._setupData({channel:t._pc.createDataChannel(t.channelName,t.channelConfig)});t._pc.onnegotiationneeded=f(t._createOffer.bind(t));if(typeof window==="undefined"||!window.webkitRTCPeerConnection){t._pc.onnegotiationneeded()}}else{t._pc.ondatachannel=t._setupData.bind(t)}t.on("finish",function(){if(t.connected){setTimeout(function(){t._destroy()},100)}else{t.once("connect",function(){setTimeout(function(){t._destroy()},100)})}})}l.WEBRTC_SUPPORT=!!i();l.config={iceServers:[{url:"stun:23.21.150.121",urls:"stun:23.21.150.121"}]};l.constraints={};l.channelConfig={};Object.defineProperty(l.prototype,"bufferSize",{get:function(){var e=this;return e._channel&&e._channel.bufferedAmount||0}});l.prototype.address=function(){var e=this;return{port:e.localPort,family:"IPv4",address:e.localAddress}};l.prototype.signal=function(e){var t=this;if(t.destroyed)throw new Error("cannot signal after peer is destroyed");if(typeof e==="string"){try{e=JSON.parse(e)}catch(r){e={}}}t._debug("signal()");function n(e){try{t._pc.addIceCandidate(new t._wrtc.RTCIceCandidate(e),h,t._onError.bind(t))}catch(r){t._destroy(new Error("error adding candidate: "+r.message))}}if(e.sdp){t._pc.setRemoteDescription(new t._wrtc.RTCSessionDescription(e),function(){if(t.destroyed)return;if(t._pc.remoteDescription.type==="offer")t._createAnswer();t._pendingCandidates.forEach(n);t._pendingCandidates=[]},t._onError.bind(t))}if(e.candidate){if(t._pc.remoteDescription)n(e.candidate);else t._pendingCandidates.push(e.candidate)}if(!e.sdp&&!e.candidate){t._destroy(new Error("signal() called with invalid signal data"))}};l.prototype.send=function(e){var t=this;if(!s.strict(e)&&!(e instanceof ArrayBuffer)&&!r.isBuffer(e)&&typeof e!=="string"&&(typeof Blob==="undefined"||!(e instanceof Blob))){e=JSON.stringify(e)}if(r.isBuffer(e)&&!s.strict(e)){e=new Uint8Array(e)}var n=e.length||e.byteLength||e.size;t._channel.send(e);t._debug("write: %d bytes",n)};l.prototype.destroy=function(e){var t=this;t._destroy(null,e)};l.prototype._destroy=function(e,t){var r=this;if(r.destroyed)return;if(t)r.once("close",t);r._debug("destroy (error: %s)",e&&e.message);r.readable=r.writable=false;if(!r._readableState.ended)r.push(null);if(!r._writableState.finished)r.end();r.destroyed=true;r.connected=false;r._pcReady=false;r._channelReady=false;r._chunk=null;r._cb=null;clearInterval(r._interval);clearTimeout(r._reconnectTimeout);if(r._pc){try{r._pc.close()}catch(e){}r._pc.oniceconnectionstatechange=null;r._pc.onsignalingstatechange=null;r._pc.onicecandidate=null}if(r._channel){try{r._channel.close()}catch(e){}r._channel.onmessage=null;r._channel.onopen=null;r._channel.onclose=null}r._pc=null;r._channel=null;if(e)r.emit("error",e);r.emit("close")};l.prototype._setupData=function(e){var t=this;t._channel=e.channel;t.channelName=t._channel.label;t._channel.binaryType="arraybuffer";t._channel.onmessage=t._onChannelMessage.bind(t);t._channel.onopen=t._onChannelOpen.bind(t);t._channel.onclose=t._onChannelClose.bind(t)};l.prototype._read=function(){};l.prototype._write=function(e,t,r){var n=this;if(n.destroyed)return r(new Error("cannot write after peer is destroyed"));if(n.connected){try{n.send(e)}catch(i){return n._onError(i)}if(n._channel.bufferedAmount>n._maxBufferedAmount){n._debug("start backpressure: bufferedAmount %d",n._channel.bufferedAmount);n._cb=r}else{r(null)}}else{n._debug("write before connect");n._chunk=e;n._cb=r}};l.prototype._createOffer=function(){var e=this;if(e.destroyed)return;e._pc.createOffer(function(t){if(e.destroyed)return;t.sdp=e.sdpTransform(t.sdp);e._pc.setLocalDescription(t,h,e._onError.bind(e));var r=function(){var r=e._pc.localDescription||t;e._debug("signal");e.emit("signal",{type:r.type,sdp:r.sdp})};if(e.trickle||e._iceComplete)r();else e.once("_iceComplete",r)},e._onError.bind(e),e.offerConstraints)};l.prototype._createAnswer=function(){var e=this;if(e.destroyed)return;e._pc.createAnswer(function(t){if(e.destroyed)return;t.sdp=e.sdpTransform(t.sdp);e._pc.setLocalDescription(t,h,e._onError.bind(e));var r=function(){var r=e._pc.localDescription||t;e._debug("signal");e.emit("signal",{type:r.type,sdp:r.sdp})};if(e.trickle||e._iceComplete)r();else e.once("_iceComplete",r)},e._onError.bind(e),e.answerConstraints)};l.prototype._onIceConnectionStateChange=function(){var e=this;if(e.destroyed)return;var t=e._pc.iceGatheringState;var r=e._pc.iceConnectionState;e._debug("iceConnectionStateChange %s %s",t,r);e.emit("iceConnectionStateChange",t,r);if(r==="connected"||r==="completed"){clearTimeout(e._reconnectTimeout);e._pcReady=true;e._maybeReady()}if(r==="disconnected"){if(e.reconnectTimer){clearTimeout(e._reconnectTimeout);e._reconnectTimeout=setTimeout(function(){e._destroy()},e.reconnectTimer)}else{e._destroy()}}if(r==="closed"){e._destroy()}};l.prototype._maybeReady=function(){var e=this;e._debug("maybeReady pc %s channel %s",e._pcReady,e._channelReady);if(e.connected||e._connecting||!e._pcReady||!e._channelReady)return;e._connecting=true;if(typeof window!=="undefined"&&!!window.mozRTCPeerConnection){e._pc.getStats(null,function(e){var r=[];e.forEach(function(e){r.push(e)});t(r)},e._onError.bind(e))}else{e._pc.getStats(function(e){var r=[];e.result().forEach(function(e){var t={};e.names().forEach(function(r){t[r]=e.stat(r)});t.id=e.id;t.type=e.type;t.timestamp=e.timestamp;r.push(t)});t(r)})}function t(t){t.forEach(function(t){if(t.type==="remotecandidate"){e.remoteAddress=t.ipAddress;e.remoteFamily="IPv4";e.remotePort=Number(t.portNumber);e._debug("connect remote: %s:%s (%s)",e.remoteAddress,e.remotePort,e.remoteFamily)}else if(t.type==="localcandidate"&&t.candidateType==="host"){e.localAddress=t.ipAddress;e.localPort=Number(t.portNumber);e._debug("connect local: %s:%s",e.localAddress,e.localPort)}});e._connecting=false;e.connected=true;if(e._chunk){try{e.send(e._chunk)}catch(r){return e._onError(r)}e._chunk=null;e._debug('sent chunk from "write before connect"');var n=e._cb;e._cb=null;n(null)}e._interval=setInterval(function(){if(!e._cb||!e._channel||e._channel.bufferedAmount>e._maxBufferedAmount)return;e._debug("ending backpressure: bufferedAmount %d",e._channel.bufferedAmount);var t=e._cb;e._cb=null;t(null)},150);if(e._interval.unref)e._interval.unref();e._debug("connect");e.emit("connect")}};l.prototype._onSignalingStateChange=function(){var e=this;if(e.destroyed)return;e._debug("signalingStateChange %s",e._pc.signalingState);e.emit("signalingStateChange",e._pc.signalingState)};l.prototype._onIceCandidate=function(e){var t=this;if(t.destroyed)return;if(e.candidate&&t.trickle){t.emit("signal",{candidate:{candidate:e.candidate.candidate,sdpMLineIndex:e.candidate.sdpMLineIndex,sdpMid:e.candidate.sdpMid}})}else if(!e.candidate){t._iceComplete=true;t.emit("_iceComplete")}};l.prototype._onChannelMessage=function(e){var t=this;if(t.destroyed)return;var r=e.data;t._debug("read: %d bytes",r.byteLength||r.length);if(r instanceof ArrayBuffer){r=u(new Uint8Array(r));t.push(r)}else{try{r=JSON.parse(r)}catch(n){}t.emit("data",r)}};l.prototype._onChannelOpen=function(){var e=this;if(e.connected||e.destroyed)return;e._debug("on channel open");e._channelReady=true;e._maybeReady(); + +};l.prototype._onChannelClose=function(){var e=this;if(e.destroyed)return;e._debug("on channel close");e._destroy()};l.prototype._onAddStream=function(e){var t=this;if(t.destroyed)return;t._debug("on add stream");t.emit("stream",e.stream)};l.prototype._onError=function(e){var t=this;if(t.destroyed)return;t._debug("error %s",e.message||e);t._destroy(e)};l.prototype._debug=function(){var e=this;var t=[].slice.call(arguments);var r=e.channelName&&e.channelName.substring(0,7);t[0]="["+r+"] "+t[0];n.apply(null,t)};function h(){}}).call(this,e("buffer").Buffer)},{buffer:2,debug:25,"get-browser-rtc":34,hat:31,inherits:32,"is-typedarray":35,once:37,stream:21,"typedarray-to-buffer":38}],34:[function(e,t,r){t.exports=function n(){if(typeof window==="undefined")return null;var e={RTCPeerConnection:window.mozRTCPeerConnection||window.RTCPeerConnection||window.webkitRTCPeerConnection,RTCSessionDescription:window.mozRTCSessionDescription||window.RTCSessionDescription||window.webkitRTCSessionDescription,RTCIceCandidate:window.mozRTCIceCandidate||window.RTCIceCandidate||window.webkitRTCIceCandidate};if(!e.RTCPeerConnection)return null;return e}},{}],35:[function(e,t,r){t.exports=o;o.strict=a;o.loose=s;var n=Object.prototype.toString;var i={"[object Int8Array]":true,"[object Int16Array]":true,"[object Int32Array]":true,"[object Uint8Array]":true,"[object Uint8ClampedArray]":true,"[object Uint16Array]":true,"[object Uint32Array]":true,"[object Float32Array]":true,"[object Float64Array]":true};function o(e){return a(e)||s(e)}function a(e){return e instanceof Int8Array||e instanceof Int16Array||e instanceof Int32Array||e instanceof Uint8Array||e instanceof Uint8ClampedArray||e instanceof Uint16Array||e instanceof Uint32Array||e instanceof Float32Array||e instanceof Float64Array}function s(e){return i[n.call(e)]}},{}],36:[function(e,t,r){t.exports=n;function n(e,t){if(e&&t)return n(e)(t);if(typeof e!=="function")throw new TypeError("need wrapper function");Object.keys(e).forEach(function(t){r[t]=e[t]});return r;function r(){var t=new Array(arguments.length);for(var r=0;r=n)return(e/n).toFixed(1)+"h";if(e>=r)return(e/r).toFixed(1)+"m";if(e>=t)return(e/t|0)+"s";return e+"ms"};n.enabled=function(e){for(var t=0,r=n.skips.length;t1)))/4)-w((e-1901+t)/100)+w((e-1601+t)/400)}}if(!(i={}.hasOwnProperty)){i=function(e){var t={},n;if((t.__proto__=null,t.__proto__={toString:1},t).toString!=r){i=function(e){var t=this.__proto__,r=e in(this.__proto__=null,this);this.__proto__=t;return r}}else{n=t.constructor;i=function(e){var t=(this.constructor||n).prototype;return e in this&&!(e in t&&this[e]===t[e])}}t=null;return i.call(this,e)}}var A={"boolean":1,number:1,string:1,undefined:1};var C=function(e,t){var r=typeof e[t];return r=="object"?!!e[t]:!A[r]};o=function(e,t){var n=0,a,s,f;(a=function(){this.valueOf=0}).prototype.valueOf=0;s=new a;for(f in s){if(i.call(s,f)){n++}}a=s=null;if(!n){s=["valueOf","toString","toLocaleString","propertyIsEnumerable","isPrototypeOf","hasOwnProperty","constructor"];o=function(e,t){var n=r.call(e)==d,o,a;var f=!n&&typeof e.constructor!="function"&&C(e,"hasOwnProperty")?e.hasOwnProperty:i;for(o in e){if(!(n&&o=="prototype")&&f.call(e,o)){t(o)}}for(a=s.length;o=s[--a];f.call(e,o)&&t(o));}}else if(n==2){o=function(e,t){var n={},o=r.call(e)==d,a;for(a in e){if(!(o&&a=="prototype")&&!i.call(n,a)&&(n[a]=1)&&i.call(e,a)){t(a)}}}}else{o=function(e,t){var n=r.call(e)==d,o,a;for(o in e){if(!(n&&o=="prototype")&&i.call(e,o)&&!(a=o==="constructor")){t(o)}}if(a||i.call(e,o="constructor")){t(o)}}}return o(e,t)};if(!h("json-stringify")){var k={92:"\\\\",34:'\\"',8:"\\b",12:"\\f",10:"\\n",13:"\\r",9:"\\t"};var S="000000";var R=function(e,t){return(S+(t||0)).slice(-e)};var T="\\u00";var I=function(e){var t='"',r=0,n=e.length,i=n>10&&m,o;if(i){o=e.split("")}for(;r-1/0&&l<1/0){if(E){_=w(l/864e5);for(d=w(_/365.2425)+1970-1;E(d+1,0)<=_;d++);for(m=w((_-E(d,0))/30.42);E(d,m+1)<=_;m++);_=1+_-E(d,m);A=(l%864e5+864e5)%864e5;C=w(A/36e5)%24;k=w(A/6e4)%60;S=w(A/1e3)%60;T=A%1e3}else{d=l.getUTCFullYear();m=l.getUTCMonth();_=l.getUTCDate();C=l.getUTCHours();k=l.getUTCMinutes();S=l.getUTCSeconds();T=l.getUTCMilliseconds()}l=(d<=0||d>=1e4?(d<0?"-":"+")+R(6,d<0?-d:d):R(4,d))+"-"+R(2,m+1)+"-"+R(2,_)+"T"+R(2,C)+":"+R(2,k)+":"+R(2,S)+"."+R(3,T)+"Z"}else{l=null}}else if(typeof l.toJSON=="function"&&(h!=g&&h!=v&&h!=b||i.call(l,"toJSON"))){l=l.toJSON(e)}}if(n){l=n.call(t,e,l)}if(l===null){return"null"}h=r.call(l);if(h==y){return""+l}else if(h==g){return l>-1/0&&l<1/0?""+l:"null"}else if(h==v){return I(""+l)}if(typeof l=="object"){for(x=u.length;x--;){if(u[x]===l){throw TypeError()}}u.push(l);B=[];j=c;c+=f;if(h==b){for(P=0,x=l.length;P0){for(i="",n>10&&(n=10);i.length=48&&a<=57||a>=97&&a<=102||a>=65&&a<=70)){j()}}r+=B("0x"+e.slice(n,P));break;default:j()}}else{if(a==34){break}a=e.charCodeAt(P);n=P;while(a>=32&&a!=92&&a!=34){a=e.charCodeAt(++P)}r+=e.slice(n,P)}}if(e.charCodeAt(P)==34){P++;return r}j();default:n=P;if(a==45){o=true;a=e.charCodeAt(++P)}if(a>=48&&a<=57){if(a==48&&(a=e.charCodeAt(P+1),a>=48&&a<=57)){j()}o=false;for(;P=48&&a<=57);P++);if(e.charCodeAt(P)==46){i=++P;for(;i=48&&a<=57);i++);if(i==P){j()}P=i}a=e.charCodeAt(P);if(a==101||a==69){a=e.charCodeAt(++P);if(a==43||a==45){P++}for(i=P;i=48&&a<=57);i++);if(i==P){j()}P=i}return+e.slice(n,P)}if(o){j()}if(e.slice(P,P+4)=="true"){P+=4;return true}else if(e.slice(P,P+5)=="false"){P+=5;return false}else if(e.slice(P,P+4)=="null"){P+=4;return null}j()}}return"$"};var N=function(e){var t,r;if(e=="$"){j()}if(typeof e=="string"){if((m?e.charAt(0):e[0])=="@"){return e.slice(1)}if(e=="["){t=[];for(;;r||(r=true)){e=U();if(e=="]"){break}if(r){if(e==","){e=U();if(e=="]"){j()}}else{j()}}if(e==","){j()}t.push(N(e))}return t}else if(e=="{"){t={};for(;;r||(r=true)){e=U();if(e=="}"){break}if(r){if(e==","){e=U();if(e=="}"){j()}}else{j()}}if(e==","||typeof e!="string"||(m?e.charAt(0):e[0])!="@"||U()!=":"){j()}t[e.slice(1)]=N(U())}return t}j()}return e};var O=function(e,t,r){var n=D(e,t,r);if(n===a){delete e[t]}else{e[t]=n}};var D=function(e,t,n){var i=e[t],a;if(typeof i=="object"&&i){if(r.call(i)==b){for(a=i.length;a--;){O(i,a,n)}}else{o(i,function(e){O(i,e,n)})}}return n.call(e,t,i)};c.parse=function(e,t){var n,i;P=0;x=""+e;n=N(U());if(U()!="$"){j()}P=x=null;return t&&r.call(t)==d?D((i={},i[""]=n,i),"",t):n}}}if(s){e(function(){return c})}})(this)},{}],46:[function(e,t,r){t.exports=n;function n(e,t){var r=[];t=t||0;for(var n=t||0;n=26||n==="moz"&&i>=33);var u=window.AudioContext||window.webkitAudioContext;var l=document.createElement("video");var h=l&&l.canPlayType&&l.canPlayType('video/webm; codecs="vp8", vorbis')==="probably";var d=navigator.getUserMedia||navigator.webkitGetUserMedia||navigator.msGetUserMedia||navigator.mozGetUserMedia;t.exports={prefix:n,browserVersion:i,support:!!o&&h&&!!d,supportRTCPeerConnection:!!o,supportVp8:h,supportGetUserMedia:!!d,supportDataChannel:!!(o&&o.prototype&&o.prototype.createDataChannel),supportWebAudio:!!(u&&u.prototype.createMediaStreamSource),supportMediaStream:!!(f&&f.prototype.removeTrack),supportScreenSharing:!!c,AudioContext:u,PeerConnection:o,SessionDescription:s,IceCandidate:a,MediaStream:f,getUserMedia:d}},{}],"/":[function(e,t,r){window.myDebug=e("debug");var n=e("simple-peer");var i=e("component-emitter");var o=e("socket.io-parser");var a=e("to-array");var s=e("has-binary");var f=e("component-bind");var c=e("debug")("socket");var u=e("hat");var l=e("extend.js");var h=e("webrtcsupport");var d=i.prototype.emit;function p(e,t,r){var i=this;i.useSockets=true;i.usePeerConnection=false;i.decoder=new o.Decoder(this);i.decoder.on("decoded",f(this,this.ondecoded));i.socket=e;i.cb=r;i._peers={};i.readyPeers=0;i.ready=false;i._peerEvents={upgrade:1,error:1,peer_signal:1,peer_ready:1,stream:1};var a={autoUpgrade:true,numClients:5};i.opts=l(a,t||{});i.peerOpts=i.opts.peerOpts||{};i.numConnectedClients;e.on("numClients",function(t){i.peerId=e.io.engine.id;i.numConnectedClients=t;if(h.supportDataChannel){r(function(t){var r={offers:t,fromPeerId:i.peerId};e.emit("offers",r)})}function r(e){var t=[];for(var r=0;r=i.numConnectedClients&&!i.ready){i.ready=true;if(i.opts.autoUpgrade)i.usePeerConnection=true;if(typeof i.cb==="function")i.cb();i.emit("upgrade")}})}i(p.prototype);p.prototype.setupPeerEvents=function(e){var t=this;e.on("connect",function(e){t.emit("peer_ready",e)});e.on("data",function(e){if(this.destroyed)return;t.decoder.add(e)});e.on("stream",function(e){t.emit("stream",e)})};p.prototype.on=function(e,t){var r=this;this.socket.addEventListener(e,function(t){d.call(r,e,t)});this.addEventListener(e,t)};p.prototype.emit=function(e,t){var r=this;var n=t||{};var i=new o.Encoder;if(this._peerEvents.hasOwnProperty(e)||n.fromSocket){d.apply(this,arguments)}else if(this.usePeerConnection||!this.useSockets){var f=a(arguments);var c=o.EVENT;if(s(f)){c=o.BINARY_EVENT}var u={type:c,data:f};i.encode(u,function(e){if(e[1]instanceof ArrayBuffer){r._sendArray(e)}else if(e){for(var t=0;t { + if (game) + if (!game.winId) + game.onMouseDown(); +} + +window.onresize = () => { + let w = $('#canvas-holder').width(); + let h = $('#canvas-holder').height(); + p.resizeCanvas(w, h); +} \ No newline at end of file diff --git a/data/scripts/game.js b/public/data/scripts/game.js similarity index 85% rename from data/scripts/game.js rename to public/data/scripts/game.js index 4f7039c..18c0324 100644 --- a/data/scripts/game.js +++ b/public/data/scripts/game.js @@ -17,7 +17,7 @@ function readGameSettings(){ for (let i = 0; i < maxIndex * 0.1; i++){ let index; do{ - index = floor(random(0, maxIndex)); + index = Math.floor(p.random(0, maxIndex)); } while (indices.find(i => i === index) != null); indices.push(index); } @@ -66,17 +66,17 @@ class Game{ } get winCount(){ - return round(this.fields.filter(f => !f.isEmpty).length * 0.7); + return Math.round(this.fields.filter(f => !f.isEmpty).length * 0.7); } //Width and height of game field get size(){ - return Math.min(width, height - this.leaderboard.height); + return Math.min(p.width, p.height - this.leaderboard.height); } //Upper left corner of game field get pos(){ - return {x: (width - this.size) / 2, y: (height + this.leaderboard.height - this.size) / 2}; + return {x: (p.width - this.size) / 2, y: (p.height + this.leaderboard.height - this.size) / 2}; } get hasTurn(){ @@ -123,8 +123,8 @@ class Game{ setPlayerHues(colors){ for (let key in colors){ this.playerHues[key] = colors[key]; - let graphics = createGraphics(100, 100); - graphics.colorMode(HSB); + let graphics = p.createGraphics(100, 100); + graphics.colorMode(p.HSB); graphics.tint(colors[key], 100, 100); graphics.image(gemContentImage, 0, 0, 100, 100); gemContentGraphics[colors[key]] = graphics; @@ -304,8 +304,8 @@ class Field{ } get isMouseOver(){ - return mouseX > this.pos.x && mouseX < this.pos.x + this.size - && mouseY > this.pos.y && mouseY < this.pos.y + this.size; + return p.mouseX > this.pos.x && p.mouseX < this.pos.x + this.size + && p.mouseY > this.pos.y && p.mouseY < this.pos.y + this.size; } get isNeutral(){ @@ -326,9 +326,9 @@ class Field{ setup(allFields){ if (!this.isEmpty){ - for (let angle = 0; angle < TWO_PI; angle += PI / 2){ - let x = round(sin(angle)); - let y = round(cos(angle)); + for (let angle = 0; angle < Math.PI * 2; angle += Math.PI / 2){ + let x = Math.round(Math.sin(angle)); + let y = Math.round(Math.cos(angle)); if (this.getPartner(x, y, allFields)) this.slots.push(new Slot(x, y)); } @@ -347,19 +347,19 @@ class Field{ display(){ if (!this.isEmpty){ - noStroke(); - fill(0, 0, 5); + p.noStroke(); + p.fill(0, 0, 5); let size = this.size / 3; - rect(this.pos.x + size, this.pos.y + size, size, size); + p.rect(this.pos.x + size, this.pos.y + size, size, size); } this.slots.forEach(s => s.display()); let s = this.isNeutral ? 0 : 50; - stroke(100); - strokeWeight(1); - fill(game.playerHues[this.ownerId], s, 60, 0.3); - rect(this.pos.x, this.pos.y, this.size, this.size); + p.stroke(100); + p.strokeWeight(1); + p.fill(game.playerHues[this.ownerId], s, 60, 0.3); + p.rect(this.pos.x, this.pos.y, this.size, this.size); } onMouseDown(){ @@ -389,15 +389,15 @@ class Slot{ } get isMouseOver(){ - return mouseX > this.pos.x && mouseX < this.pos.x + this.size - && mouseY > this.pos.y && mouseY < this.pos.y + this.size; + return p.mouseX > this.pos.x && p.mouseX < this.pos.x + this.size + && p.mouseY > this.pos.y && p.mouseY < this.pos.y + this.size; } get color(){ let h = game.playerHues[this.field.ownerId]; let s = this.isFilled ? 100 : 0; let b = this.isMouseOver && !this.isFilled ? 90 : 70; - return color(h, s, b) + return p.color(h, s, b); } get partner(){ @@ -414,24 +414,24 @@ class Slot{ display(){ - fill(this.color); - noStroke(); - rect(this.pos.x, this.pos.y, this.size, this.size); + p.fill(this.color); + p.noStroke(); + p.rect(this.pos.x, this.pos.y, this.size, this.size); if (this.isFilled){ - stroke(0, 0, 0); - strokeWeight(3); + p.stroke(0, 0, 0); + p.strokeWeight(3); let x = this.pos.x + this.size / 2; let y = this.pos.y + this.size / 2; - line(this.pos.x, y, this.pos.x + this.size, y); - line(x, this.pos.y, x, this.pos.y + this.size); + p.line(this.pos.x, y, this.pos.x + this.size, y); + p.line(x, this.pos.y, x, this.pos.y + this.size); } if (this.isHighlighted){ - stroke(0); - fill(0); + p.stroke(0); + p.fill(0); let hs = this.size / 2; - ellipse(this.pos.x + hs, this.pos.y + hs, hs, hs); + p.ellipse(this.pos.x + hs, this.pos.y + hs, hs, hs); } } @@ -461,13 +461,13 @@ class Spread{ get startPos(){ let x = this.slot.field.pos.x + this.slot.size; let y = this.slot.field.pos.y + this.slot.size; - return createVector(x, y); + return p.createVector(x, y); } get endPos(){ let x = this.slot.partner.field.pos.x + this.slot.size; let y = this.slot.partner.field.pos.y + this.slot.size; - return createVector(x, y); + return p.createVector(x, y); } get pos(){ @@ -481,26 +481,26 @@ class Spread{ display(){ - noStroke(); + p.noStroke(); let x = this.pos.x + this.size / 2; let y = this.pos.y + this.size / 2; - fill(0, 0, 0); - ellipse(x, y, this.size * 0.9, this.size * 0.9); + p.fill(0, 0, 0); + p.ellipse(x, y, this.size * 0.9, this.size * 0.9); - let c = frameCount % 10 >= 5 && !this.moving ? color(0, 0, 0) : this.color; - fill(c); - ellipse(x, y, this.size * 0.5, this.size * 0.5); + let c = p.frameCount % 10 >= 5 && !this.moving ? p.color(0, 0, 0) : this.color; + p.fill(c); + p.ellipse(x, y, this.size * 0.5, this.size * 0.5); } update(){ - this.waitTime += 1 / frameRate(); + this.waitTime += 1 / p.frameRate(); if (this.waitTime >= 0.2 && !this.moving){ this.moving = true; this.slot.isFilled = false; this.slot.field.ownerId = 'neutral'; } if (this.moving){ - this.moveProgress += 1.5 / frameRate(); + this.moveProgress += 1.5 / p.frameRate(); } if (this.moveProgress >= 1) this.fillEndSlot(); @@ -556,14 +556,14 @@ class Countdown{ display(){ if (!this.isFinished){ - let panelW = (width - game.size) / 2; - stroke(200); - fill(150); - textSize(panelW / 4); + let panelW = (p.width - game.size) / 2; + p.stroke(200); + p.fill(150); + p.textSize(panelW / 4); let x = panelW / 2; let y = game.pos.y + game.size / 2; - let rounded = floor(this.time); - text(rounded, x, y); + let rounded = Math.floor(this.time); + p.text(rounded, x, y); } } diff --git a/public/data/scripts/init.js b/public/data/scripts/init.js new file mode 100644 index 0000000..d9c9d99 --- /dev/null +++ b/public/data/scripts/init.js @@ -0,0 +1,100 @@ +'use strict'; + +let projectName = "chainreact"; + +let debug = false, + productionMode = false, + font, + localSettings, + loader; + +//Only for online games +let socket; + +let game; +let gemContentImage; +let gemBorderImage; +let gemContentGraphics = {}; + +let antiCacheQuery = '?_=' + new Date().getTime(); + +let p; + +p = new p5(s => { + s.preload = () => { + localSettings = p.loadJSON('data/settings/settings.json' + antiCacheQuery, json => { + console.log('Local settings loaded: ', json); + }, error => { + console.log('Local settings failed: ', error); + }); + + font = p.loadFont('data/styles/Tajawal/Tajawal-Regular.ttf', json => { + console.log('Local font loaded: ', json); + }, error => { + console.log('Local font failed: ', error); + }); + + gemContentImage = p.loadImage('data/images/gem_content.png', img => { + console.log('Image loaded: ', img); + }, error => { + console.log('Image failed: ', error); + }); + + gemBorderImage = p.loadImage('data/images/gem_border.png', img => { + console.log('Image loaded: ', img); + }, error => { + console.log('Image failed: ', error); + }); + + p.loadJSON('data/settings/libraries.json' + antiCacheQuery, json => { + loadScripts(json) + console.log('BenjoCraeft library scripts loaded: ', json) + }); + }; + + s.setup = () => { + canvasSetup(); + interfaceSetup(); + } + + s.draw = () => { + p.background(0, 0, 10); + if (game){ + game.display(); + game.update(); + } + } + + }, null, null); + +function canvasSetup(){ + p.setFrameRate(60); + let w = $('#canvas-holder').width(), + h = $('#canvas-holder').height(); + let canvas = p.createCanvas(w, h); + canvas.parent('canvas-holder'); + p.textFont(font); + p.textAlign(p.CENTER, p.CENTER); + p.imageMode(p.CENTER); + p.colorMode(p.HSB); +} + +function interfaceSetup(){ + window.onresize(); + setInterval(() => window.onresize(), 500); + $('#start_feedback, #give_feedback').attr('disabled', 'disabled'); + nameTyped($('#main > input')); + + $('#main').fadeIn(menuesFadeTime); +} + +function loadScripts(libs){ + for (let script in libs){ + if (libs[script]){ + let url = '/lib/benjocraeft/' + script + '.js' + $.getScript(url, () => { + console.log('Successfully loaded script: ', url) + }); + } + } +} \ No newline at end of file diff --git a/data/scripts/leaderboard.js b/public/data/scripts/leaderboard.js similarity index 84% rename from data/scripts/leaderboard.js rename to public/data/scripts/leaderboard.js index 5551d3a..ca36f99 100644 --- a/data/scripts/leaderboard.js +++ b/public/data/scripts/leaderboard.js @@ -5,7 +5,7 @@ class Leaderboard{ } get pos(){ - return createVector(game.pos.x, 0); + return p.createVector(game.pos.x, 0); } get width(){ @@ -41,14 +41,14 @@ class Bar{ return game.size / game.winCount; } get marginY(){ - return height * 0.005; + return p.height * 0.005; } get pos(){ let lb = game.leaderboard; let x = lb.pos.x + this.marginX; let y = lb.pos.y + this.marginY + lb.bars.findIndex(b => b.id === this.id) * (this.height + this.marginY); - return createVector(x, y); + return p.createVector(x, y); } get height(){ @@ -67,11 +67,11 @@ class Bar{ let filled = game.fields.filter(f => f.ownerId === this.id).length; for (let i = 0; i < count; i++){ let x = i * this.width / count + this.width / count / 2 + this.pos.x; - image(gemBorderImage, x, y, imageSize, imageSize); + p.image(gemBorderImage, x, y, imageSize, imageSize); } for (let i = 0; i < filled; i++){ let x = i * this.width / count + this.width / count / 2 + this.pos.x; - image(gemContentGraphics[game.playerHues[this.id]], x, y, imageSize, imageSize); + p.image(gemContentGraphics[game.playerHues[this.id]], x, y, imageSize, imageSize); } } diff --git a/data/scripts/online.js b/public/data/scripts/online.js similarity index 99% rename from data/scripts/online.js rename to public/data/scripts/online.js index 33e1602..e1c232c 100644 --- a/data/scripts/online.js +++ b/public/data/scripts/online.js @@ -24,7 +24,7 @@ function socketConnect(project, name = playerName){ connecting = true; let urlQueries = '?game=' + project.name + '&name=' + name; - $.get('/php/get_nodejs_port.php', port => { + $.get('data/settings/get_port.php', port => { let url = 'https://' + location.hostname + ':' + port + urlQueries; socket = io.connect(url); @@ -217,7 +217,7 @@ function serverStartGame(dom){ } function startGame(room, seed){ - randomSeed(seed); + p.randomSeed(seed); buildGame(room); console.log('Game started'); socket.emit('ready-for-turn'); diff --git a/public/data/settings/get_port.php b/public/data/settings/get_port.php new file mode 100644 index 0000000..8de971e --- /dev/null +++ b/public/data/settings/get_port.php @@ -0,0 +1,3 @@ + - - - - - - - - + + + + diff --git a/styles.css b/public/styles.css similarity index 100% rename from styles.css rename to public/styles.css diff --git a/public/thumbnail.png b/public/thumbnail.png new file mode 100644 index 0000000000000000000000000000000000000000..182ed7b5163a27514a43e858fa16615b2ea9c3aa GIT binary patch literal 173102 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�Spxu}ZrX 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 E0a7EM*8l(j literal 0 HcmV?d00001 diff --git a/server/.gitignore b/server/.gitignore new file mode 100644 index 0000000..97b842c --- /dev/null +++ b/server/.gitignore @@ -0,0 +1,3 @@ +out +logs +node_modules \ No newline at end of file diff --git a/server/package-lock.json b/server/package-lock.json new file mode 100644 index 0000000..d090b32 --- /dev/null +++ b/server/package-lock.json @@ -0,0 +1,439 @@ +{ + "name": "chainreact-server", + "version": "2.0", + "lockfileVersion": 2, + "requires": true, + "packages": { + "": { + "name": "chainreact-server", + "version": "2.0", + "dependencies": { + "dotenv": "^16.0.3", + "https": "^1.0.0", + "socket.io": "^4.4.1", + "typescript": "^5.0.2" + }, + "devDependencies": { + "@types/node": "^18.15.3" + } + }, + "base": { + "name": "game-server", + "version": "2.0", + "extraneous": true, + "dependencies": { + "dotenv": "^16.0.3", + "https": "^1.0.0", + "ini": "^2.0.0", + "socket.io": "^4.4.1" + }, + "devDependencies": { + "@types/node": "^17.0.18", + "typescript": "^4.8.4" + } + }, + "node_modules/@socket.io/component-emitter": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/@socket.io/component-emitter/-/component-emitter-3.1.0.tgz", + "integrity": "sha512-+9jVqKhRSpsc591z5vX+X5Yyw+he/HCB4iQ/RYxw35CEPaY1gnsNE43nf9n9AaYjAQrTiI/mOwKUKdUs9vf7Xg==" + }, + "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.13", + "resolved": "https://registry.npmjs.org/@types/cors/-/cors-2.8.13.tgz", + "integrity": "sha512-RG8AStHlUiV5ysZQKq97copd2UmVYw3/pRMLefISZ3S1hK104Cwm7iLQ3fTKx+lsUH2CE8FlLaYeEA2LSeqYUA==", + "dependencies": { + "@types/node": "*" + } + }, + "node_modules/@types/node": { + "version": "18.15.3", + "resolved": "https://registry.npmjs.org/@types/node/-/node-18.15.3.tgz", + "integrity": "sha512-p6ua9zBxz5otCmbpb5D3U4B5Nanw6Pk3PPyX05xnxbB/fRv71N7CPmORg7uAD5P70T0xmx1pzAx/FUfa5X+3cw==" + }, + "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/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/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/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/debug": { + "version": "4.3.4", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.4.tgz", + "integrity": "sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==", + "dependencies": { + "ms": "2.1.2" + }, + "engines": { + "node": ">=6.0" + }, + "peerDependenciesMeta": { + "supports-color": { + "optional": true + } + } + }, + "node_modules/dotenv": { + "version": "16.0.3", + "resolved": "https://registry.npmjs.org/dotenv/-/dotenv-16.0.3.tgz", + "integrity": "sha512-7GO6HghkA5fYG9TYnNxi14/7K9f5occMlp3zXAuSxn7CKCxt9xbNWG7yF8hTCSUchlfWSe3uLmlPfigevRItzQ==", + "engines": { + "node": ">=12" + } + }, + "node_modules/engine.io": { + "version": "6.4.1", + "resolved": "https://registry.npmjs.org/engine.io/-/engine.io-6.4.1.tgz", + "integrity": "sha512-JFYQurD/nbsA5BSPmbaOSLa3tSVj8L6o4srSwXXY3NqE+gGUNmmPTbhn8tjzcCtSqhFgIeqef81ngny8JM25hw==", + "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.11.0" + }, + "engines": { + "node": ">=10.0.0" + } + }, + "node_modules/engine.io-parser": { + "version": "5.0.6", + "resolved": "https://registry.npmjs.org/engine.io-parser/-/engine.io-parser-5.0.6.tgz", + "integrity": "sha512-tjuoZDMAdEhVnSFleYPCtdL2GXwVTGtNjoeJd9IhIG3C1xs9uwxqRNEu5WpnDZCaozwVlK/nuQhpodhXSIMaxw==", + "engines": { + "node": ">=10.0.0" + } + }, + "node_modules/https": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/https/-/https-1.0.0.tgz", + "integrity": "sha512-4EC57ddXrkaF0x83Oj8sM6SLQHAWXw90Skqu2M4AEWENZ3F02dFJE/GARA8igO79tcgYqGrD7ae4f5L3um2lgg==" + }, + "node_modules/mime-db": { + "version": "1.52.0", + "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.52.0.tgz", + "integrity": "sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg==", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/mime-types": { + "version": "2.1.35", + "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.35.tgz", + "integrity": "sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw==", + "dependencies": { + "mime-db": "1.52.0" + }, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/ms": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", + "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==" + }, + "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": "sha512-rJgTQnkUnH1sFw8yT6VSU3zD3sWmu6sZhIseY8VX+GRu3P6F7Fu+JNDoXfklElbLJSnc3FUQHVe4cU5hj+BcUg==", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/socket.io": { + "version": "4.6.1", + "resolved": "https://registry.npmjs.org/socket.io/-/socket.io-4.6.1.tgz", + "integrity": "sha512-KMcaAi4l/8+xEjkRICl6ak8ySoxsYG+gG6/XfRCPJPQ/haCRIJBTL4wIl8YCsmtaBovcAXGLOShyVWQ/FG8GZA==", + "dependencies": { + "accepts": "~1.3.4", + "base64id": "~2.0.0", + "debug": "~4.3.2", + "engine.io": "~6.4.1", + "socket.io-adapter": "~2.5.2", + "socket.io-parser": "~4.2.1" + }, + "engines": { + "node": ">=10.0.0" + } + }, + "node_modules/socket.io-adapter": { + "version": "2.5.2", + "resolved": "https://registry.npmjs.org/socket.io-adapter/-/socket.io-adapter-2.5.2.tgz", + "integrity": "sha512-87C3LO/NOMc+eMcpcxUBebGjkpMDkNBS9tf7KJqcDsmL936EChtVva71Dw2q4tQcuVC+hAUy4an2NO/sYXmwRA==", + "dependencies": { + "ws": "~8.11.0" + } + }, + "node_modules/socket.io-parser": { + "version": "4.2.2", + "resolved": "https://registry.npmjs.org/socket.io-parser/-/socket.io-parser-4.2.2.tgz", + "integrity": "sha512-DJtziuKypFkMMHCm2uIshOYC7QaylbtzQwiMYDuCKy3OPkjLzu4B2vAhTlqipRHHzrI0NJeBAizTK7X+6m1jVw==", + "dependencies": { + "@socket.io/component-emitter": "~3.1.0", + "debug": "~4.3.1" + }, + "engines": { + "node": ">=10.0.0" + } + }, + "node_modules/typescript": { + "version": "5.0.2", + "resolved": "https://registry.npmjs.org/typescript/-/typescript-5.0.2.tgz", + "integrity": "sha512-wVORMBGO/FAs/++blGNeAVdbNKtIh1rbBL2EyQ1+J9lClJ93KiiKe8PmFIVdXhHcyv44SL9oglmfeSsndo0jRw==", + "bin": { + "tsc": "bin/tsc", + "tsserver": "bin/tsserver" + }, + "engines": { + "node": ">=12.20" + } + }, + "node_modules/vary": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/vary/-/vary-1.1.2.tgz", + "integrity": "sha512-BNGbWLfd0eUPabhkXUVm0j8uuvREyTh5ovRa/dyow/BqAbZJyC+5fU+IzQOzmAKzYqYRAISoRhdQr3eIZ/PXqg==", + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/ws": { + "version": "8.11.0", + "resolved": "https://registry.npmjs.org/ws/-/ws-8.11.0.tgz", + "integrity": "sha512-HPG3wQd9sNQoT9xHyNCXoDUa+Xw/VevmY9FoHyQ+g+rrMn4j6FB4np7Z0OhdTgjx6MgQLK7jwSy1YecU1+4Asg==", + "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": { + "@socket.io/component-emitter": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/@socket.io/component-emitter/-/component-emitter-3.1.0.tgz", + "integrity": "sha512-+9jVqKhRSpsc591z5vX+X5Yyw+he/HCB4iQ/RYxw35CEPaY1gnsNE43nf9n9AaYjAQrTiI/mOwKUKdUs9vf7Xg==" + }, + "@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.13", + "resolved": "https://registry.npmjs.org/@types/cors/-/cors-2.8.13.tgz", + "integrity": "sha512-RG8AStHlUiV5ysZQKq97copd2UmVYw3/pRMLefISZ3S1hK104Cwm7iLQ3fTKx+lsUH2CE8FlLaYeEA2LSeqYUA==", + "requires": { + "@types/node": "*" + } + }, + "@types/node": { + "version": "18.15.3", + "resolved": "https://registry.npmjs.org/@types/node/-/node-18.15.3.tgz", + "integrity": "sha512-p6ua9zBxz5otCmbpb5D3U4B5Nanw6Pk3PPyX05xnxbB/fRv71N7CPmORg7uAD5P70T0xmx1pzAx/FUfa5X+3cw==" + }, + "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" + } + }, + "base64id": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/base64id/-/base64id-2.0.0.tgz", + "integrity": "sha512-lGe34o6EHj9y3Kts9R4ZYs/Gr+6N7MCaMlIFA3F1R2O5/m7K06AxfSeO5530PEERE6/WyEg3lsuyw4GHlPZHog==" + }, + "cookie": { + "version": "0.4.2", + "resolved": "https://registry.npmjs.org/cookie/-/cookie-0.4.2.tgz", + "integrity": "sha512-aSWTXFzaKWkvHO1Ny/s+ePFpvKsPnjc551iI41v3ny/ow6tBG5Vd+FuqGNhh1LxOmVzOlGUriIlOaokOvhaStA==" + }, + "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" + } + }, + "debug": { + "version": "4.3.4", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.4.tgz", + "integrity": "sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==", + "requires": { + "ms": "2.1.2" + } + }, + "dotenv": { + "version": "16.0.3", + "resolved": "https://registry.npmjs.org/dotenv/-/dotenv-16.0.3.tgz", + "integrity": "sha512-7GO6HghkA5fYG9TYnNxi14/7K9f5occMlp3zXAuSxn7CKCxt9xbNWG7yF8hTCSUchlfWSe3uLmlPfigevRItzQ==" + }, + "engine.io": { + "version": "6.4.1", + "resolved": "https://registry.npmjs.org/engine.io/-/engine.io-6.4.1.tgz", + "integrity": "sha512-JFYQurD/nbsA5BSPmbaOSLa3tSVj8L6o4srSwXXY3NqE+gGUNmmPTbhn8tjzcCtSqhFgIeqef81ngny8JM25hw==", + "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.11.0" + } + }, + "engine.io-parser": { + "version": "5.0.6", + "resolved": "https://registry.npmjs.org/engine.io-parser/-/engine.io-parser-5.0.6.tgz", + "integrity": "sha512-tjuoZDMAdEhVnSFleYPCtdL2GXwVTGtNjoeJd9IhIG3C1xs9uwxqRNEu5WpnDZCaozwVlK/nuQhpodhXSIMaxw==" + }, + "https": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/https/-/https-1.0.0.tgz", + "integrity": "sha512-4EC57ddXrkaF0x83Oj8sM6SLQHAWXw90Skqu2M4AEWENZ3F02dFJE/GARA8igO79tcgYqGrD7ae4f5L3um2lgg==" + }, + "mime-db": { + "version": "1.52.0", + "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.52.0.tgz", + "integrity": "sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg==" + }, + "mime-types": { + "version": "2.1.35", + "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.35.tgz", + "integrity": "sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw==", + "requires": { + "mime-db": "1.52.0" + } + }, + "ms": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", + "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==" + }, + "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": "sha512-rJgTQnkUnH1sFw8yT6VSU3zD3sWmu6sZhIseY8VX+GRu3P6F7Fu+JNDoXfklElbLJSnc3FUQHVe4cU5hj+BcUg==" + }, + "socket.io": { + "version": "4.6.1", + "resolved": "https://registry.npmjs.org/socket.io/-/socket.io-4.6.1.tgz", + "integrity": "sha512-KMcaAi4l/8+xEjkRICl6ak8ySoxsYG+gG6/XfRCPJPQ/haCRIJBTL4wIl8YCsmtaBovcAXGLOShyVWQ/FG8GZA==", + "requires": { + "accepts": "~1.3.4", + "base64id": "~2.0.0", + "debug": "~4.3.2", + "engine.io": "~6.4.1", + "socket.io-adapter": "~2.5.2", + "socket.io-parser": "~4.2.1" + } + }, + "socket.io-adapter": { + "version": "2.5.2", + "resolved": "https://registry.npmjs.org/socket.io-adapter/-/socket.io-adapter-2.5.2.tgz", + "integrity": "sha512-87C3LO/NOMc+eMcpcxUBebGjkpMDkNBS9tf7KJqcDsmL936EChtVva71Dw2q4tQcuVC+hAUy4an2NO/sYXmwRA==", + "requires": { + "ws": "~8.11.0" + } + }, + "socket.io-parser": { + "version": "4.2.2", + "resolved": "https://registry.npmjs.org/socket.io-parser/-/socket.io-parser-4.2.2.tgz", + "integrity": "sha512-DJtziuKypFkMMHCm2uIshOYC7QaylbtzQwiMYDuCKy3OPkjLzu4B2vAhTlqipRHHzrI0NJeBAizTK7X+6m1jVw==", + "requires": { + "@socket.io/component-emitter": "~3.1.0", + "debug": "~4.3.1" + } + }, + "typescript": { + "version": "5.0.2", + "resolved": "https://registry.npmjs.org/typescript/-/typescript-5.0.2.tgz", + "integrity": "sha512-wVORMBGO/FAs/++blGNeAVdbNKtIh1rbBL2EyQ1+J9lClJ93KiiKe8PmFIVdXhHcyv44SL9oglmfeSsndo0jRw==" + }, + "vary": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/vary/-/vary-1.1.2.tgz", + "integrity": "sha512-BNGbWLfd0eUPabhkXUVm0j8uuvREyTh5ovRa/dyow/BqAbZJyC+5fU+IzQOzmAKzYqYRAISoRhdQr3eIZ/PXqg==" + }, + "ws": { + "version": "8.11.0", + "resolved": "https://registry.npmjs.org/ws/-/ws-8.11.0.tgz", + "integrity": "sha512-HPG3wQd9sNQoT9xHyNCXoDUa+Xw/VevmY9FoHyQ+g+rrMn4j6FB4np7Z0OhdTgjx6MgQLK7jwSy1YecU1+4Asg==", + "requires": {} + } + } +} diff --git a/server/package.json b/server/package.json new file mode 100644 index 0000000..e4f5b4a --- /dev/null +++ b/server/package.json @@ -0,0 +1,18 @@ +{ + "name": "chainreact-server", + "version": "2.0", + "private": true, + "scripts": { + "start": "node out/index.js", + "tsc": "npx tsc" + }, + "dependencies": { + "dotenv": "^16.0.3", + "https": "^1.0.0", + "socket.io": "^4.4.1", + "typescript": "^5.0.2" + }, + "devDependencies": { + "@types/node": "^18.15.3" + } +} diff --git a/server/src/chainreact.ts b/server/src/chainreact.ts new file mode 100644 index 0000000..986e1ea --- /dev/null +++ b/server/src/chainreact.ts @@ -0,0 +1,104 @@ +import {ServerGame} from "./game_standard"; +import {Client} from "./client"; +import {Room} from "./room"; + +export class Chainreact extends ServerGame { + + readyForTurn: Client[]; + currentTurnIndex: number; + currentGameData: any; + colorHues: { [id: string]: number }; + + constructor(room: Room, settings: Settings.Global) { + super(room, settings); + this.readyForTurn = [] + } + + setEvents(client: Client) { + let socket = client.socket; + socket.on('ready-for-turn', isDead => { + if (isDead) { + client.isPlayer = false; + client.isSpectator = true; + this.room.toAll('client-list', this.room.clients) + } else { + this.readyForTurn.push(client) + } + + let allReady = true; + this.room.players.forEach(c => { + if (this.readyForTurn.find(r => r.id === c.id) == null) { + allReady = false + } + }); + if (allReady) { + this.nextTurn(); + this.readyForTurn = [] + } + }); + socket.on('set-slot', (fieldsIndex: number, slotsIndex: number) => { + this.room.toAll('set-slot', fieldsIndex, slotsIndex, socket.id) + }); + socket.on('game-data', data => this.currentGameData = data) + } + + addClient(client: Client): void { + super.addClient(client); + if (client.isSpectator) { + let room = this.room; + let data = this.currentGameData; + let hues = this.colorHues; + let turnId = ''; + if (this.room.players[this.currentTurnIndex]) + turnId = this.room.players[this.currentTurnIndex].id; + client.send('start-spectate', room, data, hues, turnId) + } + } + + removeClient(client: Client): void { + super.removeClient(client); + if (this.room.players.indexOf(client) === this.currentTurnIndex) + this.nextTurn(true); + + let s = client.socket; + s.removeAllListeners('set-slot'); + s.removeAllListeners('ready-for-turn'); + s.removeAllListeners('game-data') + } + + nextTurn(skip?: boolean) { + if (this.currentTurnIndex != null && !skip) { + this.currentTurnIndex++; + if (this.currentTurnIndex >= this.room.players.length) { + this.currentTurnIndex = 0 + } + } else if (!skip) { + this.setTurnAndColors() + } + let index = this.currentTurnIndex; + if (skip) { + index = this.currentTurnIndex + 1; + if (index >= this.room.players.length) { + index = 0; + this.currentTurnIndex = 0 + } + } + if (this.room.players.length) { + this.room.toAll('current-turn', this.room.players[index].id) + } + } + + setTurnAndColors() { + this.currentTurnIndex = Math.floor(Math.random() * this.room.players.length); + let colorHues = [0, 60, 120, 240]; + this.colorHues = {}; + for (let c of this.room.players) { + let index = Math.floor(Math.random() * colorHues.length); + let hue = colorHues[index]; + colorHues.splice(index, 1); + this.colorHues[c.id] = hue + } + this.room.toAll('player-colors', this.colorHues) + } + +} \ No newline at end of file diff --git a/server/src/client.ts b/server/src/client.ts new file mode 100644 index 0000000..873e6a2 --- /dev/null +++ b/server/src/client.ts @@ -0,0 +1,168 @@ +import {Room} from "./room.js" +import {ConnectionManager, serializeObject} from "./manager.js" +import {log} from "./logger.js"; +import * as SocketIO from "socket.io"; + +export class Client { + + socket: SocketIO.Socket; + name: string; + game: string; + id: string; + isReady: boolean; + isPlayer: boolean; + isSpectator: boolean; + + constructor(socket: SocketIO.Socket, manager: ConnectionManager) { + this.socket = socket; + // @ts-ignore + this.name = socket.handshake.query.name; + // @ts-ignore + this.game = socket.handshake.query.game; + this.id = socket.id; + this.setEvents(manager) + } + + get serialized(): Serialized.Client { + return { + id: this.id, + name: this.name, + game: this.game, + isReady: this.isReady, + isPlayer: this.isPlayer, + isSpectator: this.isSpectator + }; + } + + setEvents(mng: ConnectionManager): void { + let s = this.socket; + s.on('room-list', () => this.sendRoomList()); + s.on('client-list', () => this.sendClientList()); + s.on('set-ready', ready => this.setReady(ready)); + s.on('game-settings', settings => this.setGameSettings(settings)); + s.on('create-lobby', (settings, name) => this.createRoom(settings, name)); + s.on('join-lobby', roomId => this.joinRoom(roomId)); + s.on('leave-lobby', roomId => this.leaveRoom(roomId)); + s.on('join-spectators', () => this.joinSpectators()); + s.on('join-players', () => this.joinPlayers()); + s.on('start-game', lobbyId => mng.startGame(this, lobbyId)); + s.on('stop-game', lobbyId => mng.stopGame(this, lobbyId)); + s.on('feedback', content => mng.saveFeedbackToFile(this, content)); + s.on('disconnect', () => mng.disconnected(this)); + + this.send('connected') + } + + sendRoomList(): void { + let rooms = ConnectionManager.RoomListByGame(this.game); + this.send('room-list', rooms) + } + + sendClientList(): void { + let clients = ConnectionManager.ClientListByClientId(this.id); + this.send('client-list', clients) + } + + setReady(ready: boolean): void { + let room = Room.getByClientId(this.id, ConnectionManager.Instance.rooms); + + if (room) { + this.isReady = ready; + room.toAll('client-list', room.clients) + } + } + + setGameSettings(settings: any): void { + let room = Room.getByClientId(this.id, ConnectionManager.Instance.rooms); + + if (room) { + room.gameSettings = settings; + room.toAll('game-settings', settings) + } + } + + createRoom(settings: Settings.Global, name: string): void { + let room = ConnectionManager.Instance.createRoom(settings, name); + + room.add(this); + this.send('created-lobby', room); + + log('lobby-created', this, room) + } + + joinRoom(roomId: string): Room { + let room = Room.getByRoomId(roomId, ConnectionManager.Instance.rooms); + + if (!room) { + this.send('join-failed', 'Room does not exist!'); + log('join-non-existent', this, new Room('not-existent', roomId)) + } else if (room.hasStarted && !room.settings.spectators) { + this.send('join-failed', 'Game has started yet!'); + log('join-started', this, room) + } else { + room.add(this); + log('member-joined', this, room) + } + return room + } + + leaveRoom(_roomId: string): void { + let room = Room.getByClientId(this.id, ConnectionManager.Instance.rooms); + + if (!room) + return; + + this.leave(room.id); + if (room.runningGame) + room.runningGame.removeClient(this); + room.clients.splice(room.clients.indexOf(this), 1); + room.toAll('member-left', this.id, this.name); + room.toAll('client-list', room.clients); + + this.send('left-lobby'); + + log('member-left', this, room); + + if (room.isEmpty && !room.settings.always) { + ConnectionManager.Instance.deleteRoom(room) + } + } + + joinSpectators() { + let room = Room.getByClientId(this.id, ConnectionManager.Instance.rooms); + if (!room) + return; + + this.isSpectator = true; + this.isPlayer = false; + + room.toAll('client-list', room.clients) + } + + joinPlayers() { + let room = Room.getByClientId(this.id, ConnectionManager.Instance.rooms); + if (!room) + return; + + if (room.hasStarted) + return; + + this.isSpectator = false; + this.isPlayer = true; + + room.toAll('client-list', room.clients) + } + + send(event: string, ...args: any[]): void { + this.socket.emit(event, ...serializeObject(args)) + } + + join(roomId: string): void { + this.socket.join(roomId) + } + + leave(roomId: string): void { + this.socket.leave(roomId) + } + +} \ No newline at end of file diff --git a/server/src/definitions/serialized.d.ts b/server/src/definitions/serialized.d.ts new file mode 100644 index 0000000..b7b6a04 --- /dev/null +++ b/server/src/definitions/serialized.d.ts @@ -0,0 +1,20 @@ +declare namespace Serialized { + + interface Lobby { + id: string + name: string + game: string + clientCounts: number[] + clients: Client[] + hasStarted: boolean + } + + interface Client { + id: string + name: string + game: string + isReady: boolean + isPlayer: boolean + isSpectator: boolean + } +} \ No newline at end of file diff --git a/server/src/definitions/settings.d.ts b/server/src/definitions/settings.d.ts new file mode 100644 index 0000000..0d73fef --- /dev/null +++ b/server/src/definitions/settings.d.ts @@ -0,0 +1,74 @@ +declare module Settings { + interface Global { + project: Project + frameWork: FrameWork + game: any + always: boolean + spectators: boolean + } + + interface Project { + name: string + author: string + playerCounts: number[] + } + + interface FrameWork { + frameRate: number + updateRate: number + width: number + height: number + } + + interface Game { + ball: Ball + player: Player + cw: number + ch: number + } + + interface Ball { + radius: number + velocity: number + acceleration: number + runUp: Ball.RunUp + color: Color + cw: number + ch: number + } + + interface Player { + width: number + height: number + margin: number + points: number + normal: State + weakened: State + enhanced: State + cw: number + ch: number + } + + interface Color { + stroke: string + fill: string + } + + interface State { + vel: Vector + color: Color + moveMargin: number + } + + interface Vector { + x: number + y: number + } + + module Ball { + interface RunUp { + min: number + max: number + } + } +} \ No newline at end of file diff --git a/server/src/game_standard.ts b/server/src/game_standard.ts new file mode 100644 index 0000000..33b4ca8 --- /dev/null +++ b/server/src/game_standard.ts @@ -0,0 +1,37 @@ +import {Room} from "./room.js" +import {Client} from "./client.js" + +export class ServerGame { + + room: Room; + settings: Settings.Global; + game: any; + + constructor(room: Room, settings: Settings.Global) { + this.settings = settings; + this.room = room; + this.room.clients.forEach(c => this.addClient(c)) + } + + addClient(client: Client): void { + this.setEvents(client) + } + + removeClient(client: Client): void { + this.removeEvents(client) + } + + gameAction(action: string, ...args: any[]): void { + } + + setEvents(client: Client): void { + let socket = client.socket; + socket.on('game-action', (action, ...args) => this.gameAction(action, ...args)) + } + + removeEvents(client: Client): void { + let socket = client.socket; + socket.removeAllListeners('game-action') + } + +} \ No newline at end of file diff --git a/server/src/index.ts b/server/src/index.ts new file mode 100644 index 0000000..8288048 --- /dev/null +++ b/server/src/index.ts @@ -0,0 +1,7 @@ +import {Chainreact} from "./chainreact"; +import {StartServer} from "./start"; + +StartServer({ + useP2P: false, + gameClass: Chainreact +}); \ No newline at end of file diff --git a/server/src/logger.ts b/server/src/logger.ts new file mode 100644 index 0000000..2b4e936 --- /dev/null +++ b/server/src/logger.ts @@ -0,0 +1,105 @@ +import {Room} from "./room.js" +import {Client} from "./client.js" + +import * as fs from "fs"; +import * as util from "util"; + +let logFolder = "./logs"; + +if (!fs.existsSync(logFolder)) { + fs.mkdirSync(logFolder); +} + +let logFile = fs.createWriteStream(logFolder + '/' + new Date().getTime() + '.log', {flags: 'a'}); +let logStdout = process.stdout; + +console.log = function () { + logFile.write(util.format.apply(null, arguments) + '\n'); + logStdout.write(util.format.apply(null, arguments) + '\n'); +}; + +console.error = console.log; + +process.on('uncaughtException', err => { + console.error('Uncaught error: ', err); + process.exit(1); +}); + +process.stdin.pipe(logFile); + + +export function log(type: string, client: Client, lobby?: Room, msg?: string) { + let now = new Date(Date.now()).toString(), message, name, game; + let date = '[' + now.substring(0, now.indexOf('GMT') - 1) + ']'; + + if (client) { + game = '[' + client.game + ']'; + let short = client.id.substring(0, Math.round(client.id.length / 3)); + name = '"' + client.name + '(' + short + '...)"'; + } else { + if (type === 'lobby-deleted') { + game = '[' + lobby.gameName + ']'; + } else { + game = '[undefined]'; + } + name = 'UNKNOWN'; + } + if (lobby) { + game = '[' + lobby.gameName + ']'; + } + switch (type) { + case 'join-non-existent': + message = name + ' tried to join non-existent lobby "' + lobby.id + '"'; + break; + case 'join-started': + message = name + ' tried to join the started game "' + lobby.id + '"'; + break; + case 'lobby-created': + message = name + ' created new lobby: "' + lobby.id + '"'; + break; + case 'game-started': + message = name + ' started the game: "' + lobby.id + '"'; + break; + case 'game-stopped': + message = name + ' stopped the game: "' + lobby.id + '"'; + break; + case 'member-joined': + message = name + ' joined the lobby "' + lobby.id + '"'; + break; + case 'member-left': + message = name + ' left the lobby "' + lobby.id + '"'; + break; + case 'lobby-deleted': + message = 'Lobby "' + lobby.id + '" was deleted'; + break; + case 'save-success': + message = msg; + break; + case 'save-error': + message = 'Failed to save contents to file: ' + msg; + break; + case 'load-success': + message = 'Successfully loaded and parsed file contents'; + break; + case 'load-error': + message = 'Failed to load file: ' + msg; + break; + case 'parse-error': + message = 'Failed to parse contents: ' + msg; + break; + case 'feedback': + message = 'Saved feedback to file: ' + msg; + break; + case 'connection': + message = name + ' connected'; + break; + case 'disconnection': + message = name + ' disconnected'; + break; + case 'startup': + message = msg; + break; + } + + console.log(date + game + ' ---> {' + message + '}'); +} \ No newline at end of file diff --git a/server/src/manager.ts b/server/src/manager.ts new file mode 100644 index 0000000..a15fabf --- /dev/null +++ b/server/src/manager.ts @@ -0,0 +1,148 @@ +import {Room} from "./room.js" +import {Client} from "./client.js" +import {log} from "./logger.js" +import * as fs from "fs"; +import * as SocketIO from "socket.io" + +export class ConnectionManager { + + static Instance: ConnectionManager; + io: SocketIO.Server; + rooms: Room[]; + + constructor(io: SocketIO.Server) { + ConnectionManager.Instance = this; + + this.io = io; + this.rooms = []; + + /*let drawSettings = { + project: { + name: 'global-draw', + playerCounts: null + }, + always: true, + spectators: true + }; + let drawRoom = this.createRoom(drawSettings, ''); + drawRoom.id = 'global-draw-room'; + drawRoom.startGame(); + this.rooms.push(drawRoom);*/ + } + + static RoomListByGame(game: string): Room[] { + return this.Instance.rooms.filter(l => l.gameName === game) + } + + static ClientListByClientId(clientId: string): Client[] { + let room = Room.getByClientId(clientId, this.Instance.rooms); + + return room.clients + } + + newSocket(socket: SocketIO.Socket): void { + let client = new Client(socket, this); + log('connection', client) + } + + roomListUpdate(): void { + this.io.sockets.emit('room-list', serializeObject(this.rooms)) + } + + createRoom(settings: Settings.Global | any, name: string): Room { + let roomId = Room.generateCode(10); + let room = new Room(name, roomId, settings, this.io); + + this.rooms.push(room); + this.roomListUpdate(); + + return room + } + + deleteRoom(room: Room): void { + this.rooms.splice(this.rooms.indexOf(room), 1); + this.roomListUpdate(); + + log('lobby-deleted', null, room) + } + + //Starts the game of a room with given id + startGame(client: Client, _roomId: string): void { + let lobby = Room.getByClientId(client.id, this.rooms); + if (!lobby) return; + + if (!lobby.hasStarted) { + lobby.startGame(); + log('game-started', client, lobby) + } + + this.io.sockets.emit('room-list', serializeObject(this.rooms)) + } + + //Stops the game of a lobby with given id + stopGame(client: Client, lobbyId: string): void { + let lobby = Room.getByRoomId(lobbyId, this.rooms); + if (!lobby) return; + + lobby.stopGame(client); + log('game-stopped', client, lobby) + } + + + //Saves user feedback to a file + saveFeedbackToFile(client: Client, content: string): void { + let date = new Date(Date.now()).toString(); + let path = "feedback/" + client.game + '.txt'; + let saveToFile = (content: string) => { + fs.writeFile(path, content, (err: any) => { + if (err) + log('save-error', client, null, err.message); + else + log('feedback', client, null, path) + }); + }; + if (fs.existsSync(path)) { + fs.readFile(path, 'utf8', (err, data) => { + if (err) + log('load-error', client, null, err.message); + else { + log('load-success', client, null); + let newContent = data + '\n\n\n\n' + date + '\n\n' + content; + saveToFile(newContent) + } + }) + } else { + saveToFile(date + '\n' + content) + } + } + + //Removes a disconnected client from all references + disconnected(client: Client): void { + let room = Room.getByClientId(client.id, this.rooms); + + if (room) + client.leaveRoom(room.id); + + log('disconnection', client) + } + +} + +export function serializeObject(object: any): any { + function serialize(obj: any) { + if (!obj) + return obj; + if (obj.serialized) + return obj.serialized; + else if (obj instanceof Array) { + let content = []; + obj.forEach(o => { + content.push(serialize(o)) + }); + return content + } + return obj + } + + return serialize(object) +} \ No newline at end of file diff --git a/server/src/room.ts b/server/src/room.ts new file mode 100644 index 0000000..8510b03 --- /dev/null +++ b/server/src/room.ts @@ -0,0 +1,135 @@ +import {Client} from "./client.js" +import {ServerGame} from "./game_standard.js" +import {serializeObject} from "./manager.js"; +import {Server} from "socket.io"; + +export class Room { + + id: string; + gameName: string; + clientCounts: number[]; + io: Server; + clients: Client[]; + runningGame: ServerGame; + settings: Settings.Global; + gameSettings: any; + name: string; + + static GameClass: typeof ServerGame + + constructor(name: string, id: string, settings?: Settings.Global, io?: Server) { + this.id = id; + this.name = name; + if (!io || !settings) return; + this.settings = settings; + this.gameName = settings.project.name; + this.clientCounts = settings.project.playerCounts; + this.io = io; + this.clients = []; + this.gameSettings = {} + } + + get leader(): Client { + return this.players[0] + } + + get players(): Client[] { + return this.clients.filter(c => c.isPlayer) + } + + get spectators(): Client[] { + return this.clients.filter(c => c.isSpectator) + } + + get serialized(): Serialized.Lobby { + return { + id: this.id, + name: this.name, + game: this.gameName, + clientCounts: this.clientCounts, + clients: serializeObject(this.clients), + hasStarted: this.hasStarted + }; + } + + get isEmpty(): boolean { + return !(this.clients.length) + } + + get hasStarted(): boolean { + return this.runningGame != null + } + + static getByRoomId(id: string, lobbies: Room[]): Room { + for (let l of lobbies) { + if (l.id === id) + return l + } + return null; + } + + static getByClientId(id: string, lobbies: Room[]): Room { + for (let l of lobbies) { + for (let c of l.clients) { + if (c.id === id) + return l + } + } + return null; + } + + static generateCode(elements: number): string { + let code = ''; + let possible = 'ABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789'; + while (elements--) { + code += possible.charAt(Math.floor(Math.random() * possible.length)) + } + return code + } + + startGame(): void { + let seed = Math.random() * 10000; + this.toAll('start-game', seed); + this.runGame() + } + + stopGame(client: Client): void { + this.toAll('stop-game', client); + this.runningGame = null + } + + add(client: Client): void { + this.clients.push(client); + + let isPlayer = !this.hasStarted && this.hasValidPlayerCount(); + client.isPlayer = isPlayer; + client.isSpectator = !isPlayer; + client.isReady = false; + client.join(this.id); + + this.toAll('member-joined', client.id, client.name); + this.toAll('client-list', this.clients); + this.toAll('game-settings', this.gameSettings); + + if (this.hasStarted) + this.runningGame.addClient(client) + } + + hasValidPlayerCount(): boolean { + let valid = false; + this.clientCounts.forEach(c => { + if (c === this.clients.length) + valid = true + }); + return valid + } + + runGame(): void { + this.runningGame = new Room.GameClass(this, this.settings); + } + + toAll(event: string, ...args: any[]): void { + this.io.to(this.id).emit(event, serializeObject(this), ...serializeObject(args)) + } + +} \ No newline at end of file diff --git a/server/src/start.ts b/server/src/start.ts new file mode 100644 index 0000000..82293ed --- /dev/null +++ b/server/src/start.ts @@ -0,0 +1,39 @@ +import {ConnectionManager} from "./manager.js"; +import {log} from "./logger.js"; + +import {Server} from 'socket.io'; +import {Room} from "./room.js"; +import * as https from "https"; +import * as fs from "fs"; + +export function StartServer(settings: any){ + + require("dotenv").config(); + const httpsPort = parseInt(process.env.HTTPS_PORT); + + let cert = fs.readFileSync(`${process.env.SSL_PATH}/cert.pem`); + let key = fs.readFileSync(`${process.env.SSL_PATH}/key.pem`); + + let httpsServer = https.createServer({key: key, cert: cert}); + + let sIO = new Server(httpsServer, { + cors: { + origin: ["https://play.benjamin-kraft.local", "https://play.benjamin-kraft.eu"] + } + }); + if (settings.useP2P){ + const p2p = require('socket.io-p2p-server').Server; + sIO.use(p2p); + } + + httpsServer.listen(httpsPort); + + Room.GameClass = settings.gameClass; + + let connectionManager = new ConnectionManager(sIO); + + // On new connection + sIO.on('connection', socket => connectionManager.newSocket(socket)); + + log('startup', null, null, 'Server is listening on port ' + httpsPort); +} \ No newline at end of file diff --git a/server/tsconfig.json b/server/tsconfig.json new file mode 100644 index 0000000..3be4fdb --- /dev/null +++ b/server/tsconfig.json @@ -0,0 +1,11 @@ +{ + "compilerOptions": { + "module": "CommonJS", + "outDir": "./out", + "sourceMap": true, + "alwaysStrict": true + }, + "include": [ + "./src" + ] +} \ No newline at end of file