Commit Graph

305 Commits (449f44cc5a00c84fef2f2917a9cdcfad161b8631)

Author SHA1 Message Date
Scott Nonnenberg 5933a34a18 Use window.log in browser context, turn on console eslint rule 7 years ago
Scott Nonnenberg cea38b7bc4 Log clear error if we fail to retrieve debug log upload key 7 years ago
Scott Nonnenberg 2ef2235317 Show error if debug log upload fails 7 years ago
Scott Nonnenberg 4ca674edb2 Remove User-Agent from form to upload debug log 7 years ago
Scott Nonnenberg b159a8d7c7 Update the user agent for debug log requests 7 years ago
Scott Nonnenberg 675e34fc8d New React component: ConversationListItem, installed in left pane
When collecting a conversation's last message, we grab that message's
status as well (if outgoing) and show it.
7 years ago
Scott Nonnenberg 3c69886320 Finish new Message component, integrate into application
Also:
- New schema version 8 with video/image thumbnails, screenshots, sizes
- Upgrade messages not at current schema version when loading messages
  to show in conversation
- New MessageDetail react component
- New ConversationHeader react component
7 years ago
Scott Nonnenberg dc11db92f9 New React component: Message
Also: Use react to render contects on the 'show group members' screen
7 years ago
Scott Nonnenberg ad4387803b New media permission, show dialog when not enabled for voice msg
UI now in separate renderer:
  - the permissions popup
  - settings dialog
  - debug log dialog
  - about window

Couple bug fixes:
  - About Window: Fix 'escape' to close window
  - Remove outdated dist/copy tasks from Gruntfile

Eslintified settings_view.js
7 years ago
Scott Nonnenberg 125c3fafa8
Idle detector: Fix bug preventing it from ever turning off (#2487) 7 years ago
Scott Nonnenberg 8eeaad8e18 Remove unused export/import functionality 7 years ago
Scott Nonnenberg f3bd0cf903 Refactor api.js into web_api, which encapsulates all web access 7 years ago
Scott Nonnenberg 34f423b52c Remove unused code; move signal.js to js/modules for eslint
(noticed as I was doing this that signal.js doesn't get eslint coverage)
7 years ago
Scott Nonnenberg e2d044e02b Filter file scheme; disable http, https and ftp entirely 7 years ago
Scott Nonnenberg 80b069e9b6 Move phone number format/parse into ts/types/PhoneNumber 7 years ago
Scott Nonnenberg aa13a2c6f7 Parse phone numbers into e164 as part of schema upgrade 7 years ago
Scott Nonnenberg d2293d9592 parseAndWriteAvatar: Do shallow copy before omit() call
Otherwise, we get all prototype props/functions, which we can't save in IndexedDB
7 years ago
Daniel Gasienica 3bf8a8966a Notification improvements
- Remove on read, on focus, and on exit.
- Show multi-message notifications like '5 new messages'.
7 years ago
Daniel Gasienica 16bc1d34c6 Message schema 6: Change classification of media and documents
For an easier implementation, we change our original definition of
`initializeAttachmentMetadata`. This means we have to re-run it marked as
version 6 and mark schema version 5 as deprecated as its definition has changed.
7 years ago
Daniel Gasienica 101041f106 Derive `Message.CURRENT_SCHEMA_VERSION` 7 years ago
Scott Nonnenberg 26be658892 Remove 'Contact' from 'Contact.*' properties, clean->parse 7 years ago
Scott Nonnenberg cda326ca45 Use protobuf enum values to eliminate magic numbers 7 years ago
Scott Nonnenberg adbe989949 validateContact: Return error instead of logging 7 years ago
Scott Nonnenberg d0efccd121 A couple renames in contact.js 7 years ago
Scott Nonnenberg 420f81ebcd Move contact migrate code from message.js to contact.js 7 years ago
Scott Nonnenberg 37821e5a1b Wire up all contact behaviors, refactor Contact type/selector 7 years ago
Scott Nonnenberg 3ea3e4e256 Contact sharing: protos and data pipeline
As of this commit: 82b76ccf37
7 years ago
Daniel Gasienica a86056630f Use `Attachment.isVoiceMessage` 7 years ago
Daniel Gasienica 5c8f734e67 Remove newlines from group IDs 7 years ago
Daniel Gasienica a102016ed8 Port `Settings` and `OS` to TypeScript 7 years ago
Scott Nonnenberg 754d65ae2e Let's make it all pretty, shall we?
We missed a couple directories with previous attempts to turn this on
globally: app/ and libtextsecure/

Not to mention files in places we didn't expect: ts files that weren't
in the ts directory!

This turns prettier on for every file we care about (js, ts, tsx, md)
everywhere in the project but for a few key parts.
7 years ago
Daniel Gasienica 6eca5ee940 Document that JPEG auto-orient strips EXIF metadata 7 years ago
Daniel Gasienica 1dd87ad197 Format all source code using Prettier 7 years ago
Daniel Gasienica e4baf27fa7 Increase migration conversion speed by a factor of 3x 7 years ago
Daniel Gasienica d00fb560b0 Avoid exposing `AttachmentTS` 7 years ago
Daniel Gasienica f36f206a01 Use `IndexablePresence` for `hasFileAttachments` and `hasVisualMediaAttachments`
Reduces index size, makes it easier to debug using IndexedDB inspector, and
hopefully improves lookup performance.
7 years ago
Daniel Gasienica 8e3c38d5fe Fix formatting 7 years ago
Daniel Gasienica 146178f977 Update schema documentation 7 years ago
Daniel Gasienica 082ef98a56 Add type definition for `deferredToPromise` 7 years ago
Daniel Gasienica 9d84b2f420 Index messages with attachments using a boolean
When indexing message attachment metadata using numeric indexes such as:

```javascript
{
  conversationId: '+12223334455',
  received_at: 123,
  attachments: […],
  numAttachments: 2,
},
{
  conversationId: '+12223334455',
  received_at: 456,
  attachments: [],
  numAttachments: 0,
}
{
  conversationId: '+12223334455',
  received_at: 789,
  attachments: [],
  numAttachments: 1,
}
```

It creates an index as follows:

```
[conversationId, received_at, numAttachments]
['+12223334455', 123, 2]
['+12223334455', 456, 0]
['+12223334455', 789, 1]
```

This means a query such as…

```
lowerBound: ['+12223334455', 0,                1               ]
upperBound: ['+12223334455', Number.MAX_VALUE, Number.MAX_VALUE]
```

…will return all three original entries because they span the `received_at`
from `0` through `Number.MAX_VALUE`. One workaround is to index booleans using
`1 | undefined` where `1` is included in the index and `undefined` is not, but
that way we lose the ability to query for the `false` value. Instead, we flip
adjust the index to `[conversationId, hasAttachments, received_at]` and can
then query messages with attachments using

```
[conversationId, 1 /* hasAttachments */, 0                /* received_at */]
[conversationId, 1 /* hasAttachments */, Number.MAX_VALUE /* received_at */]
```
7 years ago
Daniel Gasienica 5f220a7b2c Add migration for media gallery indices 7 years ago
Daniel Gasienica d14761087a Add schema version 4: Attachment metadata 7 years ago
Daniel Gasienica df2e6e7864 Port `MIME` module to TypeScript 7 years ago
Daniel Gasienica 6a63e427c8 Use `is` instead of Lodash `is*` 7 years ago
Scott Nonnenberg bf81c3db63
Document Message v4, remove data-free thumbnails 7 years ago
Scott Nonnenberg c02860af5c
Responding to pull request review feedback
- messages.getQuoteObjectUrl: early return
- backup.js: explaining variables for long if statement
- types/messages.js: Log if thumbnail has neither data nor path
- sendmessage.js:
  - remove extraneous logging
  - fix indentation
  - upload attachments and thumbnails in parallel
- preload: don't load fs for tests, just fse
- _conversation.scss: split two selectors into two lines, 0px -> 0
- backup_test.js: use fse.existsSync and comment twoSlashes regex
- network_tests_view_test.js: Comment duplicate assignment to window.getSocketStatus
7 years ago
Scott Nonnenberg a7d44d3344
Backup and end-to-end test! 7 years ago
Scott Nonnenberg 978ff0e2bb
Refactor: Use correct name for sanitized filename in backup.js 7 years ago
Scott Nonnenberg f1ff040842
Finish type definition for _mapQuotedAttachments 7 years ago
Scott Nonnenberg 9ad55c803f
Fix handling attachment thumbnails using thumbnail key 7 years ago
Scott Nonnenberg 054d3887a1
Quotes: The full pipeline into the database
1. MessageReceiver always pulls down thumbnails included in quotes
2. Message.upgradeSchema has a new schema that puts all thumbnails on
   disk just like happens with full attachments.
3. handleDataMessage pipes quote from dataMessage into the final message
   destined for the database
7 years ago
Scott Nonnenberg 21bf02c94d
Fixed examples in Quote.md, rough Android visuals 7 years ago
Daniel Gasienica d7b845326d ESLint auto-fix `link_text` 7 years ago
Daniel Gasienica 9d41b86162 Remove escaping from `linkText`
We leverage jQuery’s HTML escaping in `$.html(…)`.
7 years ago
Daniel Gasienica f04c65088b Fork `link-text` module 7 years ago
Daniel Gasienica 24f4ad53bc Use single quotes for identifiers 7 years ago
Daniel Gasienica 432a6ebd7f Redact file paths with escaped slashes 7 years ago
Daniel Gasienica a8a7525609 Redact stack traces with forward and backslashes 7 years ago
Daniel Gasienica b0da7d965e Redact URL encoded file paths in stack traces 7 years ago
Daniel Gasienica f2c9ccae90 Prefer `is.*` over Lodash `is*` functions 7 years ago
Daniel Gasienica 2ee78ec556 Prefer `path` over `Path` 7 years ago
Scott Nonnenberg c6c3b65bbc
Introduce React, TypeScript, TSLint and React-StyleGuidist (#2219)
Quite a bit of change here.

First, the basics:

- New dependencies were added: react, typescript, tslint, and react-styleguidist
- A new npm script: transpile. It uses typescript to process .tsx files in js/react, putting .js files next to the original file. It's part of the watch functionality of grunt dev as well as the default task run with just grunt (used to build the app prior to release). A lighter-weight to get watch behavior when just working on React components is to run yarn transpile --watch.
- yarn run clean-transpile will remove generated .js files


Style guide via react-styleguidist. Example site: https://react-styleguidist.js.org/examples/basic/

- Start with yarn styleguide
- Component.md files right next to the .tsx file
- jsdoc-style comments are picked up and added to the generated part of the styleguide - the overall summary and a table listing methods and properties of the component
- It has hot-reloading!
- It uses webpack, which means that our app now pulls in webpack though we don't use it to generate anything for the production app.
- I did a bunch of work to enable the use of Backbone views in this context, which will allow us to move smoothly from the old world to the new. First, add all the permutations in the old way, and then slowly start to re-render those same views with React.

A bit of dependency cleanup to enable use in React components:

- moment was moved from our Bower dependencies to our npm dependencies, so it can be used in React components not running in a browser window.
- i18n was moved into the new commonjs format, so it can be used in React components even if window is not available.

Lastly, a bit of Gruntfile cleanup:

- Removal of Chrome App-era modifications of background.js
- Make jshint/jscs watch more targeted, since more and more we'll be using other tools
7 years ago
Scott Nonnenberg 50d4dbaae7
Remove 'use strict' from i18n.js 7 years ago
Scott Nonnenberg 76be13552f
js/i18n.js -> js/modules/i18n.js 7 years ago
Daniel Gasienica 195e9b777c Rename `willHaveAttachmentsSavedOnFileSystemDuringUpgrade`
New name: `willAttachmentsGoToFileSystemOnUpgrade`
7 years ago
Daniel Gasienica 4c4443390a Rename `createImporter` to `createAttachmentDataWriter` 7 years ago
Daniel Gasienica 5ea1a305a6 Clarify error origin 7 years ago
Daniel Gasienica 9dcb64b53c Initialize schema version upon import 7 years ago
Daniel Gasienica cfad983d08 Consistently use `ciphertext` instead of `encrypted` 7 years ago
Daniel Gasienica a61c905146 Impliclity decrypt data if `key` is present 7 years ago
Daniel Gasienica 94c75762b5 Add `Message.createAttachmentLoader` 7 years ago
Daniel Gasienica 43ab320d31 Load attachments before writing them upon export 7 years ago
Daniel Gasienica 7eeabb5b1a Add precondition for `writeAttachment` 7 years ago
Daniel Gasienica 0faaf52b71 Import and upgrade messages upon save 7 years ago
Daniel Gasienica cf7355bd2f Rename `backupToDirectory` to `exportToDirectory`
For symmetry reasons.
7 years ago
Daniel Gasienica bf67254cc5 Add `Message.createImporter` 7 years ago
Daniel Gasienica efd673083d Rename `writeAttachmentData` to `writeNewAttachmentData` 7 years ago
Daniel Gasienica ce8fe0d345 Add `Signal.Startup` module 7 years ago
Daniel Gasienica 8474f3cf7f Use `create*` prefix to clarify curried functions 7 years ago
Daniel Gasienica 12cdeee7ec Rename `count` to `numMessagesPerBatch` 7 years ago
Daniel Gasienica 38ac9972e8 Improve termination condition 7 years ago
Daniel Gasienica 5b1a0c45df Replace `getAll` with cursor
This reduces the likelihood of IPC message size error.
7 years ago
Daniel Gasienica ed77378293 Fix bug in termination condition 7 years ago
Daniel Gasienica 052fb841f6 Allow database name override in migrations 7 years ago
Daniel Gasienica 1e04083813 Support database upgrades in `Database.open` 7 years ago
Daniel Gasienica f50ac1c99e Reduce excessive logging about database status 7 years ago
Daniel Gasienica 77b1f3c505 Replace startup with attachment background migration
Iterates through `Message::id` index.
7 years ago
Daniel Gasienica 057762806e Add support for attachment background migration without index 7 years ago
Daniel Gasienica 2e4893f4c1 Clarify implications of introducing new migrations 7 years ago
Daniel Gasienica 7413b787b6 Make `migrations` private 7 years ago
Daniel Gasienica b07c66eaa7 Generate attachments from local files
This ensures our benchmarking is closer to real-world usage, e.g. images, video,
etc. that are not compressible.
7 years ago
Daniel Gasienica 064a40544c Fix error message formatting 7 years ago
Daniel Gasienica 442f5d7295 Use `done` to match JavaScript iterators
See: https://developer.mozilla.org/en-US/docs/Web/JavaScript/Guide/Iterators_and_Generators
7 years ago
Daniel Gasienica a4f0c5242f Document why batch size is one 7 years ago
Daniel Gasienica 805031ade8 Conditionally run post-attachment migrations
Introduce placeholder migrations for Backbone models so they never implicitly
run migrations whenever they are `fetch`ed. We prefer to run our migrations
explicitly upon app startup and then let Backbone models be (slightly) dumb(er)
models, without inadvertently triggering migrations.
7 years ago
Daniel Gasienica bfbeedab5c Temporarily disable post-attachment migration migrations 7 years ago
Daniel Gasienica d9be6a0f94 Destructure Lodash `require`s 7 years ago
Daniel Gasienica b7b6195cfc Extract IIFE into separate function 7 years ago
Daniel Gasienica 11f98474ba Capture how many messages we have to process 7 years ago
Daniel Gasienica 0fdc1140dd Add `Database.getCount` function 7 years ago
Daniel Gasienica 1f8556b049 Remove unused `createCollection` 7 years ago
Daniel Gasienica c67c2a858a Remove Backbone references for attachment migration
It has to run without any other migrations interfering.
7 years ago
Daniel Gasienica 0c40f35623 Document disadvantage of fetching messages without index 7 years ago
Daniel Gasienica d3c9de4712 Add debug module
Lets us generate large conversations with large attachments.
7 years ago
Daniel Gasienica 30037e5308 Reduce attachment migration batch size to 1
This prevents ‘Maximum IPC message size exceeded’ due to IDB `getAll` operation.

- https://github.com/zincbase/zincdb/issues/17
- https://cs.chromium.org/chromium/src/content/browser/indexed_db/indexed_db_database.cc?q=%22Maximum+IPC+message+size+exceeded%22&sq=package:chromium&l=1160
7 years ago
Daniel Gasienica 21147a20a0 Add `sleep` module 7 years ago
Daniel Gasienica 08f73b8420 Remove last processed index after attachment migration 7 years ago
Daniel Gasienica 696a144ab7 Add `settings.deleteItem` 7 years ago
Daniel Gasienica 5910f84af4 Remove outdated documentation 7 years ago
Daniel Gasienica efe3cd67fc Allow attachment migration run on higher database version 7 years ago
Daniel Gasienica 921c3dba7c Skip migrations that have already been applied 7 years ago
Daniel Gasienica 417511ffd2 Add `database.getVersion` 7 years ago
Daniel Gasienica c5c94bc3ab Extract `getMigrationVersions` 7 years ago
Daniel Gasienica 6aea36240d Rename `closeDatabase` to `closeDatabaseConnection` 7 years ago
Daniel Gasienica 016432826b Extract `database` and `settings` modules 7 years ago
Daniel Gasienica 5bea894abd Close database connection via Backbone IDB adapter 7 years ago
Daniel Gasienica f50e9ae364 Log closing connection of database 7 years ago
Daniel Gasienica 4ff8bc3357 Use `camelCase` for non-constructors 7 years ago
Daniel Gasienica 3720c3f3bb Improve log message 7 years ago
Daniel Gasienica ce5b450fdb Log `targetSchemaVersion` 7 years ago
Daniel Gasienica f7f24b5822 Log total number of processed messages 7 years ago
Daniel Gasienica eca930770c Remove hard-coded database connection settings 7 years ago
Daniel Gasienica 1df6dc8378 Abort processing if there are no more messages 7 years ago
Daniel Gasienica d5d0eabdfd Remove usage of `storage` module 7 years ago
Daniel Gasienica 8966e80284 Improve identifier names 7 years ago
Daniel Gasienica 3e2d575506 Document `MessageDataMigrator` module design 7 years ago
Daniel Gasienica 3c57dbfb56 Extract `NUM_MESSAGES_PER_BATCH` 7 years ago
Daniel Gasienica 85788d3c4a Match `items` storage format to Backbone adapter 7 years ago
Daniel Gasienica 7de7fcf561 Avoid `no-param-reassign` violation 7 years ago
Daniel Gasienica 070235b59b Implement `MessageDataMigrator.processAll`
Upgrades schema of all messags upon startup.
7 years ago
Daniel Gasienica 178a3cc262 Reduce work for verifying transaction completion 7 years ago
Daniel Gasienica b6e978f74c Implement `MessagesDataMigrator.processAll` 7 years ago
Daniel Gasienica 457bf7ab9d Add `createCollection` function 7 years ago
Daniel Gasienica 8ea257ad4d Use double quotes for identifiers in error messages 7 years ago
Daniel Gasienica 172616ca4f Add log message for dummy migration 18 7 years ago
Daniel Gasienica 579b01283e Replace `wrapDeferred` with `deferredToPromise` 7 years ago
Daniel Gasienica 40c40c800a Prefer `exports` 7 years ago
Daniel Gasienica da144edc56 Manually close database connection after migration 7 years ago
Daniel Gasienica 106ce21c49 Remove redundant log message 7 years ago
Daniel Gasienica fcd30cd919 Close database after migration
This is not 100% reliable as database connections are closed in a separate
thread according to the documentation:
- https://developer.mozilla.org/en-US/docs/Web/API/IDBDatabase/close
- https://stackoverflow.com/a/18639298
- 80c7a06d5c/backbone-indexeddb.js (L558-L565)
7 years ago
Daniel Gasienica c765422fa1 Extract `deferredToPromise` 7 years ago
Daniel Gasienica e2f1339ab9 Explicitly run post-attachment migrations 7 years ago
Daniel Gasienica d7c8d33edb Extract `runMigrations` 7 years ago
Daniel Gasienica d16178638e Split database migrations into pre- and post-attachment migration
- Run light-weight migrations before attachment migration.
- Run regular migrations after attachments have been moved to disk.
7 years ago
Daniel Gasienica 90de9d85a3 Remove type annotation 7 years ago
Daniel Gasienica 4c10fcfa17 Reduce threshold until optimization appears to 1s 7 years ago
Daniel Gasienica add19aa732 Add initialization view 7 years ago
Daniel Gasienica 9b112489cd Upgrade 2 messages every 30 seconds
This results in 4 messages per minute or 240 messages per hour.
7 years ago
Daniel Gasienica 7c2fde4433 Add `Signal.Workflow` namespace 7 years ago
Daniel Gasienica 4a7cc22de3 🎨 Use `window.requestIdleCallback` 7 years ago