diff --git a/package-lock.json b/package-lock.json
index d113ea008..208050086 100644
--- a/package-lock.json
+++ b/package-lock.json
@@ -2047,6 +2047,10 @@
"resolved": "packages/chess-app",
"link": true
},
+ "node_modules/@bitcoin-computer/chess-app-server": {
+ "resolved": "packages/chess-app-server",
+ "link": true
+ },
"node_modules/@bitcoin-computer/components": {
"resolved": "packages/components",
"link": true
@@ -5603,6 +5607,14 @@
"@types/node": "*"
}
},
+ "node_modules/@types/cors": {
+ "version": "2.8.17",
+ "resolved": "https://registry.npmjs.org/@types/cors/-/cors-2.8.17.tgz",
+ "integrity": "sha512-8CGDvrBj1zgo2qE+oS3pOCyYNqCPryMWY2bGfwA0dcfopWGgxs+78df0Rs3rc9THP4JkOhLsAa+15VdpAqkcUA==",
+ "dependencies": {
+ "@types/node": "*"
+ }
+ },
"node_modules/@types/dotenv": {
"version": "8.2.3",
"resolved": "https://registry.npmjs.org/@types/dotenv/-/dotenv-8.2.3.tgz",
@@ -5831,6 +5843,16 @@
"resolved": "https://registry.npmjs.org/@types/parse-json/-/parse-json-4.0.2.tgz",
"integrity": "sha512-dISoDXWWQwUquiKsyZ4Ng+HX2KsPL7LyHKHQwgGFEA3IaKac4Obd+h2a/a6waisAoepJlBcx9paWqjA8/HVjCw=="
},
+ "node_modules/@types/pg-promise": {
+ "version": "5.4.3",
+ "resolved": "https://registry.npmjs.org/@types/pg-promise/-/pg-promise-5.4.3.tgz",
+ "integrity": "sha512-ABgy5hzmcyRZxLNG6HUafpxbpmXGeVJ5dopKwssEsFeA7rpRakdoodt75HJNIjQB4He+s3PTfG1AoWQWm7OuCg==",
+ "deprecated": "This is a stub types definition for pg-promise (https://github.com/vitaly-t/pg-promise). pg-promise provides its own type definitions, so you don't need @types/pg-promise installed!",
+ "dev": true,
+ "dependencies": {
+ "pg-promise": "*"
+ }
+ },
"node_modules/@types/prettier": {
"version": "2.7.3",
"resolved": "https://registry.npmjs.org/@types/prettier/-/prettier-2.7.3.tgz",
@@ -6001,6 +6023,12 @@
"resolved": "https://registry.npmjs.org/@types/trusted-types/-/trusted-types-2.0.7.tgz",
"integrity": "sha512-ScaPdn1dQczgbl0QFTeTOmVHFULt394XJgOQNoyVhZ6r2vLnMLJfBPd53SB52T/3G36VI1/g2MZaX0cwDuXsfw=="
},
+ "node_modules/@types/uuid": {
+ "version": "9.0.8",
+ "resolved": "https://registry.npmjs.org/@types/uuid/-/uuid-9.0.8.tgz",
+ "integrity": "sha512-jg+97EGIcY9AGHJJRaaPVgetKDsrTgbRjQ5Msgjh/DQKEFl0DtyRr/VCOyD1T2R1MNeWPK/u7JoGhlDZnKBAfA==",
+ "dev": true
+ },
"node_modules/@types/ws": {
"version": "8.5.13",
"resolved": "https://registry.npmjs.org/@types/ws/-/ws-8.5.13.tgz",
@@ -9557,6 +9585,15 @@
"url": "https://github.com/sponsors/ljharb"
}
},
+ "node_modules/dateformat": {
+ "version": "4.6.3",
+ "resolved": "https://registry.npmjs.org/dateformat/-/dateformat-4.6.3.tgz",
+ "integrity": "sha512-2P0p0pFGzHS5EMnhdxQi7aJN+iMheud0UhG4dlE1DLAlvL8JHjJJTX/CSm4JXwV0Ka5nGk3zC5mcb5bUQUxxMA==",
+ "dev": true,
+ "engines": {
+ "node": "*"
+ }
+ },
"node_modules/dayjs": {
"version": "1.11.13",
"resolved": "https://registry.npmjs.org/dayjs/-/dayjs-1.11.13.tgz",
@@ -14067,6 +14104,12 @@
"node": ">= 4"
}
},
+ "node_modules/ignore-by-default": {
+ "version": "1.0.1",
+ "resolved": "https://registry.npmjs.org/ignore-by-default/-/ignore-by-default-1.0.1.tgz",
+ "integrity": "sha512-Ius2VYcGNk7T90CppJqcIkS5ooHUZyIQK+ClZfMfMNFEF9VSE73Fq+906u/CWu92x4gzZMWOwfFYckPObzdEbA==",
+ "dev": true
+ },
"node_modules/immer": {
"version": "9.0.21",
"resolved": "https://registry.npmjs.org/immer/-/immer-9.0.21.tgz",
@@ -18028,6 +18071,54 @@
"url": "https://github.com/sponsors/jonschlinkert"
}
},
+ "node_modules/migrate": {
+ "version": "2.1.0",
+ "resolved": "https://registry.npmjs.org/migrate/-/migrate-2.1.0.tgz",
+ "integrity": "sha512-xSwTScy7ozxQtzDtO/LpmZzWTmItXBC3k3wOQGf8TjHpudQUS/m7uyboBHHsv2nFmioyyC7gtbcI7IPj89aJLA==",
+ "dev": true,
+ "dependencies": {
+ "chalk": "^4.1.2",
+ "commander": "^2.20.3",
+ "dateformat": "^4.6.3",
+ "dotenv": "^16.0.0",
+ "inherits": "^2.0.3",
+ "minimatch": "^9.0.1",
+ "mkdirp": "^3.0.1",
+ "slug": "^8.2.2"
+ },
+ "bin": {
+ "migrate": "bin/migrate",
+ "migrate-create": "bin/migrate-create",
+ "migrate-down": "bin/migrate-down",
+ "migrate-init": "bin/migrate-init",
+ "migrate-list": "bin/migrate-list",
+ "migrate-up": "bin/migrate-up"
+ },
+ "engines": {
+ "node": ">= 14.0.0"
+ }
+ },
+ "node_modules/migrate/node_modules/commander": {
+ "version": "2.20.3",
+ "resolved": "https://registry.npmjs.org/commander/-/commander-2.20.3.tgz",
+ "integrity": "sha512-GpVkmM8vF2vQUkj2LvZmD35JxeJOLCwJ9cUkugyk2nuhbv3+mJvpLYYt+0+USMxE+oj+ey/lJEnhZw75x/OMcQ==",
+ "dev": true
+ },
+ "node_modules/migrate/node_modules/mkdirp": {
+ "version": "3.0.1",
+ "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-3.0.1.tgz",
+ "integrity": "sha512-+NsyUUAZDmo6YVHzL/stxSu3t9YS1iljliy3BSDrXJ/dkn1KYdmtZODGGjLcc9XLgVVpH4KshHB8XmZgMhaBXg==",
+ "dev": true,
+ "bin": {
+ "mkdirp": "dist/cjs/src/bin.js"
+ },
+ "engines": {
+ "node": ">=10"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/isaacs"
+ }
+ },
"node_modules/miller-rabin": {
"version": "4.0.1",
"resolved": "https://registry.npmjs.org/miller-rabin/-/miller-rabin-4.0.1.tgz",
@@ -18201,7 +18292,6 @@
"resolved": "https://registry.npmjs.org/minimatch/-/minimatch-9.0.3.tgz",
"integrity": "sha512-RHiac9mvaRw0x3AYRgDC1CxAP7HTcNrrECeA8YYJeWnpo+2Q5CegtZjaotWTWxDG3UeGA1coE05iH1mPjT/2mg==",
"dev": true,
- "peer": true,
"dependencies": {
"brace-expansion": "^2.0.1"
},
@@ -18504,6 +18594,77 @@
"resolved": "https://registry.npmjs.org/node-releases/-/node-releases-2.0.18.tgz",
"integrity": "sha512-d9VeXT4SJ7ZeOqGX6R5EM022wpL+eWPooLI+5UpWn2jCT1aosUQEhQP214x33Wkwx3JQMvIm+tIoVOdodFS40g=="
},
+ "node_modules/nodemon": {
+ "version": "3.1.7",
+ "resolved": "https://registry.npmjs.org/nodemon/-/nodemon-3.1.7.tgz",
+ "integrity": "sha512-hLj7fuMow6f0lbB0cD14Lz2xNjwsyruH251Pk4t/yIitCFJbmY1myuLlHm/q06aST4jg6EgAh74PIBBrRqpVAQ==",
+ "dev": true,
+ "dependencies": {
+ "chokidar": "^3.5.2",
+ "debug": "^4",
+ "ignore-by-default": "^1.0.1",
+ "minimatch": "^3.1.2",
+ "pstree.remy": "^1.1.8",
+ "semver": "^7.5.3",
+ "simple-update-notifier": "^2.0.0",
+ "supports-color": "^5.5.0",
+ "touch": "^3.1.0",
+ "undefsafe": "^2.0.5"
+ },
+ "bin": {
+ "nodemon": "bin/nodemon.js"
+ },
+ "engines": {
+ "node": ">=10"
+ },
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/nodemon"
+ }
+ },
+ "node_modules/nodemon/node_modules/brace-expansion": {
+ "version": "1.1.11",
+ "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz",
+ "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==",
+ "dev": true,
+ "dependencies": {
+ "balanced-match": "^1.0.0",
+ "concat-map": "0.0.1"
+ }
+ },
+ "node_modules/nodemon/node_modules/has-flag": {
+ "version": "3.0.0",
+ "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz",
+ "integrity": "sha512-sKJf1+ceQBr4SMkvQnBDNDtf4TXpVhVGateu0t918bl30FnbE2m4vNLX+VWe/dpjlb+HugGYzW7uQXH98HPEYw==",
+ "dev": true,
+ "engines": {
+ "node": ">=4"
+ }
+ },
+ "node_modules/nodemon/node_modules/minimatch": {
+ "version": "3.1.2",
+ "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz",
+ "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==",
+ "dev": true,
+ "dependencies": {
+ "brace-expansion": "^1.1.7"
+ },
+ "engines": {
+ "node": "*"
+ }
+ },
+ "node_modules/nodemon/node_modules/supports-color": {
+ "version": "5.5.0",
+ "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz",
+ "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==",
+ "dev": true,
+ "dependencies": {
+ "has-flag": "^3.0.0"
+ },
+ "engines": {
+ "node": ">=4"
+ }
+ },
"node_modules/normalize-path": {
"version": "3.0.0",
"resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-3.0.0.tgz",
@@ -21149,6 +21310,12 @@
"punycode": "^2.3.1"
}
},
+ "node_modules/pstree.remy": {
+ "version": "1.1.8",
+ "resolved": "https://registry.npmjs.org/pstree.remy/-/pstree.remy-1.1.8.tgz",
+ "integrity": "sha512-77DZwxQmxKnu3aR542U+X8FypNzbfJ+C5XQDk3uWjWxn6151aIMGthWYRXTqT1E5oJvg+ljaa2OJi+VfvCOQ8w==",
+ "dev": true
+ },
"node_modules/public-encrypt": {
"version": "4.0.3",
"resolved": "https://registry.npmjs.org/public-encrypt/-/public-encrypt-4.0.3.tgz",
@@ -22842,6 +23009,18 @@
"resolved": "https://registry.npmjs.org/is-arrayish/-/is-arrayish-0.3.2.tgz",
"integrity": "sha512-eVRqCvVlZbuw3GrM63ovNSNAeA1K16kaR/LRY/92w0zxQ5/1YzwblUX652i4Xs9RwAGjW9d9y6X88t8OaAJfWQ=="
},
+ "node_modules/simple-update-notifier": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/simple-update-notifier/-/simple-update-notifier-2.0.0.tgz",
+ "integrity": "sha512-a2B9Y0KlNXl9u/vsW6sTIu9vGEpfKu2wRV6l1H3XEas/0gUIzGzBoP/IouTcUQbm9JWZLH3COxyn03TYlFax6w==",
+ "dev": true,
+ "dependencies": {
+ "semver": "^7.5.3"
+ },
+ "engines": {
+ "node": ">=10"
+ }
+ },
"node_modules/sinon": {
"version": "14.0.2",
"resolved": "https://registry.npmjs.org/sinon/-/sinon-14.0.2.tgz",
@@ -22914,6 +23093,15 @@
"url": "https://github.com/chalk/slice-ansi?sponsor=1"
}
},
+ "node_modules/slug": {
+ "version": "8.2.3",
+ "resolved": "https://registry.npmjs.org/slug/-/slug-8.2.3.tgz",
+ "integrity": "sha512-fXjhAZszNecz855GUNIwW0+sFPi9WV4bMiEKDOCA4wcq1ts1UnUVNy/F78B0Aat7/W3rA+se//33ILKNMrbeYQ==",
+ "dev": true,
+ "bin": {
+ "slug": "cli.js"
+ }
+ },
"node_modules/sockjs": {
"version": "0.3.24",
"resolved": "https://registry.npmjs.org/sockjs/-/sockjs-0.3.24.tgz",
@@ -24763,6 +24951,15 @@
"node": ">=0.6"
}
},
+ "node_modules/touch": {
+ "version": "3.1.1",
+ "resolved": "https://registry.npmjs.org/touch/-/touch-3.1.1.tgz",
+ "integrity": "sha512-r0eojU4bI8MnHr8c5bNo7lJDdI2qXlWWJk6a9EAFG7vbhTjElYhBVS3/miuE0uOuoLdb8Mc/rVfsmm6eo5o9GA==",
+ "dev": true,
+ "bin": {
+ "nodetouch": "bin/nodetouch.js"
+ }
+ },
"node_modules/tough-cookie": {
"version": "4.1.4",
"resolved": "https://registry.npmjs.org/tough-cookie/-/tough-cookie-4.1.4.tgz",
@@ -25003,6 +25200,237 @@
"resolved": "https://registry.npmjs.org/tslib/-/tslib-2.8.1.tgz",
"integrity": "sha512-oJFu94HQb+KVduSUQL7wnpmqnfmLsOA/nAh6b6EH0wCEoK0/mPeXU6c3wKDV83MkOuHPRHtSXKKU99IBazS/2w=="
},
+ "node_modules/tslint": {
+ "version": "6.1.3",
+ "resolved": "https://registry.npmjs.org/tslint/-/tslint-6.1.3.tgz",
+ "integrity": "sha512-IbR4nkT96EQOvKE2PW/djGz8iGNeJ4rF2mBfiYaR/nvUWYKJhLwimoJKgjIFEIDibBtOevj7BqCRL4oHeWWUCg==",
+ "deprecated": "TSLint has been deprecated in favor of ESLint. Please see https://github.com/palantir/tslint/issues/4534 for more information.",
+ "dev": true,
+ "dependencies": {
+ "@babel/code-frame": "^7.0.0",
+ "builtin-modules": "^1.1.1",
+ "chalk": "^2.3.0",
+ "commander": "^2.12.1",
+ "diff": "^4.0.1",
+ "glob": "^7.1.1",
+ "js-yaml": "^3.13.1",
+ "minimatch": "^3.0.4",
+ "mkdirp": "^0.5.3",
+ "resolve": "^1.3.2",
+ "semver": "^5.3.0",
+ "tslib": "^1.13.0",
+ "tsutils": "^2.29.0"
+ },
+ "bin": {
+ "tslint": "bin/tslint"
+ },
+ "engines": {
+ "node": ">=4.8.0"
+ },
+ "peerDependencies": {
+ "typescript": ">=2.3.0-dev || >=2.4.0-dev || >=2.5.0-dev || >=2.6.0-dev || >=2.7.0-dev || >=2.8.0-dev || >=2.9.0-dev || >=3.0.0-dev || >= 3.1.0-dev || >= 3.2.0-dev || >= 4.0.0-dev"
+ }
+ },
+ "node_modules/tslint/node_modules/ansi-styles": {
+ "version": "3.2.1",
+ "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz",
+ "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==",
+ "dev": true,
+ "dependencies": {
+ "color-convert": "^1.9.0"
+ },
+ "engines": {
+ "node": ">=4"
+ }
+ },
+ "node_modules/tslint/node_modules/argparse": {
+ "version": "1.0.10",
+ "resolved": "https://registry.npmjs.org/argparse/-/argparse-1.0.10.tgz",
+ "integrity": "sha512-o5Roy6tNG4SL/FOkCAN6RzjiakZS25RLYFrcMttJqbdd8BWrnA+fGz57iN5Pb06pvBGvl5gQ0B48dJlslXvoTg==",
+ "dev": true,
+ "dependencies": {
+ "sprintf-js": "~1.0.2"
+ }
+ },
+ "node_modules/tslint/node_modules/brace-expansion": {
+ "version": "1.1.11",
+ "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz",
+ "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==",
+ "dev": true,
+ "dependencies": {
+ "balanced-match": "^1.0.0",
+ "concat-map": "0.0.1"
+ }
+ },
+ "node_modules/tslint/node_modules/builtin-modules": {
+ "version": "1.1.1",
+ "resolved": "https://registry.npmjs.org/builtin-modules/-/builtin-modules-1.1.1.tgz",
+ "integrity": "sha512-wxXCdllwGhI2kCC0MnvTGYTMvnVZTvqgypkiTI8Pa5tcz2i6VqsqwYGgqwXji+4RgCzms6EajE4IxiUH6HH8nQ==",
+ "dev": true,
+ "engines": {
+ "node": ">=0.10.0"
+ }
+ },
+ "node_modules/tslint/node_modules/chalk": {
+ "version": "2.4.2",
+ "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz",
+ "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==",
+ "dev": true,
+ "dependencies": {
+ "ansi-styles": "^3.2.1",
+ "escape-string-regexp": "^1.0.5",
+ "supports-color": "^5.3.0"
+ },
+ "engines": {
+ "node": ">=4"
+ }
+ },
+ "node_modules/tslint/node_modules/color-convert": {
+ "version": "1.9.3",
+ "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz",
+ "integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==",
+ "dev": true,
+ "dependencies": {
+ "color-name": "1.1.3"
+ }
+ },
+ "node_modules/tslint/node_modules/color-name": {
+ "version": "1.1.3",
+ "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz",
+ "integrity": "sha512-72fSenhMw2HZMTVHeCA9KCmpEIbzWiQsjN+BHcBbS9vr1mtt+vJjPdksIBNUmKAW8TFUDPJK5SUU3QhE9NEXDw==",
+ "dev": true
+ },
+ "node_modules/tslint/node_modules/commander": {
+ "version": "2.20.3",
+ "resolved": "https://registry.npmjs.org/commander/-/commander-2.20.3.tgz",
+ "integrity": "sha512-GpVkmM8vF2vQUkj2LvZmD35JxeJOLCwJ9cUkugyk2nuhbv3+mJvpLYYt+0+USMxE+oj+ey/lJEnhZw75x/OMcQ==",
+ "dev": true
+ },
+ "node_modules/tslint/node_modules/diff": {
+ "version": "4.0.2",
+ "resolved": "https://registry.npmjs.org/diff/-/diff-4.0.2.tgz",
+ "integrity": "sha512-58lmxKSA4BNyLz+HHMUzlOEpg09FV+ev6ZMe3vJihgdxzgcwZ8VoEEPmALCZG9LmqfVoNMMKpttIYTVG6uDY7A==",
+ "dev": true,
+ "engines": {
+ "node": ">=0.3.1"
+ }
+ },
+ "node_modules/tslint/node_modules/escape-string-regexp": {
+ "version": "1.0.5",
+ "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz",
+ "integrity": "sha512-vbRorB5FUQWvla16U8R/qgaFIya2qGzwDrNmCZuYKrbdSUMG6I1ZCGQRefkRVhuOkIGVne7BQ35DSfo1qvJqFg==",
+ "dev": true,
+ "engines": {
+ "node": ">=0.8.0"
+ }
+ },
+ "node_modules/tslint/node_modules/esprima": {
+ "version": "4.0.1",
+ "resolved": "https://registry.npmjs.org/esprima/-/esprima-4.0.1.tgz",
+ "integrity": "sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A==",
+ "dev": true,
+ "bin": {
+ "esparse": "bin/esparse.js",
+ "esvalidate": "bin/esvalidate.js"
+ },
+ "engines": {
+ "node": ">=4"
+ }
+ },
+ "node_modules/tslint/node_modules/glob": {
+ "version": "7.2.3",
+ "resolved": "https://registry.npmjs.org/glob/-/glob-7.2.3.tgz",
+ "integrity": "sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==",
+ "deprecated": "Glob versions prior to v9 are no longer supported",
+ "dev": true,
+ "dependencies": {
+ "fs.realpath": "^1.0.0",
+ "inflight": "^1.0.4",
+ "inherits": "2",
+ "minimatch": "^3.1.1",
+ "once": "^1.3.0",
+ "path-is-absolute": "^1.0.0"
+ },
+ "engines": {
+ "node": "*"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/isaacs"
+ }
+ },
+ "node_modules/tslint/node_modules/has-flag": {
+ "version": "3.0.0",
+ "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz",
+ "integrity": "sha512-sKJf1+ceQBr4SMkvQnBDNDtf4TXpVhVGateu0t918bl30FnbE2m4vNLX+VWe/dpjlb+HugGYzW7uQXH98HPEYw==",
+ "dev": true,
+ "engines": {
+ "node": ">=4"
+ }
+ },
+ "node_modules/tslint/node_modules/js-yaml": {
+ "version": "3.14.1",
+ "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-3.14.1.tgz",
+ "integrity": "sha512-okMH7OXXJ7YrN9Ok3/SXrnu4iX9yOk+25nqX4imS2npuvTYDmo/QEZoqwZkYaIDk3jVvBOTOIEgEhaLOynBS9g==",
+ "dev": true,
+ "dependencies": {
+ "argparse": "^1.0.7",
+ "esprima": "^4.0.0"
+ },
+ "bin": {
+ "js-yaml": "bin/js-yaml.js"
+ }
+ },
+ "node_modules/tslint/node_modules/minimatch": {
+ "version": "3.1.2",
+ "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz",
+ "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==",
+ "dev": true,
+ "dependencies": {
+ "brace-expansion": "^1.1.7"
+ },
+ "engines": {
+ "node": "*"
+ }
+ },
+ "node_modules/tslint/node_modules/semver": {
+ "version": "5.7.2",
+ "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.2.tgz",
+ "integrity": "sha512-cBznnQ9KjJqU67B52RMC65CMarK2600WFnbkcaiwWq3xy/5haFJlshgnpjovMVJ+Hff49d8GEn0b87C5pDQ10g==",
+ "dev": true,
+ "bin": {
+ "semver": "bin/semver"
+ }
+ },
+ "node_modules/tslint/node_modules/supports-color": {
+ "version": "5.5.0",
+ "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz",
+ "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==",
+ "dev": true,
+ "dependencies": {
+ "has-flag": "^3.0.0"
+ },
+ "engines": {
+ "node": ">=4"
+ }
+ },
+ "node_modules/tslint/node_modules/tslib": {
+ "version": "1.14.1",
+ "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.14.1.tgz",
+ "integrity": "sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg==",
+ "dev": true
+ },
+ "node_modules/tslint/node_modules/tsutils": {
+ "version": "2.29.0",
+ "resolved": "https://registry.npmjs.org/tsutils/-/tsutils-2.29.0.tgz",
+ "integrity": "sha512-g5JVHCIJwzfISaXpXE1qvNalca5Jwob6FjI4AoPlqMusJ6ftFE7IkkFoMhVLRgK+4Kx3gkzb8UZK5t5yTTvEmA==",
+ "dev": true,
+ "dependencies": {
+ "tslib": "^1.8.1"
+ },
+ "peerDependencies": {
+ "typescript": ">=2.1.0 || >=2.1.0-dev || >=2.2.0-dev || >=2.3.0-dev || >=2.4.0-dev || >=2.5.0-dev || >=2.6.0-dev || >=2.7.0-dev || >=2.8.0-dev || >=2.9.0-dev || >= 3.0.0-dev || >= 3.1.0-dev"
+ }
+ },
"node_modules/tsutils": {
"version": "3.21.0",
"resolved": "https://registry.npmjs.org/tsutils/-/tsutils-3.21.0.tgz",
@@ -25429,6 +25857,12 @@
"url": "https://github.com/sponsors/ljharb"
}
},
+ "node_modules/undefsafe": {
+ "version": "2.0.5",
+ "resolved": "https://registry.npmjs.org/undefsafe/-/undefsafe-2.0.5.tgz",
+ "integrity": "sha512-WxONCrssBM8TSPRqN5EmsjVrsv4A8X12J4ArBiiayv3DyyG3ZlIg6yysuuSYdZsVz3TKcTg2fd//Ujd4CHV1iA==",
+ "dev": true
+ },
"node_modules/underscore": {
"version": "1.12.1",
"resolved": "https://registry.npmjs.org/underscore/-/underscore-1.12.1.tgz",
@@ -27746,6 +28180,88 @@
"vitest": "^2.0.5"
}
},
+ "packages/chess-app-server": {
+ "name": "@bitcoin-computer/chess-app-server",
+ "version": "0.22.0-beta.0",
+ "dependencies": {
+ "@types/cors": "^2.8.17",
+ "cors": "^2.8.5",
+ "dotenv": "^16.4.5",
+ "express": "^4.18.2",
+ "pg-promise": "^11.5.4",
+ "ts-node": "^10.9.2",
+ "tsconfig-paths": "^4.2.0",
+ "uuid": "^9.0.1"
+ },
+ "devDependencies": {
+ "@types/express": "^5.0.0",
+ "@types/node": "^20.11.20",
+ "@types/pg-promise": "^5.4.3",
+ "@types/uuid": "9.0.8",
+ "migrate": "^2.1.0",
+ "nodemon": "^3.1.0",
+ "tslint": "^6.1.3",
+ "typescript": "^5.3.3"
+ }
+ },
+ "packages/chess-app-server/node_modules/@types/express": {
+ "version": "5.0.0",
+ "resolved": "https://registry.npmjs.org/@types/express/-/express-5.0.0.tgz",
+ "integrity": "sha512-DvZriSMehGHL1ZNLzi6MidnsDhUZM/x2pRdDIKdwbUNqqwHxMlRdkxtn6/EPKyqKpHqTl/4nRZsRNLpZxZRpPQ==",
+ "dev": true,
+ "dependencies": {
+ "@types/body-parser": "*",
+ "@types/express-serve-static-core": "^5.0.0",
+ "@types/qs": "*",
+ "@types/serve-static": "*"
+ }
+ },
+ "packages/chess-app-server/node_modules/strip-bom": {
+ "version": "3.0.0",
+ "resolved": "https://registry.npmjs.org/strip-bom/-/strip-bom-3.0.0.tgz",
+ "integrity": "sha512-vavAMRXOgBVNF6nyEEmL3DBK19iRpDcoIwW+swQ+CbGiu7lju6t+JklA1MHweoWtadgt4ISVUsXLyDq34ddcwA==",
+ "engines": {
+ "node": ">=4"
+ }
+ },
+ "packages/chess-app-server/node_modules/tsconfig-paths": {
+ "version": "4.2.0",
+ "resolved": "https://registry.npmjs.org/tsconfig-paths/-/tsconfig-paths-4.2.0.tgz",
+ "integrity": "sha512-NoZ4roiN7LnbKn9QqE1amc9DJfzvZXxF4xDavcOWt1BPkdx+m+0gJuPM+S0vCe7zTJMYUP0R8pO2XMr+Y8oLIg==",
+ "dependencies": {
+ "json5": "^2.2.2",
+ "minimist": "^1.2.6",
+ "strip-bom": "^3.0.0"
+ },
+ "engines": {
+ "node": ">=6"
+ }
+ },
+ "packages/chess-app-server/node_modules/typescript": {
+ "version": "5.6.3",
+ "resolved": "https://registry.npmjs.org/typescript/-/typescript-5.6.3.tgz",
+ "integrity": "sha512-hjcS1mhfuyi4WW8IWtjP7brDrG2cuDZukyrYrSauoXGNgx0S7zceP07adYkJycEr56BOUTNPzbInooiN3fn1qw==",
+ "dev": true,
+ "bin": {
+ "tsc": "bin/tsc",
+ "tsserver": "bin/tsserver"
+ },
+ "engines": {
+ "node": ">=14.17"
+ }
+ },
+ "packages/chess-app-server/node_modules/uuid": {
+ "version": "9.0.1",
+ "resolved": "https://registry.npmjs.org/uuid/-/uuid-9.0.1.tgz",
+ "integrity": "sha512-b+1eJOlsR9K8HJpow9Ok3fiWOWSIcIzXodvv0rQjVoOVNpWMpxf1wZNpt4y9h10odCNrqnYp1OBzRktckBe3sA==",
+ "funding": [
+ "https://github.com/sponsors/broofa",
+ "https://github.com/sponsors/ctavan"
+ ],
+ "bin": {
+ "uuid": "dist/bin/uuid"
+ }
+ },
"packages/chess-app/node_modules/@eslint/eslintrc": {
"version": "3.1.0",
"resolved": "https://registry.npmjs.org/@eslint/eslintrc/-/eslintrc-3.1.0.tgz",
diff --git a/packages/chess-app-server/.env.example b/packages/chess-app-server/.env.example
new file mode 100644
index 000000000..0d1b25666
--- /dev/null
+++ b/packages/chess-app-server/.env.example
@@ -0,0 +1,5 @@
+DB_HOST=localhost
+DB_PORT=5434
+POSTGRES_USER=postgres
+POSTGRES_DB=chess
+POSTGRES_PASSWORD=postgres
diff --git a/packages/chess-app-server/.gitignore b/packages/chess-app-server/.gitignore
new file mode 100644
index 000000000..9cbf0ac86
--- /dev/null
+++ b/packages/chess-app-server/.gitignore
@@ -0,0 +1 @@
+db/db-data
\ No newline at end of file
diff --git a/packages/chess-app-server/.prettierrc b/packages/chess-app-server/.prettierrc
new file mode 100644
index 000000000..a65b64ade
--- /dev/null
+++ b/packages/chess-app-server/.prettierrc
@@ -0,0 +1,6 @@
+{
+ "printWidth": 100,
+ "semi": false,
+ "singleQuote": true,
+ "trailingComma": "none"
+}
diff --git a/packages/chess-app-server/Dockerfile b/packages/chess-app-server/Dockerfile
new file mode 100644
index 000000000..fe9b511c0
--- /dev/null
+++ b/packages/chess-app-server/Dockerfile
@@ -0,0 +1,16 @@
+FROM node:16.13
+
+WORKDIR /app
+
+COPY package.json .
+COPY package-lock.json* ./
+
+RUN npm install
+
+COPY . .
+
+# Expose the port the app runs on
+EXPOSE 4000
+
+# Command to run the application
+CMD ["npm", "run", "start"]
diff --git a/packages/chess-app-server/db/db.ts b/packages/chess-app-server/db/db.ts
new file mode 100644
index 000000000..153e19c8b
--- /dev/null
+++ b/packages/chess-app-server/db/db.ts
@@ -0,0 +1,18 @@
+import pgPromise from "pg-promise";
+import dotenv from "dotenv";
+
+dotenv.config();
+
+const pgp = pgPromise();
+const connectionConfig = {
+ host: process.env.DB_HOST,
+ port: parseInt(process.env.DB_PORT || "", 10),
+ database: process.env.POSTGRES_DB,
+ user: process.env.POSTGRES_USER,
+ password: process.env.POSTGRES_PASSWORD,
+ schema: "public",
+};
+
+const db = pgp(connectionConfig);
+
+export { db };
diff --git a/packages/chess-app-server/db/db_schema.sql b/packages/chess-app-server/db/db_schema.sql
new file mode 100644
index 000000000..a8046e3f2
--- /dev/null
+++ b/packages/chess-app-server/db/db_schema.sql
@@ -0,0 +1,9 @@
+CREATE TABLE IF NOT EXISTS
+ "Games" (
+ "id" VARCHAR(70) NOT NULL PRIMARY KEY,
+ "gameId" VARCHAR(66),
+ "firstPlayerPubKey" VARCHAR(66),
+ "secondPlayerPubKey" VARCHAR(66),
+ "firstPlayerHash" VARCHAR(66),
+ "secondPlayerHash" VARCHAR(66)
+ );
\ No newline at end of file
diff --git a/packages/chess-app-server/docker-compose.yml b/packages/chess-app-server/docker-compose.yml
new file mode 100644
index 000000000..1766040ab
--- /dev/null
+++ b/packages/chess-app-server/docker-compose.yml
@@ -0,0 +1,29 @@
+version: "3"
+services:
+ express-app:
+ env_file: .env
+ environment:
+ - DB_HOST=postgres
+ - DB_PORT=5432
+ build: .
+ image: chess-app-server
+ volumes:
+ - ./src:/app/src
+ ports:
+ - "4000:4000"
+ networks:
+ - express-app
+ depends_on:
+ - postgres
+ postgres:
+ image: postgres
+ env_file: .env
+ ports:
+ - "5434:5432"
+ volumes:
+ - ./db/db-data:/var/lib/postgresql/data
+ - ./db/db_schema.sql:/docker-entrypoint-initdb.d/db_schema.sql
+ networks:
+ - express-app
+networks:
+ express-app: null
diff --git a/packages/chess-app-server/package.json b/packages/chess-app-server/package.json
new file mode 100644
index 000000000..c4839674d
--- /dev/null
+++ b/packages/chess-app-server/package.json
@@ -0,0 +1,37 @@
+{
+ "name": "@bitcoin-computer/chess-app-server",
+ "version": "0.22.0-beta.0",
+ "type": "module",
+ "private": true,
+ "scripts": {
+ "start:dev": "nodemon --exec npm run start -- --ext ts",
+ "start": "node --loader ts-node/esm.mjs -r tsconfig-paths/register src/app.ts",
+ "migrate": "migrate up",
+ "rollback": "migrate down",
+ "create-migration": "migrate create",
+ "lint": "tslint -p tsconfig.json --fix",
+ "start-postgres": "docker-compose up postgres",
+ "up": "docker-compose up",
+ "build-docker": "docker build -t chess-app-server ."
+ },
+ "dependencies": {
+ "@types/cors": "^2.8.17",
+ "cors": "^2.8.5",
+ "dotenv": "^16.4.5",
+ "express": "^4.18.2",
+ "pg-promise": "^11.5.4",
+ "ts-node": "^10.9.2",
+ "tsconfig-paths": "^4.2.0",
+ "uuid": "^9.0.1"
+ },
+ "devDependencies": {
+ "@types/express": "^5.0.0",
+ "@types/node": "^20.11.20",
+ "@types/pg-promise": "^5.4.3",
+ "@types/uuid": "9.0.8",
+ "migrate": "^2.1.0",
+ "nodemon": "^3.1.0",
+ "tslint": "^6.1.3",
+ "typescript": "^5.3.3"
+ }
+}
diff --git a/packages/chess-app-server/src/app.ts b/packages/chess-app-server/src/app.ts
new file mode 100644
index 000000000..2b5c34aae
--- /dev/null
+++ b/packages/chess-app-server/src/app.ts
@@ -0,0 +1,50 @@
+import express, { Request, Response } from 'express'
+import { v4 as uuidv4 } from 'uuid'
+import { db } from '../db/db.js'
+import cors from 'cors'
+
+const app = express()
+const PORT = 4000
+
+app.use(cors())
+app.use(express.json())
+
+app.get('/games/:gameId', async (req: Request, res: Response) => {
+ try {
+ const gameId = req.params.gameId
+
+ const data = await db.query(`SELECT * FROM "Games" WHERE "gameId" = $1`, [gameId])
+
+ if (data) {
+ res.json(data)
+ } else {
+ res.status(404).json({ message: 'Data not found' })
+ }
+ } catch (error) {
+ console.error('Error:', error)
+ res.status(500).json({ error: 'Internal server error' })
+ }
+})
+
+app.post('/games', async (req, res) => {
+ try {
+ const { gameId, firstPlayerPubKey, secondPlayerPubKey } = req.body
+
+ // You can perform validation here before updating the data
+ const id = uuidv4()
+
+ await db.none(
+ `INSERT INTO "Games" (id, "gameId", "firstPlayerPubKey", "secondPlayerPubKey", "firstPlayerHash", "secondPlayerHash") VALUES ($1, $2, $3, $4, $5, $6);`,
+ [id, gameId, firstPlayerPubKey, secondPlayerPubKey, 'hash1', 'hash2']
+ )
+
+ res.status(201).json({ message: 'Game added successfully' })
+ } catch (error) {
+ console.error('Error:', error)
+ res.status(500).json({ error: 'Internal server error' })
+ }
+})
+
+app.listen(PORT, () => {
+ console.log(`Server is running on port ${PORT}`)
+})
diff --git a/packages/chess-app-server/tsconfig.json b/packages/chess-app-server/tsconfig.json
new file mode 100644
index 000000000..791b2b065
--- /dev/null
+++ b/packages/chess-app-server/tsconfig.json
@@ -0,0 +1,14 @@
+{
+ "compilerOptions": {
+ "target": "ES6",
+ "module": "ESNext",
+ "outDir": "./dist",
+ "strict": true,
+ "esModuleInterop": true,
+ "moduleResolution": "node",
+ "baseUrl": "./",
+ "paths": {
+ "*": ["src/*"]
+ }
+ }
+}
diff --git a/packages/chess-app/.env.example b/packages/chess-app/.env.example
index 34d733588..663c6f255 100644
--- a/packages/chess-app/.env.example
+++ b/packages/chess-app/.env.example
@@ -2,6 +2,7 @@
VITE_CHAIN=LTC
VITE_NETWORK=regtest
VITE_URL=http://127.0.0.1:1031
+VITE_API_BASE_URL=http://127.0.0.1:4000
# Application Port
VITE_PORT=1032
diff --git a/packages/chess-app/src/components/CreateNewGame.tsx b/packages/chess-app/src/components/CreateNewGame.tsx
index 9966df98e..39f75b7b6 100644
--- a/packages/chess-app/src/components/CreateNewGame.tsx
+++ b/packages/chess-app/src/components/CreateNewGame.tsx
@@ -3,6 +3,7 @@ import { ComputerContext, Modal, UtilsContext } from "@bitcoin-computer/componen
import { Link } from "react-router-dom"
import { Computer } from "@bitcoin-computer/lib"
import { VITE_CHESS_GAME_MOD_SPEC } from "../constants/modSpecs"
+import { createGame } from "../services/game.service"
function SuccessContent(id: string) {
return (
@@ -66,7 +67,6 @@ function MintForm(props: {
}) {
const { computer, setSuccessRev, setErrorMsg } = props
const [name, setName] = useState("")
- const [color, setColor] = useState("black")
const [secondPlayerPublicKey, setSecondPlayerPublicKey] = useState("")
const [secondPlayerUserName, setSecondPlayerUserName] = useState("")
const { showLoader } = UtilsContext.useUtilsComponents()
@@ -75,17 +75,19 @@ function MintForm(props: {
e.preventDefault()
try {
showLoader(true)
- console.log(
- `new ChessGame("${color}", "${computer.getPublicKey()}", "${secondPlayerPublicKey}", "${name}", "${secondPlayerUserName}")`
- )
const { tx, effect }: any = await computer.encode({
- exp: `new ChessGame("${color}", "${computer.getPublicKey()}", "${secondPlayerPublicKey}", "${name}", "${secondPlayerUserName}")`,
+ exp: `new ChessGame("white", "${computer.getPublicKey()}", "${secondPlayerPublicKey}", "${name}", "${secondPlayerUserName}")`,
mod: VITE_CHESS_GAME_MOD_SPEC
})
- const data = await computer.broadcast(tx)
- console.log(data, effect)
+ await computer.broadcast(tx)
setSuccessRev(effect.res?._id)
+ await createGame({
+ gameId: effect.res?._id,
+ firstPlayerPubKey: computer.getPublicKey(),
+ secondPlayerPubKey: secondPlayerPublicKey
+ })
+
showLoader(false)
Modal.showModal("success-modal")
} catch (err) {
@@ -139,18 +141,6 @@ function MintForm(props: {
className="bg-gray-50 border border-gray-300 text-gray-900 text-sm rounded-lg focus:ring-blue-500 focus:border-blue-500 block w-full p-2.5 dark:bg-gray-700 dark:border-gray-600 dark:placeholder-gray-400 dark:text-white dark:focus:ring-blue-500 dark:focus:border-blue-500"
/>
-
-