Commit graph

4158 commits

Author SHA1 Message Date
Daniel Gasienica
d35e365507
Upgrade Message Schema (Data) in Background (#2162)
In order to avoid incurring long startup times, we migrate message schema (data) in the background using `window.requestIdleCallback` API. The migration moves attachment data from IndexedDB to disk and reduces load on our database which may cause data loss (#1589).

On my development profile, this migration reduced the IndexedDB directory from 33.4MB to 4.7MB.
2018-03-26 16:53:01 -04:00
Daniel Gasienica
f253fef5c6 Explicitly make onDestroy have void return type 2018-03-26 16:49:21 -04:00
Daniel Gasienica
9b112489cd Upgrade 2 messages every 30 seconds
This results in 4 messages per minute or 240 messages per hour.
2018-03-26 16:49:21 -04:00
Daniel Gasienica
7c2fde4433 Add Signal.Workflow namespace 2018-03-26 16:49:21 -04:00
Daniel Gasienica
4a7cc22de3 🎨 Use window.requestIdleCallback 2018-03-26 16:49:21 -04:00
Daniel Gasienica
5c9f18e1ae Wire up background message migration 2018-03-26 16:49:21 -04:00
Daniel Gasienica
4651cbc2eb Improve `Message.upgradeSchema preconditions 2018-03-26 16:49:21 -04:00
Daniel Gasienica
ca28f3030b Add MessageMigration module 2018-03-26 16:49:21 -04:00
Daniel Gasienica
8e762797c0 Remove attachment validation
Turns out `fileName` is optional and maybe even `contentType`. We should revisit
this at a later point in time.
2018-03-26 16:49:21 -04:00
Daniel Gasienica
0b7ce39ff7 Remove desktop-idle dependency
We’d rather not rely on a native dependency for this functionality.
2018-03-26 16:49:21 -04:00
Daniel Gasienica
09ee2d4ea2 Switch to using requestIdleCallback
Example:
https://developer.mozilla.org/en-US/docs/Web/API/Background_Tasks_API#Example
2018-03-26 16:49:21 -04:00
Daniel Gasienica
d13668544d Rename IdleListener to IdleDetector 2018-03-26 16:49:21 -04:00
Daniel Gasienica
92ace67846 Start idle listener on startup 2018-03-26 16:49:21 -04:00
Daniel Gasienica
3140e4d66d Implement basic IdleListener 2018-03-26 16:49:21 -04:00
Daniel Gasienica
ca2afdc202 Add desktop-idle dependency 2018-03-26 16:49:21 -04:00
Daniel Gasienica
2e9f3bcf8d Migrate attachments from IndexedDB to file system (#2129)
- [x] Generate random file names.
- [x] Generate random file paths that prevent too many files per folder using
      fan-out.
- [x] Create attachment directory in user data folder.
- [x] Investigate operating system file indexing on:
  - [x] Windows: Confirmed that `AppData` is not indexed by default.
  - [x] macOS: Confirmed that `~/Library` files are not indexed by default.
        Searching system files using Spotlight requires multi-step opt-in:
        https://lifehacker.com/5711409/how-to-search-for-hidden-packaged-and-system-files-in-os-x.
        More info https://apple.stackexchange.com/a/92785.
        Added `.noindex` suffix to `attachments` folder.
  - [x] Linux: n/a
- [x] Save incoming attachment files to disk
  - [x] On received
  - [x] On sync
- [x] Save outgoing attachments files to disk before sending
- [x] Display attachments either from disk or memory in attachment view.
      Be robust to multiple render passes.
  - [x] Test that missing attachment on disk doesn’t break app.
        Behavior: Message is displayed without attachment.
- [x] Delete attachment files when message is deleted.

Relates to #1589.
2018-03-26 16:43:47 -04:00
Daniel Gasienica
7eaa6ef2f7 Remove string-to-arraybuffer dependency
The function is simple enough to inline and this allows us to reduce our
dependencies surface area.
2018-03-26 16:38:34 -04:00
Daniel Gasienica
0c06fff47b Wire up Message / Attachment migration functions on startup
Makes `migrationContext` obsolete.
2018-03-26 16:38:34 -04:00
Daniel Gasienica
867f73b80a Use double quotes for identifiers in error messages 2018-03-26 16:38:34 -04:00
Daniel Gasienica
06e7bca276 Use new stringToArrayBuffer function 2018-03-26 16:38:34 -04:00
Daniel Gasienica
70cdd2b350 Add stringToArrayBuffer utility
This way we can avoid an extra dependency.
2018-03-26 16:38:34 -04:00
Daniel Gasienica
232e906650 Remove tmp as dev dependency 2018-03-26 16:38:34 -04:00
Daniel Gasienica
2ad0fd7db6 Use Lodash omit instead of delete 2018-03-26 16:38:34 -04:00
Daniel Gasienica
ef2be2cf5f Make MessageView::onUnload synchronous
Our tests rely on that.
2018-03-26 16:38:34 -04:00
Daniel Gasienica
add5d4ab0b Prevent macOS Spotlight indexing of attachments folder
See: https://apple.stackexchange.com/a/92785
2018-03-26 16:38:34 -04:00
Daniel Gasienica
b3251a8de2 Prevent potential NPE 2018-03-26 16:38:34 -04:00
Daniel Gasienica
9d25aa4e43 Delete attachment files on disk upon message delete 2018-03-26 16:38:34 -04:00
Daniel Gasienica
279b3f81c7 Add Attachment.deleteData 2018-03-26 16:38:34 -04:00
Daniel Gasienica
10afcf1bb0 Add Attachments.deleteData 2018-03-26 16:38:34 -04:00
Daniel Gasienica
9b636a1885 Add test for Attachments.readData 2018-03-26 16:38:34 -04:00
Daniel Gasienica
f6f0359a61 Use assert.deepEqual instead of Lodash isEqual 2018-03-26 16:38:34 -04:00
Daniel Gasienica
833a203559 Remove Vim modeline 2018-03-26 16:38:34 -04:00
Daniel Gasienica
aba261122f 🎨 Use camelCase for mutable variable 2018-03-26 16:38:34 -04:00
Daniel Gasienica
e1c1b1aa72 Load attachment data before rendering
Prevent double rendering of attachments by multiple entries into
`MessageView::render` using promises.
2018-03-26 16:38:34 -04:00
Daniel Gasienica
97e3b49a36 Whitelist js/views/message_view.js for ESLint 2018-03-26 16:38:34 -04:00
Daniel Gasienica
b5721c2594 Remove Vim modeline 2018-03-26 16:38:34 -04:00
Daniel Gasienica
f031ac3126 Remove duplicate ESLint ignore entry 2018-03-26 16:38:34 -04:00
Daniel Gasienica
38e2468b2e Set schemaVersion in handleMessage 2018-03-26 16:38:34 -04:00
Daniel Gasienica
e3dbeba963 Initialize schema version during Message construction 2018-03-26 16:38:34 -04:00
Daniel Gasienica
9a540d6d18 Load attachment data before sending message 2018-03-26 16:38:34 -04:00
Daniel Gasienica
1c8123ff1a Move writeAttachmentData into Attachments
Encapsulates all attachment operations that require Node.js / Electron APIs,
e.g. file system access.
2018-03-26 16:38:34 -04:00
Daniel Gasienica
19a70ad8b8 Add to-arraybuffer dependency
Used for converting Node.js buffers to `ArrayBuffer`.
2018-03-26 16:38:34 -04:00
Daniel Gasienica
32911002d4 Verify makeAttachmentPointer and encryptAttachment arguments
The underlying `crypto.subtle.encrypt` API requires it.
2018-03-26 16:38:34 -04:00
Daniel Gasienica
8218e308cd Improve identifier names 2018-03-26 16:38:34 -04:00
Daniel Gasienica
6355c54114 Return relative path from writeAttachmentData
This will make our app more robust to changes in location on the file system.
2018-03-26 16:38:34 -04:00
Daniel Gasienica
1262d1d696 Shorten prefix to 2 characters
Using 2 hex characters [0-9a-f] will give us 16 * 16 = 256 root folders which
seems more manageable than 4096 (16^3). Assuming a user has 10,000 attachments,
they should roughly distribute at ~40 per folder with prefix length 2 rather
than ~2.5 per folder with a prefix of 3.
2018-03-26 16:38:34 -04:00
Daniel Gasienica
2cd3d5ac16 Add Message schema version 3 2018-03-26 16:38:34 -04:00
Daniel Gasienica
e0428355be Wire up writeAttachment 2018-03-26 16:38:34 -04:00
Daniel Gasienica
aa82a2a5fb Add context to Message.upgradeSchema
Allows us to pass in Electron/Node.js specific functions. This allows better
unit testing in Mocha where we don’t have access to Electron APIs.
2018-03-26 16:38:34 -04:00
Daniel Gasienica
ebe2a769c9 Add Attachment.migrateDataToFileSystem 2018-03-26 16:38:34 -04:00