Generate unique IDs for each JS runtime to accomodate multiple tabs

This commit is contained in:
Kegan Dougal 2017-01-18 16:27:11 +00:00
parent e9884768f6
commit 5828ab1077
1 changed files with 23 additions and 8 deletions

View File

@ -20,7 +20,8 @@ limitations under the License.
// - We use IndexedDB to persists logs because it has generous disk space limits compared to local storage. IndexedDB does not work // - We use IndexedDB to persists logs because it has generous disk space limits compared to local storage. IndexedDB does not work
// in incognito mode, in which case this module will not be able to write logs to disk. However, the logs will still be stored // in incognito mode, in which case this module will not be able to write logs to disk. However, the logs will still be stored
// in-memory, so can still be submitted in a bug report should the user wish to: we can also store more logs in-memory than in // in-memory, so can still be submitted in a bug report should the user wish to: we can also store more logs in-memory than in
// local storage, which does work in incognito mode. // local storage, which does work in incognito mode. We also need to handle the case where there are 2+ tabs. Each JS runtime
// generates a random string which serves as the "ID" for that tab/session. These IDs are stored along with the log lines.
// - Bug reports are sent as a POST over HTTPS: it purposefully does not use Matrix as bug reports may be made when Matrix is // - Bug reports are sent as a POST over HTTPS: it purposefully does not use Matrix as bug reports may be made when Matrix is
// not responsive (which may be the cause of the bug). // not responsive (which may be the cause of the bug).
@ -77,6 +78,8 @@ class IndexedDBLogStore {
constructor(indexedDB, logger) { constructor(indexedDB, logger) {
this.indexedDB = indexedDB; this.indexedDB = indexedDB;
this.logger = logger; this.logger = logger;
this.id = "instance-" + Date.now();
this.index = 0;
this.db = null; this.db = null;
} }
@ -103,13 +106,13 @@ class IndexedDBLogStore {
req.onupgradeneeded = (event) => { req.onupgradeneeded = (event) => {
const db = event.target.result; const db = event.target.result;
const objectStore = db.createObjectStore("logs", { const objectStore = db.createObjectStore("logs", {
autoIncrement: true keyPath: ["id", "index"]
}) });
objectStore.transaction.oncomplete = function(event) {
objectStore.add( objectStore.add(
this._generateLogEntry(
new Date() + " ::: Log database was created." new Date() + " ::: Log database was created."
)
); );
};
} }
}); });
} }
@ -129,7 +132,7 @@ class IndexedDBLogStore {
return new Promise((resolve, reject) => { return new Promise((resolve, reject) => {
let txn = this.db.transaction("logs", "readwrite"); let txn = this.db.transaction("logs", "readwrite");
let objStore = txn.objectStore("logs"); let objStore = txn.objectStore("logs");
objStore.add(lines); objStore.add(this._generateLogEntry(lines));
txn.oncomplete = (event) => { txn.oncomplete = (event) => {
resolve(); resolve();
}; };
@ -139,6 +142,14 @@ class IndexedDBLogStore {
} }
}); });
} }
_generateLogEntry(lines) {
return {
id: this.id,
lines: lines,
index: this.index++
};
}
} }
@ -176,5 +187,9 @@ module.exports = {
* @return {Promise} Resolved when the bug report is sent. * @return {Promise} Resolved when the bug report is sent.
*/ */
sendBugReport: function(userText) { sendBugReport: function(userText) {
// To gather all the logs, we first query for every log entry with index "0", this will let us
// know all the IDs from different tabs/sessions.
// Send logs grouped by ID
} }
}; };