0000: 2f 2a 0a 43 6f 70 79 72 69 67 68 74 20 32 30 31 /*.Copyright 201
0010: 37 20 56 65 63 74 6f 72 20 43 72 65 61 74 69 6f 7 Vector Creatio
0020: 6e 73 20 4c 74 64 0a 43 6f 70 79 72 69 67 68 74 ns Ltd.Copyright
0030: 20 32 30 31 38 20 4e 65 77 20 56 65 63 74 6f 72 2018 New Vector
0040: 20 4c 74 64 0a 0a 4c 69 63 65 6e 73 65 64 20 75 Ltd..Licensed u
0050: 6e 64 65 72 20 74 68 65 20 41 70 61 63 68 65 20 nder the Apache
0060: 4c 69 63 65 6e 73 65 2c 20 56 65 72 73 69 6f 6e License, Version
0070: 20 32 2e 30 20 28 74 68 65 20 22 4c 69 63 65 6e 2.0 (the "Licen
0080: 73 65 22 29 3b 0a 79 6f 75 20 6d 61 79 20 6e 6f se");.you may no
0090: 74 20 75 73 65 20 74 68 69 73 20 66 69 6c 65 20 t use this file
00a0: 65 78 63 65 70 74 20 69 6e 20 63 6f 6d 70 6c 69 except in compli
00b0: 61 6e 63 65 20 77 69 74 68 20 74 68 65 20 4c 69 ance with the Li
00c0: 63 65 6e 73 65 2e 0a 59 6f 75 20 6d 61 79 20 6f cense..You may o
00d0: 62 74 61 69 6e 20 61 20 63 6f 70 79 20 6f 66 20 btain a copy of
00e0: 74 68 65 20 4c 69 63 65 6e 73 65 20 61 74 0a 0a the License at..
00f0: 20 20 20 20 68 74 74 70 3a 2f 2f 77 77 77 2e 61 http://www.a
0100: 70 61 63 68 65 2e 6f 72 67 2f 6c 69 63 65 6e 73 pache.org/licens
0110: 65 73 2f 4c 49 43 45 4e 53 45 2d 32 2e 30 0a 0a es/LICENSE-2.0..
0120: 55 6e 6c 65 73 73 20 72 65 71 75 69 72 65 64 20 Unless required
0130: 62 79 20 61 70 70 6c 69 63 61 62 6c 65 20 6c 61 by applicable la
0140: 77 20 6f 72 20 61 67 72 65 65 64 20 74 6f 20 69 w or agreed to i
0150: 6e 20 77 72 69 74 69 6e 67 2c 20 73 6f 66 74 77 n writing, softw
0160: 61 72 65 0a 64 69 73 74 72 69 62 75 74 65 64 20 are.distributed
0170: 75 6e 64 65 72 20 74 68 65 20 4c 69 63 65 6e 73 under the Licens
0180: 65 20 69 73 20 64 69 73 74 72 69 62 75 74 65 64 e is distributed
0190: 20 6f 6e 20 61 6e 20 22 41 53 20 49 53 22 20 42 on an "AS IS" B
01a0: 41 53 49 53 2c 0a 57 49 54 48 4f 55 54 20 57 41 ASIS,.WITHOUT WA
01b0: 52 52 41 4e 54 49 45 53 20 4f 52 20 43 4f 4e 44 RRANTIES OR COND
01c0: 49 54 49 4f 4e 53 20 4f 46 20 41 4e 59 20 4b 49 ITIONS OF ANY KI
01d0: 4e 44 2c 20 65 69 74 68 65 72 20 65 78 70 72 65 ND, either expre
01e0: 73 73 20 6f 72 20 69 6d 70 6c 69 65 64 2e 0a 53 ss or implied..S
01f0: 65 65 20 74 68 65 20 4c 69 63 65 6e 73 65 20 66 ee the License f
0200: 6f 72 20 74 68 65 20 73 70 65 63 69 66 69 63 20 or the specific
0210: 6c 61 6e 67 75 61 67 65 20 67 6f 76 65 72 6e 69 language governi
0220: 6e 67 20 70 65 72 6d 69 73 73 69 6f 6e 73 20 61 ng permissions a
0230: 6e 64 0a 6c 69 6d 69 74 61 74 69 6f 6e 73 20 75 nd.limitations u
0240: 6e 64 65 72 20 74 68 65 20 4c 69 63 65 6e 73 65 nder the License
0250: 2e 0a 2a 2f 0a 0a 2f 2f 20 69 6d 70 6f 72 74 20 ..*/..// import
0260: 50 72 6f 6d 69 73 65 20 66 72 6f 6d 20 27 62 6c Promise from 'bl
0270: 75 65 62 69 72 64 27 3b 0a 2f 2f 20 69 6d 70 6f uebird';.// impo
0280: 72 74 20 53 79 6e 63 41 63 63 75 6d 75 6c 61 74 rt SyncAccumulat
0290: 6f 72 20 66 72 6f 6d 20 27 6d 61 74 72 69 78 2d or from 'matrix-
02a0: 6a 73 2d 73 64 6b 2f 73 72 63 2f 73 79 6e 63 2d js-sdk/src/sync-
02b0: 61 63 63 75 6d 75 6c 61 74 6f 72 27 3b 0a 2f 2f accumulator';.//
02c0: 20 69 6d 70 6f 72 74 20 75 74 69 6c 73 20 66 72 import utils fr
02d0: 6f 6d 20 27 6d 61 74 72 69 78 2d 6a 73 2d 73 64 om 'matrix-js-sd
02e0: 6b 2f 73 72 63 2f 75 74 69 6c 73 27 3b 0a 2f 2f k/src/utils';.//
02f0: 20 69 6d 70 6f 72 74 20 6c 65 76 65 6c 20 66 72 import level fr
0300: 6f 6d 20 27 6c 65 76 65 6c 27 3b 0a 2f 2f 20 69 om 'level';.// i
0310: 6d 70 6f 72 74 20 6c 65 76 65 6c 64 6f 77 6e 20 mport leveldown
0320: 66 72 6f 6d 20 27 6c 65 76 65 6c 64 6f 77 6e 27 from 'leveldown'
0330: 3b 0a 0a 63 6f 6e 73 74 20 50 72 6f 6d 69 73 65 ;..const Promise
0340: 20 3d 20 72 65 71 75 69 72 65 28 27 62 6c 75 65 = require('blue
0350: 62 69 72 64 27 29 3b 0a 63 6f 6e 73 74 20 53 79 bird');.const Sy
0360: 6e 63 41 63 63 75 6d 75 6c 61 74 6f 72 20 3d 20 ncAccumulator =
0370: 72 65 71 75 69 72 65 28 27 6d 61 74 72 69 78 2d require('matrix-
0380: 6a 73 2d 73 64 6b 2f 6c 69 62 2f 73 79 6e 63 2d js-sdk/lib/sync-
0390: 61 63 63 75 6d 75 6c 61 74 6f 72 27 29 3b 0a 63 accumulator');.c
03a0: 6f 6e 73 74 20 75 74 69 6c 73 20 3d 20 72 65 71 onst utils = req
03b0: 75 69 72 65 28 27 6d 61 74 72 69 78 2d 6a 73 2d uire('matrix-js-
03c0: 73 64 6b 2f 73 72 63 2f 75 74 69 6c 73 27 29 3b sdk/src/utils');
03d0: 0a 63 6f 6e 73 74 20 6c 65 76 65 6c 20 3d 20 72 .const level = r
03e0: 65 71 75 69 72 65 28 27 6c 65 76 65 6c 27 29 3b equire('level');
03f0: 0a 63 6f 6e 73 74 20 6c 65 76 65 6c 64 6f 77 6e .const leveldown
0400: 20 3d 20 72 65 71 75 69 72 65 28 27 6c 65 76 65 = require('leve
0410: 6c 64 6f 77 6e 27 29 3b 0a 0a 63 6f 6e 73 74 20 ldown');..const
0420: 56 45 52 53 49 4f 4e 20 3d 20 31 3b 0a 0a 66 75 VERSION = 1;..fu
0430: 6e 63 74 69 6f 6e 20 63 72 65 61 74 65 44 61 74 nction createDat
0440: 61 62 61 73 65 28 64 62 29 20 7b 0a 20 20 20 20 abase(db) {.
0450: 2f 2f 20 4d 61 6b 65 20 75 73 65 72 20 73 74 6f // Make user sto
0460: 72 65 2c 20 63 6c 6f 62 62 65 72 20 62 61 73 65 re, clobber base
0470: 64 20 6f 6e 20 75 73 65 72 20 49 44 2e 20 28 75 d on user ID. (u
0480: 73 65 72 49 64 20 70 72 6f 70 65 72 74 79 20 6f serId property o
0490: 66 20 55 73 65 72 20 6f 62 6a 65 63 74 73 29 0a f User objects).
04a0: 20 20 20 20 64 62 2e 63 72 65 61 74 65 4f 62 6a db.createObj
04b0: 65 63 74 53 74 6f 72 65 28 22 75 73 65 72 73 22 ectStore("users"
04c0: 2c 20 7b 20 6b 65 79 50 61 74 68 3a 20 5b 22 75 , { keyPath: ["u
04d0: 73 65 72 49 64 22 5d 20 7d 29 3b 0a 0a 20 20 20 serId"] });..
04e0: 20 2f 2f 20 4d 61 6b 65 20 61 63 63 6f 75 6e 74 // Make account
04f0: 20 64 61 74 61 20 73 74 6f 72 65 2c 20 63 6c 6f data store, clo
0500: 62 62 65 72 20 62 61 73 65 64 20 6f 6e 20 45 76 bber based on Ev
0510: 65 6e 74 20 74 79 70 65 2e 0a 20 20 20 20 2f 2f ent type.. //
0520: 20 28 45 76 65 6e 74 2e 74 79 70 65 20 70 72 6f (Event.type pro
0530: 70 65 72 74 79 20 6f 66 20 4d 61 74 72 69 78 45 perty of MatrixE
0540: 76 65 6e 74 20 6f 62 6a 65 63 74 73 29 0a 20 20 vent objects).
0550: 20 20 64 62 2e 63 72 65 61 74 65 4f 62 6a 65 63 db.createObjec
0560: 74 53 74 6f 72 65 28 22 61 63 63 6f 75 6e 74 44 tStore("accountD
0570: 61 74 61 22 2c 20 7b 20 6b 65 79 50 61 74 68 3a ata", { keyPath:
0580: 20 5b 22 74 79 70 65 22 5d 20 7d 29 3b 0a 0a 20 ["type"] });..
0590: 20 20 20 2f 2f 20 4d 61 6b 65 20 2f 73 79 6e 63 // Make /sync
05a0: 20 73 74 6f 72 65 20 28 73 79 6e 63 20 74 6f 6b store (sync tok
05b0: 65 6e 73 2c 20 72 6f 6f 6d 20 64 61 74 61 2c 20 ens, room data,
05c0: 65 74 63 29 2c 20 61 6c 77 61 79 73 20 63 6c 6f etc), always clo
05d0: 62 62 65 72 20 28 63 6f 6e 73 74 20 6b 65 79 29 bber (const key)
05e0: 2e 0a 20 20 20 20 64 62 2e 63 72 65 61 74 65 4f .. db.createO
05f0: 62 6a 65 63 74 53 74 6f 72 65 28 22 73 79 6e 63 bjectStore("sync
0600: 22 2c 20 7b 20 6b 65 79 50 61 74 68 3a 20 5b 22 ", { keyPath: ["
0610: 63 6c 6f 62 62 65 72 22 5d 20 7d 29 3b 0a 7d 0a clobber"] });.}.
0620: 0a 2f 2a 2a 0a 20 2a 20 48 65 6c 70 65 72 20 6d ./**. * Helper m
0630: 65 74 68 6f 64 20 74 6f 20 63 6f 6c 6c 65 63 74 ethod to collect
0640: 20 72 65 73 75 6c 74 73 20 66 72 6f 6d 20 61 20 results from a
0650: 43 75 72 73 6f 72 20 61 6e 64 20 70 72 6f 6d 69 Cursor and promi
0660: 73 65 69 66 79 20 69 74 2e 0a 20 2a 20 40 70 61 seify it.. * @pa
0670: 72 61 6d 20 7b 4f 62 6a 65 63 74 53 74 6f 72 65 ram {ObjectStore
0680: 7c 49 6e 64 65 78 7d 20 73 74 6f 72 65 20 54 68 |Index} store Th
0690: 65 20 73 74 6f 72 65 20 74 6f 20 70 65 72 66 6f e store to perfo
06a0: 72 6d 20 6f 70 65 6e 43 75 72 73 6f 72 20 6f 6e rm openCursor on
06b0: 2e 0a 20 2a 20 40 70 61 72 61 6d 20 7b 49 44 42 .. * @param {IDB
06c0: 4b 65 79 52 61 6e 67 65 3d 7d 20 6b 65 79 52 61 KeyRange=} keyRa
06d0: 6e 67 65 20 4f 70 74 69 6f 6e 61 6c 20 6b 65 79 nge Optional key
06e0: 20 72 61 6e 67 65 20 74 6f 20 61 70 70 6c 79 20 range to apply
06f0: 6f 6e 20 74 68 65 20 63 75 72 73 6f 72 2e 0a 20 on the cursor..
0700: 2a 20 40 70 61 72 61 6d 20 7b 46 75 6e 63 74 69 * @param {Functi
0710: 6f 6e 7d 20 72 65 73 75 6c 74 4d 61 70 70 65 72 on} resultMapper
0720: 20 41 20 66 75 6e 63 74 69 6f 6e 20 77 68 69 63 A function whic
0730: 68 20 69 73 20 72 65 70 65 61 74 65 64 6c 79 20 h is repeatedly
0740: 63 61 6c 6c 65 64 20 77 69 74 68 20 61 0a 20 2a called with a. *
0750: 20 43 75 72 73 6f 72 2e 0a 20 2a 20 52 65 74 75 Cursor.. * Retu
0760: 72 6e 20 74 68 65 20 64 61 74 61 20 79 6f 75 20 rn the data you
0770: 77 61 6e 74 20 74 6f 20 6b 65 65 70 2e 0a 20 2a want to keep.. *
0780: 20 40 72 65 74 75 72 6e 20 7b 50 72 6f 6d 69 73 @return {Promis
0790: 65 3c 54 5b 5d 3e 7d 20 52 65 73 6f 6c 76 65 73 e<T[]>} Resolves
07a0: 20 74 6f 20 61 6e 20 61 72 72 61 79 20 6f 66 20 to an array of
07b0: 77 68 61 74 65 76 65 72 20 79 6f 75 20 72 65 74 whatever you ret
07c0: 75 72 6e 65 64 20 66 72 6f 6d 0a 20 2a 20 72 65 urned from. * re
07d0: 73 75 6c 74 4d 61 70 70 65 72 2e 0a 20 2a 2f 0a sultMapper.. */.
07e0: 66 75 6e 63 74 69 6f 6e 20 73 65 6c 65 63 74 51 function selectQ
07f0: 75 65 72 79 28 73 74 6f 72 65 2c 20 6b 65 79 52 uery(store, keyR
0800: 61 6e 67 65 2c 20 72 65 73 75 6c 74 4d 61 70 70 ange, resultMapp
0810: 65 72 29 20 7b 0a 20 20 20 20 63 6f 6e 73 74 20 er) {. const
0820: 71 75 65 72 79 20 3d 20 73 74 6f 72 65 2e 6f 70 query = store.op
0830: 65 6e 43 75 72 73 6f 72 28 6b 65 79 52 61 6e 67 enCursor(keyRang
0840: 65 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 6e e);. return n
0850: 65 77 20 50 72 6f 6d 69 73 65 28 28 72 65 73 6f ew Promise((reso
0860: 6c 76 65 2c 20 72 65 6a 65 63 74 29 20 3d 3e 20 lve, reject) =>
0870: 7b 0a 20 20 20 20 20 20 20 20 63 6f 6e 73 74 20 {. const
0880: 72 65 73 75 6c 74 73 20 3d 20 5b 5d 3b 0a 20 20 results = [];.
0890: 20 20 20 20 20 20 71 75 65 72 79 2e 6f 6e 65 72 query.oner
08a0: 72 6f 72 20 3d 20 28 65 76 65 6e 74 29 20 3d 3e ror = (event) =>
08b0: 20 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 72 {. r
08c0: 65 6a 65 63 74 28 6e 65 77 20 45 72 72 6f 72 28 eject(new Error(
08d0: 22 71 75 65 72 79 20 66 61 69 6c 65 64 3a 20 22 "query failed: "
08e0: 20 2b 20 65 76 65 6e 74 2e 74 61 72 67 65 74 2e + event.target.
08f0: 65 72 72 6f 72 43 6f 64 65 29 29 3b 0a 20 20 20 errorCode));.
0900: 20 20 20 20 20 7d 3b 0a 20 20 20 20 20 20 20 20 };.
0910: 2f 2f 20 63 6f 6c 6c 65 63 74 20 72 65 73 75 6c // collect resul
0920: 74 73 0a 20 20 20 20 20 20 20 20 71 75 65 72 79 ts. query
0930: 2e 6f 6e 73 75 63 63 65 73 73 20 3d 20 28 65 76 .onsuccess = (ev
0940: 65 6e 74 29 20 3d 3e 20 7b 0a 20 20 20 20 20 20 ent) => {.
0950: 20 20 20 20 20 20 63 6f 6e 73 74 20 63 75 72 73 const curs
0960: 6f 72 20 3d 20 65 76 65 6e 74 2e 74 61 72 67 65 or = event.targe
0970: 74 2e 72 65 73 75 6c 74 3b 0a 20 20 20 20 20 20 t.result;.
0980: 20 20 20 20 20 20 69 66 20 28 21 63 75 72 73 6f if (!curso
0990: 72 29 20 7b 0a 20 20 20 20 20 20 20 20 20 20 20 r) {.
09a0: 20 20 20 20 20 72 65 73 6f 6c 76 65 28 72 65 73 resolve(res
09b0: 75 6c 74 73 29 3b 0a 20 20 20 20 20 20 20 20 20 ults);.
09c0: 20 20 20 20 20 20 20 72 65 74 75 72 6e 3b 20 2f return; /
09d0: 2f 20 65 6e 64 20 6f 66 20 72 65 73 75 6c 74 73 / end of results
09e0: 0a 20 20 20 20 20 20 20 20 20 20 20 20 7d 0a 20 . }.
09f0: 20 20 20 20 20 20 20 20 20 20 20 72 65 73 75 6c resul
0a00: 74 73 2e 70 75 73 68 28 72 65 73 75 6c 74 4d 61 ts.push(resultMa
0a10: 70 70 65 72 28 63 75 72 73 6f 72 29 29 3b 0a 20 pper(cursor));.
0a20: 20 20 20 20 20 20 20 20 20 20 20 63 75 72 73 6f curso
0a30: 72 2e 63 6f 6e 74 69 6e 75 65 28 29 3b 0a 20 20 r.continue();.
0a40: 20 20 20 20 20 20 7d 3b 0a 20 20 20 20 7d 29 3b };. });
0a50: 0a 7d 0a 0a 66 75 6e 63 74 69 6f 6e 20 73 65 6c .}..function sel
0a60: 65 63 74 51 75 65 72 79 4c 65 76 65 6c 44 42 28 ectQueryLevelDB(
0a70: 64 62 2c 20 72 65 73 75 6c 74 4d 61 70 70 65 72 db, resultMapper
0a80: 29 20 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 6e ) {. return n
0a90: 65 77 20 50 72 6f 6d 69 73 65 28 28 72 65 73 6f ew Promise((reso
0aa0: 6c 76 65 2c 20 72 65 6a 65 63 74 29 20 3d 3e 20 lve, reject) =>
0ab0: 7b 0a 20 20 20 20 20 20 20 20 63 6f 6e 73 74 20 {. const
0ac0: 72 65 73 75 6c 74 73 20 3d 20 5b 5d 3b 0a 20 20 results = [];.
0ad0: 20 20 20 20 20 20 64 62 2e 63 72 65 61 74 65 52 db.createR
0ae0: 65 61 64 53 74 72 65 61 6d 28 29 0a 20 20 20 20 eadStream().
0af0: 20 20 20 20 20 20 20 20 2e 6f 6e 28 27 64 61 74 .on('dat
0b00: 61 27 2c 20 66 75 6e 63 74 69 6f 6e 20 28 7b 6b a', function ({k
0b10: 65 79 2c 20 76 61 6c 75 65 7d 29 20 7b 0a 20 20 ey, value}) {.
0b20: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 63 6f co
0b30: 6e 73 74 20 6d 61 70 70 65 64 20 3d 20 72 65 73 nst mapped = res
0b40: 75 6c 74 4d 61 70 70 65 72 28 7b 6b 65 79 2c 20 ultMapper({key,
0b50: 76 61 6c 75 65 7d 29 3b 0a 20 20 20 20 20 20 20 value});.
0b60: 20 20 20 20 20 20 20 20 20 69 66 20 28 6d 61 70 if (map
0b70: 70 65 64 29 20 72 65 73 75 6c 74 73 2e 70 75 73 ped) results.pus
0b80: 68 28 6d 61 70 70 65 64 29 3b 0a 20 20 20 20 20 h(mapped);.
0b90: 20 20 20 20 20 20 20 7d 29 2e 6f 6e 28 27 65 72 }).on('er
0ba0: 72 6f 72 27 2c 20 66 75 6e 63 74 69 6f 6e 20 28 ror', function (
0bb0: 65 72 72 29 20 7b 0a 20 20 20 20 20 20 20 20 20 err) {.
0bc0: 20 20 20 20 20 20 20 72 65 6a 65 63 74 28 65 72 reject(er
0bd0: 72 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 r);.
0be0: 7d 29 2e 6f 6e 28 27 63 6c 6f 73 65 27 2c 20 66 }).on('close', f
0bf0: 75 6e 63 74 69 6f 6e 20 28 29 20 7b 0a 20 20 20 unction () {.
0c00: 20 20 20 20 20 20 20 20 20 20 20 20 20 72 65 73 res
0c10: 75 6c 74 73 2e 6c 65 6e 67 74 68 20 3f 20 72 65 ults.length ? re
0c20: 73 6f 6c 76 65 28 72 65 73 75 6c 74 73 29 20 3a solve(results) :
0c30: 20 72 65 6a 65 63 74 28 27 63 6c 6f 73 65 27 29 reject('close')
0c40: 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 7d 29 ;. })
0c50: 2e 6f 6e 28 27 65 6e 64 27 2c 20 66 75 6e 63 74 .on('end', funct
0c60: 69 6f 6e 20 28 29 20 7b 0a 20 20 20 20 20 20 20 ion () {.
0c70: 20 20 20 20 20 20 20 20 20 72 65 73 6f 6c 76 65 resolve
0c80: 28 72 65 73 75 6c 74 73 29 3b 0a 20 20 20 20 20 (results);.
0c90: 20 20 20 20 20 20 20 7d 29 3b 0a 20 20 20 20 7d });. }
0ca0: 29 0a 7d 0a 0a 66 75 6e 63 74 69 6f 6e 20 70 72 ).}..function pr
0cb0: 6f 6d 69 73 65 69 66 79 54 78 6e 28 74 78 6e 29 omiseifyTxn(txn)
0cc0: 20 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 6e 65 {. return ne
0cd0: 77 20 50 72 6f 6d 69 73 65 28 28 72 65 73 6f 6c w Promise((resol
0ce0: 76 65 2c 20 72 65 6a 65 63 74 29 20 3d 3e 20 7b ve, reject) => {
0cf0: 0a 20 20 20 20 20 20 20 20 74 78 6e 2e 6f 6e 63 . txn.onc
0d00: 6f 6d 70 6c 65 74 65 20 3d 20 66 75 6e 63 74 69 omplete = functi
0d10: 6f 6e 28 65 76 65 6e 74 29 20 7b 0a 20 20 20 20 on(event) {.
0d20: 20 20 20 20 20 20 20 20 72 65 73 6f 6c 76 65 28 resolve(
0d30: 65 76 65 6e 74 29 3b 0a 20 20 20 20 20 20 20 20 event);.
0d40: 7d 3b 0a 20 20 20 20 20 20 20 20 74 78 6e 2e 6f };. txn.o
0d50: 6e 65 72 72 6f 72 20 3d 20 66 75 6e 63 74 69 6f nerror = functio
0d60: 6e 28 65 76 65 6e 74 29 20 7b 0a 20 20 20 20 20 n(event) {.
0d70: 20 20 20 20 20 20 20 72 65 6a 65 63 74 28 65 76 reject(ev
0d80: 65 6e 74 29 3b 0a 20 20 20 20 20 20 20 20 7d 3b ent);. };
0d90: 0a 20 20 20 20 7d 29 3b 0a 7d 0a 0a 66 75 6e 63 . });.}..func
0da0: 74 69 6f 6e 20 70 72 6f 6d 69 73 65 69 66 79 52 tion promiseifyR
0db0: 65 71 75 65 73 74 28 72 65 71 29 20 7b 0a 20 20 equest(req) {.
0dc0: 20 20 72 65 74 75 72 6e 20 6e 65 77 20 50 72 6f return new Pro
0dd0: 6d 69 73 65 28 28 72 65 73 6f 6c 76 65 2c 20 72 mise((resolve, r
0de0: 65 6a 65 63 74 29 20 3d 3e 20 7b 0a 20 20 20 20 eject) => {.
0df0: 20 20 20 20 72 65 71 2e 6f 6e 73 75 63 63 65 73 req.onsucces
0e00: 73 20 3d 20 66 75 6e 63 74 69 6f 6e 28 65 76 65 s = function(eve
0e10: 6e 74 29 20 7b 0a 20 20 20 20 20 20 20 20 20 20 nt) {.
0e20: 20 20 72 65 73 6f 6c 76 65 28 65 76 65 6e 74 29 resolve(event)
0e30: 3b 0a 20 20 20 20 20 20 20 20 7d 3b 0a 20 20 20 ;. };.
0e40: 20 20 20 20 20 72 65 71 2e 6f 6e 65 72 72 6f 72 req.onerror
0e50: 20 3d 20 66 75 6e 63 74 69 6f 6e 28 65 76 65 6e = function(even
0e60: 74 29 20 7b 0a 20 20 20 20 20 20 20 20 20 20 20 t) {.
0e70: 20 72 65 6a 65 63 74 28 65 76 65 6e 74 29 3b 0a reject(event);.
0e80: 20 20 20 20 20 20 20 20 7d 3b 0a 20 20 20 20 7d };. }
0e90: 29 3b 0a 7d 0a 0a 2f 2a 2a 0a 20 2a 20 44 6f 65 );.}../**. * Doe
0ea0: 73 20 74 68 65 20 61 63 74 75 61 6c 20 72 65 61 s the actual rea
0eb0: 64 69 6e 67 20 66 72 6f 6d 20 61 6e 64 20 77 72 ding from and wr
0ec0: 69 74 69 6e 67 20 74 6f 20 74 68 65 20 69 6e 64 iting to the ind
0ed0: 65 78 65 64 64 62 0a 20 2a 0a 20 2a 20 43 6f 6e exeddb. *. * Con
0ee0: 73 74 72 75 63 74 20 61 20 6e 65 77 20 49 6e 64 struct a new Ind
0ef0: 65 78 65 64 20 44 61 74 61 62 61 73 65 20 73 74 exed Database st
0f00: 6f 72 65 20 62 61 63 6b 65 6e 64 2e 20 54 68 69 ore backend. Thi
0f10: 73 20 72 65 71 75 69 72 65 73 20 61 20 63 61 6c s requires a cal
0f20: 6c 20 74 6f 0a 20 2a 20 3c 63 6f 64 65 3e 63 6f l to. * <code>co
0f30: 6e 6e 65 63 74 28 29 3c 2f 63 6f 64 65 3e 20 62 nnect()</code> b
0f40: 65 66 6f 72 65 20 74 68 69 73 20 73 74 6f 72 65 efore this store
0f50: 20 63 61 6e 20 62 65 20 75 73 65 64 2e 0a 20 2a can be used.. *
0f60: 20 40 63 6f 6e 73 74 72 75 63 74 6f 72 0a 20 2a @constructor. *
0f70: 20 40 70 61 72 61 6d 20 7b 4f 62 6a 65 63 74 7d @param {Object}
0f80: 20 69 6e 64 65 78 65 64 44 42 49 6e 74 65 72 66 indexedDBInterf
0f90: 61 63 65 20 54 68 65 20 49 6e 64 65 78 65 64 20 ace The Indexed
0fa0: 44 42 20 69 6e 74 65 72 66 61 63 65 20 65 2e 67 DB interface e.g
0fb0: 0a 20 2a 20 3c 63 6f 64 65 3e 77 69 6e 64 6f 77 . * <code>window
0fc0: 2e 69 6e 64 65 78 65 64 44 42 3c 2f 63 6f 64 65 .indexedDB</code
0fd0: 3e 0a 20 2a 20 40 70 61 72 61 6d 20 7b 73 74 72 >. * @param {str
0fe0: 69 6e 67 3d 7d 20 64 62 4e 61 6d 65 20 4f 70 74 ing=} dbName Opt
0ff0: 69 6f 6e 61 6c 20 64 61 74 61 62 61 73 65 20 6e ional database n
1000: 61 6d 65 2e 20 54 68 65 20 73 61 6d 65 20 6e 61 ame. The same na
1010: 6d 65 20 6d 75 73 74 20 62 65 20 75 73 65 64 0a me must be used.
1020: 20 2a 20 74 6f 20 6f 70 65 6e 20 74 68 65 20 73 * to open the s
1030: 61 6d 65 20 64 61 74 61 62 61 73 65 2e 0a 20 2a ame database.. *
1040: 2f 0a 0a 2f 2f 20 65 78 70 6f 72 74 20 64 65 66 /..// export def
1050: 61 75 6c 74 20 63 6c 61 73 73 20 4c 65 76 65 6c ault class Level
1060: 53 74 6f 72 65 20 7b 0a 6d 6f 64 75 6c 65 2e 65 Store {.module.e
1070: 78 70 6f 72 74 73 20 3d 20 63 6c 61 73 73 20 4c xports = class L
1080: 65 76 65 6c 53 74 6f 72 65 20 7b 0a 20 20 20 20 evelStore {.
1090: 63 6f 6e 73 74 72 75 63 74 6f 72 28 64 62 4e 61 constructor(dbNa
10a0: 6d 65 29 20 7b 0a 20 20 20 20 20 20 20 20 74 68 me) {. th
10b0: 69 73 2e 5f 64 62 4e 61 6d 65 20 3d 20 27 6d 61 is._dbName = 'ma
10c0: 74 72 69 78 2d 6a 73 2d 73 64 6b 3a 27 20 2b 20 trix-js-sdk:' +
10d0: 28 64 62 4e 61 6d 65 20 7c 7c 20 27 64 65 66 61 (dbName || 'defa
10e0: 75 6c 74 27 29 3b 0a 20 20 20 20 20 20 20 20 74 ult');. t
10f0: 68 69 73 2e 64 62 20 3d 20 6e 75 6c 6c 3b 0a 20 his.db = null;.
1100: 20 20 20 20 20 20 20 74 68 69 73 2e 5f 64 69 73 this._dis
1110: 63 6f 6e 6e 65 63 74 65 64 20 3d 20 74 72 75 65 connected = true
1120: 3b 0a 20 20 20 20 20 20 20 20 74 68 69 73 2e 5f ;. this._
1130: 73 79 6e 63 41 63 63 75 6d 75 6c 61 74 6f 72 20 syncAccumulator
1140: 3d 20 6e 65 77 20 53 79 6e 63 41 63 63 75 6d 75 = new SyncAccumu
1150: 6c 61 74 6f 72 28 29 3b 0a 20 20 20 20 7d 0a 0a lator();. }..
1160: 20 20 20 20 2f 2a 2a 0a 20 20 20 20 20 2a 20 41 /**. * A
1170: 74 74 65 6d 70 74 20 74 6f 20 63 6f 6e 6e 65 63 ttempt to connec
1180: 74 20 74 6f 20 74 68 65 20 64 61 74 61 62 61 73 t to the databas
1190: 65 2e 20 54 68 69 73 20 63 61 6e 20 66 61 69 6c e. This can fail
11a0: 20 69 66 20 74 68 65 20 75 73 65 72 20 64 6f 65 if the user doe
11b0: 73 20 6e 6f 74 0a 20 20 20 20 20 2a 20 67 72 61 s not. * gra
11c0: 6e 74 20 70 65 72 6d 69 73 73 69 6f 6e 2e 0a 20 nt permission..
11d0: 20 20 20 20 2a 20 40 72 65 74 75 72 6e 20 7b 50 * @return {P
11e0: 72 6f 6d 69 73 65 7d 20 52 65 73 6f 6c 76 65 73 romise} Resolves
11f0: 20 69 66 20 73 75 63 63 65 73 73 66 75 6c 6c 79 if successfully
1200: 20 63 6f 6e 6e 65 63 74 65 64 2e 0a 20 20 20 20 connected..
1210: 20 2a 2f 0a 20 20 20 20 63 6f 6e 6e 65 63 74 28 */. connect(
1220: 29 20 7b 0a 20 20 20 20 20 20 20 20 69 66 20 28 ) {. if (
1230: 21 74 68 69 73 2e 5f 64 69 73 63 6f 6e 6e 65 63 !this._disconnec
1240: 74 65 64 29 20 7b 0a 20 20 20 20 20 20 20 20 20 ted) {.
1250: 20 20 20 63 6f 6e 73 6f 6c 65 2e 6c 6f 67 28 60 console.log(`
1260: 4c 6f 63 61 6c 49 6e 64 65 78 65 64 44 42 53 74 LocalIndexedDBSt
1270: 6f 72 65 42 61 63 6b 65 6e 64 2e 63 6f 6e 6e 65 oreBackend.conne
1280: 63 74 3a 20 61 6c 72 65 61 64 79 20 63 6f 6e 6e ct: already conn
1290: 65 63 74 65 64 20 6f 72 20 63 6f 6e 6e 65 63 74 ected or connect
12a0: 69 6e 67 60 29 3b 0a 20 20 20 20 20 20 20 20 20 ing`);.
12b0: 20 20 20 72 65 74 75 72 6e 20 50 72 6f 6d 69 73 return Promis
12c0: 65 2e 72 65 73 6f 6c 76 65 28 29 3b 0a 20 20 20 e.resolve();.
12d0: 20 20 20 20 20 7d 0a 0a 20 20 20 20 20 20 20 20 }..
12e0: 74 68 69 73 2e 5f 64 69 73 63 6f 6e 6e 65 63 74 this._disconnect
12f0: 65 64 20 3d 20 66 61 6c 73 65 3b 0a 0a 20 20 20 ed = false;..
1300: 20 20 20 20 20 63 6f 6e 73 6f 6c 65 2e 6c 6f 67 console.log
1310: 28 60 4c 6f 63 61 6c 49 6e 64 65 78 65 64 44 42 (`LocalIndexedDB
1320: 53 74 6f 72 65 42 61 63 6b 65 6e 64 2e 63 6f 6e StoreBackend.con
1330: 6e 65 63 74 3a 20 63 6f 6e 6e 65 63 74 69 6e 67 nect: connecting
1340: 2e 2e 2e 60 2c 29 3b 0a 20 20 20 20 20 20 20 20 ...`,);.
1350: 74 68 69 73 2e 64 62 20 3d 20 6c 65 76 65 6c 28 this.db = level(
1360: 74 68 69 73 2e 5f 64 62 4e 61 6d 65 29 3b 0a 0a this._dbName);..
1370: 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 74 return t
1380: 68 69 73 2e 5f 69 6e 69 74 28 29 3b 0a 20 20 20 his._init();.
1390: 20 7d 0a 0a 20 20 20 20 2f 2a 2a 0a 20 20 20 20 }.. /**.
13a0: 20 2a 20 48 61 76 69 6e 67 20 63 6f 6e 6e 65 63 * Having connec
13b0: 74 65 64 2c 20 6c 6f 61 64 20 69 6e 69 74 69 61 ted, load initia
13c0: 6c 20 64 61 74 61 20 66 72 6f 6d 20 74 68 65 20 l data from the
13d0: 64 61 74 61 62 61 73 65 20 61 6e 64 20 70 72 65 database and pre
13e0: 70 61 72 65 20 66 6f 72 20 75 73 65 0a 20 20 20 pare for use.
13f0: 20 20 2a 20 40 72 65 74 75 72 6e 20 7b 50 72 6f * @return {Pro
1400: 6d 69 73 65 7d 20 52 65 73 6f 6c 76 65 73 20 6f mise} Resolves o
1410: 6e 20 73 75 63 63 65 73 73 0a 20 20 20 20 20 2a n success. *
1420: 2f 0a 20 20 20 20 5f 69 6e 69 74 28 29 20 7b 0a /. _init() {.
1430: 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 50 return P
1440: 72 6f 6d 69 73 65 2e 61 6c 6c 28 5b 0a 20 20 20 romise.all([.
1450: 20 20 20 20 20 20 20 20 20 74 68 69 73 2e 5f 6c this._l
1460: 6f 61 64 41 63 63 6f 75 6e 74 44 61 74 61 28 29 oadAccountData()
1470: 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 74 68 ,. th
1480: 69 73 2e 5f 6c 6f 61 64 53 79 6e 63 44 61 74 61 is._loadSyncData
1490: 28 29 2c 0a 20 20 20 20 20 20 20 20 5d 29 2e 74 (),. ]).t
14a0: 68 65 6e 28 28 5b 61 63 63 6f 75 6e 74 44 61 74 hen(([accountDat
14b0: 61 2c 20 73 79 6e 63 44 61 74 61 5d 29 20 3d 3e a, syncData]) =>
14c0: 20 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 63 {. c
14d0: 6f 6e 73 6f 6c 65 2e 6c 6f 67 28 60 4c 6f 63 61 onsole.log(`Loca
14e0: 6c 49 6e 64 65 78 65 64 44 42 53 74 6f 72 65 42 lIndexedDBStoreB
14f0: 61 63 6b 65 6e 64 3a 20 6c 6f 61 64 65 64 20 69 ackend: loaded i
1500: 6e 69 74 69 61 6c 20 64 61 74 61 60 29 3b 0a 20 nitial data`);.
1510: 20 20 20 20 20 20 20 20 20 20 20 74 68 69 73 2e this.
1520: 5f 73 79 6e 63 41 63 63 75 6d 75 6c 61 74 6f 72 _syncAccumulator
1530: 2e 61 63 63 75 6d 75 6c 61 74 65 28 7b 0a 20 20 .accumulate({.
1540: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 6e 65 ne
1550: 78 74 5f 62 61 74 63 68 3a 20 73 79 6e 63 44 61 xt_batch: syncDa
1560: 74 61 2e 6e 65 78 74 42 61 74 63 68 2c 0a 20 20 ta.nextBatch,.
1570: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 72 6f ro
1580: 6f 6d 73 3a 20 73 79 6e 63 44 61 74 61 2e 72 6f oms: syncData.ro
1590: 6f 6d 73 44 61 74 61 2c 0a 20 20 20 20 20 20 20 omsData,.
15a0: 20 20 20 20 20 20 20 20 20 67 72 6f 75 70 73 3a groups:
15b0: 20 73 79 6e 63 44 61 74 61 2e 67 72 6f 75 70 73 syncData.groups
15c0: 44 61 74 61 2c 0a 20 20 20 20 20 20 20 20 20 20 Data,.
15d0: 20 20 20 20 20 20 61 63 63 6f 75 6e 74 5f 64 61 account_da
15e0: 74 61 3a 20 7b 0a 20 20 20 20 20 20 20 20 20 20 ta: {.
15f0: 20 20 20 20 20 20 20 20 20 20 65 76 65 6e 74 73 events
1600: 3a 20 61 63 63 6f 75 6e 74 44 61 74 61 2c 0a 20 : accountData,.
1610: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7d }
1620: 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 7d 29 ,. })
1630: 3b 0a 20 20 20 20 20 20 20 20 7d 29 3b 0a 20 20 ;. });.
1640: 20 20 7d 0a 0a 20 20 20 20 2f 2a 2a 0a 20 20 20 }.. /**.
1650: 20 20 2a 20 43 6c 65 61 72 20 74 68 65 20 65 6e * Clear the en
1660: 74 69 72 65 20 64 61 74 61 62 61 73 65 2e 20 54 tire database. T
1670: 68 69 73 20 73 68 6f 75 6c 64 20 62 65 20 75 73 his should be us
1680: 65 64 20 77 68 65 6e 20 6c 6f 67 67 69 6e 67 20 ed when logging
1690: 6f 75 74 20 6f 66 20 61 20 63 6c 69 65 6e 74 0a out of a client.
16a0: 20 20 20 20 20 2a 20 74 6f 20 70 72 65 76 65 6e * to preven
16b0: 74 20 6d 69 78 69 6e 67 20 64 61 74 61 20 62 65 t mixing data be
16c0: 74 77 65 65 6e 20 61 63 63 6f 75 6e 74 73 2e 0a tween accounts..
16d0: 20 20 20 20 20 2a 20 40 72 65 74 75 72 6e 20 7b * @return {
16e0: 50 72 6f 6d 69 73 65 7d 20 52 65 73 6f 6c 76 65 Promise} Resolve
16f0: 64 20 77 68 65 6e 20 74 68 65 20 64 61 74 61 62 d when the datab
1700: 61 73 65 20 69 73 20 63 6c 65 61 72 65 64 2e 0a ase is cleared..
1710: 20 20 20 20 20 2a 2f 0a 20 20 20 20 63 6c 65 61 */. clea
1720: 72 44 61 74 61 62 61 73 65 28 29 20 7b 0a 20 20 rDatabase() {.
1730: 20 20 20 20 20 20 72 65 74 75 72 6e 20 6e 65 77 return new
1740: 20 50 72 6f 6d 69 73 65 28 28 72 65 73 6f 6c 76 Promise((resolv
1750: 65 2c 20 72 65 6a 65 63 74 29 20 3d 3e 20 7b 0a e, reject) => {.
1760: 20 20 20 20 20 20 20 20 20 20 20 20 6c 65 76 65 leve
1770: 6c 64 6f 77 6e 2e 64 65 73 74 72 6f 79 28 74 68 ldown.destroy(th
1780: 69 73 2e 5f 64 62 4e 61 6d 65 2c 20 28 29 20 3d is._dbName, () =
1790: 3e 20 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 > {.
17a0: 20 20 20 20 72 65 73 6f 6c 76 65 28 29 3b 0a 20 resolve();.
17b0: 20 20 20 20 20 20 20 20 20 20 20 7d 29 3b 0a 20 });.
17c0: 20 20 20 20 20 20 20 7d 29 3b 0a 20 20 20 20 7d });. }
17d0: 0a 0a 20 20 20 20 2f 2a 2a 0a 20 20 20 20 20 2a .. /**. *
17e0: 20 40 70 61 72 61 6d 20 7b 62 6f 6f 6c 65 61 6e @param {boolean
17f0: 3d 7d 20 63 6f 70 79 20 49 66 20 66 61 6c 73 65 =} copy If false
1800: 2c 20 74 68 65 20 64 61 74 61 20 72 65 74 75 72 , the data retur
1810: 6e 65 64 20 69 73 20 66 72 6f 6d 20 69 6e 74 65 ned is from inte
1820: 72 6e 61 6c 0a 20 20 20 20 20 2a 20 62 75 66 66 rnal. * buff
1830: 65 72 73 20 61 6e 64 20 6d 75 73 74 20 6e 6f 74 ers and must not
1840: 20 62 65 20 6d 75 74 61 74 65 64 2e 20 4f 74 68 be mutated. Oth
1850: 65 72 77 69 73 65 2c 20 61 20 63 6f 70 79 20 69 erwise, a copy i
1860: 73 20 6d 61 64 65 20 62 65 66 6f 72 65 0a 20 20 s made before.
1870: 20 20 20 2a 20 72 65 74 75 72 6e 69 6e 67 20 73 * returning s
1880: 75 63 68 20 74 68 61 74 20 74 68 65 20 64 61 74 uch that the dat
1890: 61 20 63 61 6e 20 62 65 20 73 61 66 65 6c 79 20 a can be safely
18a0: 6d 75 74 61 74 65 64 2e 20 44 65 66 61 75 6c 74 mutated. Default
18b0: 3a 20 74 72 75 65 2e 0a 20 20 20 20 20 2a 0a 20 : true.. *.
18c0: 20 20 20 20 2a 20 40 72 65 74 75 72 6e 20 7b 50 * @return {P
18d0: 72 6f 6d 69 73 65 7d 20 52 65 73 6f 6c 76 65 73 romise} Resolves
18e0: 20 77 69 74 68 20 61 20 73 79 6e 63 20 72 65 73 with a sync res
18f0: 70 6f 6e 73 65 20 74 6f 20 72 65 73 74 6f 72 65 ponse to restore
1900: 20 74 68 65 0a 20 20 20 20 20 2a 20 63 6c 69 65 the. * clie
1910: 6e 74 20 73 74 61 74 65 20 74 6f 20 77 68 65 72 nt state to wher
1920: 65 20 69 74 20 77 61 73 20 61 74 20 74 68 65 20 e it was at the
1930: 6c 61 73 74 20 73 61 76 65 2c 20 6f 72 20 6e 75 last save, or nu
1940: 6c 6c 20 69 66 20 74 68 65 72 65 0a 20 20 20 20 ll if there.
1950: 20 2a 20 69 73 20 6e 6f 20 73 61 76 65 64 20 73 * is no saved s
1960: 79 6e 63 20 64 61 74 61 2e 0a 20 20 20 20 20 2a ync data.. *
1970: 2f 0a 20 20 20 20 67 65 74 53 61 76 65 64 53 79 /. getSavedSy
1980: 6e 63 28 63 6f 70 79 29 20 7b 0a 20 20 20 20 20 nc(copy) {.
1990: 20 20 20 69 66 20 28 63 6f 70 79 20 3d 3d 3d 20 if (copy ===
19a0: 75 6e 64 65 66 69 6e 65 64 29 20 63 6f 70 79 20 undefined) copy
19b0: 3d 20 74 72 75 65 3b 0a 0a 20 20 20 20 20 20 20 = true;..
19c0: 20 63 6f 6e 73 74 20 64 61 74 61 20 3d 20 74 68 const data = th
19d0: 69 73 2e 5f 73 79 6e 63 41 63 63 75 6d 75 6c 61 is._syncAccumula
19e0: 74 6f 72 2e 67 65 74 4a 53 4f 4e 28 29 3b 0a 20 tor.getJSON();.
19f0: 20 20 20 20 20 20 20 69 66 20 28 21 64 61 74 61 if (!data
1a00: 2e 6e 65 78 74 42 61 74 63 68 29 20 72 65 74 75 .nextBatch) retu
1a10: 72 6e 20 50 72 6f 6d 69 73 65 2e 72 65 73 6f 6c rn Promise.resol
1a20: 76 65 28 6e 75 6c 6c 29 3b 0a 20 20 20 20 20 20 ve(null);.
1a30: 20 20 69 66 20 28 63 6f 70 79 29 20 7b 0a 20 20 if (copy) {.
1a40: 20 20 20 20 20 20 20 20 20 20 2f 2f 20 57 65 20 // We
1a50: 6d 75 73 74 20 64 65 65 70 20 63 6f 70 79 20 74 must deep copy t
1a60: 68 65 20 73 74 6f 72 65 64 20 64 61 74 61 20 73 he stored data s
1a70: 6f 20 74 68 61 74 20 74 68 65 20 2f 73 79 6e 63 o that the /sync
1a80: 20 70 72 6f 63 65 73 73 69 6e 67 20 63 6f 64 65 processing code
1a90: 20 64 6f 65 73 6e 27 74 0a 20 20 20 20 20 20 20 doesn't.
1aa0: 20 20 20 20 20 2f 2f 20 63 6f 72 72 75 70 74 20 // corrupt
1ab0: 74 68 65 20 69 6e 74 65 72 6e 61 6c 20 73 74 61 the internal sta
1ac0: 74 65 20 6f 66 20 74 68 65 20 73 79 6e 63 20 61 te of the sync a
1ad0: 63 63 75 6d 75 6c 61 74 6f 72 20 28 69 74 20 61 ccumulator (it a
1ae0: 64 64 73 20 6e 6f 6e 2d 63 6c 6f 6e 61 62 6c 65 dds non-clonable
1af0: 20 6b 65 79 73 29 0a 20 20 20 20 20 20 20 20 20 keys).
1b00: 20 20 20 72 65 74 75 72 6e 20 50 72 6f 6d 69 73 return Promis
1b10: 65 2e 72 65 73 6f 6c 76 65 28 75 74 69 6c 73 2e e.resolve(utils.
1b20: 64 65 65 70 43 6f 70 79 28 64 61 74 61 29 29 3b deepCopy(data));
1b30: 0a 20 20 20 20 20 20 20 20 7d 20 65 6c 73 65 20 . } else
1b40: 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 72 65 {. re
1b50: 74 75 72 6e 20 50 72 6f 6d 69 73 65 2e 72 65 73 turn Promise.res
1b60: 6f 6c 76 65 28 64 61 74 61 29 3b 0a 20 20 20 20 olve(data);.
1b70: 20 20 20 20 7d 0a 20 20 20 20 7d 0a 0a 20 20 20 }. }..
1b80: 20 67 65 74 4e 65 78 74 42 61 74 63 68 54 6f 6b getNextBatchTok
1b90: 65 6e 28 29 20 7b 0a 20 20 20 20 20 20 20 20 72 en() {. r
1ba0: 65 74 75 72 6e 20 50 72 6f 6d 69 73 65 2e 72 65 eturn Promise.re
1bb0: 73 6f 6c 76 65 28 74 68 69 73 2e 5f 73 79 6e 63 solve(this._sync
1bc0: 41 63 63 75 6d 75 6c 61 74 6f 72 2e 67 65 74 4e Accumulator.getN
1bd0: 65 78 74 42 61 74 63 68 54 6f 6b 65 6e 28 29 29 extBatchToken())
1be0: 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 73 65 74 ;. }.. set
1bf0: 53 79 6e 63 44 61 74 61 28 73 79 6e 63 44 61 74 SyncData(syncDat
1c00: 61 29 20 7b 0a 20 20 20 20 20 20 20 20 72 65 74 a) {. ret
1c10: 75 72 6e 20 50 72 6f 6d 69 73 65 2e 72 65 73 6f urn Promise.reso
1c20: 6c 76 65 28 29 2e 74 68 65 6e 28 28 29 20 3d 3e lve().then(() =>
1c30: 20 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 74 {. t
1c40: 68 69 73 2e 5f 73 79 6e 63 41 63 63 75 6d 75 6c his._syncAccumul
1c50: 61 74 6f 72 2e 61 63 63 75 6d 75 6c 61 74 65 28 ator.accumulate(
1c60: 73 79 6e 63 44 61 74 61 29 3b 0a 20 20 20 20 20 syncData);.
1c70: 20 20 20 7d 29 3b 0a 20 20 20 20 7d 0a 0a 20 20 });. }..
1c80: 20 20 73 79 6e 63 54 6f 44 61 74 61 62 61 73 65 syncToDatabase
1c90: 28 75 73 65 72 54 75 70 6c 65 73 29 20 7b 0a 20 (userTuples) {.
1ca0: 20 20 20 20 20 20 20 63 6f 6e 73 74 20 73 79 6e const syn
1cb0: 63 44 61 74 61 20 3d 20 74 68 69 73 2e 5f 73 79 cData = this._sy
1cc0: 6e 63 41 63 63 75 6d 75 6c 61 74 6f 72 2e 67 65 ncAccumulator.ge
1cd0: 74 4a 53 4f 4e 28 29 3b 0a 0a 20 20 20 20 20 20 tJSON();..
1ce0: 20 20 72 65 74 75 72 6e 20 50 72 6f 6d 69 73 65 return Promise
1cf0: 2e 61 6c 6c 28 5b 0a 20 20 20 20 20 20 20 20 20 .all([.
1d00: 20 20 20 74 68 69 73 2e 5f 70 65 72 73 69 73 74 this._persist
1d10: 55 73 65 72 50 72 65 73 65 6e 63 65 45 76 65 6e UserPresenceEven
1d20: 74 73 28 75 73 65 72 54 75 70 6c 65 73 29 2c 0a ts(userTuples),.
1d30: 20 20 20 20 20 20 20 20 20 20 20 20 74 68 69 73 this
1d40: 2e 5f 70 65 72 73 69 73 74 41 63 63 6f 75 6e 74 ._persistAccount
1d50: 44 61 74 61 28 73 79 6e 63 44 61 74 61 2e 61 63 Data(syncData.ac
1d60: 63 6f 75 6e 74 44 61 74 61 29 2c 0a 20 20 20 20 countData),.
1d70: 20 20 20 20 20 20 20 20 74 68 69 73 2e 5f 70 65 this._pe
1d80: 72 73 69 73 74 53 79 6e 63 44 61 74 61 28 0a 20 rsistSyncData(.
1d90: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 73 s
1da0: 79 6e 63 44 61 74 61 2e 6e 65 78 74 42 61 74 63 yncData.nextBatc
1db0: 68 2c 20 73 79 6e 63 44 61 74 61 2e 72 6f 6f 6d h, syncData.room
1dc0: 73 44 61 74 61 2c 20 73 79 6e 63 44 61 74 61 2e sData, syncData.
1dd0: 67 72 6f 75 70 73 44 61 74 61 2c 0a 20 20 20 20 groupsData,.
1de0: 20 20 20 20 20 20 20 20 29 2c 0a 20 20 20 20 20 ),.
1df0: 20 20 20 5d 29 3b 0a 20 20 20 20 7d 0a 0a 20 20 ]);. }..
1e00: 20 20 2f 2a 2a 0a 20 20 20 20 20 2a 20 50 65 72 /**. * Per
1e10: 73 69 73 74 20 72 6f 6f 6d 73 20 2f 73 79 6e 63 sist rooms /sync
1e20: 20 64 61 74 61 20 61 6c 6f 6e 67 20 77 69 74 68 data along with
1e30: 20 74 68 65 20 6e 65 78 74 20 62 61 74 63 68 20 the next batch
1e40: 74 6f 6b 65 6e 2e 0a 20 20 20 20 20 2a 20 40 70 token.. * @p
1e50: 61 72 61 6d 20 7b 73 74 72 69 6e 67 7d 20 6e 65 aram {string} ne
1e60: 78 74 42 61 74 63 68 20 54 68 65 20 6e 65 78 74 xtBatch The next
1e70: 5f 62 61 74 63 68 20 2f 73 79 6e 63 20 76 61 6c _batch /sync val
1e80: 75 65 2e 0a 20 20 20 20 20 2a 20 40 70 61 72 61 ue.. * @para
1e90: 6d 20 7b 4f 62 6a 65 63 74 7d 20 72 6f 6f 6d 73 m {Object} rooms
1ea0: 44 61 74 61 20 54 68 65 20 27 72 6f 6f 6d 73 27 Data The 'rooms'
1eb0: 20 2f 73 79 6e 63 20 64 61 74 61 20 66 72 6f 6d /sync data from
1ec0: 20 61 20 53 79 6e 63 41 63 63 75 6d 75 6c 61 74 a SyncAccumulat
1ed0: 6f 72 0a 20 20 20 20 20 2a 20 40 70 61 72 61 6d or. * @param
1ee0: 20 7b 4f 62 6a 65 63 74 7d 20 67 72 6f 75 70 73 {Object} groups
1ef0: 44 61 74 61 20 54 68 65 20 27 67 72 6f 75 70 73 Data The 'groups
1f00: 27 20 2f 73 79 6e 63 20 64 61 74 61 20 66 72 6f ' /sync data fro
1f10: 6d 20 61 20 53 79 6e 63 41 63 63 75 6d 75 6c 61 m a SyncAccumula
1f20: 74 6f 72 0a 20 20 20 20 20 2a 20 40 72 65 74 75 tor. * @retu
1f30: 72 6e 20 7b 50 72 6f 6d 69 73 65 7d 20 52 65 73 rn {Promise} Res
1f40: 6f 6c 76 65 73 20 69 66 20 74 68 65 20 64 61 74 olves if the dat
1f50: 61 20 77 61 73 20 70 65 72 73 69 73 74 65 64 2e a was persisted.
1f60: 0a 20 20 20 20 20 2a 2f 0a 20 20 20 20 5f 70 65 . */. _pe
1f70: 72 73 69 73 74 53 79 6e 63 44 61 74 61 28 6e 65 rsistSyncData(ne
1f80: 78 74 42 61 74 63 68 2c 20 72 6f 6f 6d 73 44 61 xtBatch, roomsDa
1f90: 74 61 2c 20 67 72 6f 75 70 73 44 61 74 61 29 20 ta, groupsData)
1fa0: 7b 0a 20 20 20 20 20 20 20 20 63 6f 6e 73 6f 6c {. consol
1fb0: 65 2e 6c 6f 67 28 22 50 65 72 73 69 73 74 69 6e e.log("Persistin
1fc0: 67 20 73 79 6e 63 20 64 61 74 61 20 75 70 20 74 g sync data up t
1fd0: 6f 20 22 2c 20 6e 65 78 74 42 61 74 63 68 29 3b o ", nextBatch);
1fe0: 0a 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 . return
1ff0: 50 72 6f 6d 69 73 65 2e 74 72 79 28 28 29 20 3d Promise.try(() =
2000: 3e 20 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 > {.
2010: 74 68 69 73 2e 64 62 2e 70 75 74 28 27 73 79 6e this.db.put('syn
2020: 63 27 2c 20 7b 0a 20 20 20 20 20 20 20 20 20 20 c', {.
2030: 20 20 20 20 20 20 6e 65 78 74 42 61 74 63 68 3a nextBatch:
2040: 20 6e 65 78 74 42 61 74 63 68 2c 0a 20 20 20 20 nextBatch,.
2050: 20 20 20 20 20 20 20 20 20 20 20 20 72 6f 6f 6d room
2060: 73 44 61 74 61 3a 20 72 6f 6f 6d 73 44 61 74 61 sData: roomsData
2070: 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 ,.
2080: 20 20 67 72 6f 75 70 73 44 61 74 61 3a 20 67 72 groupsData: gr
2090: 6f 75 70 73 44 61 74 61 2c 0a 20 20 20 20 20 20 oupsData,.
20a0: 20 20 20 20 20 20 7d 29 3b 20 2f 2f 20 70 75 74 }); // put
20b0: 20 3d 3d 20 55 50 53 45 52 54 0a 20 20 20 20 20 == UPSERT.
20c0: 20 20 20 7d 29 3b 0a 20 20 20 20 7d 0a 0a 20 20 });. }..
20d0: 20 20 2f 2a 2a 0a 20 20 20 20 20 2a 20 50 65 72 /**. * Per
20e0: 73 69 73 74 20 61 20 6c 69 73 74 20 6f 66 20 61 sist a list of a
20f0: 63 63 6f 75 6e 74 20 64 61 74 61 20 65 76 65 6e ccount data even
2100: 74 73 2e 20 45 76 65 6e 74 73 20 77 69 74 68 20 ts. Events with
2110: 74 68 65 20 73 61 6d 65 20 27 74 79 70 65 27 20 the same 'type'
2120: 77 69 6c 6c 0a 20 20 20 20 20 2a 20 62 65 20 72 will. * be r
2130: 65 70 6c 61 63 65 64 2e 0a 20 20 20 20 20 2a 20 eplaced.. *
2140: 40 70 61 72 61 6d 20 7b 4f 62 6a 65 63 74 5b 5d @param {Object[]
2150: 7d 20 61 63 63 6f 75 6e 74 44 61 74 61 20 41 6e } accountData An
2160: 20 61 72 72 61 79 20 6f 66 20 72 61 77 20 75 73 array of raw us
2170: 65 72 2d 73 63 6f 70 65 64 20 61 63 63 6f 75 6e er-scoped accoun
2180: 74 20 64 61 74 61 20 65 76 65 6e 74 73 0a 20 20 t data events.
2190: 20 20 20 2a 20 40 72 65 74 75 72 6e 20 7b 50 72 * @return {Pr
21a0: 6f 6d 69 73 65 7d 20 52 65 73 6f 6c 76 65 73 20 omise} Resolves
21b0: 69 66 20 74 68 65 20 65 76 65 6e 74 73 20 77 65 if the events we
21c0: 72 65 20 70 65 72 73 69 73 74 65 64 2e 0a 20 20 re persisted..
21d0: 20 20 20 2a 2f 0a 20 20 20 20 5f 70 65 72 73 69 */. _persi
21e0: 73 74 41 63 63 6f 75 6e 74 44 61 74 61 28 61 63 stAccountData(ac
21f0: 63 6f 75 6e 74 44 61 74 61 29 20 7b 0a 20 20 20 countData) {.
2200: 20 20 20 20 20 72 65 74 75 72 6e 20 50 72 6f 6d return Prom
2210: 69 73 65 2e 74 72 79 28 28 29 20 3d 3e 20 7b 0a ise.try(() => {.
2220: 20 20 20 20 20 20 20 20 20 20 20 20 72 65 74 75 retu
2230: 72 6e 20 50 72 6f 6d 69 73 65 2e 61 6c 6c 28 61 rn Promise.all(a
2240: 63 63 6f 75 6e 74 44 61 74 61 2e 6d 61 70 28 28 ccountData.map((
2250: 65 76 29 20 3d 3e 20 7b 0a 20 20 20 20 20 20 20 ev) => {.
2260: 20 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 return
2270: 74 68 69 73 2e 64 62 2e 70 75 74 28 27 61 63 63 this.db.put('acc
2280: 6f 75 6e 74 44 61 74 61 3a 27 20 2b 20 65 76 2e ountData:' + ev.
2290: 67 65 74 54 79 70 65 28 29 2c 20 65 76 29 3b 20 getType(), ev);
22a0: 2f 2f 20 70 75 74 20 3d 3d 20 55 50 53 45 52 54 // put == UPSERT
22b0: 0a 20 20 20 20 20 20 20 20 20 20 20 20 7d 29 29 . }))
22c0: 3b 0a 20 20 20 20 20 20 20 20 7d 29 3b 0a 20 20 ;. });.
22d0: 20 20 7d 0a 0a 20 20 20 20 2f 2a 2a 0a 20 20 20 }.. /**.
22e0: 20 20 2a 20 50 65 72 73 69 73 74 20 61 20 6c 69 * Persist a li
22f0: 73 74 20 6f 66 20 5b 75 73 65 72 20 69 64 2c 20 st of [user id,
2300: 70 72 65 73 65 6e 63 65 20 45 76 65 6e 74 5d 20 presence Event]
2310: 74 68 65 79 20 61 72 65 20 66 6f 72 2e 0a 20 20 they are for..
2320: 20 20 20 2a 20 55 73 65 72 73 20 77 69 74 68 20 * Users with
2330: 74 68 65 20 73 61 6d 65 20 27 75 73 65 72 49 64 the same 'userId
2340: 27 20 77 69 6c 6c 20 62 65 20 72 65 70 6c 61 63 ' will be replac
2350: 65 64 2e 0a 20 20 20 20 20 2a 20 50 72 65 73 65 ed.. * Prese
2360: 6e 63 65 20 65 76 65 6e 74 73 20 73 68 6f 75 6c nce events shoul
2370: 64 20 62 65 20 74 68 65 20 45 76 65 6e 74 20 69 d be the Event i
2380: 6e 20 69 74 73 20 72 61 77 20 66 6f 72 6d 20 28 n its raw form (
2390: 6e 6f 74 20 74 68 65 20 45 76 65 6e 74 0a 20 20 not the Event.
23a0: 20 20 20 2a 20 6f 62 6a 65 63 74 29 0a 20 20 20 * object).
23b0: 20 20 2a 20 40 70 61 72 61 6d 20 7b 4f 62 6a 65 * @param {Obje
23c0: 63 74 5b 5d 7d 20 74 75 70 6c 65 73 20 41 6e 20 ct[]} tuples An
23d0: 61 72 72 61 79 20 6f 66 20 5b 75 73 65 72 69 64 array of [userid
23e0: 2c 20 45 76 65 6e 74 5d 20 74 75 70 6c 65 73 0a , Event] tuples.
23f0: 20 20 20 20 20 2a 20 40 72 65 74 75 72 6e 20 7b * @return {
2400: 50 72 6f 6d 69 73 65 7d 20 52 65 73 6f 6c 76 65 Promise} Resolve
2410: 73 20 69 66 20 74 68 65 20 75 73 65 72 73 20 77 s if the users w
2420: 65 72 65 20 70 65 72 73 69 73 74 65 64 2e 0a 20 ere persisted..
2430: 20 20 20 20 2a 2f 0a 20 20 20 20 5f 70 65 72 73 */. _pers
2440: 69 73 74 55 73 65 72 50 72 65 73 65 6e 63 65 45 istUserPresenceE
2450: 76 65 6e 74 73 28 74 75 70 6c 65 73 29 20 7b 0a vents(tuples) {.
2460: 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 50 return P
2470: 72 6f 6d 69 73 65 2e 74 72 79 28 28 29 20 3d 3e romise.try(() =>
2480: 20 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 72 {. r
2490: 65 74 75 72 6e 20 50 72 6f 6d 69 73 65 2e 61 6c eturn Promise.al
24a0: 6c 28 4f 62 6a 65 63 74 2e 76 61 6c 75 65 73 28 l(Object.values(
24b0: 74 75 70 6c 65 73 29 2e 6d 61 70 28 28 74 75 70 tuples).map((tup
24c0: 6c 65 29 20 3d 3e 20 7b 0a 20 20 20 20 20 20 20 le) => {.
24d0: 20 20 20 20 20 20 20 20 20 74 68 69 73 2e 64 62 this.db
24e0: 2e 70 75 74 28 27 70 72 65 73 65 6e 63 65 3a 27 .put('presence:'
24f0: 20 2b 20 74 75 70 6c 65 5b 30 5d 2c 20 7b 0a 20 + tuple[0], {.
2500: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20
2510: 20 20 20 75 73 65 72 49 64 3a 20 74 75 70 6c 65 userId: tuple
2520: 5b 30 5d 2c 0a 20 20 20 20 20 20 20 20 20 20 20 [0],.
2530: 20 20 20 20 20 20 20 20 20 65 76 65 6e 74 3a 20 event:
2540: 74 75 70 6c 65 5b 31 5d 2c 0a 20 20 20 20 20 20 tuple[1],.
2550: 20 20 20 20 20 20 20 20 20 20 7d 29 3b 20 2f 2f }); //
2560: 20 70 75 74 20 3d 3d 20 55 50 53 45 52 54 0a 20 put == UPSERT.
2570: 20 20 20 20 20 20 20 20 20 20 20 7d 29 29 3b 0a }));.
2580: 20 20 20 20 20 20 20 20 7d 29 3b 0a 20 20 20 20 });.
2590: 7d 0a 0a 20 20 20 20 2f 2a 2a 0a 20 20 20 20 20 }.. /**.
25a0: 2a 20 4c 6f 61 64 20 61 6c 6c 20 75 73 65 72 20 * Load all user
25b0: 70 72 65 73 65 6e 63 65 20 65 76 65 6e 74 73 20 presence events
25c0: 66 72 6f 6d 20 74 68 65 20 64 61 74 61 62 61 73 from the databas
25d0: 65 2e 20 54 68 69 73 20 69 73 20 6e 6f 74 20 63 e. This is not c
25e0: 61 63 68 65 64 2e 0a 20 20 20 20 20 2a 20 46 49 ached.. * FI
25f0: 58 4d 45 3a 20 49 74 20 77 6f 75 6c 64 20 70 72 XME: It would pr
2600: 6f 62 61 62 6c 79 20 62 65 20 6d 6f 72 65 20 73 obably be more s
2610: 65 6e 73 69 62 6c 65 20 74 6f 20 73 74 6f 72 65 ensible to store
2620: 20 74 68 65 20 65 76 65 6e 74 73 20 69 6e 20 74 the events in t
2630: 68 65 0a 20 20 20 20 20 2a 20 73 79 6e 63 2e 0a he. * sync..
2640: 20 20 20 20 20 2a 20 40 72 65 74 75 72 6e 20 7b * @return {
2650: 50 72 6f 6d 69 73 65 3c 4f 62 6a 65 63 74 5b 5d Promise<Object[]
2660: 3e 7d 20 41 20 6c 69 73 74 20 6f 66 20 70 72 65 >} A list of pre
2670: 73 65 6e 63 65 20 65 76 65 6e 74 73 20 69 6e 20 sence events in
2680: 74 68 65 69 72 20 72 61 77 20 66 6f 72 6d 2e 0a their raw form..
2690: 20 20 20 20 20 2a 2f 0a 20 20 20 20 67 65 74 55 */. getU
26a0: 73 65 72 50 72 65 73 65 6e 63 65 45 76 65 6e 74 serPresenceEvent
26b0: 73 28 29 20 7b 0a 20 20 20 20 20 20 20 20 72 65 s() {. re
26c0: 74 75 72 6e 20 50 72 6f 6d 69 73 65 2e 74 72 79 turn Promise.try
26d0: 28 28 29 20 3d 3e 20 7b 0a 20 20 20 20 20 20 20 (() => {.
26e0: 20 20 20 20 20 72 65 74 75 72 6e 20 73 65 6c 65 return sele
26f0: 63 74 51 75 65 72 79 4c 65 76 65 6c 44 42 28 74 ctQueryLevelDB(t
2700: 68 69 73 2e 64 62 2c 20 28 7b 6b 65 79 2c 20 76 his.db, ({key, v
2710: 61 6c 75 65 7d 29 20 3d 3e 20 7b 0a 20 20 20 20 alue}) => {.
2720: 20 20 20 20 20 20 20 20 20 20 20 20 69 66 20 28 if (
2730: 21 6b 65 79 2e 73 74 61 72 74 73 57 69 74 68 28 !key.startsWith(
2740: 27 70 72 65 73 65 6e 63 65 3a 27 29 29 20 72 65 'presence:')) re
2750: 74 75 72 6e 3b 0a 20 20 20 20 20 20 20 20 20 20 turn;.
2760: 20 20 20 20 20 20 72 65 74 75 72 6e 20 76 61 6c return val
2770: 75 65 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 ue;.
2780: 7d 29 2e 74 68 65 6e 28 28 72 65 73 75 6c 74 29 }).then((result)
2790: 20 3d 3e 20 7b 0a 20 20 20 20 20 20 20 20 20 20 => {.
27a0: 20 20 20 20 20 20 72 65 74 75 72 6e 20 72 65 73 return res
27b0: 75 6c 74 3b 0a 20 20 20 20 20 20 20 20 20 20 20 ult;.
27c0: 20 7d 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 });.
27d0: 20 2f 2a 0a 20 20 20 20 20 20 20 20 20 20 20 20 /*.
27e0: 63 6f 6e 73 74 20 74 78 6e 20 3d 20 74 68 69 73 const txn = this
27f0: 2e 64 62 2e 74 72 61 6e 73 61 63 74 69 6f 6e 28 .db.transaction(
2800: 5b 22 75 73 65 72 73 22 5d 2c 20 22 72 65 61 64 ["users"], "read
2810: 6f 6e 6c 79 22 29 3b 0a 20 20 20 20 20 20 20 20 only");.
2820: 20 20 20 20 63 6f 6e 73 74 20 73 74 6f 72 65 20 const store
2830: 3d 20 74 78 6e 2e 6f 62 6a 65 63 74 53 74 6f 72 = txn.objectStor
2840: 65 28 22 75 73 65 72 73 22 29 3b 0a 20 20 20 20 e("users");.
2850: 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 73 return s
2860: 65 6c 65 63 74 51 75 65 72 79 28 73 74 6f 72 65 electQuery(store
2870: 2c 20 75 6e 64 65 66 69 6e 65 64 2c 20 28 63 75 , undefined, (cu
2880: 72 73 6f 72 29 20 3d 3e 20 7b 0a 20 20 20 20 20 rsor) => {.
2890: 20 20 20 20 20 20 20 20 20 20 20 72 65 74 75 72 retur
28a0: 6e 20 5b 63 75 72 73 6f 72 2e 76 61 6c 75 65 2e n [cursor.value.
28b0: 75 73 65 72 49 64 2c 20 63 75 72 73 6f 72 2e 76 userId, cursor.v
28c0: 61 6c 75 65 2e 45 76 65 6e 74 5d 3b 0a 20 20 20 alue.Event];.
28d0: 20 20 20 20 20 20 20 20 20 7d 29 3b 2a 2f 0a 20 });*/.
28e0: 20 20 20 20 20 20 20 7d 29 3b 0a 20 20 20 20 7d });. }
28f0: 0a 0a 20 20 20 20 2f 2a 2a 0a 20 20 20 20 20 2a .. /**. *
2900: 20 4c 6f 61 64 20 61 6c 6c 20 74 68 65 20 61 63 Load all the ac
2910: 63 6f 75 6e 74 20 64 61 74 61 20 65 76 65 6e 74 count data event
2920: 73 20 66 72 6f 6d 20 74 68 65 20 64 61 74 61 62 s from the datab
2930: 61 73 65 2e 20 54 68 69 73 20 69 73 20 6e 6f 74 ase. This is not
2940: 20 63 61 63 68 65 64 2e 0a 20 20 20 20 20 2a 20 cached.. *
2950: 40 72 65 74 75 72 6e 20 7b 50 72 6f 6d 69 73 65 @return {Promise
2960: 3c 4f 62 6a 65 63 74 5b 5d 3e 7d 20 41 20 6c 69 <Object[]>} A li
2970: 73 74 20 6f 66 20 72 61 77 20 67 6c 6f 62 61 6c st of raw global
2980: 20 61 63 63 6f 75 6e 74 20 65 76 65 6e 74 73 2e account events.
2990: 0a 20 20 20 20 20 2a 2f 0a 20 20 20 20 5f 6c 6f . */. _lo
29a0: 61 64 41 63 63 6f 75 6e 74 44 61 74 61 28 29 20 adAccountData()
29b0: 7b 0a 20 20 20 20 20 20 20 20 63 6f 6e 73 6f 6c {. consol
29c0: 65 2e 6c 6f 67 28 60 4c 6f 63 61 6c 49 6e 64 65 e.log(`LocalInde
29d0: 78 65 64 44 42 53 74 6f 72 65 42 61 63 6b 65 6e xedDBStoreBacken
29e0: 64 3a 20 6c 6f 61 64 69 6e 67 20 61 63 63 6f 75 d: loading accou
29f0: 6e 74 20 64 61 74 61 2e 2e 2e 60 29 3b 0a 20 20 nt data...`);.
2a00: 20 20 20 20 20 20 72 65 74 75 72 6e 20 50 72 6f return Pro
2a10: 6d 69 73 65 2e 74 72 79 28 28 29 20 3d 3e 20 7b mise.try(() => {
2a20: 0a 20 20 20 20 20 20 20 20 20 20 20 20 72 65 74 . ret
2a30: 75 72 6e 20 73 65 6c 65 63 74 51 75 65 72 79 4c urn selectQueryL
2a40: 65 76 65 6c 44 42 28 74 68 69 73 2e 64 62 2c 20 evelDB(this.db,
2a50: 28 7b 6b 65 79 2c 20 76 61 6c 75 65 7d 29 20 3d ({key, value}) =
2a60: 3e 20 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 > {.
2a70: 20 20 20 20 69 66 20 28 21 6b 65 79 2e 73 74 61 if (!key.sta
2a80: 72 74 73 57 69 74 68 28 27 61 63 63 6f 75 6e 74 rtsWith('account
2a90: 44 61 74 61 3a 27 29 29 20 72 65 74 75 72 6e 3b Data:')) return;
2aa0: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 .
2ab0: 20 72 65 74 75 72 6e 20 76 61 6c 75 65 3b 0a 20 return value;.
2ac0: 20 20 20 20 20 20 20 20 20 20 20 7d 29 2e 74 68 }).th
2ad0: 65 6e 28 28 72 65 73 75 6c 74 29 20 3d 3e 20 7b en((result) => {
2ae0: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 .
2af0: 20 63 6f 6e 73 6f 6c 65 2e 6c 6f 67 28 60 4c 6f console.log(`Lo
2b00: 63 61 6c 49 6e 64 65 78 65 64 44 42 53 74 6f 72 calIndexedDBStor
2b10: 65 42 61 63 6b 65 6e 64 3a 20 6c 6f 61 64 65 64 eBackend: loaded
2b20: 20 61 63 63 6f 75 6e 74 20 64 61 74 61 60 29 3b account data`);
2b30: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 .
2b40: 20 72 65 74 75 72 6e 20 72 65 73 75 6c 74 3b 0a return result;.
2b50: 20 20 20 20 20 20 20 20 20 20 20 20 7d 29 3b 0a });.
2b60: 0a 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 0a . /*.
2b70: 20 20 20 20 20 20 20 20 20 20 20 20 63 6f 6e 73 cons
2b80: 74 20 74 78 6e 20 3d 20 74 68 69 73 2e 64 62 2e t txn = this.db.
2b90: 74 72 61 6e 73 61 63 74 69 6f 6e 28 5b 22 61 63 transaction(["ac
2ba0: 63 6f 75 6e 74 44 61 74 61 22 5d 2c 20 22 72 65 countData"], "re
2bb0: 61 64 6f 6e 6c 79 22 29 3b 0a 20 20 20 20 20 20 adonly");.
2bc0: 20 20 20 20 20 20 63 6f 6e 73 74 20 73 74 6f 72 const stor
2bd0: 65 20 3d 20 74 78 6e 2e 6f 62 6a 65 63 74 53 74 e = txn.objectSt
2be0: 6f 72 65 28 22 61 63 63 6f 75 6e 74 44 61 74 61 ore("accountData
2bf0: 22 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 ");.
2c00: 72 65 74 75 72 6e 20 73 65 6c 65 63 74 51 75 65 return selectQue
2c10: 72 79 28 73 74 6f 72 65 2c 20 75 6e 64 65 66 69 ry(store, undefi
2c20: 6e 65 64 2c 20 28 63 75 72 73 6f 72 29 20 3d 3e ned, (cursor) =>
2c30: 20 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 {.
2c40: 20 20 20 72 65 74 75 72 6e 20 63 75 72 73 6f 72 return cursor
2c50: 2e 76 61 6c 75 65 3b 0a 20 20 20 20 20 20 20 20 .value;.
2c60: 20 20 20 20 7d 29 2e 74 68 65 6e 28 28 72 65 73 }).then((res
2c70: 75 6c 74 29 20 3d 3e 20 7b 0a 20 20 20 20 20 20 ult) => {.
2c80: 20 20 20 20 20 20 20 20 20 20 63 6f 6e 73 6f 6c consol
2c90: 65 2e 6c 6f 67 28 60 4c 6f 63 61 6c 49 6e 64 65 e.log(`LocalInde
2ca0: 78 65 64 44 42 53 74 6f 72 65 42 61 63 6b 65 6e xedDBStoreBacken
2cb0: 64 3a 20 6c 6f 61 64 65 64 20 61 63 63 6f 75 6e d: loaded accoun
2cc0: 74 20 64 61 74 61 60 29 3b 0a 20 20 20 20 20 20 t data`);.
2cd0: 20 20 20 20 20 20 20 20 20 20 72 65 74 75 72 6e return
2ce0: 20 72 65 73 75 6c 74 3b 0a 20 20 20 20 20 20 20 result;.
2cf0: 20 20 20 20 20 7d 29 3b 2a 2f 0a 20 20 20 20 20 });*/.
2d00: 20 20 20 7d 29 3b 0a 20 20 20 20 7d 0a 0a 20 20 });. }..
2d10: 20 20 2f 2a 2a 0a 20 20 20 20 20 2a 20 4c 6f 61 /**. * Loa
2d20: 64 20 74 68 65 20 73 79 6e 63 20 64 61 74 61 20 d the sync data
2d30: 66 72 6f 6d 20 74 68 65 20 64 61 74 61 62 61 73 from the databas
2d40: 65 2e 0a 20 20 20 20 20 2a 20 40 72 65 74 75 72 e.. * @retur
2d50: 6e 20 7b 50 72 6f 6d 69 73 65 3c 4f 62 6a 65 63 n {Promise<Objec
2d60: 74 3e 7d 20 41 6e 20 6f 62 6a 65 63 74 20 77 69 t>} An object wi
2d70: 74 68 20 22 72 6f 6f 6d 73 44 61 74 61 22 20 61 th "roomsData" a
2d80: 6e 64 20 22 6e 65 78 74 42 61 74 63 68 22 20 6b nd "nextBatch" k
2d90: 65 79 73 2e 0a 20 20 20 20 20 2a 2f 0a 20 20 20 eys.. */.
2da0: 20 5f 6c 6f 61 64 53 79 6e 63 44 61 74 61 28 29 _loadSyncData()
2db0: 20 7b 0a 20 20 20 20 20 20 20 20 63 6f 6e 73 6f {. conso
2dc0: 6c 65 2e 6c 6f 67 28 60 4c 6f 63 61 6c 49 6e 64 le.log(`LocalInd
2dd0: 65 78 65 64 44 42 53 74 6f 72 65 42 61 63 6b 65 exedDBStoreBacke
2de0: 6e 64 3a 20 6c 6f 61 64 69 6e 67 20 73 79 6e 63 nd: loading sync
2df0: 20 64 61 74 61 2e 2e 2e 60 29 3b 0a 20 20 20 20 data...`);.
2e00: 20 20 20 20 72 65 74 75 72 6e 20 50 72 6f 6d 69 return Promi
2e10: 73 65 2e 74 72 79 28 28 29 20 3d 3e 20 7b 0a 20 se.try(() => {.
2e20: 20 20 20 20 20 20 20 20 20 20 20 72 65 74 75 72 retur
2e30: 6e 20 74 68 69 73 2e 64 62 2e 67 65 74 28 27 73 n this.db.get('s
2e40: 79 6e 63 27 29 3b 0a 0a 20 20 20 20 20 20 20 20 ync');..
2e50: 20 20 20 20 2f 2a 0a 20 20 20 20 20 20 20 20 20 /*.
2e60: 20 20 20 63 6f 6e 73 74 20 74 78 6e 20 3d 20 74 const txn = t
2e70: 68 69 73 2e 64 62 2e 74 72 61 6e 73 61 63 74 69 his.db.transacti
2e80: 6f 6e 28 5b 22 73 79 6e 63 22 5d 2c 20 22 72 65 on(["sync"], "re
2e90: 61 64 6f 6e 6c 79 22 29 3b 0a 20 20 20 20 20 20 adonly");.
2ea0: 20 20 20 20 20 20 63 6f 6e 73 74 20 73 74 6f 72 const stor
2eb0: 65 20 3d 20 74 78 6e 2e 6f 62 6a 65 63 74 53 74 e = txn.objectSt
2ec0: 6f 72 65 28 22 73 79 6e 63 22 29 3b 0a 20 20 20 ore("sync");.
2ed0: 20 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 return
2ee0: 73 65 6c 65 63 74 51 75 65 72 79 28 73 74 6f 72 selectQuery(stor
2ef0: 65 2c 20 75 6e 64 65 66 69 6e 65 64 2c 20 28 63 e, undefined, (c
2f00: 75 72 73 6f 72 29 20 3d 3e 20 7b 0a 20 20 20 20 ursor) => {.
2f10: 20 20 20 20 20 20 20 20 20 20 20 20 72 65 74 75 retu
2f20: 72 6e 20 63 75 72 73 6f 72 2e 76 61 6c 75 65 3b rn cursor.value;
2f30: 0a 20 20 20 20 20 20 20 20 20 20 20 20 7d 29 2e . }).
2f40: 74 68 65 6e 28 28 72 65 73 75 6c 74 73 29 20 3d then((results) =
2f50: 3e 20 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 > {.
2f60: 20 20 20 20 63 6f 6e 73 6f 6c 65 2e 6c 6f 67 28 console.log(
2f70: 60 4c 6f 63 61 6c 49 6e 64 65 78 65 64 44 42 53 `LocalIndexedDBS
2f80: 74 6f 72 65 42 61 63 6b 65 6e 64 3a 20 6c 6f 61 toreBackend: loa
2f90: 64 65 64 20 73 79 6e 63 20 64 61 74 61 60 29 3b ded sync data`);
2fa0: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 .
2fb0: 20 69 66 20 28 72 65 73 75 6c 74 73 2e 6c 65 6e if (results.len
2fc0: 67 74 68 20 3e 20 31 29 20 7b 0a 20 20 20 20 20 gth > 1) {.
2fd0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 63 c
2fe0: 6f 6e 73 6f 6c 65 2e 77 61 72 6e 28 22 6c 6f 61 onsole.warn("loa
2ff0: 64 53 79 6e 63 44 61 74 61 3a 20 4d 6f 72 65 20 dSyncData: More
3000: 74 68 61 6e 20 31 20 73 79 6e 63 20 72 6f 77 20 than 1 sync row
3010: 66 6f 75 6e 64 2e 22 29 3b 0a 20 20 20 20 20 20 found.");.
3020: 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 }.
3030: 20 20 20 20 20 20 20 20 20 20 20 20 72 65 74 75 retu
3040: 72 6e 20 28 72 65 73 75 6c 74 73 2e 6c 65 6e 67 rn (results.leng
3050: 74 68 20 3e 20 30 20 3f 20 72 65 73 75 6c 74 73 th > 0 ? results
3060: 5b 30 5d 20 3a 20 7b 7d 29 3b 0a 20 20 20 20 20 [0] : {});.
3070: 20 20 20 20 20 20 20 7d 29 3b 2a 2f 0a 20 20 20 });*/.
3080: 20 20 20 20 20 7d 29 3b 0a 20 20 20 20 7d 0a 7d });. }.}