* feat(ap): add support for shared inboxes to reduce outbound load
* feat(db): refactor ap followers db into followers repository
* fix(ap): use the updated activity library to pull out the shared inbox endpoint
* chore(deps): point at updated build of owncast/activity
* fix(ap): typeless endpoints
* feat(test): update ActivityPub test to support shared inboxes
* chore(test): remove unused variable
* fix: feedback from review. Guard against SSRF/non-HTTPS/local and handle transaction errors
* feat(test): add an end-to-end ActivityPub integration test
* chore(ci): run AP integration test under CI
* feat(test): use caddy instead of home built reverse proxy
* fix(test): fix linter warnings
* chore(test): don't commit test self-signed certs I suppose
* chore(test): more shellcheck linter warnings
* fix: fix test setup under CI
* fix: remove optimistic UI updates in external actions to prevent race condition (#4711)
When adding/deleting external actions, the UI would sometimes show
duplicated or cloned rows due to a race condition between:
1. The optimistic setActions() call updating local state
2. The save() callback updating externalActions in context
3. The useEffect syncing actions from externalActions
This fix removes the optimistic updates and lets the server response
be the single source of truth, updating the UI only after the context
is updated via the save() success callback.
Fixes#4347
* fix(ap): additional outbound ActivityPub delivery optimizations
- check circuit breaker before signing any messages or any other work
- create outbound messages in batches and not all at once
- add small delay between outbound messages to spread it out a bit
* fix(ap): increase ap queue buffer size, reduce outbound http client timeout
* fix(ap): handle malformed inbox URIs
* fix(ap): batch outbox based on work performed not index
* feat(ap): add retryable activitypub outbound delivery client
---------
Co-authored-by: John Costa <jcosta@execonline.com>
When adding/deleting external actions, the UI would sometimes show
duplicated or cloned rows due to a race condition between:
1. The optimistic setActions() call updating local state
2. The save() callback updating externalActions in context
3. The useEffect syncing actions from externalActions
This fix removes the optimistic updates and lets the server response
be the single source of truth, updating the UI only after the context
is updated via the save() success callback.
Fixes#4347
Adds a Recoil atom (chatInputDraftAtom) to store the chat input draft,
which persists the text when the chat component unmounts/remounts during
mobile/desktop mode transitions.
Changes:
- Add chatInputDraftAtom to ClientConfigStore
- Update ChatTextField to save draft on input change
- Restore draft when component mounts
- Clear draft when message is sent
Closes#3615
* fix(ap): add safe constructors, getters, and validators to ActivityPub actors to address #4701
* chore: replace nil check with the new Validate() method
* chore(test): added test to verify the values extracted from actors
* fix: return the specific error type + test for it
* fix(ap): add recovery for each AP inbox worker for a worst case scenario
* fix(ap): add additional safe accessor methods to other AP entities other than actors
* chore(tests): add tests for the new safe accessors
* fix(ap): handle empty public keys in AP actors
- Combines 'Learn more' link and surrounding text into one Translation
- Fixes double space issue (was + regular space)
- Enables full sentence to be localized: '<a>Learn more</a> about Owncast browser notifications.'
Closes#4655
The banUser function in ChatModerationService was sending an incomplete
request body to the /api/chat/users/setenabled endpoint. The API requires
both userId and enabled fields, but only userId was being sent.
This caused the endpoint to return a 400 Bad Request with the error:
"must provide userId and enabled state"
Added the missing enabled: false parameter to properly disable the user
when banning.
Co-authored-by: Matt Pruitt <41898282+guitsaru@users.noreply.github.com>