You've already forked matrix-js-sdk
mirror of
https://github.com/matrix-org/matrix-js-sdk.git
synced 2025-11-29 16:43:09 +03:00
If an exception was thrown by the encryption process, the event would be queued, but the exception would not be handled. This meant that the event got stuck as a grey 'sending' event in the UI. Fixing this correctly is slightly more complex than just handling the exception correctly. A naive approach would mean that the event would be shown as a red 'unsent' message, and clicking 'resend' would then send the message *in the clear*. Hence, move the encryption to _sendEvent, where it will be called again when the event is resent.
110 lines
3.3 KiB
JavaScript
110 lines
3.3 KiB
JavaScript
"use strict";
|
|
var q = require("q");
|
|
var sdk = require("../..");
|
|
var HttpBackend = require("../mock-request");
|
|
var utils = require("../test-utils");
|
|
var EventStatus = sdk.EventStatus;
|
|
|
|
describe("MatrixClient retrying", function() {
|
|
var baseUrl = "http://localhost.or.something";
|
|
var client, httpBackend;
|
|
var scheduler;
|
|
var userId = "@alice:localhost";
|
|
var accessToken = "aseukfgwef";
|
|
var roomId = "!room:here";
|
|
var room;
|
|
|
|
beforeEach(function() {
|
|
utils.beforeEach(this);
|
|
httpBackend = new HttpBackend();
|
|
sdk.request(httpBackend.requestFn);
|
|
scheduler = new sdk.MatrixScheduler();
|
|
client = sdk.createClient({
|
|
baseUrl: baseUrl,
|
|
userId: userId,
|
|
accessToken: accessToken,
|
|
scheduler: scheduler,
|
|
});
|
|
room = new sdk.Room(roomId);
|
|
client.store.storeRoom(room);
|
|
});
|
|
|
|
afterEach(function() {
|
|
httpBackend.verifyNoOutstandingExpectation();
|
|
});
|
|
|
|
xit("should retry according to MatrixScheduler.retryFn", function() {
|
|
|
|
});
|
|
|
|
xit("should queue according to MatrixScheduler.queueFn", function() {
|
|
|
|
});
|
|
|
|
xit("should mark events as EventStatus.NOT_SENT when giving up", function() {
|
|
|
|
});
|
|
|
|
xit("should mark events as EventStatus.QUEUED when queued", function() {
|
|
|
|
});
|
|
|
|
it("should mark events as EventStatus.CANCELLED when cancelled", function(done) {
|
|
|
|
// send a couple of events; the second will be queued
|
|
var ev1, ev2;
|
|
client.sendMessage(roomId, "m1").then(function(ev) {
|
|
expect(ev).toEqual(ev1);
|
|
});
|
|
client.sendMessage(roomId, "m2").then(function(ev) {
|
|
expect(ev).toEqual(ev2);
|
|
});
|
|
|
|
// both events should be in the timeline at this point
|
|
var tl = room.getLiveTimeline().getEvents();
|
|
expect(tl.length).toEqual(2);
|
|
ev1 = tl[0];
|
|
ev2 = tl[1];
|
|
|
|
expect(ev1.status).toEqual(EventStatus.SENDING);
|
|
expect(ev2.status).toEqual(EventStatus.SENDING);
|
|
|
|
// give the reactor a chance to run, so that ev2 gets queued
|
|
q().then(function() {
|
|
// ev2 should now have been queued
|
|
expect(ev2.status).toEqual(EventStatus.QUEUED);
|
|
|
|
// now we can cancel the second and check everything looks sane
|
|
client.cancelPendingEvent(ev2);
|
|
expect(ev2.status).toEqual(EventStatus.CANCELLED);
|
|
expect(tl.length).toEqual(1);
|
|
|
|
// shouldn't be able to cancel the first message yet
|
|
expect(function() { client.cancelPendingEvent(ev1); })
|
|
.toThrow();
|
|
|
|
// fail the first send
|
|
httpBackend.when("PUT", "/send/m.room.message/")
|
|
.respond(400);
|
|
return httpBackend.flush();
|
|
}).then(function() {
|
|
expect(ev1.status).toEqual(EventStatus.NOT_SENT);
|
|
expect(tl.length).toEqual(1);
|
|
|
|
// cancel the first message
|
|
client.cancelPendingEvent(ev1);
|
|
expect(ev1.status).toEqual(EventStatus.CANCELLED);
|
|
expect(tl.length).toEqual(0);
|
|
}).catch(utils.failTest).done(done);
|
|
});
|
|
|
|
describe("resending", function() {
|
|
xit("should be able to resend a NOT_SENT event", function() {
|
|
|
|
});
|
|
xit("should be able to resend a sent event", function() {
|
|
|
|
});
|
|
});
|
|
});
|