@itwin/core-backend 5.10.0-dev.19 → 5.10.0-dev.21

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.
Files changed (81) hide show
  1. package/lib/cjs/BriefcaseManager.d.ts +8 -1
  2. package/lib/cjs/BriefcaseManager.d.ts.map +1 -1
  3. package/lib/cjs/BriefcaseManager.js.map +1 -1
  4. package/lib/cjs/ClassRegistry.d.ts +3 -3
  5. package/lib/cjs/ClassRegistry.js +3 -3
  6. package/lib/cjs/ClassRegistry.js.map +1 -1
  7. package/lib/cjs/Element.d.ts +6 -3
  8. package/lib/cjs/Element.d.ts.map +1 -1
  9. package/lib/cjs/Element.js +6 -3
  10. package/lib/cjs/Element.js.map +1 -1
  11. package/lib/cjs/Entity.d.ts +13 -5
  12. package/lib/cjs/Entity.d.ts.map +1 -1
  13. package/lib/cjs/Entity.js +13 -5
  14. package/lib/cjs/Entity.js.map +1 -1
  15. package/lib/cjs/IModelDb.d.ts +79 -17
  16. package/lib/cjs/IModelDb.d.ts.map +1 -1
  17. package/lib/cjs/IModelDb.js +181 -22
  18. package/lib/cjs/IModelDb.js.map +1 -1
  19. package/lib/cjs/Relationship.d.ts +3 -1
  20. package/lib/cjs/Relationship.d.ts.map +1 -1
  21. package/lib/cjs/Relationship.js +3 -1
  22. package/lib/cjs/Relationship.js.map +1 -1
  23. package/lib/cjs/internal/workspace/WorkspaceImpl.d.ts.map +1 -1
  24. package/lib/cjs/internal/workspace/WorkspaceImpl.js +7 -11
  25. package/lib/cjs/internal/workspace/WorkspaceImpl.js.map +1 -1
  26. package/lib/cjs/workspace/Workspace.d.ts +3 -1
  27. package/lib/cjs/workspace/Workspace.d.ts.map +1 -1
  28. package/lib/cjs/workspace/Workspace.js.map +1 -1
  29. package/lib/esm/BriefcaseManager.d.ts +8 -1
  30. package/lib/esm/BriefcaseManager.d.ts.map +1 -1
  31. package/lib/esm/BriefcaseManager.js.map +1 -1
  32. package/lib/esm/ClassRegistry.d.ts +3 -3
  33. package/lib/esm/ClassRegistry.js +3 -3
  34. package/lib/esm/ClassRegistry.js.map +1 -1
  35. package/lib/esm/Element.d.ts +6 -3
  36. package/lib/esm/Element.d.ts.map +1 -1
  37. package/lib/esm/Element.js +6 -3
  38. package/lib/esm/Element.js.map +1 -1
  39. package/lib/esm/Entity.d.ts +13 -5
  40. package/lib/esm/Entity.d.ts.map +1 -1
  41. package/lib/esm/Entity.js +13 -5
  42. package/lib/esm/Entity.js.map +1 -1
  43. package/lib/esm/IModelDb.d.ts +79 -17
  44. package/lib/esm/IModelDb.d.ts.map +1 -1
  45. package/lib/esm/IModelDb.js +182 -23
  46. package/lib/esm/IModelDb.js.map +1 -1
  47. package/lib/esm/Relationship.d.ts +3 -1
  48. package/lib/esm/Relationship.d.ts.map +1 -1
  49. package/lib/esm/Relationship.js +3 -1
  50. package/lib/esm/Relationship.js.map +1 -1
  51. package/lib/esm/internal/workspace/WorkspaceImpl.d.ts.map +1 -1
  52. package/lib/esm/internal/workspace/WorkspaceImpl.js +7 -11
  53. package/lib/esm/internal/workspace/WorkspaceImpl.js.map +1 -1
  54. package/lib/esm/test/imodel/IModel.test.js +2 -0
  55. package/lib/esm/test/imodel/IModel.test.js.map +1 -1
  56. package/lib/esm/test/schema/ClassRegistry.test.js +3 -0
  57. package/lib/esm/test/schema/ClassRegistry.test.js.map +1 -1
  58. package/lib/esm/test/schema/IModelSchemaContext.test.js +2 -0
  59. package/lib/esm/test/schema/IModelSchemaContext.test.js.map +1 -1
  60. package/lib/esm/test/schema/SchemaViewHidden.test.d.ts +2 -0
  61. package/lib/esm/test/schema/SchemaViewHidden.test.d.ts.map +1 -0
  62. package/lib/esm/test/schema/SchemaViewHidden.test.js +275 -0
  63. package/lib/esm/test/schema/SchemaViewHidden.test.js.map +1 -0
  64. package/lib/esm/test/schema/SchemaViewKoQ.test.d.ts +2 -0
  65. package/lib/esm/test/schema/SchemaViewKoQ.test.d.ts.map +1 -0
  66. package/lib/esm/test/schema/SchemaViewKoQ.test.js +175 -0
  67. package/lib/esm/test/schema/SchemaViewKoQ.test.js.map +1 -0
  68. package/lib/esm/test/schema/SchemaViewLifecycle.test.d.ts +2 -0
  69. package/lib/esm/test/schema/SchemaViewLifecycle.test.d.ts.map +1 -0
  70. package/lib/esm/test/schema/SchemaViewLifecycle.test.js +141 -0
  71. package/lib/esm/test/schema/SchemaViewLifecycle.test.js.map +1 -0
  72. package/lib/esm/test/schema/SchemaViewValidation.test.d.ts +2 -0
  73. package/lib/esm/test/schema/SchemaViewValidation.test.d.ts.map +1 -0
  74. package/lib/esm/test/schema/SchemaViewValidation.test.js +475 -0
  75. package/lib/esm/test/schema/SchemaViewValidation.test.js.map +1 -0
  76. package/lib/esm/test/standalone/Workspace.test.js +23 -0
  77. package/lib/esm/test/standalone/Workspace.test.js.map +1 -1
  78. package/lib/esm/workspace/Workspace.d.ts +3 -1
  79. package/lib/esm/workspace/Workspace.d.ts.map +1 -1
  80. package/lib/esm/workspace/Workspace.js.map +1 -1
  81. package/package.json +14 -14
@@ -1 +1 @@
1
- {"version":3,"file":"WorkspaceImpl.js","sourceRoot":"","sources":["../../../../src/internal/workspace/WorkspaceImpl.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 Workspace\r\n */\r\n\r\nimport { createHash } from \"crypto\";\r\nimport * as fs from \"fs-extra\";\r\nimport { dirname, extname, join } from \"path\";\r\nimport { AccessToken, assert, BeEvent, DbResult, Mutable, OpenMode, ProcessDetector } from \"@itwin/core-bentley\";\r\nimport { CloudSqliteError, FilePropertyProps, LocalDirName, LocalFileName, WorkspaceError } from \"@itwin/core-common\";\r\nimport { CloudSqlite } from \"../../CloudSqlite\";\r\nimport { IModelHost, KnownLocations } from \"../../IModelHost\";\r\nimport { IModelJsFs } from \"../../IModelJsFs\";\r\nimport { SQLiteDb } from \"../../SQLiteDb\";\r\nimport { SqliteStatement } from \"../../SqliteStatement\";\r\nimport { SettingName, Settings, SettingsContainer, SettingsDictionaryProps, SettingsPriority } from \"../../workspace/Settings\";\r\nimport { isSettingsDb, queryStringResourceNames } from \"../../workspace/SettingsDb\";\r\nimport { settingsResourceName } from \"../../workspace/SettingsEditor\";\r\nimport type { IModelJsNative } from \"@bentley/imodeljs-native\";\r\nimport {\r\n GetWorkspaceContainerArgs, Workspace, WorkspaceContainer, WorkspaceContainerId, WorkspaceContainerProps, WorkspaceDb, WorkspaceDbCloudProps,\r\n WorkspaceDbFullName, WorkspaceDbLoadError, WorkspaceDbLoadErrors, WorkspaceDbManifest, WorkspaceDbName, WorkspaceDbNameAndVersion, WorkspaceDbProps,\r\n WorkspaceDbQueryResourcesArgs, WorkspaceDbSettingsProps, WorkspaceDbVersion, WorkspaceOpts, WorkspaceResourceName, WorkspaceSettingNames,\r\n} from \"../../workspace/Workspace\";\r\nimport { CreateNewWorkspaceContainerArgs, CreateNewWorkspaceDbVersionArgs, EditableWorkspaceContainer, EditableWorkspaceDb, WorkspaceEditor, WorkspaceEditor as WorkspaceEditorNs } from \"../../workspace/WorkspaceEditor\";\r\nimport { WorkspaceSqliteDb } from \"./WorkspaceSqliteDb\";\r\nimport { SettingsImpl } from \"./SettingsImpl\";\r\nimport { _implementationProhibited, _nativeDb } from \"../Symbols\";\r\nimport { getOnlineStatus } from \"../OnlineStatus\";\r\nimport { BlobContainer } from \"../../BlobContainerService\";\r\n\r\n\r\nfunction workspaceDbNameWithDefault(dbName?: WorkspaceDbName): WorkspaceDbName {\r\n return dbName ?? \"workspace-db\";\r\n}\r\n\r\n/** file extension for local WorkspaceDbs */\r\nexport const workspaceDbFileExt = \"itwin-workspace\";\r\n\r\ninterface WorkspaceCloudContainer extends CloudSqlite.CloudContainer {\r\n connectCount: number;\r\n sharedConnect(): boolean;\r\n sharedDisconnect(): void;\r\n}\r\n\r\ninterface WorkspaceCloudCache extends CloudSqlite.CloudCache {\r\n workspaceContainers: Map<string, WorkspaceCloudContainer>;\r\n}\r\n\r\nfunction makeWorkspaceCloudCache(arg: CloudSqlite.CreateCloudCacheArg): WorkspaceCloudCache {\r\n const cache = CloudSqlite.CloudCaches.getCache(arg) as WorkspaceCloudCache;\r\n if (undefined === cache.workspaceContainers) // if we just created this container, add the map.\r\n CloudSqlite.addHiddenProperty(cache, \"workspaceContainers\", new Map<string, WorkspaceCloudContainer>());\r\n return cache;\r\n}\r\n\r\nfunction getContainerFullId(props: WorkspaceContainerProps) {\r\n return `${props.baseUri}/${props.containerId}`;\r\n}\r\n\r\nfunction getWorkspaceCloudContainer(props: CloudSqlite.ContainerAccessProps, cache: WorkspaceCloudCache) {\r\n const id = getContainerFullId(props);\r\n let cloudContainer = cache.workspaceContainers.get(id);\r\n if (undefined !== cloudContainer)\r\n return cloudContainer;\r\n\r\n cloudContainer = CloudSqlite.createCloudContainer(props) as WorkspaceCloudContainer;\r\n cache.workspaceContainers.set(id, cloudContainer);\r\n cloudContainer.connectCount = 0;\r\n CloudSqlite.addHiddenProperty(cloudContainer, \"sharedConnect\", function (this: WorkspaceCloudContainer) {\r\n if (this.connectCount++ === 0) {\r\n this.connect(cache);\r\n return true;\r\n }\r\n\r\n return false;\r\n });\r\n\r\n CloudSqlite.addHiddenProperty(cloudContainer, \"sharedDisconnect\", function (this: WorkspaceCloudContainer) {\r\n if (--this.connectCount <= 0) {\r\n this.disconnect();\r\n cache.workspaceContainers.delete(id);\r\n this.connectCount = 0;\r\n }\r\n });\r\n\r\n return cloudContainer;\r\n}\r\n\r\nclass WorkspaceContainerImpl implements WorkspaceContainer {\r\n public readonly [_implementationProhibited] = undefined;\r\n public readonly workspace: WorkspaceImpl;\r\n public readonly filesDir: LocalDirName;\r\n public readonly id: WorkspaceContainerId;\r\n public readonly fromProps: WorkspaceContainerProps;\r\n private readonly _cloudContainer?: WorkspaceCloudContainer | undefined;\r\n\r\n public get cloudContainer(): WorkspaceCloudContainer | undefined {\r\n return this._cloudContainer;\r\n }\r\n\r\n protected _wsDbs = new Map<string, WorkspaceDb>();\r\n public get dirName() { return join(this.workspace.containerDir, this.id); }\r\n\r\n public constructor(workspace: WorkspaceImpl, props: WorkspaceContainerProps & { accessToken: AccessToken }) {\r\n validateWorkspaceContainerId(props.containerId);\r\n this.workspace = workspace;\r\n this.id = props.containerId;\r\n this.fromProps = props;\r\n\r\n if (props.baseUri !== \"\")\r\n this._cloudContainer = getWorkspaceCloudContainer(props, this.workspace.getCloudCache());\r\n\r\n workspace.addContainer(this);\r\n this.filesDir = join(this.dirName, \"Files\");\r\n\r\n const cloudContainer = this.cloudContainer;\r\n if (undefined === cloudContainer)\r\n return;\r\n\r\n // sharedConnect returns true if we just connected (if the container is shared, it may have already been connected)\r\n if (cloudContainer.sharedConnect() && false !== props.syncOnConnect) {\r\n try {\r\n if (ProcessDetector.isMobileAppBackend || ProcessDetector.isElectronAppBackend) {\r\n // Even though we've already confirmed that we are running in a native app backend,\r\n // having code here that references NativeHost causes a runtime exception. So we use\r\n // getOnlineStatus to determine whether we're online, which NativeHost keeps up to date.\r\n if (!getOnlineStatus()) {\r\n // If running in a native app and we're offline, don't check for changes.\r\n // Doing so will fail and be caught below, but it has to wait for the network\r\n // timeout.\r\n return;\r\n }\r\n }\r\n cloudContainer.checkForChanges();\r\n } catch {\r\n // must be offline\r\n }\r\n }\r\n }\r\n\r\n public resolveDbFileName(props: WorkspaceDbProps): WorkspaceDbFullName {\r\n const dbName = workspaceDbNameWithDefault(props.dbName);\r\n const container = this.cloudContainer;\r\n if (undefined === container)\r\n return join(this.dirName, `${dbName}.${workspaceDbFileExt}`); // local file, versions not allowed\r\n\r\n return CloudSqlite.querySemverMatch({ ...props, container, dbName });\r\n }\r\n\r\n public addWorkspaceDb(toAdd: WorkspaceDb) {\r\n if (undefined !== this._wsDbs.get(toAdd.dbFileName))\r\n WorkspaceError.throwError(\"already-exists\", { message: `workspaceDb '${toAdd.dbName}' already exists in workspace` });\r\n this._wsDbs.set(toAdd.dbFileName, toAdd);\r\n }\r\n\r\n public getWorkspaceDb(props?: WorkspaceDbProps): WorkspaceDb {\r\n const dbFileName = this.resolveDbFileName(props ?? {});\r\n return this._wsDbs.get(dbFileName) ?? new WorkspaceDbImpl(props ?? {}, this);\r\n }\r\n\r\n public closeWorkspaceDb(toDrop: WorkspaceDb) {\r\n const wsDb = this._wsDbs.get(toDrop.dbFileName);\r\n if (wsDb === toDrop) {\r\n this._wsDbs.delete(toDrop.dbFileName);\r\n wsDb.close();\r\n }\r\n }\r\n\r\n public close() {\r\n for (const [_name, db] of this._wsDbs)\r\n db.close();\r\n this._wsDbs.clear();\r\n this.cloudContainer?.sharedDisconnect();\r\n }\r\n}\r\n\r\n/** Implementation of WorkspaceDb */\r\nclass WorkspaceDbImpl implements WorkspaceDb {\r\n public readonly [_implementationProhibited] = undefined;\r\n public readonly sqliteDb = new WorkspaceSqliteDb();\r\n public readonly dbName: WorkspaceDbName;\r\n protected readonly _container: WorkspaceContainer;\r\n public readonly onClose = new BeEvent<() => void>();\r\n public readonly dbFileName: string;\r\n protected _manifest?: WorkspaceDbManifest;\r\n\r\n /** true if this WorkspaceDb is currently open */\r\n public get isOpen() { return this.sqliteDb.isOpen; }\r\n public get container(): WorkspaceContainer { return this._container; }\r\n public queryFileResource(rscName: WorkspaceResourceName): { localFileName: LocalFileName, info: IModelJsNative.EmbedFileQuery } | undefined {\r\n const info = this.sqliteDb[_nativeDb].queryEmbeddedFile(rscName);\r\n if (undefined === info)\r\n return undefined;\r\n\r\n // since resource names can contain illegal characters, path separators, etc., we make the local file name from its hash, in hex.\r\n let localFileName = join(this._container.filesDir, createHash(\"sha1\").update(this.dbFileName).update(rscName).digest(\"hex\"));\r\n if (info.fileExt !== \"\") // since some applications may expect to see the extension, append it here if it was supplied.\r\n localFileName = `${localFileName}.${info.fileExt}`;\r\n return { localFileName, info };\r\n }\r\n\r\n public constructor(props: WorkspaceDbProps, container: WorkspaceContainer) {\r\n this.dbName = workspaceDbNameWithDefault(props.dbName);\r\n CloudSqlite.validateDbName(this.dbName);\r\n this._container = container;\r\n this.dbFileName = container.resolveDbFileName(props);\r\n container.addWorkspaceDb(this);\r\n if (true === props.prefetch)\r\n this.prefetch();\r\n }\r\n\r\n public open() {\r\n this.sqliteDb.openDb(this.dbFileName, OpenMode.Readonly, this._container.cloudContainer);\r\n }\r\n\r\n public close() {\r\n if (this.isOpen) {\r\n this.onClose.raiseEvent();\r\n this.sqliteDb.closeDb();\r\n this._container.closeWorkspaceDb(this);\r\n }\r\n }\r\n public get version() {\r\n const cloudContainer = this.container.cloudContainer;\r\n if (undefined === cloudContainer)\r\n return \"1.0.0\"; // local file, no versioning. return default\r\n return CloudSqlite.parseDbFileName(this.dbFileName).version;\r\n }\r\n\r\n public get manifest(): WorkspaceDbManifest {\r\n return this._manifest ??= this.withOpenDb((db) => {\r\n const manifestJson = db[_nativeDb].queryFileProperty(workspaceManifestProperty, true) as string | undefined;\r\n return manifestJson ? JSON.parse(manifestJson) : { workspaceName: this.dbName };\r\n });\r\n }\r\n\r\n private withOpenDb<T>(operation: (db: WorkspaceSqliteDb) => T): T {\r\n const done = this.isOpen ? () => { } : (this.open(), () => this.close());\r\n try {\r\n return operation(this.sqliteDb);\r\n } finally {\r\n done();\r\n }\r\n }\r\n\r\n public getString(rscName: WorkspaceResourceName): string | undefined {\r\n return this.withOpenDb((db) => {\r\n return db.withSqliteStatement(\"SELECT value from strings WHERE id=?\", (stmt) => {\r\n stmt.bindString(1, rscName);\r\n return DbResult.BE_SQLITE_ROW === stmt.step() ? stmt.getValueString(0) : undefined;\r\n });\r\n });\r\n }\r\n\r\n public getBlobReader(rscName: WorkspaceResourceName): SQLiteDb.BlobIO {\r\n return this.sqliteDb.withSqliteStatement(\"SELECT rowid from blobs WHERE id=?\", (stmt) => {\r\n stmt.bindString(1, rscName);\r\n const blobReader = SQLiteDb.createBlobIO();\r\n blobReader.open(this.sqliteDb[_nativeDb], { tableName: \"blobs\", columnName: \"value\", row: stmt.getValueInteger(0) });\r\n return blobReader;\r\n });\r\n }\r\n\r\n public getBlob(rscName: WorkspaceResourceName): Uint8Array | undefined {\r\n return this.withOpenDb((db) => {\r\n return db.withSqliteStatement(\"SELECT value from blobs WHERE id=?\", (stmt) => {\r\n stmt.bindString(1, rscName);\r\n return DbResult.BE_SQLITE_ROW === stmt.step() ? stmt.getValueBlob(0) : undefined;\r\n });\r\n });\r\n }\r\n\r\n public getFile(rscName: WorkspaceResourceName, targetFileName?: LocalFileName): LocalFileName | undefined {\r\n return this.withOpenDb((db) => {\r\n const file = this.queryFileResource(rscName);\r\n if (!file)\r\n return undefined;\r\n\r\n const info = file.info;\r\n const localFileName = targetFileName ?? file.localFileName;\r\n\r\n // check whether the file is already up to date.\r\n const stat = fs.existsSync(localFileName) && fs.statSync(localFileName);\r\n if (stat && Math.round(stat.mtimeMs) === info.date && stat.size === info.size)\r\n return localFileName; // yes, we're done\r\n\r\n // extractEmbeddedFile fails if the file exists or if the directory does not exist\r\n if (stat)\r\n fs.removeSync(localFileName);\r\n else\r\n IModelJsFs.recursiveMkDirSync(dirname(localFileName));\r\n\r\n db[_nativeDb].extractEmbeddedFile({ name: rscName, localFileName });\r\n const date = new Date(info.date);\r\n fs.utimesSync(localFileName, date, date); // set the last-modified date of the file to match date in container\r\n fs.chmodSync(localFileName, \"0444\"); // set file readonly\r\n return localFileName;\r\n });\r\n }\r\n\r\n public prefetch(opts?: CloudSqlite.PrefetchProps): CloudSqlite.CloudPrefetch {\r\n const cloudContainer = this._container.cloudContainer;\r\n if (cloudContainer === undefined)\r\n WorkspaceError.throwError(\"no-cloud-container\", { message: \"no cloud container to prefetch\" });\r\n return CloudSqlite.startCloudPrefetch(cloudContainer, this.dbFileName, opts);\r\n }\r\n\r\n public queryResources(args: WorkspaceDbQueryResourcesArgs): void {\r\n const table = \"blob\" !== args.type ? \"strings\" : \"blobs\";\r\n this.withOpenDb((db) => {\r\n const where = undefined !== args.namePattern ? ` WHERE id ${args.nameCompare ?? \"=\"} ?` : \"\";\r\n db.withSqliteStatement(`SELECT id from ${table}${where}`, (stmt) => {\r\n function* makeIterable() {\r\n while (DbResult.BE_SQLITE_ROW === stmt.step()) {\r\n yield stmt.getValueString(0);\r\n }\r\n }\r\n\r\n if (undefined !== args.namePattern) {\r\n stmt.bindString(1, args.namePattern);\r\n }\r\n\r\n args.callback(makeIterable());\r\n });\r\n });\r\n }\r\n}\r\n\r\n/** Implementation of Workspace */\r\nclass WorkspaceImpl implements Workspace {\r\n public readonly [_implementationProhibited] = undefined;\r\n private _containers = new Map<WorkspaceContainerId, WorkspaceContainerImpl>();\r\n public readonly containerDir: LocalDirName;\r\n public readonly settings: Settings;\r\n protected _cloudCache?: WorkspaceCloudCache;\r\n public getCloudCache(): WorkspaceCloudCache {\r\n return this._cloudCache ??= makeWorkspaceCloudCache({ cacheName: \"Workspace\", cacheSize: \"20G\" });\r\n }\r\n\r\n public constructor(settings: Settings, opts?: WorkspaceOpts) {\r\n this.settings = settings;\r\n this.containerDir = opts?.containerDir ?? join(IModelHost.cacheDir, \"Workspace\");\r\n let settingsFiles = opts?.settingsFiles;\r\n if (settingsFiles) {\r\n if (typeof settingsFiles === \"string\")\r\n settingsFiles = [settingsFiles];\r\n settingsFiles.forEach((file) => settings.addFile(file, SettingsPriority.application));\r\n }\r\n }\r\n\r\n public addContainer(toAdd: WorkspaceContainerImpl) {\r\n if (undefined !== this._containers.get(toAdd.id))\r\n WorkspaceError.throwError(\"container-exists\", { message: `container ${toAdd.id} already exists in workspace` });\r\n this._containers.set(toAdd.id, toAdd);\r\n }\r\n\r\n public findContainer(containerId: WorkspaceContainerId) {\r\n return this._containers.get(containerId);\r\n }\r\n\r\n public getContainer(props: GetWorkspaceContainerArgs): WorkspaceContainer {\r\n return this.findContainer(props.containerId) ?? new WorkspaceContainerImpl(this, props);\r\n }\r\n\r\n public async getContainerAsync(props: WorkspaceContainerProps): Promise<WorkspaceContainer> {\r\n if (props.accessToken)\r\n return this.getContainer({ ...props, accessToken: props.accessToken });\r\n\r\n const accessToken = (props.baseUri === \"\" || props.isPublic)\r\n ? \"\"\r\n : await CloudSqlite.requestToken({ ...props, accessLevel: \"read\" });\r\n return this.getContainer({ ...props, accessToken });\r\n }\r\n\r\n public async getWorkspaceDb(props: WorkspaceDbCloudProps): Promise<WorkspaceDb> {\r\n let container: WorkspaceContainer | undefined = this.findContainer(props.containerId);\r\n if (undefined === container) {\r\n const accessToken = (props.baseUri === \"\" || props.isPublic) ? \"\" : await CloudSqlite.requestToken({ accessLevel: \"read\", ...props });\r\n container = new WorkspaceContainerImpl(this, { ...props, accessToken });\r\n }\r\n return container.getWorkspaceDb(props);\r\n }\r\n\r\n public async loadSettingsDictionary(props: WorkspaceDbSettingsProps | WorkspaceDbSettingsProps[], problems?: WorkspaceDbLoadError[]) {\r\n if (!Array.isArray(props))\r\n props = [props];\r\n\r\n const getSettingsResourceNames = (db: WorkspaceDb, dbProps: WorkspaceDbSettingsProps): WorkspaceResourceName[] => {\r\n if (!isSettingsDb(db))\r\n return [dbProps.resourceName ?? settingsResourceName];\r\n\r\n const all = queryStringResourceNames(db);\r\n // If resourceName is supplied, load it last so it has highest precedence at the same priority.\r\n return dbProps.resourceName !== undefined\r\n ? [...all.filter((name) => name !== dbProps.resourceName), dbProps.resourceName]\r\n : all;\r\n };\r\n\r\n for (const prop of props) {\r\n const db = await this.getWorkspaceDb(prop);\r\n db.open();\r\n try {\r\n const resourceNames = getSettingsResourceNames(db, prop);\r\n\r\n for (const resourceName of resourceNames) {\r\n try {\r\n const manifest = db.manifest;\r\n const dictProps: SettingsDictionaryProps = { name: resourceName, workspaceDb: db, priority: prop.priority };\r\n // don't load if we already have this dictionary. Happens if the same WorkspaceDb is in more than one list\r\n if (undefined === this.settings.getDictionary(dictProps)) {\r\n const settingsJson = db.getString(resourceName);\r\n if (undefined === settingsJson)\r\n throwWorkspaceDbLoadError(`could not load setting dictionary resource '${resourceName}' from: '${manifest.workspaceName}'`, prop, db);\r\n\r\n this.settings.addJson(dictProps, settingsJson);\r\n const dict = this.settings.getDictionary(dictProps);\r\n if (dict) {\r\n Workspace.onSettingsDictionaryLoadedFn({ dict, from: db });\r\n // if the dictionary we just loaded has a \"settingsWorkspaces\" entry, load them too, recursively\r\n const nested = dict.getSetting<WorkspaceDbSettingsProps[]>(WorkspaceSettingNames.settingsWorkspaces);\r\n if (nested !== undefined) {\r\n IModelHost.settingsSchemas.validateSetting<WorkspaceDbSettingsProps[]>(nested, WorkspaceSettingNames.settingsWorkspaces);\r\n await this.loadSettingsDictionary(nested, problems);\r\n }\r\n }\r\n }\r\n } catch (e) {\r\n problems?.push(e as WorkspaceDbLoadError);\r\n }\r\n }\r\n } catch (e) {\r\n problems?.push(e as WorkspaceDbLoadError);\r\n } finally {\r\n db.close();\r\n }\r\n }\r\n }\r\n\r\n public close() {\r\n this.settings.close();\r\n for (const [_id, container] of this._containers)\r\n container.close();\r\n this._containers.clear();\r\n }\r\n\r\n public resolveWorkspaceDbSetting(settingName: SettingName, filter?: Workspace.DbListFilter): WorkspaceDbCloudProps[] {\r\n const settingDef = IModelHost.settingsSchemas.settingDefs.get(settingName);\r\n const combine = settingDef?.combineArray === true;\r\n filter = filter ?? (() => true);\r\n const result: WorkspaceDbCloudProps[] = [];\r\n for (const entry of this.settings.getSettingEntries<WorkspaceDbCloudProps[]>(settingName)) {\r\n for (const dbProp of entry.value) {\r\n if (filter(dbProp, entry.dictionary)) {\r\n result.push(dbProp);\r\n }\r\n }\r\n\r\n if (!combine) {\r\n break;\r\n }\r\n }\r\n\r\n return result;\r\n }\r\n\r\n public async getWorkspaceDbs(args: Workspace.DbListOrSettingName & { filter?: Workspace.DbListFilter, problems?: WorkspaceDbLoadError[] }): Promise<WorkspaceDb[]> {\r\n const dbList = (args.settingName !== undefined) ? this.resolveWorkspaceDbSetting(args.settingName, args.filter) : args.dbs;\r\n const result: WorkspaceDb[] = [];\r\n const pushUnique = (wsDb: WorkspaceDb) => {\r\n for (const db of result) {\r\n // if we already have this db, skip it. The test below also has to consider that we create a separate WorkspaceDb object for the same\r\n // database from more than one Workspace (though then they must use a \"shared\" CloudContainer).\r\n if (db === wsDb || ((db.container.cloudContainer === wsDb.container.cloudContainer) && (db.dbFileName === wsDb.dbFileName)))\r\n return; // this db is redundant\r\n }\r\n result.push(wsDb);\r\n };\r\n\r\n for (const dbProps of dbList) {\r\n try {\r\n pushUnique(await this.getWorkspaceDb(dbProps));\r\n } catch (e) {\r\n const loadErr = e as WorkspaceDbLoadError;\r\n loadErr.wsDbProps = dbProps;\r\n args.problems?.push(loadErr);\r\n }\r\n }\r\n return result;\r\n }\r\n}\r\n\r\nconst workspaceEditorName = \"WorkspaceEditor\"; // name of the cache for the editor workspace\r\nclass EditorWorkspaceImpl extends WorkspaceImpl {\r\n public override getCloudCache(): WorkspaceCloudCache {\r\n return this._cloudCache ??= makeWorkspaceCloudCache({ cacheName: workspaceEditorName, cacheSize: \"20G\" });\r\n }\r\n}\r\n\r\nclass EditorImpl implements WorkspaceEditor {\r\n public readonly [_implementationProhibited] = undefined;\r\n public workspace = new EditorWorkspaceImpl(new SettingsImpl(), { containerDir: join(IModelHost.cacheDir, workspaceEditorName) });\r\n\r\n public async initializeContainer(args: CreateNewWorkspaceContainerArgs) {\r\n class CloudAccess extends CloudSqlite.DbAccess<WorkspaceSqliteDb> {\r\n protected static override _cacheName = workspaceEditorName;\r\n public static async initializeWorkspace(args: CreateNewWorkspaceContainerArgs) {\r\n const props = await this.createBlobContainer({ scope: args.scope, metadata: { ...args.metadata, containerType: args.containerType ?? \"workspace\" } });\r\n const dbFullName = CloudSqlite.makeSemverName(workspaceDbNameWithDefault(args.dbName), \"0.0.0\");\r\n await super._initializeDb({ ...args, props, dbName: dbFullName, dbType: WorkspaceSqliteDb, blockSize: \"4M\" });\r\n return props;\r\n }\r\n }\r\n return CloudAccess.initializeWorkspace(args);\r\n }\r\n\r\n public async createNewCloudContainer(args: CreateNewWorkspaceContainerArgs): Promise<EditableWorkspaceContainer> {\r\n const cloudContainer = await this.initializeContainer(args);\r\n const userToken = await IModelHost.authorizationClient?.getAccessToken();\r\n const accessToken = await CloudSqlite.requestToken({ ...cloudContainer, accessLevel: \"write\", userToken });\r\n return this.getContainer({ accessToken, ...cloudContainer, writeable: true, description: args.metadata.description });\r\n }\r\n\r\n public getContainer(props: GetWorkspaceContainerArgs): EditableWorkspaceContainer {\r\n return this.workspace.findContainer(props.containerId) as EditableWorkspaceContainer | undefined ?? new EditorContainerImpl(this.workspace, props);\r\n }\r\n public async getContainerAsync(props: WorkspaceContainerProps): Promise<EditableWorkspaceContainer> {\r\n if (props.accessToken)\r\n return this.getContainer({ ...props, accessToken: props.accessToken });\r\n\r\n const accessToken = (props.baseUri === \"\")\r\n ? \"\"\r\n : await CloudSqlite.requestToken({ ...props, accessLevel: \"write\" });\r\n return this.getContainer({ ...props, accessToken });\r\n }\r\n\r\n public async findContainers(args: WorkspaceEditorNs.QueryWorkspaceContainersArgs): Promise<EditableWorkspaceContainer[]> {\r\n const containers = await WorkspaceEditorNs.queryContainers(args);\r\n const userToken = await IModelHost.getAccessToken();\r\n const results: EditableWorkspaceContainer[] = [];\r\n for (const containerMeta of containers) {\r\n // queryContainers already validates that BlobContainer.service is defined, so the non-null assertion is safe here.\r\n // eslint-disable-next-line @typescript-eslint/no-non-null-assertion\r\n const tokenProps = await BlobContainer.service!.requestToken({ containerId: containerMeta.containerId, userToken, accessLevel: \"write\" });\r\n results.push(this.getContainer({\r\n containerId: containerMeta.containerId,\r\n baseUri: tokenProps.baseUri,\r\n storageType: tokenProps.provider,\r\n accessToken: tokenProps.token,\r\n writeable: true,\r\n }));\r\n }\r\n return results;\r\n }\r\n\r\n public close() {\r\n this.workspace.close();\r\n }\r\n}\r\n\r\ninterface EditCloudContainer extends WorkspaceCloudContainer {\r\n writeLockHeldBy?: string; // added by acquireWriteLock\r\n}\r\n\r\nclass EditorContainerImpl extends WorkspaceContainerImpl implements EditableWorkspaceContainer {\r\n public override get cloudContainer(): EditCloudContainer | undefined {\r\n return super.cloudContainer;\r\n }\r\n\r\n public get cloudProps(): WorkspaceContainerProps | undefined {\r\n const cloudContainer = this.cloudContainer;\r\n if (undefined === cloudContainer)\r\n return undefined;\r\n return {\r\n baseUri: cloudContainer.baseUri,\r\n containerId: cloudContainer.containerId,\r\n storageType: cloudContainer.storageType as \"azure\" | \"google\",\r\n isPublic: cloudContainer.isPublic,\r\n };\r\n }\r\n\r\n public async createNewWorkspaceDbVersion(args: CreateNewWorkspaceDbVersionArgs): Promise<{ oldDb: WorkspaceDbNameAndVersion, newDb: WorkspaceDbNameAndVersion }> {\r\n const container = this.cloudContainer;\r\n if (undefined === container)\r\n WorkspaceError.throwError(\"no-cloud-container\", { message: \"versions require cloud containers\" });\r\n\r\n const fromDb = { ...args.fromProps, dbName: workspaceDbNameWithDefault(args.fromProps?.dbName) };\r\n return CloudSqlite.createNewDbVersion(container, { ...args, fromDb });\r\n }\r\n\r\n public override getWorkspaceDb(props: WorkspaceDbProps): EditableWorkspaceDb {\r\n return this.getEditableDb(props);\r\n }\r\n\r\n public getEditableDb(props: WorkspaceDbProps): EditableWorkspaceDb {\r\n const dbFileName = this.resolveDbFileName(props);\r\n const db = this._wsDbs.get(dbFileName) as EditableDbImpl | undefined ?? new EditableDbImpl(props, this);\r\n\r\n if (this.cloudContainer && !CloudSqlite.isSemverEditable(db.dbFileName, this.cloudContainer)) {\r\n this._wsDbs.delete(dbFileName);\r\n CloudSqliteError.throwError(\"already-published\", { message: `${db.dbFileName} has been published and is not editable. Make a new version first.` });\r\n }\r\n\r\n return db;\r\n }\r\n\r\n public acquireWriteLock(user: string): void {\r\n if (this.cloudContainer) {\r\n this.cloudContainer.acquireWriteLock(user);\r\n this.cloudContainer.writeLockHeldBy = user;\r\n }\r\n }\r\n public releaseWriteLock() {\r\n if (this.cloudContainer) {\r\n this.cloudContainer.releaseWriteLock();\r\n this.cloudContainer.writeLockHeldBy = undefined;\r\n }\r\n }\r\n\r\n public abandonChanges() {\r\n if (this.cloudContainer) {\r\n this.cloudContainer.abandonChanges();\r\n this.cloudContainer.writeLockHeldBy = undefined;\r\n }\r\n }\r\n\r\n public async withEditableDb(user: string, operation: (db: EditableWorkspaceDb) => void, props?: WorkspaceDbProps): Promise<void> {\r\n this.acquireWriteLock(user);\r\n try {\r\n let db: EditableWorkspaceDb;\r\n try {\r\n db = this.getEditableDb({ ...props, includePrerelease: true });\r\n } catch (error) {\r\n if (!CloudSqliteError.isError(error, \"already-published\"))\r\n throw error;\r\n\r\n const newVersion = await this.createNewWorkspaceDbVersion({\r\n fromProps: props,\r\n versionType: \"prerelease\",\r\n identifier: \"beta\",\r\n });\r\n db = this.getEditableDb(newVersion.newDb);\r\n }\r\n\r\n db.open();\r\n try {\r\n operation(db);\r\n } finally {\r\n db.close();\r\n }\r\n this.releaseWriteLock();\r\n } catch (error) {\r\n this.abandonChanges();\r\n throw error;\r\n }\r\n }\r\n\r\n public async createDb(args: { dbName?: string, version?: WorkspaceDbVersion, manifest: WorkspaceDbManifest }): Promise<EditableWorkspaceDb> {\r\n if (!this.cloudContainer) {\r\n WorkspaceEditor.createEmptyDb({ localFileName: this.resolveDbFileName(args), manifest: args.manifest });\r\n } else {\r\n // currently the only way to create a workspaceDb in a cloud container is to create a temporary workspaceDb and upload it.\r\n const tempDbFile = join(KnownLocations.tmpdir, `empty.${workspaceDbFileExt}`);\r\n if (fs.existsSync(tempDbFile))\r\n IModelJsFs.removeSync(tempDbFile);\r\n\r\n WorkspaceEditor.createEmptyDb({ localFileName: tempDbFile, manifest: args.manifest });\r\n await CloudSqlite.uploadDb(this.cloudContainer, { localFileName: tempDbFile, dbName: CloudSqlite.makeSemverName(workspaceDbNameWithDefault(args.dbName), args.version) });\r\n IModelJsFs.removeSync(tempDbFile);\r\n }\r\n\r\n return this.getWorkspaceDb(args);\r\n }\r\n}\r\n\r\nclass EditableDbImpl extends WorkspaceDbImpl implements EditableWorkspaceDb {\r\n public override get container(): EditableWorkspaceContainer {\r\n assert(this._container instanceof EditorContainerImpl);\r\n return this._container;\r\n }\r\n\r\n private static validateResourceName(name: WorkspaceResourceName) {\r\n if (name.trim() !== name)\r\n WorkspaceError.throwError(\"invalid-name\", { message: \"resource name may not have leading or trailing spaces\" });\r\n\r\n if (name.length > 1024) {\r\n WorkspaceError.throwError(\"invalid-name\", { message: \"resource name too long\" });\r\n }\r\n }\r\n\r\n private validateResourceSize(val: Uint8Array | string) {\r\n const len = typeof val === \"string\" ? val.length : val.byteLength;\r\n if (len > (1024 * 1024 * 1024)) // one gigabyte\r\n WorkspaceError.throwError(\"too-large\", { message: \"value is too large\" });\r\n }\r\n public get cloudProps(): WorkspaceDbCloudProps | undefined {\r\n const props = (this._container as EditorContainerImpl).cloudProps as Mutable<WorkspaceDbCloudProps>;\r\n if (props === undefined)\r\n return undefined;\r\n\r\n const parsed = CloudSqlite.parseDbFileName(this.dbFileName);\r\n return { ...props, dbName: parsed.dbName, version: parsed.version };\r\n }\r\n\r\n public override open() {\r\n this.sqliteDb.openDb(this.dbFileName, OpenMode.ReadWrite, this._container.cloudContainer);\r\n }\r\n\r\n public override close() {\r\n if (this.isOpen) {\r\n // whenever we close an EditableDb, update the name of the last editor in the manifest\r\n const lastEditedBy = (this._container.cloudContainer as any)?.writeLockHeldBy;\r\n if (lastEditedBy !== undefined)\r\n this.updateManifest({ ...this.manifest, lastEditedBy });\r\n\r\n // make sure all changes were saved before we close\r\n this.sqliteDb.saveChanges();\r\n }\r\n super.close();\r\n }\r\n\r\n private getFileModifiedTime(localFileName: LocalFileName): number {\r\n return Math.round(fs.statSync(localFileName).mtimeMs);\r\n }\r\n\r\n private performWriteSql(rscName: WorkspaceResourceName, sql: string, bind?: (stmt: SqliteStatement) => void) {\r\n this.sqliteDb.withSqliteStatement(sql, (stmt) => {\r\n stmt.bindString(1, rscName);\r\n bind?.(stmt);\r\n const rc = stmt.step();\r\n if (DbResult.BE_SQLITE_DONE !== rc) {\r\n if (DbResult.BE_SQLITE_CONSTRAINT_PRIMARYKEY === rc)\r\n WorkspaceError.throwError(\"resource-exists\", { message: `resource \"${rscName}\" already exists` });\r\n\r\n WorkspaceError.throwError(\"write-error\", { message: `workspace [${sql}], rc=${rc}` });\r\n }\r\n });\r\n this.sqliteDb.saveChanges();\r\n }\r\n\r\n public updateManifest(manifest: WorkspaceDbManifest) {\r\n this.sqliteDb[_nativeDb].saveFileProperty(workspaceManifestProperty, JSON.stringify(manifest));\r\n this._manifest = undefined;\r\n }\r\n public updateSettingsResource(settings: SettingsContainer, rscName?: string) {\r\n this.updateString(rscName ?? \"settingsDictionary\", JSON.stringify(settings));\r\n }\r\n public addString(rscName: WorkspaceResourceName, val: string): void {\r\n EditableDbImpl.validateResourceName(rscName);\r\n this.validateResourceSize(val);\r\n this.performWriteSql(rscName, \"INSERT INTO strings(id,value) VALUES(?,?)\", (stmt) => stmt.bindString(2, val));\r\n }\r\n public updateString(rscName: WorkspaceResourceName, val: string): void {\r\n this.validateResourceSize(val);\r\n this.performWriteSql(rscName, \"INSERT INTO strings(id,value) VALUES(?,?) ON CONFLICT(id) DO UPDATE SET value=excluded.value WHERE value!=excluded.value\", (stmt) => stmt.bindString(2, val));\r\n }\r\n public removeString(rscName: WorkspaceResourceName): void {\r\n this.performWriteSql(rscName, \"DELETE FROM strings WHERE id=?\");\r\n }\r\n public addBlob(rscName: WorkspaceResourceName, val: Uint8Array): void {\r\n EditableDbImpl.validateResourceName(rscName);\r\n this.validateResourceSize(val);\r\n this.performWriteSql(rscName, \"INSERT INTO blobs(id,value) VALUES(?,?)\", (stmt) => stmt.bindBlob(2, val));\r\n }\r\n public updateBlob(rscName: WorkspaceResourceName, val: Uint8Array): void {\r\n this.validateResourceSize(val);\r\n this.performWriteSql(rscName, \"INSERT INTO blobs(id,value) VALUES(?,?) ON CONFLICT(id) DO UPDATE SET value=excluded.value WHERE value!=excluded.value\", (stmt) => stmt.bindBlob(2, val));\r\n }\r\n public getBlobWriter(rscName: WorkspaceResourceName): SQLiteDb.BlobIO {\r\n return this.sqliteDb.withSqliteStatement(\"SELECT rowid from blobs WHERE id=?\", (stmt) => {\r\n stmt.bindString(1, rscName);\r\n const blobWriter = SQLiteDb.createBlobIO();\r\n blobWriter.open(this.sqliteDb[_nativeDb], { tableName: \"blobs\", columnName: \"value\", row: stmt.getValueInteger(0), writeable: true });\r\n return blobWriter;\r\n });\r\n }\r\n public removeBlob(rscName: WorkspaceResourceName): void {\r\n this.performWriteSql(rscName, \"DELETE FROM blobs WHERE id=?\");\r\n }\r\n public addFile(rscName: WorkspaceResourceName, localFileName: LocalFileName, fileExt?: string): void {\r\n EditableDbImpl.validateResourceName(rscName);\r\n fileExt = fileExt ?? extname(localFileName);\r\n if (fileExt?.[0] === \".\")\r\n fileExt = fileExt.slice(1);\r\n this.sqliteDb[_nativeDb].embedFile({ name: rscName, localFileName, date: this.getFileModifiedTime(localFileName), fileExt });\r\n }\r\n public updateFile(rscName: WorkspaceResourceName, localFileName: LocalFileName): void {\r\n this.queryFileResource(rscName); // throws if not present\r\n this.sqliteDb[_nativeDb].replaceEmbeddedFile({ name: rscName, localFileName, date: this.getFileModifiedTime(localFileName) });\r\n }\r\n public removeFile(rscName: WorkspaceResourceName): void {\r\n const file = this.queryFileResource(rscName);\r\n if (undefined === file)\r\n WorkspaceError.throwError(\"does-not-exist\", { message: `file resource \"${rscName}\" does not exist` });\r\n if (file && fs.existsSync(file.localFileName))\r\n fs.unlinkSync(file.localFileName);\r\n this.sqliteDb[_nativeDb].removeEmbeddedFile(rscName);\r\n }\r\n}\r\n\r\nexport function constructWorkspaceDb(props: WorkspaceDbProps, container: WorkspaceContainer): WorkspaceDb {\r\n return new WorkspaceDbImpl(props, container);\r\n}\r\n\r\nexport function constructWorkspace(settings: Settings, opts?: WorkspaceOpts): OwnedWorkspace {\r\n return new WorkspaceImpl(settings, opts);\r\n}\r\n\r\nexport function constructWorkspaceEditor(): WorkspaceEditor {\r\n return new EditorImpl();\r\n}\r\n\r\n/**\r\n * Validate that a WorkspaceContainer.Id is valid.\r\n * The rules for ContainerIds (from Azure, see https://docs.microsoft.com/en-us/rest/api/storageservices/naming-and-referencing-containers--blobs--and-metadata):\r\n * - may only contain lower case letters, numbers or dashes\r\n * - may not start or end with with a dash nor have more than one dash in a row\r\n * - may not be shorter than 3 or longer than 63 characters\r\n */\r\nexport function validateWorkspaceContainerId(id: WorkspaceContainerId) {\r\n if (!/^(?=.{3,63}$)[a-z0-9]+(-[a-z0-9]+)*$/g.test(id))\r\n WorkspaceError.throwError(\"invalid-name\", { message: `invalid containerId: [${id}]` });\r\n}\r\n\r\nexport const workspaceManifestProperty: FilePropertyProps = { namespace: \"workspace\", name: \"manifest\" };\r\n\r\n\r\nfunction throwWorkspaceDbLoadError(message: string, wsDbProps: WorkspaceDbProps | WorkspaceDbCloudProps, wsDb?: WorkspaceDb): never {\r\n WorkspaceError.throwError<WorkspaceDbLoadError>(\"load-error\", { message, wsDb, wsDbProps });\r\n}\r\n\r\nexport function throwWorkspaceDbLoadErrors(message: string, wsLoadErrors: WorkspaceDbLoadError[]): never {\r\n WorkspaceError.throwError<WorkspaceDbLoadErrors>(\"load-errors\", { message, wsLoadErrors });\r\n}\r\n\r\nexport interface OwnedWorkspace extends Workspace {\r\n /** Only the owner of a Workspace may close it. */\r\n close(): void;\r\n}\r\n"]}
1
+ {"version":3,"file":"WorkspaceImpl.js","sourceRoot":"","sources":["../../../../src/internal/workspace/WorkspaceImpl.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 Workspace\r\n */\r\n\r\nimport { createHash } from \"crypto\";\r\nimport * as fs from \"fs-extra\";\r\nimport { dirname, extname, join } from \"path\";\r\nimport { AccessToken, assert, BeEvent, DbResult, Mutable, OpenMode, ProcessDetector } from \"@itwin/core-bentley\";\r\nimport { CloudSqliteError, FilePropertyProps, LocalDirName, LocalFileName, WorkspaceError } from \"@itwin/core-common\";\r\nimport { CloudSqlite } from \"../../CloudSqlite\";\r\nimport { IModelHost, KnownLocations } from \"../../IModelHost\";\r\nimport { IModelJsFs } from \"../../IModelJsFs\";\r\nimport { SQLiteDb } from \"../../SQLiteDb\";\r\nimport { SqliteStatement } from \"../../SqliteStatement\";\r\nimport { SettingName, Settings, SettingsContainer, SettingsDictionaryProps, SettingsPriority } from \"../../workspace/Settings\";\r\nimport { isSettingsDb, queryStringResourceNames } from \"../../workspace/SettingsDb\";\r\nimport { settingsResourceName } from \"../../workspace/SettingsEditor\";\r\nimport type { IModelJsNative } from \"@bentley/imodeljs-native\";\r\nimport {\r\n GetWorkspaceContainerArgs, Workspace, WorkspaceContainer, WorkspaceContainerId, WorkspaceContainerProps, WorkspaceDb, WorkspaceDbCloudProps,\r\n WorkspaceDbFullName, WorkspaceDbLoadError, WorkspaceDbLoadErrors, WorkspaceDbManifest, WorkspaceDbName, WorkspaceDbNameAndVersion, WorkspaceDbProps,\r\n WorkspaceDbQueryResourcesArgs, WorkspaceDbSettingsProps, WorkspaceDbVersion, WorkspaceOpts, WorkspaceResourceName, WorkspaceSettingNames,\r\n} from \"../../workspace/Workspace\";\r\nimport { CreateNewWorkspaceContainerArgs, CreateNewWorkspaceDbVersionArgs, EditableWorkspaceContainer, EditableWorkspaceDb, WorkspaceEditor, WorkspaceEditor as WorkspaceEditorNs } from \"../../workspace/WorkspaceEditor\";\r\nimport { WorkspaceSqliteDb } from \"./WorkspaceSqliteDb\";\r\nimport { SettingsImpl } from \"./SettingsImpl\";\r\nimport { _implementationProhibited, _nativeDb } from \"../Symbols\";\r\nimport { getOnlineStatus } from \"../OnlineStatus\";\r\nimport { BlobContainer } from \"../../BlobContainerService\";\r\n\r\n\r\nfunction workspaceDbNameWithDefault(dbName?: WorkspaceDbName): WorkspaceDbName {\r\n return dbName ?? \"workspace-db\";\r\n}\r\n\r\n/** file extension for local WorkspaceDbs */\r\nexport const workspaceDbFileExt = \"itwin-workspace\";\r\n\r\ninterface WorkspaceCloudContainer extends CloudSqlite.CloudContainer {\r\n connectCount: number;\r\n sharedConnect(): boolean;\r\n sharedDisconnect(): void;\r\n}\r\n\r\ninterface WorkspaceCloudCache extends CloudSqlite.CloudCache {\r\n workspaceContainers: Map<string, WorkspaceCloudContainer>;\r\n}\r\n\r\nfunction makeWorkspaceCloudCache(arg: CloudSqlite.CreateCloudCacheArg): WorkspaceCloudCache {\r\n const cache = CloudSqlite.CloudCaches.getCache(arg) as WorkspaceCloudCache;\r\n if (undefined === cache.workspaceContainers) // if we just created this container, add the map.\r\n CloudSqlite.addHiddenProperty(cache, \"workspaceContainers\", new Map<string, WorkspaceCloudContainer>());\r\n return cache;\r\n}\r\n\r\nfunction getContainerFullId(props: WorkspaceContainerProps) {\r\n return `${props.baseUri}/${props.containerId}`;\r\n}\r\n\r\nfunction getWorkspaceCloudContainer(props: CloudSqlite.ContainerAccessProps, cache: WorkspaceCloudCache) {\r\n const id = getContainerFullId(props);\r\n let cloudContainer = cache.workspaceContainers.get(id);\r\n if (undefined !== cloudContainer)\r\n return cloudContainer;\r\n\r\n cloudContainer = CloudSqlite.createCloudContainer(props) as WorkspaceCloudContainer;\r\n cache.workspaceContainers.set(id, cloudContainer);\r\n cloudContainer.connectCount = 0;\r\n CloudSqlite.addHiddenProperty(cloudContainer, \"sharedConnect\", function (this: WorkspaceCloudContainer) {\r\n if (this.connectCount++ === 0) {\r\n this.connect(cache);\r\n return true;\r\n }\r\n\r\n return false;\r\n });\r\n\r\n CloudSqlite.addHiddenProperty(cloudContainer, \"sharedDisconnect\", function (this: WorkspaceCloudContainer) {\r\n if (--this.connectCount <= 0) {\r\n this.disconnect();\r\n cache.workspaceContainers.delete(id);\r\n this.connectCount = 0;\r\n }\r\n });\r\n\r\n return cloudContainer;\r\n}\r\n\r\nclass WorkspaceContainerImpl implements WorkspaceContainer {\r\n public readonly [_implementationProhibited] = undefined;\r\n public readonly workspace: WorkspaceImpl;\r\n public readonly filesDir: LocalDirName;\r\n public readonly id: WorkspaceContainerId;\r\n public readonly fromProps: WorkspaceContainerProps;\r\n private readonly _cloudContainer?: WorkspaceCloudContainer | undefined;\r\n\r\n public get cloudContainer(): WorkspaceCloudContainer | undefined {\r\n return this._cloudContainer;\r\n }\r\n\r\n protected _wsDbs = new Map<string, WorkspaceDb>();\r\n public get dirName() { return join(this.workspace.containerDir, this.id); }\r\n\r\n public constructor(workspace: WorkspaceImpl, props: WorkspaceContainerProps & { accessToken: AccessToken }) {\r\n validateWorkspaceContainerId(props.containerId);\r\n this.workspace = workspace;\r\n this.id = props.containerId;\r\n this.fromProps = props;\r\n\r\n if (props.baseUri !== \"\")\r\n this._cloudContainer = getWorkspaceCloudContainer(props, this.workspace.getCloudCache());\r\n\r\n workspace.addContainer(this);\r\n this.filesDir = join(this.dirName, \"Files\");\r\n\r\n const cloudContainer = this.cloudContainer;\r\n if (undefined === cloudContainer)\r\n return;\r\n\r\n // sharedConnect returns true if we just connected (if the container is shared, it may have already been connected)\r\n if (cloudContainer.sharedConnect() && false !== props.syncOnConnect) {\r\n try {\r\n if (ProcessDetector.isMobileAppBackend || ProcessDetector.isElectronAppBackend) {\r\n // Even though we've already confirmed that we are running in a native app backend,\r\n // having code here that references NativeHost causes a runtime exception. So we use\r\n // getOnlineStatus to determine whether we're online, which NativeHost keeps up to date.\r\n if (!getOnlineStatus()) {\r\n // If running in a native app and we're offline, don't check for changes.\r\n // Doing so will fail and be caught below, but it has to wait for the network\r\n // timeout.\r\n return;\r\n }\r\n }\r\n cloudContainer.checkForChanges();\r\n } catch {\r\n // must be offline\r\n }\r\n }\r\n }\r\n\r\n public resolveDbFileName(props: WorkspaceDbProps): WorkspaceDbFullName {\r\n const dbName = workspaceDbNameWithDefault(props.dbName);\r\n const container = this.cloudContainer;\r\n if (undefined === container)\r\n return join(this.dirName, `${dbName}.${workspaceDbFileExt}`); // local file, versions not allowed\r\n\r\n return CloudSqlite.querySemverMatch({ ...props, container, dbName });\r\n }\r\n\r\n public addWorkspaceDb(toAdd: WorkspaceDb) {\r\n if (undefined !== this._wsDbs.get(toAdd.dbFileName))\r\n WorkspaceError.throwError(\"already-exists\", { message: `workspaceDb '${toAdd.dbName}' already exists in workspace` });\r\n this._wsDbs.set(toAdd.dbFileName, toAdd);\r\n }\r\n\r\n public getWorkspaceDb(props?: WorkspaceDbProps): WorkspaceDb {\r\n const dbFileName = this.resolveDbFileName(props ?? {});\r\n return this._wsDbs.get(dbFileName) ?? new WorkspaceDbImpl(props ?? {}, this);\r\n }\r\n\r\n public closeWorkspaceDb(toDrop: WorkspaceDb) {\r\n const wsDb = this._wsDbs.get(toDrop.dbFileName);\r\n if (wsDb === toDrop) {\r\n this._wsDbs.delete(toDrop.dbFileName);\r\n wsDb.close();\r\n }\r\n }\r\n\r\n public close() {\r\n for (const [_name, db] of this._wsDbs)\r\n db.close();\r\n this._wsDbs.clear();\r\n this.cloudContainer?.sharedDisconnect();\r\n }\r\n}\r\n\r\n/** Implementation of WorkspaceDb */\r\nclass WorkspaceDbImpl implements WorkspaceDb {\r\n public readonly [_implementationProhibited] = undefined;\r\n public readonly sqliteDb = new WorkspaceSqliteDb();\r\n public readonly dbName: WorkspaceDbName;\r\n protected readonly _container: WorkspaceContainer;\r\n public readonly onClose = new BeEvent<() => void>();\r\n public readonly dbFileName: string;\r\n protected _manifest?: WorkspaceDbManifest;\r\n\r\n /** true if this WorkspaceDb is currently open */\r\n public get isOpen() { return this.sqliteDb.isOpen; }\r\n public get container(): WorkspaceContainer { return this._container; }\r\n public queryFileResource(rscName: WorkspaceResourceName): { localFileName: LocalFileName, info: IModelJsNative.EmbedFileQuery } | undefined {\r\n const info = this.sqliteDb[_nativeDb].queryEmbeddedFile(rscName);\r\n if (undefined === info)\r\n return undefined;\r\n\r\n // since resource names can contain illegal characters, path separators, etc., we make the local file name from its hash, in hex.\r\n let localFileName = join(this._container.filesDir, createHash(\"sha1\").update(this.dbFileName).update(rscName).digest(\"hex\"));\r\n if (info.fileExt !== \"\") // since some applications may expect to see the extension, append it here if it was supplied.\r\n localFileName = `${localFileName}.${info.fileExt}`;\r\n return { localFileName, info };\r\n }\r\n\r\n public constructor(props: WorkspaceDbProps, container: WorkspaceContainer) {\r\n this.dbName = workspaceDbNameWithDefault(props.dbName);\r\n CloudSqlite.validateDbName(this.dbName);\r\n this._container = container;\r\n this.dbFileName = container.resolveDbFileName(props);\r\n container.addWorkspaceDb(this);\r\n if (true === props.prefetch)\r\n this.prefetch();\r\n }\r\n\r\n public open() {\r\n this.sqliteDb.openDb(this.dbFileName, OpenMode.Readonly, this._container.cloudContainer);\r\n }\r\n\r\n public close() {\r\n if (this.isOpen) {\r\n this.onClose.raiseEvent();\r\n this.sqliteDb.closeDb();\r\n this._container.closeWorkspaceDb(this);\r\n }\r\n }\r\n public get version() {\r\n const cloudContainer = this.container.cloudContainer;\r\n if (undefined === cloudContainer)\r\n return \"1.0.0\"; // local file, no versioning. return default\r\n return CloudSqlite.parseDbFileName(this.dbFileName).version;\r\n }\r\n\r\n public get manifest(): WorkspaceDbManifest {\r\n return this._manifest ??= this.withOpenDb((db) => {\r\n const manifestJson = db[_nativeDb].queryFileProperty(workspaceManifestProperty, true) as string | undefined;\r\n return manifestJson ? JSON.parse(manifestJson) : { workspaceName: this.dbName };\r\n });\r\n }\r\n\r\n private withOpenDb<T>(operation: (db: WorkspaceSqliteDb) => T): T {\r\n const done = this.isOpen ? () => { } : (this.open(), () => this.close());\r\n try {\r\n return operation(this.sqliteDb);\r\n } finally {\r\n done();\r\n }\r\n }\r\n\r\n public getString(rscName: WorkspaceResourceName): string | undefined {\r\n return this.withOpenDb((db) => {\r\n return db.withSqliteStatement(\"SELECT value from strings WHERE id=?\", (stmt) => {\r\n stmt.bindString(1, rscName);\r\n return DbResult.BE_SQLITE_ROW === stmt.step() ? stmt.getValueString(0) : undefined;\r\n });\r\n });\r\n }\r\n\r\n public getBlobReader(rscName: WorkspaceResourceName): SQLiteDb.BlobIO {\r\n return this.sqliteDb.withSqliteStatement(\"SELECT rowid from blobs WHERE id=?\", (stmt) => {\r\n stmt.bindString(1, rscName);\r\n const blobReader = SQLiteDb.createBlobIO();\r\n blobReader.open(this.sqliteDb[_nativeDb], { tableName: \"blobs\", columnName: \"value\", row: stmt.getValueInteger(0) });\r\n return blobReader;\r\n });\r\n }\r\n\r\n public getBlob(rscName: WorkspaceResourceName): Uint8Array | undefined {\r\n return this.withOpenDb((db) => {\r\n return db.withSqliteStatement(\"SELECT value from blobs WHERE id=?\", (stmt) => {\r\n stmt.bindString(1, rscName);\r\n return DbResult.BE_SQLITE_ROW === stmt.step() ? stmt.getValueBlob(0) : undefined;\r\n });\r\n });\r\n }\r\n\r\n public getFile(rscName: WorkspaceResourceName, targetFileName?: LocalFileName): LocalFileName | undefined {\r\n return this.withOpenDb((db) => {\r\n const file = this.queryFileResource(rscName);\r\n if (!file)\r\n return undefined;\r\n\r\n const info = file.info;\r\n const localFileName = targetFileName ?? file.localFileName;\r\n\r\n // check whether the file is already up to date.\r\n const stat = fs.existsSync(localFileName) && fs.statSync(localFileName);\r\n if (stat && Math.round(stat.mtimeMs) === info.date && stat.size === info.size)\r\n return localFileName; // yes, we're done\r\n\r\n // extractEmbeddedFile fails if the file exists or if the directory does not exist\r\n if (stat)\r\n fs.removeSync(localFileName);\r\n else\r\n IModelJsFs.recursiveMkDirSync(dirname(localFileName));\r\n\r\n db[_nativeDb].extractEmbeddedFile({ name: rscName, localFileName });\r\n const date = new Date(info.date);\r\n fs.utimesSync(localFileName, date, date); // set the last-modified date of the file to match date in container\r\n fs.chmodSync(localFileName, \"0444\"); // set file readonly\r\n return localFileName;\r\n });\r\n }\r\n\r\n public prefetch(opts?: CloudSqlite.PrefetchProps): CloudSqlite.CloudPrefetch {\r\n const cloudContainer = this._container.cloudContainer;\r\n if (cloudContainer === undefined)\r\n WorkspaceError.throwError(\"no-cloud-container\", { message: \"no cloud container to prefetch\" });\r\n return CloudSqlite.startCloudPrefetch(cloudContainer, this.dbFileName, opts);\r\n }\r\n\r\n public queryResources(args: WorkspaceDbQueryResourcesArgs): void {\r\n const table = \"blob\" !== args.type ? \"strings\" : \"blobs\";\r\n this.withOpenDb((db) => {\r\n const where = undefined !== args.namePattern ? ` WHERE id ${args.nameCompare ?? \"=\"} ?` : \"\";\r\n db.withSqliteStatement(`SELECT id from ${table}${where}`, (stmt) => {\r\n function* makeIterable() {\r\n while (DbResult.BE_SQLITE_ROW === stmt.step()) {\r\n yield stmt.getValueString(0);\r\n }\r\n }\r\n\r\n if (undefined !== args.namePattern) {\r\n stmt.bindString(1, args.namePattern);\r\n }\r\n\r\n args.callback(makeIterable());\r\n });\r\n });\r\n }\r\n}\r\n\r\n/** Implementation of Workspace */\r\nclass WorkspaceImpl implements Workspace {\r\n public readonly [_implementationProhibited] = undefined;\r\n private _containers = new Map<WorkspaceContainerId, WorkspaceContainerImpl>();\r\n public readonly containerDir: LocalDirName;\r\n public readonly settings: Settings;\r\n protected _cloudCache?: WorkspaceCloudCache;\r\n public getCloudCache(): WorkspaceCloudCache {\r\n return this._cloudCache ??= makeWorkspaceCloudCache({ cacheName: \"Workspace\", cacheSize: \"20G\" });\r\n }\r\n\r\n public constructor(settings: Settings, opts?: WorkspaceOpts) {\r\n this.settings = settings;\r\n this.containerDir = opts?.containerDir ?? join(IModelHost.cacheDir, \"Workspace\");\r\n let settingsFiles = opts?.settingsFiles;\r\n if (settingsFiles) {\r\n if (typeof settingsFiles === \"string\")\r\n settingsFiles = [settingsFiles];\r\n settingsFiles.forEach((file) => settings.addFile(file, SettingsPriority.application));\r\n }\r\n }\r\n\r\n public addContainer(toAdd: WorkspaceContainerImpl) {\r\n if (undefined !== this._containers.get(toAdd.id))\r\n WorkspaceError.throwError(\"container-exists\", { message: `container ${toAdd.id} already exists in workspace` });\r\n this._containers.set(toAdd.id, toAdd);\r\n }\r\n\r\n public findContainer(containerId: WorkspaceContainerId) {\r\n return this._containers.get(containerId);\r\n }\r\n\r\n public getContainer(props: GetWorkspaceContainerArgs): WorkspaceContainer {\r\n return this.findContainer(props.containerId) ?? new WorkspaceContainerImpl(this, props);\r\n }\r\n\r\n public async getContainerAsync(props: WorkspaceContainerProps): Promise<WorkspaceContainer> {\r\n if (props.accessToken)\r\n return this.getContainer({ ...props, accessToken: props.accessToken });\r\n\r\n const accessToken = (props.baseUri === \"\" || props.isPublic)\r\n ? \"\"\r\n : await CloudSqlite.requestToken({ ...props, accessLevel: \"read\" });\r\n return this.getContainer({ ...props, accessToken });\r\n }\r\n\r\n public async getWorkspaceDb(props: WorkspaceDbCloudProps): Promise<WorkspaceDb> {\r\n let container: WorkspaceContainer | undefined = this.findContainer(props.containerId);\r\n if (undefined === container) {\r\n const accessToken = (props.baseUri === \"\" || props.isPublic) ? \"\" : await CloudSqlite.requestToken({ accessLevel: \"read\", ...props });\r\n container = new WorkspaceContainerImpl(this, { ...props, accessToken });\r\n }\r\n return container.getWorkspaceDb(props);\r\n }\r\n\r\n public async loadSettingsDictionary(props: WorkspaceDbSettingsProps | WorkspaceDbSettingsProps[], problems?: WorkspaceDbLoadError[]) {\r\n if (!Array.isArray(props))\r\n props = [props];\r\n\r\n const getSettingsResourceNames = (db: WorkspaceDb, dbProps: WorkspaceDbSettingsProps): WorkspaceResourceName[] => {\r\n if (!isSettingsDb(db))\r\n return [dbProps.resourceName ?? settingsResourceName];\r\n\r\n const all = queryStringResourceNames(db);\r\n // If resourceName is supplied, load it last so it has highest precedence at the same priority.\r\n return dbProps.resourceName !== undefined\r\n ? [...all.filter((name) => name !== dbProps.resourceName), dbProps.resourceName]\r\n : all;\r\n };\r\n\r\n for (const prop of props) {\r\n const db = await this.getWorkspaceDb(prop);\r\n db.open();\r\n try {\r\n const resourceNames = getSettingsResourceNames(db, prop);\r\n\r\n for (const resourceName of resourceNames) {\r\n try {\r\n const manifest = db.manifest;\r\n const dictProps: SettingsDictionaryProps = { name: resourceName, workspaceDb: db, priority: prop.priority };\r\n // don't load if we already have this dictionary. Happens if the same WorkspaceDb is in more than one list\r\n if (undefined === this.settings.getDictionary(dictProps)) {\r\n const settingsJson = db.getString(resourceName);\r\n if (undefined === settingsJson)\r\n throwWorkspaceDbLoadError(`could not load setting dictionary resource '${resourceName}' from: '${manifest.workspaceName}'`, prop, db);\r\n\r\n this.settings.addJson(dictProps, settingsJson);\r\n const dict = this.settings.getDictionary(dictProps);\r\n if (dict) {\r\n Workspace.onSettingsDictionaryLoadedFn({ dict, from: db });\r\n // if the dictionary we just loaded has a \"settingsWorkspaces\" entry, load them too, recursively\r\n const nested = dict.getSetting<WorkspaceDbSettingsProps[]>(WorkspaceSettingNames.settingsWorkspaces);\r\n if (nested !== undefined) {\r\n IModelHost.settingsSchemas.validateSetting<WorkspaceDbSettingsProps[]>(nested, WorkspaceSettingNames.settingsWorkspaces);\r\n await this.loadSettingsDictionary(nested, problems);\r\n }\r\n }\r\n }\r\n } catch (e) {\r\n problems?.push(e as WorkspaceDbLoadError);\r\n }\r\n }\r\n } catch (e) {\r\n problems?.push(e as WorkspaceDbLoadError);\r\n } finally {\r\n db.close();\r\n }\r\n }\r\n }\r\n\r\n public close() {\r\n this.settings.close();\r\n for (const [_id, container] of this._containers)\r\n container.close();\r\n this._containers.clear();\r\n }\r\n\r\n public resolveWorkspaceDbSetting(settingName: SettingName, filter?: Workspace.DbListFilter): WorkspaceDbCloudProps[] {\r\n const settingDef = IModelHost.settingsSchemas.settingDefs.get(settingName);\r\n const combine = settingDef?.combineArray === true;\r\n filter = filter ?? (() => true);\r\n const result: WorkspaceDbCloudProps[] = [];\r\n for (const entry of this.settings.getSettingEntries<WorkspaceDbCloudProps[]>(settingName)) {\r\n for (const dbProp of entry.value) {\r\n if (filter(dbProp, entry.dictionary)) {\r\n result.push(dbProp);\r\n }\r\n }\r\n\r\n if (!combine) {\r\n break;\r\n }\r\n }\r\n\r\n return result;\r\n }\r\n\r\n public async getWorkspaceDbs(args: Workspace.DbListOrSettingName & { filter?: Workspace.DbListFilter, problems?: WorkspaceDbLoadError[] }): Promise<WorkspaceDb[]> {\r\n const dbList = (args.settingName !== undefined) ? this.resolveWorkspaceDbSetting(args.settingName, args.filter) : args.dbs;\r\n const result: WorkspaceDb[] = [];\r\n const pushUnique = (wsDb: WorkspaceDb) => {\r\n for (const db of result) {\r\n // if we already have this db, skip it. The test below also has to consider that we create a separate WorkspaceDb object for the same\r\n // database from more than one Workspace (though then they must use a \"shared\" CloudContainer).\r\n if (db === wsDb || ((db.container.cloudContainer === wsDb.container.cloudContainer) && (db.dbFileName === wsDb.dbFileName)))\r\n return; // this db is redundant\r\n }\r\n result.push(wsDb);\r\n };\r\n\r\n for (const dbProps of dbList) {\r\n try {\r\n pushUnique(await this.getWorkspaceDb(dbProps));\r\n } catch (e) {\r\n const loadErr = e as WorkspaceDbLoadError;\r\n loadErr.wsDbProps = dbProps;\r\n args.problems?.push(loadErr);\r\n }\r\n }\r\n return result;\r\n }\r\n}\r\n\r\nconst workspaceEditorName = \"WorkspaceEditor\"; // name of the cache for the editor workspace\r\nclass EditorWorkspaceImpl extends WorkspaceImpl {\r\n public override getCloudCache(): WorkspaceCloudCache {\r\n return this._cloudCache ??= makeWorkspaceCloudCache({ cacheName: workspaceEditorName, cacheSize: \"20G\" });\r\n }\r\n}\r\n\r\nclass EditorImpl implements WorkspaceEditor {\r\n public readonly [_implementationProhibited] = undefined;\r\n public workspace = new EditorWorkspaceImpl(new SettingsImpl(), { containerDir: join(IModelHost.cacheDir, workspaceEditorName) });\r\n\r\n public async initializeContainer(args: CreateNewWorkspaceContainerArgs) {\r\n class CloudAccess extends CloudSqlite.DbAccess<WorkspaceSqliteDb> {\r\n protected static override _cacheName = workspaceEditorName;\r\n public static async initializeWorkspace(args: CreateNewWorkspaceContainerArgs) {\r\n const props = await this.createBlobContainer({ scope: args.scope, metadata: { ...args.metadata, containerType: args.containerType ?? \"workspace\" } });\r\n const dbFullName = CloudSqlite.makeSemverName(workspaceDbNameWithDefault(args.dbName), \"0.0.0\");\r\n await super._initializeDb({ ...args, props, dbName: dbFullName, dbType: WorkspaceSqliteDb, blockSize: \"4M\" });\r\n return props;\r\n }\r\n }\r\n return CloudAccess.initializeWorkspace(args);\r\n }\r\n\r\n public async createNewCloudContainer(args: CreateNewWorkspaceContainerArgs): Promise<EditableWorkspaceContainer> {\r\n const cloudContainer = await this.initializeContainer(args);\r\n const userToken = await IModelHost.authorizationClient?.getAccessToken();\r\n const accessToken = await CloudSqlite.requestToken({ ...cloudContainer, accessLevel: \"write\", userToken });\r\n return this.getContainer({ accessToken, ...cloudContainer, writeable: true, description: args.metadata.description });\r\n }\r\n\r\n public getContainer(props: GetWorkspaceContainerArgs): EditableWorkspaceContainer {\r\n return this.workspace.findContainer(props.containerId) as EditableWorkspaceContainer | undefined ?? new EditorContainerImpl(this.workspace, props);\r\n }\r\n public async getContainerAsync(props: WorkspaceContainerProps): Promise<EditableWorkspaceContainer> {\r\n if (props.accessToken)\r\n return this.getContainer({ ...props, accessToken: props.accessToken });\r\n\r\n const accessToken = (props.baseUri === \"\")\r\n ? \"\"\r\n : await CloudSqlite.requestToken({ ...props, accessLevel: \"write\" });\r\n return this.getContainer({ ...props, accessToken });\r\n }\r\n\r\n public async findContainers(args: WorkspaceEditorNs.QueryWorkspaceContainersArgs): Promise<EditableWorkspaceContainer[]> {\r\n const containers = await WorkspaceEditorNs.queryContainers(args);\r\n const userToken = await IModelHost.getAccessToken();\r\n const results: EditableWorkspaceContainer[] = [];\r\n for (const containerMeta of containers) {\r\n // queryContainers already validates that BlobContainer.service is defined, so the non-null assertion is safe here.\r\n // eslint-disable-next-line @typescript-eslint/no-non-null-assertion\r\n const tokenProps = await BlobContainer.service!.requestToken({ containerId: containerMeta.containerId, userToken, accessLevel: \"write\" });\r\n results.push(this.getContainer({\r\n containerId: containerMeta.containerId,\r\n baseUri: tokenProps.baseUri,\r\n storageType: tokenProps.provider,\r\n accessToken: tokenProps.token,\r\n writeable: true,\r\n }));\r\n }\r\n return results;\r\n }\r\n\r\n public close() {\r\n this.workspace.close();\r\n }\r\n}\r\n\r\nclass EditorContainerImpl extends WorkspaceContainerImpl implements EditableWorkspaceContainer {\r\n public get cloudProps(): WorkspaceContainerProps | undefined {\r\n const cloudContainer = this.cloudContainer;\r\n if (undefined === cloudContainer)\r\n return undefined;\r\n return {\r\n baseUri: cloudContainer.baseUri,\r\n containerId: cloudContainer.containerId,\r\n storageType: cloudContainer.storageType as \"azure\" | \"google\",\r\n isPublic: cloudContainer.isPublic,\r\n };\r\n }\r\n\r\n public async createNewWorkspaceDbVersion(args: CreateNewWorkspaceDbVersionArgs): Promise<{ oldDb: WorkspaceDbNameAndVersion, newDb: WorkspaceDbNameAndVersion }> {\r\n const container = this.cloudContainer;\r\n if (undefined === container)\r\n WorkspaceError.throwError(\"no-cloud-container\", { message: \"versions require cloud containers\" });\r\n\r\n const fromDb = { ...args.fromProps, dbName: workspaceDbNameWithDefault(args.fromProps?.dbName) };\r\n return CloudSqlite.createNewDbVersion(container, { ...args, fromDb });\r\n }\r\n\r\n public override getWorkspaceDb(props: WorkspaceDbProps): EditableWorkspaceDb {\r\n return this.getEditableDb(props);\r\n }\r\n\r\n public getEditableDb(props: WorkspaceDbProps): EditableWorkspaceDb {\r\n const dbFileName = this.resolveDbFileName(props);\r\n const db = this._wsDbs.get(dbFileName) as EditableDbImpl | undefined ?? new EditableDbImpl(props, this);\r\n\r\n if (this.cloudContainer && !CloudSqlite.isSemverEditable(db.dbFileName, this.cloudContainer)) {\r\n this._wsDbs.delete(dbFileName);\r\n CloudSqliteError.throwError(\"already-published\", { message: `${db.dbFileName} has been published and is not editable. Make a new version first.` });\r\n }\r\n\r\n return db;\r\n }\r\n\r\n public acquireWriteLock(user: string): void {\r\n if (this.cloudContainer) {\r\n this.cloudContainer.acquireWriteLock(user);\r\n CloudSqlite.addHiddenProperty(this.cloudContainer, \"writeLockHeldBy\", user);\r\n }\r\n }\r\n public releaseWriteLock() {\r\n if (this.cloudContainer)\r\n CloudSqlite.releaseWriteLock(this.cloudContainer);\r\n }\r\n\r\n public abandonChanges() {\r\n if (this.cloudContainer) {\r\n this.cloudContainer.abandonChanges();\r\n CloudSqlite.addHiddenProperty(this.cloudContainer, \"writeLockHeldBy\", undefined);\r\n }\r\n }\r\n\r\n public async withEditableDb(user: string, operation: (db: EditableWorkspaceDb) => void, props?: WorkspaceDbProps): Promise<void> {\r\n this.acquireWriteLock(user);\r\n try {\r\n let db: EditableWorkspaceDb;\r\n try {\r\n db = this.getEditableDb({ ...props, includePrerelease: true });\r\n } catch (error) {\r\n if (!CloudSqliteError.isError(error, \"already-published\"))\r\n throw error;\r\n\r\n const newVersion = await this.createNewWorkspaceDbVersion({\r\n fromProps: props,\r\n versionType: \"prerelease\",\r\n identifier: \"beta\",\r\n });\r\n db = this.getEditableDb(newVersion.newDb);\r\n }\r\n\r\n db.open();\r\n try {\r\n operation(db);\r\n } finally {\r\n db.close();\r\n }\r\n this.releaseWriteLock();\r\n } catch (error) {\r\n this.abandonChanges();\r\n throw error;\r\n }\r\n }\r\n\r\n public async createDb(args: { dbName?: string, version?: WorkspaceDbVersion, manifest: WorkspaceDbManifest }): Promise<EditableWorkspaceDb> {\r\n if (!this.cloudContainer) {\r\n WorkspaceEditor.createEmptyDb({ localFileName: this.resolveDbFileName(args), manifest: args.manifest });\r\n } else {\r\n // currently the only way to create a workspaceDb in a cloud container is to create a temporary workspaceDb and upload it.\r\n const tempDbFile = join(KnownLocations.tmpdir, `empty.${workspaceDbFileExt}`);\r\n if (fs.existsSync(tempDbFile))\r\n IModelJsFs.removeSync(tempDbFile);\r\n\r\n WorkspaceEditor.createEmptyDb({ localFileName: tempDbFile, manifest: args.manifest });\r\n await CloudSqlite.uploadDb(this.cloudContainer, { localFileName: tempDbFile, dbName: CloudSqlite.makeSemverName(workspaceDbNameWithDefault(args.dbName), args.version) });\r\n IModelJsFs.removeSync(tempDbFile);\r\n }\r\n\r\n return this.getWorkspaceDb(args);\r\n }\r\n}\r\n\r\nclass EditableDbImpl extends WorkspaceDbImpl implements EditableWorkspaceDb {\r\n public override get container(): EditableWorkspaceContainer {\r\n assert(this._container instanceof EditorContainerImpl);\r\n return this._container;\r\n }\r\n\r\n private static validateResourceName(name: WorkspaceResourceName) {\r\n if (name.trim() !== name)\r\n WorkspaceError.throwError(\"invalid-name\", { message: \"resource name may not have leading or trailing spaces\" });\r\n\r\n if (name.length > 1024) {\r\n WorkspaceError.throwError(\"invalid-name\", { message: \"resource name too long\" });\r\n }\r\n }\r\n\r\n private validateResourceSize(val: Uint8Array | string) {\r\n const len = typeof val === \"string\" ? val.length : val.byteLength;\r\n if (len > (1024 * 1024 * 1024)) // one gigabyte\r\n WorkspaceError.throwError(\"too-large\", { message: \"value is too large\" });\r\n }\r\n public get cloudProps(): WorkspaceDbCloudProps | undefined {\r\n const props = (this._container as EditorContainerImpl).cloudProps as Mutable<WorkspaceDbCloudProps>;\r\n if (props === undefined)\r\n return undefined;\r\n\r\n const parsed = CloudSqlite.parseDbFileName(this.dbFileName);\r\n return { ...props, dbName: parsed.dbName, version: parsed.version };\r\n }\r\n\r\n public override open() {\r\n this.sqliteDb.openDb(this.dbFileName, OpenMode.ReadWrite, this._container.cloudContainer);\r\n }\r\n\r\n public override close() {\r\n if (this.isOpen) {\r\n // whenever we close an EditableDb, update the name of the last editor in the manifest\r\n const cloudContainer = this.container.cloudContainer;\r\n const lastEditedBy = cloudContainer === undefined ? undefined : CloudSqlite.getWriteLockHeldBy(cloudContainer);\r\n if (lastEditedBy !== undefined)\r\n this.updateManifest({ ...this.manifest, lastEditedBy, lastEditedAt: new Date().toISOString() });\r\n\r\n // make sure all changes were saved before we close\r\n this.sqliteDb.saveChanges();\r\n }\r\n super.close();\r\n }\r\n\r\n private getFileModifiedTime(localFileName: LocalFileName): number {\r\n return Math.round(fs.statSync(localFileName).mtimeMs);\r\n }\r\n\r\n private performWriteSql(rscName: WorkspaceResourceName, sql: string, bind?: (stmt: SqliteStatement) => void) {\r\n this.sqliteDb.withSqliteStatement(sql, (stmt) => {\r\n stmt.bindString(1, rscName);\r\n bind?.(stmt);\r\n const rc = stmt.step();\r\n if (DbResult.BE_SQLITE_DONE !== rc) {\r\n if (DbResult.BE_SQLITE_CONSTRAINT_PRIMARYKEY === rc)\r\n WorkspaceError.throwError(\"resource-exists\", { message: `resource \"${rscName}\" already exists` });\r\n\r\n WorkspaceError.throwError(\"write-error\", { message: `workspace [${sql}], rc=${rc}` });\r\n }\r\n });\r\n this.sqliteDb.saveChanges();\r\n }\r\n\r\n public updateManifest(manifest: WorkspaceDbManifest) {\r\n this.sqliteDb[_nativeDb].saveFileProperty(workspaceManifestProperty, JSON.stringify(manifest));\r\n this._manifest = undefined;\r\n }\r\n public updateSettingsResource(settings: SettingsContainer, rscName?: string) {\r\n this.updateString(rscName ?? \"settingsDictionary\", JSON.stringify(settings));\r\n }\r\n public addString(rscName: WorkspaceResourceName, val: string): void {\r\n EditableDbImpl.validateResourceName(rscName);\r\n this.validateResourceSize(val);\r\n this.performWriteSql(rscName, \"INSERT INTO strings(id,value) VALUES(?,?)\", (stmt) => stmt.bindString(2, val));\r\n }\r\n public updateString(rscName: WorkspaceResourceName, val: string): void {\r\n this.validateResourceSize(val);\r\n this.performWriteSql(rscName, \"INSERT INTO strings(id,value) VALUES(?,?) ON CONFLICT(id) DO UPDATE SET value=excluded.value WHERE value!=excluded.value\", (stmt) => stmt.bindString(2, val));\r\n }\r\n public removeString(rscName: WorkspaceResourceName): void {\r\n this.performWriteSql(rscName, \"DELETE FROM strings WHERE id=?\");\r\n }\r\n public addBlob(rscName: WorkspaceResourceName, val: Uint8Array): void {\r\n EditableDbImpl.validateResourceName(rscName);\r\n this.validateResourceSize(val);\r\n this.performWriteSql(rscName, \"INSERT INTO blobs(id,value) VALUES(?,?)\", (stmt) => stmt.bindBlob(2, val));\r\n }\r\n public updateBlob(rscName: WorkspaceResourceName, val: Uint8Array): void {\r\n this.validateResourceSize(val);\r\n this.performWriteSql(rscName, \"INSERT INTO blobs(id,value) VALUES(?,?) ON CONFLICT(id) DO UPDATE SET value=excluded.value WHERE value!=excluded.value\", (stmt) => stmt.bindBlob(2, val));\r\n }\r\n public getBlobWriter(rscName: WorkspaceResourceName): SQLiteDb.BlobIO {\r\n return this.sqliteDb.withSqliteStatement(\"SELECT rowid from blobs WHERE id=?\", (stmt) => {\r\n stmt.bindString(1, rscName);\r\n const blobWriter = SQLiteDb.createBlobIO();\r\n blobWriter.open(this.sqliteDb[_nativeDb], { tableName: \"blobs\", columnName: \"value\", row: stmt.getValueInteger(0), writeable: true });\r\n return blobWriter;\r\n });\r\n }\r\n public removeBlob(rscName: WorkspaceResourceName): void {\r\n this.performWriteSql(rscName, \"DELETE FROM blobs WHERE id=?\");\r\n }\r\n public addFile(rscName: WorkspaceResourceName, localFileName: LocalFileName, fileExt?: string): void {\r\n EditableDbImpl.validateResourceName(rscName);\r\n fileExt = fileExt ?? extname(localFileName);\r\n if (fileExt?.[0] === \".\")\r\n fileExt = fileExt.slice(1);\r\n this.sqliteDb[_nativeDb].embedFile({ name: rscName, localFileName, date: this.getFileModifiedTime(localFileName), fileExt });\r\n }\r\n public updateFile(rscName: WorkspaceResourceName, localFileName: LocalFileName): void {\r\n this.queryFileResource(rscName); // throws if not present\r\n this.sqliteDb[_nativeDb].replaceEmbeddedFile({ name: rscName, localFileName, date: this.getFileModifiedTime(localFileName) });\r\n }\r\n public removeFile(rscName: WorkspaceResourceName): void {\r\n const file = this.queryFileResource(rscName);\r\n if (undefined === file)\r\n WorkspaceError.throwError(\"does-not-exist\", { message: `file resource \"${rscName}\" does not exist` });\r\n if (file && fs.existsSync(file.localFileName))\r\n fs.unlinkSync(file.localFileName);\r\n this.sqliteDb[_nativeDb].removeEmbeddedFile(rscName);\r\n }\r\n}\r\n\r\nexport function constructWorkspaceDb(props: WorkspaceDbProps, container: WorkspaceContainer): WorkspaceDb {\r\n return new WorkspaceDbImpl(props, container);\r\n}\r\n\r\nexport function constructWorkspace(settings: Settings, opts?: WorkspaceOpts): OwnedWorkspace {\r\n return new WorkspaceImpl(settings, opts);\r\n}\r\n\r\nexport function constructWorkspaceEditor(): WorkspaceEditor {\r\n return new EditorImpl();\r\n}\r\n\r\n/**\r\n * Validate that a WorkspaceContainer.Id is valid.\r\n * The rules for ContainerIds (from Azure, see https://docs.microsoft.com/en-us/rest/api/storageservices/naming-and-referencing-containers--blobs--and-metadata):\r\n * - may only contain lower case letters, numbers or dashes\r\n * - may not start or end with with a dash nor have more than one dash in a row\r\n * - may not be shorter than 3 or longer than 63 characters\r\n */\r\nexport function validateWorkspaceContainerId(id: WorkspaceContainerId) {\r\n if (!/^(?=.{3,63}$)[a-z0-9]+(-[a-z0-9]+)*$/g.test(id))\r\n WorkspaceError.throwError(\"invalid-name\", { message: `invalid containerId: [${id}]` });\r\n}\r\n\r\nexport const workspaceManifestProperty: FilePropertyProps = { namespace: \"workspace\", name: \"manifest\" };\r\n\r\n\r\nfunction throwWorkspaceDbLoadError(message: string, wsDbProps: WorkspaceDbProps | WorkspaceDbCloudProps, wsDb?: WorkspaceDb): never {\r\n WorkspaceError.throwError<WorkspaceDbLoadError>(\"load-error\", { message, wsDb, wsDbProps });\r\n}\r\n\r\nexport function throwWorkspaceDbLoadErrors(message: string, wsLoadErrors: WorkspaceDbLoadError[]): never {\r\n WorkspaceError.throwError<WorkspaceDbLoadErrors>(\"load-errors\", { message, wsLoadErrors });\r\n}\r\n\r\nexport interface OwnedWorkspace extends Workspace {\r\n /** Only the owner of a Workspace may close it. */\r\n close(): void;\r\n}\r\n"]}
@@ -112,8 +112,10 @@ export interface WorkspaceDbManifest {
112
112
  readonly description?: string;
113
113
  /** The name of the person to contact with questions about this [[WorkspaceDb]]. */
114
114
  readonly contactName?: string;
115
- /** The name of the person who last modified this [[WorkspaceDb]]. */
115
+ /** The user who held the write lock during the most recent edit session that closed this [[WorkspaceDb]]. */
116
116
  readonly lastEditedBy?: string;
117
+ /** The UTC ISO-8601 time of the most recent edit session close for this [[WorkspaceDb]]. */
118
+ readonly lastEditedAt?: string;
117
119
  }
118
120
  /**
119
121
  * An exception thrown when attempting to load a [[WorkspaceDb]] or some of its data; for example, if the [[WorkspaceDb]] could not be found or the user
@@ -1 +1 @@
1
- {"version":3,"file":"Workspace.d.ts","sourceRoot":"","sources":["../../../src/workspace/Workspace.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"Workspace.d.ts","sourceRoot":"","sources":["../../../src/workspace/Workspace.ts"],"names":[],"mappings":"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"}
@@ -1 +1 @@
1
- {"version":3,"file":"Workspace.js","sourceRoot":"","sources":["../../../src/workspace/Workspace.ts"],"names":[],"mappings":";AAAA;;;+FAG+F;AAC/F;;GAEG;;;AAEH,sDAA2G;AAM3G,oEAAiE;AACjE,iDAAgE;AA0bhE,SAAS,eAAe,CAAC,IAAY;IACnC,OAAO,GAAG,sBAAsB,IAAI,IAAI,EAAE,CAAC;AAC7C,CAAC;AAED;;GAEG;AACH,IAAiB,qBAAqB,CAOrC;AAPD,WAAiB,qBAAqB;IACpC;;;;OAIG;IACU,wCAAkB,GAAG,eAAe,CAAC,oBAAoB,CAAC,CAAC;AAC1E,CAAC,EAPgB,qBAAqB,qCAArB,qBAAqB,QAOrC;AA+BD,SAAS,oBAAoB,CAAC,GAAkB,EAAE,IAAY,EAAE,IAAuB;IACrF,KAAK,MAAM,EAAE,IAAI,GAAG,EAAE,CAAC;QACrB,MAAM,GAAG,GAAG,IAAI,KAAK,MAAM,CAAC,CAAC,CAAC,EAAE,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,SAAS,CAAC,IAAI,CAAC,CAAC;QACpE,IAAI,SAAS,KAAK,GAAG,EAAE,CAAC;YACtB,OAAO,GAAG,CAAC;QACb,CAAC;IACH,CAAC;IAED,OAAO,SAAS,CAAC;AACnB,CAAC;AAcD,YAAY;AACZ,IAAiB,SAAS,CAsFzB;AAtFD,WAAiB,SAAS;IACxB;;;OAGG;IACQ,+BAAqB,GAAG,CAAC,CAAwB,EAAE,EAAE;QAC9D,IAAI,CAAC,YAAY,KAAK;YACpB,qBAAM,CAAC,QAAQ,CAAC,6CAAqB,CAAC,SAAS,EAAE,CAAC,CAAC,CAAC;;YAEpD,+BAAgB,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC;IAC/B,CAAC,CAAC;IAUF;;;OAGG;IACQ,sCAA4B,GAAG,CAAC,MAAgC,EAAE,EAAE;QAC7E,qBAAM,CAAC,OAAO,CAAC,6CAAqB,CAAC,SAAS,EAAE,6BAA6B,MAAM,CAAC,IAAI,CAAC,KAAK,CAAC,IAAI,SAAS,MAAM,CAAC,IAAI,CAAC,UAAU,EAAE,CAAC,CAAC;IACxI,CAAC,CAAC;IAmBF;;;;;OAKG;IACH,SAAgB,iBAAiB,CAAC,IAA8B;QAC9D,OAAO,oBAAoB,CAAC,IAAI,CAAC,GAAG,EAAE,IAAI,CAAC,IAAI,EAAE,QAAQ,CAAuB,CAAC;IACnF,CAAC;IAFe,2BAAiB,oBAEhC,CAAA;IAED;;;;;OAKG;IACH,SAAgB,eAAe,CAAC,IAA8B;QAC5D,OAAO,oBAAoB,CAAC,IAAI,CAAC,GAAG,EAAE,IAAI,CAAC,IAAI,EAAE,MAAM,CAA2B,CAAC;IACrF,CAAC;IAFe,yBAAe,kBAE9B,CAAA;IAED;;;OAGG;IACH,SAAgB,cAAc,CAAC,IAAiC;QAC9D,MAAM,SAAS,GAA6C,EAAE,CAAC;QAC/D,KAAK,MAAM,EAAE,IAAI,IAAI,CAAC,GAAG,EAAE,CAAC;YAC1B,EAAE,CAAC,cAAc,CAAC;gBAChB,IAAI,EAAE,IAAI,CAAC,IAAI;gBACf,WAAW,EAAE,IAAI,CAAC,WAAW;gBAC7B,WAAW,EAAE,IAAI,CAAC,WAAW;gBAC7B,QAAQ,EAAE,CAAC,KAAK,EAAE,EAAE;oBAClB,KAAK,MAAM,IAAI,IAAI,KAAK,EAAE,CAAC;wBACzB,SAAS,CAAC,IAAI,CAAC,EAAE,EAAE,EAAE,IAAI,EAAE,CAAC,CAAC;oBAC/B,CAAC;gBACH,CAAC;aACF,CAAC,CAAC;QACL,CAAC;QAED,IAAI,CAAC,QAAQ,CAAC,SAAS,CAAC,CAAC;IAC3B,CAAC;IAhBe,wBAAc,iBAgB7B,CAAA;AACH,CAAC,EAtFgB,SAAS,yBAAT,SAAS,QAsFzB","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 Workspace\r\n */\r\n\r\nimport { AccessToken, BeEvent, ITwinError, Logger, Optional, UnexpectedErrors } from \"@itwin/core-bentley\";\r\nimport { DbCloudContainerInfo, LocalDirName, LocalFileName } from \"@itwin/core-common\";\r\nimport { CloudSqlite } from \"../CloudSqlite\";\r\nimport { SQLiteDb } from \"../SQLiteDb\";\r\nimport { SettingName, Settings, SettingsDictionary, SettingsPriority } from \"./Settings\";\r\nimport type { IModelJsNative } from \"@bentley/imodeljs-native\";\r\nimport { BackendLoggerCategory } from \"../BackendLoggerCategory\";\r\nimport { _implementationProhibited } from \"../internal/Symbols\";\r\n\r\n/** The unique identifier of a [[WorkspaceContainer]]. This becomes the base name for a local file directory holding the container's [[WorkspaceDb]]s.\r\n * A valid `WorkspaceContainerId` must conform to the following constraints:\r\n * - Consist solely of a combination of lower case letters, numbers, and dashes.\r\n * - May not start or end with a dash.\r\n * - Must be at least 3 characters long and no longer than 63 characters.\r\n * @beta\r\n */\r\nexport type WorkspaceContainerId = string;\r\n\r\n/** Properties describing a [[WorkspaceContainer]] for methods like [[Workspace.getContainerAsync]].\r\n * @beta\r\n */\r\nexport interface WorkspaceContainerProps extends Optional<CloudSqlite.ContainerAccessProps, \"accessToken\"> {\r\n /** Whether to synchronize the container via [[CloudSqlite.CloudContainer.checkForChanges]] whenever it is connected to a [[CloudSqlite.CloudCache]].\r\n * @note This property defaults to `true`.\r\n */\r\n readonly syncOnConnect?: boolean;\r\n /** A user-friendly description of the container's contents. */\r\n readonly description?: string;\r\n /** A message to display to the user if problems occur while loading the container. */\r\n readonly loadingHelp?: string;\r\n}\r\n\r\n/** The base name of a [[WorkspaceDb]], without any version information.\r\n * The name must conform to the following constraints:\r\n * - Case-insensitively unique among all [[WorkspaceDb]]s in the same [[WorkspaceContainer]].\r\n * - Between 1 and 255 characters in length.\r\n * - A legal filename on both [Windows](https://learn.microsoft.com/en-us/windows/win32/fileio/naming-a-file#naming-conventions) and UNIX.\r\n * - Contain none of the following characters: forward or backward slash, period, single or double quote, backtick, and \"#\".\r\n * - Begin or end with a whitespace character.\r\n * @see [[WorkspaceDbFullName]] for the fully-specified name, including version information.\r\n * @beta\r\n */\r\nexport type WorkspaceDbName = string;\r\n\r\n/** The fully-specified name of a [[WorkspaceDb]], combining its [[WorkspaceDbName]] and [[WorkspaceDbVersion]] in the format \"name:version\".\r\n * @beta\r\n */\r\nexport type WorkspaceDbFullName = string;\r\n\r\n/** A [semver](https://github.com/npm/node-semver) string describing the version of a [[WorkspaceDb]], e.g., \"4.2.11\".\r\n * @beta\r\n */\r\nexport type WorkspaceDbVersion = CloudSqlite.DbVersion;\r\n\r\n/** A [semver string](https://github.com/npm/node-semver?tab=readme-ov-file#ranges) describing a range of acceptable [[WorkspaceDbVersion]]s,\r\n * e.g., \">=1.2.7 <1.3.0\".\r\n * @beta\r\n */\r\nexport type WorkspaceDbVersionRange = CloudSqlite.DbVersionRange;\r\n\r\n/** Specifies the name and version of a [[WorkspaceDb]].\r\n * @beta\r\n */\r\nexport type WorkspaceDbNameAndVersion = Optional<CloudSqlite.DbNameAndVersion, \"dbName\">;\r\n\r\n/** Properties that specify how to load a [[WorkspaceDb]] within a [[WorkspaceContainer]].\r\n * @beta\r\n */\r\nexport interface WorkspaceDbProps extends WorkspaceDbNameAndVersion {\r\n /** If true, allow semver [prerelease versions](https://github.com/npm/node-semver?tab=readme-ov-file#prerelease-tags), e.g., \"1.4.2-beta.0\".\r\n * By default, only released version are allowed.\r\n */\r\n readonly includePrerelease?: boolean;\r\n /** If true, start a prefetch operation whenever this [[WorkspaceDb]] is opened, to begin downloading pages of the database before they are needed. */\r\n readonly prefetch?: boolean;\r\n}\r\n\r\n/** Properties describing a [[WorkspaceDb]] and the [[WorkspaceContainer]] containing it.\r\n * @beta\r\n */\r\nexport interface WorkspaceDbCloudProps extends WorkspaceDbProps, WorkspaceContainerProps, DbCloudContainerInfo { }\r\n\r\n/** A function supplied as [[WorkspaceDbQueryResourcesArgs.callback]] to be invoked to process the requested resources.\r\n * @beta\r\n */\r\nexport type WorkspaceDbQueryResourcesCallback = (resourceNames: Iterable<string>) => void;\r\n\r\n/** Arguments supplied to [[WorkspaceDb.queryResources]].\r\n * @beta\r\n */\r\nexport interface WorkspaceDbQueryResourcesArgs {\r\n /** The type of resource to query. */\r\n type?: \"string\" | \"blob\";\r\n /** A pattern against which to compare the name of each resource, using [[nameCompare]] as the comparison operator.\r\n * Only resources whose names match the pattern will be included in the query results.\r\n */\r\n namePattern?: string;\r\n /** The comparison operator by which to compare the name of each resource to [[namePattern]].\r\n * Only resources whose names match the pattern will be included in the query results.\r\n * Ignored if [[namePattern]] is undefined.\r\n */\r\n nameCompare?: \"GLOB\" | \"LIKE\" | \"NOT GLOB\" | \"NOT LIKE\" | \"=\" | \"<\" | \">\";\r\n /** A function invoked to process the resources that match the query criterion. */\r\n callback: WorkspaceDbQueryResourcesCallback;\r\n}\r\n\r\n/** Metadata stored inside a [[WorkspaceDb]] describing the database's contents, to help users understand the purpose of the [[WorkspaceDb]], who to\r\n * contact with questions about it, and so on.\r\n * @note Only the [[workspaceName]] field is required, and users may add additional fields for their own purposes.\r\n * @note Since the information is stored inside of the [[WorkspaceDb]], it is versioned along with the rest of the contents.\r\n * @beta\r\n */\r\nexport interface WorkspaceDbManifest {\r\n /** The name of the [[WorkspaceDb]] to be shown in user interfaces. Organizations should attempt to make this name informative enough\r\n * so that users may refer to this name in conversations. It should also be unique enough that there's no confusion when it appears in\r\n * lists of WorkspaceDbs.\r\n * @note it is possible and valid to change the workspaceName between new version of a WorkspaceDb (e.g. incorporating a date).\r\n */\r\n readonly workspaceName: string;\r\n /** A description of the contents of this [[WorkspaceDb]] to help users understand its purpose and appropriate usage. */\r\n readonly description?: string;\r\n /** The name of the person to contact with questions about this [[WorkspaceDb]]. */\r\n readonly contactName?: string;\r\n /** The name of the person who last modified this [[WorkspaceDb]]. */\r\n readonly lastEditedBy?: string;\r\n}\r\n\r\n/**\r\n * An exception thrown when attempting to load a [[WorkspaceDb]] or some of its data; for example, if the [[WorkspaceDb]] could not be found or the user\r\n * is not authorized to access its [[WorkspaceContainer]].\r\n * @beta\r\n */\r\nexport interface WorkspaceDbLoadError extends ITwinError {\r\n /** The properties of the [[WorkspaceDb]] that was attempted to load, including the identity of its [[WorkspaceContainer]]. */\r\n wsDbProps?: WorkspaceDbProps & Partial<WorkspaceDbCloudProps>;\r\n /** The [[WorkspaceDb]] in which the error occurred, if available. */\r\n wsDb?: WorkspaceDb;\r\n}\r\n\r\n/** An exception that may occur while opening an [[IModelDb]] if any problems are detected while loading its [[IModelDb.workspace]].\r\n * This exception is never actually thrown; instead, after the iModel is opened, the exception is forwarded to [[Workspace.exceptionDiagnosticFn]]\r\n * so that the user can be notified of the problems.\r\n * @beta\r\n */\r\nexport interface WorkspaceDbLoadErrors extends ITwinError {\r\n /** An array of problems that were encountered attempting to load [[WorkspaceDb]]s for an [[IModelDb]]. The most common problem\r\n * is that the user doesn't have read access to one or more [[WorkspaceContainer]]s used by the iModel's [[Workspace]]..\r\n */\r\n wsLoadErrors?: WorkspaceDbLoadError[];\r\n}\r\n\r\n/** Specifies a resource inside a [[WorkspaceDb]] that holds a [[SettingsDictionary]] to load into [[Workspace.settings]].\r\n * Settings of this type named [[WorkspaceSettingNames.settingsWorkspaces]] are automatically loaded by [[Workspace.loadSettingsDictionary]].\r\n * @beta\r\n */\r\nexport interface WorkspaceDbSettingsProps extends WorkspaceDbCloudProps {\r\n /** The name of the resource holding the stringified JSON of the [[SettingsDictionary]].\r\n * Defaults to `\"settingsDictionary\"`, which matches the key used by\r\n * [[EditableWorkspaceDb.updateSettingsResource]] to write settings. You should generally omit this\r\n * field unless you need to load settings stored under a non-standard key.\r\n */\r\n resourceName?: string;\r\n /** The priority to assign to the [[SettingsDictionary]]. */\r\n priority: SettingsPriority;\r\n}\r\n\r\n/** The name of a blob, string, or file resource stored in a [[WorkspaceDb]].\r\n * Resource names must conform to the following constraints:\r\n * - At least 1 character and no more than 1024 characters in length.\r\n * - No leading or trailing whitespace characters.\r\n * Each resource of a given type must has a unique name within the [[WorkspaceDb]]. It is technically possible, but discouraged, to define\r\n * resources with the same name but different types.\r\n * @beta\r\n */\r\nexport type WorkspaceResourceName = string;\r\n\r\n/** A SQLite database in a [[Workspace]] containing named resources that the application is configured to use.\r\n * Resources are referred to by their [[WorkspaceResourceName]]s and can represent any number of things, including:\r\n * - [GeographicCRS]($common)es used to define the coordinate reference system of an iTwin.\r\n * - [[SettingsDictionary]]'s that contribute to the [[Workspace.settings]].\r\n * - Files that can be extracted temporarily to the local file system to be accessed by programs directly from disk.\r\n *\r\n * Ultimately, each resource is stored in one of the following formats:\r\n * - A `string`, which is often a stringified `JSON` representation of the resource;\r\n * - A binary `blob`; or\r\n * - An embedded file.\r\n *\r\n * Strings and blobs can be accessed directly using [[getString]] and [[getBlob]]. Files must first be copied to the local file system using [[getFile]], and should be avoided unless the software\r\n * that uses them is written to access them from disk.\r\n *\r\n * A `WorkspaceDb` resides in a [[WorkspaceContainer]] that can be published to the cloud. Once published, the `WorkspaceDb` becomes immutable.\r\n * However, multiple versions of a single `WorkspaceDb` can be created, allowing the [[Workspace]] contents to evolve over time.\r\n * `WorkspaceDb`s use [semantic versioning](https://github.com/npm/node-semver).\r\n *\r\n * The set of available `WorkspaceDb`s available for use for specific purposes are defined in the [[Workspace]]'s [[Settings]]. You can obtain\r\n * a single `WorkspaceDb` using [[WorkspaceContainer.getWorkspaceDb]], but more commonly you will use [[Workspace.getWorkspaceDbs]] to obtain\r\n * a list of all of the `WorkspaceDb`s, sorted by priority, that correspond to a given [[SettingName]].\r\n *\r\n * You can create new `WorkspaceDb`s (or new versions of existing `WorkspaceDb`s) using [[WorkspaceEditor]].\r\n * @beta\r\n */\r\nexport interface WorkspaceDb {\r\n /** @internal */\r\n [_implementationProhibited]: unknown;\r\n /** The [[WorkspaceContainer]] in which this db resides. */\r\n readonly container: WorkspaceContainer;\r\n /** The base name of this WorkspaceDb, without version */\r\n readonly dbName: WorkspaceDbName;\r\n /** An event raised before this WorkspaceDb is [[close]]d. */\r\n readonly onClose: BeEvent<() => void>;\r\n /** The name by which the WorkspaceDb can be opened. This will be either a local file name or the name of a database in a [[CloudSqlite.CloudContainer]]. */\r\n readonly dbFileName: string;\r\n /** The underlying SQLite database that stores this WorkspaceDb's resources. */\r\n readonly sqliteDb: SQLiteDb;\r\n /** Whether the underlying [[sqliteDb]] is currently [[open]]ed. */\r\n readonly isOpen: boolean;\r\n /** The manifest that describes the contents and context of this WorkspaceDb. */\r\n readonly manifest: WorkspaceDbManifest;\r\n /** The version of this WorkspaceDb */\r\n readonly version: WorkspaceDbVersion;\r\n\r\n /** Open the underlying [[sqliteDb]] to perform a query. Generally WorkspaceDbs are left closed and opened/closed as they're used. However,\r\n * when there will be significant activity against a WorkspaceDb, it may be useful to open it before the operations and close it afterwards.\r\n * Methods like [[queryResources]] open the SQLite database automatically and [[close]] it before they return.\r\n */\r\n open(): void;\r\n\r\n /** Close the underlying [[sqliteDb]]. You should call this after [[open]]ing the database and completing your query. */\r\n close(): void;\r\n\r\n /** Look up a string resource by name, if one exists. */\r\n getString(rscName: WorkspaceResourceName): string | undefined;\r\n\r\n /** Look up a binary resource by name, if one exists. */\r\n getBlob(rscName: WorkspaceResourceName): Uint8Array | undefined;\r\n\r\n /** Get a BlobIO reader for a blob WorkspaceResource.\r\n * @note when finished, caller *must* call `close` on the BlobIO.\r\n * @internal\r\n */\r\n getBlobReader(rscName: WorkspaceResourceName): SQLiteDb.BlobIO;\r\n\r\n /**\r\n * Extract a local copy of a file resource from this WorkspaceDb, if present.\r\n * @param rscName The name of the file resource in the WorkspaceDb\r\n * @param targetFileName optional name for extracted file. Some applications require files in specific locations or filenames. If\r\n * you know the full path to use for the extracted file, you can supply it. Generally, it is best to *not* supply the filename and\r\n * keep the extracted files in the directory specified by [[WorkspaceContainer.filesDir]].\r\n * @returns the full path to a file on the local file system, or undefined if the no file named `rscName` exists.\r\n * @note The file is copied from the file into the local file system so it may be accessed directly. This happens only\r\n * as necessary, if the local file doesn't exist, or if it is out-of-date because it was updated in the file.\r\n * For this reason, you should not save the local file name, and instead call this method every time you access it, so its\r\n * content is always holds the correct version.\r\n * @note The filename will be a hash value, not the resource name.\r\n * @note Workspace resource files are set as read-only as they are copied from the file.\r\n * To edit them, you must first copy them to another location.\r\n */\r\n getFile(rscName: WorkspaceResourceName, targetFileName?: LocalFileName): LocalFileName | undefined;\r\n\r\n /**\r\n * Ensure that the contents of this `WorkspaceDb` are downloaded into the local cache so that it may be accessed offline.\r\n * Until the promise resolves, the `WorkspaceDb` is not fully downloaded, but it *may* be safely accessed during the download.\r\n * To determine the progress of the download, use the `localBlocks` and `totalBlocks` values returned by `CloudContainer.queryDatabase`.\r\n * @returns a [[CloudSqlite.CloudPrefetch]] object that can be used to await and/or cancel the prefetch.\r\n * @throws if this WorkspaceDb is not from a [[CloudSqlite.CloudContainer]].\r\n */\r\n prefetch(opts?: CloudSqlite.PrefetchProps): CloudSqlite.CloudPrefetch;\r\n\r\n /** Find resources of a particular type with names matching a specified pattern.\r\n * The matching resources will be supplied to [[WorkspaceDbQueryResourcesArgs.callbackk]].\r\n * @see [[Workspace.queryResources]] to query resources within multiple `WorkspaceDb`s.\r\n */\r\n queryResources(args: WorkspaceDbQueryResourcesArgs): void;\r\n\r\n /** @internal */\r\n queryFileResource(rscName: WorkspaceResourceName): { localFileName: LocalFileName, info: IModelJsNative.EmbedFileQuery } | undefined;\r\n}\r\n\r\n/** Options supplied to [[IModelHost.startup]] via [[IModelHostOptions.workspace]] to customize the initialization of [[IModelHost.appWorkspace]].\r\n * @beta\r\n */\r\nexport interface WorkspaceOpts {\r\n /** The local directory for non-cloud-based [[WorkspaceDb]] files. The [[Workspace]] API will look in this directory\r\n * for files named `${containerId}/${dbId}.itwin-workspace`.\r\n * @note if not supplied, defaults to \"iTwin/Workspace\" in the user-local folder.\r\n */\r\n containerDir?: LocalDirName;\r\n\r\n /** The name(s) of one or more local JSON files containing [[SettingsDictionary]]s to load when initializing the [[Workspace]]. */\r\n settingsFiles?: LocalFileName | LocalFileName[];\r\n}\r\n\r\n/** Arguments supplied to [[Workspace.getContainer]] and [[WorkspaceEditor.getContainer]].\r\n * @beta\r\n */\r\nexport interface GetWorkspaceContainerArgs extends WorkspaceContainerProps {\r\n /** Token required to access the container. */\r\n accessToken: AccessToken;\r\n}\r\n\r\n/**\r\n * Settings and resources that customize an application for the current session.\r\n * See the [learning article]($docs/learning/backend/Workspace) for a detailed overiew and examples.\r\n * @beta\r\n */\r\nexport interface Workspace {\r\n /** @internal */\r\n [_implementationProhibited]: unknown;\r\n\r\n /** The settings db sources used to populate this workspace, if available.\r\n * Useful for reloading the same workspace data later without querying container discovery services.\r\n */\r\n settingsSources?: WorkspaceDbSettingsProps | WorkspaceDbSettingsProps[];\r\n\r\n /** The directory for local WorkspaceDb files with the name `${containerId}/${dbId}.itwin-workspace`.\r\n * @internal\r\n */\r\n readonly containerDir: LocalDirName;\r\n\r\n /** The current [[Settings]] for this Workspace */\r\n readonly settings: Settings;\r\n\r\n /** Get the cloud cache for cloud-based [[WorkspaceContainer]]s. */\r\n getCloudCache(): CloudSqlite.CloudCache;\r\n\r\n /** Search for a container previously opened by [[getContainer]] or [[getContainerAsync]].\r\n * @param containerId The id of the container\r\n * @returns the [[WorkspaceContainer]] for `containerId`, or `undefined` if no such container has been opened.\r\n * @internal\r\n */\r\n findContainer(containerId: WorkspaceContainerId): WorkspaceContainer | undefined;\r\n\r\n /** Obtain the [[WorkspaceContainer]] specified by `props`.\r\n * @param props The properties of the `WorkspaceContainer`, opening it if it is not already opened.\r\n * Otherwise it is created.\r\n * @note This function allows a `WorkspaceContainer.Props` without its [AccessToken]($bentley). It will attempt to obtain one from the [[BlobContainer]] service,\r\n * hence this function is async.\r\n * @see [[getContainer]] to obtain a container synchronously.\r\n */\r\n getContainerAsync(props: WorkspaceContainerProps): Promise<WorkspaceContainer>;\r\n\r\n /** Get a WorkspaceContainer with a supplied access token. This function is synchronous and may be used if:\r\n * - a valid [AccessToken]($bentley) is already available;\r\n * - the container has already been previously prefetched in another session (this is useful for offline usage); or\r\n * - the container is public and doesn't require an [AccessToken]($bentley).\r\n * @see [[getContainerAsync]] to obtain a container asynchronously if the above conditions do not apply.\r\n */\r\n getContainer(props: GetWorkspaceContainerArgs): WorkspaceContainer;\r\n\r\n /** Load a [[SettingsDictionary]] from the specified [[WorkspaceDb]] and add it to this workspace's current [[Settings]].\r\n * @note this function will load the dictionaries from the supplied list, and it will also call itself recursively for any entries in\r\n * the loaded Settings with the name [[WorkspaceSettingNames.settingsWorkspaces]]. In this manner, WorkspaceSettings may be \"chained\" together so that loading one\r\n * causes its \"dependent\" WorkspaceSettings to be loaded. Its `Promise` is resolved after all have been loaded (or failed to load).\r\n */\r\n loadSettingsDictionary(\r\n /** The properties of the [[WorkspaceDb]], plus the resourceName and [[SettingsPriority]]. May be either a single value or an array of them */\r\n props: WorkspaceDbSettingsProps | WorkspaceDbSettingsProps[],\r\n /** If present, an array that is populated with a list of problems while attempting to load the [[SettingsDictionary]](s). */\r\n problems?: WorkspaceDbLoadError[]\r\n ): Promise<void>;\r\n\r\n /** Get a single [[WorkspaceDb]]. */\r\n getWorkspaceDb(props: WorkspaceDbCloudProps): Promise<WorkspaceDb>;\r\n\r\n /**\r\n * Resolve the value of all [[Setting]]s from this workspace with the supplied `settingName` into an array of [[WorkspaceDbCloudProps]]\r\n * that can be used to query or load workspace resources. The settings must each be an array of type [[WorkspaceDbSettingsProps]].\r\n * The returned array will be sorted according to their [[SettingsPriority]], with the first entry being the highest priority [[WorkspaceDb]].\r\n * @note The list is built by combining, in order, all of the settings with the supplied [[SettingName]]. It may therefore include the\r\n * properties of same WorkspaceDb multiple times. This list is automatically de-duped by [[getWorkspaceDb]].\r\n * @note This function is rarely used directly. Usually it is called by [[getWorkspaceDbs]]. However, this function is synchronous and may sometimes\r\n * be useful for editors, tests, or diagnostics.\r\n */\r\n resolveWorkspaceDbSetting(\r\n /** the name of the setting. */\r\n settingName: SettingName,\r\n /** optional filter to choose specific WorkspaceDbs from the settings values. If present, only those WorkspaceDbs for which the filter returns `true` will be included. */\r\n filter?: Workspace.DbListFilter): WorkspaceDbCloudProps[];\r\n\r\n /**\r\n * Get a sorted array of [[WorkspaceDb]]s that can be used to query or load resources. If the arguments supply a `settingName`, this function will\r\n * use [[resolveWorkspaceDbSetting]] to get get the array of [[WorkspaceDbCloudProps]].\r\n * @returns A `Promise` resolving to an array of [[WorkspaceDb]]s sorted by [[SettingsPriority]] so that resources found in WorkspaceDbs earlier in the list take precedence\r\n * over ones with the same name in later WorkspaceDbs. No WorkspaceDb will appear more than once in the list.\r\n * @note this function may request an [AccessToken]($bentley) for each WorkspaceDb if necessary, and hence is asynchronous.\r\n */\r\n getWorkspaceDbs(\r\n args: Workspace.DbListOrSettingName & {\r\n /** if supplied, this array is populated with a list of problems (e.g. no read permission) attempting to load WorkspacesDbs. */\r\n problems?: WorkspaceDbLoadError[];\r\n /** only valid when called with a settingName, if so passed as `filter` argument to [[resolveWorkspaceDbSetting]] */\r\n filter?: Workspace.DbListFilter;\r\n }): Promise<WorkspaceDb[]>;\r\n}\r\n\r\n/**\r\n * Base interface for containers backed by [[CloudSqlite]] that hold versioned databases (e.g. [[WorkspaceDb]]s).\r\n * Provides the shared infrastructure for cloud access, local file caching, and semver-based database resolution.\r\n * @note Not every container is associated with a [[CloudSqlite.CloudContainer]] — containers may also be loaded from the local file system.\r\n * In this case, [[cloudContainer]] will be `undefined`.\r\n * @see [[WorkspaceContainer]] for workspace-specific containers.\r\n * @beta\r\n */\r\nexport interface CloudSqliteContainer {\r\n /** @internal */\r\n [_implementationProhibited]: unknown;\r\n /** the local directory where this container will store temporary files extracted for file-resources.\r\n * @internal\r\n */\r\n readonly filesDir: LocalDirName;\r\n /** The workspace into which this container was loaded. */\r\n readonly workspace: Workspace;\r\n /** Cloud container for this container, or `undefined` if this is a local container. */\r\n readonly cloudContainer?: CloudSqlite.CloudContainer;\r\n /** Properties supplied when this container was loaded */\r\n readonly fromProps: WorkspaceContainerProps;\r\n\r\n /**\r\n * Find the fully-qualified name of a database satisfying the name and version criteria specified by `props`.\r\n * @throws Error if no version satisfying the criteria exists.\r\n */\r\n resolveDbFileName(props: WorkspaceDbProps): WorkspaceDbFullName;\r\n}\r\n\r\n/**\r\n * A [[CloudSqliteContainer]] that holds one or more [[WorkspaceDb]]s. Normally a WorkspaceContainer will hold (many versions of) a single WorkspaceDb.\r\n * Each version of a WorkspaceDb is treated as immutable after it is created and is stored in the WorkspaceContainer indefinitely. That means that\r\n * older versions of the WorkspaceDb may continue to be used, for example by archived projects. For programmers familiar with [NPM](https://www.npmjs.com/), this is conceptually\r\n * similar and versioning follows the same rules as NPM using [Semantic Versioning](https://semver.org/).\r\n * @note It is possible to store more than one WorkspaceDb in the same WorkspaceContainer, but access rights are administered per WorkspaceContainer.\r\n * That is, if a user has rights to access a WorkspaceContainer, that right applies to all WorkspaceDbs in the WorkspaceContainer.\r\n * @see [[Workspace.getContainer]] and [[Workspace.getContainerAsync]] to load a container.\r\n * @beta\r\n */\r\nexport interface WorkspaceContainer extends CloudSqliteContainer {\r\n /** @internal */\r\n addWorkspaceDb(toAdd: WorkspaceDb): void;\r\n\r\n /** Obtain a [[WorkspaceDb]] satisfying the name and version criteria specified by `props`.\r\n * Repeated calls that resolve to the same WorkspaceDb return the same cached instance until it is closed.\r\n */\r\n getWorkspaceDb(props?: WorkspaceDbProps): WorkspaceDb;\r\n\r\n /** Close and remove a currently opened [[WorkspaceDb]] from this Workspace.\r\n * @internal\r\n */\r\n closeWorkspaceDb(container: WorkspaceDb): void;\r\n}\r\n\r\nfunction makeSettingName(name: string) {\r\n return `${\"itwin/core/workspace\"}/${name}`;\r\n}\r\n\r\n/** The names of various [[Setting]]s with special meaning to the [[Workspace]] system.\r\n * @beta\r\n */\r\nexport namespace WorkspaceSettingNames {\r\n /** The name of a setting that, when present in a [[WorkspaceDb]] loaded by [[Workspace.loadSettingsDictionary]], will automatically\r\n * be used to find and load additional [[SettingsDictionary]]'s in other [[WorkspaceDb]]s. This permits you to chain the settings inside on [[WorkspaceDb]]\r\n * to others upon which they depend.\r\n * This setting's value is an array of [[WorkspaceDbSettingsProps]]s.\r\n */\r\n export const settingsWorkspaces = makeSettingName(\"settingsWorkspaces\");\r\n}\r\n\r\n/** A function supplied as part of a [[QueryWorkspaceResourcesArgs]] to iterate the resources retrieved by [[Workspace.queryResources]].\r\n * The `resources` object should only be used inside the function - it is an error to attempt to iterate it after the function returns.\r\n * @beta\r\n */\r\nexport type QueryWorkspaceResourcesCallback = (resources: Iterable<{ name: string, db: WorkspaceDb }>) => void;\r\n\r\n/** Arguments supplied to [[Workspace.queryResources]] defining the query criteria and the list of [[WorkspaceDb]]s to query.\r\n * @beta\r\n */\r\nexport interface QueryWorkspaceResourcesArgs {\r\n /** The list of `WorkspaceDb`s to query, in the order in which they are to be queried.\r\n * @see [[Workspace.resolveWorkspaceDbSetting]] or [[Workspace.getWorkspaceDbs]] to obtain an appropriate list of `WorkspaceDb`s.\r\n */\r\n dbs: WorkspaceDb[];\r\n /** The type of resource to query. */\r\n type?: \"string\" | \"blob\";\r\n /** A pattern against which to compare the name of each resource, using [[nameCompare]] as the comparison operator.\r\n * Only resources whose names match the pattern will be included in the query results.\r\n */\r\n namePattern?: string;\r\n /** The comparison operator by which to compare the name of each resource to [[namePattern]].\r\n * Only resources whose names match the pattern will be included in the query results.\r\n * Ignored i [[namePattern]] is undefined.\r\n */\r\n nameCompare?: \"GLOB\" | \"LIKE\" | \"NOT GLOB\" | \"NOT LIKE\" | \"=\" | \"<\" | \">\";\r\n /** A function invoked to process the resources that match the query criteria. */\r\n callback: QueryWorkspaceResourcesCallback;\r\n}\r\n\r\nfunction getWorkspaceResource(dbs: WorkspaceDb[], name: string, type: \"string\" | \"blob\"): string | Uint8Array | undefined {\r\n for (const db of dbs) {\r\n const val = type === \"blob\" ? db.getBlob(name) : db.getString(name);\r\n if (undefined !== val) {\r\n return val;\r\n }\r\n }\r\n\r\n return undefined;\r\n}\r\n\r\n/** Arguments supplied to [[Workspace.getStringResource]] and [[WOrkspace.getBlobResource]].\r\n * @beta\r\n */\r\nexport interface GetWorkspaceResourceArgs {\r\n /** The list of `WorkspaceDb`s to search, in the order in which they are to be searched.\r\n * @see [[Workspace.resolveWorkspaceDbSetting]] or [[Workspace.getWorkspaceDbs]] to obtain an appropriate list of `WorkspaceDb`s.\r\n */\r\n dbs: WorkspaceDb[];\r\n /** The name of the resource to find. */\r\n name: WorkspaceResourceName;\r\n}\r\n\r\n/** @beta */\r\nexport namespace Workspace {\r\n /** A function invoked to handle exceptions produced while loading workspace data.\r\n * Applications can override this function to notify the user and/or attempt to diagnose the problem.\r\n * The default implementation simply logs each exception.\r\n */\r\n export let exceptionDiagnosticFn = (e: WorkspaceDbLoadErrors) => { // eslint-disable-line prefer-const\r\n if (e instanceof Error)\r\n Logger.logError(BackendLoggerCategory.Workspace, e);\r\n else\r\n UnexpectedErrors.handle(e);\r\n };\r\n\r\n /** Arguments supplied to [[Workspace.onSettingsDictionaryLoadedFn]] for every [[SettingsDictionary]] that is loaded from a [[WorkspaceDb]]. */\r\n export interface SettingsDictionaryLoaded {\r\n /** The dictionary that was loaded */\r\n dict: SettingsDictionary;\r\n /** The WorkspaceDb from which the dictionary was loaded. */\r\n from: WorkspaceDb;\r\n }\r\n\r\n /** A function invoked each time any [[SettingsDictionary]] is loaded from a [[WorkspaceDb]].\r\n * Applications can override this function to notify the user and/or record diagnostics.\r\n * The default implementation simply records an information message in the [Logger]($bentley).\r\n */\r\n export let onSettingsDictionaryLoadedFn = (loaded: SettingsDictionaryLoaded) => { // eslint-disable-line prefer-const\r\n Logger.logInfo(BackendLoggerCategory.Workspace, `loaded setting dictionary ${loaded.dict.props.name} from ${loaded.from.dbFileName}`);\r\n };\r\n\r\n /** Either an array of [[WorkspaceDbCloudProps]] or the name of a [[Setting]] that resolves to an array of [[WorkspaceDbCloudProps]].\r\n * Used by [[Workspace.getWorkspaceDbs]].\r\n */\r\n export type DbListOrSettingName = { readonly dbs: WorkspaceDbCloudProps[], readonly settingName?: never } | { readonly settingName: SettingName, readonly dbs?: never };\r\n\r\n /** In arguments supplied to [[Workspace.getWorkspaceDbs]] and [[Workspace.resolveWorkspaceDbSetting]], an optional function used to exclude some\r\n * [[WorkspaceDb]]s. Only those [[WorkspaceDb]]s for which the function returns `true` will be included.\r\n */\r\n export type DbListFilter = (\r\n /** The properties of the WorkspaceDb to be returned */\r\n dbProp: WorkspaceDbCloudProps,\r\n /** The SettingsDictionary holding the [[WorkspaceSettingNames.settingsWorkspace]] setting. May be used, for example, to determine the\r\n * [[SettingsPriority]] of the dictionary.\r\n */\r\n dict: SettingsDictionary\r\n ) => boolean;\r\n\r\n /** Searches a list of [[WorkspaceDb]]s for a string resource of a given name.\r\n * The list is searched in order, and the first resource with the request name is returned.\r\n * If no such resource exists, the function returns `undefined`.\r\n * @see [[WorkspaceDb.getString]] if you only need to search a single `WorkspaceDb`.\r\n * @beta\r\n */\r\n export function getStringResource(args: GetWorkspaceResourceArgs): string | undefined {\r\n return getWorkspaceResource(args.dbs, args.name, \"string\") as string | undefined;\r\n }\r\n\r\n /** Searches a list of [[WorkspaceDb]]s for a blob resource of a given name.\r\n * The list is searched in order, and the first resource with the request name is returned.\r\n * If no such resource exists, the function returns `undefined`.\r\n * @see [[WorkspaceDb.getblob]] if you only need to search a single `WorkspaceDb`.\r\n * @beta\r\n */\r\n export function getBlobResource(args: GetWorkspaceResourceArgs): Uint8Array | undefined {\r\n return getWorkspaceResource(args.dbs, args.name, \"blob\") as Uint8Array | undefined;\r\n }\r\n\r\n /** Query a list of [[WorkspaceDb]]s to find resources of a particular type with names matching a specified pattern.\r\n * @see [[WorkspaceDb.queryResources]] if you only need to query a single `WorkspaceDb`.\r\n * @beta\r\n */\r\n export function queryResources(args: QueryWorkspaceResourcesArgs): void {\r\n const resources: Array<{ name: string, db: WorkspaceDb }> = [];\r\n for (const db of args.dbs) {\r\n db.queryResources({\r\n type: args.type,\r\n namePattern: args.namePattern,\r\n nameCompare: args.nameCompare,\r\n callback: (names) => {\r\n for (const name of names) {\r\n resources.push({ db, name });\r\n }\r\n },\r\n });\r\n }\r\n\r\n args.callback(resources);\r\n }\r\n}\r\n"]}
1
+ {"version":3,"file":"Workspace.js","sourceRoot":"","sources":["../../../src/workspace/Workspace.ts"],"names":[],"mappings":";AAAA;;;+FAG+F;AAC/F;;GAEG;;;AAEH,sDAA2G;AAM3G,oEAAiE;AACjE,iDAAgE;AA4bhE,SAAS,eAAe,CAAC,IAAY;IACnC,OAAO,GAAG,sBAAsB,IAAI,IAAI,EAAE,CAAC;AAC7C,CAAC;AAED;;GAEG;AACH,IAAiB,qBAAqB,CAOrC;AAPD,WAAiB,qBAAqB;IACpC;;;;OAIG;IACU,wCAAkB,GAAG,eAAe,CAAC,oBAAoB,CAAC,CAAC;AAC1E,CAAC,EAPgB,qBAAqB,qCAArB,qBAAqB,QAOrC;AA+BD,SAAS,oBAAoB,CAAC,GAAkB,EAAE,IAAY,EAAE,IAAuB;IACrF,KAAK,MAAM,EAAE,IAAI,GAAG,EAAE,CAAC;QACrB,MAAM,GAAG,GAAG,IAAI,KAAK,MAAM,CAAC,CAAC,CAAC,EAAE,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,SAAS,CAAC,IAAI,CAAC,CAAC;QACpE,IAAI,SAAS,KAAK,GAAG,EAAE,CAAC;YACtB,OAAO,GAAG,CAAC;QACb,CAAC;IACH,CAAC;IAED,OAAO,SAAS,CAAC;AACnB,CAAC;AAcD,YAAY;AACZ,IAAiB,SAAS,CAsFzB;AAtFD,WAAiB,SAAS;IACxB;;;OAGG;IACQ,+BAAqB,GAAG,CAAC,CAAwB,EAAE,EAAE;QAC9D,IAAI,CAAC,YAAY,KAAK;YACpB,qBAAM,CAAC,QAAQ,CAAC,6CAAqB,CAAC,SAAS,EAAE,CAAC,CAAC,CAAC;;YAEpD,+BAAgB,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC;IAC/B,CAAC,CAAC;IAUF;;;OAGG;IACQ,sCAA4B,GAAG,CAAC,MAAgC,EAAE,EAAE;QAC7E,qBAAM,CAAC,OAAO,CAAC,6CAAqB,CAAC,SAAS,EAAE,6BAA6B,MAAM,CAAC,IAAI,CAAC,KAAK,CAAC,IAAI,SAAS,MAAM,CAAC,IAAI,CAAC,UAAU,EAAE,CAAC,CAAC;IACxI,CAAC,CAAC;IAmBF;;;;;OAKG;IACH,SAAgB,iBAAiB,CAAC,IAA8B;QAC9D,OAAO,oBAAoB,CAAC,IAAI,CAAC,GAAG,EAAE,IAAI,CAAC,IAAI,EAAE,QAAQ,CAAuB,CAAC;IACnF,CAAC;IAFe,2BAAiB,oBAEhC,CAAA;IAED;;;;;OAKG;IACH,SAAgB,eAAe,CAAC,IAA8B;QAC5D,OAAO,oBAAoB,CAAC,IAAI,CAAC,GAAG,EAAE,IAAI,CAAC,IAAI,EAAE,MAAM,CAA2B,CAAC;IACrF,CAAC;IAFe,yBAAe,kBAE9B,CAAA;IAED;;;OAGG;IACH,SAAgB,cAAc,CAAC,IAAiC;QAC9D,MAAM,SAAS,GAA6C,EAAE,CAAC;QAC/D,KAAK,MAAM,EAAE,IAAI,IAAI,CAAC,GAAG,EAAE,CAAC;YAC1B,EAAE,CAAC,cAAc,CAAC;gBAChB,IAAI,EAAE,IAAI,CAAC,IAAI;gBACf,WAAW,EAAE,IAAI,CAAC,WAAW;gBAC7B,WAAW,EAAE,IAAI,CAAC,WAAW;gBAC7B,QAAQ,EAAE,CAAC,KAAK,EAAE,EAAE;oBAClB,KAAK,MAAM,IAAI,IAAI,KAAK,EAAE,CAAC;wBACzB,SAAS,CAAC,IAAI,CAAC,EAAE,EAAE,EAAE,IAAI,EAAE,CAAC,CAAC;oBAC/B,CAAC;gBACH,CAAC;aACF,CAAC,CAAC;QACL,CAAC;QAED,IAAI,CAAC,QAAQ,CAAC,SAAS,CAAC,CAAC;IAC3B,CAAC;IAhBe,wBAAc,iBAgB7B,CAAA;AACH,CAAC,EAtFgB,SAAS,yBAAT,SAAS,QAsFzB","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 Workspace\r\n */\r\n\r\nimport { AccessToken, BeEvent, ITwinError, Logger, Optional, UnexpectedErrors } from \"@itwin/core-bentley\";\r\nimport { DbCloudContainerInfo, LocalDirName, LocalFileName } from \"@itwin/core-common\";\r\nimport { CloudSqlite } from \"../CloudSqlite\";\r\nimport { SQLiteDb } from \"../SQLiteDb\";\r\nimport { SettingName, Settings, SettingsDictionary, SettingsPriority } from \"./Settings\";\r\nimport type { IModelJsNative } from \"@bentley/imodeljs-native\";\r\nimport { BackendLoggerCategory } from \"../BackendLoggerCategory\";\r\nimport { _implementationProhibited } from \"../internal/Symbols\";\r\n\r\n/** The unique identifier of a [[WorkspaceContainer]]. This becomes the base name for a local file directory holding the container's [[WorkspaceDb]]s.\r\n * A valid `WorkspaceContainerId` must conform to the following constraints:\r\n * - Consist solely of a combination of lower case letters, numbers, and dashes.\r\n * - May not start or end with a dash.\r\n * - Must be at least 3 characters long and no longer than 63 characters.\r\n * @beta\r\n */\r\nexport type WorkspaceContainerId = string;\r\n\r\n/** Properties describing a [[WorkspaceContainer]] for methods like [[Workspace.getContainerAsync]].\r\n * @beta\r\n */\r\nexport interface WorkspaceContainerProps extends Optional<CloudSqlite.ContainerAccessProps, \"accessToken\"> {\r\n /** Whether to synchronize the container via [[CloudSqlite.CloudContainer.checkForChanges]] whenever it is connected to a [[CloudSqlite.CloudCache]].\r\n * @note This property defaults to `true`.\r\n */\r\n readonly syncOnConnect?: boolean;\r\n /** A user-friendly description of the container's contents. */\r\n readonly description?: string;\r\n /** A message to display to the user if problems occur while loading the container. */\r\n readonly loadingHelp?: string;\r\n}\r\n\r\n/** The base name of a [[WorkspaceDb]], without any version information.\r\n * The name must conform to the following constraints:\r\n * - Case-insensitively unique among all [[WorkspaceDb]]s in the same [[WorkspaceContainer]].\r\n * - Between 1 and 255 characters in length.\r\n * - A legal filename on both [Windows](https://learn.microsoft.com/en-us/windows/win32/fileio/naming-a-file#naming-conventions) and UNIX.\r\n * - Contain none of the following characters: forward or backward slash, period, single or double quote, backtick, and \"#\".\r\n * - Begin or end with a whitespace character.\r\n * @see [[WorkspaceDbFullName]] for the fully-specified name, including version information.\r\n * @beta\r\n */\r\nexport type WorkspaceDbName = string;\r\n\r\n/** The fully-specified name of a [[WorkspaceDb]], combining its [[WorkspaceDbName]] and [[WorkspaceDbVersion]] in the format \"name:version\".\r\n * @beta\r\n */\r\nexport type WorkspaceDbFullName = string;\r\n\r\n/** A [semver](https://github.com/npm/node-semver) string describing the version of a [[WorkspaceDb]], e.g., \"4.2.11\".\r\n * @beta\r\n */\r\nexport type WorkspaceDbVersion = CloudSqlite.DbVersion;\r\n\r\n/** A [semver string](https://github.com/npm/node-semver?tab=readme-ov-file#ranges) describing a range of acceptable [[WorkspaceDbVersion]]s,\r\n * e.g., \">=1.2.7 <1.3.0\".\r\n * @beta\r\n */\r\nexport type WorkspaceDbVersionRange = CloudSqlite.DbVersionRange;\r\n\r\n/** Specifies the name and version of a [[WorkspaceDb]].\r\n * @beta\r\n */\r\nexport type WorkspaceDbNameAndVersion = Optional<CloudSqlite.DbNameAndVersion, \"dbName\">;\r\n\r\n/** Properties that specify how to load a [[WorkspaceDb]] within a [[WorkspaceContainer]].\r\n * @beta\r\n */\r\nexport interface WorkspaceDbProps extends WorkspaceDbNameAndVersion {\r\n /** If true, allow semver [prerelease versions](https://github.com/npm/node-semver?tab=readme-ov-file#prerelease-tags), e.g., \"1.4.2-beta.0\".\r\n * By default, only released version are allowed.\r\n */\r\n readonly includePrerelease?: boolean;\r\n /** If true, start a prefetch operation whenever this [[WorkspaceDb]] is opened, to begin downloading pages of the database before they are needed. */\r\n readonly prefetch?: boolean;\r\n}\r\n\r\n/** Properties describing a [[WorkspaceDb]] and the [[WorkspaceContainer]] containing it.\r\n * @beta\r\n */\r\nexport interface WorkspaceDbCloudProps extends WorkspaceDbProps, WorkspaceContainerProps, DbCloudContainerInfo { }\r\n\r\n/** A function supplied as [[WorkspaceDbQueryResourcesArgs.callback]] to be invoked to process the requested resources.\r\n * @beta\r\n */\r\nexport type WorkspaceDbQueryResourcesCallback = (resourceNames: Iterable<string>) => void;\r\n\r\n/** Arguments supplied to [[WorkspaceDb.queryResources]].\r\n * @beta\r\n */\r\nexport interface WorkspaceDbQueryResourcesArgs {\r\n /** The type of resource to query. */\r\n type?: \"string\" | \"blob\";\r\n /** A pattern against which to compare the name of each resource, using [[nameCompare]] as the comparison operator.\r\n * Only resources whose names match the pattern will be included in the query results.\r\n */\r\n namePattern?: string;\r\n /** The comparison operator by which to compare the name of each resource to [[namePattern]].\r\n * Only resources whose names match the pattern will be included in the query results.\r\n * Ignored if [[namePattern]] is undefined.\r\n */\r\n nameCompare?: \"GLOB\" | \"LIKE\" | \"NOT GLOB\" | \"NOT LIKE\" | \"=\" | \"<\" | \">\";\r\n /** A function invoked to process the resources that match the query criterion. */\r\n callback: WorkspaceDbQueryResourcesCallback;\r\n}\r\n\r\n/** Metadata stored inside a [[WorkspaceDb]] describing the database's contents, to help users understand the purpose of the [[WorkspaceDb]], who to\r\n * contact with questions about it, and so on.\r\n * @note Only the [[workspaceName]] field is required, and users may add additional fields for their own purposes.\r\n * @note Since the information is stored inside of the [[WorkspaceDb]], it is versioned along with the rest of the contents.\r\n * @beta\r\n */\r\nexport interface WorkspaceDbManifest {\r\n /** The name of the [[WorkspaceDb]] to be shown in user interfaces. Organizations should attempt to make this name informative enough\r\n * so that users may refer to this name in conversations. It should also be unique enough that there's no confusion when it appears in\r\n * lists of WorkspaceDbs.\r\n * @note it is possible and valid to change the workspaceName between new version of a WorkspaceDb (e.g. incorporating a date).\r\n */\r\n readonly workspaceName: string;\r\n /** A description of the contents of this [[WorkspaceDb]] to help users understand its purpose and appropriate usage. */\r\n readonly description?: string;\r\n /** The name of the person to contact with questions about this [[WorkspaceDb]]. */\r\n readonly contactName?: string;\r\n /** The user who held the write lock during the most recent edit session that closed this [[WorkspaceDb]]. */\r\n readonly lastEditedBy?: string;\r\n /** The UTC ISO-8601 time of the most recent edit session close for this [[WorkspaceDb]]. */\r\n readonly lastEditedAt?: string;\r\n}\r\n\r\n/**\r\n * An exception thrown when attempting to load a [[WorkspaceDb]] or some of its data; for example, if the [[WorkspaceDb]] could not be found or the user\r\n * is not authorized to access its [[WorkspaceContainer]].\r\n * @beta\r\n */\r\nexport interface WorkspaceDbLoadError extends ITwinError {\r\n /** The properties of the [[WorkspaceDb]] that was attempted to load, including the identity of its [[WorkspaceContainer]]. */\r\n wsDbProps?: WorkspaceDbProps & Partial<WorkspaceDbCloudProps>;\r\n /** The [[WorkspaceDb]] in which the error occurred, if available. */\r\n wsDb?: WorkspaceDb;\r\n}\r\n\r\n/** An exception that may occur while opening an [[IModelDb]] if any problems are detected while loading its [[IModelDb.workspace]].\r\n * This exception is never actually thrown; instead, after the iModel is opened, the exception is forwarded to [[Workspace.exceptionDiagnosticFn]]\r\n * so that the user can be notified of the problems.\r\n * @beta\r\n */\r\nexport interface WorkspaceDbLoadErrors extends ITwinError {\r\n /** An array of problems that were encountered attempting to load [[WorkspaceDb]]s for an [[IModelDb]]. The most common problem\r\n * is that the user doesn't have read access to one or more [[WorkspaceContainer]]s used by the iModel's [[Workspace]]..\r\n */\r\n wsLoadErrors?: WorkspaceDbLoadError[];\r\n}\r\n\r\n/** Specifies a resource inside a [[WorkspaceDb]] that holds a [[SettingsDictionary]] to load into [[Workspace.settings]].\r\n * Settings of this type named [[WorkspaceSettingNames.settingsWorkspaces]] are automatically loaded by [[Workspace.loadSettingsDictionary]].\r\n * @beta\r\n */\r\nexport interface WorkspaceDbSettingsProps extends WorkspaceDbCloudProps {\r\n /** The name of the resource holding the stringified JSON of the [[SettingsDictionary]].\r\n * Defaults to `\"settingsDictionary\"`, which matches the key used by\r\n * [[EditableWorkspaceDb.updateSettingsResource]] to write settings. You should generally omit this\r\n * field unless you need to load settings stored under a non-standard key.\r\n */\r\n resourceName?: string;\r\n /** The priority to assign to the [[SettingsDictionary]]. */\r\n priority: SettingsPriority;\r\n}\r\n\r\n/** The name of a blob, string, or file resource stored in a [[WorkspaceDb]].\r\n * Resource names must conform to the following constraints:\r\n * - At least 1 character and no more than 1024 characters in length.\r\n * - No leading or trailing whitespace characters.\r\n * Each resource of a given type must has a unique name within the [[WorkspaceDb]]. It is technically possible, but discouraged, to define\r\n * resources with the same name but different types.\r\n * @beta\r\n */\r\nexport type WorkspaceResourceName = string;\r\n\r\n/** A SQLite database in a [[Workspace]] containing named resources that the application is configured to use.\r\n * Resources are referred to by their [[WorkspaceResourceName]]s and can represent any number of things, including:\r\n * - [GeographicCRS]($common)es used to define the coordinate reference system of an iTwin.\r\n * - [[SettingsDictionary]]'s that contribute to the [[Workspace.settings]].\r\n * - Files that can be extracted temporarily to the local file system to be accessed by programs directly from disk.\r\n *\r\n * Ultimately, each resource is stored in one of the following formats:\r\n * - A `string`, which is often a stringified `JSON` representation of the resource;\r\n * - A binary `blob`; or\r\n * - An embedded file.\r\n *\r\n * Strings and blobs can be accessed directly using [[getString]] and [[getBlob]]. Files must first be copied to the local file system using [[getFile]], and should be avoided unless the software\r\n * that uses them is written to access them from disk.\r\n *\r\n * A `WorkspaceDb` resides in a [[WorkspaceContainer]] that can be published to the cloud. Once published, the `WorkspaceDb` becomes immutable.\r\n * However, multiple versions of a single `WorkspaceDb` can be created, allowing the [[Workspace]] contents to evolve over time.\r\n * `WorkspaceDb`s use [semantic versioning](https://github.com/npm/node-semver).\r\n *\r\n * The set of available `WorkspaceDb`s available for use for specific purposes are defined in the [[Workspace]]'s [[Settings]]. You can obtain\r\n * a single `WorkspaceDb` using [[WorkspaceContainer.getWorkspaceDb]], but more commonly you will use [[Workspace.getWorkspaceDbs]] to obtain\r\n * a list of all of the `WorkspaceDb`s, sorted by priority, that correspond to a given [[SettingName]].\r\n *\r\n * You can create new `WorkspaceDb`s (or new versions of existing `WorkspaceDb`s) using [[WorkspaceEditor]].\r\n * @beta\r\n */\r\nexport interface WorkspaceDb {\r\n /** @internal */\r\n [_implementationProhibited]: unknown;\r\n /** The [[WorkspaceContainer]] in which this db resides. */\r\n readonly container: WorkspaceContainer;\r\n /** The base name of this WorkspaceDb, without version */\r\n readonly dbName: WorkspaceDbName;\r\n /** An event raised before this WorkspaceDb is [[close]]d. */\r\n readonly onClose: BeEvent<() => void>;\r\n /** The name by which the WorkspaceDb can be opened. This will be either a local file name or the name of a database in a [[CloudSqlite.CloudContainer]]. */\r\n readonly dbFileName: string;\r\n /** The underlying SQLite database that stores this WorkspaceDb's resources. */\r\n readonly sqliteDb: SQLiteDb;\r\n /** Whether the underlying [[sqliteDb]] is currently [[open]]ed. */\r\n readonly isOpen: boolean;\r\n /** The manifest that describes the contents and context of this WorkspaceDb. */\r\n readonly manifest: WorkspaceDbManifest;\r\n /** The version of this WorkspaceDb */\r\n readonly version: WorkspaceDbVersion;\r\n\r\n /** Open the underlying [[sqliteDb]] to perform a query. Generally WorkspaceDbs are left closed and opened/closed as they're used. However,\r\n * when there will be significant activity against a WorkspaceDb, it may be useful to open it before the operations and close it afterwards.\r\n * Methods like [[queryResources]] open the SQLite database automatically and [[close]] it before they return.\r\n */\r\n open(): void;\r\n\r\n /** Close the underlying [[sqliteDb]]. You should call this after [[open]]ing the database and completing your query. */\r\n close(): void;\r\n\r\n /** Look up a string resource by name, if one exists. */\r\n getString(rscName: WorkspaceResourceName): string | undefined;\r\n\r\n /** Look up a binary resource by name, if one exists. */\r\n getBlob(rscName: WorkspaceResourceName): Uint8Array | undefined;\r\n\r\n /** Get a BlobIO reader for a blob WorkspaceResource.\r\n * @note when finished, caller *must* call `close` on the BlobIO.\r\n * @internal\r\n */\r\n getBlobReader(rscName: WorkspaceResourceName): SQLiteDb.BlobIO;\r\n\r\n /**\r\n * Extract a local copy of a file resource from this WorkspaceDb, if present.\r\n * @param rscName The name of the file resource in the WorkspaceDb\r\n * @param targetFileName optional name for extracted file. Some applications require files in specific locations or filenames. If\r\n * you know the full path to use for the extracted file, you can supply it. Generally, it is best to *not* supply the filename and\r\n * keep the extracted files in the directory specified by [[WorkspaceContainer.filesDir]].\r\n * @returns the full path to a file on the local file system, or undefined if the no file named `rscName` exists.\r\n * @note The file is copied from the file into the local file system so it may be accessed directly. This happens only\r\n * as necessary, if the local file doesn't exist, or if it is out-of-date because it was updated in the file.\r\n * For this reason, you should not save the local file name, and instead call this method every time you access it, so its\r\n * content is always holds the correct version.\r\n * @note The filename will be a hash value, not the resource name.\r\n * @note Workspace resource files are set as read-only as they are copied from the file.\r\n * To edit them, you must first copy them to another location.\r\n */\r\n getFile(rscName: WorkspaceResourceName, targetFileName?: LocalFileName): LocalFileName | undefined;\r\n\r\n /**\r\n * Ensure that the contents of this `WorkspaceDb` are downloaded into the local cache so that it may be accessed offline.\r\n * Until the promise resolves, the `WorkspaceDb` is not fully downloaded, but it *may* be safely accessed during the download.\r\n * To determine the progress of the download, use the `localBlocks` and `totalBlocks` values returned by `CloudContainer.queryDatabase`.\r\n * @returns a [[CloudSqlite.CloudPrefetch]] object that can be used to await and/or cancel the prefetch.\r\n * @throws if this WorkspaceDb is not from a [[CloudSqlite.CloudContainer]].\r\n */\r\n prefetch(opts?: CloudSqlite.PrefetchProps): CloudSqlite.CloudPrefetch;\r\n\r\n /** Find resources of a particular type with names matching a specified pattern.\r\n * The matching resources will be supplied to [[WorkspaceDbQueryResourcesArgs.callbackk]].\r\n * @see [[Workspace.queryResources]] to query resources within multiple `WorkspaceDb`s.\r\n */\r\n queryResources(args: WorkspaceDbQueryResourcesArgs): void;\r\n\r\n /** @internal */\r\n queryFileResource(rscName: WorkspaceResourceName): { localFileName: LocalFileName, info: IModelJsNative.EmbedFileQuery } | undefined;\r\n}\r\n\r\n/** Options supplied to [[IModelHost.startup]] via [[IModelHostOptions.workspace]] to customize the initialization of [[IModelHost.appWorkspace]].\r\n * @beta\r\n */\r\nexport interface WorkspaceOpts {\r\n /** The local directory for non-cloud-based [[WorkspaceDb]] files. The [[Workspace]] API will look in this directory\r\n * for files named `${containerId}/${dbId}.itwin-workspace`.\r\n * @note if not supplied, defaults to \"iTwin/Workspace\" in the user-local folder.\r\n */\r\n containerDir?: LocalDirName;\r\n\r\n /** The name(s) of one or more local JSON files containing [[SettingsDictionary]]s to load when initializing the [[Workspace]]. */\r\n settingsFiles?: LocalFileName | LocalFileName[];\r\n}\r\n\r\n/** Arguments supplied to [[Workspace.getContainer]] and [[WorkspaceEditor.getContainer]].\r\n * @beta\r\n */\r\nexport interface GetWorkspaceContainerArgs extends WorkspaceContainerProps {\r\n /** Token required to access the container. */\r\n accessToken: AccessToken;\r\n}\r\n\r\n/**\r\n * Settings and resources that customize an application for the current session.\r\n * See the [learning article]($docs/learning/backend/Workspace) for a detailed overiew and examples.\r\n * @beta\r\n */\r\nexport interface Workspace {\r\n /** @internal */\r\n [_implementationProhibited]: unknown;\r\n\r\n /** The settings db sources used to populate this workspace, if available.\r\n * Useful for reloading the same workspace data later without querying container discovery services.\r\n */\r\n settingsSources?: WorkspaceDbSettingsProps | WorkspaceDbSettingsProps[];\r\n\r\n /** The directory for local WorkspaceDb files with the name `${containerId}/${dbId}.itwin-workspace`.\r\n * @internal\r\n */\r\n readonly containerDir: LocalDirName;\r\n\r\n /** The current [[Settings]] for this Workspace */\r\n readonly settings: Settings;\r\n\r\n /** Get the cloud cache for cloud-based [[WorkspaceContainer]]s. */\r\n getCloudCache(): CloudSqlite.CloudCache;\r\n\r\n /** Search for a container previously opened by [[getContainer]] or [[getContainerAsync]].\r\n * @param containerId The id of the container\r\n * @returns the [[WorkspaceContainer]] for `containerId`, or `undefined` if no such container has been opened.\r\n * @internal\r\n */\r\n findContainer(containerId: WorkspaceContainerId): WorkspaceContainer | undefined;\r\n\r\n /** Obtain the [[WorkspaceContainer]] specified by `props`.\r\n * @param props The properties of the `WorkspaceContainer`, opening it if it is not already opened.\r\n * Otherwise it is created.\r\n * @note This function allows a `WorkspaceContainer.Props` without its [AccessToken]($bentley). It will attempt to obtain one from the [[BlobContainer]] service,\r\n * hence this function is async.\r\n * @see [[getContainer]] to obtain a container synchronously.\r\n */\r\n getContainerAsync(props: WorkspaceContainerProps): Promise<WorkspaceContainer>;\r\n\r\n /** Get a WorkspaceContainer with a supplied access token. This function is synchronous and may be used if:\r\n * - a valid [AccessToken]($bentley) is already available;\r\n * - the container has already been previously prefetched in another session (this is useful for offline usage); or\r\n * - the container is public and doesn't require an [AccessToken]($bentley).\r\n * @see [[getContainerAsync]] to obtain a container asynchronously if the above conditions do not apply.\r\n */\r\n getContainer(props: GetWorkspaceContainerArgs): WorkspaceContainer;\r\n\r\n /** Load a [[SettingsDictionary]] from the specified [[WorkspaceDb]] and add it to this workspace's current [[Settings]].\r\n * @note this function will load the dictionaries from the supplied list, and it will also call itself recursively for any entries in\r\n * the loaded Settings with the name [[WorkspaceSettingNames.settingsWorkspaces]]. In this manner, WorkspaceSettings may be \"chained\" together so that loading one\r\n * causes its \"dependent\" WorkspaceSettings to be loaded. Its `Promise` is resolved after all have been loaded (or failed to load).\r\n */\r\n loadSettingsDictionary(\r\n /** The properties of the [[WorkspaceDb]], plus the resourceName and [[SettingsPriority]]. May be either a single value or an array of them */\r\n props: WorkspaceDbSettingsProps | WorkspaceDbSettingsProps[],\r\n /** If present, an array that is populated with a list of problems while attempting to load the [[SettingsDictionary]](s). */\r\n problems?: WorkspaceDbLoadError[]\r\n ): Promise<void>;\r\n\r\n /** Get a single [[WorkspaceDb]]. */\r\n getWorkspaceDb(props: WorkspaceDbCloudProps): Promise<WorkspaceDb>;\r\n\r\n /**\r\n * Resolve the value of all [[Setting]]s from this workspace with the supplied `settingName` into an array of [[WorkspaceDbCloudProps]]\r\n * that can be used to query or load workspace resources. The settings must each be an array of type [[WorkspaceDbSettingsProps]].\r\n * The returned array will be sorted according to their [[SettingsPriority]], with the first entry being the highest priority [[WorkspaceDb]].\r\n * @note The list is built by combining, in order, all of the settings with the supplied [[SettingName]]. It may therefore include the\r\n * properties of same WorkspaceDb multiple times. This list is automatically de-duped by [[getWorkspaceDb]].\r\n * @note This function is rarely used directly. Usually it is called by [[getWorkspaceDbs]]. However, this function is synchronous and may sometimes\r\n * be useful for editors, tests, or diagnostics.\r\n */\r\n resolveWorkspaceDbSetting(\r\n /** the name of the setting. */\r\n settingName: SettingName,\r\n /** optional filter to choose specific WorkspaceDbs from the settings values. If present, only those WorkspaceDbs for which the filter returns `true` will be included. */\r\n filter?: Workspace.DbListFilter): WorkspaceDbCloudProps[];\r\n\r\n /**\r\n * Get a sorted array of [[WorkspaceDb]]s that can be used to query or load resources. If the arguments supply a `settingName`, this function will\r\n * use [[resolveWorkspaceDbSetting]] to get get the array of [[WorkspaceDbCloudProps]].\r\n * @returns A `Promise` resolving to an array of [[WorkspaceDb]]s sorted by [[SettingsPriority]] so that resources found in WorkspaceDbs earlier in the list take precedence\r\n * over ones with the same name in later WorkspaceDbs. No WorkspaceDb will appear more than once in the list.\r\n * @note this function may request an [AccessToken]($bentley) for each WorkspaceDb if necessary, and hence is asynchronous.\r\n */\r\n getWorkspaceDbs(\r\n args: Workspace.DbListOrSettingName & {\r\n /** if supplied, this array is populated with a list of problems (e.g. no read permission) attempting to load WorkspacesDbs. */\r\n problems?: WorkspaceDbLoadError[];\r\n /** only valid when called with a settingName, if so passed as `filter` argument to [[resolveWorkspaceDbSetting]] */\r\n filter?: Workspace.DbListFilter;\r\n }): Promise<WorkspaceDb[]>;\r\n}\r\n\r\n/**\r\n * Base interface for containers backed by [[CloudSqlite]] that hold versioned databases (e.g. [[WorkspaceDb]]s).\r\n * Provides the shared infrastructure for cloud access, local file caching, and semver-based database resolution.\r\n * @note Not every container is associated with a [[CloudSqlite.CloudContainer]] — containers may also be loaded from the local file system.\r\n * In this case, [[cloudContainer]] will be `undefined`.\r\n * @see [[WorkspaceContainer]] for workspace-specific containers.\r\n * @beta\r\n */\r\nexport interface CloudSqliteContainer {\r\n /** @internal */\r\n [_implementationProhibited]: unknown;\r\n /** the local directory where this container will store temporary files extracted for file-resources.\r\n * @internal\r\n */\r\n readonly filesDir: LocalDirName;\r\n /** The workspace into which this container was loaded. */\r\n readonly workspace: Workspace;\r\n /** Cloud container for this container, or `undefined` if this is a local container. */\r\n readonly cloudContainer?: CloudSqlite.CloudContainer;\r\n /** Properties supplied when this container was loaded */\r\n readonly fromProps: WorkspaceContainerProps;\r\n\r\n /**\r\n * Find the fully-qualified name of a database satisfying the name and version criteria specified by `props`.\r\n * @throws Error if no version satisfying the criteria exists.\r\n */\r\n resolveDbFileName(props: WorkspaceDbProps): WorkspaceDbFullName;\r\n}\r\n\r\n/**\r\n * A [[CloudSqliteContainer]] that holds one or more [[WorkspaceDb]]s. Normally a WorkspaceContainer will hold (many versions of) a single WorkspaceDb.\r\n * Each version of a WorkspaceDb is treated as immutable after it is created and is stored in the WorkspaceContainer indefinitely. That means that\r\n * older versions of the WorkspaceDb may continue to be used, for example by archived projects. For programmers familiar with [NPM](https://www.npmjs.com/), this is conceptually\r\n * similar and versioning follows the same rules as NPM using [Semantic Versioning](https://semver.org/).\r\n * @note It is possible to store more than one WorkspaceDb in the same WorkspaceContainer, but access rights are administered per WorkspaceContainer.\r\n * That is, if a user has rights to access a WorkspaceContainer, that right applies to all WorkspaceDbs in the WorkspaceContainer.\r\n * @see [[Workspace.getContainer]] and [[Workspace.getContainerAsync]] to load a container.\r\n * @beta\r\n */\r\nexport interface WorkspaceContainer extends CloudSqliteContainer {\r\n /** @internal */\r\n addWorkspaceDb(toAdd: WorkspaceDb): void;\r\n\r\n /** Obtain a [[WorkspaceDb]] satisfying the name and version criteria specified by `props`.\r\n * Repeated calls that resolve to the same WorkspaceDb return the same cached instance until it is closed.\r\n */\r\n getWorkspaceDb(props?: WorkspaceDbProps): WorkspaceDb;\r\n\r\n /** Close and remove a currently opened [[WorkspaceDb]] from this Workspace.\r\n * @internal\r\n */\r\n closeWorkspaceDb(container: WorkspaceDb): void;\r\n}\r\n\r\nfunction makeSettingName(name: string) {\r\n return `${\"itwin/core/workspace\"}/${name}`;\r\n}\r\n\r\n/** The names of various [[Setting]]s with special meaning to the [[Workspace]] system.\r\n * @beta\r\n */\r\nexport namespace WorkspaceSettingNames {\r\n /** The name of a setting that, when present in a [[WorkspaceDb]] loaded by [[Workspace.loadSettingsDictionary]], will automatically\r\n * be used to find and load additional [[SettingsDictionary]]'s in other [[WorkspaceDb]]s. This permits you to chain the settings inside on [[WorkspaceDb]]\r\n * to others upon which they depend.\r\n * This setting's value is an array of [[WorkspaceDbSettingsProps]]s.\r\n */\r\n export const settingsWorkspaces = makeSettingName(\"settingsWorkspaces\");\r\n}\r\n\r\n/** A function supplied as part of a [[QueryWorkspaceResourcesArgs]] to iterate the resources retrieved by [[Workspace.queryResources]].\r\n * The `resources` object should only be used inside the function - it is an error to attempt to iterate it after the function returns.\r\n * @beta\r\n */\r\nexport type QueryWorkspaceResourcesCallback = (resources: Iterable<{ name: string, db: WorkspaceDb }>) => void;\r\n\r\n/** Arguments supplied to [[Workspace.queryResources]] defining the query criteria and the list of [[WorkspaceDb]]s to query.\r\n * @beta\r\n */\r\nexport interface QueryWorkspaceResourcesArgs {\r\n /** The list of `WorkspaceDb`s to query, in the order in which they are to be queried.\r\n * @see [[Workspace.resolveWorkspaceDbSetting]] or [[Workspace.getWorkspaceDbs]] to obtain an appropriate list of `WorkspaceDb`s.\r\n */\r\n dbs: WorkspaceDb[];\r\n /** The type of resource to query. */\r\n type?: \"string\" | \"blob\";\r\n /** A pattern against which to compare the name of each resource, using [[nameCompare]] as the comparison operator.\r\n * Only resources whose names match the pattern will be included in the query results.\r\n */\r\n namePattern?: string;\r\n /** The comparison operator by which to compare the name of each resource to [[namePattern]].\r\n * Only resources whose names match the pattern will be included in the query results.\r\n * Ignored i [[namePattern]] is undefined.\r\n */\r\n nameCompare?: \"GLOB\" | \"LIKE\" | \"NOT GLOB\" | \"NOT LIKE\" | \"=\" | \"<\" | \">\";\r\n /** A function invoked to process the resources that match the query criteria. */\r\n callback: QueryWorkspaceResourcesCallback;\r\n}\r\n\r\nfunction getWorkspaceResource(dbs: WorkspaceDb[], name: string, type: \"string\" | \"blob\"): string | Uint8Array | undefined {\r\n for (const db of dbs) {\r\n const val = type === \"blob\" ? db.getBlob(name) : db.getString(name);\r\n if (undefined !== val) {\r\n return val;\r\n }\r\n }\r\n\r\n return undefined;\r\n}\r\n\r\n/** Arguments supplied to [[Workspace.getStringResource]] and [[WOrkspace.getBlobResource]].\r\n * @beta\r\n */\r\nexport interface GetWorkspaceResourceArgs {\r\n /** The list of `WorkspaceDb`s to search, in the order in which they are to be searched.\r\n * @see [[Workspace.resolveWorkspaceDbSetting]] or [[Workspace.getWorkspaceDbs]] to obtain an appropriate list of `WorkspaceDb`s.\r\n */\r\n dbs: WorkspaceDb[];\r\n /** The name of the resource to find. */\r\n name: WorkspaceResourceName;\r\n}\r\n\r\n/** @beta */\r\nexport namespace Workspace {\r\n /** A function invoked to handle exceptions produced while loading workspace data.\r\n * Applications can override this function to notify the user and/or attempt to diagnose the problem.\r\n * The default implementation simply logs each exception.\r\n */\r\n export let exceptionDiagnosticFn = (e: WorkspaceDbLoadErrors) => { // eslint-disable-line prefer-const\r\n if (e instanceof Error)\r\n Logger.logError(BackendLoggerCategory.Workspace, e);\r\n else\r\n UnexpectedErrors.handle(e);\r\n };\r\n\r\n /** Arguments supplied to [[Workspace.onSettingsDictionaryLoadedFn]] for every [[SettingsDictionary]] that is loaded from a [[WorkspaceDb]]. */\r\n export interface SettingsDictionaryLoaded {\r\n /** The dictionary that was loaded */\r\n dict: SettingsDictionary;\r\n /** The WorkspaceDb from which the dictionary was loaded. */\r\n from: WorkspaceDb;\r\n }\r\n\r\n /** A function invoked each time any [[SettingsDictionary]] is loaded from a [[WorkspaceDb]].\r\n * Applications can override this function to notify the user and/or record diagnostics.\r\n * The default implementation simply records an information message in the [Logger]($bentley).\r\n */\r\n export let onSettingsDictionaryLoadedFn = (loaded: SettingsDictionaryLoaded) => { // eslint-disable-line prefer-const\r\n Logger.logInfo(BackendLoggerCategory.Workspace, `loaded setting dictionary ${loaded.dict.props.name} from ${loaded.from.dbFileName}`);\r\n };\r\n\r\n /** Either an array of [[WorkspaceDbCloudProps]] or the name of a [[Setting]] that resolves to an array of [[WorkspaceDbCloudProps]].\r\n * Used by [[Workspace.getWorkspaceDbs]].\r\n */\r\n export type DbListOrSettingName = { readonly dbs: WorkspaceDbCloudProps[], readonly settingName?: never } | { readonly settingName: SettingName, readonly dbs?: never };\r\n\r\n /** In arguments supplied to [[Workspace.getWorkspaceDbs]] and [[Workspace.resolveWorkspaceDbSetting]], an optional function used to exclude some\r\n * [[WorkspaceDb]]s. Only those [[WorkspaceDb]]s for which the function returns `true` will be included.\r\n */\r\n export type DbListFilter = (\r\n /** The properties of the WorkspaceDb to be returned */\r\n dbProp: WorkspaceDbCloudProps,\r\n /** The SettingsDictionary holding the [[WorkspaceSettingNames.settingsWorkspace]] setting. May be used, for example, to determine the\r\n * [[SettingsPriority]] of the dictionary.\r\n */\r\n dict: SettingsDictionary\r\n ) => boolean;\r\n\r\n /** Searches a list of [[WorkspaceDb]]s for a string resource of a given name.\r\n * The list is searched in order, and the first resource with the request name is returned.\r\n * If no such resource exists, the function returns `undefined`.\r\n * @see [[WorkspaceDb.getString]] if you only need to search a single `WorkspaceDb`.\r\n * @beta\r\n */\r\n export function getStringResource(args: GetWorkspaceResourceArgs): string | undefined {\r\n return getWorkspaceResource(args.dbs, args.name, \"string\") as string | undefined;\r\n }\r\n\r\n /** Searches a list of [[WorkspaceDb]]s for a blob resource of a given name.\r\n * The list is searched in order, and the first resource with the request name is returned.\r\n * If no such resource exists, the function returns `undefined`.\r\n * @see [[WorkspaceDb.getblob]] if you only need to search a single `WorkspaceDb`.\r\n * @beta\r\n */\r\n export function getBlobResource(args: GetWorkspaceResourceArgs): Uint8Array | undefined {\r\n return getWorkspaceResource(args.dbs, args.name, \"blob\") as Uint8Array | undefined;\r\n }\r\n\r\n /** Query a list of [[WorkspaceDb]]s to find resources of a particular type with names matching a specified pattern.\r\n * @see [[WorkspaceDb.queryResources]] if you only need to query a single `WorkspaceDb`.\r\n * @beta\r\n */\r\n export function queryResources(args: QueryWorkspaceResourcesArgs): void {\r\n const resources: Array<{ name: string, db: WorkspaceDb }> = [];\r\n for (const db of args.dbs) {\r\n db.queryResources({\r\n type: args.type,\r\n namePattern: args.namePattern,\r\n nameCompare: args.nameCompare,\r\n callback: (names) => {\r\n for (const name of names) {\r\n resources.push({ db, name });\r\n }\r\n },\r\n });\r\n }\r\n\r\n args.callback(resources);\r\n }\r\n}\r\n"]}
@@ -78,10 +78,17 @@ export type RevertChangesArgs = Optional<PushChangesArgs, "description"> & {
78
78
  * @note return non-zero from this function to abort the download.
79
79
  */
80
80
  onProgress?: ProgressFunction;
81
- /** The index of the changeset to revert to */
81
+ /** The first changeset index to revert (inclusive). All changesets from `toIndex` through the current index are reverted, leaving the briefcase at `toIndex - 1`. */
82
82
  toIndex: ChangesetIndex;
83
83
  /** If present, schema changes are skipped during the revert operation. */
84
84
  skipSchemaChanges?: true;
85
+ /**
86
+ * Specifies the action to take in case of failure during the revert operation. Default is `"revert"`.
87
+ * - `"revert"`: Reverse all local transactions and delete them, restoring the briefcase to its pre-revert state.
88
+ * - `"retain"`: Keep local changes as-is for caller inspection or manual recovery.
89
+ * - `"delete"`: Close the briefcase and delete the local file. If an `accessToken` is available, also release the briefcaseId from iModelHub.
90
+ */
91
+ inCaseOfFailure?: "retain" | "revert" | "delete";
85
92
  };
86
93
  /** Manages downloading Briefcases and downloading and uploading changesets.
87
94
  * @public