Compare commits

...

36 Commits

Author SHA1 Message Date
standardci 1322f99808 chore(release): publish new version
- @standardnotes/analytics@2.9.7
 - @standardnotes/api-gateway@1.38.2
 - @standardnotes/auth-server@1.59.8
 - @standardnotes/common@1.44.2
 - @standardnotes/domain-events-infra@1.9.24
 - @standardnotes/domain-events@2.86.1
 - @standardnotes/event-store@1.6.19
 - @standardnotes/files-server@1.8.19
 - @standardnotes/predicates@1.5.5
 - @standardnotes/scheduler-server@1.13.20
 - @standardnotes/security@1.6.2
 - @standardnotes/settings@1.18.1
 - @standardnotes/sncrypto-node@1.12.1
 - @standardnotes/syncing-server@1.13.3
 - @standardnotes/time@1.13.1
 - @standardnotes/websockets-server@1.4.21
 - @standardnotes/workspace-server@1.17.19
2022-11-14 09:08:49 +00:00
Karol Sójko 46519bb710 chore(deps): add newrelic native metrics to measure oom issues 2022-11-14 10:06:49 +01:00
standardci 7b9290382d chore(release): publish new version
- @standardnotes/analytics@2.9.6
 - @standardnotes/api-gateway@1.38.1
 - @standardnotes/auth-server@1.59.7
 - @standardnotes/domain-events-infra@1.9.23
 - @standardnotes/event-store@1.6.18
 - @standardnotes/files-server@1.8.18
 - @standardnotes/scheduler-server@1.13.19
 - @standardnotes/syncing-server@1.13.2
 - @standardnotes/websockets-server@1.4.20
 - @standardnotes/workspace-server@1.17.18
2022-11-14 09:03:07 +00:00
Karol Sójko 85e55cf0e4 chore(deps): upgrade newrelic 2022-11-14 10:01:08 +01:00
standardci 7016854b7f chore(release): publish new version
- @standardnotes/syncing-server@1.13.1
2022-11-14 08:14:00 +00:00
Karol Sójko 01a4151763 fix(syncing-server): add debugs logs for content size recalculation handler 2022-11-14 09:11:33 +01:00
standardci 311f758cd8 chore(release): publish new version
- @standardnotes/api-gateway@1.38.0
2022-11-13 15:06:19 +00:00
Mo 3bba36742a feat: iap confirm endpoint (#338) 2022-11-13 09:04:27 -06:00
standardci ea52ba51ca chore(release): publish new version
- @standardnotes/syncing-server@1.13.0
2022-11-11 12:57:03 +00:00
Karol Sójko 7e404ae71a feat(syncing-server): add content size recalculation job 2022-11-11 13:54:45 +01:00
standardci 3ad95afa84 chore(release): publish new version
- @standardnotes/analytics@2.9.5
 - @standardnotes/api-gateway@1.37.11
 - @standardnotes/auth-server@1.59.6
 - @standardnotes/domain-events-infra@1.9.22
 - @standardnotes/domain-events@2.86.0
 - @standardnotes/event-store@1.6.17
 - @standardnotes/files-server@1.8.17
 - @standardnotes/scheduler-server@1.13.18
 - @standardnotes/syncing-server@1.12.0
 - @standardnotes/websockets-server@1.4.19
 - @standardnotes/workspace-server@1.17.17
2022-11-11 12:45:17 +00:00
Karol Sójko 1a13861647 feat(syncing-server): add item content size recalculation 2022-11-11 13:43:22 +01:00
standardci 6d84c819c0 chore(release): publish new version
- @standardnotes/analytics@2.9.4
 - @standardnotes/api-gateway@1.37.10
 - @standardnotes/auth-server@1.59.5
 - @standardnotes/domain-events-infra@1.9.21
 - @standardnotes/domain-events@2.85.0
 - @standardnotes/event-store@1.6.16
 - @standardnotes/files-server@1.8.16
 - @standardnotes/scheduler-server@1.13.17
 - @standardnotes/syncing-server@1.11.10
 - @standardnotes/websockets-server@1.4.18
 - @standardnotes/workspace-server@1.17.16
2022-11-11 12:11:40 +00:00
Karol Sójko 36ec39d2fb feat(domain-events): add user content size recalculation requested event 2022-11-11 13:09:33 +01:00
standardci eaafc12c8a chore(release): publish new version
- @standardnotes/analytics@2.9.3
 - @standardnotes/api-gateway@1.37.9
 - @standardnotes/auth-server@1.59.4
 - @standardnotes/common@1.44.1
 - @standardnotes/domain-events-infra@1.9.20
 - @standardnotes/domain-events@2.84.1
 - @standardnotes/event-store@1.6.15
 - @standardnotes/files-server@1.8.15
 - @standardnotes/predicates@1.5.4
 - @standardnotes/scheduler-server@1.13.16
 - @standardnotes/security@1.6.1
 - @standardnotes/syncing-server@1.11.9
 - @standardnotes/websockets-server@1.4.17
 - @standardnotes/workspace-server@1.17.15
2022-11-10 18:20:16 +00:00
Karol Sójko a03c5bceea fix(analytics): add five year plans mrr calculation 2022-11-10 19:18:25 +01:00
standardci 53c51fd204 chore(release): publish new version
- @standardnotes/analytics@2.9.2
2022-11-10 15:21:59 +00:00
Karol Sójko 9b593f2a6b fix(analytics): add missing period for stats report 2022-11-10 16:19:45 +01:00
standardci 363609cb1b chore(release): publish new version
- @standardnotes/api-gateway@1.37.8
 - @standardnotes/auth-server@1.59.3
 - @standardnotes/syncing-server@1.11.8
 - @standardnotes/websockets-server@1.4.16
2022-11-10 15:19:21 +00:00
Karol Sójko 68e6d30093 chore(deps): fix axios imports 2022-11-10 16:17:11 +01:00
standardci c53a40ef8d chore(release): publish new version
- @standardnotes/api-gateway@1.37.7
 - @standardnotes/auth-server@1.59.2
 - @standardnotes/syncing-server@1.11.7
 - @standardnotes/websockets-server@1.4.15
2022-11-10 14:42:52 +00:00
Karol Sójko 3c2ac05c60 fix(api-gateway): setting headers 2022-11-10 15:39:57 +01:00
Karol Sójko bffab433f6 chore(deps): upgrade ua-parser-js 2022-11-10 15:37:31 +01:00
Karol Sójko 200b6ce01f chore(deps): upgrade axios 2022-11-10 15:35:39 +01:00
standardci 0d29dc1012 chore(release): publish new version
- @standardnotes/analytics@2.9.1
2022-11-10 14:24:45 +00:00
Karol Sójko b92c4ae650 fix(analytics): generate mrr stats for last 30 days including Today 2022-11-10 15:22:52 +01:00
standardci e15d1e52bd chore(release): publish new version
- @standardnotes/analytics@2.9.0
2022-11-10 14:19:41 +00:00
Karol Sójko ce3e259bde feat(analytics): add mrr for annual, monthly, pro and plus subscription plans 2022-11-10 15:17:35 +01:00
standardci 87361f90b1 chore(release): publish new version
- @standardnotes/analytics@2.8.3
2022-11-10 11:27:40 +00:00
Karol Sójko 81be06598c fix(analytics): add subscription id to error logs 2022-11-10 12:25:46 +01:00
standardci 9492da6789 chore(release): publish new version
- @standardnotes/analytics@2.8.2
2022-11-10 10:54:18 +00:00
Karol Sójko fce47a0a37 fix(analytics): add monthly mrr to the report 2022-11-10 11:52:24 +01:00
standardci 92ba682198 chore(release): publish new version
- @standardnotes/analytics@2.8.1
2022-11-10 10:43:40 +00:00
Karol Sójko 8df0482eb4 fix(analytics): add persisting mrr for this month and this year as well 2022-11-10 11:41:24 +01:00
standardci 37a5cb347d chore(release): publish new version
- @standardnotes/analytics@2.8.0
 - @standardnotes/api-gateway@1.37.6
 - @standardnotes/auth-server@1.59.1
 - @standardnotes/domain-events-infra@1.9.19
 - @standardnotes/domain-events@2.84.0
 - @standardnotes/event-store@1.6.14
 - @standardnotes/files-server@1.8.14
 - @standardnotes/scheduler-server@1.13.15
 - @standardnotes/syncing-server@1.11.6
 - @standardnotes/websockets-server@1.4.14
 - @standardnotes/workspace-server@1.17.14
2022-11-10 10:35:38 +00:00
Karol Sójko 77e50655f6 feat(analytics): add calculating monthly recurring revenue 2022-11-10 11:33:46 +01:00
90 changed files with 1147 additions and 780 deletions
Generated
+93 -65
View File
@@ -116,15 +116,16 @@ const RAW_RUNTIME_STATE =
["@lerna-lite/cli", "npm:1.6.0"],\
["@lerna-lite/list", "npm:1.6.0"],\
["@lerna-lite/run", "npm:1.6.0"],\
["@newrelic/native-metrics", "npm:9.0.0"],\
["@sentry/node", "npm:7.5.0"],\
["@types/jest", "npm:29.1.1"],\
["@types/newrelic", "npm:7.0.3"],\
["@types/newrelic", "npm:7.0.4"],\
["@types/node", "npm:18.0.3"],\
["@typescript-eslint/parser", "virtual:8859b278716fedf3e7458b5628625f7e35678c418626878559a0b816445001b7e24c55546f4677ba4c20b521aa0cf52cc33ac07deff171e383ada6eeab69933f#npm:5.40.1"],\
["eslint", "npm:8.19.0"],\
["eslint-config-prettier", "virtual:8859b278716fedf3e7458b5628625f7e35678c418626878559a0b816445001b7e24c55546f4677ba4c20b521aa0cf52cc33ac07deff171e383ada6eeab69933f#npm:8.5.0"],\
["ini", "npm:3.0.0"],\
["newrelic", "npm:9.0.0"],\
["newrelic", "npm:9.6.0"],\
["npm-check-updates", "npm:16.0.1"],\
["prettier", "npm:2.7.1"],\
["ts-node", "virtual:8859b278716fedf3e7458b5628625f7e35678c418626878559a0b816445001b7e24c55546f4677ba4c20b521aa0cf52cc33ac07deff171e383ada6eeab69933f#npm:10.9.1"],\
@@ -1865,12 +1866,12 @@ const RAW_RUNTIME_STATE =
],\
"linkType": "SOFT"\
}],\
["virtual:65e8703d5df08d5ff3f7296fcb759f276254ee430ae6f3cc1f03da392ff63066a3c6c59591c38f36f19d3e877285287a834b5c55e22d764dc2cb0938f7128707#npm:5.0.0", {\
"packageLocation": "./.yarn/__virtual__/@newrelic-aws-sdk-virtual-e9040e4121/0/cache/@newrelic-aws-sdk-npm-5.0.0-7d9d10d58f-ed1dc3fa16.zip/node_modules/@newrelic/aws-sdk/",\
["virtual:f10080c2deb75096716a913b06010dcd94891c77539a757ab32210a1efc3ff91527b36d6c7c46e890db826160e0724553ca23acd0a8a734b5554c9600c71eb52#npm:5.0.0", {\
"packageLocation": "./.yarn/__virtual__/@newrelic-aws-sdk-virtual-ccf1e948b3/0/cache/@newrelic-aws-sdk-npm-5.0.0-7d9d10d58f-ed1dc3fa16.zip/node_modules/@newrelic/aws-sdk/",\
"packageDependencies": [\
["@newrelic/aws-sdk", "virtual:65e8703d5df08d5ff3f7296fcb759f276254ee430ae6f3cc1f03da392ff63066a3c6c59591c38f36f19d3e877285287a834b5c55e22d764dc2cb0938f7128707#npm:5.0.0"],\
["@newrelic/aws-sdk", "virtual:f10080c2deb75096716a913b06010dcd94891c77539a757ab32210a1efc3ff91527b36d6c7c46e890db826160e0724553ca23acd0a8a734b5554c9600c71eb52#npm:5.0.0"],\
["@types/newrelic", null],\
["newrelic", "npm:9.0.0"]\
["newrelic", "npm:9.6.0"]\
],\
"packagePeers": [\
"@types/newrelic",\
@@ -1887,12 +1888,12 @@ const RAW_RUNTIME_STATE =
],\
"linkType": "SOFT"\
}],\
["virtual:65e8703d5df08d5ff3f7296fcb759f276254ee430ae6f3cc1f03da392ff63066a3c6c59591c38f36f19d3e877285287a834b5c55e22d764dc2cb0938f7128707#npm:7.0.0", {\
"packageLocation": "./.yarn/__virtual__/@newrelic-koa-virtual-d6376894e6/0/cache/@newrelic-koa-npm-7.0.0-903c251b9f-0fc2298c8b.zip/node_modules/@newrelic/koa/",\
["virtual:f10080c2deb75096716a913b06010dcd94891c77539a757ab32210a1efc3ff91527b36d6c7c46e890db826160e0724553ca23acd0a8a734b5554c9600c71eb52#npm:7.0.0", {\
"packageLocation": "./.yarn/__virtual__/@newrelic-koa-virtual-613d84b4f1/0/cache/@newrelic-koa-npm-7.0.0-903c251b9f-0fc2298c8b.zip/node_modules/@newrelic/koa/",\
"packageDependencies": [\
["@newrelic/koa", "virtual:65e8703d5df08d5ff3f7296fcb759f276254ee430ae6f3cc1f03da392ff63066a3c6c59591c38f36f19d3e877285287a834b5c55e22d764dc2cb0938f7128707#npm:7.0.0"],\
["@newrelic/koa", "virtual:f10080c2deb75096716a913b06010dcd94891c77539a757ab32210a1efc3ff91527b36d6c7c46e890db826160e0724553ca23acd0a8a734b5554c9600c71eb52#npm:7.0.0"],\
["@types/newrelic", null],\
["newrelic", "npm:9.0.0"]\
["newrelic", "npm:9.6.0"]\
],\
"packagePeers": [\
"@types/newrelic",\
@@ -1922,12 +1923,12 @@ const RAW_RUNTIME_STATE =
],\
"linkType": "SOFT"\
}],\
["virtual:65e8703d5df08d5ff3f7296fcb759f276254ee430ae6f3cc1f03da392ff63066a3c6c59591c38f36f19d3e877285287a834b5c55e22d764dc2cb0938f7128707#npm:6.0.0", {\
"packageLocation": "./.yarn/__virtual__/@newrelic-superagent-virtual-c2a5d7b8a8/0/cache/@newrelic-superagent-npm-6.0.0-db8b77d0f3-b77997b792.zip/node_modules/@newrelic/superagent/",\
["virtual:f10080c2deb75096716a913b06010dcd94891c77539a757ab32210a1efc3ff91527b36d6c7c46e890db826160e0724553ca23acd0a8a734b5554c9600c71eb52#npm:6.0.0", {\
"packageLocation": "./.yarn/__virtual__/@newrelic-superagent-virtual-37eb7b41a0/0/cache/@newrelic-superagent-npm-6.0.0-db8b77d0f3-b77997b792.zip/node_modules/@newrelic/superagent/",\
"packageDependencies": [\
["@newrelic/superagent", "virtual:65e8703d5df08d5ff3f7296fcb759f276254ee430ae6f3cc1f03da392ff63066a3c6c59591c38f36f19d3e877285287a834b5c55e22d764dc2cb0938f7128707#npm:6.0.0"],\
["@newrelic/superagent", "virtual:f10080c2deb75096716a913b06010dcd94891c77539a757ab32210a1efc3ff91527b36d6c7c46e890db826160e0724553ca23acd0a8a734b5554c9600c71eb52#npm:6.0.0"],\
["@types/newrelic", null],\
["newrelic", "npm:9.0.0"]\
["newrelic", "npm:9.6.0"]\
],\
"packagePeers": [\
"@types/newrelic",\
@@ -1948,8 +1949,8 @@ const RAW_RUNTIME_STATE =
"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/",\
"packageDependencies": [\
["@newrelic/winston-enricher", "virtual:c66bf20e88479ada0172094776519a9f51acc4731d22079b60a295bcec7ea42d5545cbce58a77a50d932bf953298799135e99707486e343da6d99ba1d167bdbd#npm:4.0.0"],\
["@types/newrelic", "npm:7.0.3"],\
["newrelic", "npm:9.0.0"]\
["@types/newrelic", "npm:7.0.4"],\
["newrelic", "npm:9.6.0"]\
],\
"packagePeers": [\
"@types/newrelic",\
@@ -2541,6 +2542,7 @@ const RAW_RUNTIME_STATE =
"packageLocation": "./packages/analytics/",\
"packageDependencies": [\
["@standardnotes/analytics", "workspace:packages/analytics"],\
["@newrelic/native-metrics", "npm:9.0.0"],\
["@newrelic/winston-enricher", "virtual:c66bf20e88479ada0172094776519a9f51acc4731d22079b60a295bcec7ea42d5545cbce58a77a50d932bf953298799135e99707486e343da6d99ba1d167bdbd#npm:4.0.0"],\
["@sentry/node", "npm:7.5.0"],\
["@standardnotes/common", "workspace:packages/common"],\
@@ -2549,7 +2551,7 @@ const RAW_RUNTIME_STATE =
["@standardnotes/time", "workspace:packages/time"],\
["@types/ioredis", "npm:4.28.10"],\
["@types/jest", "npm:29.1.1"],\
["@types/newrelic", "npm:7.0.3"],\
["@types/newrelic", "npm:7.0.4"],\
["@types/node", "npm:18.0.3"],\
["@types/uuid", "npm:8.3.4"],\
["@typescript-eslint/eslint-plugin", "virtual:c66bf20e88479ada0172094776519a9f51acc4731d22079b60a295bcec7ea42d5545cbce58a77a50d932bf953298799135e99707486e343da6d99ba1d167bdbd#npm:5.30.5"],\
@@ -2562,7 +2564,7 @@ const RAW_RUNTIME_STATE =
["ioredis", "npm:5.2.3"],\
["jest", "virtual:fd909b174d079e30b336c4ce72c38a88c1e447767b1a8dd7655e07719a1e31b97807f0931368724fc78897ff15e6a6d00b83316c0f76d11f85111f342e08bb79#npm:29.1.2"],\
["mysql2", "npm:2.3.3"],\
["newrelic", "npm:9.0.0"],\
["newrelic", "npm:9.6.0"],\
["reflect-metadata", "npm:0.1.13"],\
["shallow-equal-object", "npm:1.1.1"],\
["ts-jest", "virtual:fd909b174d079e30b336c4ce72c38a88c1e447767b1a8dd7655e07719a1e31b97807f0931368724fc78897ff15e6a6d00b83316c0f76d11f85111f342e08bb79#npm:29.0.3"],\
@@ -2595,6 +2597,7 @@ const RAW_RUNTIME_STATE =
"packageLocation": "./packages/api-gateway/",\
"packageDependencies": [\
["@standardnotes/api-gateway", "workspace:packages/api-gateway"],\
["@newrelic/native-metrics", "npm:9.0.0"],\
["@newrelic/winston-enricher", "virtual:c66bf20e88479ada0172094776519a9f51acc4731d22079b60a295bcec7ea42d5545cbce58a77a50d932bf953298799135e99707486e343da6d99ba1d167bdbd#npm:4.0.0"],\
["@sentry/node", "npm:7.5.0"],\
["@standardnotes/common", "workspace:packages/common"],\
@@ -2607,11 +2610,11 @@ const RAW_RUNTIME_STATE =
["@types/ioredis", "npm:4.28.10"],\
["@types/jest", "npm:29.1.1"],\
["@types/jsonwebtoken", "npm:8.5.9"],\
["@types/newrelic", "npm:7.0.3"],\
["@types/newrelic", "npm:7.0.4"],\
["@types/prettyjson", "npm:0.0.30"],\
["@typescript-eslint/eslint-plugin", "virtual:04783e12400851b8a3d76e71495851cc94959db6e62f04cb0a31190080629440b182d8c8eb4d7f2b04e281912f2783a5fd4d2c3c6ab68d38b7097246c93f4c19#npm:5.40.1"],\
["aws-sdk", "npm:2.1234.0"],\
["axios", "npm:0.27.2"],\
["axios", "npm:1.1.3"],\
["cors", "npm:2.8.5"],\
["dotenv", "npm:16.0.1"],\
["eslint", "npm:8.25.0"],\
@@ -2623,7 +2626,7 @@ const RAW_RUNTIME_STATE =
["ioredis", "npm:5.2.3"],\
["jest", "virtual:fd909b174d079e30b336c4ce72c38a88c1e447767b1a8dd7655e07719a1e31b97807f0931368724fc78897ff15e6a6d00b83316c0f76d11f85111f342e08bb79#npm:29.1.2"],\
["jsonwebtoken", "npm:8.5.1"],\
["newrelic", "npm:9.0.0"],\
["newrelic", "npm:9.6.0"],\
["nodemon", "npm:2.0.20"],\
["npm-check-updates", "npm:16.0.1"],\
["prettyjson", "npm:1.2.5"],\
@@ -2651,6 +2654,7 @@ const RAW_RUNTIME_STATE =
"packageLocation": "./packages/auth/",\
"packageDependencies": [\
["@standardnotes/auth-server", "workspace:packages/auth"],\
["@newrelic/native-metrics", "npm:9.0.0"],\
["@newrelic/winston-enricher", "virtual:c66bf20e88479ada0172094776519a9f51acc4731d22079b60a295bcec7ea42d5545cbce58a77a50d932bf953298799135e99707486e343da6d99ba1d167bdbd#npm:4.0.0"],\
["@sentry/node", "npm:7.5.0"],\
["@standardnotes/api", "npm:1.19.0"],\
@@ -2670,14 +2674,14 @@ const RAW_RUNTIME_STATE =
["@types/express", "npm:4.17.14"],\
["@types/ioredis", "npm:4.28.10"],\
["@types/jest", "npm:29.1.1"],\
["@types/newrelic", "npm:7.0.3"],\
["@types/newrelic", "npm:7.0.4"],\
["@types/otplib", "npm:10.0.0"],\
["@types/prettyjson", "npm:0.0.30"],\
["@types/ua-parser-js", "npm:0.7.36"],\
["@types/uuid", "npm:8.3.4"],\
["@typescript-eslint/eslint-plugin", "virtual:04783e12400851b8a3d76e71495851cc94959db6e62f04cb0a31190080629440b182d8c8eb4d7f2b04e281912f2783a5fd4d2c3c6ab68d38b7097246c93f4c19#npm:5.40.1"],\
["aws-sdk", "npm:2.1234.0"],\
["axios", "npm:0.27.2"],\
["axios", "npm:1.1.3"],\
["bcryptjs", "npm:2.4.3"],\
["cors", "npm:2.8.5"],\
["dayjs", "npm:1.11.6"],\
@@ -2690,7 +2694,7 @@ const RAW_RUNTIME_STATE =
["ioredis", "npm:5.2.3"],\
["jest", "virtual:fd909b174d079e30b336c4ce72c38a88c1e447767b1a8dd7655e07719a1e31b97807f0931368724fc78897ff15e6a6d00b83316c0f76d11f85111f342e08bb79#npm:29.1.2"],\
["mysql2", "npm:2.3.3"],\
["newrelic", "npm:9.0.0"],\
["newrelic", "npm:9.6.0"],\
["nodemon", "npm:2.0.20"],\
["npm-check-updates", "npm:16.0.1"],\
["otplib", "npm:12.0.1"],\
@@ -2699,7 +2703,7 @@ const RAW_RUNTIME_STATE =
["ts-jest", "virtual:fd909b174d079e30b336c4ce72c38a88c1e447767b1a8dd7655e07719a1e31b97807f0931368724fc78897ff15e6a6d00b83316c0f76d11f85111f342e08bb79#npm:29.0.3"],\
["typeorm", "virtual:c66bf20e88479ada0172094776519a9f51acc4731d22079b60a295bcec7ea42d5545cbce58a77a50d932bf953298799135e99707486e343da6d99ba1d167bdbd#npm:0.3.10"],\
["typescript", "patch:typescript@npm%3A4.8.4#optional!builtin<compat/typescript>::version=4.8.4&hash=701156"],\
["ua-parser-js", "npm:1.0.2"],\
["ua-parser-js", "npm:1.0.32"],\
["uuid", "npm:9.0.0"],\
["winston", "npm:3.8.2"]\
],\
@@ -2711,6 +2715,7 @@ const RAW_RUNTIME_STATE =
"packageLocation": "./packages/common/",\
"packageDependencies": [\
["@standardnotes/common", "workspace:packages/common"],\
["@newrelic/native-metrics", "npm:9.0.0"],\
["@types/jest", "npm:29.1.1"],\
["@types/node", "npm:18.0.3"],\
["@typescript-eslint/eslint-plugin", "virtual:fd909b174d079e30b336c4ce72c38a88c1e447767b1a8dd7655e07719a1e31b97807f0931368724fc78897ff15e6a6d00b83316c0f76d11f85111f342e08bb79#npm:5.30.5"],\
@@ -2742,6 +2747,7 @@ const RAW_RUNTIME_STATE =
"packageLocation": "./packages/domain-events/",\
"packageDependencies": [\
["@standardnotes/domain-events", "workspace:packages/domain-events"],\
["@newrelic/native-metrics", "npm:9.0.0"],\
["@standardnotes/common", "workspace:packages/common"],\
["@standardnotes/features", "npm:1.53.1"],\
["@standardnotes/predicates", "workspace:packages/predicates"],\
@@ -2762,16 +2768,17 @@ const RAW_RUNTIME_STATE =
"packageLocation": "./packages/domain-events-infra/",\
"packageDependencies": [\
["@standardnotes/domain-events-infra", "workspace:packages/domain-events-infra"],\
["@newrelic/native-metrics", "npm:9.0.0"],\
["@standardnotes/domain-events", "workspace:packages/domain-events"],\
["@types/ioredis", "npm:4.28.10"],\
["@types/jest", "npm:29.1.1"],\
["@types/newrelic", "npm:7.0.3"],\
["@types/newrelic", "npm:7.0.4"],\
["@typescript-eslint/eslint-plugin", "virtual:fd909b174d079e30b336c4ce72c38a88c1e447767b1a8dd7655e07719a1e31b97807f0931368724fc78897ff15e6a6d00b83316c0f76d11f85111f342e08bb79#npm:5.30.5"],\
["aws-sdk", "npm:2.1234.0"],\
["eslint-plugin-prettier", "virtual:fd909b174d079e30b336c4ce72c38a88c1e447767b1a8dd7655e07719a1e31b97807f0931368724fc78897ff15e6a6d00b83316c0f76d11f85111f342e08bb79#npm:4.2.1"],\
["ioredis", "npm:5.2.3"],\
["jest", "virtual:fd909b174d079e30b336c4ce72c38a88c1e447767b1a8dd7655e07719a1e31b97807f0931368724fc78897ff15e6a6d00b83316c0f76d11f85111f342e08bb79#npm:29.1.2"],\
["newrelic", "npm:9.0.0"],\
["newrelic", "npm:9.6.0"],\
["reflect-metadata", "npm:0.1.13"],\
["sqs-consumer", "virtual:685a6222c3349423674bb7f0684ba34e2ab20912010f352e04dcf707a156e13183fc382e2417cb37a60f3e7b52fd0178c53181674890e1773eb83e190dc13378#npm:5.7.0"],\
["ts-jest", "virtual:fd909b174d079e30b336c4ce72c38a88c1e447767b1a8dd7655e07719a1e31b97807f0931368724fc78897ff15e6a6d00b83316c0f76d11f85111f342e08bb79#npm:29.0.3"],\
@@ -2801,12 +2808,13 @@ const RAW_RUNTIME_STATE =
"packageLocation": "./packages/event-store/",\
"packageDependencies": [\
["@standardnotes/event-store", "workspace:packages/event-store"],\
["@newrelic/native-metrics", "npm:9.0.0"],\
["@standardnotes/domain-events", "workspace:packages/domain-events"],\
["@standardnotes/domain-events-infra", "workspace:packages/domain-events-infra"],\
["@standardnotes/time", "workspace:packages/time"],\
["@types/ioredis", "npm:4.28.10"],\
["@types/jest", "npm:29.1.1"],\
["@types/newrelic", "npm:7.0.3"],\
["@types/newrelic", "npm:7.0.4"],\
["@types/nodemailer", "npm:6.4.6"],\
["@typescript-eslint/eslint-plugin", "virtual:04783e12400851b8a3d76e71495851cc94959db6e62f04cb0a31190080629440b182d8c8eb4d7f2b04e281912f2783a5fd4d2c3c6ab68d38b7097246c93f4c19#npm:5.40.1"],\
["aws-sdk", "npm:2.1234.0"],\
@@ -2817,7 +2825,7 @@ const RAW_RUNTIME_STATE =
["ioredis", "npm:5.2.3"],\
["jest", "virtual:fd909b174d079e30b336c4ce72c38a88c1e447767b1a8dd7655e07719a1e31b97807f0931368724fc78897ff15e6a6d00b83316c0f76d11f85111f342e08bb79#npm:29.1.2"],\
["mysql2", "npm:2.3.3"],\
["newrelic", "npm:9.0.0"],\
["newrelic", "npm:9.6.0"],\
["reflect-metadata", "npm:0.1.13"],\
["ts-jest", "virtual:fd909b174d079e30b336c4ce72c38a88c1e447767b1a8dd7655e07719a1e31b97807f0931368724fc78897ff15e6a6d00b83316c0f76d11f85111f342e08bb79#npm:29.0.3"],\
["typeorm", "virtual:c66bf20e88479ada0172094776519a9f51acc4731d22079b60a295bcec7ea42d5545cbce58a77a50d932bf953298799135e99707486e343da6d99ba1d167bdbd#npm:0.3.10"],\
@@ -2856,6 +2864,7 @@ const RAW_RUNTIME_STATE =
"packageLocation": "./packages/files/",\
"packageDependencies": [\
["@standardnotes/files-server", "workspace:packages/files"],\
["@newrelic/native-metrics", "npm:9.0.0"],\
["@sentry/node", "npm:7.5.0"],\
["@standardnotes/common", "workspace:packages/common"],\
["@standardnotes/config", "npm:2.4.3"],\
@@ -2871,7 +2880,7 @@ const RAW_RUNTIME_STATE =
["@types/ioredis", "npm:4.28.10"],\
["@types/jest", "npm:29.1.1"],\
["@types/jsonwebtoken", "npm:8.5.9"],\
["@types/newrelic", "npm:7.0.3"],\
["@types/newrelic", "npm:7.0.4"],\
["@types/prettyjson", "npm:0.0.30"],\
["@types/uuid", "npm:8.3.4"],\
["@typescript-eslint/eslint-plugin", "virtual:04783e12400851b8a3d76e71495851cc94959db6e62f04cb0a31190080629440b182d8c8eb4d7f2b04e281912f2783a5fd4d2c3c6ab68d38b7097246c93f4c19#npm:5.40.1"],\
@@ -2890,7 +2899,7 @@ const RAW_RUNTIME_STATE =
["ioredis", "npm:5.2.3"],\
["jest", "virtual:fd909b174d079e30b336c4ce72c38a88c1e447767b1a8dd7655e07719a1e31b97807f0931368724fc78897ff15e6a6d00b83316c0f76d11f85111f342e08bb79#npm:29.1.2"],\
["jsonwebtoken", "npm:8.5.1"],\
["newrelic", "npm:9.0.0"],\
["newrelic", "npm:9.6.0"],\
["nodemon", "npm:2.0.20"],\
["npm-check-updates", "npm:16.0.1"],\
["prettyjson", "npm:1.2.5"],\
@@ -2949,6 +2958,7 @@ const RAW_RUNTIME_STATE =
"packageLocation": "./packages/predicates/",\
"packageDependencies": [\
["@standardnotes/predicates", "workspace:packages/predicates"],\
["@newrelic/native-metrics", "npm:9.0.0"],\
["@standardnotes/common", "workspace:packages/common"],\
["@types/jest", "npm:29.1.1"],\
["@typescript-eslint/eslint-plugin", "virtual:fd909b174d079e30b336c4ce72c38a88c1e447767b1a8dd7655e07719a1e31b97807f0931368724fc78897ff15e6a6d00b83316c0f76d11f85111f342e08bb79#npm:5.30.5"],\
@@ -2990,6 +3000,7 @@ const RAW_RUNTIME_STATE =
"packageLocation": "./packages/scheduler/",\
"packageDependencies": [\
["@standardnotes/scheduler-server", "workspace:packages/scheduler"],\
["@newrelic/native-metrics", "npm:9.0.0"],\
["@newrelic/winston-enricher", "virtual:c66bf20e88479ada0172094776519a9f51acc4731d22079b60a295bcec7ea42d5545cbce58a77a50d932bf953298799135e99707486e343da6d99ba1d167bdbd#npm:4.0.0"],\
["@sentry/node", "npm:7.5.0"],\
["@standardnotes/common", "workspace:packages/common"],\
@@ -2999,7 +3010,7 @@ const RAW_RUNTIME_STATE =
["@standardnotes/time", "workspace:packages/time"],\
["@types/ioredis", "npm:4.28.10"],\
["@types/jest", "npm:29.1.1"],\
["@types/newrelic", "npm:7.0.3"],\
["@types/newrelic", "npm:7.0.4"],\
["@types/node", "npm:18.0.3"],\
["@typescript-eslint/eslint-plugin", "virtual:04783e12400851b8a3d76e71495851cc94959db6e62f04cb0a31190080629440b182d8c8eb4d7f2b04e281912f2783a5fd4d2c3c6ab68d38b7097246c93f4c19#npm:5.40.1"],\
["aws-sdk", "npm:2.1234.0"],\
@@ -3011,7 +3022,7 @@ const RAW_RUNTIME_STATE =
["ioredis", "npm:5.2.3"],\
["jest", "virtual:fd909b174d079e30b336c4ce72c38a88c1e447767b1a8dd7655e07719a1e31b97807f0931368724fc78897ff15e6a6d00b83316c0f76d11f85111f342e08bb79#npm:29.1.2"],\
["mysql2", "npm:2.3.3"],\
["newrelic", "npm:9.0.0"],\
["newrelic", "npm:9.6.0"],\
["npm-check-updates", "npm:16.0.1"],\
["reflect-metadata", "npm:0.1.13"],\
["ts-jest", "virtual:fd909b174d079e30b336c4ce72c38a88c1e447767b1a8dd7655e07719a1e31b97807f0931368724fc78897ff15e6a6d00b83316c0f76d11f85111f342e08bb79#npm:29.0.3"],\
@@ -3027,6 +3038,7 @@ const RAW_RUNTIME_STATE =
"packageLocation": "./packages/security/",\
"packageDependencies": [\
["@standardnotes/security", "workspace:packages/security"],\
["@newrelic/native-metrics", "npm:9.0.0"],\
["@standardnotes/common", "workspace:packages/common"],\
["@types/jest", "npm:29.1.1"],\
["@types/jsonwebtoken", "npm:8.5.9"],\
@@ -3051,15 +3063,16 @@ const RAW_RUNTIME_STATE =
["@lerna-lite/cli", "npm:1.6.0"],\
["@lerna-lite/list", "npm:1.6.0"],\
["@lerna-lite/run", "npm:1.6.0"],\
["@newrelic/native-metrics", "npm:9.0.0"],\
["@sentry/node", "npm:7.5.0"],\
["@types/jest", "npm:29.1.1"],\
["@types/newrelic", "npm:7.0.3"],\
["@types/newrelic", "npm:7.0.4"],\
["@types/node", "npm:18.0.3"],\
["@typescript-eslint/parser", "virtual:8859b278716fedf3e7458b5628625f7e35678c418626878559a0b816445001b7e24c55546f4677ba4c20b521aa0cf52cc33ac07deff171e383ada6eeab69933f#npm:5.40.1"],\
["eslint", "npm:8.19.0"],\
["eslint-config-prettier", "virtual:8859b278716fedf3e7458b5628625f7e35678c418626878559a0b816445001b7e24c55546f4677ba4c20b521aa0cf52cc33ac07deff171e383ada6eeab69933f#npm:8.5.0"],\
["ini", "npm:3.0.0"],\
["newrelic", "npm:9.0.0"],\
["newrelic", "npm:9.6.0"],\
["npm-check-updates", "npm:16.0.1"],\
["prettier", "npm:2.7.1"],\
["ts-node", "virtual:8859b278716fedf3e7458b5628625f7e35678c418626878559a0b816445001b7e24c55546f4677ba4c20b521aa0cf52cc33ac07deff171e383ada6eeab69933f#npm:10.9.1"],\
@@ -3073,6 +3086,7 @@ const RAW_RUNTIME_STATE =
"packageLocation": "./packages/settings/",\
"packageDependencies": [\
["@standardnotes/settings", "workspace:packages/settings"],\
["@newrelic/native-metrics", "npm:9.0.0"],\
["@typescript-eslint/eslint-plugin", "virtual:fd909b174d079e30b336c4ce72c38a88c1e447767b1a8dd7655e07719a1e31b97807f0931368724fc78897ff15e6a6d00b83316c0f76d11f85111f342e08bb79#npm:5.30.5"],\
["eslint-plugin-prettier", "virtual:fd909b174d079e30b336c4ce72c38a88c1e447767b1a8dd7655e07719a1e31b97807f0931368724fc78897ff15e6a6d00b83316c0f76d11f85111f342e08bb79#npm:4.2.1"],\
["reflect-metadata", "npm:0.1.13"],\
@@ -3096,6 +3110,7 @@ const RAW_RUNTIME_STATE =
"packageLocation": "./packages/sncrypto-node/",\
"packageDependencies": [\
["@standardnotes/sncrypto-node", "workspace:packages/sncrypto-node"],\
["@newrelic/native-metrics", "npm:9.0.0"],\
["@standardnotes/sncrypto-common", "npm:1.13.0"],\
["@types/jest", "npm:29.1.1"],\
["@types/node", "npm:18.0.3"],\
@@ -3116,6 +3131,7 @@ const RAW_RUNTIME_STATE =
"packageLocation": "./packages/syncing-server/",\
"packageDependencies": [\
["@standardnotes/syncing-server", "workspace:packages/syncing-server"],\
["@newrelic/native-metrics", "npm:9.0.0"],\
["@newrelic/winston-enricher", "virtual:c66bf20e88479ada0172094776519a9f51acc4731d22079b60a295bcec7ea42d5545cbce58a77a50d932bf953298799135e99707486e343da6d99ba1d167bdbd#npm:4.0.0"],\
["@sentry/node", "npm:7.5.0"],\
["@standardnotes/common", "workspace:packages/common"],\
@@ -3133,13 +3149,13 @@ const RAW_RUNTIME_STATE =
["@types/ioredis", "npm:4.28.10"],\
["@types/jest", "npm:29.1.1"],\
["@types/jsonwebtoken", "npm:8.5.9"],\
["@types/newrelic", "npm:7.0.3"],\
["@types/newrelic", "npm:7.0.4"],\
["@types/prettyjson", "npm:0.0.30"],\
["@types/ua-parser-js", "npm:0.7.36"],\
["@types/uuid", "npm:8.3.4"],\
["@typescript-eslint/eslint-plugin", "virtual:04783e12400851b8a3d76e71495851cc94959db6e62f04cb0a31190080629440b182d8c8eb4d7f2b04e281912f2783a5fd4d2c3c6ab68d38b7097246c93f4c19#npm:5.40.1"],\
["aws-sdk", "npm:2.1234.0"],\
["axios", "npm:0.27.2"],\
["axios", "npm:1.1.3"],\
["cors", "npm:2.8.5"],\
["dotenv", "npm:16.0.1"],\
["eslint", "npm:8.25.0"],\
@@ -3152,7 +3168,7 @@ const RAW_RUNTIME_STATE =
["jest", "virtual:fd909b174d079e30b336c4ce72c38a88c1e447767b1a8dd7655e07719a1e31b97807f0931368724fc78897ff15e6a6d00b83316c0f76d11f85111f342e08bb79#npm:29.1.2"],\
["jsonwebtoken", "npm:8.5.1"],\
["mysql2", "npm:2.3.3"],\
["newrelic", "npm:9.0.0"],\
["newrelic", "npm:9.6.0"],\
["nodemon", "npm:2.0.20"],\
["npm-check-updates", "npm:16.0.1"],\
["prettyjson", "npm:1.2.5"],\
@@ -3160,7 +3176,7 @@ const RAW_RUNTIME_STATE =
["ts-jest", "virtual:fd909b174d079e30b336c4ce72c38a88c1e447767b1a8dd7655e07719a1e31b97807f0931368724fc78897ff15e6a6d00b83316c0f76d11f85111f342e08bb79#npm:29.0.3"],\
["typeorm", "virtual:c66bf20e88479ada0172094776519a9f51acc4731d22079b60a295bcec7ea42d5545cbce58a77a50d932bf953298799135e99707486e343da6d99ba1d167bdbd#npm:0.3.10"],\
["typescript", "patch:typescript@npm%3A4.8.4#optional!builtin<compat/typescript>::version=4.8.4&hash=701156"],\
["ua-parser-js", "npm:1.0.2"],\
["ua-parser-js", "npm:1.0.32"],\
["uuid", "npm:9.0.0"],\
["winston", "npm:3.8.2"]\
],\
@@ -3172,6 +3188,7 @@ const RAW_RUNTIME_STATE =
"packageLocation": "./packages/time/",\
"packageDependencies": [\
["@standardnotes/time", "workspace:packages/time"],\
["@newrelic/native-metrics", "npm:9.0.0"],\
["@types/jest", "npm:29.1.1"],\
["@types/microtime", "npm:2.1.0"],\
["@typescript-eslint/eslint-plugin", "virtual:fd909b174d079e30b336c4ce72c38a88c1e447767b1a8dd7655e07719a1e31b97807f0931368724fc78897ff15e6a6d00b83316c0f76d11f85111f342e08bb79#npm:5.30.5"],\
@@ -3215,6 +3232,7 @@ const RAW_RUNTIME_STATE =
"packageLocation": "./packages/websockets/",\
"packageDependencies": [\
["@standardnotes/websockets-server", "workspace:packages/websockets"],\
["@newrelic/native-metrics", "npm:9.0.0"],\
["@newrelic/winston-enricher", "virtual:c66bf20e88479ada0172094776519a9f51acc4731d22079b60a295bcec7ea42d5545cbce58a77a50d932bf953298799135e99707486e343da6d99ba1d167bdbd#npm:4.0.0"],\
["@sentry/node", "npm:7.5.0"],\
["@standardnotes/api", "npm:1.19.0"],\
@@ -3226,10 +3244,10 @@ const RAW_RUNTIME_STATE =
["@types/express", "npm:4.17.14"],\
["@types/ioredis", "npm:4.28.10"],\
["@types/jest", "npm:29.1.1"],\
["@types/newrelic", "npm:7.0.3"],\
["@types/newrelic", "npm:7.0.4"],\
["@typescript-eslint/eslint-plugin", "virtual:04783e12400851b8a3d76e71495851cc94959db6e62f04cb0a31190080629440b182d8c8eb4d7f2b04e281912f2783a5fd4d2c3c6ab68d38b7097246c93f4c19#npm:5.40.1"],\
["aws-sdk", "npm:2.1234.0"],\
["axios", "npm:0.27.2"],\
["axios", "npm:1.1.3"],\
["cors", "npm:2.8.5"],\
["dotenv", "npm:16.0.1"],\
["eslint", "npm:8.25.0"],\
@@ -3240,7 +3258,7 @@ const RAW_RUNTIME_STATE =
["ioredis", "npm:5.2.3"],\
["jest", "virtual:fd909b174d079e30b336c4ce72c38a88c1e447767b1a8dd7655e07719a1e31b97807f0931368724fc78897ff15e6a6d00b83316c0f76d11f85111f342e08bb79#npm:29.1.2"],\
["mysql2", "npm:2.3.3"],\
["newrelic", "npm:9.0.0"],\
["newrelic", "npm:9.6.0"],\
["reflect-metadata", "npm:0.1.13"],\
["ts-jest", "virtual:fd909b174d079e30b336c4ce72c38a88c1e447767b1a8dd7655e07719a1e31b97807f0931368724fc78897ff15e6a6d00b83316c0f76d11f85111f342e08bb79#npm:29.0.3"],\
["typeorm", "virtual:c66bf20e88479ada0172094776519a9f51acc4731d22079b60a295bcec7ea42d5545cbce58a77a50d932bf953298799135e99707486e343da6d99ba1d167bdbd#npm:0.3.10"],\
@@ -3255,6 +3273,7 @@ const RAW_RUNTIME_STATE =
"packageLocation": "./packages/workspace/",\
"packageDependencies": [\
["@standardnotes/workspace-server", "workspace:packages/workspace"],\
["@newrelic/native-metrics", "npm:9.0.0"],\
["@newrelic/winston-enricher", "virtual:c66bf20e88479ada0172094776519a9f51acc4731d22079b60a295bcec7ea42d5545cbce58a77a50d932bf953298799135e99707486e343da6d99ba1d167bdbd#npm:4.0.0"],\
["@sentry/node", "npm:7.5.0"],\
["@standardnotes/api", "npm:1.19.0"],\
@@ -3268,7 +3287,7 @@ const RAW_RUNTIME_STATE =
["@types/express", "npm:4.17.14"],\
["@types/ioredis", "npm:4.28.10"],\
["@types/jest", "npm:29.1.1"],\
["@types/newrelic", "npm:7.0.3"],\
["@types/newrelic", "npm:7.0.4"],\
["@typescript-eslint/eslint-plugin", "virtual:04783e12400851b8a3d76e71495851cc94959db6e62f04cb0a31190080629440b182d8c8eb4d7f2b04e281912f2783a5fd4d2c3c6ab68d38b7097246c93f4c19#npm:5.40.1"],\
["aws-sdk", "npm:2.1234.0"],\
["cors", "npm:2.8.5"],\
@@ -3281,7 +3300,7 @@ const RAW_RUNTIME_STATE =
["ioredis", "npm:5.2.3"],\
["jest", "virtual:fd909b174d079e30b336c4ce72c38a88c1e447767b1a8dd7655e07719a1e31b97807f0931368724fc78897ff15e6a6d00b83316c0f76d11f85111f342e08bb79#npm:29.1.2"],\
["mysql2", "npm:2.3.3"],\
["newrelic", "npm:9.0.0"],\
["newrelic", "npm:9.6.0"],\
["reflect-metadata", "npm:0.1.13"],\
["ts-jest", "virtual:fd909b174d079e30b336c4ce72c38a88c1e447767b1a8dd7655e07719a1e31b97807f0931368724fc78897ff15e6a6d00b83316c0f76d11f85111f342e08bb79#npm:29.0.3"],\
["typeorm", "virtual:c66bf20e88479ada0172094776519a9f51acc4731d22079b60a295bcec7ea42d5545cbce58a77a50d932bf953298799135e99707486e343da6d99ba1d167bdbd#npm:0.3.10"],\
@@ -3663,10 +3682,10 @@ const RAW_RUNTIME_STATE =
}]\
]],\
["@types/newrelic", [\
["npm:7.0.3", {\
"packageLocation": "./.yarn/cache/@types-newrelic-npm-7.0.3-c49600c8f5-f56ebaa21c.zip/node_modules/@types/newrelic/",\
["npm:7.0.4", {\
"packageLocation": "./.yarn/cache/@types-newrelic-npm-7.0.4-4f0b179b51-b44215b3ab.zip/node_modules/@types/newrelic/",\
"packageDependencies": [\
["@types/newrelic", "npm:7.0.3"]\
["@types/newrelic", "npm:7.0.4"]\
],\
"linkType": "HARD"\
}]\
@@ -4749,12 +4768,13 @@ const RAW_RUNTIME_STATE =
}]\
]],\
["axios", [\
["npm:0.27.2", {\
"packageLocation": "./.yarn/cache/axios-npm-0.27.2-dbe3a48aea-4cd898afe9.zip/node_modules/axios/",\
["npm:1.1.3", {\
"packageLocation": "./.yarn/cache/axios-npm-1.1.3-4b63965ac1-2e28acd01c.zip/node_modules/axios/",\
"packageDependencies": [\
["axios", "npm:0.27.2"],\
["follow-redirects", "virtual:dbe3a48aea1dd5649e16abaf23d4ae05582d2149e16141955113766a0f84f681baf358c77ddccfc82eb23e4ccc66c6c912df62a9c01f2a83f1842bf86cc297b1#npm:1.15.2"],\
["form-data", "npm:4.0.0"]\
["axios", "npm:1.1.3"],\
["follow-redirects", "virtual:4b63965ac1b2157b91a1875529bea3b0bbc3068d3676d1bef28bff5cf6689705374a86cc3832f95ba8d934037a93cc0e09c3662c13ca0e747800d7ca279a53c0#npm:1.15.2"],\
["form-data", "npm:4.0.0"],\
["proxy-from-env", "npm:1.1.0"]\
],\
"linkType": "HARD"\
}]\
@@ -7299,10 +7319,10 @@ const RAW_RUNTIME_STATE =
],\
"linkType": "SOFT"\
}],\
["virtual:dbe3a48aea1dd5649e16abaf23d4ae05582d2149e16141955113766a0f84f681baf358c77ddccfc82eb23e4ccc66c6c912df62a9c01f2a83f1842bf86cc297b1#npm:1.15.2", {\
"packageLocation": "./.yarn/__virtual__/follow-redirects-virtual-42073a9d6a/0/cache/follow-redirects-npm-1.15.2-1ec1dd82be-930171f8b8.zip/node_modules/follow-redirects/",\
["virtual:4b63965ac1b2157b91a1875529bea3b0bbc3068d3676d1bef28bff5cf6689705374a86cc3832f95ba8d934037a93cc0e09c3662c13ca0e747800d7ca279a53c0#npm:1.15.2", {\
"packageLocation": "./.yarn/__virtual__/follow-redirects-virtual-b0bb08d690/0/cache/follow-redirects-npm-1.15.2-1ec1dd82be-930171f8b8.zip/node_modules/follow-redirects/",\
"packageDependencies": [\
["follow-redirects", "virtual:dbe3a48aea1dd5649e16abaf23d4ae05582d2149e16141955113766a0f84f681baf358c77ddccfc82eb23e4ccc66c6c912df62a9c01f2a83f1842bf86cc297b1#npm:1.15.2"],\
["follow-redirects", "virtual:4b63965ac1b2157b91a1875529bea3b0bbc3068d3676d1bef28bff5cf6689705374a86cc3832f95ba8d934037a93cc0e09c3662c13ca0e747800d7ca279a53c0#npm:1.15.2"],\
["@types/debug", null],\
["debug", null]\
],\
@@ -10375,18 +10395,17 @@ const RAW_RUNTIME_STATE =
}]\
]],\
["newrelic", [\
["npm:9.0.0", {\
"packageLocation": "./.yarn/cache/newrelic-npm-9.0.0-65e8703d5d-397f7d2626.zip/node_modules/newrelic/",\
["npm:9.6.0", {\
"packageLocation": "./.yarn/cache/newrelic-npm-9.6.0-f10080c2de-eb378acde1.zip/node_modules/newrelic/",\
"packageDependencies": [\
["newrelic", "npm:9.0.0"],\
["newrelic", "npm:9.6.0"],\
["@grpc/grpc-js", "npm:1.6.7"],\
["@grpc/proto-loader", "npm:0.6.13"],\
["@newrelic/aws-sdk", "virtual:65e8703d5df08d5ff3f7296fcb759f276254ee430ae6f3cc1f03da392ff63066a3c6c59591c38f36f19d3e877285287a834b5c55e22d764dc2cb0938f7128707#npm:5.0.0"],\
["@newrelic/koa", "virtual:65e8703d5df08d5ff3f7296fcb759f276254ee430ae6f3cc1f03da392ff63066a3c6c59591c38f36f19d3e877285287a834b5c55e22d764dc2cb0938f7128707#npm:7.0.0"],\
["@newrelic/aws-sdk", "virtual:f10080c2deb75096716a913b06010dcd94891c77539a757ab32210a1efc3ff91527b36d6c7c46e890db826160e0724553ca23acd0a8a734b5554c9600c71eb52#npm:5.0.0"],\
["@newrelic/koa", "virtual:f10080c2deb75096716a913b06010dcd94891c77539a757ab32210a1efc3ff91527b36d6c7c46e890db826160e0724553ca23acd0a8a734b5554c9600c71eb52#npm:7.0.0"],\
["@newrelic/native-metrics", "npm:9.0.0"],\
["@newrelic/superagent", "virtual:65e8703d5df08d5ff3f7296fcb759f276254ee430ae6f3cc1f03da392ff63066a3c6c59591c38f36f19d3e877285287a834b5c55e22d764dc2cb0938f7128707#npm:6.0.0"],\
["@newrelic/superagent", "virtual:f10080c2deb75096716a913b06010dcd94891c77539a757ab32210a1efc3ff91527b36d6c7c46e890db826160e0724553ca23acd0a8a734b5554c9600c71eb52#npm:6.0.0"],\
["@tyriar/fibonacci-heap", "npm:2.0.9"],\
["async", "npm:3.2.4"],\
["concat-stream", "npm:2.0.0"],\
["https-proxy-agent", "npm:5.0.1"],\
["json-stringify-safe", "npm:5.0.1"],\
@@ -11479,6 +11498,15 @@ const RAW_RUNTIME_STATE =
"linkType": "HARD"\
}]\
]],\
["proxy-from-env", [\
["npm:1.1.0", {\
"packageLocation": "./.yarn/cache/proxy-from-env-npm-1.1.0-c13d07f26b-0bba2ef7c8.zip/node_modules/proxy-from-env/",\
"packageDependencies": [\
["proxy-from-env", "npm:1.1.0"]\
],\
"linkType": "HARD"\
}]\
]],\
["pseudomap", [\
["npm:1.0.2", {\
"packageLocation": "./.yarn/cache/pseudomap-npm-1.0.2-0d0e40fee0-33cfbb99ac.zip/node_modules/pseudomap/",\
@@ -13484,10 +13512,10 @@ const RAW_RUNTIME_STATE =
}]\
]],\
["ua-parser-js", [\
["npm:1.0.2", {\
"packageLocation": "./.yarn/cache/ua-parser-js-npm-1.0.2-c3376785e2-5ee14b105c.zip/node_modules/ua-parser-js/",\
["npm:1.0.32", {\
"packageLocation": "./.yarn/cache/ua-parser-js-npm-1.0.32-95b0b6a78d-9d320c6742.zip/node_modules/ua-parser-js/",\
"packageDependencies": [\
["ua-parser-js", "npm:1.0.2"]\
["ua-parser-js", "npm:1.0.32"]\
],\
"linkType": "HARD"\
}]\
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
+3 -2
View File
@@ -46,7 +46,7 @@
"@lerna-lite/list": "^1.5.1",
"@lerna-lite/run": "^1.5.1",
"@types/jest": "^29.1.1",
"@types/newrelic": "^7.0.3",
"@types/newrelic": "^7.0.4",
"@types/node": "^18.0.0",
"@typescript-eslint/parser": "^5.40.1",
"eslint": "^8.17.0",
@@ -59,7 +59,8 @@
},
"packageManager": "yarn@4.0.0-rc.25",
"dependencies": {
"@newrelic/native-metrics": "^9.0.0",
"@sentry/node": "^7.3.0",
"newrelic": "^9.0.0"
"newrelic": "^9.6.0"
}
}
+64
View File
@@ -3,6 +3,70 @@
All notable changes to this project will be documented in this file.
See [Conventional Commits](https://conventionalcommits.org) for commit guidelines.
## [2.9.7](https://github.com/standardnotes/server/compare/@standardnotes/analytics@2.9.6...@standardnotes/analytics@2.9.7) (2022-11-14)
**Note:** Version bump only for package @standardnotes/analytics
## [2.9.6](https://github.com/standardnotes/server/compare/@standardnotes/analytics@2.9.5...@standardnotes/analytics@2.9.6) (2022-11-14)
**Note:** Version bump only for package @standardnotes/analytics
## [2.9.5](https://github.com/standardnotes/server/compare/@standardnotes/analytics@2.9.4...@standardnotes/analytics@2.9.5) (2022-11-11)
**Note:** Version bump only for package @standardnotes/analytics
## [2.9.4](https://github.com/standardnotes/server/compare/@standardnotes/analytics@2.9.3...@standardnotes/analytics@2.9.4) (2022-11-11)
**Note:** Version bump only for package @standardnotes/analytics
## [2.9.3](https://github.com/standardnotes/server/compare/@standardnotes/analytics@2.9.2...@standardnotes/analytics@2.9.3) (2022-11-10)
### Bug Fixes
* **analytics:** add five year plans mrr calculation ([a03c5bc](https://github.com/standardnotes/server/commit/a03c5bceea2a9b166b1d5ad75181021462a86627))
## [2.9.2](https://github.com/standardnotes/server/compare/@standardnotes/analytics@2.9.1...@standardnotes/analytics@2.9.2) (2022-11-10)
### Bug Fixes
* **analytics:** add missing period for stats report ([9b593f2](https://github.com/standardnotes/server/commit/9b593f2a6b105ab8f9c7cef8bdda6892c42e20ef))
## [2.9.1](https://github.com/standardnotes/server/compare/@standardnotes/analytics@2.9.0...@standardnotes/analytics@2.9.1) (2022-11-10)
### Bug Fixes
* **analytics:** generate mrr stats for last 30 days including Today ([b92c4ae](https://github.com/standardnotes/server/commit/b92c4ae650b53db5c0bb2a9cf9afb01caeb8d822))
# [2.9.0](https://github.com/standardnotes/server/compare/@standardnotes/analytics@2.8.3...@standardnotes/analytics@2.9.0) (2022-11-10)
### Features
* **analytics:** add mrr for annual, monthly, pro and plus subscription plans ([ce3e259](https://github.com/standardnotes/server/commit/ce3e259bdedd10796fb4469f0eabd64bc326a115))
## [2.8.3](https://github.com/standardnotes/server/compare/@standardnotes/analytics@2.8.2...@standardnotes/analytics@2.8.3) (2022-11-10)
### Bug Fixes
* **analytics:** add subscription id to error logs ([81be065](https://github.com/standardnotes/server/commit/81be06598c918279f98a8ba6b59ea1b3803c949c))
## [2.8.2](https://github.com/standardnotes/server/compare/@standardnotes/analytics@2.8.1...@standardnotes/analytics@2.8.2) (2022-11-10)
### Bug Fixes
* **analytics:** add monthly mrr to the report ([fce47a0](https://github.com/standardnotes/server/commit/fce47a0a37a67b3edf3ea0b6ccda43c54dbd9870))
## [2.8.1](https://github.com/standardnotes/server/compare/@standardnotes/analytics@2.8.0...@standardnotes/analytics@2.8.1) (2022-11-10)
### Bug Fixes
* **analytics:** add persisting mrr for this month and this year as well ([8df0482](https://github.com/standardnotes/server/commit/8df0482eb4bfd63b9639fd786c9b6952ad7f801d))
# [2.8.0](https://github.com/standardnotes/server/compare/@standardnotes/analytics@2.7.3...@standardnotes/analytics@2.8.0) (2022-11-10)
### Features
* **analytics:** add calculating monthly recurring revenue ([77e5065](https://github.com/standardnotes/server/commit/77e50655f6fa7f9c28e13f8b8bc6de246c0454f0))
## [2.7.3](https://github.com/standardnotes/server/compare/@standardnotes/analytics@2.7.2...@standardnotes/analytics@2.7.3) (2022-11-10)
### Bug Fixes
+50 -5
View File
@@ -15,6 +15,7 @@ import { ContainerConfigLoader } from '../src/Bootstrap/Container'
import TYPES from '../src/Bootstrap/Types'
import { Env } from '../src/Bootstrap/Env'
import { DomainEventFactoryInterface } from '../src/Domain/Event/DomainEventFactoryInterface'
import { CalculateMonthlyRecurringRevenue } from '../src/Domain/UseCase/CalculateMonthlyRecurringRevenue/CalculateMonthlyRecurringRevenue'
const requestReport = async (
analyticsStore: AnalyticsStoreInterface,
@@ -22,7 +23,10 @@ const requestReport = async (
domainEventFactory: DomainEventFactoryInterface,
domainEventPublisher: DomainEventPublisherInterface,
periodKeyGenerator: PeriodKeyGeneratorInterface,
calculateMonthlyRecurringRevenue: CalculateMonthlyRecurringRevenue,
): Promise<void> => {
await calculateMonthlyRecurringRevenue.execute({})
const analyticsOverTime: Array<{
name: string
period: number
@@ -96,6 +100,40 @@ const requestReport = async (
})
}
const statisticsOverTime: Array<{
name: string
period: number
counts: Array<{
periodKey: string
totalCount: number
}>
}> = []
const thirtyDaysStatisticsNames = [
StatisticsMeasure.MRR,
StatisticsMeasure.AnnualPlansMRR,
StatisticsMeasure.MonthlyPlansMRR,
StatisticsMeasure.FiveYearPlansMRR,
StatisticsMeasure.PlusPlansMRR,
StatisticsMeasure.ProPlansMRR,
]
for (const statisticName of thirtyDaysStatisticsNames) {
statisticsOverTime.push({
name: statisticName,
period: Period.Last30DaysIncludingToday,
counts: await statisticsStore.calculateTotalCountOverPeriod(statisticName, Period.Last30DaysIncludingToday),
})
}
const monthlyStatisticsNames = [StatisticsMeasure.MRR]
for (const statisticName of monthlyStatisticsNames) {
statisticsOverTime.push({
name: statisticName,
period: Period.ThisYear,
counts: await statisticsStore.calculateTotalCountOverPeriod(statisticName, Period.ThisYear),
})
}
const statisticMeasureNames = [
StatisticsMeasure.Income,
StatisticsMeasure.PlusSubscriptionInitialAnnualPaymentsIncome,
@@ -170,13 +208,10 @@ const requestReport = async (
}
const event = domainEventFactory.createDailyAnalyticsReportGeneratedEvent({
applicationStatistics: await statisticsStore.getYesterdayApplicationUsage(),
snjsStatistics: await statisticsStore.getYesterdaySNJSUsage(),
outOfSyncIncidents: await statisticsStore.getYesterdayOutOfSyncIncidents(),
activityStatistics: yesterdayActivityStatistics,
activityStatisticsOverTime: analyticsOverTime,
statisticsOverTime,
statisticMeasures,
retentionStatistics: [],
churn: {
periodKeys: monthlyPeriodKeys,
values: churnRates,
@@ -200,9 +235,19 @@ void container.load().then((container) => {
const domainEventFactory: DomainEventFactoryInterface = container.get(TYPES.DomainEventFactory)
const domainEventPublisher: DomainEventPublisherInterface = container.get(TYPES.DomainEventPublisher)
const periodKeyGenerator: PeriodKeyGeneratorInterface = container.get(TYPES.PeriodKeyGenerator)
const calculateMonthlyRecurringRevenue: CalculateMonthlyRecurringRevenue = container.get(
TYPES.CalculateMonthlyRecurringRevenue,
)
Promise.resolve(
requestReport(analyticsStore, statisticsStore, domainEventFactory, domainEventPublisher, periodKeyGenerator),
requestReport(
analyticsStore,
statisticsStore,
domainEventFactory,
domainEventPublisher,
periodKeyGenerator,
calculateMonthlyRecurringRevenue,
),
)
.then(() => {
logger.info('Usage report generation complete')
+4 -3
View File
@@ -1,6 +1,6 @@
{
"name": "@standardnotes/analytics",
"version": "2.7.3",
"version": "2.9.7",
"engines": {
"node": ">=14.0.0 <17.0.0"
},
@@ -27,7 +27,7 @@
"devDependencies": {
"@types/ioredis": "^4.28.10",
"@types/jest": "^29.1.1",
"@types/newrelic": "^7.0.3",
"@types/newrelic": "^7.0.4",
"@types/node": "^18.0.0",
"@types/uuid": "^8.3.0",
"@typescript-eslint/eslint-plugin": "^5.30.0",
@@ -38,6 +38,7 @@
"typescript": "^4.8.4"
},
"dependencies": {
"@newrelic/native-metrics": "^9.0.0",
"@newrelic/winston-enricher": "^4.0.0",
"@sentry/node": "^7.3.0",
"@standardnotes/common": "workspace:*",
@@ -50,7 +51,7 @@
"inversify": "^6.0.1",
"ioredis": "^5.2.3",
"mysql2": "^2.3.3",
"newrelic": "^9.0.0",
"newrelic": "^9.6.0",
"reflect-metadata": "^0.1.13",
"shallow-equal-object": "^1.1.1",
"typeorm": "^0.3.6",
@@ -51,6 +51,7 @@ import { MapInterface } from '../Domain/Map/MapInterface'
import { RevenueModification } from '../Domain/Revenue/RevenueModification'
import { RevenueModificationMap } from '../Domain/Map/RevenueModificationMap'
import { SaveRevenueModification } from '../Domain/UseCase/SaveRevenueModification/SaveRevenueModification'
import { CalculateMonthlyRecurringRevenue } from '../Domain/UseCase/CalculateMonthlyRecurringRevenue/CalculateMonthlyRecurringRevenue'
// eslint-disable-next-line @typescript-eslint/no-var-requires
const newrelicFormatter = require('@newrelic/winston-enricher')
@@ -138,6 +139,9 @@ export class ContainerConfigLoader {
// Use Case
container.bind<GetUserAnalyticsId>(TYPES.GetUserAnalyticsId).to(GetUserAnalyticsId)
container.bind<SaveRevenueModification>(TYPES.SaveRevenueModification).to(SaveRevenueModification)
container
.bind<CalculateMonthlyRecurringRevenue>(TYPES.CalculateMonthlyRecurringRevenue)
.to(CalculateMonthlyRecurringRevenue)
// Hanlders
container.bind<UserRegisteredEventHandler>(TYPES.UserRegisteredEventHandler).to(UserRegisteredEventHandler)
@@ -20,6 +20,7 @@ const TYPES = {
// Use Case
GetUserAnalyticsId: Symbol.for('GetUserAnalyticsId'),
SaveRevenueModification: Symbol.for('SaveRevenueModification'),
CalculateMonthlyRecurringRevenue: Symbol.for('CalculateMonthlyRecurringRevenue'),
// Handlers
UserRegisteredEventHandler: Symbol.for('UserRegisteredEventHandler'),
AccountDeletionRequestedEventHandler: Symbol.for('AccountDeletionRequestedEventHandler'),
@@ -22,18 +22,6 @@ describe('DomainEventFactory', () => {
it('should create a DAILY_ANALYTICS_REPORT_GENERATED event', () => {
expect(
createFactory().createDailyAnalyticsReportGeneratedEvent({
snjsStatistics: [
{
version: '1-2-3',
count: 2,
},
],
applicationStatistics: [
{
version: '2-3-4',
count: 45,
},
],
activityStatistics: [
{
name: AnalyticsActivity.Register,
@@ -63,8 +51,18 @@ describe('DomainEventFactory', () => {
totalCount: 123,
},
],
outOfSyncIncidents: 324,
retentionStatistics: [],
statisticsOverTime: [
{
name: StatisticsMeasure.MRR,
period: Period.Last30Days,
counts: [
{
periodKey: '2022-10-9',
totalCount: 3,
},
],
},
],
churn: {
periodKeys: ['2022-10-9'],
values: [
@@ -105,10 +103,16 @@ describe('DomainEventFactory', () => {
totalCount: 123,
},
],
applicationStatistics: [
statisticsOverTime: [
{
count: 45,
version: '2-3-4',
counts: [
{
periodKey: '2022-10-9',
totalCount: 3,
},
],
name: 'mrr',
period: 9,
},
],
churn: {
@@ -120,14 +124,6 @@ describe('DomainEventFactory', () => {
},
],
},
outOfSyncIncidents: 324,
retentionStatistics: [],
snjsStatistics: [
{
count: 2,
version: '1-2-3',
},
],
statisticMeasures: [
{
average: 23,
@@ -9,14 +9,6 @@ export class DomainEventFactory implements DomainEventFactoryInterface {
constructor(@inject(TYPES.Timer) private timer: TimerInterface) {}
createDailyAnalyticsReportGeneratedEvent(dto: {
snjsStatistics: Array<{
version: string
count: number
}>
applicationStatistics: Array<{
version: string
count: number
}>
activityStatistics: Array<{
name: string
retention: number
@@ -38,18 +30,13 @@ export class DomainEventFactory implements DomainEventFactoryInterface {
}>
totalCount: number
}>
outOfSyncIncidents: number
retentionStatistics: Array<{
firstActivity: string
secondActivity: string
retention: {
periodKeys: Array<string>
values: Array<{
firstPeriodKey: string
secondPeriodKey: string
value: number
}>
}
statisticsOverTime: Array<{
name: string
period: number
counts: Array<{
periodKey: string
totalCount: number
}>
}>
churn: {
periodKeys: Array<string>
@@ -2,14 +2,6 @@ import { DailyAnalyticsReportGeneratedEvent } from '@standardnotes/domain-events
export interface DomainEventFactoryInterface {
createDailyAnalyticsReportGeneratedEvent(dto: {
snjsStatistics: Array<{
version: string
count: number
}>
applicationStatistics: Array<{
version: string
count: number
}>
activityStatistics: Array<{
name: string
retention: number
@@ -31,18 +23,13 @@ export interface DomainEventFactoryInterface {
}>
totalCount: number
}>
outOfSyncIncidents: number
retentionStatistics: Array<{
firstActivity: string
secondActivity: string
retention: {
periodKeys: Array<string>
values: Array<{
firstPeriodKey: string
secondPeriodKey: string
value: number
}>
}
statisticsOverTime: Array<{
name: string
period: number
counts: Array<{
periodKey: string
totalCount: number
}>
}>
churn: {
periodKeys: Array<string>
@@ -46,7 +46,9 @@ export class SubscriptionCancelledEventHandler implements DomainEventHandlerInte
})
if (result.isFailed()) {
this.logger.error(`[${event.type}] Could not save revenue modification: ${result.getError()}`)
this.logger.error(
`[${event.type}][${event.payload.subscriptionId}] Could not save revenue modification: ${result.getError()}`,
)
}
}
@@ -50,7 +50,9 @@ export class SubscriptionExpiredEventHandler implements DomainEventHandlerInterf
})
if (result.isFailed()) {
this.logger.error(`[${event.type}] Could not save revenue modification: ${result.getError()}`)
this.logger.error(
`[${event.type}][${event.payload.subscriptionId}] Could not save revenue modification: ${result.getError()}`,
)
}
}
}
@@ -74,7 +74,9 @@ export class SubscriptionPurchasedEventHandler implements DomainEventHandlerInte
})
if (result.isFailed()) {
this.logger.error(`[${event.type}] Could not save revenue modification: ${result.getError()}`)
this.logger.error(
`[${event.type}][${event.payload.subscriptionId}] Could not save revenue modification: ${result.getError()}`,
)
}
}
}
@@ -46,7 +46,9 @@ export class SubscriptionRefundedEventHandler implements DomainEventHandlerInter
})
if (result.isFailed()) {
this.logger.error(`[${event.type}] Could not save revenue modification: ${result.getError()}`)
this.logger.error(
`[${event.type}][${event.payload.subscriptionId}] Could not save revenue modification: ${result.getError()}`,
)
}
}
@@ -46,7 +46,9 @@ export class SubscriptionRenewedEventHandler implements DomainEventHandlerInterf
})
if (result.isFailed()) {
this.logger.error(`[${event.type}] Could not save revenue modification: ${result.getError()}`)
this.logger.error(
`[${event.type}][${event.payload.subscriptionId}] Could not save revenue modification: ${result.getError()}`,
)
}
}
}
@@ -3,5 +3,6 @@ import { RevenueModification } from './RevenueModification'
export interface RevenueModificationRepositoryInterface {
findLastByUserUuid(userUuid: Uuid): Promise<RevenueModification | null>
sumMRRDiff(dto: { planName?: string; billingFrequency?: number }): Promise<number>
save(revenueModification: RevenueModification): Promise<RevenueModification>
}
@@ -15,4 +15,10 @@ export enum StatisticsMeasure {
Refunds = 'refunds',
NewCustomers = 'new-customers',
TotalCustomers = 'total-customers',
MRR = 'mrr',
MonthlyPlansMRR = 'monthly-plans-mrr',
AnnualPlansMRR = 'annual-plans-mrr',
FiveYearPlansMRR = 'five-year-plans-mrr',
ProPlansMRR = 'pro-plans-mrr',
PlusPlansMRR = 'plus-plans-mrr',
}
@@ -13,4 +13,8 @@ export interface StatisticsStoreInterface {
getMeasureAverage(measure: StatisticsMeasure, period: Period): Promise<number>
getMeasureTotal(measure: StatisticsMeasure, periodOrPeriodKey: Period | string): Promise<number>
getMeasureIncrementCounts(measure: StatisticsMeasure, period: Period): Promise<number>
calculateTotalCountOverPeriod(
measure: StatisticsMeasure,
period: Period,
): Promise<Array<{ periodKey: string; totalCount: number }>>
}
@@ -26,4 +26,5 @@ export enum Period {
OctoberThisYear,
NovemberThisYear,
DecemberThisYear,
Last30DaysIncludingToday,
}
@@ -62,6 +62,41 @@ describe('PeriodKeyGenerator', () => {
])
})
it('should generate period keys for last 30 days including Today', () => {
expect(createGenerator().getDiscretePeriodKeys(Period.Last30DaysIncludingToday)).toEqual([
'2022-4-25',
'2022-4-26',
'2022-4-27',
'2022-4-28',
'2022-4-29',
'2022-4-30',
'2022-5-1',
'2022-5-2',
'2022-5-3',
'2022-5-4',
'2022-5-5',
'2022-5-6',
'2022-5-7',
'2022-5-8',
'2022-5-9',
'2022-5-10',
'2022-5-11',
'2022-5-12',
'2022-5-13',
'2022-5-14',
'2022-5-15',
'2022-5-16',
'2022-5-17',
'2022-5-18',
'2022-5-19',
'2022-5-20',
'2022-5-21',
'2022-5-22',
'2022-5-23',
'2022-5-24',
])
})
it('should generate period keys for this year', () => {
expect(createGenerator().getDiscretePeriodKeys(Period.ThisYear)).toEqual([
'2022-1',
@@ -33,6 +33,12 @@ export class PeriodKeyGenerator implements PeriodKeyGeneratorInterface {
periodKeys.unshift(this.getDailyKey(this.getDateNDaysBefore(i)))
}
return periodKeys
case Period.Last30DaysIncludingToday:
for (let i = 0; i <= 29; i++) {
periodKeys.unshift(this.getDailyKey(this.getDateNDaysBefore(i)))
}
return periodKeys
case Period.Last7Days:
for (let i = 1; i <= 7; i++) {
@@ -0,0 +1,33 @@
import 'reflect-metadata'
import { RevenueModificationRepositoryInterface } from '../../Revenue/RevenueModificationRepositoryInterface'
import { StatisticsMeasure } from '../../Statistics/StatisticsMeasure'
import { StatisticsStoreInterface } from '../../Statistics/StatisticsStoreInterface'
import { Period } from '../../Time/Period'
import { CalculateMonthlyRecurringRevenue } from './CalculateMonthlyRecurringRevenue'
describe('CalculateMonthlyRecurringRevenue', () => {
let revenueModificationRepository: RevenueModificationRepositoryInterface
let statisticsStore: StatisticsStoreInterface
const createUseCase = () => new CalculateMonthlyRecurringRevenue(revenueModificationRepository, statisticsStore)
beforeEach(() => {
revenueModificationRepository = {} as jest.Mocked<RevenueModificationRepositoryInterface>
revenueModificationRepository.sumMRRDiff = jest.fn().mockReturnValue(123.45)
statisticsStore = {} as jest.Mocked<StatisticsStoreInterface>
statisticsStore.setMeasure = jest.fn()
})
it('should calculate the MRR diff and persist it as a statistic', async () => {
await createUseCase().execute({})
expect(statisticsStore.setMeasure).toHaveBeenCalledWith(StatisticsMeasure.MRR, 123.45, [
Period.Today,
Period.ThisMonth,
Period.ThisYear,
])
})
})
@@ -0,0 +1,82 @@
import { SubscriptionBillingFrequency, SubscriptionName } from '@standardnotes/common'
import { inject, injectable } from 'inversify'
import TYPES from '../../../Bootstrap/Types'
import { Result } from '../../Core/Result'
import { MonthlyRevenue } from '../../Revenue/MonthlyRevenue'
import { RevenueModificationRepositoryInterface } from '../../Revenue/RevenueModificationRepositoryInterface'
import { StatisticsMeasure } from '../../Statistics/StatisticsMeasure'
import { StatisticsStoreInterface } from '../../Statistics/StatisticsStoreInterface'
import { Period } from '../../Time/Period'
import { DomainUseCaseInterface } from '../DomainUseCaseInterface'
import { CalculateMonthlyRecurringRevenueDTO } from './CalculateMonthlyRecurringRevenueDTO'
@injectable()
export class CalculateMonthlyRecurringRevenue implements DomainUseCaseInterface<MonthlyRevenue> {
constructor(
@inject(TYPES.RevenueModificationRepository)
private revenueModificationRepository: RevenueModificationRepositoryInterface,
@inject(TYPES.StatisticsStore) private statisticsStore: StatisticsStoreInterface,
) {}
async execute(_dto: CalculateMonthlyRecurringRevenueDTO): Promise<Result<MonthlyRevenue>> {
const mrrDiff = await this.revenueModificationRepository.sumMRRDiff({})
await this.statisticsStore.setMeasure(StatisticsMeasure.MRR, mrrDiff, [
Period.Today,
Period.ThisMonth,
Period.ThisYear,
])
const monthlyPlansMrrDiff = await this.revenueModificationRepository.sumMRRDiff({
billingFrequency: SubscriptionBillingFrequency.Monthly,
})
await this.statisticsStore.setMeasure(StatisticsMeasure.MonthlyPlansMRR, monthlyPlansMrrDiff, [
Period.Today,
Period.ThisMonth,
Period.ThisYear,
])
const annualPlansMrrDiff = await this.revenueModificationRepository.sumMRRDiff({
billingFrequency: SubscriptionBillingFrequency.Annual,
})
await this.statisticsStore.setMeasure(StatisticsMeasure.AnnualPlansMRR, annualPlansMrrDiff, [
Period.Today,
Period.ThisMonth,
Period.ThisYear,
])
const fiveYearPlansMrrDiff = await this.revenueModificationRepository.sumMRRDiff({
billingFrequency: SubscriptionBillingFrequency.FiveYear,
})
await this.statisticsStore.setMeasure(StatisticsMeasure.FiveYearPlansMRR, fiveYearPlansMrrDiff, [
Period.Today,
Period.ThisMonth,
Period.ThisYear,
])
const proPlansMrrDiff = await this.revenueModificationRepository.sumMRRDiff({
planName: SubscriptionName.ProPlan,
})
await this.statisticsStore.setMeasure(StatisticsMeasure.ProPlansMRR, proPlansMrrDiff, [
Period.Today,
Period.ThisMonth,
Period.ThisYear,
])
const plusPlansMrrDiff = await this.revenueModificationRepository.sumMRRDiff({
planName: SubscriptionName.PlusPlan,
})
await this.statisticsStore.setMeasure(StatisticsMeasure.PlusPlansMRR, plusPlansMrrDiff, [
Period.Today,
Period.ThisMonth,
Period.ThisYear,
])
return MonthlyRevenue.create(mrrDiff)
}
}
@@ -0,0 +1,2 @@
/* eslint-disable @typescript-eslint/no-empty-interface */
export interface CalculateMonthlyRecurringRevenueDTO {}
@@ -17,6 +17,25 @@ export class MySQLRevenueModificationRepository implements RevenueModificationRe
private revenueModificationMap: MapInterface<RevenueModification, TypeORMRevenueModification>,
) {}
async sumMRRDiff(dto: { planName?: string; billingFrequency?: number }): Promise<number> {
const query = this.ormRepository.createQueryBuilder().select('sum(new_mrr - previous_mrr)', 'mrrDiff')
if (dto.planName !== undefined) {
query.where('subscription_plan = :planName', { planName: dto.planName })
}
if (dto.billingFrequency !== undefined) {
query.where('billing_frequency = :billingFrequency', { billingFrequency: dto.billingFrequency })
}
const result = await query.getRawOne()
if (result === undefined) {
return 0
}
return +(+result.mrrDiff).toFixed(2)
}
async findLastByUserUuid(userUuid: Uuid): Promise<RevenueModification | null> {
const persistence = await this.ormRepository
.createQueryBuilder()
@@ -1,209 +0,0 @@
import * as IORedis from 'ioredis'
import { AnalyticsActivity } from '../../Domain/Analytics/AnalyticsActivity'
import { Period } from '../../Domain/Time/Period'
import { PeriodKeyGeneratorInterface } from '../../Domain/Time/PeriodKeyGeneratorInterface'
import { RedisAnalyticsStore } from './RedisAnalyticsStore'
describe('RedisAnalyticsStore', () => {
let redisClient: IORedis.Redis
let pipeline: IORedis.Pipeline
let periodKeyGenerator: PeriodKeyGeneratorInterface
const createStore = () => new RedisAnalyticsStore(periodKeyGenerator, redisClient)
beforeEach(() => {
pipeline = {} as jest.Mocked<IORedis.Pipeline>
pipeline.incr = jest.fn()
pipeline.setbit = jest.fn()
pipeline.exec = jest.fn()
redisClient = {} as jest.Mocked<IORedis.Redis>
redisClient.pipeline = jest.fn().mockReturnValue(pipeline)
redisClient.incr = jest.fn()
redisClient.setbit = jest.fn()
redisClient.getbit = jest.fn().mockReturnValue(1)
redisClient.bitop = jest.fn()
redisClient.expire = jest.fn()
periodKeyGenerator = {} as jest.Mocked<PeriodKeyGeneratorInterface>
periodKeyGenerator.getPeriodKey = jest.fn().mockReturnValue('period-key')
})
it('should calculate total count over time of activities', async () => {
redisClient.bitcount = jest.fn().mockReturnValue(70)
periodKeyGenerator.getDiscretePeriodKeys = jest.fn().mockReturnValue(['2022-4-24', '2022-4-25', '2022-4-26'])
await createStore().calculateActivityTotalCountOverTime(AnalyticsActivity.Register, Period.Last30Days)
expect(redisClient.bitop).toHaveBeenCalledTimes(1)
expect(redisClient.bitop).toHaveBeenNthCalledWith(
1,
'OR',
'bitmap:action:register:timespan:2022-4-24-2022-4-26',
'bitmap:action:register:timespan:2022-4-24',
'bitmap:action:register:timespan:2022-4-25',
'bitmap:action:register:timespan:2022-4-26',
)
expect(redisClient.bitcount).toHaveBeenCalledWith('bitmap:action:register:timespan:2022-4-24-2022-4-26')
})
it('should not calculate total count over time of activities if period is unsupported', async () => {
let caughtError = null
try {
await createStore().calculateActivityTotalCountOverTime(AnalyticsActivity.Register, Period.LastWeek)
} catch (error) {
caughtError = error
}
expect(caughtError).not.toBeNull()
})
it('should calculate total count changes of activities', async () => {
periodKeyGenerator.getDiscretePeriodKeys = jest.fn().mockReturnValue(['2022-4-24', '2022-4-25', '2022-4-26'])
redisClient.bitcount = jest.fn().mockReturnValueOnce(70).mockReturnValueOnce(71).mockReturnValueOnce(72)
expect(
await createStore().calculateActivityChangesTotalCount(AnalyticsActivity.Register, Period.Last30Days),
).toEqual([
{
periodKey: '2022-4-24',
totalCount: 70,
},
{
periodKey: '2022-4-25',
totalCount: 71,
},
{
periodKey: '2022-4-26',
totalCount: 72,
},
])
expect(redisClient.bitcount).toHaveBeenNthCalledWith(1, 'bitmap:action:register:timespan:2022-4-24')
expect(redisClient.bitcount).toHaveBeenNthCalledWith(2, 'bitmap:action:register:timespan:2022-4-25')
expect(redisClient.bitcount).toHaveBeenNthCalledWith(3, 'bitmap:action:register:timespan:2022-4-26')
})
it('should throw error on calculating total count changes of activities on unsupported period', async () => {
periodKeyGenerator.getDiscretePeriodKeys = jest.fn().mockReturnValue(['2022-4-24', '2022-4-25', '2022-4-26'])
redisClient.bitcount = jest.fn().mockReturnValueOnce(70).mockReturnValueOnce(71).mockReturnValueOnce(72)
let caughtError = null
try {
await createStore().calculateActivityChangesTotalCount(AnalyticsActivity.Register, Period.LastWeek)
} catch (error) {
caughtError = error
}
expect(caughtError).not.toBeNull()
})
it('should calculate total count of activities by period', async () => {
redisClient.bitcount = jest.fn().mockReturnValue(70)
expect(await createStore().calculateActivityTotalCount(AnalyticsActivity.Register, Period.Yesterday)).toEqual(70)
expect(redisClient.bitcount).toHaveBeenCalledWith('bitmap:action:register:timespan:period-key')
})
it('should calculate total count of activities by period key', async () => {
redisClient.bitcount = jest.fn().mockReturnValue(70)
expect(await createStore().calculateActivityTotalCount(AnalyticsActivity.Register, '2022-10-03')).toEqual(70)
expect(redisClient.bitcount).toHaveBeenCalledWith('bitmap:action:register:timespan:2022-10-03')
})
it('should calculate activity retention', async () => {
redisClient.bitcount = jest.fn().mockReturnValueOnce(7).mockReturnValueOnce(10)
expect(
await createStore().calculateActivityRetention(
AnalyticsActivity.Register,
Period.DayBeforeYesterday,
Period.Yesterday,
),
).toEqual(70)
expect(redisClient.bitop).toHaveBeenCalledWith(
'AND',
'bitmap:action:register-register:timespan:period-key',
'bitmap:action:register:timespan:period-key',
'bitmap:action:register:timespan:period-key',
)
})
it('shoud tell if activity was done', async () => {
await createStore().wasActivityDone(AnalyticsActivity.Register, 123, Period.Yesterday)
expect(redisClient.getbit).toHaveBeenCalledWith('bitmap:action:register:timespan:period-key', 123)
})
it('should mark activity as done', async () => {
await createStore().markActivity([AnalyticsActivity.Register], 123, [Period.Today])
expect(pipeline.setbit).toBeCalledTimes(1)
expect(pipeline.setbit).toHaveBeenNthCalledWith(1, 'bitmap:action:register:timespan:period-key', 123, 1)
expect(pipeline.exec).toHaveBeenCalled()
})
it('should mark activities as done', async () => {
await createStore().markActivity([AnalyticsActivity.Register, AnalyticsActivity.SubscriptionPurchased], 123, [
Period.Today,
Period.ThisWeek,
])
expect(pipeline.setbit).toBeCalledTimes(4)
expect(pipeline.setbit).toHaveBeenNthCalledWith(1, 'bitmap:action:register:timespan:period-key', 123, 1)
expect(pipeline.setbit).toHaveBeenNthCalledWith(2, 'bitmap:action:register:timespan:period-key', 123, 1)
expect(pipeline.setbit).toHaveBeenNthCalledWith(
3,
'bitmap:action:subscription-purchased:timespan:period-key',
123,
1,
)
expect(pipeline.setbit).toHaveBeenNthCalledWith(
4,
'bitmap:action:subscription-purchased:timespan:period-key',
123,
1,
)
expect(pipeline.exec).toHaveBeenCalled()
})
it('should unmark activity as done', async () => {
await createStore().unmarkActivity([AnalyticsActivity.Register], 123, [Period.Today])
expect(pipeline.setbit).toBeCalledTimes(1)
expect(pipeline.setbit).toHaveBeenNthCalledWith(1, 'bitmap:action:register:timespan:period-key', 123, 0)
expect(pipeline.exec).toHaveBeenCalled()
})
it('should unmark activities as done', async () => {
await createStore().unmarkActivity([AnalyticsActivity.Register, AnalyticsActivity.SubscriptionPurchased], 123, [
Period.Today,
Period.ThisWeek,
])
expect(pipeline.setbit).toBeCalledTimes(4)
expect(pipeline.setbit).toHaveBeenNthCalledWith(1, 'bitmap:action:register:timespan:period-key', 123, 0)
expect(pipeline.setbit).toHaveBeenNthCalledWith(2, 'bitmap:action:register:timespan:period-key', 123, 0)
expect(pipeline.setbit).toHaveBeenNthCalledWith(
3,
'bitmap:action:subscription-purchased:timespan:period-key',
123,
0,
)
expect(pipeline.setbit).toHaveBeenNthCalledWith(
4,
'bitmap:action:subscription-purchased:timespan:period-key',
123,
0,
)
expect(pipeline.exec).toHaveBeenCalled()
})
})
@@ -1,145 +0,0 @@
import * as IORedis from 'ioredis'
import { StatisticsMeasure } from '../../Domain/Statistics/StatisticsMeasure'
import { Period } from '../../Domain/Time/Period'
import { PeriodKeyGeneratorInterface } from '../../Domain/Time/PeriodKeyGeneratorInterface'
import { RedisStatisticsStore } from './RedisStatisticsStore'
describe('RedisStatisticsStore', () => {
let redisClient: IORedis.Redis
let periodKeyGenerator: PeriodKeyGeneratorInterface
let pipeline: IORedis.Pipeline
const createStore = () => new RedisStatisticsStore(periodKeyGenerator, redisClient)
beforeEach(() => {
pipeline = {} as jest.Mocked<IORedis.Pipeline>
pipeline.incr = jest.fn()
pipeline.incrbyfloat = jest.fn()
pipeline.set = jest.fn()
pipeline.setbit = jest.fn()
pipeline.exec = jest.fn()
redisClient = {} as jest.Mocked<IORedis.Redis>
redisClient.pipeline = jest.fn().mockReturnValue(pipeline)
redisClient.incr = jest.fn()
redisClient.setbit = jest.fn()
redisClient.getbit = jest.fn().mockReturnValue(1)
periodKeyGenerator = {} as jest.Mocked<PeriodKeyGeneratorInterface>
periodKeyGenerator.getPeriodKey = jest.fn().mockReturnValue('period-key')
})
it('should get yesterday out of sync incidents', async () => {
redisClient.get = jest.fn().mockReturnValue(1)
expect(await createStore().getYesterdayOutOfSyncIncidents()).toEqual(1)
})
it('should default to 0 yesterday out of sync incidents', async () => {
redisClient.get = jest.fn().mockReturnValue(null)
expect(await createStore().getYesterdayOutOfSyncIncidents()).toEqual(0)
})
it('should get yesterday application version usage', async () => {
redisClient.keys = jest
.fn()
.mockReturnValue([
'count:action:application-request:1.2.3:timespan:2022-3-10',
'count:action:application-request:2.3.4:timespan:2022-3-10',
])
redisClient.get = jest.fn().mockReturnValueOnce(3).mockReturnValueOnce(4)
expect(await createStore().getYesterdayApplicationUsage()).toEqual([
{ count: 3, version: '1.2.3' },
{ count: 4, version: '2.3.4' },
])
})
it('should get yesterday snjs version usage', async () => {
redisClient.keys = jest
.fn()
.mockReturnValue([
'count:action:snjs-request:1.2.3:timespan:2022-3-10',
'count:action:snjs-request:2.3.4:timespan:2022-3-10',
])
redisClient.get = jest.fn().mockReturnValueOnce(3).mockReturnValueOnce(4)
expect(await createStore().getYesterdaySNJSUsage()).toEqual([
{ count: 3, version: '1.2.3' },
{ count: 4, version: '2.3.4' },
])
})
it('should increment application version usage', async () => {
await createStore().incrementApplicationVersionUsage('1.2.3')
expect(pipeline.incr).toHaveBeenCalled()
expect(pipeline.exec).toHaveBeenCalled()
})
it('should increment snjs version usage', async () => {
await createStore().incrementSNJSVersionUsage('1.2.3')
expect(pipeline.incr).toHaveBeenCalled()
expect(pipeline.exec).toHaveBeenCalled()
})
it('should increment out of sync incedent count', async () => {
await createStore().incrementOutOfSyncIncidents()
expect(pipeline.incr).toHaveBeenCalled()
expect(pipeline.exec).toHaveBeenCalled()
})
it('should set a value to a measure', async () => {
await createStore().setMeasure(StatisticsMeasure.Income, 2, [Period.Today, Period.ThisMonth])
expect(pipeline.set).toHaveBeenCalledTimes(2)
expect(pipeline.exec).toHaveBeenCalled()
})
it('should increment measure by a value', async () => {
await createStore().incrementMeasure(StatisticsMeasure.Income, 2, [Period.Today, Period.ThisMonth])
expect(pipeline.incr).toHaveBeenCalledTimes(2)
expect(pipeline.incrbyfloat).toHaveBeenCalledTimes(2)
expect(pipeline.exec).toHaveBeenCalled()
})
it('should count a measurement average', async () => {
redisClient.get = jest.fn().mockReturnValueOnce('5').mockReturnValueOnce('2')
expect(await createStore().getMeasureAverage(StatisticsMeasure.Income, Period.Today)).toEqual(2 / 5)
})
it('should count a measurement average - 0 increments', async () => {
redisClient.get = jest.fn().mockReturnValueOnce(null).mockReturnValueOnce(null)
expect(await createStore().getMeasureAverage(StatisticsMeasure.Income, Period.Today)).toEqual(0)
})
it('should count a measurement average - 0 total value', async () => {
redisClient.get = jest.fn().mockReturnValueOnce(5).mockReturnValueOnce(null)
expect(await createStore().getMeasureAverage(StatisticsMeasure.Income, Period.Today)).toEqual(0)
})
it('should retrieve a measurement total for period', async () => {
redisClient.get = jest.fn().mockReturnValueOnce(5)
expect(await createStore().getMeasureTotal(StatisticsMeasure.Income, Period.Today)).toEqual(5)
expect(redisClient.get).toHaveBeenCalledWith('count:measure:income:timespan:period-key')
})
it('should retrieve a measurement total for period key', async () => {
redisClient.get = jest.fn().mockReturnValueOnce(5)
expect(await createStore().getMeasureTotal(StatisticsMeasure.Income, '2022-10-03')).toEqual(5)
expect(redisClient.get).toHaveBeenCalledWith('count:measure:income:timespan:2022-10-03')
})
})
@@ -9,6 +9,35 @@ import { PeriodKeyGeneratorInterface } from '../../Domain/Time/PeriodKeyGenerato
export class RedisStatisticsStore implements StatisticsStoreInterface {
constructor(private periodKeyGenerator: PeriodKeyGeneratorInterface, private redisClient: IORedis.Redis) {}
async calculateTotalCountOverPeriod(
measure: StatisticsMeasure,
period: Period,
): Promise<{ periodKey: string; totalCount: number }[]> {
if (
![
Period.Last30Days,
Period.Last30DaysIncludingToday,
Period.ThisYear,
Period.Q1ThisYear,
Period.Q2ThisYear,
Period.Q3ThisYear,
Period.Q4ThisYear,
].includes(period)
) {
throw new Error(`Unsuporrted period: ${period}`)
}
const periodKeys = this.periodKeyGenerator.getDiscretePeriodKeys(period)
const counts = []
for (const periodKey of periodKeys) {
counts.push({
periodKey,
totalCount: await this.getMeasureTotal(measure, periodKey),
})
}
return counts
}
async getMeasureIncrementCounts(measure: StatisticsMeasure, period: Period): Promise<number> {
const increments = await this.redisClient.get(
`count:increments:${measure}:timespan:${this.periodKeyGenerator.getPeriodKey(period)}`,
+40
View File
@@ -3,6 +3,46 @@
All notable changes to this project will be documented in this file.
See [Conventional Commits](https://conventionalcommits.org) for commit guidelines.
## [1.38.2](https://github.com/standardnotes/api-gateway/compare/@standardnotes/api-gateway@1.38.1...@standardnotes/api-gateway@1.38.2) (2022-11-14)
**Note:** Version bump only for package @standardnotes/api-gateway
## [1.38.1](https://github.com/standardnotes/api-gateway/compare/@standardnotes/api-gateway@1.38.0...@standardnotes/api-gateway@1.38.1) (2022-11-14)
**Note:** Version bump only for package @standardnotes/api-gateway
# [1.38.0](https://github.com/standardnotes/api-gateway/compare/@standardnotes/api-gateway@1.37.11...@standardnotes/api-gateway@1.38.0) (2022-11-13)
### Features
* iap confirm endpoint ([#338](https://github.com/standardnotes/api-gateway/issues/338)) ([3bba367](https://github.com/standardnotes/api-gateway/commit/3bba36742ac00c8756dd69f3a81ea124538d5cbe))
## [1.37.11](https://github.com/standardnotes/api-gateway/compare/@standardnotes/api-gateway@1.37.10...@standardnotes/api-gateway@1.37.11) (2022-11-11)
**Note:** Version bump only for package @standardnotes/api-gateway
## [1.37.10](https://github.com/standardnotes/api-gateway/compare/@standardnotes/api-gateway@1.37.9...@standardnotes/api-gateway@1.37.10) (2022-11-11)
**Note:** Version bump only for package @standardnotes/api-gateway
## [1.37.9](https://github.com/standardnotes/api-gateway/compare/@standardnotes/api-gateway@1.37.8...@standardnotes/api-gateway@1.37.9) (2022-11-10)
**Note:** Version bump only for package @standardnotes/api-gateway
## [1.37.8](https://github.com/standardnotes/api-gateway/compare/@standardnotes/api-gateway@1.37.7...@standardnotes/api-gateway@1.37.8) (2022-11-10)
**Note:** Version bump only for package @standardnotes/api-gateway
## [1.37.7](https://github.com/standardnotes/api-gateway/compare/@standardnotes/api-gateway@1.37.6...@standardnotes/api-gateway@1.37.7) (2022-11-10)
### Bug Fixes
* **api-gateway:** setting headers ([3c2ac05](https://github.com/standardnotes/api-gateway/commit/3c2ac05c606371305b76dd368d5fe9287045f380))
## [1.37.6](https://github.com/standardnotes/api-gateway/compare/@standardnotes/api-gateway@1.37.5...@standardnotes/api-gateway@1.37.6) (2022-11-10)
**Note:** Version bump only for package @standardnotes/api-gateway
## [1.37.5](https://github.com/standardnotes/api-gateway/compare/@standardnotes/api-gateway@1.37.4...@standardnotes/api-gateway@1.37.5) (2022-11-09)
**Note:** Version bump only for package @standardnotes/api-gateway
+5 -4
View File
@@ -1,6 +1,6 @@
{
"name": "@standardnotes/api-gateway",
"version": "1.37.5",
"version": "1.38.2",
"engines": {
"node": ">=16.0.0 <17.0.0"
},
@@ -20,6 +20,7 @@
"upgrade:snjs": "yarn ncu -u '@standardnotes/*'"
},
"dependencies": {
"@newrelic/native-metrics": "^9.0.0",
"@newrelic/winston-enricher": "^4.0.0",
"@sentry/node": "^7.3.0",
"@standardnotes/common": "workspace:^",
@@ -28,7 +29,7 @@
"@standardnotes/security": "workspace:*",
"@standardnotes/time": "workspace:*",
"aws-sdk": "^2.1160.0",
"axios": "^0.27.2",
"axios": "^1.1.3",
"cors": "2.8.5",
"dotenv": "^16.0.1",
"express": "^4.18.1",
@@ -37,7 +38,7 @@
"inversify-express-utils": "^6.4.3",
"ioredis": "^5.2.0",
"jsonwebtoken": "8.5.1",
"newrelic": "^9.0.0",
"newrelic": "^9.6.0",
"prettyjson": "^1.2.5",
"reflect-metadata": "0.1.13",
"winston": "^3.8.1"
@@ -48,7 +49,7 @@
"@types/ioredis": "^4.28.10",
"@types/jest": "^29.1.1",
"@types/jsonwebtoken": "^8.5.0",
"@types/newrelic": "^7.0.3",
"@types/newrelic": "^7.0.4",
"@types/prettyjson": "^0.0.30",
"@typescript-eslint/eslint-plugin": "^5.29.0",
"eslint": "^8.14.0",
@@ -1,5 +1,7 @@
import * as winston from 'winston'
import axios, { AxiosInstance } from 'axios'
// eslint-disable-next-line @typescript-eslint/no-var-requires
const axios = require('axios')
import { AxiosInstance } from 'axios'
import Redis from 'ioredis'
import { Container } from 'inversify'
import { Timer, TimerInterface } from '@standardnotes/time'
@@ -60,7 +60,7 @@ export class AuthMiddleware extends BaseMiddleware {
})
if (authResponse.status > 200) {
response.setHeader('content-type', authResponse.headers['content-type'])
response.setHeader('content-type', authResponse.headers['content-type'] as string)
response.status(authResponse.status).send(authResponse.data)
return
@@ -20,7 +20,8 @@ export class SubscriptionTokenAuthMiddleware extends BaseMiddleware {
}
async handler(request: Request, response: Response, next: NextFunction): Promise<void> {
const subscriptionToken = request.query.subscription_token
const subscriptionToken = request.query.subscription_token || request.body.subscription_token
const email = request.headers['x-offline-email']
if (!subscriptionToken) {
response.status(401).send({
@@ -58,7 +59,7 @@ export class SubscriptionTokenAuthMiddleware extends BaseMiddleware {
})
if (authResponse.status > 200) {
response.setHeader('content-type', authResponse.headers['content-type'])
response.setHeader('content-type', authResponse.headers['content-type'] as string)
response.status(authResponse.status).send(authResponse.data)
return
@@ -48,7 +48,7 @@ export class WebSocketAuthMiddleware extends BaseMiddleware {
})
if (authResponse.status > 200) {
response.setHeader('content-type', authResponse.headers['content-type'])
response.setHeader('content-type', authResponse.headers['content-type'] as string)
response.status(authResponse.status).send(authResponse.data)
return
@@ -45,6 +45,11 @@ export class PaymentsController extends BaseHttpController {
await this.httpService.callPaymentsServer(request, response, 'api/subscriptions/tiered', request.body)
}
@httpPost('/subscriptions/apple_iap_confirm', TYPES.SubscriptionTokenAuthMiddleware)
async appleIAPConfirm(request: Request, response: Response): Promise<void> {
await this.httpService.callPaymentsServer(request, response, 'api/subscriptions/apple_iap_confirm', request.body)
}
@all('/subscriptions(/*)?')
async subscriptions(request: Request, response: Response): Promise<void> {
await this.httpService.callPaymentsServer(request, response, request.path.replace('v1', 'api'), request.body)
+32
View File
@@ -3,6 +3,38 @@
All notable changes to this project will be documented in this file.
See [Conventional Commits](https://conventionalcommits.org) for commit guidelines.
## [1.59.8](https://github.com/standardnotes/server/compare/@standardnotes/auth-server@1.59.7...@standardnotes/auth-server@1.59.8) (2022-11-14)
**Note:** Version bump only for package @standardnotes/auth-server
## [1.59.7](https://github.com/standardnotes/server/compare/@standardnotes/auth-server@1.59.6...@standardnotes/auth-server@1.59.7) (2022-11-14)
**Note:** Version bump only for package @standardnotes/auth-server
## [1.59.6](https://github.com/standardnotes/server/compare/@standardnotes/auth-server@1.59.5...@standardnotes/auth-server@1.59.6) (2022-11-11)
**Note:** Version bump only for package @standardnotes/auth-server
## [1.59.5](https://github.com/standardnotes/server/compare/@standardnotes/auth-server@1.59.4...@standardnotes/auth-server@1.59.5) (2022-11-11)
**Note:** Version bump only for package @standardnotes/auth-server
## [1.59.4](https://github.com/standardnotes/server/compare/@standardnotes/auth-server@1.59.3...@standardnotes/auth-server@1.59.4) (2022-11-10)
**Note:** Version bump only for package @standardnotes/auth-server
## [1.59.3](https://github.com/standardnotes/server/compare/@standardnotes/auth-server@1.59.2...@standardnotes/auth-server@1.59.3) (2022-11-10)
**Note:** Version bump only for package @standardnotes/auth-server
## [1.59.2](https://github.com/standardnotes/server/compare/@standardnotes/auth-server@1.59.1...@standardnotes/auth-server@1.59.2) (2022-11-10)
**Note:** Version bump only for package @standardnotes/auth-server
## [1.59.1](https://github.com/standardnotes/server/compare/@standardnotes/auth-server@1.59.0...@standardnotes/auth-server@1.59.1) (2022-11-10)
**Note:** Version bump only for package @standardnotes/auth-server
# [1.59.0](https://github.com/standardnotes/server/compare/@standardnotes/auth-server@1.58.0...@standardnotes/auth-server@1.59.0) (2022-11-09)
### Features
+6 -5
View File
@@ -1,6 +1,6 @@
{
"name": "@standardnotes/auth-server",
"version": "1.59.0",
"version": "1.59.8",
"engines": {
"node": ">=16.0.0 <17.0.0"
},
@@ -30,6 +30,7 @@
"upgrade:snjs": "yarn ncu -u '@standardnotes/*'"
},
"dependencies": {
"@newrelic/native-metrics": "^9.0.0",
"@newrelic/winston-enricher": "^4.0.0",
"@sentry/node": "^7.3.0",
"@standardnotes/api": "^1.19.0",
@@ -45,7 +46,7 @@
"@standardnotes/sncrypto-node": "workspace:*",
"@standardnotes/time": "workspace:*",
"aws-sdk": "^2.1159.0",
"axios": "^0.27.2",
"axios": "^1.1.3",
"bcryptjs": "2.4.3",
"cors": "2.8.5",
"dayjs": "^1.11.6",
@@ -55,12 +56,12 @@
"inversify-express-utils": "^6.4.3",
"ioredis": "^5.2.0",
"mysql2": "^2.3.3",
"newrelic": "^9.0.0",
"newrelic": "^9.6.0",
"otplib": "12.0.1",
"prettyjson": "^1.2.5",
"reflect-metadata": "0.1.13",
"typeorm": "^0.3.6",
"ua-parser-js": "1.0.2",
"ua-parser-js": "^1.0.32",
"uuid": "^9.0.0",
"winston": "^3.8.1"
},
@@ -70,7 +71,7 @@
"@types/express": "^4.17.11",
"@types/ioredis": "^4.28.10",
"@types/jest": "^29.1.1",
"@types/newrelic": "^7.0.3",
"@types/newrelic": "^7.0.4",
"@types/otplib": "^10.0.0",
"@types/prettyjson": "^0.0.30",
"@types/ua-parser-js": "^0.7.36",
+3 -1
View File
@@ -72,7 +72,9 @@ import { DeleteAccount } from '../Domain/UseCase/DeleteAccount/DeleteAccount'
import { DeleteSetting } from '../Domain/UseCase/DeleteSetting/DeleteSetting'
import { SettingFactory } from '../Domain/Setting/SettingFactory'
import { SettingService } from '../Domain/Setting/SettingService'
import axios, { AxiosInstance } from 'axios'
// eslint-disable-next-line @typescript-eslint/no-var-requires
const axios = require('axios')
import { AxiosInstance } from 'axios'
import { UserSubscription } from '../Domain/Subscription/UserSubscription'
import { MySQLUserSubscriptionRepository } from '../Infra/MySQL/MySQLUserSubscriptionRepository'
import { WebSocketsClientService } from '../Infra/WebSockets/WebSocketsClientService'
+10
View File
@@ -3,6 +3,16 @@
All notable changes to this project will be documented in this file.
See [Conventional Commits](https://conventionalcommits.org) for commit guidelines.
## [1.44.2](https://github.com/standardnotes/server/compare/@standardnotes/common@1.44.1...@standardnotes/common@1.44.2) (2022-11-14)
**Note:** Version bump only for package @standardnotes/common
## [1.44.1](https://github.com/standardnotes/server/compare/@standardnotes/common@1.44.0...@standardnotes/common@1.44.1) (2022-11-10)
### Bug Fixes
* **analytics:** add five year plans mrr calculation ([a03c5bc](https://github.com/standardnotes/server/commit/a03c5bceea2a9b166b1d5ad75181021462a86627))
# [1.44.0](https://github.com/standardnotes/server/compare/@standardnotes/common@1.43.0...@standardnotes/common@1.44.0) (2022-11-03)
### Features
+2 -1
View File
@@ -1,6 +1,6 @@
{
"name": "@standardnotes/common",
"version": "1.44.0",
"version": "1.44.2",
"engines": {
"node": ">=16.0.0 <17.0.0"
},
@@ -32,6 +32,7 @@
"typescript": "^4.8.4"
},
"dependencies": {
"@newrelic/native-metrics": "^9.0.0",
"reflect-metadata": "^0.1.13"
}
}
@@ -2,4 +2,5 @@
export enum SubscriptionBillingFrequency {
Monthly = 1,
Annual = 12,
FiveYear = 60,
}
+24
View File
@@ -3,6 +3,30 @@
All notable changes to this project will be documented in this file.
See [Conventional Commits](https://conventionalcommits.org) for commit guidelines.
## [1.9.24](https://github.com/standardnotes/server/compare/@standardnotes/domain-events-infra@1.9.23...@standardnotes/domain-events-infra@1.9.24) (2022-11-14)
**Note:** Version bump only for package @standardnotes/domain-events-infra
## [1.9.23](https://github.com/standardnotes/server/compare/@standardnotes/domain-events-infra@1.9.22...@standardnotes/domain-events-infra@1.9.23) (2022-11-14)
**Note:** Version bump only for package @standardnotes/domain-events-infra
## [1.9.22](https://github.com/standardnotes/server/compare/@standardnotes/domain-events-infra@1.9.21...@standardnotes/domain-events-infra@1.9.22) (2022-11-11)
**Note:** Version bump only for package @standardnotes/domain-events-infra
## [1.9.21](https://github.com/standardnotes/server/compare/@standardnotes/domain-events-infra@1.9.20...@standardnotes/domain-events-infra@1.9.21) (2022-11-11)
**Note:** Version bump only for package @standardnotes/domain-events-infra
## [1.9.20](https://github.com/standardnotes/server/compare/@standardnotes/domain-events-infra@1.9.19...@standardnotes/domain-events-infra@1.9.20) (2022-11-10)
**Note:** Version bump only for package @standardnotes/domain-events-infra
## [1.9.19](https://github.com/standardnotes/server/compare/@standardnotes/domain-events-infra@1.9.18...@standardnotes/domain-events-infra@1.9.19) (2022-11-10)
**Note:** Version bump only for package @standardnotes/domain-events-infra
## [1.9.18](https://github.com/standardnotes/server/compare/@standardnotes/domain-events-infra@1.9.17...@standardnotes/domain-events-infra@1.9.18) (2022-11-09)
**Note:** Version bump only for package @standardnotes/domain-events-infra
+4 -3
View File
@@ -1,6 +1,6 @@
{
"name": "@standardnotes/domain-events-infra",
"version": "1.9.18",
"version": "1.9.24",
"engines": {
"node": ">=16.0.0 <17.0.0"
},
@@ -23,10 +23,11 @@
"test": "jest spec --coverage"
},
"dependencies": {
"@newrelic/native-metrics": "^9.0.0",
"@standardnotes/domain-events": "workspace:*",
"aws-sdk": "^2.1082.0",
"ioredis": "^5.2.0",
"newrelic": "^9.0.0",
"newrelic": "^9.6.0",
"reflect-metadata": "^0.1.13",
"sqs-consumer": "^5.6.0",
"winston": "^3.8.1"
@@ -34,7 +35,7 @@
"devDependencies": {
"@types/ioredis": "^4.28.10",
"@types/jest": "^29.1.1",
"@types/newrelic": "^7.0.3",
"@types/newrelic": "^7.0.4",
"@typescript-eslint/eslint-plugin": "^5.30.0",
"eslint-plugin-prettier": "^4.2.1",
"jest": "^29.1.2",
+26
View File
@@ -3,6 +3,32 @@
All notable changes to this project will be documented in this file.
See [Conventional Commits](https://conventionalcommits.org) for commit guidelines.
## [2.86.1](https://github.com/standardnotes/server/compare/@standardnotes/domain-events@2.86.0...@standardnotes/domain-events@2.86.1) (2022-11-14)
**Note:** Version bump only for package @standardnotes/domain-events
# [2.86.0](https://github.com/standardnotes/server/compare/@standardnotes/domain-events@2.85.0...@standardnotes/domain-events@2.86.0) (2022-11-11)
### Features
* **syncing-server:** add item content size recalculation ([1a13861](https://github.com/standardnotes/server/commit/1a138616478a646d76404c425800937d2049a226))
# [2.85.0](https://github.com/standardnotes/server/compare/@standardnotes/domain-events@2.84.1...@standardnotes/domain-events@2.85.0) (2022-11-11)
### Features
* **domain-events:** add user content size recalculation requested event ([36ec39d](https://github.com/standardnotes/server/commit/36ec39d2fb5caec5952d820bb0d5d08d825a770c))
## [2.84.1](https://github.com/standardnotes/server/compare/@standardnotes/domain-events@2.84.0...@standardnotes/domain-events@2.84.1) (2022-11-10)
**Note:** Version bump only for package @standardnotes/domain-events
# [2.84.0](https://github.com/standardnotes/server/compare/@standardnotes/domain-events@2.83.0...@standardnotes/domain-events@2.84.0) (2022-11-10)
### Features
* **analytics:** add calculating monthly recurring revenue ([77e5065](https://github.com/standardnotes/server/commit/77e50655f6fa7f9c28e13f8b8bc6de246c0454f0))
# [2.83.0](https://github.com/standardnotes/server/compare/@standardnotes/domain-events@2.82.0...@standardnotes/domain-events@2.83.0) (2022-11-09)
### Features
+2 -1
View File
@@ -1,6 +1,6 @@
{
"name": "@standardnotes/domain-events",
"version": "2.83.0",
"version": "2.86.1",
"engines": {
"node": ">=16.0.0 <17.0.0"
},
@@ -23,6 +23,7 @@
"test": "jest spec --coverage --passWithNoTests"
},
"dependencies": {
"@newrelic/native-metrics": "^9.0.0",
"@standardnotes/common": "workspace:*",
"@standardnotes/features": "^1.52.1",
"@standardnotes/predicates": "workspace:*",
@@ -1,12 +1,4 @@
export interface DailyAnalyticsReportGeneratedEventPayload {
snjsStatistics: Array<{
version: string
count: number
}>
applicationStatistics: Array<{
version: string
count: number
}>
activityStatistics: Array<{
name: string
retention: number
@@ -28,18 +20,13 @@ export interface DailyAnalyticsReportGeneratedEventPayload {
}>
totalCount: number
}>
outOfSyncIncidents: number
retentionStatistics: Array<{
firstActivity: string
secondActivity: string
retention: {
periodKeys: Array<string>
values: Array<{
firstPeriodKey: string
secondPeriodKey: string
value: number
}>
}
statisticsOverTime: Array<{
name: string
period: number
counts: Array<{
periodKey: string
totalCount: number
}>
}>
churn: {
periodKeys: Array<string>
@@ -0,0 +1,7 @@
import { DomainEventInterface } from './DomainEventInterface'
import { UserContentSizeRecalculationRequestedEventPayload } from './UserContentSizeRecalculationRequestedEventPayload'
export interface UserContentSizeRecalculationRequestedEvent extends DomainEventInterface {
type: 'USER_CONTENT_SIZE_RECALCULATION_REQUESTED'
payload: UserContentSizeRecalculationRequestedEventPayload
}
@@ -0,0 +1,5 @@
import { Uuid } from '@standardnotes/common'
export interface UserContentSizeRecalculationRequestedEventPayload {
userUuid: Uuid
}
@@ -98,6 +98,8 @@ export * from './Event/SubscriptionRevertRequestedEvent'
export * from './Event/SubscriptionRevertRequestedEventPayload'
export * from './Event/SubscriptionSyncRequestedEvent'
export * from './Event/SubscriptionSyncRequestedEventPayload'
export * from './Event/UserContentSizeRecalculationRequestedEvent'
export * from './Event/UserContentSizeRecalculationRequestedEventPayload'
export * from './Event/UserDisabledSessionUserAgentLoggingEvent'
export * from './Event/UserDisabledSessionUserAgentLoggingEventPayload'
export * from './Event/UserEmailChangedEvent'
+24
View File
@@ -3,6 +3,30 @@
All notable changes to this project will be documented in this file.
See [Conventional Commits](https://conventionalcommits.org) for commit guidelines.
## [1.6.19](https://github.com/standardnotes/server/compare/@standardnotes/event-store@1.6.18...@standardnotes/event-store@1.6.19) (2022-11-14)
**Note:** Version bump only for package @standardnotes/event-store
## [1.6.18](https://github.com/standardnotes/server/compare/@standardnotes/event-store@1.6.17...@standardnotes/event-store@1.6.18) (2022-11-14)
**Note:** Version bump only for package @standardnotes/event-store
## [1.6.17](https://github.com/standardnotes/server/compare/@standardnotes/event-store@1.6.16...@standardnotes/event-store@1.6.17) (2022-11-11)
**Note:** Version bump only for package @standardnotes/event-store
## [1.6.16](https://github.com/standardnotes/server/compare/@standardnotes/event-store@1.6.15...@standardnotes/event-store@1.6.16) (2022-11-11)
**Note:** Version bump only for package @standardnotes/event-store
## [1.6.15](https://github.com/standardnotes/server/compare/@standardnotes/event-store@1.6.14...@standardnotes/event-store@1.6.15) (2022-11-10)
**Note:** Version bump only for package @standardnotes/event-store
## [1.6.14](https://github.com/standardnotes/server/compare/@standardnotes/event-store@1.6.13...@standardnotes/event-store@1.6.14) (2022-11-10)
**Note:** Version bump only for package @standardnotes/event-store
## [1.6.13](https://github.com/standardnotes/server/compare/@standardnotes/event-store@1.6.12...@standardnotes/event-store@1.6.13) (2022-11-09)
**Note:** Version bump only for package @standardnotes/event-store
+4 -3
View File
@@ -1,6 +1,6 @@
{
"name": "@standardnotes/event-store",
"version": "1.6.13",
"version": "1.6.19",
"description": "Event Store Service",
"private": true,
"main": "dist/src/index.js",
@@ -21,7 +21,7 @@
"devDependencies": {
"@types/ioredis": "^4.28.10",
"@types/jest": "^29.1.1",
"@types/newrelic": "^7.0.3",
"@types/newrelic": "^7.0.4",
"@types/nodemailer": "^6.4.1",
"@typescript-eslint/eslint-plugin": "^5.40.1",
"eslint": "^8.14.0",
@@ -31,6 +31,7 @@
"typescript": "^4.8.4"
},
"dependencies": {
"@newrelic/native-metrics": "^9.0.0",
"@standardnotes/domain-events": "workspace:*",
"@standardnotes/domain-events-infra": "workspace:*",
"@standardnotes/time": "workspace:*",
@@ -39,7 +40,7 @@
"inversify": "^6.0.1",
"ioredis": "^5.2.0",
"mysql2": "^2.3.3",
"newrelic": "^9.0.0",
"newrelic": "^9.6.0",
"reflect-metadata": "0.1.13",
"typeorm": "^0.3.6",
"winston": "^3.8.1"
+24
View File
@@ -3,6 +3,30 @@
All notable changes to this project will be documented in this file.
See [Conventional Commits](https://conventionalcommits.org) for commit guidelines.
## [1.8.19](https://github.com/standardnotes/files/compare/@standardnotes/files-server@1.8.18...@standardnotes/files-server@1.8.19) (2022-11-14)
**Note:** Version bump only for package @standardnotes/files-server
## [1.8.18](https://github.com/standardnotes/files/compare/@standardnotes/files-server@1.8.17...@standardnotes/files-server@1.8.18) (2022-11-14)
**Note:** Version bump only for package @standardnotes/files-server
## [1.8.17](https://github.com/standardnotes/files/compare/@standardnotes/files-server@1.8.16...@standardnotes/files-server@1.8.17) (2022-11-11)
**Note:** Version bump only for package @standardnotes/files-server
## [1.8.16](https://github.com/standardnotes/files/compare/@standardnotes/files-server@1.8.15...@standardnotes/files-server@1.8.16) (2022-11-11)
**Note:** Version bump only for package @standardnotes/files-server
## [1.8.15](https://github.com/standardnotes/files/compare/@standardnotes/files-server@1.8.14...@standardnotes/files-server@1.8.15) (2022-11-10)
**Note:** Version bump only for package @standardnotes/files-server
## [1.8.14](https://github.com/standardnotes/files/compare/@standardnotes/files-server@1.8.13...@standardnotes/files-server@1.8.14) (2022-11-10)
**Note:** Version bump only for package @standardnotes/files-server
## [1.8.13](https://github.com/standardnotes/files/compare/@standardnotes/files-server@1.8.12...@standardnotes/files-server@1.8.13) (2022-11-09)
**Note:** Version bump only for package @standardnotes/files-server
+4 -3
View File
@@ -1,6 +1,6 @@
{
"name": "@standardnotes/files-server",
"version": "1.8.13",
"version": "1.8.19",
"engines": {
"node": ">=16.0.0 <17.0.0"
},
@@ -25,6 +25,7 @@
"upgrade:snjs": "yarn ncu -u '@standardnotes/*'"
},
"dependencies": {
"@newrelic/native-metrics": "^9.0.0",
"@sentry/node": "^7.3.0",
"@standardnotes/common": "workspace:*",
"@standardnotes/domain-events": "workspace:*",
@@ -45,7 +46,7 @@
"inversify-express-utils": "^6.4.3",
"ioredis": "^5.2.0",
"jsonwebtoken": "^8.5.1",
"newrelic": "^9.0.0",
"newrelic": "^9.6.0",
"nodemon": "^2.0.19",
"prettyjson": "^1.2.5",
"reflect-metadata": "^0.1.13",
@@ -60,7 +61,7 @@
"@types/ioredis": "^4.28.10",
"@types/jest": "^29.1.1",
"@types/jsonwebtoken": "^8.5.0",
"@types/newrelic": "^7.0.3",
"@types/newrelic": "^7.0.4",
"@types/prettyjson": "^0.0.30",
"@types/uuid": "^8.3.0",
"@typescript-eslint/eslint-plugin": "^5.29.0",
+8
View File
@@ -3,6 +3,14 @@
All notable changes to this project will be documented in this file.
See [Conventional Commits](https://conventionalcommits.org) for commit guidelines.
## [1.5.5](https://github.com/standardnotes/server/compare/@standardnotes/predicates@1.5.4...@standardnotes/predicates@1.5.5) (2022-11-14)
**Note:** Version bump only for package @standardnotes/predicates
## [1.5.4](https://github.com/standardnotes/server/compare/@standardnotes/predicates@1.5.3...@standardnotes/predicates@1.5.4) (2022-11-10)
**Note:** Version bump only for package @standardnotes/predicates
## [1.5.3](https://github.com/standardnotes/server/compare/@standardnotes/predicates@1.5.2...@standardnotes/predicates@1.5.3) (2022-11-03)
**Note:** Version bump only for package @standardnotes/predicates
+2 -1
View File
@@ -1,6 +1,6 @@
{
"name": "@standardnotes/predicates",
"version": "1.5.3",
"version": "1.5.5",
"engines": {
"node": ">=16.0.0 <17.0.0"
},
@@ -33,6 +33,7 @@
"typescript": "^4.8.4"
},
"dependencies": {
"@newrelic/native-metrics": "^9.0.0",
"@standardnotes/common": "workspace:*",
"reflect-metadata": "^0.1.13"
}
+24
View File
@@ -3,6 +3,30 @@
All notable changes to this project will be documented in this file.
See [Conventional Commits](https://conventionalcommits.org) for commit guidelines.
## [1.13.20](https://github.com/standardnotes/server/compare/@standardnotes/scheduler-server@1.13.19...@standardnotes/scheduler-server@1.13.20) (2022-11-14)
**Note:** Version bump only for package @standardnotes/scheduler-server
## [1.13.19](https://github.com/standardnotes/server/compare/@standardnotes/scheduler-server@1.13.18...@standardnotes/scheduler-server@1.13.19) (2022-11-14)
**Note:** Version bump only for package @standardnotes/scheduler-server
## [1.13.18](https://github.com/standardnotes/server/compare/@standardnotes/scheduler-server@1.13.17...@standardnotes/scheduler-server@1.13.18) (2022-11-11)
**Note:** Version bump only for package @standardnotes/scheduler-server
## [1.13.17](https://github.com/standardnotes/server/compare/@standardnotes/scheduler-server@1.13.16...@standardnotes/scheduler-server@1.13.17) (2022-11-11)
**Note:** Version bump only for package @standardnotes/scheduler-server
## [1.13.16](https://github.com/standardnotes/server/compare/@standardnotes/scheduler-server@1.13.15...@standardnotes/scheduler-server@1.13.16) (2022-11-10)
**Note:** Version bump only for package @standardnotes/scheduler-server
## [1.13.15](https://github.com/standardnotes/server/compare/@standardnotes/scheduler-server@1.13.14...@standardnotes/scheduler-server@1.13.15) (2022-11-10)
**Note:** Version bump only for package @standardnotes/scheduler-server
## [1.13.14](https://github.com/standardnotes/server/compare/@standardnotes/scheduler-server@1.13.13...@standardnotes/scheduler-server@1.13.14) (2022-11-09)
**Note:** Version bump only for package @standardnotes/scheduler-server
+4 -3
View File
@@ -1,6 +1,6 @@
{
"name": "@standardnotes/scheduler-server",
"version": "1.13.14",
"version": "1.13.20",
"engines": {
"node": ">=16.0.0 <17.0.0"
},
@@ -24,6 +24,7 @@
"upgrade:snjs": "yarn ncu -u '@standardnotes/*'"
},
"dependencies": {
"@newrelic/native-metrics": "^9.0.0",
"@newrelic/winston-enricher": "^4.0.0",
"@sentry/node": "^7.3.0",
"@standardnotes/common": "workspace:*",
@@ -37,7 +38,7 @@
"inversify": "^6.0.1",
"ioredis": "^5.2.0",
"mysql2": "^2.3.3",
"newrelic": "^9.0.0",
"newrelic": "^9.6.0",
"reflect-metadata": "^0.1.13",
"typeorm": "^0.3.6",
"winston": "^3.8.1"
@@ -45,7 +46,7 @@
"devDependencies": {
"@types/ioredis": "^4.28.10",
"@types/jest": "^29.1.1",
"@types/newrelic": "^7.0.3",
"@types/newrelic": "^7.0.4",
"@types/node": "^18.0.0",
"@typescript-eslint/eslint-plugin": "^5.29.0",
"eslint": "^8.14.0",
+8
View File
@@ -3,6 +3,14 @@
All notable changes to this project will be documented in this file.
See [Conventional Commits](https://conventionalcommits.org) for commit guidelines.
## [1.6.2](https://github.com/standardnotes/server/compare/@standardnotes/security@1.6.1...@standardnotes/security@1.6.2) (2022-11-14)
**Note:** Version bump only for package @standardnotes/security
## [1.6.1](https://github.com/standardnotes/server/compare/@standardnotes/security@1.6.0...@standardnotes/security@1.6.1) (2022-11-10)
**Note:** Version bump only for package @standardnotes/security
# [1.6.0](https://github.com/standardnotes/server/compare/@standardnotes/security@1.5.3...@standardnotes/security@1.6.0) (2022-11-07)
### Features
+2 -1
View File
@@ -1,6 +1,6 @@
{
"name": "@standardnotes/security",
"version": "1.6.0",
"version": "1.6.2",
"engines": {
"node": ">=16.0.0 <17.0.0"
},
@@ -25,6 +25,7 @@
"test": "jest spec --coverage"
},
"dependencies": {
"@newrelic/native-metrics": "^9.0.0",
"@standardnotes/common": "workspace:*",
"jsonwebtoken": "^8.5.1",
"reflect-metadata": "^0.1.13"
+4
View File
@@ -3,6 +3,10 @@
All notable changes to this project will be documented in this file.
See [Conventional Commits](https://conventionalcommits.org) for commit guidelines.
## [1.18.1](https://github.com/standardnotes/server/compare/@standardnotes/settings@1.18.0...@standardnotes/settings@1.18.1) (2022-11-14)
**Note:** Version bump only for package @standardnotes/settings
# [1.18.0](https://github.com/standardnotes/server/compare/@standardnotes/settings@1.17.1...@standardnotes/settings@1.18.0) (2022-10-19)
### Features
+2 -1
View File
@@ -1,6 +1,6 @@
{
"name": "@standardnotes/settings",
"version": "1.18.0",
"version": "1.18.1",
"engines": {
"node": ">=16.0.0 <17.0.0"
},
@@ -29,6 +29,7 @@
"typescript": "^4.8.4"
},
"dependencies": {
"@newrelic/native-metrics": "^9.0.0",
"reflect-metadata": "^0.1.13"
}
}
+4
View File
@@ -3,6 +3,10 @@
All notable changes to this project will be documented in this file.
See [Conventional Commits](https://conventionalcommits.org) for commit guidelines.
## [1.12.1](https://github.com/standardnotes/server/compare/@standardnotes/sncrypto-node@1.12.0...@standardnotes/sncrypto-node@1.12.1) (2022-11-14)
**Note:** Version bump only for package @standardnotes/sncrypto-node
# [1.12.0](https://github.com/standardnotes/server/compare/@standardnotes/sncrypto-node@1.11.1...@standardnotes/sncrypto-node@1.12.0) (2022-10-19)
### Features
+2 -1
View File
@@ -1,6 +1,6 @@
{
"name": "@standardnotes/sncrypto-node",
"version": "1.12.0",
"version": "1.12.1",
"engines": {
"node": ">=16.0.0 <17.0.0"
},
@@ -23,6 +23,7 @@
"test": "jest spec"
},
"dependencies": {
"@newrelic/native-metrics": "^9.0.0",
"@standardnotes/sncrypto-common": "^1.9.0",
"reflect-metadata": "^0.1.13"
},
+46
View File
@@ -3,6 +3,52 @@
All notable changes to this project will be documented in this file.
See [Conventional Commits](https://conventionalcommits.org) for commit guidelines.
## [1.13.3](https://github.com/standardnotes/syncing-server-js/compare/@standardnotes/syncing-server@1.13.2...@standardnotes/syncing-server@1.13.3) (2022-11-14)
**Note:** Version bump only for package @standardnotes/syncing-server
## [1.13.2](https://github.com/standardnotes/syncing-server-js/compare/@standardnotes/syncing-server@1.13.1...@standardnotes/syncing-server@1.13.2) (2022-11-14)
**Note:** Version bump only for package @standardnotes/syncing-server
## [1.13.1](https://github.com/standardnotes/syncing-server-js/compare/@standardnotes/syncing-server@1.13.0...@standardnotes/syncing-server@1.13.1) (2022-11-14)
### Bug Fixes
* **syncing-server:** add debugs logs for content size recalculation handler ([01a4151](https://github.com/standardnotes/syncing-server-js/commit/01a415176302587986b554783f1f57322d63489d))
# [1.13.0](https://github.com/standardnotes/syncing-server-js/compare/@standardnotes/syncing-server@1.12.0...@standardnotes/syncing-server@1.13.0) (2022-11-11)
### Features
* **syncing-server:** add content size recalculation job ([7e404ae](https://github.com/standardnotes/syncing-server-js/commit/7e404ae71a46e3251ee9e9abfd6c258ec536c2d3))
# [1.12.0](https://github.com/standardnotes/syncing-server-js/compare/@standardnotes/syncing-server@1.11.10...@standardnotes/syncing-server@1.12.0) (2022-11-11)
### Features
* **syncing-server:** add item content size recalculation ([1a13861](https://github.com/standardnotes/syncing-server-js/commit/1a138616478a646d76404c425800937d2049a226))
## [1.11.10](https://github.com/standardnotes/syncing-server-js/compare/@standardnotes/syncing-server@1.11.9...@standardnotes/syncing-server@1.11.10) (2022-11-11)
**Note:** Version bump only for package @standardnotes/syncing-server
## [1.11.9](https://github.com/standardnotes/syncing-server-js/compare/@standardnotes/syncing-server@1.11.8...@standardnotes/syncing-server@1.11.9) (2022-11-10)
**Note:** Version bump only for package @standardnotes/syncing-server
## [1.11.8](https://github.com/standardnotes/syncing-server-js/compare/@standardnotes/syncing-server@1.11.7...@standardnotes/syncing-server@1.11.8) (2022-11-10)
**Note:** Version bump only for package @standardnotes/syncing-server
## [1.11.7](https://github.com/standardnotes/syncing-server-js/compare/@standardnotes/syncing-server@1.11.6...@standardnotes/syncing-server@1.11.7) (2022-11-10)
**Note:** Version bump only for package @standardnotes/syncing-server
## [1.11.6](https://github.com/standardnotes/syncing-server-js/compare/@standardnotes/syncing-server@1.11.5...@standardnotes/syncing-server@1.11.6) (2022-11-10)
**Note:** Version bump only for package @standardnotes/syncing-server
## [1.11.5](https://github.com/standardnotes/syncing-server-js/compare/@standardnotes/syncing-server@1.11.4...@standardnotes/syncing-server@1.11.5) (2022-11-09)
**Note:** Version bump only for package @standardnotes/syncing-server
+52
View File
@@ -0,0 +1,52 @@
import 'reflect-metadata'
import 'newrelic'
import { Logger } from 'winston'
import { ContainerConfigLoader } from '../src/Bootstrap/Container'
import TYPES from '../src/Bootstrap/Types'
import { Env } from '../src/Bootstrap/Env'
import { DomainEventFactoryInterface } from '../src/Domain/Event/DomainEventFactoryInterface'
import { DomainEventPublisherInterface } from '@standardnotes/domain-events'
const inputArgs = process.argv.slice(2)
const userUuid = inputArgs[0]
const fixContentSize = async (
domainEventFactory: DomainEventFactoryInterface,
domainEventPublisher: DomainEventPublisherInterface,
): Promise<void> => {
await domainEventPublisher.publish(domainEventFactory.createUserContentSizeRecalculationRequestedEvent(userUuid))
}
const container = new ContainerConfigLoader()
void container.load().then((container) => {
const env: Env = new Env()
env.load()
const logger: Logger = container.get(TYPES.Logger)
logger.info(`Starting content size fixing for user ${userUuid} ...`)
if (!userUuid) {
logger.error('No user uuid passed as argument. Skipped.')
process.exit(1)
}
const domainEventFactory: DomainEventFactoryInterface = container.get(TYPES.DomainEventFactory)
const domainEventPublisher: DomainEventPublisherInterface = container.get(TYPES.DomainEventPublisher)
Promise.resolve(fixContentSize(domainEventFactory, domainEventPublisher))
.then(() => {
logger.info('Content size fix complete.')
process.exit(0)
})
.catch((error) => {
logger.error(`Could not finish content size fix: ${error.message}`)
process.exit(1)
})
})
@@ -19,6 +19,12 @@ case "$COMMAND" in
yarn workspace @standardnotes/syncing-server worker
;;
'content-size-recalculate' )
echo "Starting Content Size Recalculation..."
USER_UUID=$1 && shift 1
yarn workspace @standardnotes/syncing-server content-size $USER_UUID
;;
* )
echo "Unknown command"
;;
+7 -5
View File
@@ -1,6 +1,6 @@
{
"name": "@standardnotes/syncing-server",
"version": "1.11.5",
"version": "1.13.3",
"engines": {
"node": ">=16.0.0 <17.0.0"
},
@@ -20,9 +20,11 @@
"test": "jest --coverage --config=./jest.config.js --maxWorkers=50%",
"start": "yarn node dist/bin/server.js",
"worker": "yarn node dist/bin/worker.js",
"content-size": "yarn node dist/bin/content.js",
"upgrade:snjs": "yarn ncu -u '@standardnotes/*'"
},
"dependencies": {
"@newrelic/native-metrics": "^9.0.0",
"@newrelic/winston-enricher": "^4.0.0",
"@sentry/node": "^7.3.0",
"@standardnotes/common": "workspace:*",
@@ -34,7 +36,7 @@
"@standardnotes/settings": "workspace:*",
"@standardnotes/time": "workspace:*",
"aws-sdk": "^2.1159.0",
"axios": "^0.27.2",
"axios": "^1.1.3",
"cors": "2.8.5",
"dotenv": "^16.0.1",
"express": "^4.18.1",
@@ -44,12 +46,12 @@
"ioredis": "^5.2.0",
"jsonwebtoken": "8.5.1",
"mysql2": "^2.3.3",
"newrelic": "^9.0.0",
"newrelic": "^9.6.0",
"nodemon": "^2.0.19",
"prettyjson": "^1.2.5",
"reflect-metadata": "0.1.13",
"typeorm": "^0.3.6",
"ua-parser-js": "1.0.2",
"ua-parser-js": "^1.0.32",
"uuid": "^9.0.0",
"winston": "^3.8.1"
},
@@ -61,7 +63,7 @@
"@types/ioredis": "^4.28.10",
"@types/jest": "^29.1.1",
"@types/jsonwebtoken": "^8.5.0",
"@types/newrelic": "^7.0.3",
"@types/newrelic": "^7.0.4",
"@types/prettyjson": "^0.0.30",
"@types/ua-parser-js": "^0.7.36",
"@types/uuid": "^8.3.0",
@@ -47,7 +47,9 @@ import { OwnershipFilter } from '../Domain/Item/SaveRule/OwnershipFilter'
import { TimeDifferenceFilter } from '../Domain/Item/SaveRule/TimeDifferenceFilter'
import { ItemFactoryInterface } from '../Domain/Item/ItemFactoryInterface'
import { ItemFactory } from '../Domain/Item/ItemFactory'
import axios, { AxiosInstance } from 'axios'
// eslint-disable-next-line @typescript-eslint/no-var-requires
const axios = require('axios')
import { AxiosInstance } from 'axios'
import { UuidFilter } from '../Domain/Item/SaveRule/UuidFilter'
import { ContentTypeFilter } from '../Domain/Item/SaveRule/ContentTypeFilter'
import { ContentFilter } from '../Domain/Item/SaveRule/ContentFilter'
@@ -77,6 +79,7 @@ import { AppDataSource } from './DataSource'
import { RevisionRepositoryInterface } from '../Domain/Revision/RevisionRepositoryInterface'
import { ItemRepositoryInterface } from '../Domain/Item/ItemRepositoryInterface'
import { Repository } from 'typeorm'
import { UserContentSizeRecalculationRequestedEventHandler } from '../Domain/Handler/UserContentSizeRecalculationRequestedEventHandler'
// eslint-disable-next-line @typescript-eslint/no-var-requires
const newrelicFormatter = require('@newrelic/winston-enricher')
@@ -218,6 +221,9 @@ export class ContainerConfigLoader {
container
.bind<CloudBackupRequestedEventHandler>(TYPES.CloudBackupRequestedEventHandler)
.to(CloudBackupRequestedEventHandler)
container
.bind<UserContentSizeRecalculationRequestedEventHandler>(TYPES.UserContentSizeRecalculationRequestedEventHandler)
.to(UserContentSizeRecalculationRequestedEventHandler)
// Services
container.bind<ContentDecoder>(TYPES.ContentDecoder).to(ContentDecoder)
@@ -48,6 +48,7 @@ const TYPES = {
EmailArchiveExtensionSyncedEventHandler: Symbol.for('EmailArchiveExtensionSyncedEventHandler'),
EmailBackupRequestedEventHandler: Symbol.for('EmailBackupRequestedEventHandler'),
CloudBackupRequestedEventHandler: Symbol.for('CloudBackupRequestedEventHandler'),
UserContentSizeRecalculationRequestedEventHandler: Symbol.for('UserContentSizeRecalculationRequestedEventHandler'),
// Services
ContentDecoder: Symbol.for('ContentDecoder'),
DomainEventPublisher: Symbol.for('DomainEventPublisher'),
@@ -1,166 +0,0 @@
import 'reflect-metadata'
import { TimerInterface } from '@standardnotes/time'
import { DomainEventFactory } from './DomainEventFactory'
describe('DomainEventFactory', () => {
let timer: TimerInterface
const createFactory = () => new DomainEventFactory(timer)
beforeEach(() => {
timer = {} as jest.Mocked<TimerInterface>
timer.getUTCDate = jest.fn().mockReturnValue(new Date(1))
})
it('should create a ITEMS_SYNCED event', () => {
expect(
createFactory().createItemsSyncedEvent({
userUuid: '1-2-3',
extensionUrl: 'https://test.com',
extensionId: '2-3-4',
itemUuids: ['3-4-5'],
forceMute: false,
skipFileBackup: false,
source: 'realtime-extensions-sync',
}),
).toEqual({
createdAt: expect.any(Date),
meta: {
correlation: {
userIdentifier: '1-2-3',
userIdentifierType: 'uuid',
},
origin: 'syncing-server',
},
payload: {
userUuid: '1-2-3',
extensionUrl: 'https://test.com',
extensionId: '2-3-4',
itemUuids: ['3-4-5'],
forceMute: false,
skipFileBackup: false,
source: 'realtime-extensions-sync',
},
type: 'ITEMS_SYNCED',
})
})
it('should create a DROPBOX_BACKUP_FAILED event', () => {
expect(createFactory().createDropboxBackupFailedEvent('1-2-3', 'test@test.com')).toEqual({
createdAt: expect.any(Date),
meta: {
correlation: {
userIdentifier: 'test@test.com',
userIdentifierType: 'email',
},
origin: 'syncing-server',
},
payload: {
email: 'test@test.com',
muteCloudEmailsSettingUuid: '1-2-3',
},
type: 'DROPBOX_BACKUP_FAILED',
})
})
it('should create a GOOGLE_DRIVE_BACKUP_FAILED event', () => {
expect(createFactory().createGoogleDriveBackupFailedEvent('1-2-3', 'test@test.com')).toEqual({
createdAt: expect.any(Date),
meta: {
correlation: {
userIdentifier: 'test@test.com',
userIdentifierType: 'email',
},
origin: 'syncing-server',
},
payload: {
email: 'test@test.com',
muteCloudEmailsSettingUuid: '1-2-3',
},
type: 'GOOGLE_DRIVE_BACKUP_FAILED',
})
})
it('should create a ONE_DRIVE_BACKUP_FAILED event', () => {
expect(createFactory().createOneDriveBackupFailedEvent('1-2-3', 'test@test.com')).toEqual({
createdAt: expect.any(Date),
meta: {
correlation: {
userIdentifier: 'test@test.com',
userIdentifierType: 'email',
},
origin: 'syncing-server',
},
payload: {
email: 'test@test.com',
muteCloudEmailsSettingUuid: '1-2-3',
},
type: 'ONE_DRIVE_BACKUP_FAILED',
})
})
it('should create a EMAIL_ARCHIVE_EXTENSION_SYNCED event', () => {
expect(createFactory().createEmailArchiveExtensionSyncedEvent('1-2-3', '2-3-4')).toEqual({
createdAt: expect.any(Date),
meta: {
correlation: {
userIdentifier: '1-2-3',
userIdentifierType: 'uuid',
},
origin: 'syncing-server',
},
payload: {
userUuid: '1-2-3',
extensionId: '2-3-4',
},
type: 'EMAIL_ARCHIVE_EXTENSION_SYNCED',
})
})
it('should create a EMAIL_BACKUP_ATTACHMENT_CREATED event', () => {
expect(
createFactory().createEmailBackupAttachmentCreatedEvent({
backupFileName: 'backup-file',
email: 'test@test.com',
backupFileIndex: 1,
backupFilesTotal: 2,
}),
).toEqual({
createdAt: expect.any(Date),
meta: {
correlation: {
userIdentifier: 'test@test.com',
userIdentifierType: 'email',
},
origin: 'syncing-server',
},
payload: {
backupFileName: 'backup-file',
email: 'test@test.com',
backupFileIndex: 1,
backupFilesTotal: 2,
},
type: 'EMAIL_BACKUP_ATTACHMENT_CREATED',
})
})
it('should create a DUPLICATE_ITEM_SYNCED event', () => {
expect(createFactory().createDuplicateItemSyncedEvent('1-2-3', '2-3-4')).toEqual({
createdAt: expect.any(Date),
meta: {
correlation: {
userIdentifier: '2-3-4',
userIdentifierType: 'uuid',
},
origin: 'syncing-server',
},
payload: {
itemUuid: '1-2-3',
userUuid: '2-3-4',
},
type: 'DUPLICATE_ITEM_SYNCED',
})
})
})
@@ -1,3 +1,4 @@
/* istanbul ignore file */
import {
DomainEventService,
DropboxBackupFailedEvent,
@@ -7,6 +8,7 @@ import {
GoogleDriveBackupFailedEvent,
ItemsSyncedEvent,
OneDriveBackupFailedEvent,
UserContentSizeRecalculationRequestedEvent,
} from '@standardnotes/domain-events'
import { TimerInterface } from '@standardnotes/time'
import { inject, injectable } from 'inversify'
@@ -17,6 +19,23 @@ import { DomainEventFactoryInterface } from './DomainEventFactoryInterface'
export class DomainEventFactory implements DomainEventFactoryInterface {
constructor(@inject(TYPES.Timer) private timer: TimerInterface) {}
createUserContentSizeRecalculationRequestedEvent(userUuid: string): UserContentSizeRecalculationRequestedEvent {
return {
type: 'USER_CONTENT_SIZE_RECALCULATION_REQUESTED',
createdAt: this.timer.getUTCDate(),
meta: {
correlation: {
userIdentifier: userUuid,
userIdentifierType: 'uuid',
},
origin: DomainEventService.SyncingServer,
},
payload: {
userUuid,
},
}
}
createDuplicateItemSyncedEvent(itemUuid: string, userUuid: string): DuplicateItemSyncedEvent {
return {
type: 'DUPLICATE_ITEM_SYNCED',
@@ -6,9 +6,11 @@ import {
GoogleDriveBackupFailedEvent,
ItemsSyncedEvent,
OneDriveBackupFailedEvent,
UserContentSizeRecalculationRequestedEvent,
} from '@standardnotes/domain-events'
export interface DomainEventFactoryInterface {
createUserContentSizeRecalculationRequestedEvent(userUuid: string): UserContentSizeRecalculationRequestedEvent
createDropboxBackupFailedEvent(muteCloudEmailsSettingUuid: string, email: string): DropboxBackupFailedEvent
createGoogleDriveBackupFailedEvent(muteCloudEmailsSettingUuid: string, email: string): GoogleDriveBackupFailedEvent
createOneDriveBackupFailedEvent(muteCloudEmailsSettingUuid: string, email: string): OneDriveBackupFailedEvent
@@ -0,0 +1,69 @@
/* istanbul ignore file */
import { DomainEventHandlerInterface, UserContentSizeRecalculationRequestedEvent } from '@standardnotes/domain-events'
import { inject, injectable } from 'inversify'
import { Stream } from 'stream'
import { Logger } from 'winston'
import TYPES from '../../Bootstrap/Types'
import { ItemProjection } from '../../Projection/ItemProjection'
import { ProjectorInterface } from '../../Projection/ProjectorInterface'
import { Item } from '../Item/Item'
import { ItemRepositoryInterface } from '../Item/ItemRepositoryInterface'
@injectable()
export class UserContentSizeRecalculationRequestedEventHandler implements DomainEventHandlerInterface {
constructor(
@inject(TYPES.ItemRepository) private itemRepository: ItemRepositoryInterface,
@inject(TYPES.ItemProjector) private itemProjector: ProjectorInterface<Item, ItemProjection>,
@inject(TYPES.Logger) private logger: Logger,
) {}
async handle(event: UserContentSizeRecalculationRequestedEvent): Promise<void> {
const stream = await this.itemRepository.streamAll({
deleted: false,
userUuid: event.payload.userUuid,
sortBy: 'updated_at_timestamp',
sortOrder: 'ASC',
})
const loggerHandle = this.logger
await new Promise((resolve, reject) => {
stream
.pipe(
new Stream.Transform({
objectMode: true,
transform: async (item, _encoding, callback) => {
if (!item.item_uuid) {
callback()
return
}
loggerHandle.info(`Fixing content size for item ${item.item_uuid}`)
const modelItem = await this.itemRepository.findByUuid(item.item_uuid)
if (modelItem !== null) {
const fixedContentSize = Buffer.byteLength(JSON.stringify(this.itemProjector.projectFull(modelItem)))
if (modelItem.contentSize !== fixedContentSize) {
loggerHandle.info(`Fixing content size from ${modelItem.contentSize} to ${fixedContentSize}`)
modelItem.contentSize = fixedContentSize
await this.itemRepository.save(modelItem)
}
callback()
return
}
callback()
return
},
}),
)
.on('finish', resolve)
.on('error', reject)
})
}
}
+4
View File
@@ -3,6 +3,10 @@
All notable changes to this project will be documented in this file.
See [Conventional Commits](https://conventionalcommits.org) for commit guidelines.
## [1.13.1](https://github.com/standardnotes/server/compare/@standardnotes/time@1.13.0...@standardnotes/time@1.13.1) (2022-11-14)
**Note:** Version bump only for package @standardnotes/time
# [1.13.0](https://github.com/standardnotes/server/compare/@standardnotes/time@1.12.0...@standardnotes/time@1.13.0) (2022-11-02)
### Features
+2 -1
View File
@@ -1,6 +1,6 @@
{
"name": "@standardnotes/time",
"version": "1.13.0",
"version": "1.13.1",
"engines": {
"node": ">=16.0.0 <17.0.0"
},
@@ -23,6 +23,7 @@
"test": "jest spec --coverage"
},
"dependencies": {
"@newrelic/native-metrics": "^9.0.0",
"dayjs": "^1.11.6",
"microtime": "^3.1.0",
"reflect-metadata": "^0.1.13"
+32
View File
@@ -3,6 +3,38 @@
All notable changes to this project will be documented in this file.
See [Conventional Commits](https://conventionalcommits.org) for commit guidelines.
## [1.4.21](https://github.com/standardnotes/server/compare/@standardnotes/websockets-server@1.4.20...@standardnotes/websockets-server@1.4.21) (2022-11-14)
**Note:** Version bump only for package @standardnotes/websockets-server
## [1.4.20](https://github.com/standardnotes/server/compare/@standardnotes/websockets-server@1.4.19...@standardnotes/websockets-server@1.4.20) (2022-11-14)
**Note:** Version bump only for package @standardnotes/websockets-server
## [1.4.19](https://github.com/standardnotes/server/compare/@standardnotes/websockets-server@1.4.18...@standardnotes/websockets-server@1.4.19) (2022-11-11)
**Note:** Version bump only for package @standardnotes/websockets-server
## [1.4.18](https://github.com/standardnotes/server/compare/@standardnotes/websockets-server@1.4.17...@standardnotes/websockets-server@1.4.18) (2022-11-11)
**Note:** Version bump only for package @standardnotes/websockets-server
## [1.4.17](https://github.com/standardnotes/server/compare/@standardnotes/websockets-server@1.4.16...@standardnotes/websockets-server@1.4.17) (2022-11-10)
**Note:** Version bump only for package @standardnotes/websockets-server
## [1.4.16](https://github.com/standardnotes/server/compare/@standardnotes/websockets-server@1.4.15...@standardnotes/websockets-server@1.4.16) (2022-11-10)
**Note:** Version bump only for package @standardnotes/websockets-server
## [1.4.15](https://github.com/standardnotes/server/compare/@standardnotes/websockets-server@1.4.14...@standardnotes/websockets-server@1.4.15) (2022-11-10)
**Note:** Version bump only for package @standardnotes/websockets-server
## [1.4.14](https://github.com/standardnotes/server/compare/@standardnotes/websockets-server@1.4.13...@standardnotes/websockets-server@1.4.14) (2022-11-10)
**Note:** Version bump only for package @standardnotes/websockets-server
## [1.4.13](https://github.com/standardnotes/server/compare/@standardnotes/websockets-server@1.4.12...@standardnotes/websockets-server@1.4.13) (2022-11-09)
**Note:** Version bump only for package @standardnotes/websockets-server
+5 -4
View File
@@ -1,6 +1,6 @@
{
"name": "@standardnotes/websockets-server",
"version": "1.4.13",
"version": "1.4.21",
"engines": {
"node": ">=16.0.0 <17.0.0"
},
@@ -22,6 +22,7 @@
"typeorm": "typeorm-ts-node-commonjs"
},
"dependencies": {
"@newrelic/native-metrics": "^9.0.0",
"@newrelic/winston-enricher": "^4.0.0",
"@sentry/node": "^7.3.0",
"@standardnotes/api": "^1.19.0",
@@ -30,7 +31,7 @@
"@standardnotes/domain-events-infra": "workspace:^",
"@standardnotes/security": "workspace:^",
"aws-sdk": "^2.1159.0",
"axios": "^0.27.2",
"axios": "^1.1.3",
"cors": "2.8.5",
"dotenv": "^16.0.1",
"express": "^4.18.1",
@@ -38,7 +39,7 @@
"inversify-express-utils": "^6.4.3",
"ioredis": "^5.2.0",
"mysql2": "^2.3.3",
"newrelic": "^9.0.0",
"newrelic": "^9.6.0",
"reflect-metadata": "0.1.13",
"typeorm": "^0.3.6",
"winston": "^3.8.1"
@@ -48,7 +49,7 @@
"@types/express": "^4.17.11",
"@types/ioredis": "^4.28.10",
"@types/jest": "^29.1.1",
"@types/newrelic": "^7.0.3",
"@types/newrelic": "^7.0.4",
"@typescript-eslint/eslint-plugin": "^5.29.0",
"eslint": "^8.14.0",
"eslint-plugin-prettier": "^4.0.0",
@@ -1,5 +1,7 @@
import * as winston from 'winston'
import axios, { AxiosInstance } from 'axios'
// eslint-disable-next-line @typescript-eslint/no-var-requires
const axios = require('axios')
import { AxiosInstance } from 'axios'
import Redis from 'ioredis'
import * as AWS from 'aws-sdk'
import { Container } from 'inversify'
+24
View File
@@ -3,6 +3,30 @@
All notable changes to this project will be documented in this file.
See [Conventional Commits](https://conventionalcommits.org) for commit guidelines.
## [1.17.19](https://github.com/standardnotes/server/compare/@standardnotes/workspace-server@1.17.18...@standardnotes/workspace-server@1.17.19) (2022-11-14)
**Note:** Version bump only for package @standardnotes/workspace-server
## [1.17.18](https://github.com/standardnotes/server/compare/@standardnotes/workspace-server@1.17.17...@standardnotes/workspace-server@1.17.18) (2022-11-14)
**Note:** Version bump only for package @standardnotes/workspace-server
## [1.17.17](https://github.com/standardnotes/server/compare/@standardnotes/workspace-server@1.17.16...@standardnotes/workspace-server@1.17.17) (2022-11-11)
**Note:** Version bump only for package @standardnotes/workspace-server
## [1.17.16](https://github.com/standardnotes/server/compare/@standardnotes/workspace-server@1.17.15...@standardnotes/workspace-server@1.17.16) (2022-11-11)
**Note:** Version bump only for package @standardnotes/workspace-server
## [1.17.15](https://github.com/standardnotes/server/compare/@standardnotes/workspace-server@1.17.14...@standardnotes/workspace-server@1.17.15) (2022-11-10)
**Note:** Version bump only for package @standardnotes/workspace-server
## [1.17.14](https://github.com/standardnotes/server/compare/@standardnotes/workspace-server@1.17.13...@standardnotes/workspace-server@1.17.14) (2022-11-10)
**Note:** Version bump only for package @standardnotes/workspace-server
## [1.17.13](https://github.com/standardnotes/server/compare/@standardnotes/workspace-server@1.17.12...@standardnotes/workspace-server@1.17.13) (2022-11-09)
**Note:** Version bump only for package @standardnotes/workspace-server
+4 -3
View File
@@ -1,6 +1,6 @@
{
"name": "@standardnotes/workspace-server",
"version": "1.17.13",
"version": "1.17.19",
"engines": {
"node": ">=16.0.0 <17.0.0"
},
@@ -22,6 +22,7 @@
"typeorm": "typeorm-ts-node-commonjs"
},
"dependencies": {
"@newrelic/native-metrics": "^9.0.0",
"@newrelic/winston-enricher": "^4.0.0",
"@sentry/node": "^7.3.0",
"@standardnotes/api": "^1.19.0",
@@ -39,7 +40,7 @@
"inversify-express-utils": "^6.4.3",
"ioredis": "^5.2.0",
"mysql2": "^2.3.3",
"newrelic": "^9.0.0",
"newrelic": "^9.6.0",
"reflect-metadata": "0.1.13",
"typeorm": "^0.3.6",
"winston": "^3.8.1"
@@ -49,7 +50,7 @@
"@types/express": "^4.17.11",
"@types/ioredis": "^4.28.10",
"@types/jest": "^29.1.1",
"@types/newrelic": "^7.0.3",
"@types/newrelic": "^7.0.4",
"@typescript-eslint/eslint-plugin": "^5.29.0",
"eslint": "^8.14.0",
"eslint-plugin-prettier": "^4.0.0",
+72 -47
View File
@@ -1805,6 +1805,7 @@ __metadata:
version: 0.0.0-use.local
resolution: "@standardnotes/analytics@workspace:packages/analytics"
dependencies:
"@newrelic/native-metrics": "npm:^9.0.0"
"@newrelic/winston-enricher": "npm:^4.0.0"
"@sentry/node": "npm:^7.3.0"
"@standardnotes/common": "workspace:*"
@@ -1813,7 +1814,7 @@ __metadata:
"@standardnotes/time": "workspace:*"
"@types/ioredis": "npm:^4.28.10"
"@types/jest": "npm:^29.1.1"
"@types/newrelic": "npm:^7.0.3"
"@types/newrelic": "npm:^7.0.4"
"@types/node": "npm:^18.0.0"
"@types/uuid": "npm:^8.3.0"
"@typescript-eslint/eslint-plugin": "npm:^5.30.0"
@@ -1826,7 +1827,7 @@ __metadata:
ioredis: "npm:^5.2.3"
jest: "npm:^29.1.2"
mysql2: "npm:^2.3.3"
newrelic: "npm:^9.0.0"
newrelic: "npm:^9.6.0"
reflect-metadata: "npm:^0.1.13"
shallow-equal-object: "npm:^1.1.1"
ts-jest: "npm:^29.0.3"
@@ -1841,6 +1842,7 @@ __metadata:
version: 0.0.0-use.local
resolution: "@standardnotes/api-gateway@workspace:packages/api-gateway"
dependencies:
"@newrelic/native-metrics": "npm:^9.0.0"
"@newrelic/winston-enricher": "npm:^4.0.0"
"@sentry/node": "npm:^7.3.0"
"@standardnotes/common": "workspace:^"
@@ -1853,11 +1855,11 @@ __metadata:
"@types/ioredis": "npm:^4.28.10"
"@types/jest": "npm:^29.1.1"
"@types/jsonwebtoken": "npm:^8.5.0"
"@types/newrelic": "npm:^7.0.3"
"@types/newrelic": "npm:^7.0.4"
"@types/prettyjson": "npm:^0.0.30"
"@typescript-eslint/eslint-plugin": "npm:^5.29.0"
aws-sdk: "npm:^2.1160.0"
axios: "npm:^0.27.2"
axios: "npm:^1.1.3"
cors: "npm:2.8.5"
dotenv: "npm:^16.0.1"
eslint: "npm:^8.14.0"
@@ -1869,7 +1871,7 @@ __metadata:
ioredis: "npm:^5.2.0"
jest: "npm:^29.1.2"
jsonwebtoken: "npm:8.5.1"
newrelic: "npm:^9.0.0"
newrelic: "npm:^9.6.0"
nodemon: "npm:^2.0.19"
npm-check-updates: "npm:^16.0.1"
prettyjson: "npm:^1.2.5"
@@ -1899,6 +1901,7 @@ __metadata:
version: 0.0.0-use.local
resolution: "@standardnotes/auth-server@workspace:packages/auth"
dependencies:
"@newrelic/native-metrics": "npm:^9.0.0"
"@newrelic/winston-enricher": "npm:^4.0.0"
"@sentry/node": "npm:^7.3.0"
"@standardnotes/api": "npm:^1.19.0"
@@ -1918,14 +1921,14 @@ __metadata:
"@types/express": "npm:^4.17.11"
"@types/ioredis": "npm:^4.28.10"
"@types/jest": "npm:^29.1.1"
"@types/newrelic": "npm:^7.0.3"
"@types/newrelic": "npm:^7.0.4"
"@types/otplib": "npm:^10.0.0"
"@types/prettyjson": "npm:^0.0.30"
"@types/ua-parser-js": "npm:^0.7.36"
"@types/uuid": "npm:^8.3.0"
"@typescript-eslint/eslint-plugin": "npm:^5.29.0"
aws-sdk: "npm:^2.1159.0"
axios: "npm:^0.27.2"
axios: "npm:^1.1.3"
bcryptjs: "npm:2.4.3"
cors: "npm:2.8.5"
dayjs: "npm:^1.11.6"
@@ -1938,7 +1941,7 @@ __metadata:
ioredis: "npm:^5.2.0"
jest: "npm:^29.1.2"
mysql2: "npm:^2.3.3"
newrelic: "npm:^9.0.0"
newrelic: "npm:^9.6.0"
nodemon: "npm:^2.0.19"
npm-check-updates: "npm:^16.0.1"
otplib: "npm:12.0.1"
@@ -1947,7 +1950,7 @@ __metadata:
ts-jest: "npm:^29.0.3"
typeorm: "npm:^0.3.6"
typescript: "npm:^4.8.4"
ua-parser-js: "npm:1.0.2"
ua-parser-js: "npm:^1.0.32"
uuid: "npm:^9.0.0"
winston: "npm:^3.8.1"
languageName: unknown
@@ -1967,6 +1970,7 @@ __metadata:
version: 0.0.0-use.local
resolution: "@standardnotes/common@workspace:packages/common"
dependencies:
"@newrelic/native-metrics": "npm:^9.0.0"
"@types/jest": "npm:^29.1.1"
"@types/node": "npm:^18.0.0"
"@typescript-eslint/eslint-plugin": "npm:^5.30.0"
@@ -1995,16 +1999,17 @@ __metadata:
version: 0.0.0-use.local
resolution: "@standardnotes/domain-events-infra@workspace:packages/domain-events-infra"
dependencies:
"@newrelic/native-metrics": "npm:^9.0.0"
"@standardnotes/domain-events": "workspace:*"
"@types/ioredis": "npm:^4.28.10"
"@types/jest": "npm:^29.1.1"
"@types/newrelic": "npm:^7.0.3"
"@types/newrelic": "npm:^7.0.4"
"@typescript-eslint/eslint-plugin": "npm:^5.30.0"
aws-sdk: "npm:^2.1082.0"
eslint-plugin-prettier: "npm:^4.2.1"
ioredis: "npm:^5.2.0"
jest: "npm:^29.1.2"
newrelic: "npm:^9.0.0"
newrelic: "npm:^9.6.0"
reflect-metadata: "npm:^0.1.13"
sqs-consumer: "npm:^5.6.0"
ts-jest: "npm:^29.0.3"
@@ -2017,6 +2022,7 @@ __metadata:
version: 0.0.0-use.local
resolution: "@standardnotes/domain-events@workspace:packages/domain-events"
dependencies:
"@newrelic/native-metrics": "npm:^9.0.0"
"@standardnotes/common": "workspace:*"
"@standardnotes/features": "npm:^1.52.1"
"@standardnotes/predicates": "workspace:*"
@@ -2049,12 +2055,13 @@ __metadata:
version: 0.0.0-use.local
resolution: "@standardnotes/event-store@workspace:packages/event-store"
dependencies:
"@newrelic/native-metrics": "npm:^9.0.0"
"@standardnotes/domain-events": "workspace:*"
"@standardnotes/domain-events-infra": "workspace:*"
"@standardnotes/time": "workspace:*"
"@types/ioredis": "npm:^4.28.10"
"@types/jest": "npm:^29.1.1"
"@types/newrelic": "npm:^7.0.3"
"@types/newrelic": "npm:^7.0.4"
"@types/nodemailer": "npm:^6.4.1"
"@typescript-eslint/eslint-plugin": "npm:^5.40.1"
aws-sdk: "npm:^2.1159.0"
@@ -2065,7 +2072,7 @@ __metadata:
ioredis: "npm:^5.2.0"
jest: "npm:^29.1.2"
mysql2: "npm:^2.3.3"
newrelic: "npm:^9.0.0"
newrelic: "npm:^9.6.0"
reflect-metadata: "npm:0.1.13"
ts-jest: "npm:^29.0.3"
typeorm: "npm:^0.3.6"
@@ -2102,6 +2109,7 @@ __metadata:
version: 0.0.0-use.local
resolution: "@standardnotes/files-server@workspace:packages/files"
dependencies:
"@newrelic/native-metrics": "npm:^9.0.0"
"@sentry/node": "npm:^7.3.0"
"@standardnotes/common": "workspace:*"
"@standardnotes/config": "npm:2.4.3"
@@ -2117,7 +2125,7 @@ __metadata:
"@types/ioredis": "npm:^4.28.10"
"@types/jest": "npm:^29.1.1"
"@types/jsonwebtoken": "npm:^8.5.0"
"@types/newrelic": "npm:^7.0.3"
"@types/newrelic": "npm:^7.0.4"
"@types/prettyjson": "npm:^0.0.30"
"@types/uuid": "npm:^8.3.0"
"@typescript-eslint/eslint-plugin": "npm:^5.29.0"
@@ -2136,7 +2144,7 @@ __metadata:
ioredis: "npm:^5.2.0"
jest: "npm:^29.1.2"
jsonwebtoken: "npm:^8.5.1"
newrelic: "npm:^9.0.0"
newrelic: "npm:^9.6.0"
nodemon: "npm:^2.0.19"
npm-check-updates: "npm:^16.0.1"
prettyjson: "npm:^1.2.5"
@@ -2192,6 +2200,7 @@ __metadata:
version: 0.0.0-use.local
resolution: "@standardnotes/predicates@workspace:packages/predicates"
dependencies:
"@newrelic/native-metrics": "npm:^9.0.0"
"@standardnotes/common": "workspace:*"
"@types/jest": "npm:^29.1.1"
"@typescript-eslint/eslint-plugin": "npm:^5.30.0"
@@ -2231,6 +2240,7 @@ __metadata:
version: 0.0.0-use.local
resolution: "@standardnotes/scheduler-server@workspace:packages/scheduler"
dependencies:
"@newrelic/native-metrics": "npm:^9.0.0"
"@newrelic/winston-enricher": "npm:^4.0.0"
"@sentry/node": "npm:^7.3.0"
"@standardnotes/common": "workspace:*"
@@ -2240,7 +2250,7 @@ __metadata:
"@standardnotes/time": "workspace:*"
"@types/ioredis": "npm:^4.28.10"
"@types/jest": "npm:^29.1.1"
"@types/newrelic": "npm:^7.0.3"
"@types/newrelic": "npm:^7.0.4"
"@types/node": "npm:^18.0.0"
"@typescript-eslint/eslint-plugin": "npm:^5.29.0"
aws-sdk: "npm:^2.1158.0"
@@ -2252,7 +2262,7 @@ __metadata:
ioredis: "npm:^5.2.0"
jest: "npm:^29.1.2"
mysql2: "npm:^2.3.3"
newrelic: "npm:^9.0.0"
newrelic: "npm:^9.6.0"
npm-check-updates: "npm:^16.0.1"
reflect-metadata: "npm:^0.1.13"
ts-jest: "npm:^29.0.3"
@@ -2266,6 +2276,7 @@ __metadata:
version: 0.0.0-use.local
resolution: "@standardnotes/security@workspace:packages/security"
dependencies:
"@newrelic/native-metrics": "npm:^9.0.0"
"@standardnotes/common": "workspace:*"
"@types/jest": "npm:^29.1.1"
"@types/jsonwebtoken": "npm:^8.5.8"
@@ -2288,15 +2299,16 @@ __metadata:
"@lerna-lite/cli": "npm:^1.5.1"
"@lerna-lite/list": "npm:^1.5.1"
"@lerna-lite/run": "npm:^1.5.1"
"@newrelic/native-metrics": "npm:^9.0.0"
"@sentry/node": "npm:^7.3.0"
"@types/jest": "npm:^29.1.1"
"@types/newrelic": "npm:^7.0.3"
"@types/newrelic": "npm:^7.0.4"
"@types/node": "npm:^18.0.0"
"@typescript-eslint/parser": "npm:^5.40.1"
eslint: "npm:^8.17.0"
eslint-config-prettier: "npm:^8.5.0"
ini: "npm:^3.0.0"
newrelic: "npm:^9.0.0"
newrelic: "npm:^9.6.0"
npm-check-updates: "npm:^16.0.1"
prettier: "npm:^2.7.1"
ts-node: "npm:^10.9.1"
@@ -2308,6 +2320,7 @@ __metadata:
version: 0.0.0-use.local
resolution: "@standardnotes/settings@workspace:packages/settings"
dependencies:
"@newrelic/native-metrics": "npm:^9.0.0"
"@typescript-eslint/eslint-plugin": "npm:^5.30.0"
eslint-plugin-prettier: "npm:^4.2.1"
reflect-metadata: "npm:^0.1.13"
@@ -2328,6 +2341,7 @@ __metadata:
version: 0.0.0-use.local
resolution: "@standardnotes/sncrypto-node@workspace:packages/sncrypto-node"
dependencies:
"@newrelic/native-metrics": "npm:^9.0.0"
"@standardnotes/sncrypto-common": "npm:^1.9.0"
"@types/jest": "npm:^29.1.1"
"@types/node": "npm:^18.0.0"
@@ -2346,6 +2360,7 @@ __metadata:
version: 0.0.0-use.local
resolution: "@standardnotes/syncing-server@workspace:packages/syncing-server"
dependencies:
"@newrelic/native-metrics": "npm:^9.0.0"
"@newrelic/winston-enricher": "npm:^4.0.0"
"@sentry/node": "npm:^7.3.0"
"@standardnotes/common": "workspace:*"
@@ -2363,13 +2378,13 @@ __metadata:
"@types/ioredis": "npm:^4.28.10"
"@types/jest": "npm:^29.1.1"
"@types/jsonwebtoken": "npm:^8.5.0"
"@types/newrelic": "npm:^7.0.3"
"@types/newrelic": "npm:^7.0.4"
"@types/prettyjson": "npm:^0.0.30"
"@types/ua-parser-js": "npm:^0.7.36"
"@types/uuid": "npm:^8.3.0"
"@typescript-eslint/eslint-plugin": "npm:^5.29.0"
aws-sdk: "npm:^2.1159.0"
axios: "npm:^0.27.2"
axios: "npm:^1.1.3"
cors: "npm:2.8.5"
dotenv: "npm:^16.0.1"
eslint: "npm:^8.14.0"
@@ -2382,7 +2397,7 @@ __metadata:
jest: "npm:^29.1.2"
jsonwebtoken: "npm:8.5.1"
mysql2: "npm:^2.3.3"
newrelic: "npm:^9.0.0"
newrelic: "npm:^9.6.0"
nodemon: "npm:^2.0.19"
npm-check-updates: "npm:^16.0.1"
prettyjson: "npm:^1.2.5"
@@ -2390,7 +2405,7 @@ __metadata:
ts-jest: "npm:^29.0.3"
typeorm: "npm:^0.3.6"
typescript: "npm:^4.8.4"
ua-parser-js: "npm:1.0.2"
ua-parser-js: "npm:^1.0.32"
uuid: "npm:^9.0.0"
winston: "npm:^3.8.1"
languageName: unknown
@@ -2400,6 +2415,7 @@ __metadata:
version: 0.0.0-use.local
resolution: "@standardnotes/time@workspace:packages/time"
dependencies:
"@newrelic/native-metrics": "npm:^9.0.0"
"@types/jest": "npm:^29.1.1"
"@types/microtime": "npm:^2.1.0"
"@typescript-eslint/eslint-plugin": "npm:^5.30.0"
@@ -2441,6 +2457,7 @@ __metadata:
version: 0.0.0-use.local
resolution: "@standardnotes/websockets-server@workspace:packages/websockets"
dependencies:
"@newrelic/native-metrics": "npm:^9.0.0"
"@newrelic/winston-enricher": "npm:^4.0.0"
"@sentry/node": "npm:^7.3.0"
"@standardnotes/api": "npm:^1.19.0"
@@ -2452,10 +2469,10 @@ __metadata:
"@types/express": "npm:^4.17.11"
"@types/ioredis": "npm:^4.28.10"
"@types/jest": "npm:^29.1.1"
"@types/newrelic": "npm:^7.0.3"
"@types/newrelic": "npm:^7.0.4"
"@typescript-eslint/eslint-plugin": "npm:^5.29.0"
aws-sdk: "npm:^2.1159.0"
axios: "npm:^0.27.2"
axios: "npm:^1.1.3"
cors: "npm:2.8.5"
dotenv: "npm:^16.0.1"
eslint: "npm:^8.14.0"
@@ -2466,7 +2483,7 @@ __metadata:
ioredis: "npm:^5.2.0"
jest: "npm:^29.1.2"
mysql2: "npm:^2.3.3"
newrelic: "npm:^9.0.0"
newrelic: "npm:^9.6.0"
reflect-metadata: "npm:0.1.13"
ts-jest: "npm:^29.0.3"
typeorm: "npm:^0.3.6"
@@ -2479,6 +2496,7 @@ __metadata:
version: 0.0.0-use.local
resolution: "@standardnotes/workspace-server@workspace:packages/workspace"
dependencies:
"@newrelic/native-metrics": "npm:^9.0.0"
"@newrelic/winston-enricher": "npm:^4.0.0"
"@sentry/node": "npm:^7.3.0"
"@standardnotes/api": "npm:^1.19.0"
@@ -2492,7 +2510,7 @@ __metadata:
"@types/express": "npm:^4.17.11"
"@types/ioredis": "npm:^4.28.10"
"@types/jest": "npm:^29.1.1"
"@types/newrelic": "npm:^7.0.3"
"@types/newrelic": "npm:^7.0.4"
"@typescript-eslint/eslint-plugin": "npm:^5.29.0"
aws-sdk: "npm:^2.1159.0"
cors: "npm:2.8.5"
@@ -2505,7 +2523,7 @@ __metadata:
ioredis: "npm:^5.2.0"
jest: "npm:^29.1.2"
mysql2: "npm:^2.3.3"
newrelic: "npm:^9.0.0"
newrelic: "npm:^9.6.0"
reflect-metadata: "npm:0.1.13"
ts-jest: "npm:^29.0.3"
typeorm: "npm:^0.3.6"
@@ -2832,10 +2850,10 @@ __metadata:
languageName: node
linkType: hard
"@types/newrelic@npm:^7.0.3":
version: 7.0.3
resolution: "@types/newrelic@npm:7.0.3"
checksum: f56ebaa21cb5a7b20f7fba2f44105f871e54c7668541708794d3c614dabbdd9980e61fdd30372b80700f1264627d88b912c93ce8ad169af96c24e710004bcf8c
"@types/newrelic@npm:^7.0.4":
version: 7.0.4
resolution: "@types/newrelic@npm:7.0.4"
checksum: b44215b3abe27bca702ffda7c326d951e11083b79f64ec9099664b981f3c51698a164e81c252ea99c994a138e105dfd38a873c274ecbad5f3e43488c1d9c8e8d
languageName: node
linkType: hard
@@ -3528,13 +3546,14 @@ __metadata:
languageName: node
linkType: hard
"axios@npm:^0.27.2":
version: 0.27.2
resolution: "axios@npm:0.27.2"
"axios@npm:^1.1.3":
version: 1.1.3
resolution: "axios@npm:1.1.3"
dependencies:
follow-redirects: "npm:^1.14.9"
follow-redirects: "npm:^1.15.0"
form-data: "npm:^4.0.0"
checksum: 4cd898afe90caaf05307fc5a0da4c61012493b6bfd4937fff9774455c01d368db583b17c4737e73853f149b32e615487930b491661682a1f69a1973b1f533bb7
proxy-from-env: "npm:^1.1.0"
checksum: 2e28acd01cc06f9f10dfce3531ebbcd74f2f2a364f44ff4aa59363239baf699c58361e9bb6425ff91283f5fc623051c55bdd2d08c1c06dd7780f0d0762297ca7
languageName: node
linkType: hard
@@ -5592,7 +5611,7 @@ __metadata:
languageName: node
linkType: hard
"follow-redirects@npm:^1.14.9":
"follow-redirects@npm:^1.15.0":
version: 1.15.2
resolution: "follow-redirects@npm:1.15.2"
peerDependenciesMeta:
@@ -8292,9 +8311,9 @@ __metadata:
languageName: node
linkType: hard
"newrelic@npm:^9.0.0":
version: 9.0.0
resolution: "newrelic@npm:9.0.0"
"newrelic@npm:^9.6.0":
version: 9.6.0
resolution: "newrelic@npm:9.6.0"
dependencies:
"@grpc/grpc-js": "npm:^1.5.5"
"@grpc/proto-loader": "npm:^0.6.13"
@@ -8303,7 +8322,6 @@ __metadata:
"@newrelic/native-metrics": "npm:^9.0.0"
"@newrelic/superagent": "npm:^6.0.0"
"@tyriar/fibonacci-heap": "npm:^2.0.7"
async: "npm:^3.2.3"
concat-stream: "npm:^2.0.0"
https-proxy-agent: "npm:^5.0.0"
json-stringify-safe: "npm:^5.0.0"
@@ -8315,7 +8333,7 @@ __metadata:
optional: true
bin:
newrelic-naming-rules: bin/test-naming-rules.js
checksum: 397f7d2626f6ae7a7aecda7037e406fca4d055ce39d3fd644aecd94b4ecf4b110ec06930651984c8f00bf98c12710e397935979b8861330e09782a84da18619e
checksum: eb378acde172c814c7d2c4804d323c493d8ab4587095dd668a6370de7cbddd1effd7cc61899aaf927134f7a0ce26581d8c0ea905ac667b4879756936c34e73fa
languageName: node
linkType: hard
@@ -9296,6 +9314,13 @@ __metadata:
languageName: node
linkType: hard
"proxy-from-env@npm:^1.1.0":
version: 1.1.0
resolution: "proxy-from-env@npm:1.1.0"
checksum: 0bba2ef7c8374b384e94e4477764e53df66fcdfa7d19e2c4a063cb39eea979c139ce13981970223665422e72b7d149609a927046e2e40ab340b84d91af082591
languageName: node
linkType: hard
"pseudomap@npm:^1.0.2":
version: 1.0.2
resolution: "pseudomap@npm:1.0.2"
@@ -11023,10 +11048,10 @@ __metadata:
languageName: node
linkType: hard
"ua-parser-js@npm:1.0.2":
version: 1.0.2
resolution: "ua-parser-js@npm:1.0.2"
checksum: 5ee14b105c4982bd86ca358e334187cde40aaf1dde2f1626fbd9c76de98b845191f02fc4e015e68885d047db336344f9ffba5b33cac5f6de6ad9a1adba88ea79
"ua-parser-js@npm:^1.0.32":
version: 1.0.32
resolution: "ua-parser-js@npm:1.0.32"
checksum: 9d320c6742248cf25264ece5f7756df097be7a7843cd71c10a9adaea35fe304600cd487da0bdb7add7239a5801905d720835ba4293a5add9568b868cd4079428
languageName: node
linkType: hard