Hex Artifact Content
Not logged in

Artifact ab07be7b13f9afb1418126132b1da361384d1fc5:


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       });.    }.}