Reorganize server files and address TODO comments

Changes:
- Remove unneeded dependencies from package.json
- Remove unneeded async build() methods from services
    - Use constructor as often as possible
- Rename and move storage services for clarity
    - creds.ts -> accounts.ts, and creds.json -> accounts.json
    - admin-config.ts -> admin-account.ts
    - vault.ts -> signing-keys.ts
- Rename ws.ts to websocket-server.ts for clarity and consistency
- Make WebSocketServer initialize using constructor and bind server upgrade to WebSocketServer.upgrade
- Remove unused send-account-message endpoint from account-router.ts
- Set issuer and audience claims for JWT
- Create new utils/jwt.ts file to remove code duplication for JWT signing and verifying
- Delete utils.ts and merge it with jami-swig.ts
- Handle potentially undefined types in jami-swig.ts
- Replace hard to read one-liners with functions in jami-swig.ts
- Rename types in jami-swig.ts for consistency with daemon
- Remove handled/answered TODO comments
- Remove TODO comment about using .env for jamid.node as it does not work for require()

GitLab: #87
Change-Id: I1e5216ffa79ea34dd7e9b61540fb7e37d1f66c9f
diff --git a/.eslintrc.cjs b/.eslintrc.cjs
index 2d47543..a69ad04 100644
--- a/.eslintrc.cjs
+++ b/.eslintrc.cjs
@@ -76,6 +76,7 @@
     '@typescript-eslint/ban-ts-comment': 'off',
     '@typescript-eslint/no-empty-function': 'off',
     '@typescript-eslint/no-explicit-any': 'off',
+    '@typescript-eslint/no-non-null-assertion': 'off',
     '@typescript-eslint/no-unused-vars': 'off',
     camelcase: 'error',
     eqeqeq: ['error', 'smart'],
diff --git a/client/src/contexts/WebSocketProvider.tsx b/client/src/contexts/WebSocketProvider.tsx
index 38317e2..e6e246b 100644
--- a/client/src/contexts/WebSocketProvider.tsx
+++ b/client/src/contexts/WebSocketProvider.tsx
@@ -77,17 +77,21 @@
       setTimeout(connect, 1000);
     };
 
-    webSocket.onmessage = <T extends WebSocketMessageType>({ data }: MessageEvent<string>) => {
-      console.debug('WebSocket received message', data);
-      const message: WebSocketMessage<T> = JSON.parse(data);
+    webSocket.onmessage = <T extends WebSocketMessageType>(event: MessageEvent<string>) => {
+      const messageString = event.data;
+      console.debug('WebSocket received message', messageString);
+
+      const message: WebSocketMessage<T> = JSON.parse(messageString);
       if (!message.type || !message.data) {
-        console.warn(`Incorrect format (require type and data) ${message}`);
+        console.warn('WebSocket message is not a valid WebSocketMessage (missing type or data fields)');
         return;
       }
+
       if (!Object.values(WebSocketMessageType).includes(message.type)) {
-        console.warn(`Unhandled message of type: ${message.type}`);
+        console.warn(`Invalid WebSocket message type: ${message.type}`);
         return;
       }
+
       const callbacks = callbacksRef.current[message.type];
       for (const callback of callbacks) {
         callback(message.data);
diff --git a/package-lock.json b/package-lock.json
index e05002a..32d926e 100644
--- a/package-lock.json
+++ b/package-lock.json
@@ -2071,11 +2071,6 @@
         "url": "https://github.com/sponsors/sindresorhus"
       }
     },
-    "node_modules/@gar/promisify": {
-      "version": "1.1.3",
-      "dev": true,
-      "license": "MIT"
-    },
     "node_modules/@humanwhocodes/config-array": {
       "version": "0.10.7",
       "dev": true,
@@ -2727,148 +2722,6 @@
         "node": ">= 8"
       }
     },
-    "node_modules/@npmcli/fs": {
-      "version": "2.1.2",
-      "dev": true,
-      "license": "ISC",
-      "dependencies": {
-        "@gar/promisify": "^1.1.3",
-        "semver": "^7.3.5"
-      },
-      "engines": {
-        "node": "^12.13.0 || ^14.15.0 || >=16.0.0"
-      }
-    },
-    "node_modules/@npmcli/fs/node_modules/lru-cache": {
-      "version": "6.0.0",
-      "dev": true,
-      "license": "ISC",
-      "dependencies": {
-        "yallist": "^4.0.0"
-      },
-      "engines": {
-        "node": ">=10"
-      }
-    },
-    "node_modules/@npmcli/fs/node_modules/semver": {
-      "version": "7.3.8",
-      "dev": true,
-      "license": "ISC",
-      "dependencies": {
-        "lru-cache": "^6.0.0"
-      },
-      "bin": {
-        "semver": "bin/semver.js"
-      },
-      "engines": {
-        "node": ">=10"
-      }
-    },
-    "node_modules/@npmcli/git": {
-      "version": "3.0.2",
-      "dev": true,
-      "license": "ISC",
-      "dependencies": {
-        "@npmcli/promise-spawn": "^3.0.0",
-        "lru-cache": "^7.4.4",
-        "mkdirp": "^1.0.4",
-        "npm-pick-manifest": "^7.0.0",
-        "proc-log": "^2.0.0",
-        "promise-inflight": "^1.0.1",
-        "promise-retry": "^2.0.1",
-        "semver": "^7.3.5",
-        "which": "^2.0.2"
-      },
-      "engines": {
-        "node": "^12.13.0 || ^14.15.0 || >=16.0.0"
-      }
-    },
-    "node_modules/@npmcli/git/node_modules/semver": {
-      "version": "7.3.8",
-      "dev": true,
-      "license": "ISC",
-      "dependencies": {
-        "lru-cache": "^6.0.0"
-      },
-      "bin": {
-        "semver": "bin/semver.js"
-      },
-      "engines": {
-        "node": ">=10"
-      }
-    },
-    "node_modules/@npmcli/git/node_modules/semver/node_modules/lru-cache": {
-      "version": "6.0.0",
-      "dev": true,
-      "license": "ISC",
-      "dependencies": {
-        "yallist": "^4.0.0"
-      },
-      "engines": {
-        "node": ">=10"
-      }
-    },
-    "node_modules/@npmcli/installed-package-contents": {
-      "version": "1.0.7",
-      "dev": true,
-      "license": "ISC",
-      "dependencies": {
-        "npm-bundled": "^1.1.1",
-        "npm-normalize-package-bin": "^1.0.1"
-      },
-      "bin": {
-        "installed-package-contents": "index.js"
-      },
-      "engines": {
-        "node": ">= 10"
-      }
-    },
-    "node_modules/@npmcli/move-file": {
-      "version": "2.0.1",
-      "dev": true,
-      "license": "MIT",
-      "dependencies": {
-        "mkdirp": "^1.0.4",
-        "rimraf": "^3.0.2"
-      },
-      "engines": {
-        "node": "^12.13.0 || ^14.15.0 || >=16.0.0"
-      }
-    },
-    "node_modules/@npmcli/node-gyp": {
-      "version": "2.0.0",
-      "dev": true,
-      "license": "ISC",
-      "engines": {
-        "node": "^12.13.0 || ^14.15.0 || >=16.0.0"
-      }
-    },
-    "node_modules/@npmcli/promise-spawn": {
-      "version": "3.0.0",
-      "dev": true,
-      "license": "ISC",
-      "dependencies": {
-        "infer-owner": "^1.0.4"
-      },
-      "engines": {
-        "node": "^12.13.0 || ^14.15.0 || >=16.0.0"
-      }
-    },
-    "node_modules/@npmcli/run-script": {
-      "version": "4.2.1",
-      "dev": true,
-      "license": "ISC",
-      "dependencies": {
-        "@npmcli/node-gyp": "^2.0.0",
-        "@npmcli/promise-spawn": "^3.0.0",
-        "node-gyp": "^9.0.0",
-        "read-package-json-fast": "^2.0.3",
-        "which": "^2.0.2"
-      },
-      "engines": {
-        "node": "^12.13.0 || ^14.15.0 || >=16.0.0"
-      }
-    },
     "node_modules/@phc/format": {
       "version": "1.0.0",
       "license": "MIT",
@@ -2876,29 +2729,6 @@
         "node": ">=10"
       }
     },
-    "node_modules/@pnpm/network.ca-file": {
-      "version": "1.0.1",
-      "dev": true,
-      "license": "MIT",
-      "dependencies": {
-        "graceful-fs": "4.2.10"
-      },
-      "engines": {
-        "node": ">=12.22.0"
-      }
-    },
-    "node_modules/@pnpm/npm-conf": {
-      "version": "1.0.5",
-      "dev": true,
-      "license": "MIT",
-      "dependencies": {
-        "@pnpm/network.ca-file": "^1.0.1",
-        "config-chain": "^1.1.11"
-      },
-      "engines": {
-        "node": ">=12"
-      }
-    },
     "node_modules/@popperjs/core": {
       "version": "2.11.6",
       "license": "MIT",
@@ -3153,17 +2983,6 @@
       "version": "0.24.46",
       "license": "MIT"
     },
-    "node_modules/@sindresorhus/is": {
-      "version": "5.3.0",
-      "dev": true,
-      "license": "MIT",
-      "engines": {
-        "node": ">=14.16"
-      },
-      "funding": {
-        "url": "https://github.com/sindresorhus/is?sponsor=1"
-      }
-    },
     "node_modules/@socket.io/component-emitter": {
       "version": "3.1.0",
       "license": "MIT"
@@ -3411,17 +3230,6 @@
         "url": "https://github.com/sponsors/gregberge"
       }
     },
-    "node_modules/@szmarczak/http-timer": {
-      "version": "5.0.1",
-      "dev": true,
-      "license": "MIT",
-      "dependencies": {
-        "defer-to-connect": "^2.0.1"
-      },
-      "engines": {
-        "node": ">=14.16"
-      }
-    },
     "node_modules/@tanstack/query-core": {
       "version": "4.12.0",
       "license": "MIT",
@@ -3632,14 +3440,6 @@
         "@testing-library/dom": ">=7.21.4"
       }
     },
-    "node_modules/@tootallnate/once": {
-      "version": "2.0.0",
-      "dev": true,
-      "license": "MIT",
-      "engines": {
-        "node": ">= 10"
-      }
-    },
     "node_modules/@trysound/sax": {
       "version": "0.2.0",
       "dev": true,
@@ -3765,11 +3565,6 @@
         "hoist-non-react-statics": "^3.3.0"
       }
     },
-    "node_modules/@types/http-cache-semantics": {
-      "version": "4.0.1",
-      "dev": true,
-      "license": "MIT"
-    },
     "node_modules/@types/istanbul-lib-coverage": {
       "version": "2.0.4",
       "license": "MIT"
@@ -4499,27 +4294,6 @@
         "node": ">= 6.0.0"
       }
     },
-    "node_modules/agentkeepalive": {
-      "version": "4.2.1",
-      "dev": true,
-      "license": "MIT",
-      "dependencies": {
-        "debug": "^4.1.0",
-        "depd": "^1.1.2",
-        "humanize-ms": "^1.2.1"
-      },
-      "engines": {
-        "node": ">= 8.0.0"
-      }
-    },
-    "node_modules/agentkeepalive/node_modules/depd": {
-      "version": "1.1.2",
-      "dev": true,
-      "license": "MIT",
-      "engines": {
-        "node": ">= 0.6"
-      }
-    },
     "node_modules/aggregate-error": {
       "version": "3.1.0",
       "dev": true,
@@ -4591,14 +4365,6 @@
         "ajv": "^6.9.1"
       }
     },
-    "node_modules/ansi-align": {
-      "version": "3.0.1",
-      "dev": true,
-      "license": "ISC",
-      "dependencies": {
-        "string-width": "^4.1.0"
-      }
-    },
     "node_modules/ansi-colors": {
       "version": "4.1.3",
       "dev": true,
@@ -4695,18 +4461,6 @@
       ],
       "license": "MIT"
     },
-    "node_modules/are-we-there-yet": {
-      "version": "3.0.1",
-      "dev": true,
-      "license": "ISC",
-      "dependencies": {
-        "delegates": "^1.0.0",
-        "readable-stream": "^3.6.0"
-      },
-      "engines": {
-        "node": "^12.13.0 || ^14.15.0 || >=16.0.0"
-      }
-    },
     "node_modules/arg": {
       "version": "4.1.3",
       "dev": true,
@@ -5023,133 +4777,6 @@
       "dev": true,
       "license": "ISC"
     },
-    "node_modules/boxen": {
-      "version": "7.0.0",
-      "dev": true,
-      "license": "MIT",
-      "dependencies": {
-        "ansi-align": "^3.0.1",
-        "camelcase": "^7.0.0",
-        "chalk": "^5.0.1",
-        "cli-boxes": "^3.0.0",
-        "string-width": "^5.1.2",
-        "type-fest": "^2.13.0",
-        "widest-line": "^4.0.1",
-        "wrap-ansi": "^8.0.1"
-      },
-      "engines": {
-        "node": ">=14.16"
-      },
-      "funding": {
-        "url": "https://github.com/sponsors/sindresorhus"
-      }
-    },
-    "node_modules/boxen/node_modules/ansi-regex": {
-      "version": "6.0.1",
-      "dev": true,
-      "license": "MIT",
-      "engines": {
-        "node": ">=12"
-      },
-      "funding": {
-        "url": "https://github.com/chalk/ansi-regex?sponsor=1"
-      }
-    },
-    "node_modules/boxen/node_modules/ansi-styles": {
-      "version": "6.2.1",
-      "dev": true,
-      "license": "MIT",
-      "engines": {
-        "node": ">=12"
-      },
-      "funding": {
-        "url": "https://github.com/chalk/ansi-styles?sponsor=1"
-      }
-    },
-    "node_modules/boxen/node_modules/camelcase": {
-      "version": "7.0.0",
-      "dev": true,
-      "license": "MIT",
-      "engines": {
-        "node": ">=14.16"
-      },
-      "funding": {
-        "url": "https://github.com/sponsors/sindresorhus"
-      }
-    },
-    "node_modules/boxen/node_modules/chalk": {
-      "version": "5.1.2",
-      "dev": true,
-      "license": "MIT",
-      "engines": {
-        "node": "^12.17.0 || ^14.13 || >=16.0.0"
-      },
-      "funding": {
-        "url": "https://github.com/chalk/chalk?sponsor=1"
-      }
-    },
-    "node_modules/boxen/node_modules/emoji-regex": {
-      "version": "9.2.2",
-      "dev": true,
-      "license": "MIT"
-    },
-    "node_modules/boxen/node_modules/string-width": {
-      "version": "5.1.2",
-      "dev": true,
-      "license": "MIT",
-      "dependencies": {
-        "eastasianwidth": "^0.2.0",
-        "emoji-regex": "^9.2.2",
-        "strip-ansi": "^7.0.1"
-      },
-      "engines": {
-        "node": ">=12"
-      },
-      "funding": {
-        "url": "https://github.com/sponsors/sindresorhus"
-      }
-    },
-    "node_modules/boxen/node_modules/strip-ansi": {
-      "version": "7.0.1",
-      "dev": true,
-      "license": "MIT",
-      "dependencies": {
-        "ansi-regex": "^6.0.1"
-      },
-      "engines": {
-        "node": ">=12"
-      },
-      "funding": {
-        "url": "https://github.com/chalk/strip-ansi?sponsor=1"
-      }
-    },
-    "node_modules/boxen/node_modules/type-fest": {
-      "version": "2.19.0",
-      "dev": true,
-      "license": "(MIT OR CC0-1.0)",
-      "engines": {
-        "node": ">=12.20"
-      },
-      "funding": {
-        "url": "https://github.com/sponsors/sindresorhus"
-      }
-    },
-    "node_modules/boxen/node_modules/wrap-ansi": {
-      "version": "8.0.1",
-      "dev": true,
-      "license": "MIT",
-      "dependencies": {
-        "ansi-styles": "^6.1.0",
-        "string-width": "^5.0.1",
-        "strip-ansi": "^7.0.1"
-      },
-      "engines": {
-        "node": ">=12"
-      },
-      "funding": {
-        "url": "https://github.com/chalk/wrap-ansi?sponsor=1"
-      }
-    },
     "node_modules/brace-expansion": {
       "version": "1.1.11",
       "license": "MIT",
@@ -5313,39 +4940,6 @@
       "dev": true,
       "license": "MIT"
     },
-    "node_modules/builtins": {
-      "version": "5.0.1",
-      "dev": true,
-      "license": "MIT",
-      "dependencies": {
-        "semver": "^7.0.0"
-      }
-    },
-    "node_modules/builtins/node_modules/lru-cache": {
-      "version": "6.0.0",
-      "dev": true,
-      "license": "ISC",
-      "dependencies": {
-        "yallist": "^4.0.0"
-      },
-      "engines": {
-        "node": ">=10"
-      }
-    },
-    "node_modules/builtins/node_modules/semver": {
-      "version": "7.3.8",
-      "dev": true,
-      "license": "ISC",
-      "dependencies": {
-        "lru-cache": "^6.0.0"
-      },
-      "bin": {
-        "semver": "bin/semver.js"
-      },
-      "engines": {
-        "node": ">=10"
-      }
-    },
     "node_modules/bytes": {
       "version": "3.1.2",
       "license": "MIT",
@@ -5353,107 +4947,6 @@
         "node": ">= 0.8"
       }
     },
-    "node_modules/cacache": {
-      "version": "16.1.3",
-      "dev": true,
-      "license": "ISC",
-      "dependencies": {
-        "@npmcli/fs": "^2.1.0",
-        "@npmcli/move-file": "^2.0.0",
-        "chownr": "^2.0.0",
-        "fs-minipass": "^2.1.0",
-        "glob": "^8.0.1",
-        "infer-owner": "^1.0.4",
-        "lru-cache": "^7.7.1",
-        "minipass": "^3.1.6",
-        "minipass-collect": "^1.0.2",
-        "minipass-flush": "^1.0.5",
-        "minipass-pipeline": "^1.2.4",
-        "mkdirp": "^1.0.4",
-        "p-map": "^4.0.0",
-        "promise-inflight": "^1.0.1",
-        "rimraf": "^3.0.2",
-        "ssri": "^9.0.0",
-        "tar": "^6.1.11",
-        "unique-filename": "^2.0.0"
-      },
-      "engines": {
-        "node": "^12.13.0 || ^14.15.0 || >=16.0.0"
-      }
-    },
-    "node_modules/cacache/node_modules/brace-expansion": {
-      "version": "2.0.1",
-      "dev": true,
-      "license": "MIT",
-      "dependencies": {
-        "balanced-match": "^1.0.0"
-      }
-    },
-    "node_modules/cacache/node_modules/glob": {
-      "version": "8.0.3",
-      "dev": true,
-      "license": "ISC",
-      "dependencies": {
-        "fs.realpath": "^1.0.0",
-        "inflight": "^1.0.4",
-        "inherits": "2",
-        "minimatch": "^5.0.1",
-        "once": "^1.3.0"
-      },
-      "engines": {
-        "node": ">=12"
-      },
-      "funding": {
-        "url": "https://github.com/sponsors/isaacs"
-      }
-    },
-    "node_modules/cacache/node_modules/minimatch": {
-      "version": "5.1.0",
-      "dev": true,
-      "license": "ISC",
-      "dependencies": {
-        "brace-expansion": "^2.0.1"
-      },
-      "engines": {
-        "node": ">=10"
-      }
-    },
-    "node_modules/cacheable-lookup": {
-      "version": "7.0.0",
-      "dev": true,
-      "license": "MIT",
-      "engines": {
-        "node": ">=14.16"
-      }
-    },
-    "node_modules/cacheable-request": {
-      "version": "10.2.1",
-      "dev": true,
-      "license": "MIT",
-      "dependencies": {
-        "@types/http-cache-semantics": "^4.0.1",
-        "get-stream": "^6.0.1",
-        "http-cache-semantics": "^4.1.0",
-        "keyv": "^4.5.0",
-        "mimic-response": "^4.0.0",
-        "normalize-url": "^7.1.0",
-        "responselike": "^3.0.0"
-      },
-      "engines": {
-        "node": ">=14.16"
-      }
-    },
-    "node_modules/cacheable-request/node_modules/get-stream": {
-      "version": "6.0.1",
-      "dev": true,
-      "license": "MIT",
-      "engines": {
-        "node": ">=10"
-      },
-      "funding": {
-        "url": "https://github.com/sponsors/sindresorhus"
-      }
-    },
     "node_modules/cachedir": {
       "version": "2.3.0",
       "dev": true,
@@ -5645,17 +5138,6 @@
         "node": ">=6"
       }
     },
-    "node_modules/cli-boxes": {
-      "version": "3.0.0",
-      "dev": true,
-      "license": "MIT",
-      "engines": {
-        "node": ">=10"
-      },
-      "funding": {
-        "url": "https://github.com/sponsors/sindresorhus"
-      }
-    },
     "node_modules/cli-cursor": {
       "version": "3.1.0",
       "dev": true,
@@ -5667,24 +5149,6 @@
         "node": ">=8"
       }
     },
-    "node_modules/cli-table": {
-      "version": "0.3.11",
-      "dev": true,
-      "dependencies": {
-        "colors": "1.0.3"
-      },
-      "engines": {
-        "node": ">= 0.2.0"
-      }
-    },
-    "node_modules/cli-table/node_modules/colors": {
-      "version": "1.0.3",
-      "dev": true,
-      "license": "MIT",
-      "engines": {
-        "node": ">=0.1.90"
-      }
-    },
     "node_modules/cli-table3": {
       "version": "0.6.3",
       "dev": true,
@@ -6029,38 +5493,6 @@
         "url": "https://github.com/chalk/supports-color?sponsor=1"
       }
     },
-    "node_modules/config-chain": {
-      "version": "1.1.13",
-      "dev": true,
-      "license": "MIT",
-      "dependencies": {
-        "ini": "^1.3.4",
-        "proto-list": "~1.2.1"
-      }
-    },
-    "node_modules/config-chain/node_modules/ini": {
-      "version": "1.3.8",
-      "dev": true,
-      "license": "ISC"
-    },
-    "node_modules/configstore": {
-      "version": "6.0.0",
-      "dev": true,
-      "license": "BSD-2-Clause",
-      "dependencies": {
-        "dot-prop": "^6.0.1",
-        "graceful-fs": "^4.2.6",
-        "unique-string": "^3.0.0",
-        "write-file-atomic": "^3.0.3",
-        "xdg-basedir": "^5.0.1"
-      },
-      "engines": {
-        "node": ">=12"
-      },
-      "funding": {
-        "url": "https://github.com/yeoman/configstore?sponsor=1"
-      }
-    },
     "node_modules/connect-redis": {
       "version": "6.1.3",
       "license": "MIT",
@@ -6195,31 +5627,6 @@
         "node": ">= 8"
       }
     },
-    "node_modules/crypto-random-string": {
-      "version": "4.0.0",
-      "dev": true,
-      "license": "MIT",
-      "dependencies": {
-        "type-fest": "^1.0.1"
-      },
-      "engines": {
-        "node": ">=12"
-      },
-      "funding": {
-        "url": "https://github.com/sponsors/sindresorhus"
-      }
-    },
-    "node_modules/crypto-random-string/node_modules/type-fest": {
-      "version": "1.4.0",
-      "dev": true,
-      "license": "(MIT OR CC0-1.0)",
-      "engines": {
-        "node": ">=10"
-      },
-      "funding": {
-        "url": "https://github.com/sponsors/sindresorhus"
-      }
-    },
     "node_modules/css-select": {
       "version": "5.1.0",
       "dev": true,
@@ -6496,39 +5903,6 @@
         }
       }
     },
-    "node_modules/decompress-response": {
-      "version": "6.0.0",
-      "dev": true,
-      "license": "MIT",
-      "dependencies": {
-        "mimic-response": "^3.1.0"
-      },
-      "engines": {
-        "node": ">=10"
-      },
-      "funding": {
-        "url": "https://github.com/sponsors/sindresorhus"
-      }
-    },
-    "node_modules/decompress-response/node_modules/mimic-response": {
-      "version": "3.1.0",
-      "dev": true,
-      "license": "MIT",
-      "engines": {
-        "node": ">=10"
-      },
-      "funding": {
-        "url": "https://github.com/sponsors/sindresorhus"
-      }
-    },
-    "node_modules/deep-extend": {
-      "version": "0.6.0",
-      "dev": true,
-      "license": "MIT",
-      "engines": {
-        "node": ">=4.0.0"
-      }
-    },
     "node_modules/deep-is": {
       "version": "0.1.4",
       "dev": true,
@@ -6542,14 +5916,6 @@
         "node": ">=0.10.0"
       }
     },
-    "node_modules/defer-to-connect": {
-      "version": "2.0.1",
-      "dev": true,
-      "license": "MIT",
-      "engines": {
-        "node": ">=10"
-      }
-    },
     "node_modules/define-properties": {
       "version": "1.1.4",
       "dev": true,
@@ -6698,20 +6064,6 @@
         "url": "https://github.com/fb55/domutils?sponsor=1"
       }
     },
-    "node_modules/dot-prop": {
-      "version": "6.0.1",
-      "dev": true,
-      "license": "MIT",
-      "dependencies": {
-        "is-obj": "^2.0.0"
-      },
-      "engines": {
-        "node": ">=10"
-      },
-      "funding": {
-        "url": "https://github.com/sponsors/sindresorhus"
-      }
-    },
     "node_modules/dotenv": {
       "version": "16.0.3",
       "license": "BSD-2-Clause",
@@ -6841,6 +6193,7 @@
       "version": "0.1.13",
       "license": "MIT",
       "optional": true,
+      "peer": true,
       "dependencies": {
         "iconv-lite": "^0.6.2"
       }
@@ -6849,6 +6202,7 @@
       "version": "0.6.3",
       "license": "MIT",
       "optional": true,
+      "peer": true,
       "dependencies": {
         "safer-buffer": ">= 2.1.2 < 3.0.0"
       },
@@ -6954,24 +6308,11 @@
         "node": ">= 0.5.9"
       }
     },
-    "node_modules/env-paths": {
-      "version": "2.2.1",
-      "dev": true,
-      "license": "MIT",
-      "engines": {
-        "node": ">=6"
-      }
-    },
     "node_modules/eol": {
       "version": "0.9.1",
       "dev": true,
       "license": "MIT"
     },
-    "node_modules/err-code": {
-      "version": "2.0.3",
-      "dev": true,
-      "license": "MIT"
-    },
     "node_modules/error-ex": {
       "version": "1.3.2",
       "license": "MIT",
@@ -7103,17 +6444,6 @@
         "node": ">=6"
       }
     },
-    "node_modules/escape-goat": {
-      "version": "4.0.0",
-      "dev": true,
-      "license": "MIT",
-      "engines": {
-        "node": ">=12"
-      },
-      "funding": {
-        "url": "https://github.com/sponsors/sindresorhus"
-      }
-    },
     "node_modules/escape-html": {
       "version": "1.0.3",
       "license": "MIT"
@@ -7762,11 +7092,6 @@
       "dev": true,
       "license": "MIT"
     },
-    "node_modules/fast-memoize": {
-      "version": "2.5.2",
-      "dev": true,
-      "license": "MIT"
-    },
     "node_modules/fastq": {
       "version": "1.13.0",
       "dev": true,
@@ -8013,14 +7338,6 @@
         "node": ">= 6"
       }
     },
-    "node_modules/form-data-encoder": {
-      "version": "2.1.3",
-      "dev": true,
-      "license": "MIT",
-      "engines": {
-        "node": ">= 14.17"
-      }
-    },
     "node_modules/forwarded": {
       "version": "0.2.0",
       "license": "MIT",
@@ -8028,14 +7345,6 @@
         "node": ">= 0.6"
       }
     },
-    "node_modules/fp-and-or": {
-      "version": "0.1.3",
-      "dev": true,
-      "license": "ISC",
-      "engines": {
-        "node": ">=10"
-      }
-    },
     "node_modules/framer-motion": {
       "version": "7.5.3",
       "license": "MIT",
@@ -8256,24 +7565,6 @@
         "url": "https://github.com/sponsors/ljharb"
       }
     },
-    "node_modules/gauge": {
-      "version": "4.0.4",
-      "dev": true,
-      "license": "ISC",
-      "dependencies": {
-        "aproba": "^1.0.3 || ^2.0.0",
-        "color-support": "^1.1.3",
-        "console-control-strings": "^1.1.0",
-        "has-unicode": "^2.0.1",
-        "signal-exit": "^3.0.7",
-        "string-width": "^4.2.3",
-        "strip-ansi": "^6.0.1",
-        "wide-align": "^1.1.5"
-      },
-      "engines": {
-        "node": "^12.13.0 || ^14.15.0 || >=16.0.0"
-      }
-    },
     "node_modules/generic-pool": {
       "version": "3.8.2",
       "license": "MIT",
@@ -8308,17 +7599,6 @@
         "url": "https://github.com/sponsors/ljharb"
       }
     },
-    "node_modules/get-stdin": {
-      "version": "8.0.0",
-      "dev": true,
-      "license": "MIT",
-      "engines": {
-        "node": ">=10"
-      },
-      "funding": {
-        "url": "https://github.com/sponsors/sindresorhus"
-      }
-    },
     "node_modules/get-stream": {
       "version": "5.2.0",
       "dev": true,
@@ -8505,41 +7785,6 @@
         "url": "https://github.com/sponsors/sindresorhus"
       }
     },
-    "node_modules/got": {
-      "version": "12.5.2",
-      "dev": true,
-      "license": "MIT",
-      "dependencies": {
-        "@sindresorhus/is": "^5.2.0",
-        "@szmarczak/http-timer": "^5.0.1",
-        "cacheable-lookup": "^7.0.0",
-        "cacheable-request": "^10.2.1",
-        "decompress-response": "^6.0.0",
-        "form-data-encoder": "^2.1.2",
-        "get-stream": "^6.0.1",
-        "http2-wrapper": "^2.1.10",
-        "lowercase-keys": "^3.0.0",
-        "p-cancelable": "^3.0.0",
-        "responselike": "^3.0.0"
-      },
-      "engines": {
-        "node": ">=14.16"
-      },
-      "funding": {
-        "url": "https://github.com/sindresorhus/got?sponsor=1"
-      }
-    },
-    "node_modules/got/node_modules/get-stream": {
-      "version": "6.0.1",
-      "dev": true,
-      "license": "MIT",
-      "engines": {
-        "node": ">=10"
-      },
-      "funding": {
-        "url": "https://github.com/sponsors/sindresorhus"
-      }
-    },
     "node_modules/graceful-fs": {
       "version": "4.2.10",
       "license": "ISC"
@@ -8657,17 +7902,6 @@
       "version": "2.0.1",
       "license": "ISC"
     },
-    "node_modules/has-yarn": {
-      "version": "3.0.0",
-      "dev": true,
-      "license": "MIT",
-      "engines": {
-        "node": "^12.20.0 || ^14.13.1 || >=16.0.0"
-      },
-      "funding": {
-        "url": "https://github.com/sponsors/sindresorhus"
-      }
-    },
     "node_modules/he": {
       "version": "1.2.0",
       "dev": true,
@@ -8733,17 +7967,6 @@
       "version": "16.13.1",
       "license": "MIT"
     },
-    "node_modules/hosted-git-info": {
-      "version": "5.1.0",
-      "dev": true,
-      "license": "ISC",
-      "dependencies": {
-        "lru-cache": "^7.5.1"
-      },
-      "engines": {
-        "node": "^12.13.0 || ^14.15.0 || >=16.0.0"
-      }
-    },
     "node_modules/html-entities": {
       "version": "2.3.3",
       "dev": true,
@@ -8774,11 +7997,6 @@
         "entities": "^4.3.0"
       }
     },
-    "node_modules/http-cache-semantics": {
-      "version": "4.1.0",
-      "dev": true,
-      "license": "BSD-2-Clause"
-    },
     "node_modules/http-errors": {
       "version": "2.0.0",
       "license": "MIT",
@@ -8793,19 +8011,6 @@
         "node": ">= 0.8"
       }
     },
-    "node_modules/http-proxy-agent": {
-      "version": "5.0.0",
-      "dev": true,
-      "license": "MIT",
-      "dependencies": {
-        "@tootallnate/once": "2",
-        "agent-base": "6",
-        "debug": "4"
-      },
-      "engines": {
-        "node": ">= 6"
-      }
-    },
     "node_modules/http-signature": {
       "version": "1.3.6",
       "dev": true,
@@ -8819,18 +8024,6 @@
         "node": ">=0.10"
       }
     },
-    "node_modules/http2-wrapper": {
-      "version": "2.1.11",
-      "dev": true,
-      "license": "MIT",
-      "dependencies": {
-        "quick-lru": "^5.1.1",
-        "resolve-alpn": "^1.2.0"
-      },
-      "engines": {
-        "node": ">=10.19.0"
-      }
-    },
     "node_modules/https-proxy-agent": {
       "version": "5.0.1",
       "license": "MIT",
@@ -8850,14 +8043,6 @@
         "node": ">=8.12.0"
       }
     },
-    "node_modules/humanize-ms": {
-      "version": "1.2.1",
-      "dev": true,
-      "license": "MIT",
-      "dependencies": {
-        "ms": "^2.0.0"
-      }
-    },
     "node_modules/i18next": {
       "version": "21.10.0",
       "funding": [
@@ -8975,36 +8160,6 @@
       "dev": true,
       "license": "ISC"
     },
-    "node_modules/ignore-walk": {
-      "version": "5.0.1",
-      "dev": true,
-      "license": "ISC",
-      "dependencies": {
-        "minimatch": "^5.0.1"
-      },
-      "engines": {
-        "node": "^12.13.0 || ^14.15.0 || >=16.0.0"
-      }
-    },
-    "node_modules/ignore-walk/node_modules/brace-expansion": {
-      "version": "2.0.1",
-      "dev": true,
-      "license": "MIT",
-      "dependencies": {
-        "balanced-match": "^1.0.0"
-      }
-    },
-    "node_modules/ignore-walk/node_modules/minimatch": {
-      "version": "5.1.0",
-      "dev": true,
-      "license": "ISC",
-      "dependencies": {
-        "brace-expansion": "^2.0.1"
-      },
-      "engines": {
-        "node": ">=10"
-      }
-    },
     "node_modules/immer": {
       "version": "9.0.15",
       "license": "MIT",
@@ -9032,14 +8187,6 @@
         "url": "https://github.com/sponsors/sindresorhus"
       }
     },
-    "node_modules/import-lazy": {
-      "version": "4.0.0",
-      "dev": true,
-      "license": "MIT",
-      "engines": {
-        "node": ">=8"
-      }
-    },
     "node_modules/imurmurhash": {
       "version": "0.1.4",
       "dev": true,
@@ -9055,11 +8202,6 @@
         "node": ">=8"
       }
     },
-    "node_modules/infer-owner": {
-      "version": "1.0.4",
-      "dev": true,
-      "license": "ISC"
-    },
     "node_modules/inflight": {
       "version": "1.0.6",
       "license": "ISC",
@@ -9100,11 +8242,6 @@
         "loose-envify": "^1.0.0"
       }
     },
-    "node_modules/ip": {
-      "version": "2.0.0",
-      "dev": true,
-      "license": "MIT"
-    },
     "node_modules/ipaddr.js": {
       "version": "1.9.1",
       "license": "MIT",
@@ -9261,11 +8398,6 @@
         "url": "https://github.com/sponsors/sindresorhus"
       }
     },
-    "node_modules/is-lambda": {
-      "version": "1.0.1",
-      "dev": true,
-      "license": "MIT"
-    },
     "node_modules/is-negated-glob": {
       "version": "1.0.0",
       "dev": true,
@@ -9285,17 +8417,6 @@
         "url": "https://github.com/sponsors/ljharb"
       }
     },
-    "node_modules/is-npm": {
-      "version": "6.0.0",
-      "dev": true,
-      "license": "MIT",
-      "engines": {
-        "node": "^12.20.0 || ^14.13.1 || >=16.0.0"
-      },
-      "funding": {
-        "url": "https://github.com/sponsors/sindresorhus"
-      }
-    },
     "node_modules/is-number": {
       "version": "7.0.0",
       "license": "MIT",
@@ -9317,14 +8438,6 @@
         "url": "https://github.com/sponsors/ljharb"
       }
     },
-    "node_modules/is-obj": {
-      "version": "2.0.0",
-      "dev": true,
-      "license": "MIT",
-      "engines": {
-        "node": ">=8"
-      }
-    },
     "node_modules/is-path-inside": {
       "version": "3.0.3",
       "dev": true,
@@ -9487,14 +8600,6 @@
         "node": ">=0.10.0"
       }
     },
-    "node_modules/is-yarn-global": {
-      "version": "0.4.0",
-      "dev": true,
-      "license": "MIT",
-      "engines": {
-        "node": ">=12"
-      }
-    },
     "node_modules/isarray": {
       "version": "1.0.0",
       "dev": true,
@@ -9995,11 +9100,6 @@
         "node": ">=8"
       }
     },
-    "node_modules/jju": {
-      "version": "1.4.0",
-      "dev": true,
-      "license": "MIT"
-    },
     "node_modules/jose": {
       "version": "4.10.0",
       "license": "MIT",
@@ -10042,23 +9142,10 @@
         "node": ">=4"
       }
     },
-    "node_modules/json-buffer": {
-      "version": "3.0.1",
-      "dev": true,
-      "license": "MIT"
-    },
     "node_modules/json-parse-even-better-errors": {
       "version": "2.3.1",
       "license": "MIT"
     },
-    "node_modules/json-parse-helpfulerror": {
-      "version": "1.0.3",
-      "dev": true,
-      "license": "MIT",
-      "dependencies": {
-        "jju": "^1.1.0"
-      }
-    },
     "node_modules/json-schema": {
       "version": "0.4.0",
       "dev": true,
@@ -10100,19 +9187,6 @@
         "graceful-fs": "^4.1.6"
       }
     },
-    "node_modules/jsonlines": {
-      "version": "0.1.1",
-      "dev": true,
-      "license": "MIT"
-    },
-    "node_modules/jsonparse": {
-      "version": "1.3.1",
-      "dev": true,
-      "engines": [
-        "node >= 0.2.0"
-      ],
-      "license": "MIT"
-    },
     "node_modules/jsprim": {
       "version": "2.0.2",
       "dev": true,
@@ -10139,36 +9213,6 @@
         "node": ">=4.0"
       }
     },
-    "node_modules/keyv": {
-      "version": "4.5.0",
-      "dev": true,
-      "license": "MIT",
-      "dependencies": {
-        "json-buffer": "3.0.1"
-      }
-    },
-    "node_modules/kleur": {
-      "version": "4.1.5",
-      "dev": true,
-      "license": "MIT",
-      "engines": {
-        "node": ">=6"
-      }
-    },
-    "node_modules/latest-version": {
-      "version": "7.0.0",
-      "dev": true,
-      "license": "MIT",
-      "dependencies": {
-        "package-json": "^8.1.0"
-      },
-      "engines": {
-        "node": ">=14.16"
-      },
-      "funding": {
-        "url": "https://github.com/sponsors/sindresorhus"
-      }
-    },
     "node_modules/lazy-ass": {
       "version": "1.6.0",
       "dev": true,
@@ -10851,29 +9895,10 @@
         "loose-envify": "cli.js"
       }
     },
-    "node_modules/lowercase-keys": {
-      "version": "3.0.0",
-      "dev": true,
-      "license": "MIT",
-      "engines": {
-        "node": "^12.20.0 || ^14.13.1 || >=16.0.0"
-      },
-      "funding": {
-        "url": "https://github.com/sponsors/sindresorhus"
-      }
-    },
     "node_modules/lru_map": {
       "version": "0.3.3",
       "license": "MIT"
     },
-    "node_modules/lru-cache": {
-      "version": "7.14.0",
-      "dev": true,
-      "license": "ISC",
-      "engines": {
-        "node": ">=12"
-      }
-    },
     "node_modules/lz-string": {
       "version": "1.4.4",
       "license": "WTFPL",
@@ -10907,32 +9932,6 @@
       "dev": true,
       "license": "ISC"
     },
-    "node_modules/make-fetch-happen": {
-      "version": "10.2.1",
-      "dev": true,
-      "license": "ISC",
-      "dependencies": {
-        "agentkeepalive": "^4.2.1",
-        "cacache": "^16.1.0",
-        "http-cache-semantics": "^4.1.0",
-        "http-proxy-agent": "^5.0.0",
-        "https-proxy-agent": "^5.0.0",
-        "is-lambda": "^1.0.1",
-        "lru-cache": "^7.7.1",
-        "minipass": "^3.1.6",
-        "minipass-collect": "^1.0.2",
-        "minipass-fetch": "^2.0.3",
-        "minipass-flush": "^1.0.5",
-        "minipass-pipeline": "^1.2.4",
-        "negotiator": "^0.6.3",
-        "promise-retry": "^2.0.1",
-        "socks-proxy-agent": "^7.0.0",
-        "ssri": "^9.0.0"
-      },
-      "engines": {
-        "node": "^12.13.0 || ^14.15.0 || >=16.0.0"
-      }
-    },
     "node_modules/matcher-collection": {
       "version": "2.0.1",
       "dev": true,
@@ -11038,17 +10037,6 @@
         "node": ">=6"
       }
     },
-    "node_modules/mimic-response": {
-      "version": "4.0.0",
-      "dev": true,
-      "license": "MIT",
-      "engines": {
-        "node": "^12.20.0 || ^14.13.1 || >=16.0.0"
-      },
-      "funding": {
-        "url": "https://github.com/sponsors/sindresorhus"
-      }
-    },
     "node_modules/min-indent": {
       "version": "1.0.1",
       "license": "MIT",
@@ -11084,75 +10072,6 @@
         "node": ">=8"
       }
     },
-    "node_modules/minipass-collect": {
-      "version": "1.0.2",
-      "dev": true,
-      "license": "ISC",
-      "dependencies": {
-        "minipass": "^3.0.0"
-      },
-      "engines": {
-        "node": ">= 8"
-      }
-    },
-    "node_modules/minipass-fetch": {
-      "version": "2.1.2",
-      "dev": true,
-      "license": "MIT",
-      "dependencies": {
-        "minipass": "^3.1.6",
-        "minipass-sized": "^1.0.3",
-        "minizlib": "^2.1.2"
-      },
-      "engines": {
-        "node": "^12.13.0 || ^14.15.0 || >=16.0.0"
-      },
-      "optionalDependencies": {
-        "encoding": "^0.1.13"
-      }
-    },
-    "node_modules/minipass-flush": {
-      "version": "1.0.5",
-      "dev": true,
-      "license": "ISC",
-      "dependencies": {
-        "minipass": "^3.0.0"
-      },
-      "engines": {
-        "node": ">= 8"
-      }
-    },
-    "node_modules/minipass-json-stream": {
-      "version": "1.0.1",
-      "dev": true,
-      "license": "MIT",
-      "dependencies": {
-        "jsonparse": "^1.3.1",
-        "minipass": "^3.0.0"
-      }
-    },
-    "node_modules/minipass-pipeline": {
-      "version": "1.2.4",
-      "dev": true,
-      "license": "ISC",
-      "dependencies": {
-        "minipass": "^3.0.0"
-      },
-      "engines": {
-        "node": ">=8"
-      }
-    },
-    "node_modules/minipass-sized": {
-      "version": "1.0.3",
-      "dev": true,
-      "license": "ISC",
-      "dependencies": {
-        "minipass": "^3.0.0"
-      },
-      "engines": {
-        "node": ">=8"
-      }
-    },
     "node_modules/minizlib": {
       "version": "2.1.2",
       "license": "MIT",
@@ -11186,11 +10105,6 @@
       "version": "2.1.2",
       "license": "MIT"
     },
-    "node_modules/mute-stream": {
-      "version": "0.0.8",
-      "dev": true,
-      "license": "ISC"
-    },
     "node_modules/nanoid": {
       "version": "3.3.4",
       "dev": true,
@@ -11258,54 +10172,6 @@
         "webidl-conversions": "^3.0.0"
       }
     },
-    "node_modules/node-gyp": {
-      "version": "9.3.0",
-      "dev": true,
-      "license": "MIT",
-      "dependencies": {
-        "env-paths": "^2.2.0",
-        "glob": "^7.1.4",
-        "graceful-fs": "^4.2.6",
-        "make-fetch-happen": "^10.0.3",
-        "nopt": "^6.0.0",
-        "npmlog": "^6.0.0",
-        "rimraf": "^3.0.2",
-        "semver": "^7.3.5",
-        "tar": "^6.1.2",
-        "which": "^2.0.2"
-      },
-      "bin": {
-        "node-gyp": "bin/node-gyp.js"
-      },
-      "engines": {
-        "node": "^12.22 || ^14.13 || >=16"
-      }
-    },
-    "node_modules/node-gyp/node_modules/lru-cache": {
-      "version": "6.0.0",
-      "dev": true,
-      "license": "ISC",
-      "dependencies": {
-        "yallist": "^4.0.0"
-      },
-      "engines": {
-        "node": ">=10"
-      }
-    },
-    "node_modules/node-gyp/node_modules/semver": {
-      "version": "7.3.8",
-      "dev": true,
-      "license": "ISC",
-      "dependencies": {
-        "lru-cache": "^6.0.0"
-      },
-      "bin": {
-        "semver": "bin/semver.js"
-      },
-      "engines": {
-        "node": ">=10"
-      }
-    },
     "node_modules/node-releases": {
       "version": "2.0.6",
       "license": "MIT"
@@ -11353,59 +10219,6 @@
         "semver": "bin/semver"
       }
     },
-    "node_modules/nopt": {
-      "version": "6.0.0",
-      "dev": true,
-      "license": "ISC",
-      "dependencies": {
-        "abbrev": "^1.0.0"
-      },
-      "bin": {
-        "nopt": "bin/nopt.js"
-      },
-      "engines": {
-        "node": "^12.13.0 || ^14.15.0 || >=16.0.0"
-      }
-    },
-    "node_modules/normalize-package-data": {
-      "version": "4.0.1",
-      "dev": true,
-      "license": "BSD-2-Clause",
-      "dependencies": {
-        "hosted-git-info": "^5.0.0",
-        "is-core-module": "^2.8.1",
-        "semver": "^7.3.5",
-        "validate-npm-package-license": "^3.0.4"
-      },
-      "engines": {
-        "node": "^12.13.0 || ^14.15.0 || >=16.0.0"
-      }
-    },
-    "node_modules/normalize-package-data/node_modules/lru-cache": {
-      "version": "6.0.0",
-      "dev": true,
-      "license": "ISC",
-      "dependencies": {
-        "yallist": "^4.0.0"
-      },
-      "engines": {
-        "node": ">=10"
-      }
-    },
-    "node_modules/normalize-package-data/node_modules/semver": {
-      "version": "7.3.8",
-      "dev": true,
-      "license": "ISC",
-      "dependencies": {
-        "lru-cache": "^6.0.0"
-      },
-      "bin": {
-        "semver": "bin/semver.js"
-      },
-      "engines": {
-        "node": ">=10"
-      }
-    },
     "node_modules/normalize-path": {
       "version": "3.0.0",
       "dev": true,
@@ -11414,17 +10227,6 @@
         "node": ">=0.10.0"
       }
     },
-    "node_modules/normalize-url": {
-      "version": "7.2.0",
-      "dev": true,
-      "license": "MIT",
-      "engines": {
-        "node": ">=12.20"
-      },
-      "funding": {
-        "url": "https://github.com/sponsors/sindresorhus"
-      }
-    },
     "node_modules/now-and-later": {
       "version": "2.0.1",
       "dev": true,
@@ -11436,344 +10238,6 @@
         "node": ">= 0.10"
       }
     },
-    "node_modules/npm-bundled": {
-      "version": "1.1.2",
-      "dev": true,
-      "license": "ISC",
-      "dependencies": {
-        "npm-normalize-package-bin": "^1.0.1"
-      }
-    },
-    "node_modules/npm-check-updates": {
-      "version": "16.3.11",
-      "dev": true,
-      "license": "Apache-2.0",
-      "dependencies": {
-        "chalk": "^5.0.1",
-        "cli-table": "^0.3.11",
-        "commander": "^9.4.1",
-        "fast-memoize": "^2.5.2",
-        "find-up": "5.0.0",
-        "fp-and-or": "^0.1.3",
-        "get-stdin": "^8.0.0",
-        "globby": "^11.0.4",
-        "hosted-git-info": "^5.1.0",
-        "json-parse-helpfulerror": "^1.0.3",
-        "jsonlines": "^0.1.1",
-        "lodash": "^4.17.21",
-        "minimatch": "^5.1.0",
-        "p-map": "^4.0.0",
-        "pacote": "^13.6.2",
-        "parse-github-url": "^1.0.2",
-        "progress": "^2.0.3",
-        "prompts-ncu": "^2.5.1",
-        "rc-config-loader": "^4.1.0",
-        "remote-git-tags": "^3.0.0",
-        "rimraf": "^3.0.2",
-        "semver": "^7.3.7",
-        "semver-utils": "^1.1.4",
-        "source-map-support": "^0.5.21",
-        "spawn-please": "^1.0.0",
-        "untildify": "^4.0.0",
-        "update-notifier": "^6.0.2",
-        "yaml": "^2.1.1"
-      },
-      "bin": {
-        "ncu": "build/src/bin/cli.js",
-        "npm-check-updates": "build/src/bin/cli.js"
-      },
-      "engines": {
-        "node": ">=14.14"
-      }
-    },
-    "node_modules/npm-check-updates/node_modules/brace-expansion": {
-      "version": "2.0.1",
-      "dev": true,
-      "license": "MIT",
-      "dependencies": {
-        "balanced-match": "^1.0.0"
-      }
-    },
-    "node_modules/npm-check-updates/node_modules/chalk": {
-      "version": "5.1.2",
-      "dev": true,
-      "license": "MIT",
-      "engines": {
-        "node": "^12.17.0 || ^14.13 || >=16.0.0"
-      },
-      "funding": {
-        "url": "https://github.com/chalk/chalk?sponsor=1"
-      }
-    },
-    "node_modules/npm-check-updates/node_modules/commander": {
-      "version": "9.4.1",
-      "dev": true,
-      "license": "MIT",
-      "engines": {
-        "node": "^12.20.0 || >=14"
-      }
-    },
-    "node_modules/npm-check-updates/node_modules/lru-cache": {
-      "version": "6.0.0",
-      "dev": true,
-      "license": "ISC",
-      "dependencies": {
-        "yallist": "^4.0.0"
-      },
-      "engines": {
-        "node": ">=10"
-      }
-    },
-    "node_modules/npm-check-updates/node_modules/minimatch": {
-      "version": "5.1.0",
-      "dev": true,
-      "license": "ISC",
-      "dependencies": {
-        "brace-expansion": "^2.0.1"
-      },
-      "engines": {
-        "node": ">=10"
-      }
-    },
-    "node_modules/npm-check-updates/node_modules/semver": {
-      "version": "7.3.8",
-      "dev": true,
-      "license": "ISC",
-      "dependencies": {
-        "lru-cache": "^6.0.0"
-      },
-      "bin": {
-        "semver": "bin/semver.js"
-      },
-      "engines": {
-        "node": ">=10"
-      }
-    },
-    "node_modules/npm-check-updates/node_modules/yaml": {
-      "version": "2.1.3",
-      "dev": true,
-      "license": "ISC",
-      "engines": {
-        "node": ">= 14"
-      }
-    },
-    "node_modules/npm-install-checks": {
-      "version": "5.0.0",
-      "dev": true,
-      "license": "BSD-2-Clause",
-      "dependencies": {
-        "semver": "^7.1.1"
-      },
-      "engines": {
-        "node": "^12.13.0 || ^14.15.0 || >=16.0.0"
-      }
-    },
-    "node_modules/npm-install-checks/node_modules/lru-cache": {
-      "version": "6.0.0",
-      "dev": true,
-      "license": "ISC",
-      "dependencies": {
-        "yallist": "^4.0.0"
-      },
-      "engines": {
-        "node": ">=10"
-      }
-    },
-    "node_modules/npm-install-checks/node_modules/semver": {
-      "version": "7.3.8",
-      "dev": true,
-      "license": "ISC",
-      "dependencies": {
-        "lru-cache": "^6.0.0"
-      },
-      "bin": {
-        "semver": "bin/semver.js"
-      },
-      "engines": {
-        "node": ">=10"
-      }
-    },
-    "node_modules/npm-normalize-package-bin": {
-      "version": "1.0.1",
-      "dev": true,
-      "license": "ISC"
-    },
-    "node_modules/npm-package-arg": {
-      "version": "9.1.2",
-      "dev": true,
-      "license": "ISC",
-      "dependencies": {
-        "hosted-git-info": "^5.0.0",
-        "proc-log": "^2.0.1",
-        "semver": "^7.3.5",
-        "validate-npm-package-name": "^4.0.0"
-      },
-      "engines": {
-        "node": "^12.13.0 || ^14.15.0 || >=16.0.0"
-      }
-    },
-    "node_modules/npm-package-arg/node_modules/lru-cache": {
-      "version": "6.0.0",
-      "dev": true,
-      "license": "ISC",
-      "dependencies": {
-        "yallist": "^4.0.0"
-      },
-      "engines": {
-        "node": ">=10"
-      }
-    },
-    "node_modules/npm-package-arg/node_modules/semver": {
-      "version": "7.3.8",
-      "dev": true,
-      "license": "ISC",
-      "dependencies": {
-        "lru-cache": "^6.0.0"
-      },
-      "bin": {
-        "semver": "bin/semver.js"
-      },
-      "engines": {
-        "node": ">=10"
-      }
-    },
-    "node_modules/npm-packlist": {
-      "version": "5.1.3",
-      "dev": true,
-      "license": "ISC",
-      "dependencies": {
-        "glob": "^8.0.1",
-        "ignore-walk": "^5.0.1",
-        "npm-bundled": "^2.0.0",
-        "npm-normalize-package-bin": "^2.0.0"
-      },
-      "bin": {
-        "npm-packlist": "bin/index.js"
-      },
-      "engines": {
-        "node": "^12.13.0 || ^14.15.0 || >=16.0.0"
-      }
-    },
-    "node_modules/npm-packlist/node_modules/brace-expansion": {
-      "version": "2.0.1",
-      "dev": true,
-      "license": "MIT",
-      "dependencies": {
-        "balanced-match": "^1.0.0"
-      }
-    },
-    "node_modules/npm-packlist/node_modules/glob": {
-      "version": "8.0.3",
-      "dev": true,
-      "license": "ISC",
-      "dependencies": {
-        "fs.realpath": "^1.0.0",
-        "inflight": "^1.0.4",
-        "inherits": "2",
-        "minimatch": "^5.0.1",
-        "once": "^1.3.0"
-      },
-      "engines": {
-        "node": ">=12"
-      },
-      "funding": {
-        "url": "https://github.com/sponsors/isaacs"
-      }
-    },
-    "node_modules/npm-packlist/node_modules/minimatch": {
-      "version": "5.1.0",
-      "dev": true,
-      "license": "ISC",
-      "dependencies": {
-        "brace-expansion": "^2.0.1"
-      },
-      "engines": {
-        "node": ">=10"
-      }
-    },
-    "node_modules/npm-packlist/node_modules/npm-bundled": {
-      "version": "2.0.1",
-      "dev": true,
-      "license": "ISC",
-      "dependencies": {
-        "npm-normalize-package-bin": "^2.0.0"
-      },
-      "engines": {
-        "node": "^12.13.0 || ^14.15.0 || >=16.0.0"
-      }
-    },
-    "node_modules/npm-packlist/node_modules/npm-normalize-package-bin": {
-      "version": "2.0.0",
-      "dev": true,
-      "license": "ISC",
-      "engines": {
-        "node": "^12.13.0 || ^14.15.0 || >=16.0.0"
-      }
-    },
-    "node_modules/npm-pick-manifest": {
-      "version": "7.0.2",
-      "dev": true,
-      "license": "ISC",
-      "dependencies": {
-        "npm-install-checks": "^5.0.0",
-        "npm-normalize-package-bin": "^2.0.0",
-        "npm-package-arg": "^9.0.0",
-        "semver": "^7.3.5"
-      },
-      "engines": {
-        "node": "^12.13.0 || ^14.15.0 || >=16.0.0"
-      }
-    },
-    "node_modules/npm-pick-manifest/node_modules/lru-cache": {
-      "version": "6.0.0",
-      "dev": true,
-      "license": "ISC",
-      "dependencies": {
-        "yallist": "^4.0.0"
-      },
-      "engines": {
-        "node": ">=10"
-      }
-    },
-    "node_modules/npm-pick-manifest/node_modules/npm-normalize-package-bin": {
-      "version": "2.0.0",
-      "dev": true,
-      "license": "ISC",
-      "engines": {
-        "node": "^12.13.0 || ^14.15.0 || >=16.0.0"
-      }
-    },
-    "node_modules/npm-pick-manifest/node_modules/semver": {
-      "version": "7.3.8",
-      "dev": true,
-      "license": "ISC",
-      "dependencies": {
-        "lru-cache": "^6.0.0"
-      },
-      "bin": {
-        "semver": "bin/semver.js"
-      },
-      "engines": {
-        "node": ">=10"
-      }
-    },
-    "node_modules/npm-registry-fetch": {
-      "version": "13.3.1",
-      "dev": true,
-      "license": "ISC",
-      "dependencies": {
-        "make-fetch-happen": "^10.0.6",
-        "minipass": "^3.1.6",
-        "minipass-fetch": "^2.0.3",
-        "minipass-json-stream": "^1.0.1",
-        "minizlib": "^2.1.2",
-        "npm-package-arg": "^9.0.1",
-        "proc-log": "^2.0.0"
-      },
-      "engines": {
-        "node": "^12.13.0 || ^14.15.0 || >=16.0.0"
-      }
-    },
     "node_modules/npm-run-path": {
       "version": "4.0.1",
       "dev": true,
@@ -11785,20 +10249,6 @@
         "node": ">=8"
       }
     },
-    "node_modules/npmlog": {
-      "version": "6.0.2",
-      "dev": true,
-      "license": "ISC",
-      "dependencies": {
-        "are-we-there-yet": "^3.0.0",
-        "console-control-strings": "^1.1.0",
-        "gauge": "^4.0.3",
-        "set-blocking": "^2.0.0"
-      },
-      "engines": {
-        "node": "^12.13.0 || ^14.15.0 || >=16.0.0"
-      }
-    },
     "node_modules/nth-check": {
       "version": "2.1.1",
       "dev": true,
@@ -12000,14 +10450,6 @@
       "dev": true,
       "license": "MIT"
     },
-    "node_modules/p-cancelable": {
-      "version": "3.0.0",
-      "dev": true,
-      "license": "MIT",
-      "engines": {
-        "node": ">=12.20"
-      }
-    },
     "node_modules/p-limit": {
       "version": "3.1.0",
       "dev": true,
@@ -12050,82 +10492,6 @@
         "url": "https://github.com/sponsors/sindresorhus"
       }
     },
-    "node_modules/package-json": {
-      "version": "8.1.0",
-      "dev": true,
-      "license": "MIT",
-      "dependencies": {
-        "got": "^12.1.0",
-        "registry-auth-token": "^5.0.1",
-        "registry-url": "^6.0.0",
-        "semver": "^7.3.7"
-      },
-      "engines": {
-        "node": ">=14.16"
-      },
-      "funding": {
-        "url": "https://github.com/sponsors/sindresorhus"
-      }
-    },
-    "node_modules/package-json/node_modules/lru-cache": {
-      "version": "6.0.0",
-      "dev": true,
-      "license": "ISC",
-      "dependencies": {
-        "yallist": "^4.0.0"
-      },
-      "engines": {
-        "node": ">=10"
-      }
-    },
-    "node_modules/package-json/node_modules/semver": {
-      "version": "7.3.8",
-      "dev": true,
-      "license": "ISC",
-      "dependencies": {
-        "lru-cache": "^6.0.0"
-      },
-      "bin": {
-        "semver": "bin/semver.js"
-      },
-      "engines": {
-        "node": ">=10"
-      }
-    },
-    "node_modules/pacote": {
-      "version": "13.6.2",
-      "dev": true,
-      "license": "ISC",
-      "dependencies": {
-        "@npmcli/git": "^3.0.0",
-        "@npmcli/installed-package-contents": "^1.0.7",
-        "@npmcli/promise-spawn": "^3.0.0",
-        "@npmcli/run-script": "^4.1.0",
-        "cacache": "^16.0.0",
-        "chownr": "^2.0.0",
-        "fs-minipass": "^2.1.0",
-        "infer-owner": "^1.0.4",
-        "minipass": "^3.1.6",
-        "mkdirp": "^1.0.4",
-        "npm-package-arg": "^9.0.0",
-        "npm-packlist": "^5.1.0",
-        "npm-pick-manifest": "^7.0.0",
-        "npm-registry-fetch": "^13.0.1",
-        "proc-log": "^2.0.0",
-        "promise-retry": "^2.0.1",
-        "read-package-json": "^5.0.0",
-        "read-package-json-fast": "^2.0.3",
-        "rimraf": "^3.0.2",
-        "ssri": "^9.0.0",
-        "tar": "^6.1.11"
-      },
-      "bin": {
-        "pacote": "lib/bin.js"
-      },
-      "engines": {
-        "node": "^12.13.0 || ^14.15.0 || >=16.0.0"
-      }
-    },
     "node_modules/parent-module": {
       "version": "1.0.1",
       "license": "MIT",
@@ -12136,17 +10502,6 @@
         "node": ">=6"
       }
     },
-    "node_modules/parse-github-url": {
-      "version": "1.0.2",
-      "dev": true,
-      "license": "MIT",
-      "bin": {
-        "parse-github-url": "cli.js"
-      },
-      "engines": {
-        "node": ">=0.10.0"
-      }
-    },
     "node_modules/parse-json": {
       "version": "5.2.0",
       "license": "MIT",
@@ -12432,14 +10787,6 @@
       "version": "17.0.2",
       "license": "MIT"
     },
-    "node_modules/proc-log": {
-      "version": "2.0.1",
-      "dev": true,
-      "license": "ISC",
-      "engines": {
-        "node": "^12.13.0 || ^14.15.0 || >=16.0.0"
-      }
-    },
     "node_modules/process": {
       "version": "0.11.10",
       "license": "MIT",
@@ -12452,19 +10799,6 @@
       "dev": true,
       "license": "MIT"
     },
-    "node_modules/progress": {
-      "version": "2.0.3",
-      "dev": true,
-      "license": "MIT",
-      "engines": {
-        "node": ">=0.4.0"
-      }
-    },
-    "node_modules/promise-inflight": {
-      "version": "1.0.1",
-      "dev": true,
-      "license": "ISC"
-    },
     "node_modules/promise-map-series": {
       "version": "0.3.0",
       "dev": true,
@@ -12473,30 +10807,6 @@
         "node": "10.* || >= 12.*"
       }
     },
-    "node_modules/promise-retry": {
-      "version": "2.0.1",
-      "dev": true,
-      "license": "MIT",
-      "dependencies": {
-        "err-code": "^2.0.2",
-        "retry": "^0.12.0"
-      },
-      "engines": {
-        "node": ">=10"
-      }
-    },
-    "node_modules/prompts-ncu": {
-      "version": "2.5.1",
-      "dev": true,
-      "license": "MIT",
-      "dependencies": {
-        "kleur": "^4.0.1",
-        "sisteransi": "^1.0.5"
-      },
-      "engines": {
-        "node": ">= 6"
-      }
-    },
     "node_modules/prop-types": {
       "version": "15.8.1",
       "license": "MIT",
@@ -12510,11 +10820,6 @@
       "version": "16.13.1",
       "license": "MIT"
     },
-    "node_modules/proto-list": {
-      "version": "1.2.4",
-      "dev": true,
-      "license": "ISC"
-    },
     "node_modules/proxy-addr": {
       "version": "2.0.7",
       "license": "MIT",
@@ -12576,20 +10881,6 @@
         "node": ">=6"
       }
     },
-    "node_modules/pupa": {
-      "version": "3.1.0",
-      "dev": true,
-      "license": "MIT",
-      "dependencies": {
-        "escape-goat": "^4.0.0"
-      },
-      "engines": {
-        "node": ">=12.20"
-      },
-      "funding": {
-        "url": "https://github.com/sponsors/sindresorhus"
-      }
-    },
     "node_modules/qrcode.react": {
       "version": "3.1.0",
       "license": "ISC",
@@ -12634,17 +10925,6 @@
       "dev": true,
       "license": "MIT"
     },
-    "node_modules/quick-lru": {
-      "version": "5.1.1",
-      "dev": true,
-      "license": "MIT",
-      "engines": {
-        "node": ">=10"
-      },
-      "funding": {
-        "url": "https://github.com/sponsors/sindresorhus"
-      }
-    },
     "node_modules/quick-temp": {
       "version": "0.1.8",
       "dev": true,
@@ -12720,44 +11000,6 @@
         "webpack": "^4.0.0 || ^5.0.0"
       }
     },
-    "node_modules/rc": {
-      "version": "1.2.8",
-      "dev": true,
-      "license": "(BSD-2-Clause OR MIT OR Apache-2.0)",
-      "dependencies": {
-        "deep-extend": "^0.6.0",
-        "ini": "~1.3.0",
-        "minimist": "^1.2.0",
-        "strip-json-comments": "~2.0.1"
-      },
-      "bin": {
-        "rc": "cli.js"
-      }
-    },
-    "node_modules/rc-config-loader": {
-      "version": "4.1.0",
-      "dev": true,
-      "license": "MIT",
-      "dependencies": {
-        "debug": "^4.1.1",
-        "js-yaml": "^4.0.0",
-        "json5": "^2.1.2",
-        "require-from-string": "^2.0.2"
-      }
-    },
-    "node_modules/rc/node_modules/ini": {
-      "version": "1.3.8",
-      "dev": true,
-      "license": "ISC"
-    },
-    "node_modules/rc/node_modules/strip-json-comments": {
-      "version": "2.0.1",
-      "dev": true,
-      "license": "MIT",
-      "engines": {
-        "node": ">=0.10.0"
-      }
-    },
     "node_modules/react": {
       "version": "18.2.0",
       "license": "MIT",
@@ -12966,88 +11208,6 @@
         "react": "^15.3.0 || ^16.0.0 || ^17.0.0 || ^18.0.0"
       }
     },
-    "node_modules/read": {
-      "version": "1.0.7",
-      "dev": true,
-      "license": "ISC",
-      "dependencies": {
-        "mute-stream": "~0.0.4"
-      },
-      "engines": {
-        "node": ">=0.8"
-      }
-    },
-    "node_modules/read-package-json": {
-      "version": "5.0.2",
-      "dev": true,
-      "license": "ISC",
-      "dependencies": {
-        "glob": "^8.0.1",
-        "json-parse-even-better-errors": "^2.3.1",
-        "normalize-package-data": "^4.0.0",
-        "npm-normalize-package-bin": "^2.0.0"
-      },
-      "engines": {
-        "node": "^12.13.0 || ^14.15.0 || >=16.0.0"
-      }
-    },
-    "node_modules/read-package-json-fast": {
-      "version": "2.0.3",
-      "dev": true,
-      "license": "ISC",
-      "dependencies": {
-        "json-parse-even-better-errors": "^2.3.0",
-        "npm-normalize-package-bin": "^1.0.1"
-      },
-      "engines": {
-        "node": ">=10"
-      }
-    },
-    "node_modules/read-package-json/node_modules/brace-expansion": {
-      "version": "2.0.1",
-      "dev": true,
-      "license": "MIT",
-      "dependencies": {
-        "balanced-match": "^1.0.0"
-      }
-    },
-    "node_modules/read-package-json/node_modules/glob": {
-      "version": "8.0.3",
-      "dev": true,
-      "license": "ISC",
-      "dependencies": {
-        "fs.realpath": "^1.0.0",
-        "inflight": "^1.0.4",
-        "inherits": "2",
-        "minimatch": "^5.0.1",
-        "once": "^1.3.0"
-      },
-      "engines": {
-        "node": ">=12"
-      },
-      "funding": {
-        "url": "https://github.com/sponsors/isaacs"
-      }
-    },
-    "node_modules/read-package-json/node_modules/minimatch": {
-      "version": "5.1.0",
-      "dev": true,
-      "license": "ISC",
-      "dependencies": {
-        "brace-expansion": "^2.0.1"
-      },
-      "engines": {
-        "node": ">=10"
-      }
-    },
-    "node_modules/read-package-json/node_modules/npm-normalize-package-bin": {
-      "version": "2.0.0",
-      "dev": true,
-      "license": "ISC",
-      "engines": {
-        "node": "^12.13.0 || ^14.15.0 || >=16.0.0"
-      }
-    },
     "node_modules/readable-stream": {
       "version": "3.6.0",
       "license": "MIT",
@@ -13192,31 +11352,6 @@
         "node": ">=4"
       }
     },
-    "node_modules/registry-auth-token": {
-      "version": "5.0.1",
-      "dev": true,
-      "license": "MIT",
-      "dependencies": {
-        "@pnpm/npm-conf": "^1.0.4"
-      },
-      "engines": {
-        "node": ">=14"
-      }
-    },
-    "node_modules/registry-url": {
-      "version": "6.0.1",
-      "dev": true,
-      "license": "MIT",
-      "dependencies": {
-        "rc": "1.2.8"
-      },
-      "engines": {
-        "node": ">=12"
-      },
-      "funding": {
-        "url": "https://github.com/sponsors/sindresorhus"
-      }
-    },
     "node_modules/regjsgen": {
       "version": "0.7.1",
       "dev": true,
@@ -13240,14 +11375,6 @@
         "jsesc": "bin/jsesc"
       }
     },
-    "node_modules/remote-git-tags": {
-      "version": "3.0.0",
-      "dev": true,
-      "license": "MIT",
-      "engines": {
-        "node": ">=8"
-      }
-    },
     "node_modules/remove-bom-buffer": {
       "version": "3.0.0",
       "dev": true,
@@ -13365,11 +11492,6 @@
         "url": "https://github.com/sponsors/ljharb"
       }
     },
-    "node_modules/resolve-alpn": {
-      "version": "1.2.1",
-      "dev": true,
-      "license": "MIT"
-    },
     "node_modules/resolve-from": {
       "version": "4.0.0",
       "license": "MIT",
@@ -13388,20 +11510,6 @@
         "node": ">= 0.10"
       }
     },
-    "node_modules/responselike": {
-      "version": "3.0.0",
-      "dev": true,
-      "license": "MIT",
-      "dependencies": {
-        "lowercase-keys": "^3.0.0"
-      },
-      "engines": {
-        "node": ">=14.16"
-      },
-      "funding": {
-        "url": "https://github.com/sponsors/sindresorhus"
-      }
-    },
     "node_modules/restore-cursor": {
       "version": "3.1.0",
       "dev": true,
@@ -13414,14 +11522,6 @@
         "node": ">=8"
       }
     },
-    "node_modules/retry": {
-      "version": "0.12.0",
-      "dev": true,
-      "license": "MIT",
-      "engines": {
-        "node": ">= 4"
-      }
-    },
     "node_modules/reusify": {
       "version": "1.0.4",
       "dev": true,
@@ -13600,50 +11700,6 @@
         "semver": "bin/semver.js"
       }
     },
-    "node_modules/semver-diff": {
-      "version": "4.0.0",
-      "dev": true,
-      "license": "MIT",
-      "dependencies": {
-        "semver": "^7.3.5"
-      },
-      "engines": {
-        "node": ">=12"
-      },
-      "funding": {
-        "url": "https://github.com/sponsors/sindresorhus"
-      }
-    },
-    "node_modules/semver-diff/node_modules/lru-cache": {
-      "version": "6.0.0",
-      "dev": true,
-      "license": "ISC",
-      "dependencies": {
-        "yallist": "^4.0.0"
-      },
-      "engines": {
-        "node": ">=10"
-      }
-    },
-    "node_modules/semver-diff/node_modules/semver": {
-      "version": "7.3.8",
-      "dev": true,
-      "license": "ISC",
-      "dependencies": {
-        "lru-cache": "^6.0.0"
-      },
-      "bin": {
-        "semver": "bin/semver.js"
-      },
-      "engines": {
-        "node": ">=10"
-      }
-    },
-    "node_modules/semver-utils": {
-      "version": "1.1.4",
-      "dev": true,
-      "license": "APACHEv2"
-    },
     "node_modules/send": {
       "version": "0.18.0",
       "license": "MIT",
@@ -13772,11 +11828,6 @@
         "semver": "bin/semver.js"
       }
     },
-    "node_modules/sisteransi": {
-      "version": "1.0.5",
-      "dev": true,
-      "license": "MIT"
-    },
     "node_modules/slash": {
       "version": "3.0.0",
       "license": "MIT",
@@ -13810,15 +11861,6 @@
         "url": "https://github.com/chalk/ansi-styles?sponsor=1"
       }
     },
-    "node_modules/smart-buffer": {
-      "version": "4.2.0",
-      "dev": true,
-      "license": "MIT",
-      "engines": {
-        "node": ">= 6.0.0",
-        "npm": ">= 3.0.0"
-      }
-    },
     "node_modules/socket.io": {
       "version": "4.5.2",
       "license": "MIT",
@@ -13849,32 +11891,6 @@
         "node": ">=10.0.0"
       }
     },
-    "node_modules/socks": {
-      "version": "2.7.1",
-      "dev": true,
-      "license": "MIT",
-      "dependencies": {
-        "ip": "^2.0.0",
-        "smart-buffer": "^4.2.0"
-      },
-      "engines": {
-        "node": ">= 10.13.0",
-        "npm": ">= 3.0.0"
-      }
-    },
-    "node_modules/socks-proxy-agent": {
-      "version": "7.0.0",
-      "dev": true,
-      "license": "MIT",
-      "dependencies": {
-        "agent-base": "^6.0.2",
-        "debug": "^4.3.3",
-        "socks": "^2.6.2"
-      },
-      "engines": {
-        "node": ">= 10"
-      }
-    },
     "node_modules/sort-keys": {
       "version": "5.0.0",
       "dev": true,
@@ -13931,42 +11947,6 @@
       "dev": true,
       "license": "MIT"
     },
-    "node_modules/spawn-please": {
-      "version": "1.0.0",
-      "dev": true,
-      "license": "ISC",
-      "engines": {
-        "node": ">=10"
-      }
-    },
-    "node_modules/spdx-correct": {
-      "version": "3.1.1",
-      "dev": true,
-      "license": "Apache-2.0",
-      "dependencies": {
-        "spdx-expression-parse": "^3.0.0",
-        "spdx-license-ids": "^3.0.0"
-      }
-    },
-    "node_modules/spdx-exceptions": {
-      "version": "2.3.0",
-      "dev": true,
-      "license": "CC-BY-3.0"
-    },
-    "node_modules/spdx-expression-parse": {
-      "version": "3.0.1",
-      "dev": true,
-      "license": "MIT",
-      "dependencies": {
-        "spdx-exceptions": "^2.1.0",
-        "spdx-license-ids": "^3.0.0"
-      }
-    },
-    "node_modules/spdx-license-ids": {
-      "version": "3.0.12",
-      "dev": true,
-      "license": "CC0-1.0"
-    },
     "node_modules/sprintf-js": {
       "version": "1.1.2",
       "dev": true,
@@ -13996,17 +11976,6 @@
         "node": ">=0.10.0"
       }
     },
-    "node_modules/ssri": {
-      "version": "9.0.1",
-      "dev": true,
-      "license": "ISC",
-      "dependencies": {
-        "minipass": "^3.1.1"
-      },
-      "engines": {
-        "node": "^12.13.0 || ^14.15.0 || >=16.0.0"
-      }
-    },
     "node_modules/stable": {
       "version": "0.1.8",
       "dev": true,
@@ -14774,14 +12743,6 @@
       "dev": true,
       "license": "MIT"
     },
-    "node_modules/typedarray-to-buffer": {
-      "version": "3.1.5",
-      "dev": true,
-      "license": "MIT",
-      "dependencies": {
-        "is-typedarray": "^1.0.0"
-      }
-    },
     "node_modules/typedi": {
       "version": "0.10.0",
       "license": "MIT"
@@ -14882,28 +12843,6 @@
         "node": ">=4"
       }
     },
-    "node_modules/unique-filename": {
-      "version": "2.0.1",
-      "dev": true,
-      "license": "ISC",
-      "dependencies": {
-        "unique-slug": "^3.0.0"
-      },
-      "engines": {
-        "node": "^12.13.0 || ^14.15.0 || >=16.0.0"
-      }
-    },
-    "node_modules/unique-slug": {
-      "version": "3.0.0",
-      "dev": true,
-      "license": "ISC",
-      "dependencies": {
-        "imurmurhash": "^0.1.4"
-      },
-      "engines": {
-        "node": "^12.13.0 || ^14.15.0 || >=16.0.0"
-      }
-    },
     "node_modules/unique-stream": {
       "version": "2.3.1",
       "dev": true,
@@ -14913,20 +12852,6 @@
         "through2-filter": "^3.0.0"
       }
     },
-    "node_modules/unique-string": {
-      "version": "3.0.0",
-      "dev": true,
-      "license": "MIT",
-      "dependencies": {
-        "crypto-random-string": "^4.0.0"
-      },
-      "engines": {
-        "node": ">=12"
-      },
-      "funding": {
-        "url": "https://github.com/sponsors/sindresorhus"
-      }
-    },
     "node_modules/universalify": {
       "version": "2.0.0",
       "dev": true,
@@ -14974,69 +12899,6 @@
         "browserslist": ">= 4.21.0"
       }
     },
-    "node_modules/update-notifier": {
-      "version": "6.0.2",
-      "dev": true,
-      "license": "BSD-2-Clause",
-      "dependencies": {
-        "boxen": "^7.0.0",
-        "chalk": "^5.0.1",
-        "configstore": "^6.0.0",
-        "has-yarn": "^3.0.0",
-        "import-lazy": "^4.0.0",
-        "is-ci": "^3.0.1",
-        "is-installed-globally": "^0.4.0",
-        "is-npm": "^6.0.0",
-        "is-yarn-global": "^0.4.0",
-        "latest-version": "^7.0.0",
-        "pupa": "^3.1.0",
-        "semver": "^7.3.7",
-        "semver-diff": "^4.0.0",
-        "xdg-basedir": "^5.1.0"
-      },
-      "engines": {
-        "node": ">=14.16"
-      },
-      "funding": {
-        "url": "https://github.com/yeoman/update-notifier?sponsor=1"
-      }
-    },
-    "node_modules/update-notifier/node_modules/chalk": {
-      "version": "5.1.2",
-      "dev": true,
-      "license": "MIT",
-      "engines": {
-        "node": "^12.17.0 || ^14.13 || >=16.0.0"
-      },
-      "funding": {
-        "url": "https://github.com/chalk/chalk?sponsor=1"
-      }
-    },
-    "node_modules/update-notifier/node_modules/lru-cache": {
-      "version": "6.0.0",
-      "dev": true,
-      "license": "ISC",
-      "dependencies": {
-        "yallist": "^4.0.0"
-      },
-      "engines": {
-        "node": ">=10"
-      }
-    },
-    "node_modules/update-notifier/node_modules/semver": {
-      "version": "7.3.8",
-      "dev": true,
-      "license": "ISC",
-      "dependencies": {
-        "lru-cache": "^6.0.0"
-      },
-      "bin": {
-        "semver": "bin/semver.js"
-      },
-      "engines": {
-        "node": ">=10"
-      }
-    },
     "node_modules/uri-js": {
       "version": "4.4.1",
       "dev": true,
@@ -15087,26 +12949,6 @@
       "dev": true,
       "license": "MIT"
     },
-    "node_modules/validate-npm-package-license": {
-      "version": "3.0.4",
-      "dev": true,
-      "license": "Apache-2.0",
-      "dependencies": {
-        "spdx-correct": "^3.0.0",
-        "spdx-expression-parse": "^3.0.0"
-      }
-    },
-    "node_modules/validate-npm-package-name": {
-      "version": "4.0.0",
-      "dev": true,
-      "license": "ISC",
-      "dependencies": {
-        "builtins": "^5.0.0"
-      },
-      "engines": {
-        "node": "^12.13.0 || ^14.15.0 || >=16.0.0"
-      }
-    },
     "node_modules/value-or-function": {
       "version": "3.0.0",
       "dev": true,
@@ -15624,66 +13466,6 @@
         "string-width": "^1.0.2 || 2 || 3 || 4"
       }
     },
-    "node_modules/widest-line": {
-      "version": "4.0.1",
-      "dev": true,
-      "license": "MIT",
-      "dependencies": {
-        "string-width": "^5.0.1"
-      },
-      "engines": {
-        "node": ">=12"
-      },
-      "funding": {
-        "url": "https://github.com/sponsors/sindresorhus"
-      }
-    },
-    "node_modules/widest-line/node_modules/ansi-regex": {
-      "version": "6.0.1",
-      "dev": true,
-      "license": "MIT",
-      "engines": {
-        "node": ">=12"
-      },
-      "funding": {
-        "url": "https://github.com/chalk/ansi-regex?sponsor=1"
-      }
-    },
-    "node_modules/widest-line/node_modules/emoji-regex": {
-      "version": "9.2.2",
-      "dev": true,
-      "license": "MIT"
-    },
-    "node_modules/widest-line/node_modules/string-width": {
-      "version": "5.1.2",
-      "dev": true,
-      "license": "MIT",
-      "dependencies": {
-        "eastasianwidth": "^0.2.0",
-        "emoji-regex": "^9.2.2",
-        "strip-ansi": "^7.0.1"
-      },
-      "engines": {
-        "node": ">=12"
-      },
-      "funding": {
-        "url": "https://github.com/sponsors/sindresorhus"
-      }
-    },
-    "node_modules/widest-line/node_modules/strip-ansi": {
-      "version": "7.0.1",
-      "dev": true,
-      "license": "MIT",
-      "dependencies": {
-        "ansi-regex": "^6.0.1"
-      },
-      "engines": {
-        "node": ">=12"
-      },
-      "funding": {
-        "url": "https://github.com/chalk/strip-ansi?sponsor=1"
-      }
-    },
     "node_modules/word-wrap": {
       "version": "1.2.3",
       "dev": true,
@@ -15742,17 +13524,6 @@
       "version": "1.0.2",
       "license": "ISC"
     },
-    "node_modules/write-file-atomic": {
-      "version": "3.0.3",
-      "dev": true,
-      "license": "ISC",
-      "dependencies": {
-        "imurmurhash": "^0.1.4",
-        "is-typedarray": "^1.0.0",
-        "signal-exit": "^3.0.2",
-        "typedarray-to-buffer": "^3.1.5"
-      }
-    },
     "node_modules/ws": {
       "version": "8.9.0",
       "license": "MIT",
@@ -15772,39 +13543,6 @@
         }
       }
     },
-    "node_modules/wscat": {
-      "version": "5.2.0",
-      "dev": true,
-      "license": "MIT",
-      "dependencies": {
-        "commander": "^9.3.0",
-        "https-proxy-agent": "^5.0.0",
-        "read": "^1.0.7",
-        "ws": "^8.0.0"
-      },
-      "bin": {
-        "wscat": "bin/wscat"
-      }
-    },
-    "node_modules/wscat/node_modules/commander": {
-      "version": "9.4.1",
-      "dev": true,
-      "license": "MIT",
-      "engines": {
-        "node": "^12.20.0 || >=14"
-      }
-    },
-    "node_modules/xdg-basedir": {
-      "version": "5.1.0",
-      "dev": true,
-      "license": "MIT",
-      "engines": {
-        "node": ">=12"
-      },
-      "funding": {
-        "url": "https://github.com/sponsors/sindresorhus"
-      }
-    },
     "node_modules/xtend": {
       "version": "4.0.2",
       "dev": true,
@@ -15909,10 +13647,8 @@
         "@types/ws": "^8.5.3",
         "dotenv-cli": "^6.0.0",
         "nodemon": "^2.0.20",
-        "npm-check-updates": "^16.3.3",
         "ts-node": "^10.9.1",
-        "typescript": "^4.8.4",
-        "wscat": "^5.2.0"
+        "typescript": "^4.8.4"
       }
     },
     "server/node_modules/@types/node": {
@@ -17097,10 +14833,6 @@
         }
       }
     },
-    "@gar/promisify": {
-      "version": "1.1.3",
-      "dev": true
-    },
     "@humanwhocodes/config-array": {
       "version": "0.10.7",
       "dev": true,
@@ -17467,119 +15199,9 @@
         "fastq": "^1.6.0"
       }
     },
-    "@npmcli/fs": {
-      "version": "2.1.2",
-      "dev": true,
-      "requires": {
-        "@gar/promisify": "^1.1.3",
-        "semver": "^7.3.5"
-      },
-      "dependencies": {
-        "lru-cache": {
-          "version": "6.0.0",
-          "dev": true,
-          "requires": {
-            "yallist": "^4.0.0"
-          }
-        },
-        "semver": {
-          "version": "7.3.8",
-          "dev": true,
-          "requires": {
-            "lru-cache": "^6.0.0"
-          }
-        }
-      }
-    },
-    "@npmcli/git": {
-      "version": "3.0.2",
-      "dev": true,
-      "requires": {
-        "@npmcli/promise-spawn": "^3.0.0",
-        "lru-cache": "^7.4.4",
-        "mkdirp": "^1.0.4",
-        "npm-pick-manifest": "^7.0.0",
-        "proc-log": "^2.0.0",
-        "promise-inflight": "^1.0.1",
-        "promise-retry": "^2.0.1",
-        "semver": "^7.3.5",
-        "which": "^2.0.2"
-      },
-      "dependencies": {
-        "semver": {
-          "version": "7.3.8",
-          "dev": true,
-          "requires": {
-            "lru-cache": "^6.0.0"
-          },
-          "dependencies": {
-            "lru-cache": {
-              "version": "6.0.0",
-              "dev": true,
-              "requires": {
-                "yallist": "^4.0.0"
-              }
-            }
-          }
-        }
-      }
-    },
-    "@npmcli/installed-package-contents": {
-      "version": "1.0.7",
-      "dev": true,
-      "requires": {
-        "npm-bundled": "^1.1.1",
-        "npm-normalize-package-bin": "^1.0.1"
-      }
-    },
-    "@npmcli/move-file": {
-      "version": "2.0.1",
-      "dev": true,
-      "requires": {
-        "mkdirp": "^1.0.4",
-        "rimraf": "^3.0.2"
-      }
-    },
-    "@npmcli/node-gyp": {
-      "version": "2.0.0",
-      "dev": true
-    },
-    "@npmcli/promise-spawn": {
-      "version": "3.0.0",
-      "dev": true,
-      "requires": {
-        "infer-owner": "^1.0.4"
-      }
-    },
-    "@npmcli/run-script": {
-      "version": "4.2.1",
-      "dev": true,
-      "requires": {
-        "@npmcli/node-gyp": "^2.0.0",
-        "@npmcli/promise-spawn": "^3.0.0",
-        "node-gyp": "^9.0.0",
-        "read-package-json-fast": "^2.0.3",
-        "which": "^2.0.2"
-      }
-    },
     "@phc/format": {
       "version": "1.0.0"
     },
-    "@pnpm/network.ca-file": {
-      "version": "1.0.1",
-      "dev": true,
-      "requires": {
-        "graceful-fs": "4.2.10"
-      }
-    },
-    "@pnpm/npm-conf": {
-      "version": "1.0.5",
-      "dev": true,
-      "requires": {
-        "@pnpm/network.ca-file": "^1.0.1",
-        "config-chain": "^1.1.11"
-      }
-    },
     "@popperjs/core": {
       "version": "2.11.6"
     },
@@ -17727,10 +15349,6 @@
     "@sinclair/typebox": {
       "version": "0.24.46"
     },
-    "@sindresorhus/is": {
-      "version": "5.3.0",
-      "dev": true
-    },
     "@socket.io/component-emitter": {
       "version": "3.1.0"
     },
@@ -17840,13 +15458,6 @@
         "@svgr/plugin-svgo": "^6.5.0"
       }
     },
-    "@szmarczak/http-timer": {
-      "version": "5.0.1",
-      "dev": true,
-      "requires": {
-        "defer-to-connect": "^2.0.1"
-      }
-    },
     "@tanstack/query-core": {
       "version": "4.12.0"
     },
@@ -17962,10 +15573,6 @@
       "version": "14.4.3",
       "requires": {}
     },
-    "@tootallnate/once": {
-      "version": "2.0.0",
-      "dev": true
-    },
     "@trysound/sax": {
       "version": "0.2.0",
       "dev": true
@@ -18070,10 +15677,6 @@
         "hoist-non-react-statics": "^3.3.0"
       }
     },
-    "@types/http-cache-semantics": {
-      "version": "4.0.1",
-      "dev": true
-    },
     "@types/istanbul-lib-coverage": {
       "version": "2.0.4"
     },
@@ -18583,21 +16186,6 @@
         "debug": "4"
       }
     },
-    "agentkeepalive": {
-      "version": "4.2.1",
-      "dev": true,
-      "requires": {
-        "debug": "^4.1.0",
-        "depd": "^1.1.2",
-        "humanize-ms": "^1.2.1"
-      },
-      "dependencies": {
-        "depd": {
-          "version": "1.1.2",
-          "dev": true
-        }
-      }
-    },
     "aggregate-error": {
       "version": "3.1.0",
       "dev": true,
@@ -18644,13 +16232,6 @@
       "dev": true,
       "requires": {}
     },
-    "ansi-align": {
-      "version": "3.0.1",
-      "dev": true,
-      "requires": {
-        "string-width": "^4.1.0"
-      }
-    },
     "ansi-colors": {
       "version": "4.1.3",
       "dev": true
@@ -18697,14 +16278,6 @@
       "version": "2.2.0",
       "dev": true
     },
-    "are-we-there-yet": {
-      "version": "3.0.1",
-      "dev": true,
-      "requires": {
-        "delegates": "^1.0.0",
-        "readable-stream": "^3.6.0"
-      }
-    },
     "arg": {
       "version": "4.1.3",
       "dev": true
@@ -18911,71 +16484,6 @@
       "version": "1.0.0",
       "dev": true
     },
-    "boxen": {
-      "version": "7.0.0",
-      "dev": true,
-      "requires": {
-        "ansi-align": "^3.0.1",
-        "camelcase": "^7.0.0",
-        "chalk": "^5.0.1",
-        "cli-boxes": "^3.0.0",
-        "string-width": "^5.1.2",
-        "type-fest": "^2.13.0",
-        "widest-line": "^4.0.1",
-        "wrap-ansi": "^8.0.1"
-      },
-      "dependencies": {
-        "ansi-regex": {
-          "version": "6.0.1",
-          "dev": true
-        },
-        "ansi-styles": {
-          "version": "6.2.1",
-          "dev": true
-        },
-        "camelcase": {
-          "version": "7.0.0",
-          "dev": true
-        },
-        "chalk": {
-          "version": "5.1.2",
-          "dev": true
-        },
-        "emoji-regex": {
-          "version": "9.2.2",
-          "dev": true
-        },
-        "string-width": {
-          "version": "5.1.2",
-          "dev": true,
-          "requires": {
-            "eastasianwidth": "^0.2.0",
-            "emoji-regex": "^9.2.2",
-            "strip-ansi": "^7.0.1"
-          }
-        },
-        "strip-ansi": {
-          "version": "7.0.1",
-          "dev": true,
-          "requires": {
-            "ansi-regex": "^6.0.1"
-          }
-        },
-        "type-fest": {
-          "version": "2.19.0",
-          "dev": true
-        },
-        "wrap-ansi": {
-          "version": "8.0.1",
-          "dev": true,
-          "requires": {
-            "ansi-styles": "^6.1.0",
-            "string-width": "^5.0.1",
-            "strip-ansi": "^7.0.1"
-          }
-        }
-      }
-    },
     "brace-expansion": {
       "version": "1.1.11",
       "requires": {
@@ -19070,106 +16578,9 @@
       "version": "1.1.2",
       "dev": true
     },
-    "builtins": {
-      "version": "5.0.1",
-      "dev": true,
-      "requires": {
-        "semver": "^7.0.0"
-      },
-      "dependencies": {
-        "lru-cache": {
-          "version": "6.0.0",
-          "dev": true,
-          "requires": {
-            "yallist": "^4.0.0"
-          }
-        },
-        "semver": {
-          "version": "7.3.8",
-          "dev": true,
-          "requires": {
-            "lru-cache": "^6.0.0"
-          }
-        }
-      }
-    },
     "bytes": {
       "version": "3.1.2"
     },
-    "cacache": {
-      "version": "16.1.3",
-      "dev": true,
-      "requires": {
-        "@npmcli/fs": "^2.1.0",
-        "@npmcli/move-file": "^2.0.0",
-        "chownr": "^2.0.0",
-        "fs-minipass": "^2.1.0",
-        "glob": "^8.0.1",
-        "infer-owner": "^1.0.4",
-        "lru-cache": "^7.7.1",
-        "minipass": "^3.1.6",
-        "minipass-collect": "^1.0.2",
-        "minipass-flush": "^1.0.5",
-        "minipass-pipeline": "^1.2.4",
-        "mkdirp": "^1.0.4",
-        "p-map": "^4.0.0",
-        "promise-inflight": "^1.0.1",
-        "rimraf": "^3.0.2",
-        "ssri": "^9.0.0",
-        "tar": "^6.1.11",
-        "unique-filename": "^2.0.0"
-      },
-      "dependencies": {
-        "brace-expansion": {
-          "version": "2.0.1",
-          "dev": true,
-          "requires": {
-            "balanced-match": "^1.0.0"
-          }
-        },
-        "glob": {
-          "version": "8.0.3",
-          "dev": true,
-          "requires": {
-            "fs.realpath": "^1.0.0",
-            "inflight": "^1.0.4",
-            "inherits": "2",
-            "minimatch": "^5.0.1",
-            "once": "^1.3.0"
-          }
-        },
-        "minimatch": {
-          "version": "5.1.0",
-          "dev": true,
-          "requires": {
-            "brace-expansion": "^2.0.1"
-          }
-        }
-      }
-    },
-    "cacheable-lookup": {
-      "version": "7.0.0",
-      "dev": true
-    },
-    "cacheable-request": {
-      "version": "10.2.1",
-      "dev": true,
-      "requires": {
-        "@types/http-cache-semantics": "^4.0.1",
-        "get-stream": "^6.0.1",
-        "http-cache-semantics": "^4.1.0",
-        "keyv": "^4.5.0",
-        "mimic-response": "^4.0.0",
-        "normalize-url": "^7.1.0",
-        "responselike": "^3.0.0"
-      },
-      "dependencies": {
-        "get-stream": {
-          "version": "6.0.1",
-          "dev": true
-        }
-      }
-    },
     "cachedir": {
       "version": "2.3.0",
       "dev": true
@@ -19280,10 +16691,6 @@
       "version": "2.2.0",
       "dev": true
     },
-    "cli-boxes": {
-      "version": "3.0.0",
-      "dev": true
-    },
     "cli-cursor": {
       "version": "3.1.0",
       "dev": true,
@@ -19291,19 +16698,6 @@
         "restore-cursor": "^3.1.0"
       }
     },
-    "cli-table": {
-      "version": "0.3.11",
-      "dev": true,
-      "requires": {
-        "colors": "1.0.3"
-      },
-      "dependencies": {
-        "colors": {
-          "version": "1.0.3",
-          "dev": true
-        }
-      }
-    },
     "cli-table3": {
       "version": "0.6.3",
       "dev": true,
@@ -19522,31 +16916,6 @@
         }
       }
     },
-    "config-chain": {
-      "version": "1.1.13",
-      "dev": true,
-      "requires": {
-        "ini": "^1.3.4",
-        "proto-list": "~1.2.1"
-      },
-      "dependencies": {
-        "ini": {
-          "version": "1.3.8",
-          "dev": true
-        }
-      }
-    },
-    "configstore": {
-      "version": "6.0.0",
-      "dev": true,
-      "requires": {
-        "dot-prop": "^6.0.1",
-        "graceful-fs": "^4.2.6",
-        "unique-string": "^3.0.0",
-        "write-file-atomic": "^3.0.3",
-        "xdg-basedir": "^5.0.1"
-      }
-    },
     "connect-redis": {
       "version": "6.1.3"
     },
@@ -19630,19 +16999,6 @@
         "which": "^2.0.1"
       }
     },
-    "crypto-random-string": {
-      "version": "4.0.0",
-      "dev": true,
-      "requires": {
-        "type-fest": "^1.0.1"
-      },
-      "dependencies": {
-        "type-fest": {
-          "version": "1.4.0",
-          "dev": true
-        }
-      }
-    },
     "css-select": {
       "version": "5.1.0",
       "dev": true,
@@ -19823,23 +17179,6 @@
         "ms": "2.1.2"
       }
     },
-    "decompress-response": {
-      "version": "6.0.0",
-      "dev": true,
-      "requires": {
-        "mimic-response": "^3.1.0"
-      },
-      "dependencies": {
-        "mimic-response": {
-          "version": "3.1.0",
-          "dev": true
-        }
-      }
-    },
-    "deep-extend": {
-      "version": "0.6.0",
-      "dev": true
-    },
     "deep-is": {
       "version": "0.1.4",
       "dev": true
@@ -19848,10 +17187,6 @@
       "version": "4.2.2",
       "dev": true
     },
-    "defer-to-connect": {
-      "version": "2.0.1",
-      "dev": true
-    },
     "define-properties": {
       "version": "1.1.4",
       "dev": true,
@@ -19935,13 +17270,6 @@
         "domhandler": "^5.0.1"
       }
     },
-    "dot-prop": {
-      "version": "6.0.1",
-      "dev": true,
-      "requires": {
-        "is-obj": "^2.0.0"
-      }
-    },
     "dotenv": {
       "version": "16.0.3"
     },
@@ -20035,6 +17363,7 @@
     "encoding": {
       "version": "0.1.13",
       "optional": true,
+      "peer": true,
       "requires": {
         "iconv-lite": "^0.6.2"
       },
@@ -20042,6 +17371,7 @@
         "iconv-lite": {
           "version": "0.6.3",
           "optional": true,
+          "peer": true,
           "requires": {
             "safer-buffer": ">= 2.1.2 < 3.0.0"
           }
@@ -20105,18 +17435,10 @@
     "env": {
       "version": "0.0.2"
     },
-    "env-paths": {
-      "version": "2.2.1",
-      "dev": true
-    },
     "eol": {
       "version": "0.9.1",
       "dev": true
     },
-    "err-code": {
-      "version": "2.0.3",
-      "dev": true
-    },
     "error-ex": {
       "version": "1.3.2",
       "requires": {
@@ -20209,10 +17531,6 @@
     "escalade": {
       "version": "3.1.1"
     },
-    "escape-goat": {
-      "version": "4.0.0",
-      "dev": true
-    },
     "escape-html": {
       "version": "1.0.3"
     },
@@ -20640,10 +17958,6 @@
       "version": "2.0.6",
       "dev": true
     },
-    "fast-memoize": {
-      "version": "2.5.2",
-      "dev": true
-    },
     "fastq": {
       "version": "1.13.0",
       "dev": true,
@@ -20817,17 +18131,9 @@
         "mime-types": "^2.1.12"
       }
     },
-    "form-data-encoder": {
-      "version": "2.1.3",
-      "dev": true
-    },
     "forwarded": {
       "version": "0.2.0"
     },
-    "fp-and-or": {
-      "version": "0.1.3",
-      "dev": true
-    },
     "framer-motion": {
       "version": "7.5.3",
       "requires": {
@@ -20996,20 +18302,6 @@
       "version": "1.2.3",
       "dev": true
     },
-    "gauge": {
-      "version": "4.0.4",
-      "dev": true,
-      "requires": {
-        "aproba": "^1.0.3 || ^2.0.0",
-        "color-support": "^1.1.3",
-        "console-control-strings": "^1.1.0",
-        "has-unicode": "^2.0.1",
-        "signal-exit": "^3.0.7",
-        "string-width": "^4.2.3",
-        "strip-ansi": "^6.0.1",
-        "wide-align": "^1.1.5"
-      }
-    },
     "generic-pool": {
       "version": "3.8.2"
     },
@@ -21028,10 +18320,6 @@
         "has-symbols": "^1.0.3"
       }
     },
-    "get-stdin": {
-      "version": "8.0.0",
-      "dev": true
-    },
     "get-stream": {
       "version": "5.2.0",
       "dev": true,
@@ -21162,29 +18450,6 @@
         "slash": "^3.0.0"
       }
     },
-    "got": {
-      "version": "12.5.2",
-      "dev": true,
-      "requires": {
-        "@sindresorhus/is": "^5.2.0",
-        "@szmarczak/http-timer": "^5.0.1",
-        "cacheable-lookup": "^7.0.0",
-        "cacheable-request": "^10.2.1",
-        "decompress-response": "^6.0.0",
-        "form-data-encoder": "^2.1.2",
-        "get-stream": "^6.0.1",
-        "http2-wrapper": "^2.1.10",
-        "lowercase-keys": "^3.0.0",
-        "p-cancelable": "^3.0.0",
-        "responselike": "^3.0.0"
-      },
-      "dependencies": {
-        "get-stream": {
-          "version": "6.0.1",
-          "dev": true
-        }
-      }
-    },
     "graceful-fs": {
       "version": "4.2.10"
     },
@@ -21266,10 +18531,6 @@
     "has-unicode": {
       "version": "2.0.1"
     },
-    "has-yarn": {
-      "version": "3.0.0",
-      "dev": true
-    },
     "he": {
       "version": "1.2.0",
       "dev": true
@@ -21325,13 +18586,6 @@
         }
       }
     },
-    "hosted-git-info": {
-      "version": "5.1.0",
-      "dev": true,
-      "requires": {
-        "lru-cache": "^7.5.1"
-      }
-    },
     "html-entities": {
       "version": "2.3.3",
       "dev": true
@@ -21352,10 +18606,6 @@
         "entities": "^4.3.0"
       }
     },
-    "http-cache-semantics": {
-      "version": "4.1.0",
-      "dev": true
-    },
     "http-errors": {
       "version": "2.0.0",
       "requires": {
@@ -21366,15 +18616,6 @@
         "toidentifier": "1.0.1"
       }
     },
-    "http-proxy-agent": {
-      "version": "5.0.0",
-      "dev": true,
-      "requires": {
-        "@tootallnate/once": "2",
-        "agent-base": "6",
-        "debug": "4"
-      }
-    },
     "http-signature": {
       "version": "1.3.6",
       "dev": true,
@@ -21384,14 +18625,6 @@
         "sshpk": "^1.14.1"
       }
     },
-    "http2-wrapper": {
-      "version": "2.1.11",
-      "dev": true,
-      "requires": {
-        "quick-lru": "^5.1.1",
-        "resolve-alpn": "^1.2.0"
-      }
-    },
     "https-proxy-agent": {
       "version": "5.0.1",
       "requires": {
@@ -21403,13 +18636,6 @@
       "version": "1.1.1",
       "dev": true
     },
-    "humanize-ms": {
-      "version": "1.2.1",
-      "dev": true,
-      "requires": {
-        "ms": "^2.0.0"
-      }
-    },
     "i18next": {
       "version": "21.10.0",
       "requires": {
@@ -21473,29 +18699,6 @@
       "version": "1.0.1",
       "dev": true
     },
-    "ignore-walk": {
-      "version": "5.0.1",
-      "dev": true,
-      "requires": {
-        "minimatch": "^5.0.1"
-      },
-      "dependencies": {
-        "brace-expansion": {
-          "version": "2.0.1",
-          "dev": true,
-          "requires": {
-            "balanced-match": "^1.0.0"
-          }
-        },
-        "minimatch": {
-          "version": "5.1.0",
-          "dev": true,
-          "requires": {
-            "brace-expansion": "^2.0.1"
-          }
-        }
-      }
-    },
     "immer": {
       "version": "9.0.15"
     },
@@ -21510,10 +18713,6 @@
         "resolve-from": "^4.0.0"
       }
     },
-    "import-lazy": {
-      "version": "4.0.0",
-      "dev": true
-    },
     "imurmurhash": {
       "version": "0.1.4",
       "dev": true
@@ -21521,10 +18720,6 @@
     "indent-string": {
       "version": "4.0.0"
     },
-    "infer-owner": {
-      "version": "1.0.4",
-      "dev": true
-    },
     "inflight": {
       "version": "1.0.6",
       "requires": {
@@ -21554,10 +18749,6 @@
         "loose-envify": "^1.0.0"
       }
     },
-    "ip": {
-      "version": "2.0.0",
-      "dev": true
-    },
     "ipaddr.js": {
       "version": "1.9.1"
     },
@@ -21645,10 +18836,6 @@
         "is-path-inside": "^3.0.2"
       }
     },
-    "is-lambda": {
-      "version": "1.0.1",
-      "dev": true
-    },
     "is-negated-glob": {
       "version": "1.0.0",
       "dev": true
@@ -21657,10 +18844,6 @@
       "version": "2.0.2",
       "dev": true
     },
-    "is-npm": {
-      "version": "6.0.0",
-      "dev": true
-    },
     "is-number": {
       "version": "7.0.0"
     },
@@ -21671,10 +18854,6 @@
         "has-tostringtag": "^1.0.0"
       }
     },
-    "is-obj": {
-      "version": "2.0.0",
-      "dev": true
-    },
     "is-path-inside": {
       "version": "3.0.3",
       "dev": true
@@ -21764,10 +18943,6 @@
       "version": "1.0.2",
       "dev": true
     },
-    "is-yarn-global": {
-      "version": "0.4.0",
-      "dev": true
-    },
     "isarray": {
       "version": "1.0.0",
       "dev": true
@@ -21904,15 +19079,13 @@
         "jose": "^4.10.0",
         "loglevel": "^1.8.0",
         "nodemon": "^2.0.20",
-        "npm-check-updates": "^16.3.3",
         "reflect-metadata": "^0.1.13",
         "rxjs": "^7.5.7",
         "ts-node": "^10.9.1",
         "typedi": "^0.10.0",
         "typescript": "^4.8.4",
         "whatwg-url": "^11.0.0",
-        "ws": "^8.9.0",
-        "wscat": "^5.2.0"
+        "ws": "^8.9.0"
       },
       "dependencies": {
         "@types/node": {
@@ -22163,10 +19336,6 @@
         }
       }
     },
-    "jju": {
-      "version": "1.4.0",
-      "dev": true
-    },
     "jose": {
       "version": "4.10.0"
     },
@@ -22191,20 +19360,9 @@
     "jsesc": {
       "version": "2.5.2"
     },
-    "json-buffer": {
-      "version": "3.0.1",
-      "dev": true
-    },
     "json-parse-even-better-errors": {
       "version": "2.3.1"
     },
-    "json-parse-helpfulerror": {
-      "version": "1.0.3",
-      "dev": true,
-      "requires": {
-        "jju": "^1.1.0"
-      }
-    },
     "json-schema": {
       "version": "0.4.0",
       "dev": true
@@ -22232,14 +19390,6 @@
         "universalify": "^2.0.0"
       }
     },
-    "jsonlines": {
-      "version": "0.1.1",
-      "dev": true
-    },
-    "jsonparse": {
-      "version": "1.3.1",
-      "dev": true
-    },
     "jsprim": {
       "version": "2.0.2",
       "dev": true,
@@ -22258,24 +19408,6 @@
         "object.assign": "^4.1.3"
       }
     },
-    "keyv": {
-      "version": "4.5.0",
-      "dev": true,
-      "requires": {
-        "json-buffer": "3.0.1"
-      }
-    },
-    "kleur": {
-      "version": "4.1.5",
-      "dev": true
-    },
-    "latest-version": {
-      "version": "7.0.0",
-      "dev": true,
-      "requires": {
-        "package-json": "^8.1.0"
-      }
-    },
     "lazy-ass": {
       "version": "1.6.0",
       "dev": true
@@ -22684,17 +19816,9 @@
         "js-tokens": "^3.0.0 || ^4.0.0"
       }
     },
-    "lowercase-keys": {
-      "version": "3.0.0",
-      "dev": true
-    },
     "lru_map": {
       "version": "0.3.3"
     },
-    "lru-cache": {
-      "version": "7.14.0",
-      "dev": true
-    },
     "lz-string": {
       "version": "1.4.4"
     },
@@ -22715,28 +19839,6 @@
       "version": "1.3.6",
       "dev": true
     },
-    "make-fetch-happen": {
-      "version": "10.2.1",
-      "dev": true,
-      "requires": {
-        "agentkeepalive": "^4.2.1",
-        "cacache": "^16.1.0",
-        "http-cache-semantics": "^4.1.0",
-        "http-proxy-agent": "^5.0.0",
-        "https-proxy-agent": "^5.0.0",
-        "is-lambda": "^1.0.1",
-        "lru-cache": "^7.7.1",
-        "minipass": "^3.1.6",
-        "minipass-collect": "^1.0.2",
-        "minipass-fetch": "^2.0.3",
-        "minipass-flush": "^1.0.5",
-        "minipass-pipeline": "^1.2.4",
-        "negotiator": "^0.6.3",
-        "promise-retry": "^2.0.1",
-        "socks-proxy-agent": "^7.0.0",
-        "ssri": "^9.0.0"
-      }
-    },
     "matcher-collection": {
       "version": "2.0.1",
       "dev": true,
@@ -22796,10 +19898,6 @@
       "version": "2.1.0",
       "dev": true
     },
-    "mimic-response": {
-      "version": "4.0.0",
-      "dev": true
-    },
     "min-indent": {
       "version": "1.0.1"
     },
@@ -22819,52 +19917,6 @@
         "yallist": "^4.0.0"
       }
     },
-    "minipass-collect": {
-      "version": "1.0.2",
-      "dev": true,
-      "requires": {
-        "minipass": "^3.0.0"
-      }
-    },
-    "minipass-fetch": {
-      "version": "2.1.2",
-      "dev": true,
-      "requires": {
-        "encoding": "^0.1.13",
-        "minipass": "^3.1.6",
-        "minipass-sized": "^1.0.3",
-        "minizlib": "^2.1.2"
-      }
-    },
-    "minipass-flush": {
-      "version": "1.0.5",
-      "dev": true,
-      "requires": {
-        "minipass": "^3.0.0"
-      }
-    },
-    "minipass-json-stream": {
-      "version": "1.0.1",
-      "dev": true,
-      "requires": {
-        "jsonparse": "^1.3.1",
-        "minipass": "^3.0.0"
-      }
-    },
-    "minipass-pipeline": {
-      "version": "1.2.4",
-      "dev": true,
-      "requires": {
-        "minipass": "^3.0.0"
-      }
-    },
-    "minipass-sized": {
-      "version": "1.0.3",
-      "dev": true,
-      "requires": {
-        "minipass": "^3.0.0"
-      }
-    },
     "minizlib": {
       "version": "2.1.2",
       "requires": {
@@ -22882,10 +19934,6 @@
     "ms": {
       "version": "2.1.2"
     },
-    "mute-stream": {
-      "version": "0.0.8",
-      "dev": true
-    },
     "nanoid": {
       "version": "3.3.4",
       "dev": true
@@ -22926,38 +19974,6 @@
         }
       }
     },
-    "node-gyp": {
-      "version": "9.3.0",
-      "dev": true,
-      "requires": {
-        "env-paths": "^2.2.0",
-        "glob": "^7.1.4",
-        "graceful-fs": "^4.2.6",
-        "make-fetch-happen": "^10.0.3",
-        "nopt": "^6.0.0",
-        "npmlog": "^6.0.0",
-        "rimraf": "^3.0.2",
-        "semver": "^7.3.5",
-        "tar": "^6.1.2",
-        "which": "^2.0.2"
-      },
-      "dependencies": {
-        "lru-cache": {
-          "version": "6.0.0",
-          "dev": true,
-          "requires": {
-            "yallist": "^4.0.0"
-          }
-        },
-        "semver": {
-          "version": "7.3.8",
-          "dev": true,
-          "requires": {
-            "lru-cache": "^6.0.0"
-          }
-        }
-      }
-    },
     "node-releases": {
       "version": "2.0.6"
     },
@@ -22990,47 +20006,10 @@
         }
       }
     },
-    "nopt": {
-      "version": "6.0.0",
-      "dev": true,
-      "requires": {
-        "abbrev": "^1.0.0"
-      }
-    },
-    "normalize-package-data": {
-      "version": "4.0.1",
-      "dev": true,
-      "requires": {
-        "hosted-git-info": "^5.0.0",
-        "is-core-module": "^2.8.1",
-        "semver": "^7.3.5",
-        "validate-npm-package-license": "^3.0.4"
-      },
-      "dependencies": {
-        "lru-cache": {
-          "version": "6.0.0",
-          "dev": true,
-          "requires": {
-            "yallist": "^4.0.0"
-          }
-        },
-        "semver": {
-          "version": "7.3.8",
-          "dev": true,
-          "requires": {
-            "lru-cache": "^6.0.0"
-          }
-        }
-      }
-    },
     "normalize-path": {
       "version": "3.0.0",
       "dev": true
     },
-    "normalize-url": {
-      "version": "7.2.0",
-      "dev": true
-    },
     "now-and-later": {
       "version": "2.0.1",
       "dev": true,
@@ -23038,233 +20017,6 @@
         "once": "^1.3.2"
       }
     },
-    "npm-bundled": {
-      "version": "1.1.2",
-      "dev": true,
-      "requires": {
-        "npm-normalize-package-bin": "^1.0.1"
-      }
-    },
-    "npm-check-updates": {
-      "version": "16.3.11",
-      "dev": true,
-      "requires": {
-        "chalk": "^5.0.1",
-        "cli-table": "^0.3.11",
-        "commander": "^9.4.1",
-        "fast-memoize": "^2.5.2",
-        "find-up": "5.0.0",
-        "fp-and-or": "^0.1.3",
-        "get-stdin": "^8.0.0",
-        "globby": "^11.0.4",
-        "hosted-git-info": "^5.1.0",
-        "json-parse-helpfulerror": "^1.0.3",
-        "jsonlines": "^0.1.1",
-        "lodash": "^4.17.21",
-        "minimatch": "^5.1.0",
-        "p-map": "^4.0.0",
-        "pacote": "^13.6.2",
-        "parse-github-url": "^1.0.2",
-        "progress": "^2.0.3",
-        "prompts-ncu": "^2.5.1",
-        "rc-config-loader": "^4.1.0",
-        "remote-git-tags": "^3.0.0",
-        "rimraf": "^3.0.2",
-        "semver": "^7.3.7",
-        "semver-utils": "^1.1.4",
-        "source-map-support": "^0.5.21",
-        "spawn-please": "^1.0.0",
-        "untildify": "^4.0.0",
-        "update-notifier": "^6.0.2",
-        "yaml": "^2.1.1"
-      },
-      "dependencies": {
-        "brace-expansion": {
-          "version": "2.0.1",
-          "dev": true,
-          "requires": {
-            "balanced-match": "^1.0.0"
-          }
-        },
-        "chalk": {
-          "version": "5.1.2",
-          "dev": true
-        },
-        "commander": {
-          "version": "9.4.1",
-          "dev": true
-        },
-        "lru-cache": {
-          "version": "6.0.0",
-          "dev": true,
-          "requires": {
-            "yallist": "^4.0.0"
-          }
-        },
-        "minimatch": {
-          "version": "5.1.0",
-          "dev": true,
-          "requires": {
-            "brace-expansion": "^2.0.1"
-          }
-        },
-        "semver": {
-          "version": "7.3.8",
-          "dev": true,
-          "requires": {
-            "lru-cache": "^6.0.0"
-          }
-        },
-        "yaml": {
-          "version": "2.1.3",
-          "dev": true
-        }
-      }
-    },
-    "npm-install-checks": {
-      "version": "5.0.0",
-      "dev": true,
-      "requires": {
-        "semver": "^7.1.1"
-      },
-      "dependencies": {
-        "lru-cache": {
-          "version": "6.0.0",
-          "dev": true,
-          "requires": {
-            "yallist": "^4.0.0"
-          }
-        },
-        "semver": {
-          "version": "7.3.8",
-          "dev": true,
-          "requires": {
-            "lru-cache": "^6.0.0"
-          }
-        }
-      }
-    },
-    "npm-normalize-package-bin": {
-      "version": "1.0.1",
-      "dev": true
-    },
-    "npm-package-arg": {
-      "version": "9.1.2",
-      "dev": true,
-      "requires": {
-        "hosted-git-info": "^5.0.0",
-        "proc-log": "^2.0.1",
-        "semver": "^7.3.5",
-        "validate-npm-package-name": "^4.0.0"
-      },
-      "dependencies": {
-        "lru-cache": {
-          "version": "6.0.0",
-          "dev": true,
-          "requires": {
-            "yallist": "^4.0.0"
-          }
-        },
-        "semver": {
-          "version": "7.3.8",
-          "dev": true,
-          "requires": {
-            "lru-cache": "^6.0.0"
-          }
-        }
-      }
-    },
-    "npm-packlist": {
-      "version": "5.1.3",
-      "dev": true,
-      "requires": {
-        "glob": "^8.0.1",
-        "ignore-walk": "^5.0.1",
-        "npm-bundled": "^2.0.0",
-        "npm-normalize-package-bin": "^2.0.0"
-      },
-      "dependencies": {
-        "brace-expansion": {
-          "version": "2.0.1",
-          "dev": true,
-          "requires": {
-            "balanced-match": "^1.0.0"
-          }
-        },
-        "glob": {
-          "version": "8.0.3",
-          "dev": true,
-          "requires": {
-            "fs.realpath": "^1.0.0",
-            "inflight": "^1.0.4",
-            "inherits": "2",
-            "minimatch": "^5.0.1",
-            "once": "^1.3.0"
-          }
-        },
-        "minimatch": {
-          "version": "5.1.0",
-          "dev": true,
-          "requires": {
-            "brace-expansion": "^2.0.1"
-          }
-        },
-        "npm-bundled": {
-          "version": "2.0.1",
-          "dev": true,
-          "requires": {
-            "npm-normalize-package-bin": "^2.0.0"
-          }
-        },
-        "npm-normalize-package-bin": {
-          "version": "2.0.0",
-          "dev": true
-        }
-      }
-    },
-    "npm-pick-manifest": {
-      "version": "7.0.2",
-      "dev": true,
-      "requires": {
-        "npm-install-checks": "^5.0.0",
-        "npm-normalize-package-bin": "^2.0.0",
-        "npm-package-arg": "^9.0.0",
-        "semver": "^7.3.5"
-      },
-      "dependencies": {
-        "lru-cache": {
-          "version": "6.0.0",
-          "dev": true,
-          "requires": {
-            "yallist": "^4.0.0"
-          }
-        },
-        "npm-normalize-package-bin": {
-          "version": "2.0.0",
-          "dev": true
-        },
-        "semver": {
-          "version": "7.3.8",
-          "dev": true,
-          "requires": {
-            "lru-cache": "^6.0.0"
-          }
-        }
-      }
-    },
-    "npm-registry-fetch": {
-      "version": "13.3.1",
-      "dev": true,
-      "requires": {
-        "make-fetch-happen": "^10.0.6",
-        "minipass": "^3.1.6",
-        "minipass-fetch": "^2.0.3",
-        "minipass-json-stream": "^1.0.1",
-        "minizlib": "^2.1.2",
-        "npm-package-arg": "^9.0.1",
-        "proc-log": "^2.0.0"
-      }
-    },
     "npm-run-path": {
       "version": "4.0.1",
       "dev": true,
@@ -23272,16 +20024,6 @@
         "path-key": "^3.0.0"
       }
     },
-    "npmlog": {
-      "version": "6.0.2",
-      "dev": true,
-      "requires": {
-        "are-we-there-yet": "^3.0.0",
-        "console-control-strings": "^1.1.0",
-        "gauge": "^4.0.3",
-        "set-blocking": "^2.0.0"
-      }
-    },
     "nth-check": {
       "version": "2.1.1",
       "dev": true,
@@ -23415,10 +20157,6 @@
       "version": "1.2.2",
       "dev": true
     },
-    "p-cancelable": {
-      "version": "3.0.0",
-      "dev": true
-    },
     "p-limit": {
       "version": "3.1.0",
       "dev": true,
@@ -23440,69 +20178,12 @@
         "aggregate-error": "^3.0.0"
       }
     },
-    "package-json": {
-      "version": "8.1.0",
-      "dev": true,
-      "requires": {
-        "got": "^12.1.0",
-        "registry-auth-token": "^5.0.1",
-        "registry-url": "^6.0.0",
-        "semver": "^7.3.7"
-      },
-      "dependencies": {
-        "lru-cache": {
-          "version": "6.0.0",
-          "dev": true,
-          "requires": {
-            "yallist": "^4.0.0"
-          }
-        },
-        "semver": {
-          "version": "7.3.8",
-          "dev": true,
-          "requires": {
-            "lru-cache": "^6.0.0"
-          }
-        }
-      }
-    },
-    "pacote": {
-      "version": "13.6.2",
-      "dev": true,
-      "requires": {
-        "@npmcli/git": "^3.0.0",
-        "@npmcli/installed-package-contents": "^1.0.7",
-        "@npmcli/promise-spawn": "^3.0.0",
-        "@npmcli/run-script": "^4.1.0",
-        "cacache": "^16.0.0",
-        "chownr": "^2.0.0",
-        "fs-minipass": "^2.1.0",
-        "infer-owner": "^1.0.4",
-        "minipass": "^3.1.6",
-        "mkdirp": "^1.0.4",
-        "npm-package-arg": "^9.0.0",
-        "npm-packlist": "^5.1.0",
-        "npm-pick-manifest": "^7.0.0",
-        "npm-registry-fetch": "^13.0.1",
-        "proc-log": "^2.0.0",
-        "promise-retry": "^2.0.1",
-        "read-package-json": "^5.0.0",
-        "read-package-json-fast": "^2.0.3",
-        "rimraf": "^3.0.2",
-        "ssri": "^9.0.0",
-        "tar": "^6.1.11"
-      }
-    },
     "parent-module": {
       "version": "1.0.1",
       "requires": {
         "callsites": "^3.0.0"
       }
     },
-    "parse-github-url": {
-      "version": "1.0.2",
-      "dev": true
-    },
     "parse-json": {
       "version": "5.2.0",
       "requires": {
@@ -23664,10 +20345,6 @@
         }
       }
     },
-    "proc-log": {
-      "version": "2.0.1",
-      "dev": true
-    },
     "process": {
       "version": "0.11.10"
     },
@@ -23675,34 +20352,10 @@
       "version": "2.0.1",
       "dev": true
     },
-    "progress": {
-      "version": "2.0.3",
-      "dev": true
-    },
-    "promise-inflight": {
-      "version": "1.0.1",
-      "dev": true
-    },
     "promise-map-series": {
       "version": "0.3.0",
       "dev": true
     },
-    "promise-retry": {
-      "version": "2.0.1",
-      "dev": true,
-      "requires": {
-        "err-code": "^2.0.2",
-        "retry": "^0.12.0"
-      }
-    },
-    "prompts-ncu": {
-      "version": "2.5.1",
-      "dev": true,
-      "requires": {
-        "kleur": "^4.0.1",
-        "sisteransi": "^1.0.5"
-      }
-    },
     "prop-types": {
       "version": "15.8.1",
       "requires": {
@@ -23716,10 +20369,6 @@
         }
       }
     },
-    "proto-list": {
-      "version": "1.2.4",
-      "dev": true
-    },
     "proxy-addr": {
       "version": "2.0.7",
       "requires": {
@@ -23769,13 +20418,6 @@
     "punycode": {
       "version": "2.1.1"
     },
-    "pupa": {
-      "version": "3.1.0",
-      "dev": true,
-      "requires": {
-        "escape-goat": "^4.0.0"
-      }
-    },
     "qrcode.react": {
       "version": "3.1.0",
       "requires": {}
@@ -23794,10 +20436,6 @@
       "version": "1.0.1",
       "dev": true
     },
-    "quick-lru": {
-      "version": "5.1.1",
-      "dev": true
-    },
     "quick-temp": {
       "version": "0.1.8",
       "dev": true,
@@ -23846,36 +20484,6 @@
         "schema-utils": "^3.0.0"
       }
     },
-    "rc": {
-      "version": "1.2.8",
-      "dev": true,
-      "requires": {
-        "deep-extend": "^0.6.0",
-        "ini": "~1.3.0",
-        "minimist": "^1.2.0",
-        "strip-json-comments": "~2.0.1"
-      },
-      "dependencies": {
-        "ini": {
-          "version": "1.3.8",
-          "dev": true
-        },
-        "strip-json-comments": {
-          "version": "2.0.1",
-          "dev": true
-        }
-      }
-    },
-    "rc-config-loader": {
-      "version": "4.1.0",
-      "dev": true,
-      "requires": {
-        "debug": "^4.1.1",
-        "js-yaml": "^4.0.0",
-        "json5": "^2.1.2",
-        "require-from-string": "^2.0.2"
-      }
-    },
     "react": {
       "version": "18.2.0",
       "requires": {
@@ -23982,62 +20590,6 @@
         "react-is": "^17.0.1 || ^18.0.0"
       }
     },
-    "read": {
-      "version": "1.0.7",
-      "dev": true,
-      "requires": {
-        "mute-stream": "~0.0.4"
-      }
-    },
-    "read-package-json": {
-      "version": "5.0.2",
-      "dev": true,
-      "requires": {
-        "glob": "^8.0.1",
-        "json-parse-even-better-errors": "^2.3.1",
-        "normalize-package-data": "^4.0.0",
-        "npm-normalize-package-bin": "^2.0.0"
-      },
-      "dependencies": {
-        "brace-expansion": {
-          "version": "2.0.1",
-          "dev": true,
-          "requires": {
-            "balanced-match": "^1.0.0"
-          }
-        },
-        "glob": {
-          "version": "8.0.3",
-          "dev": true,
-          "requires": {
-            "fs.realpath": "^1.0.0",
-            "inflight": "^1.0.4",
-            "inherits": "2",
-            "minimatch": "^5.0.1",
-            "once": "^1.3.0"
-          }
-        },
-        "minimatch": {
-          "version": "5.1.0",
-          "dev": true,
-          "requires": {
-            "brace-expansion": "^2.0.1"
-          }
-        },
-        "npm-normalize-package-bin": {
-          "version": "2.0.0",
-          "dev": true
-        }
-      }
-    },
-    "read-package-json-fast": {
-      "version": "2.0.3",
-      "dev": true,
-      "requires": {
-        "json-parse-even-better-errors": "^2.3.0",
-        "npm-normalize-package-bin": "^1.0.1"
-      }
-    },
     "readable-stream": {
       "version": "3.6.0",
       "requires": {
@@ -24136,20 +20688,6 @@
         "unicode-match-property-value-ecmascript": "^2.0.0"
       }
     },
-    "registry-auth-token": {
-      "version": "5.0.1",
-      "dev": true,
-      "requires": {
-        "@pnpm/npm-conf": "^1.0.4"
-      }
-    },
-    "registry-url": {
-      "version": "6.0.1",
-      "dev": true,
-      "requires": {
-        "rc": "1.2.8"
-      }
-    },
     "regjsgen": {
       "version": "0.7.1",
       "dev": true
@@ -24167,10 +20705,6 @@
         }
       }
     },
-    "remote-git-tags": {
-      "version": "3.0.0",
-      "dev": true
-    },
     "remove-bom-buffer": {
       "version": "3.0.0",
       "dev": true,
@@ -24256,10 +20790,6 @@
         "supports-preserve-symlinks-flag": "^1.0.0"
       }
     },
-    "resolve-alpn": {
-      "version": "1.2.1",
-      "dev": true
-    },
     "resolve-from": {
       "version": "4.0.0"
     },
@@ -24270,13 +20800,6 @@
         "value-or-function": "^3.0.0"
       }
     },
-    "responselike": {
-      "version": "3.0.0",
-      "dev": true,
-      "requires": {
-        "lowercase-keys": "^3.0.0"
-      }
-    },
     "restore-cursor": {
       "version": "3.1.0",
       "dev": true,
@@ -24285,10 +20808,6 @@
         "signal-exit": "^3.0.2"
       }
     },
-    "retry": {
-      "version": "0.12.0",
-      "dev": true
-    },
     "reusify": {
       "version": "1.0.4",
       "dev": true
@@ -24384,33 +20903,6 @@
     "semver": {
       "version": "6.3.0"
     },
-    "semver-diff": {
-      "version": "4.0.0",
-      "dev": true,
-      "requires": {
-        "semver": "^7.3.5"
-      },
-      "dependencies": {
-        "lru-cache": {
-          "version": "6.0.0",
-          "dev": true,
-          "requires": {
-            "yallist": "^4.0.0"
-          }
-        },
-        "semver": {
-          "version": "7.3.8",
-          "dev": true,
-          "requires": {
-            "lru-cache": "^6.0.0"
-          }
-        }
-      }
-    },
-    "semver-utils": {
-      "version": "1.1.4",
-      "dev": true
-    },
     "send": {
       "version": "0.18.0",
       "requires": {
@@ -24506,10 +20998,6 @@
         }
       }
     },
-    "sisteransi": {
-      "version": "1.0.5",
-      "dev": true
-    },
     "slash": {
       "version": "3.0.0"
     },
@@ -24527,10 +21015,6 @@
         }
       }
     },
-    "smart-buffer": {
-      "version": "4.2.0",
-      "dev": true
-    },
     "socket.io": {
       "version": "4.5.2",
       "requires": {
@@ -24552,23 +21036,6 @@
         "debug": "~4.3.1"
       }
     },
-    "socks": {
-      "version": "2.7.1",
-      "dev": true,
-      "requires": {
-        "ip": "^2.0.0",
-        "smart-buffer": "^4.2.0"
-      }
-    },
-    "socks-proxy-agent": {
-      "version": "7.0.0",
-      "dev": true,
-      "requires": {
-        "agent-base": "^6.0.2",
-        "debug": "^4.3.3",
-        "socks": "^2.6.2"
-      }
-    },
     "sort-keys": {
       "version": "5.0.0",
       "dev": true,
@@ -24605,34 +21072,6 @@
       "version": "0.0.2-1",
       "dev": true
     },
-    "spawn-please": {
-      "version": "1.0.0",
-      "dev": true
-    },
-    "spdx-correct": {
-      "version": "3.1.1",
-      "dev": true,
-      "requires": {
-        "spdx-expression-parse": "^3.0.0",
-        "spdx-license-ids": "^3.0.0"
-      }
-    },
-    "spdx-exceptions": {
-      "version": "2.3.0",
-      "dev": true
-    },
-    "spdx-expression-parse": {
-      "version": "3.0.1",
-      "dev": true,
-      "requires": {
-        "spdx-exceptions": "^2.1.0",
-        "spdx-license-ids": "^3.0.0"
-      }
-    },
-    "spdx-license-ids": {
-      "version": "3.0.12",
-      "dev": true
-    },
     "sprintf-js": {
       "version": "1.1.2",
       "dev": true
@@ -24652,13 +21091,6 @@
         "tweetnacl": "~0.14.0"
       }
     },
-    "ssri": {
-      "version": "9.0.1",
-      "dev": true,
-      "requires": {
-        "minipass": "^3.1.1"
-      }
-    },
     "stable": {
       "version": "0.1.8",
       "dev": true
@@ -25169,13 +21601,6 @@
       "version": "0.0.6",
       "dev": true
     },
-    "typedarray-to-buffer": {
-      "version": "3.1.5",
-      "dev": true,
-      "requires": {
-        "is-typedarray": "^1.0.0"
-      }
-    },
     "typedi": {
       "version": "0.10.0"
     },
@@ -25234,20 +21659,6 @@
       "version": "2.1.0",
       "dev": true
     },
-    "unique-filename": {
-      "version": "2.0.1",
-      "dev": true,
-      "requires": {
-        "unique-slug": "^3.0.0"
-      }
-    },
-    "unique-slug": {
-      "version": "3.0.0",
-      "dev": true,
-      "requires": {
-        "imurmurhash": "^0.1.4"
-      }
-    },
     "unique-stream": {
       "version": "2.3.1",
       "dev": true,
@@ -25256,13 +21667,6 @@
         "through2-filter": "^3.0.0"
       }
     },
-    "unique-string": {
-      "version": "3.0.0",
-      "dev": true,
-      "requires": {
-        "crypto-random-string": "^4.0.0"
-      }
-    },
     "universalify": {
       "version": "2.0.0",
       "dev": true
@@ -25281,46 +21685,6 @@
         "picocolors": "^1.0.0"
       }
     },
-    "update-notifier": {
-      "version": "6.0.2",
-      "dev": true,
-      "requires": {
-        "boxen": "^7.0.0",
-        "chalk": "^5.0.1",
-        "configstore": "^6.0.0",
-        "has-yarn": "^3.0.0",
-        "import-lazy": "^4.0.0",
-        "is-ci": "^3.0.1",
-        "is-installed-globally": "^0.4.0",
-        "is-npm": "^6.0.0",
-        "is-yarn-global": "^0.4.0",
-        "latest-version": "^7.0.0",
-        "pupa": "^3.1.0",
-        "semver": "^7.3.7",
-        "semver-diff": "^4.0.0",
-        "xdg-basedir": "^5.1.0"
-      },
-      "dependencies": {
-        "chalk": {
-          "version": "5.1.2",
-          "dev": true
-        },
-        "lru-cache": {
-          "version": "6.0.0",
-          "dev": true,
-          "requires": {
-            "yallist": "^4.0.0"
-          }
-        },
-        "semver": {
-          "version": "7.3.8",
-          "dev": true,
-          "requires": {
-            "lru-cache": "^6.0.0"
-          }
-        }
-      }
-    },
     "uri-js": {
       "version": "4.4.1",
       "dev": true,
@@ -25357,21 +21721,6 @@
       "version": "3.0.1",
       "dev": true
     },
-    "validate-npm-package-license": {
-      "version": "3.0.4",
-      "dev": true,
-      "requires": {
-        "spdx-correct": "^3.0.0",
-        "spdx-expression-parse": "^3.0.0"
-      }
-    },
-    "validate-npm-package-name": {
-      "version": "4.0.0",
-      "dev": true,
-      "requires": {
-        "builtins": "^5.0.0"
-      }
-    },
     "value-or-function": {
       "version": "3.0.0",
       "dev": true
@@ -25715,39 +22064,6 @@
         "string-width": "^1.0.2 || 2 || 3 || 4"
       }
     },
-    "widest-line": {
-      "version": "4.0.1",
-      "dev": true,
-      "requires": {
-        "string-width": "^5.0.1"
-      },
-      "dependencies": {
-        "ansi-regex": {
-          "version": "6.0.1",
-          "dev": true
-        },
-        "emoji-regex": {
-          "version": "9.2.2",
-          "dev": true
-        },
-        "string-width": {
-          "version": "5.1.2",
-          "dev": true,
-          "requires": {
-            "eastasianwidth": "^0.2.0",
-            "emoji-regex": "^9.2.2",
-            "strip-ansi": "^7.0.1"
-          }
-        },
-        "strip-ansi": {
-          "version": "7.0.1",
-          "dev": true,
-          "requires": {
-            "ansi-regex": "^6.0.1"
-          }
-        }
-      }
-    },
     "word-wrap": {
       "version": "1.2.3",
       "dev": true
@@ -25784,40 +22100,10 @@
     "wrappy": {
       "version": "1.0.2"
     },
-    "write-file-atomic": {
-      "version": "3.0.3",
-      "dev": true,
-      "requires": {
-        "imurmurhash": "^0.1.4",
-        "is-typedarray": "^1.0.0",
-        "signal-exit": "^3.0.2",
-        "typedarray-to-buffer": "^3.1.5"
-      }
-    },
     "ws": {
       "version": "8.9.0",
       "requires": {}
     },
-    "wscat": {
-      "version": "5.2.0",
-      "dev": true,
-      "requires": {
-        "commander": "^9.3.0",
-        "https-proxy-agent": "^5.0.0",
-        "read": "^1.0.7",
-        "ws": "^8.0.0"
-      },
-      "dependencies": {
-        "commander": {
-          "version": "9.4.1",
-          "dev": true
-        }
-      }
-    },
-    "xdg-basedir": {
-      "version": "5.1.0",
-      "dev": true
-    },
     "xtend": {
       "version": "4.0.2",
       "dev": true
diff --git a/server/.gitignore b/server/.gitignore
index 12fee05..bb6d966 100644
--- a/server/.gitignore
+++ b/server/.gitignore
@@ -1,2 +1,2 @@
-creds.json
-admin.json
\ No newline at end of file
+accounts.json
+admin.json
diff --git a/server/package.json b/server/package.json
index bfcca37..d4ac1be 100644
--- a/server/package.json
+++ b/server/package.json
@@ -5,7 +5,7 @@
     "start": "nodemon --watch src src/index.ts",
     "start:prod": "env NODE_ENV=production node dist/index.js",
     "build": "tsc",
-    "clean": "rm -Rf dist tsconfig.tsbuildinfo",
+    "clean": "rm -rf dist tsconfig.tsbuildinfo",
     "lint": "eslint src",
     "lint:fix": "eslint --fix src",
     "format": "prettier --write src",
@@ -20,10 +20,8 @@
     "@types/ws": "^8.5.3",
     "dotenv-cli": "^6.0.0",
     "nodemon": "^2.0.20",
-    "npm-check-updates": "^16.3.3",
     "ts-node": "^10.9.1",
-    "typescript": "^4.8.4",
-    "wscat": "^5.2.0"
+    "typescript": "^4.8.4"
   },
   "dependencies": {
     "argon2": "^0.29.1",
diff --git a/server/src/app.ts b/server/src/app.ts
index f6086cd..27e6e99 100644
--- a/server/src/app.ts
+++ b/server/src/app.ts
@@ -22,7 +22,6 @@
 import log from 'loglevel';
 import { Service } from 'typedi';
 
-import { bindWebRTCCallbacks } from './handlers/webrtc-handler.js';
 import { checkAdminSetup } from './middleware/setup.js';
 import { accountRouter } from './routers/account-router.js';
 import { authRouter } from './routers/auth-router.js';
@@ -32,44 +31,43 @@
 import { defaultModeratorsRouter } from './routers/default-moderators-router.js';
 import { nameserverRouter } from './routers/nameserver-router.js';
 import { setupRouter } from './routers/setup-router.js';
+import { bindWebRTCCallbacks } from './websocket/webrtc-handler.js';
 
 @Service()
 export class App {
-  async build() {
-    const app = express();
+  app = express();
 
+  constructor() {
     // Setup middleware
-    app.use(helmet());
-    app.use(cors());
-    app.use(json());
+    this.app.use(helmet());
+    this.app.use(cors());
+    this.app.use(json());
 
     // Enforce admin setup
-    app.use('/setup', setupRouter);
-    app.use(checkAdminSetup);
+    this.app.use('/setup', setupRouter);
+    this.app.use(checkAdminSetup);
 
     // Setup routing
-    app.use('/auth', authRouter);
-    app.use('/account', accountRouter);
-    app.use('/contacts', contactsRouter);
-    app.use('/default-moderators', defaultModeratorsRouter);
-    app.use('/conversations', conversationRouter);
-    app.use('/calls', callRouter);
-    app.use('/ns', nameserverRouter);
+    this.app.use('/auth', authRouter);
+    this.app.use('/account', accountRouter);
+    this.app.use('/contacts', contactsRouter);
+    this.app.use('/default-moderators', defaultModeratorsRouter);
+    this.app.use('/conversations', conversationRouter);
+    this.app.use('/calls', callRouter);
+    this.app.use('/ns', nameserverRouter);
 
     // Setup WebSocket callbacks
     bindWebRTCCallbacks();
 
     // Setup 404 error handling
-    app.use((_req, res) => {
+    this.app.use((_req, res) => {
       res.sendStatus(HttpStatusCode.NotFound);
     });
 
     // Setup internal error handling
-    app.use((err: Error, _req: Request, res: Response, _next: NextFunction) => {
+    this.app.use((err: Error, _req: Request, res: Response, _next: NextFunction) => {
       log.error(err);
       res.status(HttpStatusCode.InternalServerError).send(err.message);
     });
-
-    return app;
   }
 }
diff --git a/server/src/creds.ts b/server/src/creds.ts
deleted file mode 100644
index 9c43dc5..0000000
--- a/server/src/creds.ts
+++ /dev/null
@@ -1,48 +0,0 @@
-/*
- * Copyright (C) 2022 Savoir-faire Linux Inc.
- *
- * This program is free software; you can redistribute it and/or modify
- * it under the terms of the GNU Affero General Public License as
- * published by the Free Software Foundation; either version 3 of the
- * License, or (at your option) any later version.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
- * GNU Affero General Public License for more details.
- *
- * You should have received a copy of the GNU Affero General Public
- * License along with this program.  If not, see
- * <https://www.gnu.org/licenses/>.
- */
-import { readFile, writeFile } from 'node:fs/promises';
-
-import { Service } from 'typedi';
-
-@Service()
-export class Creds {
-  readonly file = 'creds.json';
-  db: Record<string, string>;
-
-  constructor() {
-    this.db = {};
-  }
-
-  async build() {
-    const buffer = await readFile(this.file).catch(() => Buffer.from('{}'));
-    this.db = JSON.parse(buffer.toString());
-    return this;
-  }
-
-  get(username: string) {
-    return this.db[username];
-  }
-
-  set(username: string, password: string) {
-    this.db[username] = password;
-  }
-
-  async save() {
-    await writeFile(this.file, JSON.stringify(this.db) + '\n');
-  }
-}
diff --git a/server/src/index.ts b/server/src/index.ts
index d00f78b..43c3e45 100644
--- a/server/src/index.ts
+++ b/server/src/index.ts
@@ -26,25 +26,23 @@
 import { Container } from 'typedi';
 
 import { App } from './app.js';
-import { Creds } from './creds.js';
 import { Jamid } from './jamid/jamid.js';
-import { Vault } from './vault.js';
-import { Ws } from './ws.js';
+import { SigningKeys } from './storage/signing-keys.js';
+import { WebSocketServer } from './websocket/websocket-server.js';
 
 log.setLevel(process.env.NODE_ENV === 'production' ? 'error' : 'trace');
 
 const port: string | number = 5000;
 
-await Container.get(Creds).build();
-await Container.get(Vault).build();
+await Container.get(SigningKeys).build();
 const jamid = Container.get(Jamid);
-const app = await Container.get(App).build();
-const wss = await Container.get(Ws).build();
+const app = Container.get(App);
+const webSocketServer = Container.get(WebSocketServer);
 
 const server = createServer();
 
-server.on('request', app);
-server.on('upgrade', wss);
+server.on('request', app.app);
+server.on('upgrade', webSocketServer.upgrade.bind(webSocketServer));
 
 server.listen(port);
 server.on('error', onError);
diff --git a/server/src/interfaces.ts b/server/src/interfaces/constructable.ts
similarity index 100%
rename from server/src/interfaces.ts
rename to server/src/interfaces/constructable.ts
diff --git a/server/src/jamid/jami-swig.ts b/server/src/jamid/jami-swig.ts
index 7182270..3b4ddd8 100644
--- a/server/src/jamid/jami-swig.ts
+++ b/server/src/jamid/jami-swig.ts
@@ -15,36 +15,66 @@
  * License along with this program.  If not, see
  * <https://www.gnu.org/licenses/>.
  */
-import { Constructable } from '../interfaces.js';
-import { itMap, itRange, itToArr, itToRecord } from './utils.js';
+import { Constructable } from '../interfaces/constructable.js';
 
-interface SwigVec<T> {
+interface SwigVect<T> {
   size(): number;
-  get(i: number): T; // TODO: | undefined;
+  get(index: number): T | undefined;
 }
 
 interface SwigMap<T, U> {
-  keys(): SwigVec<T>;
-  get(k: T): U; // TODO: | undefined;
-  set(k: T, v: U): void;
+  keys(): SwigVect<T>;
+  get(key: T): U | undefined;
+  set(key: T, value: U): void;
 }
 
-// TODO: Review these conversion functions
-const swigVecToIt = <T>(v: SwigVec<T>) => itMap(itRange(0, v.size()), (i) => v.get(i));
-const swigMapToIt = <T, U>(m: SwigMap<T, U>) => itMap(swigVecToIt(m.keys()), (k): [T, U] => [k, m.get(k)]);
-
 // export type IntVect = SwigVec<number>;
 // export type UintVect = SwigVec<number>;
 // export type FloatVect = SwigVec<number>;
-export type StringVect = SwigVec<string>;
+export type StringVect = SwigVect<string>;
 // export type IntegerMap = SwigMap<string, number>;
 export type StringMap = SwigMap<string, string>;
-export type VectMap = SwigVec<StringMap>;
+export type VectMap = SwigVect<StringMap>;
 // export type Blob = SwigVec<number>;
 
-export const stringVectToArray = (sv: StringVect) => itToArr(swigVecToIt(sv));
-export const stringMapToRecord = (sm: StringMap) => itToRecord(swigMapToIt(sm));
-export const vectMapToRecordArray = (vm: VectMap) => itToArr(itMap(swigVecToIt(vm), stringMapToRecord));
+function* swigVectToIt<T>(swigVect: SwigVect<T>) {
+  const size = swigVect.size();
+  for (let i = 0; i < size; i++) {
+    yield swigVect.get(i)!;
+  }
+}
+
+function* swigMapToIt<T, U>(swigMap: SwigMap<T, U>) {
+  const keys = swigVectToIt(swigMap.keys());
+  for (const key of keys) {
+    const value = swigMap.get(key)!;
+    yield [key, value];
+  }
+}
+
+export function stringVectToArray(stringVect: StringVect): string[] {
+  const elements = swigVectToIt(stringVect);
+  return Array.from(elements);
+}
+
+export function stringMapToRecord(stringMap: StringMap): Record<string, string> {
+  const keyValuePairs = swigMapToIt(stringMap);
+  const record: Record<string, string> = {};
+  for (const [key, value] of keyValuePairs) {
+    record[key] = value;
+  }
+  return record;
+}
+
+export function vectMapToRecordArray(vectMap: VectMap): Record<string, string>[] {
+  const stringMaps = swigVectToIt(vectMap);
+  const records = [];
+  for (const stringMap of stringMaps) {
+    const record = stringMapToRecord(stringMap);
+    records.push(record);
+  }
+  return records;
+}
 
 /**
  * Non-exhaustive list of properties for JamiSwig.
diff --git a/server/src/jamid/jamid.ts b/server/src/jamid/jamid.ts
index 0c54adf..773b298 100644
--- a/server/src/jamid/jamid.ts
+++ b/server/src/jamid/jamid.ts
@@ -15,6 +15,8 @@
  * License along with this program.  If not, see
  * <https://www.gnu.org/licenses/>.
  */
+import { createRequire } from 'node:module';
+
 import {
   AccountDetails,
   AccountTextMessage,
@@ -28,7 +30,7 @@
 import { filter, firstValueFrom, map, Subject } from 'rxjs';
 import { Service } from 'typedi';
 
-import { Ws } from '../ws.js';
+import { WebSocketServer } from '../websocket/websocket-server.js';
 import { JamiSignal } from './jami-signal.js';
 import {
   AccountDetailsChanged,
@@ -47,22 +49,19 @@
   VolatileDetailsChanged,
 } from './jami-signal-interfaces.js';
 import { JamiSwig, StringMap, stringMapToRecord, stringVectToArray, vectMapToRecordArray } from './jami-swig.js';
-import { require } from './utils.js';
 
-// TODO: Mechanism to map account IDs to a list of WebSockets
+const require = createRequire(import.meta.url);
+
 // TODO: Convert Records to interfaces and replace them in common/ (e.g. Contact)
 
 @Service()
 export class Jamid {
-  private readonly jamiSwig: JamiSwig;
-  private readonly usernamesToAccountIds: Map<string, string>;
+  private jamiSwig: JamiSwig;
+  private usernamesToAccountIds = new Map<string, string>();
   private readonly events;
 
-  constructor(private ws: Ws) {
-    // eslint-disable-next-line @typescript-eslint/no-unsafe-assignment
-    this.jamiSwig = require('../../jamid.node') as JamiSwig; // TODO: we should put the path in the .env
-
-    this.usernamesToAccountIds = new Map<string, string>();
+  constructor(private webSocketServer: WebSocketServer) {
+    this.jamiSwig = require('../../jamid.node') as JamiSwig;
 
     // Setup signal handlers
     const handlers: Record<string, unknown> = {};
@@ -380,12 +379,17 @@
       const message: WebSocketMessage<any> = JSON.parse(signal.payload['application/json']);
 
       if (message === undefined) {
-        log.debug('Undefined account message');
+        log.warn('Undefined account message');
+        return;
+      }
+
+      if (message.type === undefined || message.data === undefined) {
+        log.warn('Account message is not a valid WebSocketMessage (missing type or data fields)');
         return;
       }
 
       if (!Object.values(WebSocketMessageType).includes(message.type)) {
-        log.warn(`Unhandled account message type: ${message.type}`);
+        log.warn(`Invalid WebSocket message type: ${message.type}`);
         return;
       }
 
@@ -394,10 +398,8 @@
         to: signal.accountId,
         message: message.data.message,
       };
-      message.data = data;
 
-      log.info(`Sending ${JSON.stringify(message)} to ${signal.accountId}`);
-      this.ws.send(signal.accountId, message.type, data);
+      this.webSocketServer.send(signal.accountId, message.type, data);
     });
 
     this.events.onAccountMessageStatusChanged.subscribe((signal) => {
@@ -433,7 +435,7 @@
         conversationId: signal.conversationId,
         message: signal.message,
       };
-      this.ws.send(signal.accountId, WebSocketMessageType.ConversationMessage, data);
+      this.webSocketServer.send(signal.accountId, WebSocketMessageType.ConversationMessage, data);
     });
   }
 }
diff --git a/server/src/jamid/utils.ts b/server/src/jamid/utils.ts
deleted file mode 100644
index f692578..0000000
--- a/server/src/jamid/utils.ts
+++ /dev/null
@@ -1,54 +0,0 @@
-/*
- * Copyright (C) 2022 Savoir-faire Linux Inc.
- *
- * This program is free software; you can redistribute it and/or modify
- * it under the terms of the GNU Affero General Public License as
- * published by the Free Software Foundation; either version 3 of the
- * License, or (at your option) any later version.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
- * GNU Affero General Public License for more details.
- *
- * You should have received a copy of the GNU Affero General Public
- * License along with this program.  If not, see
- * <https://www.gnu.org/licenses/>.
- */
-import { createRequire } from 'node:module';
-
-// TODO: Move these functions to jami-swig.ts
-
-export function* itRange(lo: number, hi: number) {
-  for (let i = lo; i < hi; ++i) {
-    yield i;
-  }
-}
-
-export function* itMap<T, U>(it: Iterable<T>, cb: (value: T, index: number) => U) {
-  let i = 0;
-  for (const item of it) {
-    yield cb(item, i++);
-  }
-}
-
-export function* itFilter<T>(it: Iterable<T>, cb: (value: T, index: number) => boolean) {
-  let i = 0;
-  for (const item of it) {
-    if (cb(item, i++)) {
-      yield item;
-    }
-  }
-}
-
-export const itToArr = <T>(it: Iterable<T>) => Array.from(it);
-
-export const itToRecord = <T>(it: Iterable<[string, T]>) => {
-  const r: Record<string, T> = {};
-  for (const [k, v] of it) {
-    r[k] = v;
-  }
-  return r;
-};
-
-export const require = createRequire(import.meta.url);
diff --git a/server/src/middleware/auth.ts b/server/src/middleware/auth.ts
index 4f06992..7bbd20c 100644
--- a/server/src/middleware/auth.ts
+++ b/server/src/middleware/auth.ts
@@ -17,15 +17,11 @@
  */
 import { NextFunction, Request, Response } from 'express';
 import { HttpStatusCode } from 'jami-web-common';
-import { jwtVerify } from 'jose';
-import { Container } from 'typedi';
 
-import { Vault } from '../vault.js';
+import { verifyJwt } from '../utils/jwt.js';
 
 function createAuthenticationMiddleware(isAuthenticationRequired: boolean) {
   return async (req: Request, res: Response, next: NextFunction) => {
-    const publicKey = Container.get(Vault).publicKey;
-
     const authorizationHeader = req.headers.authorization;
     if (!authorizationHeader) {
       if (isAuthenticationRequired) {
@@ -45,11 +41,8 @@
     }
 
     try {
-      const { payload } = await jwtVerify(token, publicKey, {
-        issuer: 'urn:example:issuer',
-        audience: 'urn:example:audience',
-      });
-      res.locals.accountId = payload.id;
+      const { payload } = await verifyJwt(token);
+      res.locals.accountId = payload.accountId;
       next();
     } catch (e) {
       res.status(HttpStatusCode.Unauthorized).send('Invalid access token');
diff --git a/server/src/middleware/setup.ts b/server/src/middleware/setup.ts
index a697b5a..d9fc3e7 100644
--- a/server/src/middleware/setup.ts
+++ b/server/src/middleware/setup.ts
@@ -19,12 +19,12 @@
 import { HttpStatusCode } from 'jami-web-common';
 import { Container } from 'typedi';
 
-import { AdminConfig } from '../admin-config.js';
+import { AdminAccount } from '../storage/admin-account.js';
 
-const adminConfig = Container.get(AdminConfig);
+const adminAccount = Container.get(AdminAccount);
 
 export async function checkAdminSetup(_req: Request, res: Response, next: NextFunction) {
-  const isSetupComplete = adminConfig.get() !== undefined;
+  const isSetupComplete = adminAccount.get() !== undefined;
 
   if (!isSetupComplete) {
     res.status(HttpStatusCode.Forbidden).send('Setup not complete');
diff --git a/server/src/routers/account-router.ts b/server/src/routers/account-router.ts
index 9b72667..505d1d9 100644
--- a/server/src/routers/account-router.ts
+++ b/server/src/routers/account-router.ts
@@ -15,10 +15,9 @@
  * License along with this program.  If not, see
  * <https://www.gnu.org/licenses/>.
  */
-import { Request, Router } from 'express';
+import { Router } from 'express';
 import asyncHandler from 'express-async-handler';
-import { ParamsDictionary } from 'express-serve-static-core';
-import { AccountDetails, AccountTextMessage, HttpStatusCode } from 'jami-web-common';
+import { AccountDetails, HttpStatusCode } from 'jami-web-common';
 import { Container } from 'typedi';
 
 import { Jamid } from '../jamid/jamid.js';
@@ -67,15 +66,3 @@
 
   res.sendStatus(HttpStatusCode.NoContent);
 });
-
-// TODO: Should this endpoint be removed?
-accountRouter.post('/send-account-message', (req: Request<ParamsDictionary, any, AccountTextMessage<unknown>>, res) => {
-  const { from, to, message } = req.body;
-  if (from === undefined || to === undefined || message === undefined) {
-    res.status(HttpStatusCode.BadRequest).send('Missing from, to, or message in body');
-    return;
-  }
-
-  jamid.sendAccountTextMessage(from, to, JSON.stringify(message));
-  res.sendStatus(HttpStatusCode.NoContent);
-});
diff --git a/server/src/routers/auth-router.ts b/server/src/routers/auth-router.ts
index f04529e..4255655 100644
--- a/server/src/routers/auth-router.ts
+++ b/server/src/routers/auth-router.ts
@@ -20,27 +20,25 @@
 import asyncHandler from 'express-async-handler';
 import { ParamsDictionary, Request } from 'express-serve-static-core';
 import { HttpStatusCode } from 'jami-web-common';
-import { SignJWT } from 'jose';
 import { Container } from 'typedi';
 
-import { Creds } from '../creds.js';
 import { Jamid } from '../jamid/jamid.js';
-import { Vault } from '../vault.js';
+import { Accounts } from '../storage/accounts.js';
+import { signJwt } from '../utils/jwt.js';
 
 interface Credentials {
-  username?: string;
-  password?: string;
+  username: string;
+  password: string;
 }
 
 const jamid = Container.get(Jamid);
-const creds = Container.get(Creds);
-const vault = Container.get(Vault);
+const accounts = Container.get(Accounts);
 
 export const authRouter = Router();
 
 authRouter.post(
   '/new-account',
-  asyncHandler(async (req: Request<ParamsDictionary, string, Credentials>, res, _next) => {
+  asyncHandler(async (req: Request<ParamsDictionary, string, Partial<Credentials>>, res, _next) => {
     const { username, password } = req.body;
     if (username === undefined || password === undefined) {
       res.status(HttpStatusCode.BadRequest).send('Missing username or password in body');
@@ -57,12 +55,8 @@
     // TODO: add JAMS support
     // managerUri: 'https://jams.savoirfairelinux.com',
     // managerUsername: data.username,
-    // TODO: find a way to store the password directly in Jami
-    // Maybe by using the "password" field? But as I tested, it's not
-    // returned when getting user infos.
     const accountId = await jamid.addAccount(new Map());
 
-    // TODO: understand why the password arg in this call must be empty
     const state = await jamid.registerUsername(accountId, username, '');
     if (state !== 0) {
       jamid.removeAccount(accountId);
@@ -76,8 +70,8 @@
       return;
     }
 
-    creds.set(username, hashedPassword);
-    await creds.save();
+    accounts.set(username, hashedPassword);
+    await accounts.save();
 
     res.sendStatus(HttpStatusCode.Created);
   })
@@ -85,45 +79,37 @@
 
 authRouter.post(
   '/login',
-  asyncHandler(async (req: Request<ParamsDictionary, { accessToken: string } | string, Credentials>, res, _next) => {
-    const { username, password } = req.body;
-    if (username === undefined || password === undefined) {
-      res.status(HttpStatusCode.BadRequest).send('Missing username or password in body');
-      return;
-    }
+  asyncHandler(
+    async (req: Request<ParamsDictionary, { accessToken: string } | string, Partial<Credentials>>, res, _next) => {
+      const { username, password } = req.body;
+      if (username === undefined || password === undefined) {
+        res.status(HttpStatusCode.BadRequest).send('Missing username or password in body');
+        return;
+      }
 
-    // The account may either be:
-    // 1. not found
-    // 2. found but not on this instance (but I'm not sure about this)
-    const accountId = jamid.getAccountIdFromUsername(username);
-    if (accountId === undefined) {
-      res.status(HttpStatusCode.NotFound).send('Username not found');
-      return;
-    }
+      // Check if the account is stored stored on this daemon instance
+      const accountId = jamid.getAccountIdFromUsername(username);
+      if (accountId === undefined) {
+        res.status(HttpStatusCode.NotFound).send('Username not found');
+        return;
+      }
 
-    // TODO: load the password from Jami
-    const hashedPassword = creds.get(username);
-    if (!hashedPassword) {
-      res
-        .status(HttpStatusCode.NotFound)
-        .send('Password not found (the account does not have a password set on the server)');
-      return;
-    }
+      const hashedPassword = accounts.get(username);
+      if (hashedPassword === undefined) {
+        res
+          .status(HttpStatusCode.NotFound)
+          .send('Password not found (the account does not have a password set on the server)');
+        return;
+      }
 
-    const isPasswordVerified = await argon2.verify(hashedPassword, password);
-    if (!isPasswordVerified) {
-      res.status(HttpStatusCode.Unauthorized).send('Incorrect password');
-      return;
-    }
+      const isPasswordVerified = await argon2.verify(hashedPassword, password);
+      if (!isPasswordVerified) {
+        res.status(HttpStatusCode.Unauthorized).send('Incorrect password');
+        return;
+      }
 
-    const jwt = await new SignJWT({ id: accountId })
-      .setProtectedHeader({ alg: 'EdDSA' })
-      .setIssuedAt()
-      // TODO: use valid issuer and audience
-      .setIssuer('urn:example:issuer')
-      .setAudience('urn:example:audience')
-      .setExpirationTime('2h')
-      .sign(vault.privateKey);
-    res.send({ accessToken: jwt });
-  })
+      const jwt = await signJwt(accountId);
+      res.send({ accessToken: jwt });
+    }
+  )
 );
diff --git a/server/src/routers/setup-router.ts b/server/src/routers/setup-router.ts
index 7dfa24f..3bc3088 100644
--- a/server/src/routers/setup-router.ts
+++ b/server/src/routers/setup-router.ts
@@ -20,20 +20,18 @@
 import asyncHandler from 'express-async-handler';
 import { ParamsDictionary, Request } from 'express-serve-static-core';
 import { HttpStatusCode } from 'jami-web-common';
-import { SignJWT } from 'jose';
 import { Container } from 'typedi';
 
-import { AdminConfig } from '../admin-config.js';
 import { checkAdminSetup } from '../middleware/setup.js';
-import { Vault } from '../vault.js';
+import { AdminAccount } from '../storage/admin-account.js';
+import { signJwt } from '../utils/jwt.js';
+
+const adminAccount = Container.get(AdminAccount);
 
 export const setupRouter = Router();
 
-const vault = Container.get(Vault);
-const adminConfig = Container.get(AdminConfig);
-
 setupRouter.get('/check', (_req, res, _next) => {
-  const isSetupComplete = adminConfig.get() !== undefined;
+  const isSetupComplete = adminAccount.get() !== undefined;
   res.send({ isSetupComplete });
 });
 
@@ -51,7 +49,7 @@
       return;
     }
 
-    const isAdminCreated = adminConfig.get() !== undefined;
+    const isAdminCreated = adminAccount.get() !== undefined;
     if (isAdminCreated) {
       res.status(HttpStatusCode.Conflict).send('Admin already exists');
       return;
@@ -59,8 +57,8 @@
 
     const hashedPassword = await argon2.hash(password, { type: argon2.argon2id });
 
-    adminConfig.set(hashedPassword);
-    await adminConfig.save();
+    adminAccount.set(hashedPassword);
+    await adminAccount.save();
 
     res.sendStatus(HttpStatusCode.Created);
   })
@@ -68,7 +66,7 @@
 
 // Every request handler after this line will be submitted to this middleware
 // in order to ensure that the admin account is set up before proceeding with
-// setup related requests
+// setup-related requests
 setupRouter.use(checkAdminSetup);
 
 setupRouter.post(
@@ -81,7 +79,11 @@
         return;
       }
 
-      const hashedPassword = adminConfig.get();
+      const hashedPassword = adminAccount.get();
+      if (hashedPassword === undefined) {
+        res.status(HttpStatusCode.InternalServerError).send('Admin password not found');
+        return;
+      }
 
       const isPasswordVerified = await argon2.verify(hashedPassword, password);
       if (!isPasswordVerified) {
@@ -89,14 +91,7 @@
         return;
       }
 
-      const jwt = await new SignJWT({ id: 'admin' })
-        .setProtectedHeader({ alg: 'EdDSA' })
-        .setIssuedAt()
-        // TODO: use valid issuer and audience
-        .setIssuer('urn:example:issuer')
-        .setAudience('urn:example:audience')
-        .setExpirationTime('2h')
-        .sign(vault.privateKey);
+      const jwt = await signJwt('admin');
       res.send({ accessToken: jwt });
     }
   )
diff --git a/server/src/admin-config.ts b/server/src/storage/accounts.ts
similarity index 66%
copy from server/src/admin-config.ts
copy to server/src/storage/accounts.ts
index 0f745b9..77a8d9d 100644
--- a/server/src/admin-config.ts
+++ b/server/src/storage/accounts.ts
@@ -21,32 +21,31 @@
 import { Service } from 'typedi';
 
 @Service()
-export class AdminConfig {
-  private readonly file = 'admin.json';
-  private account: { admin: string };
+export class Accounts {
+  private readonly filename = 'accounts.json';
+  private accounts: Record<string, string>;
 
   constructor() {
     let buffer: Buffer;
 
     try {
-      buffer = readFileSync(this.file);
+      buffer = readFileSync(this.filename);
     } catch (e) {
-      console.error(e);
       buffer = Buffer.from('{}');
     }
 
-    this.account = JSON.parse(buffer.toString());
+    this.accounts = JSON.parse(buffer.toString());
   }
 
-  get() {
-    return this.account.admin;
+  get(username: string): string | undefined {
+    return this.accounts[username];
   }
 
-  set(password: string) {
-    this.account.admin = password;
+  set(username: string, password: string): void {
+    this.accounts[username] = password;
   }
 
-  async save() {
-    await writeFile(this.file, JSON.stringify(this.account) + '\n');
+  async save(): Promise<void> {
+    await writeFile(this.filename, JSON.stringify(this.accounts, null, 2) + '\n');
   }
 }
diff --git a/server/src/admin-config.ts b/server/src/storage/admin-account.ts
similarity index 79%
rename from server/src/admin-config.ts
rename to server/src/storage/admin-account.ts
index 0f745b9..b207cfd 100644
--- a/server/src/admin-config.ts
+++ b/server/src/storage/admin-account.ts
@@ -21,32 +21,31 @@
 import { Service } from 'typedi';
 
 @Service()
-export class AdminConfig {
-  private readonly file = 'admin.json';
+export class AdminAccount {
+  private readonly filename = 'admin.json';
   private account: { admin: string };
 
   constructor() {
     let buffer: Buffer;
 
     try {
-      buffer = readFileSync(this.file);
+      buffer = readFileSync(this.filename);
     } catch (e) {
-      console.error(e);
       buffer = Buffer.from('{}');
     }
 
     this.account = JSON.parse(buffer.toString());
   }
 
-  get() {
+  get(): string | undefined {
     return this.account.admin;
   }
 
-  set(password: string) {
+  set(password: string): void {
     this.account.admin = password;
   }
 
-  async save() {
-    await writeFile(this.file, JSON.stringify(this.account) + '\n');
+  async save(): Promise<void> {
+    await writeFile(this.filename, JSON.stringify(this.account, null, 2) + '\n');
   }
 }
diff --git a/server/src/vault.ts b/server/src/storage/signing-keys.ts
similarity index 92%
rename from server/src/vault.ts
rename to server/src/storage/signing-keys.ts
index 07e2914..8e48c94 100644
--- a/server/src/vault.ts
+++ b/server/src/storage/signing-keys.ts
@@ -19,7 +19,7 @@
 import { Service } from 'typedi';
 
 @Service()
-export class Vault {
+export class SigningKeys {
   privateKey!: KeyLike;
   publicKey!: KeyLike;
 
@@ -27,7 +27,7 @@
     const privatekey = process.env.PRIVATE_KEY;
     const publicKey = process.env.PUBLIC_KEY;
 
-    if (!privatekey || !publicKey) {
+    if (privatekey === undefined || publicKey === undefined) {
       throw new Error('Missing private or public key environment variables. Try running "npm run genkeys"');
     }
 
diff --git a/server/src/utils/jwt.ts b/server/src/utils/jwt.ts
new file mode 100644
index 0000000..672c5c3
--- /dev/null
+++ b/server/src/utils/jwt.ts
@@ -0,0 +1,43 @@
+/*
+ * Copyright (C) 2022 Savoir-faire Linux Inc.
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU Affero General Public License as
+ * published by the Free Software Foundation; either version 3 of the
+ * License, or (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU Affero General Public License for more details.
+ *
+ * You should have received a copy of the GNU Affero General Public
+ * License along with this program.  If not, see
+ * <https://www.gnu.org/licenses/>.
+ */
+import { jwtVerify, JWTVerifyResult, SignJWT } from 'jose';
+import { Container } from 'typedi';
+
+import { SigningKeys } from '../storage/signing-keys.js';
+
+const jwtIssuer = 'https://jami.net/';
+const jwtAudience = 'https://jami.net/';
+
+const signingKeys = Container.get(SigningKeys);
+
+export async function signJwt(accountId: string): Promise<string> {
+  return new SignJWT({ accountId })
+    .setProtectedHeader({ alg: 'EdDSA' })
+    .setIssuedAt()
+    .setIssuer(jwtIssuer)
+    .setAudience(jwtAudience)
+    .setExpirationTime('2h')
+    .sign(signingKeys.privateKey);
+}
+
+export async function verifyJwt(token: string): Promise<JWTVerifyResult> {
+  return jwtVerify(token, signingKeys.publicKey, {
+    issuer: jwtIssuer,
+    audience: jwtAudience,
+  });
+}
diff --git a/server/src/handlers/webrtc-handler.ts b/server/src/websocket/webrtc-handler.ts
similarity index 68%
rename from server/src/handlers/webrtc-handler.ts
rename to server/src/websocket/webrtc-handler.ts
index 409a030..e6ebcbc 100644
--- a/server/src/handlers/webrtc-handler.ts
+++ b/server/src/websocket/webrtc-handler.ts
@@ -20,21 +20,22 @@
 import { Container } from 'typedi';
 
 import { Jamid } from '../jamid/jamid.js';
-import { Ws } from '../ws.js';
+import { WebSocketServer } from './websocket-server.js';
 
 const jamid = Container.get(Jamid);
-const ws = Container.get(Ws);
+const webSocketServer = Container.get(WebSocketServer);
 
 function sendWebRTCData<T>(data: Partial<AccountTextMessage<T>>) {
-  if (!data.from || !data.to || !data.message) {
-    log.warn('Incorrect format for AccountTextMessage (require from, to and message):', data);
+  if (data.from === undefined || data.to === undefined || data.message === undefined) {
+    log.warn('Message is not a valid AccountTextMessage (missing from, to, or message fields)');
     return;
   }
+
   jamid.sendAccountTextMessage(data.from, data.to, JSON.stringify(data.message));
 }
 
 export function bindWebRTCCallbacks() {
-  ws.bind(WebSocketMessageType.WebRTCOffer, sendWebRTCData);
-  ws.bind(WebSocketMessageType.WebRTCAnswer, sendWebRTCData);
-  ws.bind(WebSocketMessageType.IceCandidate, sendWebRTCData);
+  webSocketServer.bind(WebSocketMessageType.WebRTCOffer, sendWebRTCData);
+  webSocketServer.bind(WebSocketMessageType.WebRTCAnswer, sendWebRTCData);
+  webSocketServer.bind(WebSocketMessageType.IceCandidate, sendWebRTCData);
 }
diff --git a/server/src/websocket/websocket-server.ts b/server/src/websocket/websocket-server.ts
new file mode 100644
index 0000000..6750129
--- /dev/null
+++ b/server/src/websocket/websocket-server.ts
@@ -0,0 +1,127 @@
+/*
+ * Copyright (C) 2022 Savoir-faire Linux Inc.
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU Affero General Public License as
+ * published by the Free Software Foundation; either version 3 of the
+ * License, or (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU Affero General Public License for more details.
+ *
+ * You should have received a copy of the GNU Affero General Public
+ * License along with this program.  If not, see
+ * <https://www.gnu.org/licenses/>.
+ */
+import { IncomingMessage } from 'node:http';
+import { Duplex } from 'node:stream';
+
+import { WebSocketCallbacks, WebSocketMessage, WebSocketMessageTable, WebSocketMessageType } from 'jami-web-common';
+import log from 'loglevel';
+import { Service } from 'typedi';
+import { URL } from 'whatwg-url';
+import * as WebSocket from 'ws';
+
+import { verifyJwt } from '../utils/jwt.js';
+
+@Service()
+export class WebSocketServer {
+  private wss = new WebSocket.WebSocketServer({ noServer: true });
+  private sockets = new Map<string, WebSocket.WebSocket[]>();
+  private callbacks: WebSocketCallbacks = {
+    [WebSocketMessageType.ConversationMessage]: [],
+    [WebSocketMessageType.ConversationView]: [],
+    [WebSocketMessageType.WebRTCOffer]: [],
+    [WebSocketMessageType.WebRTCAnswer]: [],
+    [WebSocketMessageType.IceCandidate]: [],
+  };
+
+  constructor() {
+    this.wss.on('connection', (ws: WebSocket.WebSocket, _request: IncomingMessage, accountId: string) => {
+      log.info('New connection for account', accountId);
+      const accountSockets = this.sockets.get(accountId);
+      if (accountSockets) {
+        accountSockets.push(ws);
+      } else {
+        this.sockets.set(accountId, [ws]);
+      }
+
+      ws.on('message', <T extends WebSocketMessageType>(messageString: string) => {
+        const message: WebSocketMessage<T> = JSON.parse(messageString);
+        if (message.type === undefined || message.data === undefined) {
+          log.warn('WebSocket message is not a valid WebSocketMessage (missing type or data fields)');
+          return;
+        }
+
+        if (!Object.values(WebSocketMessageType).includes(message.type)) {
+          log.warn(`Invalid WebSocket message type: ${message.type}`);
+          return;
+        }
+
+        const callbacks = this.callbacks[message.type];
+        for (const callback of callbacks) {
+          callback(message.data);
+        }
+      });
+
+      ws.on('close', () => {
+        log.info('Closing connection for account', accountId);
+        const accountSockets = this.sockets.get(accountId);
+        if (accountSockets === undefined) {
+          return;
+        }
+
+        const index = accountSockets.indexOf(ws);
+        if (index !== -1) {
+          accountSockets.splice(index, 1);
+          if (accountSockets.length === 0) {
+            this.sockets.delete(accountId);
+          }
+        }
+      });
+    });
+  }
+
+  async upgrade(request: IncomingMessage, socket: Duplex, head: Buffer): Promise<void> {
+    // Do not use parseURL because it returns a URLRecord and not a URL
+    const url = new URL(request.url ?? '/', 'http://localhost/');
+    const token = url.searchParams.get('accessToken') ?? undefined;
+    if (token === undefined) {
+      socket.write('HTTP/1.1 401 Unauthorized\r\n\r\n');
+      socket.destroy();
+      return;
+    }
+
+    try {
+      const { payload } = await verifyJwt(token);
+      const accountId = payload.accountId as string;
+      log.info('Authentication successful for account', accountId);
+      this.wss.handleUpgrade(request, socket, head, (ws) => {
+        this.wss.emit('connection', ws, request, accountId);
+      });
+    } catch (e) {
+      log.debug('Authentication failed:', e);
+      socket.write('HTTP/1.1 401 Unauthorized\r\n\r\n');
+      socket.destroy();
+    }
+  }
+
+  bind<T extends WebSocketMessageType>(type: T, callback: (data: WebSocketMessageTable[T]) => void): void {
+    this.callbacks[type].push(callback);
+  }
+
+  send<T extends WebSocketMessageType>(accountId: string, type: T, data: WebSocketMessageTable[T]): boolean {
+    const accountSockets = this.sockets.get(accountId);
+    if (accountSockets === undefined) {
+      return false;
+    }
+
+    const webSocketMessageString = JSON.stringify({ type, data });
+    for (const accountSocket of accountSockets) {
+      accountSocket.send(webSocketMessageString);
+    }
+    return true;
+  }
+}
diff --git a/server/src/ws.ts b/server/src/ws.ts
deleted file mode 100644
index d33dd76..0000000
--- a/server/src/ws.ts
+++ /dev/null
@@ -1,128 +0,0 @@
-/*
- * Copyright (C) 2022 Savoir-faire Linux Inc.
- *
- * This program is free software; you can redistribute it and/or modify
- * it under the terms of the GNU Affero General Public License as
- * published by the Free Software Foundation; either version 3 of the
- * License, or (at your option) any later version.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
- * GNU Affero General Public License for more details.
- *
- * You should have received a copy of the GNU Affero General Public
- * License along with this program.  If not, see
- * <https://www.gnu.org/licenses/>.
- */
-import { IncomingMessage } from 'node:http';
-import { Duplex } from 'node:stream';
-
-import { WebSocketCallbacks, WebSocketMessage, WebSocketMessageTable, WebSocketMessageType } from 'jami-web-common';
-import { jwtVerify } from 'jose';
-import log from 'loglevel';
-import { Service } from 'typedi';
-import { URL } from 'whatwg-url';
-import { WebSocket, WebSocketServer } from 'ws';
-
-import { Vault } from './vault.js';
-
-@Service()
-export class Ws {
-  private sockets: Map<string, WebSocket[]>;
-  private callbacks: WebSocketCallbacks;
-
-  constructor(private readonly vault: Vault) {
-    this.sockets = new Map();
-    this.callbacks = {
-      [WebSocketMessageType.ConversationMessage]: [],
-      [WebSocketMessageType.ConversationView]: [],
-      [WebSocketMessageType.WebRTCOffer]: [],
-      [WebSocketMessageType.WebRTCAnswer]: [],
-      [WebSocketMessageType.IceCandidate]: [],
-    };
-  }
-
-  async build() {
-    const wss = new WebSocketServer({ noServer: true });
-
-    wss.on('connection', (ws: WebSocket, _req: IncomingMessage, accountId: string) => {
-      log.info('New connection', accountId);
-      const accountSockets = this.sockets.get(accountId);
-      if (accountSockets) {
-        accountSockets.push(ws);
-      } else {
-        this.sockets.set(accountId, [ws]);
-      }
-
-      ws.on('message', <T extends WebSocketMessageType>(messageString: string) => {
-        const message: WebSocketMessage<T> = JSON.parse(messageString);
-        if (!message.type || !message.data) {
-          ws.send('Incorrect format (require type and data)');
-          return;
-        }
-        if (!Object.values(WebSocketMessageType).includes(message.type)) {
-          log.warn(`Unhandled account message type: ${message.type}`);
-          return;
-        }
-        const callbacks = this.callbacks[message.type];
-        for (const callback of callbacks) {
-          callback(message.data);
-        }
-      });
-
-      ws.on('close', () => {
-        log.info('Connection close', accountId);
-        const accountSockets = this.sockets.get(accountId);
-        const index = accountSockets?.indexOf(ws);
-        if (index !== undefined) {
-          accountSockets?.splice(index, 1);
-          if (accountSockets?.length === 0) {
-            this.sockets.delete(accountId);
-          }
-        }
-      });
-    });
-
-    return (request: IncomingMessage, socket: Duplex, head: Buffer) => {
-      // Do not use parseURL because it returns a URLRecord and not a URL.
-      const url = new URL(request.url ?? '/', 'http://localhost/');
-      const accessToken = url.searchParams.get('accessToken');
-      if (!accessToken) {
-        socket.write('HTTP/1.1 401 Unauthorized\r\n\r\n');
-        socket.destroy();
-        return;
-      }
-
-      jwtVerify(accessToken, this.vault.publicKey, {
-        issuer: 'urn:example:issuer',
-        audience: 'urn:example:audience',
-      })
-        .then(({ payload }) => {
-          const id = payload.id as string;
-          log.info('Authentication successful', id);
-          wss.handleUpgrade(request, socket, head, (ws) => wss.emit('connection', ws, request, id));
-        })
-        .catch((reason) => {
-          log.debug('Authentication failed', reason);
-          socket.write('HTTP/1.1 401 Unauthorized\r\n\r\n');
-          socket.destroy();
-        });
-    };
-  }
-
-  bind<T extends WebSocketMessageType>(type: T, callback: (data: WebSocketMessageTable[T]) => void): void {
-    this.callbacks[type].push(callback);
-  }
-
-  send<T extends WebSocketMessageType>(accountId: string, type: T, data: WebSocketMessageTable[T]): boolean {
-    const accountSockets = this.sockets.get(accountId);
-    if (!accountSockets) {
-      return false;
-    }
-    for (const accountSocket of accountSockets) {
-      accountSocket.send(JSON.stringify({ type, data }));
-    }
-    return true;
-  }
-}