From 327fa79f1c7f2aefc5afa62c5a300cb418539c62 Mon Sep 17 00:00:00 2001 From: Henry Oswald Date: Wed, 23 May 2018 15:00:46 +0100 Subject: [PATCH 01/53] update build scripts, acceptence tests now pass. includes dockerfile 1.1.3 --- services/real-time/.dockerignore | 9 +++ services/real-time/.nvmrc | 2 +- services/real-time/Dockerfile | 22 ++++++ services/real-time/Jenkinsfile | 72 +++++++------------ services/real-time/Makefile | 42 +++++++++++ services/real-time/app.coffee | 2 + .../app/coffee/ConnectedUsersManager.coffee | 2 + .../coffee/DocumentUpdaterController.coffee | 2 + .../real-time/config/settings.defaults.coffee | 6 +- services/real-time/docker-compose.ci.yml | 32 +++++++++ services/real-time/docker-compose.yml | 41 +++++++++++ services/real-time/nodemon.json | 19 +++++ services/real-time/package.json | 13 +++- .../acceptance/coffee/ApplyUpdateTests.coffee | 2 +- .../coffee/ReceiveUpdateTests.coffee | 2 +- .../coffee/helpers/RealTimeClient.coffee | 2 +- .../coffee/helpers/RealtimeServer.coffee | 24 +++++++ 17 files changed, 239 insertions(+), 55 deletions(-) create mode 100644 services/real-time/.dockerignore create mode 100644 services/real-time/Dockerfile create mode 100644 services/real-time/Makefile create mode 100644 services/real-time/docker-compose.ci.yml create mode 100644 services/real-time/docker-compose.yml create mode 100644 services/real-time/nodemon.json create mode 100644 services/real-time/test/acceptance/coffee/helpers/RealtimeServer.coffee diff --git a/services/real-time/.dockerignore b/services/real-time/.dockerignore new file mode 100644 index 0000000000..386f26df30 --- /dev/null +++ b/services/real-time/.dockerignore @@ -0,0 +1,9 @@ +node_modules/* +gitrev +.git +.gitignore +.npm +.nvmrc +nodemon.json +app.js +**/js/* diff --git a/services/real-time/.nvmrc b/services/real-time/.nvmrc index 26ec038c18..e1e5d1369a 100644 --- a/services/real-time/.nvmrc +++ b/services/real-time/.nvmrc @@ -1 +1 @@ -6.9.5 \ No newline at end of file +6.9.5 diff --git a/services/real-time/Dockerfile b/services/real-time/Dockerfile new file mode 100644 index 0000000000..aabf01ad91 --- /dev/null +++ b/services/real-time/Dockerfile @@ -0,0 +1,22 @@ +FROM node:6.9.5 as app + +WORKDIR /app + +#wildcard as some files may not be in all repos +COPY package*.json npm-shrink*.json /app/ + +RUN npm install --quiet + +COPY . /app + + +RUN npm run compile:all + +FROM node:6.9.5 + +COPY --from=app /app /app + +WORKDIR /app +USER node + +CMD ["node","app.js"] diff --git a/services/real-time/Jenkinsfile b/services/real-time/Jenkinsfile index d908d42063..bc9ba0142f 100644 --- a/services/real-time/Jenkinsfile +++ b/services/real-time/Jenkinsfile @@ -1,87 +1,67 @@ -pipeline { - - agent any +String cron_string = BRANCH_NAME == "master" ? "@daily" : "" - environment { - HOME = "/tmp" - } +pipeline { + agent any triggers { pollSCM('* * * * *') - cron('@daily') + cron(cron_string) } stages { - stage('Install') { - agent { - docker { - image 'node:6.9.5' - args "-v /var/lib/jenkins/.npm:/tmp/.npm -e HOME=/tmp" - reuseNode true - } - } + stage('Build') { steps { - // we need to disable logallrefupdates, else git clones during the npm install will require git to lookup the user id - // which does not exist in the container's /etc/passwd file, causing the clone to fail. - sh 'git config --global core.logallrefupdates false' - sh 'rm -fr node_modules' - sh 'npm install' - sh 'npm rebuild' - sh 'npm install --quiet grunt-cli' + sh 'make build' } } - stage('Compile and Test') { - agent { - docker { - image 'node:6.9.5' - args "-v /var/lib/jenkins/.npm:/tmp/.npm -e HOME=/tmp" - reuseNode true - } - } + + stage('Unit Tests') { steps { - sh 'node_modules/.bin/grunt install' - sh 'node_modules/.bin/grunt compile:acceptance_tests' - sh 'node_modules/.bin/grunt test:unit' + sh 'DOCKER_COMPOSE_FLAGS="-f docker-compose.ci.yml" make test_unit' } } + stage('Acceptance Tests') { steps { - sh 'docker pull sharelatex/acceptance-test-runner' - sh 'docker run --rm -v $(pwd):/app sharelatex/acceptance-test-runner' + sh 'DOCKER_COMPOSE_FLAGS="-f docker-compose.ci.yml" make test_acceptance' } } - stage('Package') { + + stage('Package and publish build') { steps { - sh 'echo ${BUILD_NUMBER} > build_number.txt' - sh 'touch build.tar.gz' // Avoid tar warning about files changing during read - sh 'tar -czf build.tar.gz --exclude=build.tar.gz --exclude-vcs .' + sh 'make publish' } } - stage('Publish') { + + stage('Publish build number') { steps { + sh 'echo ${BRANCH_NAME}-${BUILD_NUMBER} > build_number.txt' withAWS(credentials:'S3_CI_BUILDS_AWS_KEYS', region:"${S3_REGION_BUILD_ARTEFACTS}") { - s3Upload(file:'build.tar.gz', bucket:"${S3_BUCKET_BUILD_ARTEFACTS}", path:"${JOB_NAME}/${BUILD_NUMBER}.tar.gz") // The deployment process uses this file to figure out the latest build s3Upload(file:'build_number.txt', bucket:"${S3_BUCKET_BUILD_ARTEFACTS}", path:"${JOB_NAME}/latest") } } } } - + post { + always { + sh 'DOCKER_COMPOSE_FLAGS="-f docker-compose.ci.yml" make test_clean' + } + failure { - mail(from: "${EMAIL_ALERT_FROM}", - to: "${EMAIL_ALERT_TO}", + mail(from: "${EMAIL_ALERT_FROM}", + to: "${EMAIL_ALERT_TO}", subject: "Jenkins build failed: ${JOB_NAME}:${BUILD_NUMBER}", body: "Build: ${BUILD_URL}") } } - + // The options directive is for configuration that applies to the whole job. options { // we'd like to make sure remove old builds, so we don't fill up our storage! buildDiscarder(logRotator(numToKeepStr:'50')) - + // And we'd really like to be sure that this build doesn't hang forever, so let's time it out after: timeout(time: 30, unit: 'MINUTES') } diff --git a/services/real-time/Makefile b/services/real-time/Makefile new file mode 100644 index 0000000000..48511326ad --- /dev/null +++ b/services/real-time/Makefile @@ -0,0 +1,42 @@ +# This file was auto-generated, do not edit it directly. +# Instead run bin/update_build_scripts from +# https://github.com/sharelatex/sharelatex-dev-environment +# Version: 1.1.3 + +BUILD_NUMBER ?= local +BRANCH_NAME ?= $(shell git rev-parse --abbrev-ref HEAD) +PROJECT_NAME = real-time +DOCKER_COMPOSE_FLAGS ?= -f docker-compose.yml +DOCKER_COMPOSE := BUILD_NUMBER=$(BUILD_NUMBER) \ + BRANCH_NAME=$(BRANCH_NAME) \ + PROJECT_NAME=$(PROJECT_NAME) \ + MOCHA_GREP=${MOCHA_GREP} \ + docker-compose ${DOCKER_COMPOSE_FLAGS} + + +clean: + rm -f app.js + rm -rf app/js + rm -rf test/unit/js + rm -rf test/acceptance/js + +test: test_unit test_acceptance + +test_unit: + @[ ! -d test/unit ] && echo "real-time has no unit tests" || $(DOCKER_COMPOSE) run --rm test_unit + +test_acceptance: test_clean test_acceptance_pre_run # clear the database before each acceptance test run + @[ ! -d test/acceptance ] && echo "real-time has no acceptance tests" || $(DOCKER_COMPOSE) run --rm test_acceptance + +test_clean: + $(DOCKER_COMPOSE) down -v -t 0 + +test_acceptance_pre_run: + @[ ! -f test/acceptance/scripts/pre-run ] && echo "real-time has no pre acceptance tests task" || $(DOCKER_COMPOSE) run --rm test_acceptance test/acceptance/scripts/pre-run +build: + docker build --pull --tag gcr.io/csh-gcdm-test/$(PROJECT_NAME):$(BRANCH_NAME)-$(BUILD_NUMBER) . + +publish: + docker push gcr.io/csh-gcdm-test/$(PROJECT_NAME):$(BRANCH_NAME)-$(BUILD_NUMBER) + +.PHONY: clean test test_unit test_acceptance test_clean build publish diff --git a/services/real-time/app.coffee b/services/real-time/app.coffee index 824cdce5db..91e427f3aa 100644 --- a/services/real-time/app.coffee +++ b/services/real-time/app.coffee @@ -8,6 +8,8 @@ Settings = require "settings-sharelatex" if Settings.sentry?.dsn? logger.initializeErrorReporting(Settings.sentry.dsn) +console.log "dasdsadasdsadsadsadsad" +console.log Settings.redis.websessions sessionRedisClient = redis.createClient(Settings.redis.websessions) RedisStore = require('connect-redis')(session) diff --git a/services/real-time/app/coffee/ConnectedUsersManager.coffee b/services/real-time/app/coffee/ConnectedUsersManager.coffee index 831a237356..38370da464 100644 --- a/services/real-time/app/coffee/ConnectedUsersManager.coffee +++ b/services/real-time/app/coffee/ConnectedUsersManager.coffee @@ -5,6 +5,8 @@ redis = require("redis-sharelatex") rclient = redis.createClient(Settings.redis.realtime) Keys = Settings.redis.realtime.key_schema +console.log Settings.redis.realtime, "REALTIME" + ONE_HOUR_IN_S = 60 * 60 ONE_DAY_IN_S = ONE_HOUR_IN_S * 24 FOUR_DAYS_IN_S = ONE_DAY_IN_S * 4 diff --git a/services/real-time/app/coffee/DocumentUpdaterController.coffee b/services/real-time/app/coffee/DocumentUpdaterController.coffee index 451dc812bc..05a70fe3a7 100644 --- a/services/real-time/app/coffee/DocumentUpdaterController.coffee +++ b/services/real-time/app/coffee/DocumentUpdaterController.coffee @@ -4,6 +4,8 @@ redis = require("redis-sharelatex") rclient = redis.createClient(settings.redis.documentupdater) SafeJsonParse = require "./SafeJsonParse" +console.log "REDIS", settings.redis + MESSAGE_SIZE_LOG_LIMIT = 1024 * 1024 # 1Mb module.exports = DocumentUpdaterController = diff --git a/services/real-time/config/settings.defaults.coffee b/services/real-time/config/settings.defaults.coffee index e3464aa26a..73e751a3b9 100644 --- a/services/real-time/config/settings.defaults.coffee +++ b/services/real-time/config/settings.defaults.coffee @@ -1,7 +1,7 @@ module.exports = redis: realtime: - host: process.env['REDIS_HOST'] or "localhost" + host: process.env['REDIS_HOST'] or "localhostssss" port: "6379" password: "" key_schema: @@ -9,14 +9,14 @@ module.exports = connectedUser: ({project_id, client_id})-> "connected_user:#{project_id}:#{client_id}" documentupdater: - host: process.env['REDIS_HOST'] or "localhost" + host: process.env['REDIS_HOST'] or "localhostssss" port: "6379" password: "" key_schema: pendingUpdates: ({doc_id}) -> "PendingUpdates:#{doc_id}" websessions: - host: process.env['REDIS_HOST'] or "localhost" + host: process.env['REDIS_HOST'] or "localhostssss" port: "6379" password: "" diff --git a/services/real-time/docker-compose.ci.yml b/services/real-time/docker-compose.ci.yml new file mode 100644 index 0000000000..21c006641e --- /dev/null +++ b/services/real-time/docker-compose.ci.yml @@ -0,0 +1,32 @@ +# This file was auto-generated, do not edit it directly. +# Instead run bin/update_build_scripts from +# https://github.com/sharelatex/sharelatex-dev-environment +# Version: 1.1.3 + +version: "2" + +services: + test_unit: + image: gcr.io/csh-gcdm-test/$PROJECT_NAME:$BRANCH_NAME-$BUILD_NUMBER + user: node + command: npm run test:unit:_run + + test_acceptance: + build: . + image: gcr.io/csh-gcdm-test/$PROJECT_NAME:$BRANCH_NAME-$BUILD_NUMBER + environment: + REDIS_HOST: redis + MONGO_HOST: mongo + POSTGRES_HOST: postgres + depends_on: + - mongo + - redis + user: node + command: npm run test:acceptance:_run + + redis: + image: redis + + mongo: + image: mongo:3.4 + diff --git a/services/real-time/docker-compose.yml b/services/real-time/docker-compose.yml new file mode 100644 index 0000000000..385872d7dd --- /dev/null +++ b/services/real-time/docker-compose.yml @@ -0,0 +1,41 @@ +# This file was auto-generated, do not edit it directly. +# Instead run bin/update_build_scripts from +# https://github.com/sharelatex/sharelatex-dev-environment +# Version: 1.1.3 + +version: "2" + +services: + + test_unit: + build: . + volumes: + - .:/app + working_dir: /app + environment: + MOCHA_GREP: ${MOCHA_GREP} + command: npm run test:unit + user: node + + test_acceptance: + build: . + volumes: + - .:/app + working_dir: /app + environment: + REDIS_HOST: redis + MONGO_HOST: mongo + POSTGRES_HOST: postgres + MOCHA_GREP: ${MOCHA_GREP} + user: node + depends_on: + - mongo + - redis + command: npm run test:acceptance + + redis: + image: redis + + mongo: + image: mongo:3.4 + diff --git a/services/real-time/nodemon.json b/services/real-time/nodemon.json new file mode 100644 index 0000000000..98db38d71b --- /dev/null +++ b/services/real-time/nodemon.json @@ -0,0 +1,19 @@ +{ + "ignore": [ + ".git", + "node_modules/" + ], + "verbose": true, + "legacyWatch": true, + "execMap": { + "js": "npm run start" + }, + + "watch": [ + "app/coffee/", + "app.coffee", + "config/" + ], + "ext": "coffee" + +} diff --git a/services/real-time/package.json b/services/real-time/package.json index fe057f7bda..30d4c81ef5 100644 --- a/services/real-time/package.json +++ b/services/real-time/package.json @@ -8,8 +8,16 @@ "url": "https://github.com/sharelatex/real-time-sharelatex.git" }, "scripts": { - "compile:app": "coffee -o app/js -c app/coffee && coffee -c app.coffee", - "start": "npm run compile:app && node app.js" + "compile:app": "([ -e app/coffee ] && coffee $COFFEE_OPTIONS -o app/js -c app/coffee || echo 'No CoffeeScript folder to compile') && ( [ -e app.coffee ] && coffee $COFFEE_OPTIONS -c app.coffee || echo 'No CoffeeScript app to compile')", + "start": "npm run compile:app && node $NODE_APP_OPTIONS app.js", + "test:acceptance:_run": "mocha --recursive --reporter spec --timeout 15000 --exit $@ test/acceptance/js", + "test:acceptance": "npm run compile:app && npm run compile:acceptance_tests && npm run test:acceptance:_run -- --grep=$MOCHA_GREP", + "test:unit:_run": "mocha --recursive --reporter spec $@ test/unit/js", + "test:unit": "npm run compile:app && npm run compile:unit_tests && npm run test:unit:_run -- --grep=$MOCHA_GREP", + "compile:unit_tests": "[ ! -e test/unit/coffee ] && echo 'No unit tests to compile' || coffee -o test/unit/js -c test/unit/coffee", + "compile:acceptance_tests": "[ ! -e test/acceptance/coffee ] && echo 'No acceptance tests to compile' || coffee -o test/acceptance/js -c test/acceptance/coffee", + "compile:all": "npm run compile:app && npm run compile:unit_tests && npm run compile:acceptance_tests", + "nodemon": "nodemon --config nodemon.json" }, "dependencies": { "async": "^0.9.0", @@ -42,6 +50,7 @@ "grunt-shell": "~0.7.0", "sandboxed-module": "~0.3.0", "sinon": "~1.5.2", + "mocha": "^4.0.1", "uid-safe": "^1.0.1", "timekeeper": "0.0.4" } diff --git a/services/real-time/test/acceptance/coffee/ApplyUpdateTests.coffee b/services/real-time/test/acceptance/coffee/ApplyUpdateTests.coffee index 0acc41cb70..2509f21108 100644 --- a/services/real-time/test/acceptance/coffee/ApplyUpdateTests.coffee +++ b/services/real-time/test/acceptance/coffee/ApplyUpdateTests.coffee @@ -8,7 +8,7 @@ FixturesManager = require "./helpers/FixturesManager" settings = require "settings-sharelatex" redis = require "redis-sharelatex" -rclient = redis.createClient(settings.redis.web) +rclient = redis.createClient(settings.redis.websessions) describe "applyOtUpdate", -> before -> diff --git a/services/real-time/test/acceptance/coffee/ReceiveUpdateTests.coffee b/services/real-time/test/acceptance/coffee/ReceiveUpdateTests.coffee index ec41598481..ec2c26ca4e 100644 --- a/services/real-time/test/acceptance/coffee/ReceiveUpdateTests.coffee +++ b/services/real-time/test/acceptance/coffee/ReceiveUpdateTests.coffee @@ -10,7 +10,7 @@ async = require "async" settings = require "settings-sharelatex" redis = require "redis-sharelatex" -rclient = redis.createClient(settings.redis.web) +rclient = redis.createClient(settings.redis.websessions) describe "receiveUpdate", -> before (done) -> diff --git a/services/real-time/test/acceptance/coffee/helpers/RealTimeClient.coffee b/services/real-time/test/acceptance/coffee/helpers/RealTimeClient.coffee index 52b869f862..21da045e83 100644 --- a/services/real-time/test/acceptance/coffee/helpers/RealTimeClient.coffee +++ b/services/real-time/test/acceptance/coffee/helpers/RealTimeClient.coffee @@ -4,7 +4,7 @@ io = require("socket.io-client") request = require "request" Settings = require "settings-sharelatex" redis = require "redis-sharelatex" -rclient = redis.createClient(Settings.redis.web) +rclient = redis.createClient(Settings.redis.websessions) uid = require('uid-safe').sync signature = require("cookie-signature") diff --git a/services/real-time/test/acceptance/coffee/helpers/RealtimeServer.coffee b/services/real-time/test/acceptance/coffee/helpers/RealtimeServer.coffee new file mode 100644 index 0000000000..12efd1ef13 --- /dev/null +++ b/services/real-time/test/acceptance/coffee/helpers/RealtimeServer.coffee @@ -0,0 +1,24 @@ +app = require('../../../../app') +require("logger-sharelatex").logger.level("info") +logger = require("logger-sharelatex") +Settings = require("settings-sharelatex") + +module.exports = + running: false + initing: false + callbacks: [] + ensureRunning: (callback = (error) ->) -> + if @running + return callback() + else if @initing + @callbacks.push callback + else + @initing = true + @callbacks.push callback + app.listen Settings.internal?.realtime?.port, "localhost", (error) => + throw error if error? + @running = true + logger.log("clsi running in dev mode") + + for callback in @callbacks + callback() \ No newline at end of file From 3a89bf0957dea12a10141da87e26a81b8984292c Mon Sep 17 00:00:00 2001 From: Henry Oswald Date: Wed, 3 Oct 2018 14:20:20 +0100 Subject: [PATCH 02/53] pass redis password through as env var --- services/real-time/config/settings.defaults.coffee | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/services/real-time/config/settings.defaults.coffee b/services/real-time/config/settings.defaults.coffee index 73e751a3b9..f8e76261a6 100644 --- a/services/real-time/config/settings.defaults.coffee +++ b/services/real-time/config/settings.defaults.coffee @@ -3,7 +3,7 @@ module.exports = realtime: host: process.env['REDIS_HOST'] or "localhostssss" port: "6379" - password: "" + password: process.env["REDIS_PASSWORD"] or "" key_schema: clientsInProject: ({project_id}) -> "clients_in_project:#{project_id}" connectedUser: ({project_id, client_id})-> "connected_user:#{project_id}:#{client_id}" @@ -11,14 +11,14 @@ module.exports = documentupdater: host: process.env['REDIS_HOST'] or "localhostssss" port: "6379" - password: "" + password: process.env["REDIS_PASSWORD"] or "" key_schema: pendingUpdates: ({doc_id}) -> "PendingUpdates:#{doc_id}" websessions: host: process.env['REDIS_HOST'] or "localhostssss" port: "6379" - password: "" + password: process.env["REDIS_PASSWORD"] or "" internal: realTime: From e322e46900c483e97b3ff3b21a6097d286f76796 Mon Sep 17 00:00:00 2001 From: Henry Oswald Date: Wed, 3 Oct 2018 14:21:02 +0100 Subject: [PATCH 03/53] update build scripts --- services/real-time/.github/ISSUE_TEMPLATE.md | 38 ++++++++++++++ .../.github/PULL_REQUEST_TEMPLATE.md | 45 ++++++++++++++++ services/real-time/Jenkinsfile | 51 ++++++++++++++++++- services/real-time/Makefile | 11 ++-- services/real-time/buildscript.txt | 9 ++++ services/real-time/docker-compose.ci.yml | 9 ++-- services/real-time/docker-compose.yml | 4 +- services/real-time/package.json | 9 ++-- 8 files changed, 162 insertions(+), 14 deletions(-) create mode 100644 services/real-time/.github/ISSUE_TEMPLATE.md create mode 100644 services/real-time/.github/PULL_REQUEST_TEMPLATE.md create mode 100644 services/real-time/buildscript.txt diff --git a/services/real-time/.github/ISSUE_TEMPLATE.md b/services/real-time/.github/ISSUE_TEMPLATE.md new file mode 100644 index 0000000000..e0093aa90c --- /dev/null +++ b/services/real-time/.github/ISSUE_TEMPLATE.md @@ -0,0 +1,38 @@ + + +## Steps to Reproduce + + + +1. +2. +3. + +## Expected Behaviour + + +## Observed Behaviour + + + +## Context + + +## Technical Info + + +* URL: +* Browser Name and version: +* Operating System and version (desktop or mobile): +* Signed in as: +* Project and/or file: + +## Analysis + + +## Who Needs to Know? + + + +- +- diff --git a/services/real-time/.github/PULL_REQUEST_TEMPLATE.md b/services/real-time/.github/PULL_REQUEST_TEMPLATE.md new file mode 100644 index 0000000000..ed25ee83c1 --- /dev/null +++ b/services/real-time/.github/PULL_REQUEST_TEMPLATE.md @@ -0,0 +1,45 @@ + + +### Description + + + +#### Screenshots + + + +#### Related Issues / PRs + + + +### Review + + + +#### Potential Impact + + + +#### Manual Testing Performed + +- [ ] +- [ ] + +#### Accessibility + + + +### Deployment + + + +#### Deployment Checklist + +- [ ] Update documentation not included in the PR (if any) +- [ ] + +#### Metrics and Monitoring + + + +#### Who Needs to Know? diff --git a/services/real-time/Jenkinsfile b/services/real-time/Jenkinsfile index bc9ba0142f..c553a7ef79 100644 --- a/services/real-time/Jenkinsfile +++ b/services/real-time/Jenkinsfile @@ -3,12 +3,33 @@ String cron_string = BRANCH_NAME == "master" ? "@daily" : "" pipeline { agent any + environment { + GIT_PROJECT = "real-time-sharelatex" + JENKINS_WORKFLOW = "real-time-sharelatex" + TARGET_URL = "${env.JENKINS_URL}blue/organizations/jenkins/${JENKINS_WORKFLOW}/detail/$BRANCH_NAME/$BUILD_NUMBER/pipeline" + GIT_API_URL = "https://api.github.com/repos/sharelatex/${GIT_PROJECT}/statuses/$GIT_COMMIT" + } + triggers { pollSCM('* * * * *') cron(cron_string) } stages { + stage('Install') { + steps { + withCredentials([usernamePassword(credentialsId: 'GITHUB_INTEGRATION', usernameVariable: 'GH_AUTH_USERNAME', passwordVariable: 'GH_AUTH_PASSWORD')]) { + sh "curl $GIT_API_URL \ + --data '{ \ + \"state\" : \"pending\", \ + \"target_url\": \"$TARGET_URL\", \ + \"description\": \"Your build is underway\", \ + \"context\": \"ci/jenkins\" }' \ + -u $GH_AUTH_USERNAME:$GH_AUTH_PASSWORD" + } + } + } + stage('Build') { steps { sh 'make build' @@ -29,7 +50,13 @@ pipeline { stage('Package and publish build') { steps { - sh 'make publish' + + withCredentials([file(credentialsId: 'gcr.io_overleaf-ops', variable: 'DOCKER_REPO_KEY_PATH')]) { + sh 'docker login -u _json_key --password-stdin https://gcr.io/overleaf-ops < ${DOCKER_REPO_KEY_PATH}' + } + sh 'DOCKER_REPO=gcr.io/overleaf-ops make publish' + sh 'docker logout https://gcr.io/overleaf-ops' + } } @@ -47,6 +74,19 @@ pipeline { post { always { sh 'DOCKER_COMPOSE_FLAGS="-f docker-compose.ci.yml" make test_clean' + sh 'make clean' + } + + success { + withCredentials([usernamePassword(credentialsId: 'GITHUB_INTEGRATION', usernameVariable: 'GH_AUTH_USERNAME', passwordVariable: 'GH_AUTH_PASSWORD')]) { + sh "curl $GIT_API_URL \ + --data '{ \ + \"state\" : \"success\", \ + \"target_url\": \"$TARGET_URL\", \ + \"description\": \"Your build succeeded!\", \ + \"context\": \"ci/jenkins\" }' \ + -u $GH_AUTH_USERNAME:$GH_AUTH_PASSWORD" + } } failure { @@ -54,6 +94,15 @@ pipeline { to: "${EMAIL_ALERT_TO}", subject: "Jenkins build failed: ${JOB_NAME}:${BUILD_NUMBER}", body: "Build: ${BUILD_URL}") + withCredentials([usernamePassword(credentialsId: 'GITHUB_INTEGRATION', usernameVariable: 'GH_AUTH_USERNAME', passwordVariable: 'GH_AUTH_PASSWORD')]) { + sh "curl $GIT_API_URL \ + --data '{ \ + \"state\" : \"failure\", \ + \"target_url\": \"$TARGET_URL\", \ + \"description\": \"Your build failed\", \ + \"context\": \"ci/jenkins\" }' \ + -u $GH_AUTH_USERNAME:$GH_AUTH_PASSWORD" + } } } diff --git a/services/real-time/Makefile b/services/real-time/Makefile index 48511326ad..7f5e935f7c 100644 --- a/services/real-time/Makefile +++ b/services/real-time/Makefile @@ -1,7 +1,7 @@ # This file was auto-generated, do not edit it directly. # Instead run bin/update_build_scripts from # https://github.com/sharelatex/sharelatex-dev-environment -# Version: 1.1.3 +# Version: 1.1.9 BUILD_NUMBER ?= local BRANCH_NAME ?= $(shell git rev-parse --abbrev-ref HEAD) @@ -15,6 +15,8 @@ DOCKER_COMPOSE := BUILD_NUMBER=$(BUILD_NUMBER) \ clean: + docker rmi ci/$(PROJECT_NAME):$(BRANCH_NAME)-$(BUILD_NUMBER) + docker rmi gcr.io/overleaf-ops/$(PROJECT_NAME):$(BRANCH_NAME)-$(BUILD_NUMBER) rm -f app.js rm -rf app/js rm -rf test/unit/js @@ -34,9 +36,12 @@ test_clean: test_acceptance_pre_run: @[ ! -f test/acceptance/scripts/pre-run ] && echo "real-time has no pre acceptance tests task" || $(DOCKER_COMPOSE) run --rm test_acceptance test/acceptance/scripts/pre-run build: - docker build --pull --tag gcr.io/csh-gcdm-test/$(PROJECT_NAME):$(BRANCH_NAME)-$(BUILD_NUMBER) . + docker build --pull --tag ci/$(PROJECT_NAME):$(BRANCH_NAME)-$(BUILD_NUMBER) \ + --tag gcr.io/overleaf-ops/$(PROJECT_NAME):$(BRANCH_NAME)-$(BUILD_NUMBER) \ + . publish: - docker push gcr.io/csh-gcdm-test/$(PROJECT_NAME):$(BRANCH_NAME)-$(BUILD_NUMBER) + + docker push $(DOCKER_REPO)/$(PROJECT_NAME):$(BRANCH_NAME)-$(BUILD_NUMBER) .PHONY: clean test test_unit test_acceptance test_clean build publish diff --git a/services/real-time/buildscript.txt b/services/real-time/buildscript.txt new file mode 100644 index 0000000000..dbdae4f5ba --- /dev/null +++ b/services/real-time/buildscript.txt @@ -0,0 +1,9 @@ +--script-version=1.1.9 +real-time +--node-version=6.9.5 +--acceptance-creds=None +--language=coffeescript +--dependencies=mongo,redis +--docker-repos=gcr.io/overleaf-ops +--kube=false +--build-target=docker diff --git a/services/real-time/docker-compose.ci.yml b/services/real-time/docker-compose.ci.yml index 21c006641e..17c4ddd2bf 100644 --- a/services/real-time/docker-compose.ci.yml +++ b/services/real-time/docker-compose.ci.yml @@ -1,23 +1,25 @@ # This file was auto-generated, do not edit it directly. # Instead run bin/update_build_scripts from # https://github.com/sharelatex/sharelatex-dev-environment -# Version: 1.1.3 +# Version: 1.1.9 version: "2" services: test_unit: - image: gcr.io/csh-gcdm-test/$PROJECT_NAME:$BRANCH_NAME-$BUILD_NUMBER + image: ci/$PROJECT_NAME:$BRANCH_NAME-$BUILD_NUMBER user: node command: npm run test:unit:_run test_acceptance: build: . - image: gcr.io/csh-gcdm-test/$PROJECT_NAME:$BRANCH_NAME-$BUILD_NUMBER + image: ci/$PROJECT_NAME:$BRANCH_NAME-$BUILD_NUMBER environment: + ELASTIC_SEARCH_DSN: es:9200 REDIS_HOST: redis MONGO_HOST: mongo POSTGRES_HOST: postgres + MOCHA_GREP: ${MOCHA_GREP} depends_on: - mongo - redis @@ -29,4 +31,3 @@ services: mongo: image: mongo:3.4 - diff --git a/services/real-time/docker-compose.yml b/services/real-time/docker-compose.yml index 385872d7dd..dcbc14e683 100644 --- a/services/real-time/docker-compose.yml +++ b/services/real-time/docker-compose.yml @@ -1,12 +1,11 @@ # This file was auto-generated, do not edit it directly. # Instead run bin/update_build_scripts from # https://github.com/sharelatex/sharelatex-dev-environment -# Version: 1.1.3 +# Version: 1.1.9 version: "2" services: - test_unit: build: . volumes: @@ -23,6 +22,7 @@ services: - .:/app working_dir: /app environment: + ELASTIC_SEARCH_DSN: es:9200 REDIS_HOST: redis MONGO_HOST: mongo POSTGRES_HOST: postgres diff --git a/services/real-time/package.json b/services/real-time/package.json index 30d4c81ef5..6e4f378c32 100644 --- a/services/real-time/package.json +++ b/services/real-time/package.json @@ -10,14 +10,15 @@ "scripts": { "compile:app": "([ -e app/coffee ] && coffee $COFFEE_OPTIONS -o app/js -c app/coffee || echo 'No CoffeeScript folder to compile') && ( [ -e app.coffee ] && coffee $COFFEE_OPTIONS -c app.coffee || echo 'No CoffeeScript app to compile')", "start": "npm run compile:app && node $NODE_APP_OPTIONS app.js", - "test:acceptance:_run": "mocha --recursive --reporter spec --timeout 15000 --exit $@ test/acceptance/js", + "test:acceptance:_run": "mocha --recursive --reporter spec --timeout 30000 --exit $@ test/acceptance/js", "test:acceptance": "npm run compile:app && npm run compile:acceptance_tests && npm run test:acceptance:_run -- --grep=$MOCHA_GREP", - "test:unit:_run": "mocha --recursive --reporter spec $@ test/unit/js", + "test:unit:_run": "mocha --recursive --reporter spec --exit $@ test/unit/js", "test:unit": "npm run compile:app && npm run compile:unit_tests && npm run test:unit:_run -- --grep=$MOCHA_GREP", "compile:unit_tests": "[ ! -e test/unit/coffee ] && echo 'No unit tests to compile' || coffee -o test/unit/js -c test/unit/coffee", "compile:acceptance_tests": "[ ! -e test/acceptance/coffee ] && echo 'No acceptance tests to compile' || coffee -o test/acceptance/js -c test/acceptance/coffee", - "compile:all": "npm run compile:app && npm run compile:unit_tests && npm run compile:acceptance_tests", - "nodemon": "nodemon --config nodemon.json" + "compile:all": "npm run compile:app && npm run compile:unit_tests && npm run compile:acceptance_tests && npm run compile:smoke_tests", + "nodemon": "nodemon --config nodemon.json", + "compile:smoke_tests": "[ ! -e test/smoke/coffee ] && echo 'No smoke tests to compile' || coffee -o test/smoke/js -c test/smoke/coffee" }, "dependencies": { "async": "^0.9.0", From ff8afb6c24af3fcbe4835de78eaf651b71325da7 Mon Sep 17 00:00:00 2001 From: Henry Oswald Date: Wed, 3 Oct 2018 15:01:31 +0100 Subject: [PATCH 04/53] pass redis port --- services/real-time/app.coffee | 2 -- services/real-time/config/settings.defaults.coffee | 6 +++--- 2 files changed, 3 insertions(+), 5 deletions(-) diff --git a/services/real-time/app.coffee b/services/real-time/app.coffee index 91e427f3aa..824cdce5db 100644 --- a/services/real-time/app.coffee +++ b/services/real-time/app.coffee @@ -8,8 +8,6 @@ Settings = require "settings-sharelatex" if Settings.sentry?.dsn? logger.initializeErrorReporting(Settings.sentry.dsn) -console.log "dasdsadasdsadsadsadsad" -console.log Settings.redis.websessions sessionRedisClient = redis.createClient(Settings.redis.websessions) RedisStore = require('connect-redis')(session) diff --git a/services/real-time/config/settings.defaults.coffee b/services/real-time/config/settings.defaults.coffee index f8e76261a6..152a6f058b 100644 --- a/services/real-time/config/settings.defaults.coffee +++ b/services/real-time/config/settings.defaults.coffee @@ -2,7 +2,7 @@ module.exports = redis: realtime: host: process.env['REDIS_HOST'] or "localhostssss" - port: "6379" + port: process.env['REDIS_PORT'] or "6379" password: process.env["REDIS_PASSWORD"] or "" key_schema: clientsInProject: ({project_id}) -> "clients_in_project:#{project_id}" @@ -10,14 +10,14 @@ module.exports = documentupdater: host: process.env['REDIS_HOST'] or "localhostssss" - port: "6379" + port: process.env['REDIS_PORT'] or "6379" password: process.env["REDIS_PASSWORD"] or "" key_schema: pendingUpdates: ({doc_id}) -> "PendingUpdates:#{doc_id}" websessions: host: process.env['REDIS_HOST'] or "localhostssss" - port: "6379" + port: process.env['REDIS_PORT'] or "6379" password: process.env["REDIS_PASSWORD"] or "" internal: From 63d7bb501bbd34a7459ba7662fa5c75325e72569 Mon Sep 17 00:00:00 2001 From: Henry Oswald Date: Fri, 19 Oct 2018 16:44:40 +0100 Subject: [PATCH 05/53] return a 200 for root path for google health check --- services/real-time/app.coffee | 3 +++ 1 file changed, 3 insertions(+) diff --git a/services/real-time/app.coffee b/services/real-time/app.coffee index 824cdce5db..cde0c4af74 100644 --- a/services/real-time/app.coffee +++ b/services/real-time/app.coffee @@ -43,6 +43,9 @@ io.configure -> io.set('transports', ['websocket', 'flashsocket', 'htmlfile', 'xhr-polling', 'jsonp-polling']) io.set('log level', 1) +app.get "/", (req, res, next) -> + res.send "real-time-sharelatex is alive" + app.get "/status", (req, res, next) -> res.send "real-time-sharelatex is alive" From 477c446ea899e41b131057f092f1ac7973f231b2 Mon Sep 17 00:00:00 2001 From: Henry Oswald Date: Fri, 19 Oct 2018 19:28:05 +0100 Subject: [PATCH 06/53] add web-api host as ana option --- services/real-time/config/settings.defaults.coffee | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/services/real-time/config/settings.defaults.coffee b/services/real-time/config/settings.defaults.coffee index 152a6f058b..d052bc4e55 100644 --- a/services/real-time/config/settings.defaults.coffee +++ b/services/real-time/config/settings.defaults.coffee @@ -1,7 +1,7 @@ module.exports = redis: realtime: - host: process.env['REDIS_HOST'] or "localhostssss" + host: process.env['REDIS_HOST'] or "localhost" port: process.env['REDIS_PORT'] or "6379" password: process.env["REDIS_PASSWORD"] or "" key_schema: @@ -9,14 +9,14 @@ module.exports = connectedUser: ({project_id, client_id})-> "connected_user:#{project_id}:#{client_id}" documentupdater: - host: process.env['REDIS_HOST'] or "localhostssss" + host: process.env['REDIS_HOST'] or "localhost" port: process.env['REDIS_PORT'] or "6379" password: process.env["REDIS_PASSWORD"] or "" key_schema: pendingUpdates: ({doc_id}) -> "PendingUpdates:#{doc_id}" websessions: - host: process.env['REDIS_HOST'] or "localhostssss" + host: process.env['REDIS_HOST'] or "localhost" port: process.env['REDIS_PORT'] or "6379" password: process.env["REDIS_PASSWORD"] or "" @@ -29,7 +29,7 @@ module.exports = apis: web: - url: "http://#{process.env['WEB_HOST'] or "localhost"}:3000" + url: "http://#{process.env['WEB_API_HOST'] or process.env['WEB_HOST'] or "localhost"}:3000" user: "sharelatex" pass: "password" documentupdater: From bbc11ae1b54a10447f491af46c8fc73848cfc384 Mon Sep 17 00:00:00 2001 From: Henry Oswald Date: Fri, 19 Oct 2018 19:42:33 +0100 Subject: [PATCH 07/53] add DOCUMENT_UPDATER_HOST as option --- services/real-time/config/settings.defaults.coffee | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/services/real-time/config/settings.defaults.coffee b/services/real-time/config/settings.defaults.coffee index d052bc4e55..8d087c4a14 100644 --- a/services/real-time/config/settings.defaults.coffee +++ b/services/real-time/config/settings.defaults.coffee @@ -33,7 +33,7 @@ module.exports = user: "sharelatex" pass: "password" documentupdater: - url: "http://#{process.env['DOCUPDATER_HOST'] or "localhost"}:3003" + url: "http://#{process.env['DOCUMENT_UPDATER_HOST'] or process.env['DOCUPDATER_HOST'] or "localhost"}:3003" security: sessionSecret: "secret-please-change" From ca2af0af32a0ad35d45b9406f1b7089fb936471d Mon Sep 17 00:00:00 2001 From: Henry Oswald Date: Mon, 3 Dec 2018 14:05:03 +0000 Subject: [PATCH 08/53] make cookies configurable via env vars --- services/real-time/config/settings.defaults.coffee | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/services/real-time/config/settings.defaults.coffee b/services/real-time/config/settings.defaults.coffee index 8d087c4a14..485789cb12 100644 --- a/services/real-time/config/settings.defaults.coffee +++ b/services/real-time/config/settings.defaults.coffee @@ -36,8 +36,8 @@ module.exports = url: "http://#{process.env['DOCUMENT_UPDATER_HOST'] or process.env['DOCUPDATER_HOST'] or "localhost"}:3003" security: - sessionSecret: "secret-please-change" + sessionSecret: process.env['SESSION_SECRET'] or "secret-please-change" - cookieName: "sharelatex.sid" + cookieName: process.env['COOKIE_NAME'] or "sharelatex.sid" max_doc_length: 2 * 1024 * 1024 # 2mb \ No newline at end of file From 57cd7c734ac191179d74332b1726d74220266207 Mon Sep 17 00:00:00 2001 From: Henry Oswald Date: Mon, 3 Dec 2018 14:34:46 +0000 Subject: [PATCH 09/53] add debugging --- services/real-time/app.coffee | 2 ++ 1 file changed, 2 insertions(+) diff --git a/services/real-time/app.coffee b/services/real-time/app.coffee index cde0c4af74..b66375addb 100644 --- a/services/real-time/app.coffee +++ b/services/real-time/app.coffee @@ -27,6 +27,8 @@ io = require('socket.io').listen(server) # Bind to sessions sessionStore = new RedisStore(client: sessionRedisClient) cookieParser = CookieParser(Settings.security.sessionSecret) +console.log(Settings.security.sessionSecret, Settings.cookieName) +console.log(Settings) sessionSockets = new SessionSockets(io, sessionStore, cookieParser, Settings.cookieName) io.configure -> From 034e627a8a90203ae6fd498364a47d132d1030ba Mon Sep 17 00:00:00 2001 From: Henry Oswald Date: Tue, 4 Dec 2018 13:14:50 +0000 Subject: [PATCH 10/53] bump metrics and shrinkwrap --- services/real-time/Gruntfile.coffee | 75 - services/real-time/npm-shrinkwrap.json | 1951 ++++++++++++++++++++++++ services/real-time/package.json | 10 +- 3 files changed, 1952 insertions(+), 84 deletions(-) delete mode 100644 services/real-time/Gruntfile.coffee create mode 100644 services/real-time/npm-shrinkwrap.json diff --git a/services/real-time/Gruntfile.coffee b/services/real-time/Gruntfile.coffee deleted file mode 100644 index 28cc4233b0..0000000000 --- a/services/real-time/Gruntfile.coffee +++ /dev/null @@ -1,75 +0,0 @@ -module.exports = (grunt) -> - grunt.initConfig - forever: - app: - options: - index: "app.js" - coffee: - app_src: - expand: true, - flatten: true, - cwd: "app" - src: ['coffee/*.coffee'], - dest: 'app/js/', - ext: '.js' - - app: - src: "app.coffee" - dest: "app.js" - - unit_tests: - expand: true - cwd: "test/unit/coffee" - src: ["**/*.coffee"] - dest: "test/unit/js/" - ext: ".js" - - acceptance_tests: - expand: true - cwd: "test/acceptance/coffee" - src: ["**/*.coffee"] - dest: "test/acceptance/js/" - ext: ".js" - clean: - app: ["app/js/"] - unit_tests: ["test/unit/js"] - acceptance_tests: ["test/acceptance/js"] - smoke_tests: ["test/smoke/js"] - - execute: - app: - src: "app.js" - - mochaTest: - unit: - options: - reporter: grunt.option('reporter') or 'spec' - grep: grunt.option("grep") - src: ["test/unit/js/**/*.js"] - acceptance: - options: - reporter: grunt.option('reporter') or 'spec' - timeout: 40000 - grep: grunt.option("grep") - src: ["test/acceptance/js/**/*.js"] - - grunt.loadNpmTasks 'grunt-contrib-coffee' - grunt.loadNpmTasks 'grunt-contrib-clean' - grunt.loadNpmTasks 'grunt-mocha-test' - grunt.loadNpmTasks 'grunt-shell' - grunt.loadNpmTasks 'grunt-execute' - grunt.loadNpmTasks 'grunt-bunyan' - grunt.loadNpmTasks 'grunt-forever' - - grunt.registerTask 'compile:app', ['clean:app', 'coffee:app', 'coffee:app_src'] - grunt.registerTask 'run', ['compile:app', 'bunyan', 'execute'] - - grunt.registerTask 'compile:unit_tests', ['clean:unit_tests', 'coffee:unit_tests'] - grunt.registerTask 'test:unit', ['compile:app', 'compile:unit_tests', 'mochaTest:unit'] - - grunt.registerTask 'compile:acceptance_tests', ['clean:acceptance_tests', 'coffee:acceptance_tests'] - grunt.registerTask 'test:acceptance', ['compile:acceptance_tests', 'mochaTest:acceptance'] - - grunt.registerTask 'install', 'compile:app' - - grunt.registerTask 'default', ['run'] \ No newline at end of file diff --git a/services/real-time/npm-shrinkwrap.json b/services/real-time/npm-shrinkwrap.json new file mode 100644 index 0000000000..1da4679f14 --- /dev/null +++ b/services/real-time/npm-shrinkwrap.json @@ -0,0 +1,1951 @@ +{ + "name": "real-time-sharelatex", + "version": "0.1.4", + "dependencies": { + "@google-cloud/common": { + "version": "0.23.0", + "from": "@google-cloud/common@>=0.23.0 <0.24.0", + "resolved": "https://registry.npmjs.org/@google-cloud/common/-/common-0.23.0.tgz" + }, + "@google-cloud/debug-agent": { + "version": "3.0.0", + "from": "@google-cloud/debug-agent@>=3.0.0 <4.0.0", + "resolved": "https://registry.npmjs.org/@google-cloud/debug-agent/-/debug-agent-3.0.0.tgz", + "dependencies": { + "coffeescript": { + "version": "2.3.2", + "from": "coffeescript@>=2.0.0 <3.0.0", + "resolved": "https://registry.npmjs.org/coffeescript/-/coffeescript-2.3.2.tgz" + }, + "lodash": { + "version": "4.17.11", + "from": "lodash@>=4.12.0 <5.0.0", + "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.11.tgz" + } + } + }, + "@google-cloud/projectify": { + "version": "0.3.2", + "from": "@google-cloud/projectify@>=0.3.0 <0.4.0", + "resolved": "https://registry.npmjs.org/@google-cloud/projectify/-/projectify-0.3.2.tgz" + }, + "@google-cloud/promisify": { + "version": "0.3.1", + "from": "@google-cloud/promisify@>=0.3.0 <0.4.0", + "resolved": "https://registry.npmjs.org/@google-cloud/promisify/-/promisify-0.3.1.tgz" + }, + "@google-cloud/trace-agent": { + "version": "3.4.0", + "from": "@google-cloud/trace-agent@>=3.2.0 <4.0.0", + "resolved": "https://registry.npmjs.org/@google-cloud/trace-agent/-/trace-agent-3.4.0.tgz", + "dependencies": { + "@google-cloud/common": { + "version": "0.27.0", + "from": "@google-cloud/common@>=0.27.0 <0.28.0", + "resolved": "https://registry.npmjs.org/@google-cloud/common/-/common-0.27.0.tgz" + }, + "gcp-metadata": { + "version": "0.9.0", + "from": "gcp-metadata@>=0.9.0 <0.10.0", + "resolved": "https://registry.npmjs.org/gcp-metadata/-/gcp-metadata-0.9.0.tgz" + }, + "google-auth-library": { + "version": "2.0.1", + "from": "google-auth-library@>=2.0.0 <3.0.0", + "resolved": "https://registry.npmjs.org/google-auth-library/-/google-auth-library-2.0.1.tgz", + "dependencies": { + "gcp-metadata": { + "version": "0.7.0", + "from": "gcp-metadata@^0.7.0", + "resolved": "https://registry.npmjs.org/gcp-metadata/-/gcp-metadata-0.7.0.tgz" + } + } + }, + "lru-cache": { + "version": "4.1.5", + "from": "lru-cache@^4.1.3", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-4.1.5.tgz" + }, + "uuid": { + "version": "3.3.2", + "from": "uuid@^3.0.1", + "resolved": "https://registry.npmjs.org/uuid/-/uuid-3.3.2.tgz" + } + } + }, + "@sinonjs/formatio": { + "version": "2.0.0", + "from": "@sinonjs/formatio@>=2.0.0 <3.0.0", + "resolved": "https://registry.npmjs.org/@sinonjs/formatio/-/formatio-2.0.0.tgz" + }, + "@types/caseless": { + "version": "0.12.1", + "from": "@types/caseless@*", + "resolved": "https://registry.npmjs.org/@types/caseless/-/caseless-0.12.1.tgz" + }, + "@types/duplexify": { + "version": "3.6.0", + "from": "@types/duplexify@>=3.5.0 <4.0.0", + "resolved": "https://registry.npmjs.org/@types/duplexify/-/duplexify-3.6.0.tgz" + }, + "@types/form-data": { + "version": "2.2.1", + "from": "@types/form-data@*", + "resolved": "https://registry.npmjs.org/@types/form-data/-/form-data-2.2.1.tgz" + }, + "@types/node": { + "version": "10.12.12", + "from": "@types/node@*", + "resolved": "https://registry.npmjs.org/@types/node/-/node-10.12.12.tgz" + }, + "@types/request": { + "version": "2.48.1", + "from": "@types/request@>=2.47.0 <3.0.0", + "resolved": "https://registry.npmjs.org/@types/request/-/request-2.48.1.tgz" + }, + "@types/tough-cookie": { + "version": "2.3.4", + "from": "@types/tough-cookie@*", + "resolved": "https://registry.npmjs.org/@types/tough-cookie/-/tough-cookie-2.3.4.tgz" + }, + "abbrev": { + "version": "1.1.1", + "from": "abbrev@>=1.0.0 <2.0.0", + "resolved": "https://registry.npmjs.org/abbrev/-/abbrev-1.1.1.tgz" + }, + "accepts": { + "version": "1.3.5", + "from": "accepts@>=1.3.5 <1.4.0", + "resolved": "https://registry.npmjs.org/accepts/-/accepts-1.3.5.tgz" + }, + "acorn": { + "version": "5.7.3", + "from": "acorn@>=5.0.3 <6.0.0", + "resolved": "https://registry.npmjs.org/acorn/-/acorn-5.7.3.tgz" + }, + "active-x-obfuscator": { + "version": "0.0.1", + "from": "active-x-obfuscator@0.0.1", + "resolved": "https://registry.npmjs.org/active-x-obfuscator/-/active-x-obfuscator-0.0.1.tgz" + }, + "agent-base": { + "version": "4.2.1", + "from": "agent-base@>=4.1.0 <5.0.0", + "resolved": "https://registry.npmjs.org/agent-base/-/agent-base-4.2.1.tgz" + }, + "ansi-regex": { + "version": "0.2.1", + "from": "ansi-regex@>=0.2.0 <0.3.0", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-0.2.1.tgz" + }, + "ansi-styles": { + "version": "1.1.0", + "from": "ansi-styles@>=1.1.0 <2.0.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-1.1.0.tgz" + }, + "argparse": { + "version": "0.1.16", + "from": "argparse@>=0.1.11 <0.2.0", + "resolved": "https://registry.npmjs.org/argparse/-/argparse-0.1.16.tgz", + "dependencies": { + "underscore.string": { + "version": "2.4.0", + "from": "underscore.string@>=2.4.0 <2.5.0", + "resolved": "https://registry.npmjs.org/underscore.string/-/underscore.string-2.4.0.tgz" + } + } + }, + "array-flatten": { + "version": "1.1.1", + "from": "array-flatten@1.1.1", + "resolved": "https://registry.npmjs.org/array-flatten/-/array-flatten-1.1.1.tgz" + }, + "arrify": { + "version": "1.0.1", + "from": "arrify@>=1.0.1 <2.0.0", + "resolved": "https://registry.npmjs.org/arrify/-/arrify-1.0.1.tgz" + }, + "asn1": { + "version": "0.1.11", + "from": "asn1@0.1.11", + "resolved": "https://registry.npmjs.org/asn1/-/asn1-0.1.11.tgz", + "optional": true + }, + "assert-plus": { + "version": "0.1.5", + "from": "assert-plus@>=0.1.5 <0.2.0", + "resolved": "https://registry.npmjs.org/assert-plus/-/assert-plus-0.1.5.tgz", + "optional": true + }, + "async": { + "version": "0.9.2", + "from": "async@>=0.9.0 <0.10.0", + "resolved": "https://registry.npmjs.org/async/-/async-0.9.2.tgz" + }, + "async-listener": { + "version": "0.6.10", + "from": "async-listener@>=0.6.0 <0.7.0", + "resolved": "https://registry.npmjs.org/async-listener/-/async-listener-0.6.10.tgz" + }, + "aws-sign2": { + "version": "0.5.0", + "from": "aws-sign2@>=0.5.0 <0.6.0", + "resolved": "https://registry.npmjs.org/aws-sign2/-/aws-sign2-0.5.0.tgz", + "optional": true + }, + "axios": { + "version": "0.18.0", + "from": "axios@>=0.18.0 <0.19.0", + "resolved": "http://registry.npmjs.org/axios/-/axios-0.18.0.tgz" + }, + "balanced-match": { + "version": "1.0.0", + "from": "balanced-match@^1.0.0", + "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.0.tgz" + }, + "base64id": { + "version": "0.1.0", + "from": "base64id@0.1.0", + "resolved": "https://registry.npmjs.org/base64id/-/base64id-0.1.0.tgz" + }, + "basic-auth-connect": { + "version": "1.0.0", + "from": "basic-auth-connect@>=1.0.0 <2.0.0", + "resolved": "https://registry.npmjs.org/basic-auth-connect/-/basic-auth-connect-1.0.0.tgz" + }, + "bignumber.js": { + "version": "7.2.1", + "from": "bignumber.js@>=7.0.0 <8.0.0", + "resolved": "https://registry.npmjs.org/bignumber.js/-/bignumber.js-7.2.1.tgz" + }, + "bintrees": { + "version": "1.0.1", + "from": "bintrees@1.0.1", + "resolved": "https://registry.npmjs.org/bintrees/-/bintrees-1.0.1.tgz" + }, + "bluebird": { + "version": "3.5.1", + "from": "bluebird@>=3.3.4 <4.0.0", + "resolved": "https://registry.npmjs.org/bluebird/-/bluebird-3.5.1.tgz" + }, + "body-parser": { + "version": "1.18.3", + "from": "body-parser@>=1.12.0 <2.0.0", + "resolved": "https://registry.npmjs.org/body-parser/-/body-parser-1.18.3.tgz" + }, + "boom": { + "version": "0.4.2", + "from": "boom@>=0.4.0 <0.5.0", + "resolved": "https://registry.npmjs.org/boom/-/boom-0.4.2.tgz" + }, + "brace-expansion": { + "version": "1.1.11", + "from": "brace-expansion@^1.1.7", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz" + }, + "buffer-equal-constant-time": { + "version": "1.0.1", + "from": "buffer-equal-constant-time@1.0.1", + "resolved": "https://registry.npmjs.org/buffer-equal-constant-time/-/buffer-equal-constant-time-1.0.1.tgz" + }, + "builtin-modules": { + "version": "3.0.0", + "from": "builtin-modules@>=3.0.0 <4.0.0", + "resolved": "https://registry.npmjs.org/builtin-modules/-/builtin-modules-3.0.0.tgz" + }, + "bytes": { + "version": "3.0.0", + "from": "bytes@3.0.0", + "resolved": "https://registry.npmjs.org/bytes/-/bytes-3.0.0.tgz" + }, + "chalk": { + "version": "0.5.1", + "from": "chalk@>=0.5.0 <0.6.0", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-0.5.1.tgz" + }, + "check-error": { + "version": "1.0.2", + "from": "check-error@>=1.0.1 <2.0.0", + "resolved": "https://registry.npmjs.org/check-error/-/check-error-1.0.2.tgz" + }, + "cluster-key-slot": { + "version": "1.0.9", + "from": "cluster-key-slot@>=1.0.6 <2.0.0", + "resolved": "https://registry.npmjs.org/cluster-key-slot/-/cluster-key-slot-1.0.9.tgz" + }, + "coffee-script": { + "version": "1.12.4", + "from": "coffee-script@1.12.4", + "resolved": "https://registry.npmjs.org/coffee-script/-/coffee-script-1.12.4.tgz" + }, + "colors": { + "version": "0.6.2", + "from": "colors@>=0.6.2 <0.7.0", + "resolved": "https://registry.npmjs.org/colors/-/colors-0.6.2.tgz" + }, + "combined-stream": { + "version": "0.0.7", + "from": "combined-stream@>=0.0.4 <0.1.0", + "resolved": "https://registry.npmjs.org/combined-stream/-/combined-stream-0.0.7.tgz", + "optional": true + }, + "commander": { + "version": "2.0.0", + "from": "commander@2.0.0", + "resolved": "http://registry.npmjs.org/commander/-/commander-2.0.0.tgz" + }, + "concat-map": { + "version": "0.0.1", + "from": "concat-map@0.0.1", + "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz" + }, + "connect-redis": { + "version": "2.5.1", + "from": "connect-redis@>=2.1.0 <3.0.0", + "resolved": "https://registry.npmjs.org/connect-redis/-/connect-redis-2.5.1.tgz", + "dependencies": { + "debug": { + "version": "1.0.5", + "from": "debug@>=1.0.4 <2.0.0", + "resolved": "https://registry.npmjs.org/debug/-/debug-1.0.5.tgz" + } + } + }, + "console-log-level": { + "version": "1.4.0", + "from": "console-log-level@>=1.4.0 <2.0.0", + "resolved": "https://registry.npmjs.org/console-log-level/-/console-log-level-1.4.0.tgz" + }, + "content-disposition": { + "version": "0.5.2", + "from": "content-disposition@0.5.2", + "resolved": "https://registry.npmjs.org/content-disposition/-/content-disposition-0.5.2.tgz" + }, + "content-type": { + "version": "1.0.4", + "from": "content-type@>=1.0.4 <1.1.0", + "resolved": "https://registry.npmjs.org/content-type/-/content-type-1.0.4.tgz" + }, + "continuation-local-storage": { + "version": "3.2.1", + "from": "continuation-local-storage@>=3.2.1 <4.0.0", + "resolved": "https://registry.npmjs.org/continuation-local-storage/-/continuation-local-storage-3.2.1.tgz" + }, + "cookie": { + "version": "0.3.1", + "from": "cookie@0.3.1", + "resolved": "https://registry.npmjs.org/cookie/-/cookie-0.3.1.tgz" + }, + "cookie-parser": { + "version": "1.4.3", + "from": "cookie-parser@>=1.3.3 <2.0.0", + "resolved": "https://registry.npmjs.org/cookie-parser/-/cookie-parser-1.4.3.tgz" + }, + "cookie-signature": { + "version": "1.0.6", + "from": "cookie-signature@1.0.6", + "resolved": "https://registry.npmjs.org/cookie-signature/-/cookie-signature-1.0.6.tgz" + }, + "core-util-is": { + "version": "1.0.2", + "from": "core-util-is@>=1.0.0 <1.1.0", + "resolved": "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.2.tgz" + }, + "crc": { + "version": "3.4.4", + "from": "crc@3.4.4", + "resolved": "https://registry.npmjs.org/crc/-/crc-3.4.4.tgz" + }, + "cryptiles": { + "version": "0.2.2", + "from": "cryptiles@>=0.2.0 <0.3.0", + "resolved": "https://registry.npmjs.org/cryptiles/-/cryptiles-0.2.2.tgz", + "optional": true + }, + "ctype": { + "version": "0.5.3", + "from": "ctype@0.5.3", + "resolved": "https://registry.npmjs.org/ctype/-/ctype-0.5.3.tgz", + "optional": true + }, + "dateformat": { + "version": "1.0.2-1.2.3", + "from": "dateformat@1.0.2-1.2.3", + "resolved": "https://registry.npmjs.org/dateformat/-/dateformat-1.0.2-1.2.3.tgz" + }, + "debug": { + "version": "2.6.9", + "from": "debug@2.6.9", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz" + }, + "define-properties": { + "version": "1.1.3", + "from": "define-properties@>=1.1.2 <2.0.0", + "resolved": "https://registry.npmjs.org/define-properties/-/define-properties-1.1.3.tgz" + }, + "delayed-stream": { + "version": "0.0.5", + "from": "delayed-stream@0.0.5", + "resolved": "https://registry.npmjs.org/delayed-stream/-/delayed-stream-0.0.5.tgz", + "optional": true + }, + "denque": { + "version": "1.2.3", + "from": "denque@>=1.1.0 <2.0.0", + "resolved": "https://registry.npmjs.org/denque/-/denque-1.2.3.tgz" + }, + "depd": { + "version": "1.1.2", + "from": "depd@>=1.1.2 <1.2.0", + "resolved": "https://registry.npmjs.org/depd/-/depd-1.1.2.tgz" + }, + "destroy": { + "version": "1.0.4", + "from": "destroy@>=1.0.4 <1.1.0", + "resolved": "https://registry.npmjs.org/destroy/-/destroy-1.0.4.tgz" + }, + "diff": { + "version": "1.0.7", + "from": "diff@1.0.7", + "resolved": "https://registry.npmjs.org/diff/-/diff-1.0.7.tgz" + }, + "duplexify": { + "version": "3.6.1", + "from": "duplexify@>=3.6.0 <4.0.0", + "resolved": "https://registry.npmjs.org/duplexify/-/duplexify-3.6.1.tgz" + }, + "ecdsa-sig-formatter": { + "version": "1.0.10", + "from": "ecdsa-sig-formatter@1.0.10", + "resolved": "https://registry.npmjs.org/ecdsa-sig-formatter/-/ecdsa-sig-formatter-1.0.10.tgz" + }, + "ee-first": { + "version": "1.1.1", + "from": "ee-first@1.1.1", + "resolved": "https://registry.npmjs.org/ee-first/-/ee-first-1.1.1.tgz" + }, + "emitter-listener": { + "version": "1.1.2", + "from": "emitter-listener@>=1.1.1 <2.0.0", + "resolved": "https://registry.npmjs.org/emitter-listener/-/emitter-listener-1.1.2.tgz" + }, + "encodeurl": { + "version": "1.0.2", + "from": "encodeurl@>=1.0.2 <1.1.0", + "resolved": "https://registry.npmjs.org/encodeurl/-/encodeurl-1.0.2.tgz" + }, + "end-of-stream": { + "version": "1.4.1", + "from": "end-of-stream@>=1.0.0 <2.0.0", + "resolved": "https://registry.npmjs.org/end-of-stream/-/end-of-stream-1.4.1.tgz" + }, + "ent": { + "version": "2.2.0", + "from": "ent@>=2.2.0 <3.0.0", + "resolved": "https://registry.npmjs.org/ent/-/ent-2.2.0.tgz" + }, + "es-abstract": { + "version": "1.12.0", + "from": "es-abstract@>=1.5.1 <2.0.0", + "resolved": "https://registry.npmjs.org/es-abstract/-/es-abstract-1.12.0.tgz" + }, + "es-to-primitive": { + "version": "1.2.0", + "from": "es-to-primitive@>=1.1.1 <2.0.0", + "resolved": "https://registry.npmjs.org/es-to-primitive/-/es-to-primitive-1.2.0.tgz" + }, + "es6-promise": { + "version": "4.2.5", + "from": "es6-promise@>=4.0.3 <5.0.0", + "resolved": "https://registry.npmjs.org/es6-promise/-/es6-promise-4.2.5.tgz" + }, + "es6-promisify": { + "version": "5.0.0", + "from": "es6-promisify@>=5.0.0 <6.0.0", + "resolved": "https://registry.npmjs.org/es6-promisify/-/es6-promisify-5.0.0.tgz" + }, + "escape-html": { + "version": "1.0.3", + "from": "escape-html@>=1.0.3 <1.1.0", + "resolved": "https://registry.npmjs.org/escape-html/-/escape-html-1.0.3.tgz" + }, + "escape-string-regexp": { + "version": "1.0.5", + "from": "escape-string-regexp@>=1.0.0 <2.0.0", + "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz" + }, + "esprima": { + "version": "1.0.4", + "from": "esprima@>=1.0.2 <1.1.0", + "resolved": "https://registry.npmjs.org/esprima/-/esprima-1.0.4.tgz" + }, + "etag": { + "version": "1.8.1", + "from": "etag@>=1.8.1 <1.9.0", + "resolved": "https://registry.npmjs.org/etag/-/etag-1.8.1.tgz" + }, + "eventemitter2": { + "version": "0.4.14", + "from": "eventemitter2@>=0.4.13 <0.5.0", + "resolved": "https://registry.npmjs.org/eventemitter2/-/eventemitter2-0.4.14.tgz" + }, + "exit": { + "version": "0.1.2", + "from": "exit@>=0.1.1 <0.2.0", + "resolved": "https://registry.npmjs.org/exit/-/exit-0.1.2.tgz" + }, + "express": { + "version": "4.16.3", + "from": "express@>=4.10.1 <5.0.0", + "resolved": "https://registry.npmjs.org/express/-/express-4.16.3.tgz", + "dependencies": { + "body-parser": { + "version": "1.18.2", + "from": "body-parser@1.18.2", + "resolved": "https://registry.npmjs.org/body-parser/-/body-parser-1.18.2.tgz" + }, + "iconv-lite": { + "version": "0.4.19", + "from": "iconv-lite@0.4.19", + "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.4.19.tgz" + }, + "qs": { + "version": "6.5.1", + "from": "qs@6.5.1", + "resolved": "https://registry.npmjs.org/qs/-/qs-6.5.1.tgz" + }, + "raw-body": { + "version": "2.3.2", + "from": "raw-body@2.3.2", + "resolved": "https://registry.npmjs.org/raw-body/-/raw-body-2.3.2.tgz", + "dependencies": { + "depd": { + "version": "1.1.1", + "from": "depd@1.1.1", + "resolved": "https://registry.npmjs.org/depd/-/depd-1.1.1.tgz" + }, + "http-errors": { + "version": "1.6.2", + "from": "http-errors@1.6.2", + "resolved": "https://registry.npmjs.org/http-errors/-/http-errors-1.6.2.tgz" + }, + "setprototypeof": { + "version": "1.0.3", + "from": "setprototypeof@1.0.3", + "resolved": "https://registry.npmjs.org/setprototypeof/-/setprototypeof-1.0.3.tgz" + } + } + }, + "statuses": { + "version": "1.4.0", + "from": "statuses@>=1.4.0 <1.5.0", + "resolved": "https://registry.npmjs.org/statuses/-/statuses-1.4.0.tgz" + } + } + }, + "express-session": { + "version": "1.15.6", + "from": "express-session@>=1.9.1 <2.0.0", + "resolved": "https://registry.npmjs.org/express-session/-/express-session-1.15.6.tgz", + "dependencies": { + "uid-safe": { + "version": "2.1.5", + "from": "uid-safe@>=2.1.5 <2.2.0", + "resolved": "https://registry.npmjs.org/uid-safe/-/uid-safe-2.1.5.tgz" + } + } + }, + "extend": { + "version": "3.0.2", + "from": "extend@>=3.0.1 <4.0.0", + "resolved": "https://registry.npmjs.org/extend/-/extend-3.0.2.tgz" + }, + "finalhandler": { + "version": "1.1.1", + "from": "finalhandler@1.1.1", + "resolved": "https://registry.npmjs.org/finalhandler/-/finalhandler-1.1.1.tgz", + "dependencies": { + "statuses": { + "version": "1.4.0", + "from": "statuses@>=1.4.0 <1.5.0", + "resolved": "https://registry.npmjs.org/statuses/-/statuses-1.4.0.tgz" + } + } + }, + "findit2": { + "version": "2.2.3", + "from": "findit2@>=2.2.3 <3.0.0", + "resolved": "https://registry.npmjs.org/findit2/-/findit2-2.2.3.tgz" + }, + "findup-sync": { + "version": "0.1.3", + "from": "findup-sync@>=0.1.2 <0.2.0", + "resolved": "https://registry.npmjs.org/findup-sync/-/findup-sync-0.1.3.tgz", + "dependencies": { + "glob": { + "version": "3.2.11", + "from": "glob@>=3.2.9 <3.3.0", + "resolved": "https://registry.npmjs.org/glob/-/glob-3.2.11.tgz" + }, + "lodash": { + "version": "2.4.2", + "from": "lodash@>=2.4.1 <2.5.0", + "resolved": "https://registry.npmjs.org/lodash/-/lodash-2.4.2.tgz" + }, + "minimatch": { + "version": "0.3.0", + "from": "minimatch@>=0.3.0 <0.4.0", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-0.3.0.tgz" + } + } + }, + "flexbuffer": { + "version": "0.0.6", + "from": "flexbuffer@0.0.6", + "resolved": "https://registry.npmjs.org/flexbuffer/-/flexbuffer-0.0.6.tgz" + }, + "follow-redirects": { + "version": "1.5.10", + "from": "follow-redirects@>=1.3.0 <2.0.0", + "resolved": "https://registry.npmjs.org/follow-redirects/-/follow-redirects-1.5.10.tgz", + "dependencies": { + "debug": { + "version": "3.1.0", + "from": "debug@3.1.0", + "resolved": "https://registry.npmjs.org/debug/-/debug-3.1.0.tgz" + } + } + }, + "forever-agent": { + "version": "0.5.2", + "from": "forever-agent@>=0.5.0 <0.6.0", + "resolved": "https://registry.npmjs.org/forever-agent/-/forever-agent-0.5.2.tgz" + }, + "form-data": { + "version": "0.1.4", + "from": "form-data@>=0.1.0 <0.2.0", + "resolved": "https://registry.npmjs.org/form-data/-/form-data-0.1.4.tgz", + "optional": true, + "dependencies": { + "mime": { + "version": "1.2.11", + "from": "mime@>=1.2.11 <1.3.0", + "resolved": "https://registry.npmjs.org/mime/-/mime-1.2.11.tgz", + "optional": true + } + } + }, + "forwarded": { + "version": "0.1.2", + "from": "forwarded@>=0.1.2 <0.2.0", + "resolved": "https://registry.npmjs.org/forwarded/-/forwarded-0.1.2.tgz" + }, + "fresh": { + "version": "0.5.2", + "from": "fresh@0.5.2", + "resolved": "https://registry.npmjs.org/fresh/-/fresh-0.5.2.tgz" + }, + "fs-extra": { + "version": "0.9.1", + "from": "fs-extra@>=0.9.1 <0.10.0", + "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-0.9.1.tgz", + "dependencies": { + "ncp": { + "version": "0.5.1", + "from": "ncp@>=0.5.1 <0.6.0", + "resolved": "https://registry.npmjs.org/ncp/-/ncp-0.5.1.tgz" + } + } + }, + "function-bind": { + "version": "1.1.1", + "from": "function-bind@>=1.1.1 <2.0.0", + "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.1.tgz" + }, + "gcp-metadata": { + "version": "0.7.0", + "from": "gcp-metadata@>=0.7.0 <0.8.0", + "resolved": "https://registry.npmjs.org/gcp-metadata/-/gcp-metadata-0.7.0.tgz" + }, + "get-func-name": { + "version": "2.0.0", + "from": "get-func-name@>=2.0.0 <3.0.0", + "resolved": "https://registry.npmjs.org/get-func-name/-/get-func-name-2.0.0.tgz" + }, + "getobject": { + "version": "0.1.0", + "from": "getobject@>=0.1.0 <0.2.0", + "resolved": "https://registry.npmjs.org/getobject/-/getobject-0.1.0.tgz" + }, + "glob": { + "version": "6.0.4", + "from": "glob@^6.0.1", + "resolved": "https://registry.npmjs.org/glob/-/glob-6.0.4.tgz" + }, + "google-auth-library": { + "version": "1.6.1", + "from": "google-auth-library@>=1.6.0 <2.0.0", + "resolved": "https://registry.npmjs.org/google-auth-library/-/google-auth-library-1.6.1.tgz", + "dependencies": { + "gcp-metadata": { + "version": "0.6.3", + "from": "gcp-metadata@>=0.6.3 <0.7.0", + "resolved": "https://registry.npmjs.org/gcp-metadata/-/gcp-metadata-0.6.3.tgz" + }, + "lru-cache": { + "version": "4.1.5", + "from": "lru-cache@>=4.1.3 <5.0.0", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-4.1.5.tgz" + } + } + }, + "google-p12-pem": { + "version": "1.0.2", + "from": "google-p12-pem@>=1.0.0 <2.0.0", + "resolved": "https://registry.npmjs.org/google-p12-pem/-/google-p12-pem-1.0.2.tgz", + "dependencies": { + "pify": { + "version": "3.0.0", + "from": "pify@>=3.0.0 <4.0.0", + "resolved": "https://registry.npmjs.org/pify/-/pify-3.0.0.tgz" + } + } + }, + "graceful-fs": { + "version": "1.2.3", + "from": "graceful-fs@>=1.2.0 <1.3.0", + "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-1.2.3.tgz" + }, + "growl": { + "version": "1.7.0", + "from": "growl@>=1.7.0 <1.8.0", + "resolved": "https://registry.npmjs.org/growl/-/growl-1.7.0.tgz" + }, + "grunt": { + "version": "0.4.5", + "from": "grunt@>=0.4.5 <0.5.0", + "resolved": "https://registry.npmjs.org/grunt/-/grunt-0.4.5.tgz", + "dependencies": { + "async": { + "version": "0.1.22", + "from": "async@>=0.1.22 <0.2.0", + "resolved": "https://registry.npmjs.org/async/-/async-0.1.22.tgz" + }, + "coffee-script": { + "version": "1.3.3", + "from": "coffee-script@>=1.3.3 <1.4.0", + "resolved": "https://registry.npmjs.org/coffee-script/-/coffee-script-1.3.3.tgz" + }, + "glob": { + "version": "3.1.21", + "from": "glob@>=3.1.21 <3.2.0", + "resolved": "https://registry.npmjs.org/glob/-/glob-3.1.21.tgz" + }, + "iconv-lite": { + "version": "0.2.11", + "from": "iconv-lite@>=0.2.11 <0.3.0", + "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.2.11.tgz" + }, + "inherits": { + "version": "1.0.2", + "from": "inherits@>=1.0.0 <2.0.0", + "resolved": "https://registry.npmjs.org/inherits/-/inherits-1.0.2.tgz" + }, + "minimatch": { + "version": "0.2.14", + "from": "minimatch@>=0.2.12 <0.3.0", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-0.2.14.tgz" + }, + "rimraf": { + "version": "2.2.8", + "from": "rimraf@>=2.2.8 <2.3.0", + "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-2.2.8.tgz" + } + } + }, + "grunt-bunyan": { + "version": "0.5.0", + "from": "grunt-bunyan@>=0.5.0 <0.6.0", + "resolved": "https://registry.npmjs.org/grunt-bunyan/-/grunt-bunyan-0.5.0.tgz", + "dependencies": { + "lodash": { + "version": "2.4.2", + "from": "lodash@>=2.4.1 <2.5.0", + "resolved": "https://registry.npmjs.org/lodash/-/lodash-2.4.2.tgz" + } + } + }, + "grunt-contrib-clean": { + "version": "0.6.0", + "from": "grunt-contrib-clean@>=0.6.0 <0.7.0", + "resolved": "https://registry.npmjs.org/grunt-contrib-clean/-/grunt-contrib-clean-0.6.0.tgz", + "dependencies": { + "rimraf": { + "version": "2.2.8", + "from": "rimraf@>=2.2.1 <2.3.0", + "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-2.2.8.tgz" + } + } + }, + "grunt-contrib-coffee": { + "version": "0.11.1", + "from": "grunt-contrib-coffee@>=0.11.0 <0.12.0", + "resolved": "https://registry.npmjs.org/grunt-contrib-coffee/-/grunt-contrib-coffee-0.11.1.tgz", + "dependencies": { + "coffee-script": { + "version": "1.7.1", + "from": "coffee-script@>=1.7.0 <1.8.0", + "resolved": "https://registry.npmjs.org/coffee-script/-/coffee-script-1.7.1.tgz" + }, + "lodash": { + "version": "2.4.2", + "from": "lodash@>=2.4.1 <2.5.0", + "resolved": "https://registry.npmjs.org/lodash/-/lodash-2.4.2.tgz" + }, + "mkdirp": { + "version": "0.3.5", + "from": "mkdirp@>=0.3.5 <0.4.0", + "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.3.5.tgz" + } + } + }, + "grunt-execute": { + "version": "0.2.2", + "from": "grunt-execute@>=0.2.2 <0.3.0", + "resolved": "https://registry.npmjs.org/grunt-execute/-/grunt-execute-0.2.2.tgz" + }, + "grunt-legacy-log": { + "version": "0.1.3", + "from": "grunt-legacy-log@>=0.1.0 <0.2.0", + "resolved": "https://registry.npmjs.org/grunt-legacy-log/-/grunt-legacy-log-0.1.3.tgz", + "dependencies": { + "lodash": { + "version": "2.4.2", + "from": "lodash@>=2.4.1 <2.5.0", + "resolved": "https://registry.npmjs.org/lodash/-/lodash-2.4.2.tgz" + }, + "underscore.string": { + "version": "2.3.3", + "from": "underscore.string@>=2.3.3 <2.4.0", + "resolved": "https://registry.npmjs.org/underscore.string/-/underscore.string-2.3.3.tgz" + } + } + }, + "grunt-legacy-log-utils": { + "version": "0.1.1", + "from": "grunt-legacy-log-utils@>=0.1.1 <0.2.0", + "resolved": "https://registry.npmjs.org/grunt-legacy-log-utils/-/grunt-legacy-log-utils-0.1.1.tgz", + "dependencies": { + "lodash": { + "version": "2.4.2", + "from": "lodash@>=2.4.1 <2.5.0", + "resolved": "https://registry.npmjs.org/lodash/-/lodash-2.4.2.tgz" + }, + "underscore.string": { + "version": "2.3.3", + "from": "underscore.string@>=2.3.3 <2.4.0", + "resolved": "https://registry.npmjs.org/underscore.string/-/underscore.string-2.3.3.tgz" + } + } + }, + "grunt-legacy-util": { + "version": "0.2.0", + "from": "grunt-legacy-util@>=0.2.0 <0.3.0", + "resolved": "https://registry.npmjs.org/grunt-legacy-util/-/grunt-legacy-util-0.2.0.tgz", + "dependencies": { + "async": { + "version": "0.1.22", + "from": "async@>=0.1.22 <0.2.0", + "resolved": "https://registry.npmjs.org/async/-/async-0.1.22.tgz" + } + } + }, + "grunt-mocha-test": { + "version": "0.11.0", + "from": "grunt-mocha-test@>=0.11.0 <0.12.0", + "resolved": "https://registry.npmjs.org/grunt-mocha-test/-/grunt-mocha-test-0.11.0.tgz", + "dependencies": { + "glob": { + "version": "3.2.3", + "from": "glob@3.2.3", + "resolved": "https://registry.npmjs.org/glob/-/glob-3.2.3.tgz" + }, + "graceful-fs": { + "version": "2.0.3", + "from": "graceful-fs@>=2.0.0 <2.1.0", + "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-2.0.3.tgz" + }, + "minimatch": { + "version": "0.2.14", + "from": "minimatch@>=0.2.11 <0.3.0", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-0.2.14.tgz" + }, + "mkdirp": { + "version": "0.3.5", + "from": "mkdirp@0.3.5", + "resolved": "http://registry.npmjs.org/mkdirp/-/mkdirp-0.3.5.tgz" + }, + "mocha": { + "version": "1.20.1", + "from": "mocha@>=1.20.0 <1.21.0", + "resolved": "https://registry.npmjs.org/mocha/-/mocha-1.20.1.tgz" + } + } + }, + "gtoken": { + "version": "2.3.0", + "from": "gtoken@>=2.3.0 <3.0.0", + "resolved": "https://registry.npmjs.org/gtoken/-/gtoken-2.3.0.tgz", + "dependencies": { + "mime": { + "version": "2.4.0", + "from": "mime@>=2.2.0 <3.0.0", + "resolved": "https://registry.npmjs.org/mime/-/mime-2.4.0.tgz" + }, + "pify": { + "version": "3.0.0", + "from": "pify@>=3.0.0 <4.0.0", + "resolved": "https://registry.npmjs.org/pify/-/pify-3.0.0.tgz" + } + } + }, + "has": { + "version": "1.0.3", + "from": "has@>=1.0.1 <2.0.0", + "resolved": "https://registry.npmjs.org/has/-/has-1.0.3.tgz" + }, + "has-ansi": { + "version": "0.1.0", + "from": "has-ansi@>=0.1.0 <0.2.0", + "resolved": "https://registry.npmjs.org/has-ansi/-/has-ansi-0.1.0.tgz" + }, + "has-flag": { + "version": "3.0.0", + "from": "has-flag@>=3.0.0 <4.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz" + }, + "has-symbols": { + "version": "1.0.0", + "from": "has-symbols@>=1.0.0 <2.0.0", + "resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.0.0.tgz" + }, + "hawk": { + "version": "1.0.0", + "from": "hawk@>=1.0.0 <1.1.0", + "resolved": "https://registry.npmjs.org/hawk/-/hawk-1.0.0.tgz", + "optional": true + }, + "hex2dec": { + "version": "1.1.1", + "from": "hex2dec@>=1.0.1 <2.0.0", + "resolved": "https://registry.npmjs.org/hex2dec/-/hex2dec-1.1.1.tgz" + }, + "hoek": { + "version": "0.9.1", + "from": "hoek@>=0.9.0 <0.10.0", + "resolved": "https://registry.npmjs.org/hoek/-/hoek-0.9.1.tgz" + }, + "hooker": { + "version": "0.2.3", + "from": "hooker@>=0.2.3 <0.3.0", + "resolved": "https://registry.npmjs.org/hooker/-/hooker-0.2.3.tgz" + }, + "http-errors": { + "version": "1.6.3", + "from": "http-errors@>=1.6.3 <1.7.0", + "resolved": "https://registry.npmjs.org/http-errors/-/http-errors-1.6.3.tgz" + }, + "http-signature": { + "version": "0.10.1", + "from": "http-signature@>=0.10.0 <0.11.0", + "resolved": "https://registry.npmjs.org/http-signature/-/http-signature-0.10.1.tgz", + "optional": true + }, + "https-proxy-agent": { + "version": "2.2.1", + "from": "https-proxy-agent@>=2.2.1 <3.0.0", + "resolved": "https://registry.npmjs.org/https-proxy-agent/-/https-proxy-agent-2.2.1.tgz", + "dependencies": { + "debug": { + "version": "3.2.6", + "from": "debug@>=3.1.0 <4.0.0", + "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.6.tgz" + }, + "ms": { + "version": "2.1.1", + "from": "ms@>=2.1.1 <3.0.0", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.1.tgz" + } + } + }, + "iconv-lite": { + "version": "0.4.23", + "from": "iconv-lite@0.4.23", + "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.4.23.tgz" + }, + "inflight": { + "version": "1.0.6", + "from": "inflight@^1.0.4", + "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz" + }, + "inherits": { + "version": "2.0.3", + "from": "inherits@2.0.3", + "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.3.tgz" + }, + "ioredis": { + "version": "3.2.2", + "from": "ioredis@>=3.2.1 <4.0.0", + "resolved": "https://registry.npmjs.org/ioredis/-/ioredis-3.2.2.tgz" + }, + "ipaddr.js": { + "version": "1.6.0", + "from": "ipaddr.js@1.6.0", + "resolved": "https://registry.npmjs.org/ipaddr.js/-/ipaddr.js-1.6.0.tgz" + }, + "is": { + "version": "3.2.1", + "from": "is@>=3.2.1 <4.0.0", + "resolved": "https://registry.npmjs.org/is/-/is-3.2.1.tgz" + }, + "is-buffer": { + "version": "1.1.6", + "from": "is-buffer@>=1.1.5 <2.0.0", + "resolved": "https://registry.npmjs.org/is-buffer/-/is-buffer-1.1.6.tgz" + }, + "is-callable": { + "version": "1.1.4", + "from": "is-callable@>=1.1.3 <2.0.0", + "resolved": "https://registry.npmjs.org/is-callable/-/is-callable-1.1.4.tgz" + }, + "is-date-object": { + "version": "1.0.1", + "from": "is-date-object@>=1.0.1 <2.0.0", + "resolved": "https://registry.npmjs.org/is-date-object/-/is-date-object-1.0.1.tgz" + }, + "is-regex": { + "version": "1.0.4", + "from": "is-regex@>=1.0.4 <2.0.0", + "resolved": "https://registry.npmjs.org/is-regex/-/is-regex-1.0.4.tgz" + }, + "is-symbol": { + "version": "1.0.2", + "from": "is-symbol@>=1.0.2 <2.0.0", + "resolved": "https://registry.npmjs.org/is-symbol/-/is-symbol-1.0.2.tgz" + }, + "isarray": { + "version": "0.0.1", + "from": "isarray@0.0.1", + "resolved": "https://registry.npmjs.org/isarray/-/isarray-0.0.1.tgz" + }, + "jade": { + "version": "0.26.3", + "from": "jade@0.26.3", + "resolved": "https://registry.npmjs.org/jade/-/jade-0.26.3.tgz", + "dependencies": { + "commander": { + "version": "0.6.1", + "from": "commander@0.6.1", + "resolved": "https://registry.npmjs.org/commander/-/commander-0.6.1.tgz" + }, + "mkdirp": { + "version": "0.3.0", + "from": "mkdirp@0.3.0", + "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.3.0.tgz" + } + } + }, + "js-yaml": { + "version": "2.0.5", + "from": "js-yaml@>=2.0.5 <2.1.0", + "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-2.0.5.tgz" + }, + "json-bigint": { + "version": "0.3.0", + "from": "json-bigint@>=0.3.0 <0.4.0", + "resolved": "https://registry.npmjs.org/json-bigint/-/json-bigint-0.3.0.tgz" + }, + "json-stringify-safe": { + "version": "5.0.1", + "from": "json-stringify-safe@5.0.1", + "resolved": "https://registry.npmjs.org/json-stringify-safe/-/json-stringify-safe-5.0.1.tgz" + }, + "jsonfile": { + "version": "1.1.1", + "from": "jsonfile@~1.1.0", + "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-1.1.1.tgz" + }, + "just-extend": { + "version": "1.1.27", + "from": "just-extend@>=1.1.27 <2.0.0", + "resolved": "https://registry.npmjs.org/just-extend/-/just-extend-1.1.27.tgz" + }, + "jwa": { + "version": "1.1.6", + "from": "jwa@>=1.1.5 <2.0.0", + "resolved": "https://registry.npmjs.org/jwa/-/jwa-1.1.6.tgz" + }, + "jws": { + "version": "3.1.5", + "from": "jws@>=3.1.5 <4.0.0", + "resolved": "https://registry.npmjs.org/jws/-/jws-3.1.5.tgz" + }, + "lodash": { + "version": "0.9.2", + "from": "lodash@>=0.9.2 <0.10.0", + "resolved": "https://registry.npmjs.org/lodash/-/lodash-0.9.2.tgz" + }, + "lodash.assign": { + "version": "4.2.0", + "from": "lodash.assign@>=4.2.0 <5.0.0", + "resolved": "https://registry.npmjs.org/lodash.assign/-/lodash.assign-4.2.0.tgz" + }, + "lodash.bind": { + "version": "4.2.1", + "from": "lodash.bind@>=4.2.1 <5.0.0", + "resolved": "https://registry.npmjs.org/lodash.bind/-/lodash.bind-4.2.1.tgz" + }, + "lodash.clone": { + "version": "4.5.0", + "from": "lodash.clone@>=4.5.0 <5.0.0", + "resolved": "https://registry.npmjs.org/lodash.clone/-/lodash.clone-4.5.0.tgz" + }, + "lodash.clonedeep": { + "version": "4.5.0", + "from": "lodash.clonedeep@>=4.5.0 <5.0.0", + "resolved": "https://registry.npmjs.org/lodash.clonedeep/-/lodash.clonedeep-4.5.0.tgz" + }, + "lodash.defaults": { + "version": "4.2.0", + "from": "lodash.defaults@>=4.2.0 <5.0.0", + "resolved": "https://registry.npmjs.org/lodash.defaults/-/lodash.defaults-4.2.0.tgz" + }, + "lodash.difference": { + "version": "4.5.0", + "from": "lodash.difference@>=4.5.0 <5.0.0", + "resolved": "https://registry.npmjs.org/lodash.difference/-/lodash.difference-4.5.0.tgz" + }, + "lodash.flatten": { + "version": "4.4.0", + "from": "lodash.flatten@>=4.4.0 <5.0.0", + "resolved": "https://registry.npmjs.org/lodash.flatten/-/lodash.flatten-4.4.0.tgz" + }, + "lodash.foreach": { + "version": "4.5.0", + "from": "lodash.foreach@>=4.5.0 <5.0.0", + "resolved": "https://registry.npmjs.org/lodash.foreach/-/lodash.foreach-4.5.0.tgz" + }, + "lodash.get": { + "version": "4.4.2", + "from": "lodash.get@>=4.4.2 <5.0.0", + "resolved": "https://registry.npmjs.org/lodash.get/-/lodash.get-4.4.2.tgz" + }, + "lodash.isempty": { + "version": "4.4.0", + "from": "lodash.isempty@>=4.4.0 <5.0.0", + "resolved": "https://registry.npmjs.org/lodash.isempty/-/lodash.isempty-4.4.0.tgz" + }, + "lodash.isstring": { + "version": "4.0.1", + "from": "lodash.isstring@>=4.0.1 <5.0.0", + "resolved": "https://registry.npmjs.org/lodash.isstring/-/lodash.isstring-4.0.1.tgz" + }, + "lodash.keys": { + "version": "4.2.0", + "from": "lodash.keys@>=4.2.0 <5.0.0", + "resolved": "https://registry.npmjs.org/lodash.keys/-/lodash.keys-4.2.0.tgz" + }, + "lodash.noop": { + "version": "3.0.1", + "from": "lodash.noop@>=3.0.1 <4.0.0", + "resolved": "https://registry.npmjs.org/lodash.noop/-/lodash.noop-3.0.1.tgz" + }, + "lodash.partial": { + "version": "4.2.1", + "from": "lodash.partial@>=4.2.1 <5.0.0", + "resolved": "https://registry.npmjs.org/lodash.partial/-/lodash.partial-4.2.1.tgz" + }, + "lodash.pick": { + "version": "4.4.0", + "from": "lodash.pick@>=4.4.0 <5.0.0", + "resolved": "https://registry.npmjs.org/lodash.pick/-/lodash.pick-4.4.0.tgz" + }, + "lodash.sample": { + "version": "4.2.1", + "from": "lodash.sample@>=4.2.1 <5.0.0", + "resolved": "https://registry.npmjs.org/lodash.sample/-/lodash.sample-4.2.1.tgz" + }, + "lodash.shuffle": { + "version": "4.2.0", + "from": "lodash.shuffle@>=4.2.0 <5.0.0", + "resolved": "https://registry.npmjs.org/lodash.shuffle/-/lodash.shuffle-4.2.0.tgz" + }, + "lodash.values": { + "version": "4.3.0", + "from": "lodash.values@>=4.3.0 <5.0.0", + "resolved": "https://registry.npmjs.org/lodash.values/-/lodash.values-4.3.0.tgz" + }, + "logger-sharelatex": { + "version": "1.5.6", + "from": "git+https://github.com/sharelatex/logger-sharelatex.git#v1.5.6", + "resolved": "git+https://github.com/sharelatex/logger-sharelatex.git#b2956ec56b582b9f4fc8fdda8dc00c06e77c5537", + "dependencies": { + "assertion-error": { + "version": "1.1.0", + "from": "assertion-error@>=1.0.1 <2.0.0", + "resolved": "https://registry.npmjs.org/assertion-error/-/assertion-error-1.1.0.tgz" + }, + "bunyan": { + "version": "1.5.1", + "from": "bunyan@1.5.1", + "resolved": "https://registry.npmjs.org/bunyan/-/bunyan-1.5.1.tgz" + }, + "chai": { + "version": "4.1.2", + "from": "chai@latest", + "resolved": "https://registry.npmjs.org/chai/-/chai-4.1.2.tgz" + }, + "deep-eql": { + "version": "3.0.1", + "from": "deep-eql@>=3.0.0 <4.0.0", + "resolved": "https://registry.npmjs.org/deep-eql/-/deep-eql-3.0.1.tgz" + }, + "dtrace-provider": { + "version": "0.6.0", + "from": "dtrace-provider@>=0.6.0 <0.7.0", + "resolved": "https://registry.npmjs.org/dtrace-provider/-/dtrace-provider-0.6.0.tgz", + "optional": true + }, + "sandboxed-module": { + "version": "2.0.3", + "from": "sandboxed-module@latest", + "resolved": "https://registry.npmjs.org/sandboxed-module/-/sandboxed-module-2.0.3.tgz" + }, + "sinon": { + "version": "5.0.7", + "from": "sinon@latest", + "resolved": "https://registry.npmjs.org/sinon/-/sinon-5.0.7.tgz", + "dependencies": { + "diff": { + "version": "3.5.0", + "from": "diff@>=3.1.0 <4.0.0", + "resolved": "https://registry.npmjs.org/diff/-/diff-3.5.0.tgz" + }, + "supports-color": { + "version": "5.4.0", + "from": "supports-color@>=5.1.0 <6.0.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.4.0.tgz" + } + } + }, + "timekeeper": { + "version": "1.0.0", + "from": "timekeeper@>=1.0.0 <2.0.0", + "resolved": "https://registry.npmjs.org/timekeeper/-/timekeeper-1.0.0.tgz" + }, + "type-detect": { + "version": "4.0.8", + "from": "type-detect@>=4.0.0 <5.0.0", + "resolved": "https://registry.npmjs.org/type-detect/-/type-detect-4.0.8.tgz" + } + } + }, + "lolex": { + "version": "2.6.0", + "from": "lolex@>=2.2.0 <3.0.0", + "resolved": "https://registry.npmjs.org/lolex/-/lolex-2.6.0.tgz" + }, + "lru-cache": { + "version": "2.7.3", + "from": "lru-cache@>=2.0.0 <3.0.0", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-2.7.3.tgz" + }, + "lsmod": { + "version": "1.0.0", + "from": "lsmod@1.0.0", + "resolved": "https://registry.npmjs.org/lsmod/-/lsmod-1.0.0.tgz" + }, + "lynx": { + "version": "0.1.1", + "from": "lynx@>=0.1.1 <0.2.0", + "resolved": "https://registry.npmjs.org/lynx/-/lynx-0.1.1.tgz" + }, + "media-typer": { + "version": "0.3.0", + "from": "media-typer@0.3.0", + "resolved": "https://registry.npmjs.org/media-typer/-/media-typer-0.3.0.tgz" + }, + "merge-descriptors": { + "version": "1.0.1", + "from": "merge-descriptors@1.0.1", + "resolved": "https://registry.npmjs.org/merge-descriptors/-/merge-descriptors-1.0.1.tgz" + }, + "mersenne": { + "version": "0.0.4", + "from": "mersenne@>=0.0.3 <0.1.0", + "resolved": "https://registry.npmjs.org/mersenne/-/mersenne-0.0.4.tgz" + }, + "methods": { + "version": "1.1.2", + "from": "methods@>=1.1.2 <1.2.0", + "resolved": "https://registry.npmjs.org/methods/-/methods-1.1.2.tgz" + }, + "metrics-sharelatex": { + "version": "2.0.4", + "from": "git+https://github.com/sharelatex/metrics-sharelatex.git#v2.0.4", + "resolved": "git+https://github.com/sharelatex/metrics-sharelatex.git#49c4bc072f707eb6252adfec540268dfbea1615b", + "dependencies": { + "coffee-script": { + "version": "1.6.0", + "from": "coffee-script@1.6.0", + "resolved": "https://registry.npmjs.org/coffee-script/-/coffee-script-1.6.0.tgz" + }, + "underscore": { + "version": "1.6.0", + "from": "underscore@>=1.6.0 <1.7.0", + "resolved": "https://registry.npmjs.org/underscore/-/underscore-1.6.0.tgz" + } + } + }, + "mime": { + "version": "1.4.1", + "from": "mime@1.4.1", + "resolved": "https://registry.npmjs.org/mime/-/mime-1.4.1.tgz" + }, + "mime-db": { + "version": "1.33.0", + "from": "mime-db@>=1.33.0 <1.34.0", + "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.33.0.tgz" + }, + "mime-types": { + "version": "2.1.18", + "from": "mime-types@>=2.1.18 <2.2.0", + "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.18.tgz" + }, + "minimatch": { + "version": "3.0.4", + "from": "minimatch@2 || 3", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.0.4.tgz" + }, + "minimist": { + "version": "0.0.8", + "from": "minimist@0.0.8", + "resolved": "https://registry.npmjs.org/minimist/-/minimist-0.0.8.tgz" + }, + "mkdirp": { + "version": "0.5.1", + "from": "mkdirp@~0.5.1", + "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.1.tgz" + }, + "module-details-from-path": { + "version": "1.0.3", + "from": "module-details-from-path@>=1.0.3 <2.0.0", + "resolved": "https://registry.npmjs.org/module-details-from-path/-/module-details-from-path-1.0.3.tgz" + }, + "ms": { + "version": "2.0.0", + "from": "ms@2.0.0", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz" + }, + "mv": { + "version": "2.1.1", + "from": "mv@~2", + "resolved": "https://registry.npmjs.org/mv/-/mv-2.1.1.tgz", + "optional": true + }, + "nan": { + "version": "2.10.0", + "from": "nan@>=2.0.8 <3.0.0", + "resolved": "https://registry.npmjs.org/nan/-/nan-2.10.0.tgz", + "optional": true + }, + "ncp": { + "version": "2.0.0", + "from": "ncp@~2.0.0", + "resolved": "https://registry.npmjs.org/ncp/-/ncp-2.0.0.tgz", + "optional": true + }, + "negotiator": { + "version": "0.6.1", + "from": "negotiator@0.6.1", + "resolved": "https://registry.npmjs.org/negotiator/-/negotiator-0.6.1.tgz" + }, + "nise": { + "version": "1.3.3", + "from": "nise@>=1.2.0 <2.0.0", + "resolved": "https://registry.npmjs.org/nise/-/nise-1.3.3.tgz", + "dependencies": { + "path-to-regexp": { + "version": "1.7.0", + "from": "path-to-regexp@>=1.7.0 <2.0.0", + "resolved": "https://registry.npmjs.org/path-to-regexp/-/path-to-regexp-1.7.0.tgz" + } + } + }, + "node-fetch": { + "version": "2.3.0", + "from": "node-fetch@>=2.2.0 <3.0.0", + "resolved": "https://registry.npmjs.org/node-fetch/-/node-fetch-2.3.0.tgz" + }, + "node-forge": { + "version": "0.7.6", + "from": "node-forge@>=0.7.4 <0.8.0", + "resolved": "https://registry.npmjs.org/node-forge/-/node-forge-0.7.6.tgz" + }, + "nopt": { + "version": "1.0.10", + "from": "nopt@>=1.0.10 <1.1.0", + "resolved": "https://registry.npmjs.org/nopt/-/nopt-1.0.10.tgz" + }, + "oauth-sign": { + "version": "0.3.0", + "from": "oauth-sign@>=0.3.0 <0.4.0", + "resolved": "https://registry.npmjs.org/oauth-sign/-/oauth-sign-0.3.0.tgz", + "optional": true + }, + "object-keys": { + "version": "1.0.12", + "from": "object-keys@>=1.0.12 <2.0.0", + "resolved": "https://registry.npmjs.org/object-keys/-/object-keys-1.0.12.tgz" + }, + "object.getownpropertydescriptors": { + "version": "2.0.3", + "from": "object.getownpropertydescriptors@>=2.0.3 <3.0.0", + "resolved": "https://registry.npmjs.org/object.getownpropertydescriptors/-/object.getownpropertydescriptors-2.0.3.tgz" + }, + "on-finished": { + "version": "2.3.0", + "from": "on-finished@>=2.3.0 <2.4.0", + "resolved": "https://registry.npmjs.org/on-finished/-/on-finished-2.3.0.tgz" + }, + "on-headers": { + "version": "1.0.1", + "from": "on-headers@>=1.0.1 <1.1.0", + "resolved": "https://registry.npmjs.org/on-headers/-/on-headers-1.0.1.tgz" + }, + "once": { + "version": "1.4.0", + "from": "once@^1.3.0", + "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz" + }, + "options": { + "version": "0.0.6", + "from": "options@>=0.0.5", + "resolved": "https://registry.npmjs.org/options/-/options-0.0.6.tgz" + }, + "p-limit": { + "version": "2.0.0", + "from": "p-limit@>=2.0.0 <3.0.0", + "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-2.0.0.tgz" + }, + "p-try": { + "version": "2.0.0", + "from": "p-try@>=2.0.0 <3.0.0", + "resolved": "https://registry.npmjs.org/p-try/-/p-try-2.0.0.tgz" + }, + "parseurl": { + "version": "1.3.2", + "from": "parseurl@>=1.3.2 <1.4.0", + "resolved": "https://registry.npmjs.org/parseurl/-/parseurl-1.3.2.tgz" + }, + "path-is-absolute": { + "version": "1.0.1", + "from": "path-is-absolute@^1.0.0", + "resolved": "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz" + }, + "path-parse": { + "version": "1.0.6", + "from": "path-parse@>=1.0.5 <2.0.0", + "resolved": "https://registry.npmjs.org/path-parse/-/path-parse-1.0.6.tgz" + }, + "path-to-regexp": { + "version": "0.1.7", + "from": "path-to-regexp@0.1.7", + "resolved": "https://registry.npmjs.org/path-to-regexp/-/path-to-regexp-0.1.7.tgz" + }, + "pathval": { + "version": "1.1.0", + "from": "pathval@>=1.0.0 <2.0.0", + "resolved": "https://registry.npmjs.org/pathval/-/pathval-1.1.0.tgz" + }, + "pify": { + "version": "4.0.1", + "from": "pify@>=4.0.0 <5.0.0", + "resolved": "https://registry.npmjs.org/pify/-/pify-4.0.1.tgz" + }, + "policyfile": { + "version": "0.0.4", + "from": "policyfile@0.0.4", + "resolved": "https://registry.npmjs.org/policyfile/-/policyfile-0.0.4.tgz" + }, + "process-nextick-args": { + "version": "2.0.0", + "from": "process-nextick-args@>=2.0.0 <2.1.0", + "resolved": "https://registry.npmjs.org/process-nextick-args/-/process-nextick-args-2.0.0.tgz" + }, + "prom-client": { + "version": "11.2.0", + "from": "prom-client@>=11.1.3 <12.0.0", + "resolved": "https://registry.npmjs.org/prom-client/-/prom-client-11.2.0.tgz" + }, + "proxy-addr": { + "version": "2.0.3", + "from": "proxy-addr@>=2.0.3 <2.1.0", + "resolved": "https://registry.npmjs.org/proxy-addr/-/proxy-addr-2.0.3.tgz" + }, + "pseudomap": { + "version": "1.0.2", + "from": "pseudomap@>=1.0.2 <2.0.0", + "resolved": "https://registry.npmjs.org/pseudomap/-/pseudomap-1.0.2.tgz" + }, + "punycode": { + "version": "1.4.1", + "from": "punycode@>=1.4.1 <2.0.0", + "resolved": "https://registry.npmjs.org/punycode/-/punycode-1.4.1.tgz", + "optional": true + }, + "q": { + "version": "0.9.2", + "from": "q@0.9.2", + "resolved": "https://registry.npmjs.org/q/-/q-0.9.2.tgz" + }, + "qs": { + "version": "6.5.2", + "from": "qs@6.5.2", + "resolved": "https://registry.npmjs.org/qs/-/qs-6.5.2.tgz" + }, + "random-bytes": { + "version": "1.0.0", + "from": "random-bytes@>=1.0.0 <1.1.0", + "resolved": "https://registry.npmjs.org/random-bytes/-/random-bytes-1.0.0.tgz" + }, + "range-parser": { + "version": "1.2.0", + "from": "range-parser@>=1.2.0 <1.3.0", + "resolved": "https://registry.npmjs.org/range-parser/-/range-parser-1.2.0.tgz" + }, + "raven": { + "version": "1.2.1", + "from": "raven@>=1.1.3 <2.0.0", + "resolved": "https://registry.npmjs.org/raven/-/raven-1.2.1.tgz" + }, + "raw-body": { + "version": "2.3.3", + "from": "raw-body@2.3.3", + "resolved": "https://registry.npmjs.org/raw-body/-/raw-body-2.3.3.tgz" + }, + "readable-stream": { + "version": "2.3.6", + "from": "readable-stream@>=2.0.0 <3.0.0", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.6.tgz", + "dependencies": { + "isarray": { + "version": "1.0.0", + "from": "isarray@>=1.0.0 <1.1.0", + "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz" + } + } + }, + "redis": { + "version": "0.12.1", + "from": "redis@>=0.12.1 <0.13.0", + "resolved": "https://registry.npmjs.org/redis/-/redis-0.12.1.tgz" + }, + "redis-commands": { + "version": "1.3.5", + "from": "redis-commands@>=1.2.0 <2.0.0", + "resolved": "https://registry.npmjs.org/redis-commands/-/redis-commands-1.3.5.tgz" + }, + "redis-parser": { + "version": "2.6.0", + "from": "redis-parser@>=2.4.0 <3.0.0", + "resolved": "https://registry.npmjs.org/redis-parser/-/redis-parser-2.6.0.tgz" + }, + "redis-sentinel": { + "version": "0.1.1", + "from": "redis-sentinel@0.1.1", + "resolved": "https://registry.npmjs.org/redis-sentinel/-/redis-sentinel-0.1.1.tgz", + "dependencies": { + "redis": { + "version": "0.11.0", + "from": "redis@>=0.11.0 <0.12.0", + "resolved": "https://registry.npmjs.org/redis/-/redis-0.11.0.tgz" + } + } + }, + "redis-sharelatex": { + "version": "1.0.4", + "from": "git+https://github.com/sharelatex/redis-sharelatex.git#v1.0.4", + "resolved": "git+https://github.com/sharelatex/redis-sharelatex.git#ca4e906559c1405d132e8edd7db763d64a57be62", + "dependencies": { + "async": { + "version": "2.6.1", + "from": "async@>=2.5.0 <3.0.0", + "resolved": "https://registry.npmjs.org/async/-/async-2.6.1.tgz" + }, + "coffee-script": { + "version": "1.8.0", + "from": "coffee-script@1.8.0", + "resolved": "https://registry.npmjs.org/coffee-script/-/coffee-script-1.8.0.tgz" + }, + "lodash": { + "version": "4.17.10", + "from": "lodash@>=4.17.10 <5.0.0", + "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.10.tgz" + }, + "mkdirp": { + "version": "0.3.5", + "from": "mkdirp@>=0.3.5 <0.4.0", + "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.3.5.tgz" + } + } + }, + "request": { + "version": "2.34.0", + "from": "request@>=2.34.0 <2.35.0", + "resolved": "https://registry.npmjs.org/request/-/request-2.34.0.tgz", + "dependencies": { + "mime": { + "version": "1.2.11", + "from": "mime@>=1.2.9 <1.3.0", + "resolved": "https://registry.npmjs.org/mime/-/mime-1.2.11.tgz" + }, + "node-uuid": { + "version": "1.4.8", + "from": "node-uuid@>=1.4.0 <1.5.0", + "resolved": "https://registry.npmjs.org/node-uuid/-/node-uuid-1.4.8.tgz" + }, + "qs": { + "version": "0.6.6", + "from": "qs@>=0.6.0 <0.7.0", + "resolved": "https://registry.npmjs.org/qs/-/qs-0.6.6.tgz" + } + } + }, + "require-in-the-middle": { + "version": "3.1.0", + "from": "require-in-the-middle@>=3.0.0 <4.0.0", + "resolved": "https://registry.npmjs.org/require-in-the-middle/-/require-in-the-middle-3.1.0.tgz" + }, + "require-like": { + "version": "0.1.2", + "from": "require-like@0.1.2", + "resolved": "https://registry.npmjs.org/require-like/-/require-like-0.1.2.tgz" + }, + "resolve": { + "version": "1.8.1", + "from": "resolve@>=1.5.0 <2.0.0", + "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.8.1.tgz" + }, + "retry-axios": { + "version": "0.3.2", + "from": "retry-axios@>=0.3.2 <0.4.0", + "resolved": "https://registry.npmjs.org/retry-axios/-/retry-axios-0.3.2.tgz" + }, + "retry-request": { + "version": "4.0.0", + "from": "retry-request@>=4.0.0 <5.0.0", + "resolved": "https://registry.npmjs.org/retry-request/-/retry-request-4.0.0.tgz" + }, + "rimraf": { + "version": "2.4.5", + "from": "rimraf@~2.4.0", + "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-2.4.5.tgz" + }, + "safe-buffer": { + "version": "5.1.1", + "from": "safe-buffer@5.1.1", + "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.1.tgz" + }, + "safe-json-stringify": { + "version": "1.1.0", + "from": "safe-json-stringify@>=1.0.0 <2.0.0", + "resolved": "https://registry.npmjs.org/safe-json-stringify/-/safe-json-stringify-1.1.0.tgz", + "optional": true + }, + "safer-buffer": { + "version": "2.1.2", + "from": "safer-buffer@>=2.1.2 <3.0.0", + "resolved": "https://registry.npmjs.org/safer-buffer/-/safer-buffer-2.1.2.tgz" + }, + "samsam": { + "version": "1.3.0", + "from": "samsam@1.3.0", + "resolved": "https://registry.npmjs.org/samsam/-/samsam-1.3.0.tgz" + }, + "semver": { + "version": "5.6.0", + "from": "semver@>=5.5.0 <6.0.0", + "resolved": "https://registry.npmjs.org/semver/-/semver-5.6.0.tgz" + }, + "send": { + "version": "0.16.2", + "from": "send@0.16.2", + "resolved": "https://registry.npmjs.org/send/-/send-0.16.2.tgz", + "dependencies": { + "statuses": { + "version": "1.4.0", + "from": "statuses@>=1.4.0 <1.5.0", + "resolved": "https://registry.npmjs.org/statuses/-/statuses-1.4.0.tgz" + } + } + }, + "serve-static": { + "version": "1.13.2", + "from": "serve-static@1.13.2", + "resolved": "https://registry.npmjs.org/serve-static/-/serve-static-1.13.2.tgz" + }, + "session.socket.io": { + "version": "0.1.6", + "from": "session.socket.io@>=0.1.6 <0.2.0", + "resolved": "https://registry.npmjs.org/session.socket.io/-/session.socket.io-0.1.6.tgz" + }, + "setprototypeof": { + "version": "1.1.0", + "from": "setprototypeof@1.1.0", + "resolved": "https://registry.npmjs.org/setprototypeof/-/setprototypeof-1.1.0.tgz" + }, + "settings-sharelatex": { + "version": "1.0.0", + "from": "git+https://github.com/sharelatex/settings-sharelatex.git#v1.0.0", + "resolved": "git+https://github.com/sharelatex/settings-sharelatex.git#cbc5e41c1dbe6789721a14b3fdae05bf22546559", + "dependencies": { + "coffee-script": { + "version": "1.6.0", + "from": "coffee-script@1.6.0", + "resolved": "https://registry.npmjs.org/coffee-script/-/coffee-script-1.6.0.tgz" + } + } + }, + "shimmer": { + "version": "1.2.0", + "from": "shimmer@>=1.2.0 <2.0.0", + "resolved": "https://registry.npmjs.org/shimmer/-/shimmer-1.2.0.tgz" + }, + "sigmund": { + "version": "1.0.1", + "from": "sigmund@>=1.0.0 <1.1.0", + "resolved": "https://registry.npmjs.org/sigmund/-/sigmund-1.0.1.tgz" + }, + "sntp": { + "version": "0.2.4", + "from": "sntp@>=0.2.0 <0.3.0", + "resolved": "https://registry.npmjs.org/sntp/-/sntp-0.2.4.tgz", + "optional": true + }, + "socket.io": { + "version": "0.9.16", + "from": "socket.io@0.9.16", + "resolved": "https://registry.npmjs.org/socket.io/-/socket.io-0.9.16.tgz", + "dependencies": { + "redis": { + "version": "0.7.3", + "from": "redis@0.7.3", + "resolved": "https://registry.npmjs.org/redis/-/redis-0.7.3.tgz", + "optional": true + }, + "socket.io-client": { + "version": "0.9.16", + "from": "socket.io-client@0.9.16", + "resolved": "https://registry.npmjs.org/socket.io-client/-/socket.io-client-0.9.16.tgz" + } + } + }, + "socket.io-client": { + "version": "0.9.17", + "from": "socket.io-client@>=0.9.16 <0.10.0", + "resolved": "https://registry.npmjs.org/socket.io-client/-/socket.io-client-0.9.17.tgz" + }, + "source-map": { + "version": "0.6.1", + "from": "source-map@>=0.6.1 <0.7.0", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz" + }, + "split": { + "version": "1.0.1", + "from": "split@>=1.0.0 <2.0.0", + "resolved": "https://registry.npmjs.org/split/-/split-1.0.1.tgz" + }, + "stack-trace": { + "version": "0.0.9", + "from": "stack-trace@0.0.9", + "resolved": "https://registry.npmjs.org/stack-trace/-/stack-trace-0.0.9.tgz" + }, + "statsd-parser": { + "version": "0.0.4", + "from": "statsd-parser@>=0.0.4 <0.1.0", + "resolved": "https://registry.npmjs.org/statsd-parser/-/statsd-parser-0.0.4.tgz" + }, + "statuses": { + "version": "1.5.0", + "from": "statuses@>=1.4.0 <2.0.0", + "resolved": "https://registry.npmjs.org/statuses/-/statuses-1.5.0.tgz" + }, + "stream-shift": { + "version": "1.0.0", + "from": "stream-shift@>=1.0.0 <2.0.0", + "resolved": "https://registry.npmjs.org/stream-shift/-/stream-shift-1.0.0.tgz" + }, + "string_decoder": { + "version": "1.1.1", + "from": "string_decoder@>=1.1.1 <1.2.0", + "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz" + }, + "strip-ansi": { + "version": "0.3.0", + "from": "strip-ansi@>=0.3.0 <0.4.0", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-0.3.0.tgz" + }, + "supports-color": { + "version": "0.2.0", + "from": "supports-color@>=0.2.0 <0.3.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-0.2.0.tgz" + }, + "tdigest": { + "version": "0.1.1", + "from": "tdigest@>=0.1.1 <0.2.0", + "resolved": "https://registry.npmjs.org/tdigest/-/tdigest-0.1.1.tgz" + }, + "teeny-request": { + "version": "3.11.3", + "from": "teeny-request@>=3.6.0 <4.0.0", + "resolved": "https://registry.npmjs.org/teeny-request/-/teeny-request-3.11.3.tgz", + "dependencies": { + "uuid": { + "version": "3.3.2", + "from": "uuid@>=3.3.2 <4.0.0", + "resolved": "https://registry.npmjs.org/uuid/-/uuid-3.3.2.tgz" + } + } + }, + "text-encoding": { + "version": "0.6.4", + "from": "text-encoding@>=0.6.4 <0.7.0", + "resolved": "https://registry.npmjs.org/text-encoding/-/text-encoding-0.6.4.tgz" + }, + "through": { + "version": "2.3.8", + "from": "through@>=2.0.0 <3.0.0", + "resolved": "https://registry.npmjs.org/through/-/through-2.3.8.tgz" + }, + "through2": { + "version": "2.0.5", + "from": "through2@>=2.0.3 <3.0.0", + "resolved": "https://registry.npmjs.org/through2/-/through2-2.0.5.tgz" + }, + "tinycolor": { + "version": "0.0.1", + "from": "tinycolor@>=0.0.0 <1.0.0", + "resolved": "https://registry.npmjs.org/tinycolor/-/tinycolor-0.0.1.tgz" + }, + "tough-cookie": { + "version": "2.3.4", + "from": "tough-cookie@>=0.12.0", + "resolved": "https://registry.npmjs.org/tough-cookie/-/tough-cookie-2.3.4.tgz", + "optional": true + }, + "tunnel-agent": { + "version": "0.3.0", + "from": "tunnel-agent@>=0.3.0 <0.4.0", + "resolved": "https://registry.npmjs.org/tunnel-agent/-/tunnel-agent-0.3.0.tgz", + "optional": true + }, + "type-is": { + "version": "1.6.16", + "from": "type-is@>=1.6.16 <1.7.0", + "resolved": "https://registry.npmjs.org/type-is/-/type-is-1.6.16.tgz" + }, + "uglify-js": { + "version": "1.2.5", + "from": "uglify-js@1.2.5", + "resolved": "https://registry.npmjs.org/uglify-js/-/uglify-js-1.2.5.tgz" + }, + "underscore": { + "version": "1.7.0", + "from": "underscore@>=1.7.0 <1.8.0", + "resolved": "https://registry.npmjs.org/underscore/-/underscore-1.7.0.tgz" + }, + "underscore.string": { + "version": "2.2.1", + "from": "underscore.string@>=2.2.1 <2.3.0", + "resolved": "https://registry.npmjs.org/underscore.string/-/underscore.string-2.2.1.tgz" + }, + "unpipe": { + "version": "1.0.0", + "from": "unpipe@1.0.0", + "resolved": "https://registry.npmjs.org/unpipe/-/unpipe-1.0.0.tgz" + }, + "util-deprecate": { + "version": "1.0.2", + "from": "util-deprecate@>=1.0.1 <1.1.0", + "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz" + }, + "util.promisify": { + "version": "1.0.0", + "from": "util.promisify@>=1.0.0 <2.0.0", + "resolved": "https://registry.npmjs.org/util.promisify/-/util.promisify-1.0.0.tgz" + }, + "utils-merge": { + "version": "1.0.1", + "from": "utils-merge@1.0.1", + "resolved": "https://registry.npmjs.org/utils-merge/-/utils-merge-1.0.1.tgz" + }, + "uuid": { + "version": "3.0.0", + "from": "uuid@3.0.0", + "resolved": "https://registry.npmjs.org/uuid/-/uuid-3.0.0.tgz" + }, + "vary": { + "version": "1.1.2", + "from": "vary@>=1.1.2 <1.2.0", + "resolved": "https://registry.npmjs.org/vary/-/vary-1.1.2.tgz" + }, + "which": { + "version": "1.0.9", + "from": "which@>=1.0.5 <1.1.0", + "resolved": "https://registry.npmjs.org/which/-/which-1.0.9.tgz" + }, + "wrappy": { + "version": "1.0.2", + "from": "wrappy@1", + "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz" + }, + "ws": { + "version": "0.4.32", + "from": "ws@>=0.4.0 <0.5.0", + "resolved": "https://registry.npmjs.org/ws/-/ws-0.4.32.tgz", + "dependencies": { + "commander": { + "version": "2.1.0", + "from": "commander@>=2.1.0 <2.2.0", + "resolved": "https://registry.npmjs.org/commander/-/commander-2.1.0.tgz" + }, + "nan": { + "version": "1.0.0", + "from": "nan@>=1.0.0 <1.1.0", + "resolved": "https://registry.npmjs.org/nan/-/nan-1.0.0.tgz" + } + } + }, + "xmlhttprequest": { + "version": "1.4.2", + "from": "xmlhttprequest@1.4.2", + "resolved": "https://registry.npmjs.org/xmlhttprequest/-/xmlhttprequest-1.4.2.tgz" + }, + "xtend": { + "version": "4.0.1", + "from": "xtend@>=4.0.1 <4.1.0", + "resolved": "https://registry.npmjs.org/xtend/-/xtend-4.0.1.tgz" + }, + "yallist": { + "version": "2.1.2", + "from": "yallist@>=2.1.2 <3.0.0", + "resolved": "https://registry.npmjs.org/yallist/-/yallist-2.1.2.tgz" + }, + "zeparser": { + "version": "0.0.5", + "from": "zeparser@0.0.5", + "resolved": "https://registry.npmjs.org/zeparser/-/zeparser-0.0.5.tgz" + } + } +} diff --git a/services/real-time/package.json b/services/real-time/package.json index 6e4f378c32..a2466ea67f 100644 --- a/services/real-time/package.json +++ b/services/real-time/package.json @@ -29,7 +29,7 @@ "express": "^4.10.1", "express-session": "^1.9.1", "logger-sharelatex": "git+https://github.com/sharelatex/logger-sharelatex.git#v1.5.6", - "metrics-sharelatex": "git+https://github.com/sharelatex/metrics-sharelatex.git#v1.4.0", + "metrics-sharelatex": "git+https://github.com/sharelatex/metrics-sharelatex.git#v2.0.4", "redis-sharelatex": "git+https://github.com/sharelatex/redis-sharelatex.git#v1.0.4", "request": "~2.34.0", "session.socket.io": "^0.1.6", @@ -41,14 +41,6 @@ "bunyan": "~0.22.3", "chai": "~1.9.1", "cookie-signature": "^1.0.5", - "grunt": "~0.4.4", - "grunt-bunyan": "~0.5.0", - "grunt-contrib-clean": "~0.5.0", - "grunt-contrib-coffee": "~0.10.1", - "grunt-execute": "~0.2.1", - "grunt-forever": "~0.4.4", - "grunt-mocha-test": "~0.10.2", - "grunt-shell": "~0.7.0", "sandboxed-module": "~0.3.0", "sinon": "~1.5.2", "mocha": "^4.0.1", From 64f3d32c6c7cf4e8da47c5ae516677580f75e216 Mon Sep 17 00:00:00 2001 From: Henry Oswald Date: Tue, 4 Dec 2018 13:22:09 +0000 Subject: [PATCH 11/53] log out status calls --- services/real-time/app.coffee | 1 + 1 file changed, 1 insertion(+) diff --git a/services/real-time/app.coffee b/services/real-time/app.coffee index b66375addb..37a45a957b 100644 --- a/services/real-time/app.coffee +++ b/services/real-time/app.coffee @@ -49,6 +49,7 @@ app.get "/", (req, res, next) -> res.send "real-time-sharelatex is alive" app.get "/status", (req, res, next) -> + console.log("got status") res.send "real-time-sharelatex is alive" rclient = require("redis-sharelatex").createClient(Settings.redis.realtime) From 2282518c90fe8d1c1b6e3b95420834d8a76ac31c Mon Sep 17 00:00:00 2001 From: Henry Oswald Date: Tue, 4 Dec 2018 13:26:47 +0000 Subject: [PATCH 12/53] print out req.query --- services/real-time/app.coffee | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/services/real-time/app.coffee b/services/real-time/app.coffee index 37a45a957b..9c89bc5cc8 100644 --- a/services/real-time/app.coffee +++ b/services/real-time/app.coffee @@ -49,7 +49,7 @@ app.get "/", (req, res, next) -> res.send "real-time-sharelatex is alive" app.get "/status", (req, res, next) -> - console.log("got status") + console.log("got status", req.query) res.send "real-time-sharelatex is alive" rclient = require("redis-sharelatex").createClient(Settings.redis.realtime) From fc2d2405f4ba99753e0b611b16d1e2f25b637c79 Mon Sep 17 00:00:00 2001 From: Henry Oswald Date: Tue, 4 Dec 2018 13:32:37 +0000 Subject: [PATCH 13/53] log out io clients --- services/real-time/app.coffee | 5 ++--- 1 file changed, 2 insertions(+), 3 deletions(-) diff --git a/services/real-time/app.coffee b/services/real-time/app.coffee index 9c89bc5cc8..0857fcc835 100644 --- a/services/real-time/app.coffee +++ b/services/real-time/app.coffee @@ -27,8 +27,7 @@ io = require('socket.io').listen(server) # Bind to sessions sessionStore = new RedisStore(client: sessionRedisClient) cookieParser = CookieParser(Settings.security.sessionSecret) -console.log(Settings.security.sessionSecret, Settings.cookieName) -console.log(Settings) + sessionSockets = new SessionSockets(io, sessionStore, cookieParser, Settings.cookieName) io.configure -> @@ -49,7 +48,7 @@ app.get "/", (req, res, next) -> res.send "real-time-sharelatex is alive" app.get "/status", (req, res, next) -> - console.log("got status", req.query) + console.log("got status", req.query, io.sockets.clients()?.length) res.send "real-time-sharelatex is alive" rclient = require("redis-sharelatex").createClient(Settings.redis.realtime) From 9a851d6ccebcab6ab6a7d6cccc4134f93a07f427 Mon Sep 17 00:00:00 2001 From: Henry Oswald Date: Tue, 4 Dec 2018 13:47:04 +0000 Subject: [PATCH 14/53] mvp for safe shutdown --- services/real-time/app.coffee | 17 +++++++++++++++++ 1 file changed, 17 insertions(+) diff --git a/services/real-time/app.coffee b/services/real-time/app.coffee index 0857fcc835..034dc2d915 100644 --- a/services/real-time/app.coffee +++ b/services/real-time/app.coffee @@ -78,3 +78,20 @@ server.listen port, host, (error) -> # Stop huge stack traces in logs from all the socket.io parsing steps. Error.stackTraceLimit = 10 + + +shutdownCleanly = (signal) -> + return () -> + logger.log signal: signal, "received interrupt, cleaning up" + connectedClients = io.sockets.clients()?.length + logger.log {connectedClients, signal}, "looking to shut down process" + if connectedClients == 0 + logger.log("no clients connected, exiting") + process.exit() + else + setTimeout () -> + shutdownCleanly(signal) + , 10000 + +for signal in ['SIGINT', 'SIGHUP', 'SIGQUIT', 'SIGUSR1', 'SIGUSR2', 'SIGTERM', 'SIGABRT'] + process.on signal, shutdownCleanly(signal) From 7f2decae4d4e7b33787693729516898548c5bc52 Mon Sep 17 00:00:00 2001 From: Henry Oswald Date: Tue, 4 Dec 2018 14:06:39 +0000 Subject: [PATCH 15/53] start drain after 3 hours --- services/real-time/app.coffee | 39 ++++++++++++------- .../app/coffee/ConnectedUsersManager.coffee | 2 - .../coffee/DocumentUpdaterController.coffee | 2 - .../real-time/config/settings.defaults.coffee | 4 +- 4 files changed, 29 insertions(+), 18 deletions(-) diff --git a/services/real-time/app.coffee b/services/real-time/app.coffee index 034dc2d915..20c89a2681 100644 --- a/services/real-time/app.coffee +++ b/services/real-time/app.coffee @@ -19,6 +19,8 @@ Metrics.initialize(Settings.appName or "real-time") Metrics.event_loop.monitor(logger) +DrainManager = require("./app/js/DrainManager") + # Set up socket.io server app = express() server = require('http').createServer(app) @@ -81,17 +83,28 @@ Error.stackTraceLimit = 10 shutdownCleanly = (signal) -> - return () -> - logger.log signal: signal, "received interrupt, cleaning up" - connectedClients = io.sockets.clients()?.length - logger.log {connectedClients, signal}, "looking to shut down process" - if connectedClients == 0 - logger.log("no clients connected, exiting") - process.exit() - else - setTimeout () -> - shutdownCleanly(signal) - , 10000 + connectedClients = io.sockets.clients()?.length + logger.log {connectedClients, signal}, "looking to shut down process" + if connectedClients == 0 + logger.log("no clients connected, exiting") + process.exit() + else + setTimeout () -> + shutdownCleanly(signal) + , 10000 -for signal in ['SIGINT', 'SIGHUP', 'SIGQUIT', 'SIGUSR1', 'SIGUSR2', 'SIGTERM', 'SIGABRT'] - process.on signal, shutdownCleanly(signal) +forceDrain = -> + THREE_HOURS = 60 * 1000 * 60 * 3 + setTimeout( -> , + logger.log({delay_ms:THREE_HOURS}, "starting drain") + DrainManager.startDrain(io, 4) + , THREE_HOURS) + + +if Settings.drainBeforeShutdown + logger.log "drainBeforeShutdown enabled" + for signal in ['SIGINT', 'SIGHUP', 'SIGQUIT', 'SIGUSR1', 'SIGUSR2', 'SIGTERM', 'SIGABRT'] + logger.log signal: signal, "received interrupt, cleaning up" + process.on signal, -> + shutdownCleanly(signal) + forceDrain() diff --git a/services/real-time/app/coffee/ConnectedUsersManager.coffee b/services/real-time/app/coffee/ConnectedUsersManager.coffee index 38370da464..831a237356 100644 --- a/services/real-time/app/coffee/ConnectedUsersManager.coffee +++ b/services/real-time/app/coffee/ConnectedUsersManager.coffee @@ -5,8 +5,6 @@ redis = require("redis-sharelatex") rclient = redis.createClient(Settings.redis.realtime) Keys = Settings.redis.realtime.key_schema -console.log Settings.redis.realtime, "REALTIME" - ONE_HOUR_IN_S = 60 * 60 ONE_DAY_IN_S = ONE_HOUR_IN_S * 24 FOUR_DAYS_IN_S = ONE_DAY_IN_S * 4 diff --git a/services/real-time/app/coffee/DocumentUpdaterController.coffee b/services/real-time/app/coffee/DocumentUpdaterController.coffee index 05a70fe3a7..451dc812bc 100644 --- a/services/real-time/app/coffee/DocumentUpdaterController.coffee +++ b/services/real-time/app/coffee/DocumentUpdaterController.coffee @@ -4,8 +4,6 @@ redis = require("redis-sharelatex") rclient = redis.createClient(settings.redis.documentupdater) SafeJsonParse = require "./SafeJsonParse" -console.log "REDIS", settings.redis - MESSAGE_SIZE_LOG_LIMIT = 1024 * 1024 # 1Mb module.exports = DocumentUpdaterController = diff --git a/services/real-time/config/settings.defaults.coffee b/services/real-time/config/settings.defaults.coffee index 485789cb12..270c32aa77 100644 --- a/services/real-time/config/settings.defaults.coffee +++ b/services/real-time/config/settings.defaults.coffee @@ -40,4 +40,6 @@ module.exports = cookieName: process.env['COOKIE_NAME'] or "sharelatex.sid" - max_doc_length: 2 * 1024 * 1024 # 2mb \ No newline at end of file + max_doc_length: 2 * 1024 * 1024 # 2mb + + drainBeforeShutdown: process.env['DRAIN_BEFORE_SHUTDOWN'] or false \ No newline at end of file From 8073cdea75af81bc29bef5f084525ab1e33976f5 Mon Sep 17 00:00:00 2001 From: Henry Oswald Date: Tue, 4 Dec 2018 14:11:28 +0000 Subject: [PATCH 16/53] improve logging --- services/real-time/app.coffee | 17 ++++++++++------- .../app/coffee/ConnectedUsersManager.coffee | 1 - 2 files changed, 10 insertions(+), 8 deletions(-) diff --git a/services/real-time/app.coffee b/services/real-time/app.coffee index 20c89a2681..275667d477 100644 --- a/services/real-time/app.coffee +++ b/services/real-time/app.coffee @@ -1,5 +1,9 @@ +Metrics = require("metrics-sharelatex") +Metrics.initialize(Settings.appName or "real-time") + logger = require "logger-sharelatex" logger.initialize("real-time-sharelatex") +Metrics.event_loop.monitor(logger) express = require("express") session = require("express-session") @@ -14,9 +18,7 @@ RedisStore = require('connect-redis')(session) SessionSockets = require('session.socket.io') CookieParser = require("cookie-parser") -Metrics = require("metrics-sharelatex") -Metrics.initialize(Settings.appName or "real-time") -Metrics.event_loop.monitor(logger) + DrainManager = require("./app/js/DrainManager") @@ -84,21 +86,22 @@ Error.stackTraceLimit = 10 shutdownCleanly = (signal) -> connectedClients = io.sockets.clients()?.length - logger.log {connectedClients, signal}, "looking to shut down process" if connectedClients == 0 logger.log("no clients connected, exiting") process.exit() else + logger.log {connectedClients}, "clients still connected, not shutting down yet" setTimeout () -> shutdownCleanly(signal) , 10000 forceDrain = -> THREE_HOURS = 60 * 1000 * 60 * 3 - setTimeout( -> , - logger.log({delay_ms:THREE_HOURS}, "starting drain") + logger.log {delay_ms:THREE_HOURS}, "starting force drain after timeout" + setTimeout ()-> + logger.log "starting drain" DrainManager.startDrain(io, 4) - , THREE_HOURS) + , THREE_HOURS if Settings.drainBeforeShutdown diff --git a/services/real-time/app/coffee/ConnectedUsersManager.coffee b/services/real-time/app/coffee/ConnectedUsersManager.coffee index 831a237356..fe7d7efb85 100644 --- a/services/real-time/app/coffee/ConnectedUsersManager.coffee +++ b/services/real-time/app/coffee/ConnectedUsersManager.coffee @@ -12,7 +12,6 @@ FOUR_DAYS_IN_S = ONE_DAY_IN_S * 4 USER_TIMEOUT_IN_S = ONE_HOUR_IN_S / 4 module.exports = - # Use the same method for when a user connects, and when a user sends a cursor # update. This way we don't care if the connected_user key has expired when # we receive a cursor update. From 2418e5db574505143c50e1993b116b3b22831e26 Mon Sep 17 00:00:00 2001 From: Henry Oswald Date: Tue, 4 Dec 2018 14:21:05 +0000 Subject: [PATCH 17/53] use delayExitUntilDrained --- services/real-time/app.coffee | 4 ++-- services/real-time/config/settings.defaults.coffee | 2 +- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/services/real-time/app.coffee b/services/real-time/app.coffee index 275667d477..d3ee470a8e 100644 --- a/services/real-time/app.coffee +++ b/services/real-time/app.coffee @@ -1,4 +1,5 @@ Metrics = require("metrics-sharelatex") +Settings = require "settings-sharelatex" Metrics.initialize(Settings.appName or "real-time") logger = require "logger-sharelatex" @@ -8,7 +9,6 @@ Metrics.event_loop.monitor(logger) express = require("express") session = require("express-session") redis = require("redis-sharelatex") -Settings = require "settings-sharelatex" if Settings.sentry?.dsn? logger.initializeErrorReporting(Settings.sentry.dsn) @@ -104,7 +104,7 @@ forceDrain = -> , THREE_HOURS -if Settings.drainBeforeShutdown +if Settings.delayExitUntilDrained logger.log "drainBeforeShutdown enabled" for signal in ['SIGINT', 'SIGHUP', 'SIGQUIT', 'SIGUSR1', 'SIGUSR2', 'SIGTERM', 'SIGABRT'] logger.log signal: signal, "received interrupt, cleaning up" diff --git a/services/real-time/config/settings.defaults.coffee b/services/real-time/config/settings.defaults.coffee index 270c32aa77..75f86db306 100644 --- a/services/real-time/config/settings.defaults.coffee +++ b/services/real-time/config/settings.defaults.coffee @@ -42,4 +42,4 @@ module.exports = max_doc_length: 2 * 1024 * 1024 # 2mb - drainBeforeShutdown: process.env['DRAIN_BEFORE_SHUTDOWN'] or false \ No newline at end of file + delayExitUntilDrained: process.env['DELAY_EXIT_UNTIL_DRAINED'] or false \ No newline at end of file From 05611de15e13775c9890a3a0c6e2a1c31f69f8bb Mon Sep 17 00:00:00 2001 From: Henry Oswald Date: Tue, 4 Dec 2018 14:31:07 +0000 Subject: [PATCH 18/53] use FORCE_DRAIN_MS_DELAY --- services/real-time/app.coffee | 9 ++++----- services/real-time/config/settings.defaults.coffee | 2 +- 2 files changed, 5 insertions(+), 6 deletions(-) diff --git a/services/real-time/app.coffee b/services/real-time/app.coffee index d3ee470a8e..17d2d5bcf9 100644 --- a/services/real-time/app.coffee +++ b/services/real-time/app.coffee @@ -96,15 +96,14 @@ shutdownCleanly = (signal) -> , 10000 forceDrain = -> - THREE_HOURS = 60 * 1000 * 60 * 3 - logger.log {delay_ms:THREE_HOURS}, "starting force drain after timeout" + forceDrainMsDelay = parseInt(Settings.forceDrainMsDelay, 10) + logger.log {delay_ms:forceDrainMsDelay}, "starting force drain after timeout" setTimeout ()-> logger.log "starting drain" DrainManager.startDrain(io, 4) - , THREE_HOURS + , Settings.forceDrainMsDelay - -if Settings.delayExitUntilDrained +if Settings.forceDrainMsDelay? logger.log "drainBeforeShutdown enabled" for signal in ['SIGINT', 'SIGHUP', 'SIGQUIT', 'SIGUSR1', 'SIGUSR2', 'SIGTERM', 'SIGABRT'] logger.log signal: signal, "received interrupt, cleaning up" diff --git a/services/real-time/config/settings.defaults.coffee b/services/real-time/config/settings.defaults.coffee index 75f86db306..8eac78da5a 100644 --- a/services/real-time/config/settings.defaults.coffee +++ b/services/real-time/config/settings.defaults.coffee @@ -42,4 +42,4 @@ module.exports = max_doc_length: 2 * 1024 * 1024 # 2mb - delayExitUntilDrained: process.env['DELAY_EXIT_UNTIL_DRAINED'] or false \ No newline at end of file + forceDrainMsDelay: process.env['FORCE_DRAIN_MS_DELAY'] or false \ No newline at end of file From b834049eeb65cb01bd9d0e17cf5037ce971efa1b Mon Sep 17 00:00:00 2001 From: Henry Oswald Date: Tue, 4 Dec 2018 14:33:25 +0000 Subject: [PATCH 19/53] improve delay ms logging --- services/real-time/app.coffee | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/services/real-time/app.coffee b/services/real-time/app.coffee index 17d2d5bcf9..8d4f8ecac7 100644 --- a/services/real-time/app.coffee +++ b/services/real-time/app.coffee @@ -96,17 +96,17 @@ shutdownCleanly = (signal) -> , 10000 forceDrain = -> - forceDrainMsDelay = parseInt(Settings.forceDrainMsDelay, 10) - logger.log {delay_ms:forceDrainMsDelay}, "starting force drain after timeout" + logger.log {delay_ms:Settings.forceDrainMsDelay}, "starting force drain after timeout" setTimeout ()-> logger.log "starting drain" DrainManager.startDrain(io, 4) , Settings.forceDrainMsDelay - + if Settings.forceDrainMsDelay? - logger.log "drainBeforeShutdown enabled" + Settings.forceDrainMsDelay = parseInt(Settings.forceDrainMsDelay, 10) + logger.log forceDrainMsDelay: Settings.forceDrainMsDelay,"forceDrainMsDelay enabled" for signal in ['SIGINT', 'SIGHUP', 'SIGQUIT', 'SIGUSR1', 'SIGUSR2', 'SIGTERM', 'SIGABRT'] - logger.log signal: signal, "received interrupt, cleaning up" process.on signal, -> + logger.log signal: signal, "received interrupt, cleaning up" shutdownCleanly(signal) forceDrain() From 258617fbd4d85bb290b658d167ec9a2d122f61d2 Mon Sep 17 00:00:00 2001 From: Henry Oswald Date: Tue, 4 Dec 2018 15:58:42 +0000 Subject: [PATCH 20/53] bump metrics --- services/real-time/npm-shrinkwrap.json | 167 ++++++++++++++++++++++++- services/real-time/package.json | 2 +- 2 files changed, 165 insertions(+), 4 deletions(-) diff --git a/services/real-time/npm-shrinkwrap.json b/services/real-time/npm-shrinkwrap.json index 1da4679f14..8050f90cc7 100644 --- a/services/real-time/npm-shrinkwrap.json +++ b/services/real-time/npm-shrinkwrap.json @@ -177,6 +177,12 @@ "resolved": "https://registry.npmjs.org/assert-plus/-/assert-plus-0.1.5.tgz", "optional": true }, + "assertion-error": { + "version": "1.0.0", + "from": "assertion-error@1.0.0", + "resolved": "https://registry.npmjs.org/assertion-error/-/assertion-error-1.0.0.tgz", + "dev": true + }, "async": { "version": "0.9.2", "from": "async@>=0.9.0 <0.10.0", @@ -203,6 +209,12 @@ "from": "balanced-match@^1.0.0", "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.0.tgz" }, + "base64-url": { + "version": "1.2.1", + "from": "base64-url@1.2.1", + "resolved": "https://registry.npmjs.org/base64-url/-/base64-url-1.2.1.tgz", + "dev": true + }, "base64id": { "version": "0.1.0", "from": "base64id@0.1.0", @@ -243,6 +255,12 @@ "from": "brace-expansion@^1.1.7", "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz" }, + "browser-stdout": { + "version": "1.3.0", + "from": "browser-stdout@1.3.0", + "resolved": "https://registry.npmjs.org/browser-stdout/-/browser-stdout-1.3.0.tgz", + "dev": true + }, "buffer-equal-constant-time": { "version": "1.0.1", "from": "buffer-equal-constant-time@1.0.1", @@ -253,11 +271,35 @@ "from": "builtin-modules@>=3.0.0 <4.0.0", "resolved": "https://registry.npmjs.org/builtin-modules/-/builtin-modules-3.0.0.tgz" }, + "bunyan": { + "version": "0.22.3", + "from": "bunyan@>=0.22.3 <0.23.0", + "resolved": "https://registry.npmjs.org/bunyan/-/bunyan-0.22.3.tgz", + "dev": true + }, + "buster-core": { + "version": "0.6.4", + "from": "buster-core@0.6.4", + "resolved": "https://registry.npmjs.org/buster-core/-/buster-core-0.6.4.tgz", + "dev": true + }, + "buster-format": { + "version": "0.5.6", + "from": "buster-format@>=0.5.0 <0.6.0", + "resolved": "https://registry.npmjs.org/buster-format/-/buster-format-0.5.6.tgz", + "dev": true + }, "bytes": { "version": "3.0.0", "from": "bytes@3.0.0", "resolved": "https://registry.npmjs.org/bytes/-/bytes-3.0.0.tgz" }, + "chai": { + "version": "1.9.2", + "from": "chai@>=1.9.1 <1.10.0", + "resolved": "https://registry.npmjs.org/chai/-/chai-1.9.2.tgz", + "dev": true + }, "chalk": { "version": "0.5.1", "from": "chalk@>=0.5.0 <0.6.0", @@ -378,6 +420,12 @@ "from": "debug@2.6.9", "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz" }, + "deep-eql": { + "version": "0.1.3", + "from": "deep-eql@0.1.3", + "resolved": "https://registry.npmjs.org/deep-eql/-/deep-eql-0.1.3.tgz", + "dev": true + }, "define-properties": { "version": "1.1.3", "from": "define-properties@>=1.1.2 <2.0.0", @@ -409,6 +457,13 @@ "from": "diff@1.0.7", "resolved": "https://registry.npmjs.org/diff/-/diff-1.0.7.tgz" }, + "dtrace-provider": { + "version": "0.2.8", + "from": "dtrace-provider@0.2.8", + "resolved": "https://registry.npmjs.org/dtrace-provider/-/dtrace-provider-0.2.8.tgz", + "dev": true, + "optional": true + }, "duplexify": { "version": "3.6.1", "from": "duplexify@>=3.6.0 <4.0.0", @@ -657,6 +712,12 @@ } } }, + "fs.realpath": { + "version": "1.0.0", + "from": "fs.realpath@>=1.0.0 <2.0.0", + "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz", + "dev": true + }, "function-bind": { "version": "1.1.1", "from": "function-bind@>=1.1.1 <2.0.0", @@ -935,6 +996,12 @@ "resolved": "https://registry.npmjs.org/hawk/-/hawk-1.0.0.tgz", "optional": true }, + "he": { + "version": "1.1.1", + "from": "he@1.1.1", + "resolved": "https://registry.npmjs.org/he/-/he-1.1.1.tgz", + "dev": true + }, "hex2dec": { "version": "1.1.1", "from": "hex2dec@>=1.0.1 <2.0.0", @@ -1291,9 +1358,9 @@ "resolved": "https://registry.npmjs.org/methods/-/methods-1.1.2.tgz" }, "metrics-sharelatex": { - "version": "2.0.4", - "from": "git+https://github.com/sharelatex/metrics-sharelatex.git#v2.0.4", - "resolved": "git+https://github.com/sharelatex/metrics-sharelatex.git#49c4bc072f707eb6252adfec540268dfbea1615b", + "version": "2.0.5", + "from": "git+https://github.com/sharelatex/metrics-sharelatex.git#v2.0.5", + "resolved": "git+https://github.com/sharelatex/metrics-sharelatex.git#e5acf25978395e3e0b0333c8b2a047e06435df79", "dependencies": { "coffee-script": { "version": "1.6.0", @@ -1337,6 +1404,56 @@ "from": "mkdirp@~0.5.1", "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.1.tgz" }, + "mocha": { + "version": "4.1.0", + "from": "mocha@>=4.0.1 <5.0.0", + "resolved": "https://registry.npmjs.org/mocha/-/mocha-4.1.0.tgz", + "dev": true, + "dependencies": { + "commander": { + "version": "2.11.0", + "from": "commander@2.11.0", + "resolved": "https://registry.npmjs.org/commander/-/commander-2.11.0.tgz", + "dev": true + }, + "debug": { + "version": "3.1.0", + "from": "debug@3.1.0", + "resolved": "https://registry.npmjs.org/debug/-/debug-3.1.0.tgz", + "dev": true + }, + "diff": { + "version": "3.3.1", + "from": "diff@3.3.1", + "resolved": "https://registry.npmjs.org/diff/-/diff-3.3.1.tgz", + "dev": true + }, + "glob": { + "version": "7.1.2", + "from": "glob@7.1.2", + "resolved": "https://registry.npmjs.org/glob/-/glob-7.1.2.tgz", + "dev": true + }, + "growl": { + "version": "1.10.3", + "from": "growl@1.10.3", + "resolved": "https://registry.npmjs.org/growl/-/growl-1.10.3.tgz", + "dev": true + }, + "has-flag": { + "version": "2.0.0", + "from": "has-flag@>=2.0.0 <3.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-2.0.0.tgz", + "dev": true + }, + "supports-color": { + "version": "4.4.0", + "from": "supports-color@4.4.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-4.4.0.tgz", + "dev": true + } + } + }, "module-details-from-path": { "version": "1.0.3", "from": "module-details-from-path@>=1.0.3 <2.0.0", @@ -1359,6 +1476,12 @@ "resolved": "https://registry.npmjs.org/nan/-/nan-2.10.0.tgz", "optional": true }, + "native-or-bluebird": { + "version": "1.1.2", + "from": "native-or-bluebird@>=1.1.2 <1.2.0", + "resolved": "https://registry.npmjs.org/native-or-bluebird/-/native-or-bluebird-1.1.2.tgz", + "dev": true + }, "ncp": { "version": "2.0.0", "from": "ncp@~2.0.0", @@ -1673,6 +1796,20 @@ "from": "samsam@1.3.0", "resolved": "https://registry.npmjs.org/samsam/-/samsam-1.3.0.tgz" }, + "sandboxed-module": { + "version": "0.3.0", + "from": "sandboxed-module@>=0.3.0 <0.4.0", + "resolved": "https://registry.npmjs.org/sandboxed-module/-/sandboxed-module-0.3.0.tgz", + "dev": true, + "dependencies": { + "stack-trace": { + "version": "0.0.6", + "from": "stack-trace@0.0.6", + "resolved": "https://registry.npmjs.org/stack-trace/-/stack-trace-0.0.6.tgz", + "dev": true + } + } + }, "semver": { "version": "5.6.0", "from": "semver@>=5.5.0 <6.0.0", @@ -1727,6 +1864,12 @@ "from": "sigmund@>=1.0.0 <1.1.0", "resolved": "https://registry.npmjs.org/sigmund/-/sigmund-1.0.1.tgz" }, + "sinon": { + "version": "1.5.2", + "from": "sinon@>=1.5.2 <1.6.0", + "resolved": "https://registry.npmjs.org/sinon/-/sinon-1.5.2.tgz", + "dev": true + }, "sntp": { "version": "0.2.4", "from": "sntp@>=0.2.0 <0.3.0", @@ -1833,6 +1976,12 @@ "from": "through2@>=2.0.3 <3.0.0", "resolved": "https://registry.npmjs.org/through2/-/through2-2.0.5.tgz" }, + "timekeeper": { + "version": "0.0.4", + "from": "timekeeper@0.0.4", + "resolved": "https://registry.npmjs.org/timekeeper/-/timekeeper-0.0.4.tgz", + "dev": true + }, "tinycolor": { "version": "0.0.1", "from": "tinycolor@>=0.0.0 <1.0.0", @@ -1850,6 +1999,12 @@ "resolved": "https://registry.npmjs.org/tunnel-agent/-/tunnel-agent-0.3.0.tgz", "optional": true }, + "type-detect": { + "version": "0.1.1", + "from": "type-detect@0.1.1", + "resolved": "https://registry.npmjs.org/type-detect/-/type-detect-0.1.1.tgz", + "dev": true + }, "type-is": { "version": "1.6.16", "from": "type-is@>=1.6.16 <1.7.0", @@ -1860,6 +2015,12 @@ "from": "uglify-js@1.2.5", "resolved": "https://registry.npmjs.org/uglify-js/-/uglify-js-1.2.5.tgz" }, + "uid-safe": { + "version": "1.1.0", + "from": "uid-safe@>=1.0.1 <2.0.0", + "resolved": "https://registry.npmjs.org/uid-safe/-/uid-safe-1.1.0.tgz", + "dev": true + }, "underscore": { "version": "1.7.0", "from": "underscore@>=1.7.0 <1.8.0", diff --git a/services/real-time/package.json b/services/real-time/package.json index a2466ea67f..a606f51b24 100644 --- a/services/real-time/package.json +++ b/services/real-time/package.json @@ -29,7 +29,7 @@ "express": "^4.10.1", "express-session": "^1.9.1", "logger-sharelatex": "git+https://github.com/sharelatex/logger-sharelatex.git#v1.5.6", - "metrics-sharelatex": "git+https://github.com/sharelatex/metrics-sharelatex.git#v2.0.4", + "metrics-sharelatex": "git+https://github.com/sharelatex/metrics-sharelatex.git#v2.0.5", "redis-sharelatex": "git+https://github.com/sharelatex/redis-sharelatex.git#v1.0.4", "request": "~2.34.0", "session.socket.io": "^0.1.6", From 78b779a33801c69bdd632b5557171c939c585ac6 Mon Sep 17 00:00:00 2001 From: Henry Oswald Date: Tue, 4 Dec 2018 16:10:03 +0000 Subject: [PATCH 21/53] try different metrics --- services/real-time/npm-shrinkwrap.json | 6 +++--- services/real-time/package.json | 2 +- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/services/real-time/npm-shrinkwrap.json b/services/real-time/npm-shrinkwrap.json index 8050f90cc7..4bb3cd93f9 100644 --- a/services/real-time/npm-shrinkwrap.json +++ b/services/real-time/npm-shrinkwrap.json @@ -1358,9 +1358,9 @@ "resolved": "https://registry.npmjs.org/methods/-/methods-1.1.2.tgz" }, "metrics-sharelatex": { - "version": "2.0.5", - "from": "git+https://github.com/sharelatex/metrics-sharelatex.git#v2.0.5", - "resolved": "git+https://github.com/sharelatex/metrics-sharelatex.git#e5acf25978395e3e0b0333c8b2a047e06435df79", + "version": "66a57435e602ba5cfff15b50085389fb715907a1", + "from": "git+https://github.com/sharelatex/metrics-sharelatex.git#66a57435e602ba5cfff15b50085389fb715907a1", + "resolved": "git+https://github.com/sharelatex/metrics-sharelatex.git#66a57435e602ba5cfff15b50085389fb715907a1", "dependencies": { "coffee-script": { "version": "1.6.0", diff --git a/services/real-time/package.json b/services/real-time/package.json index a606f51b24..ed75887829 100644 --- a/services/real-time/package.json +++ b/services/real-time/package.json @@ -29,7 +29,7 @@ "express": "^4.10.1", "express-session": "^1.9.1", "logger-sharelatex": "git+https://github.com/sharelatex/logger-sharelatex.git#v1.5.6", - "metrics-sharelatex": "git+https://github.com/sharelatex/metrics-sharelatex.git#v2.0.5", + "metrics-sharelatex": "git+https://github.com/sharelatex/metrics-sharelatex.git#66a57435e602ba5cfff15b50085389fb715907a1", "redis-sharelatex": "git+https://github.com/sharelatex/redis-sharelatex.git#v1.0.4", "request": "~2.34.0", "session.socket.io": "^0.1.6", From cdf605e17117375b67129b7e4cb044250a7c5681 Mon Sep 17 00:00:00 2001 From: Henry Oswald Date: Wed, 5 Dec 2018 14:01:15 +0000 Subject: [PATCH 22/53] inject metrics root and bump lib to 2.0.8 --- services/real-time/app.coffee | 2 ++ services/real-time/npm-shrinkwrap.json | 6 +++--- services/real-time/package.json | 2 +- 3 files changed, 6 insertions(+), 4 deletions(-) diff --git a/services/real-time/app.coffee b/services/real-time/app.coffee index 8d4f8ecac7..94b5594920 100644 --- a/services/real-time/app.coffee +++ b/services/real-time/app.coffee @@ -64,6 +64,8 @@ app.get "/health_check/redis", (req, res, next) -> else res.sendStatus 200 +Metrics.injectMetricsRoute(app) + Router = require "./app/js/Router" Router.configure(app, io, sessionSockets) diff --git a/services/real-time/npm-shrinkwrap.json b/services/real-time/npm-shrinkwrap.json index 4bb3cd93f9..6773b54cf1 100644 --- a/services/real-time/npm-shrinkwrap.json +++ b/services/real-time/npm-shrinkwrap.json @@ -1358,9 +1358,9 @@ "resolved": "https://registry.npmjs.org/methods/-/methods-1.1.2.tgz" }, "metrics-sharelatex": { - "version": "66a57435e602ba5cfff15b50085389fb715907a1", - "from": "git+https://github.com/sharelatex/metrics-sharelatex.git#66a57435e602ba5cfff15b50085389fb715907a1", - "resolved": "git+https://github.com/sharelatex/metrics-sharelatex.git#66a57435e602ba5cfff15b50085389fb715907a1", + "version": "2.0.8", + "from": "git+https://github.com/sharelatex/metrics-sharelatex.git#v2.0.8", + "resolved": "git+https://github.com/sharelatex/metrics-sharelatex.git#a56855e935e4e361166706091cf33f252eb0cd24", "dependencies": { "coffee-script": { "version": "1.6.0", diff --git a/services/real-time/package.json b/services/real-time/package.json index ed75887829..7a842e1b51 100644 --- a/services/real-time/package.json +++ b/services/real-time/package.json @@ -29,7 +29,7 @@ "express": "^4.10.1", "express-session": "^1.9.1", "logger-sharelatex": "git+https://github.com/sharelatex/logger-sharelatex.git#v1.5.6", - "metrics-sharelatex": "git+https://github.com/sharelatex/metrics-sharelatex.git#66a57435e602ba5cfff15b50085389fb715907a1", + "metrics-sharelatex": "git+https://github.com/sharelatex/metrics-sharelatex.git#v2.0.8", "redis-sharelatex": "git+https://github.com/sharelatex/redis-sharelatex.git#v1.0.4", "request": "~2.34.0", "session.socket.io": "^0.1.6", From 5ad7482385e162657728e6bf5ed8f14e7ec208d2 Mon Sep 17 00:00:00 2001 From: Henry Oswald Date: Wed, 5 Dec 2018 14:42:16 +0000 Subject: [PATCH 23/53] update config to take explicit redis configs --- .../real-time/config/settings.defaults.coffee | 18 +++++++++--------- 1 file changed, 9 insertions(+), 9 deletions(-) diff --git a/services/real-time/config/settings.defaults.coffee b/services/real-time/config/settings.defaults.coffee index bbe493956f..7839278b9e 100644 --- a/services/real-time/config/settings.defaults.coffee +++ b/services/real-time/config/settings.defaults.coffee @@ -1,24 +1,24 @@ module.exports = redis: realtime: - host: process.env['REDIS_HOST'] or "localhost" - port: process.env['REDIS_PORT'] or "6379" - password: process.env["REDIS_PASSWORD"] or "" + host: process.env['REAL_TIME_REDIS_HOST'] or process.env['REDIS_HOST'] or "localhost" + port: process.env['REAL_TIME_REDIS_PORT'] or process.env['REDIS_PORT'] or "6379" + password: process.env["REAL_TIME_REDIS_PASSWORD"] or process.env["REDIS_PASSWORD"] or "" key_schema: clientsInProject: ({project_id}) -> "clients_in_project:#{project_id}" connectedUser: ({project_id, client_id})-> "connected_user:#{project_id}:#{client_id}" documentupdater: - host: process.env['REDIS_HOST'] or "localhost" - port: process.env['REDIS_PORT'] or "6379" - password: process.env["REDIS_PASSWORD"] or "" + host: process.env['DOC_UPDATER_REDIS_HOST'] or process.env['REDIS_HOST'] or "localhost" + port: process.env['DOC_UPDATER_REDIS_PORT'] or process.env['REDIS_PORT'] or "6379" + password: process.env["DOC_UPDATER_REDIS_PASSWORD"] or process.env["REDIS_PASSWORD"] or "" key_schema: pendingUpdates: ({doc_id}) -> "PendingUpdates:#{doc_id}" websessions: - host: process.env['REDIS_HOST'] or "localhost" - port: process.env['REDIS_PORT'] or "6379" - password: process.env["REDIS_PASSWORD"] or "" + host: process.env['WEB_REDIS_HOST'] or process.env['REDIS_HOST'] or "localhost" + port: process.env['WEB_REDIS_PORT'] or process.env['REDIS_PORT'] or "6379" + password: process.env["WEB_REDIS_PASSWORD"] or process.env["REDIS_PASSWORD"] or "" internal: realTime: From d4e8bc1d4bde42ec80b4151c887c07498058a287 Mon Sep 17 00:00:00 2001 From: Henry Oswald Date: Wed, 5 Dec 2018 15:29:23 +0000 Subject: [PATCH 24/53] remove metrics.set as we don't support it atm --- services/real-time/app/coffee/WebsocketController.coffee | 2 -- 1 file changed, 2 deletions(-) diff --git a/services/real-time/app/coffee/WebsocketController.coffee b/services/real-time/app/coffee/WebsocketController.coffee index b51e86c495..356f757ffb 100644 --- a/services/real-time/app/coffee/WebsocketController.coffee +++ b/services/real-time/app/coffee/WebsocketController.coffee @@ -197,8 +197,6 @@ module.exports = WebsocketController = update.meta.source = client.id update.meta.user_id = user_id metrics.inc "editor.doc-update", 0.3 - metrics.set "editor.active-projects", project_id, 0.3 - metrics.set "editor.active-users", user_id, 0.3 logger.log {user_id, doc_id, project_id, client_id: client.id, version: update.v}, "sending update to doc updater" From 7a7f1aed91583116eb04d0ca0b8c27cd1b9386bc Mon Sep 17 00:00:00 2001 From: Henry Oswald Date: Wed, 5 Dec 2018 15:39:27 +0000 Subject: [PATCH 25/53] remove console.log --- services/real-time/app.coffee | 1 - 1 file changed, 1 deletion(-) diff --git a/services/real-time/app.coffee b/services/real-time/app.coffee index 94b5594920..334d267945 100644 --- a/services/real-time/app.coffee +++ b/services/real-time/app.coffee @@ -52,7 +52,6 @@ app.get "/", (req, res, next) -> res.send "real-time-sharelatex is alive" app.get "/status", (req, res, next) -> - console.log("got status", req.query, io.sockets.clients()?.length) res.send "real-time-sharelatex is alive" rclient = require("redis-sharelatex").createClient(Settings.redis.realtime) From bbd88e75eb6d83fbbb3e3a11395c197c74cdcca3 Mon Sep 17 00:00:00 2001 From: Henry Oswald Date: Wed, 5 Dec 2018 15:41:12 +0000 Subject: [PATCH 26/53] fix broken tests --- .../test/unit/coffee/WebsocketControllerTests.coffee | 6 ------ 1 file changed, 6 deletions(-) diff --git a/services/real-time/test/unit/coffee/WebsocketControllerTests.coffee b/services/real-time/test/unit/coffee/WebsocketControllerTests.coffee index b6a4069c67..9621589d26 100644 --- a/services/real-time/test/unit/coffee/WebsocketControllerTests.coffee +++ b/services/real-time/test/unit/coffee/WebsocketControllerTests.coffee @@ -559,12 +559,6 @@ describe 'WebsocketController', -> it "should call the callback", -> @callback.called.should.equal true - - it "should update the active users metric", -> - @metrics.set.calledWith("editor.active-users", @user_id).should.equal true - - it "should update the active projects metric", -> - @metrics.set.calledWith("editor.active-projects", @project_id).should.equal true it "should increment the doc updates", -> @metrics.inc.calledWith("editor.doc-update").should.equal true From cd362f22be4111c506a5efb2b9a58edd1f6aa7a3 Mon Sep 17 00:00:00 2001 From: Christopher Hoskin Date: Thu, 3 Jan 2019 16:17:31 +0000 Subject: [PATCH 27/53] Move to v2 metrics --- services/real-time/app.coffee | 1 + services/real-time/npm-shrinkwrap.json | 331 ++++++++++++++----------- services/real-time/package.json | 2 +- 3 files changed, 184 insertions(+), 150 deletions(-) diff --git a/services/real-time/app.coffee b/services/real-time/app.coffee index 334d267945..931e9e42d3 100644 --- a/services/real-time/app.coffee +++ b/services/real-time/app.coffee @@ -25,6 +25,7 @@ DrainManager = require("./app/js/DrainManager") # Set up socket.io server app = express() +Metrics.injectMetricsRoute(app) server = require('http').createServer(app) io = require('socket.io').listen(server) diff --git a/services/real-time/npm-shrinkwrap.json b/services/real-time/npm-shrinkwrap.json index 6773b54cf1..2374262396 100644 --- a/services/real-time/npm-shrinkwrap.json +++ b/services/real-time/npm-shrinkwrap.json @@ -3,24 +3,41 @@ "version": "0.1.4", "dependencies": { "@google-cloud/common": { - "version": "0.23.0", - "from": "@google-cloud/common@>=0.23.0 <0.24.0", - "resolved": "https://registry.npmjs.org/@google-cloud/common/-/common-0.23.0.tgz" + "version": "0.27.0", + "from": "@google-cloud/common@>=0.27.0 <0.28.0", + "resolved": "https://registry.npmjs.org/@google-cloud/common/-/common-0.27.0.tgz" }, "@google-cloud/debug-agent": { - "version": "3.0.0", + "version": "3.0.1", "from": "@google-cloud/debug-agent@>=3.0.0 <4.0.0", - "resolved": "https://registry.npmjs.org/@google-cloud/debug-agent/-/debug-agent-3.0.0.tgz", + "resolved": "https://registry.npmjs.org/@google-cloud/debug-agent/-/debug-agent-3.0.1.tgz", "dependencies": { "coffeescript": { "version": "2.3.2", "from": "coffeescript@>=2.0.0 <3.0.0", "resolved": "https://registry.npmjs.org/coffeescript/-/coffeescript-2.3.2.tgz" + } + } + }, + "@google-cloud/profiler": { + "version": "0.2.3", + "from": "@google-cloud/profiler@>=0.2.3 <0.3.0", + "resolved": "https://registry.npmjs.org/@google-cloud/profiler/-/profiler-0.2.3.tgz", + "dependencies": { + "@google-cloud/common": { + "version": "0.26.2", + "from": "@google-cloud/common@>=0.26.0 <0.27.0", + "resolved": "https://registry.npmjs.org/@google-cloud/common/-/common-0.26.2.tgz" }, - "lodash": { - "version": "4.17.11", - "from": "lodash@>=4.12.0 <5.0.0", - "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.11.tgz" + "nan": { + "version": "2.12.1", + "from": "nan@>=2.11.1 <3.0.0", + "resolved": "https://registry.npmjs.org/nan/-/nan-2.12.1.tgz" + }, + "through2": { + "version": "3.0.0", + "from": "through2@>=3.0.0 <4.0.0", + "resolved": "https://registry.npmjs.org/through2/-/through2-3.0.0.tgz" } } }, @@ -35,36 +52,14 @@ "resolved": "https://registry.npmjs.org/@google-cloud/promisify/-/promisify-0.3.1.tgz" }, "@google-cloud/trace-agent": { - "version": "3.4.0", + "version": "3.5.0", "from": "@google-cloud/trace-agent@>=3.2.0 <4.0.0", - "resolved": "https://registry.npmjs.org/@google-cloud/trace-agent/-/trace-agent-3.4.0.tgz", + "resolved": "https://registry.npmjs.org/@google-cloud/trace-agent/-/trace-agent-3.5.0.tgz", "dependencies": { "@google-cloud/common": { - "version": "0.27.0", - "from": "@google-cloud/common@>=0.27.0 <0.28.0", - "resolved": "https://registry.npmjs.org/@google-cloud/common/-/common-0.27.0.tgz" - }, - "gcp-metadata": { - "version": "0.9.0", - "from": "gcp-metadata@>=0.9.0 <0.10.0", - "resolved": "https://registry.npmjs.org/gcp-metadata/-/gcp-metadata-0.9.0.tgz" - }, - "google-auth-library": { - "version": "2.0.1", - "from": "google-auth-library@>=2.0.0 <3.0.0", - "resolved": "https://registry.npmjs.org/google-auth-library/-/google-auth-library-2.0.1.tgz", - "dependencies": { - "gcp-metadata": { - "version": "0.7.0", - "from": "gcp-metadata@^0.7.0", - "resolved": "https://registry.npmjs.org/gcp-metadata/-/gcp-metadata-0.7.0.tgz" - } - } - }, - "lru-cache": { - "version": "4.1.5", - "from": "lru-cache@^4.1.3", - "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-4.1.5.tgz" + "version": "0.28.0", + "from": "@google-cloud/common@>=0.28.0 <0.29.0", + "resolved": "https://registry.npmjs.org/@google-cloud/common/-/common-0.28.0.tgz" }, "uuid": { "version": "3.3.2", @@ -73,6 +68,61 @@ } } }, + "@protobufjs/aspromise": { + "version": "1.1.2", + "from": "@protobufjs/aspromise@>=1.1.2 <2.0.0", + "resolved": "https://registry.npmjs.org/@protobufjs/aspromise/-/aspromise-1.1.2.tgz" + }, + "@protobufjs/base64": { + "version": "1.1.2", + "from": "@protobufjs/base64@>=1.1.2 <2.0.0", + "resolved": "https://registry.npmjs.org/@protobufjs/base64/-/base64-1.1.2.tgz" + }, + "@protobufjs/codegen": { + "version": "2.0.4", + "from": "@protobufjs/codegen@>=2.0.4 <3.0.0", + "resolved": "https://registry.npmjs.org/@protobufjs/codegen/-/codegen-2.0.4.tgz" + }, + "@protobufjs/eventemitter": { + "version": "1.1.0", + "from": "@protobufjs/eventemitter@>=1.1.0 <2.0.0", + "resolved": "https://registry.npmjs.org/@protobufjs/eventemitter/-/eventemitter-1.1.0.tgz" + }, + "@protobufjs/fetch": { + "version": "1.1.0", + "from": "@protobufjs/fetch@>=1.1.0 <2.0.0", + "resolved": "https://registry.npmjs.org/@protobufjs/fetch/-/fetch-1.1.0.tgz" + }, + "@protobufjs/float": { + "version": "1.0.2", + "from": "@protobufjs/float@>=1.0.2 <2.0.0", + "resolved": "https://registry.npmjs.org/@protobufjs/float/-/float-1.0.2.tgz" + }, + "@protobufjs/inquire": { + "version": "1.1.0", + "from": "@protobufjs/inquire@>=1.1.0 <2.0.0", + "resolved": "https://registry.npmjs.org/@protobufjs/inquire/-/inquire-1.1.0.tgz" + }, + "@protobufjs/path": { + "version": "1.1.2", + "from": "@protobufjs/path@>=1.1.2 <2.0.0", + "resolved": "https://registry.npmjs.org/@protobufjs/path/-/path-1.1.2.tgz" + }, + "@protobufjs/pool": { + "version": "1.1.0", + "from": "@protobufjs/pool@>=1.1.0 <2.0.0", + "resolved": "https://registry.npmjs.org/@protobufjs/pool/-/pool-1.1.0.tgz" + }, + "@protobufjs/utf8": { + "version": "1.1.0", + "from": "@protobufjs/utf8@>=1.1.0 <2.0.0", + "resolved": "https://registry.npmjs.org/@protobufjs/utf8/-/utf8-1.1.0.tgz" + }, + "@sindresorhus/is": { + "version": "0.13.0", + "from": "@sindresorhus/is@>=0.13.0 <0.14.0", + "resolved": "https://registry.npmjs.org/@sindresorhus/is/-/is-0.13.0.tgz" + }, "@sinonjs/formatio": { "version": "2.0.0", "from": "@sinonjs/formatio@>=2.0.0 <3.0.0", @@ -83,6 +133,11 @@ "from": "@types/caseless@*", "resolved": "https://registry.npmjs.org/@types/caseless/-/caseless-0.12.1.tgz" }, + "@types/console-log-level": { + "version": "1.4.0", + "from": "@types/console-log-level@>=1.4.0 <2.0.0", + "resolved": "https://registry.npmjs.org/@types/console-log-level/-/console-log-level-1.4.0.tgz" + }, "@types/duplexify": { "version": "3.6.0", "from": "@types/duplexify@>=3.5.0 <4.0.0", @@ -93,16 +148,26 @@ "from": "@types/form-data@*", "resolved": "https://registry.npmjs.org/@types/form-data/-/form-data-2.2.1.tgz" }, + "@types/long": { + "version": "4.0.0", + "from": "@types/long@>=4.0.0 <5.0.0", + "resolved": "https://registry.npmjs.org/@types/long/-/long-4.0.0.tgz" + }, "@types/node": { - "version": "10.12.12", + "version": "10.12.18", "from": "@types/node@*", - "resolved": "https://registry.npmjs.org/@types/node/-/node-10.12.12.tgz" + "resolved": "https://registry.npmjs.org/@types/node/-/node-10.12.18.tgz" }, "@types/request": { "version": "2.48.1", "from": "@types/request@>=2.47.0 <3.0.0", "resolved": "https://registry.npmjs.org/@types/request/-/request-2.48.1.tgz" }, + "@types/semver": { + "version": "5.5.0", + "from": "@types/semver@>=5.5.0 <6.0.0", + "resolved": "https://registry.npmjs.org/@types/semver/-/semver-5.5.0.tgz" + }, "@types/tough-cookie": { "version": "2.3.4", "from": "@types/tough-cookie@*", @@ -230,6 +295,11 @@ "from": "bignumber.js@>=7.0.0 <8.0.0", "resolved": "https://registry.npmjs.org/bignumber.js/-/bignumber.js-7.2.1.tgz" }, + "bindings": { + "version": "1.3.1", + "from": "bindings@>=1.2.1 <2.0.0", + "resolved": "https://registry.npmjs.org/bindings/-/bindings-1.3.1.tgz" + }, "bintrees": { "version": "1.0.1", "from": "bintrees@1.0.1", @@ -426,10 +496,10 @@ "resolved": "https://registry.npmjs.org/deep-eql/-/deep-eql-0.1.3.tgz", "dev": true }, - "define-properties": { - "version": "1.1.3", - "from": "define-properties@>=1.1.2 <2.0.0", - "resolved": "https://registry.npmjs.org/define-properties/-/define-properties-1.1.3.tgz" + "delay": { + "version": "4.1.0", + "from": "delay@>=4.0.1 <5.0.0", + "resolved": "https://registry.npmjs.org/delay/-/delay-4.1.0.tgz" }, "delayed-stream": { "version": "0.0.5", @@ -499,16 +569,6 @@ "from": "ent@>=2.2.0 <3.0.0", "resolved": "https://registry.npmjs.org/ent/-/ent-2.2.0.tgz" }, - "es-abstract": { - "version": "1.12.0", - "from": "es-abstract@>=1.5.1 <2.0.0", - "resolved": "https://registry.npmjs.org/es-abstract/-/es-abstract-1.12.0.tgz" - }, - "es-to-primitive": { - "version": "1.2.0", - "from": "es-to-primitive@>=1.1.1 <2.0.0", - "resolved": "https://registry.npmjs.org/es-to-primitive/-/es-to-primitive-1.2.0.tgz" - }, "es6-promise": { "version": "4.2.5", "from": "es6-promise@>=4.0.3 <5.0.0", @@ -660,9 +720,9 @@ "resolved": "https://registry.npmjs.org/flexbuffer/-/flexbuffer-0.0.6.tgz" }, "follow-redirects": { - "version": "1.5.10", + "version": "1.6.1", "from": "follow-redirects@>=1.3.0 <2.0.0", - "resolved": "https://registry.npmjs.org/follow-redirects/-/follow-redirects-1.5.10.tgz", + "resolved": "https://registry.npmjs.org/follow-redirects/-/follow-redirects-1.6.1.tgz", "dependencies": { "debug": { "version": "3.1.0", @@ -718,15 +778,15 @@ "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz", "dev": true }, - "function-bind": { - "version": "1.1.1", - "from": "function-bind@>=1.1.1 <2.0.0", - "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.1.tgz" + "gaxios": { + "version": "1.0.4", + "from": "gaxios@>=1.0.2 <2.0.0", + "resolved": "https://registry.npmjs.org/gaxios/-/gaxios-1.0.4.tgz" }, "gcp-metadata": { - "version": "0.7.0", - "from": "gcp-metadata@>=0.7.0 <0.8.0", - "resolved": "https://registry.npmjs.org/gcp-metadata/-/gcp-metadata-0.7.0.tgz" + "version": "0.9.3", + "from": "gcp-metadata@>=0.9.0 <0.10.0", + "resolved": "https://registry.npmjs.org/gcp-metadata/-/gcp-metadata-0.9.3.tgz" }, "get-func-name": { "version": "2.0.0", @@ -744,33 +804,26 @@ "resolved": "https://registry.npmjs.org/glob/-/glob-6.0.4.tgz" }, "google-auth-library": { - "version": "1.6.1", - "from": "google-auth-library@>=1.6.0 <2.0.0", - "resolved": "https://registry.npmjs.org/google-auth-library/-/google-auth-library-1.6.1.tgz", + "version": "2.0.2", + "from": "google-auth-library@>=2.0.0 <3.0.0", + "resolved": "https://registry.npmjs.org/google-auth-library/-/google-auth-library-2.0.2.tgz", "dependencies": { "gcp-metadata": { - "version": "0.6.3", - "from": "gcp-metadata@>=0.6.3 <0.7.0", - "resolved": "https://registry.npmjs.org/gcp-metadata/-/gcp-metadata-0.6.3.tgz" + "version": "0.7.0", + "from": "gcp-metadata@>=0.7.0 <0.8.0", + "resolved": "https://registry.npmjs.org/gcp-metadata/-/gcp-metadata-0.7.0.tgz" }, "lru-cache": { - "version": "4.1.5", - "from": "lru-cache@>=4.1.3 <5.0.0", - "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-4.1.5.tgz" + "version": "5.1.1", + "from": "lru-cache@>=5.0.0 <6.0.0", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-5.1.1.tgz" } } }, "google-p12-pem": { - "version": "1.0.2", + "version": "1.0.3", "from": "google-p12-pem@>=1.0.0 <2.0.0", - "resolved": "https://registry.npmjs.org/google-p12-pem/-/google-p12-pem-1.0.2.tgz", - "dependencies": { - "pify": { - "version": "3.0.0", - "from": "pify@>=3.0.0 <4.0.0", - "resolved": "https://registry.npmjs.org/pify/-/pify-3.0.0.tgz" - } - } + "resolved": "https://registry.npmjs.org/google-p12-pem/-/google-p12-pem-1.0.3.tgz" }, "graceful-fs": { "version": "1.2.3", @@ -970,11 +1023,6 @@ } } }, - "has": { - "version": "1.0.3", - "from": "has@>=1.0.1 <2.0.0", - "resolved": "https://registry.npmjs.org/has/-/has-1.0.3.tgz" - }, "has-ansi": { "version": "0.1.0", "from": "has-ansi@>=0.1.0 <0.2.0", @@ -985,11 +1033,6 @@ "from": "has-flag@>=3.0.0 <4.0.0", "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz" }, - "has-symbols": { - "version": "1.0.0", - "from": "has-symbols@>=1.0.0 <2.0.0", - "resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.0.0.tgz" - }, "hawk": { "version": "1.0.0", "from": "hawk@>=1.0.0 <1.1.0", @@ -1071,35 +1114,15 @@ "resolved": "https://registry.npmjs.org/ipaddr.js/-/ipaddr.js-1.6.0.tgz" }, "is": { - "version": "3.2.1", - "from": "is@>=3.2.1 <4.0.0", - "resolved": "https://registry.npmjs.org/is/-/is-3.2.1.tgz" + "version": "3.3.0", + "from": "is@>=3.2.0 <4.0.0", + "resolved": "https://registry.npmjs.org/is/-/is-3.3.0.tgz" }, "is-buffer": { "version": "1.1.6", "from": "is-buffer@>=1.1.5 <2.0.0", "resolved": "https://registry.npmjs.org/is-buffer/-/is-buffer-1.1.6.tgz" }, - "is-callable": { - "version": "1.1.4", - "from": "is-callable@>=1.1.3 <2.0.0", - "resolved": "https://registry.npmjs.org/is-callable/-/is-callable-1.1.4.tgz" - }, - "is-date-object": { - "version": "1.0.1", - "from": "is-date-object@>=1.0.1 <2.0.0", - "resolved": "https://registry.npmjs.org/is-date-object/-/is-date-object-1.0.1.tgz" - }, - "is-regex": { - "version": "1.0.4", - "from": "is-regex@>=1.0.4 <2.0.0", - "resolved": "https://registry.npmjs.org/is-regex/-/is-regex-1.0.4.tgz" - }, - "is-symbol": { - "version": "1.0.2", - "from": "is-symbol@>=1.0.2 <2.0.0", - "resolved": "https://registry.npmjs.org/is-symbol/-/is-symbol-1.0.2.tgz" - }, "isarray": { "version": "0.0.1", "from": "isarray@0.0.1", @@ -1212,11 +1235,6 @@ "from": "lodash.isempty@>=4.4.0 <5.0.0", "resolved": "https://registry.npmjs.org/lodash.isempty/-/lodash.isempty-4.4.0.tgz" }, - "lodash.isstring": { - "version": "4.0.1", - "from": "lodash.isstring@>=4.0.1 <5.0.0", - "resolved": "https://registry.npmjs.org/lodash.isstring/-/lodash.isstring-4.0.1.tgz" - }, "lodash.keys": { "version": "4.2.0", "from": "lodash.keys@>=4.2.0 <5.0.0", @@ -1237,6 +1255,11 @@ "from": "lodash.pick@>=4.4.0 <5.0.0", "resolved": "https://registry.npmjs.org/lodash.pick/-/lodash.pick-4.4.0.tgz" }, + "lodash.pickby": { + "version": "4.6.0", + "from": "lodash.pickby@>=4.6.0 <5.0.0", + "resolved": "https://registry.npmjs.org/lodash.pickby/-/lodash.pickby-4.6.0.tgz" + }, "lodash.sample": { "version": "4.2.1", "from": "lodash.sample@>=4.2.1 <5.0.0", @@ -1322,6 +1345,11 @@ "from": "lolex@>=2.2.0 <3.0.0", "resolved": "https://registry.npmjs.org/lolex/-/lolex-2.6.0.tgz" }, + "long": { + "version": "4.0.0", + "from": "long@>=4.0.0 <5.0.0", + "resolved": "https://registry.npmjs.org/long/-/long-4.0.0.tgz" + }, "lru-cache": { "version": "2.7.3", "from": "lru-cache@>=2.0.0 <3.0.0", @@ -1358,9 +1386,9 @@ "resolved": "https://registry.npmjs.org/methods/-/methods-1.1.2.tgz" }, "metrics-sharelatex": { - "version": "2.0.8", - "from": "git+https://github.com/sharelatex/metrics-sharelatex.git#v2.0.8", - "resolved": "git+https://github.com/sharelatex/metrics-sharelatex.git#a56855e935e4e361166706091cf33f252eb0cd24", + "version": "2.0.12", + "from": "git+https://github.com/sharelatex/metrics-sharelatex.git#v2.0.12", + "resolved": "git+https://github.com/sharelatex/metrics-sharelatex.git#3ac1621ef049e2f2d88a83b3a41011333d609662", "dependencies": { "coffee-script": { "version": "1.6.0", @@ -1526,16 +1554,6 @@ "resolved": "https://registry.npmjs.org/oauth-sign/-/oauth-sign-0.3.0.tgz", "optional": true }, - "object-keys": { - "version": "1.0.12", - "from": "object-keys@>=1.0.12 <2.0.0", - "resolved": "https://registry.npmjs.org/object-keys/-/object-keys-1.0.12.tgz" - }, - "object.getownpropertydescriptors": { - "version": "2.0.3", - "from": "object.getownpropertydescriptors@>=2.0.3 <3.0.0", - "resolved": "https://registry.npmjs.org/object.getownpropertydescriptors/-/object.getownpropertydescriptors-2.0.3.tgz" - }, "on-finished": { "version": "2.3.0", "from": "on-finished@>=2.3.0 <2.4.0", @@ -1557,15 +1575,25 @@ "resolved": "https://registry.npmjs.org/options/-/options-0.0.6.tgz" }, "p-limit": { - "version": "2.0.0", + "version": "2.1.0", "from": "p-limit@>=2.0.0 <3.0.0", - "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-2.0.0.tgz" + "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-2.1.0.tgz" }, "p-try": { "version": "2.0.0", "from": "p-try@>=2.0.0 <3.0.0", "resolved": "https://registry.npmjs.org/p-try/-/p-try-2.0.0.tgz" }, + "parse-duration": { + "version": "0.1.1", + "from": "parse-duration@>=0.1.1 <0.2.0", + "resolved": "https://registry.npmjs.org/parse-duration/-/parse-duration-0.1.1.tgz" + }, + "parse-ms": { + "version": "2.0.0", + "from": "parse-ms@>=2.0.0 <3.0.0", + "resolved": "https://registry.npmjs.org/parse-ms/-/parse-ms-2.0.0.tgz" + }, "parseurl": { "version": "1.3.2", "from": "parseurl@>=1.3.2 <1.4.0", @@ -1601,26 +1629,31 @@ "from": "policyfile@0.0.4", "resolved": "https://registry.npmjs.org/policyfile/-/policyfile-0.0.4.tgz" }, + "pretty-ms": { + "version": "4.0.0", + "from": "pretty-ms@>=4.0.0 <5.0.0", + "resolved": "https://registry.npmjs.org/pretty-ms/-/pretty-ms-4.0.0.tgz" + }, "process-nextick-args": { "version": "2.0.0", "from": "process-nextick-args@>=2.0.0 <2.1.0", "resolved": "https://registry.npmjs.org/process-nextick-args/-/process-nextick-args-2.0.0.tgz" }, "prom-client": { - "version": "11.2.0", + "version": "11.2.1", "from": "prom-client@>=11.1.3 <12.0.0", - "resolved": "https://registry.npmjs.org/prom-client/-/prom-client-11.2.0.tgz" + "resolved": "https://registry.npmjs.org/prom-client/-/prom-client-11.2.1.tgz" + }, + "protobufjs": { + "version": "6.8.8", + "from": "protobufjs@>=6.8.6 <6.9.0", + "resolved": "https://registry.npmjs.org/protobufjs/-/protobufjs-6.8.8.tgz" }, "proxy-addr": { "version": "2.0.3", "from": "proxy-addr@>=2.0.3 <2.1.0", "resolved": "https://registry.npmjs.org/proxy-addr/-/proxy-addr-2.0.3.tgz" }, - "pseudomap": { - "version": "1.0.2", - "from": "pseudomap@>=1.0.2 <2.0.0", - "resolved": "https://registry.npmjs.org/pseudomap/-/pseudomap-1.0.2.tgz" - }, "punycode": { "version": "1.4.1", "from": "punycode@>=1.4.1 <2.0.0", @@ -1756,9 +1789,9 @@ "resolved": "https://registry.npmjs.org/require-like/-/require-like-0.1.2.tgz" }, "resolve": { - "version": "1.8.1", + "version": "1.9.0", "from": "resolve@>=1.5.0 <2.0.0", - "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.8.1.tgz" + "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.9.0.tgz" }, "retry-axios": { "version": "0.3.2", @@ -1944,6 +1977,11 @@ "from": "supports-color@>=0.2.0 <0.3.0", "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-0.2.0.tgz" }, + "symbol-observable": { + "version": "1.2.0", + "from": "symbol-observable@>=1.2.0 <2.0.0", + "resolved": "https://registry.npmjs.org/symbol-observable/-/symbol-observable-1.2.0.tgz" + }, "tdigest": { "version": "0.1.1", "from": "tdigest@>=0.1.1 <0.2.0", @@ -2041,11 +2079,6 @@ "from": "util-deprecate@>=1.0.1 <1.1.0", "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz" }, - "util.promisify": { - "version": "1.0.0", - "from": "util.promisify@>=1.0.0 <2.0.0", - "resolved": "https://registry.npmjs.org/util.promisify/-/util.promisify-1.0.0.tgz" - }, "utils-merge": { "version": "1.0.1", "from": "utils-merge@1.0.1", @@ -2099,9 +2132,9 @@ "resolved": "https://registry.npmjs.org/xtend/-/xtend-4.0.1.tgz" }, "yallist": { - "version": "2.1.2", - "from": "yallist@>=2.1.2 <3.0.0", - "resolved": "https://registry.npmjs.org/yallist/-/yallist-2.1.2.tgz" + "version": "3.0.3", + "from": "yallist@>=3.0.2 <4.0.0", + "resolved": "https://registry.npmjs.org/yallist/-/yallist-3.0.3.tgz" }, "zeparser": { "version": "0.0.5", diff --git a/services/real-time/package.json b/services/real-time/package.json index 7a842e1b51..893fa9e1f4 100644 --- a/services/real-time/package.json +++ b/services/real-time/package.json @@ -29,7 +29,7 @@ "express": "^4.10.1", "express-session": "^1.9.1", "logger-sharelatex": "git+https://github.com/sharelatex/logger-sharelatex.git#v1.5.6", - "metrics-sharelatex": "git+https://github.com/sharelatex/metrics-sharelatex.git#v2.0.8", + "metrics-sharelatex": "git+https://github.com/sharelatex/metrics-sharelatex.git#v2.0.12", "redis-sharelatex": "git+https://github.com/sharelatex/redis-sharelatex.git#v1.0.4", "request": "~2.34.0", "session.socket.io": "^0.1.6", From cda65ad1caa1309245def070ffeab527c53f7c0b Mon Sep 17 00:00:00 2001 From: Christopher Hoskin Date: Thu, 3 Jan 2019 16:21:33 +0000 Subject: [PATCH 28/53] Bump build scripts to 1.1.10 --- services/real-time/Dockerfile | 6 +++--- services/real-time/Makefile | 2 +- services/real-time/buildscript.txt | 4 ++-- services/real-time/docker-compose.ci.yml | 2 +- services/real-time/docker-compose.yml | 2 +- services/real-time/package.json | 2 +- 6 files changed, 9 insertions(+), 9 deletions(-) diff --git a/services/real-time/Dockerfile b/services/real-time/Dockerfile index aabf01ad91..e7243c5291 100644 --- a/services/real-time/Dockerfile +++ b/services/real-time/Dockerfile @@ -1,4 +1,4 @@ -FROM node:6.9.5 as app +FROM node:6.15.1 as app WORKDIR /app @@ -12,11 +12,11 @@ COPY . /app RUN npm run compile:all -FROM node:6.9.5 +FROM node:6.15.1 COPY --from=app /app /app WORKDIR /app USER node -CMD ["node","app.js"] +CMD ["node", "--expose-gc", "app.js"] diff --git a/services/real-time/Makefile b/services/real-time/Makefile index 7f5e935f7c..8620b42f06 100644 --- a/services/real-time/Makefile +++ b/services/real-time/Makefile @@ -1,7 +1,7 @@ # This file was auto-generated, do not edit it directly. # Instead run bin/update_build_scripts from # https://github.com/sharelatex/sharelatex-dev-environment -# Version: 1.1.9 +# Version: 1.1.10 BUILD_NUMBER ?= local BRANCH_NAME ?= $(shell git rev-parse --abbrev-ref HEAD) diff --git a/services/real-time/buildscript.txt b/services/real-time/buildscript.txt index dbdae4f5ba..c343ba8891 100644 --- a/services/real-time/buildscript.txt +++ b/services/real-time/buildscript.txt @@ -1,6 +1,6 @@ ---script-version=1.1.9 +--script-version=1.1.10 real-time ---node-version=6.9.5 +--node-version=6.15.1 --acceptance-creds=None --language=coffeescript --dependencies=mongo,redis diff --git a/services/real-time/docker-compose.ci.yml b/services/real-time/docker-compose.ci.yml index 17c4ddd2bf..5ab90e1825 100644 --- a/services/real-time/docker-compose.ci.yml +++ b/services/real-time/docker-compose.ci.yml @@ -1,7 +1,7 @@ # This file was auto-generated, do not edit it directly. # Instead run bin/update_build_scripts from # https://github.com/sharelatex/sharelatex-dev-environment -# Version: 1.1.9 +# Version: 1.1.10 version: "2" diff --git a/services/real-time/docker-compose.yml b/services/real-time/docker-compose.yml index dcbc14e683..aeceafb3f3 100644 --- a/services/real-time/docker-compose.yml +++ b/services/real-time/docker-compose.yml @@ -1,7 +1,7 @@ # This file was auto-generated, do not edit it directly. # Instead run bin/update_build_scripts from # https://github.com/sharelatex/sharelatex-dev-environment -# Version: 1.1.9 +# Version: 1.1.10 version: "2" diff --git a/services/real-time/package.json b/services/real-time/package.json index 893fa9e1f4..23d0b77be3 100644 --- a/services/real-time/package.json +++ b/services/real-time/package.json @@ -8,7 +8,7 @@ "url": "https://github.com/sharelatex/real-time-sharelatex.git" }, "scripts": { - "compile:app": "([ -e app/coffee ] && coffee $COFFEE_OPTIONS -o app/js -c app/coffee || echo 'No CoffeeScript folder to compile') && ( [ -e app.coffee ] && coffee $COFFEE_OPTIONS -c app.coffee || echo 'No CoffeeScript app to compile')", + "compile:app": "([ -e app/coffee ] && coffee -m $COFFEE_OPTIONS -o app/js -c app/coffee || echo 'No CoffeeScript folder to compile') && ( [ -e app.coffee ] && coffee -m $COFFEE_OPTIONS -c app.coffee || echo 'No CoffeeScript app to compile')", "start": "npm run compile:app && node $NODE_APP_OPTIONS app.js", "test:acceptance:_run": "mocha --recursive --reporter spec --timeout 30000 --exit $@ test/acceptance/js", "test:acceptance": "npm run compile:app && npm run compile:acceptance_tests && npm run test:acceptance:_run -- --grep=$MOCHA_GREP", From b7e8bf3c4c037c87a289fd8aecf72a6034be1f73 Mon Sep 17 00:00:00 2001 From: Christopher Hoskin Date: Thu, 3 Jan 2019 17:58:10 +0000 Subject: [PATCH 29/53] Bump logger to 1.5.7 --- services/real-time/npm-shrinkwrap.json | 100 +++++++++++++++---------- services/real-time/package.json | 2 +- 2 files changed, 61 insertions(+), 41 deletions(-) diff --git a/services/real-time/npm-shrinkwrap.json b/services/real-time/npm-shrinkwrap.json index 2374262396..34ebae2f58 100644 --- a/services/real-time/npm-shrinkwrap.json +++ b/services/real-time/npm-shrinkwrap.json @@ -123,10 +123,27 @@ "from": "@sindresorhus/is@>=0.13.0 <0.14.0", "resolved": "https://registry.npmjs.org/@sindresorhus/is/-/is-0.13.0.tgz" }, + "@sinonjs/commons": { + "version": "1.3.0", + "from": "@sinonjs/commons@>=1.2.0 <2.0.0", + "resolved": "https://registry.npmjs.org/@sinonjs/commons/-/commons-1.3.0.tgz", + "dependencies": { + "type-detect": { + "version": "4.0.8", + "from": "type-detect@4.0.8", + "resolved": "https://registry.npmjs.org/type-detect/-/type-detect-4.0.8.tgz" + } + } + }, "@sinonjs/formatio": { - "version": "2.0.0", - "from": "@sinonjs/formatio@>=2.0.0 <3.0.0", - "resolved": "https://registry.npmjs.org/@sinonjs/formatio/-/formatio-2.0.0.tgz" + "version": "3.1.0", + "from": "@sinonjs/formatio@>=3.1.0 <4.0.0", + "resolved": "https://registry.npmjs.org/@sinonjs/formatio/-/formatio-3.1.0.tgz" + }, + "@sinonjs/samsam": { + "version": "3.0.2", + "from": "@sinonjs/samsam@>=3.0.2 <4.0.0", + "resolved": "https://registry.npmjs.org/@sinonjs/samsam/-/samsam-3.0.2.tgz" }, "@types/caseless": { "version": "0.12.1", @@ -225,6 +242,11 @@ "from": "array-flatten@1.1.1", "resolved": "https://registry.npmjs.org/array-flatten/-/array-flatten-1.1.1.tgz" }, + "array-from": { + "version": "2.1.1", + "from": "array-from@>=2.1.1 <3.0.0", + "resolved": "https://registry.npmjs.org/array-from/-/array-from-2.1.1.tgz" + }, "arrify": { "version": "1.0.1", "from": "arrify@>=1.0.1 <2.0.0", @@ -1166,9 +1188,9 @@ "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-1.1.1.tgz" }, "just-extend": { - "version": "1.1.27", - "from": "just-extend@>=1.1.27 <2.0.0", - "resolved": "https://registry.npmjs.org/just-extend/-/just-extend-1.1.27.tgz" + "version": "4.0.2", + "from": "just-extend@>=4.0.2 <5.0.0", + "resolved": "https://registry.npmjs.org/just-extend/-/just-extend-4.0.2.tgz" }, "jwa": { "version": "1.1.6", @@ -1276,9 +1298,9 @@ "resolved": "https://registry.npmjs.org/lodash.values/-/lodash.values-4.3.0.tgz" }, "logger-sharelatex": { - "version": "1.5.6", - "from": "git+https://github.com/sharelatex/logger-sharelatex.git#v1.5.6", - "resolved": "git+https://github.com/sharelatex/logger-sharelatex.git#b2956ec56b582b9f4fc8fdda8dc00c06e77c5537", + "version": "1.5.9", + "from": "git+https://github.com/sharelatex/logger-sharelatex.git#v1.5.9", + "resolved": "git+https://github.com/sharelatex/logger-sharelatex.git#e8e1b95052f62e107336053e4a983f81cdbdf589", "dependencies": { "assertion-error": { "version": "1.1.0", @@ -1291,15 +1313,20 @@ "resolved": "https://registry.npmjs.org/bunyan/-/bunyan-1.5.1.tgz" }, "chai": { - "version": "4.1.2", + "version": "4.2.0", "from": "chai@latest", - "resolved": "https://registry.npmjs.org/chai/-/chai-4.1.2.tgz" + "resolved": "https://registry.npmjs.org/chai/-/chai-4.2.0.tgz" }, "deep-eql": { "version": "3.0.1", "from": "deep-eql@>=3.0.0 <4.0.0", "resolved": "https://registry.npmjs.org/deep-eql/-/deep-eql-3.0.1.tgz" }, + "diff": { + "version": "3.5.0", + "from": "diff@>=3.5.0 <4.0.0", + "resolved": "https://registry.npmjs.org/diff/-/diff-3.5.0.tgz" + }, "dtrace-provider": { "version": "0.6.0", "from": "dtrace-provider@>=0.6.0 <0.7.0", @@ -1312,21 +1339,14 @@ "resolved": "https://registry.npmjs.org/sandboxed-module/-/sandboxed-module-2.0.3.tgz" }, "sinon": { - "version": "5.0.7", + "version": "7.2.2", "from": "sinon@latest", - "resolved": "https://registry.npmjs.org/sinon/-/sinon-5.0.7.tgz", - "dependencies": { - "diff": { - "version": "3.5.0", - "from": "diff@>=3.1.0 <4.0.0", - "resolved": "https://registry.npmjs.org/diff/-/diff-3.5.0.tgz" - }, - "supports-color": { - "version": "5.4.0", - "from": "supports-color@>=5.1.0 <6.0.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.4.0.tgz" - } - } + "resolved": "https://registry.npmjs.org/sinon/-/sinon-7.2.2.tgz" + }, + "supports-color": { + "version": "5.5.0", + "from": "supports-color@>=5.5.0 <6.0.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz" }, "timekeeper": { "version": "1.0.0", @@ -1341,9 +1361,9 @@ } }, "lolex": { - "version": "2.6.0", - "from": "lolex@>=2.2.0 <3.0.0", - "resolved": "https://registry.npmjs.org/lolex/-/lolex-2.6.0.tgz" + "version": "3.0.0", + "from": "lolex@>=3.0.0 <4.0.0", + "resolved": "https://registry.npmjs.org/lolex/-/lolex-3.0.0.tgz" }, "long": { "version": "4.0.0", @@ -1499,9 +1519,9 @@ "optional": true }, "nan": { - "version": "2.10.0", + "version": "2.12.1", "from": "nan@>=2.0.8 <3.0.0", - "resolved": "https://registry.npmjs.org/nan/-/nan-2.10.0.tgz", + "resolved": "https://registry.npmjs.org/nan/-/nan-2.12.1.tgz", "optional": true }, "native-or-bluebird": { @@ -1522,10 +1542,15 @@ "resolved": "https://registry.npmjs.org/negotiator/-/negotiator-0.6.1.tgz" }, "nise": { - "version": "1.3.3", - "from": "nise@>=1.2.0 <2.0.0", - "resolved": "https://registry.npmjs.org/nise/-/nise-1.3.3.tgz", + "version": "1.4.8", + "from": "nise@>=1.4.7 <2.0.0", + "resolved": "https://registry.npmjs.org/nise/-/nise-1.4.8.tgz", "dependencies": { + "lolex": { + "version": "2.7.5", + "from": "lolex@>=2.3.2 <3.0.0", + "resolved": "https://registry.npmjs.org/lolex/-/lolex-2.7.5.tgz" + }, "path-to-regexp": { "version": "1.7.0", "from": "path-to-regexp@>=1.7.0 <2.0.0", @@ -1814,9 +1839,9 @@ "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.1.tgz" }, "safe-json-stringify": { - "version": "1.1.0", + "version": "1.2.0", "from": "safe-json-stringify@>=1.0.0 <2.0.0", - "resolved": "https://registry.npmjs.org/safe-json-stringify/-/safe-json-stringify-1.1.0.tgz", + "resolved": "https://registry.npmjs.org/safe-json-stringify/-/safe-json-stringify-1.2.0.tgz", "optional": true }, "safer-buffer": { @@ -1824,11 +1849,6 @@ "from": "safer-buffer@>=2.1.2 <3.0.0", "resolved": "https://registry.npmjs.org/safer-buffer/-/safer-buffer-2.1.2.tgz" }, - "samsam": { - "version": "1.3.0", - "from": "samsam@1.3.0", - "resolved": "https://registry.npmjs.org/samsam/-/samsam-1.3.0.tgz" - }, "sandboxed-module": { "version": "0.3.0", "from": "sandboxed-module@>=0.3.0 <0.4.0", diff --git a/services/real-time/package.json b/services/real-time/package.json index 23d0b77be3..0e5b5ee55e 100644 --- a/services/real-time/package.json +++ b/services/real-time/package.json @@ -28,7 +28,7 @@ "cookie-parser": "^1.3.3", "express": "^4.10.1", "express-session": "^1.9.1", - "logger-sharelatex": "git+https://github.com/sharelatex/logger-sharelatex.git#v1.5.6", + "logger-sharelatex": "git+https://github.com/sharelatex/logger-sharelatex.git#v1.5.9", "metrics-sharelatex": "git+https://github.com/sharelatex/metrics-sharelatex.git#v2.0.12", "redis-sharelatex": "git+https://github.com/sharelatex/redis-sharelatex.git#v1.0.4", "request": "~2.34.0", From c6fa764a6a80f504d2dc7940149f097ca46a6b98 Mon Sep 17 00:00:00 2001 From: Christopher Hoskin Date: Thu, 3 Jan 2019 18:04:50 +0000 Subject: [PATCH 30/53] Add app.js.map to .gitignore --- services/real-time/.gitignore | 1 + 1 file changed, 1 insertion(+) diff --git a/services/real-time/.gitignore b/services/real-time/.gitignore index 7c45322029..22adf4a227 100644 --- a/services/real-time/.gitignore +++ b/services/real-time/.gitignore @@ -4,3 +4,4 @@ app.js app/js test/unit/js test/acceptance/js +app.js.map From 4a3711aba89c91812d0d0a221121e95b753572a9 Mon Sep 17 00:00:00 2001 From: Christopher Hoskin Date: Tue, 8 Jan 2019 14:26:05 +0000 Subject: [PATCH 31/53] Bump settings to v1.1.0 --- services/real-time/npm-shrinkwrap.json | 6 +++--- services/real-time/package.json | 2 +- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/services/real-time/npm-shrinkwrap.json b/services/real-time/npm-shrinkwrap.json index 34ebae2f58..6b39192931 100644 --- a/services/real-time/npm-shrinkwrap.json +++ b/services/real-time/npm-shrinkwrap.json @@ -1896,9 +1896,9 @@ "resolved": "https://registry.npmjs.org/setprototypeof/-/setprototypeof-1.1.0.tgz" }, "settings-sharelatex": { - "version": "1.0.0", - "from": "git+https://github.com/sharelatex/settings-sharelatex.git#v1.0.0", - "resolved": "git+https://github.com/sharelatex/settings-sharelatex.git#cbc5e41c1dbe6789721a14b3fdae05bf22546559", + "version": "1.1.0", + "from": "git+https://github.com/sharelatex/settings-sharelatex.git#v1.1.0", + "resolved": "git+https://github.com/sharelatex/settings-sharelatex.git#93f63d029b52fef8825c3a401b2b6a7ba29b4750", "dependencies": { "coffee-script": { "version": "1.6.0", diff --git a/services/real-time/package.json b/services/real-time/package.json index 0e5b5ee55e..5277ec536d 100644 --- a/services/real-time/package.json +++ b/services/real-time/package.json @@ -33,7 +33,7 @@ "redis-sharelatex": "git+https://github.com/sharelatex/redis-sharelatex.git#v1.0.4", "request": "~2.34.0", "session.socket.io": "^0.1.6", - "settings-sharelatex": "git+https://github.com/sharelatex/settings-sharelatex.git#v1.0.0", + "settings-sharelatex": "git+https://github.com/sharelatex/settings-sharelatex.git#v1.1.0", "socket.io": "0.9.16", "socket.io-client": "^0.9.16" }, From 3288d6d3211faa77bc666878926f19b585ef20d2 Mon Sep 17 00:00:00 2001 From: Christopher Hoskin Date: Tue, 8 Jan 2019 14:28:10 +0000 Subject: [PATCH 32/53] Add **/*.map to .gitignore --- services/real-time/.gitignore | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/services/real-time/.gitignore b/services/real-time/.gitignore index 22adf4a227..ff0c7e15d2 100644 --- a/services/real-time/.gitignore +++ b/services/real-time/.gitignore @@ -4,4 +4,4 @@ app.js app/js test/unit/js test/acceptance/js -app.js.map +**/*.map From e3618acf208783479c0a482f91f51776a8c88e5a Mon Sep 17 00:00:00 2001 From: Henry Oswald Date: Tue, 22 Jan 2019 15:50:34 +0000 Subject: [PATCH 33/53] mvp2 for redis-cluster --- services/real-time/app.coffee | 2 +- .../real-time/config/settings.defaults.coffee | 28 +++++++++++++++---- services/real-time/npm-shrinkwrap.json | 6 ++-- services/real-time/package.json | 2 +- 4 files changed, 27 insertions(+), 11 deletions(-) diff --git a/services/real-time/app.coffee b/services/real-time/app.coffee index 931e9e42d3..b5eeceedde 100644 --- a/services/real-time/app.coffee +++ b/services/real-time/app.coffee @@ -19,7 +19,7 @@ SessionSockets = require('session.socket.io') CookieParser = require("cookie-parser") - +sessionRedisClient.set "hello-a", "hello-there" DrainManager = require("./app/js/DrainManager") diff --git a/services/real-time/config/settings.defaults.coffee b/services/real-time/config/settings.defaults.coffee index 7839278b9e..2e3a8f46ff 100644 --- a/services/real-time/config/settings.defaults.coffee +++ b/services/real-time/config/settings.defaults.coffee @@ -1,4 +1,4 @@ -module.exports = +settings = redis: realtime: host: process.env['REAL_TIME_REDIS_HOST'] or process.env['REDIS_HOST'] or "localhost" @@ -15,10 +15,9 @@ module.exports = key_schema: pendingUpdates: ({doc_id}) -> "PendingUpdates:#{doc_id}" - websessions: - host: process.env['WEB_REDIS_HOST'] or process.env['REDIS_HOST'] or "localhost" - port: process.env['WEB_REDIS_PORT'] or process.env['REDIS_PORT'] or "6379" - password: process.env["WEB_REDIS_PASSWORD"] or process.env["REDIS_PASSWORD"] or "" + websessions: {} + + internal: realTime: @@ -42,4 +41,21 @@ module.exports = max_doc_length: 2 * 1024 * 1024 # 2mb - forceDrainMsDelay: process.env['FORCE_DRAIN_MS_DELAY'] or false \ No newline at end of file + forceDrainMsDelay: process.env['FORCE_DRAIN_MS_DELAY'] or false + +if process.env['REDIS_CLUSTER_ENABLED'] == "true" + settings.redis.websessions.cluster = [ + { host: process.env["SL_LIN_STAG_REDIS_3_SERVICE_HOST"], port: "6379" } + ] + settings.redis.websessions.natMap = { + '192.168.201.24:6379': { host: process.env["SL_LIN_STAG_REDIS_0_SERVICE_HOST"], port: "6379" } + '192.168.195.231:6379': { host: process.env["SL_LIN_STAG_REDIS_1_SERVICE_HOST"], port: "6379" } + '192.168.223.53:6379': { host: process.env["SL_LIN_STAG_REDIS_2_SERVICE_HOST"], port: "6379" } + '192.168.221.84:6379': { host: process.env["SL_LIN_STAG_REDIS_3_SERVICE_HOST"], port: "6379" } + '192.168.219.81:6379': { host: process.env["SL_LIN_STAG_REDIS_4_SERVICE_HOST"], port: "6379" } + '192.168.180.104:6379': { host: process.env["SL_LIN_STAG_REDIS_5_SERVICE_HOST"], port: "6379" } + '192.168.220.59:6379': { host: process.env["SL_LIN_STAG_REDIS_6_SERVICE_HOST"], port: "6379" } + '192.168.129.122:6379': { host: process.env["SL_LIN_STAG_REDIS_7_SERVICE_HOST"], port: "6379" } + } + +module.exports = settings \ No newline at end of file diff --git a/services/real-time/npm-shrinkwrap.json b/services/real-time/npm-shrinkwrap.json index 6b39192931..2ea4265008 100644 --- a/services/real-time/npm-shrinkwrap.json +++ b/services/real-time/npm-shrinkwrap.json @@ -1755,9 +1755,9 @@ } }, "redis-sharelatex": { - "version": "1.0.4", - "from": "git+https://github.com/sharelatex/redis-sharelatex.git#v1.0.4", - "resolved": "git+https://github.com/sharelatex/redis-sharelatex.git#ca4e906559c1405d132e8edd7db763d64a57be62", + "version": "511b59f3414d6e3db23a4b61239fd2cf3e07cdb0", + "from": "git+https://github.com/sharelatex/redis-sharelatex.git#511b59f3414d6e3db23a4b61239fd2cf3e07cdb0", + "resolved": "git+https://github.com/sharelatex/redis-sharelatex.git#511b59f3414d6e3db23a4b61239fd2cf3e07cdb0", "dependencies": { "async": { "version": "2.6.1", diff --git a/services/real-time/package.json b/services/real-time/package.json index 5277ec536d..d40719df76 100644 --- a/services/real-time/package.json +++ b/services/real-time/package.json @@ -30,7 +30,7 @@ "express-session": "^1.9.1", "logger-sharelatex": "git+https://github.com/sharelatex/logger-sharelatex.git#v1.5.9", "metrics-sharelatex": "git+https://github.com/sharelatex/metrics-sharelatex.git#v2.0.12", - "redis-sharelatex": "git+https://github.com/sharelatex/redis-sharelatex.git#v1.0.4", + "redis-sharelatex": "git+https://github.com/sharelatex/redis-sharelatex.git#511b59f3414d6e3db23a4b61239fd2cf3e07cdb0", "request": "~2.34.0", "session.socket.io": "^0.1.6", "settings-sharelatex": "git+https://github.com/sharelatex/settings-sharelatex.git#v1.1.0", From 9517aac86dd5d5c0a3a14efae267aa564194f479 Mon Sep 17 00:00:00 2001 From: Henry Oswald Date: Tue, 22 Jan 2019 16:02:13 +0000 Subject: [PATCH 34/53] bump redis version --- services/real-time/npm-shrinkwrap.json | 6 +++--- services/real-time/package.json | 2 +- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/services/real-time/npm-shrinkwrap.json b/services/real-time/npm-shrinkwrap.json index 2ea4265008..ec3f130eae 100644 --- a/services/real-time/npm-shrinkwrap.json +++ b/services/real-time/npm-shrinkwrap.json @@ -1755,9 +1755,9 @@ } }, "redis-sharelatex": { - "version": "511b59f3414d6e3db23a4b61239fd2cf3e07cdb0", - "from": "git+https://github.com/sharelatex/redis-sharelatex.git#511b59f3414d6e3db23a4b61239fd2cf3e07cdb0", - "resolved": "git+https://github.com/sharelatex/redis-sharelatex.git#511b59f3414d6e3db23a4b61239fd2cf3e07cdb0", + "version": "f5956885d59938f1972c75865bedffa8914fdf63", + "from": "git+https://github.com/sharelatex/redis-sharelatex.git#f5956885d59938f1972c75865bedffa8914fdf63", + "resolved": "git+https://github.com/sharelatex/redis-sharelatex.git#f5956885d59938f1972c75865bedffa8914fdf63", "dependencies": { "async": { "version": "2.6.1", diff --git a/services/real-time/package.json b/services/real-time/package.json index d40719df76..53af47e3c8 100644 --- a/services/real-time/package.json +++ b/services/real-time/package.json @@ -30,7 +30,7 @@ "express-session": "^1.9.1", "logger-sharelatex": "git+https://github.com/sharelatex/logger-sharelatex.git#v1.5.9", "metrics-sharelatex": "git+https://github.com/sharelatex/metrics-sharelatex.git#v2.0.12", - "redis-sharelatex": "git+https://github.com/sharelatex/redis-sharelatex.git#511b59f3414d6e3db23a4b61239fd2cf3e07cdb0", + "redis-sharelatex": "git+https://github.com/sharelatex/redis-sharelatex.git#f5956885d59938f1972c75865bedffa8914fdf63", "request": "~2.34.0", "session.socket.io": "^0.1.6", "settings-sharelatex": "git+https://github.com/sharelatex/settings-sharelatex.git#v1.1.0", From 150483eeceff23ae48b640fc249d97d174e23631 Mon Sep 17 00:00:00 2001 From: Henry Oswald Date: Tue, 22 Jan 2019 16:44:39 +0000 Subject: [PATCH 35/53] put redis keys back in for web --- services/real-time/config/settings.defaults.coffee | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/services/real-time/config/settings.defaults.coffee b/services/real-time/config/settings.defaults.coffee index 2e3a8f46ff..9e7f567c78 100644 --- a/services/real-time/config/settings.defaults.coffee +++ b/services/real-time/config/settings.defaults.coffee @@ -15,7 +15,10 @@ settings = key_schema: pendingUpdates: ({doc_id}) -> "PendingUpdates:#{doc_id}" - websessions: {} + websessions: + host: process.env['WEB_REDIS_HOST'] or process.env['REDIS_HOST'] or "localhost" + port: process.env['WEB_REDIS_PORT'] or process.env['REDIS_PORT'] or "6379" + password: process.env["WEB_REDIS_PASSWORD"] or process.env["REDIS_PASSWORD"] or "" From 2cd3e6f18f1879dc53e6ed1cc1cdd0641b3a5c54 Mon Sep 17 00:00:00 2001 From: Henry Oswald Date: Tue, 22 Jan 2019 16:49:22 +0000 Subject: [PATCH 36/53] added logging in settings --- services/real-time/config/settings.defaults.coffee | 2 ++ 1 file changed, 2 insertions(+) diff --git a/services/real-time/config/settings.defaults.coffee b/services/real-time/config/settings.defaults.coffee index 9e7f567c78..bb4d235e74 100644 --- a/services/real-time/config/settings.defaults.coffee +++ b/services/real-time/config/settings.defaults.coffee @@ -46,7 +46,9 @@ settings = forceDrainMsDelay: process.env['FORCE_DRAIN_MS_DELAY'] or false +console.log "process.env['REDIS_CLUSTER_ENABLED']", process.env['REDIS_CLUSTER_ENABLED'] if process.env['REDIS_CLUSTER_ENABLED'] == "true" + settings.redis.websessions.cluster = [ { host: process.env["SL_LIN_STAG_REDIS_3_SERVICE_HOST"], port: "6379" } ] From 52014c851bdd18bf0886c7f9ebc435aec0390d09 Mon Sep 17 00:00:00 2001 From: Henry Oswald Date: Tue, 22 Jan 2019 17:00:48 +0000 Subject: [PATCH 37/53] bump redis --- services/real-time/npm-shrinkwrap.json | 11 +++-------- services/real-time/package.json | 2 +- 2 files changed, 4 insertions(+), 9 deletions(-) diff --git a/services/real-time/npm-shrinkwrap.json b/services/real-time/npm-shrinkwrap.json index ec3f130eae..356b9e51f4 100644 --- a/services/real-time/npm-shrinkwrap.json +++ b/services/real-time/npm-shrinkwrap.json @@ -1125,11 +1125,6 @@ "from": "inherits@2.0.3", "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.3.tgz" }, - "ioredis": { - "version": "3.2.2", - "from": "ioredis@>=3.2.1 <4.0.0", - "resolved": "https://registry.npmjs.org/ioredis/-/ioredis-3.2.2.tgz" - }, "ipaddr.js": { "version": "1.6.0", "from": "ipaddr.js@1.6.0", @@ -1755,9 +1750,9 @@ } }, "redis-sharelatex": { - "version": "f5956885d59938f1972c75865bedffa8914fdf63", - "from": "git+https://github.com/sharelatex/redis-sharelatex.git#f5956885d59938f1972c75865bedffa8914fdf63", - "resolved": "git+https://github.com/sharelatex/redis-sharelatex.git#f5956885d59938f1972c75865bedffa8914fdf63", + "version": "4156cfd9ba9444d87a599f6d7035b73b505070f2", + "from": "git+https://github.com/sharelatex/redis-sharelatex.git#4156cfd9ba9444d87a599f6d7035b73b505070f2", + "resolved": "git+https://github.com/sharelatex/redis-sharelatex.git#4156cfd9ba9444d87a599f6d7035b73b505070f2", "dependencies": { "async": { "version": "2.6.1", diff --git a/services/real-time/package.json b/services/real-time/package.json index 53af47e3c8..e5aa8ee54d 100644 --- a/services/real-time/package.json +++ b/services/real-time/package.json @@ -30,7 +30,7 @@ "express-session": "^1.9.1", "logger-sharelatex": "git+https://github.com/sharelatex/logger-sharelatex.git#v1.5.9", "metrics-sharelatex": "git+https://github.com/sharelatex/metrics-sharelatex.git#v2.0.12", - "redis-sharelatex": "git+https://github.com/sharelatex/redis-sharelatex.git#f5956885d59938f1972c75865bedffa8914fdf63", + "redis-sharelatex": "git+https://github.com/sharelatex/redis-sharelatex.git#4156cfd9ba9444d87a599f6d7035b73b505070f2", "request": "~2.34.0", "session.socket.io": "^0.1.6", "settings-sharelatex": "git+https://github.com/sharelatex/settings-sharelatex.git#v1.1.0", From 397b65abf70cf8d62bd0d8735cd6ba075949a7a1 Mon Sep 17 00:00:00 2001 From: Henry Oswald Date: Tue, 22 Jan 2019 17:06:43 +0000 Subject: [PATCH 38/53] put settings on all redis's --- services/real-time/config/settings.defaults.coffee | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/services/real-time/config/settings.defaults.coffee b/services/real-time/config/settings.defaults.coffee index bb4d235e74..485403ca4d 100644 --- a/services/real-time/config/settings.defaults.coffee +++ b/services/real-time/config/settings.defaults.coffee @@ -49,10 +49,10 @@ settings = console.log "process.env['REDIS_CLUSTER_ENABLED']", process.env['REDIS_CLUSTER_ENABLED'] if process.env['REDIS_CLUSTER_ENABLED'] == "true" - settings.redis.websessions.cluster = [ + settings.redis.realtime.cluster = settings.redis.documentupdater.cluster = settings.redis.websessions.cluster = [ { host: process.env["SL_LIN_STAG_REDIS_3_SERVICE_HOST"], port: "6379" } ] - settings.redis.websessions.natMap = { + settings.redis.realtime.natMap = settings.redis.documentupdater.natMap = settings.redis.websessions.natMap = { '192.168.201.24:6379': { host: process.env["SL_LIN_STAG_REDIS_0_SERVICE_HOST"], port: "6379" } '192.168.195.231:6379': { host: process.env["SL_LIN_STAG_REDIS_1_SERVICE_HOST"], port: "6379" } '192.168.223.53:6379': { host: process.env["SL_LIN_STAG_REDIS_2_SERVICE_HOST"], port: "6379" } @@ -62,5 +62,6 @@ if process.env['REDIS_CLUSTER_ENABLED'] == "true" '192.168.220.59:6379': { host: process.env["SL_LIN_STAG_REDIS_6_SERVICE_HOST"], port: "6379" } '192.168.129.122:6379': { host: process.env["SL_LIN_STAG_REDIS_7_SERVICE_HOST"], port: "6379" } } + settings.redis.documentupdater.cluster module.exports = settings \ No newline at end of file From 73b2c1ec05b4db1edc56c0b51a6ae3063141d964 Mon Sep 17 00:00:00 2001 From: Henry Oswald Date: Wed, 23 Jan 2019 10:11:26 +0000 Subject: [PATCH 39/53] auto wrap redis from env vars --- .../real-time/config/settings.defaults.coffee | 36 +++++++++---------- 1 file changed, 17 insertions(+), 19 deletions(-) diff --git a/services/real-time/config/settings.defaults.coffee b/services/real-time/config/settings.defaults.coffee index 485403ca4d..2e525adb00 100644 --- a/services/real-time/config/settings.defaults.coffee +++ b/services/real-time/config/settings.defaults.coffee @@ -7,6 +7,8 @@ settings = key_schema: clientsInProject: ({project_id}) -> "clients_in_project:#{project_id}" connectedUser: ({project_id, client_id})-> "connected_user:#{project_id}:#{client_id}" + cluster: process.env['REDIS_CLUSTER_HOSTS'] + natMap: process.env['REDIS_CLUSTER_NATMAP'] documentupdater: host: process.env['DOC_UPDATER_REDIS_HOST'] or process.env['REDIS_HOST'] or "localhost" @@ -14,13 +16,15 @@ settings = password: process.env["DOC_UPDATER_REDIS_PASSWORD"] or process.env["REDIS_PASSWORD"] or "" key_schema: pendingUpdates: ({doc_id}) -> "PendingUpdates:#{doc_id}" + cluster: process.env['REDIS_CLUSTER_HOSTS'] + natMap: process.env['REDIS_CLUSTER_NATMAP'] websessions: host: process.env['WEB_REDIS_HOST'] or process.env['REDIS_HOST'] or "localhost" port: process.env['WEB_REDIS_PORT'] or process.env['REDIS_PORT'] or "6379" password: process.env["WEB_REDIS_PASSWORD"] or process.env["REDIS_PASSWORD"] or "" - - + cluster: process.env['REDIS_CLUSTER_HOSTS'] + natMap: process.env['REDIS_CLUSTER_NATMAP'] internal: realTime: @@ -46,22 +50,16 @@ settings = forceDrainMsDelay: process.env['FORCE_DRAIN_MS_DELAY'] or false -console.log "process.env['REDIS_CLUSTER_ENABLED']", process.env['REDIS_CLUSTER_ENABLED'] -if process.env['REDIS_CLUSTER_ENABLED'] == "true" +console.log process.env['REDIS_CLUSTER_HOSTS'], process.env['REDIS_CLUSTER_NATMAP'] +if process.env['REDIS_CLUSTER_HOSTS']? or process.env['REDIS_CLUSTER_NATMAP']? - settings.redis.realtime.cluster = settings.redis.documentupdater.cluster = settings.redis.websessions.cluster = [ - { host: process.env["SL_LIN_STAG_REDIS_3_SERVICE_HOST"], port: "6379" } - ] - settings.redis.realtime.natMap = settings.redis.documentupdater.natMap = settings.redis.websessions.natMap = { - '192.168.201.24:6379': { host: process.env["SL_LIN_STAG_REDIS_0_SERVICE_HOST"], port: "6379" } - '192.168.195.231:6379': { host: process.env["SL_LIN_STAG_REDIS_1_SERVICE_HOST"], port: "6379" } - '192.168.223.53:6379': { host: process.env["SL_LIN_STAG_REDIS_2_SERVICE_HOST"], port: "6379" } - '192.168.221.84:6379': { host: process.env["SL_LIN_STAG_REDIS_3_SERVICE_HOST"], port: "6379" } - '192.168.219.81:6379': { host: process.env["SL_LIN_STAG_REDIS_4_SERVICE_HOST"], port: "6379" } - '192.168.180.104:6379': { host: process.env["SL_LIN_STAG_REDIS_5_SERVICE_HOST"], port: "6379" } - '192.168.220.59:6379': { host: process.env["SL_LIN_STAG_REDIS_6_SERVICE_HOST"], port: "6379" } - '192.168.129.122:6379': { host: process.env["SL_LIN_STAG_REDIS_7_SERVICE_HOST"], port: "6379" } - } - settings.redis.documentupdater.cluster - + for redisKey in Object.keys(settings.redis) + + if process.env['REDIS_CLUSTER_HOSTS']? + settings.redis[redisKey].cluster = JSON.parse(process.env['REDIS_CLUSTER_HOSTS']) + + + if process.env['REDIS_CLUSTER_NATMAP']? + settings.redis[redisKey].natMap = JSON.parse(process.env['REDIS_CLUSTER_NATMAP']) +console.log settings module.exports = settings \ No newline at end of file From e1b742c2150c08de6003b8461247761998235c49 Mon Sep 17 00:00:00 2001 From: Henry Oswald Date: Wed, 23 Jan 2019 10:15:00 +0000 Subject: [PATCH 40/53] add logging --- services/real-time/config/settings.defaults.coffee | 1 + 1 file changed, 1 insertion(+) diff --git a/services/real-time/config/settings.defaults.coffee b/services/real-time/config/settings.defaults.coffee index 2e525adb00..9eb738676f 100644 --- a/services/real-time/config/settings.defaults.coffee +++ b/services/real-time/config/settings.defaults.coffee @@ -51,6 +51,7 @@ settings = forceDrainMsDelay: process.env['FORCE_DRAIN_MS_DELAY'] or false console.log process.env['REDIS_CLUSTER_HOSTS'], process.env['REDIS_CLUSTER_NATMAP'] +console.log typeof(process.env['REDIS_CLUSTER_HOSTS']) if process.env['REDIS_CLUSTER_HOSTS']? or process.env['REDIS_CLUSTER_NATMAP']? for redisKey in Object.keys(settings.redis) From b193045a2a69de16df6d9bf27783f405885dfafc Mon Sep 17 00:00:00 2001 From: Henry Oswald Date: Fri, 25 Jan 2019 10:04:26 +0000 Subject: [PATCH 41/53] log out real time settings --- services/real-time/app.coffee | 2 ++ 1 file changed, 2 insertions(+) diff --git a/services/real-time/app.coffee b/services/real-time/app.coffee index b5eeceedde..ca7cacfda3 100644 --- a/services/real-time/app.coffee +++ b/services/real-time/app.coffee @@ -2,6 +2,8 @@ Metrics = require("metrics-sharelatex") Settings = require "settings-sharelatex" Metrics.initialize(Settings.appName or "real-time") +console.log Settings.redis + logger = require "logger-sharelatex" logger.initialize("real-time-sharelatex") Metrics.event_loop.monitor(logger) From 2b1f67b6fae173d3c0e7f934c9ed2d990bebe12e Mon Sep 17 00:00:00 2001 From: Henry Oswald Date: Fri, 25 Jan 2019 10:30:31 +0000 Subject: [PATCH 42/53] remove natmap from defaults config --- .../real-time/config/settings.defaults.coffee | 15 ++------------- 1 file changed, 2 insertions(+), 13 deletions(-) diff --git a/services/real-time/config/settings.defaults.coffee b/services/real-time/config/settings.defaults.coffee index 9eb738676f..46297b9dfc 100644 --- a/services/real-time/config/settings.defaults.coffee +++ b/services/real-time/config/settings.defaults.coffee @@ -50,17 +50,6 @@ settings = forceDrainMsDelay: process.env['FORCE_DRAIN_MS_DELAY'] or false -console.log process.env['REDIS_CLUSTER_HOSTS'], process.env['REDIS_CLUSTER_NATMAP'] -console.log typeof(process.env['REDIS_CLUSTER_HOSTS']) -if process.env['REDIS_CLUSTER_HOSTS']? or process.env['REDIS_CLUSTER_NATMAP']? - - for redisKey in Object.keys(settings.redis) - - if process.env['REDIS_CLUSTER_HOSTS']? - settings.redis[redisKey].cluster = JSON.parse(process.env['REDIS_CLUSTER_HOSTS']) - - - if process.env['REDIS_CLUSTER_NATMAP']? - settings.redis[redisKey].natMap = JSON.parse(process.env['REDIS_CLUSTER_NATMAP']) -console.log settings + +# console.log settings.redis module.exports = settings \ No newline at end of file From 01d3d9d13ed6c6605ae9b924594d81c68393e017 Mon Sep 17 00:00:00 2001 From: Henry Oswald Date: Fri, 25 Jan 2019 10:37:00 +0000 Subject: [PATCH 43/53] remove natmap --- services/real-time/config/settings.defaults.coffee | 3 --- 1 file changed, 3 deletions(-) diff --git a/services/real-time/config/settings.defaults.coffee b/services/real-time/config/settings.defaults.coffee index 46297b9dfc..337c116e14 100644 --- a/services/real-time/config/settings.defaults.coffee +++ b/services/real-time/config/settings.defaults.coffee @@ -8,7 +8,6 @@ settings = clientsInProject: ({project_id}) -> "clients_in_project:#{project_id}" connectedUser: ({project_id, client_id})-> "connected_user:#{project_id}:#{client_id}" cluster: process.env['REDIS_CLUSTER_HOSTS'] - natMap: process.env['REDIS_CLUSTER_NATMAP'] documentupdater: host: process.env['DOC_UPDATER_REDIS_HOST'] or process.env['REDIS_HOST'] or "localhost" @@ -17,14 +16,12 @@ settings = key_schema: pendingUpdates: ({doc_id}) -> "PendingUpdates:#{doc_id}" cluster: process.env['REDIS_CLUSTER_HOSTS'] - natMap: process.env['REDIS_CLUSTER_NATMAP'] websessions: host: process.env['WEB_REDIS_HOST'] or process.env['REDIS_HOST'] or "localhost" port: process.env['WEB_REDIS_PORT'] or process.env['REDIS_PORT'] or "6379" password: process.env["WEB_REDIS_PASSWORD"] or process.env["REDIS_PASSWORD"] or "" cluster: process.env['REDIS_CLUSTER_HOSTS'] - natMap: process.env['REDIS_CLUSTER_NATMAP'] internal: realTime: From 338bee061cee5992362b19457810027ec52ea98c Mon Sep 17 00:00:00 2001 From: Henry Oswald Date: Fri, 25 Jan 2019 10:50:34 +0000 Subject: [PATCH 44/53] remove the cluster key as well --- services/real-time/config/settings.defaults.coffee | 3 --- 1 file changed, 3 deletions(-) diff --git a/services/real-time/config/settings.defaults.coffee b/services/real-time/config/settings.defaults.coffee index 337c116e14..4f48c3bcb3 100644 --- a/services/real-time/config/settings.defaults.coffee +++ b/services/real-time/config/settings.defaults.coffee @@ -7,7 +7,6 @@ settings = key_schema: clientsInProject: ({project_id}) -> "clients_in_project:#{project_id}" connectedUser: ({project_id, client_id})-> "connected_user:#{project_id}:#{client_id}" - cluster: process.env['REDIS_CLUSTER_HOSTS'] documentupdater: host: process.env['DOC_UPDATER_REDIS_HOST'] or process.env['REDIS_HOST'] or "localhost" @@ -15,13 +14,11 @@ settings = password: process.env["DOC_UPDATER_REDIS_PASSWORD"] or process.env["REDIS_PASSWORD"] or "" key_schema: pendingUpdates: ({doc_id}) -> "PendingUpdates:#{doc_id}" - cluster: process.env['REDIS_CLUSTER_HOSTS'] websessions: host: process.env['WEB_REDIS_HOST'] or process.env['REDIS_HOST'] or "localhost" port: process.env['WEB_REDIS_PORT'] or process.env['REDIS_PORT'] or "6379" password: process.env["WEB_REDIS_PASSWORD"] or process.env["REDIS_PASSWORD"] or "" - cluster: process.env['REDIS_CLUSTER_HOSTS'] internal: realTime: From 08e48afcb99ae50aeaf37b65b698f5293bf94f62 Mon Sep 17 00:00:00 2001 From: Henry Oswald Date: Fri, 25 Jan 2019 10:57:36 +0000 Subject: [PATCH 45/53] more logging --- services/real-time/app.coffee | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/services/real-time/app.coffee b/services/real-time/app.coffee index ca7cacfda3..5a31f98180 100644 --- a/services/real-time/app.coffee +++ b/services/real-time/app.coffee @@ -21,7 +21,8 @@ SessionSockets = require('session.socket.io') CookieParser = require("cookie-parser") -sessionRedisClient.set "hello-a", "hello-there" +sessionRedisClient.set "hello-a", "hello-there", (err)-> + console.log "setting hello-a", err DrainManager = require("./app/js/DrainManager") From 2e46cfb3ebb9062425102327b665c582d3b90a1d Mon Sep 17 00:00:00 2001 From: Henry Oswald Date: Fri, 25 Jan 2019 16:30:16 +0000 Subject: [PATCH 46/53] bump node redis to 1.0.5 --- services/real-time/npm-shrinkwrap.json | 132 ++++++++----------------- services/real-time/package.json | 2 +- 2 files changed, 43 insertions(+), 91 deletions(-) diff --git a/services/real-time/npm-shrinkwrap.json b/services/real-time/npm-shrinkwrap.json index 356b9e51f4..df9b7d673b 100644 --- a/services/real-time/npm-shrinkwrap.json +++ b/services/real-time/npm-shrinkwrap.json @@ -327,11 +327,6 @@ "from": "bintrees@1.0.1", "resolved": "https://registry.npmjs.org/bintrees/-/bintrees-1.0.1.tgz" }, - "bluebird": { - "version": "3.5.1", - "from": "bluebird@>=3.3.4 <4.0.0", - "resolved": "https://registry.npmjs.org/bluebird/-/bluebird-3.5.1.tgz" - }, "body-parser": { "version": "1.18.3", "from": "body-parser@>=1.12.0 <2.0.0", @@ -403,9 +398,9 @@ "resolved": "https://registry.npmjs.org/check-error/-/check-error-1.0.2.tgz" }, "cluster-key-slot": { - "version": "1.0.9", + "version": "1.0.12", "from": "cluster-key-slot@>=1.0.6 <2.0.0", - "resolved": "https://registry.npmjs.org/cluster-key-slot/-/cluster-key-slot-1.0.9.tgz" + "resolved": "https://registry.npmjs.org/cluster-key-slot/-/cluster-key-slot-1.0.12.tgz" }, "coffee-script": { "version": "1.12.4", @@ -530,9 +525,9 @@ "optional": true }, "denque": { - "version": "1.2.3", + "version": "1.4.0", "from": "denque@>=1.1.0 <2.0.0", - "resolved": "https://registry.npmjs.org/denque/-/denque-1.2.3.tgz" + "resolved": "https://registry.npmjs.org/denque/-/denque-1.4.0.tgz" }, "depd": { "version": "1.1.2", @@ -1125,6 +1120,23 @@ "from": "inherits@2.0.3", "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.3.tgz" }, + "ioredis": { + "version": "4.6.0", + "from": "ioredis@4.6.0", + "resolved": "https://registry.npmjs.org/ioredis/-/ioredis-4.6.0.tgz", + "dependencies": { + "debug": { + "version": "3.2.6", + "from": "debug@>=3.1.0 <4.0.0", + "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.6.tgz" + }, + "ms": { + "version": "2.1.1", + "from": "ms@>=2.1.1 <3.0.0", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.1.tgz" + } + } + }, "ipaddr.js": { "version": "1.6.0", "from": "ipaddr.js@1.6.0", @@ -1202,96 +1214,26 @@ "from": "lodash@>=0.9.2 <0.10.0", "resolved": "https://registry.npmjs.org/lodash/-/lodash-0.9.2.tgz" }, - "lodash.assign": { - "version": "4.2.0", - "from": "lodash.assign@>=4.2.0 <5.0.0", - "resolved": "https://registry.npmjs.org/lodash.assign/-/lodash.assign-4.2.0.tgz" - }, - "lodash.bind": { - "version": "4.2.1", - "from": "lodash.bind@>=4.2.1 <5.0.0", - "resolved": "https://registry.npmjs.org/lodash.bind/-/lodash.bind-4.2.1.tgz" - }, - "lodash.clone": { - "version": "4.5.0", - "from": "lodash.clone@>=4.5.0 <5.0.0", - "resolved": "https://registry.npmjs.org/lodash.clone/-/lodash.clone-4.5.0.tgz" - }, - "lodash.clonedeep": { - "version": "4.5.0", - "from": "lodash.clonedeep@>=4.5.0 <5.0.0", - "resolved": "https://registry.npmjs.org/lodash.clonedeep/-/lodash.clonedeep-4.5.0.tgz" - }, "lodash.defaults": { "version": "4.2.0", "from": "lodash.defaults@>=4.2.0 <5.0.0", "resolved": "https://registry.npmjs.org/lodash.defaults/-/lodash.defaults-4.2.0.tgz" }, - "lodash.difference": { - "version": "4.5.0", - "from": "lodash.difference@>=4.5.0 <5.0.0", - "resolved": "https://registry.npmjs.org/lodash.difference/-/lodash.difference-4.5.0.tgz" - }, "lodash.flatten": { "version": "4.4.0", "from": "lodash.flatten@>=4.4.0 <5.0.0", "resolved": "https://registry.npmjs.org/lodash.flatten/-/lodash.flatten-4.4.0.tgz" }, - "lodash.foreach": { - "version": "4.5.0", - "from": "lodash.foreach@>=4.5.0 <5.0.0", - "resolved": "https://registry.npmjs.org/lodash.foreach/-/lodash.foreach-4.5.0.tgz" - }, "lodash.get": { "version": "4.4.2", "from": "lodash.get@>=4.4.2 <5.0.0", "resolved": "https://registry.npmjs.org/lodash.get/-/lodash.get-4.4.2.tgz" }, - "lodash.isempty": { - "version": "4.4.0", - "from": "lodash.isempty@>=4.4.0 <5.0.0", - "resolved": "https://registry.npmjs.org/lodash.isempty/-/lodash.isempty-4.4.0.tgz" - }, - "lodash.keys": { - "version": "4.2.0", - "from": "lodash.keys@>=4.2.0 <5.0.0", - "resolved": "https://registry.npmjs.org/lodash.keys/-/lodash.keys-4.2.0.tgz" - }, - "lodash.noop": { - "version": "3.0.1", - "from": "lodash.noop@>=3.0.1 <4.0.0", - "resolved": "https://registry.npmjs.org/lodash.noop/-/lodash.noop-3.0.1.tgz" - }, - "lodash.partial": { - "version": "4.2.1", - "from": "lodash.partial@>=4.2.1 <5.0.0", - "resolved": "https://registry.npmjs.org/lodash.partial/-/lodash.partial-4.2.1.tgz" - }, - "lodash.pick": { - "version": "4.4.0", - "from": "lodash.pick@>=4.4.0 <5.0.0", - "resolved": "https://registry.npmjs.org/lodash.pick/-/lodash.pick-4.4.0.tgz" - }, "lodash.pickby": { "version": "4.6.0", "from": "lodash.pickby@>=4.6.0 <5.0.0", "resolved": "https://registry.npmjs.org/lodash.pickby/-/lodash.pickby-4.6.0.tgz" }, - "lodash.sample": { - "version": "4.2.1", - "from": "lodash.sample@>=4.2.1 <5.0.0", - "resolved": "https://registry.npmjs.org/lodash.sample/-/lodash.sample-4.2.1.tgz" - }, - "lodash.shuffle": { - "version": "4.2.0", - "from": "lodash.shuffle@>=4.2.0 <5.0.0", - "resolved": "https://registry.npmjs.org/lodash.shuffle/-/lodash.shuffle-4.2.0.tgz" - }, - "lodash.values": { - "version": "4.3.0", - "from": "lodash.values@>=4.3.0 <5.0.0", - "resolved": "https://registry.npmjs.org/lodash.values/-/lodash.values-4.3.0.tgz" - }, "logger-sharelatex": { "version": "1.5.9", "from": "git+https://github.com/sharelatex/logger-sharelatex.git#v1.5.9", @@ -1728,14 +1670,19 @@ "resolved": "https://registry.npmjs.org/redis/-/redis-0.12.1.tgz" }, "redis-commands": { - "version": "1.3.5", - "from": "redis-commands@>=1.2.0 <2.0.0", - "resolved": "https://registry.npmjs.org/redis-commands/-/redis-commands-1.3.5.tgz" + "version": "1.4.0", + "from": "redis-commands@1.4.0", + "resolved": "https://registry.npmjs.org/redis-commands/-/redis-commands-1.4.0.tgz" + }, + "redis-errors": { + "version": "1.2.0", + "from": "redis-errors@>=1.2.0 <2.0.0", + "resolved": "https://registry.npmjs.org/redis-errors/-/redis-errors-1.2.0.tgz" }, "redis-parser": { - "version": "2.6.0", - "from": "redis-parser@>=2.4.0 <3.0.0", - "resolved": "https://registry.npmjs.org/redis-parser/-/redis-parser-2.6.0.tgz" + "version": "3.0.0", + "from": "redis-parser@>=3.0.0 <4.0.0", + "resolved": "https://registry.npmjs.org/redis-parser/-/redis-parser-3.0.0.tgz" }, "redis-sentinel": { "version": "0.1.1", @@ -1750,9 +1697,9 @@ } }, "redis-sharelatex": { - "version": "4156cfd9ba9444d87a599f6d7035b73b505070f2", - "from": "git+https://github.com/sharelatex/redis-sharelatex.git#4156cfd9ba9444d87a599f6d7035b73b505070f2", - "resolved": "git+https://github.com/sharelatex/redis-sharelatex.git#4156cfd9ba9444d87a599f6d7035b73b505070f2", + "version": "1.0.5", + "from": "git+https://github.com/sharelatex/redis-sharelatex.git#v1.0.5", + "resolved": "git+https://github.com/sharelatex/redis-sharelatex.git#d6130c85bad845359729c45b8467d9d8a3ff44de", "dependencies": { "async": { "version": "2.6.1", @@ -1765,9 +1712,9 @@ "resolved": "https://registry.npmjs.org/coffee-script/-/coffee-script-1.8.0.tgz" }, "lodash": { - "version": "4.17.10", + "version": "4.17.11", "from": "lodash@>=4.17.10 <5.0.0", - "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.10.tgz" + "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.11.tgz" }, "mkdirp": { "version": "0.3.5", @@ -1962,6 +1909,11 @@ "from": "stack-trace@0.0.9", "resolved": "https://registry.npmjs.org/stack-trace/-/stack-trace-0.0.9.tgz" }, + "standard-as-callback": { + "version": "1.0.1", + "from": "standard-as-callback@>=1.0.0 <2.0.0", + "resolved": "https://registry.npmjs.org/standard-as-callback/-/standard-as-callback-1.0.1.tgz" + }, "statsd-parser": { "version": "0.0.4", "from": "statsd-parser@>=0.0.4 <0.1.0", diff --git a/services/real-time/package.json b/services/real-time/package.json index e5aa8ee54d..6268437247 100644 --- a/services/real-time/package.json +++ b/services/real-time/package.json @@ -30,7 +30,7 @@ "express-session": "^1.9.1", "logger-sharelatex": "git+https://github.com/sharelatex/logger-sharelatex.git#v1.5.9", "metrics-sharelatex": "git+https://github.com/sharelatex/metrics-sharelatex.git#v2.0.12", - "redis-sharelatex": "git+https://github.com/sharelatex/redis-sharelatex.git#4156cfd9ba9444d87a599f6d7035b73b505070f2", + "redis-sharelatex": "git+https://github.com/sharelatex/redis-sharelatex.git#v1.0.5", "request": "~2.34.0", "session.socket.io": "^0.1.6", "settings-sharelatex": "git+https://github.com/sharelatex/settings-sharelatex.git#v1.1.0", From 23e0ce678e3bc0c284a4e148f1175267d284ca22 Mon Sep 17 00:00:00 2001 From: Henry Oswald Date: Thu, 31 Jan 2019 15:33:11 +0000 Subject: [PATCH 47/53] call app real-time --- services/real-time/app.coffee | 6 +----- 1 file changed, 1 insertion(+), 5 deletions(-) diff --git a/services/real-time/app.coffee b/services/real-time/app.coffee index 5a31f98180..1035f83b68 100644 --- a/services/real-time/app.coffee +++ b/services/real-time/app.coffee @@ -5,7 +5,7 @@ Metrics.initialize(Settings.appName or "real-time") console.log Settings.redis logger = require "logger-sharelatex" -logger.initialize("real-time-sharelatex") +logger.initialize("real-time") Metrics.event_loop.monitor(logger) express = require("express") @@ -20,10 +20,6 @@ RedisStore = require('connect-redis')(session) SessionSockets = require('session.socket.io') CookieParser = require("cookie-parser") - -sessionRedisClient.set "hello-a", "hello-there", (err)-> - console.log "setting hello-a", err - DrainManager = require("./app/js/DrainManager") # Set up socket.io server From 6cdfd5b659e40242d7977b7a4af2df44e3a8fbd4 Mon Sep 17 00:00:00 2001 From: Henry Oswald Date: Fri, 1 Feb 2019 17:25:45 +0000 Subject: [PATCH 48/53] added http auth to config --- services/real-time/Jenkinsfile | 10 +- services/real-time/Makefile | 6 +- services/real-time/buildscript.txt | 5 +- .../real-time/config/settings.defaults.coffee | 4 +- services/real-time/docker-compose.ci.yml | 13 +- services/real-time/docker-compose.yml | 12 +- services/real-time/npm-shrinkwrap.json | 853 +++++++----------- services/real-time/package.json | 8 +- 8 files changed, 349 insertions(+), 562 deletions(-) diff --git a/services/real-time/Jenkinsfile b/services/real-time/Jenkinsfile index c553a7ef79..d7b6b353a1 100644 --- a/services/real-time/Jenkinsfile +++ b/services/real-time/Jenkinsfile @@ -48,8 +48,11 @@ pipeline { } } - stage('Package and publish build') { + stage('Package and docker push') { steps { + sh 'echo ${BUILD_NUMBER} > build_number.txt' + sh 'touch build.tar.gz' // Avoid tar warning about files changing during read + sh 'DOCKER_COMPOSE_FLAGS="-f docker-compose.ci.yml" make tar' withCredentials([file(credentialsId: 'gcr.io_overleaf-ops', variable: 'DOCKER_REPO_KEY_PATH')]) { sh 'docker login -u _json_key --password-stdin https://gcr.io/overleaf-ops < ${DOCKER_REPO_KEY_PATH}' @@ -60,9 +63,12 @@ pipeline { } } - stage('Publish build number') { + stage('Publish to s3') { steps { sh 'echo ${BRANCH_NAME}-${BUILD_NUMBER} > build_number.txt' + withAWS(credentials:'S3_CI_BUILDS_AWS_KEYS', region:"${S3_REGION_BUILD_ARTEFACTS}") { + s3Upload(file:'build.tar.gz', bucket:"${S3_BUCKET_BUILD_ARTEFACTS}", path:"${JOB_NAME}/${BUILD_NUMBER}.tar.gz") + } withAWS(credentials:'S3_CI_BUILDS_AWS_KEYS', region:"${S3_REGION_BUILD_ARTEFACTS}") { // The deployment process uses this file to figure out the latest build s3Upload(file:'build_number.txt', bucket:"${S3_BUCKET_BUILD_ARTEFACTS}", path:"${JOB_NAME}/latest") diff --git a/services/real-time/Makefile b/services/real-time/Makefile index 8620b42f06..fdf938da5a 100644 --- a/services/real-time/Makefile +++ b/services/real-time/Makefile @@ -1,7 +1,7 @@ # This file was auto-generated, do not edit it directly. # Instead run bin/update_build_scripts from # https://github.com/sharelatex/sharelatex-dev-environment -# Version: 1.1.10 +# Version: 1.1.12 BUILD_NUMBER ?= local BRANCH_NAME ?= $(shell git rev-parse --abbrev-ref HEAD) @@ -13,7 +13,6 @@ DOCKER_COMPOSE := BUILD_NUMBER=$(BUILD_NUMBER) \ MOCHA_GREP=${MOCHA_GREP} \ docker-compose ${DOCKER_COMPOSE_FLAGS} - clean: docker rmi ci/$(PROJECT_NAME):$(BRANCH_NAME)-$(BUILD_NUMBER) docker rmi gcr.io/overleaf-ops/$(PROJECT_NAME):$(BRANCH_NAME)-$(BUILD_NUMBER) @@ -40,6 +39,9 @@ build: --tag gcr.io/overleaf-ops/$(PROJECT_NAME):$(BRANCH_NAME)-$(BUILD_NUMBER) \ . +tar: + $(DOCKER_COMPOSE) up tar + publish: docker push $(DOCKER_REPO)/$(PROJECT_NAME):$(BRANCH_NAME)-$(BUILD_NUMBER) diff --git a/services/real-time/buildscript.txt b/services/real-time/buildscript.txt index c343ba8891..5d6ccb471c 100644 --- a/services/real-time/buildscript.txt +++ b/services/real-time/buildscript.txt @@ -1,9 +1,8 @@ ---script-version=1.1.10 real-time +--language=coffeescript --node-version=6.15.1 --acceptance-creds=None ---language=coffeescript --dependencies=mongo,redis --docker-repos=gcr.io/overleaf-ops ---kube=false --build-target=docker +--script-version=1.1.12 diff --git a/services/real-time/config/settings.defaults.coffee b/services/real-time/config/settings.defaults.coffee index 4f48c3bcb3..ed9fa4f90b 100644 --- a/services/real-time/config/settings.defaults.coffee +++ b/services/real-time/config/settings.defaults.coffee @@ -30,8 +30,8 @@ settings = apis: web: url: "http://#{process.env['WEB_HOST'] or "localhost"}:#{process.env['WEB_PORT'] or 3000}" - user: "sharelatex" - pass: "password" + user: process.env['WEB_API_USER'] or "sharelatex" + pass: process.env['WEB_API_PASSWORD'] or "password" documentupdater: url: "http://#{process.env['DOCUMENT_UPDATER_HOST'] or process.env['DOCUPDATER_HOST'] or "localhost"}:3003" diff --git a/services/real-time/docker-compose.ci.yml b/services/real-time/docker-compose.ci.yml index 5ab90e1825..36b52f8f8b 100644 --- a/services/real-time/docker-compose.ci.yml +++ b/services/real-time/docker-compose.ci.yml @@ -1,7 +1,7 @@ # This file was auto-generated, do not edit it directly. # Instead run bin/update_build_scripts from # https://github.com/sharelatex/sharelatex-dev-environment -# Version: 1.1.10 +# Version: 1.1.12 version: "2" @@ -11,6 +11,7 @@ services: user: node command: npm run test:unit:_run + test_acceptance: build: . image: ci/$PROJECT_NAME:$BRANCH_NAME-$BUILD_NUMBER @@ -26,6 +27,16 @@ services: user: node command: npm run test:acceptance:_run + + + tar: + build: . + image: ci/$PROJECT_NAME:$BRANCH_NAME-$BUILD_NUMBER + volumes: + - ./:/tmp/build/ + command: tar -czf /tmp/build/build.tar.gz --exclude=build.tar.gz --exclude-vcs . + user: root + redis: image: redis diff --git a/services/real-time/docker-compose.yml b/services/real-time/docker-compose.yml index aeceafb3f3..8bb7857cb6 100644 --- a/services/real-time/docker-compose.yml +++ b/services/real-time/docker-compose.yml @@ -1,7 +1,7 @@ # This file was auto-generated, do not edit it directly. # Instead run bin/update_build_scripts from # https://github.com/sharelatex/sharelatex-dev-environment -# Version: 1.1.10 +# Version: 1.1.12 version: "2" @@ -33,6 +33,16 @@ services: - redis command: npm run test:acceptance + + + tar: + build: . + image: ci/$PROJECT_NAME:$BRANCH_NAME-$BUILD_NUMBER + volumes: + - ./:/tmp/build/ + command: tar -czf /tmp/build/build.tar.gz --exclude=build.tar.gz --exclude-vcs . + user: root + redis: image: redis diff --git a/services/real-time/npm-shrinkwrap.json b/services/real-time/npm-shrinkwrap.json index df9b7d673b..3706c6be34 100644 --- a/services/real-time/npm-shrinkwrap.json +++ b/services/real-time/npm-shrinkwrap.json @@ -29,11 +29,6 @@ "from": "@google-cloud/common@>=0.26.0 <0.27.0", "resolved": "https://registry.npmjs.org/@google-cloud/common/-/common-0.26.2.tgz" }, - "nan": { - "version": "2.12.1", - "from": "nan@>=2.11.1 <3.0.0", - "resolved": "https://registry.npmjs.org/nan/-/nan-2.12.1.tgz" - }, "through2": { "version": "3.0.0", "from": "through2@>=3.0.0 <4.0.0", @@ -52,14 +47,19 @@ "resolved": "https://registry.npmjs.org/@google-cloud/promisify/-/promisify-0.3.1.tgz" }, "@google-cloud/trace-agent": { - "version": "3.5.0", + "version": "3.5.2", "from": "@google-cloud/trace-agent@>=3.2.0 <4.0.0", - "resolved": "https://registry.npmjs.org/@google-cloud/trace-agent/-/trace-agent-3.5.0.tgz", + "resolved": "https://registry.npmjs.org/@google-cloud/trace-agent/-/trace-agent-3.5.2.tgz", "dependencies": { "@google-cloud/common": { - "version": "0.28.0", - "from": "@google-cloud/common@>=0.28.0 <0.29.0", - "resolved": "https://registry.npmjs.org/@google-cloud/common/-/common-0.28.0.tgz" + "version": "0.30.2", + "from": "@google-cloud/common@>=0.30.0 <0.31.0", + "resolved": "https://registry.npmjs.org/@google-cloud/common/-/common-0.30.2.tgz" + }, + "google-auth-library": { + "version": "3.0.1", + "from": "google-auth-library@>=3.0.0 <4.0.0", + "resolved": "https://registry.npmjs.org/google-auth-library/-/google-auth-library-3.0.1.tgz" }, "uuid": { "version": "3.3.2", @@ -123,28 +123,6 @@ "from": "@sindresorhus/is@>=0.13.0 <0.14.0", "resolved": "https://registry.npmjs.org/@sindresorhus/is/-/is-0.13.0.tgz" }, - "@sinonjs/commons": { - "version": "1.3.0", - "from": "@sinonjs/commons@>=1.2.0 <2.0.0", - "resolved": "https://registry.npmjs.org/@sinonjs/commons/-/commons-1.3.0.tgz", - "dependencies": { - "type-detect": { - "version": "4.0.8", - "from": "type-detect@4.0.8", - "resolved": "https://registry.npmjs.org/type-detect/-/type-detect-4.0.8.tgz" - } - } - }, - "@sinonjs/formatio": { - "version": "3.1.0", - "from": "@sinonjs/formatio@>=3.1.0 <4.0.0", - "resolved": "https://registry.npmjs.org/@sinonjs/formatio/-/formatio-3.1.0.tgz" - }, - "@sinonjs/samsam": { - "version": "3.0.2", - "from": "@sinonjs/samsam@>=3.0.2 <4.0.0", - "resolved": "https://registry.npmjs.org/@sinonjs/samsam/-/samsam-3.0.2.tgz" - }, "@types/caseless": { "version": "0.12.1", "from": "@types/caseless@*", @@ -171,9 +149,9 @@ "resolved": "https://registry.npmjs.org/@types/long/-/long-4.0.0.tgz" }, "@types/node": { - "version": "10.12.18", + "version": "10.12.20", "from": "@types/node@*", - "resolved": "https://registry.npmjs.org/@types/node/-/node-10.12.18.tgz" + "resolved": "https://registry.npmjs.org/@types/node/-/node-10.12.20.tgz" }, "@types/request": { "version": "2.48.1", @@ -186,14 +164,9 @@ "resolved": "https://registry.npmjs.org/@types/semver/-/semver-5.5.0.tgz" }, "@types/tough-cookie": { - "version": "2.3.4", + "version": "2.3.5", "from": "@types/tough-cookie@*", - "resolved": "https://registry.npmjs.org/@types/tough-cookie/-/tough-cookie-2.3.4.tgz" - }, - "abbrev": { - "version": "1.1.1", - "from": "abbrev@>=1.0.0 <2.0.0", - "resolved": "https://registry.npmjs.org/abbrev/-/abbrev-1.1.1.tgz" + "resolved": "https://registry.npmjs.org/@types/tough-cookie/-/tough-cookie-2.3.5.tgz" }, "accepts": { "version": "1.3.5", @@ -215,38 +188,16 @@ "from": "agent-base@>=4.1.0 <5.0.0", "resolved": "https://registry.npmjs.org/agent-base/-/agent-base-4.2.1.tgz" }, - "ansi-regex": { - "version": "0.2.1", - "from": "ansi-regex@>=0.2.0 <0.3.0", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-0.2.1.tgz" - }, - "ansi-styles": { - "version": "1.1.0", - "from": "ansi-styles@>=1.1.0 <2.0.0", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-1.1.0.tgz" - }, - "argparse": { - "version": "0.1.16", - "from": "argparse@>=0.1.11 <0.2.0", - "resolved": "https://registry.npmjs.org/argparse/-/argparse-0.1.16.tgz", - "dependencies": { - "underscore.string": { - "version": "2.4.0", - "from": "underscore.string@>=2.4.0 <2.5.0", - "resolved": "https://registry.npmjs.org/underscore.string/-/underscore.string-2.4.0.tgz" - } - } + "ajv": { + "version": "6.7.0", + "from": "ajv@>=6.5.5 <7.0.0", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.7.0.tgz" }, "array-flatten": { "version": "1.1.1", "from": "array-flatten@1.1.1", "resolved": "https://registry.npmjs.org/array-flatten/-/array-flatten-1.1.1.tgz" }, - "array-from": { - "version": "2.1.1", - "from": "array-from@>=2.1.1 <3.0.0", - "resolved": "https://registry.npmjs.org/array-from/-/array-from-2.1.1.tgz" - }, "arrify": { "version": "1.0.1", "from": "arrify@>=1.0.1 <2.0.0", @@ -280,12 +231,22 @@ "from": "async-listener@>=0.6.0 <0.7.0", "resolved": "https://registry.npmjs.org/async-listener/-/async-listener-0.6.10.tgz" }, + "asynckit": { + "version": "0.4.0", + "from": "asynckit@>=0.4.0 <0.5.0", + "resolved": "https://registry.npmjs.org/asynckit/-/asynckit-0.4.0.tgz" + }, "aws-sign2": { "version": "0.5.0", "from": "aws-sign2@>=0.5.0 <0.6.0", "resolved": "https://registry.npmjs.org/aws-sign2/-/aws-sign2-0.5.0.tgz", "optional": true }, + "aws4": { + "version": "1.8.0", + "from": "aws4@>=1.8.0 <2.0.0", + "resolved": "https://registry.npmjs.org/aws4/-/aws4-1.8.0.tgz" + }, "axios": { "version": "0.18.0", "from": "axios@>=0.18.0 <0.19.0", @@ -296,6 +257,11 @@ "from": "balanced-match@^1.0.0", "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.0.tgz" }, + "base64-js": { + "version": "1.3.0", + "from": "base64-js@>=1.3.0 <2.0.0", + "resolved": "https://registry.npmjs.org/base64-js/-/base64-js-1.3.0.tgz" + }, "base64-url": { "version": "1.2.1", "from": "base64-url@1.2.1", @@ -312,15 +278,20 @@ "from": "basic-auth-connect@>=1.0.0 <2.0.0", "resolved": "https://registry.npmjs.org/basic-auth-connect/-/basic-auth-connect-1.0.0.tgz" }, + "bcrypt-pbkdf": { + "version": "1.0.2", + "from": "bcrypt-pbkdf@>=1.0.0 <2.0.0", + "resolved": "https://registry.npmjs.org/bcrypt-pbkdf/-/bcrypt-pbkdf-1.0.2.tgz" + }, "bignumber.js": { "version": "7.2.1", "from": "bignumber.js@>=7.0.0 <8.0.0", "resolved": "https://registry.npmjs.org/bignumber.js/-/bignumber.js-7.2.1.tgz" }, "bindings": { - "version": "1.3.1", + "version": "1.4.0", "from": "bindings@>=1.2.1 <2.0.0", - "resolved": "https://registry.npmjs.org/bindings/-/bindings-1.3.1.tgz" + "resolved": "https://registry.npmjs.org/bindings/-/bindings-1.4.0.tgz" }, "bintrees": { "version": "1.0.1", @@ -381,22 +352,17 @@ "from": "bytes@3.0.0", "resolved": "https://registry.npmjs.org/bytes/-/bytes-3.0.0.tgz" }, + "caseless": { + "version": "0.12.0", + "from": "caseless@>=0.12.0 <0.13.0", + "resolved": "https://registry.npmjs.org/caseless/-/caseless-0.12.0.tgz" + }, "chai": { "version": "1.9.2", "from": "chai@>=1.9.1 <1.10.0", "resolved": "https://registry.npmjs.org/chai/-/chai-1.9.2.tgz", "dev": true }, - "chalk": { - "version": "0.5.1", - "from": "chalk@>=0.5.0 <0.6.0", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-0.5.1.tgz" - }, - "check-error": { - "version": "1.0.2", - "from": "check-error@>=1.0.1 <2.0.0", - "resolved": "https://registry.npmjs.org/check-error/-/check-error-1.0.2.tgz" - }, "cluster-key-slot": { "version": "1.0.12", "from": "cluster-key-slot@>=1.0.6 <2.0.0", @@ -407,22 +373,12 @@ "from": "coffee-script@1.12.4", "resolved": "https://registry.npmjs.org/coffee-script/-/coffee-script-1.12.4.tgz" }, - "colors": { - "version": "0.6.2", - "from": "colors@>=0.6.2 <0.7.0", - "resolved": "https://registry.npmjs.org/colors/-/colors-0.6.2.tgz" - }, "combined-stream": { "version": "0.0.7", "from": "combined-stream@>=0.0.4 <0.1.0", "resolved": "https://registry.npmjs.org/combined-stream/-/combined-stream-0.0.7.tgz", "optional": true }, - "commander": { - "version": "2.0.0", - "from": "commander@2.0.0", - "resolved": "http://registry.npmjs.org/commander/-/commander-2.0.0.tgz" - }, "concat-map": { "version": "0.0.1", "from": "concat-map@0.0.1", @@ -497,10 +453,17 @@ "resolved": "https://registry.npmjs.org/ctype/-/ctype-0.5.3.tgz", "optional": true }, - "dateformat": { - "version": "1.0.2-1.2.3", - "from": "dateformat@1.0.2-1.2.3", - "resolved": "https://registry.npmjs.org/dateformat/-/dateformat-1.0.2-1.2.3.tgz" + "dashdash": { + "version": "1.14.1", + "from": "dashdash@>=1.12.0 <2.0.0", + "resolved": "https://registry.npmjs.org/dashdash/-/dashdash-1.14.1.tgz", + "dependencies": { + "assert-plus": { + "version": "1.0.0", + "from": "assert-plus@^1.0.0", + "resolved": "https://registry.npmjs.org/assert-plus/-/assert-plus-1.0.0.tgz" + } + } }, "debug": { "version": "2.6.9", @@ -539,11 +502,6 @@ "from": "destroy@>=1.0.4 <1.1.0", "resolved": "https://registry.npmjs.org/destroy/-/destroy-1.0.4.tgz" }, - "diff": { - "version": "1.0.7", - "from": "diff@1.0.7", - "resolved": "https://registry.npmjs.org/diff/-/diff-1.0.7.tgz" - }, "dtrace-provider": { "version": "0.2.8", "from": "dtrace-provider@0.2.8", @@ -556,6 +514,11 @@ "from": "duplexify@>=3.6.0 <4.0.0", "resolved": "https://registry.npmjs.org/duplexify/-/duplexify-3.6.1.tgz" }, + "ecc-jsbn": { + "version": "0.1.2", + "from": "ecc-jsbn@>=0.1.1 <0.2.0", + "resolved": "https://registry.npmjs.org/ecc-jsbn/-/ecc-jsbn-0.1.2.tgz" + }, "ecdsa-sig-formatter": { "version": "1.0.10", "from": "ecdsa-sig-formatter@1.0.10", @@ -604,28 +567,14 @@ "escape-string-regexp": { "version": "1.0.5", "from": "escape-string-regexp@>=1.0.0 <2.0.0", - "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz" - }, - "esprima": { - "version": "1.0.4", - "from": "esprima@>=1.0.2 <1.1.0", - "resolved": "https://registry.npmjs.org/esprima/-/esprima-1.0.4.tgz" + "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz", + "dev": true }, "etag": { "version": "1.8.1", "from": "etag@>=1.8.1 <1.9.0", "resolved": "https://registry.npmjs.org/etag/-/etag-1.8.1.tgz" }, - "eventemitter2": { - "version": "0.4.14", - "from": "eventemitter2@>=0.4.13 <0.5.0", - "resolved": "https://registry.npmjs.org/eventemitter2/-/eventemitter2-0.4.14.tgz" - }, - "exit": { - "version": "0.1.2", - "from": "exit@>=0.1.1 <0.2.0", - "resolved": "https://registry.npmjs.org/exit/-/exit-0.1.2.tgz" - }, "express": { "version": "4.16.3", "from": "express@>=4.10.1 <5.0.0", @@ -692,6 +641,31 @@ "from": "extend@>=3.0.1 <4.0.0", "resolved": "https://registry.npmjs.org/extend/-/extend-3.0.2.tgz" }, + "extsprintf": { + "version": "1.3.0", + "from": "extsprintf@1.3.0", + "resolved": "https://registry.npmjs.org/extsprintf/-/extsprintf-1.3.0.tgz" + }, + "fast-deep-equal": { + "version": "2.0.1", + "from": "fast-deep-equal@>=2.0.1 <3.0.0", + "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-2.0.1.tgz" + }, + "fast-json-stable-stringify": { + "version": "2.0.0", + "from": "fast-json-stable-stringify@>=2.0.0 <3.0.0", + "resolved": "https://registry.npmjs.org/fast-json-stable-stringify/-/fast-json-stable-stringify-2.0.0.tgz" + }, + "fast-text-encoding": { + "version": "1.0.0", + "from": "fast-text-encoding@>=1.0.0 <2.0.0", + "resolved": "https://registry.npmjs.org/fast-text-encoding/-/fast-text-encoding-1.0.0.tgz" + }, + "file-uri-to-path": { + "version": "1.0.0", + "from": "file-uri-to-path@1.0.0", + "resolved": "https://registry.npmjs.org/file-uri-to-path/-/file-uri-to-path-1.0.0.tgz" + }, "finalhandler": { "version": "1.1.1", "from": "finalhandler@1.1.1", @@ -709,28 +683,6 @@ "from": "findit2@>=2.2.3 <3.0.0", "resolved": "https://registry.npmjs.org/findit2/-/findit2-2.2.3.tgz" }, - "findup-sync": { - "version": "0.1.3", - "from": "findup-sync@>=0.1.2 <0.2.0", - "resolved": "https://registry.npmjs.org/findup-sync/-/findup-sync-0.1.3.tgz", - "dependencies": { - "glob": { - "version": "3.2.11", - "from": "glob@>=3.2.9 <3.3.0", - "resolved": "https://registry.npmjs.org/glob/-/glob-3.2.11.tgz" - }, - "lodash": { - "version": "2.4.2", - "from": "lodash@>=2.4.1 <2.5.0", - "resolved": "https://registry.npmjs.org/lodash/-/lodash-2.4.2.tgz" - }, - "minimatch": { - "version": "0.3.0", - "from": "minimatch@>=0.3.0 <0.4.0", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-0.3.0.tgz" - } - } - }, "flexbuffer": { "version": "0.0.6", "from": "flexbuffer@0.0.6", @@ -777,18 +729,6 @@ "from": "fresh@0.5.2", "resolved": "https://registry.npmjs.org/fresh/-/fresh-0.5.2.tgz" }, - "fs-extra": { - "version": "0.9.1", - "from": "fs-extra@>=0.9.1 <0.10.0", - "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-0.9.1.tgz", - "dependencies": { - "ncp": { - "version": "0.5.1", - "from": "ncp@>=0.5.1 <0.6.0", - "resolved": "https://registry.npmjs.org/ncp/-/ncp-0.5.1.tgz" - } - } - }, "fs.realpath": { "version": "1.0.0", "from": "fs.realpath@>=1.0.0 <2.0.0", @@ -796,29 +736,32 @@ "dev": true }, "gaxios": { - "version": "1.0.4", - "from": "gaxios@>=1.0.2 <2.0.0", - "resolved": "https://registry.npmjs.org/gaxios/-/gaxios-1.0.4.tgz" + "version": "1.2.7", + "from": "gaxios@>=1.0.4 <2.0.0", + "resolved": "https://registry.npmjs.org/gaxios/-/gaxios-1.2.7.tgz" }, "gcp-metadata": { "version": "0.9.3", "from": "gcp-metadata@>=0.9.0 <0.10.0", "resolved": "https://registry.npmjs.org/gcp-metadata/-/gcp-metadata-0.9.3.tgz" }, - "get-func-name": { - "version": "2.0.0", - "from": "get-func-name@>=2.0.0 <3.0.0", - "resolved": "https://registry.npmjs.org/get-func-name/-/get-func-name-2.0.0.tgz" - }, - "getobject": { - "version": "0.1.0", - "from": "getobject@>=0.1.0 <0.2.0", - "resolved": "https://registry.npmjs.org/getobject/-/getobject-0.1.0.tgz" + "getpass": { + "version": "0.1.7", + "from": "getpass@>=0.1.1 <0.2.0", + "resolved": "https://registry.npmjs.org/getpass/-/getpass-0.1.7.tgz", + "dependencies": { + "assert-plus": { + "version": "1.0.0", + "from": "assert-plus@^1.0.0", + "resolved": "https://registry.npmjs.org/assert-plus/-/assert-plus-1.0.0.tgz" + } + } }, "glob": { "version": "6.0.4", "from": "glob@^6.0.1", - "resolved": "https://registry.npmjs.org/glob/-/glob-6.0.4.tgz" + "resolved": "https://registry.npmjs.org/glob/-/glob-6.0.4.tgz", + "optional": true }, "google-auth-library": { "version": "2.0.2", @@ -829,11 +772,6 @@ "version": "0.7.0", "from": "gcp-metadata@>=0.7.0 <0.8.0", "resolved": "https://registry.npmjs.org/gcp-metadata/-/gcp-metadata-0.7.0.tgz" - }, - "lru-cache": { - "version": "5.1.1", - "from": "lru-cache@>=5.0.0 <6.0.0", - "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-5.1.1.tgz" } } }, @@ -842,213 +780,27 @@ "from": "google-p12-pem@>=1.0.0 <2.0.0", "resolved": "https://registry.npmjs.org/google-p12-pem/-/google-p12-pem-1.0.3.tgz" }, - "graceful-fs": { - "version": "1.2.3", - "from": "graceful-fs@>=1.2.0 <1.3.0", - "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-1.2.3.tgz" - }, - "growl": { - "version": "1.7.0", - "from": "growl@>=1.7.0 <1.8.0", - "resolved": "https://registry.npmjs.org/growl/-/growl-1.7.0.tgz" - }, - "grunt": { - "version": "0.4.5", - "from": "grunt@>=0.4.5 <0.5.0", - "resolved": "https://registry.npmjs.org/grunt/-/grunt-0.4.5.tgz", - "dependencies": { - "async": { - "version": "0.1.22", - "from": "async@>=0.1.22 <0.2.0", - "resolved": "https://registry.npmjs.org/async/-/async-0.1.22.tgz" - }, - "coffee-script": { - "version": "1.3.3", - "from": "coffee-script@>=1.3.3 <1.4.0", - "resolved": "https://registry.npmjs.org/coffee-script/-/coffee-script-1.3.3.tgz" - }, - "glob": { - "version": "3.1.21", - "from": "glob@>=3.1.21 <3.2.0", - "resolved": "https://registry.npmjs.org/glob/-/glob-3.1.21.tgz" - }, - "iconv-lite": { - "version": "0.2.11", - "from": "iconv-lite@>=0.2.11 <0.3.0", - "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.2.11.tgz" - }, - "inherits": { - "version": "1.0.2", - "from": "inherits@>=1.0.0 <2.0.0", - "resolved": "https://registry.npmjs.org/inherits/-/inherits-1.0.2.tgz" - }, - "minimatch": { - "version": "0.2.14", - "from": "minimatch@>=0.2.12 <0.3.0", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-0.2.14.tgz" - }, - "rimraf": { - "version": "2.2.8", - "from": "rimraf@>=2.2.8 <2.3.0", - "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-2.2.8.tgz" - } - } - }, - "grunt-bunyan": { - "version": "0.5.0", - "from": "grunt-bunyan@>=0.5.0 <0.6.0", - "resolved": "https://registry.npmjs.org/grunt-bunyan/-/grunt-bunyan-0.5.0.tgz", - "dependencies": { - "lodash": { - "version": "2.4.2", - "from": "lodash@>=2.4.1 <2.5.0", - "resolved": "https://registry.npmjs.org/lodash/-/lodash-2.4.2.tgz" - } - } - }, - "grunt-contrib-clean": { - "version": "0.6.0", - "from": "grunt-contrib-clean@>=0.6.0 <0.7.0", - "resolved": "https://registry.npmjs.org/grunt-contrib-clean/-/grunt-contrib-clean-0.6.0.tgz", - "dependencies": { - "rimraf": { - "version": "2.2.8", - "from": "rimraf@>=2.2.1 <2.3.0", - "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-2.2.8.tgz" - } - } - }, - "grunt-contrib-coffee": { - "version": "0.11.1", - "from": "grunt-contrib-coffee@>=0.11.0 <0.12.0", - "resolved": "https://registry.npmjs.org/grunt-contrib-coffee/-/grunt-contrib-coffee-0.11.1.tgz", - "dependencies": { - "coffee-script": { - "version": "1.7.1", - "from": "coffee-script@>=1.7.0 <1.8.0", - "resolved": "https://registry.npmjs.org/coffee-script/-/coffee-script-1.7.1.tgz" - }, - "lodash": { - "version": "2.4.2", - "from": "lodash@>=2.4.1 <2.5.0", - "resolved": "https://registry.npmjs.org/lodash/-/lodash-2.4.2.tgz" - }, - "mkdirp": { - "version": "0.3.5", - "from": "mkdirp@>=0.3.5 <0.4.0", - "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.3.5.tgz" - } - } - }, - "grunt-execute": { - "version": "0.2.2", - "from": "grunt-execute@>=0.2.2 <0.3.0", - "resolved": "https://registry.npmjs.org/grunt-execute/-/grunt-execute-0.2.2.tgz" - }, - "grunt-legacy-log": { - "version": "0.1.3", - "from": "grunt-legacy-log@>=0.1.0 <0.2.0", - "resolved": "https://registry.npmjs.org/grunt-legacy-log/-/grunt-legacy-log-0.1.3.tgz", - "dependencies": { - "lodash": { - "version": "2.4.2", - "from": "lodash@>=2.4.1 <2.5.0", - "resolved": "https://registry.npmjs.org/lodash/-/lodash-2.4.2.tgz" - }, - "underscore.string": { - "version": "2.3.3", - "from": "underscore.string@>=2.3.3 <2.4.0", - "resolved": "https://registry.npmjs.org/underscore.string/-/underscore.string-2.3.3.tgz" - } - } - }, - "grunt-legacy-log-utils": { - "version": "0.1.1", - "from": "grunt-legacy-log-utils@>=0.1.1 <0.2.0", - "resolved": "https://registry.npmjs.org/grunt-legacy-log-utils/-/grunt-legacy-log-utils-0.1.1.tgz", - "dependencies": { - "lodash": { - "version": "2.4.2", - "from": "lodash@>=2.4.1 <2.5.0", - "resolved": "https://registry.npmjs.org/lodash/-/lodash-2.4.2.tgz" - }, - "underscore.string": { - "version": "2.3.3", - "from": "underscore.string@>=2.3.3 <2.4.0", - "resolved": "https://registry.npmjs.org/underscore.string/-/underscore.string-2.3.3.tgz" - } - } - }, - "grunt-legacy-util": { - "version": "0.2.0", - "from": "grunt-legacy-util@>=0.2.0 <0.3.0", - "resolved": "https://registry.npmjs.org/grunt-legacy-util/-/grunt-legacy-util-0.2.0.tgz", - "dependencies": { - "async": { - "version": "0.1.22", - "from": "async@>=0.1.22 <0.2.0", - "resolved": "https://registry.npmjs.org/async/-/async-0.1.22.tgz" - } - } - }, - "grunt-mocha-test": { - "version": "0.11.0", - "from": "grunt-mocha-test@>=0.11.0 <0.12.0", - "resolved": "https://registry.npmjs.org/grunt-mocha-test/-/grunt-mocha-test-0.11.0.tgz", - "dependencies": { - "glob": { - "version": "3.2.3", - "from": "glob@3.2.3", - "resolved": "https://registry.npmjs.org/glob/-/glob-3.2.3.tgz" - }, - "graceful-fs": { - "version": "2.0.3", - "from": "graceful-fs@>=2.0.0 <2.1.0", - "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-2.0.3.tgz" - }, - "minimatch": { - "version": "0.2.14", - "from": "minimatch@>=0.2.11 <0.3.0", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-0.2.14.tgz" - }, - "mkdirp": { - "version": "0.3.5", - "from": "mkdirp@0.3.5", - "resolved": "http://registry.npmjs.org/mkdirp/-/mkdirp-0.3.5.tgz" - }, - "mocha": { - "version": "1.20.1", - "from": "mocha@>=1.20.0 <1.21.0", - "resolved": "https://registry.npmjs.org/mocha/-/mocha-1.20.1.tgz" - } - } - }, "gtoken": { - "version": "2.3.0", + "version": "2.3.2", "from": "gtoken@>=2.3.0 <3.0.0", - "resolved": "https://registry.npmjs.org/gtoken/-/gtoken-2.3.0.tgz", + "resolved": "https://registry.npmjs.org/gtoken/-/gtoken-2.3.2.tgz", "dependencies": { "mime": { "version": "2.4.0", "from": "mime@>=2.2.0 <3.0.0", "resolved": "https://registry.npmjs.org/mime/-/mime-2.4.0.tgz" - }, - "pify": { - "version": "3.0.0", - "from": "pify@>=3.0.0 <4.0.0", - "resolved": "https://registry.npmjs.org/pify/-/pify-3.0.0.tgz" } } }, - "has-ansi": { - "version": "0.1.0", - "from": "has-ansi@>=0.1.0 <0.2.0", - "resolved": "https://registry.npmjs.org/has-ansi/-/has-ansi-0.1.0.tgz" + "har-schema": { + "version": "2.0.0", + "from": "har-schema@>=2.0.0 <3.0.0", + "resolved": "https://registry.npmjs.org/har-schema/-/har-schema-2.0.0.tgz" }, - "has-flag": { - "version": "3.0.0", - "from": "has-flag@>=3.0.0 <4.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz" + "har-validator": { + "version": "5.1.3", + "from": "har-validator@>=5.1.0 <5.2.0", + "resolved": "https://registry.npmjs.org/har-validator/-/har-validator-5.1.3.tgz" }, "hawk": { "version": "1.0.0", @@ -1063,20 +815,15 @@ "dev": true }, "hex2dec": { - "version": "1.1.1", + "version": "1.1.2", "from": "hex2dec@>=1.0.1 <2.0.0", - "resolved": "https://registry.npmjs.org/hex2dec/-/hex2dec-1.1.1.tgz" + "resolved": "https://registry.npmjs.org/hex2dec/-/hex2dec-1.1.2.tgz" }, "hoek": { "version": "0.9.1", "from": "hoek@>=0.9.0 <0.10.0", "resolved": "https://registry.npmjs.org/hoek/-/hoek-0.9.1.tgz" }, - "hooker": { - "version": "0.2.3", - "from": "hooker@>=0.2.3 <0.3.0", - "resolved": "https://registry.npmjs.org/hooker/-/hooker-0.2.3.tgz" - }, "http-errors": { "version": "1.6.3", "from": "http-errors@>=1.6.3 <1.7.0", @@ -1152,67 +899,72 @@ "from": "is-buffer@>=1.1.5 <2.0.0", "resolved": "https://registry.npmjs.org/is-buffer/-/is-buffer-1.1.6.tgz" }, + "is-typedarray": { + "version": "1.0.0", + "from": "is-typedarray@>=1.0.0 <1.1.0", + "resolved": "https://registry.npmjs.org/is-typedarray/-/is-typedarray-1.0.0.tgz" + }, "isarray": { - "version": "0.0.1", - "from": "isarray@0.0.1", - "resolved": "https://registry.npmjs.org/isarray/-/isarray-0.0.1.tgz" + "version": "1.0.0", + "from": "isarray@>=1.0.0 <1.1.0", + "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz" }, - "jade": { - "version": "0.26.3", - "from": "jade@0.26.3", - "resolved": "https://registry.npmjs.org/jade/-/jade-0.26.3.tgz", - "dependencies": { - "commander": { - "version": "0.6.1", - "from": "commander@0.6.1", - "resolved": "https://registry.npmjs.org/commander/-/commander-0.6.1.tgz" - }, - "mkdirp": { - "version": "0.3.0", - "from": "mkdirp@0.3.0", - "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.3.0.tgz" - } - } + "isstream": { + "version": "0.1.2", + "from": "isstream@>=0.1.2 <0.2.0", + "resolved": "https://registry.npmjs.org/isstream/-/isstream-0.1.2.tgz" }, - "js-yaml": { - "version": "2.0.5", - "from": "js-yaml@>=2.0.5 <2.1.0", - "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-2.0.5.tgz" + "jsbn": { + "version": "0.1.1", + "from": "jsbn@>=0.1.0 <0.2.0", + "resolved": "https://registry.npmjs.org/jsbn/-/jsbn-0.1.1.tgz" }, "json-bigint": { "version": "0.3.0", "from": "json-bigint@>=0.3.0 <0.4.0", "resolved": "https://registry.npmjs.org/json-bigint/-/json-bigint-0.3.0.tgz" }, + "json-schema": { + "version": "0.2.3", + "from": "json-schema@0.2.3", + "resolved": "https://registry.npmjs.org/json-schema/-/json-schema-0.2.3.tgz" + }, + "json-schema-traverse": { + "version": "0.4.1", + "from": "json-schema-traverse@>=0.4.1 <0.5.0", + "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz" + }, "json-stringify-safe": { "version": "5.0.1", "from": "json-stringify-safe@5.0.1", "resolved": "https://registry.npmjs.org/json-stringify-safe/-/json-stringify-safe-5.0.1.tgz" }, - "jsonfile": { - "version": "1.1.1", - "from": "jsonfile@~1.1.0", - "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-1.1.1.tgz" - }, - "just-extend": { - "version": "4.0.2", - "from": "just-extend@>=4.0.2 <5.0.0", - "resolved": "https://registry.npmjs.org/just-extend/-/just-extend-4.0.2.tgz" + "jsprim": { + "version": "1.4.1", + "from": "jsprim@>=1.2.2 <2.0.0", + "resolved": "https://registry.npmjs.org/jsprim/-/jsprim-1.4.1.tgz", + "dependencies": { + "assert-plus": { + "version": "1.0.0", + "from": "assert-plus@1.0.0", + "resolved": "https://registry.npmjs.org/assert-plus/-/assert-plus-1.0.0.tgz" + } + } }, "jwa": { - "version": "1.1.6", - "from": "jwa@>=1.1.5 <2.0.0", - "resolved": "https://registry.npmjs.org/jwa/-/jwa-1.1.6.tgz" + "version": "1.2.0", + "from": "jwa@>=1.2.0 <2.0.0", + "resolved": "https://registry.npmjs.org/jwa/-/jwa-1.2.0.tgz" }, "jws": { - "version": "3.1.5", + "version": "3.2.1", "from": "jws@>=3.1.5 <4.0.0", - "resolved": "https://registry.npmjs.org/jws/-/jws-3.1.5.tgz" + "resolved": "https://registry.npmjs.org/jws/-/jws-3.2.1.tgz" }, "lodash": { - "version": "0.9.2", - "from": "lodash@>=0.9.2 <0.10.0", - "resolved": "https://registry.npmjs.org/lodash/-/lodash-0.9.2.tgz" + "version": "4.17.11", + "from": "lodash@>=4.17.10 <5.0.0", + "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.11.tgz" }, "lodash.defaults": { "version": "4.2.0", @@ -1224,45 +976,40 @@ "from": "lodash.flatten@>=4.4.0 <5.0.0", "resolved": "https://registry.npmjs.org/lodash.flatten/-/lodash.flatten-4.4.0.tgz" }, - "lodash.get": { - "version": "4.4.2", - "from": "lodash.get@>=4.4.2 <5.0.0", - "resolved": "https://registry.npmjs.org/lodash.get/-/lodash.get-4.4.2.tgz" - }, "lodash.pickby": { "version": "4.6.0", "from": "lodash.pickby@>=4.6.0 <5.0.0", "resolved": "https://registry.npmjs.org/lodash.pickby/-/lodash.pickby-4.6.0.tgz" }, "logger-sharelatex": { - "version": "1.5.9", - "from": "git+https://github.com/sharelatex/logger-sharelatex.git#v1.5.9", - "resolved": "git+https://github.com/sharelatex/logger-sharelatex.git#e8e1b95052f62e107336053e4a983f81cdbdf589", + "version": "1.6.0", + "from": "logger-sharelatex@1.6.0", + "resolved": "https://registry.npmjs.org/logger-sharelatex/-/logger-sharelatex-1.6.0.tgz", "dependencies": { - "assertion-error": { - "version": "1.1.0", - "from": "assertion-error@>=1.0.1 <2.0.0", - "resolved": "https://registry.npmjs.org/assertion-error/-/assertion-error-1.1.0.tgz" + "assert-plus": { + "version": "1.0.0", + "from": "assert-plus@>=1.0.0 <2.0.0", + "resolved": "https://registry.npmjs.org/assert-plus/-/assert-plus-1.0.0.tgz" + }, + "aws-sign2": { + "version": "0.7.0", + "from": "aws-sign2@>=0.7.0 <0.8.0", + "resolved": "https://registry.npmjs.org/aws-sign2/-/aws-sign2-0.7.0.tgz" }, "bunyan": { "version": "1.5.1", "from": "bunyan@1.5.1", "resolved": "https://registry.npmjs.org/bunyan/-/bunyan-1.5.1.tgz" }, - "chai": { - "version": "4.2.0", - "from": "chai@latest", - "resolved": "https://registry.npmjs.org/chai/-/chai-4.2.0.tgz" + "combined-stream": { + "version": "1.0.7", + "from": "combined-stream@>=1.0.6 <1.1.0", + "resolved": "https://registry.npmjs.org/combined-stream/-/combined-stream-1.0.7.tgz" }, - "deep-eql": { - "version": "3.0.1", - "from": "deep-eql@>=3.0.0 <4.0.0", - "resolved": "https://registry.npmjs.org/deep-eql/-/deep-eql-3.0.1.tgz" - }, - "diff": { - "version": "3.5.0", - "from": "diff@>=3.5.0 <4.0.0", - "resolved": "https://registry.npmjs.org/diff/-/diff-3.5.0.tgz" + "delayed-stream": { + "version": "1.0.0", + "from": "delayed-stream@>=1.0.0 <1.1.0", + "resolved": "https://registry.npmjs.org/delayed-stream/-/delayed-stream-1.0.0.tgz" }, "dtrace-provider": { "version": "0.6.0", @@ -1270,47 +1017,72 @@ "resolved": "https://registry.npmjs.org/dtrace-provider/-/dtrace-provider-0.6.0.tgz", "optional": true }, - "sandboxed-module": { - "version": "2.0.3", - "from": "sandboxed-module@latest", - "resolved": "https://registry.npmjs.org/sandboxed-module/-/sandboxed-module-2.0.3.tgz" + "forever-agent": { + "version": "0.6.1", + "from": "forever-agent@>=0.6.1 <0.7.0", + "resolved": "https://registry.npmjs.org/forever-agent/-/forever-agent-0.6.1.tgz" }, - "sinon": { - "version": "7.2.2", - "from": "sinon@latest", - "resolved": "https://registry.npmjs.org/sinon/-/sinon-7.2.2.tgz" + "form-data": { + "version": "2.3.3", + "from": "form-data@>=2.3.2 <2.4.0", + "resolved": "https://registry.npmjs.org/form-data/-/form-data-2.3.3.tgz" }, - "supports-color": { - "version": "5.5.0", - "from": "supports-color@>=5.5.0 <6.0.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz" + "http-signature": { + "version": "1.2.0", + "from": "http-signature@>=1.2.0 <1.3.0", + "resolved": "https://registry.npmjs.org/http-signature/-/http-signature-1.2.0.tgz" }, - "timekeeper": { - "version": "1.0.0", - "from": "timekeeper@>=1.0.0 <2.0.0", - "resolved": "https://registry.npmjs.org/timekeeper/-/timekeeper-1.0.0.tgz" + "mime-db": { + "version": "1.37.0", + "from": "mime-db@>=1.37.0 <1.38.0", + "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.37.0.tgz" }, - "type-detect": { - "version": "4.0.8", - "from": "type-detect@>=4.0.0 <5.0.0", - "resolved": "https://registry.npmjs.org/type-detect/-/type-detect-4.0.8.tgz" + "mime-types": { + "version": "2.1.21", + "from": "mime-types@>=2.1.19 <2.2.0", + "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.21.tgz" + }, + "oauth-sign": { + "version": "0.9.0", + "from": "oauth-sign@>=0.9.0 <0.10.0", + "resolved": "https://registry.npmjs.org/oauth-sign/-/oauth-sign-0.9.0.tgz" + }, + "request": { + "version": "2.88.0", + "from": "request@>=2.88.0 <3.0.0", + "resolved": "https://registry.npmjs.org/request/-/request-2.88.0.tgz" + }, + "safe-buffer": { + "version": "5.1.2", + "from": "safe-buffer@>=5.1.2 <6.0.0", + "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz" + }, + "tough-cookie": { + "version": "2.4.3", + "from": "tough-cookie@>=2.4.3 <2.5.0", + "resolved": "https://registry.npmjs.org/tough-cookie/-/tough-cookie-2.4.3.tgz" + }, + "tunnel-agent": { + "version": "0.6.0", + "from": "tunnel-agent@>=0.6.0 <0.7.0", + "resolved": "https://registry.npmjs.org/tunnel-agent/-/tunnel-agent-0.6.0.tgz" + }, + "uuid": { + "version": "3.3.2", + "from": "uuid@>=3.3.2 <4.0.0", + "resolved": "https://registry.npmjs.org/uuid/-/uuid-3.3.2.tgz" } } }, - "lolex": { - "version": "3.0.0", - "from": "lolex@>=3.0.0 <4.0.0", - "resolved": "https://registry.npmjs.org/lolex/-/lolex-3.0.0.tgz" - }, "long": { "version": "4.0.0", "from": "long@>=4.0.0 <5.0.0", "resolved": "https://registry.npmjs.org/long/-/long-4.0.0.tgz" }, "lru-cache": { - "version": "2.7.3", - "from": "lru-cache@>=2.0.0 <3.0.0", - "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-2.7.3.tgz" + "version": "5.1.1", + "from": "lru-cache@>=5.0.0 <6.0.0", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-5.1.1.tgz" }, "lsmod": { "version": "1.0.0", @@ -1343,9 +1115,9 @@ "resolved": "https://registry.npmjs.org/methods/-/methods-1.1.2.tgz" }, "metrics-sharelatex": { - "version": "2.0.12", - "from": "git+https://github.com/sharelatex/metrics-sharelatex.git#v2.0.12", - "resolved": "git+https://github.com/sharelatex/metrics-sharelatex.git#3ac1621ef049e2f2d88a83b3a41011333d609662", + "version": "2.1.1", + "from": "metrics-sharelatex@2.1.1", + "resolved": "https://registry.npmjs.org/metrics-sharelatex/-/metrics-sharelatex-2.1.1.tgz", "dependencies": { "coffee-script": { "version": "1.6.0", @@ -1458,8 +1230,7 @@ "nan": { "version": "2.12.1", "from": "nan@>=2.0.8 <3.0.0", - "resolved": "https://registry.npmjs.org/nan/-/nan-2.12.1.tgz", - "optional": true + "resolved": "https://registry.npmjs.org/nan/-/nan-2.12.1.tgz" }, "native-or-bluebird": { "version": "1.1.2", @@ -1478,23 +1249,6 @@ "from": "negotiator@0.6.1", "resolved": "https://registry.npmjs.org/negotiator/-/negotiator-0.6.1.tgz" }, - "nise": { - "version": "1.4.8", - "from": "nise@>=1.4.7 <2.0.0", - "resolved": "https://registry.npmjs.org/nise/-/nise-1.4.8.tgz", - "dependencies": { - "lolex": { - "version": "2.7.5", - "from": "lolex@>=2.3.2 <3.0.0", - "resolved": "https://registry.npmjs.org/lolex/-/lolex-2.7.5.tgz" - }, - "path-to-regexp": { - "version": "1.7.0", - "from": "path-to-regexp@>=1.7.0 <2.0.0", - "resolved": "https://registry.npmjs.org/path-to-regexp/-/path-to-regexp-1.7.0.tgz" - } - } - }, "node-fetch": { "version": "2.3.0", "from": "node-fetch@>=2.2.0 <3.0.0", @@ -1505,11 +1259,6 @@ "from": "node-forge@>=0.7.4 <0.8.0", "resolved": "https://registry.npmjs.org/node-forge/-/node-forge-0.7.6.tgz" }, - "nopt": { - "version": "1.0.10", - "from": "nopt@>=1.0.10 <1.1.0", - "resolved": "https://registry.npmjs.org/nopt/-/nopt-1.0.10.tgz" - }, "oauth-sign": { "version": "0.3.0", "from": "oauth-sign@>=0.3.0 <0.4.0", @@ -1576,10 +1325,10 @@ "from": "path-to-regexp@0.1.7", "resolved": "https://registry.npmjs.org/path-to-regexp/-/path-to-regexp-0.1.7.tgz" }, - "pathval": { - "version": "1.1.0", - "from": "pathval@>=1.0.0 <2.0.0", - "resolved": "https://registry.npmjs.org/pathval/-/pathval-1.1.0.tgz" + "performance-now": { + "version": "2.1.0", + "from": "performance-now@>=2.1.0 <3.0.0", + "resolved": "https://registry.npmjs.org/performance-now/-/performance-now-2.1.0.tgz" }, "pify": { "version": "4.0.1", @@ -1616,11 +1365,15 @@ "from": "proxy-addr@>=2.0.3 <2.1.0", "resolved": "https://registry.npmjs.org/proxy-addr/-/proxy-addr-2.0.3.tgz" }, + "psl": { + "version": "1.1.31", + "from": "psl@>=1.1.24 <2.0.0", + "resolved": "https://registry.npmjs.org/psl/-/psl-1.1.31.tgz" + }, "punycode": { "version": "1.4.1", "from": "punycode@>=1.4.1 <2.0.0", - "resolved": "https://registry.npmjs.org/punycode/-/punycode-1.4.1.tgz", - "optional": true + "resolved": "https://registry.npmjs.org/punycode/-/punycode-1.4.1.tgz" }, "q": { "version": "0.9.2", @@ -1655,14 +1408,7 @@ "readable-stream": { "version": "2.3.6", "from": "readable-stream@>=2.0.0 <3.0.0", - "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.6.tgz", - "dependencies": { - "isarray": { - "version": "1.0.0", - "from": "isarray@>=1.0.0 <1.1.0", - "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz" - } - } + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.6.tgz" }, "redis": { "version": "0.12.1", @@ -1698,8 +1444,8 @@ }, "redis-sharelatex": { "version": "1.0.5", - "from": "git+https://github.com/sharelatex/redis-sharelatex.git#v1.0.5", - "resolved": "git+https://github.com/sharelatex/redis-sharelatex.git#d6130c85bad845359729c45b8467d9d8a3ff44de", + "from": "https://registry.npmjs.org/redis-sharelatex/-/redis-sharelatex-1.0.5.tgz", + "resolved": "https://registry.npmjs.org/redis-sharelatex/-/redis-sharelatex-1.0.5.tgz", "dependencies": { "async": { "version": "2.6.1", @@ -1711,11 +1457,6 @@ "from": "coffee-script@1.8.0", "resolved": "https://registry.npmjs.org/coffee-script/-/coffee-script-1.8.0.tgz" }, - "lodash": { - "version": "4.17.11", - "from": "lodash@>=4.17.10 <5.0.0", - "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.11.tgz" - }, "mkdirp": { "version": "0.3.5", "from": "mkdirp@>=0.3.5 <0.4.0", @@ -1753,12 +1494,13 @@ "require-like": { "version": "0.1.2", "from": "require-like@0.1.2", - "resolved": "https://registry.npmjs.org/require-like/-/require-like-0.1.2.tgz" + "resolved": "https://registry.npmjs.org/require-like/-/require-like-0.1.2.tgz", + "dev": true }, "resolve": { - "version": "1.9.0", + "version": "1.10.0", "from": "resolve@>=1.5.0 <2.0.0", - "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.9.0.tgz" + "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.10.0.tgz" }, "retry-axios": { "version": "0.3.2", @@ -1773,7 +1515,8 @@ "rimraf": { "version": "2.4.5", "from": "rimraf@~2.4.0", - "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-2.4.5.tgz" + "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-2.4.5.tgz", + "optional": true }, "safe-buffer": { "version": "5.1.1", @@ -1839,8 +1582,8 @@ }, "settings-sharelatex": { "version": "1.1.0", - "from": "git+https://github.com/sharelatex/settings-sharelatex.git#v1.1.0", - "resolved": "git+https://github.com/sharelatex/settings-sharelatex.git#93f63d029b52fef8825c3a401b2b6a7ba29b4750", + "from": "settings-sharelatex@1.1.0", + "resolved": "https://registry.npmjs.org/settings-sharelatex/-/settings-sharelatex-1.1.0.tgz", "dependencies": { "coffee-script": { "version": "1.6.0", @@ -1850,14 +1593,9 @@ } }, "shimmer": { - "version": "1.2.0", + "version": "1.2.1", "from": "shimmer@>=1.2.0 <2.0.0", - "resolved": "https://registry.npmjs.org/shimmer/-/shimmer-1.2.0.tgz" - }, - "sigmund": { - "version": "1.0.1", - "from": "sigmund@>=1.0.0 <1.1.0", - "resolved": "https://registry.npmjs.org/sigmund/-/sigmund-1.0.1.tgz" + "resolved": "https://registry.npmjs.org/shimmer/-/shimmer-1.2.1.tgz" }, "sinon": { "version": "1.5.2", @@ -1904,6 +1642,23 @@ "from": "split@>=1.0.0 <2.0.0", "resolved": "https://registry.npmjs.org/split/-/split-1.0.1.tgz" }, + "sshpk": { + "version": "1.16.1", + "from": "sshpk@>=1.7.0 <2.0.0", + "resolved": "https://registry.npmjs.org/sshpk/-/sshpk-1.16.1.tgz", + "dependencies": { + "asn1": { + "version": "0.2.4", + "from": "asn1@>=0.2.3 <0.3.0", + "resolved": "https://registry.npmjs.org/asn1/-/asn1-0.2.4.tgz" + }, + "assert-plus": { + "version": "1.0.0", + "from": "assert-plus@^1.0.0", + "resolved": "https://registry.npmjs.org/assert-plus/-/assert-plus-1.0.0.tgz" + } + } + }, "stack-trace": { "version": "0.0.9", "from": "stack-trace@0.0.9", @@ -1934,16 +1689,6 @@ "from": "string_decoder@>=1.1.1 <1.2.0", "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz" }, - "strip-ansi": { - "version": "0.3.0", - "from": "strip-ansi@>=0.3.0 <0.4.0", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-0.3.0.tgz" - }, - "supports-color": { - "version": "0.2.0", - "from": "supports-color@>=0.2.0 <0.3.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-0.2.0.tgz" - }, "symbol-observable": { "version": "1.2.0", "from": "symbol-observable@>=1.2.0 <2.0.0", @@ -1966,11 +1711,6 @@ } } }, - "text-encoding": { - "version": "0.6.4", - "from": "text-encoding@>=0.6.4 <0.7.0", - "resolved": "https://registry.npmjs.org/text-encoding/-/text-encoding-0.6.4.tgz" - }, "through": { "version": "2.3.8", "from": "through@>=2.0.0 <3.0.0", @@ -2004,6 +1744,11 @@ "resolved": "https://registry.npmjs.org/tunnel-agent/-/tunnel-agent-0.3.0.tgz", "optional": true }, + "tweetnacl": { + "version": "0.14.5", + "from": "tweetnacl@>=0.14.0 <0.15.0", + "resolved": "https://registry.npmjs.org/tweetnacl/-/tweetnacl-0.14.5.tgz" + }, "type-detect": { "version": "0.1.1", "from": "type-detect@0.1.1", @@ -2031,16 +1776,23 @@ "from": "underscore@>=1.7.0 <1.8.0", "resolved": "https://registry.npmjs.org/underscore/-/underscore-1.7.0.tgz" }, - "underscore.string": { - "version": "2.2.1", - "from": "underscore.string@>=2.2.1 <2.3.0", - "resolved": "https://registry.npmjs.org/underscore.string/-/underscore.string-2.2.1.tgz" - }, "unpipe": { "version": "1.0.0", "from": "unpipe@1.0.0", "resolved": "https://registry.npmjs.org/unpipe/-/unpipe-1.0.0.tgz" }, + "uri-js": { + "version": "4.2.2", + "from": "uri-js@>=4.2.2 <5.0.0", + "resolved": "https://registry.npmjs.org/uri-js/-/uri-js-4.2.2.tgz", + "dependencies": { + "punycode": { + "version": "2.1.1", + "from": "punycode@>=2.1.0 <3.0.0", + "resolved": "https://registry.npmjs.org/punycode/-/punycode-2.1.1.tgz" + } + } + }, "util-deprecate": { "version": "1.0.2", "from": "util-deprecate@>=1.0.1 <1.1.0", @@ -2061,10 +1813,17 @@ "from": "vary@>=1.1.2 <1.2.0", "resolved": "https://registry.npmjs.org/vary/-/vary-1.1.2.tgz" }, - "which": { - "version": "1.0.9", - "from": "which@>=1.0.5 <1.1.0", - "resolved": "https://registry.npmjs.org/which/-/which-1.0.9.tgz" + "verror": { + "version": "1.10.0", + "from": "verror@1.10.0", + "resolved": "https://registry.npmjs.org/verror/-/verror-1.10.0.tgz", + "dependencies": { + "assert-plus": { + "version": "1.0.0", + "from": "assert-plus@^1.0.0", + "resolved": "https://registry.npmjs.org/assert-plus/-/assert-plus-1.0.0.tgz" + } + } }, "wrappy": { "version": "1.0.2", diff --git a/services/real-time/package.json b/services/real-time/package.json index 6268437247..ea519b24fc 100644 --- a/services/real-time/package.json +++ b/services/real-time/package.json @@ -28,12 +28,12 @@ "cookie-parser": "^1.3.3", "express": "^4.10.1", "express-session": "^1.9.1", - "logger-sharelatex": "git+https://github.com/sharelatex/logger-sharelatex.git#v1.5.9", - "metrics-sharelatex": "git+https://github.com/sharelatex/metrics-sharelatex.git#v2.0.12", - "redis-sharelatex": "git+https://github.com/sharelatex/redis-sharelatex.git#v1.0.5", + "logger-sharelatex": "^1.6.0", + "metrics-sharelatex": "^2.1.1", + "redis-sharelatex": "https://registry.npmjs.org/redis-sharelatex/-/redis-sharelatex-1.0.5.tgz", "request": "~2.34.0", "session.socket.io": "^0.1.6", - "settings-sharelatex": "git+https://github.com/sharelatex/settings-sharelatex.git#v1.1.0", + "settings-sharelatex": "^1.1.0", "socket.io": "0.9.16", "socket.io-client": "^0.9.16" }, From 0939a558d7b178c6c496dfece1a410d54195b859 Mon Sep 17 00:00:00 2001 From: Henry Oswald Date: Fri, 1 Feb 2019 19:27:56 +0000 Subject: [PATCH 49/53] point real time to web api --- services/real-time/config/settings.defaults.coffee | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/services/real-time/config/settings.defaults.coffee b/services/real-time/config/settings.defaults.coffee index ed9fa4f90b..6d5e00e658 100644 --- a/services/real-time/config/settings.defaults.coffee +++ b/services/real-time/config/settings.defaults.coffee @@ -29,7 +29,7 @@ settings = apis: web: - url: "http://#{process.env['WEB_HOST'] or "localhost"}:#{process.env['WEB_PORT'] or 3000}" + url: "http://#{process.env['WEB_API_HOST'] or process.env['WEB_HOST'] or "localhost"}:#{process.env['WEB_API_PORT'] or process.env['WEB_PORT'] or 3000}" user: process.env['WEB_API_USER'] or "sharelatex" pass: process.env['WEB_API_PASSWORD'] or "password" documentupdater: From a07e516f651c6144d64d9380bf41d1bb92e640a7 Mon Sep 17 00:00:00 2001 From: Henry Oswald Date: Mon, 4 Feb 2019 09:47:11 +0000 Subject: [PATCH 50/53] update redis key --- services/real-time/config/settings.defaults.coffee | 6 +++--- .../test/acceptance/coffee/ApplyUpdateTests.coffee | 12 +++++++----- 2 files changed, 10 insertions(+), 8 deletions(-) diff --git a/services/real-time/config/settings.defaults.coffee b/services/real-time/config/settings.defaults.coffee index 6d5e00e658..93a980931e 100644 --- a/services/real-time/config/settings.defaults.coffee +++ b/services/real-time/config/settings.defaults.coffee @@ -5,15 +5,15 @@ settings = port: process.env['REAL_TIME_REDIS_PORT'] or process.env['REDIS_PORT'] or "6379" password: process.env["REAL_TIME_REDIS_PASSWORD"] or process.env["REDIS_PASSWORD"] or "" key_schema: - clientsInProject: ({project_id}) -> "clients_in_project:#{project_id}" - connectedUser: ({project_id, client_id})-> "connected_user:#{project_id}:#{client_id}" + clientsInProject: ({project_id}) -> "clients_in_project:{#{project_id}}" + connectedUser: ({project_id, client_id})-> "connected_user:{#{project_id}}:#{client_id}" documentupdater: host: process.env['DOC_UPDATER_REDIS_HOST'] or process.env['REDIS_HOST'] or "localhost" port: process.env['DOC_UPDATER_REDIS_PORT'] or process.env['REDIS_PORT'] or "6379" password: process.env["DOC_UPDATER_REDIS_PASSWORD"] or process.env["REDIS_PASSWORD"] or "" key_schema: - pendingUpdates: ({doc_id}) -> "PendingUpdates:#{doc_id}" + pendingUpdates: ({doc_id}) -> "PendingUpdates:{#{doc_id}}" websessions: host: process.env['WEB_REDIS_HOST'] or process.env['REDIS_HOST'] or "localhost" diff --git a/services/real-time/test/acceptance/coffee/ApplyUpdateTests.coffee b/services/real-time/test/acceptance/coffee/ApplyUpdateTests.coffee index 2509f21108..d9addc990d 100644 --- a/services/real-time/test/acceptance/coffee/ApplyUpdateTests.coffee +++ b/services/real-time/test/acceptance/coffee/ApplyUpdateTests.coffee @@ -10,6 +10,8 @@ settings = require "settings-sharelatex" redis = require "redis-sharelatex" rclient = redis.createClient(settings.redis.websessions) +redisSettings = settings.redis + describe "applyOtUpdate", -> before -> @update = { @@ -48,7 +50,7 @@ describe "applyOtUpdate", -> done() it "should push the update into redis", (done) -> - rclient.lrange "PendingUpdates:#{@doc_id}", 0, -1, (error, [update]) => + rclient.lrange redisSettings.documentupdater.key_schema.pendingUpdates({@doc_id}), 0, -1, (error, [update]) => update = JSON.parse(update) update.op.should.deep.equal @update.op update.meta.should.deep.equal { @@ -61,7 +63,7 @@ describe "applyOtUpdate", -> async.series [ (cb) => rclient.del "pending-updates-list", cb (cb) => rclient.del "DocsWithPendingUpdates", "#{@project_id}:#{@doc_id}", cb - (cb) => rclient.del "PendingUpdates:#{@doc_id}", cb + (cb) => rclient.del redisSettings.documentupdater.key_schema.pendingUpdates(@doc_id), cb ], done describe "when authorized to read-only with an edit update", -> @@ -102,7 +104,7 @@ describe "applyOtUpdate", -> , 300 it "should not put the update in redis", (done) -> - rclient.llen "PendingUpdates:#{@doc_id}", (error, len) => + rclient.llen redisSettings.documentupdater.key_schema.pendingUpdates({@doc_id}), (error, len) => len.should.equal 0 done() @@ -142,7 +144,7 @@ describe "applyOtUpdate", -> done() it "should push the update into redis", (done) -> - rclient.lrange "PendingUpdates:#{@doc_id}", 0, -1, (error, [update]) => + rclient.lrange redisSettings.documentupdater.key_schema.pendingUpdates({@doc_id}), 0, -1, (error, [update]) => update = JSON.parse(update) update.op.should.deep.equal @comment_update.op update.meta.should.deep.equal { @@ -155,5 +157,5 @@ describe "applyOtUpdate", -> async.series [ (cb) => rclient.del "pending-updates-list", cb (cb) => rclient.del "DocsWithPendingUpdates", "#{@project_id}:#{@doc_id}", cb - (cb) => rclient.del "PendingUpdates:#{@doc_id}", cb + (cb) => rclient.del redisSettings.documentupdater.key_schema.pendingUpdates({@doc_id}), cb ], done \ No newline at end of file From 37d1c9605119ce73fd6dbc2bf3a3710675ae5c50 Mon Sep 17 00:00:00 2001 From: Henry Oswald Date: Mon, 4 Feb 2019 16:59:36 +0000 Subject: [PATCH 51/53] add logging --- services/real-time/app/coffee/DocumentUpdaterController.coffee | 1 + 1 file changed, 1 insertion(+) diff --git a/services/real-time/app/coffee/DocumentUpdaterController.coffee b/services/real-time/app/coffee/DocumentUpdaterController.coffee index 451dc812bc..72078d71d2 100644 --- a/services/real-time/app/coffee/DocumentUpdaterController.coffee +++ b/services/real-time/app/coffee/DocumentUpdaterController.coffee @@ -26,6 +26,7 @@ module.exports = DocumentUpdaterController = DocumentUpdaterController._processErrorFromDocumentUpdater(io, message.doc_id, message.error, message) _applyUpdateFromDocumentUpdater: (io, doc_id, update) -> + logger.log({doc_id}, "apply update from doc updater") for client in io.sockets.clients(doc_id) if client.id == update.meta.source logger.log doc_id: doc_id, version: update.v, source: update.meta?.source, "distributing update to sender" From d85bf5cedbec2279407da9184b8e279a8cf59002 Mon Sep 17 00:00:00 2001 From: Henry Oswald Date: Wed, 6 Feb 2019 15:26:12 +0000 Subject: [PATCH 52/53] remove extra logging line --- services/real-time/app/coffee/DocumentUpdaterController.coffee | 1 - 1 file changed, 1 deletion(-) diff --git a/services/real-time/app/coffee/DocumentUpdaterController.coffee b/services/real-time/app/coffee/DocumentUpdaterController.coffee index 72078d71d2..451dc812bc 100644 --- a/services/real-time/app/coffee/DocumentUpdaterController.coffee +++ b/services/real-time/app/coffee/DocumentUpdaterController.coffee @@ -26,7 +26,6 @@ module.exports = DocumentUpdaterController = DocumentUpdaterController._processErrorFromDocumentUpdater(io, message.doc_id, message.error, message) _applyUpdateFromDocumentUpdater: (io, doc_id, update) -> - logger.log({doc_id}, "apply update from doc updater") for client in io.sockets.clients(doc_id) if client.id == update.meta.source logger.log doc_id: doc_id, version: update.v, source: update.meta?.source, "distributing update to sender" From 1fc1b4206e5f927145d653f7fa835b8230a825db Mon Sep 17 00:00:00 2001 From: Henry Oswald Date: Thu, 7 Feb 2019 13:57:38 +0000 Subject: [PATCH 53/53] add shutDownInProgress check into sig listening --- services/real-time/app.coffee | 12 +++++++++--- 1 file changed, 9 insertions(+), 3 deletions(-) diff --git a/services/real-time/app.coffee b/services/real-time/app.coffee index 1035f83b68..ab0ac3627a 100644 --- a/services/real-time/app.coffee +++ b/services/real-time/app.coffee @@ -103,11 +103,17 @@ forceDrain = -> DrainManager.startDrain(io, 4) , Settings.forceDrainMsDelay +shutDownInProgress = false if Settings.forceDrainMsDelay? Settings.forceDrainMsDelay = parseInt(Settings.forceDrainMsDelay, 10) logger.log forceDrainMsDelay: Settings.forceDrainMsDelay,"forceDrainMsDelay enabled" for signal in ['SIGINT', 'SIGHUP', 'SIGQUIT', 'SIGUSR1', 'SIGUSR2', 'SIGTERM', 'SIGABRT'] process.on signal, -> - logger.log signal: signal, "received interrupt, cleaning up" - shutdownCleanly(signal) - forceDrain() + if shutDownInProgress + logger.log signal: signal, "shutdown already in progress, ignoring signal" + return + else + shutDownInProgress = true + logger.log signal: signal, "received interrupt, cleaning up" + shutdownCleanly(signal) + forceDrain()