From 3370145b4246c38dec9ad6645e21468626aeda15 Mon Sep 17 00:00:00 2001
From: Julio SANTILARIO BERTHILIER <62715763+jujusb@users.noreply.github.com>
Date: Tue, 1 Oct 2024 14:44:17 +0200
Subject: [PATCH 001/245] fix SSE + BFF + views + profiling in dev + dockerfile
adding WebSocketManager
adding webSocket dependency
fix import
fix typo
adding server side event client manager
adding more events to track
adding trigger custom events
remove unnecesary require
fix on message to call depending on data.type received
using events in study
fix
fix frontend jwt
adding new endpoint
adding update game activity
fix
fix in gameplay painter
fix username
fix percent
fix
fix
fix game play
fix
fix
fix
fix
fix refresh for scheduler + gameplay painter
fix
adding construct map parameters for signature for signed url
adding manual and fixing gameplay activity
adding limesurvey painter update activity
update limesurvey events
fix limesurvey activity painter
adding edit activity button (not enabled for the moment)
edit test
adding token signature encoder
fix import generation of signature hmac in sse
remove comment
fix edit study, test and activities
fix
fix percentage + edit study name
fix using patch
adding hmac signature
trying to import key after generating it
fix using browserify ./public/libs/SSEClientManager.js -o ./public/libs/SSEClientManager-bundle.js
adding import/export study
adding image + fix file upload
fix update activity progress
function in utils instead of repeating functions
adding edit group name
fix config
fix using hmacKeyConfig for hmac config
remove extra variables
adding duplicate test button
fix using generated presigned url in simva api
adding update limesurvey
button edit limesurvey + update owner of survey
fix copy survey when editing
remove extra file
remove ws package
delete group
fix get survey list when edit
fix update survey list
adding name in confirm when removing group owner participants, study, test, activity + reorder partial done in progress
set study active / archived
redirect to first not completed study
fix activity result
fix see backup
fix update activity painter
fix update activity result limesurvey
fix redirect to scheduler view
redirect to studies and groups page when accessing to a group you don't have access
fix error bad gateway
fix update result gameplay
fix gameplay activity completion via adding checkbox in teacher dashboard
Adding refresh button
fix
Adding redirect tor openid with only token to enter
fix openidscheduler
fix register token users + update xasu config
choose with new and previous generation + update passport to keycloak to only use one custom KeyCloakStrategy with 2 possibles additionals parameters
fix save username + participant row pdf
fix getUsernameOrToken in activities display
fix url
fix group page as deprecated
fix group view
disable simva event
remove some extra logs for debugging
fix activity painter backup result
adding pino in backend for frontend
adding presigned events url
adding kafka consumer
fix processMessage from kafka and send them to clients
adding display of student token in simva
disable access to sso page when it is a token
fix display
adding ping message at first + every 5 minutes when new message received from another client
move events to /events instead of /studies/id/events and /scheduler/id/events + fix students events
fix sse adding schedule task
fix schedule task
fix refresh token
fix refresh auth scheduler
fix some some to debug
use ping event to refresh simva token
fix update jwt token
fix using client list for case of multiple tabs opened
fix logout
fix remove client
fix refresh token in all pages
fix reconnection and close connection on error in SSE
adding bff call to simva to remove afterward jwt from frontend
adding bff all requests
fix some bff functions
adding shlink config url tiny generation
fix generateShlinkURL
fix survey
all compaction in bff instead of backend simva api
fix update auth token in bff
get complete study in /studies/:studyid route in bff
update group view to paint participants from updated group.participants in bff
fix concatenation in bff
fix status completion
close connection before unload page
fix spaces
fix activity controler + others calls to bff instead of client
fix refresh auth also in requests
fix refresh auth in requests
fix getRefreshSessionsList
fix reloadStudy in bff
fix request to api after check auth and Refresh with callback
export study in bff
fix bff error response + export import of study
fix import study from export
fix filter
fix duplicate test in bff
fix xasu config
refresh auth only on scheduler and study page when receiving refreshAuth type message using new function isAuthRefresh to check the token expiration only
fix index redirectOpenId and authExpiredAndRefreshAuthWithCallback in auth
fix auth combining function for oauth2 with Keycloak and redirect in usertools
fix auth for bff calls
fix refresh access token
update refresh time for schedule task
fix auth function
fix cookie maxage in config
fix add group
remove mongoose
fix delete complete in group and study + fix patch studies//tests/ instead of /test/
fix remove session
fix updateParticipants
fix study, test and activity bff calls removed + fix refresh study
adding language selection for survey
fix duplicate test
fix surveyid not changed format
Fix generate shlink + possibility of delete url
fix utils
adding domain shlink
fix gameplay progress for gameplay activtity rounding result when updating activity progress
fix update activityprogress to update when restart game
adding logs gitignore
fix logger
update gameplaypainter game uri edition
adding profiling in dev script
adding gitignore on profiling files
adding perf output for functions graph
adding docker file
fix docker file
fix dockerfile
fix docker startup
fix dockerfile
fix dockerfile
adding publish new version to docker hub when pushing in master
fix build dockerfile
fix chmod
fix logger
fix console.log in logger
adding heat profiling
fix profiling in api
fix gitignore
fix profiling
Update gameplaypainter.js
Adding progress through game
Adding Activity progression
desactivate setInterval for now
fix partial
fix backup result
fix order
fix email as example.com and not dummy.dum
remove call to LTI platform in simva api in study view (todo create a new view for the lti plateforms)
fix default
revert changes
---
.dockerignore | 4 +
.github/workflows/docker-publish.yml | 96 ++
.gitignore | 3 +
Dockerfile | 28 +
README.md | 0
bin/www | 13 +-
config.js | 21 +
docker-compose.yaml | 0
docker-startup.sh | 1 +
logger.js | 61 ++
logs/.gitignore | 4 +
package-lock.json | 863 ++++++++++++------
package.json | 13 +-
profiling.js | 49 +
public/activities/activitypainter.js | 419 ++++++++-
public/activities/gameplaypainter.js | 243 ++---
public/activities/imspackagepainter.js | 81 +-
public/activities/limesurveypainter.js | 285 +++---
public/activities/ltitoolpainter.js | 68 +-
public/activities/manualpainter.js | 180 ++--
public/activities/miniopainter.js | 43 +-
public/activities/rageanalyticspainter.js | 43 +-
public/activities/rageminiopainter.js | 43 +-
public/allocators/defaultallocatorpainter.js | 5 +-
public/allocators/groupallocatorpainter.js | 3 -
public/config.jpg | Bin 0 -> 5389 bytes
public/css/loader.css | 0
public/css/style.css | 0
public/favicon.ico | Bin
public/icon/back.png | Bin
public/icon/check.png | Bin
public/icon/editar.png | Bin
public/icon/gear.png | Bin
public/icon/group.png | Bin
public/icon/home.png | Bin
public/icon/info.png | Bin
public/icon/pdf.png | Bin
public/icon/power.png | Bin
public/icon/refresh.png | Bin 0 -> 94109 bytes
public/icon/study.png | Bin
public/icon/survey.png | Bin
public/icon/user.png | Bin
public/icon/user_white.png | Bin
public/icon/word.png | Bin
public/jquery.js | 0
public/libs/SSEClientManager.js | 96 ++
public/libs/jsonTree/icons.svg | 0
public/libs/jsonTree/jsonTree.css | 0
public/libs/jsonTree/jsonTree.js | 0
public/libs/wsConnection.js | 62 ++
public/login.png | Bin
public/logo.png | Bin
public/logo.psd | Bin
public/logo_text.png | Bin
public/logo_text.psd | Bin
public/simva.js | 283 +++---
public/toast/jquery.toast.css | 0
public/toast/jquery.toast.js | 0
public/traces/.gitignore | 0
public/ua.png | Bin
public/ua.psd | Bin
public/utils.js | 67 +-
public/wallpaper.png | Bin
routes/index.js | 104 +--
routes/lib/activitiescontroler.js | 164 ++++
routes/lib/date.js | 142 +++
routes/lib/groupcontroler.js | 46 +
routes/lib/hMacKey/base58-universal/README.md | 1 +
routes/lib/hMacKey/base58-universal/baseN.js | 157 ++++
routes/lib/hMacKey/base58-universal/index.js | 31 +
routes/lib/hMacKey/crypto.js | 253 +++++
routes/lib/hMacKey/tokens.js | 55 ++
routes/lib/kafka.js | 79 ++
routes/lib/simva.js | 378 ++++++++
routes/lib/sseClientsListManager.js | 71 ++
routes/lib/sseManager.js | 86 ++
routes/lib/studycontroler.js | 136 +++
routes/lib/testscontroler.js | 69 ++
routes/lib/userClientsListManager.js | 104 +++
routes/lib/usertools.js | 196 +++-
routes/lib/utils.js | 78 ++
routes/routes/activities.js | 0
routes/routes/bff.js | 612 +++++++++++++
routes/routes/events.js | 71 ++
routes/routes/groups.js | 4 +-
routes/routes/previous-groups.js | 15 +
routes/routes/scheduler.js | 0
routes/routes/studies.js | 118 ++-
routes/routes/users.js | 65 +-
views/about.ejs | 2 +-
views/activities_list.ejs | 2 +-
views/css/css.css | 0
views/groups_list.ejs | 78 --
views/home.ejs | 2 +-
views/layout.ejs | 19 +-
views/layout_with_menu.ejs | 19 +-
views/layout_with_menu_and_sse.ejs | 103 +++
views/new_group_view.ejs | 443 +++++++++
views/new_groups_list.ejs | 157 ++++
...group_view.ejs => previous_group_view.ejs} | 163 ++--
views/previous_groups_list.ejs | 157 ++++
views/scheduler.ejs | 107 ++-
views/studenthome.ejs | 5 +-
views/studies_list.ejs | 148 ++-
views/studies_play.ejs | 29 +-
views/study_view.ejs | 725 ++++++++++++---
views/users_contact_admin.ejs | 0
views/users_login.ejs | 0
views/users_role_edit.ejs | 5 -
109 files changed, 6752 insertions(+), 1524 deletions(-)
create mode 100755 .dockerignore
create mode 100755 .github/workflows/docker-publish.yml
mode change 100644 => 100755 .gitignore
create mode 100755 Dockerfile
mode change 100644 => 100755 README.md
mode change 100644 => 100755 bin/www
mode change 100644 => 100755 config.js
mode change 100644 => 100755 docker-compose.yaml
create mode 100755 logger.js
create mode 100755 logs/.gitignore
mode change 100644 => 100755 package-lock.json
mode change 100644 => 100755 package.json
create mode 100755 profiling.js
mode change 100644 => 100755 public/activities/activitypainter.js
mode change 100644 => 100755 public/activities/gameplaypainter.js
mode change 100644 => 100755 public/activities/imspackagepainter.js
mode change 100644 => 100755 public/activities/limesurveypainter.js
mode change 100644 => 100755 public/activities/ltitoolpainter.js
mode change 100644 => 100755 public/activities/manualpainter.js
mode change 100644 => 100755 public/activities/miniopainter.js
mode change 100644 => 100755 public/activities/rageanalyticspainter.js
mode change 100644 => 100755 public/activities/rageminiopainter.js
mode change 100644 => 100755 public/allocators/defaultallocatorpainter.js
mode change 100644 => 100755 public/allocators/groupallocatorpainter.js
create mode 100755 public/config.jpg
mode change 100644 => 100755 public/css/loader.css
mode change 100644 => 100755 public/css/style.css
mode change 100644 => 100755 public/favicon.ico
mode change 100644 => 100755 public/icon/back.png
mode change 100644 => 100755 public/icon/check.png
mode change 100644 => 100755 public/icon/editar.png
mode change 100644 => 100755 public/icon/gear.png
mode change 100644 => 100755 public/icon/group.png
mode change 100644 => 100755 public/icon/home.png
mode change 100644 => 100755 public/icon/info.png
mode change 100644 => 100755 public/icon/pdf.png
mode change 100644 => 100755 public/icon/power.png
create mode 100755 public/icon/refresh.png
mode change 100644 => 100755 public/icon/study.png
mode change 100644 => 100755 public/icon/survey.png
mode change 100644 => 100755 public/icon/user.png
mode change 100644 => 100755 public/icon/user_white.png
mode change 100644 => 100755 public/icon/word.png
mode change 100644 => 100755 public/jquery.js
create mode 100755 public/libs/SSEClientManager.js
mode change 100644 => 100755 public/libs/jsonTree/icons.svg
mode change 100644 => 100755 public/libs/jsonTree/jsonTree.css
mode change 100644 => 100755 public/libs/jsonTree/jsonTree.js
create mode 100755 public/libs/wsConnection.js
mode change 100644 => 100755 public/login.png
mode change 100644 => 100755 public/logo.png
mode change 100644 => 100755 public/logo.psd
mode change 100644 => 100755 public/logo_text.png
mode change 100644 => 100755 public/logo_text.psd
mode change 100644 => 100755 public/simva.js
mode change 100644 => 100755 public/toast/jquery.toast.css
mode change 100644 => 100755 public/toast/jquery.toast.js
mode change 100644 => 100755 public/traces/.gitignore
mode change 100644 => 100755 public/ua.png
mode change 100644 => 100755 public/ua.psd
mode change 100644 => 100755 public/utils.js
mode change 100644 => 100755 public/wallpaper.png
mode change 100644 => 100755 routes/index.js
create mode 100755 routes/lib/activitiescontroler.js
create mode 100755 routes/lib/date.js
create mode 100755 routes/lib/groupcontroler.js
create mode 100755 routes/lib/hMacKey/base58-universal/README.md
create mode 100755 routes/lib/hMacKey/base58-universal/baseN.js
create mode 100755 routes/lib/hMacKey/base58-universal/index.js
create mode 100755 routes/lib/hMacKey/crypto.js
create mode 100755 routes/lib/hMacKey/tokens.js
create mode 100755 routes/lib/kafka.js
create mode 100755 routes/lib/simva.js
create mode 100755 routes/lib/sseClientsListManager.js
create mode 100755 routes/lib/sseManager.js
create mode 100755 routes/lib/studycontroler.js
create mode 100755 routes/lib/testscontroler.js
create mode 100755 routes/lib/userClientsListManager.js
mode change 100644 => 100755 routes/lib/usertools.js
create mode 100755 routes/lib/utils.js
mode change 100644 => 100755 routes/routes/activities.js
create mode 100755 routes/routes/bff.js
create mode 100755 routes/routes/events.js
mode change 100644 => 100755 routes/routes/groups.js
create mode 100755 routes/routes/previous-groups.js
mode change 100644 => 100755 routes/routes/scheduler.js
mode change 100644 => 100755 routes/routes/studies.js
mode change 100644 => 100755 routes/routes/users.js
mode change 100644 => 100755 views/about.ejs
mode change 100644 => 100755 views/activities_list.ejs
mode change 100644 => 100755 views/css/css.css
delete mode 100644 views/groups_list.ejs
mode change 100644 => 100755 views/home.ejs
mode change 100644 => 100755 views/layout.ejs
mode change 100644 => 100755 views/layout_with_menu.ejs
create mode 100755 views/layout_with_menu_and_sse.ejs
create mode 100755 views/new_group_view.ejs
create mode 100755 views/new_groups_list.ejs
rename views/{group_view.ejs => previous_group_view.ejs} (71%)
mode change 100644 => 100755
create mode 100755 views/previous_groups_list.ejs
mode change 100644 => 100755 views/scheduler.ejs
mode change 100644 => 100755 views/studenthome.ejs
mode change 100644 => 100755 views/studies_list.ejs
mode change 100644 => 100755 views/studies_play.ejs
mode change 100644 => 100755 views/study_view.ejs
mode change 100644 => 100755 views/users_contact_admin.ejs
mode change 100644 => 100755 views/users_login.ejs
mode change 100644 => 100755 views/users_role_edit.ejs
diff --git a/.dockerignore b/.dockerignore
new file mode 100755
index 00000000..0eb2006c
--- /dev/null
+++ b/.dockerignore
@@ -0,0 +1,4 @@
+node_modules
+.github
+Dockerfile
+.dockerignore
\ No newline at end of file
diff --git a/.github/workflows/docker-publish.yml b/.github/workflows/docker-publish.yml
new file mode 100755
index 00000000..04b97511
--- /dev/null
+++ b/.github/workflows/docker-publish.yml
@@ -0,0 +1,96 @@
+name: Docker
+
+# This workflow uses actions that are not certified by GitHub.
+# They are provided by a third-party and are governed by
+# separate terms of service, privacy policy, and support
+# documentation.
+
+on:
+ push:
+ branches: [ "master" ]
+ # Publish semver tags as releases.
+ tags: [ 'v*.*.*' ]
+ pull_request:
+ branches: [ "master" ]
+
+env:
+ # Use docker.io for Docker Hub if empty
+ REGISTRY: docker.io
+ # github.repository as /
+ IMAGE_NAME: ${{ github.repository }}
+
+
+jobs:
+ build:
+
+ runs-on: ubuntu-latest
+ permissions:
+ contents: read
+ packages: write
+ # This is used to complete the identity challenge
+ # with sigstore/fulcio when running outside of PRs.
+ id-token: write
+
+ steps:
+ - name: Checkout repository
+ uses: actions/checkout@v4
+
+ # Install the cosign tool except on PR
+ # https://github.com/sigstore/cosign-installer
+ - name: Install cosign
+ if: github.event_name != 'pull_request'
+ uses: sigstore/cosign-installer@59acb6260d9c0ba8f4a2f9d9b48431a222b68e20 #v3.5.0
+ with:
+ cosign-release: 'v2.2.4'
+
+ # Set up BuildKit Docker container builder to be able to build
+ # multi-platform images and export cache
+ # https://github.com/docker/setup-buildx-action
+ - name: Set up Docker Buildx
+ uses: docker/setup-buildx-action@f95db51fddba0c2d1ec667646a06c2ce06100226 # v3.0.0
+
+ # Login against a Docker registry except on PR
+ # https://github.com/docker/login-action
+ - name: Log into registry ${{ env.REGISTRY }}
+ if: github.event_name != 'pull_request'
+ uses: docker/login-action@343f7c4344506bcbf9b4de18042ae17996df046d # v3.0.0
+ with:
+ registry: ${{ env.REGISTRY }}
+ username: ${{ github.actor }}
+ password: ${{ secrets.GITHUB_TOKEN }}
+
+ # Extract metadata (tags, labels) for Docker
+ # https://github.com/docker/metadata-action
+ - name: Extract Docker metadata
+ id: meta
+ uses: docker/metadata-action@96383f45573cb7f253c731d3b3ab81c87ef81934 # v5.0.0
+ with:
+ images: ${{ env.REGISTRY }}/${{ env.IMAGE_NAME }}
+
+ # Build and push Docker image with Buildx (don't push on PR)
+ # https://github.com/docker/build-push-action
+ - name: Build and push Docker image
+ id: build-and-push
+ uses: docker/build-push-action@0565240e2d4ab88bba5387d719585280857ece09 # v5.0.0
+ with:
+ context: .
+ push: ${{ github.event_name != 'pull_request' }}
+ tags: ${{ steps.meta.outputs.tags }}
+ labels: ${{ steps.meta.outputs.labels }}
+ cache-from: type=gha
+ cache-to: type=gha,mode=max
+
+ # Sign the resulting Docker image digest except on PRs.
+ # This will only write to the public Rekor transparency log when the Docker
+ # repository is public to avoid leaking data. If you would like to publish
+ # transparency data even for private images, pass --force to cosign below.
+ # https://github.com/sigstore/cosign
+ - name: Sign the published Docker image
+ if: ${{ github.event_name != 'pull_request' }}
+ env:
+ # https://docs.github.com/en/actions/security-guides/security-hardening-for-github-actions#using-an-intermediate-environment-variable
+ TAGS: ${{ steps.meta.outputs.tags }}
+ DIGEST: ${{ steps.build-and-push.outputs.digest }}
+ # This step uses the identity token to provision an ephemeral certificate
+ # against the sigstore community Fulcio instance.
+ run: echo "${TAGS}" | xargs -I {} cosign sign --yes {}@${DIGEST}
\ No newline at end of file
diff --git a/.gitignore b/.gitignore
old mode 100644
new mode 100755
index dcaac7f9..fc0146e5
--- a/.gitignore
+++ b/.gitignore
@@ -3,3 +3,6 @@
# Config files
config-test.js
+*.log
+*.heapsnapshot
+*.crt
\ No newline at end of file
diff --git a/Dockerfile b/Dockerfile
new file mode 100755
index 00000000..7cf85c20
--- /dev/null
+++ b/Dockerfile
@@ -0,0 +1,28 @@
+FROM node:20.18.3-bullseye
+
+# Install ca-certificates and update them
+RUN apt-get update && apt-get install -y --no-install-recommends \
+ ca-certificates && \
+ update-ca-certificates && \
+ apt-get clean && rm -rf /var/lib/apt/lists/*
+
+RUN mkdir -p /home/node/app/node_modules && chown -R node:node /home/node/app
+
+# Set the working directory
+WORKDIR /home/node/app
+
+COPY --chown=node:node package*.json ./
+
+USER node
+
+RUN npm install
+
+# Copy the current directory contents into the container at /app
+COPY --chown=node:node . .
+
+RUN mkdir -p /home/node/logs && chown -R node:node /home/node/logs
+
+# Make port 3050 available to the world outside this container
+EXPOSE 3050
+
+CMD [ "/home/node/app/docker-startup.sh" ]
\ No newline at end of file
diff --git a/README.md b/README.md
old mode 100644
new mode 100755
diff --git a/bin/www b/bin/www
old mode 100644
new mode 100755
index afa3550e..5f4e5b21
--- a/bin/www
+++ b/bin/www
@@ -6,8 +6,7 @@
const app = require('../routes');
const http = require('http');
const config = require('../config');
-
-
+const logger = require('../logger');
//XXX
//require('https').globalAgent.options.ca = require('ssl-root-cas/latest').create();
@@ -58,17 +57,17 @@ function onError (error) {
const bind = typeof port === 'string' ? `Pipe ${port}` : `Port ${port}`;
- console.log(error.code);
- console.log(error);
+ logger.info(error.code);
+ logger.info(error);
// handle specific listen errors with friendly messages
switch (error.code) {
case 'EACCES':
- console.log(`${bind} requires elevated privileges`);
+ logger.info(`${bind} requires elevated privileges`);
process.exit(1);
break;
case 'EADDRINUSE':
- console.log(`${bind} is already in use`);
+ logger.info(`${bind} is already in use`);
process.exit(1);
break;
default:
@@ -82,5 +81,5 @@ function onError (error) {
function onListening () {
const addr = server.address();
const bind = typeof addr === 'string' ? `pipe ${addr}` : `port ${addr.port}`;
- console.log(`Listening on ${bind}`);
+ logger.info(`Listening on ${bind}`);
}
diff --git a/config.js b/config.js
old mode 100644
new mode 100755
index ae78075a..2448b676
--- a/config.js
+++ b/config.js
@@ -11,6 +11,7 @@ config.simva.host = process.env.SIMVA_HOST || 'simva.external.test'
config.simva.protocol = process.env.SIMVA_PROTOCOL || 'https'
let simvaPort = ((default_protocol_ports[config.simva.protocol] !== config.simva.port) ? `:${config.simva.port}` : '')
config.simva.url = process.env.SIMVA_URL || `${config.simva.protocol}://${config.simva.host}${simvaPort}`;
+config.simva.cookieMaxAgeInMin=process.env.SIMVA_COOKIE_MAX_AGE_IN_MIN || 4*60
config.mongo = {}
config.mongo.host = process.env.MONGO_HOST || 'localhost:27017'
@@ -56,7 +57,27 @@ config.limesurvey.url = `${config.limesurvey.protocol}://${config.limesurvey.ho
config.limesurvey.adminUser = process.env.LIMESURVEY_ADMIN_USER || 'admin'
config.limesurvey.adminPassword = process.env.LIMESURVEY_ADMIN_PASSWORD || 'password'
+config.hmac = {}
+config.hmac.password = process.env.HMAC_PASSWORD || 'mypassword'
+config.hmac.salt = process.env.HMAC_SALT || 'mysalt'
+config.hmac.key = process.env.HMAC_KEY || 'mykey'
+config.hmac.hmacKey = null
+
config.lti = {}
config.lti.enabled = process.env.LTI_ENABLED || 'false'
+config.kafka = {}
+config.kafka.clientId= process.env.SIMVA_KAFKA_CLIENTID || 'my-client-id'
+config.kafka.brokers= [ process.env.SIMVA_KAFKA_BROKER ] || ['localhost:9092']
+config.kafka.groupId= process.env.SIMVA_KAFKA_GROUPID || 'my-group-id'
+config.kafka.topic= process.env.SIMVA_KAFKA_SIMVA_EVENTS_TOPIC || 'minio-events'
+
+config.shlink = {}
+config.shlink.apihost = process.env.SHLINK_SERVER_HOST || 'shlink.external.test'
+config.shlink.protocol = process.env.SHLINK_PROTOCOL || 'https'
+config.shlink.port = process.env.SHLINK_PORT || '443'
+config.shlink.apiurl = `${config.shlink.protocol}://${config.shlink.apihost}:${config.shlink.port}`
+config.shlink.apikey = process.env.SHLINK_SERVER_API_KEY || 'myapikey'
+
+
module.exports = config;
\ No newline at end of file
diff --git a/docker-compose.yaml b/docker-compose.yaml
old mode 100644
new mode 100755
diff --git a/docker-startup.sh b/docker-startup.sh
index b1a3c5cf..dc186efd 100755
--- a/docker-startup.sh
+++ b/docker-startup.sh
@@ -8,6 +8,7 @@ fi
if [[ "${NODE_ENV:-production}" == "development" ]]; then
npm run dev
+ #perf record -e cycles:u -g -- npm run dev > perf.out
else
npm start
fi
\ No newline at end of file
diff --git a/logger.js b/logger.js
new file mode 100755
index 00000000..ef3e8d4c
--- /dev/null
+++ b/logger.js
@@ -0,0 +1,61 @@
+const pino = require('pino');
+const config = require('./config.js');
+const path = require('path');
+const logsFolder =process.env.LOG_FOLDER || path.join(__dirname, '../../logs');
+var now = new Date();
+const logFile = `${logsFolder}/${now.toISOString().replace(/:/g, '-')}.log`;
+/** @type {{targets:import('pino').TransportTargetOptions[]}} */
+
+/** @type {import('pino').LoggerOptions} */
+const options = {
+ level: (process.env.LOG_LEVEL || 'info').toLowerCase(),
+ redact: {
+ paths: ['clientSecret','password', 'api.adminPassword', 'JWT.secret', 'limesurvey.adminPassword', 'sso.clientSecret', 'sso.adminPassword', 'a2.adminPassword', 'LTI.platform.mongo.password', 'LTI.platform.key'],
+ censor: '**REDACTED**'
+ },
+ customLevels: { log: 30 },
+ serializers: {
+ err: pino.stdSerializers.err,
+ req: pino.stdSerializers.req,
+ res: pino.stdSerializers.res
+ }
+}
+let targets = [
+ {
+ target: 'pino/file',
+ level: (process.env.LOG_LEVEL || 'info').toLowerCase(),
+ options: {
+ destination: logFile,
+ singleLine: true
+ }
+ }
+];
+if (process.env.NODE_ENV !== 'production') {
+targets.push(
+ {
+ target: 'pino-pretty',
+ level: (process.env.LOG_LEVEL || 'info').toLowerCase(),
+ options: {
+ ignore: 'pid,hostname'
+ }
+ }
+);
+}
+
+
+const transport = pino.transport({
+targets: targets
+});
+
+const logger = pino(options, transport);
+
+process.on('uncaughtException', err => {
+ logger.fatal(err, 'uncaughtException')
+ process.exitCode = 1
+});
+
+process.on('unhandledRejection', reason =>
+ logger.fatal(reason, 'unhandledRejection')
+);
+
+module.exports = logger;
\ No newline at end of file
diff --git a/logs/.gitignore b/logs/.gitignore
new file mode 100755
index 00000000..21910320
--- /dev/null
+++ b/logs/.gitignore
@@ -0,0 +1,4 @@
+# Ignore all files in this dir...
+*
+# ... except for this one.
+!.gitignore
\ No newline at end of file
diff --git a/package-lock.json b/package-lock.json
old mode 100644
new mode 100755
index 919873ed..2e0fa172
--- a/package-lock.json
+++ b/package-lock.json
@@ -19,49 +19,22 @@
"express-session": "1.15.6",
"html": "^1.0.0",
"jsonwebtoken": "^9.0.0",
- "mongoose": "^5.7.8",
+ "kafkajs": "^2.2.4",
+ "node-cron": "3.0.3",
"passport": "^0.6.0",
- "passport-keycloak-oauth2-oidc": "^1.0.3"
+ "passport-keycloak-oauth2-oidc": "^1.0.3",
+ "pino": "^9.6.0"
},
"devDependencies": {
- "nodemon": "^3.1.4"
+ "nodemon": "^3.1.4",
+ "pino-pretty": "^13.0.0"
}
},
- "node_modules/@types/bson": {
- "version": "4.0.5",
- "resolved": "https://registry.npmjs.org/@types/bson/-/bson-4.0.5.tgz",
- "integrity": "sha512-vVLwMUqhYJSQ/WKcE60eFqcyuWse5fGH+NMAXHuKrUAPoryq3ATxk5o4bgYNtg5aOM4APVg7Hnb3ASqUYG0PKg==",
- "dependencies": {
- "@types/node": "*"
- }
- },
- "node_modules/@types/mongodb": {
- "version": "3.6.20",
- "resolved": "https://registry.npmjs.org/@types/mongodb/-/mongodb-3.6.20.tgz",
- "integrity": "sha512-WcdpPJCakFzcWWD9juKoZbRtQxKIMYF/JIAM4JrNHrMcnJL6/a2NWjXxW7fo9hxboxxkg+icff8d7+WIEvKgYQ==",
- "dependencies": {
- "@types/bson": "*",
- "@types/node": "*"
- }
- },
- "node_modules/@types/node": {
- "version": "20.11.23",
- "resolved": "https://registry.npmjs.org/@types/node/-/node-20.11.23.tgz",
- "integrity": "sha512-ZUarKKfQuRILSNYt32FuPL20HS7XwNT7/uRwSV8tiHWfyyVwDLYZNF6DZKc2bove++pgfsXn9sUwII/OsQ82cQ==",
- "dependencies": {
- "undici-types": "~5.26.4"
- }
- },
- "node_modules/abbrev": {
- "version": "1.1.1",
- "resolved": "https://registry.npmjs.org/abbrev/-/abbrev-1.1.1.tgz",
- "integrity": "sha512-nne9/IiQ/hzIhY6pdDnbBtz7DjPTKrY00P/zvPSm5pOFkl6xuGrGnXn/VtTNNfNtAfZ9/1RtehkszU9qcTii0Q==",
- "dev": true
- },
"node_modules/accepts": {
"version": "1.3.8",
"resolved": "https://registry.npmjs.org/accepts/-/accepts-1.3.8.tgz",
"integrity": "sha512-PYAthTa2m2VKxuvSD3DPC/Gy+U+sOA1LAuT8mkmRuvw+NACSaeXEQ+NHcVF7rONl6qcaxV3Uuemwawk+7+SJLw==",
+ "license": "MIT",
"dependencies": {
"mime-types": "~2.1.34",
"negotiator": "0.6.3"
@@ -74,6 +47,7 @@
"version": "4.3.0",
"resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz",
"integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==",
+ "license": "MIT",
"dependencies": {
"color-convert": "^2.0.1"
},
@@ -89,6 +63,7 @@
"resolved": "https://registry.npmjs.org/anymatch/-/anymatch-3.1.3.tgz",
"integrity": "sha512-KMReFUr0B4t+D+OBkjR3KYqvocp2XaSzO55UcB6mgQMd3KbcE+mWTyvVV7D/zsdEbNnV6acZUutkiHQXvTr1Rw==",
"dev": true,
+ "license": "ISC",
"dependencies": {
"normalize-path": "^3.0.0",
"picomatch": "^2.0.4"
@@ -100,22 +75,34 @@
"node_modules/array-flatten": {
"version": "1.1.1",
"resolved": "https://registry.npmjs.org/array-flatten/-/array-flatten-1.1.1.tgz",
- "integrity": "sha512-PCVAQswWemu6UdxsDFFX/+gVeYqKAod3D3UVm91jHwynguOwAvYPhx8nNlM++NqRcK6CxxpUafjmhIdKiHibqg=="
+ "integrity": "sha512-PCVAQswWemu6UdxsDFFX/+gVeYqKAod3D3UVm91jHwynguOwAvYPhx8nNlM++NqRcK6CxxpUafjmhIdKiHibqg==",
+ "license": "MIT"
},
"node_modules/async": {
- "version": "3.2.5",
- "resolved": "https://registry.npmjs.org/async/-/async-3.2.5.tgz",
- "integrity": "sha512-baNZyqaaLhyLVKm/DlvdW051MSgO6b8eVfIezl9E5PqWxFgzLm/wQntEW4zOytVburDEr0JlALEpdOFwvErLsg=="
+ "version": "3.2.6",
+ "resolved": "https://registry.npmjs.org/async/-/async-3.2.6.tgz",
+ "integrity": "sha512-htCUDlxyyCLMgaM3xXg0C0LW2xqfuQ6p05pCEIsXuyQ+a1koYKTuBMzRNwmybfLgvJDMd0r1LTn4+E0Ti6C2AA==",
+ "license": "MIT"
},
"node_modules/asynckit": {
"version": "0.4.0",
"resolved": "https://registry.npmjs.org/asynckit/-/asynckit-0.4.0.tgz",
- "integrity": "sha512-Oei9OH4tRh0YqU3GxhX79dM/mwVgvbZJaSNaRk+bshkj0S5cfHcgYakreBjrHwatXKbz+IoIdYLxrKim2MjW0Q=="
+ "integrity": "sha512-Oei9OH4tRh0YqU3GxhX79dM/mwVgvbZJaSNaRk+bshkj0S5cfHcgYakreBjrHwatXKbz+IoIdYLxrKim2MjW0Q==",
+ "license": "MIT"
+ },
+ "node_modules/atomic-sleep": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/atomic-sleep/-/atomic-sleep-1.0.0.tgz",
+ "integrity": "sha512-kNOjDqAh7px0XWNI+4QbzoiR/nTkHAWNud2uvnJquD1/x5a7EQZMJT0AczqK0Qn67oY/TTQ1LbUKajZpp3I9tQ==",
+ "license": "MIT",
+ "engines": {
+ "node": ">=8.0.0"
+ }
},
"node_modules/axios": {
- "version": "1.7.7",
- "resolved": "https://registry.npmjs.org/axios/-/axios-1.7.7.tgz",
- "integrity": "sha512-S4kL7XrjgBmvdGut0sN3yJxqYzrDOnivkBiN0OFs6hLiUam3UPvswUo0kqGyhqUZGEOytHyumEdXsAkgCOUf3Q==",
+ "version": "1.7.9",
+ "resolved": "https://registry.npmjs.org/axios/-/axios-1.7.9.tgz",
+ "integrity": "sha512-LhLcE7Hbiryz8oMDdDptSrWowmB4Bl6RCt6sIJKpRB4XtVf0iEgewX3au/pJqm+Py1kCASkb/FFKjxQaLtxJvw==",
"license": "MIT",
"dependencies": {
"follow-redirects": "^1.15.6",
@@ -123,55 +110,44 @@
"proxy-from-env": "^1.1.0"
}
},
- "node_modules/axios/node_modules/form-data": {
- "version": "4.0.0",
- "resolved": "https://registry.npmjs.org/form-data/-/form-data-4.0.0.tgz",
- "integrity": "sha512-ETEklSGi5t0QMZuiXoA/Q6vcnxcLQP5vdugSpuAyi6SVGi2clPPp+xgEhuMaHC+zGgn31Kd235W35f7Hykkaww==",
- "dependencies": {
- "asynckit": "^0.4.0",
- "combined-stream": "^1.0.8",
- "mime-types": "^2.1.12"
- },
- "engines": {
- "node": ">= 6"
- }
- },
"node_modules/balanced-match": {
"version": "1.0.2",
"resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz",
- "integrity": "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw=="
+ "integrity": "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==",
+ "license": "MIT"
},
"node_modules/base64url": {
"version": "3.0.1",
"resolved": "https://registry.npmjs.org/base64url/-/base64url-3.0.1.tgz",
"integrity": "sha512-ir1UPr3dkwexU7FdV8qBBbNDRUhMmIekYMFZfi+C/sLNnRESKPl23nB9b2pltqfOQNnGzsDdId90AEtG5tCx4A==",
+ "license": "MIT",
"engines": {
"node": ">=6.0.0"
}
},
"node_modules/binary-extensions": {
- "version": "2.2.0",
- "resolved": "https://registry.npmjs.org/binary-extensions/-/binary-extensions-2.2.0.tgz",
- "integrity": "sha512-jDctJ/IVQbZoJykoeHbhXpOlNBqGNcwXJKJog42E5HDPUwQTSdjCHdihjj0DlnheQ7blbT6dHOafNAiS8ooQKA==",
+ "version": "2.3.0",
+ "resolved": "https://registry.npmjs.org/binary-extensions/-/binary-extensions-2.3.0.tgz",
+ "integrity": "sha512-Ceh+7ox5qe7LJuLHoY0feh3pHuUDHAcRUeyL2VYghZwfpkNIy/+8Ocg0a3UuSoYzavmylwuLWQOf3hl0jjMMIw==",
"dev": true,
+ "license": "MIT",
"engines": {
"node": ">=8"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
}
},
"node_modules/bl": {
"version": "2.2.1",
"resolved": "https://registry.npmjs.org/bl/-/bl-2.2.1.tgz",
"integrity": "sha512-6Pesp1w0DEX1N550i/uGV/TqucVL4AM/pgThFSN/Qq9si1/DF9aIHs1BxD8V/QU0HoeHO6cQRTAuYnLPKq1e4g==",
+ "license": "MIT",
"dependencies": {
"readable-stream": "^2.3.5",
"safe-buffer": "^5.1.1"
}
},
- "node_modules/bluebird": {
- "version": "3.5.1",
- "resolved": "https://registry.npmjs.org/bluebird/-/bluebird-3.5.1.tgz",
- "integrity": "sha512-MKiLiV+I1AA596t9w1sQJ8jkiSr5+ZKi0WKrYGUn6d1Fx+Ij4tIj+m2WMQSGczs5jZVxV339chE8iwk6F64wjA=="
- },
"node_modules/body-parser": {
"version": "1.20.3",
"resolved": "https://registry.npmjs.org/body-parser/-/body-parser-1.20.3.tgz",
@@ -197,11 +173,13 @@
}
},
"node_modules/brace-expansion": {
- "version": "2.0.1",
- "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.1.tgz",
- "integrity": "sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA==",
+ "version": "1.1.11",
+ "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz",
+ "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==",
+ "license": "MIT",
"dependencies": {
- "balanced-match": "^1.0.0"
+ "balanced-match": "^1.0.0",
+ "concat-map": "0.0.1"
}
},
"node_modules/braces": {
@@ -209,6 +187,7 @@
"resolved": "https://registry.npmjs.org/braces/-/braces-3.0.3.tgz",
"integrity": "sha512-yQbXgO/OSZVD2IsiLlro+7Hf6Q18EJrKSEsdoMzKePKXct3gvD8oLcOQdIzGupr5Fj+EDe8gO/lxc1BzfMpxvA==",
"dev": true,
+ "license": "MIT",
"dependencies": {
"fill-range": "^7.1.1"
},
@@ -220,6 +199,7 @@
"version": "1.1.6",
"resolved": "https://registry.npmjs.org/bson/-/bson-1.1.6.tgz",
"integrity": "sha512-EvVNVeGo4tHxwi8L6bPj3y3itEvStdwvvlojVxxbyYfoaxJ6keLgrTuKdyfEAszFK+H3olzBuafE0yoh0D1gdg==",
+ "license": "Apache-2.0",
"engines": {
"node": ">=0.6.19"
}
@@ -227,12 +207,14 @@
"node_modules/buffer-equal-constant-time": {
"version": "1.0.1",
"resolved": "https://registry.npmjs.org/buffer-equal-constant-time/-/buffer-equal-constant-time-1.0.1.tgz",
- "integrity": "sha512-zRpUiDwd/xk6ADqPMATG8vc9VPrkck7T07OIx0gnjmJAnHnTVXNQG3vfvWNuiZIkwu9KrKdA1iJKfsfTVxE6NA=="
+ "integrity": "sha512-zRpUiDwd/xk6ADqPMATG8vc9VPrkck7T07OIx0gnjmJAnHnTVXNQG3vfvWNuiZIkwu9KrKdA1iJKfsfTVxE6NA==",
+ "license": "BSD-3-Clause"
},
"node_modules/buffer-from": {
"version": "1.1.2",
"resolved": "https://registry.npmjs.org/buffer-from/-/buffer-from-1.1.2.tgz",
- "integrity": "sha512-E+XQCRwSbaaiChtv6k6Dwgc+bx+Bs6vuKJHHl5kox/BaKbhiXzqQOwK4cO22yElGp2OCmjwVhT3HmxgyPGnJfQ=="
+ "integrity": "sha512-E+XQCRwSbaaiChtv6k6Dwgc+bx+Bs6vuKJHHl5kox/BaKbhiXzqQOwK4cO22yElGp2OCmjwVhT3HmxgyPGnJfQ==",
+ "license": "MIT"
},
"node_modules/busboy": {
"version": "1.6.0",
@@ -249,6 +231,7 @@
"version": "3.1.2",
"resolved": "https://registry.npmjs.org/bytes/-/bytes-3.1.2.tgz",
"integrity": "sha512-/Nf7TyzTx6S3yRJObOAV7956r8cr2+Oj8AC5dt8wSP3BQAoeX58NoHyCU8P8zGkNXStjTSi6fzO6F0pBdcYbEg==",
+ "license": "MIT",
"engines": {
"node": ">= 0.8"
}
@@ -276,6 +259,7 @@
"version": "4.1.2",
"resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz",
"integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==",
+ "license": "MIT",
"dependencies": {
"ansi-styles": "^4.1.0",
"supports-color": "^7.1.0"
@@ -292,6 +276,7 @@
"resolved": "https://registry.npmjs.org/chokidar/-/chokidar-3.6.0.tgz",
"integrity": "sha512-7VT13fmjotKpGipCW9JEQAusEPE+Ei8nl6/g4FBAmIm0GOOLMua9NDDo/DWp0ZAxCr3cPq5ZpBqmPAQgDda2Pw==",
"dev": true,
+ "license": "MIT",
"dependencies": {
"anymatch": "~3.1.2",
"braces": "~3.0.2",
@@ -315,6 +300,7 @@
"version": "2.0.1",
"resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz",
"integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==",
+ "license": "MIT",
"dependencies": {
"color-name": "~1.1.4"
},
@@ -325,12 +311,21 @@
"node_modules/color-name": {
"version": "1.1.4",
"resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz",
- "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA=="
+ "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==",
+ "license": "MIT"
+ },
+ "node_modules/colorette": {
+ "version": "2.0.20",
+ "resolved": "https://registry.npmjs.org/colorette/-/colorette-2.0.20.tgz",
+ "integrity": "sha512-IfEDxwoWIjkeXL1eXcDiow4UbKjhLdq6/EuSVR9GMN7KVH3r9gQ83e73hsz1Nd1T3ijd5xv1wcWRYO+D6kCI2w==",
+ "dev": true,
+ "license": "MIT"
},
"node_modules/combined-stream": {
"version": "1.0.8",
"resolved": "https://registry.npmjs.org/combined-stream/-/combined-stream-1.0.8.tgz",
"integrity": "sha512-FQN4MRfuJeHf7cBbBMJFXhKSDq+2kAArBlmRBvcvFE5BB1HZKXtSFASDhdlz9zOYwxh8lDdnvmMOe/+5cdoEdg==",
+ "license": "MIT",
"dependencies": {
"delayed-stream": "~1.0.0"
},
@@ -341,7 +336,8 @@
"node_modules/concat-map": {
"version": "0.0.1",
"resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz",
- "integrity": "sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg=="
+ "integrity": "sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==",
+ "license": "MIT"
},
"node_modules/concat-stream": {
"version": "1.6.2",
@@ -350,6 +346,7 @@
"engines": [
"node >= 0.8"
],
+ "license": "MIT",
"dependencies": {
"buffer-from": "^1.0.0",
"inherits": "^2.0.3",
@@ -361,6 +358,7 @@
"version": "3.2.0",
"resolved": "https://registry.npmjs.org/connect-mongo/-/connect-mongo-3.2.0.tgz",
"integrity": "sha512-0Mx88079Z20CG909wCFlR3UxhMYGg6Ibn1hkIje1hwsqOLWtL9HJV+XD0DAjUvQScK6WqY/FA8tSVQM9rR64Rw==",
+ "license": "MIT",
"dependencies": {
"mongodb": "^3.1.0"
}
@@ -369,6 +367,7 @@
"version": "0.5.4",
"resolved": "https://registry.npmjs.org/content-disposition/-/content-disposition-0.5.4.tgz",
"integrity": "sha512-FveZTNuGw04cxlAiWbzi6zTAL/lhehaWbTtgluJh4/E95DqMwTmha3KZN1aAWA8cFIhHzMZUvLevkw5Rqk+tSQ==",
+ "license": "MIT",
"dependencies": {
"safe-buffer": "5.2.1"
},
@@ -380,6 +379,7 @@
"version": "1.0.5",
"resolved": "https://registry.npmjs.org/content-type/-/content-type-1.0.5.tgz",
"integrity": "sha512-nTjqfcBFEipKdXCv4YDQWCfmcLZKm81ldF0pAopTvyrFGVbcR6P/VAAd5G7N+0tTr8QqiU0tFadD6FK4NtJwOA==",
+ "license": "MIT",
"engines": {
"node": ">= 0.6"
}
@@ -388,6 +388,7 @@
"version": "0.1.3",
"resolved": "https://registry.npmjs.org/cookie/-/cookie-0.1.3.tgz",
"integrity": "sha512-mWkFhcL+HVG1KjeCjEBVJJ7s4sAGMLiBDFSDs4bzzvgLZt7rW8BhP6XV/8b1+pNvx/skd3yYxPuaF3Z6LlQzyw==",
+ "license": "MIT",
"engines": {
"node": "*"
}
@@ -396,6 +397,7 @@
"version": "1.3.5",
"resolved": "https://registry.npmjs.org/cookie-parser/-/cookie-parser-1.3.5.tgz",
"integrity": "sha512-YN/8nzPcK5o6Op4MIzAd4H4qUal5+3UaMhVIeaafFYL0pKvBQA/9Yhzo7ZwvBpjdGshsiTAb1+FC37M6RdPDFg==",
+ "license": "MIT",
"dependencies": {
"cookie": "0.1.3",
"cookie-signature": "1.0.6"
@@ -407,22 +409,36 @@
"node_modules/cookie-signature": {
"version": "1.0.6",
"resolved": "https://registry.npmjs.org/cookie-signature/-/cookie-signature-1.0.6.tgz",
- "integrity": "sha512-QADzlaHc8icV8I7vbaJXJwod9HWYp8uCqf1xa4OfNu1T7JVxQIrUgOWtHdNDtPiywmFbiS12VjotIXLrKM3orQ=="
+ "integrity": "sha512-QADzlaHc8icV8I7vbaJXJwod9HWYp8uCqf1xa4OfNu1T7JVxQIrUgOWtHdNDtPiywmFbiS12VjotIXLrKM3orQ==",
+ "license": "MIT"
},
"node_modules/core-util-is": {
"version": "1.0.3",
"resolved": "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.3.tgz",
- "integrity": "sha512-ZQBvi1DcpJ4GDqanjucZ2Hj3wEO5pZDS89BWbkcrvdxksJorwUDDZamX9ldFkp9aw2lmBDLgkObEA4DWNJ9FYQ=="
+ "integrity": "sha512-ZQBvi1DcpJ4GDqanjucZ2Hj3wEO5pZDS89BWbkcrvdxksJorwUDDZamX9ldFkp9aw2lmBDLgkObEA4DWNJ9FYQ==",
+ "license": "MIT"
},
"node_modules/crc": {
"version": "3.4.4",
"resolved": "https://registry.npmjs.org/crc/-/crc-3.4.4.tgz",
- "integrity": "sha512-wcAOOnkzlwFAlFCCF20ZAiGn25JgSBy+oQrdOeszuk0bxI2nc29YFFmlCbDEfZJJljuw4XVqHrGV34J89910yA=="
+ "integrity": "sha512-wcAOOnkzlwFAlFCCF20ZAiGn25JgSBy+oQrdOeszuk0bxI2nc29YFFmlCbDEfZJJljuw4XVqHrGV34J89910yA==",
+ "license": "MIT"
+ },
+ "node_modules/dateformat": {
+ "version": "4.6.3",
+ "resolved": "https://registry.npmjs.org/dateformat/-/dateformat-4.6.3.tgz",
+ "integrity": "sha512-2P0p0pFGzHS5EMnhdxQi7aJN+iMheud0UhG4dlE1DLAlvL8JHjJJTX/CSm4JXwV0Ka5nGk3zC5mcb5bUQUxxMA==",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": "*"
+ }
},
"node_modules/debug": {
"version": "2.6.9",
"resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz",
"integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==",
+ "license": "MIT",
"dependencies": {
"ms": "2.0.0"
}
@@ -448,6 +464,7 @@
"version": "1.0.0",
"resolved": "https://registry.npmjs.org/delayed-stream/-/delayed-stream-1.0.0.tgz",
"integrity": "sha512-ZySD7Nf91aLB0RxL4KGrKHBXl7Eds1DAmEdcoVawXnLD7SDhpNgtuII2aAkg7a7QS41jxPSZ17p4VdGnMHk3MQ==",
+ "license": "MIT",
"engines": {
"node": ">=0.4.0"
}
@@ -456,6 +473,7 @@
"version": "1.5.1",
"resolved": "https://registry.npmjs.org/denque/-/denque-1.5.1.tgz",
"integrity": "sha512-XwE+iZ4D6ZUB7mfYRMb5wByE8L74HCn30FBN7sWnXksWc1LO1bPDl67pBR9o/kC4z/xSNAwkMYcGgqDV3BE3Hw==",
+ "license": "Apache-2.0",
"engines": {
"node": ">=0.10"
}
@@ -464,6 +482,7 @@
"version": "2.0.0",
"resolved": "https://registry.npmjs.org/depd/-/depd-2.0.0.tgz",
"integrity": "sha512-g7nH6P6dyDioJogAAGprGpCtVImJhpPk/roCzdb3fIh61/s/nPsfR6onyMwkCAR/OlC3yBC0lESvUoQEAssIrw==",
+ "license": "MIT",
"engines": {
"node": ">= 0.8"
}
@@ -472,6 +491,7 @@
"version": "1.2.0",
"resolved": "https://registry.npmjs.org/destroy/-/destroy-1.2.0.tgz",
"integrity": "sha512-2sJGJTaXIIaR1w4iJSNoN0hnMY7Gpc/n8D4qSCJw8QqFWXf7cuAgnEHxBpweaVcPevC2l3KpjYCx3NypQQgaJg==",
+ "license": "MIT",
"engines": {
"node": ">= 0.8",
"npm": "1.2.8000 || >= 1.4.16"
@@ -481,6 +501,7 @@
"version": "1.0.11",
"resolved": "https://registry.npmjs.org/ecdsa-sig-formatter/-/ecdsa-sig-formatter-1.0.11.tgz",
"integrity": "sha512-nagl3RYrbNv6kQkeJIpt6NJZy8twLB/2vtz6yN9Z4vRKHN4/QZJIEbqohALSgwKdnksuY3k5Addp5lg8sVoVcQ==",
+ "license": "Apache-2.0",
"dependencies": {
"safe-buffer": "^5.0.1"
}
@@ -488,12 +509,14 @@
"node_modules/ee-first": {
"version": "1.1.1",
"resolved": "https://registry.npmjs.org/ee-first/-/ee-first-1.1.1.tgz",
- "integrity": "sha512-WMwm9LhRUo+WUaRN+vRuETqG89IgZphVSNkdFgeb6sS/E4OrDIN7t48CAewSHXc6C8lefD8KKfr5vY61brQlow=="
+ "integrity": "sha512-WMwm9LhRUo+WUaRN+vRuETqG89IgZphVSNkdFgeb6sS/E4OrDIN7t48CAewSHXc6C8lefD8KKfr5vY61brQlow==",
+ "license": "MIT"
},
"node_modules/ejs": {
"version": "3.1.10",
"resolved": "https://registry.npmjs.org/ejs/-/ejs-3.1.10.tgz",
"integrity": "sha512-UeJmFfOrAQS8OJWPZ4qtgHyWExa088/MtK5UEyoJGFH67cDEXkZSviOiKRCZ4Xij0zxI3JECgYs3oKx+AizQBA==",
+ "license": "Apache-2.0",
"dependencies": {
"jake": "^10.8.5"
},
@@ -513,6 +536,16 @@
"node": ">= 0.8"
}
},
+ "node_modules/end-of-stream": {
+ "version": "1.4.4",
+ "resolved": "https://registry.npmjs.org/end-of-stream/-/end-of-stream-1.4.4.tgz",
+ "integrity": "sha512-+uw1inIHVPQoaVuHzRyXd21icM+cnt4CzD5rW+NC1wjOUSTOs+Te7FOv7AhN7vS9x/oIyhLP5PR1H+phQAHu5Q==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "once": "^1.4.0"
+ }
+ },
"node_modules/es-define-property": {
"version": "1.0.0",
"resolved": "https://registry.npmjs.org/es-define-property/-/es-define-property-1.0.0.tgz",
@@ -595,6 +628,7 @@
"version": "0.0.1",
"resolved": "https://registry.npmjs.org/express-ejs-extend/-/express-ejs-extend-0.0.1.tgz",
"integrity": "sha512-XsqcWrDm5rvNqJisFe93mFTXX8mP12eIzBcTzuzqtGu/zQetkxkvgbCaP4RLHJTpdmkc89dIvTlurLB8VHmP/A==",
+ "license": "MIT",
"dependencies": {
"ejs": ">=2.4.1"
}
@@ -603,6 +637,7 @@
"version": "1.4.0",
"resolved": "https://registry.npmjs.org/express-fileupload/-/express-fileupload-1.4.0.tgz",
"integrity": "sha512-RjzLCHxkv3umDeZKeFeMg8w7qe0V09w3B7oGZprr/oO2H/ISCgNzuqzn7gV3HRWb37GjRk429CCpSLS2KNTqMQ==",
+ "license": "MIT",
"dependencies": {
"busboy": "^1.6.0"
},
@@ -614,6 +649,7 @@
"version": "1.15.6",
"resolved": "https://registry.npmjs.org/express-session/-/express-session-1.15.6.tgz",
"integrity": "sha512-r0nrHTCYtAMrFwZ0kBzZEXa1vtPVrw0dKvGSrKP4dahwBQ1BJpF2/y1Pp4sCD/0kvxV4zZeclyvfmw0B4RMJQA==",
+ "license": "MIT",
"dependencies": {
"cookie": "0.3.1",
"cookie-signature": "1.0.6",
@@ -633,6 +669,7 @@
"version": "0.3.1",
"resolved": "https://registry.npmjs.org/cookie/-/cookie-0.3.1.tgz",
"integrity": "sha512-+IJOX0OqlHCszo2mBUq+SrEbCj6w7Kpffqx60zYbPTFaO4+yYgRjHwcZNpWvaTylDHaV7PPmBHzSecZiMhtPgw==",
+ "license": "MIT",
"engines": {
"node": ">= 0.6"
}
@@ -641,6 +678,7 @@
"version": "1.1.2",
"resolved": "https://registry.npmjs.org/depd/-/depd-1.1.2.tgz",
"integrity": "sha512-7emPTl6Dpo6JRXOXjLRxck+FlLRX5847cLKEn00PLAgc3g2hTZZgr+e4c2v6QpSmLeFP3n5yUo7ft6avBK/5jQ==",
+ "license": "MIT",
"engines": {
"node": ">= 0.6"
}
@@ -649,22 +687,57 @@
"version": "0.6.0",
"resolved": "https://registry.npmjs.org/cookie/-/cookie-0.6.0.tgz",
"integrity": "sha512-U71cyTamuh1CRNCfpGY6to28lxvNwPG4Guz/EVjgf3Jmzv0vlDp1atT9eS5dDjMYHucpHbWns6Lwf3BKz6svdw==",
+ "license": "MIT",
"engines": {
"node": ">= 0.6"
}
},
+ "node_modules/fast-copy": {
+ "version": "3.0.2",
+ "resolved": "https://registry.npmjs.org/fast-copy/-/fast-copy-3.0.2.tgz",
+ "integrity": "sha512-dl0O9Vhju8IrcLndv2eU4ldt1ftXMqqfgN4H1cpmGV7P6jeB9FwpN9a2c8DPGE1Ys88rNUJVYDHq73CGAGOPfQ==",
+ "dev": true,
+ "license": "MIT"
+ },
+ "node_modules/fast-redact": {
+ "version": "3.5.0",
+ "resolved": "https://registry.npmjs.org/fast-redact/-/fast-redact-3.5.0.tgz",
+ "integrity": "sha512-dwsoQlS7h9hMeYUq1W++23NDcBLV4KqONnITDV9DjfS3q1SgDGVrBdvvTLUotWtPSD7asWDV9/CmsZPy8Hf70A==",
+ "license": "MIT",
+ "engines": {
+ "node": ">=6"
+ }
+ },
+ "node_modules/fast-safe-stringify": {
+ "version": "2.1.1",
+ "resolved": "https://registry.npmjs.org/fast-safe-stringify/-/fast-safe-stringify-2.1.1.tgz",
+ "integrity": "sha512-W+KJc2dmILlPplD/H4K9l9LcAHAfPtP6BY84uVLXQ6Evcz9Lcg33Y2z1IVblT6xdY54PXYVHEv+0Wpq8Io6zkA==",
+ "dev": true,
+ "license": "MIT"
+ },
"node_modules/filelist": {
"version": "1.0.4",
"resolved": "https://registry.npmjs.org/filelist/-/filelist-1.0.4.tgz",
"integrity": "sha512-w1cEuf3S+DrLCQL7ET6kz+gmlJdbq9J7yXCSjK/OZCPA+qEN1WyF4ZAf0YYJa4/shHJra2t/d/r8SV4Ji+x+8Q==",
+ "license": "Apache-2.0",
"dependencies": {
"minimatch": "^5.0.1"
}
},
+ "node_modules/filelist/node_modules/brace-expansion": {
+ "version": "2.0.1",
+ "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.1.tgz",
+ "integrity": "sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA==",
+ "license": "MIT",
+ "dependencies": {
+ "balanced-match": "^1.0.0"
+ }
+ },
"node_modules/filelist/node_modules/minimatch": {
"version": "5.1.6",
"resolved": "https://registry.npmjs.org/minimatch/-/minimatch-5.1.6.tgz",
"integrity": "sha512-lKwV/1brpG6mBUFHtb7NUmtABCb2WZZmm2wNiOA5hAb8VdCS4B3dtMWyvcoViccwAW/COERjXLt0zP1zXUN26g==",
+ "license": "ISC",
"dependencies": {
"brace-expansion": "^2.0.1"
},
@@ -677,6 +750,7 @@
"resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.1.1.tgz",
"integrity": "sha512-YsGpe3WHLK8ZYi4tWDg2Jy3ebRz2rXowDxnld4bkQB00cc/1Zw9AWnC0i9ztDJitivtQvaI9KaLyKrc+hBW0yg==",
"dev": true,
+ "license": "MIT",
"dependencies": {
"to-regex-range": "^5.0.1"
},
@@ -703,15 +777,16 @@
}
},
"node_modules/follow-redirects": {
- "version": "1.15.6",
- "resolved": "https://registry.npmjs.org/follow-redirects/-/follow-redirects-1.15.6.tgz",
- "integrity": "sha512-wWN62YITEaOpSK584EZXJafH1AGpO8RVgElfkuXbTOrPX4fIfOyEpW/CsiNd8JdYrAoOvafRTOEnvsO++qCqFA==",
+ "version": "1.15.9",
+ "resolved": "https://registry.npmjs.org/follow-redirects/-/follow-redirects-1.15.9.tgz",
+ "integrity": "sha512-gew4GsXizNgdoRyqmyfMHyAmXsZDk6mHkSxZFCzW9gwlbtOW44CDtYavM+y+72qD/Vq2l550kMF52DT8fOLJqQ==",
"funding": [
{
"type": "individual",
"url": "https://github.com/sponsors/RubenVerborgh"
}
],
+ "license": "MIT",
"engines": {
"node": ">=4.0"
},
@@ -721,10 +796,25 @@
}
}
},
+ "node_modules/form-data": {
+ "version": "4.0.1",
+ "resolved": "https://registry.npmjs.org/form-data/-/form-data-4.0.1.tgz",
+ "integrity": "sha512-tzN8e4TX8+kkxGPK8D5u0FNmjPUjw3lwC9lSLxxoB/+GtsJG91CO8bSWy73APlgAZzZbXEYZJuxjkHH2w+Ezhw==",
+ "license": "MIT",
+ "dependencies": {
+ "asynckit": "^0.4.0",
+ "combined-stream": "^1.0.8",
+ "mime-types": "^2.1.12"
+ },
+ "engines": {
+ "node": ">= 6"
+ }
+ },
"node_modules/forwarded": {
"version": "0.2.0",
"resolved": "https://registry.npmjs.org/forwarded/-/forwarded-0.2.0.tgz",
"integrity": "sha512-buRG0fpBtRHSTCOASe6hD258tEubFoRLb4ZNA6NxMVHNw2gOcwHo9wyablzMzOA5z9xA9L1KNjk/Nt6MT9aYow==",
+ "license": "MIT",
"engines": {
"node": ">= 0.6"
}
@@ -744,6 +834,7 @@
"integrity": "sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw==",
"dev": true,
"hasInstallScript": true,
+ "license": "MIT",
"optional": true,
"os": [
"darwin"
@@ -785,6 +876,7 @@
"resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz",
"integrity": "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==",
"dev": true,
+ "license": "ISC",
"dependencies": {
"is-glob": "^4.0.1"
},
@@ -793,12 +885,15 @@
}
},
"node_modules/gopd": {
- "version": "1.0.1",
- "resolved": "https://registry.npmjs.org/gopd/-/gopd-1.0.1.tgz",
- "integrity": "sha512-d65bNlIadxvpb/A2abVdlqKqV563juRnZ1Wtk6s1sIR8uNsXR70xqIzVqxVf1eTqDunwT2MkczEeaezCKTZhwA==",
+ "version": "1.1.0",
+ "resolved": "https://registry.npmjs.org/gopd/-/gopd-1.1.0.tgz",
+ "integrity": "sha512-FQoVQnqcdk4hVM4JN1eromaun4iuS34oStkdlLENLdpULsuQcTyXj8w7ayhuUfPwEYZ1ZOooOTT6fdA9Vmx/RA==",
"license": "MIT",
"dependencies": {
- "get-intrinsic": "^1.1.3"
+ "get-intrinsic": "^1.2.4"
+ },
+ "engines": {
+ "node": ">= 0.4"
},
"funding": {
"url": "https://github.com/sponsors/ljharb"
@@ -808,6 +903,7 @@
"version": "4.0.0",
"resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz",
"integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==",
+ "license": "MIT",
"engines": {
"node": ">=8"
}
@@ -825,10 +921,13 @@
}
},
"node_modules/has-proto": {
- "version": "1.0.3",
- "resolved": "https://registry.npmjs.org/has-proto/-/has-proto-1.0.3.tgz",
- "integrity": "sha512-SJ1amZAJUiZS+PhsVLf5tGydlaVB8EdFpaSO4gmiUKUOxk8qzn5AIy4ZeJUmh22znIdk/uMAUT2pl3FxzVUH+Q==",
+ "version": "1.1.0",
+ "resolved": "https://registry.npmjs.org/has-proto/-/has-proto-1.1.0.tgz",
+ "integrity": "sha512-QLdzI9IIO1Jg7f9GT1gXpPpXArAn6cS31R1eEZqz08Gc+uQ8/XiqHWt17Fiw+2p6oTTIq5GXEpQkAlA88YRl/Q==",
"license": "MIT",
+ "dependencies": {
+ "call-bind": "^1.0.7"
+ },
"engines": {
"node": ">= 0.4"
},
@@ -837,9 +936,9 @@
}
},
"node_modules/has-symbols": {
- "version": "1.0.3",
- "resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.0.3.tgz",
- "integrity": "sha512-l3LCuF6MgDNwTDKkdYGEihYjt5pRPbEg46rtlmnSPlUbgmB8LOIrKJbYYFBSbnPaJexMKtiPO8hmeRjRz2Td+A==",
+ "version": "1.1.0",
+ "resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.1.0.tgz",
+ "integrity": "sha512-1cDNdwJ2Jaohmb3sg4OmKaMBwuC48sYni5HUw2DvsC8LjGTLK9h+eb1X6RyuOHe4hT0ULCW68iomhjUoKUqlPQ==",
"license": "MIT",
"engines": {
"node": ">= 0.4"
@@ -860,10 +959,18 @@
"node": ">= 0.4"
}
},
+ "node_modules/help-me": {
+ "version": "5.0.0",
+ "resolved": "https://registry.npmjs.org/help-me/-/help-me-5.0.0.tgz",
+ "integrity": "sha512-7xgomUX6ADmcYzFik0HzAxh/73YlKR9bmFzf51CZwR+b6YtzU2m0u49hQCqV6SvlqIqsaxovfwdvbnsw3b/zpg==",
+ "dev": true,
+ "license": "MIT"
+ },
"node_modules/html": {
"version": "1.0.0",
"resolved": "https://registry.npmjs.org/html/-/html-1.0.0.tgz",
"integrity": "sha512-lw/7YsdKiP3kk5PnR1INY17iJuzdAtJewxr14ozKJWbbR97znovZ0mh+WEMZ8rjc3lgTK+ID/htTjuyGKB52Kw==",
+ "license": "BSD",
"dependencies": {
"concat-stream": "^1.4.7"
},
@@ -875,6 +982,7 @@
"version": "2.0.0",
"resolved": "https://registry.npmjs.org/http-errors/-/http-errors-2.0.0.tgz",
"integrity": "sha512-FtwrG/euBzaEjYeRqOgly7G0qviiXoJWnvEH2Z1plBdXgbyjv34pHTSb9zoeHMyDy33+DWy5Wt9Wo+TURtOYSQ==",
+ "license": "MIT",
"dependencies": {
"depd": "2.0.0",
"inherits": "2.0.4",
@@ -890,6 +998,7 @@
"version": "0.4.24",
"resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.4.24.tgz",
"integrity": "sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA==",
+ "license": "MIT",
"dependencies": {
"safer-buffer": ">= 2.1.2 < 3"
},
@@ -901,17 +1010,20 @@
"version": "1.0.1",
"resolved": "https://registry.npmjs.org/ignore-by-default/-/ignore-by-default-1.0.1.tgz",
"integrity": "sha512-Ius2VYcGNk7T90CppJqcIkS5ooHUZyIQK+ClZfMfMNFEF9VSE73Fq+906u/CWu92x4gzZMWOwfFYckPObzdEbA==",
- "dev": true
+ "dev": true,
+ "license": "ISC"
},
"node_modules/inherits": {
"version": "2.0.4",
"resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz",
- "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ=="
+ "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==",
+ "license": "ISC"
},
"node_modules/ipaddr.js": {
"version": "1.9.1",
"resolved": "https://registry.npmjs.org/ipaddr.js/-/ipaddr.js-1.9.1.tgz",
"integrity": "sha512-0KI/607xoxSToH7GjN1FfSbLoU0+btTicjsQSWQlh/hZykN8KpmMf7uYwPW3R+akZ6R/w18ZlXSHBYXiYUPO3g==",
+ "license": "MIT",
"engines": {
"node": ">= 0.10"
}
@@ -921,6 +1033,7 @@
"resolved": "https://registry.npmjs.org/is-binary-path/-/is-binary-path-2.1.0.tgz",
"integrity": "sha512-ZMERYes6pDydyuGidse7OsHxtbI7WVeUEozgR/g7rd0xUimYNlvZRE/K2MgZTjWy725IfelLeVcEM97mmtRGXw==",
"dev": true,
+ "license": "MIT",
"dependencies": {
"binary-extensions": "^2.0.0"
},
@@ -933,6 +1046,7 @@
"resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz",
"integrity": "sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==",
"dev": true,
+ "license": "MIT",
"engines": {
"node": ">=0.10.0"
}
@@ -942,6 +1056,7 @@
"resolved": "https://registry.npmjs.org/is-glob/-/is-glob-4.0.3.tgz",
"integrity": "sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==",
"dev": true,
+ "license": "MIT",
"dependencies": {
"is-extglob": "^2.1.1"
},
@@ -954,6 +1069,7 @@
"resolved": "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz",
"integrity": "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==",
"dev": true,
+ "license": "MIT",
"engines": {
"node": ">=0.12.0"
}
@@ -961,12 +1077,14 @@
"node_modules/isarray": {
"version": "1.0.0",
"resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz",
- "integrity": "sha512-VLghIWNM6ELQzo7zwmcg0NmTVyWKYjvIeM83yjp0wRDTmUnrM678fQbcKBo6n2CJEF0szoG//ytg+TKla89ALQ=="
+ "integrity": "sha512-VLghIWNM6ELQzo7zwmcg0NmTVyWKYjvIeM83yjp0wRDTmUnrM678fQbcKBo6n2CJEF0szoG//ytg+TKla89ALQ==",
+ "license": "MIT"
},
"node_modules/jake": {
- "version": "10.8.7",
- "resolved": "https://registry.npmjs.org/jake/-/jake-10.8.7.tgz",
- "integrity": "sha512-ZDi3aP+fG/LchyBzUM804VjddnwfSfsdeYkwt8NcbKRvo4rFkjhs456iLFn3k2ZUWvNe4i48WACDbza8fhq2+w==",
+ "version": "10.9.2",
+ "resolved": "https://registry.npmjs.org/jake/-/jake-10.9.2.tgz",
+ "integrity": "sha512-2P4SQ0HrLQ+fw6llpLnOaGAvN2Zu6778SJMrCUwns4fOoG9ayrTiZk3VV8sCPkVZF8ab0zksVpS8FDY5pRCNBA==",
+ "license": "Apache-2.0",
"dependencies": {
"async": "^3.2.3",
"chalk": "^4.0.2",
@@ -980,15 +1098,32 @@
"node": ">=10"
}
},
+ "node_modules/joycon": {
+ "version": "3.1.1",
+ "resolved": "https://registry.npmjs.org/joycon/-/joycon-3.1.1.tgz",
+ "integrity": "sha512-34wB/Y7MW7bzjKRjUKTa46I2Z7eV62Rkhva+KkopW7Qvv/OSWBqvkSY7vusOPrNuZcUG3tApvdVgNB8POj3SPw==",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">=10"
+ }
+ },
"node_modules/jsonwebtoken": {
- "version": "9.0.0",
- "resolved": "https://registry.npmjs.org/jsonwebtoken/-/jsonwebtoken-9.0.0.tgz",
- "integrity": "sha512-tuGfYXxkQGDPnLJ7SibiQgVgeDgfbPq2k2ICcbgqW8WxWLBAxKQM/ZCu/IT8SOSwmaYl4dpTFCW5xZv7YbbWUw==",
+ "version": "9.0.2",
+ "resolved": "https://registry.npmjs.org/jsonwebtoken/-/jsonwebtoken-9.0.2.tgz",
+ "integrity": "sha512-PRp66vJ865SSqOlgqS8hujT5U4AOgMfhrwYIuIhfKaoSCZcirrmASQr8CX7cUg+RMih+hgznrjp99o+W4pJLHQ==",
+ "license": "MIT",
"dependencies": {
"jws": "^3.2.2",
- "lodash": "^4.17.21",
+ "lodash.includes": "^4.3.0",
+ "lodash.isboolean": "^3.0.3",
+ "lodash.isinteger": "^4.0.4",
+ "lodash.isnumber": "^3.0.3",
+ "lodash.isplainobject": "^4.0.6",
+ "lodash.isstring": "^4.0.1",
+ "lodash.once": "^4.0.0",
"ms": "^2.1.1",
- "semver": "^7.3.8"
+ "semver": "^7.5.4"
},
"engines": {
"node": ">=12",
@@ -998,12 +1133,14 @@
"node_modules/jsonwebtoken/node_modules/ms": {
"version": "2.1.3",
"resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz",
- "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA=="
+ "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==",
+ "license": "MIT"
},
"node_modules/jwa": {
"version": "1.4.1",
"resolved": "https://registry.npmjs.org/jwa/-/jwa-1.4.1.tgz",
"integrity": "sha512-qiLX/xhEEFKUAJ6FiBMbes3w9ATzyk5W7Hvzpa/SLYdxNtng+gcurvrI7TbACjIXlsJyr05/S1oUhZrc63evQA==",
+ "license": "MIT",
"dependencies": {
"buffer-equal-constant-time": "1.0.1",
"ecdsa-sig-formatter": "1.0.11",
@@ -1014,25 +1151,74 @@
"version": "3.2.2",
"resolved": "https://registry.npmjs.org/jws/-/jws-3.2.2.tgz",
"integrity": "sha512-YHlZCB6lMTllWDtSPHz/ZXTsi8S00usEV6v1tjq8tOUZzw7DpSDWVXjXDre6ed1w/pd495ODpHZYSdkRTsa0HA==",
+ "license": "MIT",
"dependencies": {
"jwa": "^1.4.1",
"safe-buffer": "^5.0.1"
}
},
- "node_modules/kareem": {
- "version": "2.3.2",
- "resolved": "https://registry.npmjs.org/kareem/-/kareem-2.3.2.tgz",
- "integrity": "sha512-STHz9P7X2L4Kwn72fA4rGyqyXdmrMSdxqHx9IXon/FXluXieaFA6KJ2upcHAHxQPQ0LeM/OjLrhFxifHewOALQ=="
+ "node_modules/kafkajs": {
+ "version": "2.2.4",
+ "resolved": "https://registry.npmjs.org/kafkajs/-/kafkajs-2.2.4.tgz",
+ "integrity": "sha512-j/YeapB1vfPT2iOIUn/vxdyKEuhuY2PxMBvf5JWux6iSaukAccrMtXEY/Lb7OvavDhOWME589bpLrEdnVHjfjA==",
+ "license": "MIT",
+ "engines": {
+ "node": ">=14.0.0"
+ }
},
"node_modules/lodash": {
"version": "4.17.21",
"resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.21.tgz",
- "integrity": "sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg=="
+ "integrity": "sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg==",
+ "license": "MIT"
+ },
+ "node_modules/lodash.includes": {
+ "version": "4.3.0",
+ "resolved": "https://registry.npmjs.org/lodash.includes/-/lodash.includes-4.3.0.tgz",
+ "integrity": "sha512-W3Bx6mdkRTGtlJISOvVD/lbqjTlPPUDTMnlXZFnVwi9NKJ6tiAk6LVdlhZMm17VZisqhKcgzpO5Wz91PCt5b0w==",
+ "license": "MIT"
+ },
+ "node_modules/lodash.isboolean": {
+ "version": "3.0.3",
+ "resolved": "https://registry.npmjs.org/lodash.isboolean/-/lodash.isboolean-3.0.3.tgz",
+ "integrity": "sha512-Bz5mupy2SVbPHURB98VAcw+aHh4vRV5IPNhILUCsOzRmsTmSQ17jIuqopAentWoehktxGd9e/hbIXq980/1QJg==",
+ "license": "MIT"
+ },
+ "node_modules/lodash.isinteger": {
+ "version": "4.0.4",
+ "resolved": "https://registry.npmjs.org/lodash.isinteger/-/lodash.isinteger-4.0.4.tgz",
+ "integrity": "sha512-DBwtEWN2caHQ9/imiNeEA5ys1JoRtRfY3d7V9wkqtbycnAmTvRRmbHKDV4a0EYc678/dia0jrte4tjYwVBaZUA==",
+ "license": "MIT"
+ },
+ "node_modules/lodash.isnumber": {
+ "version": "3.0.3",
+ "resolved": "https://registry.npmjs.org/lodash.isnumber/-/lodash.isnumber-3.0.3.tgz",
+ "integrity": "sha512-QYqzpfwO3/CWf3XP+Z+tkQsfaLL/EnUlXWVkIk5FUPc4sBdTehEqZONuyRt2P67PXAk+NXmTBcc97zw9t1FQrw==",
+ "license": "MIT"
+ },
+ "node_modules/lodash.isplainobject": {
+ "version": "4.0.6",
+ "resolved": "https://registry.npmjs.org/lodash.isplainobject/-/lodash.isplainobject-4.0.6.tgz",
+ "integrity": "sha512-oSXzaWypCMHkPC3NvBEaPHf0KsA5mvPrOPgQWDsbg8n7orZ290M0BmC/jgRZ4vcJ6DTAhjrsSYgdsW/F+MFOBA==",
+ "license": "MIT"
+ },
+ "node_modules/lodash.isstring": {
+ "version": "4.0.1",
+ "resolved": "https://registry.npmjs.org/lodash.isstring/-/lodash.isstring-4.0.1.tgz",
+ "integrity": "sha512-0wJxfxH1wgO3GrbuP+dTTk7op+6L41QCXbGINEmD+ny/G/eCqGzxyCsh7159S+mgDDcoarnBw6PC1PS5+wUGgw==",
+ "license": "MIT"
+ },
+ "node_modules/lodash.once": {
+ "version": "4.1.1",
+ "resolved": "https://registry.npmjs.org/lodash.once/-/lodash.once-4.1.1.tgz",
+ "integrity": "sha512-Sb487aTOCr9drQVL8pIxOzVhafOjZN9UU54hiN8PU3uAiSV7lx1yYNpbNmex2PK6dSJoNTSJUUswT651yww3Mg==",
+ "license": "MIT"
},
"node_modules/media-typer": {
"version": "0.3.0",
"resolved": "https://registry.npmjs.org/media-typer/-/media-typer-0.3.0.tgz",
"integrity": "sha512-dq+qelQ9akHpcOl/gUVRTxVIOkAJ1wR3QAvb4RsVjS8oVoFjDGTc679wJYmUmknUF5HwMLOgb5O+a3KxfWapPQ==",
+ "license": "MIT",
"engines": {
"node": ">= 0.6"
}
@@ -1041,6 +1227,7 @@
"version": "1.5.0",
"resolved": "https://registry.npmjs.org/memory-pager/-/memory-pager-1.5.0.tgz",
"integrity": "sha512-ZS4Bp4r/Zoeq6+NLJpP+0Zzm0pR8whtGPf1XExKLJBAczGMnSi3It14OiNCStjQjM6NU1okjQGSxgEZN8eBYKg==",
+ "license": "MIT",
"optional": true
},
"node_modules/merge-descriptors": {
@@ -1056,6 +1243,7 @@
"version": "1.1.2",
"resolved": "https://registry.npmjs.org/methods/-/methods-1.1.2.tgz",
"integrity": "sha512-iclAHeNqNm68zFtnZ0e+1L2yUIdvzNoauKU4WBA3VvH/vPFieF7qfRlwUZU+DA9P9bPXIS90ulxoUoCH23sV2w==",
+ "license": "MIT",
"engines": {
"node": ">= 0.6"
}
@@ -1076,6 +1264,7 @@
"version": "1.52.0",
"resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.52.0.tgz",
"integrity": "sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg==",
+ "license": "MIT",
"engines": {
"node": ">= 0.6"
}
@@ -1084,6 +1273,7 @@
"version": "2.1.35",
"resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.35.tgz",
"integrity": "sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw==",
+ "license": "MIT",
"dependencies": {
"mime-db": "1.52.0"
},
@@ -1095,6 +1285,7 @@
"version": "3.1.2",
"resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz",
"integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==",
+ "license": "ISC",
"dependencies": {
"brace-expansion": "^1.1.7"
},
@@ -1102,19 +1293,21 @@
"node": "*"
}
},
- "node_modules/minimatch/node_modules/brace-expansion": {
- "version": "1.1.11",
- "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz",
- "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==",
- "dependencies": {
- "balanced-match": "^1.0.0",
- "concat-map": "0.0.1"
+ "node_modules/minimist": {
+ "version": "1.2.8",
+ "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.8.tgz",
+ "integrity": "sha512-2yyAR8qBkN3YuheJanUpWC5U3bb5osDywNB8RzDVlDwDHbocAJveqqj1u8+SVD7jkWT4yvsHCpWqqWqAxb0zCA==",
+ "dev": true,
+ "license": "MIT",
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
}
},
"node_modules/mongodb": {
"version": "3.7.4",
"resolved": "https://registry.npmjs.org/mongodb/-/mongodb-3.7.4.tgz",
"integrity": "sha512-K5q8aBqEXMwWdVNh94UQTwZ6BejVbFhh1uB6c5FKtPE9eUMZPUO3sRZdgIEcHSrAWmxzpG/FeODDKL388sqRmw==",
+ "license": "Apache-2.0",
"dependencies": {
"bl": "^2.2.1",
"bson": "^1.1.4",
@@ -1149,109 +1342,39 @@
}
}
},
- "node_modules/mongoose": {
- "version": "5.13.22",
- "resolved": "https://registry.npmjs.org/mongoose/-/mongoose-5.13.22.tgz",
- "integrity": "sha512-p51k/c4X/MfqeQ3I1ranlDiggLzNumZrTDD9CeezHwZxt2/btf+YZD7MCe07RAY2NgFYVMayq6jMamw02Jmf9w==",
- "dependencies": {
- "@types/bson": "1.x || 4.0.x",
- "@types/mongodb": "^3.5.27",
- "bson": "^1.1.4",
- "kareem": "2.3.2",
- "mongodb": "3.7.4",
- "mongoose-legacy-pluralize": "1.0.2",
- "mpath": "0.8.4",
- "mquery": "3.2.5",
- "ms": "2.1.2",
- "optional-require": "1.0.x",
- "regexp-clone": "1.0.0",
- "safe-buffer": "5.2.1",
- "sift": "13.5.2",
- "sliced": "1.0.1"
- },
- "engines": {
- "node": ">=4.0.0"
- },
- "funding": {
- "type": "opencollective",
- "url": "https://opencollective.com/mongoose"
- }
- },
- "node_modules/mongoose-legacy-pluralize": {
- "version": "1.0.2",
- "resolved": "https://registry.npmjs.org/mongoose-legacy-pluralize/-/mongoose-legacy-pluralize-1.0.2.tgz",
- "integrity": "sha512-Yo/7qQU4/EyIS8YDFSeenIvXxZN+ld7YdV9LqFVQJzTLye8unujAWPZ4NWKfFA+RNjh+wvTWKY9Z3E5XM6ZZiQ==",
- "peerDependencies": {
- "mongoose": "*"
- }
- },
- "node_modules/mongoose/node_modules/ms": {
- "version": "2.1.2",
- "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz",
- "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w=="
- },
- "node_modules/mongoose/node_modules/optional-require": {
- "version": "1.0.3",
- "resolved": "https://registry.npmjs.org/optional-require/-/optional-require-1.0.3.tgz",
- "integrity": "sha512-RV2Zp2MY2aeYK5G+B/Sps8lW5NHAzE5QClbFP15j+PWmP+T9PxlJXBOOLoSAdgwFvS4t0aMR4vpedMkbHfh0nA==",
- "engines": {
- "node": ">=4"
- }
- },
- "node_modules/mpath": {
- "version": "0.8.4",
- "resolved": "https://registry.npmjs.org/mpath/-/mpath-0.8.4.tgz",
- "integrity": "sha512-DTxNZomBcTWlrMW76jy1wvV37X/cNNxPW1y2Jzd4DZkAaC5ZGsm8bfGfNOthcDuRJujXLqiuS6o3Tpy0JEoh7g==",
- "engines": {
- "node": ">=4.0.0"
- }
- },
- "node_modules/mquery": {
- "version": "3.2.5",
- "resolved": "https://registry.npmjs.org/mquery/-/mquery-3.2.5.tgz",
- "integrity": "sha512-VjOKHHgU84wij7IUoZzFRU07IAxd5kWJaDmyUzQlbjHjyoeK5TNeeo8ZsFDtTYnSgpW6n/nMNIHvE3u8Lbrf4A==",
- "dependencies": {
- "bluebird": "3.5.1",
- "debug": "3.1.0",
- "regexp-clone": "^1.0.0",
- "safe-buffer": "5.1.2",
- "sliced": "1.0.1"
- },
- "engines": {
- "node": ">=4.0.0"
- }
- },
- "node_modules/mquery/node_modules/debug": {
- "version": "3.1.0",
- "resolved": "https://registry.npmjs.org/debug/-/debug-3.1.0.tgz",
- "integrity": "sha512-OX8XqP7/1a9cqkxYw2yXss15f26NKWBpDXQd0/uK/KPqdQhxbPa994hnzjcE2VqQpDslf55723cKPUOGSmMY3g==",
- "dependencies": {
- "ms": "2.0.0"
- }
- },
- "node_modules/mquery/node_modules/safe-buffer": {
- "version": "5.1.2",
- "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz",
- "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g=="
- },
"node_modules/ms": {
"version": "2.0.0",
"resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz",
- "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A=="
+ "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==",
+ "license": "MIT"
},
"node_modules/negotiator": {
"version": "0.6.3",
"resolved": "https://registry.npmjs.org/negotiator/-/negotiator-0.6.3.tgz",
"integrity": "sha512-+EUsqGPLsM+j/zdChZjsnX51g4XrHFOIXwfnCVPGlQk/k5giakcKsuxCObBRu6DSm9opw/O6slWbJdghQM4bBg==",
+ "license": "MIT",
"engines": {
"node": ">= 0.6"
}
},
+ "node_modules/node-cron": {
+ "version": "3.0.3",
+ "resolved": "https://registry.npmjs.org/node-cron/-/node-cron-3.0.3.tgz",
+ "integrity": "sha512-dOal67//nohNgYWb+nWmg5dkFdIwDm8EpeGYMekPMrngV3637lqnX0lbUcCtgibHTz6SEz7DAIjKvKDFYCnO1A==",
+ "license": "ISC",
+ "dependencies": {
+ "uuid": "8.3.2"
+ },
+ "engines": {
+ "node": ">=6.0.0"
+ }
+ },
"node_modules/nodemon": {
- "version": "3.1.4",
- "resolved": "https://registry.npmjs.org/nodemon/-/nodemon-3.1.4.tgz",
- "integrity": "sha512-wjPBbFhtpJwmIeY2yP7QF+UKzPfltVGtfce1g/bB15/8vCGZj8uxD62b/b9M9/WVgme0NZudpownKN+c0plXlQ==",
+ "version": "3.1.7",
+ "resolved": "https://registry.npmjs.org/nodemon/-/nodemon-3.1.7.tgz",
+ "integrity": "sha512-hLj7fuMow6f0lbB0cD14Lz2xNjwsyruH251Pk4t/yIitCFJbmY1myuLlHm/q06aST4jg6EgAh74PIBBrRqpVAQ==",
"dev": true,
+ "license": "MIT",
"dependencies": {
"chokidar": "^3.5.2",
"debug": "^4",
@@ -1276,12 +1399,13 @@
}
},
"node_modules/nodemon/node_modules/debug": {
- "version": "4.3.5",
- "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.5.tgz",
- "integrity": "sha512-pt0bNEmneDIvdL1Xsd9oDQ/wrQRkXDT4AUWlNZNPKvW5x/jyO9VFXkJUP07vQ2upmw5PlaITaPKc31jK13V+jg==",
+ "version": "4.3.7",
+ "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.7.tgz",
+ "integrity": "sha512-Er2nc/H7RrMXZBFCEim6TCmMk02Z8vLC2Rbi1KEBggpo0fS6l0S1nnapwmIi3yW/+GOJap1Krg4w0Hg80oCqgQ==",
"dev": true,
+ "license": "MIT",
"dependencies": {
- "ms": "2.1.2"
+ "ms": "^2.1.3"
},
"engines": {
"node": ">=6.0"
@@ -1297,21 +1421,24 @@
"resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz",
"integrity": "sha512-sKJf1+ceQBr4SMkvQnBDNDtf4TXpVhVGateu0t918bl30FnbE2m4vNLX+VWe/dpjlb+HugGYzW7uQXH98HPEYw==",
"dev": true,
+ "license": "MIT",
"engines": {
"node": ">=4"
}
},
"node_modules/nodemon/node_modules/ms": {
- "version": "2.1.2",
- "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz",
- "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==",
- "dev": true
+ "version": "2.1.3",
+ "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz",
+ "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==",
+ "dev": true,
+ "license": "MIT"
},
"node_modules/nodemon/node_modules/supports-color": {
"version": "5.5.0",
"resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz",
"integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==",
"dev": true,
+ "license": "MIT",
"dependencies": {
"has-flag": "^3.0.0"
},
@@ -1319,26 +1446,12 @@
"node": ">=4"
}
},
- "node_modules/nopt": {
- "version": "1.0.10",
- "resolved": "https://registry.npmjs.org/nopt/-/nopt-1.0.10.tgz",
- "integrity": "sha512-NWmpvLSqUrgrAC9HCuxEvb+PSloHpqVu+FqcO4eeF2h5qYRhA7ev6KvelyQAKtegUbC6RypJnlEOhd8vloNKYg==",
- "dev": true,
- "dependencies": {
- "abbrev": "1"
- },
- "bin": {
- "nopt": "bin/nopt.js"
- },
- "engines": {
- "node": "*"
- }
- },
"node_modules/normalize-path": {
"version": "3.0.0",
"resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-3.0.0.tgz",
"integrity": "sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==",
"dev": true,
+ "license": "MIT",
"engines": {
"node": ">=0.10.0"
}
@@ -1346,12 +1459,13 @@
"node_modules/oauth": {
"version": "0.10.0",
"resolved": "https://registry.npmjs.org/oauth/-/oauth-0.10.0.tgz",
- "integrity": "sha512-1orQ9MT1vHFGQxhuy7E/0gECD3fd2fCC+PIX+/jgmU/gI3EpRocXtmtvxCO5x3WZ443FLTLFWNDjl5MPJf9u+Q=="
+ "integrity": "sha512-1orQ9MT1vHFGQxhuy7E/0gECD3fd2fCC+PIX+/jgmU/gI3EpRocXtmtvxCO5x3WZ443FLTLFWNDjl5MPJf9u+Q==",
+ "license": "MIT"
},
"node_modules/object-inspect": {
- "version": "1.13.2",
- "resolved": "https://registry.npmjs.org/object-inspect/-/object-inspect-1.13.2.tgz",
- "integrity": "sha512-IRZSRuzJiynemAXPYtPe5BoI/RESNYR7TYm50MC5Mqbd3Jmw5y790sErYw3V6SryFJD64b74qQQs9wn5Bg/k3g==",
+ "version": "1.13.3",
+ "resolved": "https://registry.npmjs.org/object-inspect/-/object-inspect-1.13.3.tgz",
+ "integrity": "sha512-kDCGIbxkDSXE3euJZZXzc6to7fCrKHNI/hSRQnRuQ+BWjFNzZwiFF8fj/6o2t2G9/jTj8PSIYTfCLelLZEeRpA==",
"license": "MIT",
"engines": {
"node": ">= 0.4"
@@ -1360,10 +1474,20 @@
"url": "https://github.com/sponsors/ljharb"
}
},
+ "node_modules/on-exit-leak-free": {
+ "version": "2.1.2",
+ "resolved": "https://registry.npmjs.org/on-exit-leak-free/-/on-exit-leak-free-2.1.2.tgz",
+ "integrity": "sha512-0eJJY6hXLGf1udHwfNftBqH+g73EU4B504nZeKpz1sYRKafAghwxEJunB2O7rDZkL4PGfsMVnTXZ2EjibbqcsA==",
+ "license": "MIT",
+ "engines": {
+ "node": ">=14.0.0"
+ }
+ },
"node_modules/on-finished": {
"version": "2.4.1",
"resolved": "https://registry.npmjs.org/on-finished/-/on-finished-2.4.1.tgz",
"integrity": "sha512-oVlzkg3ENAhCk2zdv7IJwd/QUD4z2RxRwpkcGY8psCVcCYZNq4wYnVWALHM+brtuJjePWiYF/ClmuDr8Ch5+kg==",
+ "license": "MIT",
"dependencies": {
"ee-first": "1.1.1"
},
@@ -1375,14 +1499,26 @@
"version": "1.0.2",
"resolved": "https://registry.npmjs.org/on-headers/-/on-headers-1.0.2.tgz",
"integrity": "sha512-pZAE+FJLoyITytdqK0U5s+FIpjN0JP3OzFi/u8Rx+EV5/W+JTWGXG8xFzevE7AjBfDqHv/8vL8qQsIhHnqRkrA==",
+ "license": "MIT",
"engines": {
"node": ">= 0.8"
}
},
+ "node_modules/once": {
+ "version": "1.4.0",
+ "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz",
+ "integrity": "sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w==",
+ "dev": true,
+ "license": "ISC",
+ "dependencies": {
+ "wrappy": "1"
+ }
+ },
"node_modules/optional-require": {
"version": "1.1.8",
"resolved": "https://registry.npmjs.org/optional-require/-/optional-require-1.1.8.tgz",
"integrity": "sha512-jq83qaUb0wNg9Krv1c5OQ+58EK+vHde6aBPzLvPPqJm89UQWsvSuFy9X/OSNJnFeSOKo7btE0n8Nl2+nE+z5nA==",
+ "license": "Apache-2.0",
"dependencies": {
"require-at": "^1.0.6"
},
@@ -1394,6 +1530,7 @@
"version": "1.3.3",
"resolved": "https://registry.npmjs.org/parseurl/-/parseurl-1.3.3.tgz",
"integrity": "sha512-CiyeOxFT/JZyN5m0z9PfXw4SCBJ6Sygz1Dpl0wqjlhDEGGBP1GnsUVEL0p63hoG1fcj3fHynXi9NYO4nWOL+qQ==",
+ "license": "MIT",
"engines": {
"node": ">= 0.8"
}
@@ -1402,6 +1539,7 @@
"version": "0.6.0",
"resolved": "https://registry.npmjs.org/passport/-/passport-0.6.0.tgz",
"integrity": "sha512-0fe+p3ZnrWRW74fe8+SvCyf4a3Pb2/h7gFkQ8yTJpAO50gDzlfjZUZTO1k5Eg9kUct22OxHLqDZoKUWRHOh9ug==",
+ "license": "MIT",
"dependencies": {
"passport-strategy": "1.x.x",
"pause": "0.0.1",
@@ -1419,6 +1557,7 @@
"version": "1.0.5",
"resolved": "https://registry.npmjs.org/passport-keycloak-oauth2-oidc/-/passport-keycloak-oauth2-oidc-1.0.5.tgz",
"integrity": "sha512-uvZGTFu7MozqOIocDdSlEImEQTaPd8g5Lwbt83SbFqOVvCS3PelKjMQOYoJ7ERL7ELOY6puV0BY+Pw8ExM4EYw==",
+ "license": "MIT",
"dependencies": {
"lodash": "^4.17.20",
"passport-oauth2": "^1.5.0"
@@ -1428,6 +1567,7 @@
"version": "1.8.0",
"resolved": "https://registry.npmjs.org/passport-oauth2/-/passport-oauth2-1.8.0.tgz",
"integrity": "sha512-cjsQbOrXIDE4P8nNb3FQRCCmJJ/utnFKEz2NX209f7KOHPoX18gF7gBzBbLLsj2/je4KrgiwLLGjf0lm9rtTBA==",
+ "license": "MIT",
"dependencies": {
"base64url": "3.x.x",
"oauth": "0.10.x",
@@ -1467,6 +1607,7 @@
"resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.1.tgz",
"integrity": "sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==",
"dev": true,
+ "license": "MIT",
"engines": {
"node": ">=8.6"
},
@@ -1474,15 +1615,95 @@
"url": "https://github.com/sponsors/jonschlinkert"
}
},
+ "node_modules/pino": {
+ "version": "9.6.0",
+ "resolved": "https://registry.npmjs.org/pino/-/pino-9.6.0.tgz",
+ "integrity": "sha512-i85pKRCt4qMjZ1+L7sy2Ag4t1atFcdbEt76+7iRJn1g2BvsnRMGu9p8pivl9fs63M2kF/A0OacFZhTub+m/qMg==",
+ "license": "MIT",
+ "dependencies": {
+ "atomic-sleep": "^1.0.0",
+ "fast-redact": "^3.1.1",
+ "on-exit-leak-free": "^2.1.0",
+ "pino-abstract-transport": "^2.0.0",
+ "pino-std-serializers": "^7.0.0",
+ "process-warning": "^4.0.0",
+ "quick-format-unescaped": "^4.0.3",
+ "real-require": "^0.2.0",
+ "safe-stable-stringify": "^2.3.1",
+ "sonic-boom": "^4.0.1",
+ "thread-stream": "^3.0.0"
+ },
+ "bin": {
+ "pino": "bin.js"
+ }
+ },
+ "node_modules/pino-abstract-transport": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/pino-abstract-transport/-/pino-abstract-transport-2.0.0.tgz",
+ "integrity": "sha512-F63x5tizV6WCh4R6RHyi2Ml+M70DNRXt/+HANowMflpgGFMAym/VKm6G7ZOQRjqN7XbGxK1Lg9t6ZrtzOaivMw==",
+ "license": "MIT",
+ "dependencies": {
+ "split2": "^4.0.0"
+ }
+ },
+ "node_modules/pino-pretty": {
+ "version": "13.0.0",
+ "resolved": "https://registry.npmjs.org/pino-pretty/-/pino-pretty-13.0.0.tgz",
+ "integrity": "sha512-cQBBIVG3YajgoUjo1FdKVRX6t9XPxwB9lcNJVD5GCnNM4Y6T12YYx8c6zEejxQsU0wrg9TwmDulcE9LR7qcJqA==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "colorette": "^2.0.7",
+ "dateformat": "^4.6.3",
+ "fast-copy": "^3.0.2",
+ "fast-safe-stringify": "^2.1.1",
+ "help-me": "^5.0.0",
+ "joycon": "^3.1.1",
+ "minimist": "^1.2.6",
+ "on-exit-leak-free": "^2.1.0",
+ "pino-abstract-transport": "^2.0.0",
+ "pump": "^3.0.0",
+ "secure-json-parse": "^2.4.0",
+ "sonic-boom": "^4.0.1",
+ "strip-json-comments": "^3.1.1"
+ },
+ "bin": {
+ "pino-pretty": "bin.js"
+ }
+ },
+ "node_modules/pino-std-serializers": {
+ "version": "7.0.0",
+ "resolved": "https://registry.npmjs.org/pino-std-serializers/-/pino-std-serializers-7.0.0.tgz",
+ "integrity": "sha512-e906FRY0+tV27iq4juKzSYPbUj2do2X2JX4EzSca1631EB2QJQUqGbDuERal7LCtOpxl6x3+nvo9NPZcmjkiFA==",
+ "license": "MIT"
+ },
"node_modules/process-nextick-args": {
"version": "2.0.1",
"resolved": "https://registry.npmjs.org/process-nextick-args/-/process-nextick-args-2.0.1.tgz",
- "integrity": "sha512-3ouUOpQhtgrbOa17J7+uxOTpITYWaGP7/AhoR3+A+/1e9skrzelGi/dXzEYyvbxubEF6Wn2ypscTKiKJFFn1ag=="
+ "integrity": "sha512-3ouUOpQhtgrbOa17J7+uxOTpITYWaGP7/AhoR3+A+/1e9skrzelGi/dXzEYyvbxubEF6Wn2ypscTKiKJFFn1ag==",
+ "license": "MIT"
+ },
+ "node_modules/process-warning": {
+ "version": "4.0.1",
+ "resolved": "https://registry.npmjs.org/process-warning/-/process-warning-4.0.1.tgz",
+ "integrity": "sha512-3c2LzQ3rY9d0hc1emcsHhfT9Jwz0cChib/QN89oME2R451w5fy3f0afAhERFZAwrbDU43wk12d0ORBpDVME50Q==",
+ "funding": [
+ {
+ "type": "github",
+ "url": "https://github.com/sponsors/fastify"
+ },
+ {
+ "type": "opencollective",
+ "url": "https://opencollective.com/fastify"
+ }
+ ],
+ "license": "MIT"
},
"node_modules/proxy-addr": {
"version": "2.0.7",
"resolved": "https://registry.npmjs.org/proxy-addr/-/proxy-addr-2.0.7.tgz",
"integrity": "sha512-llQsMLSUDUPT44jdrU/O37qlnifitDP+ZwrmmZcoSKyLKvtZxpyV0n2/bD/N4tBAAZ/gJEdZU7KMraoK1+XYAg==",
+ "license": "MIT",
"dependencies": {
"forwarded": "0.2.0",
"ipaddr.js": "1.9.1"
@@ -1494,13 +1715,26 @@
"node_modules/proxy-from-env": {
"version": "1.1.0",
"resolved": "https://registry.npmjs.org/proxy-from-env/-/proxy-from-env-1.1.0.tgz",
- "integrity": "sha512-D+zkORCbA9f1tdWRK0RaCR3GPv50cMxcrz4X8k5LTSUD1Dkw47mKJEZQNunItRTkWwgtaUSo1RVFRIG9ZXiFYg=="
+ "integrity": "sha512-D+zkORCbA9f1tdWRK0RaCR3GPv50cMxcrz4X8k5LTSUD1Dkw47mKJEZQNunItRTkWwgtaUSo1RVFRIG9ZXiFYg==",
+ "license": "MIT"
},
"node_modules/pstree.remy": {
"version": "1.1.8",
"resolved": "https://registry.npmjs.org/pstree.remy/-/pstree.remy-1.1.8.tgz",
"integrity": "sha512-77DZwxQmxKnu3aR542U+X8FypNzbfJ+C5XQDk3uWjWxn6151aIMGthWYRXTqT1E5oJvg+ljaa2OJi+VfvCOQ8w==",
- "dev": true
+ "dev": true,
+ "license": "MIT"
+ },
+ "node_modules/pump": {
+ "version": "3.0.2",
+ "resolved": "https://registry.npmjs.org/pump/-/pump-3.0.2.tgz",
+ "integrity": "sha512-tUPXtzlGM8FE3P0ZL6DVs/3P58k9nk8/jZeQCurTJylQA8qFYzHFfhBJkuqyE0FifOsQ0uKWekiZ5g8wtr28cw==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "end-of-stream": "^1.1.0",
+ "once": "^1.3.1"
+ }
},
"node_modules/qs": {
"version": "6.13.0",
@@ -1517,10 +1751,17 @@
"url": "https://github.com/sponsors/ljharb"
}
},
+ "node_modules/quick-format-unescaped": {
+ "version": "4.0.4",
+ "resolved": "https://registry.npmjs.org/quick-format-unescaped/-/quick-format-unescaped-4.0.4.tgz",
+ "integrity": "sha512-tYC1Q1hgyRuHgloV/YXs2w15unPVh8qfu/qCTfhTYamaw7fyhumKa2yGpdSo87vY32rIclj+4fWYQXUMs9EHvg==",
+ "license": "MIT"
+ },
"node_modules/random-bytes": {
"version": "1.0.0",
"resolved": "https://registry.npmjs.org/random-bytes/-/random-bytes-1.0.0.tgz",
"integrity": "sha512-iv7LhNVO047HzYR3InF6pUcUsPQiHTM1Qal51DcGSuZFBil1aBBWG5eHPNek7bvILMaYJ/8RU1e8w1AMdHmLQQ==",
+ "license": "MIT",
"engines": {
"node": ">= 0.8"
}
@@ -1538,6 +1779,7 @@
"version": "2.5.2",
"resolved": "https://registry.npmjs.org/raw-body/-/raw-body-2.5.2.tgz",
"integrity": "sha512-8zGqypfENjCIqGhgXToC8aB2r7YrBX+AQAfIPs/Mlk+BtPTztOvTS01NRW/3Eh60J+a48lt8qsCzirQ6loCVfA==",
+ "license": "MIT",
"dependencies": {
"bytes": "3.1.2",
"http-errors": "2.0.0",
@@ -1552,6 +1794,7 @@
"version": "2.3.8",
"resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.8.tgz",
"integrity": "sha512-8p0AUk4XODgIewSi0l8Epjs+EVnWiK7NoDIEGU0HhE7+ZyY8D1IMY7odu5lRrFXGg71L15KG8QrPmum45RTtdA==",
+ "license": "MIT",
"dependencies": {
"core-util-is": "~1.0.0",
"inherits": "~2.0.3",
@@ -1565,13 +1808,15 @@
"node_modules/readable-stream/node_modules/safe-buffer": {
"version": "5.1.2",
"resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz",
- "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g=="
+ "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==",
+ "license": "MIT"
},
"node_modules/readdirp": {
"version": "3.6.0",
"resolved": "https://registry.npmjs.org/readdirp/-/readdirp-3.6.0.tgz",
"integrity": "sha512-hOS089on8RduqdbhvQ5Z37A0ESjsqz6qnRcffsMU3495FuTdqSm+7bhJ29JvIOsBDEEnan5DPu9t3To9VRlMzA==",
"dev": true,
+ "license": "MIT",
"dependencies": {
"picomatch": "^2.2.1"
},
@@ -1579,15 +1824,20 @@
"node": ">=8.10.0"
}
},
- "node_modules/regexp-clone": {
- "version": "1.0.0",
- "resolved": "https://registry.npmjs.org/regexp-clone/-/regexp-clone-1.0.0.tgz",
- "integrity": "sha512-TuAasHQNamyyJ2hb97IuBEif4qBHGjPHBS64sZwytpLEqtBQ1gPJTnOaQ6qmpET16cK14kkjbazl6+p0RRv0yw=="
+ "node_modules/real-require": {
+ "version": "0.2.0",
+ "resolved": "https://registry.npmjs.org/real-require/-/real-require-0.2.0.tgz",
+ "integrity": "sha512-57frrGM/OCTLqLOAh0mhVA9VBMHd+9U7Zb2THMGdBUoZVOtGbJzjxsYGDJ3A9AYYCP4hn6y1TVbaOfzWtm5GFg==",
+ "license": "MIT",
+ "engines": {
+ "node": ">= 12.13.0"
+ }
},
"node_modules/require-at": {
"version": "1.0.6",
"resolved": "https://registry.npmjs.org/require-at/-/require-at-1.0.6.tgz",
"integrity": "sha512-7i1auJbMUrXEAZCOQ0VNJgmcT2VOKPRl2YGJwgpHpC9CE91Mv4/4UYIUm4chGJaI381ZDq1JUicFii64Hapd8g==",
+ "license": "Apache-2.0",
"engines": {
"node": ">=4"
}
@@ -1609,17 +1859,29 @@
"type": "consulting",
"url": "https://feross.org/support"
}
- ]
+ ],
+ "license": "MIT"
+ },
+ "node_modules/safe-stable-stringify": {
+ "version": "2.5.0",
+ "resolved": "https://registry.npmjs.org/safe-stable-stringify/-/safe-stable-stringify-2.5.0.tgz",
+ "integrity": "sha512-b3rppTKm9T+PsVCBEOUR46GWI7fdOs00VKZ1+9c1EWDaDMvjQc6tUwuFyIprgGgTcWoVHSKrU8H31ZHA2e0RHA==",
+ "license": "MIT",
+ "engines": {
+ "node": ">=10"
+ }
},
"node_modules/safer-buffer": {
"version": "2.1.2",
"resolved": "https://registry.npmjs.org/safer-buffer/-/safer-buffer-2.1.2.tgz",
- "integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg=="
+ "integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==",
+ "license": "MIT"
},
"node_modules/saslprep": {
"version": "1.0.3",
"resolved": "https://registry.npmjs.org/saslprep/-/saslprep-1.0.3.tgz",
"integrity": "sha512-/MY/PEMbk2SuY5sScONwhUDsV2p77Znkb/q3nSVstq/yQzYJOH/Azh29p9oJLsl3LnQwSvZDKagDGBsBwSooag==",
+ "license": "MIT",
"optional": true,
"dependencies": {
"sparse-bitfield": "^3.0.3"
@@ -1628,10 +1890,18 @@
"node": ">=6"
}
},
+ "node_modules/secure-json-parse": {
+ "version": "2.7.0",
+ "resolved": "https://registry.npmjs.org/secure-json-parse/-/secure-json-parse-2.7.0.tgz",
+ "integrity": "sha512-6aU+Rwsezw7VR8/nyvKTx8QpWH9FrcYiXXlqC4z5d5XQBDRqtbfsRjnwGyqbi3gddNtWHuEk9OANUotL26qKUw==",
+ "dev": true,
+ "license": "BSD-3-Clause"
+ },
"node_modules/semver": {
- "version": "7.6.2",
- "resolved": "https://registry.npmjs.org/semver/-/semver-7.6.2.tgz",
- "integrity": "sha512-FNAIBWCx9qcRhoHcgcJ0gvU7SN1lYU2ZXuSfl04bSC5OpvDHFyJCjdNHomPXxjQlCBU67YW64PzY7/VIEH7F2w==",
+ "version": "7.6.3",
+ "resolved": "https://registry.npmjs.org/semver/-/semver-7.6.3.tgz",
+ "integrity": "sha512-oVekP1cKtI+CTDvHWYFUcMtsK/00wmAEfyqKfNdARm8u1wNVhSgaX7A8d4UuIlUI5e84iEwOhs7ZPYRmzU9U6A==",
+ "license": "ISC",
"bin": {
"semver": "bin/semver.js"
},
@@ -1713,7 +1983,8 @@
"node_modules/setprototypeof": {
"version": "1.2.0",
"resolved": "https://registry.npmjs.org/setprototypeof/-/setprototypeof-1.2.0.tgz",
- "integrity": "sha512-E5LDX7Wrp85Kil5bhZv46j8jOeboKq5JMmYM3gVGdGH8xFpPWXUMsNrlODCrkoxMEeNi/XZIwuRvY4XNwYMJpw=="
+ "integrity": "sha512-E5LDX7Wrp85Kil5bhZv46j8jOeboKq5JMmYM3gVGdGH8xFpPWXUMsNrlODCrkoxMEeNi/XZIwuRvY4XNwYMJpw==",
+ "license": "ISC"
},
"node_modules/side-channel": {
"version": "1.0.6",
@@ -1733,16 +2004,12 @@
"url": "https://github.com/sponsors/ljharb"
}
},
- "node_modules/sift": {
- "version": "13.5.2",
- "resolved": "https://registry.npmjs.org/sift/-/sift-13.5.2.tgz",
- "integrity": "sha512-+gxdEOMA2J+AI+fVsCqeNn7Tgx3M9ZN9jdi95939l1IJ8cZsqS8sqpJyOkic2SJk+1+98Uwryt/gL6XDaV+UZA=="
- },
"node_modules/simple-update-notifier": {
"version": "2.0.0",
"resolved": "https://registry.npmjs.org/simple-update-notifier/-/simple-update-notifier-2.0.0.tgz",
"integrity": "sha512-a2B9Y0KlNXl9u/vsW6sTIu9vGEpfKu2wRV6l1H3XEas/0gUIzGzBoP/IouTcUQbm9JWZLH3COxyn03TYlFax6w==",
"dev": true,
+ "license": "MIT",
"dependencies": {
"semver": "^7.5.3"
},
@@ -1750,24 +2017,39 @@
"node": ">=10"
}
},
- "node_modules/sliced": {
- "version": "1.0.1",
- "resolved": "https://registry.npmjs.org/sliced/-/sliced-1.0.1.tgz",
- "integrity": "sha512-VZBmZP8WU3sMOZm1bdgTadsQbcscK0UM8oKxKVBs4XAhUo2Xxzm/OFMGBkPusxw9xL3Uy8LrzEqGqJhclsr0yA=="
+ "node_modules/sonic-boom": {
+ "version": "4.2.0",
+ "resolved": "https://registry.npmjs.org/sonic-boom/-/sonic-boom-4.2.0.tgz",
+ "integrity": "sha512-INb7TM37/mAcsGmc9hyyI6+QR3rR1zVRu36B0NeGXKnOOLiZOfER5SA+N7X7k3yUYRzLWafduTDvJAfDswwEww==",
+ "license": "MIT",
+ "dependencies": {
+ "atomic-sleep": "^1.0.0"
+ }
},
"node_modules/sparse-bitfield": {
"version": "3.0.3",
"resolved": "https://registry.npmjs.org/sparse-bitfield/-/sparse-bitfield-3.0.3.tgz",
"integrity": "sha512-kvzhi7vqKTfkh0PZU+2D2PIllw2ymqJKujUcyPMd9Y75Nv4nPbGJZXNhxsgdQab2BmlDct1YnfQCguEvHr7VsQ==",
+ "license": "MIT",
"optional": true,
"dependencies": {
"memory-pager": "^1.0.2"
}
},
+ "node_modules/split2": {
+ "version": "4.2.0",
+ "resolved": "https://registry.npmjs.org/split2/-/split2-4.2.0.tgz",
+ "integrity": "sha512-UcjcJOWknrNkF6PLX83qcHM6KHgVKNkV62Y8a5uYDVv9ydGQVwAHMKqHdJje1VTWpljG0WYpCDhrCdAOYH4TWg==",
+ "license": "ISC",
+ "engines": {
+ "node": ">= 10.x"
+ }
+ },
"node_modules/statuses": {
"version": "2.0.1",
"resolved": "https://registry.npmjs.org/statuses/-/statuses-2.0.1.tgz",
"integrity": "sha512-RwNA9Z/7PrK06rYLIzFMlaF+l73iwpzsqRIFgbMLbTcLD6cOao82TaWefPXQvB2fOC4AjuYSEndS7N/mTCbkdQ==",
+ "license": "MIT",
"engines": {
"node": ">= 0.8"
}
@@ -1784,6 +2066,7 @@
"version": "1.1.1",
"resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz",
"integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==",
+ "license": "MIT",
"dependencies": {
"safe-buffer": "~5.1.0"
}
@@ -1791,12 +2074,27 @@
"node_modules/string_decoder/node_modules/safe-buffer": {
"version": "5.1.2",
"resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz",
- "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g=="
+ "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==",
+ "license": "MIT"
+ },
+ "node_modules/strip-json-comments": {
+ "version": "3.1.1",
+ "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-3.1.1.tgz",
+ "integrity": "sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig==",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">=8"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
},
"node_modules/supports-color": {
"version": "7.2.0",
"resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz",
"integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==",
+ "license": "MIT",
"dependencies": {
"has-flag": "^4.0.0"
},
@@ -1804,11 +2102,21 @@
"node": ">=8"
}
},
+ "node_modules/thread-stream": {
+ "version": "3.1.0",
+ "resolved": "https://registry.npmjs.org/thread-stream/-/thread-stream-3.1.0.tgz",
+ "integrity": "sha512-OqyPZ9u96VohAyMfJykzmivOrY2wfMSf3C5TtFJVgN+Hm6aj+voFhlK+kZEIv2FBh1X6Xp3DlnCOfEQ3B2J86A==",
+ "license": "MIT",
+ "dependencies": {
+ "real-require": "^0.2.0"
+ }
+ },
"node_modules/to-regex-range": {
"version": "5.0.1",
"resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-5.0.1.tgz",
"integrity": "sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==",
"dev": true,
+ "license": "MIT",
"dependencies": {
"is-number": "^7.0.0"
},
@@ -1820,18 +2128,17 @@
"version": "1.0.1",
"resolved": "https://registry.npmjs.org/toidentifier/-/toidentifier-1.0.1.tgz",
"integrity": "sha512-o5sSPKEkg/DIQNmH43V0/uerLrpzVedkUh8tGNvaeXpfpuwjKenlSox/2O/BTlZUtEe+JG7s5YhEz608PlAHRA==",
+ "license": "MIT",
"engines": {
"node": ">=0.6"
}
},
"node_modules/touch": {
- "version": "3.1.0",
- "resolved": "https://registry.npmjs.org/touch/-/touch-3.1.0.tgz",
- "integrity": "sha512-WBx8Uy5TLtOSRtIq+M03/sKDrXCLHxwDcquSP2c43Le03/9serjQBIztjRz6FkJez9D/hleyAXTBGLwwZUw9lA==",
+ "version": "3.1.1",
+ "resolved": "https://registry.npmjs.org/touch/-/touch-3.1.1.tgz",
+ "integrity": "sha512-r0eojU4bI8MnHr8c5bNo7lJDdI2qXlWWJk6a9EAFG7vbhTjElYhBVS3/miuE0uOuoLdb8Mc/rVfsmm6eo5o9GA==",
"dev": true,
- "dependencies": {
- "nopt": "~1.0.10"
- },
+ "license": "ISC",
"bin": {
"nodetouch": "bin/nodetouch.js"
}
@@ -1840,6 +2147,7 @@
"version": "1.6.18",
"resolved": "https://registry.npmjs.org/type-is/-/type-is-1.6.18.tgz",
"integrity": "sha512-TkRKr9sUTxEH8MdfuCSP7VizJyzRNMjj2J2do2Jr3Kym598JVdEksuzPQCnlFPW4ky9Q+iA+ma9BGm06XQBy8g==",
+ "license": "MIT",
"dependencies": {
"media-typer": "0.3.0",
"mime-types": "~2.1.24"
@@ -1851,12 +2159,14 @@
"node_modules/typedarray": {
"version": "0.0.6",
"resolved": "https://registry.npmjs.org/typedarray/-/typedarray-0.0.6.tgz",
- "integrity": "sha512-/aCDEGatGvZ2BIk+HmLf4ifCJFwvKFNb9/JeZPMulfgFracn9QFcAf5GO8B/mweUjSoblS5In0cWhqpfs/5PQA=="
+ "integrity": "sha512-/aCDEGatGvZ2BIk+HmLf4ifCJFwvKFNb9/JeZPMulfgFracn9QFcAf5GO8B/mweUjSoblS5In0cWhqpfs/5PQA==",
+ "license": "MIT"
},
"node_modules/uid-safe": {
"version": "2.1.5",
"resolved": "https://registry.npmjs.org/uid-safe/-/uid-safe-2.1.5.tgz",
"integrity": "sha512-KPHm4VL5dDXKz01UuEd88Df+KzynaohSL9fBh096KWAxSKZQDI2uBrVqtvRM4rwrIrRRKsdLNML/lnaaVSRioA==",
+ "license": "MIT",
"dependencies": {
"random-bytes": "~1.0.0"
},
@@ -1867,23 +2177,21 @@
"node_modules/uid2": {
"version": "0.0.4",
"resolved": "https://registry.npmjs.org/uid2/-/uid2-0.0.4.tgz",
- "integrity": "sha512-IevTus0SbGwQzYh3+fRsAMTVVPOoIVufzacXcHPmdlle1jUpq7BRL+mw3dgeLanvGZdwwbWhRV6XrcFNdBmjWA=="
+ "integrity": "sha512-IevTus0SbGwQzYh3+fRsAMTVVPOoIVufzacXcHPmdlle1jUpq7BRL+mw3dgeLanvGZdwwbWhRV6XrcFNdBmjWA==",
+ "license": "MIT"
},
"node_modules/undefsafe": {
"version": "2.0.5",
"resolved": "https://registry.npmjs.org/undefsafe/-/undefsafe-2.0.5.tgz",
"integrity": "sha512-WxONCrssBM8TSPRqN5EmsjVrsv4A8X12J4ArBiiayv3DyyG3ZlIg6yysuuSYdZsVz3TKcTg2fd//Ujd4CHV1iA==",
- "dev": true
- },
- "node_modules/undici-types": {
- "version": "5.26.5",
- "resolved": "https://registry.npmjs.org/undici-types/-/undici-types-5.26.5.tgz",
- "integrity": "sha512-JlCMO+ehdEIKqlFxk6IfVoAUVmgz7cU7zD/h9XZ0qzeosSHmUJVOzSQvvYSYWXkFXC+IfLKSIffhv0sVZup6pA=="
+ "dev": true,
+ "license": "MIT"
},
"node_modules/unpipe": {
"version": "1.0.0",
"resolved": "https://registry.npmjs.org/unpipe/-/unpipe-1.0.0.tgz",
"integrity": "sha512-pjy2bYhSsufwWlKwPc+l3cN7+wuJlK6uz0YdJEOlQDbl6jo/YlPi4mb8agUkVC8BF7V8NuzeyPNqRksA3hztKQ==",
+ "license": "MIT",
"engines": {
"node": ">= 0.8"
}
@@ -1891,23 +2199,42 @@
"node_modules/util-deprecate": {
"version": "1.0.2",
"resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz",
- "integrity": "sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw=="
+ "integrity": "sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw==",
+ "license": "MIT"
},
"node_modules/utils-merge": {
"version": "1.0.1",
"resolved": "https://registry.npmjs.org/utils-merge/-/utils-merge-1.0.1.tgz",
"integrity": "sha512-pMZTvIkT1d+TFGvDOqodOclx0QWkkgi6Tdoa8gC8ffGAAqz9pzPTZWAybbsHHoED/ztMtkv/VoYTYyShUn81hA==",
+ "license": "MIT",
"engines": {
"node": ">= 0.4.0"
}
},
+ "node_modules/uuid": {
+ "version": "8.3.2",
+ "resolved": "https://registry.npmjs.org/uuid/-/uuid-8.3.2.tgz",
+ "integrity": "sha512-+NYs2QeMWy+GWFOEm9xnn6HCDp0l7QBD7ml8zLUmJ+93Q5NF0NocErnwkTkXVFNiX3/fpC6afS8Dhb/gz7R7eg==",
+ "license": "MIT",
+ "bin": {
+ "uuid": "dist/bin/uuid"
+ }
+ },
"node_modules/vary": {
"version": "1.1.2",
"resolved": "https://registry.npmjs.org/vary/-/vary-1.1.2.tgz",
"integrity": "sha512-BNGbWLfd0eUPabhkXUVm0j8uuvREyTh5ovRa/dyow/BqAbZJyC+5fU+IzQOzmAKzYqYRAISoRhdQr3eIZ/PXqg==",
+ "license": "MIT",
"engines": {
"node": ">= 0.8"
}
+ },
+ "node_modules/wrappy": {
+ "version": "1.0.2",
+ "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz",
+ "integrity": "sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ==",
+ "dev": true,
+ "license": "ISC"
}
}
}
diff --git a/package.json b/package.json
old mode 100644
new mode 100755
index 405191a0..ad743e20
--- a/package.json
+++ b/package.json
@@ -4,10 +4,12 @@
"version": "1.0.0",
"scripts": {
"start": "node bin/www",
- "dev": "nodemon --inspect=0.0.0.0:9229 bin/www"
+ "dev": "nodemon --inspect=0.0.0.0:9229 --prof bin/www"
},
"dependencies": {
+ "axios": "^1.7.4",
"body-parser": "1.20.3",
+ "connect-mongo": "3",
"cookie-parser": "1.3.5",
"ejs": "^3.1.10",
"express": "4.21.0",
@@ -16,13 +18,14 @@
"express-session": "1.15.6",
"html": "^1.0.0",
"jsonwebtoken": "^9.0.0",
- "mongoose": "^5.7.8",
- "connect-mongo": "3",
"passport": "^0.6.0",
+ "pino": "^9.6.0",
+ "kafkajs":"^2.2.4",
"passport-keycloak-oauth2-oidc": "^1.0.3",
- "axios": "^1.7.4"
+ "node-cron": "3.0.3"
},
"devDependencies": {
- "nodemon": "^3.1.4"
+ "nodemon": "^3.1.4",
+ "pino-pretty": "^13.0.0"
}
}
diff --git a/profiling.js b/profiling.js
new file mode 100755
index 00000000..d461a202
--- /dev/null
+++ b/profiling.js
@@ -0,0 +1,49 @@
+const config = require('./config.js');
+const path = require('path');
+const { now, convertTimeToCron } = require("./routes/lib/date.js");
+const logger = require("./logger.js");
+const cron = require('node-cron');
+
+if(process.env.NODE_ENV == "development") {
+ logger.info("Profiling in progress...");
+ const profilingFolder = process.env.PROFILING_FOLDER || path.join(__dirname, '../profiling');
+ // Schedule a task to run every x
+ let intervalInMin=30;
+ const cronTime = convertTimeToCron(intervalInMin);
+ logger.info(cronTime);
+ cron.schedule(cronTime, async () => {
+ logger.info(`schedule task for profiling running...`);
+ //let filename=`${profilingFolder}/Heap.${now().toISOString()}.heapsnapshot`;
+ let filename=`${profilingFolder}/${require('v8').writeHeapSnapshot()}`;
+ logger.info(`Saved heapdump into ${require('v8').writeHeapSnapshot(filename)}`);
+ });
+}
+
+/*
+import {
+ Worker,
+ isMainThread,
+ parentPort,
+} from 'node:worker_threads';
+
+if (isMainThread) {
+ const worker = new Worker(__filename);
+
+ worker.once('message', (filename) => {
+ logger.info(`worker heapdump: ${filename}`);
+ // Now get a heapdump for the main thread.
+ logger.info(`main thread heapdump: ${v8.writeHeapSnapshot(`${profilingFolder}/Heap.${now().toISOString()}.heapsnapshot`)}`);
+ });
+
+ // Tell the worker to create a heapdump.
+ worker.postMessage('heapdump');
+} else {
+ parentPort.once('message', (message) => {
+ if (message === 'heapdump') {
+ // Generate a heapdump for the worker
+ // and return the filename to the parent.
+ parentPort.postMessage(v8.writeHeapSnapshot(`${profilingFolder}/Heap.${now().toISOString()}.heapsnapshot`));
+ }
+ });
+}
+*/
\ No newline at end of file
diff --git a/public/activities/activitypainter.js b/public/activities/activitypainter.js
old mode 100644
new mode 100755
index 0432ffdb..dc4fcf21
--- a/public/activities/activitypainter.js
+++ b/public/activities/activitypainter.js
@@ -17,10 +17,36 @@ var ActivityPainter = {
this.utils = utils;
},
+ getUsernameOrToken : function (user) {
+ if(user.isToken) {
+ return user.token;
+ } else {
+ return user.username;
+ }
+ },
+
getExtraForm: function () {
return '';
},
+ getEditExtraForm: function () {
+ return '';
+ },
+
+ updateInputEditExtraForm(activity) {
+ },
+
+ extractEditInformation: function(form, actualActivity, callback){
+ let jform = $(form);
+ let formdata = Utils.getFormData(jform);
+ let activity = {};
+ if(actualActivity.name !== formdata.name) {
+ activity.name = formdata.name;
+ }
+ callback(null, activity);
+ },
+
+
extractInformation: function(form, callback){
let activity = {};
@@ -35,49 +61,51 @@ var ActivityPainter = {
fullyPaintActivity: function(activity){
this.paintActivity(activity, participants);
- let tmp = this;
-
this.updateParticipants(activity);
- setInterval(function(){
- tmp.updateParticipants(activity);
- }, 5000);
},
updateParticipants: function(activity){
- let tmp = this;
- activity.tmp = {};
+ this.paintActivityCompletion(activity, activity.data.completion, true);
+ this.paintActivityResult(activity, activity.data.hasresult, true);
+ if(activity.data.openable){
+ PainterFactory.Painters["activity"].paintActivityTargets(activity, activity.data.target);
+ }
+ },
- Simva.getActivityCompletion(activity._id, function(error, result){
- tmp.paintActivityCompletion(activity, result);
- });
+ paintActivityTargets: function(activity, results){
+ let usernames = Object.keys(results);
- Simva.hasActivityResult(activity._id, function(error, result){
- tmp.paintActivityResult(activity, result);
- });
+ let done = 0, partial = 0;
+
+ for (var i = 0; i < usernames.length; i++) {
+ $(`#${activity._id}_${usernames[i]}_target`).attr('href', results[usernames[i]]);
+ }
},
-
+
paintActivity: function(activity, participants){
$(`#test_${activity.test} .activities`).append(`
${this.simpleName}
Default Activity
-
-
- this.paintActivityParticipantsTable(activity, participants)`);
+ Result: ⬇️
+
+
Results: 0 (0 ) % [ 0 (0 ) /0 ]
+
Progress:0 (0 ) % [ 0 (0 ) /0 ]
+ ${this.paintActivityParticipantsTable(activity, participants, true)}`);
},
- paintActivityParticipantsTable: function(activity, participants){
+ paintActivityParticipantsTable: function(activity, participants, checkbox=false){
let toret = 'User Completed Result ';
for (var i = 0; i < participants.length; i++) {
if(!AllocatorFactory.Painters[allocator.type].isAllocatedToActivity(participants[i].username, activity)){
continue;
}
-
- toret += `${participants[i].username}
- ---
- --- `;
+ toret += `${this.paintUsernameOrToken(activity, participants[i])} `;
+ toret += `${this.paintCompletionRow(activity._id,participants[i].username, checkbox)}
+ ${this.paintResultRow(activity._id,participants[i].username)} `;
}
toret += '
';
@@ -85,7 +113,35 @@ var ActivityPainter = {
return toret;
},
- paintActivityCompletion: function(activity, status){
+ paintUsernameOrToken(activity, participant, ok=null) {
+ let openable = activity.data.openable;
+ if(ok !== '') {
+ openable = openable || ok;
+ }
+ let toret="";
+ if(openable) {
+ toret += `${this.getUsernameOrToken(participant)} `;
+ } else {
+ toret += `${this.getUsernameOrToken(participant)}`;
+ }
+ return toret;
+ },
+
+ paintCompletionRow(activity, participant, checkbox=false) {
+ if(checkbox) {
+ return `
+
+ `;
+ } else {
+ return `--- `;
+ }
+ },
+
+ paintResultRow(activity, participant) {
+ return `--- `;
+ },
+
+ paintActivityCompletion: function(activity, status, checkbox=false){
let usernames = Object.keys(status);
let done = 0;
@@ -94,11 +150,22 @@ var ActivityPainter = {
if(status[usernames[i]]){
done++;
}
-
- let completion = `${status[usernames[i]]} `;
- $(`#completion_${activity._id}_${usernames[i]}`).addClass(!status[usernames[i]] ? 'red' : 'green');
- $(`#completion_${activity._id}_${usernames[i]}`).empty();
- $(`#completion_${activity._id}_${usernames[i]}`).append(completion);
+ if(checkbox) {
+ if(status[usernames[i]]){
+ $(`#completion_${activity._id}_${usernames[i]}`).addClass('green');
+ $(`#completion_${activity._id}_${usernames[i]}`).removeClass('red');
+ }else{
+ $(`#completion_${activity._id}_${usernames[i]}`).removeClass('green');
+ $(`#completion_${activity._id}_${usernames[i]}`).addClass('red');
+ }
+
+ $(`#completion_${activity._id}_${usernames[i]}`).find('input[type="checkbox"]').prop('checked', status[usernames[i]]);
+ } else {
+ let completion = `${status[usernames[i]]} `
+ $(`#completion_${activity._id}_${usernames[i]}`).addClass(!status[usernames[i]] ? 'red' : 'green');
+ $(`#completion_${activity._id}_${usernames[i]}`).empty();
+ $(`#completion_${activity._id}_${usernames[i]}`).append(completion);
+ }
}
let progress = Math.round((done / usernames.length) * 1000) / 10;
@@ -109,43 +176,243 @@ var ActivityPainter = {
$(`#completion_progress_${activity._id} .done`).css('width', `${progress}%` );
$(`#completion_progress_${activity._id} done`).text(progress);
+ $(`#completion_progress_${activity._id} doneres`).text(done);
+ $(`#completion_progress_${activity._id} total`).text(usernames.length);
+ },
+
+ paintActivityProgress: function(activity, status){
+ let usernames = Object.keys(status);
+ let done = 0, partial = 0;
+
+ for (var i = 0; i < usernames.length; i++) {
+ if(status[usernames[i]] !== 0){
+ partial++;
+ if(status[usernames[i]] == 1){
+ done++;
+ }
+ }
+
+ let tmpprogress = status[usernames[i]]*100;
+ $(`#progress_${activity._id}_${usernames[i]} .done`).css('width', `${tmpprogress}%` );
+ $(`#progress_${activity._id}_${usernames[i]} done`).text(tmpprogress);
+ }
+
+ let progress = Math.round((done / usernames.length) * 1000) / 10;
+ if(isNaN(progress)){
+ progress = 0;
+ }
+ $(`#progress_${activity._id} .done`).css('width', `${progress}%` );
+ $(`#progress_${activity._id} done`).text(progress);
+ $(`#progress_${activity._id} doneres`).text(done);
+
+ let partialprogress = Math.round((partial / usernames.length) * 1000) / 10;
+ if(isNaN(partialprogress)){
+ partialprogress = 0;
+ }
+ $(`#progress_${activity._id} .partial`).css('width', `${partialprogress}%` );
+ $(`#progress_${activity._id} partial`).text(partialprogress);
+ $(`#progress_${activity._id} partialres`).text(partial);
+ $(`#progress_${activity._id} total`).text(usernames.length);
},
- paintActivityResult: function(activity, results){
+ paintActivityResult: function(activity, results, defaultValue='No Results', displayDefaultValue='No Results', partialValue=null,displayPartialValue=null, finalValue="true", displayFinalValue="See Results",painter="PainterFactory.Painters['activity']"){
let usernames = Object.keys(results);
let done = 0, partial = 0;
for (var i = 0; i < usernames.length; i++) {
let status = results[usernames[i]];
- let result = 'No results '
-
+ let result= `${displayDefaultValue} `;
+ let color = 'red';
+ let state = defaultValue;
if(status){
- done++;
- result = `See Results `;
+ if(status == finalValue){
+ color = 'green';
+ state = displayFinalValue;
+ done++;
+ partial++;
+ } else if(status == partialValue) {
+ color = 'yellow';
+ state = displayPartialValue;
+ partial++;
+ } else {
+ color = 'red';
+ state = defaultValue;
+ }
+ if(state == defaultValue) {
+ result = `${displayDefaultValue} `;
+ } else {
+ result = `
+ ${state}
+ ⬇️
+ `;
+ }
+
}
-
-
- $(`#result_${activity._id}_${usernames[i]}`).addClass(status ? 'green' : 'red');
+ $(`#result_${activity._id}_${usernames[i]}`).removeClass();
+ $(`#result_${activity._id}_${usernames[i]}`).addClass(color);
$(`#result_${activity._id}_${usernames[i]}`).empty();
$(`#result_${activity._id}_${usernames[i]}`).append(result);
}
let progress = Math.round((done / usernames.length) * 1000) / 10;
- let partialprogress = Math.round((partial / usernames.length) * 1000) / 10;
-
if(isNaN(progress)){
progress = 0;
}
+ $(`#result_progress_${activity._id} .done`).css('width', `${progress}%` );
+ $(`#result_progress_${activity._id} done`).text(progress);
+ $(`#result_progress_${activity._id} doneres`).text(done);
+
+ let partialprogress = Math.round((partial / usernames.length) * 1000) / 10;
if(isNaN(partialprogress)){
partialprogress = 0;
}
-
- $(`#result_progress_${activity._id} .done`).css('width', `${progress}%` );
$(`#result_progress_${activity._id} .partial`).css('width', `${partialprogress}%` );
- $(`#result_progress_${activity._id} done`).text(progress);
$(`#result_progress_${activity._id} partial`).text(partialprogress);
+ $(`#result_progress_${activity._id} partialres`).text(partial);
+ $(`#result_progress_${activity._id} total`).text(usernames.length);
+ },
+
+ updateActivityCompletion: function(activityId, username, completion, checkbox=false) {
+ var users = parseInt(document.querySelector(`#completion_progress_${activityId} total`).textContent);
+ var res= parseInt(document.querySelector(`#completion_progress_${activityId} doneres`).textContent);
+ var newRes;
+ if(checkbox) {
+ var previous= $(`#completion_${activityId}_${username}`).find('input[type="checkbox"]').prop('checked');
+ if(completion) {
+ $(`#completion_${activityId}_${username}`).addClass('green');
+ $(`#completion_${activityId}_${username}`).removeClass('red');
+ newRes=res+1;
+ if(! previous) {
+ $(`#completion_${activityId}_${username}`).find('input[type="checkbox"]').prop('checked', true);
+ }
+ } else {
+ $(`#completion_${activityId}_${username}`).removeClass('green');
+ $(`#completion_${activityId}_${username}`).addClass('red');
+ newRes=res-1;
+ if(previous) {
+ $(`#completion_${activityId}_${username}`).find('input[type="checkbox"]').prop('checked', false);
+ }
+ }
+ } else {
+ var previousCompletion= document.querySelector(`#completion_${activityId}_${username}`).textContent;
+ $(`#completion_${activityId}_${username}`).addClass(completion == 'false' ? 'red' : 'green');
+ $(`#completion_${activityId}_${username}`).empty();
+ $(`#completion_${activityId}_${username}`).append(completion);
+ if(previousCompletion == "false") {
+ newRes = res + 1;
+ }
+ }
+ $(`#completion_progress_${activityId} doneRes`).text(newRes);
+ var progress = Math.round((newRes / users) * 1000) / 10;
+ $(`#completion_progress_${activityId} .done`).css('width', `${progress}%` );
+ $(`#completion_progress_${activityId} done`).text(progress);
+ },
+
+ updateActivityResult: function(activityId, username, result, defaultValue='No Results', displayDefaultValue='No Results', partialValue=null,displayPartialValue=null, finalValue="true", displayFinalValue="See Results", painter="PainterFactory.Painters['activity']") {
+ var users=parseInt(document.querySelector(`#result_progress_${activityId} total`).textContent);
+ var res=parseInt(document.querySelector(`#result_progress_${activityId} doneres`).textContent);
+ var partialRes=parseInt(document.querySelector(`#result_progress_${activityId} partialres`).textContent);
+ var prev=document.querySelector(`#result_${activityId}_${username}`).textContent;
+ var span;
+ var newRes, newPartialRes;
+ if(result){
+ if(result == finalValue){
+ color = 'green';
+ state = displayFinalValue;
+ if(! prev.includes(finalValue)) {
+ newRes = res+1;
+ }
+ } else if(result == partialValue) {
+ color = 'yellow';
+ state = displayPartialValue;
+ if(! prev.includes(partialValue)) {
+ newPartialRes = partialRes+1;
+ }
+ } else {
+ color = 'red';
+ state = displayDefaultValue;
+ if(!prev.includes(displayDefaultValue)) {
+ if(prev.includes(displayPartialValue)) {
+ newPartialRes = partialRes-1;
+ }
+ if(prev.includes(displayFinalValue)) {
+ newRes = res+1;
+ }
+ }
+ }
+ span = `
+ ${state}
+ ⬇️
+ `;
+ } else {
+ span = `${displayDefaultValue} `;
+ }
+ $(`#result_${activityId}_${username}`).removeClass();
+ $(`#result_${activityId}_${username}`).addClass(color);
+ $(`#result_${activityId}_${username}`).empty();
+ $(`#result_${activityId}_${username}`).append(span);
+ if(finalValue) {
+ if(!newRes) {
+ newRes = res;
+ }
+ $(`#result_progress_${activityId} doneRes`).text(newRes);
+ var progress = Math.round((newRes / users) * 1000) / 10;
+ $(`#result_progress_${activityId} .done`).css('width', `${progress}%` );
+ $(`#result_progress_${activityId} done`).text(progress);
+ }
+ if(partialValue) {
+ if(!newPartialRes) {
+ newPartialRes = partialRes;
+ }
+ $(`#result_progress_${activityId} partialres`).text(newPartialRes);
+ var partialProgress = Math.round((newPartialRes / users) * 1000) / 10;
+ $(`#result_progress_${activityId} .partial`).css('width', `${partialProgress}%` );
+ $(`#result_progress_${activityId} partial`).text(partialProgress);
+ }
+ },
+
+ updateActivityProgress: function(activityId, username, result) {
+ var prevValue= parseInt(document.querySelector(`#progress_${activityId}_${username} done`).textContent);
+ var users = parseInt(document.querySelector(`#progress_${activityId} total`).textContent);
+ var res= parseInt(document.querySelector(`#progress_${activityId} doneres`).textContent);
+ var partialres= parseInt(document.querySelector(`#progress_${activityId} partialres`).textContent);
+
+ if(prevValue !== 100) {
+ var progress=result*100;
+ $(`#progress_${activityId}_${username} .done`).css('width', `${progress}%` );
+ $(`#progress_${activityId}_${username} done`).text(progress);
+ if(prevValue == 0 && result !== 0) {
+ var newPartialProgressRes = partialres + 1;
+ $(`#progress_${activityId} partialres`).text(newPartialProgressRes);
+ var newPartialProgress = Math.round((newPartialProgressRes/users) * 1000)/10;
+ $(`#progress_${activityId} partial`).text(newPartialProgress);
+ $(`#progress_${activityId} .partial`).css('width', `${newPartialProgress}%` );
+ }
+ if(result == 1) {
+ var newProgressRes = res + 1;
+ $(`#progress_${activityId} doneres`).text(newProgressRes);
+ var newProgress = Math.round((newProgressRes/ users) * 1000)/10;
+ $(`#progress_${activityId} done`).text(newProgress);
+ $(`#progress_${activityId} .done`).css('width', `${newProgress}%` );
+ }
+ } else {
+ var progress=result*100;
+ $(`#progress_${activityId}_${username} .done`).css('width', `${progress}%` );
+ $(`#progress_${activityId}_${username} done`).text(progress);
+ var newProgressRes = res - 1;
+ $(`#progress_${activityId} doneres`).text(newProgressRes);
+ var newProgress = Math.round((newProgressRes/ users) * 1000)/10;
+ $(`#progress_${activityId} done`).text(newProgress);
+ $(`#progress_${activityId} .done`).css('width', `${newProgress}%` );
+ if(result == 0) {
+ var newPartialProgressRes = partialres - 1;
+ $(`#progress_${activityId} partialres`).text(newPartialProgressRes);
+ var newPartialProgress = Math.round((newPartialProgressRes/users) * 1000)/10;
+ $(`#progress_${activityId} partial`).text(newPartialProgress);
+ $(`#progress_${activityId} .partial`).css('width', `${newPartialProgress}%` );
+ }
+ }
},
openResults: function(activity, user){
@@ -158,14 +425,72 @@ var ActivityPainter = {
icon: 'error',
stack: false
});
- }else{
- let content = `${result[user]}
`;
+ } else {
+ // Extract and sanitize the string
+ const stringifyres = result[user]
+ .replace(//g, ">");
+ // Create a pre-formatted text element with styling
+ let content = `${stringifyres} `;
+
let context = $('#iframe_floating iframe')[0].contentWindow.document;
let body = $('body', context);
+
+ // Set the content and ensure proper styling
body.html(content);
- toggleAddForm('iframe_floating');
+ body.css({
+ 'margin': '0',
+ 'padding': '0',
+ 'overflow': 'auto',
+ 'height': '100vh'
+ });
+ Utils.toggleAddForm('iframe_floating');
}
- })
+ });
+ },
+
+ downloadResults: function(activity, user){
+ if(user) {
+ Simva.getActivityResultForUser(activity, user, function(error, result){
+ if(error){
+ $.toast({
+ heading: 'Error loading the result',
+ text: error.message,
+ position: 'top-right',
+ icon: 'error',
+ stack: false
+ });
+ } else {
+ var filename = `${activity}_${user}.json`;
+ Utils.download(filename, result[user]);
+ }
+ });
+ } else {
+ Simva.getActivityResult(activity, (error, result) => {
+ if(error) {
+ toastParams.text = error.message;
+ $.toast(toastParams);
+ } else {
+ Utils.download(`activity_result_${activity}.json`, JSON.stringify(result, null, 2));
+ }
+ });
+ }
+ },
+
+ toggleCompletion: function(checkbox, activityId, username){
+ let status = $(checkbox).is(":checked");
+
+ if(status){
+ $(`#completion_${activityId}_${username}`).addClass('green');
+ $(`#completion_${activityId}_${username}`).removeClass('red');
+ }else{
+ $(`#completion_${activityId}_${username}`).removeClass('green');
+ $(`#completion_${activityId}_${username}`).addClass('red');
+ }
+
+ Simva.setActivityCompletion(activityId, username, status, function(){
+ console.log('saved');
+ });
}
}
diff --git a/public/activities/gameplaypainter.js b/public/activities/gameplaypainter.js
old mode 100644
new mode 100755
index 072564c0..65fbfa90
--- a/public/activities/gameplaypainter.js
+++ b/public/activities/gameplaypainter.js
@@ -17,13 +17,31 @@ var GameplayActivityPainter = {
},
getExtraForm: function () {
- return `Trace Storage
+ return `
`;
+
Game URI can include tags: {simvaResultUri}, {simvaHomePage}, {username}, {authToken}, {token_endpoint}, {userToken}, {studyId} and {activityId} `;
//Realtime
},
+ getEditExtraForm: function () {
+ return ``;
+ //Realtime
+ },
+
+ updateInputEditExtraForm(activity) {
+ var gameplay_trace_storage = document.getElementById('edit_gameplay_trace_storage');
+ gameplay_trace_storage.checked = activity.extra_data.config.trace_storage;
+ var gameplay_backup = document.getElementById('edit_gameplay_backup');
+ gameplay_backup.checked = activity.extra_data.config.backup;
+ var gameplay_game_uri = document.getElementById('edit_gameplay_game_uri');
+ gameplay_game_uri.value = activity.extra_data.game_uri;
+
+ },
+
extractInformation: function(form, callback){
let activity = {};
@@ -43,39 +61,56 @@ var GameplayActivityPainter = {
callback(null, activity);
},
- fullyPaintActivity: function(activity){
- this.paintActivity(activity, participants);
- let tmp = this;
-
- Simva.isActivityOpenable(activity._id, function(error, result){
+ extractEditInformation: function(form, actualActivity, callback){
+ let jform = $(form);
+ let formdata = Utils.getFormData(jform);
+ let activity = {};
- activity.isOpenable = result.openable;
- if(activity.isOpenable){
- Simva.getActivityTarget(activity._id, function(error, result){
- activity.tmp.result = result;
- tmp.paintActivityTargets(activity, result);
- });
+ if(actualActivity.name !== formdata.name) {
+ activity.name = formdata.name;
+ }
+
+ let trace_storage = formdata.trace_storage === 'on';
+ if(actualActivity.extra_data.config.trace_storage !== trace_storage) {
+ activity.trace_storage = trace_storage;
+ }
+ let realtime = formdata.realtime === 'on';
+ if(actualActivity.extra_data.config.realtime !== realtime) {
+ activity.realtime = realtime;
+ }
+ let backup = formdata.backup === 'on';
+ if(actualActivity.extra_data.config.backup !== backup) {
+ activity.backup = backup;
+ }
+ let game_uri=formdata.game_uri;
+ if(!(actualActivity.extra_data.game_uri == game_uri)) {
+ if(actualActivity.extra_data.game_uri) {
+ activity.game_uri = game_uri;
+ } else {
+ if(game_uri !== ''){
+ activity.game_uri = game_uri;
+ }
}
+ }
+
+ callback(null, activity);
+ },
- tmp.updateParticipants(activity);
-
- });
+ fullyPaintActivity: function(activity){
+ this.paintActivity(activity, participants);
+ this.updateParticipants(activity);
},
updateParticipants: function(activity){
- let tmp = this;
- activity.tmp = {};
-
- Simva.getActivityCompletion(activity._id, function(error, result){
- tmp.paintActivityCompletion(activity, result);
- });
-
- Simva.getActivityHasResult(activity._id, function(error, result){
- tmp.paintActivityResult(activity, result);
- });
+ if(activity.data.openable){
+ PainterFactory.Painters["activity"].paintActivityTargets(activity, activity.data.target);
+ }
+ PainterFactory.Painters["activity"].paintActivityCompletion(activity, activity.data.completion, true);
+ PainterFactory.Painters["activity"].paintActivityProgress(activity, activity.data.progress);
+ PainterFactory.Painters["activity"].paintActivityResult(activity, activity.data.hasresult, false, "No Backup", null, null, true, "See Backup");
},
- downloadXasuConfig: function(activityId){
+ downloadXasuConfig: function(activityId, studyId){
var content = JSON.stringify({
online: true,
simva :true,
@@ -86,7 +121,9 @@ var GameplayActivityPainter = {
auth_endpoint : `${Simva.ssoUrl}/realms/${Simva.ssoRealm}/protocol/openid-connect/auth`,
token_endpoint : `${Simva.ssoUrl}/realms/${Simva.ssoRealm}/protocol/openid-connect/token`,
client_id : "simva-plugin",
- code_challenge_method : "S256"
+ code_challenge_method : "S256",
+ simva_user_token:"true",
+ login_hint: studyId
}
}, null, 2);
@@ -102,9 +139,9 @@ var GameplayActivityPainter = {
paintActivity: function(activity, participants){
let activitybox = `
${this.simpleName}
`;
-
/*
activitybox += 'Realtime: ';
@@ -120,7 +157,7 @@ var GameplayActivityPainter = {
activitybox += `Download Data
XASU Config:
-
+
`;
} else {
@@ -133,10 +170,13 @@ var GameplayActivityPainter = {
} else {
activitybox += 'Disabled ';
}
- activitybox += '
';
- activitybox += ``
+ activitybox += '';
+ activitybox += ``
+ if(activity.extra_data.config.trace_storage){
+ activitybox += `
GameProgress: 0 (0 ) % [ 0 (0 ) /0 ] `
+ }
if(activity.extra_data.config.backup){
- activitybox += ``
+ activitybox += `
BackupResults: 0 (0 ) % [ 0 (0 ) /0 ] `
}
activitybox += `${this.paintActivityParticipantsTable(activity, participants)}`;
@@ -144,10 +184,8 @@ var GameplayActivityPainter = {
},
paintActivityParticipantsTable: function(activity, participants){
- let toret = '