mirror of
https://github.com/standardnotes/server
synced 2026-05-09 15:57:17 -04:00
Compare commits
31 Commits
| Author | SHA1 | Date | |
|---|---|---|---|
| b767e1f072 | |||
| e3cb1faba4 | |||
| 5c5f988055 | |||
| c7d2adf091 | |||
| a4ad37f309 | |||
| 73c2cc1222 | |||
| 9380900aaf | |||
| 02f4d5c717 | |||
| 1f4b26d269 | |||
| e253825da6 | |||
| 2bddd947ba | |||
| b7173346d2 | |||
| 01641975c0 | |||
| 7abd80cdba | |||
| aeb5ea1874 | |||
| d2a371b92c | |||
| 3ea3b24bb6 | |||
| 0c3bc0cae6 | |||
| d56410984a | |||
| 4dd2eb9349 | |||
| 709aec5eeb | |||
| f1aa431c22 | |||
| 86d0e565ed | |||
| 92bb447cac | |||
| 08966e7af7 | |||
| 2c732ff713 | |||
| 1493b7c478 | |||
| efd816a627 | |||
| f24c4c27fc | |||
| 88a5de766c | |||
| a0e523e64c |
@@ -300,6 +300,57 @@ const RAW_RUNTIME_STATE =
|
||||
"linkType": "HARD"\
|
||||
}]\
|
||||
]],\
|
||||
["@aws-sdk/client-cloudwatch", [\
|
||||
["npm:3.485.0", {\
|
||||
"packageLocation": "./.yarn/cache/@aws-sdk-client-cloudwatch-npm-3.485.0-afe4ac001f-0e02739ef1.zip/node_modules/@aws-sdk/client-cloudwatch/",\
|
||||
"packageDependencies": [\
|
||||
["@aws-sdk/client-cloudwatch", "npm:3.485.0"],\
|
||||
["@aws-crypto/sha256-browser", "npm:3.0.0"],\
|
||||
["@aws-crypto/sha256-js", "npm:3.0.0"],\
|
||||
["@aws-sdk/client-sts", "npm:3.485.0"],\
|
||||
["@aws-sdk/core", "npm:3.485.0"],\
|
||||
["@aws-sdk/credential-provider-node", "npm:3.485.0"],\
|
||||
["@aws-sdk/middleware-host-header", "npm:3.485.0"],\
|
||||
["@aws-sdk/middleware-logger", "npm:3.485.0"],\
|
||||
["@aws-sdk/middleware-recursion-detection", "npm:3.485.0"],\
|
||||
["@aws-sdk/middleware-signing", "npm:3.485.0"],\
|
||||
["@aws-sdk/middleware-user-agent", "npm:3.485.0"],\
|
||||
["@aws-sdk/region-config-resolver", "npm:3.485.0"],\
|
||||
["@aws-sdk/types", "npm:3.485.0"],\
|
||||
["@aws-sdk/util-endpoints", "npm:3.485.0"],\
|
||||
["@aws-sdk/util-user-agent-browser", "npm:3.485.0"],\
|
||||
["@aws-sdk/util-user-agent-node", "virtual:5f6733bd23aee10dd05576af160f1b93e0bb4a20b288e9b818dc0b69bdb08ea1a09d5836816f02bdafc9c01487816ae339c6b680c2f7849dfe249436c5f2b499#npm:3.485.0"],\
|
||||
["@smithy/config-resolver", "npm:2.0.23"],\
|
||||
["@smithy/core", "npm:1.2.2"],\
|
||||
["@smithy/fetch-http-handler", "npm:2.3.2"],\
|
||||
["@smithy/hash-node", "npm:2.0.18"],\
|
||||
["@smithy/invalid-dependency", "npm:2.0.16"],\
|
||||
["@smithy/middleware-content-length", "npm:2.0.18"],\
|
||||
["@smithy/middleware-endpoint", "npm:2.3.0"],\
|
||||
["@smithy/middleware-retry", "npm:2.0.26"],\
|
||||
["@smithy/middleware-serde", "npm:2.0.16"],\
|
||||
["@smithy/middleware-stack", "npm:2.0.10"],\
|
||||
["@smithy/node-config-provider", "npm:2.1.9"],\
|
||||
["@smithy/node-http-handler", "npm:2.2.2"],\
|
||||
["@smithy/protocol-http", "npm:3.0.12"],\
|
||||
["@smithy/smithy-client", "npm:2.2.1"],\
|
||||
["@smithy/types", "npm:2.8.0"],\
|
||||
["@smithy/url-parser", "npm:2.0.16"],\
|
||||
["@smithy/util-base64", "npm:2.0.1"],\
|
||||
["@smithy/util-body-length-browser", "npm:2.0.1"],\
|
||||
["@smithy/util-body-length-node", "npm:2.1.0"],\
|
||||
["@smithy/util-defaults-mode-browser", "npm:2.0.24"],\
|
||||
["@smithy/util-defaults-mode-node", "npm:2.0.32"],\
|
||||
["@smithy/util-endpoints", "npm:1.0.8"],\
|
||||
["@smithy/util-retry", "npm:2.0.9"],\
|
||||
["@smithy/util-utf8", "npm:2.0.2"],\
|
||||
["@smithy/util-waiter", "npm:2.0.16"],\
|
||||
["fast-xml-parser", "npm:4.2.5"],\
|
||||
["tslib", "npm:2.5.2"]\
|
||||
],\
|
||||
"linkType": "HARD"\
|
||||
}]\
|
||||
]],\
|
||||
["@aws-sdk/client-s3", [\
|
||||
["npm:3.484.0", {\
|
||||
"packageLocation": "./.yarn/cache/@aws-sdk-client-s3-npm-3.484.0-681638ab7a-701523f3b3.zip/node_modules/@aws-sdk/client-s3/",\
|
||||
@@ -512,6 +563,50 @@ const RAW_RUNTIME_STATE =
|
||||
["tslib", "npm:2.5.2"]\
|
||||
],\
|
||||
"linkType": "HARD"\
|
||||
}],\
|
||||
["npm:3.485.0", {\
|
||||
"packageLocation": "./.yarn/cache/@aws-sdk-client-sso-npm-3.485.0-5f6733bd23-635de0e310.zip/node_modules/@aws-sdk/client-sso/",\
|
||||
"packageDependencies": [\
|
||||
["@aws-sdk/client-sso", "npm:3.485.0"],\
|
||||
["@aws-crypto/sha256-browser", "npm:3.0.0"],\
|
||||
["@aws-crypto/sha256-js", "npm:3.0.0"],\
|
||||
["@aws-sdk/core", "npm:3.485.0"],\
|
||||
["@aws-sdk/middleware-host-header", "npm:3.485.0"],\
|
||||
["@aws-sdk/middleware-logger", "npm:3.485.0"],\
|
||||
["@aws-sdk/middleware-recursion-detection", "npm:3.485.0"],\
|
||||
["@aws-sdk/middleware-user-agent", "npm:3.485.0"],\
|
||||
["@aws-sdk/region-config-resolver", "npm:3.485.0"],\
|
||||
["@aws-sdk/types", "npm:3.485.0"],\
|
||||
["@aws-sdk/util-endpoints", "npm:3.485.0"],\
|
||||
["@aws-sdk/util-user-agent-browser", "npm:3.485.0"],\
|
||||
["@aws-sdk/util-user-agent-node", "virtual:5f6733bd23aee10dd05576af160f1b93e0bb4a20b288e9b818dc0b69bdb08ea1a09d5836816f02bdafc9c01487816ae339c6b680c2f7849dfe249436c5f2b499#npm:3.485.0"],\
|
||||
["@smithy/config-resolver", "npm:2.0.23"],\
|
||||
["@smithy/core", "npm:1.2.2"],\
|
||||
["@smithy/fetch-http-handler", "npm:2.3.2"],\
|
||||
["@smithy/hash-node", "npm:2.0.18"],\
|
||||
["@smithy/invalid-dependency", "npm:2.0.16"],\
|
||||
["@smithy/middleware-content-length", "npm:2.0.18"],\
|
||||
["@smithy/middleware-endpoint", "npm:2.3.0"],\
|
||||
["@smithy/middleware-retry", "npm:2.0.26"],\
|
||||
["@smithy/middleware-serde", "npm:2.0.16"],\
|
||||
["@smithy/middleware-stack", "npm:2.0.10"],\
|
||||
["@smithy/node-config-provider", "npm:2.1.9"],\
|
||||
["@smithy/node-http-handler", "npm:2.2.2"],\
|
||||
["@smithy/protocol-http", "npm:3.0.12"],\
|
||||
["@smithy/smithy-client", "npm:2.2.1"],\
|
||||
["@smithy/types", "npm:2.8.0"],\
|
||||
["@smithy/url-parser", "npm:2.0.16"],\
|
||||
["@smithy/util-base64", "npm:2.0.1"],\
|
||||
["@smithy/util-body-length-browser", "npm:2.0.1"],\
|
||||
["@smithy/util-body-length-node", "npm:2.1.0"],\
|
||||
["@smithy/util-defaults-mode-browser", "npm:2.0.24"],\
|
||||
["@smithy/util-defaults-mode-node", "npm:2.0.32"],\
|
||||
["@smithy/util-endpoints", "npm:1.0.8"],\
|
||||
["@smithy/util-retry", "npm:2.0.9"],\
|
||||
["@smithy/util-utf8", "npm:2.0.2"],\
|
||||
["tslib", "npm:2.5.2"]\
|
||||
],\
|
||||
"linkType": "HARD"\
|
||||
}]\
|
||||
]],\
|
||||
["@aws-sdk/client-sts", [\
|
||||
@@ -561,6 +656,53 @@ const RAW_RUNTIME_STATE =
|
||||
["tslib", "npm:2.5.2"]\
|
||||
],\
|
||||
"linkType": "HARD"\
|
||||
}],\
|
||||
["npm:3.485.0", {\
|
||||
"packageLocation": "./.yarn/cache/@aws-sdk-client-sts-npm-3.485.0-cc69ab3505-98c7f4d722.zip/node_modules/@aws-sdk/client-sts/",\
|
||||
"packageDependencies": [\
|
||||
["@aws-sdk/client-sts", "npm:3.485.0"],\
|
||||
["@aws-crypto/sha256-browser", "npm:3.0.0"],\
|
||||
["@aws-crypto/sha256-js", "npm:3.0.0"],\
|
||||
["@aws-sdk/core", "npm:3.485.0"],\
|
||||
["@aws-sdk/credential-provider-node", "npm:3.485.0"],\
|
||||
["@aws-sdk/middleware-host-header", "npm:3.485.0"],\
|
||||
["@aws-sdk/middleware-logger", "npm:3.485.0"],\
|
||||
["@aws-sdk/middleware-recursion-detection", "npm:3.485.0"],\
|
||||
["@aws-sdk/middleware-user-agent", "npm:3.485.0"],\
|
||||
["@aws-sdk/region-config-resolver", "npm:3.485.0"],\
|
||||
["@aws-sdk/types", "npm:3.485.0"],\
|
||||
["@aws-sdk/util-endpoints", "npm:3.485.0"],\
|
||||
["@aws-sdk/util-user-agent-browser", "npm:3.485.0"],\
|
||||
["@aws-sdk/util-user-agent-node", "virtual:5f6733bd23aee10dd05576af160f1b93e0bb4a20b288e9b818dc0b69bdb08ea1a09d5836816f02bdafc9c01487816ae339c6b680c2f7849dfe249436c5f2b499#npm:3.485.0"],\
|
||||
["@smithy/config-resolver", "npm:2.0.23"],\
|
||||
["@smithy/core", "npm:1.2.2"],\
|
||||
["@smithy/fetch-http-handler", "npm:2.3.2"],\
|
||||
["@smithy/hash-node", "npm:2.0.18"],\
|
||||
["@smithy/invalid-dependency", "npm:2.0.16"],\
|
||||
["@smithy/middleware-content-length", "npm:2.0.18"],\
|
||||
["@smithy/middleware-endpoint", "npm:2.3.0"],\
|
||||
["@smithy/middleware-retry", "npm:2.0.26"],\
|
||||
["@smithy/middleware-serde", "npm:2.0.16"],\
|
||||
["@smithy/middleware-stack", "npm:2.0.10"],\
|
||||
["@smithy/node-config-provider", "npm:2.1.9"],\
|
||||
["@smithy/node-http-handler", "npm:2.2.2"],\
|
||||
["@smithy/protocol-http", "npm:3.0.12"],\
|
||||
["@smithy/smithy-client", "npm:2.2.1"],\
|
||||
["@smithy/types", "npm:2.8.0"],\
|
||||
["@smithy/url-parser", "npm:2.0.16"],\
|
||||
["@smithy/util-base64", "npm:2.0.1"],\
|
||||
["@smithy/util-body-length-browser", "npm:2.0.1"],\
|
||||
["@smithy/util-body-length-node", "npm:2.1.0"],\
|
||||
["@smithy/util-defaults-mode-browser", "npm:2.0.24"],\
|
||||
["@smithy/util-defaults-mode-node", "npm:2.0.32"],\
|
||||
["@smithy/util-endpoints", "npm:1.0.8"],\
|
||||
["@smithy/util-middleware", "npm:2.0.9"],\
|
||||
["@smithy/util-retry", "npm:2.0.9"],\
|
||||
["@smithy/util-utf8", "npm:2.0.2"],\
|
||||
["fast-xml-parser", "npm:4.2.5"],\
|
||||
["tslib", "npm:2.5.2"]\
|
||||
],\
|
||||
"linkType": "HARD"\
|
||||
}]\
|
||||
]],\
|
||||
["@aws-sdk/core", [\
|
||||
@@ -576,6 +718,19 @@ const RAW_RUNTIME_STATE =
|
||||
["tslib", "npm:2.5.2"]\
|
||||
],\
|
||||
"linkType": "HARD"\
|
||||
}],\
|
||||
["npm:3.485.0", {\
|
||||
"packageLocation": "./.yarn/cache/@aws-sdk-core-npm-3.485.0-77ed30ee18-b84dafb213.zip/node_modules/@aws-sdk/core/",\
|
||||
"packageDependencies": [\
|
||||
["@aws-sdk/core", "npm:3.485.0"],\
|
||||
["@smithy/core", "npm:1.2.2"],\
|
||||
["@smithy/protocol-http", "npm:3.0.12"],\
|
||||
["@smithy/signature-v4", "npm:2.0.5"],\
|
||||
["@smithy/smithy-client", "npm:2.2.1"],\
|
||||
["@smithy/types", "npm:2.8.0"],\
|
||||
["tslib", "npm:2.5.2"]\
|
||||
],\
|
||||
"linkType": "HARD"\
|
||||
}]\
|
||||
]],\
|
||||
["@aws-sdk/credential-provider-env", [\
|
||||
@@ -589,6 +744,17 @@ const RAW_RUNTIME_STATE =
|
||||
["tslib", "npm:2.5.2"]\
|
||||
],\
|
||||
"linkType": "HARD"\
|
||||
}],\
|
||||
["npm:3.485.0", {\
|
||||
"packageLocation": "./.yarn/cache/@aws-sdk-credential-provider-env-npm-3.485.0-0fda7f74e0-b8346ea6f5.zip/node_modules/@aws-sdk/credential-provider-env/",\
|
||||
"packageDependencies": [\
|
||||
["@aws-sdk/credential-provider-env", "npm:3.485.0"],\
|
||||
["@aws-sdk/types", "npm:3.485.0"],\
|
||||
["@smithy/property-provider", "npm:2.0.5"],\
|
||||
["@smithy/types", "npm:2.8.0"],\
|
||||
["tslib", "npm:2.5.2"]\
|
||||
],\
|
||||
"linkType": "HARD"\
|
||||
}]\
|
||||
]],\
|
||||
["@aws-sdk/credential-provider-ini", [\
|
||||
@@ -608,6 +774,23 @@ const RAW_RUNTIME_STATE =
|
||||
["tslib", "npm:2.5.2"]\
|
||||
],\
|
||||
"linkType": "HARD"\
|
||||
}],\
|
||||
["npm:3.485.0", {\
|
||||
"packageLocation": "./.yarn/cache/@aws-sdk-credential-provider-ini-npm-3.485.0-bec3aaa989-3176b03ee1.zip/node_modules/@aws-sdk/credential-provider-ini/",\
|
||||
"packageDependencies": [\
|
||||
["@aws-sdk/credential-provider-ini", "npm:3.485.0"],\
|
||||
["@aws-sdk/credential-provider-env", "npm:3.485.0"],\
|
||||
["@aws-sdk/credential-provider-process", "npm:3.485.0"],\
|
||||
["@aws-sdk/credential-provider-sso", "npm:3.485.0"],\
|
||||
["@aws-sdk/credential-provider-web-identity", "npm:3.485.0"],\
|
||||
["@aws-sdk/types", "npm:3.485.0"],\
|
||||
["@smithy/credential-provider-imds", "npm:2.0.5"],\
|
||||
["@smithy/property-provider", "npm:2.0.5"],\
|
||||
["@smithy/shared-ini-file-loader", "npm:2.0.6"],\
|
||||
["@smithy/types", "npm:2.8.0"],\
|
||||
["tslib", "npm:2.5.2"]\
|
||||
],\
|
||||
"linkType": "HARD"\
|
||||
}]\
|
||||
]],\
|
||||
["@aws-sdk/credential-provider-node", [\
|
||||
@@ -628,6 +811,24 @@ const RAW_RUNTIME_STATE =
|
||||
["tslib", "npm:2.5.2"]\
|
||||
],\
|
||||
"linkType": "HARD"\
|
||||
}],\
|
||||
["npm:3.485.0", {\
|
||||
"packageLocation": "./.yarn/cache/@aws-sdk-credential-provider-node-npm-3.485.0-9f40e4a3cf-d31e5a95ea.zip/node_modules/@aws-sdk/credential-provider-node/",\
|
||||
"packageDependencies": [\
|
||||
["@aws-sdk/credential-provider-node", "npm:3.485.0"],\
|
||||
["@aws-sdk/credential-provider-env", "npm:3.485.0"],\
|
||||
["@aws-sdk/credential-provider-ini", "npm:3.485.0"],\
|
||||
["@aws-sdk/credential-provider-process", "npm:3.485.0"],\
|
||||
["@aws-sdk/credential-provider-sso", "npm:3.485.0"],\
|
||||
["@aws-sdk/credential-provider-web-identity", "npm:3.485.0"],\
|
||||
["@aws-sdk/types", "npm:3.485.0"],\
|
||||
["@smithy/credential-provider-imds", "npm:2.0.5"],\
|
||||
["@smithy/property-provider", "npm:2.0.5"],\
|
||||
["@smithy/shared-ini-file-loader", "npm:2.0.6"],\
|
||||
["@smithy/types", "npm:2.8.0"],\
|
||||
["tslib", "npm:2.5.2"]\
|
||||
],\
|
||||
"linkType": "HARD"\
|
||||
}]\
|
||||
]],\
|
||||
["@aws-sdk/credential-provider-process", [\
|
||||
@@ -642,6 +843,18 @@ const RAW_RUNTIME_STATE =
|
||||
["tslib", "npm:2.5.2"]\
|
||||
],\
|
||||
"linkType": "HARD"\
|
||||
}],\
|
||||
["npm:3.485.0", {\
|
||||
"packageLocation": "./.yarn/cache/@aws-sdk-credential-provider-process-npm-3.485.0-62d3460338-e740fb949e.zip/node_modules/@aws-sdk/credential-provider-process/",\
|
||||
"packageDependencies": [\
|
||||
["@aws-sdk/credential-provider-process", "npm:3.485.0"],\
|
||||
["@aws-sdk/types", "npm:3.485.0"],\
|
||||
["@smithy/property-provider", "npm:2.0.5"],\
|
||||
["@smithy/shared-ini-file-loader", "npm:2.0.6"],\
|
||||
["@smithy/types", "npm:2.8.0"],\
|
||||
["tslib", "npm:2.5.2"]\
|
||||
],\
|
||||
"linkType": "HARD"\
|
||||
}]\
|
||||
]],\
|
||||
["@aws-sdk/credential-provider-sso", [\
|
||||
@@ -658,6 +871,20 @@ const RAW_RUNTIME_STATE =
|
||||
["tslib", "npm:2.5.2"]\
|
||||
],\
|
||||
"linkType": "HARD"\
|
||||
}],\
|
||||
["npm:3.485.0", {\
|
||||
"packageLocation": "./.yarn/cache/@aws-sdk-credential-provider-sso-npm-3.485.0-42db25db09-7269315797.zip/node_modules/@aws-sdk/credential-provider-sso/",\
|
||||
"packageDependencies": [\
|
||||
["@aws-sdk/credential-provider-sso", "npm:3.485.0"],\
|
||||
["@aws-sdk/client-sso", "npm:3.485.0"],\
|
||||
["@aws-sdk/token-providers", "npm:3.485.0"],\
|
||||
["@aws-sdk/types", "npm:3.485.0"],\
|
||||
["@smithy/property-provider", "npm:2.0.5"],\
|
||||
["@smithy/shared-ini-file-loader", "npm:2.0.6"],\
|
||||
["@smithy/types", "npm:2.8.0"],\
|
||||
["tslib", "npm:2.5.2"]\
|
||||
],\
|
||||
"linkType": "HARD"\
|
||||
}]\
|
||||
]],\
|
||||
["@aws-sdk/credential-provider-web-identity", [\
|
||||
@@ -671,6 +898,17 @@ const RAW_RUNTIME_STATE =
|
||||
["tslib", "npm:2.5.2"]\
|
||||
],\
|
||||
"linkType": "HARD"\
|
||||
}],\
|
||||
["npm:3.485.0", {\
|
||||
"packageLocation": "./.yarn/cache/@aws-sdk-credential-provider-web-identity-npm-3.485.0-420b04bcce-33125ce0b7.zip/node_modules/@aws-sdk/credential-provider-web-identity/",\
|
||||
"packageDependencies": [\
|
||||
["@aws-sdk/credential-provider-web-identity", "npm:3.485.0"],\
|
||||
["@aws-sdk/types", "npm:3.485.0"],\
|
||||
["@smithy/property-provider", "npm:2.0.5"],\
|
||||
["@smithy/types", "npm:2.8.0"],\
|
||||
["tslib", "npm:2.5.2"]\
|
||||
],\
|
||||
"linkType": "HARD"\
|
||||
}]\
|
||||
]],\
|
||||
["@aws-sdk/middleware-bucket-endpoint", [\
|
||||
@@ -730,6 +968,17 @@ const RAW_RUNTIME_STATE =
|
||||
["tslib", "npm:2.5.2"]\
|
||||
],\
|
||||
"linkType": "HARD"\
|
||||
}],\
|
||||
["npm:3.485.0", {\
|
||||
"packageLocation": "./.yarn/cache/@aws-sdk-middleware-host-header-npm-3.485.0-2e625f9614-9ca3da2a26.zip/node_modules/@aws-sdk/middleware-host-header/",\
|
||||
"packageDependencies": [\
|
||||
["@aws-sdk/middleware-host-header", "npm:3.485.0"],\
|
||||
["@aws-sdk/types", "npm:3.485.0"],\
|
||||
["@smithy/protocol-http", "npm:3.0.12"],\
|
||||
["@smithy/types", "npm:2.8.0"],\
|
||||
["tslib", "npm:2.5.2"]\
|
||||
],\
|
||||
"linkType": "HARD"\
|
||||
}]\
|
||||
]],\
|
||||
["@aws-sdk/middleware-location-constraint", [\
|
||||
@@ -754,6 +1003,16 @@ const RAW_RUNTIME_STATE =
|
||||
["tslib", "npm:2.5.2"]\
|
||||
],\
|
||||
"linkType": "HARD"\
|
||||
}],\
|
||||
["npm:3.485.0", {\
|
||||
"packageLocation": "./.yarn/cache/@aws-sdk-middleware-logger-npm-3.485.0-3ff7eeabbb-2fcb731794.zip/node_modules/@aws-sdk/middleware-logger/",\
|
||||
"packageDependencies": [\
|
||||
["@aws-sdk/middleware-logger", "npm:3.485.0"],\
|
||||
["@aws-sdk/types", "npm:3.485.0"],\
|
||||
["@smithy/types", "npm:2.8.0"],\
|
||||
["tslib", "npm:2.5.2"]\
|
||||
],\
|
||||
"linkType": "HARD"\
|
||||
}]\
|
||||
]],\
|
||||
["@aws-sdk/middleware-recursion-detection", [\
|
||||
@@ -767,6 +1026,17 @@ const RAW_RUNTIME_STATE =
|
||||
["tslib", "npm:2.5.2"]\
|
||||
],\
|
||||
"linkType": "HARD"\
|
||||
}],\
|
||||
["npm:3.485.0", {\
|
||||
"packageLocation": "./.yarn/cache/@aws-sdk-middleware-recursion-detection-npm-3.485.0-af05ed4810-afdea18930.zip/node_modules/@aws-sdk/middleware-recursion-detection/",\
|
||||
"packageDependencies": [\
|
||||
["@aws-sdk/middleware-recursion-detection", "npm:3.485.0"],\
|
||||
["@aws-sdk/types", "npm:3.485.0"],\
|
||||
["@smithy/protocol-http", "npm:3.0.12"],\
|
||||
["@smithy/types", "npm:2.8.0"],\
|
||||
["tslib", "npm:2.5.2"]\
|
||||
],\
|
||||
"linkType": "HARD"\
|
||||
}]\
|
||||
]],\
|
||||
["@aws-sdk/middleware-sdk-s3", [\
|
||||
@@ -815,6 +1085,20 @@ const RAW_RUNTIME_STATE =
|
||||
["tslib", "npm:2.5.2"]\
|
||||
],\
|
||||
"linkType": "HARD"\
|
||||
}],\
|
||||
["npm:3.485.0", {\
|
||||
"packageLocation": "./.yarn/cache/@aws-sdk-middleware-signing-npm-3.485.0-3117db6053-f9dbb39d8d.zip/node_modules/@aws-sdk/middleware-signing/",\
|
||||
"packageDependencies": [\
|
||||
["@aws-sdk/middleware-signing", "npm:3.485.0"],\
|
||||
["@aws-sdk/types", "npm:3.485.0"],\
|
||||
["@smithy/property-provider", "npm:2.0.5"],\
|
||||
["@smithy/protocol-http", "npm:3.0.12"],\
|
||||
["@smithy/signature-v4", "npm:2.0.5"],\
|
||||
["@smithy/types", "npm:2.8.0"],\
|
||||
["@smithy/util-middleware", "npm:2.0.9"],\
|
||||
["tslib", "npm:2.5.2"]\
|
||||
],\
|
||||
"linkType": "HARD"\
|
||||
}]\
|
||||
]],\
|
||||
["@aws-sdk/middleware-ssec", [\
|
||||
@@ -841,6 +1125,18 @@ const RAW_RUNTIME_STATE =
|
||||
["tslib", "npm:2.5.2"]\
|
||||
],\
|
||||
"linkType": "HARD"\
|
||||
}],\
|
||||
["npm:3.485.0", {\
|
||||
"packageLocation": "./.yarn/cache/@aws-sdk-middleware-user-agent-npm-3.485.0-983204fccf-a8fc812aff.zip/node_modules/@aws-sdk/middleware-user-agent/",\
|
||||
"packageDependencies": [\
|
||||
["@aws-sdk/middleware-user-agent", "npm:3.485.0"],\
|
||||
["@aws-sdk/types", "npm:3.485.0"],\
|
||||
["@aws-sdk/util-endpoints", "npm:3.485.0"],\
|
||||
["@smithy/protocol-http", "npm:3.0.12"],\
|
||||
["@smithy/types", "npm:2.8.0"],\
|
||||
["tslib", "npm:2.5.2"]\
|
||||
],\
|
||||
"linkType": "HARD"\
|
||||
}]\
|
||||
]],\
|
||||
["@aws-sdk/region-config-resolver", [\
|
||||
@@ -855,6 +1151,18 @@ const RAW_RUNTIME_STATE =
|
||||
["tslib", "npm:2.5.2"]\
|
||||
],\
|
||||
"linkType": "HARD"\
|
||||
}],\
|
||||
["npm:3.485.0", {\
|
||||
"packageLocation": "./.yarn/cache/@aws-sdk-region-config-resolver-npm-3.485.0-1a69e46754-55bc5128b8.zip/node_modules/@aws-sdk/region-config-resolver/",\
|
||||
"packageDependencies": [\
|
||||
["@aws-sdk/region-config-resolver", "npm:3.485.0"],\
|
||||
["@smithy/node-config-provider", "npm:2.1.9"],\
|
||||
["@smithy/types", "npm:2.8.0"],\
|
||||
["@smithy/util-config-provider", "npm:2.1.0"],\
|
||||
["@smithy/util-middleware", "npm:2.0.9"],\
|
||||
["tslib", "npm:2.5.2"]\
|
||||
],\
|
||||
"linkType": "HARD"\
|
||||
}]\
|
||||
]],\
|
||||
["@aws-sdk/signature-v4-multi-region", [\
|
||||
@@ -916,6 +1224,50 @@ const RAW_RUNTIME_STATE =
|
||||
["tslib", "npm:2.5.2"]\
|
||||
],\
|
||||
"linkType": "HARD"\
|
||||
}],\
|
||||
["npm:3.485.0", {\
|
||||
"packageLocation": "./.yarn/cache/@aws-sdk-token-providers-npm-3.485.0-1fb5ab9dfb-aed270b625.zip/node_modules/@aws-sdk/token-providers/",\
|
||||
"packageDependencies": [\
|
||||
["@aws-sdk/token-providers", "npm:3.485.0"],\
|
||||
["@aws-crypto/sha256-browser", "npm:3.0.0"],\
|
||||
["@aws-crypto/sha256-js", "npm:3.0.0"],\
|
||||
["@aws-sdk/middleware-host-header", "npm:3.485.0"],\
|
||||
["@aws-sdk/middleware-logger", "npm:3.485.0"],\
|
||||
["@aws-sdk/middleware-recursion-detection", "npm:3.485.0"],\
|
||||
["@aws-sdk/middleware-user-agent", "npm:3.485.0"],\
|
||||
["@aws-sdk/region-config-resolver", "npm:3.485.0"],\
|
||||
["@aws-sdk/types", "npm:3.485.0"],\
|
||||
["@aws-sdk/util-endpoints", "npm:3.485.0"],\
|
||||
["@aws-sdk/util-user-agent-browser", "npm:3.485.0"],\
|
||||
["@aws-sdk/util-user-agent-node", "virtual:5f6733bd23aee10dd05576af160f1b93e0bb4a20b288e9b818dc0b69bdb08ea1a09d5836816f02bdafc9c01487816ae339c6b680c2f7849dfe249436c5f2b499#npm:3.485.0"],\
|
||||
["@smithy/config-resolver", "npm:2.0.23"],\
|
||||
["@smithy/fetch-http-handler", "npm:2.3.2"],\
|
||||
["@smithy/hash-node", "npm:2.0.18"],\
|
||||
["@smithy/invalid-dependency", "npm:2.0.16"],\
|
||||
["@smithy/middleware-content-length", "npm:2.0.18"],\
|
||||
["@smithy/middleware-endpoint", "npm:2.3.0"],\
|
||||
["@smithy/middleware-retry", "npm:2.0.26"],\
|
||||
["@smithy/middleware-serde", "npm:2.0.16"],\
|
||||
["@smithy/middleware-stack", "npm:2.0.10"],\
|
||||
["@smithy/node-config-provider", "npm:2.1.9"],\
|
||||
["@smithy/node-http-handler", "npm:2.2.2"],\
|
||||
["@smithy/property-provider", "npm:2.0.5"],\
|
||||
["@smithy/protocol-http", "npm:3.0.12"],\
|
||||
["@smithy/shared-ini-file-loader", "npm:2.0.6"],\
|
||||
["@smithy/smithy-client", "npm:2.2.1"],\
|
||||
["@smithy/types", "npm:2.8.0"],\
|
||||
["@smithy/url-parser", "npm:2.0.16"],\
|
||||
["@smithy/util-base64", "npm:2.0.1"],\
|
||||
["@smithy/util-body-length-browser", "npm:2.0.1"],\
|
||||
["@smithy/util-body-length-node", "npm:2.1.0"],\
|
||||
["@smithy/util-defaults-mode-browser", "npm:2.0.24"],\
|
||||
["@smithy/util-defaults-mode-node", "npm:2.0.32"],\
|
||||
["@smithy/util-endpoints", "npm:1.0.8"],\
|
||||
["@smithy/util-retry", "npm:2.0.9"],\
|
||||
["@smithy/util-utf8", "npm:2.0.2"],\
|
||||
["tslib", "npm:2.5.2"]\
|
||||
],\
|
||||
"linkType": "HARD"\
|
||||
}]\
|
||||
]],\
|
||||
["@aws-sdk/types", [\
|
||||
@@ -935,6 +1287,15 @@ const RAW_RUNTIME_STATE =
|
||||
["tslib", "npm:2.5.2"]\
|
||||
],\
|
||||
"linkType": "HARD"\
|
||||
}],\
|
||||
["npm:3.485.0", {\
|
||||
"packageLocation": "./.yarn/cache/@aws-sdk-types-npm-3.485.0-6aa8cab069-588aae4b49.zip/node_modules/@aws-sdk/types/",\
|
||||
"packageDependencies": [\
|
||||
["@aws-sdk/types", "npm:3.485.0"],\
|
||||
["@smithy/types", "npm:2.8.0"],\
|
||||
["tslib", "npm:2.5.2"]\
|
||||
],\
|
||||
"linkType": "HARD"\
|
||||
}]\
|
||||
]],\
|
||||
["@aws-sdk/util-arn-parser", [\
|
||||
@@ -957,6 +1318,16 @@ const RAW_RUNTIME_STATE =
|
||||
["tslib", "npm:2.5.2"]\
|
||||
],\
|
||||
"linkType": "HARD"\
|
||||
}],\
|
||||
["npm:3.485.0", {\
|
||||
"packageLocation": "./.yarn/cache/@aws-sdk-util-endpoints-npm-3.485.0-5e0fad395e-c1844fed8b.zip/node_modules/@aws-sdk/util-endpoints/",\
|
||||
"packageDependencies": [\
|
||||
["@aws-sdk/util-endpoints", "npm:3.485.0"],\
|
||||
["@aws-sdk/types", "npm:3.485.0"],\
|
||||
["@smithy/util-endpoints", "npm:1.0.8"],\
|
||||
["tslib", "npm:2.5.2"]\
|
||||
],\
|
||||
"linkType": "HARD"\
|
||||
}]\
|
||||
]],\
|
||||
["@aws-sdk/util-locate-window", [\
|
||||
@@ -980,6 +1351,17 @@ const RAW_RUNTIME_STATE =
|
||||
["tslib", "npm:2.5.2"]\
|
||||
],\
|
||||
"linkType": "HARD"\
|
||||
}],\
|
||||
["npm:3.485.0", {\
|
||||
"packageLocation": "./.yarn/cache/@aws-sdk-util-user-agent-browser-npm-3.485.0-23925a5581-d1e4d4c635.zip/node_modules/@aws-sdk/util-user-agent-browser/",\
|
||||
"packageDependencies": [\
|
||||
["@aws-sdk/util-user-agent-browser", "npm:3.485.0"],\
|
||||
["@aws-sdk/types", "npm:3.485.0"],\
|
||||
["@smithy/types", "npm:2.8.0"],\
|
||||
["bowser", "npm:2.11.0"],\
|
||||
["tslib", "npm:2.5.2"]\
|
||||
],\
|
||||
"linkType": "HARD"\
|
||||
}]\
|
||||
]],\
|
||||
["@aws-sdk/util-user-agent-node", [\
|
||||
@@ -990,6 +1372,30 @@ const RAW_RUNTIME_STATE =
|
||||
],\
|
||||
"linkType": "SOFT"\
|
||||
}],\
|
||||
["npm:3.485.0", {\
|
||||
"packageLocation": "./.yarn/cache/@aws-sdk-util-user-agent-node-npm-3.485.0-7991a74cb3-e2805ef37b.zip/node_modules/@aws-sdk/util-user-agent-node/",\
|
||||
"packageDependencies": [\
|
||||
["@aws-sdk/util-user-agent-node", "npm:3.485.0"]\
|
||||
],\
|
||||
"linkType": "SOFT"\
|
||||
}],\
|
||||
["virtual:5f6733bd23aee10dd05576af160f1b93e0bb4a20b288e9b818dc0b69bdb08ea1a09d5836816f02bdafc9c01487816ae339c6b680c2f7849dfe249436c5f2b499#npm:3.485.0", {\
|
||||
"packageLocation": "./.yarn/__virtual__/@aws-sdk-util-user-agent-node-virtual-c26ab353dd/0/cache/@aws-sdk-util-user-agent-node-npm-3.485.0-7991a74cb3-e2805ef37b.zip/node_modules/@aws-sdk/util-user-agent-node/",\
|
||||
"packageDependencies": [\
|
||||
["@aws-sdk/util-user-agent-node", "virtual:5f6733bd23aee10dd05576af160f1b93e0bb4a20b288e9b818dc0b69bdb08ea1a09d5836816f02bdafc9c01487816ae339c6b680c2f7849dfe249436c5f2b499#npm:3.485.0"],\
|
||||
["@aws-sdk/types", "npm:3.485.0"],\
|
||||
["@smithy/node-config-provider", "npm:2.1.9"],\
|
||||
["@smithy/types", "npm:2.8.0"],\
|
||||
["@types/aws-crt", null],\
|
||||
["aws-crt", null],\
|
||||
["tslib", "npm:2.5.2"]\
|
||||
],\
|
||||
"packagePeers": [\
|
||||
"@types/aws-crt",\
|
||||
"aws-crt"\
|
||||
],\
|
||||
"linkType": "HARD"\
|
||||
}],\
|
||||
["virtual:f5e5a564ba918754c8b3b080eb29a2688af35b9c1a773de63eb148390564369a40f304a7384da1d22d51cb840254882c972d18d82a96c4804ada9a0446f624d6#npm:3.470.0", {\
|
||||
"packageLocation": "./.yarn/__virtual__/@aws-sdk-util-user-agent-node-virtual-92b1b7bd6e/0/cache/@aws-sdk-util-user-agent-node-npm-3.470.0-99b784cecc-05571ba83d.zip/node_modules/@aws-sdk/util-user-agent-node/",\
|
||||
"packageDependencies": [\
|
||||
@@ -6125,6 +6531,7 @@ const RAW_RUNTIME_STATE =
|
||||
"packageLocation": "./packages/syncing-server/",\
|
||||
"packageDependencies": [\
|
||||
["@standardnotes/syncing-server", "workspace:packages/syncing-server"],\
|
||||
["@aws-sdk/client-cloudwatch", "npm:3.485.0"],\
|
||||
["@aws-sdk/client-s3", "npm:3.484.0"],\
|
||||
["@aws-sdk/client-sns", "npm:3.484.0"],\
|
||||
["@aws-sdk/client-sqs", "npm:3.484.0"],\
|
||||
|
||||
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
BIN
Binary file not shown.
BIN
Binary file not shown.
BIN
Binary file not shown.
BIN
Binary file not shown.
BIN
Binary file not shown.
Vendored
BIN
Binary file not shown.
BIN
Binary file not shown.
Binary file not shown.
BIN
Binary file not shown.
BIN
Binary file not shown.
BIN
Binary file not shown.
BIN
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
BIN
Binary file not shown.
BIN
Binary file not shown.
@@ -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.
|
||||
|
||||
## [2.34.14](https://github.com/standardnotes/server/compare/@standardnotes/analytics@2.34.13...@standardnotes/analytics@2.34.14) (2024-01-04)
|
||||
|
||||
**Note:** Version bump only for package @standardnotes/analytics
|
||||
|
||||
## [2.34.13](https://github.com/standardnotes/server/compare/@standardnotes/analytics@2.34.12...@standardnotes/analytics@2.34.13) (2024-01-03)
|
||||
|
||||
**Note:** Version bump only for package @standardnotes/analytics
|
||||
|
||||
## [2.34.12](https://github.com/standardnotes/server/compare/@standardnotes/analytics@2.34.11...@standardnotes/analytics@2.34.12) (2024-01-03)
|
||||
|
||||
**Note:** Version bump only for package @standardnotes/analytics
|
||||
|
||||
@@ -1,6 +1,6 @@
|
||||
{
|
||||
"name": "@standardnotes/analytics",
|
||||
"version": "2.34.12",
|
||||
"version": "2.34.14",
|
||||
"engines": {
|
||||
"node": ">=18.0.0 <21.0.0"
|
||||
},
|
||||
|
||||
@@ -3,6 +3,26 @@
|
||||
All notable changes to this project will be documented in this file.
|
||||
See [Conventional Commits](https://conventionalcommits.org) for commit guidelines.
|
||||
|
||||
## [1.89.17](https://github.com/standardnotes/server/compare/@standardnotes/api-gateway@1.89.16...@standardnotes/api-gateway@1.89.17) (2024-01-04)
|
||||
|
||||
### Bug Fixes
|
||||
|
||||
* **api-gateway:** disable http call retries ([7abd80c](https://github.com/standardnotes/server/commit/7abd80cdbaba53840f632d418bd557b35b722699))
|
||||
|
||||
## [1.89.16](https://github.com/standardnotes/server/compare/@standardnotes/api-gateway@1.89.15...@standardnotes/api-gateway@1.89.16) (2024-01-04)
|
||||
|
||||
### Bug Fixes
|
||||
|
||||
* **api-gateway:** disable sync request retries ([d2a371b](https://github.com/standardnotes/server/commit/d2a371b92c8b2b7f8921fe57f162e74d4944715d))
|
||||
|
||||
## [1.89.15](https://github.com/standardnotes/server/compare/@standardnotes/api-gateway@1.89.14...@standardnotes/api-gateway@1.89.15) (2024-01-04)
|
||||
|
||||
**Note:** Version bump only for package @standardnotes/api-gateway
|
||||
|
||||
## [1.89.14](https://github.com/standardnotes/server/compare/@standardnotes/api-gateway@1.89.13...@standardnotes/api-gateway@1.89.14) (2024-01-03)
|
||||
|
||||
**Note:** Version bump only for package @standardnotes/api-gateway
|
||||
|
||||
## [1.89.13](https://github.com/standardnotes/server/compare/@standardnotes/api-gateway@1.89.12...@standardnotes/api-gateway@1.89.13) (2024-01-03)
|
||||
|
||||
**Note:** Version bump only for package @standardnotes/api-gateway
|
||||
|
||||
@@ -1,6 +1,6 @@
|
||||
{
|
||||
"name": "@standardnotes/api-gateway",
|
||||
"version": "1.89.13",
|
||||
"version": "1.89.17",
|
||||
"engines": {
|
||||
"node": ">=18.0.0 <21.0.0"
|
||||
},
|
||||
|
||||
@@ -175,7 +175,6 @@ export class HttpServiceProxy implements ServiceProxyInterface {
|
||||
response: Response,
|
||||
endpoint: string,
|
||||
payload?: Record<string, unknown> | string,
|
||||
retryAttempt?: number,
|
||||
): Promise<AxiosResponse | undefined> {
|
||||
try {
|
||||
const headers: Record<string, string> = {}
|
||||
@@ -213,33 +212,15 @@ export class HttpServiceProxy implements ServiceProxyInterface {
|
||||
await this.crossServiceTokenCache.invalidate(userUuid)
|
||||
}
|
||||
|
||||
if (retryAttempt) {
|
||||
this.logger.debug(`Request to ${serverUrl}/${endpoint} succeeded after ${retryAttempt} retries`)
|
||||
}
|
||||
|
||||
return serviceResponse
|
||||
} catch (error) {
|
||||
const requestDidNotMakeIt = this.requestTimedOutOrDidNotReachDestination(error as Record<string, unknown>)
|
||||
const tooManyRetryAttempts = retryAttempt && retryAttempt > 2
|
||||
if (!tooManyRetryAttempts && requestDidNotMakeIt) {
|
||||
await this.timer.sleep(50)
|
||||
|
||||
const nextRetryAttempt = retryAttempt ? retryAttempt + 1 : 1
|
||||
|
||||
this.logger.debug(`Retrying request to ${serverUrl}/${endpoint} for the ${nextRetryAttempt} time`)
|
||||
|
||||
return this.getServerResponse(serverUrl, request, response, endpoint, payload, nextRetryAttempt)
|
||||
}
|
||||
|
||||
let detailedErrorMessage = (error as Error).message
|
||||
if (error instanceof AxiosError) {
|
||||
detailedErrorMessage = `Status: ${error.status}, code: ${error.code}, message: ${error.message}`
|
||||
}
|
||||
|
||||
this.logger.error(
|
||||
tooManyRetryAttempts
|
||||
? `Request to ${serverUrl}/${endpoint} timed out after ${retryAttempt} retries`
|
||||
: `Could not pass the request to ${serverUrl}/${endpoint} on underlying service: ${detailedErrorMessage}`,
|
||||
`Could not pass the request to ${serverUrl}/${endpoint} on underlying service: ${detailedErrorMessage}`,
|
||||
{
|
||||
userId: response.locals.user ? response.locals.user.uuid : undefined,
|
||||
},
|
||||
|
||||
@@ -134,48 +134,21 @@ export class GRPCServiceProxy implements ServiceProxyInterface {
|
||||
request: Request,
|
||||
response: Response,
|
||||
payload?: Record<string, unknown> | string,
|
||||
retryAttempt?: number,
|
||||
): Promise<void> {
|
||||
try {
|
||||
const result = await this.gRPCSyncingServerServiceProxy.sync(request, response, payload)
|
||||
const result = await this.gRPCSyncingServerServiceProxy.sync(request, response, payload)
|
||||
|
||||
response.status(result.status).send({
|
||||
meta: {
|
||||
auth: {
|
||||
userUuid: response.locals.user?.uuid,
|
||||
roles: response.locals.roles,
|
||||
},
|
||||
server: {
|
||||
filesServerUrl: this.filesServerUrl,
|
||||
},
|
||||
response.status(result.status).send({
|
||||
meta: {
|
||||
auth: {
|
||||
userUuid: response.locals.user?.uuid,
|
||||
roles: response.locals.roles,
|
||||
},
|
||||
data: result.data,
|
||||
})
|
||||
|
||||
if (retryAttempt) {
|
||||
this.logger.debug(`Request to Syncing Server succeeded after ${retryAttempt} retries`, {
|
||||
userId: response.locals.user ? response.locals.user.uuid : undefined,
|
||||
})
|
||||
}
|
||||
} catch (error) {
|
||||
const requestDidNotMakeIt =
|
||||
'code' in (error as Record<string, unknown>) && (error as Record<string, unknown>).code === Status.UNAVAILABLE
|
||||
|
||||
const tooManyRetryAttempts = retryAttempt && retryAttempt > 2
|
||||
if (!tooManyRetryAttempts && requestDidNotMakeIt) {
|
||||
await this.timer.sleep(50)
|
||||
|
||||
const nextRetryAttempt = retryAttempt ? retryAttempt + 1 : 1
|
||||
|
||||
this.logger.debug(`Retrying request to Syncing Server for the ${nextRetryAttempt} time`, {
|
||||
userId: response.locals.user ? response.locals.user.uuid : undefined,
|
||||
})
|
||||
|
||||
return this.callSyncingServerGRPC(request, response, payload, nextRetryAttempt)
|
||||
}
|
||||
|
||||
throw error
|
||||
}
|
||||
server: {
|
||||
filesServerUrl: this.filesServerUrl,
|
||||
},
|
||||
},
|
||||
data: result.data,
|
||||
})
|
||||
}
|
||||
|
||||
async callRevisionsServer(
|
||||
|
||||
@@ -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.177.13](https://github.com/standardnotes/server/compare/@standardnotes/auth-server@1.177.12...@standardnotes/auth-server@1.177.13) (2024-01-04)
|
||||
|
||||
**Note:** Version bump only for package @standardnotes/auth-server
|
||||
|
||||
## [1.177.12](https://github.com/standardnotes/server/compare/@standardnotes/auth-server@1.177.11...@standardnotes/auth-server@1.177.12) (2024-01-03)
|
||||
|
||||
**Note:** Version bump only for package @standardnotes/auth-server
|
||||
|
||||
## [1.177.11](https://github.com/standardnotes/server/compare/@standardnotes/auth-server@1.177.10...@standardnotes/auth-server@1.177.11) (2024-01-03)
|
||||
|
||||
**Note:** Version bump only for package @standardnotes/auth-server
|
||||
|
||||
@@ -1,6 +1,6 @@
|
||||
{
|
||||
"name": "@standardnotes/auth-server",
|
||||
"version": "1.177.11",
|
||||
"version": "1.177.13",
|
||||
"engines": {
|
||||
"node": ">=18.0.0 <21.0.0"
|
||||
},
|
||||
|
||||
@@ -3,6 +3,13 @@
|
||||
All notable changes to this project will be documented in this file.
|
||||
See [Conventional Commits](https://conventionalcommits.org) for commit guidelines.
|
||||
|
||||
## [1.23.1](https://github.com/standardnotes/server/compare/@standardnotes/domain-events-infra@1.23.0...@standardnotes/domain-events-infra@1.23.1) (2024-01-03)
|
||||
|
||||
### Bug Fixes
|
||||
|
||||
* **domain-events-infra:** increase default span ratio ([88a5de7](https://github.com/standardnotes/server/commit/88a5de766ced10a1383c73bd04f6b2faa9f9b2a6))
|
||||
* **syncing-server:** add opentelemetry sdk shutdown ([a0e523e](https://github.com/standardnotes/server/commit/a0e523e64c14641c0ac9774d3bc775217eff64be))
|
||||
|
||||
# [1.23.0](https://github.com/standardnotes/server/compare/@standardnotes/domain-events-infra@1.22.10...@standardnotes/domain-events-infra@1.23.0) (2024-01-03)
|
||||
|
||||
### Features
|
||||
|
||||
@@ -1,6 +1,6 @@
|
||||
{
|
||||
"name": "@standardnotes/domain-events-infra",
|
||||
"version": "1.23.0",
|
||||
"version": "1.23.1",
|
||||
"engines": {
|
||||
"node": ">=18.0.0 <21.0.0"
|
||||
},
|
||||
|
||||
@@ -54,7 +54,7 @@ export class OpenTelemetrySDK implements OpenTelemetrySDKInterface {
|
||||
},
|
||||
})
|
||||
|
||||
const ratio = this.options.spanRatio ?? 0.01
|
||||
const ratio = this.options.spanRatio ?? 0.1
|
||||
|
||||
this.sdk = new OpenTelemetrySDKNode.NodeSDK({
|
||||
sampler: new OpenTelemetrySDKNode.tracing.TraceIdRatioBasedSampler(ratio),
|
||||
@@ -98,4 +98,8 @@ export class OpenTelemetrySDK implements OpenTelemetrySDKInterface {
|
||||
start(): void {
|
||||
this.sdk.start()
|
||||
}
|
||||
|
||||
async shutdown(): Promise<void> {
|
||||
await this.sdk.shutdown()
|
||||
}
|
||||
}
|
||||
|
||||
@@ -1,3 +1,4 @@
|
||||
export interface OpenTelemetrySDKInterface {
|
||||
start(): void
|
||||
shutdown(): Promise<void>
|
||||
}
|
||||
|
||||
@@ -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.37.8](https://github.com/standardnotes/server/compare/@standardnotes/files-server@1.37.7...@standardnotes/files-server@1.37.8) (2024-01-04)
|
||||
|
||||
**Note:** Version bump only for package @standardnotes/files-server
|
||||
|
||||
## [1.37.7](https://github.com/standardnotes/server/compare/@standardnotes/files-server@1.37.6...@standardnotes/files-server@1.37.7) (2024-01-03)
|
||||
|
||||
**Note:** Version bump only for package @standardnotes/files-server
|
||||
|
||||
## [1.37.6](https://github.com/standardnotes/server/compare/@standardnotes/files-server@1.37.5...@standardnotes/files-server@1.37.6) (2024-01-03)
|
||||
|
||||
**Note:** Version bump only for package @standardnotes/files-server
|
||||
|
||||
@@ -1,6 +1,6 @@
|
||||
{
|
||||
"name": "@standardnotes/files-server",
|
||||
"version": "1.37.6",
|
||||
"version": "1.37.8",
|
||||
"engines": {
|
||||
"node": ">=18.0.0 <21.0.0"
|
||||
},
|
||||
|
||||
@@ -3,6 +3,58 @@
|
||||
All notable changes to this project will be documented in this file.
|
||||
See [Conventional Commits](https://conventionalcommits.org) for commit guidelines.
|
||||
|
||||
## [1.22.49](https://github.com/standardnotes/server/compare/@standardnotes/home-server@1.22.48...@standardnotes/home-server@1.22.49) (2024-01-05)
|
||||
|
||||
**Note:** Version bump only for package @standardnotes/home-server
|
||||
|
||||
## [1.22.48](https://github.com/standardnotes/server/compare/@standardnotes/home-server@1.22.47...@standardnotes/home-server@1.22.48) (2024-01-05)
|
||||
|
||||
**Note:** Version bump only for package @standardnotes/home-server
|
||||
|
||||
## [1.22.47](https://github.com/standardnotes/server/compare/@standardnotes/home-server@1.22.46...@standardnotes/home-server@1.22.47) (2024-01-05)
|
||||
|
||||
**Note:** Version bump only for package @standardnotes/home-server
|
||||
|
||||
## [1.22.46](https://github.com/standardnotes/server/compare/@standardnotes/home-server@1.22.45...@standardnotes/home-server@1.22.46) (2024-01-05)
|
||||
|
||||
**Note:** Version bump only for package @standardnotes/home-server
|
||||
|
||||
## [1.22.45](https://github.com/standardnotes/server/compare/@standardnotes/home-server@1.22.44...@standardnotes/home-server@1.22.45) (2024-01-04)
|
||||
|
||||
**Note:** Version bump only for package @standardnotes/home-server
|
||||
|
||||
## [1.22.44](https://github.com/standardnotes/server/compare/@standardnotes/home-server@1.22.43...@standardnotes/home-server@1.22.44) (2024-01-04)
|
||||
|
||||
**Note:** Version bump only for package @standardnotes/home-server
|
||||
|
||||
## [1.22.43](https://github.com/standardnotes/server/compare/@standardnotes/home-server@1.22.42...@standardnotes/home-server@1.22.43) (2024-01-04)
|
||||
|
||||
**Note:** Version bump only for package @standardnotes/home-server
|
||||
|
||||
## [1.22.42](https://github.com/standardnotes/server/compare/@standardnotes/home-server@1.22.41...@standardnotes/home-server@1.22.42) (2024-01-04)
|
||||
|
||||
**Note:** Version bump only for package @standardnotes/home-server
|
||||
|
||||
## [1.22.41](https://github.com/standardnotes/server/compare/@standardnotes/home-server@1.22.40...@standardnotes/home-server@1.22.41) (2024-01-04)
|
||||
|
||||
**Note:** Version bump only for package @standardnotes/home-server
|
||||
|
||||
## [1.22.40](https://github.com/standardnotes/server/compare/@standardnotes/home-server@1.22.39...@standardnotes/home-server@1.22.40) (2024-01-04)
|
||||
|
||||
**Note:** Version bump only for package @standardnotes/home-server
|
||||
|
||||
## [1.22.39](https://github.com/standardnotes/server/compare/@standardnotes/home-server@1.22.38...@standardnotes/home-server@1.22.39) (2024-01-04)
|
||||
|
||||
**Note:** Version bump only for package @standardnotes/home-server
|
||||
|
||||
## [1.22.38](https://github.com/standardnotes/server/compare/@standardnotes/home-server@1.22.37...@standardnotes/home-server@1.22.38) (2024-01-04)
|
||||
|
||||
**Note:** Version bump only for package @standardnotes/home-server
|
||||
|
||||
## [1.22.37](https://github.com/standardnotes/server/compare/@standardnotes/home-server@1.22.36...@standardnotes/home-server@1.22.37) (2024-01-03)
|
||||
|
||||
**Note:** Version bump only for package @standardnotes/home-server
|
||||
|
||||
## [1.22.36](https://github.com/standardnotes/server/compare/@standardnotes/home-server@1.22.35...@standardnotes/home-server@1.22.36) (2024-01-03)
|
||||
|
||||
**Note:** Version bump only for package @standardnotes/home-server
|
||||
|
||||
@@ -1,6 +1,6 @@
|
||||
{
|
||||
"name": "@standardnotes/home-server",
|
||||
"version": "1.22.36",
|
||||
"version": "1.22.49",
|
||||
"engines": {
|
||||
"node": ">=18.0.0 <21.0.0"
|
||||
},
|
||||
|
||||
@@ -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.51.14](https://github.com/standardnotes/server/compare/@standardnotes/revisions-server@1.51.13...@standardnotes/revisions-server@1.51.14) (2024-01-04)
|
||||
|
||||
**Note:** Version bump only for package @standardnotes/revisions-server
|
||||
|
||||
## [1.51.13](https://github.com/standardnotes/server/compare/@standardnotes/revisions-server@1.51.12...@standardnotes/revisions-server@1.51.13) (2024-01-03)
|
||||
|
||||
**Note:** Version bump only for package @standardnotes/revisions-server
|
||||
|
||||
## [1.51.12](https://github.com/standardnotes/server/compare/@standardnotes/revisions-server@1.51.11...@standardnotes/revisions-server@1.51.12) (2024-01-03)
|
||||
|
||||
**Note:** Version bump only for package @standardnotes/revisions-server
|
||||
|
||||
@@ -1,6 +1,6 @@
|
||||
{
|
||||
"name": "@standardnotes/revisions-server",
|
||||
"version": "1.51.12",
|
||||
"version": "1.51.14",
|
||||
"engines": {
|
||||
"node": ">=18.0.0 <21.0.0"
|
||||
},
|
||||
|
||||
@@ -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.27.19](https://github.com/standardnotes/server/compare/@standardnotes/scheduler-server@1.27.18...@standardnotes/scheduler-server@1.27.19) (2024-01-04)
|
||||
|
||||
**Note:** Version bump only for package @standardnotes/scheduler-server
|
||||
|
||||
## [1.27.18](https://github.com/standardnotes/server/compare/@standardnotes/scheduler-server@1.27.17...@standardnotes/scheduler-server@1.27.18) (2024-01-03)
|
||||
|
||||
**Note:** Version bump only for package @standardnotes/scheduler-server
|
||||
|
||||
## [1.27.17](https://github.com/standardnotes/server/compare/@standardnotes/scheduler-server@1.27.16...@standardnotes/scheduler-server@1.27.17) (2024-01-03)
|
||||
|
||||
**Note:** Version bump only for package @standardnotes/scheduler-server
|
||||
|
||||
@@ -1,6 +1,6 @@
|
||||
{
|
||||
"name": "@standardnotes/scheduler-server",
|
||||
"version": "1.27.17",
|
||||
"version": "1.27.19",
|
||||
"engines": {
|
||||
"node": ">=18.0.0 <21.0.0"
|
||||
},
|
||||
|
||||
@@ -41,3 +41,6 @@ FILE_UPLOAD_PATH=
|
||||
|
||||
VALET_TOKEN_SECRET=change-me-!
|
||||
VALET_TOKEN_TTL=7200
|
||||
|
||||
REDIS_URL=redis://cache
|
||||
CACHE_TYPE=redis
|
||||
|
||||
@@ -3,6 +3,76 @@
|
||||
All notable changes to this project will be documented in this file.
|
||||
See [Conventional Commits](https://conventionalcommits.org) for commit guidelines.
|
||||
|
||||
## [1.133.3](https://github.com/standardnotes/server/compare/@standardnotes/syncing-server@1.133.2...@standardnotes/syncing-server@1.133.3) (2024-01-05)
|
||||
|
||||
### Bug Fixes
|
||||
|
||||
* **syncing-server:** add traffic abuse check in gRPC coms ([e3cb1fa](https://github.com/standardnotes/server/commit/e3cb1faba46bbfd8741f6c827daa9438934dd710))
|
||||
* **syncing-server:** remove excessive debug logs ([5c5f988](https://github.com/standardnotes/server/commit/5c5f9880556f14f5cbe4599ac0d639c970495056))
|
||||
|
||||
## [1.133.2](https://github.com/standardnotes/server/compare/@standardnotes/syncing-server@1.133.1...@standardnotes/syncing-server@1.133.2) (2024-01-05)
|
||||
|
||||
### Bug Fixes
|
||||
|
||||
* **syncing-server:** add debug logs to redis metrics store ([a4ad37f](https://github.com/standardnotes/server/commit/a4ad37f30948ba4292f367240c3dbfca916282ac))
|
||||
* **syncing-server:** add metadata to transfer breach logs ([73c2cc1](https://github.com/standardnotes/server/commit/73c2cc1222b647e82de3755c7e28d283cd9f872f))
|
||||
|
||||
## [1.133.1](https://github.com/standardnotes/server/compare/@standardnotes/syncing-server@1.133.0...@standardnotes/syncing-server@1.133.1) (2024-01-05)
|
||||
|
||||
### Bug Fixes
|
||||
|
||||
* **syncing-server:** add debug logs for checking traffic abuse ([1f4b26d](https://github.com/standardnotes/server/commit/1f4b26d269a92f5b43455ce3a3cf3d4f15f0d099))
|
||||
* **syncing-server:** error message ([e253825](https://github.com/standardnotes/server/commit/e253825da69d1be6d7bb4d0360f8c3add73516ef))
|
||||
* **syncing-server:** metadata in logs ([02f4d5c](https://github.com/standardnotes/server/commit/02f4d5c717cef1014930f11b2792868967812042))
|
||||
|
||||
# [1.133.0](https://github.com/standardnotes/server/compare/@standardnotes/syncing-server@1.132.0...@standardnotes/syncing-server@1.133.0) (2024-01-05)
|
||||
|
||||
### Features
|
||||
|
||||
* **syncing-server:** add traffic abuse checks ([#1014](https://github.com/standardnotes/server/issues/1014)) ([b717334](https://github.com/standardnotes/server/commit/b7173346d2949269b762b023da9ea67b7f327c35))
|
||||
|
||||
# [1.132.0](https://github.com/standardnotes/server/compare/@standardnotes/syncing-server@1.131.0...@standardnotes/syncing-server@1.132.0) (2024-01-04)
|
||||
|
||||
### Features
|
||||
|
||||
* **syncing-server:** send user based metrics to cloudwatch ([0c3bc0c](https://github.com/standardnotes/server/commit/0c3bc0cae654a6783f85e86995f978cc458d8b5c))
|
||||
|
||||
# [1.131.0](https://github.com/standardnotes/server/compare/@standardnotes/syncing-server@1.130.3...@standardnotes/syncing-server@1.131.0) (2024-01-04)
|
||||
|
||||
### Features
|
||||
|
||||
* **syncing-server:** store per user content size utilization and item operations metrics ([4dd2eb9](https://github.com/standardnotes/server/commit/4dd2eb9349eb16006d1ebba99c848b8f6c51baf9))
|
||||
|
||||
## [1.130.3](https://github.com/standardnotes/server/compare/@standardnotes/syncing-server@1.130.2...@standardnotes/syncing-server@1.130.3) (2024-01-04)
|
||||
|
||||
### Bug Fixes
|
||||
|
||||
* **syncing-server:** decrease metric expiration time ([f1aa431](https://github.com/standardnotes/server/commit/f1aa431c223714e56942a32ab75e380baf4f84aa))
|
||||
|
||||
## [1.130.2](https://github.com/standardnotes/server/compare/@standardnotes/syncing-server@1.130.1...@standardnotes/syncing-server@1.130.2) (2024-01-04)
|
||||
|
||||
### Bug Fixes
|
||||
|
||||
* **syncing-server:** amount of minutes to process for metrics ([92bb447](https://github.com/standardnotes/server/commit/92bb447cacd0a40f963c2bfa5e61cb0f451959e6))
|
||||
|
||||
## [1.130.1](https://github.com/standardnotes/server/compare/@standardnotes/syncing-server@1.130.0...@standardnotes/syncing-server@1.130.1) (2024-01-04)
|
||||
|
||||
### Bug Fixes
|
||||
|
||||
* **syncing-server:** skip sending empty metrics ([2c732ff](https://github.com/standardnotes/server/commit/2c732ff713736b845691e5e195f6a99086b6f2d7))
|
||||
|
||||
# [1.130.0](https://github.com/standardnotes/server/compare/@standardnotes/syncing-server@1.129.11...@standardnotes/syncing-server@1.130.0) (2024-01-04)
|
||||
|
||||
### Features
|
||||
|
||||
* add storing item saving and modifying metrics ([#1013](https://github.com/standardnotes/server/issues/1013)) ([efd816a](https://github.com/standardnotes/server/commit/efd816a627d59f4baaa69aa081c2ad9c88af971c))
|
||||
|
||||
## [1.129.11](https://github.com/standardnotes/server/compare/@standardnotes/syncing-server@1.129.10...@standardnotes/syncing-server@1.129.11) (2024-01-03)
|
||||
|
||||
### Bug Fixes
|
||||
|
||||
* **syncing-server:** add opentelemetry sdk shutdown ([a0e523e](https://github.com/standardnotes/server/commit/a0e523e64c14641c0ac9774d3bc775217eff64be))
|
||||
|
||||
## [1.129.10](https://github.com/standardnotes/server/compare/@standardnotes/syncing-server@1.129.9...@standardnotes/syncing-server@1.129.10) (2024-01-03)
|
||||
|
||||
### Bug Fixes
|
||||
|
||||
@@ -29,6 +29,7 @@ import { SyncingServer } from '../src/Infra/gRPC/SyncingServer'
|
||||
import { SyncItems } from '../src/Domain/UseCase/Syncing/SyncItems/SyncItems'
|
||||
import { SyncResponseFactoryResolverInterface } from '../src/Domain/Item/SyncResponse/SyncResponseFactoryResolverInterface'
|
||||
import { SyncResponse20200115 } from '../src/Domain/Item/SyncResponse/SyncResponse20200115'
|
||||
import { CheckForTrafficAbuse } from '../src/Domain/UseCase/Syncing/CheckForTrafficAbuse/CheckForTrafficAbuse'
|
||||
|
||||
const container = new ContainerConfigLoader()
|
||||
void container.load().then((container) => {
|
||||
@@ -114,6 +115,12 @@ void container.load().then((container) => {
|
||||
container.get<SyncItems>(TYPES.Sync_SyncItems),
|
||||
container.get<SyncResponseFactoryResolverInterface>(TYPES.Sync_SyncResponseFactoryResolver),
|
||||
container.get<MapperInterface<SyncResponse20200115, SyncResponse>>(TYPES.Sync_SyncResponseGRPCMapper),
|
||||
container.get<CheckForTrafficAbuse>(TYPES.Sync_CheckForTrafficAbuse),
|
||||
container.get<boolean>(TYPES.Sync_STRICT_ABUSE_PROTECTION),
|
||||
container.get<number>(TYPES.Sync_ITEM_OPERATIONS_ABUSE_TIMEFRAME_LENGTH_IN_MINUTES),
|
||||
container.get<number>(TYPES.Sync_ITEM_OPERATIONS_ABUSE_THRESHOLD),
|
||||
container.get<number>(TYPES.Sync_PAYLOAD_SIZE_ABUSE_THRESHOLD),
|
||||
container.get<number>(TYPES.Sync_PAYLOAD_SIZE_ABUSE_TIMEFRAME_LENGTH_IN_MINUTES),
|
||||
container.get<winston.Logger>(TYPES.Sync_Logger),
|
||||
)
|
||||
|
||||
@@ -146,6 +153,14 @@ void container.load().then((container) => {
|
||||
logger.info('gRPC server closed')
|
||||
}
|
||||
})
|
||||
sdk
|
||||
.shutdown()
|
||||
.then(() => {
|
||||
logger.info('OpenTelemetry SDK shut down')
|
||||
})
|
||||
.catch((error) => {
|
||||
logger.error(`Failed to shut down OpenTelemetry SDK: ${error.message}`)
|
||||
})
|
||||
})
|
||||
|
||||
logger.info(`Server started on port ${process.env.PORT}`)
|
||||
|
||||
@@ -0,0 +1,118 @@
|
||||
import 'reflect-metadata'
|
||||
|
||||
import { Logger } from 'winston'
|
||||
import { CloudWatchClient, PutMetricDataCommand } from '@aws-sdk/client-cloudwatch'
|
||||
|
||||
import { ContainerConfigLoader } from '../src/Bootstrap/Container'
|
||||
import TYPES from '../src/Bootstrap/Types'
|
||||
import { Env } from '../src/Bootstrap/Env'
|
||||
import { MetricsStoreInterface } from '../src/Domain/Metrics/MetricsStoreInterface'
|
||||
import { Metric } from '../src/Domain/Metrics/Metric'
|
||||
import { Time, TimerInterface } from '@standardnotes/time'
|
||||
|
||||
const sendStatistics = async (
|
||||
metricsStore: MetricsStoreInterface,
|
||||
timer: TimerInterface,
|
||||
awsRegion: string,
|
||||
): Promise<void> => {
|
||||
const cloudwatchClient = new CloudWatchClient({
|
||||
region: awsRegion,
|
||||
})
|
||||
|
||||
const minutesToProcess = 30
|
||||
|
||||
const metricsToProcess = [Metric.NAMES.ItemCreated, Metric.NAMES.ItemUpdated]
|
||||
|
||||
for (const metricToProcess of metricsToProcess) {
|
||||
for (let i = 0; i <= minutesToProcess; i++) {
|
||||
const dateNMinutesAgo = timer.getUTCDateNMinutesAgo(minutesToProcess - i)
|
||||
const timestamp = timer.convertDateToMicroseconds(dateNMinutesAgo)
|
||||
|
||||
const statistics = await metricsStore.getMetricsSummary(
|
||||
metricToProcess,
|
||||
timestamp,
|
||||
timestamp + Time.MicrosecondsInAMinute,
|
||||
)
|
||||
|
||||
if (statistics.sampleCount === 0) {
|
||||
continue
|
||||
}
|
||||
|
||||
await cloudwatchClient.send(
|
||||
new PutMetricDataCommand({
|
||||
Namespace: 'SyncingServer',
|
||||
MetricData: [
|
||||
{
|
||||
MetricName: metricToProcess,
|
||||
Timestamp: dateNMinutesAgo,
|
||||
StatisticValues: {
|
||||
Maximum: statistics.max,
|
||||
Minimum: statistics.min,
|
||||
SampleCount: statistics.sampleCount,
|
||||
Sum: statistics.sum,
|
||||
},
|
||||
},
|
||||
],
|
||||
}),
|
||||
)
|
||||
}
|
||||
}
|
||||
|
||||
const userMetricsToProcess = [Metric.NAMES.ItemOperation, Metric.NAMES.ContentSizeUtilized]
|
||||
for (const metricToProcess of userMetricsToProcess) {
|
||||
for (let i = 0; i <= minutesToProcess; i++) {
|
||||
const dateNMinutesAgo = timer.getUTCDateNMinutesAgo(minutesToProcess - i)
|
||||
const timestamp = timer.convertDateToMicroseconds(dateNMinutesAgo)
|
||||
|
||||
const statistics = await metricsStore.getUserBasedMetricsSummary(metricToProcess, timestamp)
|
||||
|
||||
if (statistics.sampleCount === 0) {
|
||||
continue
|
||||
}
|
||||
|
||||
await cloudwatchClient.send(
|
||||
new PutMetricDataCommand({
|
||||
Namespace: 'SyncingServer',
|
||||
MetricData: [
|
||||
{
|
||||
MetricName: metricToProcess,
|
||||
Timestamp: dateNMinutesAgo,
|
||||
StatisticValues: {
|
||||
Maximum: statistics.max,
|
||||
Minimum: statistics.min,
|
||||
SampleCount: statistics.sampleCount,
|
||||
Sum: statistics.sum,
|
||||
},
|
||||
},
|
||||
],
|
||||
}),
|
||||
)
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
const container = new ContainerConfigLoader('worker')
|
||||
void container.load().then((container) => {
|
||||
const env: Env = new Env()
|
||||
env.load()
|
||||
|
||||
const logger: Logger = container.get(TYPES.Sync_Logger)
|
||||
|
||||
logger.info('Starting statistics sending')
|
||||
|
||||
const metricsStore = container.get<MetricsStoreInterface>(TYPES.Sync_MetricsStore)
|
||||
const timer = container.get<TimerInterface>(TYPES.Sync_Timer)
|
||||
const awsRegion = env.get('SNS_AWS_REGION', true)
|
||||
|
||||
Promise.resolve(sendStatistics(metricsStore, timer, awsRegion))
|
||||
.then(() => {
|
||||
logger.info('Finished statistics sending')
|
||||
|
||||
process.exit(0)
|
||||
})
|
||||
.catch((error) => {
|
||||
logger.error('Error while sending statistics', error)
|
||||
|
||||
process.exit(1)
|
||||
})
|
||||
})
|
||||
@@ -0,0 +1,11 @@
|
||||
'use strict'
|
||||
|
||||
const path = require('path')
|
||||
|
||||
const pnp = require(path.normalize(path.resolve(__dirname, '../../..', '.pnp.cjs'))).setup()
|
||||
|
||||
const index = require(path.normalize(path.resolve(__dirname, '../dist/bin/statistics.js')))
|
||||
|
||||
Object.defineProperty(exports, '__esModule', { value: true })
|
||||
|
||||
exports.default = index
|
||||
@@ -5,15 +5,17 @@ COMMAND=$1 && shift 1
|
||||
|
||||
case "$COMMAND" in
|
||||
'start-web' )
|
||||
echo "[Docker] Starting Web..."
|
||||
exec node docker/entrypoint-server.js
|
||||
;;
|
||||
|
||||
'start-worker' )
|
||||
echo "[Docker] Starting Worker..."
|
||||
exec node docker/entrypoint-worker.js
|
||||
;;
|
||||
|
||||
'statistics' )
|
||||
exec node docker/entrypoint-statistics.js
|
||||
;;
|
||||
|
||||
* )
|
||||
echo "[Docker] Unknown command"
|
||||
;;
|
||||
|
||||
@@ -1,6 +1,6 @@
|
||||
{
|
||||
"name": "@standardnotes/syncing-server",
|
||||
"version": "1.129.10",
|
||||
"version": "1.133.3",
|
||||
"engines": {
|
||||
"node": ">=18.0.0 <21.0.0"
|
||||
},
|
||||
@@ -32,6 +32,7 @@
|
||||
"migrate": "yarn clean && yarn build && yarn typeorm migration:run -d dist/src/Bootstrap/DataSource.js"
|
||||
},
|
||||
"dependencies": {
|
||||
"@aws-sdk/client-cloudwatch": "^3.485.0",
|
||||
"@aws-sdk/client-s3": "^3.484.0",
|
||||
"@aws-sdk/client-sns": "^3.484.0",
|
||||
"@aws-sdk/client-sqs": "^3.484.0",
|
||||
|
||||
@@ -1,4 +1,5 @@
|
||||
import * as winston from 'winston'
|
||||
import Redis from 'ioredis'
|
||||
import { Container, interfaces } from 'inversify'
|
||||
|
||||
import { Env } from './Env'
|
||||
@@ -162,6 +163,10 @@ import { SyncResponse } from '@standardnotes/grpc'
|
||||
import { SyncResponseGRPCMapper } from '../Mapping/gRPC/SyncResponseGRPCMapper'
|
||||
import { AccountDeletionVerificationRequestedEventHandler } from '../Domain/Handler/AccountDeletionVerificationRequestedEventHandler'
|
||||
import { SendEventToClients } from '../Domain/UseCase/Syncing/SendEventToClients/SendEventToClients'
|
||||
import { MetricsStoreInterface } from '../Domain/Metrics/MetricsStoreInterface'
|
||||
import { RedisMetricStore } from '../Infra/Redis/RedisMetricStore'
|
||||
import { DummyMetricStore } from '../Infra/Dummy/DummyMetricStore'
|
||||
import { CheckForTrafficAbuse } from '../Domain/UseCase/Syncing/CheckForTrafficAbuse/CheckForTrafficAbuse'
|
||||
|
||||
export class ContainerConfigLoader {
|
||||
private readonly DEFAULT_CONTENT_SIZE_TRANSFER_LIMIT = 10_000_000
|
||||
@@ -211,6 +216,20 @@ export class ContainerConfigLoader {
|
||||
const isConfiguredForHomeServer = env.get('MODE', true) === 'home-server'
|
||||
const isConfiguredForSelfHosting = env.get('MODE', true) === 'self-hosted'
|
||||
const isConfiguredForHomeServerOrSelfHosting = isConfiguredForHomeServer || isConfiguredForSelfHosting
|
||||
const isConfiguredForInMemoryCache = env.get('CACHE_TYPE', true) === 'memory'
|
||||
|
||||
if (!isConfiguredForInMemoryCache) {
|
||||
const redisUrl = env.get('REDIS_URL')
|
||||
const isRedisInClusterMode = redisUrl.indexOf(',') > 0
|
||||
let redis
|
||||
if (isRedisInClusterMode) {
|
||||
redis = new Redis.Cluster(redisUrl.split(','))
|
||||
} else {
|
||||
redis = new Redis(redisUrl)
|
||||
}
|
||||
|
||||
container.bind(TYPES.Sync_Redis).toConstantValue(redis)
|
||||
}
|
||||
|
||||
container
|
||||
.bind<boolean>(TYPES.Sync_IS_CONFIGURED_FOR_HOME_SERVER_OR_SELF_HOSTING)
|
||||
@@ -454,6 +473,33 @@ export class ContainerConfigLoader {
|
||||
})
|
||||
|
||||
// env vars
|
||||
container
|
||||
.bind(TYPES.Sync_STRICT_ABUSE_PROTECTION)
|
||||
.toConstantValue(env.get('STRICT_ABUSE_PROTECTION', true) === 'true')
|
||||
container
|
||||
.bind(TYPES.Sync_ITEM_OPERATIONS_ABUSE_THRESHOLD)
|
||||
.toConstantValue(
|
||||
env.get('ITEM_OPERATIONS_ABUSE_THRESHOLD', true) ? +env.get('ITEM_OPERATIONS_ABUSE_THRESHOLD', true) : 500,
|
||||
)
|
||||
container
|
||||
.bind(TYPES.Sync_ITEM_OPERATIONS_ABUSE_TIMEFRAME_LENGTH_IN_MINUTES)
|
||||
.toConstantValue(
|
||||
env.get('ITEM_OPERATIONS_ABUSE_TIMEFRAME_LENGTH_IN_MINUTES', true)
|
||||
? +env.get('ITEM_OPERATIONS_ABUSE_TIMEFRAME_LENGTH_IN_MINUTES', true)
|
||||
: 5,
|
||||
)
|
||||
container
|
||||
.bind(TYPES.Sync_PAYLOAD_SIZE_ABUSE_THRESHOLD)
|
||||
.toConstantValue(
|
||||
env.get('PAYLOAD_SIZE_ABUSE_THRESHOLD', true) ? +env.get('PAYLOAD_SIZE_ABUSE_THRESHOLD', true) : 20_000_000,
|
||||
)
|
||||
container
|
||||
.bind(TYPES.Sync_PAYLOAD_SIZE_ABUSE_TIMEFRAME_LENGTH_IN_MINUTES)
|
||||
.toConstantValue(
|
||||
env.get('PAYLOAD_SIZE_ABUSE_TIMEFRAME_LENGTH_IN_MINUTES', true)
|
||||
? +env.get('PAYLOAD_SIZE_ABUSE_TIMEFRAME_LENGTH_IN_MINUTES', true)
|
||||
: 5,
|
||||
)
|
||||
container.bind(TYPES.Sync_AUTH_JWT_SECRET).toConstantValue(env.get('AUTH_JWT_SECRET'))
|
||||
container
|
||||
.bind(TYPES.Sync_REVISIONS_FREQUENCY)
|
||||
@@ -533,6 +579,20 @@ export class ContainerConfigLoader {
|
||||
),
|
||||
)
|
||||
|
||||
if (isConfiguredForInMemoryCache) {
|
||||
container.bind<MetricsStoreInterface>(TYPES.Sync_MetricsStore).toConstantValue(new DummyMetricStore())
|
||||
} else {
|
||||
container
|
||||
.bind<MetricsStoreInterface>(TYPES.Sync_MetricsStore)
|
||||
.toConstantValue(
|
||||
new RedisMetricStore(
|
||||
container.get<Redis>(TYPES.Sync_Redis),
|
||||
container.get<TimerInterface>(TYPES.Sync_Timer),
|
||||
container.get<Logger>(TYPES.Sync_Logger),
|
||||
),
|
||||
)
|
||||
}
|
||||
|
||||
// use cases
|
||||
container
|
||||
.bind<GetItems>(TYPES.Sync_GetItems)
|
||||
@@ -554,6 +614,7 @@ export class ContainerConfigLoader {
|
||||
container.get(TYPES.Sync_Timer),
|
||||
container.get(TYPES.Sync_DomainEventPublisher),
|
||||
container.get(TYPES.Sync_DomainEventFactory),
|
||||
container.get<MetricsStoreInterface>(TYPES.Sync_MetricsStore),
|
||||
),
|
||||
)
|
||||
container
|
||||
@@ -609,6 +670,7 @@ export class ContainerConfigLoader {
|
||||
container.get<DetermineSharedVaultOperationOnItem>(TYPES.Sync_DetermineSharedVaultOperationOnItem),
|
||||
container.get<AddNotificationsForUsers>(TYPES.Sync_AddNotificationsForUsers),
|
||||
container.get<RemoveNotificationsForUser>(TYPES.Sync_RemoveNotificationsForUser),
|
||||
container.get<MetricsStoreInterface>(TYPES.Sync_MetricsStore),
|
||||
),
|
||||
)
|
||||
container
|
||||
@@ -903,6 +965,15 @@ export class ContainerConfigLoader {
|
||||
context.container.get(TYPES.Sync_SyncResponseFactory20200115),
|
||||
)
|
||||
})
|
||||
container
|
||||
.bind<CheckForTrafficAbuse>(TYPES.Sync_CheckForTrafficAbuse)
|
||||
.toConstantValue(
|
||||
new CheckForTrafficAbuse(
|
||||
container.get<MetricsStoreInterface>(TYPES.Sync_MetricsStore),
|
||||
container.get<TimerInterface>(TYPES.Sync_Timer),
|
||||
container.get<Logger>(TYPES.Sync_Logger),
|
||||
),
|
||||
)
|
||||
|
||||
// Handlers
|
||||
container
|
||||
@@ -1064,11 +1135,18 @@ export class ContainerConfigLoader {
|
||||
.bind<BaseItemsController>(TYPES.Sync_BaseItemsController)
|
||||
.toConstantValue(
|
||||
new BaseItemsController(
|
||||
container.get<CheckForTrafficAbuse>(TYPES.Sync_CheckForTrafficAbuse),
|
||||
container.get<SyncItems>(TYPES.Sync_SyncItems),
|
||||
container.get<CheckIntegrity>(TYPES.Sync_CheckIntegrity),
|
||||
container.get<GetItem>(TYPES.Sync_GetItem),
|
||||
container.get<MapperInterface<Item, ItemHttpRepresentation>>(TYPES.Sync_ItemHttpMapper),
|
||||
container.get<SyncResponseFactoryResolverInterface>(TYPES.Sync_SyncResponseFactoryResolver),
|
||||
container.get<Logger>(TYPES.Sync_Logger),
|
||||
container.get<boolean>(TYPES.Sync_STRICT_ABUSE_PROTECTION),
|
||||
container.get<number>(TYPES.Sync_ITEM_OPERATIONS_ABUSE_TIMEFRAME_LENGTH_IN_MINUTES),
|
||||
container.get<number>(TYPES.Sync_ITEM_OPERATIONS_ABUSE_THRESHOLD),
|
||||
container.get<number>(TYPES.Sync_PAYLOAD_SIZE_ABUSE_THRESHOLD),
|
||||
container.get<number>(TYPES.Sync_PAYLOAD_SIZE_ABUSE_TIMEFRAME_LENGTH_IN_MINUTES),
|
||||
container.get<ControllerContainerInterface>(TYPES.Sync_ControllerContainer),
|
||||
),
|
||||
)
|
||||
|
||||
@@ -42,6 +42,15 @@ const TYPES = {
|
||||
Sync_VALET_TOKEN_SECRET: Symbol.for('Sync_VALET_TOKEN_SECRET'),
|
||||
Sync_VALET_TOKEN_TTL: Symbol.for('Sync_VALET_TOKEN_TTL'),
|
||||
Sync_IS_CONFIGURED_FOR_HOME_SERVER_OR_SELF_HOSTING: Symbol.for('Sync_IS_CONFIGURED_FOR_HOME_SERVER_OR_SELF_HOSTING'),
|
||||
Sync_STRICT_ABUSE_PROTECTION: Symbol.for('Sync_STRICT_ABUSE_PROTECTION'),
|
||||
Sync_ITEM_OPERATIONS_ABUSE_TIMEFRAME_LENGTH_IN_MINUTES: Symbol.for(
|
||||
'Sync_ITEM_OPERATIONS_ABUSE_TIMEFRAME_LENGTH_IN_MINUTES',
|
||||
),
|
||||
Sync_ITEM_OPERATIONS_ABUSE_THRESHOLD: Symbol.for('Sync_ITEM_OPERATIONS_ABUSE_THRESHOLD'),
|
||||
Sync_PAYLOAD_SIZE_ABUSE_THRESHOLD: Symbol.for('Sync_PAYLOAD_SIZE_ABUSE_THRESHOLD'),
|
||||
Sync_PAYLOAD_SIZE_ABUSE_TIMEFRAME_LENGTH_IN_MINUTES: Symbol.for(
|
||||
'Sync_PAYLOAD_SIZE_ABUSE_TIMEFRAME_LENGTH_IN_MINUTES',
|
||||
),
|
||||
// use cases
|
||||
Sync_SyncItems: Symbol.for('Sync_SyncItems'),
|
||||
Sync_CheckIntegrity: Symbol.for('Sync_CheckIntegrity'),
|
||||
@@ -85,6 +94,7 @@ const TYPES = {
|
||||
Sync_TransferSharedVault: Symbol.for('Sync_TransferSharedVault'),
|
||||
Sync_TransferSharedVaultItems: Symbol.for('Sync_TransferSharedVaultItems'),
|
||||
Sync_DumpItem: Symbol.for('Sync_DumpItem'),
|
||||
Sync_CheckForTrafficAbuse: Symbol.for('Sync_CheckForTrafficAbuse'),
|
||||
// Handlers
|
||||
Sync_AccountDeletionRequestedEventHandler: Symbol.for('Sync_AccountDeletionRequestedEventHandler'),
|
||||
Sync_AccountDeletionVerificationRequestedEventHandler: Symbol.for(
|
||||
@@ -98,6 +108,7 @@ const TYPES = {
|
||||
Sync_SharedVaultFileMovedEventHandler: Symbol.for('Sync_SharedVaultFileMovedEventHandler'),
|
||||
Sync_SharedVaultRemovedEventHandler: Symbol.for('Sync_SharedVaultRemovedEventHandler'),
|
||||
// Services
|
||||
Sync_MetricsStore: Symbol.for('Sync_MetricsStore'),
|
||||
Sync_ContentDecoder: Symbol.for('Sync_ContentDecoder'),
|
||||
Sync_DomainEventPublisher: Symbol.for('Sync_DomainEventPublisher'),
|
||||
Sync_DomainEventSubscriber: Symbol.for('Sync_DomainEventSubscriber'),
|
||||
|
||||
@@ -3,7 +3,7 @@ import {
|
||||
DomainEventPublisherInterface,
|
||||
EmailBackupRequestedEvent,
|
||||
} from '@standardnotes/domain-events'
|
||||
import { EmailLevel } from '@standardnotes/domain-core'
|
||||
import { EmailLevel, Uuid } from '@standardnotes/domain-core'
|
||||
import { Logger } from 'winston'
|
||||
import { DomainEventFactoryInterface } from '../Event/DomainEventFactoryInterface'
|
||||
import { ItemBackupServiceInterface } from '../Item/ItemBackupServiceInterface'
|
||||
@@ -32,6 +32,17 @@ export class EmailBackupRequestedEventHandler implements DomainEventHandlerInter
|
||||
event: EmailBackupRequestedEvent,
|
||||
itemRepository: ItemRepositoryInterface,
|
||||
): Promise<void> {
|
||||
const userUuidOrError = Uuid.create(event.payload.userUuid)
|
||||
if (userUuidOrError.isFailed()) {
|
||||
this.logger.error('User uuid is invalid', {
|
||||
userId: event.payload.userUuid,
|
||||
codeTag: 'EmailBackupRequestedEventHandler',
|
||||
})
|
||||
|
||||
return
|
||||
}
|
||||
const userUuid = userUuidOrError.getValue()
|
||||
|
||||
const itemQuery: ItemQuery = {
|
||||
userUuid: event.payload.userUuid,
|
||||
sortBy: 'updated_at_timestamp',
|
||||
@@ -42,6 +53,7 @@ export class EmailBackupRequestedEventHandler implements DomainEventHandlerInter
|
||||
const itemUuidBundles = await this.itemTransferCalculator.computeItemUuidBundlesToFetch(
|
||||
itemContentSizeDescriptors,
|
||||
this.emailAttachmentMaxByteSize,
|
||||
userUuid,
|
||||
)
|
||||
|
||||
const backupFileNames: string[] = []
|
||||
|
||||
@@ -4,13 +4,18 @@ import { Logger } from 'winston'
|
||||
|
||||
import { ItemTransferCalculator } from './ItemTransferCalculator'
|
||||
import { ItemContentSizeDescriptor } from './ItemContentSizeDescriptor'
|
||||
import { Uuid } from '@standardnotes/domain-core'
|
||||
|
||||
describe('ItemTransferCalculator', () => {
|
||||
let logger: Logger
|
||||
|
||||
const createCalculator = () => new ItemTransferCalculator(logger)
|
||||
|
||||
let userUuid: Uuid
|
||||
|
||||
beforeEach(() => {
|
||||
userUuid = Uuid.create('00000000-0000-0000-0000-000000000000').getValue()
|
||||
|
||||
logger = {} as jest.Mocked<Logger>
|
||||
logger.warn = jest.fn()
|
||||
})
|
||||
@@ -23,7 +28,7 @@ describe('ItemTransferCalculator', () => {
|
||||
ItemContentSizeDescriptor.create('00000000-0000-0000-0000-000000000002', 20).getValue(),
|
||||
]
|
||||
|
||||
const result = await createCalculator().computeItemUuidsToFetch(itemContentSizeDescriptors, 50)
|
||||
const result = await createCalculator().computeItemUuidsToFetch(itemContentSizeDescriptors, 50, userUuid)
|
||||
|
||||
expect(result).toEqual({
|
||||
uuids: [
|
||||
@@ -42,7 +47,7 @@ describe('ItemTransferCalculator', () => {
|
||||
ItemContentSizeDescriptor.create('00000000-0000-0000-0000-000000000002', 20).getValue(),
|
||||
]
|
||||
|
||||
const result = await createCalculator().computeItemUuidsToFetch(itemContentSizeDescriptors, 40)
|
||||
const result = await createCalculator().computeItemUuidsToFetch(itemContentSizeDescriptors, 40, userUuid)
|
||||
|
||||
expect(result).toEqual({
|
||||
uuids: ['00000000-0000-0000-0000-000000000000', '00000000-0000-0000-0000-000000000001'],
|
||||
@@ -57,7 +62,7 @@ describe('ItemTransferCalculator', () => {
|
||||
ItemContentSizeDescriptor.create('00000000-0000-0000-0000-000000000002', null).getValue(),
|
||||
]
|
||||
|
||||
const result = await createCalculator().computeItemUuidsToFetch(itemContentSizeDescriptors, 50)
|
||||
const result = await createCalculator().computeItemUuidsToFetch(itemContentSizeDescriptors, 50, userUuid)
|
||||
|
||||
expect(result).toEqual({
|
||||
uuids: [
|
||||
@@ -76,7 +81,7 @@ describe('ItemTransferCalculator', () => {
|
||||
ItemContentSizeDescriptor.create('00000000-0000-0000-0000-000000000002', 20).getValue(),
|
||||
]
|
||||
|
||||
const result = await createCalculator().computeItemUuidsToFetch(itemContentSizeDescriptors, 40)
|
||||
const result = await createCalculator().computeItemUuidsToFetch(itemContentSizeDescriptors, 40, userUuid)
|
||||
|
||||
expect(result).toEqual({
|
||||
uuids: ['00000000-0000-0000-0000-000000000000', '00000000-0000-0000-0000-000000000001'],
|
||||
@@ -93,7 +98,7 @@ describe('ItemTransferCalculator', () => {
|
||||
ItemContentSizeDescriptor.create('00000000-0000-0000-0000-000000000002', 20).getValue(),
|
||||
]
|
||||
|
||||
const result = await createCalculator().computeItemUuidBundlesToFetch(itemContentSizeDescriptors, 50)
|
||||
const result = await createCalculator().computeItemUuidBundlesToFetch(itemContentSizeDescriptors, 50, userUuid)
|
||||
|
||||
expect(result).toEqual([
|
||||
[
|
||||
@@ -111,7 +116,7 @@ describe('ItemTransferCalculator', () => {
|
||||
ItemContentSizeDescriptor.create('00000000-0000-0000-0000-000000000002', 20).getValue(),
|
||||
]
|
||||
|
||||
const result = await createCalculator().computeItemUuidBundlesToFetch(itemContentSizeDescriptors, 40)
|
||||
const result = await createCalculator().computeItemUuidBundlesToFetch(itemContentSizeDescriptors, 40, userUuid)
|
||||
|
||||
expect(result).toEqual([
|
||||
['00000000-0000-0000-0000-000000000000', '00000000-0000-0000-0000-000000000001'],
|
||||
@@ -126,7 +131,7 @@ describe('ItemTransferCalculator', () => {
|
||||
ItemContentSizeDescriptor.create('00000000-0000-0000-0000-000000000002', null).getValue(),
|
||||
]
|
||||
|
||||
const result = await createCalculator().computeItemUuidBundlesToFetch(itemContentSizeDescriptors, 50)
|
||||
const result = await createCalculator().computeItemUuidBundlesToFetch(itemContentSizeDescriptors, 50, userUuid)
|
||||
|
||||
expect(result).toEqual([
|
||||
[
|
||||
@@ -144,7 +149,7 @@ describe('ItemTransferCalculator', () => {
|
||||
ItemContentSizeDescriptor.create('00000000-0000-0000-0000-000000000002', 20).getValue(),
|
||||
]
|
||||
|
||||
const result = await createCalculator().computeItemUuidBundlesToFetch(itemContentSizeDescriptors, 40)
|
||||
const result = await createCalculator().computeItemUuidBundlesToFetch(itemContentSizeDescriptors, 40, userUuid)
|
||||
|
||||
expect(result).toEqual([
|
||||
['00000000-0000-0000-0000-000000000000', '00000000-0000-0000-0000-000000000001'],
|
||||
|
||||
@@ -2,6 +2,7 @@ import { Logger } from 'winston'
|
||||
|
||||
import { ItemTransferCalculatorInterface } from './ItemTransferCalculatorInterface'
|
||||
import { ItemContentSizeDescriptor } from './ItemContentSizeDescriptor'
|
||||
import { Uuid } from '@standardnotes/domain-core'
|
||||
|
||||
export class ItemTransferCalculator implements ItemTransferCalculatorInterface {
|
||||
constructor(private logger: Logger) {}
|
||||
@@ -9,6 +10,7 @@ export class ItemTransferCalculator implements ItemTransferCalculatorInterface {
|
||||
async computeItemUuidsToFetch(
|
||||
itemContentSizeDescriptors: ItemContentSizeDescriptor[],
|
||||
bytesTransferLimit: number,
|
||||
userUuid: Uuid,
|
||||
): Promise<{ uuids: Array<string>; transferLimitBreachedBeforeEndOfItems: boolean }> {
|
||||
const itemUuidsToFetch = []
|
||||
let totalContentSizeInBytes = 0
|
||||
@@ -24,6 +26,7 @@ export class ItemTransferCalculator implements ItemTransferCalculatorInterface {
|
||||
bytesTransferLimit,
|
||||
itemUuidsToFetch,
|
||||
itemContentSizeDescriptors,
|
||||
userUuid,
|
||||
})
|
||||
|
||||
if (transferLimitBreached) {
|
||||
@@ -41,6 +44,7 @@ export class ItemTransferCalculator implements ItemTransferCalculatorInterface {
|
||||
async computeItemUuidBundlesToFetch(
|
||||
itemContentSizeDescriptors: ItemContentSizeDescriptor[],
|
||||
bytesTransferLimit: number,
|
||||
userUuid: Uuid,
|
||||
): Promise<Array<Array<string>>> {
|
||||
let itemUuidsToFetch = []
|
||||
let totalContentSizeInBytes = 0
|
||||
@@ -56,6 +60,7 @@ export class ItemTransferCalculator implements ItemTransferCalculatorInterface {
|
||||
bytesTransferLimit,
|
||||
itemUuidsToFetch,
|
||||
itemContentSizeDescriptors,
|
||||
userUuid,
|
||||
})
|
||||
|
||||
if (transferLimitBreached) {
|
||||
@@ -77,15 +82,20 @@ export class ItemTransferCalculator implements ItemTransferCalculatorInterface {
|
||||
bytesTransferLimit: number
|
||||
itemUuidsToFetch: Array<string>
|
||||
itemContentSizeDescriptors: ItemContentSizeDescriptor[]
|
||||
userUuid: Uuid
|
||||
}): boolean {
|
||||
const transferLimitBreached = dto.totalContentSizeInBytes >= dto.bytesTransferLimit
|
||||
const transferLimitBreachedAtFirstItem =
|
||||
transferLimitBreached && dto.itemUuidsToFetch.length === 1 && dto.itemContentSizeDescriptors.length > 1
|
||||
|
||||
if (transferLimitBreachedAtFirstItem) {
|
||||
this.logger.warn(
|
||||
`Item ${dto.itemUuidsToFetch[0]} is breaching the content size transfer limit: ${dto.bytesTransferLimit}`,
|
||||
)
|
||||
this.logger.warn('Item is breaching the content size transfer limit at first item in the bundle to fetch.', {
|
||||
codeTag: 'ItemTransferCalculator',
|
||||
itemUuid: dto.itemUuidsToFetch[0],
|
||||
totalContentSizeInBytes: dto.totalContentSizeInBytes,
|
||||
bytesTransferLimit: dto.bytesTransferLimit,
|
||||
userId: dto.userUuid.value,
|
||||
})
|
||||
}
|
||||
|
||||
return transferLimitBreached && !transferLimitBreachedAtFirstItem
|
||||
|
||||
@@ -1,12 +1,16 @@
|
||||
import { Uuid } from '@standardnotes/domain-core'
|
||||
|
||||
import { ItemContentSizeDescriptor } from './ItemContentSizeDescriptor'
|
||||
|
||||
export interface ItemTransferCalculatorInterface {
|
||||
computeItemUuidsToFetch(
|
||||
itemContentSizeDescriptors: ItemContentSizeDescriptor[],
|
||||
bytesTransferLimit: number,
|
||||
userUuid: Uuid,
|
||||
): Promise<{ uuids: Array<string>; transferLimitBreachedBeforeEndOfItems: boolean }>
|
||||
computeItemUuidBundlesToFetch(
|
||||
itemContentSizeDescriptors: ItemContentSizeDescriptor[],
|
||||
bytesTransferLimit: number,
|
||||
userUuid: Uuid,
|
||||
): Promise<Array<Array<string>>>
|
||||
}
|
||||
|
||||
@@ -0,0 +1,16 @@
|
||||
import { Metric } from './Metric'
|
||||
|
||||
describe('Metric', () => {
|
||||
it('should create a value object', () => {
|
||||
const valueOrError = Metric.create({ name: 'ItemCreated', timestamp: 0 })
|
||||
|
||||
expect(valueOrError.isFailed()).toBeFalsy()
|
||||
expect(valueOrError.getValue().props.name).toEqual('ItemCreated')
|
||||
})
|
||||
|
||||
it('should not create an invalid value object', () => {
|
||||
const valueOrError = Metric.create({ name: 'InvalidMetricName', timestamp: 0 })
|
||||
|
||||
expect(valueOrError.isFailed()).toBeTruthy()
|
||||
})
|
||||
})
|
||||
@@ -0,0 +1,21 @@
|
||||
import { Result, ValueObject } from '@standardnotes/domain-core'
|
||||
|
||||
import { MetricProps } from './MetricProps'
|
||||
|
||||
export class Metric extends ValueObject<MetricProps> {
|
||||
static readonly NAMES = {
|
||||
ItemCreated: 'ItemCreated',
|
||||
ItemUpdated: 'ItemUpdated',
|
||||
ContentSizeUtilized: 'ContentSizeUtilized',
|
||||
ItemOperation: 'ItemOperation',
|
||||
}
|
||||
|
||||
static create(props: MetricProps): Result<Metric> {
|
||||
const isValidName = Object.values(this.NAMES).includes(props.name)
|
||||
if (!isValidName) {
|
||||
return Result.fail<Metric>(`Invalid metric name: ${props.name}`)
|
||||
} else {
|
||||
return Result.ok<Metric>(new Metric(props))
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,4 @@
|
||||
export interface MetricProps {
|
||||
name: string
|
||||
timestamp: number
|
||||
}
|
||||
@@ -0,0 +1,17 @@
|
||||
import { Uuid } from '@standardnotes/domain-core'
|
||||
|
||||
import { Metric } from './Metric'
|
||||
import { MetricsSummary } from './MetricsSummary'
|
||||
|
||||
export interface MetricsStoreInterface {
|
||||
storeMetric(metric: Metric): Promise<void>
|
||||
storeUserBasedMetric(metric: Metric, value: number, userUuid: Uuid): Promise<void>
|
||||
getUserBasedMetricsSummaryWithinTimeRange(dto: {
|
||||
metricName: string
|
||||
userUuid: Uuid
|
||||
from: Date
|
||||
to: Date
|
||||
}): Promise<MetricsSummary>
|
||||
getUserBasedMetricsSummary(name: string, timestamp: number): Promise<MetricsSummary>
|
||||
getMetricsSummary(name: string, from: number, to: number): Promise<MetricsSummary>
|
||||
}
|
||||
@@ -0,0 +1,6 @@
|
||||
export interface MetricsSummary {
|
||||
sum: number
|
||||
max: number
|
||||
min: number
|
||||
sampleCount: number
|
||||
}
|
||||
+102
@@ -0,0 +1,102 @@
|
||||
import { TimerInterface } from '@standardnotes/time'
|
||||
import { MetricsStoreInterface } from '../../../Metrics/MetricsStoreInterface'
|
||||
import { CheckForTrafficAbuse } from './CheckForTrafficAbuse'
|
||||
import { MetricsSummary } from '../../../Metrics/MetricsSummary'
|
||||
import { Metric } from '../../../Metrics/Metric'
|
||||
import { Logger } from 'winston'
|
||||
|
||||
describe('CheckForTrafficAbuse', () => {
|
||||
let metricsStore: MetricsStoreInterface
|
||||
let timer: TimerInterface
|
||||
let timeframeLengthInMinutes: number
|
||||
let threshold: number
|
||||
let logger: Logger
|
||||
|
||||
const createUseCase = () => new CheckForTrafficAbuse(metricsStore, timer, logger)
|
||||
|
||||
beforeEach(() => {
|
||||
logger = {} as jest.Mocked<Logger>
|
||||
logger.debug = jest.fn()
|
||||
|
||||
const metricsSummary: MetricsSummary = {
|
||||
sum: 101,
|
||||
max: 0,
|
||||
min: 0,
|
||||
sampleCount: 0,
|
||||
}
|
||||
|
||||
metricsStore = {} as jest.Mocked<MetricsStoreInterface>
|
||||
metricsStore.getUserBasedMetricsSummaryWithinTimeRange = jest.fn().mockReturnValue(metricsSummary)
|
||||
|
||||
timer = {} as TimerInterface
|
||||
timer.getTimestampInMicroseconds = jest.fn().mockReturnValue(0)
|
||||
timer.getUTCDateNMinutesAgo = jest.fn().mockReturnValue(new Date(0))
|
||||
timer.getUTCDate = jest.fn().mockReturnValue(new Date(10))
|
||||
|
||||
timeframeLengthInMinutes = 5
|
||||
|
||||
threshold = 100
|
||||
})
|
||||
|
||||
it('returns a failure result if the user uuid is invalid', async () => {
|
||||
const result = await createUseCase().execute({
|
||||
userUuid: 'invalid',
|
||||
metricToCheck: Metric.NAMES.ItemOperation,
|
||||
timeframeLengthInMinutes,
|
||||
threshold,
|
||||
})
|
||||
|
||||
expect(result.isFailed()).toBeTruthy()
|
||||
})
|
||||
|
||||
it('return a failure result if the metric name is invalid', async () => {
|
||||
const result = await createUseCase().execute({
|
||||
userUuid: '00000000-0000-0000-0000-000000000000',
|
||||
metricToCheck: 'invalid',
|
||||
timeframeLengthInMinutes,
|
||||
threshold,
|
||||
})
|
||||
|
||||
expect(result.isFailed()).toBeTruthy()
|
||||
})
|
||||
|
||||
it('returns a failure result if the metric summary is above the threshold', async () => {
|
||||
const metricsSummary: MetricsSummary = {
|
||||
sum: 101,
|
||||
max: 0,
|
||||
min: 0,
|
||||
sampleCount: 0,
|
||||
}
|
||||
|
||||
metricsStore.getUserBasedMetricsSummaryWithinTimeRange = jest.fn().mockReturnValue(metricsSummary)
|
||||
|
||||
const result = await createUseCase().execute({
|
||||
userUuid: '00000000-0000-0000-0000-000000000000',
|
||||
metricToCheck: Metric.NAMES.ItemOperation,
|
||||
timeframeLengthInMinutes,
|
||||
threshold,
|
||||
})
|
||||
|
||||
expect(result.isFailed()).toBeTruthy()
|
||||
})
|
||||
|
||||
it('returns a success result if the metric summary is below the threshold', async () => {
|
||||
const metricsSummary: MetricsSummary = {
|
||||
sum: 99,
|
||||
max: 0,
|
||||
min: 0,
|
||||
sampleCount: 0,
|
||||
}
|
||||
|
||||
metricsStore.getUserBasedMetricsSummaryWithinTimeRange = jest.fn().mockReturnValue(metricsSummary)
|
||||
|
||||
const result = await createUseCase().execute({
|
||||
userUuid: '00000000-0000-0000-0000-000000000000',
|
||||
metricToCheck: Metric.NAMES.ItemOperation,
|
||||
timeframeLengthInMinutes,
|
||||
threshold,
|
||||
})
|
||||
|
||||
expect(result.isFailed()).toBeFalsy()
|
||||
})
|
||||
})
|
||||
+61
@@ -0,0 +1,61 @@
|
||||
import { Result, UseCaseInterface, Uuid } from '@standardnotes/domain-core'
|
||||
import { TimerInterface } from '@standardnotes/time'
|
||||
|
||||
import { CheckForTrafficAbuseDTO } from './CheckForTrafficAbuseDTO'
|
||||
import { MetricsStoreInterface } from '../../../Metrics/MetricsStoreInterface'
|
||||
import { Metric } from '../../../Metrics/Metric'
|
||||
import { MetricsSummary } from '../../../Metrics/MetricsSummary'
|
||||
import { Logger } from 'winston'
|
||||
|
||||
export class CheckForTrafficAbuse implements UseCaseInterface<MetricsSummary> {
|
||||
constructor(
|
||||
private metricsStore: MetricsStoreInterface,
|
||||
private timer: TimerInterface,
|
||||
private logger: Logger,
|
||||
) {}
|
||||
|
||||
async execute(dto: CheckForTrafficAbuseDTO): Promise<Result<MetricsSummary>> {
|
||||
this.logger.debug(`Checking for traffic abuse for metric: ${dto.metricToCheck}.`, {
|
||||
codeTag: 'CheckForTrafficAbuse',
|
||||
userId: dto.userUuid,
|
||||
})
|
||||
|
||||
const userUuidOrError = Uuid.create(dto.userUuid)
|
||||
if (userUuidOrError.isFailed()) {
|
||||
return Result.fail(userUuidOrError.getError())
|
||||
}
|
||||
const userUuid = userUuidOrError.getValue()
|
||||
|
||||
const metricToCheckOrError = Metric.create({
|
||||
name: dto.metricToCheck,
|
||||
timestamp: this.timer.getTimestampInMicroseconds(),
|
||||
})
|
||||
if (metricToCheckOrError.isFailed()) {
|
||||
return Result.fail(metricToCheckOrError.getError())
|
||||
}
|
||||
const metricToCheck = metricToCheckOrError.getValue()
|
||||
|
||||
const metricsSummary = await this.metricsStore.getUserBasedMetricsSummaryWithinTimeRange({
|
||||
metricName: metricToCheck.props.name,
|
||||
userUuid,
|
||||
from: this.timer.getUTCDateNMinutesAgo(dto.timeframeLengthInMinutes),
|
||||
to: this.timer.getUTCDate(),
|
||||
})
|
||||
|
||||
this.logger.debug(
|
||||
`Current traffic abuse metric ${dto.metricToCheck} value in timeframe of ${dto.timeframeLengthInMinutes} minutes is ${metricsSummary.sum}. The threshold is ${dto.threshold}`,
|
||||
{
|
||||
codeTag: 'CheckForTrafficAbuse',
|
||||
userId: dto.userUuid,
|
||||
},
|
||||
)
|
||||
|
||||
if (metricsSummary.sum > dto.threshold) {
|
||||
return Result.fail(
|
||||
`Traffic abuse detected for metric: ${metricToCheck.props.name}. Usage ${metricsSummary.sum} is greater than threshold ${dto.threshold}`,
|
||||
)
|
||||
}
|
||||
|
||||
return Result.ok(metricsSummary)
|
||||
}
|
||||
}
|
||||
+6
@@ -0,0 +1,6 @@
|
||||
export interface CheckForTrafficAbuseDTO {
|
||||
userUuid: string
|
||||
metricToCheck: string
|
||||
timeframeLengthInMinutes: number
|
||||
threshold: number
|
||||
}
|
||||
@@ -63,6 +63,7 @@ export class GetItems implements UseCaseInterface<GetItemsResult> {
|
||||
const { uuids, transferLimitBreachedBeforeEndOfItems } = await this.itemTransferCalculator.computeItemUuidsToFetch(
|
||||
itemContentSizeDescriptors,
|
||||
this.contentSizeTransferLimit,
|
||||
userUuid,
|
||||
)
|
||||
let items: Array<Item> = []
|
||||
if (uuids.length > 0) {
|
||||
|
||||
@@ -8,6 +8,7 @@ import { ContentType, Dates, Result, Timestamps, UniqueEntityId, Uuid } from '@s
|
||||
import { Item } from '../../../Item/Item'
|
||||
import { SharedVaultAssociation } from '../../../SharedVault/SharedVaultAssociation'
|
||||
import { KeySystemAssociation } from '../../../KeySystem/KeySystemAssociation'
|
||||
import { MetricsStoreInterface } from '../../../Metrics/MetricsStoreInterface'
|
||||
|
||||
describe('SaveNewItem', () => {
|
||||
let itemRepository: ItemRepositoryInterface
|
||||
@@ -16,12 +17,18 @@ describe('SaveNewItem', () => {
|
||||
let domainEventFactory: DomainEventFactoryInterface
|
||||
let itemHash1: ItemHash
|
||||
let item1: Item
|
||||
let metricsStore: MetricsStoreInterface
|
||||
|
||||
const createUseCase = () => new SaveNewItem(itemRepository, timer, domainEventPublisher, domainEventFactory)
|
||||
const createUseCase = () =>
|
||||
new SaveNewItem(itemRepository, timer, domainEventPublisher, domainEventFactory, metricsStore)
|
||||
|
||||
beforeEach(() => {
|
||||
const timeHelper = new Timer()
|
||||
|
||||
metricsStore = {} as jest.Mocked<MetricsStoreInterface>
|
||||
metricsStore.storeMetric = jest.fn()
|
||||
metricsStore.storeUserBasedMetric = jest.fn()
|
||||
|
||||
item1 = Item.create(
|
||||
{
|
||||
userUuid: Uuid.create('00000000-0000-0000-0000-000000000000').getValue(),
|
||||
|
||||
@@ -17,6 +17,8 @@ import { DomainEventFactoryInterface } from '../../../Event/DomainEventFactoryIn
|
||||
import { SharedVaultAssociation } from '../../../SharedVault/SharedVaultAssociation'
|
||||
import { KeySystemAssociation } from '../../../KeySystem/KeySystemAssociation'
|
||||
import { ItemRepositoryInterface } from '../../../Item/ItemRepositoryInterface'
|
||||
import { MetricsStoreInterface } from '../../../Metrics/MetricsStoreInterface'
|
||||
import { Metric } from '../../../Metrics/Metric'
|
||||
|
||||
export class SaveNewItem implements UseCaseInterface<Item> {
|
||||
constructor(
|
||||
@@ -24,6 +26,7 @@ export class SaveNewItem implements UseCaseInterface<Item> {
|
||||
private timer: TimerInterface,
|
||||
private domainEventPublisher: DomainEventPublisherInterface,
|
||||
private domainEventFactory: DomainEventFactoryInterface,
|
||||
private metricsStore: MetricsStoreInterface,
|
||||
) {}
|
||||
|
||||
async execute(dto: SaveNewItemDTO): Promise<Result<Item>> {
|
||||
@@ -107,6 +110,7 @@ export class SaveNewItem implements UseCaseInterface<Item> {
|
||||
return Result.fail(itemOrError.getError())
|
||||
}
|
||||
const newItem = itemOrError.getValue()
|
||||
newItem.props.contentSize = Buffer.byteLength(JSON.stringify(newItem))
|
||||
|
||||
if (dto.itemHash.representsASharedVaultItem()) {
|
||||
const sharedVaultAssociationOrError = SharedVaultAssociation.create({
|
||||
@@ -135,6 +139,19 @@ export class SaveNewItem implements UseCaseInterface<Item> {
|
||||
|
||||
await this.itemRepository.insert(newItem)
|
||||
|
||||
await this.metricsStore.storeUserBasedMetric(
|
||||
Metric.create({
|
||||
name: Metric.NAMES.ContentSizeUtilized,
|
||||
timestamp: this.timer.getTimestampInMicroseconds(),
|
||||
}).getValue(),
|
||||
newItem.props.contentSize,
|
||||
userUuid,
|
||||
)
|
||||
|
||||
await this.metricsStore.storeMetric(
|
||||
Metric.create({ name: Metric.NAMES.ItemCreated, timestamp: this.timer.getTimestampInMicroseconds() }).getValue(),
|
||||
)
|
||||
|
||||
if (contentType.value !== null && [ContentType.TYPES.Note, ContentType.TYPES.File].includes(contentType.value)) {
|
||||
await this.domainEventPublisher.publish(
|
||||
this.domainEventFactory.createItemRevisionCreationRequested({
|
||||
|
||||
+7
@@ -20,6 +20,7 @@ import { DetermineSharedVaultOperationOnItem } from '../../SharedVaults/Determin
|
||||
import { RemoveNotificationsForUser } from '../../Messaging/RemoveNotificationsForUser/RemoveNotificationsForUser'
|
||||
import { SharedVaultOperationOnItem } from '../../../SharedVault/SharedVaultOperationOnItem'
|
||||
import { AddNotificationsForUsers } from '../../Messaging/AddNotificationsForUsers/AddNotificationsForUsers'
|
||||
import { MetricsStoreInterface } from '../../../Metrics/MetricsStoreInterface'
|
||||
|
||||
describe('UpdateExistingItem', () => {
|
||||
let itemRepository: ItemRepositoryInterface
|
||||
@@ -31,6 +32,7 @@ describe('UpdateExistingItem', () => {
|
||||
let determineSharedVaultOperationOnItem: DetermineSharedVaultOperationOnItem
|
||||
let addNotificationsForUsers: AddNotificationsForUsers
|
||||
let removeNotificationsForUser: RemoveNotificationsForUser
|
||||
let metricsStore: MetricsStoreInterface
|
||||
|
||||
const createUseCase = () =>
|
||||
new UpdateExistingItem(
|
||||
@@ -43,11 +45,16 @@ describe('UpdateExistingItem', () => {
|
||||
determineSharedVaultOperationOnItem,
|
||||
addNotificationsForUsers,
|
||||
removeNotificationsForUser,
|
||||
metricsStore,
|
||||
)
|
||||
|
||||
beforeEach(() => {
|
||||
const timeHelper = new Timer()
|
||||
|
||||
metricsStore = {} as jest.Mocked<MetricsStoreInterface>
|
||||
metricsStore.storeMetric = jest.fn()
|
||||
metricsStore.storeUserBasedMetric = jest.fn()
|
||||
|
||||
item1 = Item.create(
|
||||
{
|
||||
userUuid: Uuid.create('00000000-0000-0000-0000-000000000000').getValue(),
|
||||
|
||||
+16
@@ -24,6 +24,8 @@ import { RemoveNotificationsForUser } from '../../Messaging/RemoveNotificationsF
|
||||
import { ItemHash } from '../../../Item/ItemHash'
|
||||
import { AddNotificationsForUsers } from '../../Messaging/AddNotificationsForUsers/AddNotificationsForUsers'
|
||||
import { ItemRepositoryInterface } from '../../../Item/ItemRepositoryInterface'
|
||||
import { MetricsStoreInterface } from '../../../Metrics/MetricsStoreInterface'
|
||||
import { Metric } from '../../../Metrics/Metric'
|
||||
|
||||
export class UpdateExistingItem implements UseCaseInterface<Item> {
|
||||
constructor(
|
||||
@@ -36,6 +38,7 @@ export class UpdateExistingItem implements UseCaseInterface<Item> {
|
||||
private determineSharedVaultOperationOnItem: DetermineSharedVaultOperationOnItem,
|
||||
private addNotificationForUsers: AddNotificationsForUsers,
|
||||
private removeNotificationsForUser: RemoveNotificationsForUser,
|
||||
private metricsStore: MetricsStoreInterface,
|
||||
) {}
|
||||
|
||||
async execute(dto: UpdateExistingItemDTO): Promise<Result<Item>> {
|
||||
@@ -173,6 +176,19 @@ export class UpdateExistingItem implements UseCaseInterface<Item> {
|
||||
|
||||
await this.itemRepository.update(dto.existingItem)
|
||||
|
||||
await this.metricsStore.storeMetric(
|
||||
Metric.create({ name: Metric.NAMES.ItemUpdated, timestamp: this.timer.getTimestampInMicroseconds() }).getValue(),
|
||||
)
|
||||
|
||||
await this.metricsStore.storeUserBasedMetric(
|
||||
Metric.create({
|
||||
name: Metric.NAMES.ContentSizeUtilized,
|
||||
timestamp: this.timer.getTimestampInMicroseconds(),
|
||||
}).getValue(),
|
||||
dto.existingItem.props.contentSize,
|
||||
userUuid,
|
||||
)
|
||||
|
||||
/* istanbul ignore next */
|
||||
const revisionsFrequency = dto.isFreeUser ? this.freeRevisionFrequency : this.premiumRevisionFrequency
|
||||
|
||||
|
||||
@@ -0,0 +1,47 @@
|
||||
import { Uuid } from '@standardnotes/domain-core'
|
||||
|
||||
import { MetricsStoreInterface } from '../../Domain/Metrics/MetricsStoreInterface'
|
||||
import { Metric } from '../../Domain/Metrics/Metric'
|
||||
import { MetricsSummary } from '../../Domain/Metrics/MetricsSummary'
|
||||
|
||||
export class DummyMetricStore implements MetricsStoreInterface {
|
||||
async getUserBasedMetricsSummaryWithinTimeRange(_dto: {
|
||||
metricName: string
|
||||
userUuid: Uuid
|
||||
from: Date
|
||||
to: Date
|
||||
}): Promise<MetricsSummary> {
|
||||
return {
|
||||
sum: 0,
|
||||
max: 0,
|
||||
min: 0,
|
||||
sampleCount: 0,
|
||||
}
|
||||
}
|
||||
|
||||
async getUserBasedMetricsSummary(_name: string, _timestamp: number): Promise<MetricsSummary> {
|
||||
return {
|
||||
sum: 0,
|
||||
max: 0,
|
||||
min: 0,
|
||||
sampleCount: 0,
|
||||
}
|
||||
}
|
||||
|
||||
async storeUserBasedMetric(_metric: Metric, _value: number, _userUuid: Uuid): Promise<void> {
|
||||
// do nothing
|
||||
}
|
||||
|
||||
async storeMetric(_metric: Metric): Promise<void> {
|
||||
// do nothing
|
||||
}
|
||||
|
||||
async getMetricsSummary(_name: string, _from: number, _to: number): Promise<MetricsSummary> {
|
||||
return {
|
||||
sum: 0,
|
||||
max: 0,
|
||||
min: 0,
|
||||
sampleCount: 0,
|
||||
}
|
||||
}
|
||||
}
|
||||
+25
-1
@@ -11,18 +11,42 @@ import { SyncItems } from '../../Domain/UseCase/Syncing/SyncItems/SyncItems'
|
||||
import { BaseItemsController } from './Base/BaseItemsController'
|
||||
import { MapperInterface } from '@standardnotes/domain-core'
|
||||
import { ItemHttpRepresentation } from '../../Mapping/Http/ItemHttpRepresentation'
|
||||
import { CheckForTrafficAbuse } from '../../Domain/UseCase/Syncing/CheckForTrafficAbuse/CheckForTrafficAbuse'
|
||||
import { Logger } from 'winston'
|
||||
|
||||
@controller('/items', TYPES.Sync_AuthMiddleware)
|
||||
export class AnnotatedItemsController extends BaseItemsController {
|
||||
constructor(
|
||||
@inject(TYPES.Sync_CheckForTrafficAbuse) override checkForTrafficAbuse: CheckForTrafficAbuse,
|
||||
@inject(TYPES.Sync_SyncItems) override syncItems: SyncItems,
|
||||
@inject(TYPES.Sync_CheckIntegrity) override checkIntegrity: CheckIntegrity,
|
||||
@inject(TYPES.Sync_GetItem) override getItem: GetItem,
|
||||
@inject(TYPES.Sync_ItemHttpMapper) override itemHttpMapper: MapperInterface<Item, ItemHttpRepresentation>,
|
||||
@inject(TYPES.Sync_SyncResponseFactoryResolver)
|
||||
override syncResponseFactoryResolver: SyncResponseFactoryResolverInterface,
|
||||
@inject(TYPES.Sync_Logger) override logger: Logger,
|
||||
@inject(TYPES.Sync_STRICT_ABUSE_PROTECTION) override strictAbuseProtection: boolean,
|
||||
@inject(TYPES.Sync_ITEM_OPERATIONS_ABUSE_TIMEFRAME_LENGTH_IN_MINUTES)
|
||||
override itemOperationsAbuseTimeframeLengthInMinutes: number,
|
||||
@inject(TYPES.Sync_ITEM_OPERATIONS_ABUSE_THRESHOLD) override itemOperationsAbuseThreshold: number,
|
||||
@inject(TYPES.Sync_PAYLOAD_SIZE_ABUSE_THRESHOLD) override payloadSizeAbuseThreshold: number,
|
||||
@inject(TYPES.Sync_PAYLOAD_SIZE_ABUSE_TIMEFRAME_LENGTH_IN_MINUTES)
|
||||
override payloadSizeAbuseTimeframeLengthInMinutes: number,
|
||||
) {
|
||||
super(syncItems, checkIntegrity, getItem, itemHttpMapper, syncResponseFactoryResolver)
|
||||
super(
|
||||
checkForTrafficAbuse,
|
||||
syncItems,
|
||||
checkIntegrity,
|
||||
getItem,
|
||||
itemHttpMapper,
|
||||
syncResponseFactoryResolver,
|
||||
logger,
|
||||
strictAbuseProtection,
|
||||
itemOperationsAbuseTimeframeLengthInMinutes,
|
||||
itemOperationsAbuseThreshold,
|
||||
payloadSizeAbuseThreshold,
|
||||
payloadSizeAbuseTimeframeLengthInMinutes,
|
||||
)
|
||||
}
|
||||
|
||||
@httpPost('/sync')
|
||||
|
||||
@@ -11,14 +11,24 @@ import { ApiVersion } from '../../../Domain/Api/ApiVersion'
|
||||
import { SyncItems } from '../../../Domain/UseCase/Syncing/SyncItems/SyncItems'
|
||||
import { ItemHttpRepresentation } from '../../../Mapping/Http/ItemHttpRepresentation'
|
||||
import { ItemHash } from '../../../Domain/Item/ItemHash'
|
||||
import { CheckForTrafficAbuse } from '../../../Domain/UseCase/Syncing/CheckForTrafficAbuse/CheckForTrafficAbuse'
|
||||
import { Metric } from '../../../Domain/Metrics/Metric'
|
||||
import { Logger } from 'winston'
|
||||
|
||||
export class BaseItemsController extends BaseHttpController {
|
||||
constructor(
|
||||
protected checkForTrafficAbuse: CheckForTrafficAbuse,
|
||||
protected syncItems: SyncItems,
|
||||
protected checkIntegrity: CheckIntegrity,
|
||||
protected getItem: GetItem,
|
||||
protected itemHttpMapper: MapperInterface<Item, ItemHttpRepresentation>,
|
||||
protected syncResponseFactoryResolver: SyncResponseFactoryResolverInterface,
|
||||
protected logger: Logger,
|
||||
protected strictAbuseProtection: boolean,
|
||||
protected itemOperationsAbuseTimeframeLengthInMinutes: number,
|
||||
protected itemOperationsAbuseThreshold: number,
|
||||
protected payloadSizeAbuseThreshold: number,
|
||||
protected payloadSizeAbuseTimeframeLengthInMinutes: number,
|
||||
private controllerContainer?: ControllerContainerInterface,
|
||||
) {
|
||||
super()
|
||||
@@ -31,6 +41,37 @@ export class BaseItemsController extends BaseHttpController {
|
||||
}
|
||||
|
||||
async sync(request: Request, response: Response): Promise<results.JsonResult> {
|
||||
const checkForItemOperationsAbuseResult = await this.checkForTrafficAbuse.execute({
|
||||
metricToCheck: Metric.NAMES.ItemOperation,
|
||||
userUuid: response.locals.user.uuid,
|
||||
threshold: this.itemOperationsAbuseThreshold,
|
||||
timeframeLengthInMinutes: this.itemOperationsAbuseTimeframeLengthInMinutes,
|
||||
})
|
||||
if (checkForItemOperationsAbuseResult.isFailed()) {
|
||||
this.logger.warn(checkForItemOperationsAbuseResult.getError(), {
|
||||
userId: response.locals.user.uuid,
|
||||
})
|
||||
if (this.strictAbuseProtection) {
|
||||
return this.json({ error: { message: checkForItemOperationsAbuseResult.getError() } }, 429)
|
||||
}
|
||||
}
|
||||
|
||||
const checkForPayloadSizeAbuseResult = await this.checkForTrafficAbuse.execute({
|
||||
metricToCheck: Metric.NAMES.ContentSizeUtilized,
|
||||
userUuid: response.locals.user.uuid,
|
||||
threshold: this.payloadSizeAbuseThreshold,
|
||||
timeframeLengthInMinutes: this.payloadSizeAbuseTimeframeLengthInMinutes,
|
||||
})
|
||||
if (checkForPayloadSizeAbuseResult.isFailed()) {
|
||||
this.logger.warn(checkForPayloadSizeAbuseResult.getError(), {
|
||||
userId: response.locals.user.uuid,
|
||||
})
|
||||
|
||||
if (this.strictAbuseProtection) {
|
||||
return this.json({ error: { message: checkForPayloadSizeAbuseResult.getError() } }, 429)
|
||||
}
|
||||
}
|
||||
|
||||
const itemHashes: ItemHash[] = []
|
||||
if ('items' in request.body) {
|
||||
for (const itemHashInput of request.body.items) {
|
||||
|
||||
@@ -0,0 +1,230 @@
|
||||
import * as IORedis from 'ioredis'
|
||||
import { TimerInterface } from '@standardnotes/time'
|
||||
|
||||
import { MetricsStoreInterface } from '../../Domain/Metrics/MetricsStoreInterface'
|
||||
import { Metric } from '../../Domain/Metrics/Metric'
|
||||
import { Uuid } from '@standardnotes/domain-core'
|
||||
import { MetricsSummary } from '../../Domain/Metrics/MetricsSummary'
|
||||
import { Logger } from 'winston'
|
||||
|
||||
export class RedisMetricStore implements MetricsStoreInterface {
|
||||
private readonly METRIC_PREFIX = 'metric'
|
||||
private readonly METRIC_PER_USER_PREFIX = 'metric-user'
|
||||
|
||||
constructor(
|
||||
private redisClient: IORedis.Redis,
|
||||
private timer: TimerInterface,
|
||||
private logger: Logger,
|
||||
) {}
|
||||
|
||||
async getUserBasedMetricsSummaryWithinTimeRange(dto: {
|
||||
metricName: string
|
||||
userUuid: Uuid
|
||||
from: Date
|
||||
to: Date
|
||||
}): Promise<MetricsSummary> {
|
||||
this.logger.debug(`Fetching user based metrics summary for ${dto.metricName}.`, {
|
||||
codeTag: 'RedisMetricStore',
|
||||
userId: dto.userUuid.value,
|
||||
from: dto.from.toISOString(),
|
||||
to: dto.to.toISOString(),
|
||||
})
|
||||
|
||||
const keys = this.getKeysRepresentingMinutesBetweenFromAndTo(dto.from, dto.to)
|
||||
|
||||
this.logger.debug(`Fetching user based metrics summary for ${dto.metricName} - keys: ${keys.join(', ')}.`, {
|
||||
codeTag: 'RedisMetricStore',
|
||||
userId: dto.userUuid.value,
|
||||
})
|
||||
|
||||
let sum = 0
|
||||
let max = 0
|
||||
let min = 0
|
||||
let sampleCount = 0
|
||||
|
||||
const values = await this.redisClient.mget(
|
||||
keys.map((key) => `${this.METRIC_PER_USER_PREFIX}:${dto.userUuid.value}:${dto.metricName}:${key}`),
|
||||
)
|
||||
|
||||
this.logger.debug(`Fetching user based metrics summary for ${dto.metricName} - values: ${values.join(', ')}.`, {
|
||||
codeTag: 'RedisMetricStore',
|
||||
userId: dto.userUuid.value,
|
||||
})
|
||||
|
||||
for (const value of values) {
|
||||
if (!value) {
|
||||
continue
|
||||
}
|
||||
|
||||
const valueAsNumber = Number(value)
|
||||
|
||||
sum += valueAsNumber
|
||||
sampleCount++
|
||||
|
||||
if (valueAsNumber > max) {
|
||||
max = valueAsNumber
|
||||
}
|
||||
|
||||
if (valueAsNumber < min) {
|
||||
min = valueAsNumber
|
||||
}
|
||||
}
|
||||
|
||||
return {
|
||||
sum,
|
||||
max,
|
||||
min,
|
||||
sampleCount,
|
||||
}
|
||||
}
|
||||
|
||||
async storeUserBasedMetric(metric: Metric, value: number, userUuid: Uuid): Promise<void> {
|
||||
const date = this.timer.convertMicrosecondsToDate(metric.props.timestamp)
|
||||
const dateToTheMinuteString = this.timer.convertDateToFormattedString(date, 'YYYY-MM-DD HH:mm')
|
||||
const key = `${this.METRIC_PER_USER_PREFIX}:${userUuid.value}:${metric.props.name}:${dateToTheMinuteString}`
|
||||
|
||||
const pipeline = this.redisClient.pipeline()
|
||||
|
||||
pipeline.incrbyfloat(key, value)
|
||||
pipeline.incr(
|
||||
`${this.METRIC_PER_USER_PREFIX}:${userUuid.value}:${Metric.NAMES.ItemOperation}:${dateToTheMinuteString}`,
|
||||
)
|
||||
|
||||
const expirationTime = 60 * 60 * 24
|
||||
pipeline.expire(key, expirationTime)
|
||||
|
||||
await pipeline.exec()
|
||||
}
|
||||
|
||||
async getUserBasedMetricsSummary(name: string, timestamp: number): Promise<MetricsSummary> {
|
||||
const date = this.timer.convertMicrosecondsToDate(timestamp)
|
||||
const dateToTheMinuteString = this.timer.convertDateToFormattedString(date, 'YYYY-MM-DD HH:mm')
|
||||
|
||||
const userMetricsKeys = await this.redisClient.keys(
|
||||
`${this.METRIC_PER_USER_PREFIX}:*:${name}:${dateToTheMinuteString}`,
|
||||
)
|
||||
|
||||
let sum = 0
|
||||
let max = 0
|
||||
let min = 0
|
||||
let sampleCount = 0
|
||||
|
||||
const values = await this.redisClient.mget(userMetricsKeys)
|
||||
|
||||
for (const value of values) {
|
||||
if (!value) {
|
||||
continue
|
||||
}
|
||||
|
||||
const valueAsNumber = Number(value)
|
||||
|
||||
sum += valueAsNumber
|
||||
sampleCount++
|
||||
|
||||
if (valueAsNumber > max) {
|
||||
max = valueAsNumber
|
||||
}
|
||||
|
||||
if (valueAsNumber < min) {
|
||||
min = valueAsNumber
|
||||
}
|
||||
}
|
||||
|
||||
return {
|
||||
sum,
|
||||
max,
|
||||
min,
|
||||
sampleCount,
|
||||
}
|
||||
}
|
||||
|
||||
async getMetricsSummary(name: string, from: number, to: number): Promise<MetricsSummary> {
|
||||
const keysRepresentingSecondsBetweenFromAndTo = this.getKeysRepresentingSecondsBetweenFromAndTo(from, to)
|
||||
|
||||
let sum = 0
|
||||
let max = 0
|
||||
let min = 0
|
||||
let sampleCount = 0
|
||||
|
||||
const values = await this.redisClient.mget(
|
||||
keysRepresentingSecondsBetweenFromAndTo.map((key) => `${this.METRIC_PREFIX}:${name}:${key}`),
|
||||
)
|
||||
|
||||
for (const value of values) {
|
||||
if (!value) {
|
||||
continue
|
||||
}
|
||||
|
||||
const valueAsNumber = Number(value)
|
||||
|
||||
sum += valueAsNumber
|
||||
sampleCount++
|
||||
|
||||
if (valueAsNumber > max) {
|
||||
max = valueAsNumber
|
||||
}
|
||||
|
||||
if (valueAsNumber < min) {
|
||||
min = valueAsNumber
|
||||
}
|
||||
}
|
||||
|
||||
return {
|
||||
sum,
|
||||
max,
|
||||
min,
|
||||
sampleCount,
|
||||
}
|
||||
}
|
||||
|
||||
async storeMetric(metric: Metric): Promise<void> {
|
||||
const date = this.timer.convertMicrosecondsToDate(metric.props.timestamp)
|
||||
const dateToTheSecondString = this.timer.convertDateToFormattedString(date, 'YYYY-MM-DD HH:mm:ss')
|
||||
const key = `${this.METRIC_PREFIX}:${metric.props.name}:${dateToTheSecondString}`
|
||||
|
||||
const pipeline = this.redisClient.pipeline()
|
||||
|
||||
pipeline.incr(key)
|
||||
|
||||
const expirationTime = 60 * 60 * 6
|
||||
pipeline.expire(key, expirationTime)
|
||||
|
||||
await pipeline.exec()
|
||||
}
|
||||
|
||||
private getKeysRepresentingMinutesBetweenFromAndTo(from: Date, to: Date): string[] {
|
||||
const keys: string[] = []
|
||||
|
||||
let currentMinute = from
|
||||
|
||||
while (currentMinute <= to) {
|
||||
const dateToTheMinuteString = this.timer.convertDateToFormattedString(currentMinute, 'YYYY-MM-DD HH:mm')
|
||||
|
||||
keys.push(dateToTheMinuteString)
|
||||
|
||||
currentMinute = new Date(currentMinute.getTime() + 60 * 1000)
|
||||
}
|
||||
|
||||
return keys
|
||||
}
|
||||
|
||||
private getKeysRepresentingSecondsBetweenFromAndTo(from: number, to: number): string[] {
|
||||
const keys: string[] = []
|
||||
|
||||
const fromDate = this.timer.convertMicrosecondsToDate(from)
|
||||
|
||||
const secondsFrom = this.timer.convertMicrosecondsToSeconds(from)
|
||||
const secondsTo = this.timer.convertMicrosecondsToSeconds(to)
|
||||
|
||||
const secondsBetweenFromAndTo = secondsTo - secondsFrom
|
||||
|
||||
for (let i = 0; i < secondsBetweenFromAndTo; i++) {
|
||||
const fromDatePlusSeconds = new Date(fromDate.getTime() + i * 1000)
|
||||
const dateToTheSecondString = this.timer.convertDateToFormattedString(fromDatePlusSeconds, 'YYYY-MM-DD HH:mm:ss')
|
||||
|
||||
keys.push(dateToTheSecondString)
|
||||
}
|
||||
|
||||
return keys
|
||||
}
|
||||
}
|
||||
@@ -9,12 +9,20 @@ import { SyncItems } from '../../Domain/UseCase/Syncing/SyncItems/SyncItems'
|
||||
import { ApiVersion } from '../../Domain/Api/ApiVersion'
|
||||
import { SyncResponseFactoryResolverInterface } from '../../Domain/Item/SyncResponse/SyncResponseFactoryResolverInterface'
|
||||
import { SyncResponse20200115 } from '../../Domain/Item/SyncResponse/SyncResponse20200115'
|
||||
import { CheckForTrafficAbuse } from '../../Domain/UseCase/Syncing/CheckForTrafficAbuse/CheckForTrafficAbuse'
|
||||
import { Metric } from '../../Domain/Metrics/Metric'
|
||||
|
||||
export class SyncingServer implements ISyncingServer {
|
||||
constructor(
|
||||
private syncItemsUseCase: SyncItems,
|
||||
private syncResponseFactoryResolver: SyncResponseFactoryResolverInterface,
|
||||
private mapper: MapperInterface<SyncResponse20200115, SyncResponse>,
|
||||
protected checkForTrafficAbuse: CheckForTrafficAbuse,
|
||||
private strictAbuseProtection: boolean,
|
||||
private itemOperationsAbuseTimeframeLengthInMinutes: number,
|
||||
private itemOperationsAbuseThreshold: number,
|
||||
private payloadSizeAbuseThreshold: number,
|
||||
private payloadSizeAbuseTimeframeLengthInMinutes: number,
|
||||
private logger: Logger,
|
||||
) {}
|
||||
|
||||
@@ -23,7 +31,62 @@ export class SyncingServer implements ISyncingServer {
|
||||
callback: grpc.sendUnaryData<SyncResponse>,
|
||||
): Promise<void> {
|
||||
try {
|
||||
this.logger.debug('[SyncingServer] Syncing items via gRPC')
|
||||
const userUuid = call.metadata.get('x-user-uuid').pop() as string
|
||||
|
||||
const checkForItemOperationsAbuseResult = await this.checkForTrafficAbuse.execute({
|
||||
metricToCheck: Metric.NAMES.ItemOperation,
|
||||
userUuid,
|
||||
threshold: this.itemOperationsAbuseThreshold,
|
||||
timeframeLengthInMinutes: this.itemOperationsAbuseTimeframeLengthInMinutes,
|
||||
})
|
||||
if (checkForItemOperationsAbuseResult.isFailed()) {
|
||||
this.logger.warn(checkForItemOperationsAbuseResult.getError(), {
|
||||
userId: userUuid,
|
||||
})
|
||||
if (this.strictAbuseProtection) {
|
||||
const metadata = new grpc.Metadata()
|
||||
metadata.set('x-sync-error-message', checkForItemOperationsAbuseResult.getError())
|
||||
metadata.set('x-sync-error-response-code', '429')
|
||||
|
||||
return callback(
|
||||
{
|
||||
code: Status.INVALID_ARGUMENT,
|
||||
message: checkForItemOperationsAbuseResult.getError(),
|
||||
name: 'INVALID_ARGUMENT',
|
||||
metadata,
|
||||
},
|
||||
null,
|
||||
)
|
||||
}
|
||||
}
|
||||
|
||||
const checkForPayloadSizeAbuseResult = await this.checkForTrafficAbuse.execute({
|
||||
metricToCheck: Metric.NAMES.ContentSizeUtilized,
|
||||
userUuid,
|
||||
threshold: this.payloadSizeAbuseThreshold,
|
||||
timeframeLengthInMinutes: this.payloadSizeAbuseTimeframeLengthInMinutes,
|
||||
})
|
||||
if (checkForPayloadSizeAbuseResult.isFailed()) {
|
||||
this.logger.warn(checkForPayloadSizeAbuseResult.getError(), {
|
||||
userId: userUuid,
|
||||
})
|
||||
|
||||
if (this.strictAbuseProtection) {
|
||||
const metadata = new grpc.Metadata()
|
||||
metadata.set('x-sync-error-message', checkForPayloadSizeAbuseResult.getError())
|
||||
metadata.set('x-sync-error-response-code', '429')
|
||||
|
||||
return callback(
|
||||
{
|
||||
code: Status.INVALID_ARGUMENT,
|
||||
message: checkForPayloadSizeAbuseResult.getError(),
|
||||
name: 'INVALID_ARGUMENT',
|
||||
metadata,
|
||||
},
|
||||
null,
|
||||
)
|
||||
}
|
||||
}
|
||||
|
||||
const itemHashesRPC = call.request.getItemsList()
|
||||
const itemHashes: ItemHash[] = []
|
||||
@@ -41,7 +104,7 @@ export class SyncingServer implements ISyncingServer {
|
||||
created_at_timestamp: itemHash.hasCreatedAtTimestamp() ? itemHash.getCreatedAtTimestamp() : undefined,
|
||||
updated_at: itemHash.hasUpdatedAt() ? itemHash.getUpdatedAt() : undefined,
|
||||
updated_at_timestamp: itemHash.hasUpdatedAtTimestamp() ? itemHash.getUpdatedAtTimestamp() : undefined,
|
||||
user_uuid: call.metadata.get('userUuid').pop() as string,
|
||||
user_uuid: userUuid,
|
||||
key_system_identifier: itemHash.hasKeySystemIdentifier()
|
||||
? (itemHash.getKeySystemIdentifier() as string)
|
||||
: null,
|
||||
@@ -74,7 +137,6 @@ export class SyncingServer implements ISyncingServer {
|
||||
}
|
||||
|
||||
const apiVersion = call.request.hasApiVersion() ? (call.request.getApiVersion() as string) : ApiVersion.v20161215
|
||||
const userUuid = call.metadata.get('x-user-uuid').pop() as string
|
||||
const readOnlyAccess = call.metadata.get('x-read-only-access').pop() === 'true'
|
||||
if (readOnlyAccess) {
|
||||
this.logger.debug('Syncing with read-only access', {
|
||||
|
||||
@@ -3,6 +3,12 @@
|
||||
All notable changes to this project will be documented in this file.
|
||||
See [Conventional Commits](https://conventionalcommits.org) for commit guidelines.
|
||||
|
||||
# [1.19.0](https://github.com/standardnotes/server/compare/@standardnotes/time@1.18.2...@standardnotes/time@1.19.0) (2024-01-04)
|
||||
|
||||
### Features
|
||||
|
||||
* add storing item saving and modifying metrics ([#1013](https://github.com/standardnotes/server/issues/1013)) ([efd816a](https://github.com/standardnotes/server/commit/efd816a627d59f4baaa69aa081c2ad9c88af971c))
|
||||
|
||||
## [1.18.2](https://github.com/standardnotes/server/compare/@standardnotes/time@1.18.1...@standardnotes/time@1.18.2) (2023-12-28)
|
||||
|
||||
**Note:** Version bump only for package @standardnotes/time
|
||||
|
||||
@@ -1,6 +1,6 @@
|
||||
{
|
||||
"name": "@standardnotes/time",
|
||||
"version": "1.18.2",
|
||||
"version": "1.19.0",
|
||||
"engines": {
|
||||
"node": ">=18.0.0 <21.0.0"
|
||||
},
|
||||
|
||||
@@ -47,6 +47,13 @@ describe('Timer', () => {
|
||||
expect(+date - +dateNHoursAgo >= 4 * 3600).toBeTruthy()
|
||||
})
|
||||
|
||||
it('should return a utc date n minutes ago', () => {
|
||||
const date = createTimer().getUTCDate()
|
||||
const dateNMinutesAgo = createTimer().getUTCDateNMinutesAgo(4)
|
||||
|
||||
expect(+date - +dateNMinutesAgo >= 4 * 60).toBeTruthy()
|
||||
})
|
||||
|
||||
it('should return a utc date n hours ahead', () => {
|
||||
const date = createTimer().getUTCDate()
|
||||
const dateNHoursAhead = createTimer().getUTCDateNHoursAhead(4)
|
||||
|
||||
@@ -19,6 +19,10 @@ export class Timer implements TimerInterface {
|
||||
return dayjs.utc().add(n, 'second').toDate()
|
||||
}
|
||||
|
||||
getUTCDateNMinutesAgo(n: number): Date {
|
||||
return dayjs.utc().subtract(n, 'minute').toDate()
|
||||
}
|
||||
|
||||
convertMicrosecondsToTimeStructure(microseconds: number): TimeStructure {
|
||||
const days = Math.floor(microseconds / Time.MicrosecondsInADay)
|
||||
|
||||
|
||||
@@ -9,6 +9,7 @@ export interface TimerInterface {
|
||||
getUTCDateNHoursAgo(n: number): Date
|
||||
getUTCDateNHoursAhead(n: number): Date
|
||||
getUTCDateNSecondsAhead(n: number): Date
|
||||
getUTCDateNMinutesAgo(n: number): Date
|
||||
convertDateToMilliseconds(date: Date): number
|
||||
convertDateToMicroseconds(date: Date): number
|
||||
convertDateToISOString(date: Date): string
|
||||
|
||||
@@ -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.22.10](https://github.com/standardnotes/server/compare/@standardnotes/websockets-server@1.22.9...@standardnotes/websockets-server@1.22.10) (2024-01-04)
|
||||
|
||||
**Note:** Version bump only for package @standardnotes/websockets-server
|
||||
|
||||
## [1.22.9](https://github.com/standardnotes/server/compare/@standardnotes/websockets-server@1.22.8...@standardnotes/websockets-server@1.22.9) (2024-01-03)
|
||||
|
||||
**Note:** Version bump only for package @standardnotes/websockets-server
|
||||
|
||||
## [1.22.8](https://github.com/standardnotes/server/compare/@standardnotes/websockets-server@1.22.7...@standardnotes/websockets-server@1.22.8) (2024-01-03)
|
||||
|
||||
**Note:** Version bump only for package @standardnotes/websockets-server
|
||||
|
||||
@@ -1,6 +1,6 @@
|
||||
{
|
||||
"name": "@standardnotes/websockets-server",
|
||||
"version": "1.22.8",
|
||||
"version": "1.22.10",
|
||||
"engines": {
|
||||
"node": ">=18.0.0 <21.0.0"
|
||||
},
|
||||
|
||||
@@ -156,6 +156,56 @@ __metadata:
|
||||
languageName: node
|
||||
linkType: hard
|
||||
|
||||
"@aws-sdk/client-cloudwatch@npm:^3.485.0":
|
||||
version: 3.485.0
|
||||
resolution: "@aws-sdk/client-cloudwatch@npm:3.485.0"
|
||||
dependencies:
|
||||
"@aws-crypto/sha256-browser": "npm:3.0.0"
|
||||
"@aws-crypto/sha256-js": "npm:3.0.0"
|
||||
"@aws-sdk/client-sts": "npm:3.485.0"
|
||||
"@aws-sdk/core": "npm:3.485.0"
|
||||
"@aws-sdk/credential-provider-node": "npm:3.485.0"
|
||||
"@aws-sdk/middleware-host-header": "npm:3.485.0"
|
||||
"@aws-sdk/middleware-logger": "npm:3.485.0"
|
||||
"@aws-sdk/middleware-recursion-detection": "npm:3.485.0"
|
||||
"@aws-sdk/middleware-signing": "npm:3.485.0"
|
||||
"@aws-sdk/middleware-user-agent": "npm:3.485.0"
|
||||
"@aws-sdk/region-config-resolver": "npm:3.485.0"
|
||||
"@aws-sdk/types": "npm:3.485.0"
|
||||
"@aws-sdk/util-endpoints": "npm:3.485.0"
|
||||
"@aws-sdk/util-user-agent-browser": "npm:3.485.0"
|
||||
"@aws-sdk/util-user-agent-node": "npm:3.485.0"
|
||||
"@smithy/config-resolver": "npm:^2.0.23"
|
||||
"@smithy/core": "npm:^1.2.2"
|
||||
"@smithy/fetch-http-handler": "npm:^2.3.2"
|
||||
"@smithy/hash-node": "npm:^2.0.18"
|
||||
"@smithy/invalid-dependency": "npm:^2.0.16"
|
||||
"@smithy/middleware-content-length": "npm:^2.0.18"
|
||||
"@smithy/middleware-endpoint": "npm:^2.3.0"
|
||||
"@smithy/middleware-retry": "npm:^2.0.26"
|
||||
"@smithy/middleware-serde": "npm:^2.0.16"
|
||||
"@smithy/middleware-stack": "npm:^2.0.10"
|
||||
"@smithy/node-config-provider": "npm:^2.1.9"
|
||||
"@smithy/node-http-handler": "npm:^2.2.2"
|
||||
"@smithy/protocol-http": "npm:^3.0.12"
|
||||
"@smithy/smithy-client": "npm:^2.2.1"
|
||||
"@smithy/types": "npm:^2.8.0"
|
||||
"@smithy/url-parser": "npm:^2.0.16"
|
||||
"@smithy/util-base64": "npm:^2.0.1"
|
||||
"@smithy/util-body-length-browser": "npm:^2.0.1"
|
||||
"@smithy/util-body-length-node": "npm:^2.1.0"
|
||||
"@smithy/util-defaults-mode-browser": "npm:^2.0.24"
|
||||
"@smithy/util-defaults-mode-node": "npm:^2.0.32"
|
||||
"@smithy/util-endpoints": "npm:^1.0.8"
|
||||
"@smithy/util-retry": "npm:^2.0.9"
|
||||
"@smithy/util-utf8": "npm:^2.0.2"
|
||||
"@smithy/util-waiter": "npm:^2.0.16"
|
||||
fast-xml-parser: "npm:4.2.5"
|
||||
tslib: "npm:^2.5.0"
|
||||
checksum: 0e02739ef17b46381eb9640a8b1e444a0dc45525567b6dbc3a3ae88949423dd74688c38af9e8369d2e0793e1b1be7078557c1951ce60f97d7be01ede3f6d693b
|
||||
languageName: node
|
||||
linkType: hard
|
||||
|
||||
"@aws-sdk/client-s3@npm:^3.484.0":
|
||||
version: 3.484.0
|
||||
resolution: "@aws-sdk/client-s3@npm:3.484.0"
|
||||
@@ -459,6 +509,51 @@ __metadata:
|
||||
languageName: node
|
||||
linkType: hard
|
||||
|
||||
"@aws-sdk/client-sso@npm:3.485.0":
|
||||
version: 3.485.0
|
||||
resolution: "@aws-sdk/client-sso@npm:3.485.0"
|
||||
dependencies:
|
||||
"@aws-crypto/sha256-browser": "npm:3.0.0"
|
||||
"@aws-crypto/sha256-js": "npm:3.0.0"
|
||||
"@aws-sdk/core": "npm:3.485.0"
|
||||
"@aws-sdk/middleware-host-header": "npm:3.485.0"
|
||||
"@aws-sdk/middleware-logger": "npm:3.485.0"
|
||||
"@aws-sdk/middleware-recursion-detection": "npm:3.485.0"
|
||||
"@aws-sdk/middleware-user-agent": "npm:3.485.0"
|
||||
"@aws-sdk/region-config-resolver": "npm:3.485.0"
|
||||
"@aws-sdk/types": "npm:3.485.0"
|
||||
"@aws-sdk/util-endpoints": "npm:3.485.0"
|
||||
"@aws-sdk/util-user-agent-browser": "npm:3.485.0"
|
||||
"@aws-sdk/util-user-agent-node": "npm:3.485.0"
|
||||
"@smithy/config-resolver": "npm:^2.0.23"
|
||||
"@smithy/core": "npm:^1.2.2"
|
||||
"@smithy/fetch-http-handler": "npm:^2.3.2"
|
||||
"@smithy/hash-node": "npm:^2.0.18"
|
||||
"@smithy/invalid-dependency": "npm:^2.0.16"
|
||||
"@smithy/middleware-content-length": "npm:^2.0.18"
|
||||
"@smithy/middleware-endpoint": "npm:^2.3.0"
|
||||
"@smithy/middleware-retry": "npm:^2.0.26"
|
||||
"@smithy/middleware-serde": "npm:^2.0.16"
|
||||
"@smithy/middleware-stack": "npm:^2.0.10"
|
||||
"@smithy/node-config-provider": "npm:^2.1.9"
|
||||
"@smithy/node-http-handler": "npm:^2.2.2"
|
||||
"@smithy/protocol-http": "npm:^3.0.12"
|
||||
"@smithy/smithy-client": "npm:^2.2.1"
|
||||
"@smithy/types": "npm:^2.8.0"
|
||||
"@smithy/url-parser": "npm:^2.0.16"
|
||||
"@smithy/util-base64": "npm:^2.0.1"
|
||||
"@smithy/util-body-length-browser": "npm:^2.0.1"
|
||||
"@smithy/util-body-length-node": "npm:^2.1.0"
|
||||
"@smithy/util-defaults-mode-browser": "npm:^2.0.24"
|
||||
"@smithy/util-defaults-mode-node": "npm:^2.0.32"
|
||||
"@smithy/util-endpoints": "npm:^1.0.8"
|
||||
"@smithy/util-retry": "npm:^2.0.9"
|
||||
"@smithy/util-utf8": "npm:^2.0.2"
|
||||
tslib: "npm:^2.5.0"
|
||||
checksum: 635de0e310c3608bd94d90766ac36b56663ae39df0164122236f5d4e5a3447ba7dd2f66d7f3481380e74f1d508053d218bd0c2872df679f11225dc46f52dba11
|
||||
languageName: node
|
||||
linkType: hard
|
||||
|
||||
"@aws-sdk/client-sts@npm:3.462.0":
|
||||
version: 3.462.0
|
||||
resolution: "@aws-sdk/client-sts@npm:3.462.0"
|
||||
@@ -555,6 +650,54 @@ __metadata:
|
||||
languageName: node
|
||||
linkType: hard
|
||||
|
||||
"@aws-sdk/client-sts@npm:3.485.0":
|
||||
version: 3.485.0
|
||||
resolution: "@aws-sdk/client-sts@npm:3.485.0"
|
||||
dependencies:
|
||||
"@aws-crypto/sha256-browser": "npm:3.0.0"
|
||||
"@aws-crypto/sha256-js": "npm:3.0.0"
|
||||
"@aws-sdk/core": "npm:3.485.0"
|
||||
"@aws-sdk/credential-provider-node": "npm:3.485.0"
|
||||
"@aws-sdk/middleware-host-header": "npm:3.485.0"
|
||||
"@aws-sdk/middleware-logger": "npm:3.485.0"
|
||||
"@aws-sdk/middleware-recursion-detection": "npm:3.485.0"
|
||||
"@aws-sdk/middleware-user-agent": "npm:3.485.0"
|
||||
"@aws-sdk/region-config-resolver": "npm:3.485.0"
|
||||
"@aws-sdk/types": "npm:3.485.0"
|
||||
"@aws-sdk/util-endpoints": "npm:3.485.0"
|
||||
"@aws-sdk/util-user-agent-browser": "npm:3.485.0"
|
||||
"@aws-sdk/util-user-agent-node": "npm:3.485.0"
|
||||
"@smithy/config-resolver": "npm:^2.0.23"
|
||||
"@smithy/core": "npm:^1.2.2"
|
||||
"@smithy/fetch-http-handler": "npm:^2.3.2"
|
||||
"@smithy/hash-node": "npm:^2.0.18"
|
||||
"@smithy/invalid-dependency": "npm:^2.0.16"
|
||||
"@smithy/middleware-content-length": "npm:^2.0.18"
|
||||
"@smithy/middleware-endpoint": "npm:^2.3.0"
|
||||
"@smithy/middleware-retry": "npm:^2.0.26"
|
||||
"@smithy/middleware-serde": "npm:^2.0.16"
|
||||
"@smithy/middleware-stack": "npm:^2.0.10"
|
||||
"@smithy/node-config-provider": "npm:^2.1.9"
|
||||
"@smithy/node-http-handler": "npm:^2.2.2"
|
||||
"@smithy/protocol-http": "npm:^3.0.12"
|
||||
"@smithy/smithy-client": "npm:^2.2.1"
|
||||
"@smithy/types": "npm:^2.8.0"
|
||||
"@smithy/url-parser": "npm:^2.0.16"
|
||||
"@smithy/util-base64": "npm:^2.0.1"
|
||||
"@smithy/util-body-length-browser": "npm:^2.0.1"
|
||||
"@smithy/util-body-length-node": "npm:^2.1.0"
|
||||
"@smithy/util-defaults-mode-browser": "npm:^2.0.24"
|
||||
"@smithy/util-defaults-mode-node": "npm:^2.0.32"
|
||||
"@smithy/util-endpoints": "npm:^1.0.8"
|
||||
"@smithy/util-middleware": "npm:^2.0.9"
|
||||
"@smithy/util-retry": "npm:^2.0.9"
|
||||
"@smithy/util-utf8": "npm:^2.0.2"
|
||||
fast-xml-parser: "npm:4.2.5"
|
||||
tslib: "npm:^2.5.0"
|
||||
checksum: 98c7f4d7223cd32a1e8ded3f4d8f2fdb228c3a717a42859fbbf8afbadec56826f1e41a33d126ef2855e1e7b6d411abf25d83cd6baf9afcd65b682436570e81bd
|
||||
languageName: node
|
||||
linkType: hard
|
||||
|
||||
"@aws-sdk/core@npm:3.451.0":
|
||||
version: 3.451.0
|
||||
resolution: "@aws-sdk/core@npm:3.451.0"
|
||||
@@ -579,6 +722,20 @@ __metadata:
|
||||
languageName: node
|
||||
linkType: hard
|
||||
|
||||
"@aws-sdk/core@npm:3.485.0":
|
||||
version: 3.485.0
|
||||
resolution: "@aws-sdk/core@npm:3.485.0"
|
||||
dependencies:
|
||||
"@smithy/core": "npm:^1.2.2"
|
||||
"@smithy/protocol-http": "npm:^3.0.12"
|
||||
"@smithy/signature-v4": "npm:^2.0.0"
|
||||
"@smithy/smithy-client": "npm:^2.2.1"
|
||||
"@smithy/types": "npm:^2.8.0"
|
||||
tslib: "npm:^2.5.0"
|
||||
checksum: b84dafb213d97ebbab5d03b473e032c0e7f85872a8745fdb3274b628aa5c6e300c87a4df0747ebd29ac812c14566c295994642525210bfc81ded083d7559dbc9
|
||||
languageName: node
|
||||
linkType: hard
|
||||
|
||||
"@aws-sdk/credential-provider-env@npm:3.460.0":
|
||||
version: 3.460.0
|
||||
resolution: "@aws-sdk/credential-provider-env@npm:3.460.0"
|
||||
@@ -603,6 +760,18 @@ __metadata:
|
||||
languageName: node
|
||||
linkType: hard
|
||||
|
||||
"@aws-sdk/credential-provider-env@npm:3.485.0":
|
||||
version: 3.485.0
|
||||
resolution: "@aws-sdk/credential-provider-env@npm:3.485.0"
|
||||
dependencies:
|
||||
"@aws-sdk/types": "npm:3.485.0"
|
||||
"@smithy/property-provider": "npm:^2.0.0"
|
||||
"@smithy/types": "npm:^2.8.0"
|
||||
tslib: "npm:^2.5.0"
|
||||
checksum: b8346ea6f54cdce2302d266e76cff3569151ef9d5cf31364e99b9b0808f5f62cb45ffacb48cb68ccc85bd5774443231056a648fe9db45ac9c9f6d83e47a0c2d7
|
||||
languageName: node
|
||||
linkType: hard
|
||||
|
||||
"@aws-sdk/credential-provider-ini@npm:3.460.0":
|
||||
version: 3.460.0
|
||||
resolution: "@aws-sdk/credential-provider-ini@npm:3.460.0"
|
||||
@@ -639,6 +808,24 @@ __metadata:
|
||||
languageName: node
|
||||
linkType: hard
|
||||
|
||||
"@aws-sdk/credential-provider-ini@npm:3.485.0":
|
||||
version: 3.485.0
|
||||
resolution: "@aws-sdk/credential-provider-ini@npm:3.485.0"
|
||||
dependencies:
|
||||
"@aws-sdk/credential-provider-env": "npm:3.485.0"
|
||||
"@aws-sdk/credential-provider-process": "npm:3.485.0"
|
||||
"@aws-sdk/credential-provider-sso": "npm:3.485.0"
|
||||
"@aws-sdk/credential-provider-web-identity": "npm:3.485.0"
|
||||
"@aws-sdk/types": "npm:3.485.0"
|
||||
"@smithy/credential-provider-imds": "npm:^2.0.0"
|
||||
"@smithy/property-provider": "npm:^2.0.0"
|
||||
"@smithy/shared-ini-file-loader": "npm:^2.0.6"
|
||||
"@smithy/types": "npm:^2.8.0"
|
||||
tslib: "npm:^2.5.0"
|
||||
checksum: 3176b03ee14ae1b84340a235161e1812f16da95115330917c22b0bbcc7fa86a051e53d493d589a537466cb5bbd4866897a8088d43d7d337c36aa9bb5b12b8525
|
||||
languageName: node
|
||||
linkType: hard
|
||||
|
||||
"@aws-sdk/credential-provider-node@npm:3.460.0":
|
||||
version: 3.460.0
|
||||
resolution: "@aws-sdk/credential-provider-node@npm:3.460.0"
|
||||
@@ -677,6 +864,25 @@ __metadata:
|
||||
languageName: node
|
||||
linkType: hard
|
||||
|
||||
"@aws-sdk/credential-provider-node@npm:3.485.0":
|
||||
version: 3.485.0
|
||||
resolution: "@aws-sdk/credential-provider-node@npm:3.485.0"
|
||||
dependencies:
|
||||
"@aws-sdk/credential-provider-env": "npm:3.485.0"
|
||||
"@aws-sdk/credential-provider-ini": "npm:3.485.0"
|
||||
"@aws-sdk/credential-provider-process": "npm:3.485.0"
|
||||
"@aws-sdk/credential-provider-sso": "npm:3.485.0"
|
||||
"@aws-sdk/credential-provider-web-identity": "npm:3.485.0"
|
||||
"@aws-sdk/types": "npm:3.485.0"
|
||||
"@smithy/credential-provider-imds": "npm:^2.0.0"
|
||||
"@smithy/property-provider": "npm:^2.0.0"
|
||||
"@smithy/shared-ini-file-loader": "npm:^2.0.6"
|
||||
"@smithy/types": "npm:^2.8.0"
|
||||
tslib: "npm:^2.5.0"
|
||||
checksum: d31e5a95ea06436dc10978c39ce33263339dbd295934c37c2e762000039054456f623cf3549a07e1a2250c9f2b0552236e38dbe4cd97df809b6f7e946a65d98e
|
||||
languageName: node
|
||||
linkType: hard
|
||||
|
||||
"@aws-sdk/credential-provider-process@npm:3.460.0":
|
||||
version: 3.460.0
|
||||
resolution: "@aws-sdk/credential-provider-process@npm:3.460.0"
|
||||
@@ -703,6 +909,19 @@ __metadata:
|
||||
languageName: node
|
||||
linkType: hard
|
||||
|
||||
"@aws-sdk/credential-provider-process@npm:3.485.0":
|
||||
version: 3.485.0
|
||||
resolution: "@aws-sdk/credential-provider-process@npm:3.485.0"
|
||||
dependencies:
|
||||
"@aws-sdk/types": "npm:3.485.0"
|
||||
"@smithy/property-provider": "npm:^2.0.0"
|
||||
"@smithy/shared-ini-file-loader": "npm:^2.0.6"
|
||||
"@smithy/types": "npm:^2.8.0"
|
||||
tslib: "npm:^2.5.0"
|
||||
checksum: e740fb949ec17afd4e3a7515aa6f279eb587539f9114455e0869e762a1fb90b8349c3b7e2ceed1de307e3bef2ef9916a00e89ee5a3c1b1b6caf02a686a2d4be0
|
||||
languageName: node
|
||||
linkType: hard
|
||||
|
||||
"@aws-sdk/credential-provider-sso@npm:3.460.0":
|
||||
version: 3.460.0
|
||||
resolution: "@aws-sdk/credential-provider-sso@npm:3.460.0"
|
||||
@@ -733,6 +952,21 @@ __metadata:
|
||||
languageName: node
|
||||
linkType: hard
|
||||
|
||||
"@aws-sdk/credential-provider-sso@npm:3.485.0":
|
||||
version: 3.485.0
|
||||
resolution: "@aws-sdk/credential-provider-sso@npm:3.485.0"
|
||||
dependencies:
|
||||
"@aws-sdk/client-sso": "npm:3.485.0"
|
||||
"@aws-sdk/token-providers": "npm:3.485.0"
|
||||
"@aws-sdk/types": "npm:3.485.0"
|
||||
"@smithy/property-provider": "npm:^2.0.0"
|
||||
"@smithy/shared-ini-file-loader": "npm:^2.0.6"
|
||||
"@smithy/types": "npm:^2.8.0"
|
||||
tslib: "npm:^2.5.0"
|
||||
checksum: 7269315797a1a6a9e3d1dbfd2a65ad7c092fcc4631be880f748b3561cebab30631d10d7c281880d46113306c7794b10f2b7b3f934e8047c8559e0ec0da15d0fb
|
||||
languageName: node
|
||||
linkType: hard
|
||||
|
||||
"@aws-sdk/credential-provider-web-identity@npm:3.460.0":
|
||||
version: 3.460.0
|
||||
resolution: "@aws-sdk/credential-provider-web-identity@npm:3.460.0"
|
||||
@@ -757,6 +991,18 @@ __metadata:
|
||||
languageName: node
|
||||
linkType: hard
|
||||
|
||||
"@aws-sdk/credential-provider-web-identity@npm:3.485.0":
|
||||
version: 3.485.0
|
||||
resolution: "@aws-sdk/credential-provider-web-identity@npm:3.485.0"
|
||||
dependencies:
|
||||
"@aws-sdk/types": "npm:3.485.0"
|
||||
"@smithy/property-provider": "npm:^2.0.0"
|
||||
"@smithy/types": "npm:^2.8.0"
|
||||
tslib: "npm:^2.5.0"
|
||||
checksum: 33125ce0b7c3bf36ff3f52bda6657f667698e25bd09cb0c302e1e85b8d8b20b322e225981c887363bbe8ba47e22721184ad83ff30271b2887d4ea25de270b760
|
||||
languageName: node
|
||||
linkType: hard
|
||||
|
||||
"@aws-sdk/middleware-bucket-endpoint@npm:3.484.0":
|
||||
version: 3.484.0
|
||||
resolution: "@aws-sdk/middleware-bucket-endpoint@npm:3.484.0"
|
||||
@@ -824,6 +1070,18 @@ __metadata:
|
||||
languageName: node
|
||||
linkType: hard
|
||||
|
||||
"@aws-sdk/middleware-host-header@npm:3.485.0":
|
||||
version: 3.485.0
|
||||
resolution: "@aws-sdk/middleware-host-header@npm:3.485.0"
|
||||
dependencies:
|
||||
"@aws-sdk/types": "npm:3.485.0"
|
||||
"@smithy/protocol-http": "npm:^3.0.12"
|
||||
"@smithy/types": "npm:^2.8.0"
|
||||
tslib: "npm:^2.5.0"
|
||||
checksum: 9ca3da2a264885448a84efe37d3262909118c5ca7d74d0459f74dd9291e036660835d648f8962144a27ef25f9b8662610e104f2534e40cb2765c2747cb7a22b9
|
||||
languageName: node
|
||||
linkType: hard
|
||||
|
||||
"@aws-sdk/middleware-location-constraint@npm:3.468.0":
|
||||
version: 3.468.0
|
||||
resolution: "@aws-sdk/middleware-location-constraint@npm:3.468.0"
|
||||
@@ -857,6 +1115,17 @@ __metadata:
|
||||
languageName: node
|
||||
linkType: hard
|
||||
|
||||
"@aws-sdk/middleware-logger@npm:3.485.0":
|
||||
version: 3.485.0
|
||||
resolution: "@aws-sdk/middleware-logger@npm:3.485.0"
|
||||
dependencies:
|
||||
"@aws-sdk/types": "npm:3.485.0"
|
||||
"@smithy/types": "npm:^2.8.0"
|
||||
tslib: "npm:^2.5.0"
|
||||
checksum: 2fcb731794ecc665517b2aaba20ae24f42046cf1c7e663288afc7e97263116b6d9fa9dd36c1ba47c6ea01954a15519d6da57653b50097dab0853c6a344a69492
|
||||
languageName: node
|
||||
linkType: hard
|
||||
|
||||
"@aws-sdk/middleware-recursion-detection@npm:3.460.0":
|
||||
version: 3.460.0
|
||||
resolution: "@aws-sdk/middleware-recursion-detection@npm:3.460.0"
|
||||
@@ -881,6 +1150,18 @@ __metadata:
|
||||
languageName: node
|
||||
linkType: hard
|
||||
|
||||
"@aws-sdk/middleware-recursion-detection@npm:3.485.0":
|
||||
version: 3.485.0
|
||||
resolution: "@aws-sdk/middleware-recursion-detection@npm:3.485.0"
|
||||
dependencies:
|
||||
"@aws-sdk/types": "npm:3.485.0"
|
||||
"@smithy/protocol-http": "npm:^3.0.12"
|
||||
"@smithy/types": "npm:^2.8.0"
|
||||
tslib: "npm:^2.5.0"
|
||||
checksum: afdea18930299e12a961f68a9a898f34f737c2ce9709c70e0043d6b7ec2ea2c6ad8df05877ab013f8d7d3f6322253bbf1ff6100ab6be445ef91a95a865f74ffa
|
||||
languageName: node
|
||||
linkType: hard
|
||||
|
||||
"@aws-sdk/middleware-sdk-s3@npm:3.484.0":
|
||||
version: 3.484.0
|
||||
resolution: "@aws-sdk/middleware-sdk-s3@npm:3.484.0"
|
||||
@@ -966,6 +1247,21 @@ __metadata:
|
||||
languageName: node
|
||||
linkType: hard
|
||||
|
||||
"@aws-sdk/middleware-signing@npm:3.485.0":
|
||||
version: 3.485.0
|
||||
resolution: "@aws-sdk/middleware-signing@npm:3.485.0"
|
||||
dependencies:
|
||||
"@aws-sdk/types": "npm:3.485.0"
|
||||
"@smithy/property-provider": "npm:^2.0.0"
|
||||
"@smithy/protocol-http": "npm:^3.0.12"
|
||||
"@smithy/signature-v4": "npm:^2.0.0"
|
||||
"@smithy/types": "npm:^2.8.0"
|
||||
"@smithy/util-middleware": "npm:^2.0.9"
|
||||
tslib: "npm:^2.5.0"
|
||||
checksum: f9dbb39d8dda2841350c015eacbaa9f2444fa9b48080a5da2a41465252241f45da65007c21ce56a1961c75bf7d5395fadf39ce11ec78c96a7923a8b98a6684a2
|
||||
languageName: node
|
||||
linkType: hard
|
||||
|
||||
"@aws-sdk/middleware-ssec@npm:3.468.0":
|
||||
version: 3.468.0
|
||||
resolution: "@aws-sdk/middleware-ssec@npm:3.468.0"
|
||||
@@ -1003,6 +1299,19 @@ __metadata:
|
||||
languageName: node
|
||||
linkType: hard
|
||||
|
||||
"@aws-sdk/middleware-user-agent@npm:3.485.0":
|
||||
version: 3.485.0
|
||||
resolution: "@aws-sdk/middleware-user-agent@npm:3.485.0"
|
||||
dependencies:
|
||||
"@aws-sdk/types": "npm:3.485.0"
|
||||
"@aws-sdk/util-endpoints": "npm:3.485.0"
|
||||
"@smithy/protocol-http": "npm:^3.0.12"
|
||||
"@smithy/types": "npm:^2.8.0"
|
||||
tslib: "npm:^2.5.0"
|
||||
checksum: a8fc812aff61a1a98dbd1cb6555786b7156a1024d3aba6554d56f5302e90b1b660e141f274c0a00e107276b0f4129ce4978faeb5847a54c54cc9289dd2834035
|
||||
languageName: node
|
||||
linkType: hard
|
||||
|
||||
"@aws-sdk/region-config-resolver@npm:3.451.0":
|
||||
version: 3.451.0
|
||||
resolution: "@aws-sdk/region-config-resolver@npm:3.451.0"
|
||||
@@ -1029,6 +1338,19 @@ __metadata:
|
||||
languageName: node
|
||||
linkType: hard
|
||||
|
||||
"@aws-sdk/region-config-resolver@npm:3.485.0":
|
||||
version: 3.485.0
|
||||
resolution: "@aws-sdk/region-config-resolver@npm:3.485.0"
|
||||
dependencies:
|
||||
"@smithy/node-config-provider": "npm:^2.1.9"
|
||||
"@smithy/types": "npm:^2.8.0"
|
||||
"@smithy/util-config-provider": "npm:^2.1.0"
|
||||
"@smithy/util-middleware": "npm:^2.0.9"
|
||||
tslib: "npm:^2.5.0"
|
||||
checksum: 55bc5128b8dd325f7826afb741544689ff89da8ed5cfe4a704c90eff1c477ecf71b023cb6f52d0a2d5045eecfb4b61d82e3f98f10feb913d3720f14cce4df632
|
||||
languageName: node
|
||||
linkType: hard
|
||||
|
||||
"@aws-sdk/signature-v4-multi-region@npm:3.484.0":
|
||||
version: 3.484.0
|
||||
resolution: "@aws-sdk/signature-v4-multi-region@npm:3.484.0"
|
||||
@@ -1133,6 +1455,51 @@ __metadata:
|
||||
languageName: node
|
||||
linkType: hard
|
||||
|
||||
"@aws-sdk/token-providers@npm:3.485.0":
|
||||
version: 3.485.0
|
||||
resolution: "@aws-sdk/token-providers@npm:3.485.0"
|
||||
dependencies:
|
||||
"@aws-crypto/sha256-browser": "npm:3.0.0"
|
||||
"@aws-crypto/sha256-js": "npm:3.0.0"
|
||||
"@aws-sdk/middleware-host-header": "npm:3.485.0"
|
||||
"@aws-sdk/middleware-logger": "npm:3.485.0"
|
||||
"@aws-sdk/middleware-recursion-detection": "npm:3.485.0"
|
||||
"@aws-sdk/middleware-user-agent": "npm:3.485.0"
|
||||
"@aws-sdk/region-config-resolver": "npm:3.485.0"
|
||||
"@aws-sdk/types": "npm:3.485.0"
|
||||
"@aws-sdk/util-endpoints": "npm:3.485.0"
|
||||
"@aws-sdk/util-user-agent-browser": "npm:3.485.0"
|
||||
"@aws-sdk/util-user-agent-node": "npm:3.485.0"
|
||||
"@smithy/config-resolver": "npm:^2.0.23"
|
||||
"@smithy/fetch-http-handler": "npm:^2.3.2"
|
||||
"@smithy/hash-node": "npm:^2.0.18"
|
||||
"@smithy/invalid-dependency": "npm:^2.0.16"
|
||||
"@smithy/middleware-content-length": "npm:^2.0.18"
|
||||
"@smithy/middleware-endpoint": "npm:^2.3.0"
|
||||
"@smithy/middleware-retry": "npm:^2.0.26"
|
||||
"@smithy/middleware-serde": "npm:^2.0.16"
|
||||
"@smithy/middleware-stack": "npm:^2.0.10"
|
||||
"@smithy/node-config-provider": "npm:^2.1.9"
|
||||
"@smithy/node-http-handler": "npm:^2.2.2"
|
||||
"@smithy/property-provider": "npm:^2.0.0"
|
||||
"@smithy/protocol-http": "npm:^3.0.12"
|
||||
"@smithy/shared-ini-file-loader": "npm:^2.0.6"
|
||||
"@smithy/smithy-client": "npm:^2.2.1"
|
||||
"@smithy/types": "npm:^2.8.0"
|
||||
"@smithy/url-parser": "npm:^2.0.16"
|
||||
"@smithy/util-base64": "npm:^2.0.1"
|
||||
"@smithy/util-body-length-browser": "npm:^2.0.1"
|
||||
"@smithy/util-body-length-node": "npm:^2.1.0"
|
||||
"@smithy/util-defaults-mode-browser": "npm:^2.0.24"
|
||||
"@smithy/util-defaults-mode-node": "npm:^2.0.32"
|
||||
"@smithy/util-endpoints": "npm:^1.0.8"
|
||||
"@smithy/util-retry": "npm:^2.0.9"
|
||||
"@smithy/util-utf8": "npm:^2.0.2"
|
||||
tslib: "npm:^2.5.0"
|
||||
checksum: aed270b62546e34a476e034f90a1d10fbb05a8a14be6c93bbcd5dd8ab77cfa3b2915bae0d6a0c21044bdd039851fcbbac01f4c931b35d4f7cd5317be5b3eab24
|
||||
languageName: node
|
||||
linkType: hard
|
||||
|
||||
"@aws-sdk/types@npm:3.460.0":
|
||||
version: 3.460.0
|
||||
resolution: "@aws-sdk/types@npm:3.460.0"
|
||||
@@ -1153,6 +1520,16 @@ __metadata:
|
||||
languageName: node
|
||||
linkType: hard
|
||||
|
||||
"@aws-sdk/types@npm:3.485.0":
|
||||
version: 3.485.0
|
||||
resolution: "@aws-sdk/types@npm:3.485.0"
|
||||
dependencies:
|
||||
"@smithy/types": "npm:^2.8.0"
|
||||
tslib: "npm:^2.5.0"
|
||||
checksum: 588aae4b494d7914475280bcecb579690170ca2a1c8b6d9c64ed05819dfd79de225eaa64a455f3d168f57b365eca743a363c27be464aa3ac59a2f2199d125ae5
|
||||
languageName: node
|
||||
linkType: hard
|
||||
|
||||
"@aws-sdk/types@npm:^3.222.0":
|
||||
version: 3.342.0
|
||||
resolution: "@aws-sdk/types@npm:3.342.0"
|
||||
@@ -1193,6 +1570,17 @@ __metadata:
|
||||
languageName: node
|
||||
linkType: hard
|
||||
|
||||
"@aws-sdk/util-endpoints@npm:3.485.0":
|
||||
version: 3.485.0
|
||||
resolution: "@aws-sdk/util-endpoints@npm:3.485.0"
|
||||
dependencies:
|
||||
"@aws-sdk/types": "npm:3.485.0"
|
||||
"@smithy/util-endpoints": "npm:^1.0.8"
|
||||
tslib: "npm:^2.5.0"
|
||||
checksum: c1844fed8bb8fd01490fde9ed6cf3dad5647a51b72a964f7fd525f82a812bb79a128ff24fe0c3a3afb459290da21435548ef32e249d0018fe53bb3b4d4635bcb
|
||||
languageName: node
|
||||
linkType: hard
|
||||
|
||||
"@aws-sdk/util-locate-window@npm:^3.0.0":
|
||||
version: 3.310.0
|
||||
resolution: "@aws-sdk/util-locate-window@npm:3.310.0"
|
||||
@@ -1226,6 +1614,18 @@ __metadata:
|
||||
languageName: node
|
||||
linkType: hard
|
||||
|
||||
"@aws-sdk/util-user-agent-browser@npm:3.485.0":
|
||||
version: 3.485.0
|
||||
resolution: "@aws-sdk/util-user-agent-browser@npm:3.485.0"
|
||||
dependencies:
|
||||
"@aws-sdk/types": "npm:3.485.0"
|
||||
"@smithy/types": "npm:^2.8.0"
|
||||
bowser: "npm:^2.11.0"
|
||||
tslib: "npm:^2.5.0"
|
||||
checksum: d1e4d4c63508e91a38f0a1a35330cc7233d235efe315b56925f0d4cd4ea88baef3a6ca0f995571e3b81084e1b2ef229a5c0c9e72e2787321bb7da889231a8f77
|
||||
languageName: node
|
||||
linkType: hard
|
||||
|
||||
"@aws-sdk/util-user-agent-node@npm:3.460.0":
|
||||
version: 3.460.0
|
||||
resolution: "@aws-sdk/util-user-agent-node@npm:3.460.0"
|
||||
@@ -1260,6 +1660,23 @@ __metadata:
|
||||
languageName: node
|
||||
linkType: hard
|
||||
|
||||
"@aws-sdk/util-user-agent-node@npm:3.485.0":
|
||||
version: 3.485.0
|
||||
resolution: "@aws-sdk/util-user-agent-node@npm:3.485.0"
|
||||
dependencies:
|
||||
"@aws-sdk/types": "npm:3.485.0"
|
||||
"@smithy/node-config-provider": "npm:^2.1.9"
|
||||
"@smithy/types": "npm:^2.8.0"
|
||||
tslib: "npm:^2.5.0"
|
||||
peerDependencies:
|
||||
aws-crt: ">=1.0.0"
|
||||
peerDependenciesMeta:
|
||||
aws-crt:
|
||||
optional: true
|
||||
checksum: e2805ef37b90677673b73acc9dc009cdd70f6167d1f0f83fdfe65e867057f6091b924642f8ff5338aff711b8c623fe9e765f2438cdeaa232953359f756947dd5
|
||||
languageName: node
|
||||
linkType: hard
|
||||
|
||||
"@aws-sdk/util-utf8-browser@npm:^3.0.0":
|
||||
version: 3.259.0
|
||||
resolution: "@aws-sdk/util-utf8-browser@npm:3.259.0"
|
||||
@@ -3894,7 +4311,7 @@ __metadata:
|
||||
languageName: node
|
||||
linkType: hard
|
||||
|
||||
"@smithy/core@npm:^1.2.1":
|
||||
"@smithy/core@npm:^1.2.1, @smithy/core@npm:^1.2.2":
|
||||
version: 1.2.2
|
||||
resolution: "@smithy/core@npm:1.2.2"
|
||||
dependencies:
|
||||
@@ -4066,7 +4483,7 @@ __metadata:
|
||||
languageName: node
|
||||
linkType: hard
|
||||
|
||||
"@smithy/hash-node@npm:^2.0.17":
|
||||
"@smithy/hash-node@npm:^2.0.17, @smithy/hash-node@npm:^2.0.18":
|
||||
version: 2.0.18
|
||||
resolution: "@smithy/hash-node@npm:2.0.18"
|
||||
dependencies:
|
||||
@@ -4099,7 +4516,7 @@ __metadata:
|
||||
languageName: node
|
||||
linkType: hard
|
||||
|
||||
"@smithy/invalid-dependency@npm:^2.0.15":
|
||||
"@smithy/invalid-dependency@npm:^2.0.15, @smithy/invalid-dependency@npm:^2.0.16":
|
||||
version: 2.0.16
|
||||
resolution: "@smithy/invalid-dependency@npm:2.0.16"
|
||||
dependencies:
|
||||
@@ -4151,7 +4568,7 @@ __metadata:
|
||||
languageName: node
|
||||
linkType: hard
|
||||
|
||||
"@smithy/middleware-content-length@npm:^2.0.17":
|
||||
"@smithy/middleware-content-length@npm:^2.0.17, @smithy/middleware-content-length@npm:^2.0.18":
|
||||
version: 2.0.18
|
||||
resolution: "@smithy/middleware-content-length@npm:2.0.18"
|
||||
dependencies:
|
||||
@@ -4667,7 +5084,7 @@ __metadata:
|
||||
languageName: node
|
||||
linkType: hard
|
||||
|
||||
"@smithy/util-defaults-mode-browser@npm:^2.0.23":
|
||||
"@smithy/util-defaults-mode-browser@npm:^2.0.23, @smithy/util-defaults-mode-browser@npm:^2.0.24":
|
||||
version: 2.0.24
|
||||
resolution: "@smithy/util-defaults-mode-browser@npm:2.0.24"
|
||||
dependencies:
|
||||
@@ -4695,7 +5112,7 @@ __metadata:
|
||||
languageName: node
|
||||
linkType: hard
|
||||
|
||||
"@smithy/util-defaults-mode-node@npm:^2.0.31":
|
||||
"@smithy/util-defaults-mode-node@npm:^2.0.31, @smithy/util-defaults-mode-node@npm:^2.0.32":
|
||||
version: 2.0.32
|
||||
resolution: "@smithy/util-defaults-mode-node@npm:2.0.32"
|
||||
dependencies:
|
||||
@@ -4721,7 +5138,7 @@ __metadata:
|
||||
languageName: node
|
||||
linkType: hard
|
||||
|
||||
"@smithy/util-endpoints@npm:^1.0.7":
|
||||
"@smithy/util-endpoints@npm:^1.0.7, @smithy/util-endpoints@npm:^1.0.8":
|
||||
version: 1.0.8
|
||||
resolution: "@smithy/util-endpoints@npm:1.0.8"
|
||||
dependencies:
|
||||
@@ -4853,7 +5270,7 @@ __metadata:
|
||||
languageName: node
|
||||
linkType: hard
|
||||
|
||||
"@smithy/util-waiter@npm:^2.0.15":
|
||||
"@smithy/util-waiter@npm:^2.0.15, @smithy/util-waiter@npm:^2.0.16":
|
||||
version: 2.0.16
|
||||
resolution: "@smithy/util-waiter@npm:2.0.16"
|
||||
dependencies:
|
||||
@@ -5442,6 +5859,7 @@ __metadata:
|
||||
version: 0.0.0-use.local
|
||||
resolution: "@standardnotes/syncing-server@workspace:packages/syncing-server"
|
||||
dependencies:
|
||||
"@aws-sdk/client-cloudwatch": "npm:^3.485.0"
|
||||
"@aws-sdk/client-s3": "npm:^3.484.0"
|
||||
"@aws-sdk/client-sns": "npm:^3.484.0"
|
||||
"@aws-sdk/client-sqs": "npm:^3.484.0"
|
||||
|
||||
Reference in New Issue
Block a user