91 Commits

Author SHA1 Message Date
David Robertson
5c38784743
New env var 2023-04-04 16:37:54 +01:00
Joe Groocock
d066dce13c
Implement listening on TLS/HTTPS
This uses Go's vanilla ListenAndServeTLS(), and as such none of the
normal TLS toggles are available for the user to configure. This
provides a basic H2+TLS1.3 with modern cipher experience, which should
be good enough for use on the open internet.

Signed-off-by: Joe Groocock <me@frebib.net>
2023-03-23 22:15:23 +00:00
Kegan Dougal
2f8e3313d8 v0.99.1 2023-02-24 08:49:36 +00:00
Kegan Dougal
5de7fa72f6 Read TraceContext headers to get full client/server spans 2023-02-21 10:50:39 +00:00
Kegan Dougal
1d64febf49 metrics: add Jaeger spans by setting SYNCV3_JAEGER_URL
This is a WIP but is mostly there. Jaeger debug logging goes
to the wrong logger currently (e.g if you enter an invalid URL).
2023-02-20 17:55:34 +00:00
Kegan Dougal
4a2f45315a v0.99.0 2023-02-01 12:15:52 +00:00
Kegan Dougal
b3dfb02b57 v0.99.0-rc1 2023-01-20 09:45:35 +00:00
Kegan Dougal
4c8381bd34 v0.98.1 2023-01-12 17:35:37 +00:00
Kegan Dougal
aa28df161c Rename package -> github.com/matrix-org/sliding-sync 2022-12-15 11:08:50 +00:00
Kegan Dougal
be8543a21a add extensions for typing and receipts; bugfixes and additional perf improvements
Features:
 - Add `typing` extension.
 - Add `receipts` extension.
 - Add comprehensive prometheus `/metrics` activated via `SYNCV3_PROM`.
 - Add `SYNCV3_PPROF` support.
 - Add `by_notification_level` sort order.
 - Add `include_old_rooms` support.
 - Add support for `$ME` and `$LAZY`.
 - Add correct filtering when `*,*` is used as `required_state`.
 - Add `num_live` to each room response to indicate how many timeline entries are live.

Bug fixes:
 - Use a stricter comparison function on ranges: fixes an issue whereby UTs fail on go1.19 due to change in sorting algorithm.
 - Send back an `errcode` on HTTP errors (e.g expired sessions).
 - Remove `unsigned.txn_id` on insertion into the DB. Otherwise other users would see other users txn IDs :(
 - Improve range delta algorithm: previously it didn't handle cases like `[0,20] -> [20,30]` and would panic.
 - Send HTTP 400 for invalid range requests.
 - Don't publish no-op unread counts which just adds extra noise.
 - Fix leaking DB connections which could eventually consume all available connections.
 - Ensure we always unblock WaitUntilInitialSync even on invalid access tokens. Other code relies on WaitUntilInitialSync() actually returning at _some_ point e.g on startup we have N workers which bound the number of concurrent pollers made at any one time, we need to not just hog a worker forever.

Improvements:
 - Greatly improve startup times of sync3 handlers by improving `JoinedRoomsTracker`: a modest amount of data would take ~28s to create the handler, now it takes 4s.
 - Massively improve initial initial v3 sync times, by refactoring `JoinedRoomsTracker`, from ~47s to <1s.
 - Add `SlidingSyncUntil...` in tests to reduce races.
 - Tweak the API shape of JoinedUsersForRoom to reduce state block processing time for large rooms from 63s to 39s.
 - Add trace task for initial syncs.
 - Include the proxy version in UA strings.
 - HTTP errors now wait 1s before returning to stop clients tight-looping on error.
 - Pending event buffer is now 2000.
 - Index the room ID first to cull the most events when returning timeline entries. Speeds up `SelectLatestEventsBetween` by a factor of 8.
 - Remove cancelled `m.room_key_requests` from the to-device inbox. Cuts down the amount of events in the inbox by ~94% for very large (20k+) inboxes, ~50% for moderate sized (200 events) inboxes. Adds book-keeping to remember the unacked to-device position for each client.
2022-12-14 18:53:55 +00:00
Kegan Dougal
564f1863ba v0.4.1 2022-09-05 17:28:27 +01:00
Kegan Dougal
6e0ea54c57 v0.4.0 2022-08-23 16:15:28 +01:00
Kegan Dougal
daa200c0ba v0.3.3 2022-08-19 11:32:02 +01:00
Kegan Dougal
86a0d5484d v0.3.2 2022-08-16 16:46:43 +01:00
Kegan Dougal
3c23e4bb4d v0.3.1 2022-08-16 14:36:40 +01:00
Kegan Dougal
a37aee4c2b Improve logging; remove useless fields 2022-08-16 14:23:05 +01:00
Kegan Dougal
ca2b19310e v0.3.0 2022-08-05 13:10:48 +01:00
Kegan Dougal
3a374b31b4 v0.2.1 2022-08-01 12:15:33 +01:00
Kegan Dougal
90a0f9aa29 v0.2.0 2022-07-21 17:54:12 +01:00
Kegan Dougal
0e5b8f2292 v0.2.0rc4 2022-07-20 11:39:57 +01:00
Kegan Dougal
b5341bfac6 Don't wait for v2 pollers which may never poll successfully 2022-07-20 11:32:33 +01:00
Kegan Dougal
eb6c84b9ba v0.2.0rc3 2022-07-14 15:48:30 +01:00
Kegan Dougal
47b74a6be6 Automatically start v2 pollers on startup
We can do this now because we store the access token for each device.

Throttled at 16 concurrent sync requests to avoid causing
thundering herds on startup.
2022-07-14 10:48:45 +01:00
Kegan Dougal
ed9e9ed48c Persist v2 access tokens in the database, encrypted
- Add `SYNCV3_SECRET` env var which is SHA256'd and used as an AES
  key to encrypt/decrypt tokens.
- Add column `v2_token_encrypted` to `syncv3_sync2_devices`
- Update unit tests to check encryption/decryption work.

This provides an extra layer of security in case the database is
compromised and real user access tokens are leaked. This forces
an attacker to obtain both the database table _and_ the secret
env var (which will typically be stored in secure storage e.g
k8s secrets). Unfortunately, we need to have the access_token
in the plain so we cannot rely on password-style storage algorithms
like bcrypt/scrypt, which would be safer.
2022-07-13 17:03:40 +01:00
Kegan Dougal
1f5d52fef9 Remove CLI flags; always use env vars
Provides a consistent public-facing API for Docker and direct usage.
2022-07-13 11:20:13 +01:00
Kegan Dougal
c145bec508 v0.2.0rc2: spec: honour the spec and return all room IDs matched in a list when slow_get_all_rooms is true
Adjust integration tests to test this. Cut v0.2.0rc2.
2022-07-12 17:47:18 +01:00
Kegan Dougal
2926c3b3e2 v0.2.0rc1 2022-06-08 18:32:19 +01:00
Kegan Dougal
afeff19a84 v0.1.4 2022-04-26 16:08:31 +01:00
Kegan Dougal
3dcdbe7a9d v0.1.3 2022-04-26 15:15:35 +01:00
Kegan Dougal
5a91264d2f v0.1.2 2022-04-22 12:35:44 +01:00
Kegan Dougal
a38cebf1bd v0.1.1 2022-04-13 12:47:30 +01:00
Kegan Dougal
ebb9919614 Add trace logging 2022-04-12 12:27:20 +01:00
Kegan Dougal
06b02df0cc v0.1.0 2022-04-01 13:44:09 +01:00
Kegan Dougal
8a677347f8 server/bugfix: fix panic on invited rooms; expose v2 server url to client
- Expose `/client/server.json` so clients know the CS API base endpoint for things like media requests
  (and in future sending events, etc)
- Tidy up a few comments.
2022-02-24 14:14:59 +00:00
Kegan Dougal
11b1260d07 Split sync3 into sync3 and sync3/handler
`sync3` contains data structures and logic which is very isolated and
testable (think ConnMap, Room, Request, SortableRooms, etc) whereas
`sync3/handler` contains control flow which calls into `sync3` data
structures.

This has numerous benefits:
 - Gnarly complicated structs like `ConnState` are now more isolated
   from the codebase, forcing better API design on `sync3` structs.
 - The inability to do import cycles forces structs in `sync3` to remain
   simple: they cannot pull in control flow logic from `sync3/handler`
   without causing a compile error.
 - It's significantly easier to figure out where to start looking for
   code that executes when a new request is received, for new developers.
 - It simplifies the number of things that `ConnState` can touch. Previously
   we were gut wrenching out of convenience but now we're forced to move
   more logic from `ConnState` into `sync3` (depending on the API design).
   For example, adding `SortableRooms.RoomIDs()`.
2021-11-05 15:45:04 +00:00
Kegan Dougal
e20a8ad067 Move synclive to sync3 2021-10-05 16:22:02 +01:00
Kegan Dougal
e25f366f67 Add pprof handler; speed up loading current state for all rooms 2021-09-30 13:30:49 +01:00
Kegan Dougal
33742d331f Add JoinedRoomsTracker and load them from DB on startup 2021-09-22 11:20:00 +01:00
Kegan Dougal
62f1eb0ee6 Conn: handle positions, retries and blocking operations
This abstracts the long-pollness of the HTTP connection.
Note that we cannot just maintain a server-side buffer of
events to feed down the connection because the client can
drastically alter _which_ events should be fed to the client.
There still needs to be a request/response cycle, except we
can factor out retry handling (duplicate request detection)
and incrementing of the positions.
2021-09-21 16:00:06 +01:00
Kegan Dougal
e26ec22875 Move sync3 API into a new package 2021-09-20 16:52:50 +01:00
Kegan Dougal
9d372e15de Initial commit 2021-05-14 16:49:33 +01:00