@itwin/core-backend 4.3.0-dev.9 → 4.4.0-dev.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/CHANGELOG.md +49 -1
- package/lib/cjs/BriefcaseManager.js +3 -3
- package/lib/cjs/BriefcaseManager.js.map +1 -1
- package/lib/cjs/ChangesetECAdaptor.d.ts +196 -0
- package/lib/cjs/ChangesetECAdaptor.d.ts.map +1 -0
- package/lib/cjs/ChangesetECAdaptor.js +746 -0
- package/lib/cjs/ChangesetECAdaptor.js.map +1 -0
- package/lib/cjs/CheckpointManager.js +1 -1
- package/lib/cjs/CheckpointManager.js.map +1 -1
- package/lib/cjs/ECDb.d.ts +8 -1
- package/lib/cjs/ECDb.d.ts.map +1 -1
- package/lib/cjs/ECDb.js +9 -0
- package/lib/cjs/ECDb.js.map +1 -1
- package/lib/cjs/ElementAspect.d.ts.map +1 -1
- package/lib/cjs/ElementAspect.js +10 -3
- package/lib/cjs/ElementAspect.js.map +1 -1
- package/lib/cjs/GeometrySummary.js +5 -5
- package/lib/cjs/GeometrySummary.js.map +1 -1
- package/lib/cjs/IModelDb.d.ts +1 -1
- package/lib/cjs/IModelDb.d.ts.map +1 -1
- package/lib/cjs/IModelDb.js +13 -9
- package/lib/cjs/IModelDb.js.map +1 -1
- package/lib/cjs/IModelHost.d.ts +1 -1
- package/lib/cjs/IModelHost.d.ts.map +1 -1
- package/lib/cjs/IModelHost.js +2 -2
- package/lib/cjs/IModelHost.js.map +1 -1
- package/lib/cjs/LocalHub.js +1 -1
- package/lib/cjs/LocalHub.js.map +1 -1
- package/lib/cjs/PromiseMemoizer.d.ts.map +1 -1
- package/lib/cjs/PromiseMemoizer.js.map +1 -1
- package/lib/cjs/SqliteChangesetReader.d.ts +185 -0
- package/lib/cjs/SqliteChangesetReader.d.ts.map +1 -0
- package/lib/cjs/SqliteChangesetReader.js +217 -0
- package/lib/cjs/SqliteChangesetReader.js.map +1 -0
- package/lib/cjs/core-backend.d.ts +2 -0
- package/lib/cjs/core-backend.d.ts.map +1 -1
- package/lib/cjs/core-backend.js +2 -0
- package/lib/cjs/core-backend.js.map +1 -1
- package/package.json +21 -16
package/CHANGELOG.md
CHANGED
|
@@ -1,6 +1,49 @@
|
|
|
1
1
|
# Change Log - @itwin/core-backend
|
|
2
2
|
|
|
3
|
-
This log was last generated on
|
|
3
|
+
This log was last generated on Thu, 30 Nov 2023 17:07:27 GMT and should not be manually modified.
|
|
4
|
+
|
|
5
|
+
## 4.2.4
|
|
6
|
+
Mon, 20 Nov 2023 16:14:45 GMT
|
|
7
|
+
|
|
8
|
+
_Version update only_
|
|
9
|
+
|
|
10
|
+
## 4.2.3
|
|
11
|
+
Mon, 06 Nov 2023 14:01:52 GMT
|
|
12
|
+
|
|
13
|
+
_Version update only_
|
|
14
|
+
|
|
15
|
+
## 4.2.2
|
|
16
|
+
Thu, 02 Nov 2023 15:36:20 GMT
|
|
17
|
+
|
|
18
|
+
_Version update only_
|
|
19
|
+
|
|
20
|
+
## 4.2.1
|
|
21
|
+
Tue, 24 Oct 2023 15:09:13 GMT
|
|
22
|
+
|
|
23
|
+
_Version update only_
|
|
24
|
+
|
|
25
|
+
## 4.2.0
|
|
26
|
+
Tue, 17 Oct 2023 15:14:32 GMT
|
|
27
|
+
|
|
28
|
+
### Updates
|
|
29
|
+
|
|
30
|
+
- Add ECSqlExpr api
|
|
31
|
+
- Add support for schema synchronization
|
|
32
|
+
- Fixed a null reference error when upgrading schemas to EC3
|
|
33
|
+
- Adds logging for checkpoint application and V2 checkpoint downloads
|
|
34
|
+
- add exportGraphics test to verify uv-parameter output
|
|
35
|
+
- ECDb.createQueryReader and IModelDb.createQueryReader are now public
|
|
36
|
+
- restart default txn after 10 minutes inactivity on v2 checkpoints
|
|
37
|
+
- Add TxnManager events raised when applying external txns.
|
|
38
|
+
- Fix RenderMaterialElement using the wrong CodeSpec.
|
|
39
|
+
- Fix two potential bugs when closing and reopening an iModel while pulling changes."
|
|
40
|
+
- Make watching for briefcase changes more reliable.
|
|
41
|
+
- As instance access no longer an experimental feature, removed experimental features option from relevant ecsql.
|
|
42
|
+
- Use instance query to get aspects for abstract classes
|
|
43
|
+
- ViewStore.ViewDb.getViewGroups select statement was referring to ParentId when parent was meant
|
|
44
|
+
- Remove `storageType` from `BlobContainer.RequestTokenProps`.
|
|
45
|
+
- Add 'provider' to 'BlobContainer.CreatedContainerProps'
|
|
46
|
+
- add TileStorage.getCachedTilesGenerator
|
|
4
47
|
|
|
5
48
|
## 4.1.9
|
|
6
49
|
Tue, 10 Oct 2023 18:48:12 GMT
|
|
@@ -142,6 +185,11 @@ Mon, 22 May 2023 15:34:14 GMT
|
|
|
142
185
|
- allow passing a custom schema read context to IModelDb.importSchemas
|
|
143
186
|
- Added test to verify Id serialization to hex for system properties.
|
|
144
187
|
|
|
188
|
+
## 3.7.17
|
|
189
|
+
Mon, 20 Nov 2023 18:24:23 GMT
|
|
190
|
+
|
|
191
|
+
_Version update only_
|
|
192
|
+
|
|
145
193
|
## 3.7.16
|
|
146
194
|
Mon, 16 Oct 2023 12:49:07 GMT
|
|
147
195
|
|
|
@@ -88,7 +88,7 @@ class BriefcaseManager {
|
|
|
88
88
|
const fileSize = IModelJsFs_1.IModelJsFs.lstatSync(fileName)?.size ?? 0;
|
|
89
89
|
const db = IModelDb_1.IModelDb.openDgnDb({ path: fileName }, core_bentley_1.OpenMode.Readonly);
|
|
90
90
|
briefcaseList.push({ fileName, iTwinId: db.getITwinId(), iModelId: db.getIModelId(), briefcaseId: db.getBriefcaseId(), changeset: db.getCurrentChangeset(), fileSize });
|
|
91
|
-
db.
|
|
91
|
+
db.closeFile();
|
|
92
92
|
}
|
|
93
93
|
catch (_err) {
|
|
94
94
|
}
|
|
@@ -173,7 +173,7 @@ class BriefcaseManager {
|
|
|
173
173
|
}
|
|
174
174
|
finally {
|
|
175
175
|
nativeDb.saveChanges();
|
|
176
|
-
nativeDb.
|
|
176
|
+
nativeDb.closeFile();
|
|
177
177
|
}
|
|
178
178
|
return response;
|
|
179
179
|
}
|
|
@@ -206,7 +206,7 @@ class BriefcaseManager {
|
|
|
206
206
|
iModelId: db.getIModelId(),
|
|
207
207
|
briefcaseId: db.getBriefcaseId(),
|
|
208
208
|
};
|
|
209
|
-
db.
|
|
209
|
+
db.closeFile();
|
|
210
210
|
if (accessToken) {
|
|
211
211
|
if (this.isValidBriefcaseId(briefcase.briefcaseId)) {
|
|
212
212
|
await BriefcaseManager.releaseBriefcase(accessToken, briefcase);
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"BriefcaseManager.js","sourceRoot":"","sources":["../../src/BriefcaseManager.ts"],"names":[],"mappings":"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","sourcesContent":["/*---------------------------------------------------------------------------------------------\r\n* Copyright (c) Bentley Systems, Incorporated. All rights reserved.\r\n* See LICENSE.md in the project root for license terms and full copyright notice.\r\n*--------------------------------------------------------------------------------------------*/\r\n/** @packageDocumentation\r\n * @module iModels\r\n */\r\n\r\n// cspell:ignore cset csets ecchanges\r\n\r\nimport * as path from \"path\";\r\nimport {\r\n AccessToken, BeDuration, ChangeSetStatus, GuidString, IModelHubStatus, IModelStatus, Logger, OpenMode, StopWatch,\r\n} from \"@itwin/core-bentley\";\r\nimport {\r\n BriefcaseId, BriefcaseIdValue, BriefcaseProps, ChangesetFileProps, ChangesetIndex, ChangesetIndexOrId, ChangesetProps, ChangesetRange, ChangesetType, IModelError, IModelVersion, LocalBriefcaseProps,\r\n LocalDirName, LocalFileName, RequestNewBriefcaseProps,\r\n} from \"@itwin/core-common\";\r\nimport { AcquireNewBriefcaseIdArg, IModelNameArg } from \"./BackendHubAccess\";\r\nimport { BackendLoggerCategory } from \"./BackendLoggerCategory\";\r\nimport { CheckpointManager, CheckpointProps, ProgressFunction } from \"./CheckpointManager\";\r\nimport { BriefcaseDb, IModelDb, TokenArg } from \"./IModelDb\";\r\nimport { IModelHost } from \"./IModelHost\";\r\nimport { IModelJsFs } from \"./IModelJsFs\";\r\n\r\nconst loggerCategory = BackendLoggerCategory.IModelDb;\r\n\r\n/** The argument for [[BriefcaseManager.downloadBriefcase]]\r\n * @public\r\n*/\r\nexport interface RequestNewBriefcaseArg extends TokenArg, RequestNewBriefcaseProps {\r\n /** If present, a function called periodically during the download to indicate progress.\r\n * @note return non-zero from this function to abort the download.\r\n */\r\n onProgress?: ProgressFunction;\r\n}\r\n\r\n/**\r\n * Parameters for pushing changesets to iModelHub\r\n * @public\r\n */\r\nexport interface PushChangesArgs extends TokenArg {\r\n /** A description of the changes. This is visible on the iModel's timeline. */\r\n description: string;\r\n /** if present, the locks are retained after the operation. Otherwise, *all* locks are released after the changeset is successfully pushed. */\r\n retainLocks?: true;\r\n /** number of times to retry pull/merge if other users are pushing at the same time. Default is 5 */\r\n mergeRetryCount?: number;\r\n /** delay to wait between pull/merge retry attempts. Default is 3 seconds */\r\n mergeRetryDelay?: BeDuration;\r\n /** the number of time to attempt to retry to push the changeset upon failure. Default is 3 */\r\n pushRetryCount?: number;\r\n /** The delay to wait between retry attempts on failed pushes. Default is 3 seconds. */\r\n pushRetryDelay?: BeDuration;\r\n}\r\n\r\n/**\r\n * Specifies a specific index for pulling changes.\r\n * @public\r\n */\r\nexport interface ToChangesetArgs extends TokenArg {\r\n /** The last ChangesetIndex to pull. If not present, pull *all* newer changesets. */\r\n toIndex?: ChangesetIndex;\r\n}\r\n\r\n/** Arguments for [[BriefcaseManager.pullAndApplyChangesets]]\r\n * @public\r\n */\r\nexport type PullChangesArgs = ToChangesetArgs & {\r\n /** If present, a function called periodically during the download to indicate progress.\r\n * @note return non-zero from this function to abort the download.\r\n */\r\n onProgress?: ProgressFunction;\r\n};\r\n\r\n/** Manages downloading Briefcases and downloading and uploading changesets.\r\n * @public\r\n */\r\nexport class BriefcaseManager {\r\n /** Get the local path of the folder storing files that are associated with an imodel */\r\n public static getIModelPath(iModelId: GuidString): LocalDirName { return path.join(this._cacheDir, iModelId); }\r\n\r\n /** @internal */\r\n public static getChangeSetsPath(iModelId: GuidString): LocalDirName { return path.join(this.getIModelPath(iModelId), \"changesets\"); }\r\n\r\n /** @internal */\r\n public static getChangeCachePathName(iModelId: GuidString): LocalFileName { return path.join(this.getIModelPath(iModelId), iModelId.concat(\".bim.ecchanges\")); }\r\n\r\n /** @internal */\r\n public static getChangedElementsPathName(iModelId: GuidString): LocalFileName { return path.join(this.getIModelPath(iModelId), iModelId.concat(\".bim.elems\")); }\r\n\r\n private static _briefcaseSubDir = \"briefcases\";\r\n /** Get the local path of the folder storing briefcases associated with the specified iModel. */\r\n public static getBriefcaseBasePath(iModelId: GuidString): LocalDirName {\r\n return path.join(this.getIModelPath(iModelId), this._briefcaseSubDir);\r\n }\r\n\r\n /** Get the name of the local file that holds, or will hold, a local briefcase in the briefcase cache.\r\n * @note The briefcase cache is a local directory established in the call to [[BriefcaseManager.initialize]].\r\n * @param briefcase the iModelId and BriefcaseId for the filename\r\n * @see getIModelPath\r\n */\r\n public static getFileName(briefcase: BriefcaseProps): LocalFileName {\r\n return path.join(this.getBriefcaseBasePath(briefcase.iModelId), `${briefcase.briefcaseId}.bim`);\r\n }\r\n\r\n private static setupCacheDir(cacheRootDir: LocalDirName) {\r\n this._cacheDir = cacheRootDir;\r\n IModelJsFs.recursiveMkDirSync(this._cacheDir);\r\n }\r\n\r\n private static _initialized?: boolean;\r\n /** Initialize BriefcaseManager\r\n * @param cacheRootDir The root directory for storing a cache of downloaded briefcase files on the local computer.\r\n * Briefcases are stored relative to this path in sub-folders organized by IModelId.\r\n * @note It is perfectly valid for applications to store briefcases in locations they manage, outside of `cacheRootDir`.\r\n */\r\n public static initialize(cacheRootDir: LocalDirName) {\r\n if (this._initialized)\r\n return;\r\n this.setupCacheDir(cacheRootDir);\r\n IModelHost.onBeforeShutdown.addOnce(() => this.finalize());\r\n this._initialized = true;\r\n }\r\n\r\n private static finalize() {\r\n this._initialized = false;\r\n }\r\n\r\n /** Get a list of the local briefcase held in the briefcase cache, optionally for a single iModelId\r\n * @param iModelId if present, only briefcases for this iModelId are returned, otherwise all briefcases for all\r\n * iModels in the briefcase cache are returned.\r\n * @note usually there should only be one briefcase per iModel.\r\n */\r\n public static getCachedBriefcases(iModelId?: GuidString): LocalBriefcaseProps[] {\r\n const briefcaseList: LocalBriefcaseProps[] = [];\r\n const iModelDirs = IModelJsFs.readdirSync(this._cacheDir);\r\n for (const iModelDir of iModelDirs) {\r\n if (iModelId && iModelId !== iModelDir)\r\n continue;\r\n const bcPath = path.join(this._cacheDir, iModelDir, this._briefcaseSubDir);\r\n try {\r\n if (!IModelJsFs.lstatSync(bcPath)?.isDirectory)\r\n continue;\r\n } catch (err) {\r\n continue;\r\n }\r\n\r\n const briefcases = IModelJsFs.readdirSync(bcPath);\r\n for (const briefcaseName of briefcases) {\r\n if (briefcaseName.endsWith(\".bim\")) {\r\n try {\r\n const fileName = path.join(bcPath, briefcaseName);\r\n const fileSize = IModelJsFs.lstatSync(fileName)?.size ?? 0;\r\n const db = IModelDb.openDgnDb({ path: fileName }, OpenMode.Readonly);\r\n briefcaseList.push({ fileName, iTwinId: db.getITwinId(), iModelId: db.getIModelId(), briefcaseId: db.getBriefcaseId(), changeset: db.getCurrentChangeset(), fileSize });\r\n db.closeIModel();\r\n } catch (_err) {\r\n }\r\n }\r\n }\r\n }\r\n return briefcaseList;\r\n }\r\n\r\n private static _cacheDir: LocalDirName;\r\n /** Get the root directory for the briefcase cache */\r\n public static get cacheDir(): LocalDirName { return this._cacheDir; }\r\n\r\n /** Determine whether the supplied briefcaseId is in the range of assigned BriefcaseIds issued by iModelHub\r\n * @note this does check whether the id was actually acquired by the caller.\r\n */\r\n public static isValidBriefcaseId(id: BriefcaseId) {\r\n return id >= BriefcaseIdValue.FirstValid && id <= BriefcaseIdValue.LastValid;\r\n }\r\n\r\n /** Acquire a new briefcaseId from iModelHub for the supplied iModelId\r\n * @note usually there should only be one briefcase per iModel per user. If a single user acquires more than one briefcaseId,\r\n * it's a good idea to supply different aliases for each of them.\r\n */\r\n public static async acquireNewBriefcaseId(arg: AcquireNewBriefcaseIdArg): Promise<BriefcaseId> {\r\n return IModelHost.hubAccess.acquireNewBriefcaseId(arg);\r\n }\r\n\r\n /**\r\n * Download a new briefcase from iModelHub for the supplied iModelId.\r\n *\r\n * Briefcases are local files holding a copy of an iModel.\r\n * Briefcases may either be specific to an individual user (so that it can be modified to create changesets), or it can be readonly so it can accept but not create changesets.\r\n * Every briefcase internally holds its [[BriefcaseId]]. Writeable briefcases have a `BriefcaseId` \"assigned\" to them by iModelHub. No two users will ever have the same BriefcaseId.\r\n * Readonly briefcases are \"unassigned\" with the special value [[BriefcaseId.Unassigned]].\r\n *\r\n * Typically a given user will have only one briefcase on their machine for a given iModelId. Rarely, it may be necessary to use more than one\r\n * briefcase to make isolated independent sets of changes, but that is exceedingly complicated and rare.\r\n *\r\n * Callers of this method may supply a BriefcaseId, or if none is supplied, a new one is acquired from iModelHub.\r\n *\r\n * @param arg The arguments that specify the briefcase file to be downloaded.\r\n * @returns The properties of the local briefcase in a Promise that is resolved after the briefcase is fully downloaded and the briefcase file is ready for use via [BriefcaseDb.open]($backend).\r\n * @note The location of the local file to hold the briefcase is arbitrary and may be any valid *local* path on your machine. If you don't supply\r\n * a filename, the local briefcase cache is used by creating a file with the briefcaseId as its name in the `briefcases` folder below the folder named\r\n * for the IModelId.\r\n * @note *It is invalid to edit briefcases on a shared network drive* and that is a sure way to corrupt your briefcase (see https://www.sqlite.org/howtocorrupt.html)\r\n */\r\n public static async downloadBriefcase(arg: RequestNewBriefcaseArg): Promise<LocalBriefcaseProps> {\r\n const briefcaseId = arg.briefcaseId ?? await this.acquireNewBriefcaseId(arg);\r\n const fileName = arg.fileName ?? this.getFileName({ ...arg, briefcaseId });\r\n\r\n if (IModelJsFs.existsSync(fileName))\r\n throw new IModelError(IModelStatus.FileAlreadyExists, `Briefcase \"${fileName}\" already exists`);\r\n\r\n const asOf = arg.asOf ?? IModelVersion.latest().toJSON();\r\n const changeset = await IModelHost.hubAccess.getChangesetFromVersion({ ...arg, version: IModelVersion.fromJSON(asOf) });\r\n const checkpoint: CheckpointProps = { ...arg, changeset };\r\n\r\n try {\r\n await CheckpointManager.downloadCheckpoint({ localFile: fileName, checkpoint, onProgress: arg.onProgress });\r\n } catch (error: unknown) {\r\n if (arg.accessToken && arg.briefcaseId === undefined)\r\n await this.releaseBriefcase(arg.accessToken, { briefcaseId, iModelId: arg.iModelId });\r\n\r\n throw error;\r\n }\r\n\r\n const fileSize = IModelJsFs.lstatSync(fileName)?.size ?? 0;\r\n const response: LocalBriefcaseProps = {\r\n fileName,\r\n briefcaseId,\r\n iModelId: arg.iModelId,\r\n iTwinId: arg.iTwinId,\r\n changeset: checkpoint.changeset,\r\n fileSize,\r\n };\r\n\r\n // now open the downloaded checkpoint and reset its BriefcaseId\r\n const nativeDb = new IModelHost.platform.DgnDb();\r\n try {\r\n nativeDb.openIModel(fileName, OpenMode.ReadWrite);\r\n } catch (err: any) {\r\n throw new IModelError(err.errorNumber, `Could not open downloaded briefcase for write access: ${fileName}, err=${err.message}`);\r\n }\r\n try {\r\n nativeDb.enableWalMode(); // local briefcases should use WAL journal mode\r\n nativeDb.resetBriefcaseId(briefcaseId);\r\n if (nativeDb.getCurrentChangeset().id !== checkpoint.changeset.id)\r\n throw new IModelError(IModelStatus.InvalidId, `Downloaded briefcase has wrong changesetId: ${fileName}`);\r\n } finally {\r\n nativeDb.saveChanges();\r\n nativeDb.closeIModel();\r\n }\r\n return response;\r\n }\r\n\r\n /** Deletes change sets of an iModel from local disk\r\n * @internal\r\n */\r\n public static deleteChangeSetsFromLocalDisk(iModelId: string) {\r\n const changesetsPath = BriefcaseManager.getChangeSetsPath(iModelId);\r\n BriefcaseManager.deleteFolderAndContents(changesetsPath);\r\n }\r\n\r\n /** Releases a briefcaseId from iModelHub. After this call it is illegal to generate changesets for the released briefcaseId.\r\n * @note generally, this method should not be called directly. Instead use [[deleteBriefcaseFiles]].\r\n * @see deleteBriefcaseFiles\r\n */\r\n public static async releaseBriefcase(accessToken: AccessToken, briefcase: BriefcaseProps): Promise<void> {\r\n if (this.isValidBriefcaseId(briefcase.briefcaseId))\r\n return IModelHost.hubAccess.releaseBriefcase({ accessToken, iModelId: briefcase.iModelId, briefcaseId: briefcase.briefcaseId });\r\n }\r\n\r\n /**\r\n * Delete and clean up a briefcase and all of its associated files. First, this method opens the supplied filename to determine its briefcaseId.\r\n * Then, if a requestContext is supplied, it releases a BriefcaseId from iModelHub. Finally it deletes the local briefcase file and\r\n * associated files (that is, all files in the same directory that start with the briefcase name).\r\n * @param filePath the full file name of the Briefcase to delete\r\n * @param accessToken for releasing the briefcaseId\r\n */\r\n public static async deleteBriefcaseFiles(filePath: LocalFileName, accessToken?: AccessToken): Promise<void> {\r\n try {\r\n const db = IModelDb.openDgnDb({ path: filePath }, OpenMode.Readonly);\r\n const briefcase: BriefcaseProps = {\r\n iModelId: db.getIModelId(),\r\n briefcaseId: db.getBriefcaseId(),\r\n };\r\n db.closeIModel();\r\n\r\n if (accessToken) {\r\n if (this.isValidBriefcaseId(briefcase.briefcaseId)) {\r\n await BriefcaseManager.releaseBriefcase(accessToken, briefcase);\r\n }\r\n }\r\n } catch (error) {\r\n }\r\n\r\n // first try to delete the briefcase file\r\n try {\r\n if (IModelJsFs.existsSync(filePath))\r\n IModelJsFs.unlinkSync(filePath);\r\n } catch (err) {\r\n throw new IModelError(IModelStatus.BadRequest, `cannot delete briefcase file ${err}`);\r\n }\r\n\r\n // next, delete all files that start with the briefcase's filePath (e.g. \"a.bim-locks\", \"a.bim-journal\", etc.)\r\n try {\r\n const dirName = path.dirname(filePath);\r\n const fileName = path.basename(filePath);\r\n const files = IModelJsFs.readdirSync(dirName);\r\n for (const file of files) {\r\n if (file.startsWith(fileName))\r\n this.deleteFile(path.join(dirName, file)); // don't throw on error\r\n }\r\n } catch (err) {\r\n }\r\n }\r\n\r\n /** Deletes a file\r\n * - Does not throw any error, but logs it instead\r\n * - Returns true if the delete was successful\r\n */\r\n private static deleteFile(pathname: LocalFileName): boolean {\r\n try {\r\n IModelJsFs.unlinkSync(pathname);\r\n } catch (error) {\r\n Logger.logError(loggerCategory, `Cannot delete file ${pathname}, ${error}`);\r\n return false;\r\n }\r\n return true;\r\n }\r\n\r\n /** Deletes a folder, checking if it's empty\r\n * - Does not throw any error, but logs it instead\r\n * - Returns true if the delete was successful\r\n */\r\n private static deleteFolderIfEmpty(folderPathname: LocalDirName): boolean {\r\n try {\r\n const files = IModelJsFs.readdirSync(folderPathname);\r\n if (files.length > 0)\r\n return false;\r\n\r\n IModelJsFs.rmdirSync(folderPathname);\r\n } catch (error) {\r\n Logger.logError(loggerCategory, `Cannot delete folder: ${folderPathname}`);\r\n return false;\r\n }\r\n return true;\r\n }\r\n\r\n /** Deletes the contents of a folder, but not the folder itself\r\n * - Does not throw any errors, but logs them.\r\n * - returns true if the delete was successful.\r\n */\r\n private static deleteFolderContents(folderPathname: LocalDirName): boolean {\r\n if (!IModelJsFs.existsSync(folderPathname))\r\n return false;\r\n\r\n let status = true;\r\n const files = IModelJsFs.readdirSync(folderPathname);\r\n for (const file of files) {\r\n const curPath = path.join(folderPathname, file);\r\n const locStatus = (IModelJsFs.lstatSync(curPath)?.isDirectory) ? BriefcaseManager.deleteFolderAndContents(curPath) : BriefcaseManager.deleteFile(curPath);\r\n if (!locStatus)\r\n status = false;\r\n }\r\n return status;\r\n }\r\n\r\n /** Query the hub for the properties for a ChangesetIndex or ChangesetId */\r\n public static async queryChangeset(arg: { iModelId: GuidString, changeset: ChangesetIndexOrId }): Promise<ChangesetProps> {\r\n return IModelHost.hubAccess.queryChangeset({ ...arg, accessToken: await IModelHost.getAccessToken() });\r\n }\r\n\r\n /** Query the hub for an array of changeset properties given a ChangesetRange */\r\n public static async queryChangesets(arg: { iModelId: GuidString, range: ChangesetRange }): Promise<ChangesetProps[]> {\r\n return IModelHost.hubAccess.queryChangesets({ ...arg, accessToken: await IModelHost.getAccessToken() });\r\n }\r\n\r\n /** Query the hub for the ChangesetProps of the most recent changeset */\r\n public static async getLatestChangeset(arg: { iModelId: GuidString }): Promise<ChangesetProps> {\r\n return IModelHost.hubAccess.getLatestChangeset({ ...arg, accessToken: await IModelHost.getAccessToken() });\r\n }\r\n\r\n /** Query the Id of an iModel by name.\r\n * @param arg Identifies the iModel of interest\r\n * @returns the Id of the corresponding iModel, or `undefined` if no such iModel exists.\r\n */\r\n public static async queryIModelByName(arg: IModelNameArg): Promise<GuidString | undefined> {\r\n return IModelHost.hubAccess.queryIModelByName(arg);\r\n }\r\n\r\n /** Deletes a folder and all it's contents.\r\n * - Does not throw any errors, but logs them.\r\n * - returns true if the delete was successful.\r\n */\r\n private static deleteFolderAndContents(folderPathname: LocalDirName): boolean {\r\n if (!IModelJsFs.existsSync(folderPathname))\r\n return true;\r\n\r\n let status = false;\r\n status = BriefcaseManager.deleteFolderContents(folderPathname);\r\n if (!status)\r\n return false;\r\n\r\n status = BriefcaseManager.deleteFolderIfEmpty(folderPathname);\r\n return status;\r\n }\r\n\r\n private static async applySingleChangeset(db: IModelDb, changesetFile: ChangesetFileProps) {\r\n if (changesetFile.changesType === ChangesetType.Schema)\r\n db.clearCaches(); // for schema changesets, statement caches may become invalid. Do this *before* applying, in case db needs to be closed (open statements hold db open.)\r\n\r\n db.nativeDb.applyChangeset(changesetFile);\r\n db.changeset = db.nativeDb.getCurrentChangeset();\r\n\r\n // we're done with this changeset, delete it\r\n IModelJsFs.removeSync(changesetFile.pathname);\r\n }\r\n\r\n /** @internal */\r\n public static async pullAndApplyChangesets(db: IModelDb, arg: PullChangesArgs): Promise<void> {\r\n if (!db.isOpen || db.nativeDb.isReadonly()) // don't use db.isReadonly - we reopen the file writable just for this operation but db.isReadonly is still true\r\n throw new IModelError(ChangeSetStatus.ApplyError, \"Briefcase must be open ReadWrite to process change sets\");\r\n\r\n let currentIndex = db.changeset.index;\r\n if (currentIndex === undefined)\r\n currentIndex = (await IModelHost.hubAccess.queryChangeset({ accessToken: arg.accessToken, iModelId: db.iModelId, changeset: { id: db.changeset.id } })).index;\r\n\r\n const reverse = (arg.toIndex && arg.toIndex < currentIndex) ? true : false;\r\n\r\n // Download change sets\r\n const changesets = await IModelHost.hubAccess.downloadChangesets({\r\n accessToken: arg.accessToken,\r\n iModelId: db.iModelId,\r\n range: { first: reverse ? arg.toIndex! + 1 : currentIndex + 1, end: reverse ? currentIndex : arg.toIndex }, // eslint-disable-line @typescript-eslint/no-non-null-assertion\r\n targetDir: BriefcaseManager.getChangeSetsPath(db.iModelId),\r\n progressCallback: arg.onProgress,\r\n });\r\n\r\n if (changesets.length === 0)\r\n return; // nothing to apply\r\n\r\n if (reverse)\r\n changesets.reverse();\r\n\r\n for (const changeset of changesets) {\r\n const stopwatch = new StopWatch(`[${changeset.id}]`, true);\r\n Logger.logInfo(loggerCategory, `Starting application of changeset with id ${stopwatch.description}`);\r\n await this.applySingleChangeset(db, changeset);\r\n Logger.logInfo(loggerCategory, `Applied changeset with id ${stopwatch.description} (${stopwatch.elapsedSeconds} seconds)`);\r\n }\r\n // notify listeners\r\n db.notifyChangesetApplied();\r\n }\r\n\r\n /** create a changeset from the current changes, and push it to iModelHub */\r\n private static async pushChanges(db: BriefcaseDb, arg: PushChangesArgs): Promise<void> {\r\n const changesetProps = db.nativeDb.startCreateChangeset() as ChangesetFileProps;\r\n changesetProps.briefcaseId = db.briefcaseId;\r\n changesetProps.description = arg.description;\r\n const fileSize = IModelJsFs.lstatSync(changesetProps.pathname)?.size;\r\n if (!fileSize) // either undefined or 0 means error\r\n throw new IModelError(IModelStatus.NoContent, \"error creating changeset\");\r\n\r\n changesetProps.size = fileSize;\r\n\r\n let retryCount = arg.pushRetryCount ?? 3;\r\n while (true) {\r\n try {\r\n const accessToken = await IModelHost.getAccessToken();\r\n const index = await IModelHost.hubAccess.pushChangeset({ accessToken, iModelId: db.iModelId, changesetProps });\r\n db.nativeDb.completeCreateChangeset({ index });\r\n db.changeset = db.nativeDb.getCurrentChangeset();\r\n if (!arg.retainLocks)\r\n await db.locks.releaseAllLocks();\r\n\r\n return;\r\n } catch (err: any) {\r\n const shouldRetry = () => {\r\n if (retryCount-- <= 0)\r\n return false;\r\n switch (err.errorNumber) {\r\n case IModelHubStatus.AnotherUserPushing:\r\n case IModelHubStatus.DatabaseTemporarilyLocked:\r\n case IModelHubStatus.OperationFailed:\r\n return true;\r\n }\r\n return false;\r\n };\r\n\r\n if (!shouldRetry()) {\r\n db.nativeDb.abandonCreateChangeset();\r\n throw err;\r\n }\r\n } finally {\r\n IModelJsFs.removeSync(changesetProps.pathname);\r\n }\r\n }\r\n }\r\n\r\n /** Pull/merge (if necessary), then push all local changes as a changeset. Called by [[BriefcaseDb.pushChanges]]\r\n * @internal\r\n */\r\n public static async pullMergePush(db: BriefcaseDb, arg: PushChangesArgs): Promise<void> {\r\n let retryCount = arg.mergeRetryCount ?? 5;\r\n while (true) {\r\n try {\r\n await BriefcaseManager.pullAndApplyChangesets(db, arg);\r\n return await BriefcaseManager.pushChanges(db, arg);\r\n } catch (err: any) {\r\n if (retryCount-- <= 0 || err.errorNumber !== IModelHubStatus.PullIsRequired)\r\n throw (err);\r\n await (arg.mergeRetryDelay ?? BeDuration.fromSeconds(3)).wait();\r\n }\r\n }\r\n }\r\n\r\n}\r\n"]}
|
|
1
|
+
{"version":3,"file":"BriefcaseManager.js","sourceRoot":"","sources":["../../src/BriefcaseManager.ts"],"names":[],"mappings":"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","sourcesContent":["/*---------------------------------------------------------------------------------------------\r\n* Copyright (c) Bentley Systems, Incorporated. All rights reserved.\r\n* See LICENSE.md in the project root for license terms and full copyright notice.\r\n*--------------------------------------------------------------------------------------------*/\r\n/** @packageDocumentation\r\n * @module iModels\r\n */\r\n\r\n// cspell:ignore cset csets ecchanges\r\n\r\nimport * as path from \"path\";\r\nimport {\r\n AccessToken, BeDuration, ChangeSetStatus, GuidString, IModelHubStatus, IModelStatus, Logger, OpenMode, StopWatch,\r\n} from \"@itwin/core-bentley\";\r\nimport {\r\n BriefcaseId, BriefcaseIdValue, BriefcaseProps, ChangesetFileProps, ChangesetIndex, ChangesetIndexOrId, ChangesetProps, ChangesetRange, ChangesetType, IModelError, IModelVersion, LocalBriefcaseProps,\r\n LocalDirName, LocalFileName, RequestNewBriefcaseProps,\r\n} from \"@itwin/core-common\";\r\nimport { AcquireNewBriefcaseIdArg, IModelNameArg } from \"./BackendHubAccess\";\r\nimport { BackendLoggerCategory } from \"./BackendLoggerCategory\";\r\nimport { CheckpointManager, CheckpointProps, ProgressFunction } from \"./CheckpointManager\";\r\nimport { BriefcaseDb, IModelDb, TokenArg } from \"./IModelDb\";\r\nimport { IModelHost } from \"./IModelHost\";\r\nimport { IModelJsFs } from \"./IModelJsFs\";\r\n\r\nconst loggerCategory = BackendLoggerCategory.IModelDb;\r\n\r\n/** The argument for [[BriefcaseManager.downloadBriefcase]]\r\n * @public\r\n*/\r\nexport interface RequestNewBriefcaseArg extends TokenArg, RequestNewBriefcaseProps {\r\n /** If present, a function called periodically during the download to indicate progress.\r\n * @note return non-zero from this function to abort the download.\r\n */\r\n onProgress?: ProgressFunction;\r\n}\r\n\r\n/**\r\n * Parameters for pushing changesets to iModelHub\r\n * @public\r\n */\r\nexport interface PushChangesArgs extends TokenArg {\r\n /** A description of the changes. This is visible on the iModel's timeline. */\r\n description: string;\r\n /** if present, the locks are retained after the operation. Otherwise, *all* locks are released after the changeset is successfully pushed. */\r\n retainLocks?: true;\r\n /** number of times to retry pull/merge if other users are pushing at the same time. Default is 5 */\r\n mergeRetryCount?: number;\r\n /** delay to wait between pull/merge retry attempts. Default is 3 seconds */\r\n mergeRetryDelay?: BeDuration;\r\n /** the number of time to attempt to retry to push the changeset upon failure. Default is 3 */\r\n pushRetryCount?: number;\r\n /** The delay to wait between retry attempts on failed pushes. Default is 3 seconds. */\r\n pushRetryDelay?: BeDuration;\r\n}\r\n\r\n/**\r\n * Specifies a specific index for pulling changes.\r\n * @public\r\n */\r\nexport interface ToChangesetArgs extends TokenArg {\r\n /** The last ChangesetIndex to pull. If not present, pull *all* newer changesets. */\r\n toIndex?: ChangesetIndex;\r\n}\r\n\r\n/** Arguments for [[BriefcaseManager.pullAndApplyChangesets]]\r\n * @public\r\n */\r\nexport type PullChangesArgs = ToChangesetArgs & {\r\n /** If present, a function called periodically during the download to indicate progress.\r\n * @note return non-zero from this function to abort the download.\r\n */\r\n onProgress?: ProgressFunction;\r\n};\r\n\r\n/** Manages downloading Briefcases and downloading and uploading changesets.\r\n * @public\r\n */\r\nexport class BriefcaseManager {\r\n /** Get the local path of the folder storing files that are associated with an imodel */\r\n public static getIModelPath(iModelId: GuidString): LocalDirName { return path.join(this._cacheDir, iModelId); }\r\n\r\n /** @internal */\r\n public static getChangeSetsPath(iModelId: GuidString): LocalDirName { return path.join(this.getIModelPath(iModelId), \"changesets\"); }\r\n\r\n /** @internal */\r\n public static getChangeCachePathName(iModelId: GuidString): LocalFileName { return path.join(this.getIModelPath(iModelId), iModelId.concat(\".bim.ecchanges\")); }\r\n\r\n /** @internal */\r\n public static getChangedElementsPathName(iModelId: GuidString): LocalFileName { return path.join(this.getIModelPath(iModelId), iModelId.concat(\".bim.elems\")); }\r\n\r\n private static _briefcaseSubDir = \"briefcases\";\r\n /** Get the local path of the folder storing briefcases associated with the specified iModel. */\r\n public static getBriefcaseBasePath(iModelId: GuidString): LocalDirName {\r\n return path.join(this.getIModelPath(iModelId), this._briefcaseSubDir);\r\n }\r\n\r\n /** Get the name of the local file that holds, or will hold, a local briefcase in the briefcase cache.\r\n * @note The briefcase cache is a local directory established in the call to [[BriefcaseManager.initialize]].\r\n * @param briefcase the iModelId and BriefcaseId for the filename\r\n * @see getIModelPath\r\n */\r\n public static getFileName(briefcase: BriefcaseProps): LocalFileName {\r\n return path.join(this.getBriefcaseBasePath(briefcase.iModelId), `${briefcase.briefcaseId}.bim`);\r\n }\r\n\r\n private static setupCacheDir(cacheRootDir: LocalDirName) {\r\n this._cacheDir = cacheRootDir;\r\n IModelJsFs.recursiveMkDirSync(this._cacheDir);\r\n }\r\n\r\n private static _initialized?: boolean;\r\n /** Initialize BriefcaseManager\r\n * @param cacheRootDir The root directory for storing a cache of downloaded briefcase files on the local computer.\r\n * Briefcases are stored relative to this path in sub-folders organized by IModelId.\r\n * @note It is perfectly valid for applications to store briefcases in locations they manage, outside of `cacheRootDir`.\r\n */\r\n public static initialize(cacheRootDir: LocalDirName) {\r\n if (this._initialized)\r\n return;\r\n this.setupCacheDir(cacheRootDir);\r\n IModelHost.onBeforeShutdown.addOnce(() => this.finalize());\r\n this._initialized = true;\r\n }\r\n\r\n private static finalize() {\r\n this._initialized = false;\r\n }\r\n\r\n /** Get a list of the local briefcase held in the briefcase cache, optionally for a single iModelId\r\n * @param iModelId if present, only briefcases for this iModelId are returned, otherwise all briefcases for all\r\n * iModels in the briefcase cache are returned.\r\n * @note usually there should only be one briefcase per iModel.\r\n */\r\n public static getCachedBriefcases(iModelId?: GuidString): LocalBriefcaseProps[] {\r\n const briefcaseList: LocalBriefcaseProps[] = [];\r\n const iModelDirs = IModelJsFs.readdirSync(this._cacheDir);\r\n for (const iModelDir of iModelDirs) {\r\n if (iModelId && iModelId !== iModelDir)\r\n continue;\r\n const bcPath = path.join(this._cacheDir, iModelDir, this._briefcaseSubDir);\r\n try {\r\n if (!IModelJsFs.lstatSync(bcPath)?.isDirectory)\r\n continue;\r\n } catch (err) {\r\n continue;\r\n }\r\n\r\n const briefcases = IModelJsFs.readdirSync(bcPath);\r\n for (const briefcaseName of briefcases) {\r\n if (briefcaseName.endsWith(\".bim\")) {\r\n try {\r\n const fileName = path.join(bcPath, briefcaseName);\r\n const fileSize = IModelJsFs.lstatSync(fileName)?.size ?? 0;\r\n const db = IModelDb.openDgnDb({ path: fileName }, OpenMode.Readonly);\r\n briefcaseList.push({ fileName, iTwinId: db.getITwinId(), iModelId: db.getIModelId(), briefcaseId: db.getBriefcaseId(), changeset: db.getCurrentChangeset(), fileSize });\r\n db.closeFile();\r\n } catch (_err) {\r\n }\r\n }\r\n }\r\n }\r\n return briefcaseList;\r\n }\r\n\r\n private static _cacheDir: LocalDirName;\r\n /** Get the root directory for the briefcase cache */\r\n public static get cacheDir(): LocalDirName { return this._cacheDir; }\r\n\r\n /** Determine whether the supplied briefcaseId is in the range of assigned BriefcaseIds issued by iModelHub\r\n * @note this does check whether the id was actually acquired by the caller.\r\n */\r\n public static isValidBriefcaseId(id: BriefcaseId) {\r\n return id >= BriefcaseIdValue.FirstValid && id <= BriefcaseIdValue.LastValid;\r\n }\r\n\r\n /** Acquire a new briefcaseId from iModelHub for the supplied iModelId\r\n * @note usually there should only be one briefcase per iModel per user. If a single user acquires more than one briefcaseId,\r\n * it's a good idea to supply different aliases for each of them.\r\n */\r\n public static async acquireNewBriefcaseId(arg: AcquireNewBriefcaseIdArg): Promise<BriefcaseId> {\r\n return IModelHost.hubAccess.acquireNewBriefcaseId(arg);\r\n }\r\n\r\n /**\r\n * Download a new briefcase from iModelHub for the supplied iModelId.\r\n *\r\n * Briefcases are local files holding a copy of an iModel.\r\n * Briefcases may either be specific to an individual user (so that it can be modified to create changesets), or it can be readonly so it can accept but not create changesets.\r\n * Every briefcase internally holds its [[BriefcaseId]]. Writeable briefcases have a `BriefcaseId` \"assigned\" to them by iModelHub. No two users will ever have the same BriefcaseId.\r\n * Readonly briefcases are \"unassigned\" with the special value [[BriefcaseId.Unassigned]].\r\n *\r\n * Typically a given user will have only one briefcase on their machine for a given iModelId. Rarely, it may be necessary to use more than one\r\n * briefcase to make isolated independent sets of changes, but that is exceedingly complicated and rare.\r\n *\r\n * Callers of this method may supply a BriefcaseId, or if none is supplied, a new one is acquired from iModelHub.\r\n *\r\n * @param arg The arguments that specify the briefcase file to be downloaded.\r\n * @returns The properties of the local briefcase in a Promise that is resolved after the briefcase is fully downloaded and the briefcase file is ready for use via [BriefcaseDb.open]($backend).\r\n * @note The location of the local file to hold the briefcase is arbitrary and may be any valid *local* path on your machine. If you don't supply\r\n * a filename, the local briefcase cache is used by creating a file with the briefcaseId as its name in the `briefcases` folder below the folder named\r\n * for the IModelId.\r\n * @note *It is invalid to edit briefcases on a shared network drive* and that is a sure way to corrupt your briefcase (see https://www.sqlite.org/howtocorrupt.html)\r\n */\r\n public static async downloadBriefcase(arg: RequestNewBriefcaseArg): Promise<LocalBriefcaseProps> {\r\n const briefcaseId = arg.briefcaseId ?? await this.acquireNewBriefcaseId(arg);\r\n const fileName = arg.fileName ?? this.getFileName({ ...arg, briefcaseId });\r\n\r\n if (IModelJsFs.existsSync(fileName))\r\n throw new IModelError(IModelStatus.FileAlreadyExists, `Briefcase \"${fileName}\" already exists`);\r\n\r\n const asOf = arg.asOf ?? IModelVersion.latest().toJSON();\r\n const changeset = await IModelHost.hubAccess.getChangesetFromVersion({ ...arg, version: IModelVersion.fromJSON(asOf) });\r\n const checkpoint: CheckpointProps = { ...arg, changeset };\r\n\r\n try {\r\n await CheckpointManager.downloadCheckpoint({ localFile: fileName, checkpoint, onProgress: arg.onProgress });\r\n } catch (error: unknown) {\r\n if (arg.accessToken && arg.briefcaseId === undefined)\r\n await this.releaseBriefcase(arg.accessToken, { briefcaseId, iModelId: arg.iModelId });\r\n\r\n throw error;\r\n }\r\n\r\n const fileSize = IModelJsFs.lstatSync(fileName)?.size ?? 0;\r\n const response: LocalBriefcaseProps = {\r\n fileName,\r\n briefcaseId,\r\n iModelId: arg.iModelId,\r\n iTwinId: arg.iTwinId,\r\n changeset: checkpoint.changeset,\r\n fileSize,\r\n };\r\n\r\n // now open the downloaded checkpoint and reset its BriefcaseId\r\n const nativeDb = new IModelHost.platform.DgnDb();\r\n try {\r\n nativeDb.openIModel(fileName, OpenMode.ReadWrite);\r\n } catch (err: any) {\r\n throw new IModelError(err.errorNumber, `Could not open downloaded briefcase for write access: ${fileName}, err=${err.message}`);\r\n }\r\n try {\r\n nativeDb.enableWalMode(); // local briefcases should use WAL journal mode\r\n nativeDb.resetBriefcaseId(briefcaseId);\r\n if (nativeDb.getCurrentChangeset().id !== checkpoint.changeset.id)\r\n throw new IModelError(IModelStatus.InvalidId, `Downloaded briefcase has wrong changesetId: ${fileName}`);\r\n } finally {\r\n nativeDb.saveChanges();\r\n nativeDb.closeFile();\r\n }\r\n return response;\r\n }\r\n\r\n /** Deletes change sets of an iModel from local disk\r\n * @internal\r\n */\r\n public static deleteChangeSetsFromLocalDisk(iModelId: string) {\r\n const changesetsPath = BriefcaseManager.getChangeSetsPath(iModelId);\r\n BriefcaseManager.deleteFolderAndContents(changesetsPath);\r\n }\r\n\r\n /** Releases a briefcaseId from iModelHub. After this call it is illegal to generate changesets for the released briefcaseId.\r\n * @note generally, this method should not be called directly. Instead use [[deleteBriefcaseFiles]].\r\n * @see deleteBriefcaseFiles\r\n */\r\n public static async releaseBriefcase(accessToken: AccessToken, briefcase: BriefcaseProps): Promise<void> {\r\n if (this.isValidBriefcaseId(briefcase.briefcaseId))\r\n return IModelHost.hubAccess.releaseBriefcase({ accessToken, iModelId: briefcase.iModelId, briefcaseId: briefcase.briefcaseId });\r\n }\r\n\r\n /**\r\n * Delete and clean up a briefcase and all of its associated files. First, this method opens the supplied filename to determine its briefcaseId.\r\n * Then, if a requestContext is supplied, it releases a BriefcaseId from iModelHub. Finally it deletes the local briefcase file and\r\n * associated files (that is, all files in the same directory that start with the briefcase name).\r\n * @param filePath the full file name of the Briefcase to delete\r\n * @param accessToken for releasing the briefcaseId\r\n */\r\n public static async deleteBriefcaseFiles(filePath: LocalFileName, accessToken?: AccessToken): Promise<void> {\r\n try {\r\n const db = IModelDb.openDgnDb({ path: filePath }, OpenMode.Readonly);\r\n const briefcase: BriefcaseProps = {\r\n iModelId: db.getIModelId(),\r\n briefcaseId: db.getBriefcaseId(),\r\n };\r\n db.closeFile();\r\n\r\n if (accessToken) {\r\n if (this.isValidBriefcaseId(briefcase.briefcaseId)) {\r\n await BriefcaseManager.releaseBriefcase(accessToken, briefcase);\r\n }\r\n }\r\n } catch (error) {\r\n }\r\n\r\n // first try to delete the briefcase file\r\n try {\r\n if (IModelJsFs.existsSync(filePath))\r\n IModelJsFs.unlinkSync(filePath);\r\n } catch (err) {\r\n throw new IModelError(IModelStatus.BadRequest, `cannot delete briefcase file ${err}`);\r\n }\r\n\r\n // next, delete all files that start with the briefcase's filePath (e.g. \"a.bim-locks\", \"a.bim-journal\", etc.)\r\n try {\r\n const dirName = path.dirname(filePath);\r\n const fileName = path.basename(filePath);\r\n const files = IModelJsFs.readdirSync(dirName);\r\n for (const file of files) {\r\n if (file.startsWith(fileName))\r\n this.deleteFile(path.join(dirName, file)); // don't throw on error\r\n }\r\n } catch (err) {\r\n }\r\n }\r\n\r\n /** Deletes a file\r\n * - Does not throw any error, but logs it instead\r\n * - Returns true if the delete was successful\r\n */\r\n private static deleteFile(pathname: LocalFileName): boolean {\r\n try {\r\n IModelJsFs.unlinkSync(pathname);\r\n } catch (error) {\r\n Logger.logError(loggerCategory, `Cannot delete file ${pathname}, ${error}`);\r\n return false;\r\n }\r\n return true;\r\n }\r\n\r\n /** Deletes a folder, checking if it's empty\r\n * - Does not throw any error, but logs it instead\r\n * - Returns true if the delete was successful\r\n */\r\n private static deleteFolderIfEmpty(folderPathname: LocalDirName): boolean {\r\n try {\r\n const files = IModelJsFs.readdirSync(folderPathname);\r\n if (files.length > 0)\r\n return false;\r\n\r\n IModelJsFs.rmdirSync(folderPathname);\r\n } catch (error) {\r\n Logger.logError(loggerCategory, `Cannot delete folder: ${folderPathname}`);\r\n return false;\r\n }\r\n return true;\r\n }\r\n\r\n /** Deletes the contents of a folder, but not the folder itself\r\n * - Does not throw any errors, but logs them.\r\n * - returns true if the delete was successful.\r\n */\r\n private static deleteFolderContents(folderPathname: LocalDirName): boolean {\r\n if (!IModelJsFs.existsSync(folderPathname))\r\n return false;\r\n\r\n let status = true;\r\n const files = IModelJsFs.readdirSync(folderPathname);\r\n for (const file of files) {\r\n const curPath = path.join(folderPathname, file);\r\n const locStatus = (IModelJsFs.lstatSync(curPath)?.isDirectory) ? BriefcaseManager.deleteFolderAndContents(curPath) : BriefcaseManager.deleteFile(curPath);\r\n if (!locStatus)\r\n status = false;\r\n }\r\n return status;\r\n }\r\n\r\n /** Query the hub for the properties for a ChangesetIndex or ChangesetId */\r\n public static async queryChangeset(arg: { iModelId: GuidString, changeset: ChangesetIndexOrId }): Promise<ChangesetProps> {\r\n return IModelHost.hubAccess.queryChangeset({ ...arg, accessToken: await IModelHost.getAccessToken() });\r\n }\r\n\r\n /** Query the hub for an array of changeset properties given a ChangesetRange */\r\n public static async queryChangesets(arg: { iModelId: GuidString, range: ChangesetRange }): Promise<ChangesetProps[]> {\r\n return IModelHost.hubAccess.queryChangesets({ ...arg, accessToken: await IModelHost.getAccessToken() });\r\n }\r\n\r\n /** Query the hub for the ChangesetProps of the most recent changeset */\r\n public static async getLatestChangeset(arg: { iModelId: GuidString }): Promise<ChangesetProps> {\r\n return IModelHost.hubAccess.getLatestChangeset({ ...arg, accessToken: await IModelHost.getAccessToken() });\r\n }\r\n\r\n /** Query the Id of an iModel by name.\r\n * @param arg Identifies the iModel of interest\r\n * @returns the Id of the corresponding iModel, or `undefined` if no such iModel exists.\r\n */\r\n public static async queryIModelByName(arg: IModelNameArg): Promise<GuidString | undefined> {\r\n return IModelHost.hubAccess.queryIModelByName(arg);\r\n }\r\n\r\n /** Deletes a folder and all it's contents.\r\n * - Does not throw any errors, but logs them.\r\n * - returns true if the delete was successful.\r\n */\r\n private static deleteFolderAndContents(folderPathname: LocalDirName): boolean {\r\n if (!IModelJsFs.existsSync(folderPathname))\r\n return true;\r\n\r\n let status = false;\r\n status = BriefcaseManager.deleteFolderContents(folderPathname);\r\n if (!status)\r\n return false;\r\n\r\n status = BriefcaseManager.deleteFolderIfEmpty(folderPathname);\r\n return status;\r\n }\r\n\r\n private static async applySingleChangeset(db: IModelDb, changesetFile: ChangesetFileProps) {\r\n if (changesetFile.changesType === ChangesetType.Schema)\r\n db.clearCaches(); // for schema changesets, statement caches may become invalid. Do this *before* applying, in case db needs to be closed (open statements hold db open.)\r\n\r\n db.nativeDb.applyChangeset(changesetFile);\r\n db.changeset = db.nativeDb.getCurrentChangeset();\r\n\r\n // we're done with this changeset, delete it\r\n IModelJsFs.removeSync(changesetFile.pathname);\r\n }\r\n\r\n /** @internal */\r\n public static async pullAndApplyChangesets(db: IModelDb, arg: PullChangesArgs): Promise<void> {\r\n if (!db.isOpen || db.nativeDb.isReadonly()) // don't use db.isReadonly - we reopen the file writable just for this operation but db.isReadonly is still true\r\n throw new IModelError(ChangeSetStatus.ApplyError, \"Briefcase must be open ReadWrite to process change sets\");\r\n\r\n let currentIndex = db.changeset.index;\r\n if (currentIndex === undefined)\r\n currentIndex = (await IModelHost.hubAccess.queryChangeset({ accessToken: arg.accessToken, iModelId: db.iModelId, changeset: { id: db.changeset.id } })).index;\r\n\r\n const reverse = (arg.toIndex && arg.toIndex < currentIndex) ? true : false;\r\n\r\n // Download change sets\r\n const changesets = await IModelHost.hubAccess.downloadChangesets({\r\n accessToken: arg.accessToken,\r\n iModelId: db.iModelId,\r\n range: { first: reverse ? arg.toIndex! + 1 : currentIndex + 1, end: reverse ? currentIndex : arg.toIndex }, // eslint-disable-line @typescript-eslint/no-non-null-assertion\r\n targetDir: BriefcaseManager.getChangeSetsPath(db.iModelId),\r\n progressCallback: arg.onProgress,\r\n });\r\n\r\n if (changesets.length === 0)\r\n return; // nothing to apply\r\n\r\n if (reverse)\r\n changesets.reverse();\r\n\r\n for (const changeset of changesets) {\r\n const stopwatch = new StopWatch(`[${changeset.id}]`, true);\r\n Logger.logInfo(loggerCategory, `Starting application of changeset with id ${stopwatch.description}`);\r\n await this.applySingleChangeset(db, changeset);\r\n Logger.logInfo(loggerCategory, `Applied changeset with id ${stopwatch.description} (${stopwatch.elapsedSeconds} seconds)`);\r\n }\r\n // notify listeners\r\n db.notifyChangesetApplied();\r\n }\r\n\r\n /** create a changeset from the current changes, and push it to iModelHub */\r\n private static async pushChanges(db: BriefcaseDb, arg: PushChangesArgs): Promise<void> {\r\n const changesetProps = db.nativeDb.startCreateChangeset() as ChangesetFileProps;\r\n changesetProps.briefcaseId = db.briefcaseId;\r\n changesetProps.description = arg.description;\r\n const fileSize = IModelJsFs.lstatSync(changesetProps.pathname)?.size;\r\n if (!fileSize) // either undefined or 0 means error\r\n throw new IModelError(IModelStatus.NoContent, \"error creating changeset\");\r\n\r\n changesetProps.size = fileSize;\r\n\r\n let retryCount = arg.pushRetryCount ?? 3;\r\n while (true) {\r\n try {\r\n const accessToken = await IModelHost.getAccessToken();\r\n const index = await IModelHost.hubAccess.pushChangeset({ accessToken, iModelId: db.iModelId, changesetProps });\r\n db.nativeDb.completeCreateChangeset({ index });\r\n db.changeset = db.nativeDb.getCurrentChangeset();\r\n if (!arg.retainLocks)\r\n await db.locks.releaseAllLocks();\r\n\r\n return;\r\n } catch (err: any) {\r\n const shouldRetry = () => {\r\n if (retryCount-- <= 0)\r\n return false;\r\n switch (err.errorNumber) {\r\n case IModelHubStatus.AnotherUserPushing:\r\n case IModelHubStatus.DatabaseTemporarilyLocked:\r\n case IModelHubStatus.OperationFailed:\r\n return true;\r\n }\r\n return false;\r\n };\r\n\r\n if (!shouldRetry()) {\r\n db.nativeDb.abandonCreateChangeset();\r\n throw err;\r\n }\r\n } finally {\r\n IModelJsFs.removeSync(changesetProps.pathname);\r\n }\r\n }\r\n }\r\n\r\n /** Pull/merge (if necessary), then push all local changes as a changeset. Called by [[BriefcaseDb.pushChanges]]\r\n * @internal\r\n */\r\n public static async pullMergePush(db: BriefcaseDb, arg: PushChangesArgs): Promise<void> {\r\n let retryCount = arg.mergeRetryCount ?? 5;\r\n while (true) {\r\n try {\r\n await BriefcaseManager.pullAndApplyChangesets(db, arg);\r\n return await BriefcaseManager.pushChanges(db, arg);\r\n } catch (err: any) {\r\n if (retryCount-- <= 0 || err.errorNumber !== IModelHubStatus.PullIsRequired)\r\n throw (err);\r\n await (arg.mergeRetryDelay ?? BeDuration.fromSeconds(3)).wait();\r\n }\r\n }\r\n }\r\n\r\n}\r\n"]}
|
|
@@ -0,0 +1,196 @@
|
|
|
1
|
+
/** @packageDocumentation
|
|
2
|
+
* @module ECDb
|
|
3
|
+
*/
|
|
4
|
+
import { Id64String, IDisposable } from "@itwin/core-bentley";
|
|
5
|
+
import { SqliteChangeOp, SqliteChangesetReader, SqliteValueStage } from "./SqliteChangesetReader";
|
|
6
|
+
/**
|
|
7
|
+
* Record meta data for the change.
|
|
8
|
+
* @beta
|
|
9
|
+
* */
|
|
10
|
+
export interface ChangeMetaData {
|
|
11
|
+
/** list of tables making up this EC change */
|
|
12
|
+
tables: string[];
|
|
13
|
+
/** full name of the class of this EC change */
|
|
14
|
+
className?: string;
|
|
15
|
+
/** sqlite operation that caused the change */
|
|
16
|
+
op: SqliteChangeOp;
|
|
17
|
+
/** version of the value read from sqlite change */
|
|
18
|
+
stage: SqliteValueStage;
|
|
19
|
+
/** if classId for the change was not found in db then fallback class for the table */
|
|
20
|
+
fallbackClassId?: Id64String;
|
|
21
|
+
/** list of change index making up this change (one per table) */
|
|
22
|
+
changeIndexes: number[];
|
|
23
|
+
}
|
|
24
|
+
/**
|
|
25
|
+
* Represent EC change derived from low level sqlite change
|
|
26
|
+
* @beta
|
|
27
|
+
*/
|
|
28
|
+
export interface ChangedECInstance {
|
|
29
|
+
ECInstanceId: Id64String;
|
|
30
|
+
ECClassId?: Id64String;
|
|
31
|
+
$meta?: ChangeMetaData;
|
|
32
|
+
[key: string]: any;
|
|
33
|
+
}
|
|
34
|
+
/**
|
|
35
|
+
* Combine partial changed instance into single instance.
|
|
36
|
+
* Partial changes is per table and a single instance can
|
|
37
|
+
* span multiple tables.
|
|
38
|
+
* @beta
|
|
39
|
+
*/
|
|
40
|
+
export declare class PartialECChangeUnifier {
|
|
41
|
+
private _cache;
|
|
42
|
+
private _readonly;
|
|
43
|
+
/**
|
|
44
|
+
* Combine partial instance with instance with same key if already exists.
|
|
45
|
+
* @param rhs partial instance
|
|
46
|
+
*/
|
|
47
|
+
private combine;
|
|
48
|
+
/**
|
|
49
|
+
* Build key from EC change.
|
|
50
|
+
* @param change EC change
|
|
51
|
+
* @returns key created from EC change.
|
|
52
|
+
*/
|
|
53
|
+
private static buildKey;
|
|
54
|
+
/**
|
|
55
|
+
* Append partial changes which will be combine using there instance key.
|
|
56
|
+
* @note $meta property must be present on partial change as information
|
|
57
|
+
* in it is used to combine partial instances.
|
|
58
|
+
* @param adaptor changeset adaptor is use to read the partial EC change.
|
|
59
|
+
* @beta
|
|
60
|
+
*/
|
|
61
|
+
appendFrom(adaptor: ChangesetECAdaptor): void;
|
|
62
|
+
/**
|
|
63
|
+
* Delete $meta from all the instances.
|
|
64
|
+
*/
|
|
65
|
+
stripMetaData(): void;
|
|
66
|
+
/**
|
|
67
|
+
* Returns complete EC change instances.
|
|
68
|
+
* @beta
|
|
69
|
+
*/
|
|
70
|
+
get instances(): IterableIterator<ChangedECInstance>;
|
|
71
|
+
}
|
|
72
|
+
/**
|
|
73
|
+
* Transform sqlite change to ec change. EC change is partial change as
|
|
74
|
+
* it is per table while a single instance can span multiple table.
|
|
75
|
+
* @note PrimitiveArray and StructArray are not supported types.
|
|
76
|
+
* @beta
|
|
77
|
+
*
|
|
78
|
+
*/
|
|
79
|
+
export declare class ChangesetECAdaptor implements IDisposable {
|
|
80
|
+
readonly reader: SqliteChangesetReader;
|
|
81
|
+
readonly disableMetaData: boolean;
|
|
82
|
+
private readonly _mapCache;
|
|
83
|
+
private readonly _tableFilter;
|
|
84
|
+
private readonly _opFilter;
|
|
85
|
+
private readonly _classFilter;
|
|
86
|
+
private _allowedClasses;
|
|
87
|
+
/**
|
|
88
|
+
* set debug flags
|
|
89
|
+
*/
|
|
90
|
+
readonly debugFlags: {
|
|
91
|
+
replaceBlobWithEllipsis: boolean;
|
|
92
|
+
replaceGeomWithEllipsis: boolean;
|
|
93
|
+
replaceGuidWithEllipsis: boolean;
|
|
94
|
+
};
|
|
95
|
+
/**
|
|
96
|
+
* Return partial inserted instance
|
|
97
|
+
* For updates inserted represent new version of instance after update.
|
|
98
|
+
*/
|
|
99
|
+
inserted?: ChangedECInstance;
|
|
100
|
+
/**
|
|
101
|
+
* Return partial deleted instance.
|
|
102
|
+
* For updates deleted represent old version of instance before update.
|
|
103
|
+
*/
|
|
104
|
+
deleted?: ChangedECInstance;
|
|
105
|
+
/**
|
|
106
|
+
* Setup filter that will result in change enumeration restricted to
|
|
107
|
+
* list of tables added by acceptTable().
|
|
108
|
+
* @param table Name of the table
|
|
109
|
+
* @returns Fluent reference to ChangesetAdaptor.
|
|
110
|
+
*/
|
|
111
|
+
acceptTable(table: string): ChangesetECAdaptor;
|
|
112
|
+
/**
|
|
113
|
+
* Setup filter that will result in change enumeration restricted to
|
|
114
|
+
* list of op added by acceptOp().
|
|
115
|
+
* @param op
|
|
116
|
+
* @returns Fluent reference to ChangesetAdaptor.
|
|
117
|
+
*/
|
|
118
|
+
acceptOp(op: SqliteChangeOp): ChangesetECAdaptor;
|
|
119
|
+
/**
|
|
120
|
+
* Setup filter that will result in change enumeration restricted to
|
|
121
|
+
* list of class and its derived classes added by acceptClass().
|
|
122
|
+
* @param classFullName
|
|
123
|
+
* @returns
|
|
124
|
+
*/
|
|
125
|
+
acceptClass(classFullName: string): ChangesetECAdaptor;
|
|
126
|
+
private buildClassFilter;
|
|
127
|
+
/**
|
|
128
|
+
* Construct adaptor with a initialized reader.
|
|
129
|
+
* @note the changeset reader must have disableSchemaCheck
|
|
130
|
+
* set to false and db must also be set.
|
|
131
|
+
* @param reader wrap changeset reader.
|
|
132
|
+
*/
|
|
133
|
+
constructor(reader: SqliteChangesetReader, disableMetaData?: boolean);
|
|
134
|
+
/**
|
|
135
|
+
* dispose current instance and it will also dispose the changeset reader.
|
|
136
|
+
*/
|
|
137
|
+
dispose(): void;
|
|
138
|
+
/**
|
|
139
|
+
* close current instance and it will also close the changeset reader.
|
|
140
|
+
*/
|
|
141
|
+
close(): void;
|
|
142
|
+
/**
|
|
143
|
+
* Convert binary GUID into string GUID.
|
|
144
|
+
* @param binaryGUID binary version of guid.
|
|
145
|
+
* @returns GUID string.
|
|
146
|
+
*/
|
|
147
|
+
private static convertBinaryToGuid;
|
|
148
|
+
/**
|
|
149
|
+
* Set value use access string in a JS object.
|
|
150
|
+
* @param targetObj object that will be updated.
|
|
151
|
+
* @param accessString access string token separated by '.'.
|
|
152
|
+
*/
|
|
153
|
+
private static setValue;
|
|
154
|
+
/**
|
|
155
|
+
* Check if sqlite change table is a EC data table
|
|
156
|
+
* @param tableName name of the table.
|
|
157
|
+
* @returns true if table has EC data.
|
|
158
|
+
*/
|
|
159
|
+
isECTable(tableName: string): boolean;
|
|
160
|
+
/**
|
|
161
|
+
* Attempt find ECClassId from ECInstanceId for a change of type 'updated'.
|
|
162
|
+
* @param tableName name of the table to find ECClassId from given ECInstanceId
|
|
163
|
+
* @param instanceId instance id for which we need ECClassId for.
|
|
164
|
+
* @returns if successful returns ECClassId else return undefined.
|
|
165
|
+
*/
|
|
166
|
+
private getClassIdFromDb;
|
|
167
|
+
/** helper method around reader.op */
|
|
168
|
+
get op(): SqliteChangeOp;
|
|
169
|
+
/** Return true if current change is of type "Inserted" */
|
|
170
|
+
get isInserted(): boolean;
|
|
171
|
+
/** Return true if current change is of type "Deleted" */
|
|
172
|
+
get isDeleted(): boolean;
|
|
173
|
+
/** Return true if current change is of type "Updated" */
|
|
174
|
+
get isUpdated(): boolean;
|
|
175
|
+
/**
|
|
176
|
+
* Advance reader to next change or a change that meets the filter set in the current adaptor
|
|
177
|
+
* @returns return false if no more changes to read.
|
|
178
|
+
*/
|
|
179
|
+
step(): boolean;
|
|
180
|
+
/**
|
|
181
|
+
* Transform nav change column into navigation EC property
|
|
182
|
+
* @param prop navigation property definition.
|
|
183
|
+
* @param change sqlite change.
|
|
184
|
+
* @param out ec instance that will be updated with navigation property.
|
|
185
|
+
*/
|
|
186
|
+
private transformNavigationProperty;
|
|
187
|
+
/**
|
|
188
|
+
* Transform sqlite change into EC change.
|
|
189
|
+
* @param classMap classMap use to deserialize sqlite change into EC change.
|
|
190
|
+
* @param change sqlite change from changeset.
|
|
191
|
+
* @param table table definition of sqlite change provided.
|
|
192
|
+
* @param out EC changeset that will be updated with properties.
|
|
193
|
+
*/
|
|
194
|
+
private transform;
|
|
195
|
+
}
|
|
196
|
+
//# sourceMappingURL=ChangesetECAdaptor.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"ChangesetECAdaptor.d.ts","sourceRoot":"","sources":["../../src/ChangesetECAdaptor.ts"],"names":[],"mappings":"AAIA;;GAEG;AACH,OAAO,EAAwB,UAAU,EAAE,WAAW,EAAE,MAAM,qBAAqB,CAAC;AACpF,OAAO,EAAuB,cAAc,EAAE,qBAAqB,EAAE,gBAAgB,EAAE,MAAM,yBAAyB,CAAC;AA+UvH;;;KAGK;AACL,MAAM,WAAW,cAAc;IAC7B,8CAA8C;IAC9C,MAAM,EAAE,MAAM,EAAE,CAAC;IACjB,+CAA+C;IAC/C,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,8CAA8C;IAC9C,EAAE,EAAE,cAAc,CAAC;IACnB,mDAAmD;IACnD,KAAK,EAAE,gBAAgB,CAAC;IACxB,sFAAsF;IACtF,eAAe,CAAC,EAAE,UAAU,CAAC;IAC7B,iEAAiE;IACjE,aAAa,EAAE,MAAM,EAAE,CAAC;CACzB;AAED;;;GAGG;AACH,MAAM,WAAW,iBAAiB;IAEhC,YAAY,EAAE,UAAU,CAAC;IAEzB,SAAS,CAAC,EAAE,UAAU,CAAC;IACvB,KAAK,CAAC,EAAE,cAAc,CAAC;IACvB,CAAC,GAAG,EAAE,MAAM,GAAG,GAAG,CAAC;CACpB;AA4BD;;;;;GAKG;AACH,qBAAa,sBAAsB;IACjC,OAAO,CAAC,MAAM,CAAwC;IACtD,OAAO,CAAC,SAAS,CAAS;IAC1B;;;OAGG;IACH,OAAO,CAAC,OAAO;IAiBf;;;;OAIG;IACH,OAAO,CAAC,MAAM,CAAC,QAAQ;IAGvB;;;;;;OAMG;IACI,UAAU,CAAC,OAAO,EAAE,kBAAkB,GAAG,IAAI;IAgBpD;;OAEG;IACI,aAAa,IAAI,IAAI;IAQ5B;;;OAGG;IACH,IAAW,SAAS,IAAI,gBAAgB,CAAC,iBAAiB,CAAC,CAAiC;CAC7F;AAED;;;;;;EAME;AACF,qBAAa,kBAAmB,YAAW,WAAW;aA4EjB,MAAM,EAAE,qBAAqB;aAAkB,eAAe;IA3EjG,OAAO,CAAC,QAAQ,CAAC,SAAS,CAAU;IACpC,OAAO,CAAC,QAAQ,CAAC,YAAY,CAAqB;IAClD,OAAO,CAAC,QAAQ,CAAC,SAAS,CAA6B;IACvD,OAAO,CAAC,QAAQ,CAAC,YAAY,CAAqB;IAClD,OAAO,CAAC,eAAe,CAAqB;IAC5C;;OAEG;IACH,SAAgB,UAAU;;;;MAIxB;IACF;;;OAGG;IACI,QAAQ,CAAC,EAAE,iBAAiB,CAAC;IACpC;;;OAGG;IACI,OAAO,CAAC,EAAE,iBAAiB,CAAC;IAEnC;;;;;OAKG;IACI,WAAW,CAAC,KAAK,EAAE,MAAM,GAAG,kBAAkB;IAKrD;;;;;OAKG;IACI,QAAQ,CAAC,EAAE,EAAE,cAAc,GAAG,kBAAkB;IAKvD;;;;;OAKG;IACI,WAAW,CAAC,aAAa,EAAE,MAAM,GAAG,kBAAkB;IAO7D,OAAO,CAAC,gBAAgB;IAUxB;;;;;OAKG;gBACgC,MAAM,EAAE,qBAAqB,EAAkB,eAAe,UAAQ;IASzG;;OAEG;IACI,OAAO,IAAI,IAAI;IAGtB;;OAEG;IACI,KAAK,IAAI,IAAI;IAGpB;;;;OAIG;IACH,OAAO,CAAC,MAAM,CAAC,mBAAmB;IAWlC;;;;OAIG;IACH,OAAO,CAAC,MAAM,CAAC,QAAQ;IAoBvB;;;;OAIG;IACI,SAAS,CAAC,SAAS,EAAE,MAAM;IAGlC;;;;;OAKG;IACH,OAAO,CAAC,gBAAgB;IAUxB,qCAAqC;IACrC,IAAW,EAAE,mBAA6B;IAC1C,0DAA0D;IAC1D,IAAW,UAAU,YAAqC;IAC1D,yDAAyD;IACzD,IAAW,SAAS,YAAoC;IACxD,yDAAyD;IACzD,IAAW,SAAS,YAAoC;IAExD;;;OAGG;IACI,IAAI,IAAI,OAAO;IA8GtB;;;;;OAKG;IACH,OAAO,CAAC,2BAA2B;IAuBnC;;;;;;OAMG;IACH,OAAO,CAAC,SAAS;CA6ClB"}
|