From 16b7c1708bcfc5c780cb06b0de0c90f46ecd72de Mon Sep 17 00:00:00 2001 From: Andras Bacsai Date: Wed, 11 May 2022 16:15:34 +0200 Subject: [PATCH] WIP: Testing WS --- package.json | 6 +- pnpm-lock.yaml | 732 ++++++++++++++++++++++++++++++++++++- server/index.js | 20 + src/lib/common.ts | 16 +- src/lib/realtime.ts | 3 + src/routes/__layout.svelte | 6 + src/routes/index.svelte | 1 - svelte.config.js | 12 + 8 files changed, 783 insertions(+), 13 deletions(-) create mode 100644 server/index.js create mode 100644 src/lib/realtime.ts diff --git a/package.json b/package.json index 0c6bde272..c36a7b4be 100644 --- a/package.json +++ b/package.json @@ -8,7 +8,7 @@ "dev:stop": "docker-compose -f docker-compose-dev.yaml down", "dev:logs": "docker-compose -f docker-compose-dev.yaml logs -f --tail 10", "studio": "npx prisma studio", - "start": "npx prisma migrate deploy && npx prisma generate && npx prisma db seed && node build/index.js", + "start": "npx prisma migrate deploy && npx prisma generate && npx prisma db seed && node server/index.js", "build": "svelte-kit build", "preview": "svelte-kit preview", "check": "svelte-check --tsconfig ./tsconfig.json", @@ -66,6 +66,7 @@ "@iarna/toml": "2.2.5", "@prisma/client": "3.11.1", "@sentry/node": "6.19.7", + "@types/express": "4.17.13", "bcryptjs": "2.4.3", "bullmq": "1.81.4", "compare-versions": "4.1.3", @@ -74,6 +75,7 @@ "dayjs": "1.11.2", "dockerode": "3.3.1", "dotenv-extended": "2.9.0", + "express": "^4.18.1", "generate-password": "1.7.0", "get-port": "6.1.2", "got": "12.0.4", @@ -85,6 +87,8 @@ "node-forge": "1.3.1", "node-os-utils": "1.3.6", "p-limit": "4.0.0", + "socket.io": "4.5.0", + "socket.io-client": "4.5.0", "svelte-kit-cookie-session": "2.1.4", "tailwindcss-scrollbar": "0.1.0", "unique-names-generator": "4.7.1" diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index e98d0f2e8..9d2505928 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -6,6 +6,7 @@ specifiers: '@sentry/node': 6.19.7 '@sveltejs/adapter-node': 1.0.0-next.73 '@sveltejs/kit': 1.0.0-next.326 + '@types/express': ^4.17.13 '@types/js-cookie': 3.0.2 '@types/js-yaml': 4.0.5 '@types/node': 17.0.31 @@ -27,6 +28,7 @@ specifiers: eslint: 7.32.0 eslint-config-prettier: 8.5.0 eslint-plugin-svelte3: 3.4.1 + express: ^4.18.1 generate-password: 1.7.0 get-port: 6.1.2 got: 12.0.4 @@ -45,6 +47,8 @@ specifiers: prettier-plugin-svelte: 2.7.0 prettier-plugin-tailwindcss: 0.1.10 prisma: 3.11.1 + socket.io: ^4.5.0 + socket.io-client: ^4.5.0 svelte: 3.48.0 svelte-check: 2.7.0 svelte-kit-cookie-session: 2.1.4 @@ -62,6 +66,7 @@ dependencies: '@iarna/toml': 2.2.5 '@prisma/client': 3.11.1_prisma@3.11.1 '@sentry/node': 6.19.7 + '@types/express': 4.17.13 bcryptjs: 2.4.3 bullmq: 1.81.4 compare-versions: 4.1.3 @@ -70,6 +75,7 @@ dependencies: dayjs: 1.11.2 dockerode: 3.3.1 dotenv-extended: 2.9.0 + express: 4.18.1 generate-password: 1.7.0 get-port: 6.1.2 got: 12.0.4 @@ -81,6 +87,8 @@ dependencies: node-forge: 1.3.1 node-os-utils: 1.3.6 p-limit: 4.0.0 + socket.io: 4.5.0 + socket.io-client: 4.5.0 svelte-kit-cookie-session: 2.1.4 tailwindcss-scrollbar: 0.1.0_tailwindcss@3.0.24 unique-names-generator: 4.7.1 @@ -371,6 +379,13 @@ packages: engines: { node: '>=10' } dev: false + /@socket.io/component-emitter/3.1.0: + resolution: + { + integrity: sha512-+9jVqKhRSpsc591z5vX+X5Yyw+he/HCB4iQ/RYxw35CEPaY1gnsNE43nf9n9AaYjAQrTiI/mOwKUKdUs9vf7Xg== + } + dev: false + /@sveltejs/adapter-node/1.0.0-next.73: resolution: { @@ -487,6 +502,16 @@ packages: } dev: true + /@types/body-parser/1.19.2: + resolution: + { + integrity: sha512-ALYone6pm6QmwZoAgeyNksccT9Q4AWZQ6PvfwR37GT6r6FWUPguq6sUmNGSMV2Wr761oQoBxwGGa6DR5o1DC9g== + } + dependencies: + '@types/connect': 3.4.35 + '@types/node': 17.0.31 + dev: false + /@types/cacheable-request/6.0.2: resolution: { @@ -499,6 +524,59 @@ packages: '@types/responselike': 1.0.0 dev: false + /@types/component-emitter/1.2.11: + resolution: + { + integrity: sha512-SRXjM+tfsSlA9VuG8hGO2nft2p8zjXCK1VcC6N4NXbBbYbSia9kzCChYQajIjzIqOOOuh5Ock6MmV2oux4jDZQ== + } + dev: false + + /@types/connect/3.4.35: + resolution: + { + integrity: sha512-cdeYyv4KWoEgpBISTxWvqYsVy444DOqehiF3fM3ne10AmJ62RSyNkUnxMJXHQWRQQX2eR94m5y1IZyDwBjV9FQ== + } + dependencies: + '@types/node': 17.0.31 + dev: false + + /@types/cookie/0.4.1: + resolution: + { + integrity: sha512-XW/Aa8APYr6jSVVA1y/DEIZX0/GMKLEVekNG727R8cs56ahETkRAy/3DR7+fJyh7oUgGwNQaRfXCun0+KbWY7Q== + } + dev: false + + /@types/cors/2.8.12: + resolution: + { + integrity: sha512-vt+kDhq/M2ayberEtJcIN/hxXy1Pk+59g2FV/ZQceeaTyCtCucjL2Q7FXlFjtWn4n15KCr1NE2lNNFhp0lEThw== + } + dev: false + + /@types/express-serve-static-core/4.17.28: + resolution: + { + integrity: sha512-P1BJAEAW3E2DJUlkgq4tOL3RyMunoWXqbSCygWo5ZIWTjUgN1YnaXWW4VWl/oc8vs/XoYibEGBKP0uZyF4AHig== + } + dependencies: + '@types/node': 17.0.31 + '@types/qs': 6.9.7 + '@types/range-parser': 1.2.4 + dev: false + + /@types/express/4.17.13: + resolution: + { + integrity: sha512-6bSZTPaTIACxn48l50SR+axgrqm6qXFIxrdAKaG6PaJk3+zuUr35hBlgT7vOmJcum+OEaIBLtHV/qloEAFITeA== + } + dependencies: + '@types/body-parser': 1.19.2 + '@types/express-serve-static-core': 4.17.28 + '@types/qs': 6.9.7 + '@types/serve-static': 1.13.10 + dev: false + /@types/http-cache-semantics/4.0.1: resolution: { @@ -536,6 +614,13 @@ packages: '@types/node': 17.0.31 dev: false + /@types/mime/1.3.2: + resolution: + { + integrity: sha512-YATxVxgRqNH6nHEIsvg6k2Boc1JHI9ZbH5iWFFv/MTkchz3b1ieGDa5T0a9RznNdI0KhVbdbWSN+KWWrQZRxTw== + } + dev: false + /@types/node-forge/1.0.2: resolution: { @@ -558,6 +643,20 @@ packages: } dev: true + /@types/qs/6.9.7: + resolution: + { + integrity: sha512-FGa1F62FT09qcrueBA6qYTrJPVDzah9a+493+o2PCXsesWHIn27G98TsSMs3WPNbZIEj4+VJf6saSFpvD+3Zsw== + } + dev: false + + /@types/range-parser/1.2.4: + resolution: + { + integrity: sha512-EEhsLsD6UsDM1yFhAvy0Cjr6VwmpMWqFBCb9w07wVugF7w9nfajxLuVmngTIpgS6svCnm6Vaw+MZhoDCKnOfsw== + } + dev: false + /@types/responselike/1.0.0: resolution: { @@ -576,6 +675,16 @@ packages: '@types/node': 17.0.31 dev: true + /@types/serve-static/1.13.10: + resolution: + { + integrity: sha512-nCkHGI4w7ZgAdNkrEu0bv+4xNV/XDqW+DydknebMOQwkpDGx8G+HTlj7R7ABI8i8nKxVw0wtKPi1D+lPOkh4YQ== + } + dependencies: + '@types/mime': 1.3.2 + '@types/node': 17.0.31 + dev: false + /@typescript-eslint/eslint-plugin/4.31.1_lii63oz3usekbu5ehvrcuwn5jy: resolution: { @@ -709,6 +818,17 @@ packages: } dev: true + /accepts/1.3.8: + resolution: + { + integrity: sha512-PYAthTa2m2VKxuvSD3DPC/Gy+U+sOA1LAuT8mkmRuvw+NACSaeXEQ+NHcVF7rONl6qcaxV3Uuemwawk+7+SJLw== + } + engines: { node: '>= 0.6' } + dependencies: + mime-types: 2.1.35 + negotiator: 0.6.3 + dev: false + /acorn-jsx/5.3.2_acorn@7.4.1: resolution: { @@ -925,6 +1045,10 @@ packages: } dev: false + /array-flatten/1.1.1: + resolution: { integrity: sha1-ml9pkFGx5wczKPKgCJaLZOopVdI= } + dev: false + /array-union/2.1.0: resolution: { @@ -1608,6 +1732,14 @@ packages: } dev: false + /base64id/2.0.0: + resolution: + { + integrity: sha512-lGe34o6EHj9y3Kts9R4ZYs/Gr+6N7MCaMlIFA3F1R2O5/m7K06AxfSeO5530PEERE6/WyEg3lsuyw4GHlPZHog== + } + engines: { node: ^4.5.0 || >= 5.9 } + dev: false + /bcrypt-pbkdf/1.0.2: resolution: { integrity: sha1-pDAdOJtqQ/m2f/PKEaP2Y342Dp4= } dependencies: @@ -1637,6 +1769,27 @@ packages: readable-stream: 3.6.0 dev: false + /body-parser/1.20.0: + resolution: + { + integrity: sha512-DfJ+q6EPcGKZD1QWUjSpqp+Q7bDQTsQIF4zfUAtZ6qk+H/3/QRhg9CEp39ss+/T2vw0+HaidC0ecJj/DRLIaKg== + } + engines: { node: '>= 0.8', npm: 1.2.8000 || >= 1.4.16 } + dependencies: + bytes: 3.1.2 + content-type: 1.0.4 + debug: 2.6.9 + depd: 2.0.0 + destroy: 1.2.0 + http-errors: 2.0.0 + iconv-lite: 0.4.24 + on-finished: 2.4.1 + qs: 6.10.3 + raw-body: 2.5.1 + type-is: 1.6.18 + unpipe: 1.0.0 + dev: false + /brace-expansion/1.1.11: resolution: { @@ -1708,6 +1861,14 @@ packages: - supports-color dev: false + /bytes/3.1.2: + resolution: + { + integrity: sha512-/Nf7TyzTx6S3yRJObOAV7956r8cr2+Oj8AC5dt8wSP3BQAoeX58NoHyCU8P8zGkNXStjTSi6fzO6F0pBdcYbEg== + } + engines: { node: '>= 0.8' } + dev: false + /cacheable-lookup/6.0.4: resolution: { @@ -1732,6 +1893,16 @@ packages: responselike: 2.0.0 dev: false + /call-bind/1.0.2: + resolution: + { + integrity: sha512-7O+FbCihrB5WGbFYesctwmTKae6rOiIzmz1icreWJ+0aA7LJfuqhEso2T9ncpcFtzMQtzXf2QGGueWJGTYsqrA== + } + dependencies: + function-bind: 1.1.1 + get-intrinsic: 1.1.1 + dev: false + /callsites/3.1.0: resolution: { @@ -1928,9 +2099,34 @@ packages: } dev: false + /component-emitter/1.3.0: + resolution: + { + integrity: sha512-Rd3se6QB+sO1TwqZjscQrurpEPIfO0/yYnSin6Q/rD3mOutHvUrCAhJub3r90uNb+SESBuE0QYoB90YdfatsRg== + } + dev: false + /concat-map/0.0.1: resolution: { integrity: sha1-2Klr13/Wjfd5OnMDajug1UBdR3s= } + /content-disposition/0.5.4: + resolution: + { + integrity: sha512-FveZTNuGw04cxlAiWbzi6zTAL/lhehaWbTtgluJh4/E95DqMwTmha3KZN1aAWA8cFIhHzMZUvLevkw5Rqk+tSQ== + } + engines: { node: '>= 0.6' } + dependencies: + safe-buffer: 5.2.1 + dev: false + + /content-type/1.0.4: + resolution: + { + integrity: sha512-hIP3EEPs8tB9AT1L+NUqtwOAps4mk2Zob89MWXMHjHWg9milF/j4osnnQLXBCBFBk/tvIG/tUc9mOUJiPBhPXA== + } + engines: { node: '>= 0.6' } + dev: false + /convert-source-map/1.8.0: resolution: { @@ -1940,6 +2136,10 @@ packages: safe-buffer: 5.1.2 dev: true + /cookie-signature/1.0.6: + resolution: { integrity: sha1-4wOogrNCzD7oylE6eZmXNNqzriw= } + dev: false + /cookie/0.4.2: resolution: { @@ -1965,6 +2165,17 @@ packages: requiresBuild: true dev: true + /cors/2.8.5: + resolution: + { + integrity: sha512-KIHbLJqu73RGr/hnbrO9uBeixNGuvSQjul/jdFvS/KFSIH1hWVd1ng7zOHx+YrEfInLG7q4n6GHQ9cDtxv/P6g== + } + engines: { node: '>= 0.10' } + dependencies: + object-assign: 4.1.1 + vary: 1.1.2 + dev: false + /cpu-features/0.0.2: resolution: { @@ -2065,7 +2276,6 @@ packages: } dependencies: ms: 2.0.0 - dev: true /debug/4.3.3: resolution: @@ -2134,6 +2344,22 @@ packages: engines: { node: '>=0.10' } dev: false + /depd/2.0.0: + resolution: + { + integrity: sha512-g7nH6P6dyDioJogAAGprGpCtVImJhpPk/roCzdb3fIh61/s/nPsfR6onyMwkCAR/OlC3yBC0lESvUoQEAssIrw== + } + engines: { node: '>= 0.8' } + dev: false + + /destroy/1.2.0: + resolution: + { + integrity: sha512-2sJGJTaXIIaR1w4iJSNoN0hnMY7Gpc/n8D4qSCJw8QqFWXf7cuAgnEHxBpweaVcPevC2l3KpjYCx3NypQQgaJg== + } + engines: { node: '>= 0.8', npm: 1.2.8000 || >= 1.4.16 } + dev: false + /detect-indent/4.0.0: resolution: { integrity: sha1-920GQ1LN9Docts5hnE7jqUdd4gg= } engines: { node: '>=0.10.0' } @@ -2270,6 +2496,10 @@ packages: safe-buffer: 5.2.1 dev: false + /ee-first/1.1.1: + resolution: { integrity: sha1-WQxhFWsK4vTwJVcyoViyZrxWsh0= } + dev: false + /electron-to-chromium/1.4.137: resolution: { @@ -2291,6 +2521,11 @@ packages: } dev: true + /encodeurl/1.0.2: + resolution: { integrity: sha1-rT/0yG7C0CkyL1oCw6mmBslbP1k= } + engines: { node: '>= 0.8' } + dev: false + /end-of-stream/1.4.4: resolution: { @@ -2300,6 +2535,54 @@ packages: once: 1.4.0 dev: false + /engine.io-client/6.2.2: + resolution: + { + integrity: sha512-8ZQmx0LQGRTYkHuogVZuGSpDqYZtCM/nv8zQ68VZ+JkOpazJ7ICdsSpaO6iXwvaU30oFg5QJOJWj8zWqhbKjkQ== + } + dependencies: + '@socket.io/component-emitter': 3.1.0 + debug: 4.3.3 + engine.io-parser: 5.0.4 + ws: 8.2.3 + xmlhttprequest-ssl: 2.0.0 + transitivePeerDependencies: + - bufferutil + - supports-color + - utf-8-validate + dev: false + + /engine.io-parser/5.0.4: + resolution: + { + integrity: sha512-+nVFp+5z1E3HcToEnO7ZIj3g+3k9389DvWtvJZz0T6/eOCPIyyxehFcedoYrZQrp0LgQbD9pPXhpMBKMd5QURg== + } + engines: { node: '>=10.0.0' } + dev: false + + /engine.io/6.2.0: + resolution: + { + integrity: sha512-4KzwW3F3bk+KlzSOY57fj/Jx6LyRQ1nbcyIadehl+AnXjKT7gDO0ORdRi/84ixvMKTym6ZKuxvbzN62HDDU1Lg== + } + engines: { node: '>=10.0.0' } + dependencies: + '@types/cookie': 0.4.1 + '@types/cors': 2.8.12 + '@types/node': 17.0.31 + accepts: 1.3.8 + base64id: 2.0.0 + cookie: 0.4.2 + cors: 2.8.5 + debug: 4.3.3 + engine.io-parser: 5.0.4 + ws: 8.2.3 + transitivePeerDependencies: + - bufferutil + - supports-color + - utf-8-validate + dev: false + /enquirer/2.3.6: resolution: { @@ -2593,6 +2876,10 @@ packages: engines: { node: '>=6' } dev: true + /escape-html/1.0.3: + resolution: { integrity: sha1-Aljq5NPQwJdN4cFpGI7wBR0dGYg= } + dev: false + /escape-string-regexp/1.0.5: resolution: { integrity: sha1-G2HAViGQqN/2rjuyzwIAyhMLhtQ= } engines: { node: '>=0.8.0' } @@ -2806,6 +3093,11 @@ packages: engines: { node: '>=0.10.0' } dev: true + /etag/1.8.1: + resolution: { integrity: sha1-Qa4u62XvpiJorr/qg6x9eSmbCIc= } + engines: { node: '>= 0.6' } + dev: false + /execa/5.1.1: resolution: { @@ -2829,6 +3121,46 @@ packages: engines: { node: '>= 0.8.0' } dev: true + /express/4.18.1: + resolution: + { + integrity: sha512-zZBcOX9TfehHQhtupq57OF8lFZ3UZi08Y97dwFCkD8p9d/d2Y3M+ykKcwaMDEL+4qyUolgBDX6AblpR3fL212Q== + } + engines: { node: '>= 0.10.0' } + dependencies: + accepts: 1.3.8 + array-flatten: 1.1.1 + body-parser: 1.20.0 + content-disposition: 0.5.4 + content-type: 1.0.4 + cookie: 0.5.0 + cookie-signature: 1.0.6 + debug: 2.6.9 + depd: 2.0.0 + encodeurl: 1.0.2 + escape-html: 1.0.3 + etag: 1.8.1 + finalhandler: 1.2.0 + fresh: 0.5.2 + http-errors: 2.0.0 + merge-descriptors: 1.0.1 + methods: 1.1.2 + on-finished: 2.4.1 + parseurl: 1.3.3 + path-to-regexp: 0.1.7 + proxy-addr: 2.0.7 + qs: 6.10.3 + range-parser: 1.2.1 + safe-buffer: 5.2.1 + send: 0.18.0 + serve-static: 1.15.0 + setprototypeof: 1.2.0 + statuses: 2.0.1 + type-is: 1.6.18 + utils-merge: 1.0.1 + vary: 1.1.2 + dev: false + /fast-deep-equal/3.1.3: resolution: { @@ -2890,6 +3222,22 @@ packages: to-regex-range: 5.0.1 dev: true + /finalhandler/1.2.0: + resolution: + { + integrity: sha512-5uXcUVftlQMFnWC9qu/svkWv3GTd2PfUhK/3PLkYNAe7FbqJMt3515HaxE6eRL74GdsriiwujiawdaB1BpEISg== + } + engines: { node: '>= 0.8' } + dependencies: + debug: 2.6.9 + encodeurl: 1.0.2 + escape-html: 1.0.3 + on-finished: 2.4.1 + parseurl: 1.3.3 + statuses: 2.0.1 + unpipe: 1.0.0 + dev: false + /flat-cache/3.0.4: resolution: { @@ -2915,6 +3263,14 @@ packages: } dev: false + /forwarded/0.2.0: + resolution: + { + integrity: sha512-buRG0fpBtRHSTCOASe6hD258tEubFoRLb4ZNA6NxMVHNw2gOcwHo9wyablzMzOA5z9xA9L1KNjk/Nt6MT9aYow== + } + engines: { node: '>= 0.6' } + dev: false + /fraction.js/4.2.0: resolution: { @@ -2922,6 +3278,11 @@ packages: } dev: true + /fresh/0.5.2: + resolution: { integrity: sha1-PYyt2Q2XZWn6g1qx+OSyOhBWBac= } + engines: { node: '>= 0.6' } + dev: false + /fs-constants/1.0.0: resolution: { @@ -2948,7 +3309,6 @@ packages: { integrity: sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A== } - dev: true /function.name/1.0.13: resolution: @@ -2970,6 +3330,17 @@ packages: } dev: false + /get-intrinsic/1.1.1: + resolution: + { + integrity: sha512-kWZrnVM42QCiEA2Ig1bG8zjoIMOgxWwYCEeNdwY6Tv/cOSeGpcoX4pXHfKUxNKVoArnrEr2e9srnAxxGIraS9Q== + } + dependencies: + function-bind: 1.1.1 + has: 1.0.3 + has-symbols: 1.0.3 + dev: false + /get-port/5.1.1: resolution: { @@ -3132,6 +3503,14 @@ packages: engines: { node: '>=8' } dev: true + /has-symbols/1.0.3: + resolution: + { + integrity: sha512-l3LCuF6MgDNwTDKkdYGEihYjt5pRPbEg46rtlmnSPlUbgmB8LOIrKJbYYFBSbnPaJexMKtiPO8hmeRjRz2Td+A== + } + engines: { node: '>= 0.4' } + dev: false + /has/1.0.3: resolution: { @@ -3140,7 +3519,6 @@ packages: engines: { node: '>= 0.4.0' } dependencies: function-bind: 1.1.1 - dev: true /home-or-tmp/2.0.0: resolution: { integrity: sha1-42w/LSyufXRqhX440Y1fMqeILbg= } @@ -3157,6 +3535,20 @@ packages: } dev: false + /http-errors/2.0.0: + resolution: + { + integrity: sha512-FtwrG/euBzaEjYeRqOgly7G0qviiXoJWnvEH2Z1plBdXgbyjv34pHTSb9zoeHMyDy33+DWy5Wt9Wo+TURtOYSQ== + } + engines: { node: '>= 0.8' } + dependencies: + depd: 2.0.0 + inherits: 2.0.4 + setprototypeof: 1.2.0 + statuses: 2.0.1 + toidentifier: 1.0.1 + dev: false + /http2-wrapper/2.1.10: resolution: { @@ -3198,6 +3590,16 @@ packages: hasBin: true dev: true + /iconv-lite/0.4.24: + resolution: + { + integrity: sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA== + } + engines: { node: '>=0.10.0' } + dependencies: + safer-buffer: 2.1.2 + dev: false + /ieee754/1.2.1: resolution: { @@ -3296,6 +3698,14 @@ packages: engines: { node: ^12.20.0 || ^14.13.1 || >=16.0.0 } dev: false + /ipaddr.js/1.9.1: + resolution: + { + integrity: sha512-0KI/607xoxSToH7GjN1FfSbLoU0+btTicjsQSWQlh/hZykN8KpmMf7uYwPW3R+akZ6R/w18ZlXSHBYXiYUPO3g== + } + engines: { node: '>= 0.10' } + dev: false + /is-binary-path/2.1.0: resolution: { @@ -3742,6 +4152,15 @@ packages: } dev: true + /media-typer/0.3.0: + resolution: { integrity: sha1-hxDXrwqmJvj/+hzgAWhUUmMlV0g= } + engines: { node: '>= 0.6' } + dev: false + + /merge-descriptors/1.0.1: + resolution: { integrity: sha1-sAqqVW3YtEVoFQ7J0blT8/kMu2E= } + dev: false + /merge-stream/2.0.0: resolution: { @@ -3757,6 +4176,11 @@ packages: engines: { node: '>= 8' } dev: true + /methods/1.1.2: + resolution: { integrity: sha1-VSmk1nZUE07cxSZmVoNbD4Ua/O4= } + engines: { node: '>= 0.6' } + dev: false + /micromatch/4.0.4: resolution: { @@ -3768,6 +4192,33 @@ packages: picomatch: 2.3.0 dev: true + /mime-db/1.52.0: + resolution: + { + integrity: sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg== + } + engines: { node: '>= 0.6' } + dev: false + + /mime-types/2.1.35: + resolution: + { + integrity: sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw== + } + engines: { node: '>= 0.6' } + dependencies: + mime-db: 1.52.0 + dev: false + + /mime/1.6.0: + resolution: + { + integrity: sha512-x0Vn8spI+wuJ1O6S7gnbaQg8Pxh4NNHb7KSINmEWKiPE4RKOplvijn+NkmYmmRgP68mc70j2EbeTFRsrswaQeg== + } + engines: { node: '>=4' } + hasBin: true + dev: false + /mimic-fn/2.1.0: resolution: { @@ -3842,7 +4293,6 @@ packages: /ms/2.0.0: resolution: { integrity: sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g= } - dev: true /ms/2.1.2: resolution: @@ -3850,6 +4300,13 @@ packages: integrity: sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w== } + /ms/2.1.3: + resolution: + { + integrity: sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA== + } + dev: false + /msgpackr-extract/1.0.15: resolution: { @@ -3900,6 +4357,14 @@ packages: resolution: { integrity: sha1-Sr6/7tdUHywnrPspvbvRXI1bpPc= } dev: true + /negotiator/0.6.3: + resolution: + { + integrity: sha512-+EUsqGPLsM+j/zdChZjsnX51g4XrHFOIXwfnCVPGlQk/k5giakcKsuxCObBRu6DSm9opw/O6slWbJdghQM4bBg== + } + engines: { node: '>= 0.6' } + dev: false + /node-forge/1.3.1: resolution: { @@ -3969,6 +4434,11 @@ packages: path-key: 3.1.1 dev: true + /object-assign/4.1.1: + resolution: { integrity: sha1-IQmtx5ZYh8/AXLvUQsrIv7s2CGM= } + engines: { node: '>=0.10.0' } + dev: false + /object-hash/3.0.0: resolution: { @@ -3982,7 +4452,16 @@ packages: { integrity: sha512-Ho2z80bVIvJloH+YzRmpZVQe87+qASmBUKZDWgx9cu+KDrX2ZDH/3tMy+gXbZETVGs2M8YdxObOh7XAtim9Y0g== } - dev: true + + /on-finished/2.4.1: + resolution: + { + integrity: sha512-oVlzkg3ENAhCk2zdv7IJwd/QUD4z2RxRwpkcGY8psCVcCYZNq4wYnVWALHM+brtuJjePWiYF/ClmuDr8Ch5+kg== + } + engines: { node: '>= 0.8' } + dependencies: + ee-first: 1.1.1 + dev: false /once/1.4.0: resolution: { integrity: sha1-WDsap3WWHUsROsF9nFC6753Xa9E= } @@ -4070,6 +4549,14 @@ packages: callsites: 3.1.0 dev: true + /parseurl/1.3.3: + resolution: + { + integrity: sha512-CiyeOxFT/JZyN5m0z9PfXw4SCBJ6Sygz1Dpl0wqjlhDEGGBP1GnsUVEL0p63hoG1fcj3fHynXi9NYO4nWOL+qQ== + } + engines: { node: '>= 0.8' } + dev: false + /path-is-absolute/1.0.1: resolution: { integrity: sha1-F0uSaHNVNP+8es5r9TpanhtcX18= } engines: { node: '>=0.10.0' } @@ -4088,6 +4575,10 @@ packages: } dev: true + /path-to-regexp/0.1.7: + resolution: { integrity: sha1-32BBeABfUi8V60SQ5yR6G/qmf4w= } + dev: false + /path-type/4.0.0: resolution: { @@ -4267,6 +4758,17 @@ packages: engines: { node: '>=0.4.0' } dev: true + /proxy-addr/2.0.7: + resolution: + { + integrity: sha512-llQsMLSUDUPT44jdrU/O37qlnifitDP+ZwrmmZcoSKyLKvtZxpyV0n2/bD/N4tBAAZ/gJEdZU7KMraoK1+XYAg== + } + engines: { node: '>= 0.10' } + dependencies: + forwarded: 0.2.0 + ipaddr.js: 1.9.1 + dev: false + /pseudomap/1.0.2: resolution: { integrity: sha1-8FKijacOYYkX7wqKw0wa5aaChrM= } dev: true @@ -4289,6 +4791,16 @@ packages: engines: { node: '>=6' } dev: true + /qs/6.10.3: + resolution: + { + integrity: sha512-wr7M2E0OFRfIfJZjKGieI8lBKb7fRCH4Fv5KNPEs7gJ8jadvotdsS08PzOKR7opXhZ/Xkjtt3WF9g38drmyRqQ== + } + engines: { node: '>=0.6' } + dependencies: + side-channel: 1.0.4 + dev: false + /queue-microtask/1.2.3: resolution: { @@ -4303,6 +4815,27 @@ packages: } engines: { node: '>=10' } + /range-parser/1.2.1: + resolution: + { + integrity: sha512-Hrgsx+orqoygnmhFbKaHE6c296J+HTAQXoxEF6gNupROmmGJRoyzfG3ccAveqCBrwr/2yxQ5BVd/GTl5agOwSg== + } + engines: { node: '>= 0.6' } + dev: false + + /raw-body/2.5.1: + resolution: + { + integrity: sha512-qqJBtEyVgS0ZmPGdCFPWJ3FreoqvG4MVQln/kCgF7Olq95IbOp0/BWyMwbdtn4VTvkM8Y7khCQ2Xgk/tcrCXig== + } + engines: { node: '>= 0.8' } + dependencies: + bytes: 3.1.2 + http-errors: 2.0.0 + iconv-lite: 0.4.24 + unpipe: 1.0.0 + dev: false + /readable-stream/3.6.0: resolution: { @@ -4593,6 +5126,48 @@ packages: lru-cache: 6.0.0 dev: true + /send/0.18.0: + resolution: + { + integrity: sha512-qqWzuOjSFOuqPjFe4NOsMLafToQQwBSOEpS+FwEt3A2V3vKubTquT3vmLTQpFgMXp8AlFWFuP1qKaJZOtPpVXg== + } + engines: { node: '>= 0.8.0' } + dependencies: + debug: 2.6.9 + depd: 2.0.0 + destroy: 1.2.0 + encodeurl: 1.0.2 + escape-html: 1.0.3 + etag: 1.8.1 + fresh: 0.5.2 + http-errors: 2.0.0 + mime: 1.6.0 + ms: 2.1.3 + on-finished: 2.4.1 + range-parser: 1.2.1 + statuses: 2.0.1 + dev: false + + /serve-static/1.15.0: + resolution: + { + integrity: sha512-XGuRDNjXUijsUL0vl6nSD7cwURuzEgglbOaFuZM9g3kwDXOWVTck0jLzjPzGD+TazWbboZYu52/9/XPdUgne9g== + } + engines: { node: '>= 0.8.0' } + dependencies: + encodeurl: 1.0.2 + escape-html: 1.0.3 + parseurl: 1.3.3 + send: 0.18.0 + dev: false + + /setprototypeof/1.2.0: + resolution: + { + integrity: sha512-E5LDX7Wrp85Kil5bhZv46j8jOeboKq5JMmYM3gVGdGH8xFpPWXUMsNrlODCrkoxMEeNi/XZIwuRvY4XNwYMJpw== + } + dev: false + /shebang-command/1.2.0: resolution: { integrity: sha1-RKrGW2lbAzmJaMOfNj/uXer98eo= } engines: { node: '>=0.10.0' } @@ -4621,6 +5196,17 @@ packages: } engines: { node: '>=8' } + /side-channel/1.0.4: + resolution: + { + integrity: sha512-q5XPytqFEIKHkGdiMIrY10mvLRvnQh42/+GoBlFW3b2LXLE2xxJpZFdm94we0BaoV3RwJyGqg5wS7epxTv0Zvw== + } + dependencies: + call-bind: 1.0.2 + get-intrinsic: 1.1.1 + object-inspect: 1.12.0 + dev: false + /signal-exit/3.0.5: resolution: { @@ -4676,6 +5262,76 @@ packages: is-fullwidth-code-point: 4.0.0 dev: true + /socket.io-adapter/2.4.0: + resolution: + { + integrity: sha512-W4N+o69rkMEGVuk2D/cvca3uYsvGlMwsySWV447y99gUPghxq42BxqLNMndb+a1mm/5/7NeXVQS7RLa2XyXvYg== + } + dev: false + + /socket.io-client/4.5.0: + resolution: + { + integrity: sha512-HW61c1G7OrYGxaI79WRn17+b03iBCdvhBj4iqyXHBoL5M8w2MSO/vChsjA93knG4GYEai1/vbXWJna9dzxXtSg== + } + engines: { node: '>=10.0.0' } + dependencies: + '@socket.io/component-emitter': 3.1.0 + debug: 4.3.3 + engine.io-client: 6.2.2 + socket.io-parser: 4.2.0 + transitivePeerDependencies: + - bufferutil + - supports-color + - utf-8-validate + dev: false + + /socket.io-parser/4.0.4: + resolution: + { + integrity: sha512-t+b0SS+IxG7Rxzda2EVvyBZbvFPBCjJoyHuE0P//7OAsN23GItzDRdWa6ALxZI/8R5ygK7jAR6t028/z+7295g== + } + engines: { node: '>=10.0.0' } + dependencies: + '@types/component-emitter': 1.2.11 + component-emitter: 1.3.0 + debug: 4.3.3 + transitivePeerDependencies: + - supports-color + dev: false + + /socket.io-parser/4.2.0: + resolution: + { + integrity: sha512-tLfmEwcEwnlQTxFB7jibL/q2+q8dlVQzj4JdRLJ/W/G1+Fu9VSxCx1Lo+n1HvXxKnM//dUuD0xgiA7tQf57Vng== + } + engines: { node: '>=10.0.0' } + dependencies: + '@socket.io/component-emitter': 3.1.0 + debug: 4.3.3 + transitivePeerDependencies: + - supports-color + dev: false + + /socket.io/4.5.0: + resolution: + { + integrity: sha512-slTYqU2jCgMjXwresG8grhUi/cC6GjzmcfqArzaH3BN/9I/42eZk9yamNvZJdBfTubkjEdKAKs12NEztId+bUA== + } + engines: { node: '>=10.0.0' } + dependencies: + accepts: 1.3.8 + base64id: 2.0.0 + debug: 4.3.3 + engine.io: 6.2.0 + socket.io-adapter: 2.4.0 + socket.io-parser: 4.0.4 + transitivePeerDependencies: + - bufferutil + - supports-color + - utf-8-validate + dev: false + /sorcery/0.10.0: resolution: { integrity: sha1-iukK19fLBfxZ8asMY3hF1cFaUrc= } hasBin: true @@ -4753,6 +5409,14 @@ packages: } dev: false + /statuses/2.0.1: + resolution: + { + integrity: sha512-RwNA9Z/7PrK06rYLIzFMlaF+l73iwpzsqRIFgbMLbTcLD6cOao82TaWefPXQvB2fOC4AjuYSEndS7N/mTCbkdQ== + } + engines: { node: '>= 0.8' } + dev: false + /string-argv/0.3.1: resolution: { @@ -5138,6 +5802,14 @@ packages: is-number: 7.0.0 dev: true + /toidentifier/1.0.1: + resolution: + { + integrity: sha512-o5sSPKEkg/DIQNmH43V0/uerLrpzVedkUh8tGNvaeXpfpuwjKenlSox/2O/BTlZUtEe+JG7s5YhEz608PlAHRA== + } + engines: { node: '>=0.6' } + dev: false + /trim-right/1.0.1: resolution: { integrity: sha1-yy4SAwZ+DI3h9hQJS5/kVwTqYAM= } engines: { node: '>=0.10.0' } @@ -5233,6 +5905,17 @@ packages: engines: { node: '>=10' } dev: true + /type-is/1.6.18: + resolution: + { + integrity: sha512-TkRKr9sUTxEH8MdfuCSP7VizJyzRNMjj2J2do2Jr3Kym598JVdEksuzPQCnlFPW4ky9Q+iA+ma9BGm06XQBy8g== + } + engines: { node: '>= 0.6' } + dependencies: + media-typer: 0.3.0 + mime-types: 2.1.35 + dev: false + /typescript/4.6.4: resolution: { @@ -5259,6 +5942,11 @@ packages: engines: { node: '>=8' } dev: false + /unpipe/1.0.0: + resolution: { integrity: sha1-sr9O6FFKrmFltIF4KdIbLvSZBOw= } + engines: { node: '>= 0.8' } + dev: false + /uri-js/4.4.1: resolution: { @@ -5271,6 +5959,11 @@ packages: /util-deprecate/1.0.2: resolution: { integrity: sha1-RQ1Nyfpw3nMnYvvS1KKJgUGaDM8= } + /utils-merge/1.0.1: + resolution: { integrity: sha1-n5VxD1CiZ5R7LMwSR0HBAoQn5xM= } + engines: { node: '>= 0.4.0' } + dev: false + /uuid/8.3.2: resolution: { @@ -5293,6 +5986,11 @@ packages: } dev: true + /vary/1.1.2: + resolution: { integrity: sha1-IpnwLG3tMNSllhsLn3RSShj2NPw= } + engines: { node: '>= 0.8' } + dev: false + /vite/2.9.1: resolution: { @@ -5375,6 +6073,30 @@ packages: /wrappy/1.0.2: resolution: { integrity: sha1-tSQ9jz7BqjXxNkYFvA0QNuMKtp8= } + /ws/8.2.3: + resolution: + { + integrity: sha512-wBuoj1BDpC6ZQ1B7DWQBYVLphPWkm8i9Y0/3YdHjHKHiohOJ1ws+3OccDWtH+PoC9DZD5WOTrJvNbWvjS6JWaA== + } + engines: { node: '>=10.0.0' } + peerDependencies: + bufferutil: ^4.0.1 + utf-8-validate: ^5.0.2 + peerDependenciesMeta: + bufferutil: + optional: true + utf-8-validate: + optional: true + dev: false + + /xmlhttprequest-ssl/2.0.0: + resolution: + { + integrity: sha512-QKxVRxiRACQcVuQEYFsI1hhkrMlrXHPegbbd1yn9UHOmRxY+si12nQYzri3vbzt8VdTTRviqcKxcyllFas5z2A== + } + engines: { node: '>=0.4.0' } + dev: false + /xtend/4.0.2: resolution: { diff --git a/server/index.js b/server/index.js new file mode 100644 index 000000000..154a8899d --- /dev/null +++ b/server/index.js @@ -0,0 +1,20 @@ +import express from 'express'; +import { createServer } from 'http'; +import { Server } from 'socket.io'; + +import { handler } from '../build/handler.js'; + +const app = express(); +const server = createServer(app); + +const io = new Server(server); + +io.on('connection', (socket) => { + socket.emit('eventFromServer', 'Hello, World 👋'); +}); + +app.use(handler); + +server.listen(port, () => { + console.log(`Listening on port ${port}`); +}); diff --git a/src/lib/common.ts b/src/lib/common.ts index 61009d42f..cae9350ce 100644 --- a/src/lib/common.ts +++ b/src/lib/common.ts @@ -96,12 +96,16 @@ export const getUserDetails = async ( const userId = event?.locals?.session?.data?.userId || null; let permission = 'read'; if (teamId && userId) { - const data = await db.prisma.permission.findFirst({ - where: { teamId, userId }, - select: { permission: true }, - rejectOnNotFound: true - }); - if (data.permission) permission = data.permission; + try { + const data = await db.prisma.permission.findFirst({ + where: { teamId, userId }, + select: { permission: true }, + rejectOnNotFound: true + }); + if (data.permission) permission = data.permission; + } catch (error) { + console.log(error); + } } const payload = { diff --git a/src/lib/realtime.ts b/src/lib/realtime.ts new file mode 100644 index 000000000..9fda419b9 --- /dev/null +++ b/src/lib/realtime.ts @@ -0,0 +1,3 @@ +import ioClient from 'socket.io-client'; +const socket = ioClient('http://localhost:3000'); +export const io = socket; diff --git a/src/routes/__layout.svelte b/src/routes/__layout.svelte index 6ead964da..bbc06ea31 100644 --- a/src/routes/__layout.svelte +++ b/src/routes/__layout.svelte @@ -43,6 +43,7 @@ import { del, get, post } from '$lib/api'; import { dev } from '$app/env'; import { features } from '$lib/store'; + import { io } from '$lib/realtime'; let isUpdateAvailable = false; let updateStatus = { @@ -51,6 +52,11 @@ success: null }; let latestVersion = 'latest'; + + io.on('eventFromServer', (message) => { + console.log(message); + }); + onMount(async () => { if ($session.userId) { const overrideVersion = $features.latestVersion; diff --git a/src/routes/index.svelte b/src/routes/index.svelte index bd441afdb..858a0387b 100644 --- a/src/routes/index.svelte +++ b/src/routes/index.svelte @@ -23,7 +23,6 @@ import { t } from '$lib/translations'; import { get } from '$lib/api'; import { onDestroy, onMount } from 'svelte'; - import Loading from './applications/[id]/logs/_Loading.svelte'; import Trend from './_Trend.svelte'; import { session } from '$app/stores'; diff --git a/svelte.config.js b/svelte.config.js index 352c3e330..329abfeee 100644 --- a/svelte.config.js +++ b/svelte.config.js @@ -1,6 +1,17 @@ import preprocess from 'svelte-preprocess'; import adapter from '@sveltejs/adapter-node'; +import { Server } from 'socket.io'; +const webSocketServer = { + name: 'webSocketServer', + configureServer(server) { + const io = new Server(server.httpServer); + io.on('connection', (socket) => { + socket.emit('eventFromServer', 'Hello, World 👋'); + }); + } +}; + const config = { preprocess: preprocess(), kit: { @@ -10,6 +21,7 @@ const config = { }, floc: true, vite: { + plugins: [webSocketServer], optimizeDeps: { exclude: ['svelte-kit-cookie-session'] },