{"version":3,"sources":["../../../packages/core/performance/performance-profile-database.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAM,MAAM,MAAM,CAAC;AAEtC,OAAO,EAAE,wBAAwB,IAAI,wBAAwB,EAAE,MAAM,8BAA8B,CAAC;AAEpG,qBAAa,0BAA0B;IACnC,OAAO,CAAC,MAAM,CAAC,YAAY,CAAwB;IACnD,OAAO,CAAC,MAAM,CAAC,eAAe,CAAiB;IAC/C,OAAO,CAAC,MAAM,CAAC,OAAO,CAAK;IAE3B,OAAO,CAAC,QAAQ,CAAc;IAC9B,OAAO,CAAC,cAAc,CAA0B;IAChD,OAAO,CAAC,SAAS,CAAM;IAEhB,KAAK,CAAC,MAAM,EAAE,wBAAwB,GAAG,UAAU,CAAC,IAAI,CAAC;IAKzD,IAAI,CAAC,IAAI,CAAC,EAAE,MAAM,GAAG,UAAU,CAAC,wBAAwB,CAAC;IAKzD,MAAM,CAAC,WAAW,EAAE,MAAM,EAAE,GAAG,UAAU,CAAC,IAAI,CAAC;IAK/C,KAAK,IAAI,IAAI;IAUb,SAAS,IAAI,UAAU,CAAC,IAAI,CAAC;IAQpC,OAAO,CAAC,cAAc;IAetB,OAAO,CAAC,WAAW;IAuCnB,OAAO,CAAC,SAAS;IAejB,OAAO,CAAC,WAAW;IA6BnB,OAAO,CAAC,UAAU;CAgBrB","file":"performance-profile-database.d.ts","sourcesContent":["import { Observable, of } from 'rxjs';\r\nimport { share, switchMap, tap } from 'rxjs/operators';\r\nimport { PerformanceProfileRecord as PerformanceProfileRecord } from './performance-profile-record';\r\n\r\nexport class PerformanceProfileDatabase {\r\n    private static databaseName = 'MsftSmePerformance';\r\n    private static objectStoreName = 'Performance';\r\n    private static version = 1;\r\n\r\n    private database: IDBDatabase;\r\n    private databaseShared: Observable<IDBDatabase>;\r\n    private lastError: any;\r\n\r\n    public write(record: PerformanceProfileRecord): Observable<void> {\r\n        return this.getDatabase()\r\n            .pipe(switchMap(database => this.storeData(database, record)));\r\n    }\r\n\r\n    public read(from?: number): Observable<PerformanceProfileRecord> {\r\n        return this.getDatabase()\r\n            .pipe(switchMap(database => this.restoreData(database, from)));\r\n    }\r\n\r\n    public delete(primaryKeys: number[]): Observable<void> {\r\n        return this.getDatabase()\r\n            .pipe(switchMap(database => this.deleteData(database, primaryKeys)));\r\n    }\r\n\r\n    public close(): void {\r\n        if (!this.database) {\r\n            return;\r\n        }\r\n\r\n        this.database.close();\r\n        this.database = null;\r\n        this.databaseShared = null;\r\n    }\r\n\r\n    public deleteAll(): Observable<void> {\r\n        return this.getDatabase()\r\n            .pipe(\r\n                tap(() => this.close()),\r\n                switchMap(() => this.deleteDatabase())\r\n            );\r\n    }\r\n\r\n    private deleteDatabase(): Observable<void> {\r\n        return new Observable(observer => {\r\n            const request = window.indexedDB.deleteDatabase(PerformanceProfileDatabase.databaseName);\r\n            request.onerror = () => {\r\n                observer.error(request.error);\r\n            };\r\n            request.onsuccess = () => {\r\n                this.database = null;\r\n                this.databaseShared = null;\r\n                observer.next(null);\r\n                observer.complete();\r\n            };\r\n        });\r\n    }\r\n\r\n    private getDatabase(): Observable<IDBDatabase> {\r\n        if (this.database) {\r\n            return of(this.database);\r\n        }\r\n\r\n        if (this.databaseShared) {\r\n            return this.databaseShared;\r\n        }\r\n\r\n        this.databaseShared = new Observable<any>(observer => {\r\n            const openRequest = window.indexedDB.open(PerformanceProfileDatabase.databaseName, PerformanceProfileDatabase.version);\r\n            openRequest.onerror = () => {\r\n                this.lastError = openRequest.error;\r\n                observer.error(this.lastError);\r\n                openRequest.onerror = null;\r\n            };\r\n            openRequest.onsuccess = () => {\r\n                this.database = openRequest.result;\r\n                observer.next(this.database);\r\n                observer.complete();\r\n            };\r\n            openRequest.onupgradeneeded = event => {\r\n                const database = openRequest.result;\r\n                database.onerror = event2 => {\r\n                    this.lastError = event2;\r\n                    observer.error(this.lastError);\r\n                };\r\n                if (event.oldVersion !== 0 && event.oldVersion < PerformanceProfileDatabase.version) {\r\n                    database.deleteObjectStore(PerformanceProfileDatabase.objectStoreName);\r\n                }\r\n\r\n                database.createObjectStore(PerformanceProfileDatabase.objectStoreName, { autoIncrement: true });\r\n            };\r\n        })\r\n        .pipe(share());\r\n\r\n        return this.databaseShared;\r\n    }\r\n\r\n    private storeData(database: IDBDatabase, record: PerformanceProfileRecord): Observable<void> {\r\n        return new Observable(observer => {\r\n            const transaction = database.transaction([PerformanceProfileDatabase.objectStoreName], 'readwrite');\r\n            transaction.oncomplete = () => {\r\n                observer.complete();\r\n            };\r\n            transaction.onerror = () => {\r\n                observer.error(transaction.error);\r\n            };\r\n\r\n            const objectStore = transaction.objectStore(PerformanceProfileDatabase.objectStoreName);\r\n            objectStore.add(record);\r\n        });\r\n    }\r\n\r\n    private restoreData(database: IDBDatabase, from?: number): Observable<PerformanceProfileRecord> {\r\n        return new Observable(observer => {\r\n            const transaction = database.transaction([PerformanceProfileDatabase.objectStoreName], 'readonly');\r\n            const objectStore = transaction.objectStore(PerformanceProfileDatabase.objectStoreName);\r\n            let cursor: IDBRequest<IDBCursorWithValue>;\r\n            if (from) {\r\n                const query = IDBKeyRange.lowerBound(from, true);\r\n                cursor = objectStore.openCursor(query, 'next');\r\n\r\n            } else {\r\n                cursor = objectStore.openCursor();\r\n            }\r\n            cursor.onsuccess = event => {\r\n                const current: IDBCursorWithValue = (<any>event.target).result;\r\n                if (current && current.value) {\r\n                    const record: PerformanceProfileRecord = current.value;\r\n                    record.primaryKey = <number>current.primaryKey;\r\n                    observer.next(record);\r\n                    current.continue();\r\n                } else {\r\n                    observer.complete();\r\n                }\r\n            };\r\n            cursor.onerror = () => {\r\n                observer.error(cursor.error);\r\n            };\r\n        });\r\n    }\r\n\r\n    private deleteData(database: IDBDatabase, primaryKeys: number[]): Observable<void> {\r\n        return new Observable(observer => {\r\n            const transaction = database.transaction([PerformanceProfileDatabase.objectStoreName], 'readwrite');\r\n            transaction.oncomplete = () => {\r\n                observer.complete();\r\n            };\r\n            transaction.onerror = () => {\r\n                observer.error(transaction.error);\r\n            };\r\n\r\n            const objectStore = transaction.objectStore(PerformanceProfileDatabase.objectStoreName);\r\n            for (const primaryKey of primaryKeys) {\r\n                objectStore.delete(primaryKey);\r\n            }\r\n        });\r\n    }\r\n}\r\n"]}