Bruno Windels
3f840d9d33
simple unit test for hsApi
2020-04-22 20:47:31 +02:00
Bruno Windels
277c8af628
Headers is a DOM specific class, use Map instead in HomeServerApi
2020-04-22 20:46:47 +02:00
Bruno Windels
f4983b5ba6
port SessionPickerViewModel to SessionContainer
2020-04-20 22:49:14 +02:00
Bruno Windels
bb7fca0592
support deleting the session from the container
2020-04-20 22:29:25 +02:00
Bruno Windels
a097929dbd
rename lowercase filenames of classes to camelcase like class
2020-04-20 21:41:10 +02:00
Bruno Windels
31f3886eba
move EventEmitter to utils
2020-04-20 21:35:53 +02:00
Bruno Windels
c379caf4c0
remove obsolete ifdef comments
2020-04-20 21:31:27 +02:00
Bruno Windels
0f29fdb24e
some notes
2020-04-20 21:27:07 +02:00
Bruno Windels
001dbefbcf
stop using default exports
...
because it becomes hard to remember where you used them and where not
2020-04-20 21:26:39 +02:00
Bruno Windels
164d9d594f
finish implemenation of SessionContainer
2020-04-20 19:48:21 +02:00
Bruno Windels
87b23d062c
fix imports after reshuffleling
2020-04-20 19:47:45 +02:00
Bruno Windels
72b0eefccb
replace isSyncing and emit with an Observable SyncStatus
2020-04-19 19:52:26 +02:00
Bruno Windels
80f7caadbe
rename SessionsStore to SessionInfoStorage
2020-04-19 19:13:38 +02:00
Bruno Windels
8c56ac3e4f
rename NetworkError to ConnectionError
2020-04-19 19:05:12 +02:00
Bruno Windels
8c5411cb7d
moar WIP
2020-04-19 19:02:10 +02:00
Bruno Windels
1f15ca6498
more WIP
2020-04-18 19:16:16 +02:00
Bruno Windels
378b75c98a
more WIP and breakage
2020-04-09 23:19:49 +02:00
Bruno Windels
ef267ca331
WIP2
2020-04-05 15:11:15 +02:00
Bruno Windels
c980f682c6
create DOMClock, abstraction of clock functionalities for DOM
2020-04-04 17:34:46 +02:00
Bruno Windels
bc69e49cfb
WIP2
2020-03-31 10:13:25 +02:00
Bruno Windels
b6a5a02a33
WIP
2020-03-30 23:56:03 +02:00
Bruno Windels
e4563135bf
look at prev_content when handling member events
2020-03-30 21:59:44 +02:00
Bruno Windels
c830f50325
catch errors while persisting a new message
2020-03-30 21:33:04 +02:00
Bruno Windels
234c260339
dont modify fragments in comparer until txn succeeds
2020-03-30 20:46:52 +02:00
Bruno Windels
73ea09f668
Handle sync ordering vs back-fill ordering (see synapse #7164 ) resulting in dupe events
...
Also extra robustness while filling a gap
ignore duplicate events from synapse instead considering them an
overlapping event with the adjacent fragment
2020-03-30 20:37:36 +02:00
Bruno Windels
8354c58c07
also look for remote echos based on event_id
2020-03-23 23:00:33 +01:00
Bruno Windels
f02641c808
look for transaction_id in /messages response to delete pending events
2020-03-22 00:07:37 +01:00
Bruno Windels
6d68ec1bac
move fillGap to room
2020-03-21 23:40:40 +01:00
Bruno Windels
44760a9f82
Revert "add logging related to fragments"
...
This reverts commit 2f355cabef
.
2020-03-21 10:47:35 +01:00
Bruno Windels
c4a5de20c0
update previous fragment in comparer when appending a new line fragment
2020-03-21 10:45:09 +01:00
Bruno Windels
2f355cabef
add logging related to fragments
...
both when rebuilding and when sorting will be used
2020-03-20 20:23:07 +01:00
Bruno Windels
7e8cc7ae00
need to return the response here, not the request wrapper
...
we were reading back a remote id of undefined because of this,
so when for some reason we never receive the message down from sync,
the pending message keeps sending on every load. The server ignores
the send though, because the transaction id is already used, and it returns
the remote id of the event that was already sent the previous time, but
as we were not storing this remote id, we'd just try again and again.
not receiving it through sync could have happened when we were sending a bunch of events
and then receiving (this is how we encountered this bug, while trying to repro another) the
response, but not yet the sync for the message that got wedged. Then we typed stuff on another client
so we would get a limited response for that room, and boom, we would not get the remote echo of the
event that was already sent (but because of this bug we didn't store the remote id) but no echo received yet (when we remove the pending event),
so it gets wedged!
2020-03-17 00:11:50 +01:00
Bruno Windels
b69efc3425
fix errors when replaying
2020-03-17 00:07:54 +01:00
Bruno Windels
06e43d9ee3
fix all tests
2020-03-14 21:38:37 +01:00
Bruno Windels
56c87b3966
better naming
2020-03-14 20:49:15 +01:00
Bruno Windels
ac4a7f971b
only apply sync changes in room summary once txn is committed
...
- also remove m.room.aliases support as they were wrongly implemented
and now obsolete
- don't count invited and joined members according to m.room.member
events anymore as it was also wrongly implemented
(only when prev!==new membership, but on initial sync we only get
last member event, which might have been a nick change
2020-03-14 20:46:49 +01:00
Bruno Windels
fc741272ba
only apply sync changes in session once txn is committed
2020-03-14 20:45:36 +01:00
Bruno Windels
224d56698a
only set new live key when creating a fragment after the txn succeeds
...
when doing a limited sync, and a new fragment is created,
this._lastLiveKey is updated immediately. If the transaction
would then fail, the fragmentId in this._lastLiveKey was incremented
but the fragment wasn't written to the store, so if sync is resumed
and would subsequently succeed, fragmentIds would be assigned to events
that don't have a corresponding fragment in the timelineFragment store.
This would throw errors when trying to load the timeline,
breaking the whole app.
This changes SyncWriter to only update this._lastLiveKey in
the emit phase, when the transactions has been committed already.
2020-01-04 20:06:49 +01:00
Bruno Windels
bdc2c3d9ad
cleanup: storage is not used in SyncWriter
...
as the transaction is now always passed as an argument, it never
creates one on its own.
2020-01-04 20:04:57 +01:00
Bruno Windels
1d9a5c490a
add record/replay network layer
2019-12-23 14:28:42 +01:00
Bruno Windels
aa86748cdd
pull fetch code out of homeserverapi
2019-12-23 14:28:27 +01:00
Bruno Windels
35c090dcb4
add proper import/export functionality
2019-12-14 18:29:35 +01:00
Bruno Windels
8a55778c32
make sure aliases and heroes aren't empty when picking name
2019-11-22 09:29:18 +01:00
Bruno Windels
325077bcb0
try more domexception fixes
2019-11-21 18:28:18 +01:00
Bruno Windels
5ecf0a6717
fix error path on transaction abort error
2019-11-21 18:23:48 +01:00
Bruno Windels
ad7a150aaa
use aliases and heroes to fall back room name to
2019-10-13 07:48:33 +02:00
Bruno Windels
b16f21867c
preserve value for storage errors on add and put
2019-10-12 22:19:16 +02:00
Bruno Windels
201b70ee4f
fix failing to sync new rooms
2019-10-12 22:18:36 +02:00
Bruno Windels
ac53b9099b
only log error in sync loop
2019-10-12 22:18:19 +02:00
Bruno Windels
2fa5fa7890
add delete button in session picker
2019-10-12 21:16:48 +02:00
Bruno Windels
d367037332
very basic support for lazy loading
2019-10-12 20:24:09 +02:00
Bruno Windels
8616d79aad
make fetch errors more informative by including method and url
2019-09-15 14:31:50 +02:00
Bruno Windels
2b2b4232e9
moar send logging
2019-09-15 12:25:14 +02:00
Bruno Windels
6f527fd2e0
use openCursor where openKeyCursor is not supported
2019-09-15 12:24:46 +02:00
Bruno Windels
bbf6943455
use .get fallback where .getKey is not supported (Edge 15)
2019-09-15 12:24:27 +02:00
Bruno Windels
8e590fe53b
rename and use StorageError to deal with idb DOMerror
2019-09-15 12:23:54 +02:00
Bruno Windels
5a90b4673b
fix CORS requests failing
2019-09-15 12:23:08 +02:00
Bruno Windels
09b9eff7c1
fix remaining errors to make login work
2019-09-08 10:19:16 +02:00
Bruno Windels
49a577991b
login and session picker view models, sessions store
2019-07-31 00:06:53 +02:00
Bruno Windels
45cd85ead1
fixup: check for event entry with eventType, event isn't exposed anymore
2019-07-29 19:58:35 +02:00
Bruno Windels
8665bcb897
concat synced events in timeline with pending events for local echo
2019-07-29 19:53:58 +02:00
Bruno Windels
88a7d64091
fixup: delay not awaited, but not needed for now
2019-07-29 19:53:30 +02:00
Bruno Windels
9b94c4bb61
don't expose raw event object from entry, pending event doesn't have it
...
it only has content and *some* of the meta fields,
but we want to threat pendingevententry and evententry as one
and the same in the rest of the application, so don't give access
to entire event object.
2019-07-29 10:27:12 +02:00
Bruno Windels
56cee450d1
return syncing user id from PendingEventEntry.sender
...
add User class where we later can track display name, avatar, ...
2019-07-29 10:24:34 +02:00
Bruno Windels
b26f7df689
pending events are not certain to be sorted here
2019-07-29 09:54:34 +02:00
Bruno Windels
3ed72df620
put everything together to make it roughly work
...
no local echo yet, and send errors are being swallowed
2019-07-27 10:51:51 +02:00
Bruno Windels
851100b88a
send unsent messages after first sync
2019-07-26 22:40:39 +02:00
Bruno Windels
707988f806
better handle remote echos and hookup in session and room
2019-07-26 22:33:33 +02:00
Bruno Windels
ccb722d766
more WIP
2019-07-26 22:03:57 +02:00
Bruno Windels
f3d1128f28
WIP
2019-07-01 10:00:29 +02:00
Bruno Windels
c5b2d0c8b2
WIP
2019-06-28 00:52:54 +02:00
Bruno Windels
cd9f25ea80
convert tabs to spaces where needed
2019-06-26 22:31:36 +02:00
Bruno Windels
90a38078e0
unused import
2019-06-26 22:19:40 +02:00
Bruno Windels
b882e0ef8a
respect argument count of idb calls
...
lumia doesn't like undefined arguments if they
are being left out, so call the idb calls with
the exact amount of arguments
2019-06-26 22:02:00 +02:00
Bruno Windels
bbb5e35bcb
wrap everything that can throw a idb DOMException in StorageError
...
as lumia gives very cryptic errors without a stacktrace.
2019-06-26 22:00:50 +02:00
Bruno Windels
0fd52be710
encode idb array keys as sortable strings
...
that's why numeric parts of the keys have to be encoded
as a fixed length, "big-endian" ordered strings, so
string sorting will also sort the numeric keys correctly.
this also assumes room ids don't contain the "|" character,
we should probably escape the separator at some point.
2019-06-26 21:55:33 +02:00
Bruno Windels
106146660c
define storage keys to be 32bit for idb / web platform
...
as a preparation to serialize the eventIndex and fragmentId
as a 8 character string, part of a concatenated string PK,
as lumia doesn't support array keys.
2019-06-26 21:52:41 +02:00
Bruno Windels
ca4361248f
fallback for platforms missing AbortController
2019-06-26 19:49:49 +02:00
Bruno Windels
9cd5257959
load more events when scrolled to top
2019-06-16 17:29:33 +02:00
Bruno Windels
b47898e025
show full stack on sync error
2019-06-16 15:49:00 +02:00
Bruno Windels
1917a528c7
replace ad hoc buttons and label with SyncStatusBar
2019-06-16 10:54:16 +02:00
Bruno Windels
a4bc2dd2b0
support isOwn on messages
2019-06-16 10:53:23 +02:00
Bruno Windels
0524f06722
remove logging
2019-06-03 00:31:21 +02:00
Bruno Windels
6bdf44d114
adjust comment
2019-06-03 00:30:37 +02:00
Bruno Windels
45528580ed
fix comparator/comparer mismatch
2019-06-03 00:30:16 +02:00
Bruno Windels
3dbf5e727d
process in incoming order (reverse-chronological order if backward)
...
makes code simpler, don't need fix to undo reverse ordering of
nonOverlappingEvents. reverse looking is very likely premature
optimization as well.
2019-06-03 00:18:52 +02:00
Bruno Windels
0407829b26
fix filling gaps with overlapping events
...
although event order remains wrong, as events are reversed.
step before removing premature optimization, so it's in the git
commit log
2019-06-03 00:11:29 +02:00
Bruno Windels
c9aaa18151
return only eventId from findFirstOrLastOccurringEventId
2019-06-03 00:11:12 +02:00
Bruno Windels
7852f31f7e
clear token on pagination when events start overlapping
2019-06-02 19:28:24 +02:00
Bruno Windels
0b637f656a
timeline store requests should always be scoped to 1 fragmentId
...
as fragmentIds should not be sorted, they are a linked list
and that is what determines their order.
2019-06-02 19:27:40 +02:00
Bruno Windels
bb5f139355
fix fragmentId:0 being evaluated as falsy
2019-06-02 19:27:23 +02:00
Bruno Windels
4b5b90e199
fix another direction mismatch
2019-06-02 19:26:45 +02:00
Bruno Windels
c63d94947f
fix persisting a gappy sync
2019-06-02 18:28:38 +02:00
Bruno Windels
ef5d2cfa08
chunk is in reverse-chronological order for backward pagination
2019-06-02 18:15:40 +02:00
Bruno Windels
a59014475b
also swap logic of setter
2019-06-02 18:15:08 +02:00
Bruno Windels
bdad0ad86b
fix some gap fill errors
2019-06-02 15:46:24 +02:00
Bruno Windels
d022608a1a
it's entry.entryIndex, not eventIndex, but use helper method instead.
2019-06-02 15:24:27 +02:00
Bruno Windels
1ed3babfec
fragment boundary is a gap if backwards(started) & previousToken
2019-06-02 15:01:14 +02:00
Bruno Windels
e339cb7321
more fixes, timeline is showing again
2019-06-02 14:59:30 +02:00
Bruno Windels
a1e527ccbc
first round of fixes after running the app again in the browser!
2019-06-02 00:49:47 +02:00
Bruno Windels
3de86cdf33
obsolete comment
2019-06-01 18:32:32 +02:00
Bruno Windels
039bbe038c
adjust tiles(collection) to entry changes
2019-06-01 18:29:02 +02:00
Bruno Windels
35d90a8535
ctor takes a bool, not Direction. But use helper fn instead.
2019-06-01 18:20:29 +02:00
Bruno Windels
2a128ed32c
use SortedArray in Timeline, adjust loadAtTop to use TimelineReader
2019-06-01 17:39:23 +02:00
Bruno Windels
f8fbfbff9a
implement reading n events from end of live fragment
2019-06-01 17:04:05 +02:00
Bruno Windels
3137f025c7
remove draft commented code
2019-06-01 16:44:58 +02:00
Bruno Windels
447b0aa03c
allow adding fragments to comparer, instead of reloading from db.
...
This is a suboptimal implementation now,
but is the API we want to end up with. Readers and Writers
in persistence add fragments to the comparer when they become
aware of, create, or link up fragments.
2019-06-01 16:42:57 +02:00
Bruno Windels
fa4efe0132
rename Gap/SyncPersistence to Writer, in line with TimelineReader
2019-06-01 15:40:21 +02:00
Bruno Windels
784588440c
WIP for fragment support
2019-05-19 20:49:46 +02:00
Bruno Windels
3324fd3afd
split up persistFragmentFill method into smaller ones
2019-05-12 20:44:20 +02:00
Bruno Windels
10457611f9
whitespace
2019-05-12 20:26:46 +02:00
Bruno Windels
e3328f0fef
add fragments store name
2019-05-12 20:26:32 +02:00
Bruno Windels
da5e8794ab
lint
2019-05-12 20:26:20 +02:00
Bruno Windels
75100c1c60
adjust Timeline to changes, gap persister
2019-05-12 20:26:03 +02:00
Bruno Windels
a6b17cf25a
first draft of persistFragmentFill
2019-05-12 20:25:41 +02:00
Bruno Windels
89bc0e1696
split up RoomPersister to SyncPersister
...
also rename stores to timelineEvents and timelineFragments
2019-05-12 20:24:06 +02:00
Bruno Windels
bf835ac01d
create Entry classes and return fragment boundaries as entries as well
...
they can then be used for gap tiles.
2019-05-11 18:19:53 +02:00
Bruno Windels
2b510b24d9
adjust persister to fragments (untested)
2019-05-11 15:41:46 +02:00
Bruno Windels
152397a292
first impl of idb fragment store
2019-05-11 15:41:09 +02:00
Bruno Windels
41f2224454
get live fragment in persister
2019-05-11 13:21:58 +02:00
Bruno Windels
783f39c378
add fragmentId to methods that need it in timeline store
2019-05-11 13:21:21 +02:00
Bruno Windels
53cdabb459
store method to find events to connect with when filling gaps
...
as fragments can be unaware of their chronological relationship,
we need to check whether the events received from /messages or /context
already exists, so we can later hook up the fragments.
2019-05-11 13:10:31 +02:00
Bruno Windels
d6ae313bbd
make compare rely less on fragment index
...
also indenting
2019-05-11 09:51:27 +02:00
Bruno Windels
99c8816bf9
better naming
...
FragmentIndex -> FragmentIdIndex (index of fragment ids,
not an index number in a fragment collection)
EventKey -> EventIndex (implies being ordered)
FragmentKey -> FragmentId
(implies not being ordered, hence FragmentIdIndex)
2019-05-01 15:36:32 +02:00
Bruno Windels
d90411a6dd
adjust SortKey to have fragmentKey instead of gapKey
...
with FragmentIndex to compare fragment keys
2019-05-01 14:47:39 +02:00
Bruno Windels
06d2d2e198
draft of idb store for fragments
2019-04-18 20:19:43 +02:00
Bruno Windels
749bdadf74
disable failing tests for now and include fragment index so it's tests are found
2019-04-18 20:19:09 +02:00
Bruno Windels
6ba37e90a3
work on memory store
2019-04-04 09:27:31 +02:00
Bruno Windels
3f2f656db7
work on gap filling + tests (doesn't work yet)
2019-03-29 23:01:27 +01:00
Bruno Windels
aaff9eea6c
update store api with requirements for gap filling
2019-03-29 23:01:22 +01:00
Bruno Windels
7d91b2dde3
first go at a timeline memory store
...
first to use in unit tests for persister
later also to use in production when idb is not available
2019-03-29 23:00:22 +01:00
Bruno Windels
b1e382d7c9
thinko with direction
2019-03-21 21:36:02 +01:00
Bruno Windels
8f7e5a799c
work on filling gaps + test (draft only)
2019-03-21 21:35:33 +01:00
Bruno Windels
8e8e22fe16
work on filling gaps
2019-03-09 00:41:06 +01:00
Bruno Windels
95bef00054
some comments
2019-03-08 20:03:47 +01:00
Bruno Windels
ec925d7c49
draft of how to implement filling a timeline gap
2019-03-08 20:03:18 +01:00
Bruno Windels
1757a27475
consistent naming
2019-03-08 20:01:28 +01:00
Bruno Windels
994f1c57d3
store all logout data outside of the session storage
...
so we could store it in gnome keyring, macOs keychain, ... on non-webclients,
also better separation
2019-03-08 20:00:37 +01:00
Bruno Windels
049e70e312
throw NetworkError from HomeServerApi
2019-03-08 12:26:59 +01:00
Bruno Windels
f8bd11f07b
doesn't need to be async for now
2019-02-27 23:23:09 +01:00
Bruno Windels
8462a0ac6b
this behaves weird? need to figure out later
2019-02-27 23:22:47 +01:00
Bruno Windels
6b4ed65a57
show timeline when clicking room in roomlist
2019-02-27 22:50:08 +01:00
Bruno Windels
5cafb92fee
emit after txn has been committed
...
to keep txn open for as short as possible,
and avoid any errors caused as part of emit aborting txn
2019-02-27 22:49:52 +01:00
Bruno Windels
c8d5b4483a
public room.id property, needed for session.rooms updater
2019-02-26 23:27:06 +01:00
Bruno Windels
841f280d3c
rooms on the screen!!
2019-02-26 22:45:58 +01:00
Bruno Windels
90a7989eda
rooms is a proper collection now, so no need for getter on session
2019-02-26 22:09:48 +01:00
Bruno Windels
853316933c
adjust import path
2019-02-26 20:49:45 +01:00
Bruno Windels
db53db7007
adjust to new ObservableMap api
2019-02-24 19:25:06 +01:00
Bruno Windels
4d28448920
add compare method to SortKey and add tests
2019-02-24 19:24:43 +01:00
Bruno Windels
5bff41c1ee
wip on collections and listview
2019-02-20 23:48:16 +01:00
Bruno Windels
952f1abddf
wip
2019-02-17 23:58:01 +01:00
Bruno Windels
d87444824d
only store sync token when it changes
2019-02-16 02:59:10 +01:00
Bruno Windels
07fed669f6
debug room lastsortkey not loading in chrome (but does in FF!)
2019-02-16 02:57:19 +01:00
Bruno Windels
be8544aa48
also persist state events in timeline
2019-02-16 02:57:19 +01:00
Bruno Windels
f7789d343a
more fields for summary
2019-02-16 02:57:19 +01:00
Bruno Windels
ad9999fd50
idb compares binary keys per byte, so make SortKey big endian
2019-02-16 02:57:19 +01:00
Bruno Windels
03ef98e668
make sure queries don't run into other rooms
2019-02-16 02:57:19 +01:00
Bruno Windels
c60840bae9
fix selectAll
2019-02-16 02:57:19 +01:00
Bruno Windels
ffd3d740c5
state events are under state key
2019-02-16 02:57:19 +01:00
Bruno Windels
c70376e82d
make starting a transaction async so we can do more synchronization later on
2019-02-16 02:57:19 +01:00
Bruno Windels
48a47cb639
expose native error for now
...
as server not reachable seems to be reported as a TypeError
with message "fetch failed" or something in chrome,
let's see if we can find something in common between browsers
to wrap it into something more sensible
2019-02-16 02:57:19 +01:00
Bruno Windels
a544c25d58
more
2019-02-10 22:02:42 +01:00
Bruno Windels
35648d31b9
dont emit error when aborting request when stopping sync
2019-02-10 21:40:11 +01:00
Bruno Windels
bff0161a05
move sync & persistence engine over to own matrix folder
2019-02-10 21:33:18 +01:00