diff --git a/CHANGELOG.md b/CHANGELOG.md index 466c840a9..1af3ede1c 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,3 +1,26 @@ +Changes in [11.1.0](https://github.com/matrix-org/matrix-js-sdk/releases/tag/v11.1.0) (2021-05-24) +================================================================================================== +[Full Changelog](https://github.com/matrix-org/matrix-js-sdk/compare/v11.1.0-rc.1...v11.1.0) + + * [Release] Bump libolm version and update package name + [\#1707](https://github.com/matrix-org/matrix-js-sdk/pull/1707) + * [Release] Change call event handlers to adapt to undecrypted events + [\#1699](https://github.com/matrix-org/matrix-js-sdk/pull/1699) + +Changes in [11.1.0-rc.1](https://github.com/matrix-org/matrix-js-sdk/releases/tag/v11.1.0-rc.1) (2021-05-19) +============================================================================================================ +[Full Changelog](https://github.com/matrix-org/matrix-js-sdk/compare/v11.0.0...v11.1.0-rc.1) + + * Fix regressed glare + [\#1690](https://github.com/matrix-org/matrix-js-sdk/pull/1690) + * Add m.reaction to EventType enum + [\#1692](https://github.com/matrix-org/matrix-js-sdk/pull/1692) + * Prioritise and reduce the amount of events decrypted on application startup + [\#1684](https://github.com/matrix-org/matrix-js-sdk/pull/1684) + * Decrypt relations before applying them to target event + [\#1696](https://github.com/matrix-org/matrix-js-sdk/pull/1696) + * Guard against duplicates in `Relations` model + Changes in [11.0.0](https://github.com/matrix-org/matrix-js-sdk/releases/tag/v11.0.0) (2021-05-17) ================================================================================================== [Full Changelog](https://github.com/matrix-org/matrix-js-sdk/compare/v11.0.0-rc.1...v11.0.0) diff --git a/package.json b/package.json index e98615ba1..3a2320efd 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "matrix-js-sdk", - "version": "11.0.0", + "version": "11.1.0", "description": "Matrix Client-Server SDK for Javascript", "scripts": { "prepublishOnly": "yarn build", @@ -72,6 +72,7 @@ "@babel/preset-env": "^7.12.11", "@babel/preset-typescript": "^7.12.7", "@babel/register": "^7.12.10", + "@matrix-org/olm": "https://gitlab.matrix.org/api/v4/projects/27/packages/npm/@matrix-org/olm/-/@matrix-org/olm-3.2.3.tgz", "@types/jest": "^26.0.20", "@types/node": "12", "@types/request": "^2.48.5", @@ -91,7 +92,6 @@ "jest-localstorage-mock": "^2.4.6", "jsdoc": "^3.6.6", "matrix-mock-request": "^1.2.3", - "olm": "https://packages.matrix.org/npm/olm/olm-3.2.1.tgz", "rimraf": "^3.0.2", "terser": "^5.5.1", "tsify": "^5.0.2", diff --git a/spec/TestClient.js b/spec/TestClient.js index 52b4b3d70..aa6db4f2a 100644 --- a/spec/TestClient.js +++ b/spec/TestClient.js @@ -20,12 +20,12 @@ limitations under the License. import './olm-loader'; import MockHttpBackend from 'matrix-mock-request'; -import {LocalStorageCryptoStore} from '../src/crypto/store/localStorage-crypto-store'; -import {logger} from '../src/logger'; -import {WebStorageSessionStore} from "../src/store/session/webstorage"; -import {syncPromise} from "./test-utils"; -import {createClient} from "../src/matrix"; -import {MockStorageApi} from "./MockStorageApi"; +import { LocalStorageCryptoStore } from '../src/crypto/store/localStorage-crypto-store'; +import { logger } from '../src/logger'; +import { WebStorageSessionStore } from "../src/store/session/webstorage"; +import { syncPromise } from "./test-utils"; +import { createClient } from "../src/matrix"; +import { MockStorageApi } from "./MockStorageApi"; /** * Wrapper for a MockStorageApi, MockHttpBackend and MatrixClient @@ -129,11 +129,10 @@ TestClient.prototype.expectDeviceKeyUpload = function() { expect(Object.keys(self.oneTimeKeys).length).toEqual(0); self.deviceKeys = content.device_keys; - return {one_time_key_counts: {signed_curve25519: 0}}; + return { one_time_key_counts: { signed_curve25519: 0 } }; }); }; - /** * If one-time keys have already been uploaded, return them. Otherwise, * set up an expectation that the keys will be uploaded, and wait for @@ -151,9 +150,9 @@ TestClient.prototype.awaitOneTimeKeyUpload = function() { .respond(200, (path, content) => { expect(content.device_keys).toBe(undefined); expect(content.one_time_keys).toBe(undefined); - return {one_time_key_counts: { + return { one_time_key_counts: { signed_curve25519: Object.keys(this.oneTimeKeys).length, - }}; + } }; }); this.httpBackend.when("POST", "/keys/upload") @@ -164,9 +163,9 @@ TestClient.prototype.awaitOneTimeKeyUpload = function() { logger.log('%s: received %i one-time keys', this, Object.keys(content.one_time_keys).length); this.oneTimeKeys = content.one_time_keys; - return {one_time_key_counts: { + return { one_time_key_counts: { signed_curve25519: Object.keys(this.oneTimeKeys).length, - }}; + } }; }); // this can take ages @@ -197,7 +196,6 @@ TestClient.prototype.expectKeyQuery = function(response) { }); }; - /** * get the uploaded curve25519 device key * @@ -208,7 +206,6 @@ TestClient.prototype.getDeviceKey = function() { return this.deviceKeys.keys[keyId]; }; - /** * get the uploaded ed25519 device key * diff --git a/spec/browserify/sync-browserify.spec.js b/spec/browserify/sync-browserify.spec.js index da0c510ac..8f5b3bf03 100644 --- a/spec/browserify/sync-browserify.spec.js +++ b/spec/browserify/sync-browserify.spec.js @@ -17,10 +17,10 @@ limitations under the License. // load XmlHttpRequest mock import "./setupTests"; import "../../dist/browser-matrix"; // uses browser-matrix instead of the src -import {MockStorageApi} from "../MockStorageApi"; -import {WebStorageSessionStore} from "../../src/store/session/webstorage"; +import { MockStorageApi } from "../MockStorageApi"; +import { WebStorageSessionStore } from "../../src/store/session/webstorage"; import MockHttpBackend from "matrix-mock-request"; -import {LocalStorageCryptoStore} from "../../src/crypto/store/localStorage-crypto-store"; +import { LocalStorageCryptoStore } from "../../src/crypto/store/localStorage-crypto-store"; import * as utils from "../test-utils"; const USER_ID = "@user:test.server"; @@ -58,7 +58,7 @@ describe("Browserify Test", function() { } beforeEach(async () => { - ({client, httpBackend} = await createTestClient()); + ({ client, httpBackend } = await createTestClient()); await client.startClient(); }); diff --git a/spec/integ/devicelist-integ-spec.js b/spec/integ/devicelist-integ-spec.js index ea3b28531..96bebe5c6 100644 --- a/spec/integ/devicelist-integ-spec.js +++ b/spec/integ/devicelist-integ-spec.js @@ -16,9 +16,9 @@ See the License for the specific language governing permissions and limitations under the License. */ -import {TestClient} from '../TestClient'; +import { TestClient } from '../TestClient'; import * as testUtils from '../test-utils'; -import {logger} from '../../src/logger'; +import { logger } from '../../src/logger'; const ROOM_ID = "!room:id"; @@ -67,7 +67,6 @@ function getSyncResponse(roomMembers) { return syncResponse; } - describe("DeviceList management:", function() { if (!global.Olm) { logger.warn('not running deviceList tests: Olm not present'); @@ -98,7 +97,7 @@ describe("DeviceList management:", function() { }); it("Alice shouldn't do a second /query for non-e2e-capable devices", function() { - aliceTestClient.expectKeyQuery({device_keys: {'@alice:localhost': {}}}); + aliceTestClient.expectKeyQuery({ device_keys: { '@alice:localhost': {} } }); return aliceTestClient.start().then(function() { const syncResponse = getSyncResponse(['@bob:xyz']); aliceTestClient.httpBackend.when('GET', '/sync').respond(200, syncResponse); @@ -137,11 +136,10 @@ describe("DeviceList management:", function() { }); }); - it("We should not get confused by out-of-order device query responses", () => { // https://github.com/vector-im/element-web/issues/3126 - aliceTestClient.expectKeyQuery({device_keys: {'@alice:localhost': {}}}); + aliceTestClient.expectKeyQuery({ device_keys: { '@alice:localhost': {} } }); return aliceTestClient.start().then(() => { aliceTestClient.httpBackend.when('GET', '/sync').respond( 200, getSyncResponse(['@bob:xyz', '@chris:abc'])); @@ -160,7 +158,7 @@ describe("DeviceList management:", function() { ); aliceTestClient.httpBackend.when('PUT', '/send/').respond( - 200, {event_id: '$event1'}); + 200, { event_id: '$event1' }); return Promise.all([ aliceTestClient.client.sendTextMessage(ROOM_ID, 'test'), @@ -199,7 +197,7 @@ describe("DeviceList management:", function() { }, token: '3', }).respond(200, { - device_keys: {'@chris:abc': {}}, + device_keys: { '@chris:abc': {} }, }); return aliceTestClient.httpBackend.flush('/keys/query', 1); }).then((flushed) => { @@ -228,7 +226,7 @@ describe("DeviceList management:", function() { }, token: '2', }).respond(200, { - device_keys: {'@bob:xyz': {}}, + device_keys: { '@bob:xyz': {} }, }); return aliceTestClient.httpBackend.flush('/keys/query', 1); }).then((flushed) => { @@ -323,7 +321,6 @@ describe("DeviceList management:", function() { }, ); - await aliceTestClient.flushSync(); await aliceTestClient.client._crypto._deviceList.saveIfDirty(); diff --git a/spec/integ/matrix-client-event-emitter.spec.js b/spec/integ/matrix-client-event-emitter.spec.js index b8f3b1868..a76caf379 100644 --- a/spec/integ/matrix-client-event-emitter.spec.js +++ b/spec/integ/matrix-client-event-emitter.spec.js @@ -1,5 +1,5 @@ import * as utils from "../test-utils"; -import {TestClient} from "../TestClient"; +import { TestClient } from "../TestClient"; describe("MatrixClient events", function() { let client; diff --git a/spec/integ/matrix-client-event-timeline.spec.js b/spec/integ/matrix-client-event-timeline.spec.js index acaff0cee..c8ec42c74 100644 --- a/spec/integ/matrix-client-event-timeline.spec.js +++ b/spec/integ/matrix-client-event-timeline.spec.js @@ -1,7 +1,7 @@ import * as utils from "../test-utils"; -import {EventTimeline} from "../../src/matrix"; -import {logger} from "../../src/logger"; -import {TestClient} from "../TestClient"; +import { EventTimeline } from "../../src/matrix"; +import { logger } from "../../src/logger"; +import { TestClient } from "../TestClient"; const userId = "@alice:localhost"; const userName = "Alice"; @@ -127,7 +127,7 @@ describe("getEventTimeline support", function() { "DEVICE", accessToken, undefined, - {timelineSupport: true}, + { timelineSupport: true }, ); client = testClient.client; httpBackend = testClient.httpBackend; @@ -141,7 +141,6 @@ describe("getEventTimeline support", function() { }); }); - it("scrollback should be able to scroll back to before a gappy /sync", function() { // need a client with timelineSupport disabled to make this work @@ -218,7 +217,7 @@ describe("MatrixClient event timelines", function() { "DEVICE", accessToken, undefined, - {timelineSupport: true}, + { timelineSupport: true }, ); client = testClient.client; httpBackend = testClient.httpBackend; @@ -516,7 +515,7 @@ describe("MatrixClient event timelines", function() { client.getEventTimeline(timelineSet, EVENTS[0].event_id, ).then(function(tl0) { tl = tl0; - return client.paginateEventTimeline(tl, {backwards: true}); + return client.paginateEventTimeline(tl, { backwards: true }); }).then(function(success) { expect(success).toBeTruthy(); expect(tl.getEvents().length).toEqual(3); @@ -532,7 +531,6 @@ describe("MatrixClient event timelines", function() { ]); }); - it("should allow you to paginate forwards", function() { const room = client.getRoom(roomId); const timelineSet = room.getTimelineSets()[0]; @@ -569,7 +567,7 @@ describe("MatrixClient event timelines", function() { ).then(function(tl0) { tl = tl0; return client.paginateEventTimeline( - tl, {backwards: false, limit: 20}); + tl, { backwards: false, limit: 20 }); }).then(function(success) { expect(success).toBeTruthy(); expect(tl.getEvents().length).toEqual(3); @@ -591,7 +589,7 @@ describe("MatrixClient event timelines", function() { const event = utils.mkMessage({ room: roomId, user: userId, msg: "a body", }); - event.unsigned = {transaction_id: TXN_ID}; + event.unsigned = { transaction_id: TXN_ID }; beforeEach(function() { // set up handlers for both the message send, and the @@ -680,7 +678,6 @@ describe("MatrixClient event timelines", function() { }); }); - it("should handle gappy syncs after redactions", function() { // https://github.com/vector-im/vector-web/issues/1389 diff --git a/spec/integ/matrix-client-methods.spec.js b/spec/integ/matrix-client-methods.spec.js index b79fd26d7..742beec27 100644 --- a/spec/integ/matrix-client-methods.spec.js +++ b/spec/integ/matrix-client-methods.spec.js @@ -1,7 +1,7 @@ import * as utils from "../test-utils"; -import {CRYPTO_ENABLED} from "../../src/client"; -import {Filter, MemoryStore, Room} from "../../src/matrix"; -import {TestClient} from "../TestClient"; +import { CRYPTO_ENABLED } from "../../src/client"; +import { Filter, MemoryStore, Room } from "../../src/matrix"; +import { TestClient } from "../TestClient"; describe("MatrixClient", function() { let client = null; @@ -285,7 +285,6 @@ describe("MatrixClient", function() { }); }); - describe("downloadKeys", function() { if (!CRYPTO_ENABLED) { return; @@ -346,10 +345,10 @@ describe("MatrixClient", function() { */ httpBackend.when("POST", "/keys/query").check(function(req) { - expect(req.data).toEqual({device_keys: { + expect(req.data).toEqual({ device_keys: { 'boris': [], 'chaz': [], - }}); + } }); }).respond(200, { device_keys: { boris: borisKeys, @@ -379,12 +378,12 @@ describe("MatrixClient", function() { }); describe("deleteDevice", function() { - const auth = {a: 1}; + const auth = { a: 1 }; it("should pass through an auth dict", function() { httpBackend.when( "DELETE", "/_matrix/client/r0/devices/my_device", ).check(function(req) { - expect(req.data).toEqual({auth: auth}); + expect(req.data).toEqual({ auth: auth }); }).respond(200); const prom = client.deleteDevice("my_device", auth); diff --git a/spec/integ/matrix-client-opts.spec.js b/spec/integ/matrix-client-opts.spec.js index 7c256fd58..87f9285fb 100644 --- a/spec/integ/matrix-client-opts.spec.js +++ b/spec/integ/matrix-client-opts.spec.js @@ -1,9 +1,9 @@ import * as utils from "../test-utils"; import HttpBackend from "matrix-mock-request"; -import {MatrixClient} from "../../src/matrix"; -import {MatrixScheduler} from "../../src/scheduler"; -import {MemoryStore} from "../../src/store/memory"; -import {MatrixError} from "../../src/http-api"; +import { MatrixClient } from "../../src/matrix"; +import { MatrixScheduler } from "../../src/scheduler"; +import { MemoryStore } from "../../src/store/memory"; +import { MatrixError } from "../../src/http-api"; describe("MatrixClient opts", function() { const baseUrl = "http://localhost.or.something"; diff --git a/spec/integ/matrix-client-retrying.spec.js b/spec/integ/matrix-client-retrying.spec.js index c45d9ced1..99f99f7dd 100644 --- a/spec/integ/matrix-client-retrying.spec.js +++ b/spec/integ/matrix-client-retrying.spec.js @@ -1,7 +1,7 @@ -import {EventStatus} from "../../src/matrix"; -import {MatrixScheduler} from "../../src/scheduler"; -import {Room} from "../../src/models/room"; -import {TestClient} from "../TestClient"; +import { EventStatus } from "../../src/matrix"; +import { MatrixScheduler } from "../../src/scheduler"; +import { Room } from "../../src/models/room"; +import { TestClient } from "../TestClient"; describe("MatrixClient retrying", function() { let client = null; @@ -19,7 +19,7 @@ describe("MatrixClient retrying", function() { "DEVICE", accessToken, undefined, - {scheduler}, + { scheduler }, ); httpBackend = testClient.httpBackend; client = testClient.client; diff --git a/spec/integ/matrix-client-room-timeline.spec.js b/spec/integ/matrix-client-room-timeline.spec.js index b3de310a9..3fd017354 100644 --- a/spec/integ/matrix-client-room-timeline.spec.js +++ b/spec/integ/matrix-client-room-timeline.spec.js @@ -1,7 +1,6 @@ import * as utils from "../test-utils"; -import {EventStatus} from "../../src/models/event"; -import {TestClient} from "../TestClient"; - +import { EventStatus } from "../../src/models/event"; +import { TestClient } from "../TestClient"; describe("MatrixClient room timelines", function() { let client = null; @@ -104,7 +103,7 @@ describe("MatrixClient room timelines", function() { "DEVICE", accessToken, undefined, - {timelineSupport: true}, + { timelineSupport: true }, ); httpBackend = testClient.httpBackend; client = testClient.client; @@ -166,7 +165,7 @@ describe("MatrixClient room timelines", function() { body: "I am a fish", user: userId, room: roomId, }); ev.event_id = eventId; - ev.unsigned = {transaction_id: "txn1"}; + ev.unsigned = { transaction_id: "txn1" }; setNextSyncData([ev]); client.on("sync", function(state) { @@ -198,7 +197,7 @@ describe("MatrixClient room timelines", function() { body: "I am a fish", user: userId, room: roomId, }); ev.event_id = eventId; - ev.unsigned = {transaction_id: "txn1"}; + ev.unsigned = { transaction_id: "txn1" }; setNextSyncData([ev]); client.on("sync", function(state) { @@ -396,8 +395,8 @@ describe("MatrixClient room timelines", function() { describe("new events", function() { it("should be added to the right place in the timeline", function() { const eventData = [ - utils.mkMessage({user: userId, room: roomId}), - utils.mkMessage({user: userId, room: roomId}), + utils.mkMessage({ user: userId, room: roomId }), + utils.mkMessage({ user: userId, room: roomId }), ]; setNextSyncData(eventData); @@ -434,11 +433,11 @@ describe("MatrixClient room timelines", function() { it("should set the right event.sender values", function() { const eventData = [ - utils.mkMessage({user: userId, room: roomId}), + utils.mkMessage({ user: userId, room: roomId }), utils.mkMembership({ user: userId, room: roomId, mship: "join", name: "New Name", }), - utils.mkMessage({user: userId, room: roomId}), + utils.mkMessage({ user: userId, room: roomId }), ]; eventData[1].__prev_event = USER_MEMBERSHIP_EVENT; setNextSyncData(eventData); @@ -546,7 +545,7 @@ describe("MatrixClient room timelines", function() { describe("gappy sync", function() { it("should copy the last known state to the new timeline", function() { const eventData = [ - utils.mkMessage({user: userId, room: roomId}), + utils.mkMessage({ user: userId, room: roomId }), ]; setNextSyncData(eventData); NEXT_SYNC_DATA.rooms.join[roomId].timeline.limited = true; @@ -579,7 +578,7 @@ describe("MatrixClient room timelines", function() { it("should emit a 'Room.timelineReset' event", function() { const eventData = [ - utils.mkMessage({user: userId, room: roomId}), + utils.mkMessage({ user: userId, room: roomId }), ]; setNextSyncData(eventData); NEXT_SYNC_DATA.rooms.join[roomId].timeline.limited = true; diff --git a/spec/integ/matrix-client-syncing.spec.js b/spec/integ/matrix-client-syncing.spec.js index adb6be965..6181efebf 100644 --- a/spec/integ/matrix-client-syncing.spec.js +++ b/spec/integ/matrix-client-syncing.spec.js @@ -1,7 +1,7 @@ -import {MatrixEvent} from "../../src/models/event"; -import {EventTimeline} from "../../src/models/event-timeline"; +import { MatrixEvent } from "../../src/models/event"; +import { EventTimeline } from "../../src/models/event-timeline"; import * as utils from "../test-utils"; -import {TestClient} from "../TestClient"; +import { TestClient } from "../TestClient"; describe("MatrixClient syncing", function() { let client = null; @@ -122,7 +122,6 @@ describe("MatrixClient syncing", function() { resolveInvitesToProfiles: true, }); - return Promise.all([ httpBackend.flushAllExpected(), awaitSyncEvent(), @@ -677,8 +676,8 @@ describe("MatrixClient syncing", function() { it("should create and use an appropriate filter", function() { httpBackend.when("POST", "/filter").check(function(req) { expect(req.data).toEqual({ - room: { timeline: {limit: 1}, - include_leave: true }}); + room: { timeline: { limit: 1 }, + include_leave: true } }); }).respond(200, { filter_id: "another_id" }); const prom = new Promise((resolve) => { diff --git a/spec/integ/megolm-integ.spec.js b/spec/integ/megolm-integ.spec.js index 698e030f9..8461bc385 100644 --- a/spec/integ/megolm-integ.spec.js +++ b/spec/integ/megolm-integ.spec.js @@ -17,8 +17,8 @@ limitations under the License. import anotherjson from "another-json"; import * as testUtils from "../test-utils"; -import {TestClient} from "../TestClient"; -import {logger} from "../../src/logger"; +import { TestClient } from "../TestClient"; +import { logger } from "../../src/logger"; const ROOM_ID = "!room:id"; @@ -196,7 +196,6 @@ function getSyncResponse(roomMembers) { return syncResponse; } - describe("megolm", function() { if (!global.Olm) { logger.warn('not running megolm tests: Olm not present'); @@ -268,7 +267,7 @@ describe("megolm", function() { 'ed25519:DEVICE_ID': sig, }; - const claimResponse = {one_time_keys: {}}; + const claimResponse = { one_time_keys: {} }; claimResponse.one_time_keys[userId] = { 'DEVICE_ID': {}, }; @@ -494,7 +493,7 @@ describe("megolm", function() { it('Alice sends a megolm message', function() { let p2pSession; - aliceTestClient.expectKeyQuery({device_keys: {'@alice:localhost': {}}}); + aliceTestClient.expectKeyQuery({ device_keys: { '@alice:localhost': {} } }); return aliceTestClient.start().then(() => { // establish an olm session with alice return createOlmSession(testOlmAccount, aliceTestClient); @@ -577,7 +576,7 @@ describe("megolm", function() { }); it("We shouldn't attempt to send to blocked devices", function() { - aliceTestClient.expectKeyQuery({device_keys: {'@alice:localhost': {}}}); + aliceTestClient.expectKeyQuery({ device_keys: { '@alice:localhost': {} } }); return aliceTestClient.start().then(() => { // establish an olm session with alice return createOlmSession(testOlmAccount, aliceTestClient); @@ -634,7 +633,7 @@ describe("megolm", function() { let p2pSession; let megolmSessionId; - aliceTestClient.expectKeyQuery({device_keys: {'@alice:localhost': {}}}); + aliceTestClient.expectKeyQuery({ device_keys: { '@alice:localhost': {} } }); return aliceTestClient.start().then(() => { // establish an olm session with alice return createOlmSession(testOlmAccount, aliceTestClient); @@ -841,13 +840,12 @@ describe("megolm", function() { }); }); - it('Alice should wait for device list to complete when sending a megolm message', function() { let downloadPromise; let sendPromise; - aliceTestClient.expectKeyQuery({device_keys: {'@alice:localhost': {}}}); + aliceTestClient.expectKeyQuery({ device_keys: { '@alice:localhost': {} } }); return aliceTestClient.start().then(() => { // establish an olm session with alice return createOlmSession(testOlmAccount, aliceTestClient); @@ -887,11 +885,10 @@ describe("megolm", function() { }); }); - it("Alice exports megolm keys and imports them to a new device", function() { let messageEncrypted; - aliceTestClient.expectKeyQuery({device_keys: {'@alice:localhost': {}}}); + aliceTestClient.expectKeyQuery({ device_keys: { '@alice:localhost': {} } }); return aliceTestClient.start().then(() => { // establish an olm session with alice return createOlmSession(testOlmAccount, aliceTestClient); diff --git a/spec/olm-loader.js b/spec/olm-loader.js index 49d7abac0..505c08615 100644 --- a/spec/olm-loader.js +++ b/spec/olm-loader.js @@ -15,12 +15,12 @@ See the License for the specific language governing permissions and limitations under the License. */ -import {logger} from '../src/logger'; +import { logger } from '../src/logger'; import * as utils from "../src/utils"; // try to load the olm library. try { - global.Olm = require('olm'); + global.Olm = require('@matrix-org/olm'); logger.log('loaded libolm'); } catch (e) { logger.warn("unable to run crypto tests: libolm not available"); diff --git a/spec/test-utils.js b/spec/test-utils.js index 12d2cb648..d308b6d35 100644 --- a/spec/test-utils.js +++ b/spec/test-utils.js @@ -1,8 +1,8 @@ // load olm before the sdk if possible import './olm-loader'; -import {logger} from '../src/logger'; -import {MatrixEvent} from "../src/models/event"; +import { logger } from '../src/logger'; +import { MatrixEvent } from "../src/models/event"; /** * Return a promise that is resolved when the client next emits a @@ -177,7 +177,6 @@ export function mkMessage(opts) { return mkEvent(opts); } - /** * A mock implementation of webstorage * @@ -204,7 +203,6 @@ MockStorageApi.prototype = { }, }; - /** * If an event is being decrypted, wait for it to finish being decrypted. * @@ -229,7 +227,6 @@ export function awaitDecryption(event) { } } - export function HttpResponse( httpLookups, acceptKeepalives, ignoreUnhandledSync, ) { diff --git a/spec/unit/autodiscovery.spec.js b/spec/unit/autodiscovery.spec.js index 684186cd7..cdce28eee 100644 --- a/spec/unit/autodiscovery.spec.js +++ b/spec/unit/autodiscovery.spec.js @@ -17,7 +17,7 @@ limitations under the License. import MockHttpBackend from "matrix-mock-request"; import * as sdk from "../../src"; -import {AutoDiscovery} from "../../src/autodiscovery"; +import { AutoDiscovery } from "../../src/autodiscovery"; describe("AutoDiscovery", function() { let httpBackend = null; diff --git a/spec/unit/content-repo.spec.js b/spec/unit/content-repo.spec.js index 377aedd52..e773b0577 100644 --- a/spec/unit/content-repo.spec.js +++ b/spec/unit/content-repo.spec.js @@ -1,4 +1,4 @@ -import {getHttpUriForMxc} from "../../src/content-repo"; +import { getHttpUriForMxc } from "../../src/content-repo"; describe("ContentRepo", function() { const baseUrl = "https://my.home.server"; diff --git a/spec/unit/crypto.spec.js b/spec/unit/crypto.spec.js index 8f7fff107..22f0b2d0d 100644 --- a/spec/unit/crypto.spec.js +++ b/spec/unit/crypto.spec.js @@ -1,16 +1,16 @@ import '../olm-loader'; -import {Crypto} from "../../src/crypto"; -import {WebStorageSessionStore} from "../../src/store/session/webstorage"; -import {MemoryCryptoStore} from "../../src/crypto/store/memory-crypto-store"; -import {MockStorageApi} from "../MockStorageApi"; -import {TestClient} from "../TestClient"; -import {MatrixEvent} from "../../src/models/event"; -import {Room} from "../../src/models/room"; +import { Crypto } from "../../src/crypto"; +import { WebStorageSessionStore } from "../../src/store/session/webstorage"; +import { MemoryCryptoStore } from "../../src/crypto/store/memory-crypto-store"; +import { MockStorageApi } from "../MockStorageApi"; +import { TestClient } from "../TestClient"; +import { MatrixEvent } from "../../src/models/event"; +import { Room } from "../../src/models/room"; import * as olmlib from "../../src/crypto/olmlib"; -import {sleep} from "../../src/utils"; -import {EventEmitter} from "events"; -import {CRYPTO_ENABLED} from "../../src/client"; -import {DeviceInfo} from "../../src/crypto/deviceinfo"; +import { sleep } from "../../src/utils"; +import { EventEmitter } from "events"; +import { CRYPTO_ENABLED } from "../../src/client"; +import { DeviceInfo } from "../../src/crypto/deviceinfo"; const Olm = global.Olm; @@ -46,7 +46,7 @@ describe("Crypto", function() { // unknown sender (e.g. deleted device), forwarded megolm key (untrusted) event.getSenderKey = () => 'YmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmI'; - event.getWireContent = () => {return {algorithm: olmlib.MEGOLM_ALGORITHM};}; + event.getWireContent = () => {return { algorithm: olmlib.MEGOLM_ALGORITHM };}; event.getForwardingCurve25519KeyChain = () => ["not empty"]; event.isKeySourceUntrusted = () => false; event.getClaimedEd25519Key = diff --git a/spec/unit/crypto/CrossSigningInfo.spec.js b/spec/unit/crypto/CrossSigningInfo.spec.js index 541f6e479..5c3ebade1 100644 --- a/spec/unit/crypto/CrossSigningInfo.spec.js +++ b/spec/unit/crypto/CrossSigningInfo.spec.js @@ -22,11 +22,11 @@ import { import { IndexedDBCryptoStore, } from '../../../src/crypto/store/indexeddb-crypto-store'; -import {MemoryCryptoStore} from '../../../src/crypto/store/memory-crypto-store'; +import { MemoryCryptoStore } from '../../../src/crypto/store/memory-crypto-store'; import 'fake-indexeddb/auto'; import 'jest-localstorage-mock'; -import {OlmDevice} from "../../../src/crypto/OlmDevice"; -import {logger} from '../../../src/logger'; +import { OlmDevice } from "../../../src/crypto/OlmDevice"; +import { logger } from '../../../src/logger'; const userId = "@alice:example.com"; @@ -66,7 +66,7 @@ describe("CrossSigningInfo.getCrossSigningKey", function() { }); it.each(types)("should throw if the callback returns falsey", - async ({type, shouldCache}) => { + async ({ type, shouldCache }) => { const info = new CrossSigningInfo(userId, { getCrossSigningKey: () => false, }); diff --git a/spec/unit/crypto/DeviceList.spec.js b/spec/unit/crypto/DeviceList.spec.js index a9ff83054..251f07358 100644 --- a/spec/unit/crypto/DeviceList.spec.js +++ b/spec/unit/crypto/DeviceList.spec.js @@ -16,10 +16,10 @@ See the License for the specific language governing permissions and limitations under the License. */ -import {logger} from "../../../src/logger"; +import { logger } from "../../../src/logger"; import * as utils from "../../../src/utils"; -import {MemoryCryptoStore} from "../../../src/crypto/store/memory-crypto-store"; -import {DeviceList} from "../../../src/crypto/DeviceList"; +import { MemoryCryptoStore } from "../../../src/crypto/store/memory-crypto-store"; +import { DeviceList } from "../../../src/crypto/DeviceList"; const signedDeviceList = { "failures": {}, diff --git a/spec/unit/crypto/algorithms/megolm.spec.js b/spec/unit/crypto/algorithms/megolm.spec.js index 22c668fcf..d4b9e1247 100644 --- a/spec/unit/crypto/algorithms/megolm.spec.js +++ b/spec/unit/crypto/algorithms/megolm.spec.js @@ -1,14 +1,14 @@ import '../../../olm-loader'; import * as algorithms from "../../../../src/crypto/algorithms"; -import {MemoryCryptoStore} from "../../../../src/crypto/store/memory-crypto-store"; -import {MockStorageApi} from "../../../MockStorageApi"; +import { MemoryCryptoStore } from "../../../../src/crypto/store/memory-crypto-store"; +import { MockStorageApi } from "../../../MockStorageApi"; import * as testUtils from "../../../test-utils"; -import {OlmDevice} from "../../../../src/crypto/OlmDevice"; -import {Crypto} from "../../../../src/crypto"; -import {logger} from "../../../../src/logger"; -import {MatrixEvent} from "../../../../src/models/event"; -import {TestClient} from "../../../TestClient"; -import {Room} from "../../../../src/models/room"; +import { OlmDevice } from "../../../../src/crypto/OlmDevice"; +import { Crypto } from "../../../../src/crypto"; +import { logger } from "../../../../src/logger"; +import { MatrixEvent } from "../../../../src/models/event"; +import { TestClient } from "../../../TestClient"; +import { Room } from "../../../../src/models/room"; import * as olmlib from "../../../../src/crypto/olmlib"; const MegolmDecryption = algorithms.DECRYPTION_CLASSES['m.megolm.v1.aes-sha2']; @@ -50,7 +50,6 @@ describe("MegolmDecryption", function() { roomId: ROOM_ID, }); - // we stub out the olm encryption bits mockOlmLib = {}; mockOlmLib.ensureOlmSessionsForDevices = jest.fn(); @@ -136,9 +135,9 @@ describe("MegolmDecryption", function() { mockCrypto.getStoredDevice.mockReturnValue(deviceInfo); mockOlmLib.ensureOlmSessionsForDevices.mockResolvedValue({ - '@alice:foo': {'alidevice': { + '@alice:foo': { 'alidevice': { sessionId: 'alisession', - }}, + } }, }); const awaitEncryptForDevice = new Promise((res, rej) => { @@ -313,7 +312,7 @@ describe("MegolmDecryption", function() { }); const mockRoom = { getEncryptionTargetMembers: jest.fn().mockReturnValue( - [{userId: "@alice:home.server"}], + [{ userId: "@alice:home.server" }], ), getBlacklistUnverifiedDevices: jest.fn().mockReturnValue(false), }; @@ -373,7 +372,7 @@ describe("MegolmDecryption", function() { const roomId = "!someroom"; const room = new Room(roomId, aliceClient, "@alice:example.com", {}); room.getEncryptionTargetMembers = async function() { - return [{userId: "@bob:example.com"}]; + return [{ userId: "@bob:example.com" }]; }; room.setBlacklistUnverifiedDevices(true); aliceClient.store.storeRoom(room); diff --git a/spec/unit/crypto/algorithms/olm.spec.js b/spec/unit/crypto/algorithms/olm.spec.js index c548355b5..882f67235 100644 --- a/spec/unit/crypto/algorithms/olm.spec.js +++ b/spec/unit/crypto/algorithms/olm.spec.js @@ -16,12 +16,12 @@ limitations under the License. */ import '../../../olm-loader'; -import {MemoryCryptoStore} from "../../../../src/crypto/store/memory-crypto-store"; -import {MockStorageApi} from "../../../MockStorageApi"; -import {logger} from "../../../../src/logger"; -import {OlmDevice} from "../../../../src/crypto/OlmDevice"; +import { MemoryCryptoStore } from "../../../../src/crypto/store/memory-crypto-store"; +import { MockStorageApi } from "../../../MockStorageApi"; +import { logger } from "../../../../src/logger"; +import { OlmDevice } from "../../../../src/crypto/OlmDevice"; import * as olmlib from "../../../../src/crypto/olmlib"; -import {DeviceInfo} from "../../../../src/crypto/deviceinfo"; +import { DeviceInfo } from "../../../../src/crypto/deviceinfo"; function makeOlmDevice() { const mockStorage = new MockStorageApi(); diff --git a/spec/unit/crypto/backup.spec.js b/spec/unit/crypto/backup.spec.js index 96623dda3..a9fb93d64 100644 --- a/spec/unit/crypto/backup.spec.js +++ b/spec/unit/crypto/backup.spec.js @@ -16,18 +16,18 @@ limitations under the License. */ import '../../olm-loader'; -import {logger} from "../../../src/logger"; +import { logger } from "../../../src/logger"; import * as olmlib from "../../../src/crypto/olmlib"; -import {MatrixClient} from "../../../src/client"; -import {MatrixEvent} from "../../../src/models/event"; +import { MatrixClient } from "../../../src/client"; +import { MatrixEvent } from "../../../src/models/event"; import * as algorithms from "../../../src/crypto/algorithms"; -import {WebStorageSessionStore} from "../../../src/store/session/webstorage"; -import {MemoryCryptoStore} from "../../../src/crypto/store/memory-crypto-store"; -import {MockStorageApi} from "../../MockStorageApi"; +import { WebStorageSessionStore } from "../../../src/store/session/webstorage"; +import { MemoryCryptoStore } from "../../../src/crypto/store/memory-crypto-store"; +import { MockStorageApi } from "../../MockStorageApi"; import * as testUtils from "../../test-utils"; -import {OlmDevice} from "../../../src/crypto/OlmDevice"; -import {Crypto} from "../../../src/crypto"; -import {resetCrossSigningKeys} from "./crypto-utils"; +import { OlmDevice } from "../../../src/crypto/OlmDevice"; +import { Crypto } from "../../../src/crypto"; +import { resetCrossSigningKeys } from "./crypto-utils"; const Olm = global.Olm; diff --git a/spec/unit/crypto/cross-signing.spec.js b/spec/unit/crypto/cross-signing.spec.js index 1195db2db..af2f2dabd 100644 --- a/spec/unit/crypto/cross-signing.spec.js +++ b/spec/unit/crypto/cross-signing.spec.js @@ -18,11 +18,11 @@ limitations under the License. import '../../olm-loader'; import anotherjson from 'another-json'; import * as olmlib from "../../../src/crypto/olmlib"; -import {TestClient} from '../../TestClient'; -import {HttpResponse, setHttpResponses} from '../../test-utils'; +import { TestClient } from '../../TestClient'; +import { HttpResponse, setHttpResponses } from '../../test-utils'; import { resetCrossSigningKeys } from "./crypto-utils"; import { MatrixError } from '../../../src/http-api'; -import {logger} from '../../../src/logger'; +import { logger } from '../../../src/logger'; async function makeTestClient(userInfo, options, keys) { if (!keys) keys = {}; @@ -60,7 +60,7 @@ describe("Cross Signing", function() { it("should sign the master key with the device key", async function() { const alice = await makeTestClient( - {userId: "@alice:example.com", deviceId: "Osborne2"}, + { userId: "@alice:example.com", deviceId: "Osborne2" }, ); alice.uploadDeviceSigningKeys = jest.fn(async (auth, keys) => { await olmlib.verifySignature( @@ -80,7 +80,7 @@ describe("Cross Signing", function() { it("should abort bootstrap if device signing auth fails", async function() { const alice = await makeTestClient( - {userId: "@alice:example.com", deviceId: "Osborne2"}, + { userId: "@alice:example.com", deviceId: "Osborne2" }, ); alice.uploadDeviceSigningKeys = async (auth, keys) => { const errorResponse = { @@ -131,7 +131,7 @@ describe("Cross Signing", function() { it("should upload a signature when a user is verified", async function() { const alice = await makeTestClient( - {userId: "@alice:example.com", deviceId: "Osborne2"}, + { userId: "@alice:example.com", deviceId: "Osborne2" }, ); alice.uploadDeviceSigningKeys = async () => {}; alice.uploadKeySignatures = async () => {}; @@ -175,7 +175,7 @@ describe("Cross Signing", function() { ]); const alice = await makeTestClient( - {userId: "@alice:example.com", deviceId: "Osborne2"}, + { userId: "@alice:example.com", deviceId: "Osborne2" }, { cryptoCallbacks: { // will be called to sign our own device @@ -328,7 +328,7 @@ describe("Cross Signing", function() { it("should use trust chain to determine device verification", async function() { const alice = await makeTestClient( - {userId: "@alice:example.com", deviceId: "Osborne2"}, + { userId: "@alice:example.com", deviceId: "Osborne2" }, ); alice.uploadDeviceSigningKeys = async () => {}; alice.uploadKeySignatures = async () => {}; @@ -413,7 +413,7 @@ describe("Cross Signing", function() { it("should trust signatures received from other devices", async function() { const aliceKeys = {}; const alice = await makeTestClient( - {userId: "@alice:example.com", deviceId: "Osborne2"}, + { userId: "@alice:example.com", deviceId: "Osborne2" }, null, aliceKeys, ); @@ -575,7 +575,7 @@ describe("Cross Signing", function() { it("should dis-trust an unsigned device", async function() { const alice = await makeTestClient( - {userId: "@alice:example.com", deviceId: "Osborne2"}, + { userId: "@alice:example.com", deviceId: "Osborne2" }, ); alice.uploadDeviceSigningKeys = async () => {}; alice.uploadKeySignatures = async () => {}; @@ -644,7 +644,7 @@ describe("Cross Signing", function() { it("should dis-trust a user when their ssk changes", async function() { const alice = await makeTestClient( - {userId: "@alice:example.com", deviceId: "Osborne2"}, + { userId: "@alice:example.com", deviceId: "Osborne2" }, ); alice.uploadDeviceSigningKeys = async () => {}; alice.uploadKeySignatures = async () => {}; @@ -782,7 +782,7 @@ describe("Cross Signing", function() { let upgradeResolveFunc; const alice = await makeTestClient( - {userId: "@alice:example.com", deviceId: "Osborne2"}, + { userId: "@alice:example.com", deviceId: "Osborne2" }, { cryptoCallbacks: { shouldUpgradeDeviceVerifications: (verifs) => { @@ -794,7 +794,7 @@ describe("Cross Signing", function() { }, ); const bob = await makeTestClient( - {userId: "@bob:example.com", deviceId: "Dynabook"}, + { userId: "@bob:example.com", deviceId: "Dynabook" }, ); bob.uploadDeviceSigningKeys = async () => {}; diff --git a/spec/unit/crypto/crypto-utils.js b/spec/unit/crypto/crypto-utils.js index b54802b05..ec8a8f82a 100644 --- a/spec/unit/crypto/crypto-utils.js +++ b/spec/unit/crypto/crypto-utils.js @@ -1,5 +1,4 @@ -import {IndexedDBCryptoStore} from '../../../src/crypto/store/indexeddb-crypto-store'; - +import { IndexedDBCryptoStore } from '../../../src/crypto/store/indexeddb-crypto-store'; // needs to be phased out and replaced with bootstrapSecretStorage, // but that is doing too much extra stuff for it to be an easy transition. diff --git a/spec/unit/crypto/outgoing-room-key-requests.spec.js b/spec/unit/crypto/outgoing-room-key-requests.spec.js index a27629f60..a1fa62a70 100644 --- a/spec/unit/crypto/outgoing-room-key-requests.spec.js +++ b/spec/unit/crypto/outgoing-room-key-requests.spec.js @@ -17,7 +17,7 @@ limitations under the License. import { IndexedDBCryptoStore, } from '../../../src/crypto/store/indexeddb-crypto-store'; -import {MemoryCryptoStore} from '../../../src/crypto/store/memory-crypto-store'; +import { MemoryCryptoStore } from '../../../src/crypto/store/memory-crypto-store'; import 'fake-indexeddb/auto'; import 'jest-localstorage-mock'; diff --git a/spec/unit/crypto/secrets.spec.js b/spec/unit/crypto/secrets.spec.js index bcf1871da..2198256b3 100644 --- a/spec/unit/crypto/secrets.spec.js +++ b/spec/unit/crypto/secrets.spec.js @@ -16,13 +16,13 @@ limitations under the License. import '../../olm-loader'; import * as olmlib from "../../../src/crypto/olmlib"; -import {SECRET_STORAGE_ALGORITHM_V1_AES} from "../../../src/crypto/SecretStorage"; -import {MatrixEvent} from "../../../src/models/event"; -import {TestClient} from '../../TestClient'; -import {makeTestClients} from './verification/util'; -import {encryptAES} from "../../../src/crypto/aes"; -import {resetCrossSigningKeys, createSecretStorageKey} from "./crypto-utils"; -import {logger} from '../../../src/logger'; +import { SECRET_STORAGE_ALGORITHM_V1_AES } from "../../../src/crypto/SecretStorage"; +import { MatrixEvent } from "../../../src/models/event"; +import { TestClient } from '../../TestClient'; +import { makeTestClients } from './verification/util'; +import { encryptAES } from "../../../src/crypto/aes"; +import { resetCrossSigningKeys, createSecretStorageKey } from "./crypto-utils"; +import { logger } from '../../../src/logger'; import * as utils from "../../../src/utils"; @@ -91,7 +91,7 @@ describe("Secrets", function() { }); const alice = await makeTestClient( - {userId: "@alice:example.com", deviceId: "Osborne2"}, + { userId: "@alice:example.com", deviceId: "Osborne2" }, { cryptoCallbacks: { getCrossSigningKey: t => signingKey, @@ -141,7 +141,7 @@ describe("Secrets", function() { it("should throw if given a key that doesn't exist", async function() { const alice = await makeTestClient( - {userId: "@alice:example.com", deviceId: "Osborne2"}, + { userId: "@alice:example.com", deviceId: "Osborne2" }, ); try { @@ -155,7 +155,7 @@ describe("Secrets", function() { it("should refuse to encrypt with zero keys", async function() { const alice = await makeTestClient( - {userId: "@alice:example.com", deviceId: "Osborne2"}, + { userId: "@alice:example.com", deviceId: "Osborne2" }, ); try { @@ -175,7 +175,7 @@ describe("Secrets", function() { let keys = {}; const alice = await makeTestClient( - {userId: "@alice:example.com", deviceId: "Osborne2"}, + { userId: "@alice:example.com", deviceId: "Osborne2" }, { cryptoCallbacks: { getCrossSigningKey: t => keys[t], @@ -208,7 +208,7 @@ describe("Secrets", function() { it("should refuse to encrypt if no keys given and no default key", async function() { const alice = await makeTestClient( - {userId: "@alice:example.com", deviceId: "Osborne2"}, + { userId: "@alice:example.com", deviceId: "Osborne2" }, ); try { @@ -221,8 +221,8 @@ describe("Secrets", function() { it("should request secrets from other clients", async function() { const [osborne2, vax] = await makeTestClients( [ - {userId: "@alice:example.com", deviceId: "Osborne2"}, - {userId: "@alice:example.com", deviceId: "VAX"}, + { userId: "@alice:example.com", deviceId: "Osborne2" }, + { userId: "@alice:example.com", deviceId: "VAX" }, ], { cryptoCallbacks: { @@ -419,12 +419,12 @@ describe("Secrets", function() { key_id: SSSSKey, }; const alice = await makeTestClient( - {userId: "@alice:example.com", deviceId: "Osborne2"}, + { userId: "@alice:example.com", deviceId: "Osborne2" }, { cryptoCallbacks: { getCrossSigningKey: t => crossSigningKeys[t], saveCrossSigningKeys: k => crossSigningKeys = k, - getSecretStorageKey: ({keys}, name) => { + getSecretStorageKey: ({ keys }, name) => { for (const keyId of Object.keys(keys)) { if (secretStorageKeys[keyId]) { return [keyId, secretStorageKeys[keyId]]; @@ -458,7 +458,7 @@ describe("Secrets", function() { type: "m.cross_signing.master", content: { encrypted: { - key_id: {ciphertext: "bla", mac: "bla", iv: "bla"}, + key_id: { ciphertext: "bla", mac: "bla", iv: "bla" }, }, }, }), @@ -466,7 +466,7 @@ describe("Secrets", function() { type: "m.cross_signing.self_signing", content: { encrypted: { - key_id: {ciphertext: "bla", mac: "bla", iv: "bla"}, + key_id: { ciphertext: "bla", mac: "bla", iv: "bla" }, }, }, }), @@ -474,7 +474,7 @@ describe("Secrets", function() { type: "m.cross_signing.user_signing", content: { encrypted: { - key_id: {ciphertext: "bla", mac: "bla", iv: "bla"}, + key_id: { ciphertext: "bla", mac: "bla", iv: "bla" }, }, }, }), @@ -525,7 +525,7 @@ describe("Secrets", function() { await alice.bootstrapSecretStorage(); expect(alice.getAccountData("m.secret_storage.default_key").getContent()) - .toEqual({key: "key_id"}); + .toEqual({ key: "key_id" }); const keyInfo = alice.getAccountData("m.secret_storage.key.key_id") .getContent(); expect(keyInfo.algorithm) @@ -550,12 +550,12 @@ describe("Secrets", function() { key_id: SSSSKey, }; const alice = await makeTestClient( - {userId: "@alice:example.com", deviceId: "Osborne2"}, + { userId: "@alice:example.com", deviceId: "Osborne2" }, { cryptoCallbacks: { getCrossSigningKey: t => crossSigningKeys[t], saveCrossSigningKeys: k => crossSigningKeys = k, - getSecretStorageKey: ({keys}, name) => { + getSecretStorageKey: ({ keys }, name) => { for (const keyId of Object.keys(keys)) { if (secretStorageKeys[keyId]) { return [keyId, secretStorageKeys[keyId]]; @@ -587,7 +587,7 @@ describe("Secrets", function() { type: "m.cross_signing.master", content: { encrypted: { - key_id: {ciphertext: "bla", mac: "bla", iv: "bla"}, + key_id: { ciphertext: "bla", mac: "bla", iv: "bla" }, }, }, }), @@ -595,7 +595,7 @@ describe("Secrets", function() { type: "m.cross_signing.self_signing", content: { encrypted: { - key_id: {ciphertext: "bla", mac: "bla", iv: "bla"}, + key_id: { ciphertext: "bla", mac: "bla", iv: "bla" }, }, }, }), @@ -603,7 +603,7 @@ describe("Secrets", function() { type: "m.cross_signing.user_signing", content: { encrypted: { - key_id: {ciphertext: "bla", mac: "bla", iv: "bla"}, + key_id: { ciphertext: "bla", mac: "bla", iv: "bla" }, }, }, }), diff --git a/spec/unit/crypto/verification/InRoomChannel.spec.js b/spec/unit/crypto/verification/InRoomChannel.spec.js index da39bea53..634d75c4f 100644 --- a/spec/unit/crypto/verification/InRoomChannel.spec.js +++ b/spec/unit/crypto/verification/InRoomChannel.spec.js @@ -13,9 +13,9 @@ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the License for the specific language governing permissions and limitations under the License. */ -import {InRoomChannel} from "../../../../src/crypto/verification/request/InRoomChannel"; +import { InRoomChannel } from "../../../../src/crypto/verification/request/InRoomChannel"; "../../../../src/crypto/verification/request/ToDeviceChannel"; -import {MatrixEvent} from "../../../../src/models/event"; +import { MatrixEvent } from "../../../../src/models/event"; describe("InRoomChannel tests", function() { const ALICE = "@alice:hs.tld"; diff --git a/spec/unit/crypto/verification/qr_code.spec.js b/spec/unit/crypto/verification/qr_code.spec.js index e72bc8776..33fa2405c 100644 --- a/spec/unit/crypto/verification/qr_code.spec.js +++ b/spec/unit/crypto/verification/qr_code.spec.js @@ -15,7 +15,7 @@ See the License for the specific language governing permissions and limitations under the License. */ import "../../../olm-loader"; -import {logger} from "../../../../src/logger"; +import { logger } from "../../../../src/logger"; const Olm = global.Olm; diff --git a/spec/unit/crypto/verification/request.spec.js b/spec/unit/crypto/verification/request.spec.js index 3df49c0ee..113934385 100644 --- a/spec/unit/crypto/verification/request.spec.js +++ b/spec/unit/crypto/verification/request.spec.js @@ -15,10 +15,10 @@ See the License for the specific language governing permissions and limitations under the License. */ import "../../../olm-loader"; -import {verificationMethods} from "../../../../src/crypto"; -import {logger} from "../../../../src/logger"; -import {SAS} from "../../../../src/crypto/verification/SAS"; -import {makeTestClients, setupWebcrypto, teardownWebcrypto} from './util'; +import { verificationMethods } from "../../../../src/crypto"; +import { logger } from "../../../../src/logger"; +import { SAS } from "../../../../src/crypto/verification/SAS"; +import { makeTestClients, setupWebcrypto, teardownWebcrypto } from './util'; const Olm = global.Olm; @@ -42,8 +42,8 @@ describe("verification request integration tests with crypto layer", function() it("should request and accept a verification", async function() { const [alice, bob] = await makeTestClients( [ - {userId: "@alice:example.com", deviceId: "Osborne2"}, - {userId: "@bob:example.com", deviceId: "Dynabook"}, + { userId: "@alice:example.com", deviceId: "Osborne2" }, + { userId: "@bob:example.com", deviceId: "Dynabook" }, ], { verificationMethods: [verificationMethods.SAS], diff --git a/spec/unit/crypto/verification/sas.spec.js b/spec/unit/crypto/verification/sas.spec.js index 607712318..db517ea5c 100644 --- a/spec/unit/crypto/verification/sas.spec.js +++ b/spec/unit/crypto/verification/sas.spec.js @@ -15,14 +15,14 @@ See the License for the specific language governing permissions and limitations under the License. */ import "../../../olm-loader"; -import {makeTestClients, setupWebcrypto, teardownWebcrypto} from './util'; -import {MatrixEvent} from "../../../../src/models/event"; -import {SAS} from "../../../../src/crypto/verification/SAS"; -import {DeviceInfo} from "../../../../src/crypto/deviceinfo"; -import {verificationMethods} from "../../../../src/crypto"; +import { makeTestClients, setupWebcrypto, teardownWebcrypto } from './util'; +import { MatrixEvent } from "../../../../src/models/event"; +import { SAS } from "../../../../src/crypto/verification/SAS"; +import { DeviceInfo } from "../../../../src/crypto/deviceinfo"; +import { verificationMethods } from "../../../../src/crypto"; import * as olmlib from "../../../../src/crypto/olmlib"; -import {logger} from "../../../../src/logger"; -import {resetCrossSigningKeys} from "../crypto-utils"; +import { logger } from "../../../../src/logger"; +import { resetCrossSigningKeys } from "../crypto-utils"; const Olm = global.Olm; @@ -79,8 +79,8 @@ describe("SAS verification", function() { beforeEach(async () => { [alice, bob] = await makeTestClients( [ - {userId: "@alice:example.com", deviceId: "Osborne2"}, - {userId: "@bob:example.com", deviceId: "Dynabook"}, + { userId: "@alice:example.com", deviceId: "Osborne2" }, + { userId: "@bob:example.com", deviceId: "Dynabook" }, ], { verificationMethods: [verificationMethods.SAS], @@ -336,8 +336,8 @@ describe("SAS verification", function() { it("should send a cancellation message on error", async function() { const [alice, bob] = await makeTestClients( [ - {userId: "@alice:example.com", deviceId: "Osborne2"}, - {userId: "@bob:example.com", deviceId: "Dynabook"}, + { userId: "@alice:example.com", deviceId: "Osborne2" }, + { userId: "@bob:example.com", deviceId: "Dynabook" }, ], { verificationMethods: [verificationMethods.SAS], @@ -390,8 +390,8 @@ describe("SAS verification", function() { beforeEach(async function() { [alice, bob] = await makeTestClients( [ - {userId: "@alice:example.com", deviceId: "Osborne2"}, - {userId: "@bob:example.com", deviceId: "Dynabook"}, + { userId: "@alice:example.com", deviceId: "Osborne2" }, + { userId: "@bob:example.com", deviceId: "Dynabook" }, ], { verificationMethods: [verificationMethods.SAS], diff --git a/spec/unit/crypto/verification/secret_request.spec.js b/spec/unit/crypto/verification/secret_request.spec.js index e848bb18d..2af336af7 100644 --- a/spec/unit/crypto/verification/secret_request.spec.js +++ b/spec/unit/crypto/verification/secret_request.spec.js @@ -14,10 +14,10 @@ See the License for the specific language governing permissions and limitations under the License. */ -import {VerificationBase} from '../../../../src/crypto/verification/Base'; -import {CrossSigningInfo} from '../../../../src/crypto/CrossSigning'; -import {encodeBase64} from "../../../../src/crypto/olmlib"; -import {setupWebcrypto, teardownWebcrypto} from './util'; +import { VerificationBase } from '../../../../src/crypto/verification/Base'; +import { CrossSigningInfo } from '../../../../src/crypto/CrossSigning'; +import { encodeBase64 } from "../../../../src/crypto/olmlib"; +import { setupWebcrypto, teardownWebcrypto } from './util'; jest.useFakeTimers(); diff --git a/spec/unit/crypto/verification/util.js b/spec/unit/crypto/verification/util.js index 66c5d3162..0ff4d2412 100644 --- a/spec/unit/crypto/verification/util.js +++ b/spec/unit/crypto/verification/util.js @@ -15,10 +15,10 @@ See the License for the specific language governing permissions and limitations under the License. */ -import {TestClient} from '../../../TestClient'; -import {MatrixEvent} from "../../../../src/models/event"; +import { TestClient } from '../../../TestClient'; +import { MatrixEvent } from "../../../../src/models/event"; import nodeCrypto from "crypto"; -import {logger} from '../../../../src/logger'; +import { logger } from '../../../../src/logger'; export async function makeTestClients(userInfos, options) { const clients = []; @@ -76,7 +76,7 @@ export async function makeTestClients(userInfos, options) { } }); - return Promise.resolve({event_id: eventId}); + return Promise.resolve({ event_id: eventId }); }; for (const userInfo of userInfos) { diff --git a/spec/unit/crypto/verification/verification_request.spec.js b/spec/unit/crypto/verification/verification_request.spec.js index a90d04824..f8de29cee 100644 --- a/spec/unit/crypto/verification/verification_request.spec.js +++ b/spec/unit/crypto/verification/verification_request.spec.js @@ -13,13 +13,13 @@ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the License for the specific language governing permissions and limitations under the License. */ -import {VerificationRequest, READY_TYPE, START_TYPE, DONE_TYPE} from +import { VerificationRequest, READY_TYPE, START_TYPE, DONE_TYPE } from "../../../../src/crypto/verification/request/VerificationRequest"; -import {InRoomChannel} from "../../../../src/crypto/verification/request/InRoomChannel"; -import {ToDeviceChannel} from +import { InRoomChannel } from "../../../../src/crypto/verification/request/InRoomChannel"; +import { ToDeviceChannel } from "../../../../src/crypto/verification/request/ToDeviceChannel"; -import {MatrixEvent} from "../../../../src/models/event"; -import {setupWebcrypto, teardownWebcrypto} from "./util"; +import { MatrixEvent } from "../../../../src/models/event"; +import { setupWebcrypto, teardownWebcrypto } from "./util"; function makeMockClient(userId, deviceId) { let counter = 1; @@ -40,7 +40,7 @@ function makeMockClient(userId, deviceId) { content, origin_server_ts: Date.now(), })); - return Promise.resolve({event_id: eventId}); + return Promise.resolve({ event_id: eventId }); }, sendToDevice(type, msgMap) { @@ -48,7 +48,7 @@ function makeMockClient(userId, deviceId) { const deviceMap = msgMap[userId]; for (const deviceId of Object.keys(deviceMap)) { const content = deviceMap[deviceId]; - const event = new MatrixEvent({content, type}); + const event = new MatrixEvent({ content, type }); deviceEvents[userId] = deviceEvents[userId] || {}; deviceEvents[userId][deviceId] = deviceEvents[userId][deviceId] || []; deviceEvents[userId][deviceId].push(event); @@ -90,7 +90,7 @@ class MockVerifier { if (this._startEvent) { await this._channel.send(DONE_TYPE, {}); } else { - await this._channel.send(START_TYPE, {method: MOCK_METHOD}); + await this._channel.send(START_TYPE, { method: MOCK_METHOD }); } } @@ -226,7 +226,7 @@ describe("verification request unit tests", function() { new ToDeviceChannel(bob1, bob1.getUserId(), ["device1", "device2"], ToDeviceChannel.makeTransactionId(), "device2"), new Map([[MOCK_METHOD, MockVerifier]]), bob1); - const to = {userId: "@bob:matrix.tld", deviceId: "device2"}; + const to = { userId: "@bob:matrix.tld", deviceId: "device2" }; const verifier = bob1Request.beginKeyVerification(MOCK_METHOD, to); expect(verifier).toBeInstanceOf(MockVerifier); await verifier.start(); diff --git a/spec/unit/event-timeline.spec.js b/spec/unit/event-timeline.spec.js index bf5645d8d..ed3bfb4d5 100644 --- a/spec/unit/event-timeline.spec.js +++ b/spec/unit/event-timeline.spec.js @@ -1,6 +1,6 @@ import * as utils from "../test-utils"; -import {EventTimeline} from "../../src/models/event-timeline"; -import {RoomState} from "../../src/models/room-state"; +import { EventTimeline } from "../../src/models/event-timeline"; +import { RoomState } from "../../src/models/room-state"; function mockRoomStates(timeline) { timeline._startState = utils.mock(RoomState, "startState"); @@ -15,7 +15,7 @@ describe("EventTimeline", function() { beforeEach(function() { // XXX: this is a horrid hack; should use sinon or something instead to mock - const timelineSet = { room: { roomId: roomId }}; + const timelineSet = { room: { roomId: roomId } }; timelineSet.room.getUnfilteredTimelineSet = function() { return timelineSet; }; @@ -94,7 +94,6 @@ describe("EventTimeline", function() { }); }); - describe("neighbouringTimelines", function() { it("neighbouring timelines should start null", function() { expect(timeline.getNeighbouringTimeline(EventTimeline.BACKWARDS)).toBe(null); @@ -102,8 +101,8 @@ describe("EventTimeline", function() { }); it("setNeighbouringTimeline should set neighbour", function() { - const prev = {a: "a"}; - const next = {b: "b"}; + const prev = { a: "a" }; + const next = { b: "b" }; timeline.setNeighbouringTimeline(prev, EventTimeline.BACKWARDS); timeline.setNeighbouringTimeline(next, EventTimeline.FORWARDS); expect(timeline.getNeighbouringTimeline(EventTimeline.BACKWARDS)).toBe(prev); @@ -111,8 +110,8 @@ describe("EventTimeline", function() { }); it("setNeighbouringTimeline should throw if called twice", function() { - const prev = {a: "a"}; - const next = {b: "b"}; + const prev = { a: "a" }; + const next = { b: "b" }; expect(function() { timeline.setNeighbouringTimeline(prev, EventTimeline.BACKWARDS); }).not.toThrow(); @@ -278,7 +277,6 @@ describe("EventTimeline", function() { not.toHaveBeenCalled(); }); - it("should call setStateEvents on the right RoomState with the right " + "forwardLooking value for old events", function() { const events = [ diff --git a/spec/unit/event.spec.js b/spec/unit/event.spec.js index 9b88e7ce9..a28b9224f 100644 --- a/spec/unit/event.spec.js +++ b/spec/unit/event.spec.js @@ -15,8 +15,8 @@ See the License for the specific language governing permissions and limitations under the License. */ -import {logger} from "../../src/logger"; -import {MatrixEvent} from "../../src/models/event"; +import { logger } from "../../src/logger"; +import { MatrixEvent } from "../../src/models/event"; describe("MatrixEvent", () => { describe(".attemptDecryption", () => { diff --git a/spec/unit/filter-component.spec.js b/spec/unit/filter-component.spec.js index 9f43b15fe..49f1d5614 100644 --- a/spec/unit/filter-component.spec.js +++ b/spec/unit/filter-component.spec.js @@ -1,5 +1,5 @@ -import {FilterComponent} from "../../src/filter-component"; -import {mkEvent} from '../test-utils'; +import { FilterComponent } from "../../src/filter-component"; +import { mkEvent } from '../test-utils'; describe("Filter Component", function() { describe("types", function() { diff --git a/spec/unit/filter.spec.js b/spec/unit/filter.spec.js index 743296dd7..539df5c46 100644 --- a/spec/unit/filter.spec.js +++ b/spec/unit/filter.spec.js @@ -1,4 +1,4 @@ -import {Filter} from "../../src/filter"; +import { Filter } from "../../src/filter"; describe("Filter", function() { const filterId = "f1lt3ring15g00d4ursoul"; diff --git a/spec/unit/interactive-auth.spec.js b/spec/unit/interactive-auth.spec.js index 609d21eb9..da2bf1917 100644 --- a/spec/unit/interactive-auth.spec.js +++ b/spec/unit/interactive-auth.spec.js @@ -15,9 +15,9 @@ See the License for the specific language governing permissions and limitations under the License. */ -import {logger} from "../../src/logger"; -import {InteractiveAuth} from "../../src/interactive-auth"; -import {MatrixError} from "../../src/http-api"; +import { logger } from "../../src/logger"; +import { InteractiveAuth } from "../../src/interactive-auth"; +import { MatrixError } from "../../src/http-api"; // Trivial client object to test interactive auth // (we do not need TestClient here) @@ -63,7 +63,7 @@ describe("InteractiveAuth", function() { }); // .. which should trigger a call here - const requestRes = {"a": "b"}; + const requestRes = { "a": "b" }; doRequest.mockImplementation(function(authData) { logger.log('cccc'); expect(authData).toEqual({ @@ -112,7 +112,7 @@ describe("InteractiveAuth", function() { }); // .. which should be followed by a call to stateUpdated - const requestRes = {"a": "b"}; + const requestRes = { "a": "b" }; stateUpdated.mockImplementation(function(stage) { expect(stage).toEqual("logintype"); expect(ia.getSessionId()).toEqual("sessionId"); diff --git a/spec/unit/login.spec.js b/spec/unit/login.spec.js index 32d68f458..36dc45aa0 100644 --- a/spec/unit/login.spec.js +++ b/spec/unit/login.spec.js @@ -1,4 +1,4 @@ -import {TestClient} from '../TestClient'; +import { TestClient } from '../TestClient'; describe('Login request', function() { let client; diff --git a/spec/unit/matrix-client.spec.js b/spec/unit/matrix-client.spec.js index 3811c5b56..a7feb8103 100644 --- a/spec/unit/matrix-client.spec.js +++ b/spec/unit/matrix-client.spec.js @@ -1,6 +1,6 @@ -import {logger} from "../../src/logger"; -import {MatrixClient} from "../../src/client"; -import {Filter} from "../../src/filter"; +import { logger } from "../../src/logger"; +import { MatrixClient } from "../../src/client"; +import { Filter } from "../../src/filter"; jest.useFakeTimers(); @@ -178,7 +178,7 @@ describe("MatrixClient", function() { const filterId = "ehfewf"; store.getFilterIdByName.mockReturnValue(filterId); const filter = new Filter(0, filterId); - filter.setDefinition({"room": {"timeline": {"limit": 8}}}); + filter.setDefinition({ "room": { "timeline": { "limit": 8 } } }); store.getFilter.mockReturnValue(filter); const syncPromise = new Promise((resolve, reject) => { client.on("sync", function syncListener(state) { diff --git a/spec/unit/pushprocessor.spec.js b/spec/unit/pushprocessor.spec.js index c1258f74d..b625ade48 100644 --- a/spec/unit/pushprocessor.spec.js +++ b/spec/unit/pushprocessor.spec.js @@ -1,5 +1,5 @@ import * as utils from "../test-utils"; -import {PushProcessor} from "../../src/pushprocessor"; +import { PushProcessor } from "../../src/pushprocessor"; describe('NotificationService', function() { const testUserId = "@ali:matrix.org"; diff --git a/spec/unit/relations.spec.ts b/spec/unit/relations.spec.ts index 0e561c856..3be34f332 100644 --- a/spec/unit/relations.spec.ts +++ b/spec/unit/relations.spec.ts @@ -14,6 +14,7 @@ See the License for the specific language governing permissions and limitations under the License. */ +import { EventTimelineSet } from "../../src/models/event-timeline-set"; import { MatrixEvent } from "../../src/models/event"; import { Relations } from "../../src/models/relations"; @@ -70,4 +71,63 @@ describe("Relations", function() { expect(events.size).toEqual(1); } }); + + it("should emit created regardless of ordering", async function () { + const targetEvent = new MatrixEvent({ + "sender": "@bob:example.com", + "type": "m.room.message", + "event_id": "$2s4yYpEkVQrPglSCSqB_m6E8vDhWsg0yFNyOJdVIb_o", + "room_id": "!pzVjCQSoQPpXQeHpmK:example.com", + "content": {}, + }); + const relationEvent = new MatrixEvent({ + "sender": "@bob:example.com", + "type": "m.reaction", + "event_id": "$cZ1biX33ENJqIm00ks0W_hgiO_6CHrsAc3ZQrnLeNTw", + "room_id": "!pzVjCQSoQPpXQeHpmK:example.com", + "content": { + "m.relates_to": { + "event_id": "$2s4yYpEkVQrPglSCSqB_m6E8vDhWsg0yFNyOJdVIb_o", + "key": "👍️", + "rel_type": "m.annotation", + }, + }, + }); + + // Stub the room + const room = { + getPendingEvent() { return null; }, + getUnfilteredTimelineSet() { return null; }, + }; + + // Add the target event first, then the relation event + { + const relationsCreated = new Promise(resolve => { + targetEvent.once("Event.relationsCreated", resolve); + }) + + const timelineSet = new EventTimelineSet(room, { + unstableClientRelationAggregation: true, + }); + timelineSet.addLiveEvent(targetEvent); + timelineSet.addLiveEvent(relationEvent); + + await relationsCreated; + } + + // Add the relation event first, then the target event + { + const relationsCreated = new Promise(resolve => { + targetEvent.once("Event.relationsCreated", resolve); + }) + + const timelineSet = new EventTimelineSet(room, { + unstableClientRelationAggregation: true, + }); + timelineSet.addLiveEvent(relationEvent); + timelineSet.addLiveEvent(targetEvent); + + await relationsCreated; + } + }); }); diff --git a/spec/unit/room-member.spec.js b/spec/unit/room-member.spec.js index d902154c6..ef59d404a 100644 --- a/spec/unit/room-member.spec.js +++ b/spec/unit/room-member.spec.js @@ -1,5 +1,5 @@ import * as utils from "../test-utils"; -import {RoomMember} from "../../src/models/room-member"; +import { RoomMember } from "../../src/models/room-member"; describe("RoomMember", function() { const roomId = "!foo:bar"; diff --git a/spec/unit/room-state.spec.js b/spec/unit/room-state.spec.js index a950d63be..182f38d12 100644 --- a/spec/unit/room-state.spec.js +++ b/spec/unit/room-state.spec.js @@ -1,6 +1,6 @@ import * as utils from "../test-utils"; -import {RoomState} from "../../src/models/room-state"; -import {RoomMember} from "../../src/models/room-member"; +import { RoomState } from "../../src/models/room-state"; +import { RoomMember } from "../../src/models/room-member"; describe("RoomState", function() { const roomId = "!foo:bar"; @@ -471,13 +471,13 @@ describe("RoomState", function() { it("should update after adding joined member", function() { state.setStateEvents([ - utils.mkMembership({event: true, mship: "join", - user: userA, room: roomId}), + utils.mkMembership({ event: true, mship: "join", + user: userA, room: roomId }), ]); expect(state.getJoinedMemberCount()).toEqual(1); state.setStateEvents([ - utils.mkMembership({event: true, mship: "join", - user: userC, room: roomId}), + utils.mkMembership({ event: true, mship: "join", + user: userC, room: roomId }), ]); expect(state.getJoinedMemberCount()).toEqual(2); }); @@ -490,13 +490,13 @@ describe("RoomState", function() { it("should update after adding invited member", function() { state.setStateEvents([ - utils.mkMembership({event: true, mship: "invite", - user: userA, room: roomId}), + utils.mkMembership({ event: true, mship: "invite", + user: userA, room: roomId }), ]); expect(state.getInvitedMemberCount()).toEqual(1); state.setStateEvents([ - utils.mkMembership({event: true, mship: "invite", - user: userC, room: roomId}), + utils.mkMembership({ event: true, mship: "invite", + user: userC, room: roomId }), ]); expect(state.getInvitedMemberCount()).toEqual(2); }); @@ -509,15 +509,15 @@ describe("RoomState", function() { it("should, once used, override counting members from state", function() { state.setStateEvents([ - utils.mkMembership({event: true, mship: "join", - user: userA, room: roomId}), + utils.mkMembership({ event: true, mship: "join", + user: userA, room: roomId }), ]); expect(state.getJoinedMemberCount()).toEqual(1); state.setJoinedMemberCount(100); expect(state.getJoinedMemberCount()).toEqual(100); state.setStateEvents([ - utils.mkMembership({event: true, mship: "join", - user: userC, room: roomId}), + utils.mkMembership({ event: true, mship: "join", + user: userC, room: roomId }), ]); expect(state.getJoinedMemberCount()).toEqual(100); }); @@ -525,14 +525,14 @@ describe("RoomState", function() { it("should, once used, override counting members from state, " + "also after clone", function() { state.setStateEvents([ - utils.mkMembership({event: true, mship: "join", - user: userA, room: roomId}), + utils.mkMembership({ event: true, mship: "join", + user: userA, room: roomId }), ]); state.setJoinedMemberCount(100); const copy = state.clone(); copy.setStateEvents([ - utils.mkMembership({event: true, mship: "join", - user: userC, room: roomId}), + utils.mkMembership({ event: true, mship: "join", + user: userC, room: roomId }), ]); expect(state.getJoinedMemberCount()).toEqual(100); }); @@ -545,15 +545,15 @@ describe("RoomState", function() { it("should, once used, override counting members from state", function() { state.setStateEvents([ - utils.mkMembership({event: true, mship: "invite", - user: userB, room: roomId}), + utils.mkMembership({ event: true, mship: "invite", + user: userB, room: roomId }), ]); expect(state.getInvitedMemberCount()).toEqual(1); state.setInvitedMemberCount(100); expect(state.getInvitedMemberCount()).toEqual(100); state.setStateEvents([ - utils.mkMembership({event: true, mship: "invite", - user: userC, room: roomId}), + utils.mkMembership({ event: true, mship: "invite", + user: userC, room: roomId }), ]); expect(state.getInvitedMemberCount()).toEqual(100); }); @@ -561,14 +561,14 @@ describe("RoomState", function() { it("should, once used, override counting members from state, " + "also after clone", function() { state.setStateEvents([ - utils.mkMembership({event: true, mship: "invite", - user: userB, room: roomId}), + utils.mkMembership({ event: true, mship: "invite", + user: userB, room: roomId }), ]); state.setInvitedMemberCount(100); const copy = state.clone(); copy.setStateEvents([ - utils.mkMembership({event: true, mship: "invite", - user: userC, room: roomId}), + utils.mkMembership({ event: true, mship: "invite", + user: userC, room: roomId }), ]); expect(state.getInvitedMemberCount()).toEqual(100); }); diff --git a/spec/unit/room.spec.js b/spec/unit/room.spec.js index 85f72ab9e..e67fff56b 100644 --- a/spec/unit/room.spec.js +++ b/spec/unit/room.spec.js @@ -1,9 +1,9 @@ import * as utils from "../test-utils"; -import {EventStatus, MatrixEvent} from "../../src/models/event"; -import {EventTimeline} from "../../src/models/event-timeline"; -import {RoomState} from "../../src/models/room-state"; -import {Room} from "../../src/models/room"; -import {TestClient} from "../TestClient"; +import { EventStatus, MatrixEvent } from "../../src/models/event"; +import { EventTimeline } from "../../src/models/event-timeline"; +import { RoomState } from "../../src/models/room-state"; +import { Room } from "../../src/models/room"; +import { TestClient } from "../TestClient"; describe("Room", function() { const roomId = "!foo:bar"; @@ -191,7 +191,7 @@ describe("Room", function() { const remoteEvent = utils.mkMessage({ room: roomId, user: userA, event: true, }); - remoteEvent.event.unsigned = {transaction_id: "TXN_ID"}; + remoteEvent.event.unsigned = { transaction_id: "TXN_ID" }; const remoteEventId = remoteEvent.getId(); let callCount = 0; @@ -375,7 +375,7 @@ describe("Room", function() { let events = null; beforeEach(function() { - room = new Room(roomId, null, null, {timelineSupport: timelineSupport}); + room = new Room(roomId, null, null, { timelineSupport: timelineSupport }); // set events each time to avoid resusing Event objects (which // doesn't work because they get frozen) events = [ @@ -457,7 +457,7 @@ describe("Room", function() { describe("compareEventOrdering", function() { beforeEach(function() { - room = new Room(roomId, null, null, {timelineSupport: true}); + room = new Room(roomId, null, null, { timelineSupport: true }); }); const events = [ @@ -713,7 +713,7 @@ describe("Room", function() { it("uses hero name from state", function() { const name = "Mr B"; addMember(userA, "invite"); - addMember(userB, "join", {name}); + addMember(userB, "join", { name }); room.setSummary({ "m.heroes": [userB], }); @@ -724,7 +724,7 @@ describe("Room", function() { it("uses counts from summary", function() { const name = "Mr B"; - addMember(userB, "join", {name}); + addMember(userB, "join", { name }); room.setSummary({ "m.heroes": [userB], "m.joined_member_count": 50, @@ -737,8 +737,8 @@ describe("Room", function() { it("relies on heroes in case of absent counts", function() { const nameB = "Mr Bean"; const nameC = "Mel C"; - addMember(userB, "join", {name: nameB}); - addMember(userC, "join", {name: nameC}); + addMember(userB, "join", { name: nameB }); + addMember(userC, "join", { name: nameC }); room.setSummary({ "m.heroes": [userB, userC], }); @@ -748,7 +748,7 @@ describe("Room", function() { it("uses only heroes", function() { const nameB = "Mr Bean"; - addMember(userB, "join", {name: nameB}); + addMember(userB, "join", { name: nameB }); addMember(userC, "join"); room.setSummary({ "m.heroes": [userB], @@ -841,7 +841,7 @@ describe("Room", function() { it("should show the other user's name for private" + " (invite join_rules) rooms if you are invited to it.", function() { setJoinRule("invite"); - addMember(userA, "invite", {user: userB}); + addMember(userA, "invite", { user: userB }); addMember(userB); room.recalculate(); const name = room.name; @@ -916,8 +916,8 @@ describe("Room", function() { "available", function() { setJoinRule("invite"); - addMember(userB, 'join', {name: "Alice"}); - addMember(userA, "invite", {user: userA}); + addMember(userB, 'join', { name: "Alice" }); + addMember(userA, "invite", { user: userA }); room.recalculate(); const name = room.name; expect(name).toEqual("Alice"); @@ -927,7 +927,7 @@ describe("Room", function() { function() { setJoinRule("invite"); addMember(userB); - addMember(userA, "invite", {user: userA}); + addMember(userA, "invite", { user: userA }); room.recalculate(); const name = room.name; expect(name).toEqual(userB); @@ -1267,7 +1267,6 @@ describe("Room", function() { expect(callCount).toEqual(1); }); - it("should remove cancelled events from the timeline", function() { const room = new Room(roomId, null, userA); const eventA = utils.mkMessage({ @@ -1321,7 +1320,7 @@ describe("Room", function() { if (this.serverResponse instanceof Error) { return Promise.reject(this.serverResponse); } else { - return Promise.resolve({chunk: this.serverResponse}); + return Promise.resolve({ chunk: this.serverResponse }); } }, }, @@ -1351,7 +1350,7 @@ describe("Room", function() { it("should load members from server on first call", async function() { const client = createClientMock([memberEvent]); - const room = new Room(roomId, client, null, {lazyLoadMembers: true}); + const room = new Room(roomId, client, null, { lazyLoadMembers: true }); await room.loadMembersIfNeeded(); const memberA = room.getMember("@user_a:bar"); expect(memberA.name).toEqual("User A"); @@ -1366,7 +1365,7 @@ describe("Room", function() { room: roomId, event: true, name: "Ms A", }); const client = createClientMock([memberEvent2], [memberEvent]); - const room = new Room(roomId, client, null, {lazyLoadMembers: true}); + const room = new Room(roomId, client, null, { lazyLoadMembers: true }); await room.loadMembersIfNeeded(); @@ -1376,7 +1375,7 @@ describe("Room", function() { it("should allow retry on error", async function() { const client = createClientMock(new Error("server says no")); - const room = new Room(roomId, client, null, {lazyLoadMembers: true}); + const room = new Room(roomId, client, null, { lazyLoadMembers: true }); let hasThrown = false; try { await room.loadMembersIfNeeded(); @@ -1404,17 +1403,17 @@ describe("Room", function() { const room = new Room(roomId, null, userA); const events = []; room.on("Room.myMembership", (_room, membership, oldMembership) => { - events.push({membership, oldMembership}); + events.push({ membership, oldMembership }); }); room.updateMyMembership("invite"); expect(room.getMyMembership()).toEqual("invite"); - expect(events[0]).toEqual({membership: "invite", oldMembership: null}); + expect(events[0]).toEqual({ membership: "invite", oldMembership: null }); events.splice(0); //clear room.updateMyMembership("invite"); expect(events.length).toEqual(0); room.updateMyMembership("join"); expect(room.getMyMembership()).toEqual("join"); - expect(events[0]).toEqual({membership: "join", oldMembership: "invite"}); + expect(events[0]).toEqual({ membership: "join", oldMembership: "invite" }); }); }); @@ -1422,7 +1421,7 @@ describe("Room", function() { it("should return first hero id", function() { const room = new Room(roomId, null, userA); - room.setSummary({'m.heroes': [userB]}); + room.setSummary({ 'm.heroes': [userB] }); expect(room.guessDMUserId()).toEqual(userB); }); it("should return first member that isn't self", diff --git a/spec/unit/scheduler.spec.js b/spec/unit/scheduler.spec.js index b4e83c4ef..daa752ac8 100644 --- a/spec/unit/scheduler.spec.js +++ b/spec/unit/scheduler.spec.js @@ -1,9 +1,9 @@ // This file had a function whose name is all caps, which displeases eslint /* eslint new-cap: "off" */ -import {defer} from '../../src/utils'; -import {MatrixError} from "../../src/http-api"; -import {MatrixScheduler} from "../../src/scheduler"; +import { defer } from '../../src/utils'; +import { MatrixError } from "../../src/http-api"; +import { MatrixScheduler } from "../../src/scheduler"; import * as utils from "../test-utils"; jest.useFakeTimers(); @@ -62,8 +62,8 @@ describe("MatrixScheduler", function() { scheduler.queueEvent(eventA), scheduler.queueEvent(eventB), ]); - deferB.resolve({b: true}); - deferA.resolve({a: true}); + deferB.resolve({ b: true }); + deferA.resolve({ a: true }); const [a, b] = await abPromise; expect(a.a).toEqual(true); expect(b.b).toEqual(true); @@ -156,8 +156,8 @@ describe("MatrixScheduler", function() { // Expect to have processFn invoked for A&B. // Resolve A. // Expect to have processFn invoked for D. - const eventC = utils.mkMessage({user: "@a:bar", room: roomId, event: true}); - const eventD = utils.mkMessage({user: "@b:bar", room: roomId, event: true}); + const eventC = utils.mkMessage({ user: "@a:bar", room: roomId, event: true }); + const eventD = utils.mkMessage({ user: "@b:bar", room: roomId, event: true }); const buckets = {}; buckets[eventA.getId()] = "queue_A"; @@ -241,7 +241,7 @@ describe("MatrixScheduler", function() { expect(queue).toEqual([eventA, eventB]); // modify the queue const eventC = utils.mkMessage( - {user: "@a:bar", room: roomId, event: true}, + { user: "@a:bar", room: roomId, event: true }, ); queue.push(eventC); const queueAgain = scheduler.getQueueForEvent(eventA); diff --git a/spec/unit/sync-accumulator.spec.js b/spec/unit/sync-accumulator.spec.js index b9f4ecbc2..b089e0ceb 100644 --- a/spec/unit/sync-accumulator.spec.js +++ b/spec/unit/sync-accumulator.spec.js @@ -15,7 +15,7 @@ See the License for the specific language governing permissions and limitations under the License. */ -import {SyncAccumulator} from "../../src/sync-accumulator"; +import { SyncAccumulator } from "../../src/sync-accumulator"; // The event body & unsigned object get frozen to assert that they don't get altered // by the impl diff --git a/spec/unit/timeline-window.spec.js b/spec/unit/timeline-window.spec.js index af873cc3d..2a8be36d6 100644 --- a/spec/unit/timeline-window.spec.js +++ b/spec/unit/timeline-window.spec.js @@ -1,5 +1,5 @@ -import {EventTimeline} from "../../src/models/event-timeline"; -import {TimelineIndex, TimelineWindow} from "../../src/timeline-window"; +import { EventTimeline } from "../../src/models/event-timeline"; +import { TimelineIndex, TimelineWindow } from "../../src/timeline-window"; import * as utils from "../test-utils"; const ROOM_ID = "roomId"; @@ -18,7 +18,7 @@ function createTimeline(numEvents, baseIndex) { } // XXX: this is a horrid hack - const timelineSet = { room: { roomId: ROOM_ID }}; + const timelineSet = { room: { roomId: ROOM_ID } }; timelineSet.room.getUnfilteredTimelineSet = function() { return timelineSet; }; @@ -46,7 +46,6 @@ function addEventsToTimeline(timeline, numEvents, atStart) { } } - /* * create a pair of linked timelines */ @@ -58,7 +57,6 @@ function createLinkedTimelines() { return [tl1, tl2]; } - describe("TimelineIndex", function() { describe("minIndex", function() { it("should return the min index relative to BaseIndex", function() { @@ -133,7 +131,6 @@ describe("TimelineIndex", function() { }); }); - describe("TimelineWindow", function() { /** * create a dummy eventTimelineSet and client, and a TimelineWindow @@ -142,7 +139,7 @@ describe("TimelineWindow", function() { let timelineSet; let client; function createWindow(timeline, opts) { - timelineSet = {getTimelineForEvent: () => null}; + timelineSet = { getTimelineForEvent: () => null }; client = {}; client.getEventTimeline = function(timelineSet0, eventId0) { expect(timelineSet0).toBe(timelineSet); @@ -171,7 +168,7 @@ describe("TimelineWindow", function() { const timeline = createTimeline(); const eventId = timeline.getEvents()[1].getId(); - const timelineSet = {getTimelineForEvent: () => null}; + const timelineSet = { getTimelineForEvent: () => null }; const client = {}; client.getEventTimeline = function(timelineSet0, eventId0) { expect(timelineSet0).toBe(timelineSet); @@ -193,7 +190,7 @@ describe("TimelineWindow", function() { const eventId = timeline.getEvents()[1].getId(); - const timelineSet = {getTimelineForEvent: () => null}; + const timelineSet = { getTimelineForEvent: () => null }; const client = {}; const timelineWindow = new TimelineWindow(client, timelineSet); @@ -266,7 +263,7 @@ describe("TimelineWindow", function() { it("should advance into next timeline", function() { const tls = createLinkedTimelines(); const eventId = tls[0].getEvents()[1].getId(); - const timelineWindow = createWindow(tls[0], {windowLimit: 5}); + const timelineWindow = createWindow(tls[0], { windowLimit: 5 }); return timelineWindow.load(eventId, 3).then(function() { const expectedEvents = tls[0].getEvents(); @@ -311,7 +308,7 @@ describe("TimelineWindow", function() { it("should retreat into previous timeline", function() { const tls = createLinkedTimelines(); const eventId = tls[1].getEvents()[1].getId(); - const timelineWindow = createWindow(tls[1], {windowLimit: 5}); + const timelineWindow = createWindow(tls[1], { windowLimit: 5 }); return timelineWindow.load(eventId, 3).then(function() { const expectedEvents = tls[1].getEvents(); @@ -357,7 +354,7 @@ describe("TimelineWindow", function() { const timeline = createTimeline(); timeline.setPaginationToken("toktok", EventTimeline.FORWARDS); - const timelineWindow = createWindow(timeline, {windowLimit: 5}); + const timelineWindow = createWindow(timeline, { windowLimit: 5 }); const eventId = timeline.getEvents()[1].getId(); client.paginateEventTimeline = function(timeline0, opts) { @@ -385,12 +382,11 @@ describe("TimelineWindow", function() { }); }); - it("should make backward pagination requests", function() { const timeline = createTimeline(); timeline.setPaginationToken("toktok", EventTimeline.BACKWARDS); - const timelineWindow = createWindow(timeline, {windowLimit: 5}); + const timelineWindow = createWindow(timeline, { windowLimit: 5 }); const eventId = timeline.getEvents()[1].getId(); client.paginateEventTimeline = function(timeline0, opts) { @@ -422,7 +418,7 @@ describe("TimelineWindow", function() { const timeline = createTimeline(); timeline.setPaginationToken("toktok", EventTimeline.FORWARDS); - const timelineWindow = createWindow(timeline, {windowLimit: 5}); + const timelineWindow = createWindow(timeline, { windowLimit: 5 }); const eventId = timeline.getEvents()[1].getId(); let paginateCount = 0; diff --git a/spec/unit/user.spec.js b/spec/unit/user.spec.js index adef6e3c1..caf83db87 100644 --- a/spec/unit/user.spec.js +++ b/spec/unit/user.spec.js @@ -1,4 +1,4 @@ -import {User} from "../../src/models/user"; +import { User } from "../../src/models/user"; import * as utils from "../test-utils"; describe("User", function() { diff --git a/spec/unit/utils.spec.js b/spec/unit/utils.spec.js index d44376112..703326f46 100644 --- a/spec/unit/utils.spec.js +++ b/spec/unit/utils.spec.js @@ -140,19 +140,19 @@ describe("utils", function() { it("should handle simple objects", function() { assert.isTrue(utils.deepCompare({}, {})); - assert.isTrue(utils.deepCompare({a: 1, b: 2}, {a: 1, b: 2})); - assert.isTrue(utils.deepCompare({a: 1, b: 2}, {b: 2, a: 1})); - assert.isFalse(utils.deepCompare({a: 1, b: 2}, {a: 1, b: 3})); + assert.isTrue(utils.deepCompare({ a: 1, b: 2 }, { a: 1, b: 2 })); + assert.isTrue(utils.deepCompare({ a: 1, b: 2 }, { b: 2, a: 1 })); + assert.isFalse(utils.deepCompare({ a: 1, b: 2 }, { a: 1, b: 3 })); - assert.isTrue(utils.deepCompare({1: {name: "mhc", age: 28}, - 2: {name: "arb", age: 26}}, - {1: {name: "mhc", age: 28}, - 2: {name: "arb", age: 26}})); + assert.isTrue(utils.deepCompare({ 1: { name: "mhc", age: 28 }, + 2: { name: "arb", age: 26 } }, + { 1: { name: "mhc", age: 28 }, + 2: { name: "arb", age: 26 } })); - assert.isFalse(utils.deepCompare({1: {name: "mhc", age: 28}, - 2: {name: "arb", age: 26}}, - {1: {name: "mhc", age: 28}, - 2: {name: "arb", age: 27}})); + assert.isFalse(utils.deepCompare({ 1: { name: "mhc", age: 28 }, + 2: { name: "arb", age: 26 } }, + { 1: { name: "mhc", age: 28 }, + 2: { name: "arb", age: 27 } })); assert.isFalse(utils.deepCompare({}, null)); assert.isFalse(utils.deepCompare({}, undefined)); @@ -175,7 +175,6 @@ describe("utils", function() { }); }); - describe("extend", function() { const SOURCE = { "prop2": 1, "string2": "x", "newprop": "new" }; diff --git a/src/@types/global.d.ts b/src/@types/global.d.ts index dd437247a..337768428 100644 --- a/src/@types/global.d.ts +++ b/src/@types/global.d.ts @@ -15,7 +15,7 @@ limitations under the License. */ // this is needed to tell TS about global.Olm -import * as Olm from "olm"; // eslint-disable-line @typescript-eslint/no-unused-vars +import * as Olm from "@matrix-org/olm"; // eslint-disable-line @typescript-eslint/no-unused-vars export {}; diff --git a/src/autodiscovery.js b/src/autodiscovery.js index 98df1962f..1ccbbaa86 100644 --- a/src/autodiscovery.js +++ b/src/autodiscovery.js @@ -17,8 +17,8 @@ limitations under the License. /** @module auto-discovery */ -import {logger} from './logger'; -import {URL as NodeURL} from "url"; +import { logger } from './logger'; +import { URL as NodeURL } from "url"; // Dev note: Auto discovery is part of the spec. // See: https://matrix.org/docs/spec/client_server/r0.4.0.html#server-discovery @@ -511,12 +511,12 @@ export class AutoDiscovery { action = "IGNORE"; reason = AutoDiscovery.ERROR_MISSING_WELLKNOWN; } - resolve({raw: {}, action: action, reason: reason, error: err}); + resolve({ raw: {}, action: action, reason: reason, error: err }); return; } try { - resolve({raw: JSON.parse(body), action: "SUCCESS"}); + resolve({ raw: JSON.parse(body), action: "SUCCESS" }); } catch (e) { let reason = AutoDiscovery.ERROR_INVALID; if (e.name === "SyntaxError") { diff --git a/src/base-apis.js b/src/base-apis.js index 1bdfb1f7e..de661eb16 100644 --- a/src/base-apis.js +++ b/src/base-apis.js @@ -24,11 +24,11 @@ limitations under the License. * @module base-apis */ -import {SERVICE_TYPES} from './service-types'; -import {logger} from './logger'; -import {PushProcessor} from "./pushprocessor"; +import { SERVICE_TYPES } from './service-types'; +import { logger } from './logger'; +import { PushProcessor } from "./pushprocessor"; import * as utils from "./utils"; -import {MatrixHttpApi, PREFIX_IDENTITY_V2, PREFIX_R0, PREFIX_UNSTABLE} from "./http-api"; +import { MatrixHttpApi, PREFIX_IDENTITY_V2, PREFIX_R0, PREFIX_UNSTABLE } from "./http-api"; function termsUrlForService(serviceType, baseUrl) { switch (serviceType) { @@ -158,7 +158,6 @@ MatrixBaseApis.prototype.makeTxnId = function() { return "m" + new Date().getTime() + "." + (this._txnCtr++); }; - // Registration/Login operations // ============================= @@ -197,7 +196,7 @@ MatrixBaseApis.prototype.register = function( ) { // backwards compat if (bindThreepids === true) { - bindThreepids = {email: true}; + bindThreepids = { email: true }; } else if (bindThreepids === null || bindThreepids === undefined) { bindThreepids = {}; } @@ -401,7 +400,6 @@ MatrixBaseApis.prototype.loginWithToken = function(token, callback) { }, callback); }; - /** * Logs out the current session. * Obviously, further calls that require authorisation should fail after this @@ -547,7 +545,7 @@ MatrixBaseApis.prototype.fetchRelations = * @return {module:http-api.MatrixError} Rejects: with an error response. */ MatrixBaseApis.prototype.roomState = function(roomId, callback) { - const path = utils.encodeUri("/rooms/$roomId/state", {$roomId: roomId}); + const path = utils.encodeUri("/rooms/$roomId/state", { $roomId: roomId }); return this._http.authedRequest(callback, "GET", path); }; @@ -595,7 +593,7 @@ function(roomId, includeMembership, excludeMembership, atEventId, callback) { const queryString = utils.encodeParams(queryParams); const path = utils.encodeUri("/rooms/$roomId/members?" + queryString, - {$roomId: roomId}); + { $roomId: roomId }); return this._http.authedRequest(callback, "GET", path); }; @@ -607,20 +605,19 @@ function(roomId, includeMembership, excludeMembership, atEventId, callback) { * @return {module:http-api.MatrixError} Rejects: with an error response. */ MatrixBaseApis.prototype.upgradeRoom = function(roomId, newVersion) { - const path = utils.encodeUri("/rooms/$roomId/upgrade", {$roomId: roomId}); + const path = utils.encodeUri("/rooms/$roomId/upgrade", { $roomId: roomId }); return this._http.authedRequest( - undefined, "POST", path, undefined, {new_version: newVersion}, + undefined, "POST", path, undefined, { new_version: newVersion }, ); }; - /** * @param {string} groupId * @return {Promise} Resolves: Group summary object * @return {module:http-api.MatrixError} Rejects: with an error response. */ MatrixBaseApis.prototype.getGroupSummary = function(groupId) { - const path = utils.encodeUri("/groups/$groupId/summary", {$groupId: groupId}); + const path = utils.encodeUri("/groups/$groupId/summary", { $groupId: groupId }); return this._http.authedRequest(undefined, "GET", path); }; @@ -630,7 +627,7 @@ MatrixBaseApis.prototype.getGroupSummary = function(groupId) { * @return {module:http-api.MatrixError} Rejects: with an error response. */ MatrixBaseApis.prototype.getGroupProfile = function(groupId) { - const path = utils.encodeUri("/groups/$groupId/profile", {$groupId: groupId}); + const path = utils.encodeUri("/groups/$groupId/profile", { $groupId: groupId }); return this._http.authedRequest(undefined, "GET", path); }; @@ -645,7 +642,7 @@ MatrixBaseApis.prototype.getGroupProfile = function(groupId) { * @return {module:http-api.MatrixError} Rejects: with an error response. */ MatrixBaseApis.prototype.setGroupProfile = function(groupId, profile) { - const path = utils.encodeUri("/groups/$groupId/profile", {$groupId: groupId}); + const path = utils.encodeUri("/groups/$groupId/profile", { $groupId: groupId }); return this._http.authedRequest( undefined, "POST", path, undefined, profile, ); @@ -663,7 +660,7 @@ MatrixBaseApis.prototype.setGroupProfile = function(groupId, profile) { MatrixBaseApis.prototype.setGroupJoinPolicy = function(groupId, policy) { const path = utils.encodeUri( "/groups/$groupId/settings/m.join_policy", - {$groupId: groupId}, + { $groupId: groupId }, ); return this._http.authedRequest( undefined, "PUT", path, undefined, { @@ -678,7 +675,7 @@ MatrixBaseApis.prototype.setGroupJoinPolicy = function(groupId, policy) { * @return {module:http-api.MatrixError} Rejects: with an error response. */ MatrixBaseApis.prototype.getGroupUsers = function(groupId) { - const path = utils.encodeUri("/groups/$groupId/users", {$groupId: groupId}); + const path = utils.encodeUri("/groups/$groupId/users", { $groupId: groupId }); return this._http.authedRequest(undefined, "GET", path); }; @@ -688,7 +685,7 @@ MatrixBaseApis.prototype.getGroupUsers = function(groupId) { * @return {module:http-api.MatrixError} Rejects: with an error response. */ MatrixBaseApis.prototype.getGroupInvitedUsers = function(groupId) { - const path = utils.encodeUri("/groups/$groupId/invited_users", {$groupId: groupId}); + const path = utils.encodeUri("/groups/$groupId/invited_users", { $groupId: groupId }); return this._http.authedRequest(undefined, "GET", path); }; @@ -698,7 +695,7 @@ MatrixBaseApis.prototype.getGroupInvitedUsers = function(groupId) { * @return {module:http-api.MatrixError} Rejects: with an error response. */ MatrixBaseApis.prototype.getGroupRooms = function(groupId) { - const path = utils.encodeUri("/groups/$groupId/rooms", {$groupId: groupId}); + const path = utils.encodeUri("/groups/$groupId/rooms", { $groupId: groupId }); return this._http.authedRequest(undefined, "GET", path); }; @@ -711,7 +708,7 @@ MatrixBaseApis.prototype.getGroupRooms = function(groupId) { MatrixBaseApis.prototype.inviteUserToGroup = function(groupId, userId) { const path = utils.encodeUri( "/groups/$groupId/admin/users/invite/$userId", - {$groupId: groupId, $userId: userId}, + { $groupId: groupId, $userId: userId }, ); return this._http.authedRequest(undefined, "PUT", path, undefined, {}); }; @@ -725,7 +722,7 @@ MatrixBaseApis.prototype.inviteUserToGroup = function(groupId, userId) { MatrixBaseApis.prototype.removeUserFromGroup = function(groupId, userId) { const path = utils.encodeUri( "/groups/$groupId/admin/users/remove/$userId", - {$groupId: groupId, $userId: userId}, + { $groupId: groupId, $userId: userId }, ); return this._http.authedRequest(undefined, "PUT", path, undefined, {}); }; @@ -742,7 +739,7 @@ MatrixBaseApis.prototype.addUserToGroupSummary = function(groupId, userId, roleI roleId ? "/groups/$groupId/summary/$roleId/users/$userId" : "/groups/$groupId/summary/users/$userId", - {$groupId: groupId, $roleId: roleId, $userId: userId}, + { $groupId: groupId, $roleId: roleId, $userId: userId }, ); return this._http.authedRequest(undefined, "PUT", path, undefined, {}); }; @@ -756,7 +753,7 @@ MatrixBaseApis.prototype.addUserToGroupSummary = function(groupId, userId, roleI MatrixBaseApis.prototype.removeUserFromGroupSummary = function(groupId, userId) { const path = utils.encodeUri( "/groups/$groupId/summary/users/$userId", - {$groupId: groupId, $userId: userId}, + { $groupId: groupId, $userId: userId }, ); return this._http.authedRequest(undefined, "DELETE", path, undefined, {}); }; @@ -773,7 +770,7 @@ MatrixBaseApis.prototype.addRoomToGroupSummary = function(groupId, roomId, categ categoryId ? "/groups/$groupId/summary/$categoryId/rooms/$roomId" : "/groups/$groupId/summary/rooms/$roomId", - {$groupId: groupId, $categoryId: categoryId, $roomId: roomId}, + { $groupId: groupId, $categoryId: categoryId, $roomId: roomId }, ); return this._http.authedRequest(undefined, "PUT", path, undefined, {}); }; @@ -787,7 +784,7 @@ MatrixBaseApis.prototype.addRoomToGroupSummary = function(groupId, roomId, categ MatrixBaseApis.prototype.removeRoomFromGroupSummary = function(groupId, roomId) { const path = utils.encodeUri( "/groups/$groupId/summary/rooms/$roomId", - {$groupId: groupId, $roomId: roomId}, + { $groupId: groupId, $roomId: roomId }, ); return this._http.authedRequest(undefined, "DELETE", path, undefined, {}); }; @@ -805,7 +802,7 @@ MatrixBaseApis.prototype.addRoomToGroup = function(groupId, roomId, isPublic) { } const path = utils.encodeUri( "/groups/$groupId/admin/rooms/$roomId", - {$groupId: groupId, $roomId: roomId}, + { $groupId: groupId, $roomId: roomId }, ); return this._http.authedRequest(undefined, "PUT", path, undefined, { "m.visibility": { type: isPublic ? "public" : "private" } }, @@ -827,7 +824,7 @@ MatrixBaseApis.prototype.updateGroupRoomVisibility = function(groupId, roomId, i const path = utils.encodeUri( "/groups/$groupId/admin/rooms/$roomId/config/m.visibility", - {$groupId: groupId, $roomId: roomId}, + { $groupId: groupId, $roomId: roomId }, ); return this._http.authedRequest(undefined, "PUT", path, undefined, { type: isPublic ? "public" : "private" }, @@ -843,7 +840,7 @@ MatrixBaseApis.prototype.updateGroupRoomVisibility = function(groupId, roomId, i MatrixBaseApis.prototype.removeRoomFromGroup = function(groupId, roomId) { const path = utils.encodeUri( "/groups/$groupId/admin/rooms/$roomId", - {$groupId: groupId, $roomId: roomId}, + { $groupId: groupId, $roomId: roomId }, ); return this._http.authedRequest(undefined, "DELETE", path, undefined, {}); }; @@ -857,7 +854,7 @@ MatrixBaseApis.prototype.removeRoomFromGroup = function(groupId, roomId) { MatrixBaseApis.prototype.acceptGroupInvite = function(groupId, opts = null) { const path = utils.encodeUri( "/groups/$groupId/self/accept_invite", - {$groupId: groupId}, + { $groupId: groupId }, ); return this._http.authedRequest(undefined, "PUT", path, undefined, opts || {}); }; @@ -870,7 +867,7 @@ MatrixBaseApis.prototype.acceptGroupInvite = function(groupId, opts = null) { MatrixBaseApis.prototype.joinGroup = function(groupId) { const path = utils.encodeUri( "/groups/$groupId/self/join", - {$groupId: groupId}, + { $groupId: groupId }, ); return this._http.authedRequest(undefined, "PUT", path, undefined, {}); }; @@ -883,7 +880,7 @@ MatrixBaseApis.prototype.joinGroup = function(groupId) { MatrixBaseApis.prototype.leaveGroup = function(groupId) { const path = utils.encodeUri( "/groups/$groupId/self/leave", - {$groupId: groupId}, + { $groupId: groupId }, ); return this._http.authedRequest(undefined, "PUT", path, undefined, {}); }; @@ -940,7 +937,7 @@ MatrixBaseApis.prototype.getPublicisedGroups = function(userIds) { MatrixBaseApis.prototype.setGroupPublicity = function(groupId, isPublic) { const path = utils.encodeUri( "/groups/$groupId/self/update_publicity", - {$groupId: groupId}, + { $groupId: groupId }, ); return this._http.authedRequest(undefined, "PUT", path, undefined, { publicise: isPublic, @@ -1008,7 +1005,7 @@ MatrixBaseApis.prototype.roomInitialSync = function(roomId, limit, callback) { callback = limit; limit = undefined; } const path = utils.encodeUri("/rooms/$roomId/initialSync", - {$roomId: roomId}, + { $roomId: roomId }, ); if (!limit) { limit = 30; @@ -1159,7 +1156,7 @@ MatrixBaseApis.prototype.deleteAlias = function(alias, callback) { MatrixBaseApis.prototype.unstableGetLocalAliases = function(roomId, callback) { const path = utils.encodeUri("/rooms/$roomId/aliases", - {$roomId: roomId}); + { $roomId: roomId }); const prefix = PREFIX_UNSTABLE + "/org.matrix.msc2432"; return this._http.authedRequest(callback, "GET", path, null, null, { prefix }); @@ -1190,7 +1187,7 @@ MatrixBaseApis.prototype.getRoomIdForAlias = function(alias, callback) { */ MatrixBaseApis.prototype.resolveRoomAlias = function(roomAlias, callback) { // TODO: deprecate this or getRoomIdForAlias - const path = utils.encodeUri("/directory/room/$alias", {$alias: roomAlias}); + const path = utils.encodeUri("/directory/room/$alias", { $alias: roomAlias }); return this._http.request(callback, "GET", path); }; @@ -1278,7 +1275,6 @@ MatrixBaseApis.prototype.searchUserDirectory = function(opts) { ); }; - // Media operations // ================ @@ -1347,7 +1343,6 @@ MatrixBaseApis.prototype.getCurrentUploads = function() { return this._http.getCurrentUploads(); }; - // Profile operations // ================== @@ -1372,7 +1367,6 @@ MatrixBaseApis.prototype.getProfileInfo = function(userId, info, callback) { return this._http.authedRequest(callback, "GET", path); }; - // Account operations // ================== @@ -1518,7 +1512,6 @@ MatrixBaseApis.prototype.setPassword = function(authDict, newPassword, callback) ); }; - // Device operations // ================= @@ -1595,7 +1588,7 @@ MatrixBaseApis.prototype.deleteDevice = function(device_id, auth) { * @return {module:http-api.MatrixError} Rejects: with an error response. */ MatrixBaseApis.prototype.deleteMultipleDevices = function(devices, auth) { - const body = {devices}; + const body = { devices }; if (auth) { body.auth = auth; @@ -1605,7 +1598,6 @@ MatrixBaseApis.prototype.deleteMultipleDevices = function(devices, auth) { return this._http.authedRequest(undefined, "POST", path, undefined, body); }; - // Push operations // =============== @@ -1703,7 +1695,7 @@ MatrixBaseApis.prototype.setPushRuleEnabled = function(scope, kind, $ruleId: ruleId, }); return this._http.authedRequest( - callback, "PUT", path, undefined, {"enabled": enabled}, + callback, "PUT", path, undefined, { "enabled": enabled }, ); }; @@ -1724,11 +1716,10 @@ MatrixBaseApis.prototype.setPushRuleActions = function(scope, kind, $ruleId: ruleId, }); return this._http.authedRequest( - callback, "PUT", path, undefined, {"actions": actions}, + callback, "PUT", path, undefined, { "actions": actions }, ); }; - // Search // ====== @@ -1842,7 +1833,7 @@ MatrixBaseApis.prototype.claimOneTimeKeys = function(devices, key_algorithm, tim queries[userId] = query; query[deviceId] = key_algorithm; } - const content = {one_time_keys: queries}; + const content = { one_time_keys: queries }; if (timeout) { content.timeout = timeout; } @@ -1872,7 +1863,7 @@ MatrixBaseApis.prototype.getKeyChanges = function(oldToken, newToken) { MatrixBaseApis.prototype.uploadDeviceSigningKeys = function(auth, keys) { const data = Object.assign({}, keys); - if (auth) Object.assign(data, {auth}); + if (auth) Object.assign(data, { auth }); return this._http.authedRequest( undefined, "POST", "/keys/device_signing/upload", undefined, data, { prefix: PREFIX_UNSTABLE, @@ -2166,7 +2157,7 @@ MatrixBaseApis.prototype.identityHashedLookup = async function( throw new Error("Identity server returned more results than expected"); } - foundAddresses.push({address: plainAddress, mxid}); + foundAddresses.push({ address: plainAddress, mxid }); } return foundAddresses; }; @@ -2257,7 +2248,7 @@ MatrixBaseApis.prototype.bulkLookupThreePids = async function( ]); } - return {threepids: v1results}; + return { threepids: v1results }; }; /** @@ -2401,7 +2392,7 @@ MatrixBaseApis.prototype.reportEvent = function(roomId, eventId, score, reason) $eventId: eventId, }); - return this._http.authedRequest(undefined, "POST", path, null, {score, reason}); + return this._http.authedRequest(undefined, "POST", path, null, { score, reason }); }; /** diff --git a/src/client.js b/src/client.js index f1074f5b9..cb60705ef 100644 --- a/src/client.js +++ b/src/client.js @@ -17,46 +17,45 @@ See the License for the specific language governing permissions and limitations under the License. */ - /** * This is an internal module. See {@link MatrixClient} for the public class. * @module client */ import url from "url"; -import {EventEmitter} from "events"; -import {MatrixBaseApis} from "./base-apis"; -import {Filter} from "./filter"; -import {SyncApi} from "./sync"; -import {EventStatus, MatrixEvent} from "./models/event"; -import {EventTimeline} from "./models/event-timeline"; -import {SearchResult} from "./models/search-result"; -import {StubStore} from "./store/stub"; -import {createNewMatrixCall} from "./webrtc/call"; -import {CallEventHandler} from './webrtc/callEventHandler'; +import { EventEmitter } from "events"; +import { MatrixBaseApis } from "./base-apis"; +import { Filter } from "./filter"; +import { SyncApi } from "./sync"; +import { EventStatus, MatrixEvent } from "./models/event"; +import { EventTimeline } from "./models/event-timeline"; +import { SearchResult } from "./models/search-result"; +import { StubStore } from "./store/stub"; +import { createNewMatrixCall } from "./webrtc/call"; +import { CallEventHandler } from './webrtc/callEventHandler'; import * as utils from './utils'; -import {sleep} from './utils'; +import { sleep } from './utils'; import { MatrixError, PREFIX_MEDIA_R0, PREFIX_UNSTABLE, retryNetworkOperation, } from "./http-api"; -import {getHttpUriForMxc} from "./content-repo"; +import { getHttpUriForMxc } from "./content-repo"; import * as ContentHelpers from "./content-helpers"; import * as olmlib from "./crypto/olmlib"; -import {ReEmitter} from './ReEmitter'; -import {RoomList} from './crypto/RoomList'; -import {logger} from './logger'; -import {Crypto, isCryptoAvailable, fixBackupKey} from './crypto'; -import {decodeRecoveryKey} from './crypto/recoverykey'; -import {keyFromAuthData} from './crypto/key_passphrase'; -import {randomString} from './randomstring'; -import {PushProcessor} from "./pushprocessor"; -import {encodeBase64, decodeBase64} from "./crypto/olmlib"; +import { ReEmitter } from './ReEmitter'; +import { RoomList } from './crypto/RoomList'; +import { logger } from './logger'; +import { Crypto, isCryptoAvailable, fixBackupKey } from './crypto'; +import { decodeRecoveryKey } from './crypto/recoverykey'; +import { keyFromAuthData } from './crypto/key_passphrase'; +import { randomString } from './randomstring'; +import { PushProcessor } from "./pushprocessor"; +import { encodeBase64, decodeBase64 } from "./crypto/olmlib"; import { User } from "./models/user"; -import {AutoDiscovery} from "./autodiscovery"; -import {DEHYDRATION_ALGORITHM} from "./crypto/dehydration"; +import { AutoDiscovery } from "./autodiscovery"; +import { DEHYDRATION_ALGORITHM } from "./crypto/dehydration"; const SCROLLBACK_DELAY_MS = 3000; export const CRYPTO_ENABLED = isCryptoAvailable(); @@ -706,7 +705,6 @@ MatrixClient.prototype.getDeviceId = function() { return this.deviceId; }; - /** * Check if the runtime environment supports VoIP calling. * @return {boolean} True if VoIP is supported. @@ -969,14 +967,12 @@ MatrixClient.prototype.initCrypto = async function() { this.olmVersion = Crypto.getOlmVersion(); - // if crypto initialisation was successful, tell it to attach its event // handlers. crypto.registerEventHandlers(this); this._crypto = crypto; }; - /** * Is end-to-end crypto enabled for this client. * @return {boolean} True if end-to-end is enabled. @@ -1790,7 +1786,7 @@ MatrixClient.prototype.checkKeyBackup = function() { MatrixClient.prototype.getKeyBackupVersion = function() { return this._http.authedRequest( undefined, "GET", "/room_keys/version", undefined, undefined, - {prefix: PREFIX_UNSTABLE}, + { prefix: PREFIX_UNSTABLE }, ).then((res) => { if (res.algorithm !== olmlib.MEGOLM_BACKUP_ALGORITHM) { const err = "Unknown backup algorithm: " + res.algorithm; @@ -1968,7 +1964,7 @@ MatrixClient.prototype.createKeyBackupVersion = async function(info) { const res = await this._http.authedRequest( undefined, "POST", "/room_keys/version", undefined, data, - {prefix: PREFIX_UNSTABLE}, + { prefix: PREFIX_UNSTABLE }, ); // We could assume everything's okay and enable directly, but this ensures @@ -2000,7 +1996,7 @@ MatrixClient.prototype.deleteKeyBackupVersion = function(version) { return this._http.authedRequest( undefined, "DELETE", path, undefined, undefined, - {prefix: PREFIX_UNSTABLE}, + { prefix: PREFIX_UNSTABLE }, ); }; @@ -2042,7 +2038,7 @@ MatrixClient.prototype.sendKeyBackup = function(roomId, sessionId, version, data const path = this._makeKeyBackupPath(roomId, sessionId, version); return this._http.authedRequest( undefined, "PUT", path.path, path.queryData, data, - {prefix: PREFIX_UNSTABLE}, + { prefix: PREFIX_UNSTABLE }, ); }; @@ -2242,7 +2238,7 @@ MatrixClient.prototype._restoreKeyBackup = function( // doesn't match the one in the auth_data, the user has enetered // a different recovery key / the wrong passphrase. if (backupPubKey !== backupInfo.auth_data.public_key) { - return Promise.reject({errcode: MatrixClient.RESTORE_BACKUP_ERROR_BAD_KEY}); + return Promise.reject({ errcode: MatrixClient.RESTORE_BACKUP_ERROR_BAD_KEY }); } // Cache the key, if possible. @@ -2260,7 +2256,7 @@ MatrixClient.prototype._restoreKeyBackup = function( return this._http.authedRequest( undefined, "GET", path.path, path.queryData, undefined, - {prefix: PREFIX_UNSTABLE}, + { prefix: PREFIX_UNSTABLE }, ).then((res) => { if (res.rooms) { for (const [roomId, roomData] of Object.entries(res.rooms)) { @@ -2300,7 +2296,7 @@ MatrixClient.prototype._restoreKeyBackup = function( }).then(() => { return this._crypto.setTrustedBackupPubKey(backupPubKey); }).then(() => { - return {total: totalKeyCount, imported: keys.length}; + return { total: totalKeyCount, imported: keys.length }; }).finally(() => { decryption.free(); }); @@ -2314,7 +2310,7 @@ MatrixClient.prototype.deleteKeysFromBackup = function(roomId, sessionId, versio const path = this._makeKeyBackupPath(roomId, sessionId, version); return this._http.authedRequest( undefined, "DELETE", path.path, path.queryData, undefined, - {prefix: PREFIX_UNSTABLE}, + { prefix: PREFIX_UNSTABLE }, ); }; @@ -2549,7 +2545,7 @@ MatrixClient.prototype.getIgnoredUsers = function() { * @return {module:http-api.MatrixError} Rejects: with an error response. */ MatrixClient.prototype.setIgnoredUsers = function(userIds, callback) { - const content = {ignored_users: {}}; + const content = { ignored_users: {} }; userIds.map((u) => content.ignored_users[u] = {}); return this.setAccountData("m.ignored_user_list", content, callback); }; @@ -2610,7 +2606,7 @@ MatrixClient.prototype.joinRoom = function(roomIdOrAlias, opts, callback) { queryString["server_name"] = opts.viaServers; } - const reqOpts = {qsStringifyOptions: {arrayFormat: 'repeat'}}; + const reqOpts = { qsStringifyOptions: { arrayFormat: 'repeat' } }; const self = this; const prom = new Promise((resolve, reject) => { @@ -2620,7 +2616,7 @@ MatrixClient.prototype.joinRoom = function(roomIdOrAlias, opts, callback) { data.third_party_signed = signed_invite_object; } - const path = utils.encodeUri("/join/$roomid", { $roomid: roomIdOrAlias}); + const path = utils.encodeUri("/join/$roomid", { $roomid: roomIdOrAlias }); return self._http.authedRequest( undefined, "POST", path, queryString, data, reqOpts); }).then(function(res) { @@ -2684,7 +2680,7 @@ MatrixClient.prototype.cancelPendingEvent = function(event) { * @return {module:http-api.MatrixError} Rejects: with an error response. */ MatrixClient.prototype.setRoomName = function(roomId, name, callback) { - return this.sendStateEvent(roomId, "m.room.name", {name: name}, + return this.sendStateEvent(roomId, "m.room.name", { name: name }, undefined, callback); }; @@ -2696,7 +2692,7 @@ MatrixClient.prototype.setRoomName = function(roomId, name, callback) { * @return {module:http-api.MatrixError} Rejects: with an error response. */ MatrixClient.prototype.setRoomTopic = function(roomId, topic, callback) { - return this.sendStateEvent(roomId, "m.room.topic", {topic: topic}, + return this.sendStateEvent(roomId, "m.room.topic", { topic: topic }, undefined, callback); }; @@ -2882,7 +2878,6 @@ MatrixClient.prototype._sendCompleteEvent = function(roomId, eventObject, txnId, return _sendEvent(this, room, localEvent, callback); }; - // encrypts the event if necessary // adds the event to the queue, or sends it // marks the event as sent/unsent @@ -3730,7 +3725,7 @@ function _setMembershipState(client, roomId, userId, membershipValue, reason, const path = utils.encodeUri( "/rooms/$roomId/state/m.room.member/$userId", - { $roomId: roomId, $userId: userId}, + { $roomId: roomId, $userId: userId }, ); return client._http.authedRequest(callback, "PUT", path, undefined, { @@ -4045,7 +4040,7 @@ MatrixClient.prototype.getEventTimeline = function(timelineSet, eventId) { let params = undefined; if (this._clientOpts.lazyLoadMembers) { - params = {filter: JSON.stringify(Filter.LAZY_LOADING_MESSAGES_FILTER)}; + params = { filter: JSON.stringify(Filter.LAZY_LOADING_MESSAGES_FILTER) }; } // TODO: we should implement a backoff (as per scrollback()) to deal more @@ -4111,7 +4106,7 @@ MatrixClient.prototype.getEventTimeline = function(timelineSet, eventId) { MatrixClient.prototype._createMessagesRequest = function(roomId, fromToken, limit, dir, timelineFilter = undefined) { const path = utils.encodeUri( - "/rooms/$roomId/messages", {$roomId: roomId}, + "/rooms/$roomId/messages", { $roomId: roomId }, ); if (limit === undefined) { limit = 30; @@ -4566,7 +4561,6 @@ MatrixClient.prototype._requestTokenFromEndpoint = async function(endpoint, para ); }; - // Push operations // =============== @@ -4745,7 +4739,7 @@ MatrixClient.prototype.searchRoomEvents = function(opts) { highlights: [], }; - return this.search({body: body}).then( + return this.search({ body: body }).then( this._processRoomEventsSearch.bind(this, searchResults), ); }; @@ -4822,7 +4816,6 @@ MatrixClient.prototype._processRoomEventsSearch = function(searchResults, respon return searchResults; }; - /** * Populate the store with rooms the user has left. * @return {Promise} Resolves: TODO - Resolved when the rooms have @@ -4968,7 +4961,6 @@ MatrixClient.prototype.getOrCreateFilter = async function(filterName, filter) { return createdFilter.filterId; }; - /** * Gets a bearer token from the Home Server that the user can * present to a third party in order to prove their ownership @@ -4986,7 +4978,6 @@ MatrixClient.prototype.getOpenIdToken = function() { ); }; - // VoIP operations // =============== @@ -5103,7 +5094,7 @@ MatrixClient.prototype.isSynapseAdministrator = function() { { $userId: this.getUserId() }, ); return this._http.authedRequest( - undefined, 'GET', path, undefined, undefined, {prefix: ''}, + undefined, 'GET', path, undefined, undefined, { prefix: '' }, ).then(r => r['admin']); // pull out the specific boolean we want }; @@ -5120,7 +5111,7 @@ MatrixClient.prototype.whoisSynapseUser = function(userId) { { $userId: userId }, ); return this._http.authedRequest( - undefined, 'GET', path, undefined, undefined, {prefix: ''}, + undefined, 'GET', path, undefined, undefined, { prefix: '' }, ); }; @@ -5136,7 +5127,7 @@ MatrixClient.prototype.deactivateSynapseUser = function(userId) { { $userId: userId }, ); return this._http.authedRequest( - undefined, 'POST', path, undefined, undefined, {prefix: ''}, + undefined, 'POST', path, undefined, undefined, { prefix: '' }, ); }; @@ -5154,7 +5145,6 @@ MatrixClient.prototype.deactivateSynapseUser = function(userId) { // due to ambiguity (or should this be on a chat-specific layer)? // reconnect after connectivity outages - /** * High level helper method to begin syncing and poll for new events. To listen for these * events, add a listener for {@link module:client~MatrixClient#event:"event"} @@ -5305,7 +5295,7 @@ MatrixClient.prototype._unstable_getSharedRooms = async function(userId) { }); const res = await this._http.authedRequest( undefined, "GET", path, undefined, undefined, - {prefix: PREFIX_UNSTABLE}, + { prefix: PREFIX_UNSTABLE }, ); return res.joined; }; diff --git a/src/crypto/CrossSigning.js b/src/crypto/CrossSigning.js index 6dc5e3ed9..2143f0c75 100644 --- a/src/crypto/CrossSigning.js +++ b/src/crypto/CrossSigning.js @@ -20,11 +20,11 @@ limitations under the License. * @module crypto/CrossSigning */ -import {decodeBase64, encodeBase64, pkSign, pkVerify} from './olmlib'; -import {EventEmitter} from 'events'; -import {logger} from '../logger'; -import {IndexedDBCryptoStore} from '../crypto/store/indexeddb-crypto-store'; -import {decryptAES, encryptAES} from './aes'; +import { decodeBase64, encodeBase64, pkSign, pkVerify } from './olmlib'; +import { EventEmitter } from 'events'; +import { logger } from '../logger'; +import { IndexedDBCryptoStore } from '../crypto/store/indexeddb-crypto-store'; +import { decryptAES, encryptAES } from './aes'; const KEY_REQUEST_TIMEOUT_MS = 1000 * 60; diff --git a/src/crypto/DeviceList.js b/src/crypto/DeviceList.js index 97836b5a4..9b74a54db 100644 --- a/src/crypto/DeviceList.js +++ b/src/crypto/DeviceList.js @@ -22,14 +22,13 @@ limitations under the License. * Manages the list of other users' devices */ -import {EventEmitter} from 'events'; -import {logger} from '../logger'; -import {DeviceInfo} from './deviceinfo'; -import {CrossSigningInfo} from './CrossSigning'; +import { EventEmitter } from 'events'; +import { logger } from '../logger'; +import { DeviceInfo } from './deviceinfo'; +import { CrossSigningInfo } from './CrossSigning'; import * as olmlib from './olmlib'; -import {IndexedDBCryptoStore} from './store/indexeddb-crypto-store'; -import {chunkPromises, defer, sleep} from '../utils'; - +import { IndexedDBCryptoStore } from './store/indexeddb-crypto-store'; +import { chunkPromises, defer, sleep } from '../utils'; /* State transition diagram for DeviceList._deviceTrackingStatus * @@ -51,7 +50,6 @@ import {chunkPromises, defer, sleep} from '../utils'; * +----------------------- UP_TO_DATE ------------------------+ */ - // constants for DeviceList._deviceTrackingStatus const TRACKING_STATUS_NOT_TRACKED = 0; const TRACKING_STATUS_PENDING_DOWNLOAD = 1; @@ -892,7 +890,6 @@ class DeviceListUpdateSerialiser { } } - async function _updateStoredDeviceKeysForUser( _olmDevice, userId, userStore, userResult, localUserId, localDeviceId, ) { diff --git a/src/crypto/EncryptionSetup.js b/src/crypto/EncryptionSetup.js index f001cb259..d5421ea50 100644 --- a/src/crypto/EncryptionSetup.js +++ b/src/crypto/EncryptionSetup.js @@ -1,8 +1,8 @@ import { logger } from "../logger"; -import {MatrixEvent} from "../models/event"; -import {EventEmitter} from "events"; -import {createCryptoStoreCacheCallbacks} from "./CrossSigning"; -import {IndexedDBCryptoStore} from './store/indexeddb-crypto-store'; +import { MatrixEvent } from "../models/event"; +import { EventEmitter } from "events"; +import { createCryptoStoreCacheCallbacks } from "./CrossSigning"; +import { IndexedDBCryptoStore } from './store/indexeddb-crypto-store'; import { PREFIX_UNSTABLE, } from "../http-api"; @@ -43,7 +43,7 @@ export class EncryptionSetupBuilder { * @param {Object} keys the new keys */ addCrossSigningKeys(authUpload, keys) { - this._crossSigningKeys = {authUpload, keys}; + this._crossSigningKeys = { authUpload, keys }; } /** @@ -86,7 +86,6 @@ export class EncryptionSetupBuilder { userSignatures[deviceId] = signature; } - /** * @param {String} type * @param {Object} content @@ -211,21 +210,20 @@ export class EncryptionSetupOperation { algorithm: this._keyBackupInfo.algorithm, auth_data: this._keyBackupInfo.auth_data, }, - {prefix: PREFIX_UNSTABLE}, + { prefix: PREFIX_UNSTABLE }, ); } else { // add new key backup await baseApis._http.authedRequest( undefined, "POST", "/room_keys/version", undefined, this._keyBackupInfo, - {prefix: PREFIX_UNSTABLE}, + { prefix: PREFIX_UNSTABLE }, ); } } } } - /** * Catches account data set by SecretStorage during bootstrapping by * implementing the methods related to account data in MatrixClient @@ -276,7 +274,7 @@ class AccountDataClientAdapter extends EventEmitter { // as SecretStorage listens for it while calling this method // and it seems to rely on this. return Promise.resolve().then(() => { - const event = new MatrixEvent({type, content}); + const event = new MatrixEvent({ type, content }); this.emit("accountData", event, lastEvent); }); } @@ -335,7 +333,7 @@ class SSSSCryptoCallbacks { // for it to the general crypto callbacks and cache it if (this._delegateCryptoCallbacks) { const result = await this._delegateCryptoCallbacks. - getSecretStorageKey({keys}, name); + getSecretStorageKey({ keys }, name); if (result) { const [keyId, privateKey] = result; this._privateKeys.set(keyId, privateKey); diff --git a/src/crypto/OlmDevice.js b/src/crypto/OlmDevice.js index df0733e65..b0410df72 100644 --- a/src/crypto/OlmDevice.js +++ b/src/crypto/OlmDevice.js @@ -16,8 +16,8 @@ See the License for the specific language governing permissions and limitations under the License. */ -import {logger} from '../logger'; -import {IndexedDBCryptoStore} from './store/indexeddb-crypto-store'; +import { logger } from '../logger'; +import { IndexedDBCryptoStore } from './store/indexeddb-crypto-store'; import * as algorithms from './algorithms'; // The maximum size of an event is 65K, and we base64 the content, so this is a @@ -48,7 +48,6 @@ function checkPayloadLength(payloadString) { } } - /** * The type of object we use for importing and exporting megolm session data. * @@ -62,7 +61,6 @@ function checkPayloadLength(payloadString) { * @property {String} session_key Base64'ed key data */ - /** * Manages the olm cryptography functions. Each OlmDevice has a single * OlmAccount and a number of OlmSessions. @@ -350,7 +348,7 @@ OlmDevice.prototype._unpickleSession = function(sessionInfo, func) { const session = new global.Olm.Session(); try { session.unpickle(this._pickleKey, sessionInfo.session); - const unpickledSessInfo = Object.assign({}, sessionInfo, {session}); + const unpickledSessInfo = Object.assign({}, sessionInfo, { session }); func(unpickledSessInfo); } finally { @@ -376,7 +374,6 @@ OlmDevice.prototype._saveSession = function(deviceKey, sessionInfo, txn) { ); }; - /** * get an OlmUtility and call the given function * @@ -393,7 +390,6 @@ OlmDevice.prototype._getUtility = function(func) { } }; - /** * Signs a message with the ed25519 key for this account. * @@ -434,7 +430,6 @@ OlmDevice.prototype.getOneTimeKeys = async function() { return result; }; - /** * Get the maximum number of one-time keys we can store. * @@ -550,7 +545,6 @@ OlmDevice.prototype.createOutboundSession = async function( return newSessionId; }; - /** * Generate a new inbound session, given an incoming message * @@ -612,7 +606,6 @@ OlmDevice.prototype.createInboundSession = async function( return result; }; - /** * Get a list of known session IDs for the given device * @@ -856,7 +849,6 @@ OlmDevice.prototype.filterOutNotifiedErrorDevices = async function(devices) { return await this._cryptoStore.filterOutNotifiedErrorDevices(devices); }; - // Outbound group session // ====================== @@ -871,7 +863,6 @@ OlmDevice.prototype._saveOutboundGroupSession = function(session) { this._outboundGroupSessionStore[session.session_id()] = pickledSession; }; - /** * extract an OutboundGroupSession from _outboundGroupSessionStore and call the * given function @@ -896,7 +887,6 @@ OlmDevice.prototype._getOutboundGroupSession = function(sessionId, func) { } }; - /** * Generate a new outbound group session * @@ -913,7 +903,6 @@ OlmDevice.prototype.createOutboundGroupSession = function() { } }; - /** * Encrypt an outgoing message with an outbound group session * @@ -953,7 +942,6 @@ OlmDevice.prototype.getOutboundGroupSessionKey = function(sessionId) { }); }; - // Inbound group session // ===================== diff --git a/src/crypto/RoomList.js b/src/crypto/RoomList.js index 6a3c6c22f..b00445247 100644 --- a/src/crypto/RoomList.js +++ b/src/crypto/RoomList.js @@ -20,7 +20,7 @@ limitations under the License. * Manages the list of encrypted rooms */ -import {IndexedDBCryptoStore} from './store/indexeddb-crypto-store'; +import { IndexedDBCryptoStore } from './store/indexeddb-crypto-store'; /** * @alias module:crypto/RoomList diff --git a/src/crypto/SecretStorage.js b/src/crypto/SecretStorage.js index 120e2bdfa..5b20bc934 100644 --- a/src/crypto/SecretStorage.js +++ b/src/crypto/SecretStorage.js @@ -14,12 +14,12 @@ See the License for the specific language governing permissions and limitations under the License. */ -import {EventEmitter} from 'events'; -import {logger} from '../logger'; +import { EventEmitter } from 'events'; +import { logger } from '../logger'; import * as olmlib from './olmlib'; -import {randomString} from '../randomstring'; -import {encryptAES, decryptAES} from './aes'; -import {encodeBase64} from "./olmlib"; +import { randomString } from '../randomstring'; +import { encryptAES, decryptAES } from './aes'; +import { encodeBase64 } from "./olmlib"; export const SECRET_STORAGE_ALGORITHM_V1_AES = "m.secret_storage.v1.aes-hmac-sha2"; @@ -86,7 +86,7 @@ export class SecretStorage extends EventEmitter { * keyInfo: {object} details about the key (iv, mac, passphrase) */ async addKey(algorithm, opts, keyId) { - const keyInfo = {algorithm}; + const keyInfo = { algorithm }; if (!opts) opts = {}; @@ -99,7 +99,7 @@ export class SecretStorage extends EventEmitter { keyInfo.passphrase = opts.passphrase; } if (opts.key) { - const {iv, mac} = await SecretStorage._calculateKeyCheck(opts.key); + const { iv, mac } = await SecretStorage._calculateKeyCheck(opts.key); keyInfo.iv = iv; keyInfo.mac = mac; } @@ -171,7 +171,7 @@ export class SecretStorage extends EventEmitter { async checkKey(key, info) { if (info.algorithm === SECRET_STORAGE_ALGORITHM_V1_AES) { if (info.mac) { - const {mac} = await SecretStorage._calculateKeyCheck(key, info.iv); + const { mac } = await SecretStorage._calculateKeyCheck(key, info.iv); return info.mac.replace(/=+$/g, '') === mac.replace(/=+$/g, ''); } else { // if we have no information, we have to assume the key is right @@ -220,7 +220,7 @@ export class SecretStorage extends EventEmitter { // encrypt secret, based on the algorithm if (keyInfo.algorithm === SECRET_STORAGE_ALGORITHM_V1_AES) { - const keys = {[keyId]: keyInfo}; + const keys = { [keyId]: keyInfo }; const [, encryption] = await this._getSecretStorageKey(keys, name); encrypted[keyId] = await encryption.encrypt(secret); } else { @@ -231,7 +231,7 @@ export class SecretStorage extends EventEmitter { } // save encrypted secret - await this._baseApis.setAccountData(name, {encrypted}); + await this._baseApis.setAccountData(name, { encrypted }); } /** diff --git a/src/crypto/aes.js b/src/crypto/aes.js index 1556413f7..c121b6e2b 100644 --- a/src/crypto/aes.js +++ b/src/crypto/aes.js @@ -14,8 +14,8 @@ See the License for the specific language governing permissions and limitations under the License. */ -import {getCrypto} from '../utils'; -import {decodeBase64, encodeBase64} from './olmlib'; +import { getCrypto } from '../utils'; +import { decodeBase64, encodeBase64 } from './olmlib'; const subtleCrypto = (typeof window !== "undefined" && window.crypto) ? (window.crypto.subtle || window.crypto.webkitSubtle) : null; @@ -148,7 +148,7 @@ async function encryptBrowser(data, key, name, ivStr) { ); const hmac = await subtleCrypto.sign( - {name: 'HMAC'}, + { name: 'HMAC' }, hmacKey, ciphertext, ); @@ -176,7 +176,7 @@ async function decryptBrowser(data, key, name) { const ciphertext = decodeBase64(data.ciphertext); if (!await subtleCrypto.verify( - {name: "HMAC"}, + { name: "HMAC" }, hmacKey, decodeBase64(data.mac), ciphertext, @@ -201,7 +201,7 @@ async function deriveKeysBrowser(key, name) { const hkdfkey = await subtleCrypto.importKey( 'raw', key, - {name: "HKDF"}, + { name: "HKDF" }, false, ["deriveBits"], ); @@ -222,7 +222,7 @@ async function deriveKeysBrowser(key, name) { const aesProm = subtleCrypto.importKey( 'raw', aesKey, - {name: 'AES-CTR'}, + { name: 'AES-CTR' }, false, ['encrypt', 'decrypt'], ); @@ -232,7 +232,7 @@ async function deriveKeysBrowser(key, name) { hmacKey, { name: 'HMAC', - hash: {name: 'SHA-256'}, + hash: { name: 'SHA-256' }, }, false, ['sign', 'verify'], diff --git a/src/crypto/algorithms/megolm.js b/src/crypto/algorithms/megolm.js index c06b6da16..0d97b2450 100644 --- a/src/crypto/algorithms/megolm.js +++ b/src/crypto/algorithms/megolm.js @@ -22,9 +22,9 @@ limitations under the License. * @module crypto/algorithms/megolm */ -import {logger} from '../../logger'; +import { logger } from '../../logger'; import * as utils from "../../utils"; -import {polyfillSuper} from "../../utils"; +import { polyfillSuper } from "../../utils"; import * as olmlib from "../olmlib"; import { DecryptionAlgorithm, @@ -34,7 +34,7 @@ import { UnknownDeviceError, } from "./base"; -import {WITHHELD_MESSAGES} from '../OlmDevice'; +import { WITHHELD_MESSAGES } from '../OlmDevice'; // determine whether the key can be shared with invitees function isRoomSharedHistory(room) { @@ -75,7 +75,6 @@ function OutboundSessionInfo(sessionId, sharedHistory = false) { this.sharedHistory = sharedHistory; } - /** * Check if it's time to rotate the session * @@ -158,7 +157,6 @@ OutboundSessionInfo.prototype.sharedWithTooManyDevices = function( } }; - /** * Megolm encryption implementation * @@ -328,7 +326,7 @@ MegolmEncryption.prototype._ensureOutboundSession = async function( failedServerMap.add(server); } const failedDevices = []; - for (const {userId, deviceInfo} of errorDevices) { + for (const { userId, deviceInfo } of errorDevices) { const userHS = userId.slice(userId.indexOf(":") + 1); if (failedServerMap.has(userHS)) { retryDevices[userId] = retryDevices[userId] || []; @@ -336,7 +334,7 @@ MegolmEncryption.prototype._ensureOutboundSession = async function( } else { // if we aren't going to retry, then handle it // as a failed device - failedDevices.push({userId, deviceInfo}); + failedDevices.push({ userId, deviceInfo }); } } @@ -410,8 +408,8 @@ MegolmEncryption.prototype._prepareNewSession = async function(sharedHistory) { await this._olmDevice.addInboundGroupSession( this._roomId, this._olmDevice.deviceCurve25519Key, [], sessionId, - key.key, {ed25519: this._olmDevice.deviceEd25519Key}, false, - {sharedHistory: sharedHistory}, + key.key, { ed25519: this._olmDevice.deviceEd25519Key }, false, + { sharedHistory: sharedHistory }, ); // don't wait for it to complete @@ -454,7 +452,7 @@ MegolmEncryption.prototype._getDevicesWithoutSessions = function( // no session with this device, probably because there // were no one-time keys. - noOlmDevices.push({userId, deviceInfo}); + noOlmDevices.push({ userId, deviceInfo }); delete sessionResults[deviceId]; // ensureOlmSessionsForUsers has already done the logging, @@ -819,7 +817,7 @@ MegolmEncryption.prototype._notifyFailedOlmDevices = async function( // mark the devices that failed as "handled" because we don't want to try // to claim a one-time-key for dead devices on every message. - for (const {userId, deviceInfo} of failedDevices) { + for (const { userId, deviceInfo } of failedDevices) { const deviceId = deviceInfo.deviceId; session.markSharedWithDevice( @@ -836,7 +834,7 @@ MegolmEncryption.prototype._notifyFailedOlmDevices = async function( `in ${this._roomId}`, ); const blockedMap = {}; - for (const {userId, deviceInfo} of filteredFailedDevices) { + for (const { userId, deviceInfo } of filteredFailedDevices) { blockedMap[userId] = blockedMap[userId] || {}; // we use a similar format to what // olmlib.ensureOlmSessionsForDevices returns, so that @@ -1341,7 +1339,6 @@ MegolmDecryption.prototype._removeEventFromPendingList = function(event) { } }; - /** * @inheritdoc * @@ -1489,7 +1486,7 @@ MegolmDecryption.prototype.onRoomKeyWithheldEvent = async function(event) { } } await olmlib.ensureOlmSessionsForDevices( - this._olmDevice, this._baseApis, {[sender]: [device]}, false, + this._olmDevice, this._baseApis, { [sender]: [device] }, false, ); const encryptedContent = { algorithm: olmlib.OLM_ALGORITHM, @@ -1503,7 +1500,7 @@ MegolmDecryption.prototype.onRoomKeyWithheldEvent = async function(event) { this._olmDevice, sender, device, - {type: "m.dummy"}, + { type: "m.dummy" }, ); await this._olmDevice.recordSessionProblem(senderKey, "no_olm", true); diff --git a/src/crypto/algorithms/olm.js b/src/crypto/algorithms/olm.js index f23841533..74444b75a 100644 --- a/src/crypto/algorithms/olm.js +++ b/src/crypto/algorithms/olm.js @@ -20,11 +20,11 @@ limitations under the License. * @module crypto/algorithms/olm */ -import {logger} from '../../logger'; +import { logger } from '../../logger'; import * as utils from "../../utils"; -import {polyfillSuper} from "../../utils"; +import { polyfillSuper } from "../../utils"; import * as olmlib from "../olmlib"; -import {DeviceInfo} from "../deviceinfo"; +import { DeviceInfo } from "../deviceinfo"; import { DecryptionAlgorithm, DecryptionError, @@ -358,5 +358,4 @@ OlmDecryption.prototype._reallyDecryptMessage = async function( return res.payload; }; - registerAlgorithm(olmlib.OLM_ALGORITHM, OlmEncryption, OlmDecryption); diff --git a/src/crypto/dehydration.ts b/src/crypto/dehydration.ts index 07bf04131..2fcae9cea 100644 --- a/src/crypto/dehydration.ts +++ b/src/crypto/dehydration.ts @@ -14,11 +14,11 @@ See the License for the specific language governing permissions and limitations under the License. */ -import {decodeBase64, encodeBase64} from './olmlib'; -import {IndexedDBCryptoStore} from '../crypto/store/indexeddb-crypto-store'; -import {decryptAES, encryptAES} from './aes'; +import { decodeBase64, encodeBase64 } from './olmlib'; +import { IndexedDBCryptoStore } from '../crypto/store/indexeddb-crypto-store'; +import { decryptAES, encryptAES } from './aes'; import anotherjson from "another-json"; -import {logger} from '../logger'; +import { logger } from '../logger'; // FIXME: these types should eventually go in a different file type Signatures = Record>; @@ -59,7 +59,7 @@ export class DehydrationManager { txn, async (result) => { if (result) { - const {key, keyInfo, deviceDisplayName, time} = result; + const { key, keyInfo, deviceDisplayName, time } = result; const pickleKey = Buffer.from(this.crypto._olmDevice._pickleKey); const decrypted = await decryptAES(key, pickleKey, DEHYDRATION_ALGORITHM); this.key = decodeBase64(decrypted); @@ -231,7 +231,7 @@ export class DehydrationManager { logger.log("Preparing one-time keys"); const oneTimeKeys = {}; for (const [keyId, key] of Object.entries(otks.curve25519)) { - const k: OneTimeKey = {key}; + const k: OneTimeKey = { key }; const signature = account.sign(anotherjson.stringify(k)); k.signatures = { [this.crypto._userId]: { @@ -244,7 +244,7 @@ export class DehydrationManager { logger.log("Preparing fallback keys"); const fallbackKeys = {}; for (const [keyId, key] of Object.entries(fallbacks.curve25519)) { - const k: OneTimeKey = {key, fallback: true}; + const k: OneTimeKey = { key, fallback: true }; const signature = account.sign(anotherjson.stringify(k)); k.signatures = { [this.crypto._userId]: { diff --git a/src/crypto/index.js b/src/crypto/index.js index e418195ae..ae8de2af1 100644 --- a/src/crypto/index.js +++ b/src/crypto/index.js @@ -22,15 +22,15 @@ limitations under the License. */ import anotherjson from "another-json"; -import {EventEmitter} from 'events'; -import {ReEmitter} from '../ReEmitter'; -import {logger} from '../logger'; +import { EventEmitter } from 'events'; +import { ReEmitter } from '../ReEmitter'; +import { logger } from '../logger'; import * as utils from "../utils"; -import {sleep} from "../utils"; -import {OlmDevice} from "./OlmDevice"; +import { sleep } from "../utils"; +import { OlmDevice } from "./OlmDevice"; import * as olmlib from "./olmlib"; -import {DeviceList} from "./DeviceList"; -import {DeviceInfo} from "./deviceinfo"; +import { DeviceList } from "./DeviceList"; +import { DeviceInfo } from "./deviceinfo"; import * as algorithms from "./algorithms"; import { CrossSigningInfo, @@ -38,25 +38,25 @@ import { UserTrustLevel, createCryptoStoreCacheCallbacks, } from './CrossSigning'; -import {EncryptionSetupBuilder} from "./EncryptionSetup"; -import {SECRET_STORAGE_ALGORITHM_V1_AES, SecretStorage} from './SecretStorage'; -import {OutgoingRoomKeyRequestManager} from './OutgoingRoomKeyRequestManager'; -import {IndexedDBCryptoStore} from './store/indexeddb-crypto-store'; +import { EncryptionSetupBuilder } from "./EncryptionSetup"; +import { SECRET_STORAGE_ALGORITHM_V1_AES, SecretStorage } from './SecretStorage'; +import { OutgoingRoomKeyRequestManager } from './OutgoingRoomKeyRequestManager'; +import { IndexedDBCryptoStore } from './store/indexeddb-crypto-store'; import { ReciprocateQRCode, SCAN_QR_CODE_METHOD, SHOW_QR_CODE_METHOD, } from './verification/QRCode'; -import {SAS} from './verification/SAS'; -import {keyFromPassphrase} from './key_passphrase'; -import {encodeRecoveryKey, decodeRecoveryKey} from './recoverykey'; -import {VerificationRequest} from "./verification/request/VerificationRequest"; -import {InRoomChannel, InRoomRequests} from "./verification/request/InRoomChannel"; -import {ToDeviceChannel, ToDeviceRequests} from "./verification/request/ToDeviceChannel"; -import {IllegalMethod} from "./verification/IllegalMethod"; -import {KeySignatureUploadError} from "../errors"; -import {decryptAES, encryptAES} from './aes'; -import {DehydrationManager} from './dehydration'; +import { SAS } from './verification/SAS'; +import { keyFromPassphrase } from './key_passphrase'; +import { encodeRecoveryKey, decodeRecoveryKey } from './recoverykey'; +import { VerificationRequest } from "./verification/request/VerificationRequest"; +import { InRoomChannel, InRoomRequests } from "./verification/request/InRoomChannel"; +import { ToDeviceChannel, ToDeviceRequests } from "./verification/request/ToDeviceChannel"; +import { IllegalMethod } from "./verification/IllegalMethod"; +import { KeySignatureUploadError } from "../errors"; +import { decryptAES, encryptAES } from './aes'; +import { DehydrationManager } from './dehydration'; import { MatrixEvent } from "../models/event"; const DeviceVerification = DeviceInfo.DeviceVerification; @@ -682,12 +682,12 @@ Crypto.prototype.bootstrapSecretStorage = async function({ const ensureCanCheckPassphrase = async (keyId, keyInfo) => { if (!keyInfo.mac) { const key = await this._baseApis._cryptoCallbacks.getSecretStorageKey( - {keys: {[keyId]: keyInfo}}, "", + { keys: { [keyId]: keyInfo } }, "", ); if (key) { const privateKey = key[1]; builder.ssssCryptoCallbacks.addPrivateKey(keyId, keyInfo, privateKey); - const {iv, mac} = await SecretStorage._calculateKeyCheck(privateKey); + const { iv, mac } = await SecretStorage._calculateKeyCheck(privateKey); keyInfo.iv = iv; keyInfo.mac = mac; @@ -1599,7 +1599,7 @@ Crypto.prototype._checkAndStartKeyBackup = async function() { } } - return {backupInfo, trustInfo}; + return { backupInfo, trustInfo }; }; Crypto.prototype.setTrustedBackupPubKey = async function(trustedPubKey) { @@ -1774,7 +1774,6 @@ Crypto.prototype.registerEventHandlers = function(eventEmitter) { eventEmitter.on("Event.decrypted", timelineHandler); }; - /** Start background processes related to crypto */ Crypto.prototype.start = function() { this._outgoingRoomKeyRequestManager.start(); @@ -2231,7 +2230,7 @@ Crypto.prototype.setDeviceVerification = async function( } if (device) { - const upload = async ({shouldEmit}) => { + const upload = async ({ shouldEmit }) => { logger.info("Uploading signature for " + deviceId); const response = await this._baseApis.uploadKeySignatures({ [userId]: { @@ -2251,7 +2250,7 @@ Crypto.prototype.setDeviceVerification = async function( throw new KeySignatureUploadError("Key upload failed", { failures }); } }; - await upload({shouldEmit: true}); + await upload({ shouldEmit: true }); // XXX: we'll need to wait for the device list to be updated } } @@ -2344,7 +2343,7 @@ Crypto.prototype.beginKeyVerification = function( this._toDeviceVerificationRequests.setRequestBySenderAndTxnId( userId, transactionId, request); } - return request.beginKeyVerification(method, {userId, deviceId}); + return request.beginKeyVerification(method, { userId, deviceId }); }; Crypto.prototype.legacyDeviceVerification = async function( @@ -2357,7 +2356,7 @@ Crypto.prototype.legacyDeviceVerification = async function( channel, this._verificationMethods, this._baseApis); this._toDeviceVerificationRequests.setRequestBySenderAndTxnId( userId, transactionId, request); - const verifier = request.beginKeyVerification(method, {userId, deviceId}); + const verifier = request.beginKeyVerification(method, { userId, deviceId }); // either reject by an error from verify() while sending .start // or resolve when the request receives the // local (fake remote) echo for sending the .start event @@ -2368,7 +2367,6 @@ Crypto.prototype.legacyDeviceVerification = async function( return request; }; - /** * Get information on the active olm sessions with a user *

@@ -2399,7 +2397,6 @@ Crypto.prototype.getOlmSessionsForUser = async function(userId) { return result; }; - /** * Get the device which sent an event * @@ -2644,7 +2641,6 @@ Crypto.prototype.setRoomEncryption = async function(roomId, config, inhibitDevic } }; - /** * Make sure we are tracking the device lists for all users in this room. * @@ -2867,7 +2863,7 @@ Crypto.prototype._backupPendingKeys = async function(limit) { for (const session of sessions) { const roomId = session.sessionData.room_id; if (data[roomId] === undefined) { - data[roomId] = {sessions: {}}; + data[roomId] = { sessions: {} }; } const sessionData = await this._olmDevice.exportInboundGroupSession( @@ -2901,7 +2897,7 @@ Crypto.prototype._backupPendingKeys = async function(limit) { await this._baseApis.sendKeyBackup( undefined, undefined, this.backupInfo.version, - {rooms: data}, + { rooms: data }, ); await this._cryptoStore.unmarkSessionsNeedingBackup(sessions); @@ -3301,7 +3297,6 @@ Crypto.prototype._getTrackedE2eRooms = function() { }); }; - Crypto.prototype._onToDeviceEvent = function(event) { try { logger.log(`received to_device ${event.getType()} from: ` + @@ -3442,7 +3437,7 @@ Crypto.prototype._onKeyVerificationMessage = function(event) { * @param {bool} data.liveEvent whether this is a live event */ Crypto.prototype._onTimelineEvent = function( - event, room, atStart, removed, {liveEvent} = {}, + event, room, atStart, removed, { liveEvent } = {}, ) { if (!InRoomChannel.validateEvent(event, this._baseApis)) { return; @@ -3580,7 +3575,7 @@ Crypto.prototype._onToDeviceBadEncrypted = async function(event) { this._olmDevice, sender, device, - {type: "m.dummy"}, + { type: "m.dummy" }, ); await this._olmDevice.recordSessionProblem(deviceKey, "wedged", true); @@ -3592,7 +3587,6 @@ Crypto.prototype._onToDeviceBadEncrypted = async function(event) { }, }); - // Most of the time this probably won't be necessary since we'll have queued up a key request when // we failed to decrypt the message and will be waiting a bit for the key to arrive before sending // it. This won't always be the case though so we need to re-send any that have already been sent @@ -3649,7 +3643,6 @@ Crypto.prototype._onRoomMembership = function(event, member, oldMembership) { alg.onRoomMembership(event, member, oldMembership); }; - /** * Called when we get an m.room_key_request event. * @@ -3802,7 +3795,6 @@ Crypto.prototype._processReceivedRoomKeyRequest = async function(req) { this.emit("crypto.roomKeyRequest", req); }; - /** * Helper for processReceivedRoomKeyRequests * @@ -3878,7 +3870,6 @@ Crypto.prototype._getRoomDecryptor = function(roomId, algorithm) { return alg; }; - /** * Get all the room decryptors for a given encryption algorithm. * @@ -3896,7 +3887,6 @@ Crypto.prototype._getRoomDecryptors = function(algorithm) { return decryptors; }; - /** * sign the given object with our ed25519 key * @@ -3916,7 +3906,6 @@ Crypto.prototype._signObject = async function(obj) { if (unsigned !== undefined) obj.unsigned = unsigned; }; - /** * The parameters of a room key request. The details of the request may * vary with the crypto algorithm, but the management and storage layers for diff --git a/src/crypto/key_passphrase.js b/src/crypto/key_passphrase.js index 47c964726..84384cc4e 100644 --- a/src/crypto/key_passphrase.js +++ b/src/crypto/key_passphrase.js @@ -15,7 +15,7 @@ See the License for the specific language governing permissions and limitations under the License. */ -import {randomString} from '../randomstring'; +import { randomString } from '../randomstring'; const DEFAULT_ITERATIONS = 500000; @@ -63,7 +63,7 @@ export async function deriveKey(password, salt, iterations, numBits = DEFAULT_BI const key = await subtleCrypto.importKey( 'raw', new TextEncoder().encode(password), - {name: 'PBKDF2'}, + { name: 'PBKDF2' }, false, ['deriveBits'], ); diff --git a/src/crypto/olmlib.js b/src/crypto/olmlib.js index f1e487e97..5be11040b 100644 --- a/src/crypto/olmlib.js +++ b/src/crypto/olmlib.js @@ -22,7 +22,7 @@ limitations under the License. * Utilities common to olm encryption algorithms */ -import {logger} from '../logger'; +import { logger } from '../logger'; import * as utils from "../utils"; import anotherjson from "another-json"; @@ -41,7 +41,6 @@ export const MEGOLM_ALGORITHM = "m.megolm.v1.aes-sha2"; */ export const MEGOLM_BACKUP_ALGORITHM = "m.megolm_backup.v1.curve25519-aes-sha2"; - /** * Encrypt an event payload for an Olm device * @@ -408,7 +407,6 @@ async function _verifyKeyAndStartSession(olmDevice, oneTimeKey, userId, deviceIn return sid; } - /** * Verify the signature on an object * diff --git a/src/crypto/store/indexeddb-crypto-store-backend.js b/src/crypto/store/indexeddb-crypto-store-backend.js index 58bfee576..9a54a3537 100644 --- a/src/crypto/store/indexeddb-crypto-store-backend.js +++ b/src/crypto/store/indexeddb-crypto-store-backend.js @@ -16,7 +16,7 @@ See the License for the specific language governing permissions and limitations under the License. */ -import {logger} from '../../logger'; +import { logger } from '../../logger'; import * as utils from "../../utils"; export const VERSION = 10; @@ -230,7 +230,7 @@ export class Backend { const cursor = ev.target.result; if (cursor) { const keyReq = cursor.value; - if (keyReq.recipients.includes({userId, deviceId})) { + if (keyReq.recipients.includes({ userId, deviceId })) { results.push(keyReq); } cursor.continue(); @@ -496,7 +496,7 @@ export class Backend { const lastProblem = problems[problems.length - 1]; for (const problem of problems) { if (problem.time > timestamp) { - result = Object.assign({}, problem, {fixed: lastProblem.fixed}); + result = Object.assign({}, problem, { fixed: lastProblem.fixed }); return; } } @@ -519,11 +519,11 @@ export class Backend { await Promise.all(devices.map((device) => { return new Promise((resolve) => { - const {userId, deviceInfo} = device; + const { userId, deviceInfo } = device; const getReq = objectStore.get([userId, deviceInfo.deviceId]); getReq.onsuccess = function() { if (!getReq.result) { - objectStore.put({userId, deviceId: deviceInfo.deviceId}); + objectStore.put({ userId, deviceId: deviceInfo.deviceId }); ret.push(device); } resolve(); @@ -768,9 +768,9 @@ export class Backend { const objectStore = txn.objectStore("shared_history_inbound_group_sessions"); const req = objectStore.get([roomId]); req.onsuccess = () => { - const {sessions} = req.result || {sessions: []}; + const { sessions } = req.result || { sessions: [] }; sessions.push([senderKey, sessionId]); - objectStore.put({roomId, sessions}); + objectStore.put({ roomId, sessions }); }; } @@ -784,7 +784,7 @@ export class Backend { const req = objectStore.get([roomId]); return new Promise((resolve, reject) => { req.onsuccess = () => { - const {sessions} = req.result || {sessions: []}; + const { sessions } = req.result || { sessions: [] }; resolve(sessions); }; req.onerror = reject; diff --git a/src/crypto/store/indexeddb-crypto-store.js b/src/crypto/store/indexeddb-crypto-store.js index 4cfe36128..02a99e4e2 100644 --- a/src/crypto/store/indexeddb-crypto-store.js +++ b/src/crypto/store/indexeddb-crypto-store.js @@ -16,11 +16,11 @@ See the License for the specific language governing permissions and limitations under the License. */ -import {logger} from '../../logger'; -import {LocalStorageCryptoStore} from './localStorage-crypto-store'; -import {MemoryCryptoStore} from './memory-crypto-store'; +import { logger } from '../../logger'; +import { LocalStorageCryptoStore } from './localStorage-crypto-store'; +import { MemoryCryptoStore } from './memory-crypto-store'; import * as IndexedDBCryptoStoreBackend from './indexeddb-crypto-store-backend'; -import {InvalidCryptoStoreError} from '../../errors'; +import { InvalidCryptoStoreError } from '../../errors'; import * as IndexedDBHelpers from "../../indexeddb-helpers"; /** diff --git a/src/crypto/store/localStorage-crypto-store.js b/src/crypto/store/localStorage-crypto-store.js index 3e673168a..0a982311e 100644 --- a/src/crypto/store/localStorage-crypto-store.js +++ b/src/crypto/store/localStorage-crypto-store.js @@ -15,8 +15,8 @@ See the License for the specific language governing permissions and limitations under the License. */ -import {logger} from '../../logger'; -import {MemoryCryptoStore} from './memory-crypto-store'; +import { logger } from '../../logger'; +import { MemoryCryptoStore } from './memory-crypto-store'; /** * Internal module. Partial localStorage backed storage for e2e. @@ -136,7 +136,7 @@ export class LocalStorageCryptoStore extends MemoryCryptoStore { async storeEndToEndSessionProblem(deviceKey, type, fixed) { const key = keyEndToEndSessionProblems(deviceKey); const problems = getJsonItem(this.store, key) || []; - problems.push({type, fixed, time: Date.now()}); + problems.push({ type, fixed, time: Date.now() }); problems.sort((a, b) => { return a.time - b.time; }); @@ -152,7 +152,7 @@ export class LocalStorageCryptoStore extends MemoryCryptoStore { const lastProblem = problems[problems.length - 1]; for (const problem of problems) { if (problem.time > timestamp) { - return Object.assign({}, problem, {fixed: lastProblem.fixed}); + return Object.assign({}, problem, { fixed: lastProblem.fixed }); } } if (lastProblem.fixed) { @@ -168,7 +168,7 @@ export class LocalStorageCryptoStore extends MemoryCryptoStore { const ret = []; for (const device of devices) { - const {userId, deviceInfo} = device; + const { userId, deviceInfo } = device; if (userId in notifiedErrorDevices) { if (!(deviceInfo.deviceId in notifiedErrorDevices[userId])) { ret.push(device); @@ -176,7 +176,7 @@ export class LocalStorageCryptoStore extends MemoryCryptoStore { } } else { ret.push(device); - notifiedErrorDevices[userId] = {[deviceInfo.deviceId]: true }; + notifiedErrorDevices[userId] = { [deviceInfo.deviceId]: true }; } } diff --git a/src/crypto/store/memory-crypto-store.js b/src/crypto/store/memory-crypto-store.js index ac4e7be0b..9577fcad3 100644 --- a/src/crypto/store/memory-crypto-store.js +++ b/src/crypto/store/memory-crypto-store.js @@ -16,7 +16,7 @@ See the License for the specific language governing permissions and limitations under the License. */ -import {logger} from '../../logger'; +import { logger } from '../../logger'; import * as utils from "../../utils"; /** @@ -186,7 +186,7 @@ export class MemoryCryptoStore { for (const req of this._outgoingRoomKeyRequests) { for (const state of wantedStates) { - if (req.state === state && req.recipients.includes({userId, deviceId})) { + if (req.state === state && req.recipients.includes({ userId, deviceId })) { results.push(req); } } @@ -324,7 +324,7 @@ export class MemoryCryptoStore { async storeEndToEndSessionProblem(deviceKey, type, fixed) { const problems = this._sessionProblems[deviceKey] = this._sessionProblems[deviceKey] || []; - problems.push({type, fixed, time: Date.now()}); + problems.push({ type, fixed, time: Date.now() }); problems.sort((a, b) => { return a.time - b.time; }); @@ -338,7 +338,7 @@ export class MemoryCryptoStore { const lastProblem = problems[problems.length - 1]; for (const problem of problems) { if (problem.time > timestamp) { - return Object.assign({}, problem, {fixed: lastProblem.fixed}); + return Object.assign({}, problem, { fixed: lastProblem.fixed }); } } if (lastProblem.fixed) { @@ -353,7 +353,7 @@ export class MemoryCryptoStore { const ret = []; for (const device of devices) { - const {userId, deviceInfo} = device; + const { userId, deviceInfo } = device; if (userId in notifiedErrorDevices) { if (!(deviceInfo.deviceId in notifiedErrorDevices[userId])) { ret.push(device); @@ -361,7 +361,7 @@ export class MemoryCryptoStore { } } else { ret.push(device); - notifiedErrorDevices[userId] = {[deviceInfo.deviceId]: true }; + notifiedErrorDevices[userId] = { [deviceInfo.deviceId]: true }; } } diff --git a/src/crypto/verification/Base.js b/src/crypto/verification/Base.js index 144d42e90..fd23668ac 100644 --- a/src/crypto/verification/Base.js +++ b/src/crypto/verification/Base.js @@ -20,12 +20,12 @@ limitations under the License. * @module crypto/verification/Base */ -import {MatrixEvent} from '../../models/event'; -import {EventEmitter} from 'events'; -import {logger} from '../../logger'; -import {DeviceInfo} from '../deviceinfo'; -import {newTimeoutError} from "./Error"; -import {requestKeysDuringVerification} from "../CrossSigning"; +import { MatrixEvent } from '../../models/event'; +import { EventEmitter } from 'events'; +import { logger } from '../../logger'; +import { DeviceInfo } from '../deviceinfo'; +import { newTimeoutError } from "./Error"; +import { requestKeysDuringVerification } from "../CrossSigning"; const timeoutException = new Error("Verification timed out"); @@ -138,7 +138,7 @@ export class VerificationBase extends EventEmitter { switchStartEvent(event) { if (this.canSwitchStartEvent(event)) { logger.log("Verification Base: switching verification start event", - {restartingFlow: !!this._rejectEvent}); + { restartingFlow: !!this._rejectEvent }); if (this._rejectEvent) { const reject = this._rejectEvent; this._rejectEvent = undefined; @@ -167,7 +167,7 @@ export class VerificationBase extends EventEmitter { // there is only promise to reject if verify has been called if (reject) { const content = e.getContent(); - const {reason, code} = content; + const { reason, code } = content; reject(new Error(`Other side cancelled verification ` + `because ${reason} (${code})`)); } diff --git a/src/crypto/verification/Error.js b/src/crypto/verification/Error.js index 5fe9fde4c..794976f56 100644 --- a/src/crypto/verification/Error.js +++ b/src/crypto/verification/Error.js @@ -20,10 +20,10 @@ limitations under the License. * @module crypto/verification/Error */ -import {MatrixEvent} from "../../models/event"; +import { MatrixEvent } from "../../models/event"; export function newVerificationError(code, reason, extradata) { - const content = Object.assign({}, {code, reason}, extradata); + const content = Object.assign({}, { code, reason }, extradata); return new MatrixEvent({ type: "m.key.verification.cancel", content, @@ -87,9 +87,9 @@ export const newInvalidMessageError = errorFactory( export function errorFromEvent(event) { const content = event.getContent(); if (content) { - const {code, reason} = content; - return {code, reason}; + const { code, reason } = content; + return { code, reason }; } else { - return {code: "Unknown error", reason: "m.unknown"}; + return { code: "Unknown error", reason: "m.unknown" }; } } diff --git a/src/crypto/verification/IllegalMethod.js b/src/crypto/verification/IllegalMethod.js index 2f05a28c7..3eb8d79dd 100644 --- a/src/crypto/verification/IllegalMethod.js +++ b/src/crypto/verification/IllegalMethod.js @@ -20,7 +20,7 @@ limitations under the License. * @module crypto/verification/IllegalMethod */ -import {VerificationBase as Base} from "./Base"; +import { VerificationBase as Base } from "./Base"; /** * @class crypto/verification/IllegalMethod/IllegalMethod diff --git a/src/crypto/verification/QRCode.js b/src/crypto/verification/QRCode.js index adfe5e28d..1a271c0a6 100644 --- a/src/crypto/verification/QRCode.js +++ b/src/crypto/verification/QRCode.js @@ -20,13 +20,13 @@ limitations under the License. * @module crypto/verification/QRCode */ -import {VerificationBase as Base} from "./Base"; +import { VerificationBase as Base } from "./Base"; import { newKeyMismatchError, newUserCancelledError, } from './Error'; -import {encodeUnpaddedBase64, decodeBase64} from "../olmlib"; -import {logger} from '../../logger'; +import { encodeUnpaddedBase64, decodeBase64 } from "../olmlib"; +import { logger } from '../../logger'; export const SHOW_QR_CODE_METHOD = "m.qr_code.show.v1"; export const SCAN_QR_CODE_METHOD = "m.qr_code.scan.v1"; @@ -51,7 +51,7 @@ export class ReciprocateQRCode extends Base { "with this method yet."); } - const {qrCodeData} = this.request; + const { qrCodeData } = this.request; // 1. check the secret if (this.startEvent.getContent()['secret'] !== qrCodeData.encodedSharedSecret) { throw newKeyMismatchError(); diff --git a/src/crypto/verification/SAS.js b/src/crypto/verification/SAS.js index c69f9f7e8..8c3de1768 100644 --- a/src/crypto/verification/SAS.js +++ b/src/crypto/verification/SAS.js @@ -19,7 +19,7 @@ limitations under the License. * @module crypto/verification/SAS */ -import {VerificationBase as Base, SwitchStartEventError} from "./Base"; +import { VerificationBase as Base, SwitchStartEventError } from "./Base"; import anotherjson from 'another-json'; import { errorFactory, @@ -28,7 +28,7 @@ import { newUnknownMethodError, newUserCancelledError, } from './Error'; -import {logger} from '../../logger'; +import { logger } from '../../logger'; const START_TYPE = "m.key.verification.start"; @@ -323,7 +323,6 @@ export class SAS extends Base { key: this.ourSASPubKey, }); - e = await this._waitForEvent("m.key.verification.key"); // FIXME: make sure event is properly formed content = e.getContent(); @@ -353,7 +352,6 @@ export class SAS extends Base { this.emit("show_sas", this.sasEvent); }); - [e] = await Promise.all([ this._waitForEvent("m.key.verification.mac") .then((e) => { @@ -411,7 +409,6 @@ export class SAS extends Base { commitment: olmutil.sha256(commitmentStr), }); - let e = await this._waitForEvent("m.key.verification.key"); // FIXME: make sure event is properly formed content = e.getContent(); @@ -440,7 +437,6 @@ export class SAS extends Base { this.emit("show_sas", this.sasEvent); }); - [e] = await Promise.all([ this._waitForEvent("m.key.verification.mac") .then((e) => { diff --git a/src/crypto/verification/request/InRoomChannel.js b/src/crypto/verification/request/InRoomChannel.js index dfcbfee0e..72b6af4b2 100644 --- a/src/crypto/verification/request/InRoomChannel.js +++ b/src/crypto/verification/request/InRoomChannel.js @@ -21,7 +21,7 @@ import { READY_TYPE, START_TYPE, } from "./VerificationRequest"; -import {logger} from '../../../logger'; +import { logger } from '../../../logger'; const MESSAGE_TYPE = "m.room.message"; const M_REFERENCE = "m.reference"; @@ -157,7 +157,7 @@ export class InRoomChannel { if (type === MESSAGE_TYPE) { const content = event.getContent(); if (content) { - const {msgtype} = content; + const { msgtype } = content; if (msgtype === REQUEST_TYPE) { return REQUEST_TYPE; } diff --git a/src/crypto/verification/request/ToDeviceChannel.js b/src/crypto/verification/request/ToDeviceChannel.js index 9f3659389..f45a69d3d 100644 --- a/src/crypto/verification/request/ToDeviceChannel.js +++ b/src/crypto/verification/request/ToDeviceChannel.js @@ -15,8 +15,8 @@ See the License for the specific language governing permissions and limitations under the License. */ -import {randomString} from '../../../randomstring'; -import {logger} from '../../../logger'; +import { randomString } from '../../../randomstring'; +import { logger } from '../../../logger'; import { CANCEL_TYPE, PHASE_STARTED, @@ -26,8 +26,8 @@ import { START_TYPE, VerificationRequest, } from "./VerificationRequest"; -import {errorFromEvent, newUnexpectedMessageError} from "../Error"; -import {MatrixEvent} from "../../../models/event"; +import { errorFromEvent, newUnexpectedMessageError } from "../Error"; +import { MatrixEvent } from "../../../models/event"; /** * A key verification channel that sends verification events over to_device messages. @@ -277,7 +277,7 @@ export class ToDeviceChannel { msgMap[deviceId] = content; } - return this._client.sendToDevice(type, {[this.userId]: msgMap}); + return this._client.sendToDevice(type, { [this.userId]: msgMap }); } else { return Promise.resolve(); } @@ -292,7 +292,6 @@ export class ToDeviceChannel { } } - export class ToDeviceRequests { constructor() { this._requestsByUserId = new Map(); diff --git a/src/crypto/verification/request/VerificationRequest.js b/src/crypto/verification/request/VerificationRequest.js index a77b8c96d..6a4f290b4 100644 --- a/src/crypto/verification/request/VerificationRequest.js +++ b/src/crypto/verification/request/VerificationRequest.js @@ -15,15 +15,15 @@ See the License for the specific language governing permissions and limitations under the License. */ -import {logger} from '../../../logger'; -import {EventEmitter} from 'events'; +import { logger } from '../../../logger'; +import { EventEmitter } from 'events'; import { errorFactory, errorFromEvent, newUnexpectedMessageError, newUnknownMethodError, } from "../Error"; -import {QRCodeData, SCAN_QR_CODE_METHOD} from "../QRCode"; +import { QRCodeData, SCAN_QR_CODE_METHOD } from "../QRCode"; // How long after the event's timestamp that the request times out const TIMEOUT_FROM_EVENT_TS = 10 * 60 * 1000; // 10 minutes @@ -37,7 +37,6 @@ const TIMEOUT_FROM_EVENT_RECEIPT = 2 * 60 * 1000; // 2 minutes // are this amount of time away from expiring. const VERIFICATION_REQUEST_MARGIN = 3 * 1000; // 3 seconds - export const EVENT_PREFIX = "m.key.verification."; export const REQUEST_TYPE = EVENT_PREFIX + "request"; export const START_TYPE = EVENT_PREFIX + "start"; @@ -52,7 +51,6 @@ export const PHASE_STARTED = 4; export const PHASE_CANCELLED = 5; export const PHASE_DONE = 6; - /** * State machine for verification requests. * Things that differ based on what channel is used to @@ -98,7 +96,6 @@ export class VerificationRequest extends EventEmitter { static validateEvent(type, event, client) { const content = event.getContent(); - if (!type || !type.startsWith(EVENT_PREFIX)) { return false; } @@ -265,7 +262,7 @@ export class VerificationRequest extends EventEmitter { if (!content) { return false; } - const {methods} = content; + const { methods } = content; if (!Array.isArray(methods)) { return false; } @@ -355,7 +352,6 @@ export class VerificationRequest extends EventEmitter { return this._observeOnly; } - /** * Gets which device the verification should be started with * given the events sent so far in the verification. This is the @@ -414,7 +410,7 @@ export class VerificationRequest extends EventEmitter { async sendRequest() { if (!this.observeOnly && this._phase === PHASE_UNSENT) { const methods = [...this._verificationMethods.keys()]; - await this.channel.send(REQUEST_TYPE, {methods}); + await this.channel.send(REQUEST_TYPE, { methods }); } } @@ -424,7 +420,7 @@ export class VerificationRequest extends EventEmitter { * @param {string?} error.code the error code to send the cancellation with * @returns {Promise} resolves when the event has been sent. */ - async cancel({reason = "User declined", code = "m.user"} = {}) { + async cancel({ reason = "User declined", code = "m.user" } = {}) { if (!this.observeOnly && this._phase !== PHASE_CANCELLED) { this._declining = true; this.emit("change"); @@ -432,7 +428,7 @@ export class VerificationRequest extends EventEmitter { return this._verifier.cancel(errorFactory(code, reason)()); } else { this._cancellingUserId = this._client.getUserId(); - await this.channel.send(CANCEL_TYPE, {code, reason}); + await this.channel.send(CANCEL_TYPE, { code, reason }); } } } @@ -446,7 +442,7 @@ export class VerificationRequest extends EventEmitter { const methods = [...this._verificationMethods.keys()]; this._accepting = true; this.emit("change"); - await this.channel.send(READY_TYPE, {methods}); + await this.channel.send(READY_TYPE, { methods }); } } @@ -499,20 +495,20 @@ export class VerificationRequest extends EventEmitter { } _calculatePhaseTransitions() { - const transitions = [{phase: PHASE_UNSENT}]; + const transitions = [{ phase: PHASE_UNSENT }]; const phase = () => transitions[transitions.length - 1].phase; // always pass by .request first to be sure channel.userId has been set const hasRequestByThem = this._eventsByThem.has(REQUEST_TYPE); const requestEvent = this._getEventBy(REQUEST_TYPE, hasRequestByThem); if (requestEvent) { - transitions.push({phase: PHASE_REQUESTED, event: requestEvent}); + transitions.push({ phase: PHASE_REQUESTED, event: requestEvent }); } const readyEvent = requestEvent && this._getEventBy(READY_TYPE, !hasRequestByThem); if (readyEvent && phase() === PHASE_REQUESTED) { - transitions.push({phase: PHASE_READY, event: readyEvent}); + transitions.push({ phase: PHASE_READY, event: readyEvent }); } let startEvent; @@ -535,18 +531,18 @@ export class VerificationRequest extends EventEmitter { const fromUnsentPhase = phase() === PHASE_UNSENT && this.channel.constructor.canCreateRequest(START_TYPE); if (fromRequestPhase || phase() === PHASE_READY || fromUnsentPhase) { - transitions.push({phase: PHASE_STARTED, event: startEvent}); + transitions.push({ phase: PHASE_STARTED, event: startEvent }); } } const ourDoneEvent = this._eventsByUs.get(DONE_TYPE); if (this._verifierHasFinished || (ourDoneEvent && phase() === PHASE_STARTED)) { - transitions.push({phase: PHASE_DONE}); + transitions.push({ phase: PHASE_DONE }); } const cancelEvent = this._getEventByEither(CANCEL_TYPE); if ((this._cancelled || cancelEvent) && phase() !== PHASE_DONE) { - transitions.push({phase: PHASE_CANCELLED, event: cancelEvent}); + transitions.push({ phase: PHASE_CANCELLED, event: cancelEvent }); return transitions; } @@ -554,7 +550,7 @@ export class VerificationRequest extends EventEmitter { } _transitionToPhase(transition) { - const {phase, event} = transition; + const { phase, event } = transition; // get common methods if (phase === PHASE_REQUESTED || phase === PHASE_READY) { if (!this._wasSentByOwnDevice(event)) { @@ -581,7 +577,7 @@ export class VerificationRequest extends EventEmitter { } // create verifier if (phase === PHASE_STARTED) { - const {method} = event.getContent(); + const { method } = event.getContent(); if (!this._verifier && !this.observeOnly) { this._verifier = this._createVerifier(method, event); if (!this._verifier) { @@ -731,7 +727,7 @@ export class VerificationRequest extends EventEmitter { } const lastTransition = newTransitions[newTransitions.length - 1]; - const {phase} = lastTransition; + const { phase } = lastTransition; this._setupTimeout(phase); // set phase as last thing as this emits the "change" event @@ -809,7 +805,7 @@ export class VerificationRequest extends EventEmitter { logger.warn(`Cancelling, unexpected ${type} verification ` + `event from ${event.getSender()}`); const reason = `Unexpected ${type} event in phase ${this.phase}`; - await this.cancel(errorFromEvent(newUnexpectedMessageError({reason}))); + await this.cancel(errorFromEvent(newUnexpectedMessageError({ reason }))); return true; } return false; @@ -849,7 +845,7 @@ export class VerificationRequest extends EventEmitter { if (!targetDevice) { targetDevice = this.targetDevice; } - const {userId, deviceId} = targetDevice; + const { userId, deviceId } = targetDevice; const VerifierCtor = this._verificationMethods.get(method); if (!VerifierCtor) { diff --git a/src/errors.js b/src/errors.js index 32d72d9a8..186fc6911 100644 --- a/src/errors.js +++ b/src/errors.js @@ -22,7 +22,6 @@ InvalidStoreError.prototype = Object.create(Error.prototype, { }); Reflect.setPrototypeOf(InvalidStoreError, Error); - export function InvalidCryptoStoreError(reason) { const message = `Crypto store is invalid because ${reason}, ` + `please stop the client, delete all data and start the client again`; diff --git a/src/filter.js b/src/filter.js index 6ab581c6a..08e747092 100644 --- a/src/filter.js +++ b/src/filter.js @@ -19,7 +19,7 @@ limitations under the License. * @module filter */ -import {FilterComponent} from "./filter-component"; +import { FilterComponent } from "./filter-component"; /** * @param {Object} obj diff --git a/src/http-api.js b/src/http-api.js index 26b3d5f5b..a48c165d0 100644 --- a/src/http-api.js +++ b/src/http-api.js @@ -20,9 +20,9 @@ limitations under the License. * @module http-api */ -import {parse as parseContentType} from "content-type"; +import { parse as parseContentType } from "content-type"; import * as utils from "./utils"; -import {logger} from './logger'; +import { logger } from './logger'; // we use our own implementation of setTimeout, so that if we get suspended in // the middle of a /sync, we cancel the sync as soon as we awake, rather than @@ -344,7 +344,7 @@ MatrixHttpApi.prototype = { promise = this.authedRequest( opts.callback, "POST", "/upload", queryParams, body, { prefix: "/_matrix/media/r0", - headers: {"Content-Type": contentType}, + headers: { "Content-Type": contentType }, json: false, bodyParser: bodyParser, }, @@ -803,7 +803,8 @@ const requestCallback = function( } if (!err) { try { - if (response.statusCode >= 400) { + const httpStatus = response.status || response.statusCode; // XMLHttpRequest vs http.IncomingMessage + if (httpStatus >= 400) { err = parseErrorResponse(response, body); } else if (bodyParser) { body = bodyParser(body); @@ -818,7 +819,7 @@ const requestCallback = function( userDefinedCallback(err); } else { const res = { - code: response.statusCode, + code: response.status || response.statusCode, // XMLHttpRequest vs http.IncomingMessage // XXX: why do we bother with this? it doesn't work for // XMLHttpRequest, so clearly we don't use it. @@ -842,7 +843,7 @@ const requestCallback = function( * @returns {Error} */ function parseErrorResponse(response, body) { - const httpStatus = response.statusCode; + const httpStatus = response.status || response.statusCode; // XMLHttpRequest vs http.IncomingMessage const contentType = getResponseContentType(response); let err; @@ -862,7 +863,6 @@ function parseErrorResponse(response, body) { return err; } - /** * extract the Content-Type header from the response object, and * parse it to a `{type, parameters}` object. diff --git a/src/indexeddb-worker.js b/src/indexeddb-worker.js index b51d90afd..45facc485 100644 --- a/src/indexeddb-worker.js +++ b/src/indexeddb-worker.js @@ -21,5 +21,5 @@ limitations under the License. */ /** The {@link module:indexeddb-store-worker~IndexedDBStoreWorker} class. */ -export {IndexedDBStoreWorker} from "./store/indexeddb-store-worker"; +export { IndexedDBStoreWorker } from "./store/indexeddb-store-worker"; diff --git a/src/interactive-auth.js b/src/interactive-auth.js index edf5a4290..c1537fe85 100644 --- a/src/interactive-auth.js +++ b/src/interactive-auth.js @@ -20,7 +20,7 @@ limitations under the License. import url from "url"; import * as utils from "./utils"; -import {logger} from './logger'; +import { logger } from './logger'; const EMAIL_STAGE_TYPE = "m.login.email.identity"; const MSISDN_STAGE_TYPE = "m.login.msisdn"; diff --git a/src/matrix.ts b/src/matrix.ts index 144cd07c0..92f374a16 100644 --- a/src/matrix.ts +++ b/src/matrix.ts @@ -18,15 +18,15 @@ limitations under the License. import type Request from "request"; -import {MemoryCryptoStore} from "./crypto/store/memory-crypto-store"; -import {LocalStorageCryptoStore} from "./crypto/store/localStorage-crypto-store"; -import {IndexedDBCryptoStore} from "./crypto/store/indexeddb-crypto-store"; -import {MemoryStore} from "./store/memory"; -import {StubStore} from "./store/stub"; -import {LocalIndexedDBStoreBackend} from "./store/indexeddb-local-backend"; -import {RemoteIndexedDBStoreBackend} from "./store/indexeddb-remote-backend"; -import {MatrixScheduler} from "./scheduler"; -import {MatrixClient} from "./client"; +import { MemoryCryptoStore } from "./crypto/store/memory-crypto-store"; +import { LocalStorageCryptoStore } from "./crypto/store/localStorage-crypto-store"; +import { IndexedDBCryptoStore } from "./crypto/store/indexeddb-crypto-store"; +import { MemoryStore } from "./store/memory"; +import { StubStore } from "./store/stub"; +import { LocalIndexedDBStoreBackend } from "./store/indexeddb-local-backend"; +import { RemoteIndexedDBStoreBackend } from "./store/indexeddb-remote-backend"; +import { MatrixScheduler } from "./scheduler"; +import { MatrixClient } from "./client"; export * from "./client"; export * from "./http-api"; @@ -59,7 +59,6 @@ export { setVideoInput as setMatrixCallVideoInput, } from "./webrtc/call"; - // expose the underlying request object so different environments can use // different request libs (e.g. request or browser-request) let requestInstance; diff --git a/src/models/event-context.js b/src/models/event-context.js index 5ffb103fe..b04018aba 100644 --- a/src/models/event-context.js +++ b/src/models/event-context.js @@ -36,10 +36,10 @@ limitations under the License. export function EventContext(ourEvent) { this._timeline = [ourEvent]; this._ourEventIndex = 0; - this._paginateTokens = {b: null, f: null}; + this._paginateTokens = { b: null, f: null }; // this is used by MatrixClient to keep track of active requests - this._paginateRequests = {b: null, f: null}; + this._paginateRequests = { b: null, f: null }; } /** diff --git a/src/models/event-timeline-set.js b/src/models/event-timeline-set.js index 784dea359..5835e5343 100644 --- a/src/models/event-timeline-set.js +++ b/src/models/event-timeline-set.js @@ -19,12 +19,12 @@ limitations under the License. * @module models/event-timeline-set */ -import {EventEmitter} from "events"; -import {EventTimeline} from "./event-timeline"; -import {EventStatus} from "./event"; +import { EventEmitter } from "events"; +import { EventTimeline } from "./event-timeline"; +import { EventStatus } from "./event"; import * as utils from "../utils"; -import {logger} from '../logger'; -import {Relations} from './relations'; +import { logger } from '../logger'; +import { Relations } from './relations'; // var DEBUG = false; const DEBUG = true; @@ -271,7 +271,6 @@ EventTimelineSet.prototype.addTimeline = function() { return timeline; }; - /** * Add events to a timeline * @@ -474,7 +473,7 @@ EventTimelineSet.prototype.addEventsToTimeline = function(events, toStartOfTimel // timeline we ended up on. if (lastEventWasNew || !didUpdate) { if (direction === EventTimeline.FORWARDS && timeline === this._liveTimeline) { - logger.warn({lastEventWasNew, didUpdate}); // for debugging + logger.warn({ lastEventWasNew, didUpdate }); // for debugging logger.warn( `Refusing to set forwards pagination token of live timeline ` + `${timeline} to ${paginationToken}`, @@ -740,16 +739,11 @@ EventTimelineSet.prototype.setRelationsTarget = function(event) { if (!relationsForEvent) { return; } - // don't need it for non m.replace relations for now - const relationsWithRelType = relationsForEvent["m.replace"]; - if (!relationsWithRelType) { - return; - } - // only doing replacements for messages for now (e.g. edits) - const relationsWithEventType = relationsWithRelType["m.room.message"]; - if (relationsWithEventType) { - relationsWithEventType.setTargetEvent(event); + for (const relationsWithRelType of Object.values(relationsForEvent)) { + for (const relationsWithEventType of Object.values(relationsWithRelType)) { + relationsWithEventType.setTargetEvent(event); + } } }; @@ -797,7 +791,6 @@ EventTimelineSet.prototype.aggregateRelations = function(event) { } let relationsWithEventType = relationsWithRelType[eventType]; - let isNewRelations = false; let relatesToEvent; if (!relationsWithEventType) { relationsWithEventType = relationsWithRelType[eventType] = new Relations( @@ -805,7 +798,6 @@ EventTimelineSet.prototype.aggregateRelations = function(event) { eventType, this.room, ); - isNewRelations = true; relatesToEvent = this.findEventById(relatesToEventId) || this.room.getPendingEvent(relatesToEventId); if (relatesToEvent) { relationsWithEventType.setTargetEvent(relatesToEvent); @@ -813,11 +805,6 @@ EventTimelineSet.prototype.aggregateRelations = function(event) { } relationsWithEventType.addEvent(event); - - // only emit once event has been added to relations - if (isNewRelations && relatesToEvent) { - relatesToEvent.emit("Event.relationsCreated", relationType, eventType); - } }; /** diff --git a/src/models/event-timeline.js b/src/models/event-timeline.js index 20fee86a2..288659611 100644 --- a/src/models/event-timeline.js +++ b/src/models/event-timeline.js @@ -19,7 +19,7 @@ limitations under the License. * @module models/event-timeline */ -import {RoomState} from "./room-state"; +import { RoomState } from "./room-state"; /** * Construct a new EventTimeline @@ -55,7 +55,7 @@ export function EventTimeline(eventTimelineSet) { this._nextTimeline = null; // this is used by client.js - this._paginationRequests = {'b': null, 'f': null}; + this._paginationRequests = { 'b': null, 'f': null }; this._name = this._roomId + ":" + new Date().toISOString(); } diff --git a/src/models/event.js b/src/models/event.js index c2bd94724..1b3bec755 100644 --- a/src/models/event.js +++ b/src/models/event.js @@ -21,9 +21,9 @@ limitations under the License. * @module models/event */ -import {EventEmitter} from 'events'; +import { EventEmitter } from 'events'; import * as utils from '../utils'; -import {logger} from '../logger'; +import { logger } from '../logger'; /** * Enum for event statuses. @@ -180,7 +180,6 @@ export const MatrixEvent = function( }; utils.inherits(MatrixEvent, EventEmitter); - utils.extend(MatrixEvent.prototype, { /** * Get the event_id for this event. @@ -1146,7 +1145,6 @@ utils.extend(MatrixEvent.prototype, { }, }); - /* _REDACT_KEEP_KEY_MAP gives the keys we keep when an event is redacted * * This is specified here: @@ -1165,17 +1163,16 @@ const _REDACT_KEEP_KEY_MAP = [ // a map from event type to the .content keys we keep when an event is redacted const _REDACT_KEEP_CONTENT_MAP = { - 'm.room.member': {'membership': 1}, - 'm.room.create': {'creator': 1}, - 'm.room.join_rules': {'join_rule': 1}, - 'm.room.power_levels': {'ban': 1, 'events': 1, 'events_default': 1, + 'm.room.member': { 'membership': 1 }, + 'm.room.create': { 'creator': 1 }, + 'm.room.join_rules': { 'join_rule': 1 }, + 'm.room.power_levels': { 'ban': 1, 'events': 1, 'events_default': 1, 'kick': 1, 'redact': 1, 'state_default': 1, 'users': 1, 'users_default': 1, }, - 'm.room.aliases': {'aliases': 1}, + 'm.room.aliases': { 'aliases': 1 }, }; - /** * Fires when an event is decrypted * diff --git a/src/models/group.js b/src/models/group.js index 74b86f53e..e228aa1be 100644 --- a/src/models/group.js +++ b/src/models/group.js @@ -20,7 +20,7 @@ limitations under the License. */ import * as utils from "../utils"; -import {EventEmitter} from "events"; +import { EventEmitter } from "events"; /** * Construct a new Group. diff --git a/src/models/relations.js b/src/models/relations.js index 6be559af8..1e24d534e 100644 --- a/src/models/relations.js +++ b/src/models/relations.js @@ -14,9 +14,9 @@ See the License for the specific language governing permissions and limitations under the License. */ -import {EventEmitter} from 'events'; -import {EventStatus} from '../models/event'; -import {logger} from '../logger'; +import { EventEmitter } from 'events'; +import { EventStatus } from '../models/event'; +import { logger } from '../logger'; /** * A container for relation events that supports easy access to common ways of @@ -48,6 +48,7 @@ export class Relations extends EventEmitter { this._sortedAnnotationsByKey = []; this._targetEvent = null; this._room = room; + this._creationEmitted = false; } /** @@ -94,6 +95,8 @@ export class Relations extends EventEmitter { event.on("Event.beforeRedaction", this._onBeforeRedaction); this.emit("Relations.add", event); + + this._maybeEmitCreated(); } /** @@ -345,6 +348,7 @@ export class Relations extends EventEmitter { return; } this._targetEvent = event; + if (this.relationType === "m.replace") { const replacement = await this.getLastReplacement(); // this is the initial update, so only call it if we already have something @@ -353,5 +357,24 @@ export class Relations extends EventEmitter { this._targetEvent.makeReplaced(replacement); } } + + this._maybeEmitCreated(); + } + + _maybeEmitCreated() { + if (this._creationEmitted) { + return; + } + // Only emit we're "created" once we have a target event instance _and_ + // at least one related event. + if (!this._targetEvent || !this._relations.size) { + return; + } + this._creationEmitted = true; + this._targetEvent.emit( + "Event.relationsCreated", + this.relationType, + this.eventType, + ); } } diff --git a/src/models/room-member.js b/src/models/room-member.js index 24bfc9ce4..32ed9dc5d 100644 --- a/src/models/room-member.js +++ b/src/models/room-member.js @@ -19,8 +19,8 @@ limitations under the License. * @module models/room-member */ -import {EventEmitter} from "events"; -import {getHttpUriForMxc} from "../content-repo"; +import { EventEmitter } from "events"; +import { getHttpUriForMxc } from "../content-repo"; import * as utils from "../utils"; /** @@ -203,7 +203,6 @@ RoomMember.prototype.getLastModifiedTime = function() { return this._modified; }; - RoomMember.prototype.isKicked = function() { return this.membership === "leave" && this.events.member.getSender() !== this.events.member.getStateKey(); @@ -240,7 +239,6 @@ RoomMember.prototype.getDMInviter = function() { } }; - /** * Get the avatar URL for a room member. * @param {string} baseUrl The base homeserver URL See diff --git a/src/models/room-state.js b/src/models/room-state.js index 1b4943f5f..e991df57c 100644 --- a/src/models/room-state.js +++ b/src/models/room-state.js @@ -19,11 +19,11 @@ limitations under the License. * @module models/room-state */ -import {EventEmitter} from "events"; -import {RoomMember} from "./room-member"; -import {logger} from '../logger'; +import { EventEmitter } from "events"; +import { RoomMember } from "./room-member"; +import { logger } from '../logger'; import * as utils from "../utils"; -import {EventType} from "../@types/event"; +import { EventType } from "../@types/event"; // possible statuses for out-of-band member loading const OOB_STATUS_NOTSTARTED = 1; @@ -735,7 +735,6 @@ RoomState.prototype.getJoinRule = function() { return joinRuleContent["join_rule"] || "invite"; }; - function _updateThirdPartyTokenCache(roomState, memberEvent) { if (!memberEvent.getContent().third_party_invite) { return; diff --git a/src/models/user.js b/src/models/user.js index 0a98ea9ed..ec1127e84 100644 --- a/src/models/user.js +++ b/src/models/user.js @@ -20,7 +20,7 @@ limitations under the License. */ import * as utils from "../utils"; -import {EventEmitter} from "events"; +import { EventEmitter } from "events"; /** * Construct a new User. A User must have an ID and can optionally have extra @@ -139,7 +139,6 @@ User.prototype.setDisplayName = function(name) { } }; - /** * Manually set this user's non-disambiguated display name. No event is emitted * in response to this as there is no underlying MatrixEvent to emit with. @@ -153,7 +152,6 @@ User.prototype.setRawDisplayName = function(name) { } }; - /** * Manually set this user's avatar URL. No event is emitted in response to this * as there is no underlying MatrixEvent to emit with. diff --git a/src/pushprocessor.js b/src/pushprocessor.js index 0e8958b09..4ab881623 100644 --- a/src/pushprocessor.js +++ b/src/pushprocessor.js @@ -15,8 +15,8 @@ See the License for the specific language governing permissions and limitations under the License. */ -import {escapeRegExp, globToRegexp, isNullOrUndefined} from "./utils"; -import {logger} from './logger'; +import { escapeRegExp, globToRegexp, isNullOrUndefined } from "./utils"; +import { logger } from './logger'; /** * @module pushprocessor @@ -360,7 +360,6 @@ export function PushProcessor(client) { return ret; }; - /** * Get the user's push actions for the given event * @@ -468,4 +467,3 @@ PushProcessor.rewriteDefaultRules = function(incomingRules) { * noise. */ - diff --git a/src/realtime-callbacks.js b/src/realtime-callbacks.js index c4d13f9e3..5fa2008ca 100644 --- a/src/realtime-callbacks.js +++ b/src/realtime-callbacks.js @@ -24,7 +24,7 @@ limitations under the License. * it will instead fire as soon as possible after resume. */ -import {logger} from './logger'; +import { logger } from './logger'; // we schedule a callback at least this often, to check if we've missed out on // some wall-clock time due to being suspended. @@ -177,7 +177,6 @@ function _runCallbacks() { } } - /* search in a sorted array. * * returns the index of the last element for which func returns diff --git a/src/scheduler.js b/src/scheduler.js index e0b2bb8ee..37e231ce0 100644 --- a/src/scheduler.js +++ b/src/scheduler.js @@ -21,7 +21,7 @@ limitations under the License. * @module scheduler */ import * as utils from "./utils"; -import {logger} from './logger'; +import { logger } from './logger'; const DEBUG = false; // set true to enable console logging. @@ -93,7 +93,6 @@ MatrixScheduler.prototype.removeEventFromQueue = function(event) { return removed; }; - /** * Set the process function. Required for events in the queue to be processed. * If set after events have been added to the queue, this will immediately start diff --git a/src/store/indexeddb-local-backend.js b/src/store/indexeddb-local-backend.js index 3a0af28b1..21364991c 100644 --- a/src/store/indexeddb-local-backend.js +++ b/src/store/indexeddb-local-backend.js @@ -16,10 +16,10 @@ See the License for the specific language governing permissions and limitations under the License. */ -import {SyncAccumulator} from "../sync-accumulator"; +import { SyncAccumulator } from "../sync-accumulator"; import * as utils from "../utils"; import * as IndexedDBHelpers from "../indexeddb-helpers"; -import {logger} from '../logger'; +import { logger } from '../logger'; const VERSION = 3; @@ -45,10 +45,9 @@ function upgradeSchemaV2(db) { function upgradeSchemaV3(db) { db.createObjectStore("client_options", - { keyPath: ["clobber"]}); + { keyPath: ["clobber"] }); } - /** * Helper method to collect results from a Cursor and promiseify it. * @param {ObjectStore|Index} store The store to perform openCursor on. diff --git a/src/store/indexeddb-remote-backend.js b/src/store/indexeddb-remote-backend.js index a00b16977..efe57db55 100644 --- a/src/store/indexeddb-remote-backend.js +++ b/src/store/indexeddb-remote-backend.js @@ -16,8 +16,8 @@ See the License for the specific language governing permissions and limitations under the License. */ -import {logger} from '../logger'; -import {defer} from '../utils'; +import { logger } from '../logger'; +import { defer } from '../utils'; /** * An IndexedDB store backend where the actual backend sits in a web @@ -48,7 +48,6 @@ export function RemoteIndexedDBStoreBackend( this._startPromise = null; } - RemoteIndexedDBStoreBackend.prototype = { /** * Attempt to connect to the database. This can fail if the user does not diff --git a/src/store/indexeddb-store-worker.js b/src/store/indexeddb-store-worker.js index 5c1971bb0..35af82ab4 100644 --- a/src/store/indexeddb-store-worker.js +++ b/src/store/indexeddb-store-worker.js @@ -16,8 +16,8 @@ See the License for the specific language governing permissions and limitations under the License. */ -import {LocalIndexedDBStoreBackend} from "./indexeddb-local-backend.js"; -import {logger} from '../logger'; +import { LocalIndexedDBStoreBackend } from "./indexeddb-local-backend.js"; +import { logger } from '../logger'; /** * This class lives in the webworker and drives a LocalIndexedDBStoreBackend diff --git a/src/store/indexeddb.js b/src/store/indexeddb.js index 5aebcfe6f..e661c83a8 100644 --- a/src/store/indexeddb.js +++ b/src/store/indexeddb.js @@ -18,14 +18,14 @@ limitations under the License. /* eslint-disable @babel/no-invalid-this */ -import {MemoryStore} from "./memory"; +import { MemoryStore } from "./memory"; import * as utils from "../utils"; -import {EventEmitter} from 'events'; -import {LocalIndexedDBStoreBackend} from "./indexeddb-local-backend.js"; -import {RemoteIndexedDBStoreBackend} from "./indexeddb-remote-backend.js"; -import {User} from "../models/user"; -import {MatrixEvent} from "../models/event"; -import {logger} from '../logger'; +import { EventEmitter } from 'events'; +import { LocalIndexedDBStoreBackend } from "./indexeddb-local-backend.js"; +import { RemoteIndexedDBStoreBackend } from "./indexeddb-remote-backend.js"; +import { User } from "../models/user"; +import { MatrixEvent } from "../models/event"; +import { logger } from '../logger'; /** * This is an internal module. See {@link IndexedDBStore} for the public class. @@ -39,7 +39,6 @@ import {logger} from '../logger'; // response is persisted each time. const WRITE_DELAY_MS = 1000 * 60 * 5; // once every 5 minutes - /** * Construct a new Indexed Database store, which extends MemoryStore. * diff --git a/src/store/session/webstorage.js b/src/store/session/webstorage.js index 0bdceb0e0..7dcd1339d 100644 --- a/src/store/session/webstorage.js +++ b/src/store/session/webstorage.js @@ -22,7 +22,7 @@ limitations under the License. */ import * as utils from "../../utils"; -import {logger} from '../../logger'; +import { logger } from '../../logger'; const DEBUG = false; // set true to enable console logging. const E2E_PREFIX = "session.e2e."; diff --git a/src/sync-accumulator.js b/src/sync-accumulator.js index a22de7e11..1f190538c 100644 --- a/src/sync-accumulator.js +++ b/src/sync-accumulator.js @@ -21,8 +21,8 @@ limitations under the License. * @module sync-accumulator */ -import {logger} from './logger'; -import {deepCopy} from "./utils"; +import { logger } from './logger'; +import { deepCopy } from "./utils"; /** * The purpose of this class is to accumulate /sync responses such that a diff --git a/src/sync.js b/src/sync.js index b33597fe1..8ad4af30b 100644 --- a/src/sync.js +++ b/src/sync.js @@ -26,15 +26,15 @@ limitations under the License. * for HTTP and WS at some point. */ -import {User} from "./models/user"; -import {Room} from "./models/room"; -import {Group} from "./models/group"; +import { User } from "./models/user"; +import { Room } from "./models/room"; +import { Group } from "./models/group"; import * as utils from "./utils"; -import {Filter} from "./filter"; -import {EventTimeline} from "./models/event-timeline"; -import {PushProcessor} from "./pushprocessor"; -import {logger} from './logger'; -import {InvalidStoreError} from './errors'; +import { Filter } from "./filter"; +import { EventTimeline } from "./models/event-timeline"; +import { PushProcessor } from "./pushprocessor"; +import { logger } from './logger'; +import { InvalidStoreError } from './errors'; const DEBUG = true; @@ -62,7 +62,6 @@ function debuglog(...params) { logger.log(...params); } - /** * Internal class - unstable. * Construct an entity which is able to sync with a homeserver. @@ -188,7 +187,6 @@ SyncApi.prototype._deregisterStateListeners = function(room) { room.currentState.removeAllListeners("RoomState.newMember"); }; - /** * Sync rooms the user has left. * @return {Promise} Resolved when they've been added to the store. @@ -1483,7 +1481,7 @@ SyncApi.prototype._processGroupSyncEntry = function(groupsSection, sectionName) ); } if (groupInfo.inviter) { - group.setInviter({userId: groupInfo.inviter}); + group.setInviter({ userId: groupInfo.inviter }); } group.setMyMembership(sectionName); if (isBrandNew) { diff --git a/src/timeline-window.js b/src/timeline-window.js index 50ca10729..0fc9f3ae4 100644 --- a/src/timeline-window.js +++ b/src/timeline-window.js @@ -17,8 +17,8 @@ limitations under the License. /** @module timeline-window */ -import {EventTimeline} from './models/event-timeline'; -import {logger} from './logger'; +import { EventTimeline } from './models/event-timeline'; +import { logger } from './logger'; /** * @private @@ -335,7 +335,6 @@ TimelineWindow.prototype.paginate = function(direction, size, makeRequest, return prom; }; - /** * Remove `delta` events from the start or end of the timeline. * @@ -368,7 +367,6 @@ TimelineWindow.prototype.unpaginate = function(delta, startOfTimeline) { } }; - /** * Get a list of the events currently in the window * @@ -420,7 +418,6 @@ TimelineWindow.prototype.getEvents = function() { return result; }; - /** * a thing which contains a timeline reference, and an index into it. * diff --git a/src/utils.ts b/src/utils.ts index cee530774..73e973a72 100644 --- a/src/utils.ts +++ b/src/utils.ts @@ -418,7 +418,7 @@ export function defer() { reject = _reject; }); - return {resolve, reject, promise}; + return { resolve, reject, promise }; } export async function promiseMapSeries( diff --git a/src/webrtc/call.ts b/src/webrtc/call.ts index a288142c8..aca130096 100644 --- a/src/webrtc/call.ts +++ b/src/webrtc/call.ts @@ -21,11 +21,11 @@ limitations under the License. * @module webrtc/call */ -import {logger} from '../logger'; -import {EventEmitter} from 'events'; +import { logger } from '../logger'; +import { EventEmitter } from 'events'; import * as utils from '../utils'; import MatrixEvent from '../models/event'; -import {EventType} from '../@types/event'; +import { EventType } from '../@types/event'; import { RoomMember } from '../models/room-member'; import { randomString } from '../randomstring'; import { @@ -39,7 +39,6 @@ import { } from './callEventTypes'; import { CallFeed } from './callFeed'; - // events: hangup, error(err), replaced(call), state(state, oldState) /** @@ -1945,7 +1944,7 @@ function getUserMediaContraints(type: ConstraintsType) { case ConstraintsType.Audio: { return { audio: { - deviceId: audioInput ? {ideal: audioInput} : undefined, + deviceId: audioInput ? { ideal: audioInput } : undefined, }, video: false, }; @@ -1953,9 +1952,9 @@ function getUserMediaContraints(type: ConstraintsType) { case ConstraintsType.Video: { return { audio: { - deviceId: audioInput ? {ideal: audioInput} : undefined, + deviceId: audioInput ? { ideal: audioInput } : undefined, }, video: { - deviceId: videoInput ? {ideal: videoInput} : undefined, + deviceId: videoInput ? { ideal: videoInput } : undefined, /* We want 640x360. Chrome will give it only if we ask exactly, FF refuses entirely if we ask exactly, so have to ask for ideal instead diff --git a/src/webrtc/callEventHandler.ts b/src/webrtc/callEventHandler.ts index c6396bed7..5bc5cb4cc 100644 --- a/src/webrtc/callEventHandler.ts +++ b/src/webrtc/callEventHandler.ts @@ -15,7 +15,7 @@ limitations under the License. */ import MatrixEvent from '../models/event'; -import {logger} from '../logger'; +import { logger } from '../logger'; import { createNewMatrixCall, MatrixCall, CallErrorCode, CallState, CallDirection } from './call'; import { EventType } from '../@types/event'; import { MatrixClient } from '../client'; diff --git a/src/webrtc/callFeed.ts b/src/webrtc/callFeed.ts index b0004639f..762fe63f8 100644 --- a/src/webrtc/callFeed.ts +++ b/src/webrtc/callFeed.ts @@ -15,9 +15,9 @@ limitations under the License. */ import EventEmitter from "events"; -import {SDPStreamMetadataPurpose} from "./callEventTypes"; +import { SDPStreamMetadataPurpose } from "./callEventTypes"; import MatrixClient from "../client" -import {RoomMember} from "../models/room-member"; +import { RoomMember } from "../models/room-member"; export enum CallFeedEvent { NewStream = "new_stream", diff --git a/yarn.lock b/yarn.lock index 9e97396d6..f48a13d6b 100644 --- a/yarn.lock +++ b/yarn.lock @@ -1130,6 +1130,10 @@ "@types/yargs" "^15.0.0" chalk "^4.0.0" +"@matrix-org/olm@https://gitlab.matrix.org/api/v4/projects/27/packages/npm/@matrix-org/olm/-/@matrix-org/olm-3.2.3.tgz": + version "3.2.3" + resolved "https://gitlab.matrix.org/api/v4/projects/27/packages/npm/@matrix-org/olm/-/@matrix-org/olm-3.2.3.tgz#cc332fdd25c08ef0e40f4d33fc3f822a0f98b6f4" + "@nicolo-ribaudo/chokidar-2@2.1.8-no-fsevents": version "2.1.8-no-fsevents" resolved "https://registry.yarnpkg.com/@nicolo-ribaudo/chokidar-2/-/chokidar-2-2.1.8-no-fsevents.tgz#da7c3996b8e6e19ebd14d82eaced2313e7769f9b" @@ -5142,10 +5146,6 @@ object.pick@^1.3.0: dependencies: isobject "^3.0.1" -"olm@https://packages.matrix.org/npm/olm/olm-3.2.1.tgz": - version "3.2.1" - resolved "https://packages.matrix.org/npm/olm/olm-3.2.1.tgz#d623d76f99c3518dde68be8c86618d68bc7b004a" - once@^1.3.0, once@^1.3.1, once@^1.4.0: version "1.4.0" resolved "https://registry.yarnpkg.com/once/-/once-1.4.0.tgz#583b1aa775961d4b113ac17d9c50baef9dd76bd1"