Commit Graph

127 Commits (c03bd2a238741a012aa4b98dc4902d6cf948ab63)

Author SHA1 Message Date
Renaud Chaput 774e1189d2
Change `eslint` config to autofix missing comma and indentation in JS files ()
Emelia Smith f68d540271
Fix websocket connections being incorrectly decremented twice on errors ()
Emelia Smith fbfceb9c77
Add additional metrics for streaming ()
Gabriel Simmer be991f1d18
Move to ioredis for streaming ()
Co-authored-by: Emelia Smith <ThisIsMissEm@users.noreply.github.com>
Emelia Smith 6375e390af
Fix: support both DATABASE_URL and DB_PASS ()
Emelia Smith 65096c1ccd
Change streaming `/metrics` to include additional metrics ()
Renaud Chaput 3554c52795
Fix missing return values in streaming ()
Claire 446821a0dc
Swap debug statements in streaming server ()
Emelia Smith 81cdc0f972
Fix: Streaming server memory leak in HTTP EventSource cleanup ()
Emelia Smith ddaf200c78
Refactor streaming's filtering logic & improve documentation ()
Claire 1814990a3d
Fix wrong filters sometimes applying in streaming ()
Emelia Smith 215081240f
Add logging of websocket send errors ()
Emelia Smith c81f59583c
Fix logging of messages that are binary before closing their connection ()
Emelia Smith 16dd3f08c1
Fix performance of streaming by parsing message JSON once ()
Renaud Chaput d27216dc46
Enforce import order with ESLint ()
Nick Schonning f22b4e556c
Add eslint-plugin-jsdoc ()
Emelia Smith 301e03eb8c
Remove clustering from streaming API ()
Claire 174352716a
Disable anonymous access to the streaming API ()
Eugen Rochko be1792e1d4
Fix streaming API not being usable without `DATABASE_URL` ()
Ramūns Usovs 0872f3e3d7
Allow streaming to connect to postgress with self-signed certs ()
emilweth 7c45145430
fix metrics format ()
emilweth c1b823368c
dot is not allowed ()
Eugen Rochko c5a4d8c82d
Add information about database pool to metrics endpoint in streaming API ()
Eugen Rochko 4cb7647516
Add database pool configuration over `DB_POOL` to streaming API ()
Add connection timeout of 15s
Eugen Rochko 01584f03e8
Add metrics endpoint to streaming API ()
Nick Schonning 06b68490d1
Enable eslint:recommended ruleset ()
* Enable ESLint recommended ruleset

* Disable failing ESLint recommended rules

* Remove rules shadowed by eslint:recommended
Claire 8c3c6dcae9
Fix filters from other users being used in the streaming service ()
Claire cd5e98dbdb
Fix public/local timeline posts not being properly filtered ()
* Fix streaming server using wrong property name for matching filters

Late in the PR, the `filter_results` property has been renamed to `filtered`,
but the change has not been reflected in the streaming server code.

* Fix filter_action attribute being an integer instead of a string
Eugen Rochko e7aa2be828
Change how hashtags are normalized ()
* Change how hashtags are normalized

* Fix tests
Claire 02851848e9
Revamp post filtering system ()
* Add model for custom filter keywords

* Use CustomFilterKeyword internally

Does not change the API

* Fix /filters/edit and /filters/new

* Add migration tests

* Remove whole_word column from custom_filters (covered by custom_filter_keywords)

* Redesign /filters

Instead of a list, present a card that displays more information and handles
multiple keywords per filter.

* Redesign /filters/new and /filters/edit to add and remove keywords

This adds a new gem dependency: cocoon, as well as a npm dependency:
cocoon-js-vanilla. Those are used to easily populate and remove form fields
from the user interface when manipulating multiple keyword filters at once.

* Add /api/v2/filters to edit filter with multiple keywords

Entities:
- `Filter`: `id`, `title`, `filter_action` (either `hide` or `warn`), `context`
  `keywords`
- `FilterKeyword`: `id`, `keyword`, `whole_word`

API endpoits:
- `GET /api/v2/filters` to list filters (including keywords)
- `POST /api/v2/filters` to create a new filter
  `keywords_attributes` can also be passed to create keywords in one request
- `GET /api/v2/filters/:id` to read a particular filter
- `PUT /api/v2/filters/:id` to update a new filter
  `keywords_attributes` can also be passed to edit, delete or add keywords in
   one request
- `DELETE /api/v2/filters/:id` to delete a particular filter
- `GET /api/v2/filters/:id/keywords` to list keywords for a filter
- `POST /api/v2/filters/:filter_id/keywords/:id` to add a new keyword to a
   filter
- `GET /api/v2/filter_keywords/:id` to read a particular keyword
- `PUT /api/v2/filter_keywords/:id` to edit a particular keyword
- `DELETE /api/v2/filter_keywords/:id` to delete a particular keyword

* Change from `irreversible` boolean to `action` enum

* Remove irrelevent `irreversible_must_be_within_context` check

* Fix /filters/new and /filters/edit with update for filter_action

* Fix Rubocop/Codeclimate complaining about task names

* Refactor FeedManager#phrase_filtered?

This moves regexp building and filter caching to the `CustomFilter` class.

This does not change the functional behavior yet, but this changes how the
cache is built, doing per-custom_filter regexps so that filters can be matched
independently, while still offering caching.

* Perform server-side filtering and output result in REST API

* Fix numerous filters_changed events being sent when editing multiple keywords at once

* Add some tests

* Use the new API in the WebUI

- use client-side logic for filters we have fetched rules for.
  This is so that filter changes can be retroactively applied without
  reloading the UI.
- use server-side logic for filters we haven't fetched rules for yet
  (e.g. network error, or initial timeline loading)

* Minor optimizations and refactoring

* Perform server-side filtering on the streaming server

* Change the wording of filter action labels

* Fix issues pointed out by linter

* Change design of “Show anyway” link in accordence to review comments

* Drop “irreversible” filtering behavior

* Move /api/v2/filter_keywords to /api/v1/filters/keywords

* Rename `filter_results` attribute to `filtered`

* Rename REST::LegacyFilterSerializer to REST::V1::FilterSerializer

* Fix systemChannelId value in streaming server

* Simplify code by removing client-side filtering code

The simplifcation comes at a cost though: filters aren't retroactively
applied anymore.
Yamagishi Kazutoshi 5781d1db84
Fix parsing `TRUSTED_PROXY_IP` ()
Claire f29458da1d
Fix streaming server sometimes silently dropping subscriptions ()
Claire 6ea80ba2a2
Change streaming server error messages when failing to parse client input ()
Fixes 

- prefix JSON parsing error message by “Error parsing message from …”
- output user id if a user is logged in, IP address otherwise
- reduce log level from error to warning when a user is logged in, and to silly
  otherwise
Claire bc066d8936
Fix timeline streaming stopping for multiple sessions instead of one ()
* Fix timeline streaming stopping for multiple sessions instead of one

Fixes .

In updating the code for a newer version of node-redis,  also broke
redis subscription management when multiple streaming clients subscribe to the
same channel.

This commit restores the redis subscription management code.

* Let node-redis actually handle the subscriptions
Lerk 4d1eaf3e6e
Finish update of node-redis ()
* fix streaming redis client

* use console.error instead of console.log

* follow node-redis migration guide

https://github.com/redis/node-redis/blob/master/docs/v3-to-v4.md

* fix config options for node-redis

* keep indentation

* Update streaming/index.js

Co-authored-by: Yamagishi Kazutoshi <ykzts@desire.sh>

Co-authored-by: Yamagishi Kazutoshi <ykzts@desire.sh>
Sasha Sorokin 6c88ebfd4b
fix(streaming): req.scopes can be nullable ()
When checking for required OAuth scopes, an unexpected error could
happen due to missing (null-y) req.scopes. This commit fixes that by
checking if req.scopes are present before checking if any required
scopes are present, otherwise it skips that straight to rejection.
Eugen Rochko a0d4129893
Refactor notifications to go through a separate stream in streaming API ()
Eliminate need to have custom notifications filtering logic in the
streaming API code by publishing notifications into a separate stream
and then simply using the multi-stream capability to subscribe to that
stream when necessary
Eugen Rochko c5c46dd6ee
Fix "cb is not a function" error in streaming API server ()
Third argument of `ping` is the callback

Regression from 
Eugen Rochko aafe65a142
Change log level of worker start/end to warn in streaming API ()
Claire 49814d5799
Switch from deprecated ClusterWS/cws to ws package ()
* Switch from deprecated ClusterWS/cws to ws package

Fixes 

Co-authored-by: Edho Arief <me@nanaya.pro>

* Make bufferutil and utf-8-validate optional dependencies

Co-authored-by: Edho Arief <me@nanaya.pro>
abcang a2da02626e
Fixed ESLint error ()
* eslint --fix

* fix consistent-return

* fix promise/catch-or-return

* ignore import rule
Eugen Rochko aa10200e58
Fix streaming API allowing connections to persist after access token invalidation ()
Fix 
fuyu e39d97f700
Fix crash streaming process when receive invalid json ()
Eugen Rochko 01647b8acb
Fix destructuring error when unsubscribing without subscribing ()
Eugen Rochko ef057584fd
Add support for managing multiple stream subscriptions in a single connection ()
ThibG ddcdddd6fc
Change streaming server to treat blank redis password as password-less auth ()
Fixes 

Our `mastodon:setup` task defaults to a blank password rather than the
absence of password, but some versions of Redis reject blank password
authentication when authentication is possible without a password.

The Ruby code only uses the Redis password when it's not blank, so
do the same for the node.js part.
Eugen Rochko 5d8398c8b8
Add E2EE API ()
Takeshi Umeda 26b08a3c54
Add remote only to public timeline ()
* Add remote only to public timeline

* Fix code style
Ben Lubar 0dfba0884e minor server-sent events fixes ()
* Send output on the server-sent events stream immediately so the client sees that it was successfully opened even if it doesn't have any messages.

Fix transparent SSE streaming for the public:local and hashtag:local stream types.

* Tell caches to never store server-sent events.
Eugen Rochko 24552b5160
Add whitelist mode ()