BaseTable.js 6.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196
  1. import Logger from "./Logger.js"
  2. const logger = new Logger('db')
  3. export default class BaseTable {
  4. constructor(o, s) {
  5. this.db = null;
  6. this.isCreatingTable = !1;
  7. this.hasCleared = !1;
  8. this.dbName = o,
  9. this.dbVersion = s
  10. }
  11. async clearDataBase(o) {
  12. return this.hasCleared || (o && (this.hasCleared = !0),
  13. !window.indexedDB.databases) ? Promise.resolve() : new Promise((s,c)=>{
  14. const _ = window.indexedDB.deleteDatabase(this.dbName);
  15. _.onsuccess = ()=>{
  16. s()
  17. }
  18. ,
  19. _.onerror = c
  20. }
  21. )
  22. }
  23. tableName() {
  24. throw new Error("Derived class have to override 'tableName', and set a proper table name!")
  25. }
  26. keyPath() {
  27. throw new Error("Derived class have to override 'keyPath', and set a proper index name!")
  28. }
  29. index() {
  30. throw new Error("Derived class have to override 'index', and set a proper index name!")
  31. }
  32. async checkAndOpenDatabase() {
  33. return this.db ? Promise.resolve(this.db) : new Promise((o,s)=>{
  34. const _ = setTimeout(()=>{
  35. logger.warn("wait db to open for", 200),
  36. this.db ? o(this.db) : o(this.checkAndOpenDatabase()),
  37. clearTimeout(_)
  38. }
  39. , 200);
  40. this.openDatabase(this.dbName, this.dbVersion || 1, ()=>{
  41. this.db && !this.isCreatingTable && o(this.db),
  42. logger.warn(`successCallback called, this.db: ${!!this.db}, this.isCreatingStore: ${this.isCreatingTable}`),
  43. clearTimeout(_)
  44. }
  45. , ()=>{
  46. s(new Error("Failed to open database!")),
  47. clearTimeout(_)
  48. }
  49. , ()=>{
  50. this.db && o(this.db),
  51. clearTimeout(_),
  52. logger.warn(`successCallback called, this.db: ${!!this.db}, this.isCreatingStore: ${this.isCreatingTable}`)
  53. }
  54. )
  55. }
  56. )
  57. }
  58. openDatabase(o, s, c, _, b) {
  59. if (this.isCreatingTable)
  60. return;
  61. this.isCreatingTable = !0,
  62. logger.warn({
  63. database: o,
  64. version: s
  65. });
  66. const k = window.indexedDB.open(o, s)
  67. , j = this.tableName();
  68. k.onsuccess = $=>{
  69. this.db = k.result,
  70. logger.warn(`IndexedDb ${o} is opened.`),
  71. this.db.objectStoreNames.contains(j) && (this.isCreatingTable = !1),
  72. c && c($)
  73. }
  74. ,
  75. k.onerror = $=>{
  76. var _e;
  77. logger.error("Failed to open database", (_e = $ == null ? void 0 : $.srcElement) == null ? void 0 : _e.error),
  78. this.isCreatingTable = !1,
  79. _ && _($),
  80. this.clearDataBase(!0)
  81. }
  82. ,
  83. k.onupgradeneeded = $=>{
  84. const _e = $.target.result
  85. , et = this.index();
  86. logger.warn(`Creating table ${j}.`);
  87. let tt = _e.objectStoreNames.contains(j);
  88. if (tt)
  89. tt = _e.transaction([j], "readwrite").objectStore(j);
  90. else {
  91. const rt = this.keyPath();
  92. tt = _e.createObjectStore(j, {
  93. keyPath: rt
  94. })
  95. }
  96. et.map(rt=>{
  97. tt.createIndex(rt, rt, {
  98. unique: !1
  99. })
  100. }
  101. ),
  102. this.isCreatingTable = !1,
  103. logger.warn(`Table ${j} opened`),
  104. b && b($)
  105. }
  106. }
  107. async add(o) {
  108. const s = this.tableName()
  109. , b = (await this.checkAndOpenDatabase()).transaction([s], "readwrite").objectStore(s).add(o);
  110. return new Promise(function(k, j) {
  111. b.onsuccess = $=>{
  112. k($)
  113. }
  114. ,
  115. b.onerror = $=>{
  116. var _e;
  117. logger.error((_e = $.srcElement) == null ? void 0 : _e.error),
  118. j($)
  119. }
  120. }
  121. )
  122. }
  123. async put(o) {
  124. const s = this.tableName()
  125. , b = (await this.checkAndOpenDatabase()).transaction([s], "readwrite").objectStore(s).put(o);
  126. return new Promise(function(k, j) {
  127. b.onsuccess = $=>{
  128. k($)
  129. }
  130. ,
  131. b.onerror = $=>{
  132. var _e;
  133. logger.error("db put error", (_e = $.srcElement) == null ? void 0 : _e.error),
  134. j($)
  135. }
  136. }
  137. )
  138. }
  139. delete(o, s, c) {
  140. const _ = this.tableName();
  141. this.checkAndOpenDatabase().then(b=>{
  142. const j = b.transaction([_], "readwrite").objectStore(_).delete(o);
  143. j.onsuccess = s,
  144. j.onerror = c
  145. }
  146. )
  147. }
  148. update() {
  149. this.checkAndOpenDatabase().then(o=>{}
  150. )
  151. }
  152. async getAllKeys() {
  153. const o = this.tableName()
  154. , s = await this.checkAndOpenDatabase();
  155. return new Promise((c,_)=>{
  156. const k = s.transaction([o], "readonly").objectStore(o).getAllKeys();
  157. k.onsuccess = j=>{
  158. c(j.target.result)
  159. }
  160. ,
  161. k.onerror = j=>{
  162. logger.error("db getAllKeys error", j),
  163. _(j)
  164. }
  165. }
  166. )
  167. }
  168. async query(o, s) {
  169. const c = this.tableName()
  170. , _ = await this.checkAndOpenDatabase();
  171. return new Promise((b,k)=>{
  172. const _e = _.transaction([c], "readonly").objectStore(c).index(o).get(s);
  173. _e.onsuccess = function(et) {
  174. var rt;
  175. const tt = (rt = et == null ? void 0 : et.target) == null ? void 0 : rt.result;
  176. b && b(tt)
  177. }
  178. ,
  179. _e.onerror = et=>{
  180. logger.error("db query error", et),
  181. k(et)
  182. }
  183. }
  184. )
  185. }
  186. async sleep(o) {
  187. return new Promise(s=>{
  188. setTimeout(()=>{
  189. s("")
  190. }
  191. , o)
  192. }
  193. )
  194. }
  195. }