Commit Graph

3459 Commits

Author SHA1 Message Date
Daniel Gasienica fb4445cbd6 Run background script after DOM is parsed
This allows us to leverage the existing loading screen for messaging without
having to explicitly wait for DOM load event.
2018-03-26 16:53:45 -04:00
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