From f1e8d5c537cbd08944aa334396c14192b47ef24b Mon Sep 17 00:00:00 2001 From: ewsgit Date: Thu, 28 May 2026 20:33:46 +0100 Subject: [PATCH] websocket beginnings & GCI database planning --- frontend/src/routes/app/community.tsx | 12 +++ frontend/src/routes/app/communityContext.ts | 13 +++ frontend/websocket_todo.png | Bin 0 -> 39419 bytes generalCommunicationInstance/package.json | 4 +- .../src/databaseTables.ts | 28 ++++++ generalCommunicationInstance/src/index.ts | 2 + generalCommunicationInstance/src/routes.ts | 11 ++- pnpm-lock.yaml | 83 ++++++++++++++++++ 8 files changed, 149 insertions(+), 4 deletions(-) create mode 100644 frontend/src/routes/app/community.tsx create mode 100644 frontend/src/routes/app/communityContext.ts create mode 100644 frontend/websocket_todo.png diff --git a/frontend/src/routes/app/community.tsx b/frontend/src/routes/app/community.tsx new file mode 100644 index 0000000..7b86a4f --- /dev/null +++ b/frontend/src/routes/app/community.tsx @@ -0,0 +1,12 @@ +import type { Component, ParentProps } from "solid-js"; + +const Community: Component = (props) => { + return ( +
+ Test CommunityLayout + {props.children} +
+ ); +}; + +export default Community; diff --git a/frontend/src/routes/app/communityContext.ts b/frontend/src/routes/app/communityContext.ts new file mode 100644 index 0000000..73e4d5a --- /dev/null +++ b/frontend/src/routes/app/communityContext.ts @@ -0,0 +1,13 @@ +import { createContext } from "solid-js"; +import type { SetStoreFunction, Store } from "solid-js/store"; + +export interface CommunityState { + community_id?: string; +} + +const AppContext = createContext<{ + setCommunityState: SetStoreFunction; + communityState: Store; +}>(undefined); + +export { AppContext }; diff --git a/frontend/websocket_todo.png b/frontend/websocket_todo.png new file mode 100644 index 0000000000000000000000000000000000000000..1bfcb803ef6d4e55eb75f4a1d291e431a824c840 GIT binary patch literal 39419 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 z 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 { return "Hello from the HarmonyChat General Communication Instance Backend!"; }); + + app.get("/websocket", { websocket: true }, (socket, req) => { + socket.on("message", (message) => { + // message.toString() === 'hi from client' + socket.send("hi from wildcard route"); + }); + }); } diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 1391eec..f565a35 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -322,6 +322,9 @@ importers: '@fastify/url-data': specifier: ^6.0.3 version: 6.0.3 + '@fastify/websocket': + specifier: ^11.2.0 + version: 11.2.0 dotenv: specifier: ^17.4.2 version: 17.4.2 @@ -347,6 +350,9 @@ importers: '@types/node': specifier: ^25.9.1 version: 25.9.1 + '@types/ws': + specifier: ^8.18.1 + version: 8.18.1 packages: @@ -1127,6 +1133,9 @@ packages: '@fastify/url-data@6.0.3': resolution: {integrity: sha512-WyDlwW3oqR9UakZk70v4IO1YD6s24RuSQVcmlTlDEw3XrXkNwcJosY07yLYl8eka9ecyiy9DaVrtShKMdbHxGQ==} + '@fastify/websocket@11.2.0': + resolution: {integrity: sha512-3HrDPbAG1CzUCqnslgJxppvzaAZffieOVbLp1DAy1huCSynUWPifSvfdEDUR8HlJLp3sp1A36uOM2tJogADS8w==} + '@ioredis/commands@1.5.1': resolution: {integrity: sha512-JH8ZL/ywcJyR9MmJ5BNqZllXNZQqQbnVZOqpPQqE1vHiFgAw4NHbvE0FOduNU8IX9babitBT46571OnPTT0Zcw==} @@ -1771,6 +1780,9 @@ packages: '@types/unist@3.0.3': resolution: {integrity: sha512-ko/gIFJRv177XgZsZcBwnqJN5x/Gien8qNOn0D5bQU/zAzVf9Zt3BlcUiLqhV9y4ARk0GbT3tnUiPNgnTXzc/Q==} + '@types/ws@8.18.1': + resolution: {integrity: sha512-ThVF6DCVhA8kUGy+aazFQ4kXQ7E1Ty7A3ypFOe0IcJV8O/M511G99AW24irKrW56Wt44yG9+ij8FaqoBGkuBXg==} + '@ungap/structured-clone@1.3.1': resolution: {integrity: sha512-mUFwbeTqrVgDQxFveS+df2yfap6iuP20NAKAsBt5jDEoOTDew+zwLAOilHCeQJOVSvmgCX4ogqIrA0mnyr08yQ==} @@ -2210,6 +2222,9 @@ packages: duplexer@0.1.2: resolution: {integrity: sha512-jtD6YG370ZCIi/9GTaJKQxWTZD045+4R4hTk/x1UyoqadyJ9x9CgSi1RlVDQF8U2sxLLSnFkCaMihqljHIWgMg==} + duplexify@4.1.3: + resolution: {integrity: sha512-M3BmBhwJRZsSx38lZyhE53Csddgzl5R7xGJNk7CVddZD6CcmwMCH8J+7AprIrQKH7TonKxaCjcv27Qmf+sQ+oA==} + eastasianwidth@0.2.0: resolution: {integrity: sha512-I88TYZWc9XiYHRQ4/3c5rjjfgkjhLyW2luGIheGERbNQ6OY7yTybanSpDXZa8y7VUP9YmDcYa+eyq4ca7iLqWA==} @@ -2235,6 +2250,9 @@ packages: resolution: {integrity: sha512-Q0n9HRi4m6JuGIV1eFlmvJB7ZEVxu93IrMyiMsGC0lrMJMWzRgx6WGquyfQgZVb31vhGgXnfmPNNXmxnOkRBrg==} engines: {node: '>= 0.8'} + end-of-stream@1.4.5: + resolution: {integrity: sha512-ooEGc6HP26xXq/N+GCGOT0JKCLDGrq2bQUZrQ7gyrJiZANJ/8YDTxTpQBXGMn+WbIQXNVpyWymm7KYVICQnyOg==} + entities@6.0.1: resolution: {integrity: sha512-aN97NXWF6AWBTahfVOIrB/NShkzi5H7F9r1s9mD3cDj4Ko5f2qhhVoYMibXF7GlLveb/D2ioWay8lxI97Ven3g==} engines: {node: '>=0.12'} @@ -2899,6 +2917,9 @@ packages: resolution: {integrity: sha512-oVlzkg3ENAhCk2zdv7IJwd/QUD4z2RxRwpkcGY8psCVcCYZNq4wYnVWALHM+brtuJjePWiYF/ClmuDr8Ch5+kg==} engines: {node: '>= 0.8'} + once@1.4.0: + resolution: {integrity: sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w==} + oniguruma-to-es@2.3.0: resolution: {integrity: sha512-bwALDxriqfKGfUufKGGepCzu9x7nJQuoRoAFp4AnwehhC2crqrDIAP/uN2qdlsAvSMpeRC3+Yzhqc7hLmle5+g==} @@ -3049,6 +3070,10 @@ packages: readable-stream@2.3.8: resolution: {integrity: sha512-8p0AUk4XODgIewSi0l8Epjs+EVnWiK7NoDIEGU0HhE7+ZyY8D1IMY7odu5lRrFXGg71L15KG8QrPmum45RTtdA==} + readable-stream@3.6.2: + resolution: {integrity: sha512-9u/sniCrY3D5WdsERHzHE4G2YCXqoG5FTHUiCC4SIbr6XcLZBY05ya9EKjYek9O5xOAwjGq+1JdGBAS7Q9ScoA==} + engines: {node: '>= 6'} + readable-stream@4.7.0: resolution: {integrity: sha512-oIGGmcpTLwPga8Bn6/Z75SVaH1z5dUut2ibSyAMVhmUggWpmDn2dapB0n7f8nwaSiRtepAsfJyfXIO5DCVAODg==} engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} @@ -3415,6 +3440,9 @@ packages: std-env@4.1.0: resolution: {integrity: sha512-Rq7ybcX2RuC55r9oaPVEW7/xu3tj8u4GeBYHBWCychFtzMIr86A7e3PPEBPT37sHStKX3+TiX/Fr/ACmJLVlLQ==} + stream-shift@1.0.3: + resolution: {integrity: sha512-76ORR0DO1o1hlKwTbi/DM3EXWGf3ZJYO8cXX5RJwnul2DEg2oyoZyjLNoQM8WsvZiFKCRfC1O0J7iCvie3RZmQ==} + streamx@2.25.0: resolution: {integrity: sha512-0nQuG6jf1w+wddNEEXCF4nTg3LtufWINB5eFEN+5TNZW7KWJp6x87+JFL43vaAUPyCfH1wID+mNVyW6OHtFamg==} @@ -3881,6 +3909,21 @@ packages: resolution: {integrity: sha512-42AtmgqjV+X1VpdOfyTGOYRi0/zsoLqtXQckTmqTeybT+BDIbM/Guxo7x3pE2vtpr1ok6xRqM9OpBe+Jyoqyww==} engines: {node: '>=18'} + wrappy@1.0.2: + resolution: {integrity: sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ==} + + ws@8.21.0: + resolution: {integrity: sha512-Vsp28b7DRcimFQvrqu2Wek3z1iYxDCWqHYB8Qsnk/S4RfaCQzPGPyBNuVjJV3cd6UiKtUtp6sNM77gWvzcCH+g==} + 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 + wsl-utils@0.3.1: resolution: {integrity: sha512-g/eziiSUNBSsdDJtCLB8bdYEUMj4jR7AGeUo96p/3dTafgjHhpF4RiCFPiRILwjQoDXx5MqkBr4fwWtR3Ky4Wg==} engines: {node: '>=20'} @@ -4628,6 +4671,15 @@ snapshots: fast-uri: 3.1.2 fastify-plugin: 5.1.0 + '@fastify/websocket@11.2.0': + dependencies: + duplexify: 4.1.3 + fastify-plugin: 5.1.0 + ws: 8.21.0 + transitivePeerDependencies: + - bufferutil + - utf-8-validate + '@ioredis/commands@1.5.1': {} '@isaacs/cliui@8.0.2': @@ -5248,6 +5300,10 @@ snapshots: '@types/unist@3.0.3': {} + '@types/ws@8.18.1': + dependencies: + '@types/node': 25.9.1 + '@ungap/structured-clone@1.3.1': {} '@vercel/nft@1.5.0(rollup@4.60.4)': @@ -5622,6 +5678,13 @@ snapshots: duplexer@0.1.2: {} + duplexify@4.1.3: + dependencies: + end-of-stream: 1.4.5 + inherits: 2.0.4 + readable-stream: 3.6.2 + stream-shift: 1.0.3 + eastasianwidth@0.2.0: {} ee-first@1.1.1: {} @@ -5638,6 +5701,10 @@ snapshots: encodeurl@2.0.0: {} + end-of-stream@1.4.5: + dependencies: + once: 1.4.0 + entities@6.0.1: {} error-stack-parser-es@1.0.5: {} @@ -6437,6 +6504,10 @@ snapshots: dependencies: ee-first: 1.1.1 + once@1.4.0: + dependencies: + wrappy: 1.0.2 + oniguruma-to-es@2.3.0: dependencies: emoji-regex-xs: 1.0.0 @@ -6580,6 +6651,12 @@ snapshots: string_decoder: 1.1.1 util-deprecate: 1.0.2 + readable-stream@3.6.2: + dependencies: + inherits: 2.0.4 + string_decoder: 1.3.0 + util-deprecate: 1.0.2 + readable-stream@4.7.0: dependencies: abort-controller: 3.0.0 @@ -6940,6 +7017,8 @@ snapshots: std-env@4.1.0: {} + stream-shift@1.0.3: {} + streamx@2.25.0: dependencies: events-universal: 1.0.1 @@ -7393,6 +7472,10 @@ snapshots: string-width: 7.2.0 strip-ansi: 7.2.0 + wrappy@1.0.2: {} + + ws@8.21.0: {} + wsl-utils@0.3.1: dependencies: is-wsl: 3.1.1 -- 2.51.2