From 65d37eeb619aeb0afdcf17c3ee28334e1e5a6dfa Mon Sep 17 00:00:00 2001 From: ntr Date: Sun, 4 Sep 2022 18:47:51 +1000 Subject: [PATCH] ws --- api/index.ts | 2 +- api/package-lock.json | 655 +++++++++++++++++++++++++++++++ api/package.json | 2 + api/src/api.ts | 23 ++ client/src/app.tsx | 4 +- client/src/components/header.tsx | 2 +- client/src/routes/home.tsx | 2 +- client/src/routes/login.tsx | 2 +- client/src/ws.ts | 8 +- docker-compose.yaml | 5 + nginx/localhost.nginx.conf | 22 +- 11 files changed, 708 insertions(+), 19 deletions(-) diff --git a/api/index.ts b/api/index.ts index b4d6d96..fd7e954 100644 --- a/api/index.ts +++ b/api/index.ts @@ -29,7 +29,7 @@ async function start() { } = createServices(log); // events.emit(Events.StartupSync); - events.emit(Events.ListingsUpdated); + // events.emit(Events.ListingsUpdated); await api.listen(); } diff --git a/api/package-lock.json b/api/package-lock.json index 75a99ff..c58903c 100644 --- a/api/package-lock.json +++ b/api/package-lock.json @@ -20,6 +20,8 @@ "koa-body": "^5.0.0", "koa-passport": "^5.0.0", "koa-session": "^6.2.0", + "koa-websocket": "^7.0.0", + "koa-ws": "^1.0.1", "lodash": "^4.17.21", "passport-local": "^1.0.0" }, @@ -488,6 +490,11 @@ "url": "https://github.com/chalk/ansi-styles?sponsor=1" } }, + "node_modules/any-promise": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/any-promise/-/any-promise-1.3.0.tgz", + "integrity": "sha512-7UvmKalWRt1wgjL1RrGxoSJW/0QZFIegpeGvZG9kjp8vrRu55XTHbwnqq2GpXm9uLbcuhxm3IqX9OB4MZR1b2A==" + }, "node_modules/anymatch": { "version": "3.1.2", "resolved": "https://registry.npmjs.org/anymatch/-/anymatch-3.1.2.tgz", @@ -597,6 +604,12 @@ "node": ">=8" } }, + "node_modules/bindings": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/bindings/-/bindings-1.2.1.tgz", + "integrity": "sha512-u4cBQNepWxYA55FunZSM7wMi55yQaN0otnhhilNoWHq0MfOfJeQx0v0mRRpolGOExPjZcl6FtB0BB8Xkb88F0g==", + "optional": true + }, "node_modules/bluebird": { "version": "3.7.2", "resolved": "https://registry.npmjs.org/bluebird/-/bluebird-3.7.2.tgz", @@ -663,6 +676,23 @@ "integrity": "sha512-E+XQCRwSbaaiChtv6k6Dwgc+bx+Bs6vuKJHHl5kox/BaKbhiXzqQOwK4cO22yElGp2OCmjwVhT3HmxgyPGnJfQ==", "dev": true }, + "node_modules/bufferutil": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/bufferutil/-/bufferutil-1.1.0.tgz", + "integrity": "sha512-bttEVtkre4VYrZH+ciatjApTuac7jLMQXVXzM/ymw82WFREdOrJO496C4Bkh0/FfYoBUSOFaAYF32a5Q8dyiLw==", + "hasInstallScript": true, + "optional": true, + "dependencies": { + "bindings": "1.2.x", + "nan": "1.8.x" + } + }, + "node_modules/bufferutil/node_modules/nan": { + "version": "1.8.4", + "resolved": "https://registry.npmjs.org/nan/-/nan-1.8.4.tgz", + "integrity": "sha512-609zQ1h3ApgH/94qmbbEklSrjcYYXCHnsWk4MAojq4OUk3tidhDYhPaMasMFKsZPZ96r4eQA1hbR2W4H7/77XA==", + "optional": true + }, "node_modules/bunyan": { "version": "1.8.15", "resolved": "https://registry.npmjs.org/bunyan/-/bunyan-1.8.15.tgz", @@ -892,6 +922,15 @@ "node": ">= 0.8" } }, + "node_modules/composition": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/composition/-/composition-2.3.0.tgz", + "integrity": "sha512-b2wTferUuej6qDfrwPnM6KNd6MHSA1q0/aatvJhUmH2/kUM5wsn4t8sc5vj0NECwsLbAM+H4WitN4d2uL0pIRg==", + "dependencies": { + "any-promise": "^1.1.0", + "co": "^4.0.2" + } + }, "node_modules/concat-map": { "version": "0.0.1", "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", @@ -1177,6 +1216,11 @@ "url": "https://github.com/fb55/entities?sponsor=1" } }, + "node_modules/error-inject": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/error-inject/-/error-inject-1.0.0.tgz", + "integrity": "sha512-JM8N6PytDbmIYm1IhPWlo8vr3NtfjhDY/1MhD/a5b/aad/USE8a0+NsqE9d5n+GVGmuNkPQWm4bFQWv18d8tMg==" + }, "node_modules/escalade": { "version": "3.1.1", "resolved": "https://registry.npmjs.org/escalade/-/escalade-3.1.1.tgz", @@ -1899,6 +1943,11 @@ "node": ">= 10" } }, + "node_modules/koa-is-json": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/koa-is-json/-/koa-is-json-1.0.0.tgz", + "integrity": "sha512-+97CtHAlWDx0ndt0J8y3P12EWLwTLMXIfMnYDev3wOTwH/RpBGMlfn4bDXlMEg1u73K6XRE9BbUp+5ZAYoRYWw==" + }, "node_modules/koa-passport": { "version": "5.0.0", "resolved": "https://registry.npmjs.org/koa-passport/-/koa-passport-5.0.0.tgz", @@ -1933,6 +1982,246 @@ "uuid": "bin/uuid" } }, + "node_modules/koa-websocket": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/koa-websocket/-/koa-websocket-7.0.0.tgz", + "integrity": "sha512-MsHUFKqA4+j+0dpPKWtsvZfnpQ1NcgF+AaTZQZ4B3Xj/cWK31qqmKx9HnA5Gw1LV2aIDzqwy0IDBsZYRurTUAg==", + "dependencies": { + "co": "^4.6.0", + "debug": "^4.3.4", + "koa-compose": "^4.1.0", + "ws": "^8.5.0" + } + }, + "node_modules/koa-websocket/node_modules/bufferutil": { + "version": "4.0.6", + "resolved": "https://registry.npmjs.org/bufferutil/-/bufferutil-4.0.6.tgz", + "integrity": "sha512-jduaYOYtnio4aIAyc6UbvPCVcgq7nYpVnucyxr6eCYg/Woad9Hf/oxxBRDnGGjPfjUm6j5O/uBWhIu4iLebFaw==", + "hasInstallScript": true, + "optional": true, + "peer": true, + "dependencies": { + "node-gyp-build": "^4.3.0" + }, + "engines": { + "node": ">=6.14.2" + } + }, + "node_modules/koa-websocket/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/koa-websocket/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/koa-websocket/node_modules/utf-8-validate": { + "version": "5.0.9", + "resolved": "https://registry.npmjs.org/utf-8-validate/-/utf-8-validate-5.0.9.tgz", + "integrity": "sha512-Yek7dAy0v3Kl0orwMlvi7TPtiCNrdfHNd7Gcc/pLq4BLXqfAmd0J7OWMizUQnTTJsyjKn02mU7anqwfmUP4J8Q==", + "hasInstallScript": true, + "optional": true, + "peer": true, + "dependencies": { + "node-gyp-build": "^4.3.0" + }, + "engines": { + "node": ">=6.14.2" + } + }, + "node_modules/koa-websocket/node_modules/ws": { + "version": "8.8.1", + "resolved": "https://registry.npmjs.org/ws/-/ws-8.8.1.tgz", + "integrity": "sha512-bGy2JzvzkPowEJV++hF07hAD6niYSr0JzBNo/J29WsB57A2r7Wlc1UFcTR9IzrPvuNVO4B8LGqF8qcpsVOhJCA==", + "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 + } + } + }, + "node_modules/koa-ws": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/koa-ws/-/koa-ws-1.0.1.tgz", + "integrity": "sha512-Wfs/s/p0fuuzdnFrYviQ2ej7bSIBo+LA0xcStsu2W9RstxMpsBf3+DmGEQVC6FBuLRTJS5lZYdcZtAZ3fH6Ztw==", + "dependencies": { + "co": "^4.3.1", + "debug": "^2.1.1", + "keygrip": "^1.0.1", + "koa-ws-cookie-helper": "^1.0.3", + "object-assign": "^2.0.0", + "replacestream": "^2.0.0", + "ws": "^0.7.1" + } + }, + "node_modules/koa-ws-cookie-helper": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/koa-ws-cookie-helper/-/koa-ws-cookie-helper-1.1.0.tgz", + "integrity": "sha512-qgBt3jjOoU2CEGxx5cZj8HF3+xmdNFNYy8iJdG51++F1H33jQRPMRSh0ooNavej6WXw3/cMCGJs6mKCjXc1fIg==", + "dependencies": { + "keygrip": "1.0.x", + "koa": "0.21.x", + "ws": "0.7.x" + } + }, + "node_modules/koa-ws-cookie-helper/node_modules/cookies": { + "version": "0.5.1", + "resolved": "https://registry.npmjs.org/cookies/-/cookies-0.5.1.tgz", + "integrity": "sha512-k+gB4hHN2aBVzTqJ/XVlPCq02TeKRAbG1f/lY6grWwHc3uRlqv9VhitVGVZmykEMglQiAMqEiP1Wk/ffVOhGsg==", + "dependencies": { + "keygrip": "~1.0.0" + }, + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/koa-ws-cookie-helper/node_modules/debug": { + "version": "2.6.9", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", + "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", + "dependencies": { + "ms": "2.0.0" + } + }, + "node_modules/koa-ws-cookie-helper/node_modules/delegates": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/delegates/-/delegates-0.1.0.tgz", + "integrity": "sha512-tPYr58xmVlUWcL8zPk6ZAxP6XqiYx5IIn395dkeER12JmMy8P6ipGKnUvgD++g8+uCaALfs/CRERixvKBu1pow==" + }, + "node_modules/koa-ws-cookie-helper/node_modules/depd": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/depd/-/depd-1.1.2.tgz", + "integrity": "sha512-7emPTl6Dpo6JRXOXjLRxck+FlLRX5847cLKEn00PLAgc3g2hTZZgr+e4c2v6QpSmLeFP3n5yUo7ft6avBK/5jQ==", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/koa-ws-cookie-helper/node_modules/fresh": { + "version": "0.3.0", + "resolved": "https://registry.npmjs.org/fresh/-/fresh-0.3.0.tgz", + "integrity": "sha512-akx5WBKAwMSg36qoHTuMMVncHWctlaDGslJASDYAhoLrzDUDCjZlOngNa/iC6lPm9aA0qk8pN5KnpmbJHSIIQQ==", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/koa-ws-cookie-helper/node_modules/http-errors": { + "version": "1.8.1", + "resolved": "https://registry.npmjs.org/http-errors/-/http-errors-1.8.1.tgz", + "integrity": "sha512-Kpk9Sm7NmI+RHhnj6OIWDI1d6fIoFAtFt9RLaTMRlg/8w49juAStsrBgp0Dp4OdxdVbRIeKhtCUvoi/RuAhO4g==", + "dependencies": { + "depd": "~1.1.2", + "inherits": "2.0.4", + "setprototypeof": "1.2.0", + "statuses": ">= 1.5.0 < 2", + "toidentifier": "1.0.1" + }, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/koa-ws-cookie-helper/node_modules/keygrip": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/keygrip/-/keygrip-1.0.3.tgz", + "integrity": "sha512-/PpesirAIfaklxUzp4Yb7xBper9MwP6hNRA6BGGUFCgbJ+BM5CKBtsoxinNXkLHAr+GXS1/lSlF2rP7cv5Fl+g==", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/koa-ws-cookie-helper/node_modules/koa": { + "version": "0.21.1", + "resolved": "https://registry.npmjs.org/koa/-/koa-0.21.1.tgz", + "integrity": "sha512-j+GQ6KLN+m3UEHNHmHkdUOiHKfWe7cOA3hMcZffr67bSbJ4SQgRw3aZaRXMSIx96cn0q5LCd50ywjBYu/3xD8g==", + "dependencies": { + "accepts": "^1.2.2", + "co": "^4.4.0", + "composition": "^2.1.1", + "content-disposition": "~0.5.0", + "content-type": "^1.0.0", + "cookies": "~0.5.0", + "debug": "^2.6.9", + "delegates": "0.1.0", + "destroy": "^1.0.3", + "error-inject": "~1.0.0", + "escape-html": "~1.0.1", + "fresh": "^0.3.0", + "http-assert": "^1.1.0", + "http-errors": "^1.2.8", + "koa-compose": "^2.3.0", + "koa-is-json": "^1.0.0", + "mime-types": "^2.0.7", + "on-finished": "^2.1.0", + "only": "0.0.2", + "parseurl": "^1.3.0", + "statuses": "^1.2.0", + "type-is": "^1.5.5", + "vary": "^1.0.0" + }, + "engines": { + "iojs": ">= 1.0.0", + "node": ">= 0.11.16" + } + }, + "node_modules/koa-ws-cookie-helper/node_modules/koa-compose": { + "version": "2.5.1", + "resolved": "https://registry.npmjs.org/koa-compose/-/koa-compose-2.5.1.tgz", + "integrity": "sha512-bOGNe+7ZqVVCnGNej7qP8uJ+6ugiGLgpYgVnoj6KJAR8+rH0WzktzBXrRk/eHWisEYUa9I8ess0ROiVDfFXIOw==" + }, + "node_modules/koa-ws-cookie-helper/node_modules/ms": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==" + }, + "node_modules/koa-ws-cookie-helper/node_modules/statuses": { + "version": "1.5.0", + "resolved": "https://registry.npmjs.org/statuses/-/statuses-1.5.0.tgz", + "integrity": "sha512-OpZ3zP+jT1PI7I8nemJX4AKmAX070ZkYPVWV/AaKTJl+tXCTGyVdC1a4SL8RUQYEwk/f34ZX8UTykN68FwrqAA==", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/koa-ws/node_modules/debug": { + "version": "2.6.9", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", + "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", + "dependencies": { + "ms": "2.0.0" + } + }, + "node_modules/koa-ws/node_modules/ms": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==" + }, + "node_modules/koa-ws/node_modules/object-assign": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/object-assign/-/object-assign-2.1.1.tgz", + "integrity": "sha512-CdsOUYIh5wIiozhJ3rLQgmUTgcyzFwZZrqhkKhODMoGtPKM+wt0h0CNIoauJWMsS9822EdzPsF/6mb4nLvPN5g==", + "engines": { + "node": ">=0.10.0" + } + }, "node_modules/koa/node_modules/debug": { "version": "4.3.4", "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.4.tgz", @@ -2433,6 +2722,18 @@ } } }, + "node_modules/node-gyp-build": { + "version": "4.5.0", + "resolved": "https://registry.npmjs.org/node-gyp-build/-/node-gyp-build-4.5.0.tgz", + "integrity": "sha512-2iGbaQBV+ITgCz76ZEjmhUKAKVf7xfY1sRl4UiKQspfZMH2h06SyhNsnSVy50cwkFQDGLyif6m/6uFXHkOZ6rg==", + "optional": true, + "peer": true, + "bin": { + "node-gyp-build": "bin.js", + "node-gyp-build-optional": "optional.js", + "node-gyp-build-test": "build-test.js" + } + }, "node_modules/node-notifier": { "version": "8.0.2", "resolved": "https://registry.npmjs.org/node-notifier/-/node-notifier-8.0.2.tgz", @@ -2532,6 +2833,14 @@ "resolved": "https://registry.npmjs.org/only/-/only-0.0.2.tgz", "integrity": "sha512-Fvw+Jemq5fjjyWz6CpKx6w9s7xxqo3+JCyM0WXWeCSOboZ8ABkyvP8ID4CZuChA/wxSx+XSJmdOm8rGVyJ1hdQ==" }, + "node_modules/options": { + "version": "0.0.6", + "resolved": "https://registry.npmjs.org/options/-/options-0.0.6.tgz", + "integrity": "sha512-bOj3L1ypm++N+n7CEbbe473A414AB7z+amKYshRb//iuL3MpdDCLhPnw6aVTdKB9g5ZRVHIEp8eUln6L2NUStg==", + "engines": { + "node": ">=0.4.0" + } + }, "node_modules/p-limit": { "version": "3.1.0", "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-3.1.0.tgz", @@ -2752,6 +3061,14 @@ "node": ">=8.10.0" } }, + "node_modules/replacestream": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/replacestream/-/replacestream-2.1.0.tgz", + "integrity": "sha512-431BXd+suHsl7XLUxBhvZJKjMzouhF1XZixijpB4FTrlkdPwdSK9k5Jkaz0/UErOGu5zqHEXHRgZdvgPy8F0ZA==", + "dependencies": { + "through": "~2.3.4" + } + }, "node_modules/require-directory": { "version": "2.1.1", "resolved": "https://registry.npmjs.org/require-directory/-/require-directory-2.1.1.tgz", @@ -2997,6 +3314,11 @@ "node": ">= 10" } }, + "node_modules/through": { + "version": "2.3.8", + "resolved": "https://registry.npmjs.org/through/-/through-2.3.8.tgz", + "integrity": "sha512-w89qg7PI8wAdvX60bMDP+bFoD5Dvhm9oLheFp5O4a2QF0cSBGsBX4qZmadPMvVqlLJBBci+WqGGOAPvcDeNSVg==" + }, "node_modules/to-regex-range": { "version": "5.0.1", "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-5.0.1.tgz", @@ -3153,6 +3475,11 @@ "node": ">=4.2.0" } }, + "node_modules/ultron": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/ultron/-/ultron-1.0.2.tgz", + "integrity": "sha512-QMpnpVtYaWEeY+MwKDN/UdKlE/LsFZXM5lO1u7GaZzNgmIbGixHEmVMIKT+vqYOALu3m5GYQy9kz4Xu4IVn7Ow==" + }, "node_modules/unpipe": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/unpipe/-/unpipe-1.0.0.tgz", @@ -3161,6 +3488,23 @@ "node": ">= 0.8" } }, + "node_modules/utf-8-validate": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/utf-8-validate/-/utf-8-validate-1.1.0.tgz", + "integrity": "sha512-Qsgu1u2akdyOneurUEVf/tXhkqBQMoE3x0GY5+P7ayPHvVzTqOkkgBhtl26wm6ap10Amhwy0jIhPwMGywx76QQ==", + "hasInstallScript": true, + "optional": true, + "dependencies": { + "bindings": "1.2.x", + "nan": "1.8.x" + } + }, + "node_modules/utf-8-validate/node_modules/nan": { + "version": "1.8.4", + "resolved": "https://registry.npmjs.org/nan/-/nan-1.8.4.tgz", + "integrity": "sha512-609zQ1h3ApgH/94qmbbEklSrjcYYXCHnsWk4MAojq4OUk3tidhDYhPaMasMFKsZPZ96r4eQA1hbR2W4H7/77XA==", + "optional": true + }, "node_modules/util-deprecate": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz", @@ -3254,6 +3598,19 @@ "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz", "integrity": "sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ==" }, + "node_modules/ws": { + "version": "0.7.2", + "resolved": "https://registry.npmjs.org/ws/-/ws-0.7.2.tgz", + "integrity": "sha512-8mJ1Ku743qD/PKmO9Dg+y7BXTwzUgKdXguecfIyOVHFmez4JMqMF+V+M684btmQXHlwzyrJqRl3NYDltGDf6CQ==", + "dependencies": { + "options": ">=0.0.5", + "ultron": "1.0.x" + }, + "optionalDependencies": { + "bufferutil": "1.1.x", + "utf-8-validate": "1.1.x" + } + }, "node_modules/xtend": { "version": "4.0.2", "resolved": "https://registry.npmjs.org/xtend/-/xtend-4.0.2.tgz", @@ -3736,6 +4093,11 @@ "color-convert": "^2.0.1" } }, + "any-promise": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/any-promise/-/any-promise-1.3.0.tgz", + "integrity": "sha512-7UvmKalWRt1wgjL1RrGxoSJW/0QZFIegpeGvZG9kjp8vrRu55XTHbwnqq2GpXm9uLbcuhxm3IqX9OB4MZR1b2A==" + }, "anymatch": { "version": "3.1.2", "resolved": "https://registry.npmjs.org/anymatch/-/anymatch-3.1.2.tgz", @@ -3818,6 +4180,12 @@ "integrity": "sha512-jDctJ/IVQbZoJykoeHbhXpOlNBqGNcwXJKJog42E5HDPUwQTSdjCHdihjj0DlnheQ7blbT6dHOafNAiS8ooQKA==", "dev": true }, + "bindings": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/bindings/-/bindings-1.2.1.tgz", + "integrity": "sha512-u4cBQNepWxYA55FunZSM7wMi55yQaN0otnhhilNoWHq0MfOfJeQx0v0mRRpolGOExPjZcl6FtB0BB8Xkb88F0g==", + "optional": true + }, "bluebird": { "version": "3.7.2", "resolved": "https://registry.npmjs.org/bluebird/-/bluebird-3.7.2.tgz", @@ -3867,6 +4235,24 @@ "integrity": "sha512-E+XQCRwSbaaiChtv6k6Dwgc+bx+Bs6vuKJHHl5kox/BaKbhiXzqQOwK4cO22yElGp2OCmjwVhT3HmxgyPGnJfQ==", "dev": true }, + "bufferutil": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/bufferutil/-/bufferutil-1.1.0.tgz", + "integrity": "sha512-bttEVtkre4VYrZH+ciatjApTuac7jLMQXVXzM/ymw82WFREdOrJO496C4Bkh0/FfYoBUSOFaAYF32a5Q8dyiLw==", + "optional": true, + "requires": { + "bindings": "1.2.x", + "nan": "1.8.x" + }, + "dependencies": { + "nan": { + "version": "1.8.4", + "resolved": "https://registry.npmjs.org/nan/-/nan-1.8.4.tgz", + "integrity": "sha512-609zQ1h3ApgH/94qmbbEklSrjcYYXCHnsWk4MAojq4OUk3tidhDYhPaMasMFKsZPZ96r4eQA1hbR2W4H7/77XA==", + "optional": true + } + } + }, "bunyan": { "version": "1.8.15", "resolved": "https://registry.npmjs.org/bunyan/-/bunyan-1.8.15.tgz", @@ -4032,6 +4418,15 @@ "delayed-stream": "~1.0.0" } }, + "composition": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/composition/-/composition-2.3.0.tgz", + "integrity": "sha512-b2wTferUuej6qDfrwPnM6KNd6MHSA1q0/aatvJhUmH2/kUM5wsn4t8sc5vj0NECwsLbAM+H4WitN4d2uL0pIRg==", + "requires": { + "any-promise": "^1.1.0", + "co": "^4.0.2" + } + }, "concat-map": { "version": "0.0.1", "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", @@ -4243,6 +4638,11 @@ "resolved": "https://registry.npmjs.org/entities/-/entities-4.3.1.tgz", "integrity": "sha512-o4q/dYJlmyjP2zfnaWDUC6A3BQFmVTX+tZPezK7k0GLSU9QYCauscf5Y+qcEPzKL+EixVouYDgLQK5H9GrLpkg==" }, + "error-inject": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/error-inject/-/error-inject-1.0.0.tgz", + "integrity": "sha512-JM8N6PytDbmIYm1IhPWlo8vr3NtfjhDY/1MhD/a5b/aad/USE8a0+NsqE9d5n+GVGmuNkPQWm4bFQWv18d8tMg==" + }, "escalade": { "version": "3.1.1", "resolved": "https://registry.npmjs.org/escalade/-/escalade-3.1.1.tgz", @@ -4795,6 +5195,11 @@ "koa-compose": "^4.1.0" } }, + "koa-is-json": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/koa-is-json/-/koa-is-json-1.0.0.tgz", + "integrity": "sha512-+97CtHAlWDx0ndt0J8y3P12EWLwTLMXIfMnYDev3wOTwH/RpBGMlfn4bDXlMEg1u73K6XRE9BbUp+5ZAYoRYWw==" + }, "koa-passport": { "version": "5.0.0", "resolved": "https://registry.npmjs.org/koa-passport/-/koa-passport-5.0.0.tgz", @@ -4821,6 +5226,197 @@ } } }, + "koa-websocket": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/koa-websocket/-/koa-websocket-7.0.0.tgz", + "integrity": "sha512-MsHUFKqA4+j+0dpPKWtsvZfnpQ1NcgF+AaTZQZ4B3Xj/cWK31qqmKx9HnA5Gw1LV2aIDzqwy0IDBsZYRurTUAg==", + "requires": { + "co": "^4.6.0", + "debug": "^4.3.4", + "koa-compose": "^4.1.0", + "ws": "^8.5.0" + }, + "dependencies": { + "bufferutil": { + "version": "4.0.6", + "resolved": "https://registry.npmjs.org/bufferutil/-/bufferutil-4.0.6.tgz", + "integrity": "sha512-jduaYOYtnio4aIAyc6UbvPCVcgq7nYpVnucyxr6eCYg/Woad9Hf/oxxBRDnGGjPfjUm6j5O/uBWhIu4iLebFaw==", + "optional": true, + "peer": true, + "requires": { + "node-gyp-build": "^4.3.0" + } + }, + "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" + } + }, + "ms": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", + "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==" + }, + "utf-8-validate": { + "version": "5.0.9", + "resolved": "https://registry.npmjs.org/utf-8-validate/-/utf-8-validate-5.0.9.tgz", + "integrity": "sha512-Yek7dAy0v3Kl0orwMlvi7TPtiCNrdfHNd7Gcc/pLq4BLXqfAmd0J7OWMizUQnTTJsyjKn02mU7anqwfmUP4J8Q==", + "optional": true, + "peer": true, + "requires": { + "node-gyp-build": "^4.3.0" + } + }, + "ws": { + "version": "8.8.1", + "resolved": "https://registry.npmjs.org/ws/-/ws-8.8.1.tgz", + "integrity": "sha512-bGy2JzvzkPowEJV++hF07hAD6niYSr0JzBNo/J29WsB57A2r7Wlc1UFcTR9IzrPvuNVO4B8LGqF8qcpsVOhJCA==", + "requires": {} + } + } + }, + "koa-ws": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/koa-ws/-/koa-ws-1.0.1.tgz", + "integrity": "sha512-Wfs/s/p0fuuzdnFrYviQ2ej7bSIBo+LA0xcStsu2W9RstxMpsBf3+DmGEQVC6FBuLRTJS5lZYdcZtAZ3fH6Ztw==", + "requires": { + "co": "^4.3.1", + "debug": "^2.1.1", + "keygrip": "^1.0.1", + "koa-ws-cookie-helper": "^1.0.3", + "object-assign": "^2.0.0", + "replacestream": "^2.0.0", + "ws": "^0.7.1" + }, + "dependencies": { + "debug": { + "version": "2.6.9", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", + "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", + "requires": { + "ms": "2.0.0" + } + }, + "ms": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==" + }, + "object-assign": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/object-assign/-/object-assign-2.1.1.tgz", + "integrity": "sha512-CdsOUYIh5wIiozhJ3rLQgmUTgcyzFwZZrqhkKhODMoGtPKM+wt0h0CNIoauJWMsS9822EdzPsF/6mb4nLvPN5g==" + } + } + }, + "koa-ws-cookie-helper": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/koa-ws-cookie-helper/-/koa-ws-cookie-helper-1.1.0.tgz", + "integrity": "sha512-qgBt3jjOoU2CEGxx5cZj8HF3+xmdNFNYy8iJdG51++F1H33jQRPMRSh0ooNavej6WXw3/cMCGJs6mKCjXc1fIg==", + "requires": { + "keygrip": "1.0.x", + "koa": "0.21.x", + "ws": "0.7.x" + }, + "dependencies": { + "cookies": { + "version": "0.5.1", + "resolved": "https://registry.npmjs.org/cookies/-/cookies-0.5.1.tgz", + "integrity": "sha512-k+gB4hHN2aBVzTqJ/XVlPCq02TeKRAbG1f/lY6grWwHc3uRlqv9VhitVGVZmykEMglQiAMqEiP1Wk/ffVOhGsg==", + "requires": { + "keygrip": "~1.0.0" + } + }, + "debug": { + "version": "2.6.9", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", + "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", + "requires": { + "ms": "2.0.0" + } + }, + "delegates": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/delegates/-/delegates-0.1.0.tgz", + "integrity": "sha512-tPYr58xmVlUWcL8zPk6ZAxP6XqiYx5IIn395dkeER12JmMy8P6ipGKnUvgD++g8+uCaALfs/CRERixvKBu1pow==" + }, + "depd": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/depd/-/depd-1.1.2.tgz", + "integrity": "sha512-7emPTl6Dpo6JRXOXjLRxck+FlLRX5847cLKEn00PLAgc3g2hTZZgr+e4c2v6QpSmLeFP3n5yUo7ft6avBK/5jQ==" + }, + "fresh": { + "version": "0.3.0", + "resolved": "https://registry.npmjs.org/fresh/-/fresh-0.3.0.tgz", + "integrity": "sha512-akx5WBKAwMSg36qoHTuMMVncHWctlaDGslJASDYAhoLrzDUDCjZlOngNa/iC6lPm9aA0qk8pN5KnpmbJHSIIQQ==" + }, + "http-errors": { + "version": "1.8.1", + "resolved": "https://registry.npmjs.org/http-errors/-/http-errors-1.8.1.tgz", + "integrity": "sha512-Kpk9Sm7NmI+RHhnj6OIWDI1d6fIoFAtFt9RLaTMRlg/8w49juAStsrBgp0Dp4OdxdVbRIeKhtCUvoi/RuAhO4g==", + "requires": { + "depd": "~1.1.2", + "inherits": "2.0.4", + "setprototypeof": "1.2.0", + "statuses": ">= 1.5.0 < 2", + "toidentifier": "1.0.1" + } + }, + "keygrip": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/keygrip/-/keygrip-1.0.3.tgz", + "integrity": "sha512-/PpesirAIfaklxUzp4Yb7xBper9MwP6hNRA6BGGUFCgbJ+BM5CKBtsoxinNXkLHAr+GXS1/lSlF2rP7cv5Fl+g==" + }, + "koa": { + "version": "0.21.1", + "resolved": "https://registry.npmjs.org/koa/-/koa-0.21.1.tgz", + "integrity": "sha512-j+GQ6KLN+m3UEHNHmHkdUOiHKfWe7cOA3hMcZffr67bSbJ4SQgRw3aZaRXMSIx96cn0q5LCd50ywjBYu/3xD8g==", + "requires": { + "accepts": "^1.2.2", + "co": "^4.4.0", + "composition": "^2.1.1", + "content-disposition": "~0.5.0", + "content-type": "^1.0.0", + "cookies": "~0.5.0", + "debug": "^2.6.9", + "delegates": "0.1.0", + "destroy": "^1.0.3", + "error-inject": "~1.0.0", + "escape-html": "~1.0.1", + "fresh": "^0.3.0", + "http-assert": "^1.1.0", + "http-errors": "^1.2.8", + "koa-compose": "^2.3.0", + "koa-is-json": "^1.0.0", + "mime-types": "^2.0.7", + "on-finished": "^2.1.0", + "only": "0.0.2", + "parseurl": "^1.3.0", + "statuses": "^1.2.0", + "type-is": "^1.5.5", + "vary": "^1.0.0" + } + }, + "koa-compose": { + "version": "2.5.1", + "resolved": "https://registry.npmjs.org/koa-compose/-/koa-compose-2.5.1.tgz", + "integrity": "sha512-bOGNe+7ZqVVCnGNej7qP8uJ+6ugiGLgpYgVnoj6KJAR8+rH0WzktzBXrRk/eHWisEYUa9I8ess0ROiVDfFXIOw==" + }, + "ms": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==" + }, + "statuses": { + "version": "1.5.0", + "resolved": "https://registry.npmjs.org/statuses/-/statuses-1.5.0.tgz", + "integrity": "sha512-OpZ3zP+jT1PI7I8nemJX4AKmAX070ZkYPVWV/AaKTJl+tXCTGyVdC1a4SL8RUQYEwk/f34ZX8UTykN68FwrqAA==" + } + } + }, "locate-path": { "version": "6.0.0", "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-6.0.0.tgz", @@ -5146,6 +5742,13 @@ "whatwg-url": "^5.0.0" } }, + "node-gyp-build": { + "version": "4.5.0", + "resolved": "https://registry.npmjs.org/node-gyp-build/-/node-gyp-build-4.5.0.tgz", + "integrity": "sha512-2iGbaQBV+ITgCz76ZEjmhUKAKVf7xfY1sRl4UiKQspfZMH2h06SyhNsnSVy50cwkFQDGLyif6m/6uFXHkOZ6rg==", + "optional": true, + "peer": true + }, "node-notifier": { "version": "8.0.2", "resolved": "https://registry.npmjs.org/node-notifier/-/node-notifier-8.0.2.tgz", @@ -5224,6 +5827,11 @@ "resolved": "https://registry.npmjs.org/only/-/only-0.0.2.tgz", "integrity": "sha512-Fvw+Jemq5fjjyWz6CpKx6w9s7xxqo3+JCyM0WXWeCSOboZ8ABkyvP8ID4CZuChA/wxSx+XSJmdOm8rGVyJ1hdQ==" }, + "options": { + "version": "0.0.6", + "resolved": "https://registry.npmjs.org/options/-/options-0.0.6.tgz", + "integrity": "sha512-bOj3L1ypm++N+n7CEbbe473A414AB7z+amKYshRb//iuL3MpdDCLhPnw6aVTdKB9g5ZRVHIEp8eUln6L2NUStg==" + }, "p-limit": { "version": "3.1.0", "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-3.1.0.tgz", @@ -5375,6 +5983,14 @@ "picomatch": "^2.2.1" } }, + "replacestream": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/replacestream/-/replacestream-2.1.0.tgz", + "integrity": "sha512-431BXd+suHsl7XLUxBhvZJKjMzouhF1XZixijpB4FTrlkdPwdSK9k5Jkaz0/UErOGu5zqHEXHRgZdvgPy8F0ZA==", + "requires": { + "through": "~2.3.4" + } + }, "require-directory": { "version": "2.1.1", "resolved": "https://registry.npmjs.org/require-directory/-/require-directory-2.1.1.tgz", @@ -5552,6 +6168,11 @@ "yallist": "^4.0.0" } }, + "through": { + "version": "2.3.8", + "resolved": "https://registry.npmjs.org/through/-/through-2.3.8.tgz", + "integrity": "sha512-w89qg7PI8wAdvX60bMDP+bFoD5Dvhm9oLheFp5O4a2QF0cSBGsBX4qZmadPMvVqlLJBBci+WqGGOAPvcDeNSVg==" + }, "to-regex-range": { "version": "5.0.1", "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-5.0.1.tgz", @@ -5648,11 +6269,34 @@ "integrity": "sha512-C0WQT0gezHuw6AdY1M2jxUO83Rjf0HP7Sk1DtXj6j1EwkQNZrHAg2XPWlq62oqEhYvONq5pkC2Y9oPljWToLmQ==", "dev": true }, + "ultron": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/ultron/-/ultron-1.0.2.tgz", + "integrity": "sha512-QMpnpVtYaWEeY+MwKDN/UdKlE/LsFZXM5lO1u7GaZzNgmIbGixHEmVMIKT+vqYOALu3m5GYQy9kz4Xu4IVn7Ow==" + }, "unpipe": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/unpipe/-/unpipe-1.0.0.tgz", "integrity": "sha512-pjy2bYhSsufwWlKwPc+l3cN7+wuJlK6uz0YdJEOlQDbl6jo/YlPi4mb8agUkVC8BF7V8NuzeyPNqRksA3hztKQ==" }, + "utf-8-validate": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/utf-8-validate/-/utf-8-validate-1.1.0.tgz", + "integrity": "sha512-Qsgu1u2akdyOneurUEVf/tXhkqBQMoE3x0GY5+P7ayPHvVzTqOkkgBhtl26wm6ap10Amhwy0jIhPwMGywx76QQ==", + "optional": true, + "requires": { + "bindings": "1.2.x", + "nan": "1.8.x" + }, + "dependencies": { + "nan": { + "version": "1.8.4", + "resolved": "https://registry.npmjs.org/nan/-/nan-1.8.4.tgz", + "integrity": "sha512-609zQ1h3ApgH/94qmbbEklSrjcYYXCHnsWk4MAojq4OUk3tidhDYhPaMasMFKsZPZ96r4eQA1hbR2W4H7/77XA==", + "optional": true + } + } + }, "util-deprecate": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz", @@ -5728,6 +6372,17 @@ "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz", "integrity": "sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ==" }, + "ws": { + "version": "0.7.2", + "resolved": "https://registry.npmjs.org/ws/-/ws-0.7.2.tgz", + "integrity": "sha512-8mJ1Ku743qD/PKmO9Dg+y7BXTwzUgKdXguecfIyOVHFmez4JMqMF+V+M684btmQXHlwzyrJqRl3NYDltGDf6CQ==", + "requires": { + "bufferutil": "1.1.x", + "options": ">=0.0.5", + "ultron": "1.0.x", + "utf-8-validate": "1.1.x" + } + }, "xtend": { "version": "4.0.2", "resolved": "https://registry.npmjs.org/xtend/-/xtend-4.0.2.tgz", diff --git a/api/package.json b/api/package.json index 3368eda..3430b07 100644 --- a/api/package.json +++ b/api/package.json @@ -37,6 +37,8 @@ "koa-body": "^5.0.0", "koa-passport": "^5.0.0", "koa-session": "^6.2.0", + "koa-websocket": "^7.0.0", + "koa-ws": "^1.0.1", "lodash": "^4.17.21", "passport-local": "^1.0.0" }, diff --git a/api/src/api.ts b/api/src/api.ts index f8f650c..9341d30 100644 --- a/api/src/api.ts +++ b/api/src/api.ts @@ -1,6 +1,7 @@ import http from 'http'; import koa from 'koa'; +import koaWebsocket from 'koa-websocket'; import bodyParser from 'koa-body'; import session from 'koa-session'; import koaRouter from '@koa/router' @@ -18,10 +19,13 @@ import { Events } from './events'; export default function createApi(log: Log, pg: Pg, discogs, offers, events) { const PORT = 41337; + const WS_PORT = 40055; const SECRET = 'ohja4Eif9eidah3aj5ta2haa4iemooth'; const app = new koa(); const server = http.createServer(app.callback()); + const wsApp = koaWebsocket(new koa()); + const wsServer = http.createServer(wsApp.callback()); app.use(async (ctx, next) => { try { @@ -46,6 +50,9 @@ export default function createApi(log: Log, pg: Pg, discogs, offers, events) { server.listen(PORT, () => { log.info('listening', { PORT }); }); + + wsApp.listen(WS_PORT); + log.info('ws listening', { WS_PORT }); }); } @@ -153,7 +160,23 @@ export default function createApi(log: Log, pg: Pg, discogs, offers, events) { ctx.body = { success: true }; }); + const wsRouter = koaRouter(); + // Using routes + wsRouter.get('/ws', async (ctx, next) => { + // `ctx` is the regular koa context created from the `ws` onConnection `socket.upgradeReq` object. + // the websocket is added to the context on `ctx.websocket`. + ctx.websocket.send('Hello World'); + ctx.websocket.on('message', (message) => { + // do something with the message from client + if (message.toString() === 'ping') { + ctx.websocket.send('pong'); + } + }); + return next; + }); + app.use(router.routes()); + wsApp.ws.use(wsRouter.routes()); return { app, diff --git a/client/src/app.tsx b/client/src/app.tsx index f545e2a..ee59a6c 100644 --- a/client/src/app.tsx +++ b/client/src/app.tsx @@ -3,7 +3,7 @@ import { useState, useEffect } from 'preact/hooks'; import { Route, Router, route } from 'preact-router'; import { Provider, connect } from 'unistore/preact' -import { createStore, actions } from './store'; +import createStore from './store'; import createWs from './ws'; import http from './http'; @@ -19,6 +19,8 @@ import List from './routes/list'; const store = createStore(); const ws = createWs(store); +ws.connect(); + async function init() { const [error, user] = await http.getLogin(); if (error) return route('/login'); diff --git a/client/src/components/header.tsx b/client/src/components/header.tsx index 8d02e61..668680f 100644 --- a/client/src/components/header.tsx +++ b/client/src/components/header.tsx @@ -3,7 +3,7 @@ import { route } from 'preact-router'; import { connect } from 'unistore/preact' import http from './../http'; -import { actions } from './../actions'; +import actions from './../actions'; const Header = ({ user, logout }) => { diff --git a/client/src/routes/home.tsx b/client/src/routes/home.tsx index 198e1e4..d5e19af 100644 --- a/client/src/routes/home.tsx +++ b/client/src/routes/home.tsx @@ -4,7 +4,7 @@ import { route } from 'preact-router'; import { connect } from 'unistore/preact' import http from './../http'; -import { actions } from './../actions'; +import actions from './../actions'; import Offer from './../components/offer'; diff --git a/client/src/routes/login.tsx b/client/src/routes/login.tsx index 47e28f6..61859a2 100644 --- a/client/src/routes/login.tsx +++ b/client/src/routes/login.tsx @@ -4,7 +4,7 @@ import { useState, useEffect, useRef } from 'preact/hooks'; import { connect } from 'unistore/preact' import http from './../http'; -import { actions } from './../actions'; +import actions from './../actions'; const Login = ({ setUser, mode }) => { const [email, setEmail] = useState('') diff --git a/client/src/ws.ts b/client/src/ws.ts index ac03115..98dc8ba 100644 --- a/client/src/ws.ts +++ b/client/src/ws.ts @@ -1,6 +1,8 @@ -const SOCKET_URL = (window.location.host.includes('localhost') || window.location.host === '' || window.location.host.includes('192.168.0')) - ? `ws://${window.location.hostname}:40080` - : `${window.location.protocol === 'https:' ? 'wss://' : 'ws://'}${window.location.host}/api/ws`; +// const SOCKET_URL = (window.location.host.includes('localhost') || window.location.host === '' || window.location.host.includes('192.168.0')) +// ? `ws://${window.location.hostname}:40080` +// : `${window.location.protocol === 'https:' ? 'wss://' : 'ws://'}${window.location.host}/api/ws`; + +const SOCKET_URL = `${window.location.protocol === 'https:' ? 'wss://' : 'ws://'}${window.location.host}/api/ws`; export default function createSocket(store) { let ws; diff --git a/docker-compose.yaml b/docker-compose.yaml index 4387a6b..06b2c7f 100644 --- a/docker-compose.yaml +++ b/docker-compose.yaml @@ -22,11 +22,16 @@ services: DATABASE_URL: 'postgresql://mcrates:digdeep@pg:5432/mcrates?schema=public' volumes: - "./api:/opt/mcrates/api" + ports: + - '41337:41337' + - '40055:40055' client: image: node:16 working_dir: /opt/mcrates/client entrypoint: npm start + ports: + - '8080:8080' # fwd the hmr websocket volumes: - "./client:/opt/mcrates/client" diff --git a/nginx/localhost.nginx.conf b/nginx/localhost.nginx.conf index d315e3e..4fe6c1e 100644 --- a/nginx/localhost.nginx.conf +++ b/nginx/localhost.nginx.conf @@ -2,14 +2,14 @@ upstream mcrates_api { server api:41337; } +upstream mcrates_ws { + server api:40055; +} + upstream mcrates_client { server client:8080; } -# upstream mcrates_ws { -# server 127.0.0.1:40055; -# } - map $http_upgrade $connection_upgrade { default upgrade; '' close; @@ -21,13 +21,13 @@ server { proxy_read_timeout 600s; } - # location /api/ws { - # proxy_pass http://mcrates_ws; - # proxy_http_version 1.1; - # proxy_set_header Upgrade $http_upgrade; - # proxy_set_header Connection $connection_upgrade; - # proxy_read_timeout 600s; - # } + location /api/ws { + proxy_pass http://mcrates_ws; + proxy_http_version 1.1; + proxy_set_header Upgrade $http_upgrade; + proxy_set_header Connection $connection_upgrade; + proxy_read_timeout 600s; + } location /api/ { # trailing slash means api will receive url WITHOUT /api