{"version":3,"sources":["../../../packages/core/workflow/persistent-local-storage.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAM,MAAM,MAAM,CAAC;AAEtC,OAAO,EAAE,uBAAuB,EAAE,MAAM,8BAA8B,CAAC;AACvE,OAAO,EAAE,0BAA0B,EAAE,MAAM,gCAAgC,CAAC;AAC5E,OAAO,EAAE,uBAAuB,EAAE,MAAM,6BAA6B,CAAC;AAEtE;;GAEG;AACH,qBAAa,sBAAuB,SAAQ,uBAAuB;IAC/D,OAAO,CAAC,cAAc,CAAK;IAE3B;;;;;;;;OAQG;IACI,IAAI,CACP,OAAO,EAAE,MAAM,EACf,UAAU,EAAE,MAAM,EAClB,aAAa,EAAE,uBAAuB,EACtC,YAAY,EAAE,GAAG,EACjB,UAAU,CAAC,EAAE,MAAM,GAAG,UAAU,CAAC,0BAA0B,CAAC;IAiBhE;;OAEG;IACI,OAAO,IAAI,UAAU,CAAC,0BAA0B,EAAE,CAAC;IAyB1D;;;;;OAKG;IACI,KAAK,CAAC,UAAU,CAAC,EAAE,MAAM,GAAG,UAAU,CAAC,IAAI,CAAC;IA4BnD;;OAEG;IACH,OAAO,CAAC,QAAQ;IAIhB;;;;OAIG;IACH,OAAO,CAAC,WAAW;IAInB;;OAEG;IACH,OAAO,CAAC,aAAa;IAYrB;;;;OAIG;IACH,OAAO,CAAC,cAAc;IAItB;;;;OAIG;IACH,OAAO,CAAC,YAAY;IAIpB;;;;OAIG;IACH,OAAO,CAAC,aAAa;CAGxB","file":"persistent-local-storage.d.ts","sourcesContent":["import { Observable, of } from 'rxjs';\r\nimport { map, tap } from 'rxjs/operators';\r\nimport { PersistentWorkItemState } from './persistent-work-item-state';\r\nimport { PersistentWorkflowSnapshot } from './persistent-workflow-snapshot';\r\nimport { PersistentWorkflowStore } from './persistent-workflow-store';\r\n\r\n/**\r\n * Implementation of PersistentWorkflowStore by local storage.\r\n */\r\nexport class PersistentLocalStorage extends PersistentWorkflowStore {\r\n    private nextInstanceId = 1;\r\n\r\n    /**\r\n     * Save the work item snapshot to the local storage.\r\n     *\r\n     * @param version the version number.\r\n     * @param workItemId the id of work item.\r\n     * @param workItemState the state of work item.\r\n     * @param workItemData the persistent data of work item.\r\n     * @param instanceId the instance ID if it has already.\r\n     */\r\n    public save(\r\n        version: number,\r\n        workItemId: number,\r\n        workItemState: PersistentWorkItemState,\r\n        workItemData: any,\r\n        instanceId?: number): Observable<PersistentWorkflowSnapshot> {\r\n\r\n        return of(null)\r\n            .pipe(map(() => {\r\n                const indexData = this.readIndexData();\r\n                if (MsftSme.isNullOrUndefined(instanceId)) {\r\n                    instanceId = this.nextInstanceId++;\r\n                    indexData.instances.push(instanceId);\r\n                    this.writeIndexData(indexData);\r\n                }\r\n\r\n                const snapshot: PersistentWorkflowSnapshot = { version, instanceId, workItemId, workItemState, workItemData };\r\n                this.writeInstance(snapshot);\r\n                return snapshot;\r\n            }));\r\n    }\r\n\r\n    /**\r\n     * Restore the snapshot data for the workflow.\r\n     */\r\n    public restore(): Observable<PersistentWorkflowSnapshot[]> {\r\n        return of(null)\r\n            .pipe(map(() => {\r\n                const instances: PersistentWorkflowSnapshot[] = [];\r\n                const indexData = this.readIndexData();\r\n                if (indexData.instances.length === 0) {\r\n                    return instances;\r\n                }\r\n\r\n                for (const instanceId of indexData.instances) {\r\n                    const instance = this.readInstance(instanceId);\r\n                    if (instance) {\r\n                        instances.push(instance);\r\n                        if (this.nextInstanceId < instanceId) {\r\n                            this.nextInstanceId = instanceId;\r\n                        }\r\n                    } else {\r\n                        this.clear(instanceId);\r\n                    }\r\n                }\r\n\r\n                return instances;\r\n            }));\r\n    }\r\n\r\n    /**\r\n     * Clear the snapshot for the instance id.\r\n     * If not specified, clear all snapshots.\r\n     *\r\n     * @param instanceId the instance id.\r\n     */\r\n    public clear(instanceId?: number): Observable<void> {\r\n        return of(null)\r\n            .pipe(tap(() => {\r\n                const indexData = this.readIndexData();\r\n\r\n                // remove one.\r\n                if (!MsftSme.isNullOrUndefined(instanceId)) {\r\n                    const pointer = indexData.instances.indexOf(instanceId);\r\n                    if (pointer >= 0) {\r\n                        indexData.instances.splice(pointer, 1);\r\n                        this.writeIndexData(indexData);\r\n                    }\r\n\r\n                    MsftSme.LocalStorageHandler.removeItem(this.instanceKey(instanceId));\r\n\r\n                    return;\r\n                }\r\n\r\n                // remove all.\r\n                MsftSme.LocalStorageHandler.removeItem(this.indexKey());\r\n                for (const index2 of indexData.instances) {\r\n                    MsftSme.LocalStorageHandler.removeItem(this.instanceKey(index2));\r\n                }\r\n\r\n                return;\r\n            }));\r\n    }\r\n\r\n    /**\r\n     * Gets the key of index data.\r\n     */\r\n    private indexKey(): string {\r\n        return `${this.moduleName}@${this.name}:index`;\r\n    }\r\n\r\n    /**\r\n     * Gets the key of snapshot instance.\r\n     *\r\n     * @param instanceId the instance Id.\r\n     */\r\n    private instanceKey(instanceId: number): string {\r\n        return `${this.moduleName}@${this.name}:${instanceId}`;\r\n    }\r\n\r\n    /**\r\n     * Reads the index data to enumerate all snapshots.\r\n     */\r\n    private readIndexData(): { instances: number[] } {\r\n        let indexData: { instances: number[] } = null;\r\n        const item = MsftSme.LocalStorageHandler.getItem(this.indexKey());\r\n        if (item) {\r\n            indexData = JSON.parse(item);\r\n        } else {\r\n            indexData = { instances: [] };\r\n        }\r\n\r\n        return indexData;\r\n    }\r\n\r\n    /**\r\n     * Writes the index data.\r\n     *\r\n     * @param indexData the index data.\r\n     */\r\n    private writeIndexData(indexData: { instances: number[] }): void {\r\n        MsftSme.LocalStorageHandler.setItem(this.indexKey(), JSON.stringify(indexData));\r\n    }\r\n\r\n    /**\r\n     * Reads the snapshot of the instance.\r\n     *\r\n     * @param instanceId the instance ID.\r\n     */\r\n    private readInstance(instanceId: number): PersistentWorkflowSnapshot {\r\n        return JSON.parse(MsftSme.LocalStorageHandler.getItem(this.instanceKey(instanceId)) ?? '{}');\r\n    }\r\n\r\n    /**\r\n     * Writes the snapshot.\r\n     *\r\n     * @param snapshot the snapshot.\r\n     */\r\n    private writeInstance(snapshot: PersistentWorkflowSnapshot): void {\r\n        MsftSme.LocalStorageHandler.setItem(this.instanceKey(snapshot.instanceId), JSON.stringify(snapshot));\r\n    }\r\n}\r\n"]}