Commit graph

2761 commits

Author SHA1 Message Date
23e28e6698
test(sync): Ensure feature properties are synced 2024-06-07 16:32:23 +02:00
c5fdb8abde
docs(sync): Document WEBSOCKET_* settings 2024-06-07 16:32:22 +02:00
5fd0a2945a
chore(sync): remove belongsTo for now
As it requires more discussion, it will happen in a separate
pull-request.
2024-06-07 16:32:22 +02:00
f16491ace4
chore(test): remove empty test 2024-06-07 16:32:22 +02:00
5e6cb1ff03
chore(test): fix a typo
(but I would really like to see what web socker would look like)
2024-06-07 16:32:22 +02:00
b1e4233b25
chore(sync): relax some validation logic on the websocket server
Messages are now checked for conformity with the procol we defined, but
stop at the `operation` boundary. Values aren't checked.
2024-06-07 16:32:22 +02:00
8e7e071ad5
chore(sync): Sync engine now retrieves auth token
It's now it's responsability to get the authentication token from
the http server and pass it to the websocket server, it will make it
possible to redo the roundtrip when getting disconnected.
2024-06-07 16:32:21 +02:00
5c1c93f60e
chore(sync): use sync=false everywhere to stop propagation
In some cases, you want to stop the propagation of events. The previous
code was using `fromSync=true` and `sync=false` interchangeably. This
makes it use `sync=false` everywhere.
2024-06-07 16:32:21 +02:00
0a1b2760de
chore(utils): remove console.log calls 2024-06-07 16:32:21 +02:00
49913bf206
fix(schema): dashArray belongs to features as well 2024-06-07 16:32:21 +02:00
b0b0240103
test(sync): Ensure datalayer properties are synced 2024-06-07 16:32:21 +02:00
b57c37fe5c
test(sync): Ensure map properties are synced
This tests that the name of the map, and that zoom-control visibility is
properly synced over websockets.
2024-06-07 16:32:21 +02:00
83ff674d0c
test(sync): ensure polygon drag-n-drop is synced 2024-06-07 16:32:20 +02:00
91689d6c1c
test(sync): Ensure polygons and their edits can be synced 2024-06-07 16:32:20 +02:00
98a9815c33
test(sync): Marker drag-n-drop and delete are synced 2024-06-07 16:32:20 +02:00
7ad0708033
tests(sync): Test that marker sync works properly
This commit handles the start and stop of the websocket server during
the tests, using the xprocess library
2024-06-07 16:32:20 +02:00
fc61d41403
chore(tests): Rename "collaboration" tests to "optimistic merge"
As "collaboration" can be mistaken between "websocket" and
"server-merge". This naming makes it explicit.
2024-06-07 16:32:20 +02:00
0a37871e0c
chore(sync): Add message-dispatcher unit tests 2024-06-07 16:32:19 +02:00
ff840a29e0
feat(sync): Add JS unittests for updateObjectValue, and refactor.
The new implementation uses `reduce`, in the hopes of producing a more
readable version than old-style loops and reassignment of object values.
2024-06-07 16:32:19 +02:00
6d08f2085c
feat(sync): add tests for the websocket token view 2024-06-07 16:32:19 +02:00
41ce203c58
refactor(sync): Remove unnecessary complexity
Because we're relying on the `geoJSONToFeatures` method, we don't need
anymore updaters, the default ones (map, datalayer, feature) are enough.

It also makes the codebase compatible with our eslint configuration.
2024-06-07 16:32:19 +02:00
7d623e83d0
chore(sync) make the test pass 2024-06-07 16:32:19 +02:00
e6f74b1960
chore(docker) remove ws.py for now 2024-06-07 16:32:18 +02:00
b421455c25
fix(sync) only send datalayer options 2024-06-07 16:32:18 +02:00
981d9939a3
fix(sync): do not call getSyncMetadata if it doesn't exist
This can arise when the form isn't bound to a "syncable" object. We
might want to provide an utility to check an object is *syncable*, or a
specific form to not attempt to sync objects which don't need it.
2024-06-07 16:32:18 +02:00
9e20c2ba52
feat(sync): Allow the sync of datalayer creation 2024-06-07 16:32:18 +02:00
bf60b03a55
fix(sync): allow features geometries to be synced
By defining the `geometry` property in the schema.
2024-06-07 16:32:18 +02:00
cf64ed285a
chore(docker): run the websocket server as a separate command 2024-06-07 16:32:17 +02:00
d43a80b274
chore(sync): remove useless dependencies from ws.py 2024-06-07 16:32:17 +02:00
9ae4c57279
feat(settings): allow reading socket-related settings from ENV variables 2024-06-07 16:32:17 +02:00
05147feb2e
fix(sync): intialize the sync engine before entering edit mode.
Otherwise `this.sync` is not defined.
2024-06-07 16:32:17 +02:00
ef99bf9d86
feat(sync): handle syncing of map limitbounds. 2024-06-07 16:32:17 +02:00
a278b67d5d
feat(sync): Avoid syncing remote datalayers' features
They will be synced on their own, and we dont want them to be present
twice on the map.
2024-06-07 16:32:16 +02:00
a3fb993c57
fix(sync): Initialize tilelayerand remoteData earlier.
It makes it possible to set these values on a remote peer.
2024-06-07 16:32:16 +02:00
2b4a7abeb9
fix(sync): Allow overlays to sync
`this.options.overlay` is now set during `map.initialize()`, which makes
it possible to be set by incoming websocket operations.
2024-06-07 16:32:16 +02:00
c5f0f7dc22
chore(sync): Ensure properties can be updated before doing it.
When receiving a message, this checks the given properties belong to
the "subject" before applying the message.
2024-06-07 16:32:16 +02:00
8d2d7e4a6f
chore(schema): Add a belongsTo field in the schema.
The goal is to use this as a security measure, to check that the
updated properties belong the the "subject" when receiving sync
operations.
2024-06-07 16:32:16 +02:00
90f89c523d
fix(sync): Allow cloning of features
Removing the `id` from the feature when cloning makes it generate a new
one. Without this change, the cloned feature keep the already existing
`id`, and during sync, the original object is lost (replaced by the
clone).

Nobody wants to be replaced by a clone.
2024-06-07 16:32:15 +02:00
aa3fa5ce98
feat(sync): Sync only when the edition of a feature is over.
It's less spectacular than sending the position as it changes, but takes
less bandwidth and seems good enough.
2024-06-07 16:32:15 +02:00
8786d38897
fix(sync): Import the data when syncing GeoJSON objects.
Prior to these changes, the data wasn't transmitted over WebSocket, and
even if present it wasn't taken into account.
2024-06-07 16:32:15 +02:00
c2b157e304
fix(sync): Keep features IDs for Polygons and Lines
It wasn't passed previously, so objects where duplicated.
2024-06-07 16:32:15 +02:00
5f4ab670b3
feat(sync): Only sync when on edit mode
The is done to save server resources, for accessed maps which
aren't currently being edited.
2024-06-07 16:32:15 +02:00
9e41ad1d81
chore(sync): Move the sync flag in the options
The goal being for it to be hidden for now.

- Add a `is_owner` method on the map and use it in the view
- Remove duplicated line in `global.js`
- Rename `Datalayer` to `DataLayer` everywhere
- Move the sync flag in the map options (next to slideshow)
2024-06-07 16:32:14 +02:00
f10ebb24a2
feat(sync): Add WebSocket specific settings
`WEBSOCKET_ENABLED`, `WEBSOCKET_HOST`, `WEBSOCKET_PORT` and
`WEBSOCKET_URI` have been added.

They are being transmitted to the client via the `map.options`.
When `WEBSOCKET_ENABLED` is set to `False`, the client doesn't have
the ability to be synced.
2024-06-07 16:32:14 +02:00
04980c16d3
feat(sync): Add a enableSync option.
This changes how the syncEngine works. At the moment, it's always
instanciated, even if no syncing is configured. It just does nothing.

This is to avoid doing `if (engine) engine.update()` calls everywhere
we use it.

You now need to `start()` and `stop()` it.
2024-06-07 16:32:14 +02:00
6cc4c72fd5
feat(sync): initialize datalayers internal objects in the constructor.
Otherwise, an event can come from the websocket, trying to update an
`undefined` property.
2024-06-07 16:32:14 +02:00
ffe6954a2e
feat(sync): sync layer's properties.
This also changes the interface between the synced classes and the sync
engine.

The sync engines only requires two methods now:

- `getSyncMetadata()` which returns all the metadata needed, including
the `engine`.
- `render()` which renders the object, updating the needed parts.
2024-06-07 16:32:14 +02:00
a1c8654672
feat(sync): Sync features over websockets
Added a new `geometryToFeature` method in `umap.layer.js` which can
update a given geometry if needed.

A new `id` property can also be passed to the features on creation, to
make it possible to have the same features `id` on different peers.
2024-06-07 16:32:13 +02:00
f2266a7916
feat(sync): sync map properties over websocket
All keystrokes are currently sent, which is not ideal because it will
use a lot of bandwidth.
2024-06-07 16:32:13 +02:00
f35acbc863
feat(sync): sync features and map properties
Synced objects now expose different methods, such as:
- `getSyncEngine` which returns the location of the sync object.
- `getMetadata` which returns the associated metadata with the object.

Hooks have been added when features are created or changed, so the
changes can be synced with other peers.
2024-06-07 16:32:13 +02:00