Rework expiring messages management
// FREEBIE
This commit is contained in:
parent
08e8c00329
commit
e4b9c51f88
6 changed files with 66 additions and 21 deletions
|
@ -86,6 +86,7 @@
|
||||||
}
|
}
|
||||||
|
|
||||||
RotateSignedPreKeyListener.init();
|
RotateSignedPreKeyListener.init();
|
||||||
|
ExpiringMessagesListener.update();
|
||||||
});
|
});
|
||||||
|
|
||||||
window.getSyncRequest = function() {
|
window.getSyncRequest = function() {
|
||||||
|
|
|
@ -189,6 +189,16 @@
|
||||||
messages.createIndex('expire', 'expireTimer', { unique: false });
|
messages.createIndex('expire', 'expireTimer', { unique: false });
|
||||||
next();
|
next();
|
||||||
}
|
}
|
||||||
|
},
|
||||||
|
{
|
||||||
|
version: "11.0",
|
||||||
|
migrate: function(transaction, next) {
|
||||||
|
console.log('migration 11.0');
|
||||||
|
console.log('creating expires_at message index');
|
||||||
|
var messages = transaction.objectStore('messages');
|
||||||
|
messages.createIndex('expires_at', 'expires_at', { unique: false });
|
||||||
|
next();
|
||||||
|
}
|
||||||
}
|
}
|
||||||
];
|
];
|
||||||
}());
|
}());
|
||||||
|
|
|
@ -5,12 +5,40 @@
|
||||||
;(function() {
|
;(function() {
|
||||||
'use strict';
|
'use strict';
|
||||||
window.Whisper = window.Whisper || {};
|
window.Whisper = window.Whisper || {};
|
||||||
Whisper.ExpiringMessages = new (Whisper.MessageCollection.extend({
|
|
||||||
initialize: function() {
|
function destroyExpiredMessages() {
|
||||||
this.on('expired', this.remove);
|
// Load messages that have expired and destroy them
|
||||||
this.fetchExpiring();
|
var expired = new Whisper.MessageCollection();
|
||||||
}
|
expired.on('add', function(message) {
|
||||||
}))();
|
console.log('message', message.get('sent_at'), 'expired');
|
||||||
|
message.destroy();
|
||||||
|
message.getConversation().trigger('expired', message);
|
||||||
|
});
|
||||||
|
expired.on('reset', checkExpiringMessages);
|
||||||
|
|
||||||
|
expired.fetchExpired();
|
||||||
|
}
|
||||||
|
|
||||||
|
var timeout;
|
||||||
|
function checkExpiringMessages() {
|
||||||
|
// Look up the next expiring message and set a timer to destroy it
|
||||||
|
var expiring = new Whisper.MessageCollection();
|
||||||
|
expiring.once('add', function(next) {
|
||||||
|
var expires_at = next.get('expires_at');
|
||||||
|
console.log('next message expires', new Date(expires_at));
|
||||||
|
|
||||||
|
var wait = expires_at - Date.now();
|
||||||
|
if (wait < 0) { wait = 0; }
|
||||||
|
|
||||||
|
clearTimeout(timeout);
|
||||||
|
timeout = setTimeout(destroyExpiredMessages, wait);
|
||||||
|
});
|
||||||
|
expiring.fetchNextExpiring();
|
||||||
|
}
|
||||||
|
|
||||||
|
window.ExpiringMessagesListener = {
|
||||||
|
update: checkExpiringMessages
|
||||||
|
};
|
||||||
|
|
||||||
var TimerOption = Backbone.Model.extend({
|
var TimerOption = Backbone.Model.extend({
|
||||||
getName: function() {
|
getName: function() {
|
||||||
|
|
|
@ -459,15 +459,6 @@
|
||||||
}));
|
}));
|
||||||
return this.save();
|
return this.save();
|
||||||
},
|
},
|
||||||
markExpired: function() {
|
|
||||||
console.log('message', this.get('sent_at'), 'expired');
|
|
||||||
clearInterval(this.expirationTimeout);
|
|
||||||
this.expirationTimeout = null;
|
|
||||||
this.trigger('expired', this);
|
|
||||||
this.destroy();
|
|
||||||
|
|
||||||
this.getConversation().trigger('expired', this);
|
|
||||||
},
|
|
||||||
isExpiring: function() {
|
isExpiring: function() {
|
||||||
return this.get('expireTimer') && this.get('expirationStartTimestamp');
|
return this.get('expireTimer') && this.get('expirationStartTimestamp');
|
||||||
},
|
},
|
||||||
|
@ -485,10 +476,13 @@
|
||||||
return ms_from_now;
|
return ms_from_now;
|
||||||
},
|
},
|
||||||
setToExpire: function() {
|
setToExpire: function() {
|
||||||
if (this.isExpiring() && !this.expirationTimeout) {
|
if (this.isExpiring() && !this.get('expires_at')) {
|
||||||
var ms_from_now = this.msTilExpire();
|
var start = this.get('expirationStartTimestamp');
|
||||||
console.log('message', this.get('sent_at'), 'expires in', ms_from_now, 'ms');
|
var delta = this.get('expireTimer') * 1000;
|
||||||
this.expirationTimeout = setTimeout(this.markExpired.bind(this), ms_from_now);
|
var expires_at = start + delta;
|
||||||
|
this.save('expires_at', expires_at);
|
||||||
|
ExpiringMessagesListener.update();
|
||||||
|
console.log('message', this.get('sent_at'), 'expires at', expires_at);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -551,8 +545,16 @@
|
||||||
}.bind(this));
|
}.bind(this));
|
||||||
},
|
},
|
||||||
|
|
||||||
fetchExpiring: function() {
|
fetchNextExpiring: function() {
|
||||||
this.fetch({conditions: {expireTimer: {$gt: 0}}});
|
this.fetch({ index: { name: 'expires_at' }, limit: 1 });
|
||||||
|
},
|
||||||
|
|
||||||
|
fetchExpired: function() {
|
||||||
|
console.log('loading expired messages');
|
||||||
|
this.fetch({
|
||||||
|
conditions: { expires_at: { $lte: Date.now() } },
|
||||||
|
addIndividually: true
|
||||||
|
});
|
||||||
},
|
},
|
||||||
|
|
||||||
hasKeyConflicts: function() {
|
hasKeyConflicts: function() {
|
||||||
|
|
|
@ -227,6 +227,7 @@
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
onExpiredCollection: function(message) {
|
onExpiredCollection: function(message) {
|
||||||
|
console.log('removing message', message.get('sent_at'), 'from collection');
|
||||||
this.model.messageCollection.remove(message.id);
|
this.model.messageCollection.remove(message.id);
|
||||||
},
|
},
|
||||||
|
|
||||||
|
|
|
@ -144,6 +144,9 @@
|
||||||
this.remove();
|
this.remove();
|
||||||
}
|
}
|
||||||
}.bind(this));
|
}.bind(this));
|
||||||
|
|
||||||
|
// Failsafe: if in the background, animation events don't fire
|
||||||
|
setTimeout(this.remove.bind(this), 1000);
|
||||||
},
|
},
|
||||||
onDestroy: function() {
|
onDestroy: function() {
|
||||||
if (this.$el.hasClass('expired')) {
|
if (this.$el.hasClass('expired')) {
|
||||||
|
|
Loading…
Reference in a new issue