localStorage cache for subject messages.
This commit is contained in:
@@ -149,6 +149,13 @@ var Cosmopolite = function(opt_urlPrefix, opt_namespace, opt_trackingID) {
|
|||||||
localStorage[this.messageQueueKey_] = JSON.stringify([]);
|
localStorage[this.messageQueueKey_] = JSON.stringify([]);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @type {string}
|
||||||
|
* @const
|
||||||
|
* @private
|
||||||
|
*/
|
||||||
|
this.messageCacheKeyPrefix_ = this.namespace_ + ':message_cache:';
|
||||||
|
|
||||||
if (document.readyState == 'complete') {
|
if (document.readyState == 'complete') {
|
||||||
this.init_();
|
this.init_();
|
||||||
} else {
|
} else {
|
||||||
@@ -210,7 +217,8 @@ Cosmopolite.typeSubjectLoose;
|
|||||||
/**
|
/**
|
||||||
* @typedef {{messages: Array.<Cosmopolite.typeMessage>,
|
* @typedef {{messages: Array.<Cosmopolite.typeMessage>,
|
||||||
pins: Array.<Cosmopolite.typeMessage>,
|
pins: Array.<Cosmopolite.typeMessage>,
|
||||||
state: Cosmopolite.SubscriptionState_}}
|
state: Cosmopolite.SubscriptionState_,
|
||||||
|
use_cache: boolean}}
|
||||||
* @private
|
* @private
|
||||||
*/
|
*/
|
||||||
Cosmopolite.typeSubscription_;
|
Cosmopolite.typeSubscription_;
|
||||||
@@ -302,12 +310,14 @@ Cosmopolite.prototype.subscribe = function(subjects, opt_messages, opt_lastID) {
|
|||||||
var canonicalSubject = this.canonicalSubject_(subject);
|
var canonicalSubject = this.canonicalSubject_(subject);
|
||||||
/** @type {string} */
|
/** @type {string} */
|
||||||
var subjectString = this.subjectString_(canonicalSubject);
|
var subjectString = this.subjectString_(canonicalSubject);
|
||||||
if (!(subjectString in this.subscriptions_)) {
|
var subscription = this.subscriptions_[subjectString];
|
||||||
this.subscriptions_[subjectString] = {
|
if (!subscription) {
|
||||||
|
this.subscriptions_[subjectString] = subscription = {
|
||||||
'subject': canonicalSubject,
|
'subject': canonicalSubject,
|
||||||
'messages': [],
|
'messages': [],
|
||||||
'pins': [],
|
'pins': [],
|
||||||
'state': Cosmopolite.SubscriptionState_.PENDING
|
'state': Cosmopolite.SubscriptionState_.PENDING,
|
||||||
|
'use_cache': (opt_messages == -1),
|
||||||
};
|
};
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -328,6 +338,24 @@ Cosmopolite.prototype.subscribe = function(subjects, opt_messages, opt_lastID) {
|
|||||||
args['last_id'] = opt_lastID;
|
args['last_id'] = opt_lastID;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if (subscription.use_cache) {
|
||||||
|
// Attempt to shorten request to server using cache.
|
||||||
|
var key = this.messageCacheKeyPrefix_ + subjectString;
|
||||||
|
var messageStr = localStorage[key];
|
||||||
|
if (messageStr) {
|
||||||
|
var messages = JSON.parse(messageStr);
|
||||||
|
messages.forEach(function(msg) {
|
||||||
|
msg['message'] = JSON.stringify(msg['message']);
|
||||||
|
this.onMessage_(msg);
|
||||||
|
}.bind(this));
|
||||||
|
}
|
||||||
|
if (subscription.messages.length > 0) {
|
||||||
|
delete args['messages'];
|
||||||
|
args['last_id'] =
|
||||||
|
subscription.messages[subscription.messages.length - 1]['id'];
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
var preEvents = function(response) {
|
var preEvents = function(response) {
|
||||||
var subscription = this.subscriptions_[subjectString];
|
var subscription = this.subscriptions_[subjectString];
|
||||||
if (!subscription) {
|
if (!subscription) {
|
||||||
@@ -1309,7 +1337,7 @@ Cosmopolite.prototype.onMessage_ = function(e) {
|
|||||||
}
|
}
|
||||||
e['message'] = JSON.parse(e['message']);
|
e['message'] = JSON.parse(e['message']);
|
||||||
|
|
||||||
// Reverse search for the position to insert this message, as iit will most
|
// Reverse search for the position to insert this message, as it will most
|
||||||
// likely be at the end.
|
// likely be at the end.
|
||||||
/** @type {?number} */
|
/** @type {?number} */
|
||||||
var insertAfter;
|
var insertAfter;
|
||||||
@@ -1322,6 +1350,11 @@ Cosmopolite.prototype.onMessage_ = function(e) {
|
|||||||
}
|
}
|
||||||
subscription.messages.splice(insertAfter + 1, 0, e);
|
subscription.messages.splice(insertAfter + 1, 0, e);
|
||||||
|
|
||||||
|
if (subscription.use_cache) {
|
||||||
|
var key = this.messageCacheKeyPrefix_ + subjectString;
|
||||||
|
localStorage[key] = JSON.stringify(subscription.messages);
|
||||||
|
}
|
||||||
|
|
||||||
var e2 = new CustomEvent('message', {
|
var e2 = new CustomEvent('message', {
|
||||||
'detail': e
|
'detail': e
|
||||||
});
|
});
|
||||||
|
|||||||
Reference in New Issue
Block a user