11import { CACHE_DB , DB , STATE_DB } from '@/js/consts' ;
22import { API } from '@/js/msg-api' ;
3- import { CLIENT } from '@/js/port' ;
4- import { STORAGE_KEY , subscribe } from '@/js/prefs' ;
3+ import { STORAGE_KEY } from '@/js/prefs' ;
54import { chromeLocal } from '@/js/storage-util' ;
65import { CHROME } from '@/js/ua' ;
76import { deepMerge } from '@/js/util' ;
87import ChromeStorageDB from './db-chrome-storage' ;
9- import offscreen , { offscreenCache } from './offscreen' ;
10- import { offloadCache } from './style-manager/util' ;
118
129/*
1310 Initialize a database. There are some problems using IndexedDB in Firefox:
@@ -19,15 +16,13 @@ import {offloadCache} from './style-manager/util';
1916let exec = __ . BUILD === 'chrome' || CHROME
2017 ? dbExecIndexedDB
2118 : tryUsingIndexedDB ;
22- const cachedClient = new WeakSet ( ) ;
2319const FALLBACK = 'dbInChromeStorage' ;
2420const REASON = FALLBACK + 'Reason' ;
2521const DRAFTS_DB = 'drafts' ;
2622const CACHING = {
2723 [ DRAFTS_DB ] : cachedExec ,
28- [ STORAGE_KEY ] : __ . MV3 ? cachedExecOffscreen : cachedExec ,
24+ [ STORAGE_KEY ] : cachedExec ,
2925} ;
30- const CACHING2 = { } ;
3126const DATA_KEY = { } ;
3227const STORES = { } ;
3328const VERSIONS = { } ;
@@ -37,9 +32,6 @@ const databases = {};
3732const proxyHandler = {
3833 get : ( { dbName} , cmd ) => ( CACHING [ dbName ] || exec ) . bind ( null , dbName , cmd ) ,
3934} ;
40- const getAll = ( range , map ) => range instanceof IDBKeyRange
41- ? [ ...map . keys ( ) ] . filter ( range . includes , range ) . map ( map . get , map )
42- : [ ...map . values ( ) ] ;
4335/**
4436 * @param {string } dbName
4537 * @param {object } [cfg]
@@ -66,75 +58,22 @@ export const draftsDb = getDbProxy(DRAFTS_DB);
6658export const prefsDb = getDbProxy ( STORAGE_KEY ) ;
6759export const stateDB = __ . MV3 && getDbProxy ( STATE_DB , { store : 'kv' } ) ;
6860
69- if ( __ . MV3 ) {
70- const toggleOffscreenCache = val => {
71- CACHING [ CACHE_DB ] = CACHING [ DB ] = CACHING [ STATE_DB ] = val
72- ? cachedExecOffscreen
73- : cachedExec ;
74- if ( ! val && offscreen [ CLIENT ] )
75- offscreen . dbCache ( null ) ;
76- } ;
77- toggleOffscreenCache ( true ) ;
78- CACHING2 [ STORAGE_KEY ] = CACHING2 [ STATE_DB ] = cachedExec ;
79- subscribe ( 'keepAliveCache' , ( key , val ) => toggleOffscreenCache ( val ) , true ) ;
80- }
81-
8261Object . assign ( API , /** @namespace API */ {
8362 draftsDb,
8463 prefsDb,
8564} ) ;
8665
8766async function cachedExec ( dbName , cmd , a , b ) {
88- const old = dataCache [ dbName ] ;
89- const hub = old || ( dataCache [ dbName ] = new Map ( ) ) ;
90- const res = cmd === 'get' && hub . has ( a )
91- ? hub . get ( a )
92- : old && (
93- cmd === 'getAll' ? getAll ( a , hub )
94- : cmd === 'getMany' && a . map ( hub . get , hub )
95- ) || await exec ( ...arguments ) ;
96- switch ( cmd ) {
97- case 'put' :
98- cmd = DATA_KEY [ dbName ] ;
99- hub . set ( cmd ? a [ cmd ] : b , deepMerge ( a ) ) ;
100- break ;
101- case 'putMany' :
102- cmd = DATA_KEY [ dbName ] ;
103- for ( b of a ) hub . set ( b [ cmd ] , deepMerge ( b ) ) ;
104- break ;
105- case 'deleteMany' :
106- a . forEach ( hub . delete , hub ) ;
107- break ;
108- case 'delete' :
109- case 'clear' :
110- hub [ cmd ] ( a ) ;
111- break ;
112- }
113- return res && typeof res === 'object' ? deepMerge ( res ) : res ;
114- }
115-
116- async function cachedExecOffscreen ( dbName , cmd , a , b ) {
117- let res , client , isRead ;
118- if ( ( isRead = cmd . startsWith ( 'get' ) )
119- && offscreenCache
120- && await offscreenCache
121- && ( res = offscreenCache [ dbName ] ) ) {
122- return cmd === 'get' ? res . get ( a )
123- : cmd === 'getMany' ? a . map ( res . get , res )
124- : getAll ( a , res ) ;
125- }
126- if ( ( client = offscreen [ CLIENT ] ) && ! cachedClient . has ( client ) ) {
127- cachedClient . add ( client ) ;
128- if ( ! offscreenCache ) {
129- offloadCache ( dataCache ) ;
130- client = null ;
131- }
67+ const hub = dataCache [ dbName ] ??= { } ;
68+ const res = cmd === 'get' && a in hub ? hub [ a ] : await exec ( ...arguments ) ;
69+ if ( cmd === 'get' ) {
70+ hub [ a ] = deepMerge ( res ) ;
71+ } else if ( cmd === 'put' ) {
72+ const key = DATA_KEY [ dbName ] ;
73+ hub [ key ? a [ key ] : b ] = deepMerge ( a ) ;
74+ } else if ( cmd === 'delete' ) {
75+ delete hub [ a ] ;
13276 }
133- if ( client && ! isRead )
134- offscreen . dbCache ( dbName , cmd , a , b , DATA_KEY [ dbName ] ) ;
135- res = await ( CACHING2 [ dbName ] || exec ) ( dbName , cmd , a , b ) ;
136- if ( client && isRead )
137- offscreen . dbCache ( dbName , 'res:' + cmd , res , a , DATA_KEY [ dbName ] ) ;
13877 return res ;
13978}
14079
0 commit comments