mirror of
https://github.com/standardnotes/server
synced 2026-06-16 03:45:24 -04:00
Compare commits
23 Commits
| Author | SHA1 | Date | |
|---|---|---|---|
| 2f9d8e776f | |||
| 9503f0d963 | |||
| 32aff3e3f4 | |||
| 9b9f10d4ca | |||
| e4f0cc6b37 | |||
| d211249086 | |||
| 0fc5db8aee | |||
| 0a2abef979 | |||
| 8242f13aff | |||
| 7516ba7028 | |||
| 3417407cbe | |||
| 720d046c00 | |||
| b88f560b07 | |||
| 51b264ca13 | |||
| 0309aeab34 | |||
| aca8d2948d | |||
| 09596d2181 | |||
| e87f7e1674 | |||
| 4ad1cccc33 | |||
| 5d12648669 | |||
| 7e989720bf | |||
| f8a2892811 | |||
| eaab23ec19 |
+8
-1
@@ -7,7 +7,6 @@ DB_PORT=3306
|
||||
DB_USERNAME=std_notes_user
|
||||
DB_PASSWORD=changeme123
|
||||
DB_DATABASE=standard_notes_db
|
||||
DB_DEBUG_LEVEL=all
|
||||
|
||||
#########
|
||||
# CACHE #
|
||||
@@ -15,3 +14,11 @@ DB_DEBUG_LEVEL=all
|
||||
|
||||
REDIS_PORT=6379
|
||||
REDIS_HOST=cache
|
||||
|
||||
########
|
||||
# KEYS #
|
||||
########
|
||||
|
||||
AUTH_JWT_SECRET=
|
||||
AUTH_SERVER_ENCRYPTION_SERVER_KEY=
|
||||
VALET_TOKEN_SECRET=
|
||||
|
||||
@@ -3,6 +3,7 @@ DB_HOST=db
|
||||
DB_USERNAME=std_notes_user
|
||||
DB_PASSWORD=changeme123
|
||||
DB_DATABASE=standard_notes_db
|
||||
DB_PORT=3306
|
||||
REDIS_PORT=6379
|
||||
REDIS_HOST=cache
|
||||
AUTH_SERVER_ACCESS_TOKEN_AGE=4
|
||||
@@ -19,3 +20,7 @@ MYSQL_DATABASE=standard_notes_db
|
||||
MYSQL_USER=std_notes_user
|
||||
MYSQL_PASSWORD=changeme123
|
||||
MYSQL_ROOT_PASSWORD=changeme123
|
||||
|
||||
AUTH_JWT_SECRET=f95259c5e441f5a4646d76422cfb3df4c4488842901aa50b6c51b8be2e0040e9
|
||||
AUTH_SERVER_ENCRYPTION_SERVER_KEY=1087415dfde3093797f9a7ca93a49e7d7aa1861735eb0d32aae9c303b8c3d060
|
||||
VALET_TOKEN_SECRET=4b886819ebe1e908077c6cae96311b48a8416bd60cc91c03060e15bdf6b30d1f
|
||||
|
||||
@@ -50,6 +50,6 @@ jobs:
|
||||
uses: aws-actions/amazon-ecs-deploy-task-definition@v1
|
||||
with:
|
||||
task-definition: ${{ steps.task-def-prod.outputs.task-definition }}
|
||||
service: ${{ inputs.service_name }}-prod
|
||||
service: ${{ inputs.service_name }}
|
||||
cluster: prod
|
||||
wait-for-service-stability: true
|
||||
|
||||
@@ -123,13 +123,13 @@ const RAW_RUNTIME_STATE =
|
||||
["@lerna-lite/run", "npm:1.6.0"],\
|
||||
["@sentry/node", "npm:7.28.1"],\
|
||||
["@types/jest", "npm:29.1.1"],\
|
||||
["@types/newrelic", "npm:9.4.0"],\
|
||||
["@types/newrelic", "npm:9.13.0"],\
|
||||
["@types/node", "npm:18.11.9"],\
|
||||
["@typescript-eslint/parser", "virtual:8859b278716fedf3e7458b5628625f7e35678c418626878559a0b816445001b7e24c55546f4677ba4c20b521aa0cf52cc33ac07deff171e383ada6eeab69933f#npm:5.40.1"],\
|
||||
["eslint", "npm:8.32.0"],\
|
||||
["eslint-config-prettier", "virtual:8859b278716fedf3e7458b5628625f7e35678c418626878559a0b816445001b7e24c55546f4677ba4c20b521aa0cf52cc33ac07deff171e383ada6eeab69933f#npm:8.6.0"],\
|
||||
["ini", "npm:3.0.0"],\
|
||||
["newrelic", "npm:9.11.0"],\
|
||||
["newrelic", "npm:10.0.0"],\
|
||||
["npm-check-updates", "npm:16.0.1"],\
|
||||
["prettier", "npm:2.7.1"],\
|
||||
["ts-node", "virtual:8859b278716fedf3e7458b5628625f7e35678c418626878559a0b816445001b7e24c55546f4677ba4c20b521aa0cf52cc33ac07deff171e383ada6eeab69933f#npm:10.9.1"],\
|
||||
@@ -2594,10 +2594,10 @@ const RAW_RUNTIME_STATE =
|
||||
}]\
|
||||
]],\
|
||||
["@grpc/grpc-js", [\
|
||||
["npm:1.8.12", {\
|
||||
"packageLocation": "./.yarn/cache/@grpc-grpc-js-npm-1.8.12-055f611493-cf2523ed61.zip/node_modules/@grpc/grpc-js/",\
|
||||
["npm:1.8.13", {\
|
||||
"packageLocation": "./.yarn/cache/@grpc-grpc-js-npm-1.8.13-59d4d0dc89-04d24ca840.zip/node_modules/@grpc/grpc-js/",\
|
||||
"packageDependencies": [\
|
||||
["@grpc/grpc-js", "npm:1.8.12"],\
|
||||
["@grpc/grpc-js", "npm:1.8.13"],\
|
||||
["@grpc/proto-loader", "npm:0.7.4"],\
|
||||
["@types/node", "npm:18.0.3"]\
|
||||
],\
|
||||
@@ -3284,12 +3284,12 @@ const RAW_RUNTIME_STATE =
|
||||
],\
|
||||
"linkType": "SOFT"\
|
||||
}],\
|
||||
["virtual:3903f8b52579d93ef51c172e331bc99e7b2816716d59e05f43ef24f0b7764b243282fc408399f3458a146bc3927d0afc82281a5fef8bf3c4a084cec2d908e789#npm:5.0.2", {\
|
||||
"packageLocation": "./.yarn/__virtual__/@newrelic-aws-sdk-virtual-5e033661a6/0/cache/@newrelic-aws-sdk-npm-5.0.2-96d8663350-d99b851c78.zip/node_modules/@newrelic/aws-sdk/",\
|
||||
["virtual:2e94dc408d78a7f546b419c58b70581fdb1401ee1979fe214195b4cfca74499df9c9aa918c3214331583e314b7e767fec897581d1a684dcab7cc3bba5897fc45#npm:5.0.2", {\
|
||||
"packageLocation": "./.yarn/__virtual__/@newrelic-aws-sdk-virtual-32f8e7f038/0/cache/@newrelic-aws-sdk-npm-5.0.2-96d8663350-d99b851c78.zip/node_modules/@newrelic/aws-sdk/",\
|
||||
"packageDependencies": [\
|
||||
["@newrelic/aws-sdk", "virtual:3903f8b52579d93ef51c172e331bc99e7b2816716d59e05f43ef24f0b7764b243282fc408399f3458a146bc3927d0afc82281a5fef8bf3c4a084cec2d908e789#npm:5.0.2"],\
|
||||
["@newrelic/aws-sdk", "virtual:2e94dc408d78a7f546b419c58b70581fdb1401ee1979fe214195b4cfca74499df9c9aa918c3214331583e314b7e767fec897581d1a684dcab7cc3bba5897fc45#npm:5.0.2"],\
|
||||
["@types/newrelic", null],\
|
||||
["newrelic", "npm:9.11.0"]\
|
||||
["newrelic", "npm:10.0.0"]\
|
||||
],\
|
||||
"packagePeers": [\
|
||||
"@types/newrelic",\
|
||||
@@ -3306,12 +3306,12 @@ const RAW_RUNTIME_STATE =
|
||||
],\
|
||||
"linkType": "SOFT"\
|
||||
}],\
|
||||
["virtual:3903f8b52579d93ef51c172e331bc99e7b2816716d59e05f43ef24f0b7764b243282fc408399f3458a146bc3927d0afc82281a5fef8bf3c4a084cec2d908e789#npm:7.1.1", {\
|
||||
"packageLocation": "./.yarn/__virtual__/@newrelic-koa-virtual-5f623c0915/0/cache/@newrelic-koa-npm-7.1.1-363bc0d9f3-b4fd860e8b.zip/node_modules/@newrelic/koa/",\
|
||||
["virtual:2e94dc408d78a7f546b419c58b70581fdb1401ee1979fe214195b4cfca74499df9c9aa918c3214331583e314b7e767fec897581d1a684dcab7cc3bba5897fc45#npm:7.1.1", {\
|
||||
"packageLocation": "./.yarn/__virtual__/@newrelic-koa-virtual-d5ac9cc242/0/cache/@newrelic-koa-npm-7.1.1-363bc0d9f3-b4fd860e8b.zip/node_modules/@newrelic/koa/",\
|
||||
"packageDependencies": [\
|
||||
["@newrelic/koa", "virtual:3903f8b52579d93ef51c172e331bc99e7b2816716d59e05f43ef24f0b7764b243282fc408399f3458a146bc3927d0afc82281a5fef8bf3c4a084cec2d908e789#npm:7.1.1"],\
|
||||
["@newrelic/koa", "virtual:2e94dc408d78a7f546b419c58b70581fdb1401ee1979fe214195b4cfca74499df9c9aa918c3214331583e314b7e767fec897581d1a684dcab7cc3bba5897fc45#npm:7.1.1"],\
|
||||
["@types/newrelic", null],\
|
||||
["newrelic", "npm:9.11.0"]\
|
||||
["newrelic", "npm:10.0.0"]\
|
||||
],\
|
||||
"packagePeers": [\
|
||||
"@types/newrelic",\
|
||||
@@ -3341,12 +3341,12 @@ const RAW_RUNTIME_STATE =
|
||||
],\
|
||||
"linkType": "SOFT"\
|
||||
}],\
|
||||
["virtual:3903f8b52579d93ef51c172e331bc99e7b2816716d59e05f43ef24f0b7764b243282fc408399f3458a146bc3927d0afc82281a5fef8bf3c4a084cec2d908e789#npm:6.0.0", {\
|
||||
"packageLocation": "./.yarn/__virtual__/@newrelic-superagent-virtual-4f2fdfe6c7/0/cache/@newrelic-superagent-npm-6.0.0-db8b77d0f3-b77997b792.zip/node_modules/@newrelic/superagent/",\
|
||||
["virtual:2e94dc408d78a7f546b419c58b70581fdb1401ee1979fe214195b4cfca74499df9c9aa918c3214331583e314b7e767fec897581d1a684dcab7cc3bba5897fc45#npm:6.0.0", {\
|
||||
"packageLocation": "./.yarn/__virtual__/@newrelic-superagent-virtual-0d8a0615e8/0/cache/@newrelic-superagent-npm-6.0.0-db8b77d0f3-b77997b792.zip/node_modules/@newrelic/superagent/",\
|
||||
"packageDependencies": [\
|
||||
["@newrelic/superagent", "virtual:3903f8b52579d93ef51c172e331bc99e7b2816716d59e05f43ef24f0b7764b243282fc408399f3458a146bc3927d0afc82281a5fef8bf3c4a084cec2d908e789#npm:6.0.0"],\
|
||||
["@newrelic/superagent", "virtual:2e94dc408d78a7f546b419c58b70581fdb1401ee1979fe214195b4cfca74499df9c9aa918c3214331583e314b7e767fec897581d1a684dcab7cc3bba5897fc45#npm:6.0.0"],\
|
||||
["@types/newrelic", null],\
|
||||
["newrelic", "npm:9.11.0"]\
|
||||
["newrelic", "npm:10.0.0"]\
|
||||
],\
|
||||
"packagePeers": [\
|
||||
"@types/newrelic",\
|
||||
@@ -3356,19 +3356,19 @@ const RAW_RUNTIME_STATE =
|
||||
}]\
|
||||
]],\
|
||||
["@newrelic/winston-enricher", [\
|
||||
["npm:4.0.0", {\
|
||||
"packageLocation": "./.yarn/cache/@newrelic-winston-enricher-npm-4.0.0-ebaf2d0d28-3fc901cded.zip/node_modules/@newrelic/winston-enricher/",\
|
||||
["npm:4.0.1", {\
|
||||
"packageLocation": "./.yarn/cache/@newrelic-winston-enricher-npm-4.0.1-ef1230a3ce-e45880f6ec.zip/node_modules/@newrelic/winston-enricher/",\
|
||||
"packageDependencies": [\
|
||||
["@newrelic/winston-enricher", "npm:4.0.0"]\
|
||||
["@newrelic/winston-enricher", "npm:4.0.1"]\
|
||||
],\
|
||||
"linkType": "SOFT"\
|
||||
}],\
|
||||
["virtual:c66bf20e88479ada0172094776519a9f51acc4731d22079b60a295bcec7ea42d5545cbce58a77a50d932bf953298799135e99707486e343da6d99ba1d167bdbd#npm:4.0.0", {\
|
||||
"packageLocation": "./.yarn/__virtual__/@newrelic-winston-enricher-virtual-6b8c53ab3d/0/cache/@newrelic-winston-enricher-npm-4.0.0-ebaf2d0d28-3fc901cded.zip/node_modules/@newrelic/winston-enricher/",\
|
||||
["virtual:c66bf20e88479ada0172094776519a9f51acc4731d22079b60a295bcec7ea42d5545cbce58a77a50d932bf953298799135e99707486e343da6d99ba1d167bdbd#npm:4.0.1", {\
|
||||
"packageLocation": "./.yarn/__virtual__/@newrelic-winston-enricher-virtual-c32d28b076/0/cache/@newrelic-winston-enricher-npm-4.0.1-ef1230a3ce-e45880f6ec.zip/node_modules/@newrelic/winston-enricher/",\
|
||||
"packageDependencies": [\
|
||||
["@newrelic/winston-enricher", "virtual:c66bf20e88479ada0172094776519a9f51acc4731d22079b60a295bcec7ea42d5545cbce58a77a50d932bf953298799135e99707486e343da6d99ba1d167bdbd#npm:4.0.0"],\
|
||||
["@types/newrelic", "npm:9.4.0"],\
|
||||
["newrelic", "npm:9.11.0"]\
|
||||
["@newrelic/winston-enricher", "virtual:c66bf20e88479ada0172094776519a9f51acc4731d22079b60a295bcec7ea42d5545cbce58a77a50d932bf953298799135e99707486e343da6d99ba1d167bdbd#npm:4.0.1"],\
|
||||
["@types/newrelic", "npm:9.13.0"],\
|
||||
["newrelic", "npm:10.0.0"]\
|
||||
],\
|
||||
"packagePeers": [\
|
||||
"@types/newrelic",\
|
||||
@@ -4062,7 +4062,7 @@ const RAW_RUNTIME_STATE =
|
||||
["@standardnotes/analytics", "workspace:packages/analytics"],\
|
||||
["@aws-sdk/client-sns", "npm:3.259.0"],\
|
||||
["@aws-sdk/client-sqs", "npm:3.259.0"],\
|
||||
["@newrelic/winston-enricher", "virtual:c66bf20e88479ada0172094776519a9f51acc4731d22079b60a295bcec7ea42d5545cbce58a77a50d932bf953298799135e99707486e343da6d99ba1d167bdbd#npm:4.0.0"],\
|
||||
["@newrelic/winston-enricher", "virtual:c66bf20e88479ada0172094776519a9f51acc4731d22079b60a295bcec7ea42d5545cbce58a77a50d932bf953298799135e99707486e343da6d99ba1d167bdbd#npm:4.0.1"],\
|
||||
["@sentry/node", "npm:7.28.1"],\
|
||||
["@standardnotes/common", "workspace:packages/common"],\
|
||||
["@standardnotes/domain-core", "workspace:packages/domain-core"],\
|
||||
@@ -4072,7 +4072,7 @@ const RAW_RUNTIME_STATE =
|
||||
["@types/ioredis", "npm:5.0.0"],\
|
||||
["@types/jest", "npm:29.1.1"],\
|
||||
["@types/mixpanel", "npm:2.14.4"],\
|
||||
["@types/newrelic", "npm:9.4.0"],\
|
||||
["@types/newrelic", "npm:9.13.0"],\
|
||||
["@types/node", "npm:18.11.9"],\
|
||||
["@typescript-eslint/eslint-plugin", "virtual:c66bf20e88479ada0172094776519a9f51acc4731d22079b60a295bcec7ea42d5545cbce58a77a50d932bf953298799135e99707486e343da6d99ba1d167bdbd#npm:5.48.2"],\
|
||||
["dayjs", "npm:1.11.6"],\
|
||||
@@ -4084,7 +4084,7 @@ const RAW_RUNTIME_STATE =
|
||||
["jest", "virtual:fd909b174d079e30b336c4ce72c38a88c1e447767b1a8dd7655e07719a1e31b97807f0931368724fc78897ff15e6a6d00b83316c0f76d11f85111f342e08bb79#npm:29.1.2"],\
|
||||
["mixpanel", "npm:0.17.0"],\
|
||||
["mysql2", "npm:3.0.1"],\
|
||||
["newrelic", "npm:9.11.0"],\
|
||||
["newrelic", "npm:10.0.0"],\
|
||||
["reflect-metadata", "npm:0.1.13"],\
|
||||
["ts-jest", "virtual:fd909b174d079e30b336c4ce72c38a88c1e447767b1a8dd7655e07719a1e31b97807f0931368724fc78897ff15e6a6d00b83316c0f76d11f85111f342e08bb79#npm:29.0.3"],\
|
||||
["typeorm", "virtual:c66bf20e88479ada0172094776519a9f51acc4731d22079b60a295bcec7ea42d5545cbce58a77a50d932bf953298799135e99707486e343da6d99ba1d167bdbd#npm:0.3.10"],\
|
||||
@@ -4116,7 +4116,7 @@ const RAW_RUNTIME_STATE =
|
||||
"packageLocation": "./packages/api-gateway/",\
|
||||
"packageDependencies": [\
|
||||
["@standardnotes/api-gateway", "workspace:packages/api-gateway"],\
|
||||
["@newrelic/winston-enricher", "virtual:c66bf20e88479ada0172094776519a9f51acc4731d22079b60a295bcec7ea42d5545cbce58a77a50d932bf953298799135e99707486e343da6d99ba1d167bdbd#npm:4.0.0"],\
|
||||
["@newrelic/winston-enricher", "virtual:c66bf20e88479ada0172094776519a9f51acc4731d22079b60a295bcec7ea42d5545cbce58a77a50d932bf953298799135e99707486e343da6d99ba1d167bdbd#npm:4.0.1"],\
|
||||
["@sentry/node", "npm:7.28.1"],\
|
||||
["@standardnotes/domain-core", "workspace:packages/domain-core"],\
|
||||
["@standardnotes/domain-events", "workspace:packages/domain-events"],\
|
||||
@@ -4128,7 +4128,7 @@ const RAW_RUNTIME_STATE =
|
||||
["@types/ioredis", "npm:5.0.0"],\
|
||||
["@types/jest", "npm:29.1.1"],\
|
||||
["@types/jsonwebtoken", "npm:9.0.1"],\
|
||||
["@types/newrelic", "npm:9.4.0"],\
|
||||
["@types/newrelic", "npm:9.13.0"],\
|
||||
["@types/prettyjson", "npm:0.0.30"],\
|
||||
["@typescript-eslint/eslint-plugin", "virtual:c66bf20e88479ada0172094776519a9f51acc4731d22079b60a295bcec7ea42d5545cbce58a77a50d932bf953298799135e99707486e343da6d99ba1d167bdbd#npm:5.48.2"],\
|
||||
["axios", "npm:1.1.3"],\
|
||||
@@ -4144,7 +4144,7 @@ const RAW_RUNTIME_STATE =
|
||||
["ioredis", "npm:5.2.4"],\
|
||||
["jest", "virtual:fd909b174d079e30b336c4ce72c38a88c1e447767b1a8dd7655e07719a1e31b97807f0931368724fc78897ff15e6a6d00b83316c0f76d11f85111f342e08bb79#npm:29.1.2"],\
|
||||
["jsonwebtoken", "npm:9.0.0"],\
|
||||
["newrelic", "npm:9.11.0"],\
|
||||
["newrelic", "npm:10.0.0"],\
|
||||
["nodemon", "npm:2.0.20"],\
|
||||
["npm-check-updates", "npm:16.0.1"],\
|
||||
["prettyjson", "npm:1.2.5"],\
|
||||
@@ -4165,7 +4165,7 @@ const RAW_RUNTIME_STATE =
|
||||
["@aws-sdk/client-sqs", "npm:3.259.0"],\
|
||||
["@cbor-extract/cbor-extract-linux-arm64", "npm:2.1.1"],\
|
||||
["@cbor-extract/cbor-extract-linux-x64", "npm:2.1.1"],\
|
||||
["@newrelic/winston-enricher", "virtual:c66bf20e88479ada0172094776519a9f51acc4731d22079b60a295bcec7ea42d5545cbce58a77a50d932bf953298799135e99707486e343da6d99ba1d167bdbd#npm:4.0.0"],\
|
||||
["@newrelic/winston-enricher", "virtual:c66bf20e88479ada0172094776519a9f51acc4731d22079b60a295bcec7ea42d5545cbce58a77a50d932bf953298799135e99707486e343da6d99ba1d167bdbd#npm:4.0.1"],\
|
||||
["@sentry/node", "npm:7.28.1"],\
|
||||
["@sentry/tracing", "npm:7.28.1"],\
|
||||
["@simplewebauthn/server", "npm:7.0.1"],\
|
||||
@@ -4175,7 +4175,7 @@ const RAW_RUNTIME_STATE =
|
||||
["@standardnotes/domain-core", "workspace:packages/domain-core"],\
|
||||
["@standardnotes/domain-events", "workspace:packages/domain-events"],\
|
||||
["@standardnotes/domain-events-infra", "workspace:packages/domain-events-infra"],\
|
||||
["@standardnotes/features", "npm:1.58.9"],\
|
||||
["@standardnotes/features", "npm:1.58.12"],\
|
||||
["@standardnotes/predicates", "workspace:packages/predicates"],\
|
||||
["@standardnotes/responses", "npm:1.13.9"],\
|
||||
["@standardnotes/security", "workspace:packages/security"],\
|
||||
@@ -4188,7 +4188,7 @@ const RAW_RUNTIME_STATE =
|
||||
["@types/express", "npm:4.17.14"],\
|
||||
["@types/ioredis", "npm:5.0.0"],\
|
||||
["@types/jest", "npm:29.1.1"],\
|
||||
["@types/newrelic", "npm:9.4.0"],\
|
||||
["@types/newrelic", "npm:9.13.0"],\
|
||||
["@types/otplib", "npm:10.0.0"],\
|
||||
["@types/prettyjson", "npm:0.0.30"],\
|
||||
["@types/ua-parser-js", "npm:0.7.36"],\
|
||||
@@ -4207,7 +4207,7 @@ const RAW_RUNTIME_STATE =
|
||||
["ioredis", "npm:5.2.4"],\
|
||||
["jest", "virtual:fd909b174d079e30b336c4ce72c38a88c1e447767b1a8dd7655e07719a1e31b97807f0931368724fc78897ff15e6a6d00b83316c0f76d11f85111f342e08bb79#npm:29.1.2"],\
|
||||
["mysql2", "npm:3.0.1"],\
|
||||
["newrelic", "npm:9.11.0"],\
|
||||
["newrelic", "npm:10.0.0"],\
|
||||
["nodemon", "npm:2.0.20"],\
|
||||
["npm-check-updates", "npm:16.0.1"],\
|
||||
["otplib", "npm:12.0.1"],\
|
||||
@@ -4298,12 +4298,12 @@ const RAW_RUNTIME_STATE =
|
||||
["@standardnotes/domain-events", "workspace:packages/domain-events"],\
|
||||
["@types/ioredis", "npm:5.0.0"],\
|
||||
["@types/jest", "npm:29.1.1"],\
|
||||
["@types/newrelic", "npm:9.4.0"],\
|
||||
["@types/newrelic", "npm:9.13.0"],\
|
||||
["@typescript-eslint/eslint-plugin", "virtual:fd909b174d079e30b336c4ce72c38a88c1e447767b1a8dd7655e07719a1e31b97807f0931368724fc78897ff15e6a6d00b83316c0f76d11f85111f342e08bb79#npm:5.48.2"],\
|
||||
["eslint-plugin-prettier", "virtual:fd909b174d079e30b336c4ce72c38a88c1e447767b1a8dd7655e07719a1e31b97807f0931368724fc78897ff15e6a6d00b83316c0f76d11f85111f342e08bb79#npm:4.2.1"],\
|
||||
["ioredis", "npm:5.2.4"],\
|
||||
["jest", "virtual:fd909b174d079e30b336c4ce72c38a88c1e447767b1a8dd7655e07719a1e31b97807f0931368724fc78897ff15e6a6d00b83316c0f76d11f85111f342e08bb79#npm:29.1.2"],\
|
||||
["newrelic", "npm:9.11.0"],\
|
||||
["newrelic", "npm:10.0.0"],\
|
||||
["reflect-metadata", "npm:0.1.13"],\
|
||||
["sqs-consumer", "virtual:685a6222c3349423674bb7f0684ba34e2ab20912010f352e04dcf707a156e13183fc382e2417cb37a60f3e7b52fd0178c53181674890e1773eb83e190dc13378#npm:6.2.1"],\
|
||||
["ts-jest", "virtual:fd909b174d079e30b336c4ce72c38a88c1e447767b1a8dd7655e07719a1e31b97807f0931368724fc78897ff15e6a6d00b83316c0f76d11f85111f342e08bb79#npm:29.0.3"],\
|
||||
@@ -4339,7 +4339,7 @@ const RAW_RUNTIME_STATE =
|
||||
["@standardnotes/time", "workspace:packages/time"],\
|
||||
["@types/ioredis", "npm:5.0.0"],\
|
||||
["@types/jest", "npm:29.1.1"],\
|
||||
["@types/newrelic", "npm:9.4.0"],\
|
||||
["@types/newrelic", "npm:9.13.0"],\
|
||||
["@types/nodemailer", "npm:6.4.6"],\
|
||||
["@typescript-eslint/eslint-plugin", "virtual:c66bf20e88479ada0172094776519a9f51acc4731d22079b60a295bcec7ea42d5545cbce58a77a50d932bf953298799135e99707486e343da6d99ba1d167bdbd#npm:5.48.2"],\
|
||||
["dotenv", "npm:16.0.1"],\
|
||||
@@ -4349,7 +4349,7 @@ const RAW_RUNTIME_STATE =
|
||||
["ioredis", "npm:5.2.4"],\
|
||||
["jest", "virtual:fd909b174d079e30b336c4ce72c38a88c1e447767b1a8dd7655e07719a1e31b97807f0931368724fc78897ff15e6a6d00b83316c0f76d11f85111f342e08bb79#npm:29.1.2"],\
|
||||
["mysql2", "npm:3.0.1"],\
|
||||
["newrelic", "npm:9.11.0"],\
|
||||
["newrelic", "npm:10.0.0"],\
|
||||
["reflect-metadata", "npm:0.1.13"],\
|
||||
["ts-jest", "virtual:fd909b174d079e30b336c4ce72c38a88c1e447767b1a8dd7655e07719a1e31b97807f0931368724fc78897ff15e6a6d00b83316c0f76d11f85111f342e08bb79#npm:29.0.3"],\
|
||||
["typeorm", "virtual:c66bf20e88479ada0172094776519a9f51acc4731d22079b60a295bcec7ea42d5545cbce58a77a50d932bf953298799135e99707486e343da6d99ba1d167bdbd#npm:0.3.10"],\
|
||||
@@ -4360,10 +4360,10 @@ const RAW_RUNTIME_STATE =
|
||||
}]\
|
||||
]],\
|
||||
["@standardnotes/features", [\
|
||||
["npm:1.58.8", {\
|
||||
"packageLocation": "./.yarn/cache/@standardnotes-features-npm-1.58.8-d97ff2aae1-77bac7d0a0.zip/node_modules/@standardnotes/features/",\
|
||||
["npm:1.58.12", {\
|
||||
"packageLocation": "./.yarn/cache/@standardnotes-features-npm-1.58.12-9778b78276-3fcd9a9488.zip/node_modules/@standardnotes/features/",\
|
||||
"packageDependencies": [\
|
||||
["@standardnotes/features", "npm:1.58.8"],\
|
||||
["@standardnotes/features", "npm:1.58.12"],\
|
||||
["@standardnotes/common", "workspace:packages/common"],\
|
||||
["@standardnotes/domain-core", "workspace:packages/domain-core"],\
|
||||
["@standardnotes/security", "workspace:packages/security"],\
|
||||
@@ -4371,10 +4371,10 @@ const RAW_RUNTIME_STATE =
|
||||
],\
|
||||
"linkType": "HARD"\
|
||||
}],\
|
||||
["npm:1.58.9", {\
|
||||
"packageLocation": "./.yarn/cache/@standardnotes-features-npm-1.58.9-c278f712cd-218350ee55.zip/node_modules/@standardnotes/features/",\
|
||||
["npm:1.58.8", {\
|
||||
"packageLocation": "./.yarn/cache/@standardnotes-features-npm-1.58.8-d97ff2aae1-77bac7d0a0.zip/node_modules/@standardnotes/features/",\
|
||||
"packageDependencies": [\
|
||||
["@standardnotes/features", "npm:1.58.9"],\
|
||||
["@standardnotes/features", "npm:1.58.8"],\
|
||||
["@standardnotes/common", "workspace:packages/common"],\
|
||||
["@standardnotes/domain-core", "workspace:packages/domain-core"],\
|
||||
["@standardnotes/security", "workspace:packages/security"],\
|
||||
@@ -4406,7 +4406,7 @@ const RAW_RUNTIME_STATE =
|
||||
["@types/ioredis", "npm:5.0.0"],\
|
||||
["@types/jest", "npm:29.1.1"],\
|
||||
["@types/jsonwebtoken", "npm:9.0.1"],\
|
||||
["@types/newrelic", "npm:9.4.0"],\
|
||||
["@types/newrelic", "npm:9.13.0"],\
|
||||
["@types/prettyjson", "npm:0.0.30"],\
|
||||
["@types/uuid", "npm:8.3.4"],\
|
||||
["@typescript-eslint/eslint-plugin", "virtual:c66bf20e88479ada0172094776519a9f51acc4731d22079b60a295bcec7ea42d5545cbce58a77a50d932bf953298799135e99707486e343da6d99ba1d167bdbd#npm:5.48.2"],\
|
||||
@@ -4425,7 +4425,7 @@ const RAW_RUNTIME_STATE =
|
||||
["ioredis", "npm:5.2.4"],\
|
||||
["jest", "virtual:fd909b174d079e30b336c4ce72c38a88c1e447767b1a8dd7655e07719a1e31b97807f0931368724fc78897ff15e6a6d00b83316c0f76d11f85111f342e08bb79#npm:29.1.2"],\
|
||||
["jsonwebtoken", "npm:9.0.0"],\
|
||||
["newrelic", "npm:9.11.0"],\
|
||||
["newrelic", "npm:10.0.0"],\
|
||||
["nodemon", "npm:2.0.20"],\
|
||||
["npm-check-updates", "npm:16.0.1"],\
|
||||
["prettyjson", "npm:1.2.5"],\
|
||||
@@ -4488,7 +4488,7 @@ const RAW_RUNTIME_STATE =
|
||||
["@standardnotes/revisions-server", "workspace:packages/revisions"],\
|
||||
["@aws-sdk/client-s3", "npm:3.259.0"],\
|
||||
["@aws-sdk/client-sqs", "npm:3.259.0"],\
|
||||
["@newrelic/winston-enricher", "virtual:c66bf20e88479ada0172094776519a9f51acc4731d22079b60a295bcec7ea42d5545cbce58a77a50d932bf953298799135e99707486e343da6d99ba1d167bdbd#npm:4.0.0"],\
|
||||
["@newrelic/winston-enricher", "virtual:c66bf20e88479ada0172094776519a9f51acc4731d22079b60a295bcec7ea42d5545cbce58a77a50d932bf953298799135e99707486e343da6d99ba1d167bdbd#npm:4.0.1"],\
|
||||
["@sentry/node", "npm:7.28.1"],\
|
||||
["@standardnotes/api", "npm:1.25.3"],\
|
||||
["@standardnotes/common", "workspace:packages/common"],\
|
||||
@@ -4503,7 +4503,7 @@ const RAW_RUNTIME_STATE =
|
||||
["@types/express", "npm:4.17.14"],\
|
||||
["@types/inversify-express-utils", "npm:2.0.0"],\
|
||||
["@types/jest", "npm:29.1.1"],\
|
||||
["@types/newrelic", "npm:9.4.0"],\
|
||||
["@types/newrelic", "npm:9.13.0"],\
|
||||
["@typescript-eslint/eslint-plugin", "virtual:c66bf20e88479ada0172094776519a9f51acc4731d22079b60a295bcec7ea42d5545cbce58a77a50d932bf953298799135e99707486e343da6d99ba1d167bdbd#npm:5.48.2"],\
|
||||
["cors", "npm:2.8.5"],\
|
||||
["dotenv", "npm:16.0.1"],\
|
||||
@@ -4514,7 +4514,7 @@ const RAW_RUNTIME_STATE =
|
||||
["inversify-express-utils", "npm:6.4.3"],\
|
||||
["jest", "virtual:fd909b174d079e30b336c4ce72c38a88c1e447767b1a8dd7655e07719a1e31b97807f0931368724fc78897ff15e6a6d00b83316c0f76d11f85111f342e08bb79#npm:29.1.2"],\
|
||||
["mysql2", "npm:3.0.1"],\
|
||||
["newrelic", "npm:9.11.0"],\
|
||||
["newrelic", "npm:10.0.0"],\
|
||||
["npm-check-updates", "npm:16.0.1"],\
|
||||
["reflect-metadata", "npm:0.1.13"],\
|
||||
["ts-jest", "virtual:fd909b174d079e30b336c4ce72c38a88c1e447767b1a8dd7655e07719a1e31b97807f0931368724fc78897ff15e6a6d00b83316c0f76d11f85111f342e08bb79#npm:29.0.3"],\
|
||||
@@ -4532,7 +4532,7 @@ const RAW_RUNTIME_STATE =
|
||||
["@standardnotes/scheduler-server", "workspace:packages/scheduler"],\
|
||||
["@aws-sdk/client-sns", "npm:3.259.0"],\
|
||||
["@aws-sdk/client-sqs", "npm:3.259.0"],\
|
||||
["@newrelic/winston-enricher", "virtual:c66bf20e88479ada0172094776519a9f51acc4731d22079b60a295bcec7ea42d5545cbce58a77a50d932bf953298799135e99707486e343da6d99ba1d167bdbd#npm:4.0.0"],\
|
||||
["@newrelic/winston-enricher", "virtual:c66bf20e88479ada0172094776519a9f51acc4731d22079b60a295bcec7ea42d5545cbce58a77a50d932bf953298799135e99707486e343da6d99ba1d167bdbd#npm:4.0.1"],\
|
||||
["@sentry/node", "npm:7.28.1"],\
|
||||
["@standardnotes/domain-core", "workspace:packages/domain-core"],\
|
||||
["@standardnotes/domain-events", "workspace:packages/domain-events"],\
|
||||
@@ -4541,7 +4541,7 @@ const RAW_RUNTIME_STATE =
|
||||
["@standardnotes/time", "workspace:packages/time"],\
|
||||
["@types/ioredis", "npm:5.0.0"],\
|
||||
["@types/jest", "npm:29.1.1"],\
|
||||
["@types/newrelic", "npm:9.4.0"],\
|
||||
["@types/newrelic", "npm:9.13.0"],\
|
||||
["@types/node", "npm:18.11.9"],\
|
||||
["@typescript-eslint/eslint-plugin", "virtual:c66bf20e88479ada0172094776519a9f51acc4731d22079b60a295bcec7ea42d5545cbce58a77a50d932bf953298799135e99707486e343da6d99ba1d167bdbd#npm:5.48.2"],\
|
||||
["dayjs", "npm:1.11.6"],\
|
||||
@@ -4552,7 +4552,7 @@ const RAW_RUNTIME_STATE =
|
||||
["ioredis", "npm:5.2.4"],\
|
||||
["jest", "virtual:fd909b174d079e30b336c4ce72c38a88c1e447767b1a8dd7655e07719a1e31b97807f0931368724fc78897ff15e6a6d00b83316c0f76d11f85111f342e08bb79#npm:29.1.2"],\
|
||||
["mysql2", "npm:3.0.1"],\
|
||||
["newrelic", "npm:9.11.0"],\
|
||||
["newrelic", "npm:10.0.0"],\
|
||||
["npm-check-updates", "npm:16.0.1"],\
|
||||
["reflect-metadata", "npm:0.1.13"],\
|
||||
["ts-jest", "virtual:fd909b174d079e30b336c4ce72c38a88c1e447767b1a8dd7655e07719a1e31b97807f0931368724fc78897ff15e6a6d00b83316c0f76d11f85111f342e08bb79#npm:29.0.3"],\
|
||||
@@ -4593,13 +4593,13 @@ const RAW_RUNTIME_STATE =
|
||||
["@lerna-lite/run", "npm:1.6.0"],\
|
||||
["@sentry/node", "npm:7.28.1"],\
|
||||
["@types/jest", "npm:29.1.1"],\
|
||||
["@types/newrelic", "npm:9.4.0"],\
|
||||
["@types/newrelic", "npm:9.13.0"],\
|
||||
["@types/node", "npm:18.11.9"],\
|
||||
["@typescript-eslint/parser", "virtual:8859b278716fedf3e7458b5628625f7e35678c418626878559a0b816445001b7e24c55546f4677ba4c20b521aa0cf52cc33ac07deff171e383ada6eeab69933f#npm:5.40.1"],\
|
||||
["eslint", "npm:8.32.0"],\
|
||||
["eslint-config-prettier", "virtual:8859b278716fedf3e7458b5628625f7e35678c418626878559a0b816445001b7e24c55546f4677ba4c20b521aa0cf52cc33ac07deff171e383ada6eeab69933f#npm:8.6.0"],\
|
||||
["ini", "npm:3.0.0"],\
|
||||
["newrelic", "npm:9.11.0"],\
|
||||
["newrelic", "npm:10.0.0"],\
|
||||
["npm-check-updates", "npm:16.0.1"],\
|
||||
["prettier", "npm:2.7.1"],\
|
||||
["ts-node", "virtual:8859b278716fedf3e7458b5628625f7e35678c418626878559a0b816445001b7e24c55546f4677ba4c20b521aa0cf52cc33ac07deff171e383ada6eeab69933f#npm:10.9.1"],\
|
||||
@@ -4668,7 +4668,7 @@ const RAW_RUNTIME_STATE =
|
||||
["@aws-sdk/client-s3", "npm:3.259.0"],\
|
||||
["@aws-sdk/client-sns", "npm:3.259.0"],\
|
||||
["@aws-sdk/client-sqs", "npm:3.259.0"],\
|
||||
["@newrelic/winston-enricher", "virtual:c66bf20e88479ada0172094776519a9f51acc4731d22079b60a295bcec7ea42d5545cbce58a77a50d932bf953298799135e99707486e343da6d99ba1d167bdbd#npm:4.0.0"],\
|
||||
["@newrelic/winston-enricher", "virtual:c66bf20e88479ada0172094776519a9f51acc4731d22079b60a295bcec7ea42d5545cbce58a77a50d932bf953298799135e99707486e343da6d99ba1d167bdbd#npm:4.0.1"],\
|
||||
["@sentry/node", "npm:7.28.1"],\
|
||||
["@sentry/tracing", "npm:7.28.1"],\
|
||||
["@standardnotes/api", "npm:1.25.3"],\
|
||||
@@ -4686,7 +4686,7 @@ const RAW_RUNTIME_STATE =
|
||||
["@types/inversify-express-utils", "npm:2.0.0"],\
|
||||
["@types/jest", "npm:29.1.1"],\
|
||||
["@types/jsonwebtoken", "npm:9.0.1"],\
|
||||
["@types/newrelic", "npm:9.4.0"],\
|
||||
["@types/newrelic", "npm:9.13.0"],\
|
||||
["@types/prettyjson", "npm:0.0.30"],\
|
||||
["@types/ua-parser-js", "npm:0.7.36"],\
|
||||
["@types/uuid", "npm:8.3.4"],\
|
||||
@@ -4703,7 +4703,7 @@ const RAW_RUNTIME_STATE =
|
||||
["jest", "virtual:fd909b174d079e30b336c4ce72c38a88c1e447767b1a8dd7655e07719a1e31b97807f0931368724fc78897ff15e6a6d00b83316c0f76d11f85111f342e08bb79#npm:29.1.2"],\
|
||||
["jsonwebtoken", "npm:9.0.0"],\
|
||||
["mysql2", "npm:3.0.1"],\
|
||||
["newrelic", "npm:9.11.0"],\
|
||||
["newrelic", "npm:10.0.0"],\
|
||||
["nodemon", "npm:2.0.20"],\
|
||||
["npm-check-updates", "npm:16.0.1"],\
|
||||
["prettyjson", "npm:1.2.5"],\
|
||||
@@ -4767,7 +4767,7 @@ const RAW_RUNTIME_STATE =
|
||||
"packageDependencies": [\
|
||||
["@standardnotes/websockets-server", "workspace:packages/websockets"],\
|
||||
["@aws-sdk/client-sqs", "npm:3.259.0"],\
|
||||
["@newrelic/winston-enricher", "virtual:c66bf20e88479ada0172094776519a9f51acc4731d22079b60a295bcec7ea42d5545cbce58a77a50d932bf953298799135e99707486e343da6d99ba1d167bdbd#npm:4.0.0"],\
|
||||
["@newrelic/winston-enricher", "virtual:c66bf20e88479ada0172094776519a9f51acc4731d22079b60a295bcec7ea42d5545cbce58a77a50d932bf953298799135e99707486e343da6d99ba1d167bdbd#npm:4.0.1"],\
|
||||
["@sentry/node", "npm:7.28.1"],\
|
||||
["@standardnotes/api", "npm:1.25.3"],\
|
||||
["@standardnotes/common", "workspace:packages/common"],\
|
||||
@@ -4781,7 +4781,7 @@ const RAW_RUNTIME_STATE =
|
||||
["@types/express", "npm:4.17.14"],\
|
||||
["@types/ioredis", "npm:5.0.0"],\
|
||||
["@types/jest", "npm:29.1.1"],\
|
||||
["@types/newrelic", "npm:9.4.0"],\
|
||||
["@types/newrelic", "npm:9.13.0"],\
|
||||
["@typescript-eslint/eslint-plugin", "virtual:c66bf20e88479ada0172094776519a9f51acc4731d22079b60a295bcec7ea42d5545cbce58a77a50d932bf953298799135e99707486e343da6d99ba1d167bdbd#npm:5.48.2"],\
|
||||
["axios", "npm:1.1.3"],\
|
||||
["cors", "npm:2.8.5"],\
|
||||
@@ -4794,7 +4794,7 @@ const RAW_RUNTIME_STATE =
|
||||
["ioredis", "npm:5.2.4"],\
|
||||
["jest", "virtual:fd909b174d079e30b336c4ce72c38a88c1e447767b1a8dd7655e07719a1e31b97807f0931368724fc78897ff15e6a6d00b83316c0f76d11f85111f342e08bb79#npm:29.1.2"],\
|
||||
["mysql2", "npm:3.0.1"],\
|
||||
["newrelic", "npm:9.11.0"],\
|
||||
["newrelic", "npm:10.0.0"],\
|
||||
["reflect-metadata", "npm:0.1.13"],\
|
||||
["ts-jest", "virtual:fd909b174d079e30b336c4ce72c38a88c1e447767b1a8dd7655e07719a1e31b97807f0931368724fc78897ff15e6a6d00b83316c0f76d11f85111f342e08bb79#npm:29.0.3"],\
|
||||
["typeorm", "virtual:c66bf20e88479ada0172094776519a9f51acc4731d22079b60a295bcec7ea42d5545cbce58a77a50d932bf953298799135e99707486e343da6d99ba1d167bdbd#npm:0.3.10"],\
|
||||
@@ -5185,10 +5185,10 @@ const RAW_RUNTIME_STATE =
|
||||
}]\
|
||||
]],\
|
||||
["@types/newrelic", [\
|
||||
["npm:9.4.0", {\
|
||||
"packageLocation": "./.yarn/cache/@types-newrelic-npm-9.4.0-72a77bd5e6-adb12973e8.zip/node_modules/@types/newrelic/",\
|
||||
["npm:9.13.0", {\
|
||||
"packageLocation": "./.yarn/cache/@types-newrelic-npm-9.13.0-a283f22b65-d0269b05c4.zip/node_modules/@types/newrelic/",\
|
||||
"packageDependencies": [\
|
||||
["@types/newrelic", "npm:9.4.0"]\
|
||||
["@types/newrelic", "npm:9.13.0"]\
|
||||
],\
|
||||
"linkType": "HARD"\
|
||||
}]\
|
||||
@@ -11502,23 +11502,23 @@ const RAW_RUNTIME_STATE =
|
||||
}]\
|
||||
]],\
|
||||
["newrelic", [\
|
||||
["npm:9.11.0", {\
|
||||
"packageLocation": "./.yarn/cache/newrelic-npm-9.11.0-3903f8b525-fd1ec1b307.zip/node_modules/newrelic/",\
|
||||
["npm:10.0.0", {\
|
||||
"packageLocation": "./.yarn/cache/newrelic-npm-10.0.0-2e94dc408d-b5af478708.zip/node_modules/newrelic/",\
|
||||
"packageDependencies": [\
|
||||
["newrelic", "npm:9.11.0"],\
|
||||
["newrelic", "npm:10.0.0"],\
|
||||
["@contrast/fn-inspect", "npm:3.3.0"],\
|
||||
["@grpc/grpc-js", "npm:1.8.12"],\
|
||||
["@grpc/grpc-js", "npm:1.8.13"],\
|
||||
["@grpc/proto-loader", "npm:0.7.5"],\
|
||||
["@newrelic/aws-sdk", "virtual:3903f8b52579d93ef51c172e331bc99e7b2816716d59e05f43ef24f0b7764b243282fc408399f3458a146bc3927d0afc82281a5fef8bf3c4a084cec2d908e789#npm:5.0.2"],\
|
||||
["@newrelic/koa", "virtual:3903f8b52579d93ef51c172e331bc99e7b2816716d59e05f43ef24f0b7764b243282fc408399f3458a146bc3927d0afc82281a5fef8bf3c4a084cec2d908e789#npm:7.1.1"],\
|
||||
["@newrelic/aws-sdk", "virtual:2e94dc408d78a7f546b419c58b70581fdb1401ee1979fe214195b4cfca74499df9c9aa918c3214331583e314b7e767fec897581d1a684dcab7cc3bba5897fc45#npm:5.0.2"],\
|
||||
["@newrelic/koa", "virtual:2e94dc408d78a7f546b419c58b70581fdb1401ee1979fe214195b4cfca74499df9c9aa918c3214331583e314b7e767fec897581d1a684dcab7cc3bba5897fc45#npm:7.1.1"],\
|
||||
["@newrelic/native-metrics", "npm:9.0.0"],\
|
||||
["@newrelic/superagent", "virtual:3903f8b52579d93ef51c172e331bc99e7b2816716d59e05f43ef24f0b7764b243282fc408399f3458a146bc3927d0afc82281a5fef8bf3c4a084cec2d908e789#npm:6.0.0"],\
|
||||
["@newrelic/superagent", "virtual:2e94dc408d78a7f546b419c58b70581fdb1401ee1979fe214195b4cfca74499df9c9aa918c3214331583e314b7e767fec897581d1a684dcab7cc3bba5897fc45#npm:6.0.0"],\
|
||||
["@tyriar/fibonacci-heap", "npm:2.0.9"],\
|
||||
["concat-stream", "npm:2.0.0"],\
|
||||
["https-proxy-agent", "npm:5.0.1"],\
|
||||
["json-bigint", "npm:1.0.0"],\
|
||||
["json-stringify-safe", "npm:5.0.1"],\
|
||||
["readable-stream", "npm:3.6.0"],\
|
||||
["readable-stream", "npm:3.6.2"],\
|
||||
["semver", "npm:5.7.1"],\
|
||||
["winston-transport", "npm:4.5.0"]\
|
||||
],\
|
||||
@@ -12866,6 +12866,16 @@ const RAW_RUNTIME_STATE =
|
||||
["util-deprecate", "npm:1.0.2"]\
|
||||
],\
|
||||
"linkType": "HARD"\
|
||||
}],\
|
||||
["npm:3.6.2", {\
|
||||
"packageLocation": "./.yarn/cache/readable-stream-npm-3.6.2-d2a6069158-b1cbe0fea6.zip/node_modules/readable-stream/",\
|
||||
"packageDependencies": [\
|
||||
["readable-stream", "npm:3.6.2"],\
|
||||
["inherits", "npm:2.0.4"],\
|
||||
["string_decoder", "npm:1.3.0"],\
|
||||
["util-deprecate", "npm:1.0.2"]\
|
||||
],\
|
||||
"linkType": "HARD"\
|
||||
}]\
|
||||
]],\
|
||||
["readdirp", [\
|
||||
|
||||
BIN
Binary file not shown.
Binary file not shown.
Binary file not shown.
BIN
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Generated
Vendored
+1
-1
@@ -327,7 +327,7 @@ endif
|
||||
|
||||
quiet_cmd_regen_makefile = ACTION Regenerating $@
|
||||
cmd_regen_makefile = cd $(srcdir); /Users/karolsojko/workspace/server/.yarn/unplugged/node-gyp-npm-9.0.0-0eccfca4d1/node_modules/node-gyp/gyp/gyp_main.py -fmake --ignore-environment "-Dlibrary=shared_library" "-Dvisibility=default" "-Dnode_root_dir=/Users/karolsojko/Library/Caches/node-gyp/18.15.0" "-Dnode_gyp_dir=/Users/karolsojko/workspace/server/.yarn/unplugged/node-gyp-npm-9.0.0-0eccfca4d1/node_modules/node-gyp" "-Dnode_lib_file=/Users/karolsojko/Library/Caches/node-gyp/18.15.0/<(target_arch)/node.lib" "-Dmodule_root_dir=/Users/karolsojko/workspace/server/.yarn/unplugged/@newrelic-native-metrics-npm-9.0.0-590d2e713a/node_modules/@newrelic/native-metrics" "-Dnode_engine=v8" "--depth=." "-Goutput_dir=." "--generator-output=build" -I/Users/karolsojko/workspace/server/.yarn/unplugged/@newrelic-native-metrics-npm-9.0.0-590d2e713a/node_modules/@newrelic/native-metrics/build/config.gypi -I/Users/karolsojko/workspace/server/.yarn/unplugged/node-gyp-npm-9.0.0-0eccfca4d1/node_modules/node-gyp/addon.gypi -I/Users/karolsojko/Library/Caches/node-gyp/18.15.0/include/node/common.gypi "--toplevel-dir=." binding.gyp
|
||||
Makefile: $(srcdir)/binding.gyp $(srcdir)/../../../../node-gyp-npm-9.0.0-0eccfca4d1/node_modules/node-gyp/addon.gypi $(srcdir)/../../../../../../../../Library/Caches/node-gyp/18.15.0/include/node/common.gypi $(srcdir)/build/config.gypi
|
||||
Makefile: $(srcdir)/../../../../node-gyp-npm-9.0.0-0eccfca4d1/node_modules/node-gyp/addon.gypi $(srcdir)/build/config.gypi $(srcdir)/../../../../../../../../Library/Caches/node-gyp/18.15.0/include/node/common.gypi $(srcdir)/binding.gyp
|
||||
$(call do_cmd,regen_makefile)
|
||||
|
||||
# "all" is a concatenation of the "all" targets from all the included
|
||||
|
||||
BIN
Binary file not shown.
Generated
Vendored
BIN
Binary file not shown.
Generated
Vendored
BIN
Binary file not shown.
Generated
Vendored
BIN
Binary file not shown.
+29
-11
@@ -22,24 +22,37 @@ if [ -z "$REVISIONS_SERVER_PORT" ]; then
|
||||
export REVISIONS_SERVER_PORT=3105
|
||||
fi
|
||||
|
||||
#############
|
||||
# NEW RELIC #
|
||||
#############
|
||||
|
||||
if [ -z "$NEW_RELIC_ENABLED" ]; then
|
||||
export NEW_RELIC_ENABLED=false
|
||||
fi
|
||||
|
||||
######
|
||||
# DB #
|
||||
######
|
||||
|
||||
if [ -z "$DB_HOST" ]; then
|
||||
export DB_HOST="db"
|
||||
echo "DB_HOST is not set. Please set it in your .env file."
|
||||
exit 1
|
||||
fi
|
||||
if [ -z "$DB_PORT" ]; then
|
||||
export DB_PORT="3306"
|
||||
echo "DB_PORT is not set. Please set it in your .env file."
|
||||
exit 1
|
||||
fi
|
||||
if [ -z "$DB_USERNAME" ]; then
|
||||
export DB_USERNAME="std_notes_user"
|
||||
echo "DB_USERNAME is not set. Please set it in your .env file."
|
||||
exit 1
|
||||
fi
|
||||
if [ -z "$DB_PASSWORD" ]; then
|
||||
export DB_PASSWORD=$(openssl rand -hex 32)
|
||||
echo "DB_PASSWORD is not set. Please set it in your .env file."
|
||||
exit 1
|
||||
fi
|
||||
if [ -z "$DB_DATABASE" ]; then
|
||||
export DB_DATABASE="standard_notes_db"
|
||||
echo "DB_DATABASE is not set. Please set it in your .env file."
|
||||
exit 1
|
||||
fi
|
||||
if [ -z "$DB_DEBUG_LEVEL" ]; then
|
||||
export DB_DEBUG_LEVEL="all"
|
||||
@@ -51,11 +64,13 @@ export DB_MIGRATIONS_PATH="dist/migrations/*.js"
|
||||
#########
|
||||
|
||||
if [ -z "$REDIS_PORT" ]; then
|
||||
export REDIS_PORT=6379
|
||||
echo "REDIS_PORT is not set. Please set it in your .env file."
|
||||
exit 1
|
||||
fi
|
||||
|
||||
if [ -z "$REDIS_HOST" ]; then
|
||||
export REDIS_HOST="cache"
|
||||
echo "REDIS_HOST is not set. Please set it in your .env file."
|
||||
exit 1
|
||||
fi
|
||||
|
||||
if [ -z "$REDIS_URL" ]; then
|
||||
@@ -67,11 +82,13 @@ fi
|
||||
##########
|
||||
|
||||
if [ -z "$AUTH_JWT_SECRET" ]; then
|
||||
export AUTH_JWT_SECRET=$(openssl rand -hex 32)
|
||||
echo "AUTH_JWT_SECRET is not set. Please set it in your .env file. You can run 'openssl rand -hex 32' to generate a random string."
|
||||
exit 1
|
||||
fi
|
||||
|
||||
if [ -z "$VALET_TOKEN_SECRET" ]; then
|
||||
export VALET_TOKEN_SECRET=$(openssl rand -base64 32)
|
||||
echo "VALET_TOKEN_SECRET is not set. Please set it in your .env file. You can run 'openssl rand -hex 32' to generate a random string."
|
||||
exit 1
|
||||
fi
|
||||
|
||||
########
|
||||
@@ -122,7 +139,8 @@ if [ -z "$AUTH_SERVER_EPHEMERAL_SESSION_AGE" ]; then
|
||||
fi
|
||||
|
||||
if [ -z "$AUTH_SERVER_ENCRYPTION_SERVER_KEY" ]; then
|
||||
export AUTH_SERVER_ENCRYPTION_SERVER_KEY=$(openssl rand -hex 32)
|
||||
echo "AUTH_SERVER_ENCRYPTION_SERVER_KEY is not set. Please set it in your .env file. You can run 'openssl rand -hex 32' to generate a random string."
|
||||
exit 1
|
||||
fi
|
||||
|
||||
export AUTH_SERVER_SYNCING_SERVER_URL=http://localhost:$SYNCING_SERVER_PORT
|
||||
@@ -172,7 +190,7 @@ if [ -z "$AUTH_SERVER_U2F_RELYING_PARTY_NAME" ]; then
|
||||
export AUTH_SERVER_U2F_RELYING_PARTY_NAME="Standard Notes"
|
||||
fi
|
||||
if [ -z "$AUTH_SERVER_U2F_EXPECTED_ORIGIN" ]; then
|
||||
export AUTH_SERVER_U2F_EXPECTED_ORIGIN="http://localhost,http://localhost:3001"
|
||||
export AUTH_SERVER_U2F_EXPECTED_ORIGIN="http://localhost,http://localhost:3001,https://app.standardnotes.com,android:apk-key-hash:WD_EG0kMOAtW--nuRzgetO9T4DcZpVA_wfKdzY4okCo"
|
||||
fi
|
||||
if [ -z "$AUTH_SERVER_U2F_REQUIRE_USER_VERIFICATION" ]; then
|
||||
export AUTH_SERVER_U2F_REQUIRE_USER_VERIFICATION=false
|
||||
|
||||
+2
-2
@@ -26,7 +26,7 @@
|
||||
"@lerna-lite/list": "^1.5.1",
|
||||
"@lerna-lite/run": "^1.5.1",
|
||||
"@types/jest": "^29.1.1",
|
||||
"@types/newrelic": "^9.4.0",
|
||||
"@types/newrelic": "^9.13.0",
|
||||
"@types/node": "^18.11.9",
|
||||
"@typescript-eslint/parser": "^5.40.1",
|
||||
"eslint": "^8.32.0",
|
||||
@@ -40,6 +40,6 @@
|
||||
"packageManager": "yarn@4.0.0-rc.25",
|
||||
"dependencies": {
|
||||
"@sentry/node": "^7.28.1",
|
||||
"newrelic": "^9.11.0"
|
||||
"newrelic": "^10.0.0"
|
||||
}
|
||||
}
|
||||
|
||||
@@ -3,6 +3,18 @@
|
||||
All notable changes to this project will be documented in this file.
|
||||
See [Conventional Commits](https://conventionalcommits.org) for commit guidelines.
|
||||
|
||||
## [2.21.7](https://github.com/standardnotes/server/compare/@standardnotes/analytics@2.21.6...@standardnotes/analytics@2.21.7) (2023-04-21)
|
||||
|
||||
**Note:** Version bump only for package @standardnotes/analytics
|
||||
|
||||
## [2.21.6](https://github.com/standardnotes/server/compare/@standardnotes/analytics@2.21.5...@standardnotes/analytics@2.21.6) (2023-04-21)
|
||||
|
||||
**Note:** Version bump only for package @standardnotes/analytics
|
||||
|
||||
## [2.21.5](https://github.com/standardnotes/server/compare/@standardnotes/analytics@2.21.4...@standardnotes/analytics@2.21.5) (2023-03-30)
|
||||
|
||||
**Note:** Version bump only for package @standardnotes/analytics
|
||||
|
||||
## [2.21.4](https://github.com/standardnotes/server/compare/@standardnotes/analytics@2.21.3...@standardnotes/analytics@2.21.4) (2023-03-10)
|
||||
|
||||
**Note:** Version bump only for package @standardnotes/analytics
|
||||
|
||||
@@ -1,6 +1,6 @@
|
||||
{
|
||||
"name": "@standardnotes/analytics",
|
||||
"version": "2.21.4",
|
||||
"version": "2.21.7",
|
||||
"engines": {
|
||||
"node": ">=18.0.0 <19.0.0"
|
||||
},
|
||||
@@ -28,7 +28,7 @@
|
||||
"@types/ioredis": "^5.0.0",
|
||||
"@types/jest": "^29.1.1",
|
||||
"@types/mixpanel": "^2.14.4",
|
||||
"@types/newrelic": "^9.4.0",
|
||||
"@types/newrelic": "^9.13.0",
|
||||
"@types/node": "^18.11.9",
|
||||
"@typescript-eslint/eslint-plugin": "^5.48.2",
|
||||
"eslint": "^8.32.0",
|
||||
@@ -40,7 +40,7 @@
|
||||
"dependencies": {
|
||||
"@aws-sdk/client-sns": "^3.259.0",
|
||||
"@aws-sdk/client-sqs": "^3.259.0",
|
||||
"@newrelic/winston-enricher": "^4.0.0",
|
||||
"@newrelic/winston-enricher": "^4.0.1",
|
||||
"@sentry/node": "^7.28.1",
|
||||
"@standardnotes/common": "workspace:*",
|
||||
"@standardnotes/domain-core": "workspace:^",
|
||||
@@ -53,7 +53,7 @@
|
||||
"ioredis": "^5.2.4",
|
||||
"mixpanel": "^0.17.0",
|
||||
"mysql2": "^3.0.1",
|
||||
"newrelic": "^9.11.0",
|
||||
"newrelic": "^10.0.0",
|
||||
"reflect-metadata": "^0.1.13",
|
||||
"typeorm": "^0.3.10",
|
||||
"winston": "^3.8.1"
|
||||
|
||||
@@ -3,6 +3,18 @@
|
||||
All notable changes to this project will be documented in this file.
|
||||
See [Conventional Commits](https://conventionalcommits.org) for commit guidelines.
|
||||
|
||||
## [1.49.10](https://github.com/standardnotes/api-gateway/compare/@standardnotes/api-gateway@1.49.9...@standardnotes/api-gateway@1.49.10) (2023-04-21)
|
||||
|
||||
**Note:** Version bump only for package @standardnotes/api-gateway
|
||||
|
||||
## [1.49.9](https://github.com/standardnotes/api-gateway/compare/@standardnotes/api-gateway@1.49.8...@standardnotes/api-gateway@1.49.9) (2023-04-21)
|
||||
|
||||
**Note:** Version bump only for package @standardnotes/api-gateway
|
||||
|
||||
## [1.49.8](https://github.com/standardnotes/api-gateway/compare/@standardnotes/api-gateway@1.49.7...@standardnotes/api-gateway@1.49.8) (2023-03-30)
|
||||
|
||||
**Note:** Version bump only for package @standardnotes/api-gateway
|
||||
|
||||
## [1.49.7](https://github.com/standardnotes/api-gateway/compare/@standardnotes/api-gateway@1.49.6...@standardnotes/api-gateway@1.49.7) (2023-03-10)
|
||||
|
||||
**Note:** Version bump only for package @standardnotes/api-gateway
|
||||
|
||||
@@ -1,6 +1,6 @@
|
||||
{
|
||||
"name": "@standardnotes/api-gateway",
|
||||
"version": "1.49.7",
|
||||
"version": "1.49.10",
|
||||
"engines": {
|
||||
"node": ">=18.0.0 <19.0.0"
|
||||
},
|
||||
@@ -20,7 +20,7 @@
|
||||
"upgrade:snjs": "yarn ncu -u '@standardnotes/*'"
|
||||
},
|
||||
"dependencies": {
|
||||
"@newrelic/winston-enricher": "^4.0.0",
|
||||
"@newrelic/winston-enricher": "^4.0.1",
|
||||
"@sentry/node": "^7.28.1",
|
||||
"@standardnotes/domain-core": "workspace:^",
|
||||
"@standardnotes/domain-events": "workspace:*",
|
||||
@@ -37,7 +37,7 @@
|
||||
"inversify-express-utils": "^6.4.3",
|
||||
"ioredis": "^5.2.4",
|
||||
"jsonwebtoken": "^9.0.0",
|
||||
"newrelic": "^9.11.0",
|
||||
"newrelic": "^10.0.0",
|
||||
"prettyjson": "^1.2.5",
|
||||
"reflect-metadata": "0.1.13",
|
||||
"winston": "^3.8.1"
|
||||
@@ -48,7 +48,7 @@
|
||||
"@types/ioredis": "^5.0.0",
|
||||
"@types/jest": "^29.1.1",
|
||||
"@types/jsonwebtoken": "^9.0.1",
|
||||
"@types/newrelic": "^9.4.0",
|
||||
"@types/newrelic": "^9.13.0",
|
||||
"@types/prettyjson": "^0.0.30",
|
||||
"@typescript-eslint/eslint-plugin": "^5.48.2",
|
||||
"eslint": "^8.32.0",
|
||||
|
||||
@@ -3,6 +3,58 @@
|
||||
All notable changes to this project will be documented in this file.
|
||||
See [Conventional Commits](https://conventionalcommits.org) for commit guidelines.
|
||||
|
||||
## [1.95.3](https://github.com/standardnotes/server/compare/@standardnotes/auth-server@1.95.2...@standardnotes/auth-server@1.95.3) (2023-04-21)
|
||||
|
||||
**Note:** Version bump only for package @standardnotes/auth-server
|
||||
|
||||
## [1.95.2](https://github.com/standardnotes/server/compare/@standardnotes/auth-server@1.95.1...@standardnotes/auth-server@1.95.2) (2023-04-21)
|
||||
|
||||
**Note:** Version bump only for package @standardnotes/auth-server
|
||||
|
||||
## [1.95.1](https://github.com/standardnotes/server/compare/@standardnotes/auth-server@1.95.0...@standardnotes/auth-server@1.95.1) (2023-04-20)
|
||||
|
||||
### Bug Fixes
|
||||
|
||||
* **auth:** add u2f permissions for pro users ([d211249](https://github.com/standardnotes/server/commit/d21124908652e89a7995c8f58e6b95394268967f))
|
||||
|
||||
# [1.95.0](https://github.com/standardnotes/server/compare/@standardnotes/auth-server@1.94.1...@standardnotes/auth-server@1.95.0) (2023-04-04)
|
||||
|
||||
### Features
|
||||
|
||||
* **auth:** add initial emergency access invitations model ([#528](https://github.com/standardnotes/server/issues/528)) ([8242f13](https://github.com/standardnotes/server/commit/8242f13aff63ea9f3007308fe4f65973fa1478e1))
|
||||
|
||||
## [1.94.1](https://github.com/standardnotes/server/compare/@standardnotes/auth-server@1.94.0...@standardnotes/auth-server@1.94.1) (2023-04-04)
|
||||
|
||||
### Bug Fixes
|
||||
|
||||
* **auth:** change status code for updating a subscription setting without a subscription ([3417407](https://github.com/standardnotes/server/commit/3417407cbe3b8e19069f6003e767d707e14b4501))
|
||||
|
||||
# [1.94.0](https://github.com/standardnotes/server/compare/@standardnotes/auth-server@1.93.14...@standardnotes/auth-server@1.94.0) (2023-04-03)
|
||||
|
||||
### Bug Fixes
|
||||
|
||||
* **auth:** feature service specs ([b88f560](https://github.com/standardnotes/server/commit/b88f560b07de183d4101220626785d3ba994b44c))
|
||||
|
||||
### Features
|
||||
|
||||
* **auth:** feature entitlement check for u2f endpoints ([51b264c](https://github.com/standardnotes/server/commit/51b264ca13fffc66e2dc31e87b0934ba61a48435))
|
||||
|
||||
## [1.93.14](https://github.com/standardnotes/server/compare/@standardnotes/auth-server@1.93.13...@standardnotes/auth-server@1.93.14) (2023-04-03)
|
||||
|
||||
### Bug Fixes
|
||||
|
||||
* **auth:** relying party id ([aca8d29](https://github.com/standardnotes/server/commit/aca8d2948da67b32445dc8da54b561ff08bf5c62))
|
||||
|
||||
## [1.93.13](https://github.com/standardnotes/server/compare/@standardnotes/auth-server@1.93.12...@standardnotes/auth-server@1.93.13) (2023-03-30)
|
||||
|
||||
**Note:** Version bump only for package @standardnotes/auth-server
|
||||
|
||||
## [1.93.12](https://github.com/standardnotes/server/compare/@standardnotes/auth-server@1.93.11...@standardnotes/auth-server@1.93.12) (2023-03-16)
|
||||
|
||||
### Bug Fixes
|
||||
|
||||
* **auth:** persistence mapping for authenticators ([f8a2892](https://github.com/standardnotes/server/commit/f8a2892811ebb4d8f067e036fb9f54780a400535))
|
||||
|
||||
## [1.93.11](https://github.com/standardnotes/server/compare/@standardnotes/auth-server@1.93.10...@standardnotes/auth-server@1.93.11) (2023-03-10)
|
||||
|
||||
### Bug Fixes
|
||||
|
||||
@@ -0,0 +1,23 @@
|
||||
import { MigrationInterface, QueryRunner } from 'typeorm'
|
||||
|
||||
export class emergencyAccessInvitations1680597887475 implements MigrationInterface {
|
||||
name = 'emergencyAccessInvitations1680597887475'
|
||||
|
||||
public async up(queryRunner: QueryRunner): Promise<void> {
|
||||
await queryRunner.query(
|
||||
'CREATE TABLE `emergency_access_invitations` (`uuid` varchar(36) NOT NULL, `grantor_uuid` varchar(36) NOT NULL, `grantee_uuid` varchar(36) NOT NULL, `status` varchar(36) NOT NULL, `expires_at` datetime NOT NULL, `created_at` datetime NOT NULL, `updated_at` datetime NOT NULL, PRIMARY KEY (`uuid`)) ENGINE=InnoDB',
|
||||
)
|
||||
await queryRunner.query(
|
||||
'ALTER TABLE `emergency_access_invitations` ADD CONSTRAINT `grantor_uuid_fk` FOREIGN KEY (`grantor_uuid`) REFERENCES `users`(`uuid`) ON DELETE CASCADE ON UPDATE NO ACTION',
|
||||
)
|
||||
await queryRunner.query(
|
||||
'ALTER TABLE `emergency_access_invitations` ADD CONSTRAINT `grantee_uuid_fk` FOREIGN KEY (`grantee_uuid`) REFERENCES `users`(`uuid`) ON DELETE CASCADE ON UPDATE NO ACTION',
|
||||
)
|
||||
}
|
||||
|
||||
public async down(queryRunner: QueryRunner): Promise<void> {
|
||||
await queryRunner.query('ALTER TABLE `emergency_access_invitations` DROP FOREIGN KEY `grantee_uuid_fk`')
|
||||
await queryRunner.query('ALTER TABLE `emergency_access_invitations` DROP FOREIGN KEY `grantor_uuid_fk`')
|
||||
await queryRunner.query('DROP TABLE `emergency_access_invitations`')
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,14 @@
|
||||
import { MigrationInterface, QueryRunner } from 'typeorm'
|
||||
|
||||
export class enableU2f1681984540867 implements MigrationInterface {
|
||||
public async up(queryRunner: QueryRunner): Promise<void> {
|
||||
// add u2f permission for pro users
|
||||
await queryRunner.query(
|
||||
'INSERT INTO `role_permissions` (role_uuid, permission_uuid) VALUES ("8047edbb-a10a-4ff8-8d53-c2cae600a8e8", "fb13e7d3-936f-4ded-a543-e1650cc99dfd")',
|
||||
)
|
||||
}
|
||||
|
||||
public async down(): Promise<void> {
|
||||
return
|
||||
}
|
||||
}
|
||||
@@ -1,6 +1,6 @@
|
||||
{
|
||||
"name": "@standardnotes/auth-server",
|
||||
"version": "1.93.11",
|
||||
"version": "1.95.3",
|
||||
"engines": {
|
||||
"node": ">=18.0.0 <19.0.0"
|
||||
},
|
||||
@@ -36,7 +36,7 @@
|
||||
"@aws-sdk/client-sqs": "^3.259.0",
|
||||
"@cbor-extract/cbor-extract-linux-arm64": "^2.1.1",
|
||||
"@cbor-extract/cbor-extract-linux-x64": "^2.1.1",
|
||||
"@newrelic/winston-enricher": "^4.0.0",
|
||||
"@newrelic/winston-enricher": "^4.0.1",
|
||||
"@sentry/node": "^7.28.1",
|
||||
"@sentry/tracing": "^7.28.1",
|
||||
"@simplewebauthn/server": "^7.0.1",
|
||||
@@ -46,7 +46,7 @@
|
||||
"@standardnotes/domain-core": "workspace:^",
|
||||
"@standardnotes/domain-events": "workspace:*",
|
||||
"@standardnotes/domain-events-infra": "workspace:*",
|
||||
"@standardnotes/features": "^1.58.9",
|
||||
"@standardnotes/features": "^1.58.12",
|
||||
"@standardnotes/predicates": "workspace:*",
|
||||
"@standardnotes/responses": "^1.13.9",
|
||||
"@standardnotes/security": "workspace:*",
|
||||
@@ -64,7 +64,7 @@
|
||||
"inversify-express-utils": "^6.4.3",
|
||||
"ioredis": "^5.2.4",
|
||||
"mysql2": "^3.0.1",
|
||||
"newrelic": "^9.11.0",
|
||||
"newrelic": "^10.0.0",
|
||||
"otplib": "12.0.1",
|
||||
"prettyjson": "^1.2.5",
|
||||
"reflect-metadata": "0.1.13",
|
||||
@@ -79,7 +79,7 @@
|
||||
"@types/express": "^4.17.14",
|
||||
"@types/ioredis": "^5.0.0",
|
||||
"@types/jest": "^29.1.1",
|
||||
"@types/newrelic": "^9.4.0",
|
||||
"@types/newrelic": "^9.13.0",
|
||||
"@types/otplib": "^10.0.0",
|
||||
"@types/prettyjson": "^0.0.30",
|
||||
"@types/ua-parser-js": "^0.7.36",
|
||||
|
||||
@@ -452,7 +452,7 @@ export class ContainerConfigLoader {
|
||||
.toConstantValue(env.get('U2F_RELYING_PARTY_NAME', true) ?? 'Standard Notes')
|
||||
container
|
||||
.bind(TYPES.U2F_RELYING_PARTY_ID)
|
||||
.toConstantValue(env.get('U2F_RELYING_PARTY_ID', true) ?? 'standardnotes.com')
|
||||
.toConstantValue(env.get('U2F_RELYING_PARTY_ID', true) ?? 'app.standardnotes.com')
|
||||
container
|
||||
.bind(TYPES.U2F_EXPECTED_ORIGIN)
|
||||
.toConstantValue(
|
||||
@@ -563,6 +563,8 @@ export class ContainerConfigLoader {
|
||||
container.get(TYPES.AuthenticatorChallengeRepository),
|
||||
container.get(TYPES.U2F_RELYING_PARTY_NAME),
|
||||
container.get(TYPES.U2F_RELYING_PARTY_ID),
|
||||
container.get(TYPES.UserRepository),
|
||||
container.get(TYPES.FeatureService),
|
||||
),
|
||||
)
|
||||
container
|
||||
@@ -574,6 +576,8 @@ export class ContainerConfigLoader {
|
||||
container.get(TYPES.U2F_RELYING_PARTY_ID),
|
||||
container.get(TYPES.U2F_EXPECTED_ORIGIN),
|
||||
container.get(TYPES.U2F_REQUIRE_USER_VERIFICATION),
|
||||
container.get(TYPES.UserRepository),
|
||||
container.get(TYPES.FeatureService),
|
||||
),
|
||||
)
|
||||
container
|
||||
@@ -599,10 +603,22 @@ export class ContainerConfigLoader {
|
||||
)
|
||||
container
|
||||
.bind<ListAuthenticators>(TYPES.ListAuthenticators)
|
||||
.toConstantValue(new ListAuthenticators(container.get(TYPES.AuthenticatorRepository)))
|
||||
.toConstantValue(
|
||||
new ListAuthenticators(
|
||||
container.get(TYPES.AuthenticatorRepository),
|
||||
container.get(TYPES.UserRepository),
|
||||
container.get(TYPES.FeatureService),
|
||||
),
|
||||
)
|
||||
container
|
||||
.bind<DeleteAuthenticator>(TYPES.DeleteAuthenticator)
|
||||
.toConstantValue(new DeleteAuthenticator(container.get(TYPES.AuthenticatorRepository)))
|
||||
.toConstantValue(
|
||||
new DeleteAuthenticator(
|
||||
container.get(TYPES.AuthenticatorRepository),
|
||||
container.get(TYPES.UserRepository),
|
||||
container.get(TYPES.FeatureService),
|
||||
),
|
||||
)
|
||||
container
|
||||
.bind<GenerateRecoveryCodes>(TYPES.GenerateRecoveryCodes)
|
||||
.toConstantValue(
|
||||
|
||||
@@ -12,6 +12,7 @@ import { UserSubscription } from '../Domain/Subscription/UserSubscription'
|
||||
import { User } from '../Domain/User/User'
|
||||
import { TypeORMAuthenticator } from '../Infra/TypeORM/TypeORMAuthenticator'
|
||||
import { TypeORMAuthenticatorChallenge } from '../Infra/TypeORM/TypeORMAuthenticatorChallenge'
|
||||
import { TypeORMEmergencyAccessInvitation } from '../Infra/TypeORM/TypeORMEmergencyAccessInvitation'
|
||||
import { TypeORMSessionTrace } from '../Infra/TypeORM/TypeORMSessionTrace'
|
||||
import { Env } from './Env'
|
||||
|
||||
@@ -72,6 +73,7 @@ export const AppDataSource = new DataSource({
|
||||
TypeORMSessionTrace,
|
||||
TypeORMAuthenticator,
|
||||
TypeORMAuthenticatorChallenge,
|
||||
TypeORMEmergencyAccessInvitation,
|
||||
],
|
||||
migrations: [env.get('DB_MIGRATIONS_PATH', true) ?? 'dist/migrations/*.js'],
|
||||
migrationsRun: true,
|
||||
|
||||
@@ -34,6 +34,17 @@ export class AuthenticatorsController {
|
||||
userUuid: params.userUuid,
|
||||
})
|
||||
|
||||
if (result.isFailed()) {
|
||||
return {
|
||||
status: HttpStatusCode.Unauthorized,
|
||||
data: {
|
||||
error: {
|
||||
message: result.getError(),
|
||||
},
|
||||
},
|
||||
}
|
||||
}
|
||||
|
||||
return {
|
||||
status: HttpStatusCode.Success,
|
||||
data: {
|
||||
@@ -50,6 +61,17 @@ export class AuthenticatorsController {
|
||||
authenticatorId: params.authenticatorId,
|
||||
})
|
||||
|
||||
if (result.isFailed()) {
|
||||
return {
|
||||
status: HttpStatusCode.Unauthorized,
|
||||
data: {
|
||||
error: {
|
||||
message: result.getError(),
|
||||
},
|
||||
},
|
||||
}
|
||||
}
|
||||
|
||||
return {
|
||||
status: HttpStatusCode.Success,
|
||||
data: {
|
||||
|
||||
@@ -0,0 +1,17 @@
|
||||
import { Entity, Result, UniqueEntityId } from '@standardnotes/domain-core'
|
||||
|
||||
import { EmergencyAccessInvitationProps } from './EmergencyAccessInvitationProps'
|
||||
|
||||
export class EmergencyAccessInvitation extends Entity<EmergencyAccessInvitationProps> {
|
||||
get id(): UniqueEntityId {
|
||||
return this._id
|
||||
}
|
||||
|
||||
private constructor(props: EmergencyAccessInvitationProps, id?: UniqueEntityId) {
|
||||
super(props, id)
|
||||
}
|
||||
|
||||
static create(props: EmergencyAccessInvitationProps, id?: UniqueEntityId): Result<EmergencyAccessInvitation> {
|
||||
return Result.ok<EmergencyAccessInvitation>(new EmergencyAccessInvitation(props, id))
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,11 @@
|
||||
import { Dates, Uuid } from '@standardnotes/domain-core'
|
||||
|
||||
import { EmergencyAccessInvitationStatus } from './EmergencyAccessInvitationStatus'
|
||||
|
||||
export interface EmergencyAccessInvitationProps {
|
||||
grantorUuid: Uuid
|
||||
granteeUuid: Uuid
|
||||
status: EmergencyAccessInvitationStatus
|
||||
expiresAt: Date
|
||||
dates: Dates
|
||||
}
|
||||
@@ -0,0 +1,30 @@
|
||||
import { Result, ValueObject } from '@standardnotes/domain-core'
|
||||
|
||||
import { EmergencyAccessInvitationStatusProps } from './EmergencyAccessInvitationStatusProps'
|
||||
|
||||
export class EmergencyAccessInvitationStatus extends ValueObject<EmergencyAccessInvitationStatusProps> {
|
||||
static readonly NAMES = {
|
||||
Sent: 'sent',
|
||||
Accepted: 'accepted',
|
||||
Confirmed: 'confirmed',
|
||||
Expired: 'expired',
|
||||
Revoked: 'revoked',
|
||||
}
|
||||
|
||||
get value(): string {
|
||||
return this.props.value
|
||||
}
|
||||
|
||||
private constructor(props: EmergencyAccessInvitationStatusProps) {
|
||||
super(props)
|
||||
}
|
||||
|
||||
static create(name: string): Result<EmergencyAccessInvitationStatus> {
|
||||
const isValidName = Object.values(this.NAMES).includes(name)
|
||||
if (!isValidName) {
|
||||
return Result.fail<EmergencyAccessInvitationStatus>(`Invalid status name: ${name}`)
|
||||
} else {
|
||||
return Result.ok<EmergencyAccessInvitationStatus>(new EmergencyAccessInvitationStatus({ value: name }))
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,3 @@
|
||||
export interface EmergencyAccessInvitationStatusProps {
|
||||
value: string
|
||||
}
|
||||
@@ -30,7 +30,7 @@ jest.mock('@standardnotes/features', () => {
|
||||
const { GetFeatures } = jest.requireMock('@standardnotes/features')
|
||||
|
||||
import { FeatureService } from './FeatureService'
|
||||
import { Permission, PermissionName } from '@standardnotes/features'
|
||||
import { FeatureIdentifier, Permission, PermissionName } from '@standardnotes/features'
|
||||
import { OfflineUserSubscriptionRepositoryInterface } from '../Subscription/OfflineUserSubscriptionRepositoryInterface'
|
||||
import { TimerInterface } from '@standardnotes/time'
|
||||
import { OfflineUserSubscription } from '../Subscription/OfflineUserSubscription'
|
||||
@@ -201,6 +201,62 @@ describe('FeatureService', () => {
|
||||
})
|
||||
|
||||
describe('online subscribers', () => {
|
||||
it('should tell if a user is entitled to a feature', async () => {
|
||||
expect(await createService().userIsEntitledToFeature(user, FeatureIdentifier.AutobiographyTheme)).toBe(true)
|
||||
expect(await createService().userIsEntitledToFeature(user, FeatureIdentifier.DeprecatedBoldEditor)).toBe(false)
|
||||
})
|
||||
|
||||
it('should tell if a user is not entitled to a feature because it is expired', async () => {
|
||||
timer.getTimestampInMicroseconds = jest.fn().mockReturnValue(777)
|
||||
expect(await createService().userIsEntitledToFeature(user, FeatureIdentifier.AutobiographyTheme)).toBe(false)
|
||||
})
|
||||
|
||||
it('should tell if a user is entitled to a feature that does not expire', async () => {
|
||||
const nonSubscriptionPermission = {
|
||||
uuid: 'files-beta-permission-1-1-1',
|
||||
name: 'files-beta' as PermissionName,
|
||||
} as jest.Mocked<Permission>
|
||||
|
||||
GetFeatures.mockImplementation(() => [
|
||||
{
|
||||
identifier: 'org.standardnotes.theme-autobiography',
|
||||
permission_name: PermissionName.AutobiographyTheme,
|
||||
expires_at: 555,
|
||||
},
|
||||
{
|
||||
identifier: 'org.standardnotes.bold-editor',
|
||||
permission_name: PermissionName.BoldEditor,
|
||||
expires_at: 777,
|
||||
},
|
||||
{
|
||||
identifier: 'files-beta',
|
||||
permission_name: 'files-beta' as PermissionName,
|
||||
expires_at: undefined,
|
||||
no_expire: true,
|
||||
},
|
||||
])
|
||||
|
||||
const nonSubscriptionRole = {
|
||||
name: RoleName.NAMES.InternalTeamUser,
|
||||
uuid: 'role-files-beta',
|
||||
permissions: Promise.resolve([nonSubscriptionPermission]),
|
||||
} as jest.Mocked<Role>
|
||||
|
||||
roleToSubscriptionMap.filterNonSubscriptionRoles = jest.fn().mockReturnValue([nonSubscriptionRole])
|
||||
roleToSubscriptionMap.getSubscriptionNameForRoleName = jest
|
||||
.fn()
|
||||
.mockReturnValueOnce(SubscriptionName.PlusPlan)
|
||||
.mockReturnValueOnce(SubscriptionName.ProPlan)
|
||||
|
||||
user = {
|
||||
uuid: 'user-1-1-1',
|
||||
roles: Promise.resolve([role1, role2, nonSubscriptionRole]),
|
||||
subscriptions: Promise.resolve([subscription1, subscription2]),
|
||||
} as jest.Mocked<User>
|
||||
|
||||
expect(await createService().userIsEntitledToFeature(user, 'files-beta')).toBe(true)
|
||||
})
|
||||
|
||||
it('should return user features with `expires_at` field', async () => {
|
||||
const features = await createService().getFeaturesForUser(user)
|
||||
expect(features).toEqual(
|
||||
@@ -321,7 +377,7 @@ describe('FeatureService', () => {
|
||||
it('should return user features along with features related to non subscription roles', async () => {
|
||||
const nonSubscriptionPermission = {
|
||||
uuid: 'files-beta-permission-1-1-1',
|
||||
name: PermissionName.FilesBeta,
|
||||
name: 'files-beta' as PermissionName,
|
||||
} as jest.Mocked<Permission>
|
||||
|
||||
GetFeatures.mockImplementation(() => [
|
||||
@@ -336,7 +392,8 @@ describe('FeatureService', () => {
|
||||
expires_at: 777,
|
||||
},
|
||||
{
|
||||
permission_name: PermissionName.FilesBeta,
|
||||
identifier: 'files-beta',
|
||||
permission_name: 'files-beta' as PermissionName,
|
||||
expires_at: undefined,
|
||||
no_expire: true,
|
||||
},
|
||||
|
||||
@@ -21,6 +21,25 @@ export class FeatureService implements FeatureServiceInterface {
|
||||
@inject(TYPES.Timer) private timer: TimerInterface,
|
||||
) {}
|
||||
|
||||
async userIsEntitledToFeature(user: User, featureIdentifier: string): Promise<boolean> {
|
||||
const userFeatures = await this.getFeaturesForUser(user)
|
||||
|
||||
const feature = userFeatures.find((userFeature) => userFeature.identifier === featureIdentifier)
|
||||
|
||||
if (feature === undefined) {
|
||||
return false
|
||||
}
|
||||
|
||||
if (feature.no_expire) {
|
||||
return true
|
||||
}
|
||||
|
||||
const featureIsExpired =
|
||||
feature.expires_at !== undefined && feature.expires_at < this.timer.getTimestampInMicroseconds()
|
||||
|
||||
return !featureIsExpired
|
||||
}
|
||||
|
||||
async getFeaturesForOfflineUser(email: string): Promise<{ features: FeatureDescription[]; roles: string[] }> {
|
||||
const userSubscriptions = await this.offlineUserSubscriptionRepository.findByEmail(
|
||||
email,
|
||||
|
||||
@@ -4,5 +4,6 @@ import { User } from '../User/User'
|
||||
|
||||
export interface FeatureServiceInterface {
|
||||
getFeaturesForUser(user: User): Promise<Array<FeatureDescription>>
|
||||
userIsEntitledToFeature(user: User, featureIdentifier: string): Promise<boolean>
|
||||
getFeaturesForOfflineUser(email: string): Promise<{ features: FeatureDescription[]; roles: string[] }>
|
||||
}
|
||||
|
||||
@@ -2,12 +2,18 @@ import { Dates, Uuid } from '@standardnotes/domain-core'
|
||||
|
||||
import { Authenticator } from '../../Authenticator/Authenticator'
|
||||
import { AuthenticatorRepositoryInterface } from '../../Authenticator/AuthenticatorRepositoryInterface'
|
||||
import { FeatureServiceInterface } from '../../Feature/FeatureServiceInterface'
|
||||
import { User } from '../../User/User'
|
||||
import { UserRepositoryInterface } from '../../User/UserRepositoryInterface'
|
||||
import { DeleteAuthenticator } from './DeleteAuthenticator'
|
||||
|
||||
describe('DeleteAuthenticator', () => {
|
||||
let authenticatorRepository: AuthenticatorRepositoryInterface
|
||||
let authenticator: Authenticator
|
||||
const createUseCase = () => new DeleteAuthenticator(authenticatorRepository)
|
||||
let userRepository: UserRepositoryInterface
|
||||
let featureService: FeatureServiceInterface
|
||||
|
||||
const createUseCase = () => new DeleteAuthenticator(authenticatorRepository, userRepository, featureService)
|
||||
|
||||
beforeEach(() => {
|
||||
authenticator = Authenticator.create({
|
||||
@@ -24,6 +30,12 @@ describe('DeleteAuthenticator', () => {
|
||||
authenticatorRepository = {} as jest.Mocked<AuthenticatorRepositoryInterface>
|
||||
authenticatorRepository.findById = jest.fn().mockReturnValue(authenticator)
|
||||
authenticatorRepository.remove = jest.fn()
|
||||
|
||||
userRepository = {} as jest.Mocked<UserRepositoryInterface>
|
||||
userRepository.findOneByUuid = jest.fn().mockReturnValue({} as jest.Mocked<User>)
|
||||
|
||||
featureService = {} as jest.Mocked<FeatureServiceInterface>
|
||||
featureService.userIsEntitledToFeature = jest.fn().mockReturnValue(true)
|
||||
})
|
||||
|
||||
it('should return error if authenticator not found', async () => {
|
||||
@@ -38,6 +50,40 @@ describe('DeleteAuthenticator', () => {
|
||||
expect(result.getError()).toEqual('Authenticator not found')
|
||||
})
|
||||
|
||||
it('should return error if user is not found', async () => {
|
||||
userRepository.findOneByUuid = jest.fn().mockReturnValue(null)
|
||||
|
||||
const result = await createUseCase().execute({
|
||||
userUuid: '00000000-0000-0000-0000-000000000000',
|
||||
authenticatorId: '00000000-0000-0000-0000-000000000000',
|
||||
})
|
||||
|
||||
expect(result.isFailed()).toBe(true)
|
||||
expect(result.getError()).toEqual('Could not delete authenticator: user not found.')
|
||||
})
|
||||
|
||||
it('should return error if user is not entitled to U2F', async () => {
|
||||
featureService.userIsEntitledToFeature = jest.fn().mockReturnValue(false)
|
||||
|
||||
const result = await createUseCase().execute({
|
||||
userUuid: '00000000-0000-0000-0000-000000000000',
|
||||
authenticatorId: '00000000-0000-0000-0000-000000000000',
|
||||
})
|
||||
|
||||
expect(result.isFailed()).toBe(true)
|
||||
expect(result.getError()).toEqual('Could not delete authenticator: user is not entitled to U2F.')
|
||||
})
|
||||
|
||||
it('should return error if user uuid is not valid', async () => {
|
||||
const result = await createUseCase().execute({
|
||||
userUuid: 'invalid',
|
||||
authenticatorId: '00000000-0000-0000-0000-000000000000',
|
||||
})
|
||||
|
||||
expect(result.isFailed()).toBe(true)
|
||||
expect(result.getError()).toEqual('Could not delete authenticator: Given value is not a valid uuid: invalid')
|
||||
})
|
||||
|
||||
it('should return error if authenticator does not belong to user', async () => {
|
||||
authenticatorRepository.findById = jest.fn().mockReturnValue({
|
||||
...authenticator,
|
||||
|
||||
@@ -1,12 +1,41 @@
|
||||
import { Result, UniqueEntityId, UseCaseInterface } from '@standardnotes/domain-core'
|
||||
import { Result, UniqueEntityId, UseCaseInterface, Uuid } from '@standardnotes/domain-core'
|
||||
import { FeatureIdentifier } from '@standardnotes/features'
|
||||
|
||||
import { AuthenticatorRepositoryInterface } from '../../Authenticator/AuthenticatorRepositoryInterface'
|
||||
import { FeatureServiceInterface } from '../../Feature/FeatureServiceInterface'
|
||||
import { UserRepositoryInterface } from '../../User/UserRepositoryInterface'
|
||||
import { DeleteAuthenticatorDTO } from './DeleteAuthenticatorDTO'
|
||||
|
||||
export class DeleteAuthenticator implements UseCaseInterface<string> {
|
||||
constructor(private authenticatorRepository: AuthenticatorRepositoryInterface) {}
|
||||
constructor(
|
||||
private authenticatorRepository: AuthenticatorRepositoryInterface,
|
||||
private userRepository: UserRepositoryInterface,
|
||||
private featureService: FeatureServiceInterface,
|
||||
) {}
|
||||
|
||||
async execute(dto: DeleteAuthenticatorDTO): Promise<Result<string>> {
|
||||
const userUuidOrError = Uuid.create(dto.userUuid)
|
||||
if (userUuidOrError.isFailed()) {
|
||||
return Result.fail(`Could not delete authenticator: ${userUuidOrError.getError()}`)
|
||||
}
|
||||
const userUuid = userUuidOrError.getValue()
|
||||
|
||||
const user = await this.userRepository.findOneByUuid(userUuid.value)
|
||||
if (user === null) {
|
||||
return Result.fail('Could not delete authenticator: user not found.')
|
||||
}
|
||||
|
||||
const userIsEntitledToU2F = await this.featureService.userIsEntitledToFeature(
|
||||
user,
|
||||
FeatureIdentifier.UniversalSecondFactor,
|
||||
)
|
||||
|
||||
if (!userIsEntitledToU2F) {
|
||||
return Result.fail('Could not delete authenticator: user is not entitled to U2F.')
|
||||
}
|
||||
|
||||
const authenticator = await this.authenticatorRepository.findById(new UniqueEntityId(dto.authenticatorId))
|
||||
if (!authenticator || authenticator.props.userUuid.value !== dto.userUuid) {
|
||||
if (!authenticator || authenticator.props.userUuid.value !== userUuid.value) {
|
||||
return Result.fail('Authenticator not found')
|
||||
}
|
||||
|
||||
|
||||
+43
@@ -4,11 +4,16 @@ import { Authenticator } from '../../Authenticator/Authenticator'
|
||||
import { AuthenticatorChallenge } from '../../Authenticator/AuthenticatorChallenge'
|
||||
import { AuthenticatorChallengeRepositoryInterface } from '../../Authenticator/AuthenticatorChallengeRepositoryInterface'
|
||||
import { AuthenticatorRepositoryInterface } from '../../Authenticator/AuthenticatorRepositoryInterface'
|
||||
import { FeatureServiceInterface } from '../../Feature/FeatureServiceInterface'
|
||||
import { User } from '../../User/User'
|
||||
import { UserRepositoryInterface } from '../../User/UserRepositoryInterface'
|
||||
import { GenerateAuthenticatorRegistrationOptions } from './GenerateAuthenticatorRegistrationOptions'
|
||||
|
||||
describe('GenerateAuthenticatorRegistrationOptions', () => {
|
||||
let authenticatorRepository: AuthenticatorRepositoryInterface
|
||||
let authenticatorChallengeRepository: AuthenticatorChallengeRepositoryInterface
|
||||
let userRepository: UserRepositoryInterface
|
||||
let featureService: FeatureServiceInterface
|
||||
|
||||
const createUseCase = () =>
|
||||
new GenerateAuthenticatorRegistrationOptions(
|
||||
@@ -16,6 +21,8 @@ describe('GenerateAuthenticatorRegistrationOptions', () => {
|
||||
authenticatorChallengeRepository,
|
||||
'Standard Notes',
|
||||
'standardnotes.com',
|
||||
userRepository,
|
||||
featureService,
|
||||
)
|
||||
|
||||
beforeEach(() => {
|
||||
@@ -35,6 +42,12 @@ describe('GenerateAuthenticatorRegistrationOptions', () => {
|
||||
|
||||
authenticatorChallengeRepository = {} as jest.Mocked<AuthenticatorChallengeRepositoryInterface>
|
||||
authenticatorChallengeRepository.save = jest.fn()
|
||||
|
||||
userRepository = {} as jest.Mocked<UserRepositoryInterface>
|
||||
userRepository.findOneByUuid = jest.fn().mockReturnValue({} as jest.Mocked<User>)
|
||||
|
||||
featureService = {} as jest.Mocked<FeatureServiceInterface>
|
||||
featureService.userIsEntitledToFeature = jest.fn().mockReturnValue(true)
|
||||
})
|
||||
|
||||
it('should return error if userUuid is invalid', async () => {
|
||||
@@ -63,6 +76,36 @@ describe('GenerateAuthenticatorRegistrationOptions', () => {
|
||||
expect(result.getError()).toBe('Could not generate authenticator registration options: Username cannot be empty')
|
||||
})
|
||||
|
||||
it('should return error if user is not entitled to u2f feature', async () => {
|
||||
featureService.userIsEntitledToFeature = jest.fn().mockReturnValue(false)
|
||||
|
||||
const useCase = createUseCase()
|
||||
|
||||
const result = await useCase.execute({
|
||||
userUuid: '00000000-0000-0000-0000-000000000000',
|
||||
username: 'username',
|
||||
})
|
||||
|
||||
expect(result.isFailed()).toBe(true)
|
||||
expect(result.getError()).toBe(
|
||||
'Could not generate authenticator registration options: user is not entitled to U2F.',
|
||||
)
|
||||
})
|
||||
|
||||
it('should return error if user is not found', async () => {
|
||||
userRepository.findOneByUuid = jest.fn().mockReturnValue(null)
|
||||
|
||||
const useCase = createUseCase()
|
||||
|
||||
const result = await useCase.execute({
|
||||
userUuid: '00000000-0000-0000-0000-000000000000',
|
||||
username: 'username',
|
||||
})
|
||||
|
||||
expect(result.isFailed()).toBe(true)
|
||||
expect(result.getError()).toBe('Could not generate authenticator registration options: user not found.')
|
||||
})
|
||||
|
||||
it('should return error if authenticator challenge is invalid', async () => {
|
||||
const mock = jest.spyOn(AuthenticatorChallenge, 'create')
|
||||
mock.mockReturnValue(Result.fail('Oops'))
|
||||
|
||||
+19
@@ -5,6 +5,9 @@ import { GenerateAuthenticatorRegistrationOptionsDTO } from './GenerateAuthentic
|
||||
import { AuthenticatorRepositoryInterface } from '../../Authenticator/AuthenticatorRepositoryInterface'
|
||||
import { AuthenticatorChallengeRepositoryInterface } from '../../Authenticator/AuthenticatorChallengeRepositoryInterface'
|
||||
import { AuthenticatorChallenge } from '../../Authenticator/AuthenticatorChallenge'
|
||||
import { FeatureIdentifier } from '@standardnotes/features'
|
||||
import { FeatureServiceInterface } from '../../Feature/FeatureServiceInterface'
|
||||
import { UserRepositoryInterface } from '../../User/UserRepositoryInterface'
|
||||
|
||||
export class GenerateAuthenticatorRegistrationOptions implements UseCaseInterface<Record<string, unknown>> {
|
||||
constructor(
|
||||
@@ -12,6 +15,8 @@ export class GenerateAuthenticatorRegistrationOptions implements UseCaseInterfac
|
||||
private authenticatorChallengeRepository: AuthenticatorChallengeRepositoryInterface,
|
||||
private relyingPartyName: string,
|
||||
private relyingPartyId: string,
|
||||
private userRepository: UserRepositoryInterface,
|
||||
private featureService: FeatureServiceInterface,
|
||||
) {}
|
||||
|
||||
async execute(dto: GenerateAuthenticatorRegistrationOptionsDTO): Promise<Result<Record<string, unknown>>> {
|
||||
@@ -27,6 +32,20 @@ export class GenerateAuthenticatorRegistrationOptions implements UseCaseInterfac
|
||||
}
|
||||
const username = usernameOrError.getValue()
|
||||
|
||||
const user = await this.userRepository.findOneByUuid(userUuid.value)
|
||||
if (user === null) {
|
||||
return Result.fail('Could not generate authenticator registration options: user not found.')
|
||||
}
|
||||
|
||||
const userIsEntitledToU2F = await this.featureService.userIsEntitledToFeature(
|
||||
user,
|
||||
FeatureIdentifier.UniversalSecondFactor,
|
||||
)
|
||||
|
||||
if (!userIsEntitledToU2F) {
|
||||
return Result.fail('Could not generate authenticator registration options: user is not entitled to U2F.')
|
||||
}
|
||||
|
||||
const authenticators = await this.authenticatorRepository.findByUserUuid(userUuid)
|
||||
const options = generateRegistrationOptions({
|
||||
rpID: this.relyingPartyId,
|
||||
|
||||
@@ -1,14 +1,25 @@
|
||||
import { AuthenticatorRepositoryInterface } from '../../Authenticator/AuthenticatorRepositoryInterface'
|
||||
import { FeatureServiceInterface } from '../../Feature/FeatureServiceInterface'
|
||||
import { User } from '../../User/User'
|
||||
import { UserRepositoryInterface } from '../../User/UserRepositoryInterface'
|
||||
import { ListAuthenticators } from './ListAuthenticators'
|
||||
|
||||
describe('ListAuthenticators', () => {
|
||||
let authenticatorRepository: AuthenticatorRepositoryInterface
|
||||
let userRepository: UserRepositoryInterface
|
||||
let featureService: FeatureServiceInterface
|
||||
|
||||
const createUseCase = () => new ListAuthenticators(authenticatorRepository)
|
||||
const createUseCase = () => new ListAuthenticators(authenticatorRepository, userRepository, featureService)
|
||||
|
||||
beforeEach(() => {
|
||||
authenticatorRepository = {} as jest.Mocked<AuthenticatorRepositoryInterface>
|
||||
authenticatorRepository.findByUserUuid = jest.fn().mockReturnValue([])
|
||||
|
||||
userRepository = {} as jest.Mocked<UserRepositoryInterface>
|
||||
userRepository.findOneByUuid = jest.fn().mockReturnValue({} as jest.Mocked<User>)
|
||||
|
||||
featureService = {} as jest.Mocked<FeatureServiceInterface>
|
||||
featureService.userIsEntitledToFeature = jest.fn().mockReturnValue(true)
|
||||
})
|
||||
|
||||
it('should list authenticators', async () => {
|
||||
@@ -27,4 +38,24 @@ describe('ListAuthenticators', () => {
|
||||
|
||||
expect(result.isFailed()).toBeTruthy()
|
||||
})
|
||||
|
||||
it('should fail if user is not found', async () => {
|
||||
userRepository.findOneByUuid = jest.fn().mockReturnValue(null)
|
||||
|
||||
const useCase = createUseCase()
|
||||
|
||||
const result = await useCase.execute({ userUuid: '00000000-0000-0000-0000-000000000000' })
|
||||
|
||||
expect(result.isFailed()).toBeTruthy()
|
||||
})
|
||||
|
||||
it('should fail if user is not entitled to U2F', async () => {
|
||||
featureService.userIsEntitledToFeature = jest.fn().mockReturnValue(false)
|
||||
|
||||
const useCase = createUseCase()
|
||||
|
||||
const result = await useCase.execute({ userUuid: '00000000-0000-0000-0000-000000000000' })
|
||||
|
||||
expect(result.isFailed()).toBeTruthy()
|
||||
})
|
||||
})
|
||||
|
||||
@@ -1,11 +1,19 @@
|
||||
import { Result, UseCaseInterface, Uuid } from '@standardnotes/domain-core'
|
||||
import { FeatureIdentifier } from '@standardnotes/features'
|
||||
|
||||
import { Authenticator } from '../../Authenticator/Authenticator'
|
||||
import { AuthenticatorRepositoryInterface } from '../../Authenticator/AuthenticatorRepositoryInterface'
|
||||
import { FeatureServiceInterface } from '../../Feature/FeatureServiceInterface'
|
||||
import { UserRepositoryInterface } from '../../User/UserRepositoryInterface'
|
||||
import { ListAuthenticatorsDTO } from './ListAuthenticatorsDTO'
|
||||
|
||||
export class ListAuthenticators implements UseCaseInterface<Authenticator[]> {
|
||||
constructor(private authenticatorRepository: AuthenticatorRepositoryInterface) {}
|
||||
constructor(
|
||||
private authenticatorRepository: AuthenticatorRepositoryInterface,
|
||||
private userRepository: UserRepositoryInterface,
|
||||
private featureService: FeatureServiceInterface,
|
||||
) {}
|
||||
|
||||
async execute(dto: ListAuthenticatorsDTO): Promise<Result<Authenticator[]>> {
|
||||
const userUuidOrError = Uuid.create(dto.userUuid)
|
||||
if (userUuidOrError.isFailed()) {
|
||||
@@ -13,6 +21,20 @@ export class ListAuthenticators implements UseCaseInterface<Authenticator[]> {
|
||||
}
|
||||
const userUuid = userUuidOrError.getValue()
|
||||
|
||||
const user = await this.userRepository.findOneByUuid(userUuid.value)
|
||||
if (user === null) {
|
||||
return Result.fail('Could not list authenticators: user not found.')
|
||||
}
|
||||
|
||||
const userIsEntitledToU2F = await this.featureService.userIsEntitledToFeature(
|
||||
user,
|
||||
FeatureIdentifier.UniversalSecondFactor,
|
||||
)
|
||||
|
||||
if (!userIsEntitledToU2F) {
|
||||
return Result.fail('Could not list authenticators: user is not entitled to U2F.')
|
||||
}
|
||||
|
||||
const authenticators = await this.authenticatorRepository.findByUserUuid(userUuid)
|
||||
|
||||
return Result.ok(authenticators)
|
||||
|
||||
@@ -168,7 +168,7 @@ describe('UpdateSetting', () => {
|
||||
error: {
|
||||
message: 'User 1-2-3 has no subscription to change a subscription setting.',
|
||||
},
|
||||
statusCode: 401,
|
||||
statusCode: 400,
|
||||
})
|
||||
})
|
||||
|
||||
|
||||
@@ -83,7 +83,7 @@ export class UpdateSetting implements UseCaseInterface {
|
||||
error: {
|
||||
message: `User ${userUuid} has no subscription to change a subscription setting.`,
|
||||
},
|
||||
statusCode: 401,
|
||||
statusCode: 400,
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
+61
@@ -7,11 +7,16 @@ import { Authenticator } from '../../Authenticator/Authenticator'
|
||||
import { AuthenticatorChallenge } from '../../Authenticator/AuthenticatorChallenge'
|
||||
import { AuthenticatorChallengeRepositoryInterface } from '../../Authenticator/AuthenticatorChallengeRepositoryInterface'
|
||||
import { AuthenticatorRepositoryInterface } from '../../Authenticator/AuthenticatorRepositoryInterface'
|
||||
import { FeatureServiceInterface } from '../../Feature/FeatureServiceInterface'
|
||||
import { User } from '../../User/User'
|
||||
import { UserRepositoryInterface } from '../../User/UserRepositoryInterface'
|
||||
import { VerifyAuthenticatorRegistrationResponse } from './VerifyAuthenticatorRegistrationResponse'
|
||||
|
||||
describe('VerifyAuthenticatorRegistrationResponse', () => {
|
||||
let authenticatorRepository: AuthenticatorRepositoryInterface
|
||||
let authenticatorChallengeRepository: AuthenticatorChallengeRepositoryInterface
|
||||
let userRepository: UserRepositoryInterface
|
||||
let featureService: FeatureServiceInterface
|
||||
|
||||
const createUseCase = () =>
|
||||
new VerifyAuthenticatorRegistrationResponse(
|
||||
@@ -20,6 +25,8 @@ describe('VerifyAuthenticatorRegistrationResponse', () => {
|
||||
'standardnotes.com',
|
||||
['localhost', 'https://app.standardnotes.com'],
|
||||
true,
|
||||
userRepository,
|
||||
featureService,
|
||||
)
|
||||
|
||||
beforeEach(() => {
|
||||
@@ -32,6 +39,12 @@ describe('VerifyAuthenticatorRegistrationResponse', () => {
|
||||
challenge: Buffer.from('challenge'),
|
||||
},
|
||||
} as jest.Mocked<AuthenticatorChallenge>)
|
||||
|
||||
userRepository = {} as jest.Mocked<UserRepositoryInterface>
|
||||
userRepository.findOneByUuid = jest.fn().mockReturnValue({} as jest.Mocked<User>)
|
||||
|
||||
featureService = {} as jest.Mocked<FeatureServiceInterface>
|
||||
featureService.userIsEntitledToFeature = jest.fn().mockReturnValue(true)
|
||||
})
|
||||
|
||||
it('should return error if user uuid is invalid', async () => {
|
||||
@@ -57,6 +70,54 @@ describe('VerifyAuthenticatorRegistrationResponse', () => {
|
||||
)
|
||||
})
|
||||
|
||||
it('should return error if user is not entitled to feature', async () => {
|
||||
featureService.userIsEntitledToFeature = jest.fn().mockReturnValue(false)
|
||||
|
||||
const useCase = createUseCase()
|
||||
|
||||
const result = await useCase.execute({
|
||||
userUuid: '00000000-0000-0000-0000-000000000000',
|
||||
attestationResponse: {
|
||||
id: 'id',
|
||||
rawId: 'rawId',
|
||||
response: {
|
||||
attestationObject: 'attestationObject',
|
||||
clientDataJSON: 'clientDataJSON',
|
||||
},
|
||||
type: 'public-key',
|
||||
clientExtensionResults: {},
|
||||
} as jest.Mocked<RegistrationResponseJSON>,
|
||||
})
|
||||
|
||||
expect(result.isFailed()).toBeTruthy()
|
||||
expect(result.getError()).toEqual(
|
||||
'Could not verify authenticator registration response: user is not entitled to U2F.',
|
||||
)
|
||||
})
|
||||
|
||||
it('should return error if user is not found', async () => {
|
||||
userRepository.findOneByUuid = jest.fn().mockReturnValue(null)
|
||||
|
||||
const useCase = createUseCase()
|
||||
|
||||
const result = await useCase.execute({
|
||||
userUuid: '00000000-0000-0000-0000-000000000000',
|
||||
attestationResponse: {
|
||||
id: 'id',
|
||||
rawId: 'rawId',
|
||||
response: {
|
||||
attestationObject: 'attestationObject',
|
||||
clientDataJSON: 'clientDataJSON',
|
||||
},
|
||||
type: 'public-key',
|
||||
clientExtensionResults: {},
|
||||
} as jest.Mocked<RegistrationResponseJSON>,
|
||||
})
|
||||
|
||||
expect(result.isFailed()).toBeTruthy()
|
||||
expect(result.getError()).toEqual('Could not verify authenticator registration response: user not found.')
|
||||
})
|
||||
|
||||
it('should return error if challenge is not found', async () => {
|
||||
authenticatorChallengeRepository.findByUserUuid = jest.fn().mockReturnValue(null)
|
||||
|
||||
|
||||
+19
@@ -1,10 +1,13 @@
|
||||
import { Dates, Result, UniqueEntityId, UseCaseInterface, Uuid } from '@standardnotes/domain-core'
|
||||
import { VerifiedRegistrationResponse, verifyRegistrationResponse } from '@simplewebauthn/server'
|
||||
import { FeatureIdentifier } from '@standardnotes/features'
|
||||
|
||||
import { AuthenticatorChallengeRepositoryInterface } from '../../Authenticator/AuthenticatorChallengeRepositoryInterface'
|
||||
import { AuthenticatorRepositoryInterface } from '../../Authenticator/AuthenticatorRepositoryInterface'
|
||||
import { Authenticator } from '../../Authenticator/Authenticator'
|
||||
import { VerifyAuthenticatorRegistrationResponseDTO } from './VerifyAuthenticatorRegistrationResponseDTO'
|
||||
import { FeatureServiceInterface } from '../../Feature/FeatureServiceInterface'
|
||||
import { UserRepositoryInterface } from '../../User/UserRepositoryInterface'
|
||||
|
||||
export class VerifyAuthenticatorRegistrationResponse implements UseCaseInterface<UniqueEntityId> {
|
||||
constructor(
|
||||
@@ -13,6 +16,8 @@ export class VerifyAuthenticatorRegistrationResponse implements UseCaseInterface
|
||||
private relyingPartyId: string,
|
||||
private expectedOrigin: string[],
|
||||
private requireUserVerification: boolean,
|
||||
private userRepository: UserRepositoryInterface,
|
||||
private featureService: FeatureServiceInterface,
|
||||
) {}
|
||||
|
||||
async execute(dto: VerifyAuthenticatorRegistrationResponseDTO): Promise<Result<UniqueEntityId>> {
|
||||
@@ -22,6 +27,20 @@ export class VerifyAuthenticatorRegistrationResponse implements UseCaseInterface
|
||||
}
|
||||
const userUuid = userUuidOrError.getValue()
|
||||
|
||||
const user = await this.userRepository.findOneByUuid(userUuid.value)
|
||||
if (user === null) {
|
||||
return Result.fail('Could not verify authenticator registration response: user not found.')
|
||||
}
|
||||
|
||||
const userIsEntitledToU2F = await this.featureService.userIsEntitledToFeature(
|
||||
user,
|
||||
FeatureIdentifier.UniversalSecondFactor,
|
||||
)
|
||||
|
||||
if (!userIsEntitledToU2F) {
|
||||
return Result.fail('Could not verify authenticator registration response: user is not entitled to U2F.')
|
||||
}
|
||||
|
||||
const authenticatorChallenge = await this.authenticatorChallengeRepository.findByUserUuid(userUuid)
|
||||
if (!authenticatorChallenge) {
|
||||
return Result.fail('Could not verify authenticator registration response: challenge not found')
|
||||
|
||||
@@ -4,6 +4,7 @@ import { Role } from '../Role/Role'
|
||||
import { Setting } from '../Setting/Setting'
|
||||
import { UserSubscription } from '../Subscription/UserSubscription'
|
||||
import { ProtocolVersion } from '@standardnotes/common'
|
||||
import { TypeORMEmergencyAccessInvitation } from '../../Infra/TypeORM/TypeORMEmergencyAccessInvitation'
|
||||
|
||||
@Entity({ name: 'users' })
|
||||
export class User {
|
||||
@@ -181,6 +182,22 @@ export class User {
|
||||
)
|
||||
declare subscriptions: Promise<UserSubscription[]>
|
||||
|
||||
@OneToMany(
|
||||
/* istanbul ignore next */
|
||||
() => TypeORMEmergencyAccessInvitation,
|
||||
/* istanbul ignore next */
|
||||
(invitation) => invitation.grantor,
|
||||
)
|
||||
declare emergencyAccessInvitationsCreated: Promise<TypeORMEmergencyAccessInvitation[]>
|
||||
|
||||
@OneToMany(
|
||||
/* istanbul ignore next */
|
||||
() => TypeORMEmergencyAccessInvitation,
|
||||
/* istanbul ignore next */
|
||||
(invitation) => invitation.grantee,
|
||||
)
|
||||
declare emergencyAccessInvitationsReceived: Promise<TypeORMEmergencyAccessInvitation[]>
|
||||
|
||||
supportsSessions(): boolean {
|
||||
return parseInt(this.version) >= parseInt(ProtocolVersion.V004)
|
||||
}
|
||||
|
||||
@@ -0,0 +1,66 @@
|
||||
import { Column, Entity, JoinColumn, ManyToOne, PrimaryGeneratedColumn } from 'typeorm'
|
||||
import { User } from '../../Domain/User/User'
|
||||
|
||||
@Entity({ name: 'emergency_access_invitations' })
|
||||
export class TypeORMEmergencyAccessInvitation {
|
||||
@PrimaryGeneratedColumn('uuid')
|
||||
declare uuid: string
|
||||
|
||||
@Column({
|
||||
name: 'grantor_uuid',
|
||||
length: 36,
|
||||
})
|
||||
declare grantorUuid: string
|
||||
|
||||
@ManyToOne(
|
||||
/* istanbul ignore next */
|
||||
() => User,
|
||||
/* istanbul ignore next */
|
||||
(user) => user.emergencyAccessInvitationsCreated,
|
||||
/* istanbul ignore next */
|
||||
{ onDelete: 'CASCADE', nullable: false },
|
||||
)
|
||||
@JoinColumn({ name: 'grantor_uuid', referencedColumnName: 'uuid', foreignKeyConstraintName: 'grantor_uuid_fk' })
|
||||
declare grantor: Promise<User>
|
||||
|
||||
@Column({
|
||||
name: 'grantee_uuid',
|
||||
length: 36,
|
||||
})
|
||||
declare granteeUuid: string
|
||||
|
||||
@ManyToOne(
|
||||
/* istanbul ignore next */
|
||||
() => User,
|
||||
/* istanbul ignore next */
|
||||
(user) => user.emergencyAccessInvitationsReceived,
|
||||
/* istanbul ignore next */
|
||||
{ onDelete: 'CASCADE', nullable: false },
|
||||
)
|
||||
@JoinColumn({ name: 'grantee_uuid', referencedColumnName: 'uuid', foreignKeyConstraintName: 'grantee_uuid_fk' })
|
||||
declare grantee: Promise<User>
|
||||
|
||||
@Column({
|
||||
name: 'status',
|
||||
length: 36,
|
||||
})
|
||||
declare status: string
|
||||
|
||||
@Column({
|
||||
name: 'expires_at',
|
||||
type: 'datetime',
|
||||
})
|
||||
declare expiresAt: Date
|
||||
|
||||
@Column({
|
||||
name: 'created_at',
|
||||
type: 'datetime',
|
||||
})
|
||||
declare createdAt: Date
|
||||
|
||||
@Column({
|
||||
name: 'updated_at',
|
||||
type: 'datetime',
|
||||
})
|
||||
declare updatedAt: Date
|
||||
}
|
||||
@@ -23,8 +23,8 @@ export class AuthenticatorPersistenceMapper implements MapperInterface<Authentic
|
||||
counter: projection.counter,
|
||||
credentialBackedUp: projection.credentialBackedUp,
|
||||
credentialDeviceType: projection.credentialDeviceType,
|
||||
credentialId: Buffer.from(projection.credentialId, 'base64url'),
|
||||
credentialPublicKey: projection.credentialPublicKey,
|
||||
credentialId: new Uint8Array(Buffer.from(projection.credentialId, 'base64url')),
|
||||
credentialPublicKey: new Uint8Array(projection.credentialPublicKey),
|
||||
dates,
|
||||
transports: projection.transports ? JSON.parse(projection.transports) : undefined,
|
||||
},
|
||||
@@ -43,7 +43,7 @@ export class AuthenticatorPersistenceMapper implements MapperInterface<Authentic
|
||||
|
||||
typeorm.uuid = domain.id.toString()
|
||||
typeorm.userUuid = domain.props.userUuid.value
|
||||
typeorm.credentialId = Buffer.from(domain.props.credentialId).toString('base64url')
|
||||
typeorm.credentialId = Buffer.from(domain.props.credentialId.buffer).toString('base64url')
|
||||
typeorm.credentialPublicKey = Buffer.from(domain.props.credentialPublicKey.buffer)
|
||||
typeorm.counter = domain.props.counter
|
||||
typeorm.credentialDeviceType = domain.props.credentialDeviceType
|
||||
|
||||
@@ -0,0 +1,63 @@
|
||||
import { Dates, MapperInterface, UniqueEntityId, Uuid } from '@standardnotes/domain-core'
|
||||
|
||||
import { EmergencyAccessInvitation } from '../Domain/EmergencyAccess/EmergencyAccessInvitation'
|
||||
import { EmergencyAccessInvitationStatus } from '../Domain/EmergencyAccess/EmergencyAccessInvitationStatus'
|
||||
import { TypeORMEmergencyAccessInvitation } from '../Infra/TypeORM/TypeORMEmergencyAccessInvitation'
|
||||
|
||||
export class EmergencyAccessInvitationPersistenceMapper
|
||||
implements MapperInterface<EmergencyAccessInvitation, TypeORMEmergencyAccessInvitation>
|
||||
{
|
||||
toDomain(projection: TypeORMEmergencyAccessInvitation): EmergencyAccessInvitation {
|
||||
const grantorUuidOrError = Uuid.create(projection.grantorUuid)
|
||||
if (grantorUuidOrError.isFailed()) {
|
||||
throw new Error(grantorUuidOrError.getError())
|
||||
}
|
||||
const grantorUuid = grantorUuidOrError.getValue()
|
||||
|
||||
const granteeUuidOrError = Uuid.create(projection.granteeUuid)
|
||||
if (granteeUuidOrError.isFailed()) {
|
||||
throw new Error(granteeUuidOrError.getError())
|
||||
}
|
||||
const granteeUuid = granteeUuidOrError.getValue()
|
||||
|
||||
const emergencyAccessInvitationStatusOrError = EmergencyAccessInvitationStatus.create(projection.status)
|
||||
if (emergencyAccessInvitationStatusOrError.isFailed()) {
|
||||
throw new Error(emergencyAccessInvitationStatusOrError.getError())
|
||||
}
|
||||
const emergencyAccessInvitationStatus = emergencyAccessInvitationStatusOrError.getValue()
|
||||
|
||||
const datesOrError = Dates.create(projection.createdAt, projection.updatedAt)
|
||||
if (datesOrError.isFailed()) {
|
||||
throw new Error(datesOrError.getError())
|
||||
}
|
||||
const dates = datesOrError.getValue()
|
||||
|
||||
const emergencyAccessInvitationOrError = EmergencyAccessInvitation.create(
|
||||
{
|
||||
grantorUuid,
|
||||
granteeUuid,
|
||||
status: emergencyAccessInvitationStatus,
|
||||
expiresAt: projection.expiresAt,
|
||||
dates,
|
||||
},
|
||||
new UniqueEntityId(projection.uuid),
|
||||
)
|
||||
const emergencyAccessInvitation = emergencyAccessInvitationOrError.getValue()
|
||||
|
||||
return emergencyAccessInvitation
|
||||
}
|
||||
|
||||
toProjection(domain: EmergencyAccessInvitation): TypeORMEmergencyAccessInvitation {
|
||||
const typeorm = new TypeORMEmergencyAccessInvitation()
|
||||
|
||||
typeorm.uuid = domain.id.toString()
|
||||
typeorm.grantorUuid = domain.props.grantorUuid.value
|
||||
typeorm.granteeUuid = domain.props.granteeUuid.value
|
||||
typeorm.status = domain.props.status.value
|
||||
typeorm.expiresAt = domain.props.expiresAt
|
||||
typeorm.createdAt = domain.props.dates.createdAt
|
||||
typeorm.updatedAt = domain.props.dates.updatedAt
|
||||
|
||||
return typeorm
|
||||
}
|
||||
}
|
||||
@@ -3,6 +3,20 @@
|
||||
All notable changes to this project will be documented in this file.
|
||||
See [Conventional Commits](https://conventionalcommits.org) for commit guidelines.
|
||||
|
||||
## [1.10.1](https://github.com/standardnotes/server/compare/@standardnotes/domain-events-infra@1.10.0...@standardnotes/domain-events-infra@1.10.1) (2023-04-21)
|
||||
|
||||
**Note:** Version bump only for package @standardnotes/domain-events-infra
|
||||
|
||||
# [1.10.0](https://github.com/standardnotes/server/compare/@standardnotes/domain-events-infra@1.9.74...@standardnotes/domain-events-infra@1.10.0) (2023-04-21)
|
||||
|
||||
### Features
|
||||
|
||||
* **domain-events-infra:** add SES email bounce notifications handler ([#569](https://github.com/standardnotes/server/issues/569)) ([9b9f10d](https://github.com/standardnotes/server/commit/9b9f10d4ca9ceef1defa868b7c96f570e46d8053))
|
||||
|
||||
## [1.9.74](https://github.com/standardnotes/server/compare/@standardnotes/domain-events-infra@1.9.73...@standardnotes/domain-events-infra@1.9.74) (2023-03-30)
|
||||
|
||||
**Note:** Version bump only for package @standardnotes/domain-events-infra
|
||||
|
||||
## [1.9.73](https://github.com/standardnotes/server/compare/@standardnotes/domain-events-infra@1.9.72...@standardnotes/domain-events-infra@1.9.73) (2023-03-10)
|
||||
|
||||
**Note:** Version bump only for package @standardnotes/domain-events-infra
|
||||
|
||||
@@ -1,6 +1,6 @@
|
||||
{
|
||||
"name": "@standardnotes/domain-events-infra",
|
||||
"version": "1.9.73",
|
||||
"version": "1.10.1",
|
||||
"engines": {
|
||||
"node": ">=18.0.0 <19.0.0"
|
||||
},
|
||||
@@ -27,7 +27,7 @@
|
||||
"@aws-sdk/client-sqs": "^3.259.0",
|
||||
"@standardnotes/domain-events": "workspace:*",
|
||||
"ioredis": "^5.2.4",
|
||||
"newrelic": "^9.11.0",
|
||||
"newrelic": "^10.0.0",
|
||||
"reflect-metadata": "^0.1.13",
|
||||
"sqs-consumer": "^6.2.1",
|
||||
"winston": "^3.8.1"
|
||||
@@ -35,7 +35,7 @@
|
||||
"devDependencies": {
|
||||
"@types/ioredis": "^5.0.0",
|
||||
"@types/jest": "^29.1.1",
|
||||
"@types/newrelic": "^9.4.0",
|
||||
"@types/newrelic": "^9.13.0",
|
||||
"@typescript-eslint/eslint-plugin": "^5.48.2",
|
||||
"eslint-plugin-prettier": "^4.2.1",
|
||||
"jest": "^29.1.2",
|
||||
|
||||
+72
@@ -0,0 +1,72 @@
|
||||
import 'reflect-metadata'
|
||||
|
||||
import { DomainEventHandlerInterface } from '@standardnotes/domain-events'
|
||||
|
||||
import { startBackgroundTransaction } from 'newrelic'
|
||||
jest.mock('newrelic')
|
||||
|
||||
import { Logger } from 'winston'
|
||||
|
||||
import { SQSNewRelicBounceNotificiationHandler } from './SQSNewRelicBounceNotificiationHandler'
|
||||
|
||||
describe('SQSNewRelicBounceNotificiationHandler', () => {
|
||||
let handler: DomainEventHandlerInterface
|
||||
let handlers: Map<string, DomainEventHandlerInterface>
|
||||
let logger: Logger
|
||||
let mockedStartBackgroundTransaction: unknown
|
||||
|
||||
const createHandler = () => new SQSNewRelicBounceNotificiationHandler(handlers, logger)
|
||||
|
||||
beforeEach(() => {
|
||||
handler = {} as jest.Mocked<DomainEventHandlerInterface>
|
||||
handler.handle = jest.fn()
|
||||
|
||||
handlers = new Map([['EMAIL_BOUNCED', handler]])
|
||||
|
||||
logger = {} as jest.Mocked<Logger>
|
||||
logger.debug = jest.fn()
|
||||
logger.error = jest.fn()
|
||||
|
||||
mockedStartBackgroundTransaction = startBackgroundTransaction as jest.Mocked<unknown>
|
||||
})
|
||||
|
||||
it('should handle messages', async () => {
|
||||
const sqsMessage = `{
|
||||
"Message" : "{\\"notificationType\\":\\"Bounce\\",\\"bounce\\":{\\"feedbackId\\":\\"010001879d0a9def-d9882210-6467-48ed-8088-2193c66a349b-000000\\",\\"bounceType\\":\\"Transient\\",\\"bounceSubType\\":\\"General\\",\\"bouncedRecipients\\":[{\\"emailAddress\\":\\"test@test.te\\",\\"action\\":\\"failed\\",\\"status\\":\\"5.7.1\\",\\"diagnosticCode\\":\\"smtp; 550 5.7.1 <test@test.te>: Recipient address rejected: Recipient not found\\"}],\\"timestamp\\":\\"2023-04-20T05:02:11.000Z\\",\\"remoteMtaIp\\":\\"1.2.3.4\\",\\"reportingMTA\\":\\"dns; test.smtp-out.amazonses.com\\"},\\"mail\\":{\\"timestamp\\":\\"2023-04-20T05:02:08.589Z\\",\\"source\\":\\"Standard Notes <backups@standardnotes.org>\\",\\"sourceArn\\":\\"arn:aws:ses:us-east-1:336603415364:identity/backups@standardnotes.org\\",\\"sourceIp\\":\\"1.2.3.4\\",\\"callerIdentity\\":\\"test\\",\\"sendingAccountId\\":\\"123456\\",\\"messageId\\":\\"010001879d0a92cd-00ed31d1-bf9e-4ce4-abb9-8c6e95a30733-000000\\",\\"destination\\":[\\"test@test.te\\"]}}"
|
||||
}`
|
||||
|
||||
await createHandler().handleMessage(sqsMessage)
|
||||
|
||||
// eslint-disable-next-line @typescript-eslint/no-explicit-any
|
||||
expect((<any>mockedStartBackgroundTransaction).mock.calls[0][0]).toBe('EMAIL_BOUNCED')
|
||||
})
|
||||
|
||||
it('should not handle unsupported messages', async () => {
|
||||
const sqsMessage = `{
|
||||
"Message" : "{\\"notificationType\\":\\"TEST\\",\\"bounce\\":{\\"feedbackId\\":\\"010001879d0a9def-d9882210-6467-48ed-8088-2193c66a349b-000000\\",\\"bounceType\\":\\"Transient\\",\\"bounceSubType\\":\\"General\\",\\"bouncedRecipients\\":[{\\"emailAddress\\":\\"test@test.te\\",\\"action\\":\\"failed\\",\\"status\\":\\"5.7.1\\",\\"diagnosticCode\\":\\"smtp; 550 5.7.1 <test@test.te>: Recipient address rejected: Recipient not found\\"}],\\"timestamp\\":\\"2023-04-20T05:02:11.000Z\\",\\"remoteMtaIp\\":\\"1.2.3.4\\",\\"reportingMTA\\":\\"dns; test.smtp-out.amazonses.com\\"},\\"mail\\":{\\"timestamp\\":\\"2023-04-20T05:02:08.589Z\\",\\"source\\":\\"Standard Notes <backups@standardnotes.org>\\",\\"sourceArn\\":\\"arn:aws:ses:us-east-1:336603415364:identity/backups@standardnotes.org\\",\\"sourceIp\\":\\"1.2.3.4\\",\\"callerIdentity\\":\\"test\\",\\"sendingAccountId\\":\\"123456\\",\\"messageId\\":\\"010001879d0a92cd-00ed31d1-bf9e-4ce4-abb9-8c6e95a30733-000000\\",\\"destination\\":[\\"test@test.te\\"]}}"
|
||||
}`
|
||||
|
||||
await createHandler().handleMessage(sqsMessage)
|
||||
|
||||
expect(handler.handle).not.toHaveBeenCalled()
|
||||
})
|
||||
|
||||
it('should handle errors', async () => {
|
||||
await createHandler().handleError(new Error('test'))
|
||||
|
||||
expect(logger.error).toHaveBeenCalled()
|
||||
})
|
||||
|
||||
it('should tell if there is no handler for an event', async () => {
|
||||
const sqsMessage = `{
|
||||
"Message" : "{\\"notificationType\\":\\"Bounce\\",\\"bounce\\":{\\"feedbackId\\":\\"010001879d0a9def-d9882210-6467-48ed-8088-2193c66a349b-000000\\",\\"bounceType\\":\\"Transient\\",\\"bounceSubType\\":\\"General\\",\\"bouncedRecipients\\":[{\\"emailAddress\\":\\"test@test.te\\",\\"action\\":\\"failed\\",\\"status\\":\\"5.7.1\\",\\"diagnosticCode\\":\\"smtp; 550 5.7.1 <test@test.te>: Recipient address rejected: Recipient not found\\"}],\\"timestamp\\":\\"2023-04-20T05:02:11.000Z\\",\\"remoteMtaIp\\":\\"1.2.3.4\\",\\"reportingMTA\\":\\"dns; test.smtp-out.amazonses.com\\"},\\"mail\\":{\\"timestamp\\":\\"2023-04-20T05:02:08.589Z\\",\\"source\\":\\"Standard Notes <backups@standardnotes.org>\\",\\"sourceArn\\":\\"arn:aws:ses:us-east-1:336603415364:identity/backups@standardnotes.org\\",\\"sourceIp\\":\\"1.2.3.4\\",\\"callerIdentity\\":\\"test\\",\\"sendingAccountId\\":\\"123456\\",\\"messageId\\":\\"010001879d0a92cd-00ed31d1-bf9e-4ce4-abb9-8c6e95a30733-000000\\",\\"destination\\":[\\"test@test.te\\"]}}"
|
||||
}`
|
||||
|
||||
const bounceHandler = new SQSNewRelicBounceNotificiationHandler(new Map([]), logger)
|
||||
await bounceHandler.handleMessage(sqsMessage)
|
||||
|
||||
expect(logger.debug).toHaveBeenCalledWith('Event handler for event type EMAIL_BOUNCED does not exist')
|
||||
|
||||
expect(handler.handle).not.toHaveBeenCalled()
|
||||
})
|
||||
})
|
||||
@@ -0,0 +1,68 @@
|
||||
import { Logger } from 'winston'
|
||||
import * as newrelic from 'newrelic'
|
||||
|
||||
import {
|
||||
DomainEventHandlerInterface,
|
||||
DomainEventMessageHandlerInterface,
|
||||
DomainEventService,
|
||||
EmailBouncedEvent,
|
||||
} from '@standardnotes/domain-events'
|
||||
|
||||
export class SQSNewRelicBounceNotificiationHandler implements DomainEventMessageHandlerInterface {
|
||||
private readonly ALLOWED_NOTIFICATION_TYPES = ['Bounce']
|
||||
|
||||
constructor(private handlers: Map<string, DomainEventHandlerInterface>, private logger: Logger) {}
|
||||
|
||||
async handleMessage(message: string): Promise<void> {
|
||||
const messageParsed = JSON.parse(JSON.parse(message).Message)
|
||||
|
||||
if (!this.ALLOWED_NOTIFICATION_TYPES.includes(messageParsed.notificationType)) {
|
||||
this.logger.error(`Received notification of type ${messageParsed.notificationType} which is not allowed`)
|
||||
|
||||
return
|
||||
}
|
||||
|
||||
for (const bouncedRecipient of messageParsed.bounce.bouncedRecipients) {
|
||||
const domainEvent: EmailBouncedEvent = {
|
||||
type: 'EMAIL_BOUNCED',
|
||||
payload: {
|
||||
bounceType: messageParsed.bounce.bounceType,
|
||||
bounceSubType: messageParsed.bounce.bounceSubType,
|
||||
recipientEmail: bouncedRecipient.emailAddress,
|
||||
diagnosticCode: bouncedRecipient.diagnosticCode,
|
||||
},
|
||||
createdAt: new Date(),
|
||||
meta: {
|
||||
correlation: {
|
||||
userIdentifier: bouncedRecipient.emailAddress,
|
||||
userIdentifierType: 'email',
|
||||
},
|
||||
origin: DomainEventService.SES,
|
||||
},
|
||||
}
|
||||
|
||||
const handler = this.handlers.get(domainEvent.type)
|
||||
if (!handler) {
|
||||
this.logger.debug(`Event handler for event type ${domainEvent.type} does not exist`)
|
||||
|
||||
return
|
||||
}
|
||||
|
||||
this.logger.debug(`Received event: ${domainEvent.type}`)
|
||||
|
||||
await newrelic.startBackgroundTransaction(
|
||||
domainEvent.type,
|
||||
/* istanbul ignore next */
|
||||
() => {
|
||||
newrelic.getTransaction()
|
||||
|
||||
return handler.handle(domainEvent)
|
||||
},
|
||||
)
|
||||
}
|
||||
}
|
||||
|
||||
async handleError(error: Error): Promise<void> {
|
||||
this.logger.error('Error occured while handling SQS message: %O', error)
|
||||
}
|
||||
}
|
||||
@@ -5,6 +5,7 @@ export * from './Redis/RedisEventMessageHandler'
|
||||
|
||||
export * from './SNS/SNSDomainEventPublisher'
|
||||
|
||||
export * from './SQS/SQSNewRelicBounceNotificiationHandler'
|
||||
export * from './SQS/SQSDomainEventSubscriberFactory'
|
||||
export * from './SQS/SQSEventMessageHandler'
|
||||
export * from './SQS/SQSNewRelicEventMessageHandler'
|
||||
|
||||
@@ -3,6 +3,12 @@
|
||||
All notable changes to this project will be documented in this file.
|
||||
See [Conventional Commits](https://conventionalcommits.org) for commit guidelines.
|
||||
|
||||
# [2.109.0](https://github.com/standardnotes/server/compare/@standardnotes/domain-events@2.108.1...@standardnotes/domain-events@2.109.0) (2023-04-21)
|
||||
|
||||
### Features
|
||||
|
||||
* **domain-events-infra:** add SES email bounce notifications handler ([#569](https://github.com/standardnotes/server/issues/569)) ([9b9f10d](https://github.com/standardnotes/server/commit/9b9f10d4ca9ceef1defa868b7c96f570e46d8053))
|
||||
|
||||
## [2.108.1](https://github.com/standardnotes/server/compare/@standardnotes/domain-events@2.108.0...@standardnotes/domain-events@2.108.1) (2023-02-23)
|
||||
|
||||
**Note:** Version bump only for package @standardnotes/domain-events
|
||||
|
||||
@@ -1,6 +1,6 @@
|
||||
{
|
||||
"name": "@standardnotes/domain-events",
|
||||
"version": "2.108.1",
|
||||
"version": "2.109.0",
|
||||
"engines": {
|
||||
"node": ">=18.0.0 <19.0.0"
|
||||
},
|
||||
|
||||
@@ -12,4 +12,5 @@ export enum DomainEventService {
|
||||
Revisions = 'revisions',
|
||||
Email = 'email',
|
||||
Settings = 'settings',
|
||||
SES = 'ses',
|
||||
}
|
||||
|
||||
@@ -0,0 +1,7 @@
|
||||
import { DomainEventInterface } from './DomainEventInterface'
|
||||
import { EmailBouncedEventPayload } from './EmailBouncedEventPayload'
|
||||
|
||||
export interface EmailBouncedEvent extends DomainEventInterface {
|
||||
type: 'EMAIL_BOUNCED'
|
||||
payload: EmailBouncedEventPayload
|
||||
}
|
||||
@@ -0,0 +1,6 @@
|
||||
export interface EmailBouncedEventPayload {
|
||||
recipientEmail: string
|
||||
bounceType: string
|
||||
bounceSubType: string
|
||||
diagnosticCode?: string
|
||||
}
|
||||
@@ -12,6 +12,8 @@ export * from './Event/DuplicateItemSyncedEvent'
|
||||
export * from './Event/DuplicateItemSyncedEventPayload'
|
||||
export * from './Event/EmailBackupRequestedEvent'
|
||||
export * from './Event/EmailBackupRequestedEventPayload'
|
||||
export * from './Event/EmailBouncedEvent'
|
||||
export * from './Event/EmailBouncedEventPayload'
|
||||
export * from './Event/EmailRequestedEvent'
|
||||
export * from './Event/EmailRequestedEventPayload'
|
||||
export * from './Event/EmailSentEvent'
|
||||
|
||||
@@ -3,6 +3,18 @@
|
||||
All notable changes to this project will be documented in this file.
|
||||
See [Conventional Commits](https://conventionalcommits.org) for commit guidelines.
|
||||
|
||||
## [1.7.9](https://github.com/standardnotes/server/compare/@standardnotes/event-store@1.7.8...@standardnotes/event-store@1.7.9) (2023-04-21)
|
||||
|
||||
**Note:** Version bump only for package @standardnotes/event-store
|
||||
|
||||
## [1.7.8](https://github.com/standardnotes/server/compare/@standardnotes/event-store@1.7.7...@standardnotes/event-store@1.7.8) (2023-04-21)
|
||||
|
||||
**Note:** Version bump only for package @standardnotes/event-store
|
||||
|
||||
## [1.7.7](https://github.com/standardnotes/server/compare/@standardnotes/event-store@1.7.6...@standardnotes/event-store@1.7.7) (2023-03-30)
|
||||
|
||||
**Note:** Version bump only for package @standardnotes/event-store
|
||||
|
||||
## [1.7.6](https://github.com/standardnotes/server/compare/@standardnotes/event-store@1.7.5...@standardnotes/event-store@1.7.6) (2023-03-10)
|
||||
|
||||
**Note:** Version bump only for package @standardnotes/event-store
|
||||
|
||||
@@ -1,6 +1,6 @@
|
||||
{
|
||||
"name": "@standardnotes/event-store",
|
||||
"version": "1.7.6",
|
||||
"version": "1.7.9",
|
||||
"description": "Event Store Service",
|
||||
"private": true,
|
||||
"main": "dist/src/index.js",
|
||||
@@ -21,7 +21,7 @@
|
||||
"devDependencies": {
|
||||
"@types/ioredis": "^5.0.0",
|
||||
"@types/jest": "^29.1.1",
|
||||
"@types/newrelic": "^9.4.0",
|
||||
"@types/newrelic": "^9.13.0",
|
||||
"@types/nodemailer": "^6.4.1",
|
||||
"@typescript-eslint/eslint-plugin": "^5.48.2",
|
||||
"eslint": "^8.32.0",
|
||||
@@ -39,7 +39,7 @@
|
||||
"inversify": "^6.0.1",
|
||||
"ioredis": "^5.2.4",
|
||||
"mysql2": "^3.0.1",
|
||||
"newrelic": "^9.11.0",
|
||||
"newrelic": "^10.0.0",
|
||||
"reflect-metadata": "0.1.13",
|
||||
"typeorm": "^0.3.10",
|
||||
"winston": "^3.8.1"
|
||||
|
||||
@@ -3,6 +3,18 @@
|
||||
All notable changes to this project will be documented in this file.
|
||||
See [Conventional Commits](https://conventionalcommits.org) for commit guidelines.
|
||||
|
||||
## [1.10.11](https://github.com/standardnotes/files/compare/@standardnotes/files-server@1.10.10...@standardnotes/files-server@1.10.11) (2023-04-21)
|
||||
|
||||
**Note:** Version bump only for package @standardnotes/files-server
|
||||
|
||||
## [1.10.10](https://github.com/standardnotes/files/compare/@standardnotes/files-server@1.10.9...@standardnotes/files-server@1.10.10) (2023-04-21)
|
||||
|
||||
**Note:** Version bump only for package @standardnotes/files-server
|
||||
|
||||
## [1.10.9](https://github.com/standardnotes/files/compare/@standardnotes/files-server@1.10.8...@standardnotes/files-server@1.10.9) (2023-03-30)
|
||||
|
||||
**Note:** Version bump only for package @standardnotes/files-server
|
||||
|
||||
## [1.10.8](https://github.com/standardnotes/files/compare/@standardnotes/files-server@1.10.7...@standardnotes/files-server@1.10.8) (2023-03-10)
|
||||
|
||||
**Note:** Version bump only for package @standardnotes/files-server
|
||||
|
||||
@@ -1,6 +1,6 @@
|
||||
{
|
||||
"name": "@standardnotes/files-server",
|
||||
"version": "1.10.8",
|
||||
"version": "1.10.11",
|
||||
"engines": {
|
||||
"node": ">=18.0.0 <19.0.0"
|
||||
},
|
||||
@@ -48,7 +48,7 @@
|
||||
"inversify-express-utils": "^6.4.3",
|
||||
"ioredis": "^5.2.4",
|
||||
"jsonwebtoken": "^9.0.0",
|
||||
"newrelic": "^9.11.0",
|
||||
"newrelic": "^10.0.0",
|
||||
"nodemon": "^2.0.19",
|
||||
"prettyjson": "^1.2.5",
|
||||
"reflect-metadata": "^0.1.13",
|
||||
@@ -63,7 +63,7 @@
|
||||
"@types/ioredis": "^5.0.0",
|
||||
"@types/jest": "^29.1.1",
|
||||
"@types/jsonwebtoken": "^9.0.1",
|
||||
"@types/newrelic": "^9.4.0",
|
||||
"@types/newrelic": "^9.13.0",
|
||||
"@types/prettyjson": "^0.0.30",
|
||||
"@types/uuid": "^8.3.0",
|
||||
"@typescript-eslint/eslint-plugin": "^5.48.2",
|
||||
|
||||
@@ -3,6 +3,18 @@
|
||||
All notable changes to this project will be documented in this file.
|
||||
See [Conventional Commits](https://conventionalcommits.org) for commit guidelines.
|
||||
|
||||
## [1.12.14](https://github.com/standardnotes/server/compare/@standardnotes/revisions-server@1.12.13...@standardnotes/revisions-server@1.12.14) (2023-04-21)
|
||||
|
||||
**Note:** Version bump only for package @standardnotes/revisions-server
|
||||
|
||||
## [1.12.13](https://github.com/standardnotes/server/compare/@standardnotes/revisions-server@1.12.12...@standardnotes/revisions-server@1.12.13) (2023-04-21)
|
||||
|
||||
**Note:** Version bump only for package @standardnotes/revisions-server
|
||||
|
||||
## [1.12.12](https://github.com/standardnotes/server/compare/@standardnotes/revisions-server@1.12.11...@standardnotes/revisions-server@1.12.12) (2023-03-30)
|
||||
|
||||
**Note:** Version bump only for package @standardnotes/revisions-server
|
||||
|
||||
## [1.12.11](https://github.com/standardnotes/server/compare/@standardnotes/revisions-server@1.12.10...@standardnotes/revisions-server@1.12.11) (2023-03-15)
|
||||
|
||||
### Bug Fixes
|
||||
|
||||
@@ -1,6 +1,6 @@
|
||||
{
|
||||
"name": "@standardnotes/revisions-server",
|
||||
"version": "1.12.11",
|
||||
"version": "1.12.14",
|
||||
"engines": {
|
||||
"node": ">=18.0.0 <19.0.0"
|
||||
},
|
||||
@@ -25,7 +25,7 @@
|
||||
"dependencies": {
|
||||
"@aws-sdk/client-s3": "^3.259.0",
|
||||
"@aws-sdk/client-sqs": "^3.259.0",
|
||||
"@newrelic/winston-enricher": "^4.0.0",
|
||||
"@newrelic/winston-enricher": "^4.0.1",
|
||||
"@sentry/node": "^7.28.1",
|
||||
"@standardnotes/api": "^1.25.3",
|
||||
"@standardnotes/common": "workspace:^",
|
||||
@@ -41,7 +41,7 @@
|
||||
"inversify": "^6.0.1",
|
||||
"inversify-express-utils": "^6.4.3",
|
||||
"mysql2": "^3.0.1",
|
||||
"newrelic": "^9.11.0",
|
||||
"newrelic": "^10.0.0",
|
||||
"reflect-metadata": "0.1.13",
|
||||
"typeorm": "^0.3.10",
|
||||
"winston": "^3.8.1"
|
||||
@@ -52,7 +52,7 @@
|
||||
"@types/express": "^4.17.14",
|
||||
"@types/inversify-express-utils": "^2.0.0",
|
||||
"@types/jest": "^29.1.1",
|
||||
"@types/newrelic": "^9.4.0",
|
||||
"@types/newrelic": "^9.13.0",
|
||||
"@typescript-eslint/eslint-plugin": "^5.48.2",
|
||||
"eslint": "^8.32.0",
|
||||
"eslint-plugin-prettier": "^4.0.0",
|
||||
|
||||
@@ -3,6 +3,18 @@
|
||||
All notable changes to this project will be documented in this file.
|
||||
See [Conventional Commits](https://conventionalcommits.org) for commit guidelines.
|
||||
|
||||
## [1.17.11](https://github.com/standardnotes/server/compare/@standardnotes/scheduler-server@1.17.10...@standardnotes/scheduler-server@1.17.11) (2023-04-21)
|
||||
|
||||
**Note:** Version bump only for package @standardnotes/scheduler-server
|
||||
|
||||
## [1.17.10](https://github.com/standardnotes/server/compare/@standardnotes/scheduler-server@1.17.9...@standardnotes/scheduler-server@1.17.10) (2023-04-21)
|
||||
|
||||
**Note:** Version bump only for package @standardnotes/scheduler-server
|
||||
|
||||
## [1.17.9](https://github.com/standardnotes/server/compare/@standardnotes/scheduler-server@1.17.8...@standardnotes/scheduler-server@1.17.9) (2023-03-30)
|
||||
|
||||
**Note:** Version bump only for package @standardnotes/scheduler-server
|
||||
|
||||
## [1.17.8](https://github.com/standardnotes/server/compare/@standardnotes/scheduler-server@1.17.7...@standardnotes/scheduler-server@1.17.8) (2023-03-10)
|
||||
|
||||
**Note:** Version bump only for package @standardnotes/scheduler-server
|
||||
|
||||
@@ -1,6 +1,6 @@
|
||||
{
|
||||
"name": "@standardnotes/scheduler-server",
|
||||
"version": "1.17.8",
|
||||
"version": "1.17.11",
|
||||
"engines": {
|
||||
"node": ">=18.0.0 <19.0.0"
|
||||
},
|
||||
@@ -26,7 +26,7 @@
|
||||
"dependencies": {
|
||||
"@aws-sdk/client-sns": "^3.259.0",
|
||||
"@aws-sdk/client-sqs": "^3.259.0",
|
||||
"@newrelic/winston-enricher": "^4.0.0",
|
||||
"@newrelic/winston-enricher": "^4.0.1",
|
||||
"@sentry/node": "^7.28.1",
|
||||
"@standardnotes/domain-core": "workspace:^",
|
||||
"@standardnotes/domain-events": "workspace:*",
|
||||
@@ -38,7 +38,7 @@
|
||||
"inversify": "^6.0.1",
|
||||
"ioredis": "^5.2.4",
|
||||
"mysql2": "^3.0.1",
|
||||
"newrelic": "^9.11.0",
|
||||
"newrelic": "^10.0.0",
|
||||
"reflect-metadata": "^0.1.13",
|
||||
"typeorm": "^0.3.10",
|
||||
"winston": "^3.8.1"
|
||||
@@ -46,7 +46,7 @@
|
||||
"devDependencies": {
|
||||
"@types/ioredis": "^5.0.0",
|
||||
"@types/jest": "^29.1.1",
|
||||
"@types/newrelic": "^9.4.0",
|
||||
"@types/newrelic": "^9.13.0",
|
||||
"@types/node": "^18.11.9",
|
||||
"@typescript-eslint/eslint-plugin": "^5.48.2",
|
||||
"eslint": "^8.32.0",
|
||||
|
||||
@@ -3,6 +3,18 @@
|
||||
All notable changes to this project will be documented in this file.
|
||||
See [Conventional Commits](https://conventionalcommits.org) for commit guidelines.
|
||||
|
||||
## [1.32.7](https://github.com/standardnotes/syncing-server-js/compare/@standardnotes/syncing-server@1.32.6...@standardnotes/syncing-server@1.32.7) (2023-04-21)
|
||||
|
||||
**Note:** Version bump only for package @standardnotes/syncing-server
|
||||
|
||||
## [1.32.6](https://github.com/standardnotes/syncing-server-js/compare/@standardnotes/syncing-server@1.32.5...@standardnotes/syncing-server@1.32.6) (2023-04-21)
|
||||
|
||||
**Note:** Version bump only for package @standardnotes/syncing-server
|
||||
|
||||
## [1.32.5](https://github.com/standardnotes/syncing-server-js/compare/@standardnotes/syncing-server@1.32.4...@standardnotes/syncing-server@1.32.5) (2023-03-30)
|
||||
|
||||
**Note:** Version bump only for package @standardnotes/syncing-server
|
||||
|
||||
## [1.32.4](https://github.com/standardnotes/syncing-server-js/compare/@standardnotes/syncing-server@1.32.3...@standardnotes/syncing-server@1.32.4) (2023-03-15)
|
||||
|
||||
### Bug Fixes
|
||||
|
||||
@@ -1,6 +1,6 @@
|
||||
{
|
||||
"name": "@standardnotes/syncing-server",
|
||||
"version": "1.32.4",
|
||||
"version": "1.32.7",
|
||||
"engines": {
|
||||
"node": ">=18.0.0 <19.0.0"
|
||||
},
|
||||
@@ -28,7 +28,7 @@
|
||||
"@aws-sdk/client-s3": "^3.259.0",
|
||||
"@aws-sdk/client-sns": "^3.259.0",
|
||||
"@aws-sdk/client-sqs": "^3.259.0",
|
||||
"@newrelic/winston-enricher": "^4.0.0",
|
||||
"@newrelic/winston-enricher": "^4.0.1",
|
||||
"@sentry/node": "^7.28.1",
|
||||
"@sentry/tracing": "^7.28.1",
|
||||
"@standardnotes/api": "^1.25.3",
|
||||
@@ -49,7 +49,7 @@
|
||||
"inversify-express-utils": "^6.4.3",
|
||||
"jsonwebtoken": "^9.0.0",
|
||||
"mysql2": "^3.0.1",
|
||||
"newrelic": "^9.11.0",
|
||||
"newrelic": "^10.0.0",
|
||||
"nodemon": "^2.0.19",
|
||||
"prettyjson": "^1.2.5",
|
||||
"reflect-metadata": "0.1.13",
|
||||
@@ -65,7 +65,7 @@
|
||||
"@types/inversify-express-utils": "^2.0.0",
|
||||
"@types/jest": "^29.1.1",
|
||||
"@types/jsonwebtoken": "^9.0.1",
|
||||
"@types/newrelic": "^9.4.0",
|
||||
"@types/newrelic": "^9.13.0",
|
||||
"@types/prettyjson": "^0.0.30",
|
||||
"@types/ua-parser-js": "^0.7.36",
|
||||
"@types/uuid": "^8.3.0",
|
||||
|
||||
@@ -3,6 +3,18 @@
|
||||
All notable changes to this project will be documented in this file.
|
||||
See [Conventional Commits](https://conventionalcommits.org) for commit guidelines.
|
||||
|
||||
## [1.6.12](https://github.com/standardnotes/server/compare/@standardnotes/websockets-server@1.6.11...@standardnotes/websockets-server@1.6.12) (2023-04-21)
|
||||
|
||||
**Note:** Version bump only for package @standardnotes/websockets-server
|
||||
|
||||
## [1.6.11](https://github.com/standardnotes/server/compare/@standardnotes/websockets-server@1.6.10...@standardnotes/websockets-server@1.6.11) (2023-04-21)
|
||||
|
||||
**Note:** Version bump only for package @standardnotes/websockets-server
|
||||
|
||||
## [1.6.10](https://github.com/standardnotes/server/compare/@standardnotes/websockets-server@1.6.9...@standardnotes/websockets-server@1.6.10) (2023-03-30)
|
||||
|
||||
**Note:** Version bump only for package @standardnotes/websockets-server
|
||||
|
||||
## [1.6.9](https://github.com/standardnotes/server/compare/@standardnotes/websockets-server@1.6.8...@standardnotes/websockets-server@1.6.9) (2023-03-10)
|
||||
|
||||
**Note:** Version bump only for package @standardnotes/websockets-server
|
||||
|
||||
@@ -1,6 +1,6 @@
|
||||
{
|
||||
"name": "@standardnotes/websockets-server",
|
||||
"version": "1.6.9",
|
||||
"version": "1.6.12",
|
||||
"engines": {
|
||||
"node": ">=18.0.0 <19.0.0"
|
||||
},
|
||||
@@ -23,7 +23,7 @@
|
||||
},
|
||||
"dependencies": {
|
||||
"@aws-sdk/client-sqs": "^3.259.0",
|
||||
"@newrelic/winston-enricher": "^4.0.0",
|
||||
"@newrelic/winston-enricher": "^4.0.1",
|
||||
"@sentry/node": "^7.28.1",
|
||||
"@standardnotes/api": "^1.25.3",
|
||||
"@standardnotes/common": "workspace:^",
|
||||
@@ -41,7 +41,7 @@
|
||||
"inversify-express-utils": "^6.4.3",
|
||||
"ioredis": "^5.2.4",
|
||||
"mysql2": "^3.0.1",
|
||||
"newrelic": "^9.11.0",
|
||||
"newrelic": "^10.0.0",
|
||||
"reflect-metadata": "0.1.13",
|
||||
"typeorm": "^0.3.10",
|
||||
"winston": "^3.8.1"
|
||||
@@ -51,7 +51,7 @@
|
||||
"@types/express": "^4.17.14",
|
||||
"@types/ioredis": "^5.0.0",
|
||||
"@types/jest": "^29.1.1",
|
||||
"@types/newrelic": "^9.4.0",
|
||||
"@types/newrelic": "^9.13.0",
|
||||
"@typescript-eslint/eslint-plugin": "^5.48.2",
|
||||
"eslint": "^8.32.0",
|
||||
"eslint-plugin-prettier": "^4.0.0",
|
||||
|
||||
@@ -1940,13 +1940,13 @@ __metadata:
|
||||
languageName: node
|
||||
linkType: hard
|
||||
|
||||
"@grpc/grpc-js@npm:^1.8.8":
|
||||
version: 1.8.12
|
||||
resolution: "@grpc/grpc-js@npm:1.8.12"
|
||||
"@grpc/grpc-js@npm:^1.8.10":
|
||||
version: 1.8.13
|
||||
resolution: "@grpc/grpc-js@npm:1.8.13"
|
||||
dependencies:
|
||||
"@grpc/proto-loader": "npm:^0.7.0"
|
||||
"@types/node": "npm:>=12.12.47"
|
||||
checksum: cf2523ed610cd7c9f08f6c24bfdde8072d4d98e3026b9158d09709ff0ab079912c31af8803a723c3707a1d58a9030df7cdb8ef9d2e1135ac6d5440d10bd76752
|
||||
checksum: 04d24ca840f2bccb7fc8698ae611bdb3f361b6b4785fe5559155218766bc48da67959db8cb692b31062d6918f3e5c1475083ffb60e67d23b0560ba5c1b88510a
|
||||
languageName: node
|
||||
linkType: hard
|
||||
|
||||
@@ -2608,12 +2608,12 @@ __metadata:
|
||||
languageName: node
|
||||
linkType: hard
|
||||
|
||||
"@newrelic/winston-enricher@npm:^4.0.0":
|
||||
version: 4.0.0
|
||||
resolution: "@newrelic/winston-enricher@npm:4.0.0"
|
||||
"@newrelic/winston-enricher@npm:^4.0.1":
|
||||
version: 4.0.1
|
||||
resolution: "@newrelic/winston-enricher@npm:4.0.1"
|
||||
peerDependencies:
|
||||
newrelic: ">=8.13.0"
|
||||
checksum: 3fc901cded1c0ffe59f540daadfcb5ec348a62143f5324ce7869af2d0f2924ce4fe2ad8d927f240439fa71327d3f87f7b1914cf3e5fee7bdfcfd855c9ffa249c
|
||||
checksum: e45880f6ec9b8125e470b55e685701287c2ddb37b4423472113043031992bd7e0cb4042c784dcad7ec6ca90799ccaea4954c02873e9885b0148a0b79fc0316e0
|
||||
languageName: node
|
||||
linkType: hard
|
||||
|
||||
@@ -3191,7 +3191,7 @@ __metadata:
|
||||
dependencies:
|
||||
"@aws-sdk/client-sns": "npm:^3.259.0"
|
||||
"@aws-sdk/client-sqs": "npm:^3.259.0"
|
||||
"@newrelic/winston-enricher": "npm:^4.0.0"
|
||||
"@newrelic/winston-enricher": "npm:^4.0.1"
|
||||
"@sentry/node": "npm:^7.28.1"
|
||||
"@standardnotes/common": "workspace:*"
|
||||
"@standardnotes/domain-core": "workspace:^"
|
||||
@@ -3201,7 +3201,7 @@ __metadata:
|
||||
"@types/ioredis": "npm:^5.0.0"
|
||||
"@types/jest": "npm:^29.1.1"
|
||||
"@types/mixpanel": "npm:^2.14.4"
|
||||
"@types/newrelic": "npm:^9.4.0"
|
||||
"@types/newrelic": "npm:^9.13.0"
|
||||
"@types/node": "npm:^18.11.9"
|
||||
"@typescript-eslint/eslint-plugin": "npm:^5.48.2"
|
||||
dayjs: "npm:^1.11.6"
|
||||
@@ -3213,7 +3213,7 @@ __metadata:
|
||||
jest: "npm:^29.1.2"
|
||||
mixpanel: "npm:^0.17.0"
|
||||
mysql2: "npm:^3.0.1"
|
||||
newrelic: "npm:^9.11.0"
|
||||
newrelic: "npm:^10.0.0"
|
||||
reflect-metadata: "npm:^0.1.13"
|
||||
ts-jest: "npm:^29.0.3"
|
||||
typeorm: "npm:^0.3.10"
|
||||
@@ -3226,7 +3226,7 @@ __metadata:
|
||||
version: 0.0.0-use.local
|
||||
resolution: "@standardnotes/api-gateway@workspace:packages/api-gateway"
|
||||
dependencies:
|
||||
"@newrelic/winston-enricher": "npm:^4.0.0"
|
||||
"@newrelic/winston-enricher": "npm:^4.0.1"
|
||||
"@sentry/node": "npm:^7.28.1"
|
||||
"@standardnotes/domain-core": "workspace:^"
|
||||
"@standardnotes/domain-events": "workspace:*"
|
||||
@@ -3238,7 +3238,7 @@ __metadata:
|
||||
"@types/ioredis": "npm:^5.0.0"
|
||||
"@types/jest": "npm:^29.1.1"
|
||||
"@types/jsonwebtoken": "npm:^9.0.1"
|
||||
"@types/newrelic": "npm:^9.4.0"
|
||||
"@types/newrelic": "npm:^9.13.0"
|
||||
"@types/prettyjson": "npm:^0.0.30"
|
||||
"@typescript-eslint/eslint-plugin": "npm:^5.48.2"
|
||||
axios: "npm:^1.1.3"
|
||||
@@ -3254,7 +3254,7 @@ __metadata:
|
||||
ioredis: "npm:^5.2.4"
|
||||
jest: "npm:^29.1.2"
|
||||
jsonwebtoken: "npm:^9.0.0"
|
||||
newrelic: "npm:^9.11.0"
|
||||
newrelic: "npm:^10.0.0"
|
||||
nodemon: "npm:^2.0.19"
|
||||
npm-check-updates: "npm:^16.0.1"
|
||||
prettyjson: "npm:^1.2.5"
|
||||
@@ -3289,7 +3289,7 @@ __metadata:
|
||||
"@aws-sdk/client-sqs": "npm:^3.259.0"
|
||||
"@cbor-extract/cbor-extract-linux-arm64": "npm:^2.1.1"
|
||||
"@cbor-extract/cbor-extract-linux-x64": "npm:^2.1.1"
|
||||
"@newrelic/winston-enricher": "npm:^4.0.0"
|
||||
"@newrelic/winston-enricher": "npm:^4.0.1"
|
||||
"@sentry/node": "npm:^7.28.1"
|
||||
"@sentry/tracing": "npm:^7.28.1"
|
||||
"@simplewebauthn/server": "npm:^7.0.1"
|
||||
@@ -3299,7 +3299,7 @@ __metadata:
|
||||
"@standardnotes/domain-core": "workspace:^"
|
||||
"@standardnotes/domain-events": "workspace:*"
|
||||
"@standardnotes/domain-events-infra": "workspace:*"
|
||||
"@standardnotes/features": "npm:^1.58.9"
|
||||
"@standardnotes/features": "npm:^1.58.12"
|
||||
"@standardnotes/predicates": "workspace:*"
|
||||
"@standardnotes/responses": "npm:^1.13.9"
|
||||
"@standardnotes/security": "workspace:*"
|
||||
@@ -3312,7 +3312,7 @@ __metadata:
|
||||
"@types/express": "npm:^4.17.14"
|
||||
"@types/ioredis": "npm:^5.0.0"
|
||||
"@types/jest": "npm:^29.1.1"
|
||||
"@types/newrelic": "npm:^9.4.0"
|
||||
"@types/newrelic": "npm:^9.13.0"
|
||||
"@types/otplib": "npm:^10.0.0"
|
||||
"@types/prettyjson": "npm:^0.0.30"
|
||||
"@types/ua-parser-js": "npm:^0.7.36"
|
||||
@@ -3331,7 +3331,7 @@ __metadata:
|
||||
ioredis: "npm:^5.2.4"
|
||||
jest: "npm:^29.1.2"
|
||||
mysql2: "npm:^3.0.1"
|
||||
newrelic: "npm:^9.11.0"
|
||||
newrelic: "npm:^10.0.0"
|
||||
nodemon: "npm:^2.0.19"
|
||||
npm-check-updates: "npm:^16.0.1"
|
||||
otplib: "npm:12.0.1"
|
||||
@@ -3398,12 +3398,12 @@ __metadata:
|
||||
"@standardnotes/domain-events": "workspace:*"
|
||||
"@types/ioredis": "npm:^5.0.0"
|
||||
"@types/jest": "npm:^29.1.1"
|
||||
"@types/newrelic": "npm:^9.4.0"
|
||||
"@types/newrelic": "npm:^9.13.0"
|
||||
"@typescript-eslint/eslint-plugin": "npm:^5.48.2"
|
||||
eslint-plugin-prettier: "npm:^4.2.1"
|
||||
ioredis: "npm:^5.2.4"
|
||||
jest: "npm:^29.1.2"
|
||||
newrelic: "npm:^9.11.0"
|
||||
newrelic: "npm:^10.0.0"
|
||||
reflect-metadata: "npm:^0.1.13"
|
||||
sqs-consumer: "npm:^6.2.1"
|
||||
ts-jest: "npm:^29.0.3"
|
||||
@@ -3451,7 +3451,7 @@ __metadata:
|
||||
"@standardnotes/time": "workspace:*"
|
||||
"@types/ioredis": "npm:^5.0.0"
|
||||
"@types/jest": "npm:^29.1.1"
|
||||
"@types/newrelic": "npm:^9.4.0"
|
||||
"@types/newrelic": "npm:^9.13.0"
|
||||
"@types/nodemailer": "npm:^6.4.1"
|
||||
"@typescript-eslint/eslint-plugin": "npm:^5.48.2"
|
||||
dotenv: "npm:^16.0.1"
|
||||
@@ -3461,7 +3461,7 @@ __metadata:
|
||||
ioredis: "npm:^5.2.4"
|
||||
jest: "npm:^29.1.2"
|
||||
mysql2: "npm:^3.0.1"
|
||||
newrelic: "npm:^9.11.0"
|
||||
newrelic: "npm:^10.0.0"
|
||||
reflect-metadata: "npm:0.1.13"
|
||||
ts-jest: "npm:^29.0.3"
|
||||
typeorm: "npm:^0.3.10"
|
||||
@@ -3482,15 +3482,15 @@ __metadata:
|
||||
languageName: node
|
||||
linkType: hard
|
||||
|
||||
"@standardnotes/features@npm:^1.58.9":
|
||||
version: 1.58.9
|
||||
resolution: "@standardnotes/features@npm:1.58.9"
|
||||
"@standardnotes/features@npm:^1.58.12":
|
||||
version: 1.58.12
|
||||
resolution: "@standardnotes/features@npm:1.58.12"
|
||||
dependencies:
|
||||
"@standardnotes/common": "npm:^1.46.6"
|
||||
"@standardnotes/domain-core": "npm:^1.11.3"
|
||||
"@standardnotes/security": "npm:^1.7.6"
|
||||
reflect-metadata: "npm:^0.1.13"
|
||||
checksum: 218350ee55d2f920e26c4041e1e307655cf9e755b83c7fd2165be2222d95b40154c0d325a362cc84ce960ccf8c07c6d95c6a8558ddabf6ee335462cf6bd22508
|
||||
checksum: 3fcd9a948848cf6fe567390a7740222fd96d10b8a9bceeaf608befcd7e24ac7374e1c87ed51c12ab62a9ed6036b3c6da82c78ab58f6b0c3f0c3c9aaa2b7ffdfe
|
||||
languageName: node
|
||||
linkType: hard
|
||||
|
||||
@@ -3516,7 +3516,7 @@ __metadata:
|
||||
"@types/ioredis": "npm:^5.0.0"
|
||||
"@types/jest": "npm:^29.1.1"
|
||||
"@types/jsonwebtoken": "npm:^9.0.1"
|
||||
"@types/newrelic": "npm:^9.4.0"
|
||||
"@types/newrelic": "npm:^9.13.0"
|
||||
"@types/prettyjson": "npm:^0.0.30"
|
||||
"@types/uuid": "npm:^8.3.0"
|
||||
"@typescript-eslint/eslint-plugin": "npm:^5.48.2"
|
||||
@@ -3535,7 +3535,7 @@ __metadata:
|
||||
ioredis: "npm:^5.2.4"
|
||||
jest: "npm:^29.1.2"
|
||||
jsonwebtoken: "npm:^9.0.0"
|
||||
newrelic: "npm:^9.11.0"
|
||||
newrelic: "npm:^10.0.0"
|
||||
nodemon: "npm:^2.0.19"
|
||||
npm-check-updates: "npm:^16.0.1"
|
||||
prettyjson: "npm:^1.2.5"
|
||||
@@ -3592,7 +3592,7 @@ __metadata:
|
||||
dependencies:
|
||||
"@aws-sdk/client-s3": "npm:^3.259.0"
|
||||
"@aws-sdk/client-sqs": "npm:^3.259.0"
|
||||
"@newrelic/winston-enricher": "npm:^4.0.0"
|
||||
"@newrelic/winston-enricher": "npm:^4.0.1"
|
||||
"@sentry/node": "npm:^7.28.1"
|
||||
"@standardnotes/api": "npm:^1.25.3"
|
||||
"@standardnotes/common": "workspace:^"
|
||||
@@ -3607,7 +3607,7 @@ __metadata:
|
||||
"@types/express": "npm:^4.17.14"
|
||||
"@types/inversify-express-utils": "npm:^2.0.0"
|
||||
"@types/jest": "npm:^29.1.1"
|
||||
"@types/newrelic": "npm:^9.4.0"
|
||||
"@types/newrelic": "npm:^9.13.0"
|
||||
"@typescript-eslint/eslint-plugin": "npm:^5.48.2"
|
||||
cors: "npm:2.8.5"
|
||||
dotenv: "npm:^16.0.1"
|
||||
@@ -3618,7 +3618,7 @@ __metadata:
|
||||
inversify-express-utils: "npm:^6.4.3"
|
||||
jest: "npm:^29.1.2"
|
||||
mysql2: "npm:^3.0.1"
|
||||
newrelic: "npm:^9.11.0"
|
||||
newrelic: "npm:^10.0.0"
|
||||
npm-check-updates: "npm:^16.0.1"
|
||||
reflect-metadata: "npm:0.1.13"
|
||||
ts-jest: "npm:^29.0.3"
|
||||
@@ -3634,7 +3634,7 @@ __metadata:
|
||||
dependencies:
|
||||
"@aws-sdk/client-sns": "npm:^3.259.0"
|
||||
"@aws-sdk/client-sqs": "npm:^3.259.0"
|
||||
"@newrelic/winston-enricher": "npm:^4.0.0"
|
||||
"@newrelic/winston-enricher": "npm:^4.0.1"
|
||||
"@sentry/node": "npm:^7.28.1"
|
||||
"@standardnotes/domain-core": "workspace:^"
|
||||
"@standardnotes/domain-events": "workspace:*"
|
||||
@@ -3643,7 +3643,7 @@ __metadata:
|
||||
"@standardnotes/time": "workspace:*"
|
||||
"@types/ioredis": "npm:^5.0.0"
|
||||
"@types/jest": "npm:^29.1.1"
|
||||
"@types/newrelic": "npm:^9.4.0"
|
||||
"@types/newrelic": "npm:^9.13.0"
|
||||
"@types/node": "npm:^18.11.9"
|
||||
"@typescript-eslint/eslint-plugin": "npm:^5.48.2"
|
||||
dayjs: "npm:^1.11.6"
|
||||
@@ -3654,7 +3654,7 @@ __metadata:
|
||||
ioredis: "npm:^5.2.4"
|
||||
jest: "npm:^29.1.2"
|
||||
mysql2: "npm:^3.0.1"
|
||||
newrelic: "npm:^9.11.0"
|
||||
newrelic: "npm:^10.0.0"
|
||||
npm-check-updates: "npm:^16.0.1"
|
||||
reflect-metadata: "npm:^0.1.13"
|
||||
ts-jest: "npm:^29.0.3"
|
||||
@@ -3691,13 +3691,13 @@ __metadata:
|
||||
"@lerna-lite/run": "npm:^1.5.1"
|
||||
"@sentry/node": "npm:^7.28.1"
|
||||
"@types/jest": "npm:^29.1.1"
|
||||
"@types/newrelic": "npm:^9.4.0"
|
||||
"@types/newrelic": "npm:^9.13.0"
|
||||
"@types/node": "npm:^18.11.9"
|
||||
"@typescript-eslint/parser": "npm:^5.40.1"
|
||||
eslint: "npm:^8.32.0"
|
||||
eslint-config-prettier: "npm:^8.6.0"
|
||||
ini: "npm:^3.0.0"
|
||||
newrelic: "npm:^9.11.0"
|
||||
newrelic: "npm:^10.0.0"
|
||||
npm-check-updates: "npm:^16.0.1"
|
||||
prettier: "npm:^2.7.1"
|
||||
ts-node: "npm:^10.9.1"
|
||||
@@ -3760,7 +3760,7 @@ __metadata:
|
||||
"@aws-sdk/client-s3": "npm:^3.259.0"
|
||||
"@aws-sdk/client-sns": "npm:^3.259.0"
|
||||
"@aws-sdk/client-sqs": "npm:^3.259.0"
|
||||
"@newrelic/winston-enricher": "npm:^4.0.0"
|
||||
"@newrelic/winston-enricher": "npm:^4.0.1"
|
||||
"@sentry/node": "npm:^7.28.1"
|
||||
"@sentry/tracing": "npm:^7.28.1"
|
||||
"@standardnotes/api": "npm:^1.25.3"
|
||||
@@ -3778,7 +3778,7 @@ __metadata:
|
||||
"@types/inversify-express-utils": "npm:^2.0.0"
|
||||
"@types/jest": "npm:^29.1.1"
|
||||
"@types/jsonwebtoken": "npm:^9.0.1"
|
||||
"@types/newrelic": "npm:^9.4.0"
|
||||
"@types/newrelic": "npm:^9.13.0"
|
||||
"@types/prettyjson": "npm:^0.0.30"
|
||||
"@types/ua-parser-js": "npm:^0.7.36"
|
||||
"@types/uuid": "npm:^8.3.0"
|
||||
@@ -3795,7 +3795,7 @@ __metadata:
|
||||
jest: "npm:^29.1.2"
|
||||
jsonwebtoken: "npm:^9.0.0"
|
||||
mysql2: "npm:^3.0.1"
|
||||
newrelic: "npm:^9.11.0"
|
||||
newrelic: "npm:^10.0.0"
|
||||
nodemon: "npm:^2.0.19"
|
||||
npm-check-updates: "npm:^16.0.1"
|
||||
prettyjson: "npm:^1.2.5"
|
||||
@@ -3855,7 +3855,7 @@ __metadata:
|
||||
resolution: "@standardnotes/websockets-server@workspace:packages/websockets"
|
||||
dependencies:
|
||||
"@aws-sdk/client-sqs": "npm:^3.259.0"
|
||||
"@newrelic/winston-enricher": "npm:^4.0.0"
|
||||
"@newrelic/winston-enricher": "npm:^4.0.1"
|
||||
"@sentry/node": "npm:^7.28.1"
|
||||
"@standardnotes/api": "npm:^1.25.3"
|
||||
"@standardnotes/common": "workspace:^"
|
||||
@@ -3869,7 +3869,7 @@ __metadata:
|
||||
"@types/express": "npm:^4.17.14"
|
||||
"@types/ioredis": "npm:^5.0.0"
|
||||
"@types/jest": "npm:^29.1.1"
|
||||
"@types/newrelic": "npm:^9.4.0"
|
||||
"@types/newrelic": "npm:^9.13.0"
|
||||
"@typescript-eslint/eslint-plugin": "npm:^5.48.2"
|
||||
axios: "npm:^1.1.3"
|
||||
cors: "npm:2.8.5"
|
||||
@@ -3882,7 +3882,7 @@ __metadata:
|
||||
ioredis: "npm:^5.2.4"
|
||||
jest: "npm:^29.1.2"
|
||||
mysql2: "npm:^3.0.1"
|
||||
newrelic: "npm:^9.11.0"
|
||||
newrelic: "npm:^10.0.0"
|
||||
reflect-metadata: "npm:0.1.13"
|
||||
ts-jest: "npm:^29.0.3"
|
||||
typeorm: "npm:^0.3.10"
|
||||
@@ -4216,10 +4216,10 @@ __metadata:
|
||||
languageName: node
|
||||
linkType: hard
|
||||
|
||||
"@types/newrelic@npm:^9.4.0":
|
||||
version: 9.4.0
|
||||
resolution: "@types/newrelic@npm:9.4.0"
|
||||
checksum: adb12973e86078be8b49f75cae9bf26d5f344a85df76a69cf73ad24b529e53ab43c66fd5d4f973382be09146be8d1407f2a9c388310415a6464d6d182fbecba1
|
||||
"@types/newrelic@npm:^9.13.0":
|
||||
version: 9.13.0
|
||||
resolution: "@types/newrelic@npm:9.13.0"
|
||||
checksum: d0269b05c43b48756b0ff10e09d312cb22871b74dbc64ac85e0dfbd1a5cd81f15235ea47c02ba319e7d9e219db0629ef0474c0696961406faff43844c748920f
|
||||
languageName: node
|
||||
linkType: hard
|
||||
|
||||
@@ -9400,12 +9400,12 @@ __metadata:
|
||||
languageName: node
|
||||
linkType: hard
|
||||
|
||||
"newrelic@npm:^9.11.0":
|
||||
version: 9.11.0
|
||||
resolution: "newrelic@npm:9.11.0"
|
||||
"newrelic@npm:^10.0.0":
|
||||
version: 10.0.0
|
||||
resolution: "newrelic@npm:10.0.0"
|
||||
dependencies:
|
||||
"@contrast/fn-inspect": "npm:^3.3.0"
|
||||
"@grpc/grpc-js": "npm:^1.8.8"
|
||||
"@grpc/grpc-js": "npm:^1.8.10"
|
||||
"@grpc/proto-loader": "npm:^0.7.5"
|
||||
"@newrelic/aws-sdk": "npm:^5.0.2"
|
||||
"@newrelic/koa": "npm:^7.1.1"
|
||||
@@ -9416,7 +9416,7 @@ __metadata:
|
||||
https-proxy-agent: "npm:^5.0.0"
|
||||
json-bigint: "npm:^1.0.0"
|
||||
json-stringify-safe: "npm:^5.0.0"
|
||||
readable-stream: "npm:^3.6.0"
|
||||
readable-stream: "npm:^3.6.1"
|
||||
semver: "npm:^5.3.0"
|
||||
winston-transport: "npm:^4.5.0"
|
||||
dependenciesMeta:
|
||||
@@ -9426,7 +9426,7 @@ __metadata:
|
||||
optional: true
|
||||
bin:
|
||||
newrelic-naming-rules: bin/test-naming-rules.js
|
||||
checksum: fd1ec1b30799f56632130100a84d90ebcf2ebdb0ded4432bc3b4d71fa3b801c48284eebce814ef32fc31510f1fca4b43676d1de63ed7d6ca00bd8cbc8f6b2f98
|
||||
checksum: b5af478708807fde3be9bd0a621421bd06210e84543b7b097640965ba4c2b28920adb36fe86b2923b76abc66d8ade9935b5d9c9a8ce882e03e8698c47971ce18
|
||||
languageName: node
|
||||
linkType: hard
|
||||
|
||||
@@ -10629,6 +10629,17 @@ __metadata:
|
||||
languageName: node
|
||||
linkType: hard
|
||||
|
||||
"readable-stream@npm:^3.6.1":
|
||||
version: 3.6.2
|
||||
resolution: "readable-stream@npm:3.6.2"
|
||||
dependencies:
|
||||
inherits: "npm:^2.0.3"
|
||||
string_decoder: "npm:^1.1.1"
|
||||
util-deprecate: "npm:^1.0.1"
|
||||
checksum: b1cbe0fea6b407fc75bfbe4f6c54d48899e638d54a8a1207b5040c60566dd5f65059b32c3edf0ac0ce621ea46929b3337e8a19410870eff98b8be5a3ba543b7a
|
||||
languageName: node
|
||||
linkType: hard
|
||||
|
||||
"readable-stream@npm:~2.3.6":
|
||||
version: 2.3.7
|
||||
resolution: "readable-stream@npm:2.3.7"
|
||||
|
||||
Reference in New Issue
Block a user