Loading .gitlab-ci.yml +2 −0 Original line number Diff line number Diff line Loading @@ -57,6 +57,8 @@ jest server: script: - apk update && apk add git - yarn workspaces focus --all - yarn build-api-schema - yarn workspace @sc07-canvas/lib build - yarn workspace @sc07-canvas/server prisma migrate reset --force - yarn workspace @sc07-canvas/server prisma generate - yarn workspace @sc07-canvas/server run test:ci Loading Dockerfile +112 −74 Original line number Diff line number Diff line Loading @@ -2,6 +2,8 @@ FROM node:24-alpine AS base # add openssl as root RUN apk add --no-cache openssl ARG VERSION WORKDIR /home/node/app USER node Loading @@ -17,129 +19,165 @@ COPY packages/chat/package.json ./packages/chat/ USER root RUN corepack enable yarn && corepack prepare --activate RUN chown -R node:node /home/node/app RUN ln -s /home/node/app /app USER node FROM base AS dev_dep # # Build library # FROM base AS lib-dev-deps RUN yarn workspaces focus @sc07-canvas/lib FROM base AS lib-prod-deps # install all dependencies RUN yarn workspaces focus --all RUN yarn workspaces focus @sc07-canvas/lib --production FROM base AS dep FROM lib-dev-deps AS lib-build # install only production dependencies RUN yarn workspaces focus --all --production COPY --chown=node:node packages/server/src/api/openapi.yml packages/lib/.openapi.yml COPY --chown=node:node packages/lib/ ./packages/lib/ RUN npx openapi-typescript packages/lib/.openapi.yml -o packages/lib/src/api-schema.ts && rm packages/lib/.openapi.yml RUN yarn workspace @sc07-canvas/lib run build RUN ln -s /home/node/app/packages FROM lib-prod-deps AS lib COPY --from=lib-build /app/packages/lib/dist/ ./packages/lib/dist # # === BUILDER === # Build chat # FROM base AS build # CLIENT_SENTRY_DSN will be baked into the client package # SERVER_SENTRY_DSN is NOT baked in and must also be supplied to image on start # SENTRY_{URL,ORG,PROJECT,AUTH_TOKEN} are used for sourcemap pushing ARG CLIENT_SENTRY_DSN ARG CLIENT_SENTRY_PROJECT ARG SERVER_SENTRY_DSN ARG SERVER_SENTRY_PROJECT ARG SENTRY_URL ARG SENTRY_ORG ARG SENTRY_AUTH_TOKEN ARG VERSION FROM base AS chat-dev-deps # copy all dev dependencies into stage COPY --from=dev_dep --chown=node:node /home/node/app/ ./ # copy all source files COPY --chown=node:node . . RUN yarn workspaces focus @sc07-canvas/chat # --- build lib --- FROM base AS chat-prod-deps RUN yarn run build-api-schema RUN yarn workspace @sc07-canvas/lib run build # janky? fix to keep imports in dev # RUN sed -i -e 's/"main": ".*"/"main": ".\/dist\/index.js"/' packages/lib/package.json RUN yarn workspaces focus @sc07-canvas/chat --production # --- build chat --- FROM chat-dev-deps AS chat-build COPY --chown=node:node packages/chat/ ./packages/chat/ RUN yarn workspace @sc07-canvas/chat run build # --- build main client --- FROM chat-prod-deps AS chat COPY --from=chat-build /app/packages/chat/dist/ ./packages/chat/dist ARG VITE_INCLUDE_EVENT_INFO ARG SENTRY_DSN=$CLIENT_SENTRY_DSN ARG SENTRY_PROJECT=$CLIENT_SENTRY_PROJECT # # Build client # FROM base AS client-xdep COPY --from=chat /app/packages/chat/dist/ ./packages/chat/dist COPY --from=lib /app/packages/lib/dist/ ./packages/lib/dist FROM client-xdep AS client-dev-deps RUN yarn workspaces focus @sc07-canvas/client FROM client-xdep AS client-prod-deps RUN yarn workspaces focus @sc07-canvas/client --production FROM client-dev-deps AS client-build COPY --chown=node:node packages/client/ ./packages/client/ RUN yarn workspace @sc07-canvas/client run build # --- build admin --- FROM client-prod-deps AS client COPY --from=client-build /app/packages/client/dist ./packages/client/dist # # Build admin # FROM base AS admin-dev-deps RUN yarn workspaces focus @sc07-canvas/admin FROM base AS admin-prod-deps RUN yarn workspaces focus @sc07-canvas/admin --production FROM admin-dev-deps AS admin-build COPY --chown=node:node packages/admin ./packages/admin/ ENV APP_ROOT=/admin RUN yarn workspace @sc07-canvas/admin run build # --- build server --- FROM admin-prod-deps AS admin RUN sed -i -e 's/"main": ".*"/"main": ".\/dist\/index.js"/' packages/lib/package.json ENV DATABASE_URL=postgres://invalid/not-needed-rn RUN yarn workspace @sc07-canvas/server prisma generate ARG SENTRY_DSN=$SERVER_SENTRY_DSN ARG SENTRY_PROJECT=$SERVER_SENTRY_PROJECT RUN yarn workspace @sc07-canvas/server run build # Disabled (see #162) # RUN if [ -n "$SENTRY_AUTH_TOKEN" ]; then npm -w packages/server run sentry; fi COPY --from=admin-build /app/packages/admin/dist ./packages/admin/dist # # === RUNNER === # Build server # FROM base AS run WORKDIR /home/node/app COPY --from=dep /home/node/app/ ./ COPY docker-start*.sh ./ FROM base AS server-xdeps # --- clear packages from base --- # wipe these as the final running image is packaged differently RUN rm -rf packages/{lib,client,admin,server} COPY --from=lib /app/packages/lib/dist ./packages/lib/dist COPY --chown=node:node packages/server/prisma.config.ts ./packages/server/ # --- prepare lib --- FROM server-xdeps AS server-dev-deps RUN mkdir -p packages/lib COPY --from=build /home/node/app/packages/lib/package.json ./packages/lib COPY --from=build /home/node/app/packages/lib/dist ./packages/lib/dist RUN yarn workspaces focus @sc07-canvas/server # --- prepare client --- FROM server-xdeps AS server-prod-deps RUN mkdir -p packages/client COPY --from=build /home/node/app/packages/client/dist ./packages/client/ RUN yarn workspaces focus @sc07-canvas/server --production # --- prepare admin --- FROM server-dev-deps AS server-build RUN mkdir -p packages/admin COPY --from=build /home/node/app/packages/admin/dist ./packages/admin/ COPY --chown=node:node packages/server ./packages/server # --- prepare server --- ENV DATABASE_URL=postgres://invalid/not-needed-rn RUN yarn workspace @sc07-canvas/server prisma generate # TODO: add sentry # ARG SENTRY_DSN=$SERVER_SENTRY_DSN # ARG SENTRY_PROJECT=$SERVER_SENTRY_PROJECT RUN yarn workspace @sc07-canvas/server run build # Disabled (see #162) # RUN if [ -n "$SENTRY_AUTH_TOKEN" ]; then npm -w packages/server run sentry; fi RUN mkdir -p packages/server FROM server-prod-deps AS server ARG VERSION ENV VERSION_PATH=/home/node/app/packages/server/.version RUN echo "${VERSION}" > ./packages/server/.version COPY packages/server/prisma.config.ts ./packages/server/ COPY --from=build /home/node/app/packages/server/package.json ./packages/server/ COPY --from=build /home/node/app/packages/server/prisma ./packages/server/prisma COPY --from=build /home/node/app/packages/server/tool.sh ./packages/server/ COPY --from=build /home/node/app/packages/server/dist ./packages/server/dist COPY --from=server-build /app/packages/server/package.json ./packages/server/ COPY --from=server-build /app/packages/server/prisma ./packages/server/prisma COPY --from=server-build /app/packages/server/tool.sh ./packages/server/ COPY --from=server-build /app/packages/server/dist ./packages/server/dist COPY --from=server-build /app/node_modules/@prisma/client node_modules/@prisma/client COPY --from=server-build /app/node_modules/.prisma node_modules/.prisma # --- finalize --- # # === RUNNER === # ENV DATABASE_URL=postgres://invalid/not-needed-rn RUN npx -w packages/server prisma generate FROM base AS run WORKDIR /home/node/app COPY docker-start*.sh ./ COPY --from=lib /app/packages/lib ./packages/lib COPY --from=client /app/packages/client ./packages/client COPY --from=admin /app/packages/admin ./packages/admin COPY --from=server /app/packages/server ./packages/server COPY --from=server /app/node_modules ./node_modules # set runtime env variables ENV PORT=3000 ENV NODE_ENV=production ENV SERVE_CLIENT=/home/node/app/packages/client ENV SERVE_ADMIN=/home/node/app/packages/admin ENV SERVE_CLIENT=/home/node/app/packages/client/dist ENV SERVE_ADMIN=/home/node/app/packages/admin/dist EXPOSE 3000 # profiler port, only used if profiler is explicity running Loading packages/admin/package.json +12 −0 Original line number Diff line number Diff line Loading @@ -10,20 +10,32 @@ "preview": "vite preview" }, "dependencies": { "@fortawesome/fontawesome-svg-core": "^7.2.0", "@fortawesome/free-brands-svg-icons": "^7.2.0", "@fortawesome/free-solid-svg-icons": "^7.2.0", "@fortawesome/react-fontawesome": "^3.3.1", "@nextui-org/react": "^2.6.11", "apexcharts": "^5.5.0", "framer-motion": "^12.34.0", "localforage": "^1.10.0", "match-sorter": "^8.2.0", "next-themes": "^0.4.6", "react": "^19.2.5", "react-apexcharts": "^1.9.0", "react-dom": "^19.2.5", "react-router-dom": "^7.13.0", "react-toastify": "^11.1.0", "swr": "^2.4.0" }, "devDependencies": { "@tailwindcss/vite": "^4.2.4", "@types/react": "^19", "@types/react-dom": "^19", "@vitejs/plugin-react": "^5.1.4", "eslint": "^9.39.2", "eslint-plugin-react-refresh": "^0.5.0", "postcss": "^8.5.6", "sass-embedded": "^1.99.0", "typescript": "^5.9.3", "vite": "^7.3.1" } Loading packages/client/package.json +11 −1 Original line number Diff line number Diff line Loading @@ -11,20 +11,27 @@ "type": "module", "license": "MIT", "dependencies": { "@fortawesome/fontawesome-svg-core": "^7.2.0", "@fortawesome/free-brands-svg-icons": "^7.2.0", "@fortawesome/free-solid-svg-icons": "^7.2.0", "@fortawesome/react-fontawesome": "^3.3.1", "@heroui/react": "^2.8.9", "@icons-pack/react-simple-icons": "^13.11.2", "@sc07-canvas/chat": "workspace:^", "@sc07-canvas/lib": "^1.0.0", "@sc07-canvas/lib": "workspace:^", "@sentry/react": "^10.50.0", "altcha-lib": "^1.4.1", "date-fns": "^4.1.0", "eventemitter3": "^5.0.4", "framer-motion": "^12.34.0", "lodash.throttle": "^4.1.1", "openapi-fetch": "^0.17.0", "prop-types": "^15.8.1", "react-toastify": "^11.1.0", "react-zoom-pan-pinch": "^3.7.0", "socket.io-client": "^4.8.3", "swr": "^2.4.0", "swr-openapi": "^5.6.0", "use-sound": "^5.0.0", "vite-plugin-banner": "^0.8.1" }, Loading @@ -32,12 +39,15 @@ "@eslint/compat": "^2.0.2", "@eslint/eslintrc": "^3.3.3", "@eslint/js": "^10.0.1", "@sentry/vite-plugin": "^5.2.0", "@tailwindcss/vite": "^4.1.18", "@tsconfig/vite-react": "^7.0.2", "@types/lodash.throttle": "^4.1.9", "@types/socket.io-client": "^3.0.0", "eslint": "^9.39.2", "eslint-plugin-import": "^2.32.0", "eslint-plugin-react": "^7.37.5", "next-themes": "^0.4.6", "postcss": "^8.5.6", "sass": "^1.97.3", "typescript-eslint": "^8.56.0", Loading packages/client/src/Moderator/ModeratorModule.ts +2 −2 Original line number Diff line number Diff line import { Debug } from "@sc07-canvas/lib/src/debug"; import { Debug } from "@sc07-canvas/lib/debug"; import { type ModClientToServerEvents, type ModServerToClientEvents, } from "@sc07-canvas/lib/src/net"; } from "@sc07-canvas/lib/net"; import { io, Socket } from "socket.io-client"; export class ModeratorModule { Loading Loading
.gitlab-ci.yml +2 −0 Original line number Diff line number Diff line Loading @@ -57,6 +57,8 @@ jest server: script: - apk update && apk add git - yarn workspaces focus --all - yarn build-api-schema - yarn workspace @sc07-canvas/lib build - yarn workspace @sc07-canvas/server prisma migrate reset --force - yarn workspace @sc07-canvas/server prisma generate - yarn workspace @sc07-canvas/server run test:ci Loading
Dockerfile +112 −74 Original line number Diff line number Diff line Loading @@ -2,6 +2,8 @@ FROM node:24-alpine AS base # add openssl as root RUN apk add --no-cache openssl ARG VERSION WORKDIR /home/node/app USER node Loading @@ -17,129 +19,165 @@ COPY packages/chat/package.json ./packages/chat/ USER root RUN corepack enable yarn && corepack prepare --activate RUN chown -R node:node /home/node/app RUN ln -s /home/node/app /app USER node FROM base AS dev_dep # # Build library # FROM base AS lib-dev-deps RUN yarn workspaces focus @sc07-canvas/lib FROM base AS lib-prod-deps # install all dependencies RUN yarn workspaces focus --all RUN yarn workspaces focus @sc07-canvas/lib --production FROM base AS dep FROM lib-dev-deps AS lib-build # install only production dependencies RUN yarn workspaces focus --all --production COPY --chown=node:node packages/server/src/api/openapi.yml packages/lib/.openapi.yml COPY --chown=node:node packages/lib/ ./packages/lib/ RUN npx openapi-typescript packages/lib/.openapi.yml -o packages/lib/src/api-schema.ts && rm packages/lib/.openapi.yml RUN yarn workspace @sc07-canvas/lib run build RUN ln -s /home/node/app/packages FROM lib-prod-deps AS lib COPY --from=lib-build /app/packages/lib/dist/ ./packages/lib/dist # # === BUILDER === # Build chat # FROM base AS build # CLIENT_SENTRY_DSN will be baked into the client package # SERVER_SENTRY_DSN is NOT baked in and must also be supplied to image on start # SENTRY_{URL,ORG,PROJECT,AUTH_TOKEN} are used for sourcemap pushing ARG CLIENT_SENTRY_DSN ARG CLIENT_SENTRY_PROJECT ARG SERVER_SENTRY_DSN ARG SERVER_SENTRY_PROJECT ARG SENTRY_URL ARG SENTRY_ORG ARG SENTRY_AUTH_TOKEN ARG VERSION FROM base AS chat-dev-deps # copy all dev dependencies into stage COPY --from=dev_dep --chown=node:node /home/node/app/ ./ # copy all source files COPY --chown=node:node . . RUN yarn workspaces focus @sc07-canvas/chat # --- build lib --- FROM base AS chat-prod-deps RUN yarn run build-api-schema RUN yarn workspace @sc07-canvas/lib run build # janky? fix to keep imports in dev # RUN sed -i -e 's/"main": ".*"/"main": ".\/dist\/index.js"/' packages/lib/package.json RUN yarn workspaces focus @sc07-canvas/chat --production # --- build chat --- FROM chat-dev-deps AS chat-build COPY --chown=node:node packages/chat/ ./packages/chat/ RUN yarn workspace @sc07-canvas/chat run build # --- build main client --- FROM chat-prod-deps AS chat COPY --from=chat-build /app/packages/chat/dist/ ./packages/chat/dist ARG VITE_INCLUDE_EVENT_INFO ARG SENTRY_DSN=$CLIENT_SENTRY_DSN ARG SENTRY_PROJECT=$CLIENT_SENTRY_PROJECT # # Build client # FROM base AS client-xdep COPY --from=chat /app/packages/chat/dist/ ./packages/chat/dist COPY --from=lib /app/packages/lib/dist/ ./packages/lib/dist FROM client-xdep AS client-dev-deps RUN yarn workspaces focus @sc07-canvas/client FROM client-xdep AS client-prod-deps RUN yarn workspaces focus @sc07-canvas/client --production FROM client-dev-deps AS client-build COPY --chown=node:node packages/client/ ./packages/client/ RUN yarn workspace @sc07-canvas/client run build # --- build admin --- FROM client-prod-deps AS client COPY --from=client-build /app/packages/client/dist ./packages/client/dist # # Build admin # FROM base AS admin-dev-deps RUN yarn workspaces focus @sc07-canvas/admin FROM base AS admin-prod-deps RUN yarn workspaces focus @sc07-canvas/admin --production FROM admin-dev-deps AS admin-build COPY --chown=node:node packages/admin ./packages/admin/ ENV APP_ROOT=/admin RUN yarn workspace @sc07-canvas/admin run build # --- build server --- FROM admin-prod-deps AS admin RUN sed -i -e 's/"main": ".*"/"main": ".\/dist\/index.js"/' packages/lib/package.json ENV DATABASE_URL=postgres://invalid/not-needed-rn RUN yarn workspace @sc07-canvas/server prisma generate ARG SENTRY_DSN=$SERVER_SENTRY_DSN ARG SENTRY_PROJECT=$SERVER_SENTRY_PROJECT RUN yarn workspace @sc07-canvas/server run build # Disabled (see #162) # RUN if [ -n "$SENTRY_AUTH_TOKEN" ]; then npm -w packages/server run sentry; fi COPY --from=admin-build /app/packages/admin/dist ./packages/admin/dist # # === RUNNER === # Build server # FROM base AS run WORKDIR /home/node/app COPY --from=dep /home/node/app/ ./ COPY docker-start*.sh ./ FROM base AS server-xdeps # --- clear packages from base --- # wipe these as the final running image is packaged differently RUN rm -rf packages/{lib,client,admin,server} COPY --from=lib /app/packages/lib/dist ./packages/lib/dist COPY --chown=node:node packages/server/prisma.config.ts ./packages/server/ # --- prepare lib --- FROM server-xdeps AS server-dev-deps RUN mkdir -p packages/lib COPY --from=build /home/node/app/packages/lib/package.json ./packages/lib COPY --from=build /home/node/app/packages/lib/dist ./packages/lib/dist RUN yarn workspaces focus @sc07-canvas/server # --- prepare client --- FROM server-xdeps AS server-prod-deps RUN mkdir -p packages/client COPY --from=build /home/node/app/packages/client/dist ./packages/client/ RUN yarn workspaces focus @sc07-canvas/server --production # --- prepare admin --- FROM server-dev-deps AS server-build RUN mkdir -p packages/admin COPY --from=build /home/node/app/packages/admin/dist ./packages/admin/ COPY --chown=node:node packages/server ./packages/server # --- prepare server --- ENV DATABASE_URL=postgres://invalid/not-needed-rn RUN yarn workspace @sc07-canvas/server prisma generate # TODO: add sentry # ARG SENTRY_DSN=$SERVER_SENTRY_DSN # ARG SENTRY_PROJECT=$SERVER_SENTRY_PROJECT RUN yarn workspace @sc07-canvas/server run build # Disabled (see #162) # RUN if [ -n "$SENTRY_AUTH_TOKEN" ]; then npm -w packages/server run sentry; fi RUN mkdir -p packages/server FROM server-prod-deps AS server ARG VERSION ENV VERSION_PATH=/home/node/app/packages/server/.version RUN echo "${VERSION}" > ./packages/server/.version COPY packages/server/prisma.config.ts ./packages/server/ COPY --from=build /home/node/app/packages/server/package.json ./packages/server/ COPY --from=build /home/node/app/packages/server/prisma ./packages/server/prisma COPY --from=build /home/node/app/packages/server/tool.sh ./packages/server/ COPY --from=build /home/node/app/packages/server/dist ./packages/server/dist COPY --from=server-build /app/packages/server/package.json ./packages/server/ COPY --from=server-build /app/packages/server/prisma ./packages/server/prisma COPY --from=server-build /app/packages/server/tool.sh ./packages/server/ COPY --from=server-build /app/packages/server/dist ./packages/server/dist COPY --from=server-build /app/node_modules/@prisma/client node_modules/@prisma/client COPY --from=server-build /app/node_modules/.prisma node_modules/.prisma # --- finalize --- # # === RUNNER === # ENV DATABASE_URL=postgres://invalid/not-needed-rn RUN npx -w packages/server prisma generate FROM base AS run WORKDIR /home/node/app COPY docker-start*.sh ./ COPY --from=lib /app/packages/lib ./packages/lib COPY --from=client /app/packages/client ./packages/client COPY --from=admin /app/packages/admin ./packages/admin COPY --from=server /app/packages/server ./packages/server COPY --from=server /app/node_modules ./node_modules # set runtime env variables ENV PORT=3000 ENV NODE_ENV=production ENV SERVE_CLIENT=/home/node/app/packages/client ENV SERVE_ADMIN=/home/node/app/packages/admin ENV SERVE_CLIENT=/home/node/app/packages/client/dist ENV SERVE_ADMIN=/home/node/app/packages/admin/dist EXPOSE 3000 # profiler port, only used if profiler is explicity running Loading
packages/admin/package.json +12 −0 Original line number Diff line number Diff line Loading @@ -10,20 +10,32 @@ "preview": "vite preview" }, "dependencies": { "@fortawesome/fontawesome-svg-core": "^7.2.0", "@fortawesome/free-brands-svg-icons": "^7.2.0", "@fortawesome/free-solid-svg-icons": "^7.2.0", "@fortawesome/react-fontawesome": "^3.3.1", "@nextui-org/react": "^2.6.11", "apexcharts": "^5.5.0", "framer-motion": "^12.34.0", "localforage": "^1.10.0", "match-sorter": "^8.2.0", "next-themes": "^0.4.6", "react": "^19.2.5", "react-apexcharts": "^1.9.0", "react-dom": "^19.2.5", "react-router-dom": "^7.13.0", "react-toastify": "^11.1.0", "swr": "^2.4.0" }, "devDependencies": { "@tailwindcss/vite": "^4.2.4", "@types/react": "^19", "@types/react-dom": "^19", "@vitejs/plugin-react": "^5.1.4", "eslint": "^9.39.2", "eslint-plugin-react-refresh": "^0.5.0", "postcss": "^8.5.6", "sass-embedded": "^1.99.0", "typescript": "^5.9.3", "vite": "^7.3.1" } Loading
packages/client/package.json +11 −1 Original line number Diff line number Diff line Loading @@ -11,20 +11,27 @@ "type": "module", "license": "MIT", "dependencies": { "@fortawesome/fontawesome-svg-core": "^7.2.0", "@fortawesome/free-brands-svg-icons": "^7.2.0", "@fortawesome/free-solid-svg-icons": "^7.2.0", "@fortawesome/react-fontawesome": "^3.3.1", "@heroui/react": "^2.8.9", "@icons-pack/react-simple-icons": "^13.11.2", "@sc07-canvas/chat": "workspace:^", "@sc07-canvas/lib": "^1.0.0", "@sc07-canvas/lib": "workspace:^", "@sentry/react": "^10.50.0", "altcha-lib": "^1.4.1", "date-fns": "^4.1.0", "eventemitter3": "^5.0.4", "framer-motion": "^12.34.0", "lodash.throttle": "^4.1.1", "openapi-fetch": "^0.17.0", "prop-types": "^15.8.1", "react-toastify": "^11.1.0", "react-zoom-pan-pinch": "^3.7.0", "socket.io-client": "^4.8.3", "swr": "^2.4.0", "swr-openapi": "^5.6.0", "use-sound": "^5.0.0", "vite-plugin-banner": "^0.8.1" }, Loading @@ -32,12 +39,15 @@ "@eslint/compat": "^2.0.2", "@eslint/eslintrc": "^3.3.3", "@eslint/js": "^10.0.1", "@sentry/vite-plugin": "^5.2.0", "@tailwindcss/vite": "^4.1.18", "@tsconfig/vite-react": "^7.0.2", "@types/lodash.throttle": "^4.1.9", "@types/socket.io-client": "^3.0.0", "eslint": "^9.39.2", "eslint-plugin-import": "^2.32.0", "eslint-plugin-react": "^7.37.5", "next-themes": "^0.4.6", "postcss": "^8.5.6", "sass": "^1.97.3", "typescript-eslint": "^8.56.0", Loading
packages/client/src/Moderator/ModeratorModule.ts +2 −2 Original line number Diff line number Diff line import { Debug } from "@sc07-canvas/lib/src/debug"; import { Debug } from "@sc07-canvas/lib/debug"; import { type ModClientToServerEvents, type ModServerToClientEvents, } from "@sc07-canvas/lib/src/net"; } from "@sc07-canvas/lib/net"; import { io, Socket } from "socket.io-client"; export class ModeratorModule { Loading