UNPKG

@yuebai008/cli

Version:

Command line interface for rapid qg-minigame development

1 lines 9.7 kB
import*as Common from"../../core/common/common.js";import*as SDK from"../../core/sdk/sdk.js";const DEFAULT_BUCKET="";export class IndexedDBModel extends SDK.SDKModel.SDKModel{storageBucketModel;indexedDBAgent;storageAgent;databasesInternal;databaseNamesByStorageKeyAndBucket;updatedStorageBuckets;throttler;enabled;constructor(e){super(e),e.registerStorageDispatcher(this),this.storageBucketModel=e.model(SDK.StorageBucketsModel.StorageBucketsModel),this.indexedDBAgent=e.indexedDBAgent(),this.storageAgent=e.storageAgent(),this.databasesInternal=new Map,this.databaseNamesByStorageKeyAndBucket=new Map,this.updatedStorageBuckets=new Set,this.throttler=new Common.Throttler.Throttler(1e3)}static keyFromIDBKey(e){if(null==e)return;let t;switch(typeof e){case"number":t={type:"number",number:e};break;case"string":t={type:"string",string:e};break;case"object":if(e instanceof Date)t={type:"date",date:e.getTime()};else{if(!Array.isArray(e))return;{const a=[];for(let t=0;t<e.length;++t){const s=IndexedDBModel.keyFromIDBKey(e[t]);s&&a.push(s)}t={type:"array",array:a}}}break;default:return}return t}static keyRangeFromIDBKeyRange(e){return{lower:IndexedDBModel.keyFromIDBKey(e.lower),upper:IndexedDBModel.keyFromIDBKey(e.upper),lowerOpen:Boolean(e.lowerOpen),upperOpen:Boolean(e.upperOpen)}}static idbKeyPathFromKeyPath(e){let t;switch(e.type){case"null":t=null;break;case"string":t=e.string;break;case"array":t=e.array}return t}static keyPathStringFromIDBKeyPath(e){return"string"==typeof e?'"'+e+'"':e instanceof Array?'["'+e.join('", "')+'"]':null}enable(){if(!this.enabled){if(this.indexedDBAgent.invoke_enable(),this.storageBucketModel){this.storageBucketModel.addEventListener("BucketAdded",this.storageBucketAdded,this),this.storageBucketModel.addEventListener("BucketRemoved",this.storageBucketRemoved,this);for(const{bucket:e}of this.storageBucketModel.getBuckets())this.addStorageBucket(e)}this.enabled=!0}}clearForStorageKey(e){if(!this.enabled||!this.databaseNamesByStorageKeyAndBucket.has(e))return;for(const[t]of this.databaseNamesByStorageKeyAndBucket.get(e)||[]){const a=this.storageBucketModel?.getBucketByName(e,t??void 0)?.bucket;a&&this.removeStorageBucket(a)}this.databaseNamesByStorageKeyAndBucket.delete(e);const t=this.storageBucketModel?.getBucketsForStorageKey(e)||[];for(const{bucket:e}of t)this.addStorageBucket(e)}async deleteDatabase(e){this.enabled&&(await this.indexedDBAgent.invoke_deleteDatabase({storageBucket:e.storageBucket,databaseName:e.name}),this.loadDatabaseNamesByStorageBucket(e.storageBucket))}async refreshDatabaseNames(){for(const[e]of this.databaseNamesByStorageKeyAndBucket){const t=this.databaseNamesByStorageKeyAndBucket.get(e)?.keys()||[];for(const a of t){const t=this.storageBucketModel?.getBucketByName(e,a??void 0)?.bucket;t&&await this.loadDatabaseNamesByStorageBucket(t)}}this.dispatchEventToListeners(Events.DatabaseNamesRefreshed)}refreshDatabase(e){this.loadDatabase(e,!0)}async clearObjectStore(e,t){await this.indexedDBAgent.invoke_clearObjectStore({storageBucket:e.storageBucket,databaseName:e.name,objectStoreName:t})}async deleteEntries(e,t,a){const s=IndexedDBModel.keyRangeFromIDBKeyRange(a);await this.indexedDBAgent.invoke_deleteObjectStoreEntries({storageBucket:e.storageBucket,databaseName:e.name,objectStoreName:t,keyRange:s})}storageBucketAdded({data:{bucketInfo:{bucket:e}}}){this.addStorageBucket(e)}storageBucketRemoved({data:{bucketInfo:{bucket:e}}}){this.removeStorageBucket(e)}addStorageBucket(e){const{storageKey:t}=e;this.databaseNamesByStorageKeyAndBucket.has(t)||(this.databaseNamesByStorageKeyAndBucket.set(t,new Map),this.storageAgent.invoke_trackIndexedDBForStorageKey({storageKey:t}));const a=this.databaseNamesByStorageKeyAndBucket.get(t)||new Map;console.assert(!a.has(e.name??"")),a.set(e.name??"",new Set),this.loadDatabaseNamesByStorageBucket(e)}removeStorageBucket(e){const{storageKey:t}=e;console.assert(this.databaseNamesByStorageKeyAndBucket.has(t));const a=this.databaseNamesByStorageKeyAndBucket.get(t)||new Map;console.assert(a.has(e.name??""));const s=a.get(e.name??"")||new Map;for(const e of s)this.databaseRemovedForStorageBucket(e);a.delete(e.name??""),0===a.size&&(this.databaseNamesByStorageKeyAndBucket.delete(t),this.storageAgent.invoke_untrackIndexedDBForStorageKey({storageKey:t}))}updateStorageKeyDatabaseNames(e,t){const a=this.databaseNamesByStorageKeyAndBucket.get(e.storageKey);if(void 0===a)return;const s=new Set(t.map((t=>new DatabaseId(e,t)))),o=new Set(a.get(e.name??""));a.set(e.name??"",s);for(const e of o)e.inSet(s)||this.databaseRemovedForStorageBucket(e);for(const e of s)e.inSet(o)||this.databaseAddedForStorageBucket(e)}databases(){const e=[];for(const[,t]of this.databaseNamesByStorageKeyAndBucket)for(const[,a]of t)for(const t of a)e.push(t);return e}databaseAddedForStorageBucket(e){this.dispatchEventToListeners(Events.DatabaseAdded,{model:this,databaseId:e})}databaseRemovedForStorageBucket(e){this.dispatchEventToListeners(Events.DatabaseRemoved,{model:this,databaseId:e})}async loadDatabaseNamesByStorageBucket(e){const{storageKey:t}=e,{databaseNames:a}=await this.indexedDBAgent.invoke_requestDatabaseNames({storageBucket:e});if(!a)return[];if(!this.databaseNamesByStorageKeyAndBucket.has(t))return[];return(this.databaseNamesByStorageKeyAndBucket.get(t)||new Map).has(e.name??"")?(this.updateStorageKeyDatabaseNames(e,a),a):[]}async loadDatabase(e,t){const a=(await this.indexedDBAgent.invoke_requestDatabase({storageBucket:e.storageBucket,databaseName:e.name})).databaseWithObjectStores;if(!this.databaseNamesByStorageKeyAndBucket.get(e.storageBucket.storageKey)?.has(e.storageBucket.name??""))return;if(!a)return;const s=new Database(e,a.version);this.databasesInternal.set(e,s);for(const e of a.objectStores){const t=IndexedDBModel.idbKeyPathFromKeyPath(e.keyPath),a=new ObjectStore(e.name,t,e.autoIncrement);for(let t=0;t<e.indexes.length;++t){const s=e.indexes[t],o=IndexedDBModel.idbKeyPathFromKeyPath(s.keyPath),r=new Index(s.name,o,s.unique,s.multiEntry);a.indexes.set(r.name,r)}s.objectStores.set(a.name,a)}this.dispatchEventToListeners(Events.DatabaseLoaded,{model:this,database:s,entriesUpdated:t})}loadObjectStoreData(e,t,a,s,o,r){this.requestData(e,e.name,t,"",a,s,o,r)}loadIndexData(e,t,a,s,o,r,n){this.requestData(e,e.name,t,a,s,o,r,n)}async requestData(e,t,a,s,o,r,n,d){const c=o?IndexedDBModel.keyRangeFromIDBKeyRange(o):void 0,i=this.target().model(SDK.RuntimeModel.RuntimeModel),u=await this.indexedDBAgent.invoke_requestData({storageBucket:e.storageBucket,databaseName:t,objectStoreName:a,indexName:s,skipCount:r,pageSize:n,keyRange:c});if(!i||!this.databaseNamesByStorageKeyAndBucket.get(e.storageBucket.storageKey)?.has(e.storageBucket.name??""))return;if(u.getError())return void console.error("IndexedDBAgent error: "+u.getError());const g=u.objectStoreDataEntries,h=[];for(const e of g){const t=i?.createRemoteObject(e.key),a=i?.createRemoteObject(e.primaryKey),s=i?.createRemoteObject(e.value);if(!t||!a||!s)return;h.push(new Entry(t,a,s))}d(h,u.hasMore)}async getMetadata(e,t){const a=e.name,s=t.name,o=await this.indexedDBAgent.invoke_getMetadata({storageBucket:e.storageBucket,databaseName:a,objectStoreName:s});return o.getError()?(console.error("IndexedDBAgent error: "+o.getError()),null):{entriesCount:o.entriesCount,keyGeneratorValue:o.keyGeneratorValue}}async refreshDatabaseListForStorageBucket(e){const t=await this.loadDatabaseNamesByStorageBucket(e);for(const a of t)this.loadDatabase(new DatabaseId(e,a),!1)}indexedDBListUpdated({storageKey:e,bucketId:t}){const a=this.storageBucketModel?.getBucketById(t)?.bucket;e&&a&&(this.updatedStorageBuckets.add(a),this.throttler.schedule((()=>{const e=Array.from(this.updatedStorageBuckets,(e=>{this.refreshDatabaseListForStorageBucket(e)}));return this.updatedStorageBuckets.clear(),Promise.all(e)})))}indexedDBContentUpdated({bucketId:e,databaseName:t,objectStoreName:a}){const s=this.storageBucketModel?.getBucketById(e)?.bucket;if(s){const e=new DatabaseId(s,t);this.dispatchEventToListeners(Events.IndexedDBContentUpdated,{databaseId:e,objectStoreName:a,model:this})}}cacheStorageListUpdated(e){}cacheStorageContentUpdated(e){}interestGroupAccessed(e){}sharedStorageAccessed(e){}storageBucketCreatedOrUpdated(e){}storageBucketDeleted(e){}attributionReportingSourceRegistered(e){}}SDK.SDKModel.SDKModel.register(IndexedDBModel,{capabilities:SDK.Target.Capability.Storage,autostart:!1});export var Events;!function(e){e.DatabaseAdded="DatabaseAdded",e.DatabaseRemoved="DatabaseRemoved",e.DatabaseLoaded="DatabaseLoaded",e.DatabaseNamesRefreshed="DatabaseNamesRefreshed",e.IndexedDBContentUpdated="IndexedDBContentUpdated"}(Events||(Events={}));export class Entry{key;primaryKey;value;constructor(e,t,a){this.key=e,this.primaryKey=t,this.value=a}}export class DatabaseId{storageBucket;name;constructor(e,t){this.storageBucket=e,this.name=t}inBucket(e){return this.storageBucket.name===e.name}equals(e){return this.name===e.name&&this.storageBucket.name===e.storageBucket.name&&this.storageBucket.storageKey===e.storageBucket.storageKey}inSet(e){for(const t of e)if(this.equals(t))return!0;return!1}}export class Database{databaseId;version;objectStores;constructor(e,t){this.databaseId=e,this.version=t,this.objectStores=new Map}}export class ObjectStore{name;keyPath;autoIncrement;indexes;constructor(e,t,a){this.name=e,this.keyPath=t,this.autoIncrement=a,this.indexes=new Map}get keyPathString(){return IndexedDBModel.keyPathStringFromIDBKeyPath(this.keyPath)}}export class Index{name;keyPath;unique;multiEntry;constructor(e,t,a,s){this.name=e,this.keyPath=t,this.unique=a,this.multiEntry=s}get keyPathString(){return IndexedDBModel.keyPathStringFromIDBKeyPath(this.keyPath)}}