@itwin/core-backend 5.8.0-dev.11 → 5.8.0-dev.12

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 (61) hide show
  1. package/lib/cjs/IModelDb.d.ts.map +1 -1
  2. package/lib/cjs/IModelDb.js +0 -3
  3. package/lib/cjs/IModelDb.js.map +1 -1
  4. package/lib/cjs/internal/workspace/SettingsDbImpl.d.ts.map +1 -1
  5. package/lib/cjs/internal/workspace/SettingsDbImpl.js +2 -0
  6. package/lib/cjs/internal/workspace/SettingsDbImpl.js.map +1 -1
  7. package/lib/cjs/internal/workspace/SettingsEditorImpl.d.ts +7 -0
  8. package/lib/cjs/internal/workspace/SettingsEditorImpl.d.ts.map +1 -0
  9. package/lib/cjs/internal/workspace/SettingsEditorImpl.js +266 -0
  10. package/lib/cjs/internal/workspace/SettingsEditorImpl.js.map +1 -0
  11. package/lib/cjs/internal/workspace/SettingsImpl.d.ts +1 -3
  12. package/lib/cjs/internal/workspace/SettingsImpl.d.ts.map +1 -1
  13. package/lib/cjs/internal/workspace/SettingsImpl.js +4 -250
  14. package/lib/cjs/internal/workspace/SettingsImpl.js.map +1 -1
  15. package/lib/cjs/internal/workspace/WorkspaceImpl.d.ts.map +1 -1
  16. package/lib/cjs/internal/workspace/WorkspaceImpl.js +13 -11
  17. package/lib/cjs/internal/workspace/WorkspaceImpl.js.map +1 -1
  18. package/lib/cjs/workspace/SettingsEditor.d.ts +4 -0
  19. package/lib/cjs/workspace/SettingsEditor.d.ts.map +1 -1
  20. package/lib/cjs/workspace/SettingsEditor.js +7 -5
  21. package/lib/cjs/workspace/SettingsEditor.js.map +1 -1
  22. package/lib/cjs/workspace/Workspace.d.ts +3 -1
  23. package/lib/cjs/workspace/Workspace.d.ts.map +1 -1
  24. package/lib/cjs/workspace/Workspace.js.map +1 -1
  25. package/lib/cjs/workspace/WorkspaceEditor.d.ts +4 -1
  26. package/lib/cjs/workspace/WorkspaceEditor.d.ts.map +1 -1
  27. package/lib/cjs/workspace/WorkspaceEditor.js +2 -0
  28. package/lib/cjs/workspace/WorkspaceEditor.js.map +1 -1
  29. package/lib/esm/IModelDb.d.ts.map +1 -1
  30. package/lib/esm/IModelDb.js +0 -3
  31. package/lib/esm/IModelDb.js.map +1 -1
  32. package/lib/esm/internal/workspace/SettingsDbImpl.d.ts.map +1 -1
  33. package/lib/esm/internal/workspace/SettingsDbImpl.js +2 -0
  34. package/lib/esm/internal/workspace/SettingsDbImpl.js.map +1 -1
  35. package/lib/esm/internal/workspace/SettingsEditorImpl.d.ts +7 -0
  36. package/lib/esm/internal/workspace/SettingsEditorImpl.d.ts.map +1 -0
  37. package/lib/esm/internal/workspace/SettingsEditorImpl.js +263 -0
  38. package/lib/esm/internal/workspace/SettingsEditorImpl.js.map +1 -0
  39. package/lib/esm/internal/workspace/SettingsImpl.d.ts +1 -3
  40. package/lib/esm/internal/workspace/SettingsImpl.d.ts.map +1 -1
  41. package/lib/esm/internal/workspace/SettingsImpl.js +5 -251
  42. package/lib/esm/internal/workspace/SettingsImpl.js.map +1 -1
  43. package/lib/esm/internal/workspace/WorkspaceImpl.d.ts.map +1 -1
  44. package/lib/esm/internal/workspace/WorkspaceImpl.js +13 -11
  45. package/lib/esm/internal/workspace/WorkspaceImpl.js.map +1 -1
  46. package/lib/esm/test/standalone/Workspace.test.js +100 -0
  47. package/lib/esm/test/standalone/Workspace.test.js.map +1 -1
  48. package/lib/esm/test/workspace/SettingsDb.test.js +95 -2
  49. package/lib/esm/test/workspace/SettingsDb.test.js.map +1 -1
  50. package/lib/esm/workspace/SettingsEditor.d.ts +4 -0
  51. package/lib/esm/workspace/SettingsEditor.d.ts.map +1 -1
  52. package/lib/esm/workspace/SettingsEditor.js +6 -4
  53. package/lib/esm/workspace/SettingsEditor.js.map +1 -1
  54. package/lib/esm/workspace/Workspace.d.ts +3 -1
  55. package/lib/esm/workspace/Workspace.d.ts.map +1 -1
  56. package/lib/esm/workspace/Workspace.js.map +1 -1
  57. package/lib/esm/workspace/WorkspaceEditor.d.ts +4 -1
  58. package/lib/esm/workspace/WorkspaceEditor.d.ts.map +1 -1
  59. package/lib/esm/workspace/WorkspaceEditor.js +2 -0
  60. package/lib/esm/workspace/WorkspaceEditor.js.map +1 -1
  61. 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 { GetSettingsDbArgs, SettingsDb, settingsResourceName } from \"../../workspace/SettingsDb\";\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, 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 { SettingsDbImpl } from \"./SettingsDbImpl\";\r\nimport { SettingsImpl } from \"./SettingsImpl\";\r\nimport { _implementationProhibited, _nativeDb } from \"../Symbols\";\r\nimport { getOnlineStatus } from \"../OnlineStatus\";\r\nimport { BlobContainer } from \"../../BlobContainerService\";\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<WorkspaceDbName, 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 container = this.cloudContainer;\r\n if (undefined === container)\r\n return join(this.dirName, `${props.dbName}.${workspaceDbFileExt}`); // local file, versions not allowed\r\n\r\n return CloudSqlite.querySemverMatch({ ...props, container, dbName: workspaceDbNameWithDefault(props.dbName) });\r\n }\r\n\r\n public addWorkspaceDb(toAdd: WorkspaceDb) {\r\n if (undefined !== this._wsDbs.get(toAdd.dbName))\r\n WorkspaceError.throwError(\"already-exists\", { message: `workspaceDb '${toAdd.dbName}' already exists in workspace` });\r\n this._wsDbs.set(toAdd.dbName, toAdd);\r\n }\r\n\r\n public getWorkspaceDb(props?: WorkspaceDbProps): WorkspaceDb {\r\n return this._wsDbs.get(workspaceDbNameWithDefault(props?.dbName)) ?? new WorkspaceDbImpl(props ?? {}, this);\r\n }\r\n\r\n public closeWorkspaceDb(toDrop: WorkspaceDb) {\r\n const name = toDrop.dbName;\r\n const wsDb = this._wsDbs.get(name);\r\n if (wsDb === toDrop) {\r\n this._wsDbs.delete(name);\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.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 getSettingsDb(args: GetSettingsDbArgs): SettingsDb {\r\n const container = this.findContainer(args.containerId);\r\n if (undefined === container)\r\n WorkspaceError.throwError(\"does-not-exist\", { message: `No settings container found for containerId \"${args.containerId}\"` });\r\n\r\n const settingsDb = new SettingsDbImpl({ dbName: args.dbName ?? \"settings-db\", version: args.version }, container, args.priority);\r\n\r\n if (!settingsDb.hasSettingsManifestProperty)\r\n WorkspaceError.throwError(\"does-not-exist\", { message: `Container \"${args.containerId}\" does not contain a SettingsDb — missing settings manifest` });\r\n\r\n return settingsDb;\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 for (const prop of props) {\r\n const db = await this.getWorkspaceDb(prop);\r\n db.open();\r\n try {\r\n const manifest = db.manifest;\r\n const resourceName = prop.resourceName ?? settingsResourceName;\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 db.close(); // don't leave this db open in case we're going to find another dictionary in it recursively.\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 db.close();\r\n problems?.push(e as WorkspaceDbLoadError);\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\nconst settingsEditorCacheName = \"SettingsEditor\";\r\nclass SettingsEditorWorkspaceImpl extends WorkspaceImpl {\r\n public override getCloudCache(): WorkspaceCloudCache {\r\n return this._cloudCache ??= makeWorkspaceCloudCache({ cacheName: settingsEditorCacheName, cacheSize: \"2G\" });\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: \"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 as EditCloudContainer | undefined;\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 db = this._wsDbs.get(workspaceDbNameWithDefault(props.dbName)) 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(workspaceDbNameWithDefault(props.dbName));\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 createDb(args: { dbName?: string, 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)) });\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\nexport function constructSettingsEditorWorkspace(settings: Settings, opts?: WorkspaceOpts): OwnedWorkspace {\r\n return new SettingsEditorWorkspaceImpl(settings, opts);\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":";AAAA;;;+FAG+F;AAC/F;;GAEG;;;AAgwBH,oDAEC;AAED,gDAEC;AAED,4DAEC;AAED,4EAEC;AASD,oEAGC;AASD,gEAEC;AAnyBD,mCAAoC;AACpC,+BAA+B;AAC/B,+BAA8C;AAC9C,sDAAiH;AACjH,oDAAsH;AACtH,mDAAgD;AAChD,iDAA8D;AAC9D,iDAA8C;AAC9C,6CAA0C;AAE1C,uDAA+H;AAC/H,2DAAiG;AAEjG,yDAImC;AACnC,qEAA2N;AAC3N,2DAAwD;AACxD,qDAAkD;AAClD,iDAA8C;AAC9C,wCAAkE;AAClE,kDAAkD;AAClD,qEAA2D;AAE3D,SAAS,0BAA0B,CAAC,MAAwB;IAC1D,OAAO,MAAM,IAAI,cAAc,CAAC;AAClC,CAAC;AAED,4CAA4C;AAC/B,QAAA,kBAAkB,GAAG,iBAAiB,CAAC;AAYpD,SAAS,uBAAuB,CAAC,GAAoC;IACnE,MAAM,KAAK,GAAG,yBAAW,CAAC,WAAW,CAAC,QAAQ,CAAC,GAAG,CAAwB,CAAC;IAC3E,IAAI,SAAS,KAAK,KAAK,CAAC,mBAAmB,EAAE,kDAAkD;QAC7F,yBAAW,CAAC,iBAAiB,CAAC,KAAK,EAAE,qBAAqB,EAAE,IAAI,GAAG,EAAmC,CAAC,CAAC;IAC1G,OAAO,KAAK,CAAC;AACf,CAAC;AAED,SAAS,kBAAkB,CAAC,KAA8B;IACxD,OAAO,GAAG,KAAK,CAAC,OAAO,IAAI,KAAK,CAAC,WAAW,EAAE,CAAC;AACjD,CAAC;AAED,SAAS,0BAA0B,CAAC,KAAuC,EAAE,KAA0B;IACrG,MAAM,EAAE,GAAG,kBAAkB,CAAC,KAAK,CAAC,CAAC;IACrC,IAAI,cAAc,GAAG,KAAK,CAAC,mBAAmB,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;IACvD,IAAI,SAAS,KAAK,cAAc;QAC9B,OAAO,cAAc,CAAC;IAExB,cAAc,GAAG,yBAAW,CAAC,oBAAoB,CAAC,KAAK,CAA4B,CAAC;IACpF,KAAK,CAAC,mBAAmB,CAAC,GAAG,CAAC,EAAE,EAAE,cAAc,CAAC,CAAC;IAClD,cAAc,CAAC,YAAY,GAAG,CAAC,CAAC;IAChC,yBAAW,CAAC,iBAAiB,CAAC,cAAc,EAAE,eAAe,EAAE;QAC7D,IAAI,IAAI,CAAC,YAAY,EAAE,KAAK,CAAC,EAAE,CAAC;YAC9B,IAAI,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC;YACpB,OAAO,IAAI,CAAC;QACd,CAAC;QAED,OAAO,KAAK,CAAC;IACf,CAAC,CAAC,CAAC;IAEH,yBAAW,CAAC,iBAAiB,CAAC,cAAc,EAAE,kBAAkB,EAAE;QAChE,IAAI,EAAE,IAAI,CAAC,YAAY,IAAI,CAAC,EAAE,CAAC;YAC7B,IAAI,CAAC,UAAU,EAAE,CAAC;YAClB,KAAK,CAAC,mBAAmB,CAAC,MAAM,CAAC,EAAE,CAAC,CAAC;YACrC,IAAI,CAAC,YAAY,GAAG,CAAC,CAAC;QACxB,CAAC;IACH,CAAC,CAAC,CAAC;IAEH,OAAO,cAAc,CAAC;AACxB,CAAC;AAED,MAAM,sBAAsB;IACV,CAAC,mCAAyB,CAAC,GAAG,SAAS,CAAC;IACxC,SAAS,CAAgB;IACzB,QAAQ,CAAe;IACvB,EAAE,CAAuB;IACzB,SAAS,CAA0B;IAClC,eAAe,CAAuC;IAEvE,IAAW,cAAc;QACvB,OAAO,IAAI,CAAC,eAAe,CAAC;IAC9B,CAAC;IAES,MAAM,GAAG,IAAI,GAAG,EAAuB,CAAC;IAClD,IAAW,OAAO,KAAK,OAAO,IAAA,WAAI,EAAC,IAAI,CAAC,SAAS,CAAC,YAAY,EAAE,IAAI,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC;IAE3E,YAAmB,SAAwB,EAAE,KAA6D;QACxG,4BAA4B,CAAC,KAAK,CAAC,WAAW,CAAC,CAAC;QAChD,IAAI,CAAC,SAAS,GAAG,SAAS,CAAC;QAC3B,IAAI,CAAC,EAAE,GAAG,KAAK,CAAC,WAAW,CAAC;QAC5B,IAAI,CAAC,SAAS,GAAG,KAAK,CAAC;QAEvB,IAAI,KAAK,CAAC,OAAO,KAAK,EAAE;YACtB,IAAI,CAAC,eAAe,GAAG,0BAA0B,CAAC,KAAK,EAAE,IAAI,CAAC,SAAS,CAAC,aAAa,EAAE,CAAC,CAAC;QAE3F,SAAS,CAAC,YAAY,CAAC,IAAI,CAAC,CAAC;QAC7B,IAAI,CAAC,QAAQ,GAAG,IAAA,WAAI,EAAC,IAAI,CAAC,OAAO,EAAE,OAAO,CAAC,CAAC;QAE5C,MAAM,cAAc,GAAG,IAAI,CAAC,cAAc,CAAC;QAC3C,IAAI,SAAS,KAAK,cAAc;YAC9B,OAAO;QAET,mHAAmH;QACnH,IAAI,cAAc,CAAC,aAAa,EAAE,IAAI,KAAK,KAAK,KAAK,CAAC,aAAa,EAAE,CAAC;YACpE,IAAI,CAAC;gBACH,IAAI,8BAAe,CAAC,kBAAkB,IAAI,8BAAe,CAAC,oBAAoB,EAAE,CAAC;oBAC/E,mFAAmF;oBACnF,oFAAoF;oBACpF,wFAAwF;oBACxF,IAAI,CAAC,IAAA,8BAAe,GAAE,EAAE,CAAC;wBACvB,yEAAyE;wBACzE,6EAA6E;wBAC7E,WAAW;wBACX,OAAO;oBACT,CAAC;gBACH,CAAC;gBACD,cAAc,CAAC,eAAe,EAAE,CAAC;YACnC,CAAC;YAAC,MAAM,CAAC;gBACP,kBAAkB;YACpB,CAAC;QACH,CAAC;IACH,CAAC;IAEM,iBAAiB,CAAC,KAAuB;QAC9C,MAAM,MAAM,GAAG,0BAA0B,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC;QACxD,MAAM,SAAS,GAAG,IAAI,CAAC,cAAc,CAAC;QACtC,IAAI,SAAS,KAAK,SAAS;YACzB,OAAO,IAAA,WAAI,EAAC,IAAI,CAAC,OAAO,EAAE,GAAG,MAAM,IAAI,0BAAkB,EAAE,CAAC,CAAC,CAAC,mCAAmC;QAEnG,OAAO,yBAAW,CAAC,gBAAgB,CAAC,EAAE,GAAG,KAAK,EAAE,SAAS,EAAE,MAAM,EAAE,CAAC,CAAC;IACvE,CAAC;IAEM,cAAc,CAAC,KAAkB;QACtC,IAAI,SAAS,KAAK,IAAI,CAAC,MAAM,CAAC,GAAG,CAAC,KAAK,CAAC,UAAU,CAAC;YACjD,4BAAc,CAAC,UAAU,CAAC,gBAAgB,EAAE,EAAE,OAAO,EAAE,gBAAgB,KAAK,CAAC,MAAM,+BAA+B,EAAE,CAAC,CAAC;QACxH,IAAI,CAAC,MAAM,CAAC,GAAG,CAAC,KAAK,CAAC,UAAU,EAAE,KAAK,CAAC,CAAC;IAC3C,CAAC;IAEM,cAAc,CAAC,KAAwB;QAC5C,MAAM,UAAU,GAAG,IAAI,CAAC,iBAAiB,CAAC,KAAK,IAAI,EAAE,CAAC,CAAC;QACvD,OAAO,IAAI,CAAC,MAAM,CAAC,GAAG,CAAC,UAAU,CAAC,IAAI,IAAI,eAAe,CAAC,KAAK,IAAI,EAAE,EAAE,IAAI,CAAC,CAAC;IAC/E,CAAC;IAEM,gBAAgB,CAAC,MAAmB;QACzC,MAAM,IAAI,GAAG,IAAI,CAAC,MAAM,CAAC,GAAG,CAAC,MAAM,CAAC,UAAU,CAAC,CAAC;QAChD,IAAI,IAAI,KAAK,MAAM,EAAE,CAAC;YACpB,IAAI,CAAC,MAAM,CAAC,MAAM,CAAC,MAAM,CAAC,UAAU,CAAC,CAAC;YACtC,IAAI,CAAC,KAAK,EAAE,CAAC;QACf,CAAC;IACH,CAAC;IAEM,KAAK;QACV,KAAK,MAAM,CAAC,KAAK,EAAE,EAAE,CAAC,IAAI,IAAI,CAAC,MAAM;YACnC,EAAE,CAAC,KAAK,EAAE,CAAC;QACb,IAAI,CAAC,MAAM,CAAC,KAAK,EAAE,CAAC;QACpB,IAAI,CAAC,cAAc,EAAE,gBAAgB,EAAE,CAAC;IAC1C,CAAC;CACF;AAED,oCAAoC;AACpC,MAAM,eAAe;IACH,CAAC,mCAAyB,CAAC,GAAG,SAAS,CAAC;IACxC,QAAQ,GAAG,IAAI,qCAAiB,EAAE,CAAC;IACnC,MAAM,CAAkB;IACrB,UAAU,CAAqB;IAClC,OAAO,GAAG,IAAI,sBAAO,EAAc,CAAC;IACpC,UAAU,CAAS;IACzB,SAAS,CAAuB;IAE1C,iDAAiD;IACjD,IAAW,MAAM,KAAK,OAAO,IAAI,CAAC,QAAQ,CAAC,MAAM,CAAC,CAAC,CAAC;IACpD,IAAW,SAAS,KAAyB,OAAO,IAAI,CAAC,UAAU,CAAC,CAAC,CAAC;IAC/D,iBAAiB,CAAC,OAA8B;QACrD,MAAM,IAAI,GAAG,IAAI,CAAC,QAAQ,CAAC,mBAAS,CAAC,CAAC,iBAAiB,CAAC,OAAO,CAAC,CAAC;QACjE,IAAI,SAAS,KAAK,IAAI;YACpB,OAAO,SAAS,CAAC;QAEnB,iIAAiI;QACjI,IAAI,aAAa,GAAG,IAAA,WAAI,EAAC,IAAI,CAAC,UAAU,CAAC,QAAQ,EAAE,IAAA,mBAAU,EAAC,MAAM,CAAC,CAAC,MAAM,CAAC,IAAI,CAAC,UAAU,CAAC,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC,CAAC;QAC7H,IAAI,IAAI,CAAC,OAAO,KAAK,EAAE,EAAE,8FAA8F;YACrH,aAAa,GAAG,GAAG,aAAa,IAAI,IAAI,CAAC,OAAO,EAAE,CAAC;QACrD,OAAO,EAAE,aAAa,EAAE,IAAI,EAAE,CAAC;IACjC,CAAC;IAED,YAAmB,KAAuB,EAAE,SAA6B;QACvE,IAAI,CAAC,MAAM,GAAG,0BAA0B,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC;QACvD,yBAAW,CAAC,cAAc,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;QACxC,IAAI,CAAC,UAAU,GAAG,SAAS,CAAC;QAC5B,IAAI,CAAC,UAAU,GAAG,SAAS,CAAC,iBAAiB,CAAC,KAAK,CAAC,CAAC;QACrD,SAAS,CAAC,cAAc,CAAC,IAAI,CAAC,CAAC;QAC/B,IAAI,IAAI,KAAK,KAAK,CAAC,QAAQ;YACzB,IAAI,CAAC,QAAQ,EAAE,CAAC;IACpB,CAAC;IAEM,IAAI;QACT,IAAI,CAAC,QAAQ,CAAC,MAAM,CAAC,IAAI,CAAC,UAAU,EAAE,uBAAQ,CAAC,QAAQ,EAAE,IAAI,CAAC,UAAU,CAAC,cAAc,CAAC,CAAC;IAC3F,CAAC;IAEM,KAAK;QACV,IAAI,IAAI,CAAC,MAAM,EAAE,CAAC;YAChB,IAAI,CAAC,OAAO,CAAC,UAAU,EAAE,CAAC;YAC1B,IAAI,CAAC,QAAQ,CAAC,OAAO,EAAE,CAAC;YACxB,IAAI,CAAC,UAAU,CAAC,gBAAgB,CAAC,IAAI,CAAC,CAAC;QACzC,CAAC;IACH,CAAC;IACD,IAAW,OAAO;QAChB,MAAM,cAAc,GAAG,IAAI,CAAC,SAAS,CAAC,cAAc,CAAC;QACrD,IAAI,SAAS,KAAK,cAAc;YAC9B,OAAO,OAAO,CAAC,CAAC,4CAA4C;QAC9D,OAAO,yBAAW,CAAC,eAAe,CAAC,IAAI,CAAC,UAAU,CAAC,CAAC,OAAO,CAAC;IAC9D,CAAC;IAED,IAAW,QAAQ;QACjB,OAAO,IAAI,CAAC,SAAS,KAAK,IAAI,CAAC,UAAU,CAAC,CAAC,EAAE,EAAE,EAAE;YAC/C,MAAM,YAAY,GAAG,EAAE,CAAC,mBAAS,CAAC,CAAC,iBAAiB,CAAC,iCAAyB,EAAE,IAAI,CAAuB,CAAC;YAC5G,OAAO,YAAY,CAAC,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,YAAY,CAAC,CAAC,CAAC,CAAC,EAAE,aAAa,EAAE,IAAI,CAAC,MAAM,EAAE,CAAC;QAClF,CAAC,CAAC,CAAC;IACL,CAAC;IAEO,UAAU,CAAI,SAAuC;QAC3D,MAAM,IAAI,GAAG,IAAI,CAAC,MAAM,CAAC,CAAC,CAAC,GAAG,EAAE,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,EAAE,EAAE,GAAG,EAAE,CAAC,IAAI,CAAC,KAAK,EAAE,CAAC,CAAC;QACzE,IAAI,CAAC;YACH,OAAO,SAAS,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC;QAClC,CAAC;gBAAS,CAAC;YACT,IAAI,EAAE,CAAC;QACT,CAAC;IACH,CAAC;IAEM,SAAS,CAAC,OAA8B;QAC7C,OAAO,IAAI,CAAC,UAAU,CAAC,CAAC,EAAE,EAAE,EAAE;YAC5B,OAAO,EAAE,CAAC,mBAAmB,CAAC,sCAAsC,EAAE,CAAC,IAAI,EAAE,EAAE;gBAC7E,IAAI,CAAC,UAAU,CAAC,CAAC,EAAE,OAAO,CAAC,CAAC;gBAC5B,OAAO,uBAAQ,CAAC,aAAa,KAAK,IAAI,CAAC,IAAI,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC,cAAc,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,SAAS,CAAC;YACrF,CAAC,CAAC,CAAC;QACL,CAAC,CAAC,CAAC;IACL,CAAC;IAEM,aAAa,CAAC,OAA8B;QACjD,OAAO,IAAI,CAAC,QAAQ,CAAC,mBAAmB,CAAC,oCAAoC,EAAE,CAAC,IAAI,EAAE,EAAE;YACtF,IAAI,CAAC,UAAU,CAAC,CAAC,EAAE,OAAO,CAAC,CAAC;YAC5B,MAAM,UAAU,GAAG,mBAAQ,CAAC,YAAY,EAAE,CAAC;YAC3C,UAAU,CAAC,IAAI,CAAC,IAAI,CAAC,QAAQ,CAAC,mBAAS,CAAC,EAAE,EAAE,SAAS,EAAE,OAAO,EAAE,UAAU,EAAE,OAAO,EAAE,GAAG,EAAE,IAAI,CAAC,eAAe,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC;YACrH,OAAO,UAAU,CAAC;QACpB,CAAC,CAAC,CAAC;IACL,CAAC;IAEM,OAAO,CAAC,OAA8B;QAC3C,OAAO,IAAI,CAAC,UAAU,CAAC,CAAC,EAAE,EAAE,EAAE;YAC5B,OAAO,EAAE,CAAC,mBAAmB,CAAC,oCAAoC,EAAE,CAAC,IAAI,EAAE,EAAE;gBAC3E,IAAI,CAAC,UAAU,CAAC,CAAC,EAAE,OAAO,CAAC,CAAC;gBAC5B,OAAO,uBAAQ,CAAC,aAAa,KAAK,IAAI,CAAC,IAAI,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC,YAAY,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,SAAS,CAAC;YACnF,CAAC,CAAC,CAAC;QACL,CAAC,CAAC,CAAC;IACL,CAAC;IAEM,OAAO,CAAC,OAA8B,EAAE,cAA8B;QAC3E,OAAO,IAAI,CAAC,UAAU,CAAC,CAAC,EAAE,EAAE,EAAE;YAC5B,MAAM,IAAI,GAAG,IAAI,CAAC,iBAAiB,CAAC,OAAO,CAAC,CAAC;YAC7C,IAAI,CAAC,IAAI;gBACP,OAAO,SAAS,CAAC;YAEnB,MAAM,IAAI,GAAG,IAAI,CAAC,IAAI,CAAC;YACvB,MAAM,aAAa,GAAG,cAAc,IAAI,IAAI,CAAC,aAAa,CAAC;YAE3D,gDAAgD;YAChD,MAAM,IAAI,GAAG,EAAE,CAAC,UAAU,CAAC,aAAa,CAAC,IAAI,EAAE,CAAC,QAAQ,CAAC,aAAa,CAAC,CAAC;YACxE,IAAI,IAAI,IAAI,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,OAAO,CAAC,KAAK,IAAI,CAAC,IAAI,IAAI,IAAI,CAAC,IAAI,KAAK,IAAI,CAAC,IAAI;gBAC3E,OAAO,aAAa,CAAC,CAAC,kBAAkB;YAE1C,kFAAkF;YAClF,IAAI,IAAI;gBACN,EAAE,CAAC,UAAU,CAAC,aAAa,CAAC,CAAC;;gBAE7B,uBAAU,CAAC,kBAAkB,CAAC,IAAA,cAAO,EAAC,aAAa,CAAC,CAAC,CAAC;YAExD,EAAE,CAAC,mBAAS,CAAC,CAAC,mBAAmB,CAAC,EAAE,IAAI,EAAE,OAAO,EAAE,aAAa,EAAE,CAAC,CAAC;YACpE,MAAM,IAAI,GAAG,IAAI,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;YACjC,EAAE,CAAC,UAAU,CAAC,aAAa,EAAE,IAAI,EAAE,IAAI,CAAC,CAAC,CAAC,oEAAoE;YAC9G,EAAE,CAAC,SAAS,CAAC,aAAa,EAAE,MAAM,CAAC,CAAC,CAAC,oBAAoB;YACzD,OAAO,aAAa,CAAC;QACvB,CAAC,CAAC,CAAC;IACL,CAAC;IAEM,QAAQ,CAAC,IAAgC;QAC9C,MAAM,cAAc,GAAG,IAAI,CAAC,UAAU,CAAC,cAAc,CAAC;QACtD,IAAI,cAAc,KAAK,SAAS;YAC9B,4BAAc,CAAC,UAAU,CAAC,oBAAoB,EAAE,EAAE,OAAO,EAAE,gCAAgC,EAAE,CAAC,CAAC;QACjG,OAAO,yBAAW,CAAC,kBAAkB,CAAC,cAAc,EAAE,IAAI,CAAC,UAAU,EAAE,IAAI,CAAC,CAAC;IAC/E,CAAC;IAEM,cAAc,CAAC,IAAmC;QACvD,MAAM,KAAK,GAAG,MAAM,KAAK,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,OAAO,CAAC;QACzD,IAAI,CAAC,UAAU,CAAC,CAAC,EAAE,EAAE,EAAE;YACrB,MAAM,KAAK,GAAG,SAAS,KAAK,IAAI,CAAC,WAAW,CAAC,CAAC,CAAC,aAAa,IAAI,CAAC,WAAW,IAAI,GAAG,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC;YAC7F,EAAE,CAAC,mBAAmB,CAAC,kBAAkB,KAAK,GAAG,KAAK,EAAE,EAAE,CAAC,IAAI,EAAE,EAAE;gBACjE,QAAQ,CAAC,CAAC,YAAY;oBACpB,OAAO,uBAAQ,CAAC,aAAa,KAAK,IAAI,CAAC,IAAI,EAAE,EAAE,CAAC;wBAC9C,MAAM,IAAI,CAAC,cAAc,CAAC,CAAC,CAAC,CAAC;oBAC/B,CAAC;gBACH,CAAC;gBAED,IAAI,SAAS,KAAK,IAAI,CAAC,WAAW,EAAE,CAAC;oBACnC,IAAI,CAAC,UAAU,CAAC,CAAC,EAAE,IAAI,CAAC,WAAW,CAAC,CAAC;gBACvC,CAAC;gBAED,IAAI,CAAC,QAAQ,CAAC,YAAY,EAAE,CAAC,CAAC;YAChC,CAAC,CAAC,CAAC;QACL,CAAC,CAAC,CAAC;IACL,CAAC;CACF;AAED,kCAAkC;AAClC,MAAM,aAAa;IACD,CAAC,mCAAyB,CAAC,GAAG,SAAS,CAAC;IAChD,WAAW,GAAG,IAAI,GAAG,EAAgD,CAAC;IAC9D,YAAY,CAAe;IAC3B,QAAQ,CAAW;IACzB,WAAW,CAAuB;IACrC,aAAa;QAClB,OAAO,IAAI,CAAC,WAAW,KAAK,uBAAuB,CAAC,EAAE,SAAS,EAAE,WAAW,EAAE,SAAS,EAAE,KAAK,EAAE,CAAC,CAAC;IACpG,CAAC;IAED,YAAmB,QAAkB,EAAE,IAAoB;QACzD,IAAI,CAAC,QAAQ,GAAG,QAAQ,CAAC;QACzB,IAAI,CAAC,YAAY,GAAG,IAAI,EAAE,YAAY,IAAI,IAAA,WAAI,EAAC,uBAAU,CAAC,QAAQ,EAAE,WAAW,CAAC,CAAC;QACjF,IAAI,aAAa,GAAG,IAAI,EAAE,aAAa,CAAC;QACxC,IAAI,aAAa,EAAE,CAAC;YAClB,IAAI,OAAO,aAAa,KAAK,QAAQ;gBACnC,aAAa,GAAG,CAAC,aAAa,CAAC,CAAC;YAClC,aAAa,CAAC,OAAO,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,QAAQ,CAAC,OAAO,CAAC,IAAI,EAAE,2BAAgB,CAAC,WAAW,CAAC,CAAC,CAAC;QACxF,CAAC;IACH,CAAC;IAEM,YAAY,CAAC,KAA6B;QAC/C,IAAI,SAAS,KAAK,IAAI,CAAC,WAAW,CAAC,GAAG,CAAC,KAAK,CAAC,EAAE,CAAC;YAC9C,4BAAc,CAAC,UAAU,CAAC,kBAAkB,EAAE,EAAE,OAAO,EAAE,aAAa,KAAK,CAAC,EAAE,8BAA8B,EAAE,CAAC,CAAC;QAClH,IAAI,CAAC,WAAW,CAAC,GAAG,CAAC,KAAK,CAAC,EAAE,EAAE,KAAK,CAAC,CAAC;IACxC,CAAC;IAEM,aAAa,CAAC,WAAiC;QACpD,OAAO,IAAI,CAAC,WAAW,CAAC,GAAG,CAAC,WAAW,CAAC,CAAC;IAC3C,CAAC;IAEM,YAAY,CAAC,KAAgC;QAClD,OAAO,IAAI,CAAC,aAAa,CAAC,KAAK,CAAC,WAAW,CAAC,IAAI,IAAI,sBAAsB,CAAC,IAAI,EAAE,KAAK,CAAC,CAAC;IAC1F,CAAC;IAEM,KAAK,CAAC,iBAAiB,CAAC,KAA8B;QAC3D,IAAI,KAAK,CAAC,WAAW;YACnB,OAAO,IAAI,CAAC,YAAY,CAAC,EAAE,GAAG,KAAK,EAAE,WAAW,EAAE,KAAK,CAAC,WAAW,EAAE,CAAC,CAAC;QAEzE,MAAM,WAAW,GAAG,CAAC,KAAK,CAAC,OAAO,KAAK,EAAE,IAAI,KAAK,CAAC,QAAQ,CAAC;YAC1D,CAAC,CAAC,EAAE;YACJ,CAAC,CAAC,MAAM,yBAAW,CAAC,YAAY,CAAC,EAAE,GAAG,KAAK,EAAE,WAAW,EAAE,MAAM,EAAE,CAAC,CAAC;QACtE,OAAO,IAAI,CAAC,YAAY,CAAC,EAAE,GAAG,KAAK,EAAE,WAAW,EAAE,CAAC,CAAC;IACtD,CAAC;IAEM,KAAK,CAAC,cAAc,CAAC,KAA4B;QACtD,IAAI,SAAS,GAAmC,IAAI,CAAC,aAAa,CAAC,KAAK,CAAC,WAAW,CAAC,CAAC;QACtF,IAAI,SAAS,KAAK,SAAS,EAAE,CAAC;YAC5B,MAAM,WAAW,GAAG,KAAK,CAAC,QAAQ,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,MAAM,yBAAW,CAAC,YAAY,CAAC,EAAE,WAAW,EAAE,MAAM,EAAE,GAAG,KAAK,EAAE,CAAC,CAAC;YAC5G,SAAS,GAAG,IAAI,sBAAsB,CAAC,IAAI,EAAE,EAAE,GAAG,KAAK,EAAE,WAAW,EAAE,CAAC,CAAC;QAC1E,CAAC;QACD,OAAO,SAAS,CAAC,cAAc,CAAC,KAAK,CAAC,CAAC;IACzC,CAAC;IAEM,aAAa,CAAC,IAAuB;QAC1C,MAAM,SAAS,GAAG,IAAI,CAAC,aAAa,CAAC,IAAI,CAAC,WAAW,CAAC,CAAC;QACvD,IAAI,SAAS,KAAK,SAAS;YACzB,4BAAc,CAAC,UAAU,CAAC,gBAAgB,EAAE,EAAE,OAAO,EAAE,gDAAgD,IAAI,CAAC,WAAW,GAAG,EAAE,CAAC,CAAC;QAEhI,MAAM,UAAU,GAAG,IAAI,+BAAc,CAAC,EAAE,MAAM,EAAE,IAAI,CAAC,MAAM,IAAI,aAAa,EAAE,OAAO,EAAE,IAAI,CAAC,OAAO,EAAE,EAAE,SAAS,EAAE,IAAI,CAAC,QAAQ,CAAC,CAAC;QAEjI,IAAI,CAAC,UAAU,CAAC,2BAA2B;YACzC,4BAAc,CAAC,UAAU,CAAC,gBAAgB,EAAE,EAAE,OAAO,EAAE,cAAc,IAAI,CAAC,WAAW,6DAA6D,EAAE,CAAC,CAAC;QAExJ,OAAO,UAAU,CAAC;IACpB,CAAC;IAEM,KAAK,CAAC,sBAAsB,CAAC,KAA4D,EAAE,QAAiC;QACjI,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,KAAK,CAAC;YACvB,KAAK,GAAG,CAAC,KAAK,CAAC,CAAC;QAElB,KAAK,MAAM,IAAI,IAAI,KAAK,EAAE,CAAC;YACzB,MAAM,EAAE,GAAG,MAAM,IAAI,CAAC,cAAc,CAAC,IAAI,CAAC,CAAC;YAC3C,EAAE,CAAC,IAAI,EAAE,CAAC;YACV,IAAI,CAAC;gBACH,MAAM,QAAQ,GAAG,EAAE,CAAC,QAAQ,CAAC;gBAC7B,MAAM,YAAY,GAAG,IAAI,CAAC,YAAY,IAAI,iCAAoB,CAAC;gBAC/D,MAAM,SAAS,GAA4B,EAAE,IAAI,EAAE,YAAY,EAAE,WAAW,EAAE,EAAE,EAAE,QAAQ,EAAE,IAAI,CAAC,QAAQ,EAAE,CAAC;gBAC5G,0GAA0G;gBAC1G,IAAI,SAAS,KAAK,IAAI,CAAC,QAAQ,CAAC,aAAa,CAAC,SAAS,CAAC,EAAE,CAAC;oBACzD,MAAM,YAAY,GAAG,EAAE,CAAC,SAAS,CAAC,YAAY,CAAC,CAAC;oBAChD,IAAI,SAAS,KAAK,YAAY;wBAC5B,yBAAyB,CAAC,+CAA+C,YAAY,YAAY,QAAQ,CAAC,aAAa,GAAG,EAAE,IAAI,EAAE,EAAE,CAAC,CAAC;oBAExI,EAAE,CAAC,KAAK,EAAE,CAAC,CAAC,6FAA6F;oBAEzG,IAAI,CAAC,QAAQ,CAAC,OAAO,CAAC,SAAS,EAAE,YAAY,CAAC,CAAC;oBAC/C,MAAM,IAAI,GAAG,IAAI,CAAC,QAAQ,CAAC,aAAa,CAAC,SAAS,CAAC,CAAC;oBACpD,IAAI,IAAI,EAAE,CAAC;wBACT,qBAAS,CAAC,4BAA4B,CAAC,EAAE,IAAI,EAAE,IAAI,EAAE,EAAE,EAAE,CAAC,CAAC;wBAC3D,gGAAgG;wBAChG,MAAM,MAAM,GAAG,IAAI,CAAC,UAAU,CAA6B,iCAAqB,CAAC,kBAAkB,CAAC,CAAC;wBACrG,IAAI,MAAM,KAAK,SAAS,EAAE,CAAC;4BACzB,uBAAU,CAAC,eAAe,CAAC,eAAe,CAA6B,MAAM,EAAE,iCAAqB,CAAC,kBAAkB,CAAC,CAAC;4BACzH,MAAM,IAAI,CAAC,sBAAsB,CAAC,MAAM,EAAE,QAAQ,CAAC,CAAC;wBACtD,CAAC;oBACH,CAAC;gBACH,CAAC;YACH,CAAC;YAAC,OAAO,CAAC,EAAE,CAAC;gBACX,EAAE,CAAC,KAAK,EAAE,CAAC;gBACX,QAAQ,EAAE,IAAI,CAAC,CAAyB,CAAC,CAAC;YAC5C,CAAC;QACH,CAAC;IACH,CAAC;IAEM,KAAK;QACV,IAAI,CAAC,QAAQ,CAAC,KAAK,EAAE,CAAC;QACtB,KAAK,MAAM,CAAC,GAAG,EAAE,SAAS,CAAC,IAAI,IAAI,CAAC,WAAW;YAC7C,SAAS,CAAC,KAAK,EAAE,CAAC;QACpB,IAAI,CAAC,WAAW,CAAC,KAAK,EAAE,CAAC;IAC3B,CAAC;IAEM,yBAAyB,CAAC,WAAwB,EAAE,MAA+B;QACxF,MAAM,UAAU,GAAG,uBAAU,CAAC,eAAe,CAAC,WAAW,CAAC,GAAG,CAAC,WAAW,CAAC,CAAC;QAC3E,MAAM,OAAO,GAAG,UAAU,EAAE,YAAY,KAAK,IAAI,CAAC;QAClD,MAAM,GAAG,MAAM,IAAI,CAAC,GAAG,EAAE,CAAC,IAAI,CAAC,CAAC;QAChC,MAAM,MAAM,GAA4B,EAAE,CAAC;QAC3C,KAAK,MAAM,KAAK,IAAI,IAAI,CAAC,QAAQ,CAAC,iBAAiB,CAA0B,WAAW,CAAC,EAAE,CAAC;YAC1F,KAAK,MAAM,MAAM,IAAI,KAAK,CAAC,KAAK,EAAE,CAAC;gBACjC,IAAI,MAAM,CAAC,MAAM,EAAE,KAAK,CAAC,UAAU,CAAC,EAAE,CAAC;oBACrC,MAAM,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;gBACtB,CAAC;YACH,CAAC;YAED,IAAI,CAAC,OAAO,EAAE,CAAC;gBACb,MAAM;YACR,CAAC;QACH,CAAC;QAED,OAAO,MAAM,CAAC;IAChB,CAAC;IAEM,KAAK,CAAC,eAAe,CAAC,IAA4G;QACvI,MAAM,MAAM,GAAG,CAAC,IAAI,CAAC,WAAW,KAAK,SAAS,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,yBAAyB,CAAC,IAAI,CAAC,WAAW,EAAE,IAAI,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC;QAC3H,MAAM,MAAM,GAAkB,EAAE,CAAC;QACjC,MAAM,UAAU,GAAG,CAAC,IAAiB,EAAE,EAAE;YACvC,KAAK,MAAM,EAAE,IAAI,MAAM,EAAE,CAAC;gBACxB,qIAAqI;gBACrI,+FAA+F;gBAC/F,IAAI,EAAE,KAAK,IAAI,IAAI,CAAC,CAAC,EAAE,CAAC,SAAS,CAAC,cAAc,KAAK,IAAI,CAAC,SAAS,CAAC,cAAc,CAAC,IAAI,CAAC,EAAE,CAAC,UAAU,KAAK,IAAI,CAAC,UAAU,CAAC,CAAC;oBACzH,OAAO,CAAC,uBAAuB;YACnC,CAAC;YACD,MAAM,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;QACpB,CAAC,CAAC;QAEF,KAAK,MAAM,OAAO,IAAI,MAAM,EAAE,CAAC;YAC7B,IAAI,CAAC;gBACH,UAAU,CAAC,MAAM,IAAI,CAAC,cAAc,CAAC,OAAO,CAAC,CAAC,CAAC;YACjD,CAAC;YAAC,OAAO,CAAC,EAAE,CAAC;gBACX,MAAM,OAAO,GAAG,CAAyB,CAAC;gBAC1C,OAAO,CAAC,SAAS,GAAG,OAAO,CAAC;gBAC5B,IAAI,CAAC,QAAQ,EAAE,IAAI,CAAC,OAAO,CAAC,CAAC;YAC/B,CAAC;QACH,CAAC;QACD,OAAO,MAAM,CAAC;IAChB,CAAC;CACF;AAED,MAAM,mBAAmB,GAAG,iBAAiB,CAAC,CAAC,6CAA6C;AAC5F,MAAM,mBAAoB,SAAQ,aAAa;IAC7B,aAAa;QAC3B,OAAO,IAAI,CAAC,WAAW,KAAK,uBAAuB,CAAC,EAAE,SAAS,EAAE,mBAAmB,EAAE,SAAS,EAAE,KAAK,EAAE,CAAC,CAAC;IAC5G,CAAC;CACF;AAED,MAAM,uBAAuB,GAAG,gBAAgB,CAAC;AACjD,MAAM,2BAA4B,SAAQ,aAAa;IACrC,aAAa;QAC3B,OAAO,IAAI,CAAC,WAAW,KAAK,uBAAuB,CAAC,EAAE,SAAS,EAAE,uBAAuB,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;IAC/G,CAAC;CACF;AAED,MAAM,UAAU;IACE,CAAC,mCAAyB,CAAC,GAAG,SAAS,CAAC;IACjD,SAAS,GAAG,IAAI,mBAAmB,CAAC,IAAI,2BAAY,EAAE,EAAE,EAAE,YAAY,EAAE,IAAA,WAAI,EAAC,uBAAU,CAAC,QAAQ,EAAE,mBAAmB,CAAC,EAAE,CAAC,CAAC;IAE1H,KAAK,CAAC,mBAAmB,CAAC,IAAqC;QACpE,MAAM,WAAY,SAAQ,yBAAW,CAAC,QAA2B;YACrD,MAAM,CAAU,UAAU,GAAG,mBAAmB,CAAC;YACpD,MAAM,CAAC,KAAK,CAAC,mBAAmB,CAAC,IAAqC;gBAC3E,MAAM,KAAK,GAAG,MAAM,IAAI,CAAC,mBAAmB,CAAC,EAAE,KAAK,EAAE,IAAI,CAAC,KAAK,EAAE,QAAQ,EAAE,EAAE,GAAG,IAAI,CAAC,QAAQ,EAAE,aAAa,EAAE,WAAW,EAAE,EAAE,CAAC,CAAC;gBAChI,MAAM,UAAU,GAAG,yBAAW,CAAC,cAAc,CAAC,0BAA0B,CAAC,IAAI,CAAC,MAAM,CAAC,EAAE,OAAO,CAAC,CAAC;gBAChG,MAAM,KAAK,CAAC,aAAa,CAAC,EAAE,GAAG,IAAI,EAAE,KAAK,EAAE,MAAM,EAAE,UAAU,EAAE,MAAM,EAAE,qCAAiB,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;gBAC9G,OAAO,KAAK,CAAC;YACf,CAAC;;QAEH,OAAO,WAAW,CAAC,mBAAmB,CAAC,IAAI,CAAC,CAAC;IAC/C,CAAC;IAEM,KAAK,CAAC,uBAAuB,CAAC,IAAqC;QACxE,MAAM,cAAc,GAAG,MAAM,IAAI,CAAC,mBAAmB,CAAC,IAAI,CAAC,CAAC;QAC5D,MAAM,SAAS,GAAG,MAAM,uBAAU,CAAC,mBAAmB,EAAE,cAAc,EAAE,CAAC;QACzE,MAAM,WAAW,GAAG,MAAM,yBAAW,CAAC,YAAY,CAAC,EAAE,GAAG,cAAc,EAAE,WAAW,EAAE,OAAO,EAAE,SAAS,EAAE,CAAC,CAAC;QAC3G,OAAO,IAAI,CAAC,YAAY,CAAC,EAAE,WAAW,EAAE,GAAG,cAAc,EAAE,SAAS,EAAE,IAAI,EAAE,WAAW,EAAE,IAAI,CAAC,QAAQ,CAAC,WAAW,EAAE,CAAC,CAAC;IACxH,CAAC;IAEM,YAAY,CAAC,KAAgC;QAClD,OAAO,IAAI,CAAC,SAAS,CAAC,aAAa,CAAC,KAAK,CAAC,WAAW,CAA2C,IAAI,IAAI,mBAAmB,CAAC,IAAI,CAAC,SAAS,EAAE,KAAK,CAAC,CAAC;IACrJ,CAAC;IACM,KAAK,CAAC,iBAAiB,CAAC,KAA8B;QAC3D,IAAI,KAAK,CAAC,WAAW;YACnB,OAAO,IAAI,CAAC,YAAY,CAAC,EAAE,GAAG,KAAK,EAAE,WAAW,EAAE,KAAK,CAAC,WAAW,EAAE,CAAC,CAAC;QAEzE,MAAM,WAAW,GAAG,CAAC,KAAK,CAAC,OAAO,KAAK,EAAE,CAAC;YACxC,CAAC,CAAC,EAAE;YACJ,CAAC,CAAC,MAAM,yBAAW,CAAC,YAAY,CAAC,EAAE,GAAG,KAAK,EAAE,WAAW,EAAE,OAAO,EAAE,CAAC,CAAC;QACvE,OAAO,IAAI,CAAC,YAAY,CAAC,EAAE,GAAG,KAAK,EAAE,WAAW,EAAE,CAAC,CAAC;IACtD,CAAC;IAEM,KAAK,CAAC,cAAc,CAAC,IAAoD;QAC9E,MAAM,UAAU,GAAG,MAAM,iCAAiB,CAAC,eAAe,CAAC,IAAI,CAAC,CAAC;QACjE,MAAM,SAAS,GAAG,MAAM,uBAAU,CAAC,cAAc,EAAE,CAAC;QACpD,MAAM,OAAO,GAAiC,EAAE,CAAC;QACjD,KAAK,MAAM,aAAa,IAAI,UAAU,EAAE,CAAC;YACvC,mHAAmH;YACnH,oEAAoE;YACpE,MAAM,UAAU,GAAG,MAAM,oCAAa,CAAC,OAAQ,CAAC,YAAY,CAAC,EAAE,WAAW,EAAE,aAAa,CAAC,WAAW,EAAE,SAAS,EAAE,WAAW,EAAE,OAAO,EAAE,CAAC,CAAC;YAC1I,OAAO,CAAC,IAAI,CAAC,IAAI,CAAC,YAAY,CAAC;gBAC7B,WAAW,EAAE,aAAa,CAAC,WAAW;gBACtC,OAAO,EAAE,UAAU,CAAC,OAAO;gBAC3B,WAAW,EAAE,UAAU,CAAC,QAAQ;gBAChC,WAAW,EAAE,UAAU,CAAC,KAAK;gBAC7B,SAAS,EAAE,IAAI;aAChB,CAAC,CAAC,CAAC;QACN,CAAC;QACD,OAAO,OAAO,CAAC;IACjB,CAAC;IAEM,KAAK;QACV,IAAI,CAAC,SAAS,CAAC,KAAK,EAAE,CAAC;IACzB,CAAC;CACF;AAMD,MAAM,mBAAoB,SAAQ,sBAAsB;IACtD,IAAoB,cAAc;QAChC,OAAO,KAAK,CAAC,cAAgD,CAAC;IAChE,CAAC;IAED,IAAW,UAAU;QACnB,MAAM,cAAc,GAAG,IAAI,CAAC,cAAc,CAAC;QAC3C,IAAI,SAAS,KAAK,cAAc;YAC9B,OAAO,SAAS,CAAC;QACnB,OAAO;YACL,OAAO,EAAE,cAAc,CAAC,OAAO;YAC/B,WAAW,EAAE,cAAc,CAAC,WAAW;YACvC,WAAW,EAAE,cAAc,CAAC,WAAiC;YAC7D,QAAQ,EAAE,cAAc,CAAC,QAAQ;SAClC,CAAC;IACJ,CAAC;IAEM,KAAK,CAAC,2BAA2B,CAAC,IAAqC;QAC5E,MAAM,SAAS,GAAG,IAAI,CAAC,cAAc,CAAC;QACtC,IAAI,SAAS,KAAK,SAAS;YACzB,4BAAc,CAAC,UAAU,CAAC,oBAAoB,EAAE,EAAE,OAAO,EAAE,mCAAmC,EAAE,CAAC,CAAC;QAEpG,MAAM,MAAM,GAAG,EAAE,GAAG,IAAI,CAAC,SAAS,EAAE,MAAM,EAAE,0BAA0B,CAAC,IAAI,CAAC,SAAS,EAAE,MAAM,CAAC,EAAE,CAAC;QACjG,OAAO,yBAAW,CAAC,kBAAkB,CAAC,SAAS,EAAE,EAAE,GAAG,IAAI,EAAE,MAAM,EAAE,CAAC,CAAC;IACxE,CAAC;IAEe,cAAc,CAAC,KAAuB;QACpD,OAAO,IAAI,CAAC,aAAa,CAAC,KAAK,CAAC,CAAC;IACnC,CAAC;IAEM,aAAa,CAAC,KAAuB;QAC1C,MAAM,UAAU,GAAG,IAAI,CAAC,iBAAiB,CAAC,KAAK,CAAC,CAAC;QACjD,MAAM,EAAE,GAAG,IAAI,CAAC,MAAM,CAAC,GAAG,CAAC,UAAU,CAA+B,IAAI,IAAI,cAAc,CAAC,KAAK,EAAE,IAAI,CAAC,CAAC;QAExG,IAAI,IAAI,CAAC,cAAc,IAAI,CAAC,yBAAW,CAAC,gBAAgB,CAAC,EAAE,CAAC,UAAU,EAAE,IAAI,CAAC,cAAc,CAAC,EAAE,CAAC;YAC7F,IAAI,CAAC,MAAM,CAAC,MAAM,CAAC,UAAU,CAAC,CAAC;YAC/B,8BAAgB,CAAC,UAAU,CAAC,mBAAmB,EAAE,EAAE,OAAO,EAAE,GAAG,EAAE,CAAC,UAAU,oEAAoE,EAAE,CAAC,CAAC;QACtJ,CAAC;QAED,OAAO,EAAE,CAAC;IACZ,CAAC;IAEM,gBAAgB,CAAC,IAAY;QAClC,IAAI,IAAI,CAAC,cAAc,EAAE,CAAC;YACxB,IAAI,CAAC,cAAc,CAAC,gBAAgB,CAAC,IAAI,CAAC,CAAC;YAC3C,IAAI,CAAC,cAAc,CAAC,eAAe,GAAG,IAAI,CAAC;QAC7C,CAAC;IACH,CAAC;IACM,gBAAgB;QACrB,IAAI,IAAI,CAAC,cAAc,EAAE,CAAC;YACxB,IAAI,CAAC,cAAc,CAAC,gBAAgB,EAAE,CAAC;YACvC,IAAI,CAAC,cAAc,CAAC,eAAe,GAAG,SAAS,CAAC;QAClD,CAAC;IACH,CAAC;IAEM,cAAc;QACnB,IAAI,IAAI,CAAC,cAAc,EAAE,CAAC;YACxB,IAAI,CAAC,cAAc,CAAC,cAAc,EAAE,CAAC;YACrC,IAAI,CAAC,cAAc,CAAC,eAAe,GAAG,SAAS,CAAC;QAClD,CAAC;IACH,CAAC;IAEM,KAAK,CAAC,QAAQ,CAAC,IAAsF;QAC1G,IAAI,CAAC,IAAI,CAAC,cAAc,EAAE,CAAC;YACzB,iCAAe,CAAC,aAAa,CAAC,EAAE,aAAa,EAAE,IAAI,CAAC,iBAAiB,CAAC,IAAI,CAAC,EAAE,QAAQ,EAAE,IAAI,CAAC,QAAQ,EAAE,CAAC,CAAC;QAC1G,CAAC;aAAM,CAAC;YACN,0HAA0H;YAC1H,MAAM,UAAU,GAAG,IAAA,WAAI,EAAC,2BAAc,CAAC,MAAM,EAAE,SAAS,0BAAkB,EAAE,CAAC,CAAC;YAC9E,IAAI,EAAE,CAAC,UAAU,CAAC,UAAU,CAAC;gBAC3B,uBAAU,CAAC,UAAU,CAAC,UAAU,CAAC,CAAC;YAEpC,iCAAe,CAAC,aAAa,CAAC,EAAE,aAAa,EAAE,UAAU,EAAE,QAAQ,EAAE,IAAI,CAAC,QAAQ,EAAE,CAAC,CAAC;YACtF,MAAM,yBAAW,CAAC,QAAQ,CAAC,IAAI,CAAC,cAAc,EAAE,EAAE,aAAa,EAAE,UAAU,EAAE,MAAM,EAAE,yBAAW,CAAC,cAAc,CAAC,0BAA0B,CAAC,IAAI,CAAC,MAAM,CAAC,EAAE,IAAI,CAAC,OAAO,CAAC,EAAE,CAAC,CAAC;YAC1K,uBAAU,CAAC,UAAU,CAAC,UAAU,CAAC,CAAC;QACpC,CAAC;QAED,OAAO,IAAI,CAAC,cAAc,CAAC,IAAI,CAAC,CAAC;IACnC,CAAC;CACF;AAED,MAAM,cAAe,SAAQ,eAAe;IAC1C,IAAoB,SAAS;QAC3B,IAAA,qBAAM,EAAC,IAAI,CAAC,UAAU,YAAY,mBAAmB,CAAC,CAAC;QACvD,OAAO,IAAI,CAAC,UAAU,CAAC;IACzB,CAAC;IAEO,MAAM,CAAC,oBAAoB,CAAC,IAA2B;QAC7D,IAAI,IAAI,CAAC,IAAI,EAAE,KAAK,IAAI;YACtB,4BAAc,CAAC,UAAU,CAAC,cAAc,EAAE,EAAE,OAAO,EAAE,uDAAuD,EAAE,CAAC,CAAC;QAElH,IAAI,IAAI,CAAC,MAAM,GAAG,IAAI,EAAE,CAAC;YACvB,4BAAc,CAAC,UAAU,CAAC,cAAc,EAAE,EAAE,OAAO,EAAE,wBAAwB,EAAE,CAAC,CAAC;QACnF,CAAC;IACH,CAAC;IAEO,oBAAoB,CAAC,GAAwB;QACnD,MAAM,GAAG,GAAG,OAAO,GAAG,KAAK,QAAQ,CAAC,CAAC,CAAC,GAAG,CAAC,MAAM,CAAC,CAAC,CAAC,GAAG,CAAC,UAAU,CAAC;QAClE,IAAI,GAAG,GAAG,CAAC,IAAI,GAAG,IAAI,GAAG,IAAI,CAAC,EAAE,eAAe;YAC7C,4BAAc,CAAC,UAAU,CAAC,WAAW,EAAE,EAAE,OAAO,EAAE,oBAAoB,EAAE,CAAC,CAAC;IAC9E,CAAC;IACD,IAAW,UAAU;QACnB,MAAM,KAAK,GAAI,IAAI,CAAC,UAAkC,CAAC,UAA4C,CAAC;QACpG,IAAI,KAAK,KAAK,SAAS;YACrB,OAAO,SAAS,CAAC;QAEnB,MAAM,MAAM,GAAG,yBAAW,CAAC,eAAe,CAAC,IAAI,CAAC,UAAU,CAAC,CAAC;QAC5D,OAAO,EAAE,GAAG,KAAK,EAAE,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,EAAE,MAAM,CAAC,OAAO,EAAE,CAAC;IACtE,CAAC;IAEe,IAAI;QAClB,IAAI,CAAC,QAAQ,CAAC,MAAM,CAAC,IAAI,CAAC,UAAU,EAAE,uBAAQ,CAAC,SAAS,EAAE,IAAI,CAAC,UAAU,CAAC,cAAc,CAAC,CAAC;IAC5F,CAAC;IAEe,KAAK;QACnB,IAAI,IAAI,CAAC,MAAM,EAAE,CAAC;YAChB,sFAAsF;YACtF,MAAM,YAAY,GAAI,IAAI,CAAC,UAAU,CAAC,cAAsB,EAAE,eAAe,CAAC;YAC9E,IAAI,YAAY,KAAK,SAAS;gBAC5B,IAAI,CAAC,cAAc,CAAC,EAAE,GAAG,IAAI,CAAC,QAAQ,EAAE,YAAY,EAAE,CAAC,CAAC;YAE1D,mDAAmD;YACnD,IAAI,CAAC,QAAQ,CAAC,WAAW,EAAE,CAAC;QAC9B,CAAC;QACD,KAAK,CAAC,KAAK,EAAE,CAAC;IAChB,CAAC;IAEO,mBAAmB,CAAC,aAA4B;QACtD,OAAO,IAAI,CAAC,KAAK,CAAC,EAAE,CAAC,QAAQ,CAAC,aAAa,CAAC,CAAC,OAAO,CAAC,CAAC;IACxD,CAAC;IAEO,eAAe,CAAC,OAA8B,EAAE,GAAW,EAAE,IAAsC;QACzG,IAAI,CAAC,QAAQ,CAAC,mBAAmB,CAAC,GAAG,EAAE,CAAC,IAAI,EAAE,EAAE;YAC9C,IAAI,CAAC,UAAU,CAAC,CAAC,EAAE,OAAO,CAAC,CAAC;YAC5B,IAAI,EAAE,CAAC,IAAI,CAAC,CAAC;YACb,MAAM,EAAE,GAAG,IAAI,CAAC,IAAI,EAAE,CAAC;YACvB,IAAI,uBAAQ,CAAC,cAAc,KAAK,EAAE,EAAE,CAAC;gBACnC,IAAI,uBAAQ,CAAC,+BAA+B,KAAK,EAAE;oBACjD,4BAAc,CAAC,UAAU,CAAC,iBAAiB,EAAE,EAAE,OAAO,EAAE,aAAa,OAAO,kBAAkB,EAAE,CAAC,CAAC;gBAEpG,4BAAc,CAAC,UAAU,CAAC,aAAa,EAAE,EAAE,OAAO,EAAE,cAAc,GAAG,SAAS,EAAE,EAAE,EAAE,CAAC,CAAC;YACxF,CAAC;QACH,CAAC,CAAC,CAAC;QACH,IAAI,CAAC,QAAQ,CAAC,WAAW,EAAE,CAAC;IAC9B,CAAC;IAEM,cAAc,CAAC,QAA6B;QACjD,IAAI,CAAC,QAAQ,CAAC,mBAAS,CAAC,CAAC,gBAAgB,CAAC,iCAAyB,EAAE,IAAI,CAAC,SAAS,CAAC,QAAQ,CAAC,CAAC,CAAC;QAC/F,IAAI,CAAC,SAAS,GAAG,SAAS,CAAC;IAC7B,CAAC;IACM,sBAAsB,CAAC,QAA2B,EAAE,OAAgB;QACzE,IAAI,CAAC,YAAY,CAAC,OAAO,IAAI,oBAAoB,EAAE,IAAI,CAAC,SAAS,CAAC,QAAQ,CAAC,CAAC,CAAC;IAC/E,CAAC;IACM,SAAS,CAAC,OAA8B,EAAE,GAAW;QAC1D,cAAc,CAAC,oBAAoB,CAAC,OAAO,CAAC,CAAC;QAC7C,IAAI,CAAC,oBAAoB,CAAC,GAAG,CAAC,CAAC;QAC/B,IAAI,CAAC,eAAe,CAAC,OAAO,EAAE,2CAA2C,EAAE,CAAC,IAAI,EAAE,EAAE,CAAC,IAAI,CAAC,UAAU,CAAC,CAAC,EAAE,GAAG,CAAC,CAAC,CAAC;IAChH,CAAC;IACM,YAAY,CAAC,OAA8B,EAAE,GAAW;QAC7D,IAAI,CAAC,oBAAoB,CAAC,GAAG,CAAC,CAAC;QAC/B,IAAI,CAAC,eAAe,CAAC,OAAO,EAAE,0HAA0H,EAAE,CAAC,IAAI,EAAE,EAAE,CAAC,IAAI,CAAC,UAAU,CAAC,CAAC,EAAE,GAAG,CAAC,CAAC,CAAC;IAC/L,CAAC;IACM,YAAY,CAAC,OAA8B;QAChD,IAAI,CAAC,eAAe,CAAC,OAAO,EAAE,gCAAgC,CAAC,CAAC;IAClE,CAAC;IACM,OAAO,CAAC,OAA8B,EAAE,GAAe;QAC5D,cAAc,CAAC,oBAAoB,CAAC,OAAO,CAAC,CAAC;QAC7C,IAAI,CAAC,oBAAoB,CAAC,GAAG,CAAC,CAAC;QAC/B,IAAI,CAAC,eAAe,CAAC,OAAO,EAAE,yCAAyC,EAAE,CAAC,IAAI,EAAE,EAAE,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC,EAAE,GAAG,CAAC,CAAC,CAAC;IAC5G,CAAC;IACM,UAAU,CAAC,OAA8B,EAAE,GAAe;QAC/D,IAAI,CAAC,oBAAoB,CAAC,GAAG,CAAC,CAAC;QAC/B,IAAI,CAAC,eAAe,CAAC,OAAO,EAAE,wHAAwH,EAAE,CAAC,IAAI,EAAE,EAAE,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC,EAAE,GAAG,CAAC,CAAC,CAAC;IAC3L,CAAC;IACM,aAAa,CAAC,OAA8B;QACjD,OAAO,IAAI,CAAC,QAAQ,CAAC,mBAAmB,CAAC,oCAAoC,EAAE,CAAC,IAAI,EAAE,EAAE;YACtF,IAAI,CAAC,UAAU,CAAC,CAAC,EAAE,OAAO,CAAC,CAAC;YAC5B,MAAM,UAAU,GAAG,mBAAQ,CAAC,YAAY,EAAE,CAAC;YAC3C,UAAU,CAAC,IAAI,CAAC,IAAI,CAAC,QAAQ,CAAC,mBAAS,CAAC,EAAE,EAAE,SAAS,EAAE,OAAO,EAAE,UAAU,EAAE,OAAO,EAAE,GAAG,EAAE,IAAI,CAAC,eAAe,CAAC,CAAC,CAAC,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;YACtI,OAAO,UAAU,CAAC;QACpB,CAAC,CAAC,CAAC;IACL,CAAC;IACM,UAAU,CAAC,OAA8B;QAC9C,IAAI,CAAC,eAAe,CAAC,OAAO,EAAE,8BAA8B,CAAC,CAAC;IAChE,CAAC;IACM,OAAO,CAAC,OAA8B,EAAE,aAA4B,EAAE,OAAgB;QAC3F,cAAc,CAAC,oBAAoB,CAAC,OAAO,CAAC,CAAC;QAC7C,OAAO,GAAG,OAAO,IAAI,IAAA,cAAO,EAAC,aAAa,CAAC,CAAC;QAC5C,IAAI,OAAO,EAAE,CAAC,CAAC,CAAC,KAAK,GAAG;YACtB,OAAO,GAAG,OAAO,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC;QAC7B,IAAI,CAAC,QAAQ,CAAC,mBAAS,CAAC,CAAC,SAAS,CAAC,EAAE,IAAI,EAAE,OAAO,EAAE,aAAa,EAAE,IAAI,EAAE,IAAI,CAAC,mBAAmB,CAAC,aAAa,CAAC,EAAE,OAAO,EAAE,CAAC,CAAC;IAC/H,CAAC;IACM,UAAU,CAAC,OAA8B,EAAE,aAA4B;QAC5E,IAAI,CAAC,iBAAiB,CAAC,OAAO,CAAC,CAAC,CAAC,wBAAwB;QACzD,IAAI,CAAC,QAAQ,CAAC,mBAAS,CAAC,CAAC,mBAAmB,CAAC,EAAE,IAAI,EAAE,OAAO,EAAE,aAAa,EAAE,IAAI,EAAE,IAAI,CAAC,mBAAmB,CAAC,aAAa,CAAC,EAAE,CAAC,CAAC;IAChI,CAAC;IACM,UAAU,CAAC,OAA8B;QAC9C,MAAM,IAAI,GAAG,IAAI,CAAC,iBAAiB,CAAC,OAAO,CAAC,CAAC;QAC7C,IAAI,SAAS,KAAK,IAAI;YACpB,4BAAc,CAAC,UAAU,CAAC,gBAAgB,EAAE,EAAE,OAAO,EAAE,kBAAkB,OAAO,kBAAkB,EAAE,CAAC,CAAC;QACxG,IAAI,IAAI,IAAI,EAAE,CAAC,UAAU,CAAC,IAAI,CAAC,aAAa,CAAC;YAC3C,EAAE,CAAC,UAAU,CAAC,IAAI,CAAC,aAAa,CAAC,CAAC;QACpC,IAAI,CAAC,QAAQ,CAAC,mBAAS,CAAC,CAAC,kBAAkB,CAAC,OAAO,CAAC,CAAC;IACvD,CAAC;CACF;AAED,SAAgB,oBAAoB,CAAC,KAAuB,EAAE,SAA6B;IACzF,OAAO,IAAI,eAAe,CAAC,KAAK,EAAE,SAAS,CAAC,CAAC;AAC/C,CAAC;AAED,SAAgB,kBAAkB,CAAC,QAAkB,EAAE,IAAoB;IACzE,OAAO,IAAI,aAAa,CAAC,QAAQ,EAAE,IAAI,CAAC,CAAC;AAC3C,CAAC;AAED,SAAgB,wBAAwB;IACtC,OAAO,IAAI,UAAU,EAAE,CAAC;AAC1B,CAAC;AAED,SAAgB,gCAAgC,CAAC,QAAkB,EAAE,IAAoB;IACvF,OAAO,IAAI,2BAA2B,CAAC,QAAQ,EAAE,IAAI,CAAC,CAAC;AACzD,CAAC;AAED;;;;;;GAMG;AACH,SAAgB,4BAA4B,CAAC,EAAwB;IACnE,IAAI,CAAC,uCAAuC,CAAC,IAAI,CAAC,EAAE,CAAC;QACnD,4BAAc,CAAC,UAAU,CAAC,cAAc,EAAE,EAAE,OAAO,EAAE,yBAAyB,EAAE,GAAG,EAAE,CAAC,CAAC;AAC3F,CAAC;AAEY,QAAA,yBAAyB,GAAsB,EAAE,SAAS,EAAE,WAAW,EAAE,IAAI,EAAE,UAAU,EAAE,CAAC;AAGzG,SAAS,yBAAyB,CAAC,OAAe,EAAE,SAAmD,EAAE,IAAkB;IACzH,4BAAc,CAAC,UAAU,CAAuB,YAAY,EAAE,EAAE,OAAO,EAAE,IAAI,EAAE,SAAS,EAAE,CAAC,CAAC;AAC9F,CAAC;AAED,SAAgB,0BAA0B,CAAC,OAAe,EAAE,YAAoC;IAC9F,4BAAc,CAAC,UAAU,CAAwB,aAAa,EAAE,EAAE,OAAO,EAAE,YAAY,EAAE,CAAC,CAAC;AAC7F,CAAC","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 { GetSettingsDbArgs, SettingsDb, settingsResourceName } from \"../../workspace/SettingsDb\";\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 { SettingsDbImpl } from \"./SettingsDbImpl\";\r\nimport { SettingsImpl } from \"./SettingsImpl\";\r\nimport { _implementationProhibited, _nativeDb } from \"../Symbols\";\r\nimport { getOnlineStatus } from \"../OnlineStatus\";\r\nimport { BlobContainer } from \"../../BlobContainerService\";\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.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 getSettingsDb(args: GetSettingsDbArgs): SettingsDb {\r\n const container = this.findContainer(args.containerId);\r\n if (undefined === container)\r\n WorkspaceError.throwError(\"does-not-exist\", { message: `No settings container found for containerId \"${args.containerId}\"` });\r\n\r\n const settingsDb = new SettingsDbImpl({ dbName: args.dbName ?? \"settings-db\", version: args.version }, container, args.priority);\r\n\r\n if (!settingsDb.hasSettingsManifestProperty)\r\n WorkspaceError.throwError(\"does-not-exist\", { message: `Container \"${args.containerId}\" does not contain a SettingsDb — missing settings manifest` });\r\n\r\n return settingsDb;\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 for (const prop of props) {\r\n const db = await this.getWorkspaceDb(prop);\r\n db.open();\r\n try {\r\n const manifest = db.manifest;\r\n const resourceName = prop.resourceName ?? settingsResourceName;\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 db.close(); // don't leave this db open in case we're going to find another dictionary in it recursively.\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 db.close();\r\n problems?.push(e as WorkspaceDbLoadError);\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\nconst settingsEditorCacheName = \"SettingsEditor\";\r\nclass SettingsEditorWorkspaceImpl extends WorkspaceImpl {\r\n public override getCloudCache(): WorkspaceCloudCache {\r\n return this._cloudCache ??= makeWorkspaceCloudCache({ cacheName: settingsEditorCacheName, cacheSize: \"2G\" });\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: \"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 as EditCloudContainer | undefined;\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 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\nexport function constructSettingsEditorWorkspace(settings: Settings, opts?: WorkspaceOpts): OwnedWorkspace {\r\n return new SettingsEditorWorkspaceImpl(settings, opts);\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"]}
@@ -19,6 +19,8 @@ export declare namespace SettingsEditor {
19
19
  function construct(): SettingsEditor;
20
20
  /**
21
21
  * Create a new, empty, [[SettingsDb]] file on the local filesystem for importing settings dictionaries.
22
+ * @note Do not pass an untrusted or unintended path in `localFileName`.
23
+ * This helper creates or overwrites the file at that location; callers that need fail-if-exists behavior should check first.
22
24
  */
23
25
  function createEmptyDb(args: {
24
26
  localFileName: LocalFileName;
@@ -139,6 +141,7 @@ export interface EditableSettingsCloudContainer extends CloudSqliteContainer {
139
141
  readonly cloudProps: WorkspaceContainerProps | undefined;
140
142
  /**
141
143
  * Get an editable [[SettingsDb]] to add, delete, or update settings *within a newly created version* of a SettingsDb.
144
+ * Repeated calls that resolve to the same SettingsDb return the same cached instance.
142
145
  * @param props - The properties of the SettingsDb.
143
146
  * @returns An EditableSettingsDb for modifying settings.
144
147
  * @throws if the targeted SettingsDb has already been published and is immutable. Use [[createNewSettingsDbVersion]] first to create an editable version.
@@ -172,6 +175,7 @@ export interface EditableSettingsCloudContainer extends CloudSqliteContainer {
172
175
  * @beta
173
176
  */
174
177
  export interface EditableSettingsDb extends SettingsDb {
178
+ /** The editable container that owns this SettingsDb. */
175
179
  readonly container: EditableSettingsCloudContainer;
176
180
  /**
177
181
  * Update the contents of the manifest in this SettingsDb.
@@ -1 +1 @@
1
- {"version":3,"file":"SettingsEditor.d.ts","sourceRoot":"","sources":["../../../src/workspace/SettingsEditor.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"SettingsEditor.d.ts","sourceRoot":"","sources":["../../../src/workspace/SettingsEditor.ts"],"names":[],"mappings":"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"}
@@ -1,8 +1,8 @@
1
1
  "use strict";
2
2
  /*---------------------------------------------------------------------------------------------
3
- * Copyright (c) Bentley Systems, Incorporated. All rights reserved.
4
- * See LICENSE.md in the project root for license terms and full copyright notice.
5
- *--------------------------------------------------------------------------------------------*/
3
+ * Copyright (c) Bentley Systems, Incorporated. All rights reserved.
4
+ * See LICENSE.md in the project root for license terms and full copyright notice.
5
+ *--------------------------------------------------------------------------------------------*/
6
6
  /** @packageDocumentation
7
7
  * @module Workspace
8
8
  */
@@ -10,7 +10,7 @@ Object.defineProperty(exports, "__esModule", { value: true });
10
10
  exports.SettingsEditor = void 0;
11
11
  const BlobContainerService_1 = require("../BlobContainerService");
12
12
  const SettingsSqliteDb_1 = require("../internal/workspace/SettingsSqliteDb");
13
- const SettingsImpl_1 = require("../internal/workspace/SettingsImpl");
13
+ const SettingsEditorImpl_1 = require("../internal/workspace/SettingsEditorImpl");
14
14
  const Symbols_1 = require("../internal/Symbols");
15
15
  const IModelHost_1 = require("../IModelHost");
16
16
  /** @beta */
@@ -22,11 +22,13 @@ var SettingsEditor;
22
22
  * @note It is illegal to have more than one SettingsEditor active in a single session.
23
23
  */
24
24
  function construct() {
25
- return (0, SettingsImpl_1.constructSettingsEditor)();
25
+ return (0, SettingsEditorImpl_1.constructSettingsEditor)();
26
26
  }
27
27
  SettingsEditor.construct = construct;
28
28
  /**
29
29
  * Create a new, empty, [[SettingsDb]] file on the local filesystem for importing settings dictionaries.
30
+ * @note Do not pass an untrusted or unintended path in `localFileName`.
31
+ * This helper creates or overwrites the file at that location; callers that need fail-if-exists behavior should check first.
30
32
  */
31
33
  function createEmptyDb(args) {
32
34
  SettingsSqliteDb_1.SettingsSqliteDb.createNewDb(args.localFileName, args);
@@ -1 +1 @@
1
- {"version":3,"file":"SettingsEditor.js","sourceRoot":"","sources":["../../../src/workspace/SettingsEditor.ts"],"names":[],"mappings":";AAAA;;;+FAG+F;AAC/F;;GAEG;;;AAKH,kEAAwD;AAGxD,6EAA0E;AAC1E,qEAA6E;AAC7E,iDAAgE;AAEhE,8CAA2C;AAE3C,YAAY;AACZ,IAAiB,cAAc,CAyC9B;AAzCD,WAAiB,cAAc;IAC7B;;;;OAIG;IACH,SAAgB,SAAS;QACvB,OAAO,IAAA,sCAAuB,GAAE,CAAC;IACnC,CAAC;IAFe,wBAAS,YAExB,CAAA;IAED;;OAEG;IACH,SAAgB,aAAa,CAAC,IAAoE;QAChG,mCAAgB,CAAC,WAAW,CAAC,IAAI,CAAC,aAAa,EAAE,IAAI,CAAC,CAAC;IACzD,CAAC;IAFe,4BAAa,gBAE5B,CAAA;IAYD;;;;;;;OAOG;IACI,KAAK,UAAU,eAAe,CAAC,IAAiC;QACrE,IAAI,SAAS,KAAK,oCAAa,CAAC,OAAO;YACrC,MAAM,IAAI,KAAK,CAAC,sGAAsG,CAAC,CAAC;QAC1H,MAAM,SAAS,GAAG,MAAM,uBAAU,CAAC,cAAc,EAAE,CAAC;QACpD,OAAO,oCAAa,CAAC,OAAO,CAAC,uBAAuB,CAAC,SAAS,EAAE,EAAE,GAAG,IAAI,EAAE,aAAa,EAAE,UAAU,EAAE,CAAC,CAAC;IAC1G,CAAC;IALqB,8BAAe,kBAKpC,CAAA;AACH,CAAC,EAzCgB,cAAc,8BAAd,cAAc,QAyC9B","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 { LocalFileName } from \"@itwin/core-common\";\r\nimport { GuidString } from \"@itwin/core-bentley\";\r\nimport { Setting, SettingName, SettingsContainer } from \"./Settings\";\r\nimport { BlobContainer } from \"../BlobContainerService\";\r\nimport { CloudSqliteContainer, GetWorkspaceContainerArgs, Workspace, WorkspaceContainerProps, WorkspaceDbName, WorkspaceDbNameAndVersion, WorkspaceDbVersion } from \"./Workspace\";\r\nimport { SettingsDb, SettingsDbManifest, SettingsDbProps } from \"./SettingsDb\";\r\nimport { SettingsSqliteDb } from \"../internal/workspace/SettingsSqliteDb\";\r\nimport { constructSettingsEditor } from \"../internal/workspace/SettingsImpl\";\r\nimport { _implementationProhibited } from \"../internal/Symbols\";\r\nimport { CloudSqlite } from \"../CloudSqlite\";\r\nimport { IModelHost } from \"../IModelHost\";\r\n\r\n/** @beta */\r\nexport namespace SettingsEditor {\r\n /**\r\n * Create a new [[SettingsEditor]] for creating new versions of [[SettingsDb]]s.\r\n * @note The caller becomes the owner of the SettingsEditor and is responsible for calling [[SettingsEditor.close]] on it when finished.\r\n * @note It is illegal to have more than one SettingsEditor active in a single session.\r\n */\r\n export function construct(): SettingsEditor {\r\n return constructSettingsEditor();\r\n }\r\n\r\n /**\r\n * Create a new, empty, [[SettingsDb]] file on the local filesystem for importing settings dictionaries.\r\n */\r\n export function createEmptyDb(args: { localFileName: LocalFileName; manifest: SettingsDbManifest }): void {\r\n SettingsSqliteDb.createNewDb(args.localFileName, args);\r\n }\r\n\r\n /** Arguments for [[SettingsEditor.queryContainers]] and [[SettingsEditor.findContainers]]. */\r\n export interface QuerySettingsContainersArgs {\r\n /** The iTwinId whose settings containers should be queried. */\r\n iTwinId: GuidString;\r\n /** Optional iModelId to further scope the query to containers associated with a specific iModel. */\r\n iModelId?: GuidString;\r\n /** Optional label filter. */\r\n label?: string;\r\n }\r\n\r\n /**\r\n * Query the [[BlobContainer]] service for all settings containers associated with a given iTwin.\r\n * This is a convenience wrapper around `BlobContainer.service.queryContainersMetadata` that\r\n * automatically filters by `containerType: \"settings\"`.\r\n * @param args - The query arguments including the iTwinId.\r\n * @returns A promise that resolves to the matching container metadata entries.\r\n * @note Requires [[IModelHost.authorizationClient]] to be configured.\r\n */\r\n export async function queryContainers(args: QuerySettingsContainersArgs): Promise<BlobContainer.MetadataResponse[]> {\r\n if (undefined === BlobContainer.service)\r\n throw new Error(\"BlobContainer.service is not available. Ensure IModelHost is initialized with a valid configuration.\");\r\n const userToken = await IModelHost.getAccessToken();\r\n return BlobContainer.service.queryContainersMetadata(userToken, { ...args, containerType: \"settings\" });\r\n }\r\n}\r\n\r\n/** Arguments supplied to [[SettingsEditor.createNewCloudContainer]] to create a new [[EditableSettingsCloudContainer]].\r\n * The created container will automatically have `containerType: \"settings\"` in its metadata, enabling discovery\r\n * via `BlobContainer.service.queryContainersMetadata({ containerType: \"settings\" })`.\r\n * @beta\r\n */\r\nexport interface CreateNewSettingsContainerArgs {\r\n /**\r\n * The scope of the container. This determines the ownership of the container, how RBAC rights are assigned,\r\n * and the location of the datacenter.\r\n */\r\n scope: BlobContainer.Scope;\r\n /** The manifest to be stored in the default SettingsDb in the new container. */\r\n manifest: SettingsDbManifest;\r\n /** Metadata stored by the BlobContainer service. The `containerType` field is omitted here because it is\r\n * automatically set to `\"settings\"` when the container is created (mirroring the `\"workspace\"` convention for WorkspaceDb containers).\r\n */\r\n metadata: Omit<BlobContainer.Metadata, \"containerType\">;\r\n /** The name of the default [[SettingsDb]] created inside the new container.\r\n * Default: \"settings-db\";\r\n */\r\n dbName?: WorkspaceDbName;\r\n}\r\n\r\n/** Arguments supplied to [[EditableSettingsCloudContainer.createNewSettingsDbVersion]].\r\n * @beta\r\n */\r\nexport interface CreateNewSettingsDbVersionArgs {\r\n /**\r\n * The properties that determine the source [[SettingsDb]] to serve as the basis for the new version.\r\n * This is usually the latest version, but it is possible to create patches to older versions.\r\n */\r\n fromProps?: SettingsDbProps;\r\n /** The type of version increment to apply to the source version. */\r\n versionType: CloudSqlite.SemverIncrement;\r\n /** For prerelease versions, a string that becomes part of the version name. */\r\n identifier?: string;\r\n}\r\n\r\n/** The result of creating a new version of a [[SettingsDb]].\r\n * @beta\r\n */\r\nexport interface SettingsDbVersionResult {\r\n /** The name and version of the source SettingsDb. */\r\n oldDb: WorkspaceDbNameAndVersion;\r\n /** The name and version of the newly-created SettingsDb. */\r\n newDb: WorkspaceDbNameAndVersion;\r\n}\r\n\r\n/** Arguments supplied to [[EditableSettingsCloudContainer.createDb]] to create a new [[SettingsDb]] in a container.\r\n * @beta\r\n */\r\nexport interface CreateSettingsDbArgs {\r\n /** The name of the new SettingsDb. Default: `\"settings-db\"`. */\r\n dbName?: WorkspaceDbName;\r\n /** The initial version of the new SettingsDb. Default: `\"0.0.0\"`. */\r\n version?: WorkspaceDbVersion;\r\n /** The manifest for the new SettingsDb. */\r\n manifest: SettingsDbManifest;\r\n}\r\n\r\n/** Arguments supplied to [[EditableSettingsDb.updateSetting]] to add or update a single [[Setting]].\r\n * @beta\r\n */\r\nexport interface UpdateSettingArgs {\r\n /** The [[SettingName]] of the setting to add or update. */\r\n readonly settingName: SettingName;\r\n /** The new value for the setting. */\r\n readonly value: Setting;\r\n}\r\n\r\n/**\r\n * A [[CloudSqliteContainer]] opened for editing settings by a [[SettingsEditor]].\r\n * You can create new [[SettingsDb]]s or new versions of existing [[SettingsDb]]s inside it.\r\n * Before actually making any changes to the container's contents, you must first obtain an exclusive write lock on it via\r\n * [[acquireWriteLock]]. Only one user can hold the write lock at any given time. When you have finished making changes,\r\n * you can use [[releaseWriteLock]] to publish your changes, or [[abandonChanges]] to discard them.\r\n * @note Settings containers are separate from workspace containers, providing independent write locks.\r\n * Editing settings does not block workspace resource editing, and vice versa.\r\n * @beta\r\n */\r\nexport interface EditableSettingsCloudContainer extends CloudSqliteContainer {\r\n /**\r\n * Create a copy of an existing [[SettingsDb]] in this container with a new [[WorkspaceDbVersion]].\r\n * The copy should be modified with new content before the write lock is released,\r\n * and thereafter may never be modified again.\r\n * @param args - The properties that determine the source SettingsDb and the version increment to apply.\r\n * @returns A promise that resolves to an object containing the old and new SettingsDb names and versions.\r\n */\r\n createNewSettingsDbVersion(args: CreateNewSettingsDbVersionArgs): Promise<SettingsDbVersionResult>;\r\n\r\n /**\r\n * Create a new, empty [[SettingsDb]].\r\n * @param args - The arguments for creating the new SettingsDb.\r\n * @returns A promise that resolves to an EditableSettingsDb.\r\n */\r\n createDb(args: CreateSettingsDbArgs): Promise<EditableSettingsDb>;\r\n\r\n /**\r\n * Get the cloud properties of this container.\r\n */\r\n readonly cloudProps: WorkspaceContainerProps | undefined;\r\n\r\n /**\r\n * Get an editable [[SettingsDb]] to add, delete, or update settings *within a newly created version* of a SettingsDb.\r\n * @param props - The properties of the SettingsDb.\r\n * @returns An EditableSettingsDb for modifying settings.\r\n * @throws if the targeted SettingsDb has already been published and is immutable. Use [[createNewSettingsDbVersion]] first to create an editable version.\r\n */\r\n getEditableDb(props?: SettingsDbProps): EditableSettingsDb;\r\n\r\n /**\r\n * Acquire the write lock on the container. Use [[releaseWriteLock]] to release the lock after publishing your changes, or\r\n * [[abandonChanges]] to release the lock and discard your changes.\r\n * Only one user can hold the write lock at any given time. However, readers can continue to read the published contents of the container while\r\n * a writer holds the write lock. Readers will only see the writer's changes after they are published by [[releaseWriteLock]].\r\n * @param user - The name of the user acquiring the write lock.\r\n * @throws if the write lock is already held by another user.\r\n */\r\n acquireWriteLock(user: string): void;\r\n\r\n /**\r\n * Release the write lock on the container. This should be called after all changes to the container's contents are complete. It\r\n * publishes and uploads the changes made to any [[SettingsDb]]s while the lock was held, after which those dbs become immutable.\r\n */\r\n releaseWriteLock(): void;\r\n\r\n /**\r\n * Abandon any changes made to the container and release the write lock. Any newly created versions of SettingsDbs are discarded.\r\n */\r\n abandonChanges(): void;\r\n}\r\n\r\n/**\r\n * An editable [[SettingsDb]]. This is used only by tools to allow administrators to create and modify SettingsDbs.\r\n * For cloud-based SettingsDbs, the container's write token must be obtained via [[EditableSettingsCloudContainer.acquireWriteLock]] before the methods in this interface may be used.\r\n * Normally, only admins will have write access.\r\n * Only one admin at a time may be editing a settings container.\r\n * @note Unlike [[EditableWorkspaceDb]], this interface only supports settings operations — no blob, file, or string resource methods.\r\n * @beta\r\n */\r\nexport interface EditableSettingsDb extends SettingsDb {\r\n readonly container: EditableSettingsCloudContainer;\r\n\r\n /**\r\n * Update the contents of the manifest in this SettingsDb.\r\n * @note This replaces the stored manifest entirely; omitted fields are lost.\r\n * @param manifest - The updated manifest.\r\n */\r\n updateManifest(manifest: SettingsDbManifest): void;\r\n\r\n /**\r\n * Replace all settings in this SettingsDb with the given container.\r\n * @param settings - The settings object to store.\r\n */\r\n updateSettings(settings: SettingsContainer): void;\r\n\r\n /**\r\n * Add or update a single [[Setting]] by name.\r\n * If a setting with the given name already exists, its value is replaced.\r\n * If it does not exist, it is added. Other settings are preserved.\r\n * @param args - The arguments specifying the setting name and value.\r\n */\r\n updateSetting(args: UpdateSettingArgs): void;\r\n\r\n /**\r\n * Remove a single [[Setting]] by name. Other settings are preserved.\r\n * @param settingName - The name of the setting to remove.\r\n */\r\n removeSetting(settingName: SettingName): void;\r\n}\r\n\r\n/** An object that permits administrators to modify the contents of settings containers.\r\n * Use [[SettingsEditor.construct]] to obtain a SettingsEditor, and [[close]] when finished using it.\r\n * Only one SettingsEditor may be in use at any given time.\r\n * Use [[getContainer]] to edit an existing container, or [[createNewCloudContainer]] to create a new container.\r\n * @beta\r\n */\r\nexport interface SettingsEditor {\r\n /** @internal */\r\n [_implementationProhibited]: unknown;\r\n\r\n /**\r\n * The workspace dedicated to this editor.\r\n * @note This workspace is independent from [[IModelHost.appWorkspace]] and all [[IModelDb.workspace]]s.\r\n */\r\n readonly workspace: Workspace;\r\n\r\n /**\r\n * Retrieves a container for the editor with the specified properties and access token.\r\n */\r\n getContainer(args: GetWorkspaceContainerArgs): EditableSettingsCloudContainer;\r\n\r\n /**\r\n * Asynchronously retrieves a container for the editor with the specified properties.\r\n */\r\n getContainerAsync(props: WorkspaceContainerProps): Promise<EditableSettingsCloudContainer>;\r\n\r\n /**\r\n * Creates a new cloud container for holding SettingsDbs, from the [[BlobContainer]] service.\r\n * The container is automatically assigned `containerType: \"settings\"` in its metadata and\r\n * initialized with a default [[SettingsDb]].\r\n * @param args - The arguments for creating the container, including scope, metadata, and manifest.\r\n * @returns A promise that resolves to the new EditableSettingsCloudContainer.\r\n * @note The current user must have administrator rights for the iTwin for the container.\r\n * @note Requires [[IModelHost.authorizationClient]] to be configured.\r\n */\r\n createNewCloudContainer(args: CreateNewSettingsContainerArgs): Promise<EditableSettingsCloudContainer>;\r\n\r\n /**\r\n * Find and open existing settings containers by querying the [[BlobContainer]] service.\r\n * This is a convenience method that queries for all settings containers matching the given iTwinId\r\n * (and optionally iModelId), requests write access tokens, and opens each matching container.\r\n * @param args - The query arguments including iTwinId and optionally iModelId and label.\r\n * @returns A promise that resolves to an array of opened [[EditableSettingsCloudContainer]]s.\r\n * @note Requires [[IModelHost.authorizationClient]] and [[BlobContainer.service]] to be configured.\r\n */\r\n findContainers(args: SettingsEditor.QuerySettingsContainersArgs): Promise<EditableSettingsCloudContainer[]>;\r\n\r\n /**\r\n * Closes this editor. All settings containers are dropped.\r\n */\r\n close(): void;\r\n}\r\n"]}
1
+ {"version":3,"file":"SettingsEditor.js","sourceRoot":"","sources":["../../../src/workspace/SettingsEditor.ts"],"names":[],"mappings":";AAAA;;;gGAGgG;AAChG;;GAEG;;;AAKH,kEAAwD;AAGxD,6EAA0E;AAC1E,iFAAmF;AACnF,iDAAgE;AAEhE,8CAA2C;AAE3C,YAAY;AACZ,IAAiB,cAAc,CA0C9B;AA1CD,WAAiB,cAAc;IAC7B;;;;OAIG;IACH,SAAgB,SAAS;QACvB,OAAO,IAAA,4CAAuB,GAAE,CAAC;IACnC,CAAC;IAFe,wBAAS,YAExB,CAAA;IAED;;;;OAIG;IACH,SAAgB,aAAa,CAAC,IAAoE;QAChG,mCAAgB,CAAC,WAAW,CAAC,IAAI,CAAC,aAAa,EAAE,IAAI,CAAC,CAAC;IACzD,CAAC;IAFe,4BAAa,gBAE5B,CAAA;IAYD;;;;;;;OAOG;IACI,KAAK,UAAU,eAAe,CAAC,IAAiC;QACrE,IAAI,SAAS,KAAK,oCAAa,CAAC,OAAO;YAAE,MAAM,IAAI,KAAK,CAAC,sGAAsG,CAAC,CAAC;QACjK,MAAM,SAAS,GAAG,MAAM,uBAAU,CAAC,cAAc,EAAE,CAAC;QACpD,OAAO,oCAAa,CAAC,OAAO,CAAC,uBAAuB,CAAC,SAAS,EAAE,EAAE,GAAG,IAAI,EAAE,aAAa,EAAE,UAAU,EAAE,CAAC,CAAC;IAC1G,CAAC;IAJqB,8BAAe,kBAIpC,CAAA;AACH,CAAC,EA1CgB,cAAc,8BAAd,cAAc,QA0C9B","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 { LocalFileName } from \"@itwin/core-common\";\r\nimport { GuidString } from \"@itwin/core-bentley\";\r\nimport { Setting, SettingName, SettingsContainer } from \"./Settings\";\r\nimport { BlobContainer } from \"../BlobContainerService\";\r\nimport { CloudSqliteContainer, GetWorkspaceContainerArgs, Workspace, WorkspaceContainerProps, WorkspaceDbName, WorkspaceDbNameAndVersion, WorkspaceDbVersion } from \"./Workspace\";\r\nimport { SettingsDb, SettingsDbManifest, SettingsDbProps } from \"./SettingsDb\";\r\nimport { SettingsSqliteDb } from \"../internal/workspace/SettingsSqliteDb\";\r\nimport { constructSettingsEditor } from \"../internal/workspace/SettingsEditorImpl\";\r\nimport { _implementationProhibited } from \"../internal/Symbols\";\r\nimport { CloudSqlite } from \"../CloudSqlite\";\r\nimport { IModelHost } from \"../IModelHost\";\r\n\r\n/** @beta */\r\nexport namespace SettingsEditor {\r\n /**\r\n * Create a new [[SettingsEditor]] for creating new versions of [[SettingsDb]]s.\r\n * @note The caller becomes the owner of the SettingsEditor and is responsible for calling [[SettingsEditor.close]] on it when finished.\r\n * @note It is illegal to have more than one SettingsEditor active in a single session.\r\n */\r\n export function construct(): SettingsEditor {\r\n return constructSettingsEditor();\r\n }\r\n\r\n /**\r\n * Create a new, empty, [[SettingsDb]] file on the local filesystem for importing settings dictionaries.\r\n * @note Do not pass an untrusted or unintended path in `localFileName`.\r\n * This helper creates or overwrites the file at that location; callers that need fail-if-exists behavior should check first.\r\n */\r\n export function createEmptyDb(args: { localFileName: LocalFileName; manifest: SettingsDbManifest }): void {\r\n SettingsSqliteDb.createNewDb(args.localFileName, args);\r\n }\r\n\r\n /** Arguments for [[SettingsEditor.queryContainers]] and [[SettingsEditor.findContainers]]. */\r\n export interface QuerySettingsContainersArgs {\r\n /** The iTwinId whose settings containers should be queried. */\r\n iTwinId: GuidString;\r\n /** Optional iModelId to further scope the query to containers associated with a specific iModel. */\r\n iModelId?: GuidString;\r\n /** Optional label filter. */\r\n label?: string;\r\n }\r\n\r\n /**\r\n * Query the [[BlobContainer]] service for all settings containers associated with a given iTwin.\r\n * This is a convenience wrapper around `BlobContainer.service.queryContainersMetadata` that\r\n * automatically filters by `containerType: \"settings\"`.\r\n * @param args - The query arguments including the iTwinId.\r\n * @returns A promise that resolves to the matching container metadata entries.\r\n * @note Requires [[IModelHost.authorizationClient]] to be configured.\r\n */\r\n export async function queryContainers(args: QuerySettingsContainersArgs): Promise<BlobContainer.MetadataResponse[]> {\r\n if (undefined === BlobContainer.service) throw new Error(\"BlobContainer.service is not available. Ensure IModelHost is initialized with a valid configuration.\");\r\n const userToken = await IModelHost.getAccessToken();\r\n return BlobContainer.service.queryContainersMetadata(userToken, { ...args, containerType: \"settings\" });\r\n }\r\n}\r\n\r\n/** Arguments supplied to [[SettingsEditor.createNewCloudContainer]] to create a new [[EditableSettingsCloudContainer]].\r\n * The created container will automatically have `containerType: \"settings\"` in its metadata, enabling discovery\r\n * via `BlobContainer.service.queryContainersMetadata({ containerType: \"settings\" })`.\r\n * @beta\r\n */\r\nexport interface CreateNewSettingsContainerArgs {\r\n /**\r\n * The scope of the container. This determines the ownership of the container, how RBAC rights are assigned,\r\n * and the location of the datacenter.\r\n */\r\n scope: BlobContainer.Scope;\r\n /** The manifest to be stored in the default SettingsDb in the new container. */\r\n manifest: SettingsDbManifest;\r\n /** Metadata stored by the BlobContainer service. The `containerType` field is omitted here because it is\r\n * automatically set to `\"settings\"` when the container is created (mirroring the `\"workspace\"` convention for WorkspaceDb containers).\r\n */\r\n metadata: Omit<BlobContainer.Metadata, \"containerType\">;\r\n /** The name of the default [[SettingsDb]] created inside the new container.\r\n * Default: \"settings-db\";\r\n */\r\n dbName?: WorkspaceDbName;\r\n}\r\n\r\n/** Arguments supplied to [[EditableSettingsCloudContainer.createNewSettingsDbVersion]].\r\n * @beta\r\n */\r\nexport interface CreateNewSettingsDbVersionArgs {\r\n /**\r\n * The properties that determine the source [[SettingsDb]] to serve as the basis for the new version.\r\n * This is usually the latest version, but it is possible to create patches to older versions.\r\n */\r\n fromProps?: SettingsDbProps;\r\n /** The type of version increment to apply to the source version. */\r\n versionType: CloudSqlite.SemverIncrement;\r\n /** For prerelease versions, a string that becomes part of the version name. */\r\n identifier?: string;\r\n}\r\n\r\n/** The result of creating a new version of a [[SettingsDb]].\r\n * @beta\r\n */\r\nexport interface SettingsDbVersionResult {\r\n /** The name and version of the source SettingsDb. */\r\n oldDb: WorkspaceDbNameAndVersion;\r\n /** The name and version of the newly-created SettingsDb. */\r\n newDb: WorkspaceDbNameAndVersion;\r\n}\r\n\r\n/** Arguments supplied to [[EditableSettingsCloudContainer.createDb]] to create a new [[SettingsDb]] in a container.\r\n * @beta\r\n */\r\nexport interface CreateSettingsDbArgs {\r\n /** The name of the new SettingsDb. Default: `\"settings-db\"`. */\r\n dbName?: WorkspaceDbName;\r\n /** The initial version of the new SettingsDb. Default: `\"0.0.0\"`. */\r\n version?: WorkspaceDbVersion;\r\n /** The manifest for the new SettingsDb. */\r\n manifest: SettingsDbManifest;\r\n}\r\n\r\n/** Arguments supplied to [[EditableSettingsDb.updateSetting]] to add or update a single [[Setting]].\r\n * @beta\r\n */\r\nexport interface UpdateSettingArgs {\r\n /** The [[SettingName]] of the setting to add or update. */\r\n readonly settingName: SettingName;\r\n /** The new value for the setting. */\r\n readonly value: Setting;\r\n}\r\n\r\n/**\r\n * A [[CloudSqliteContainer]] opened for editing settings by a [[SettingsEditor]].\r\n * You can create new [[SettingsDb]]s or new versions of existing [[SettingsDb]]s inside it.\r\n * Before actually making any changes to the container's contents, you must first obtain an exclusive write lock on it via\r\n * [[acquireWriteLock]]. Only one user can hold the write lock at any given time. When you have finished making changes,\r\n * you can use [[releaseWriteLock]] to publish your changes, or [[abandonChanges]] to discard them.\r\n * @note Settings containers are separate from workspace containers, providing independent write locks.\r\n * Editing settings does not block workspace resource editing, and vice versa.\r\n * @beta\r\n */\r\nexport interface EditableSettingsCloudContainer extends CloudSqliteContainer {\r\n /**\r\n * Create a copy of an existing [[SettingsDb]] in this container with a new [[WorkspaceDbVersion]].\r\n * The copy should be modified with new content before the write lock is released,\r\n * and thereafter may never be modified again.\r\n * @param args - The properties that determine the source SettingsDb and the version increment to apply.\r\n * @returns A promise that resolves to an object containing the old and new SettingsDb names and versions.\r\n */\r\n createNewSettingsDbVersion(args: CreateNewSettingsDbVersionArgs): Promise<SettingsDbVersionResult>;\r\n\r\n /**\r\n * Create a new, empty [[SettingsDb]].\r\n * @param args - The arguments for creating the new SettingsDb.\r\n * @returns A promise that resolves to an EditableSettingsDb.\r\n */\r\n createDb(args: CreateSettingsDbArgs): Promise<EditableSettingsDb>;\r\n\r\n /**\r\n * Get the cloud properties of this container.\r\n */\r\n readonly cloudProps: WorkspaceContainerProps | undefined;\r\n\r\n /**\r\n * Get an editable [[SettingsDb]] to add, delete, or update settings *within a newly created version* of a SettingsDb.\r\n * Repeated calls that resolve to the same SettingsDb return the same cached instance.\r\n * @param props - The properties of the SettingsDb.\r\n * @returns An EditableSettingsDb for modifying settings.\r\n * @throws if the targeted SettingsDb has already been published and is immutable. Use [[createNewSettingsDbVersion]] first to create an editable version.\r\n */\r\n getEditableDb(props?: SettingsDbProps): EditableSettingsDb;\r\n\r\n /**\r\n * Acquire the write lock on the container. Use [[releaseWriteLock]] to release the lock after publishing your changes, or\r\n * [[abandonChanges]] to release the lock and discard your changes.\r\n * Only one user can hold the write lock at any given time. However, readers can continue to read the published contents of the container while\r\n * a writer holds the write lock. Readers will only see the writer's changes after they are published by [[releaseWriteLock]].\r\n * @param user - The name of the user acquiring the write lock.\r\n * @throws if the write lock is already held by another user.\r\n */\r\n acquireWriteLock(user: string): void;\r\n\r\n /**\r\n * Release the write lock on the container. This should be called after all changes to the container's contents are complete. It\r\n * publishes and uploads the changes made to any [[SettingsDb]]s while the lock was held, after which those dbs become immutable.\r\n */\r\n releaseWriteLock(): void;\r\n\r\n /**\r\n * Abandon any changes made to the container and release the write lock. Any newly created versions of SettingsDbs are discarded.\r\n */\r\n abandonChanges(): void;\r\n}\r\n\r\n/**\r\n * An editable [[SettingsDb]]. This is used only by tools to allow administrators to create and modify SettingsDbs.\r\n * For cloud-based SettingsDbs, the container's write token must be obtained via [[EditableSettingsCloudContainer.acquireWriteLock]] before the methods in this interface may be used.\r\n * Normally, only admins will have write access.\r\n * Only one admin at a time may be editing a settings container.\r\n * @note Unlike [[EditableWorkspaceDb]], this interface only supports settings operations — no blob, file, or string resource methods.\r\n * @beta\r\n */\r\nexport interface EditableSettingsDb extends SettingsDb {\r\n /** The editable container that owns this SettingsDb. */\r\n readonly container: EditableSettingsCloudContainer;\r\n\r\n /**\r\n * Update the contents of the manifest in this SettingsDb.\r\n * @note This replaces the stored manifest entirely; omitted fields are lost.\r\n * @param manifest - The updated manifest.\r\n */\r\n updateManifest(manifest: SettingsDbManifest): void;\r\n\r\n /**\r\n * Replace all settings in this SettingsDb with the given container.\r\n * @param settings - The settings object to store.\r\n */\r\n updateSettings(settings: SettingsContainer): void;\r\n\r\n /**\r\n * Add or update a single [[Setting]] by name.\r\n * If a setting with the given name already exists, its value is replaced.\r\n * If it does not exist, it is added. Other settings are preserved.\r\n * @param args - The arguments specifying the setting name and value.\r\n */\r\n updateSetting(args: UpdateSettingArgs): void;\r\n\r\n /**\r\n * Remove a single [[Setting]] by name. Other settings are preserved.\r\n * @param settingName - The name of the setting to remove.\r\n */\r\n removeSetting(settingName: SettingName): void;\r\n}\r\n\r\n/** An object that permits administrators to modify the contents of settings containers.\r\n * Use [[SettingsEditor.construct]] to obtain a SettingsEditor, and [[close]] when finished using it.\r\n * Only one SettingsEditor may be in use at any given time.\r\n * Use [[getContainer]] to edit an existing container, or [[createNewCloudContainer]] to create a new container.\r\n * @beta\r\n */\r\nexport interface SettingsEditor {\r\n /** @internal */\r\n [_implementationProhibited]: unknown;\r\n\r\n /**\r\n * The workspace dedicated to this editor.\r\n * @note This workspace is independent from [[IModelHost.appWorkspace]] and all [[IModelDb.workspace]]s.\r\n */\r\n readonly workspace: Workspace;\r\n\r\n /**\r\n * Retrieves a container for the editor with the specified properties and access token.\r\n */\r\n getContainer(args: GetWorkspaceContainerArgs): EditableSettingsCloudContainer;\r\n\r\n /**\r\n * Asynchronously retrieves a container for the editor with the specified properties.\r\n */\r\n getContainerAsync(props: WorkspaceContainerProps): Promise<EditableSettingsCloudContainer>;\r\n\r\n /**\r\n * Creates a new cloud container for holding SettingsDbs, from the [[BlobContainer]] service.\r\n * The container is automatically assigned `containerType: \"settings\"` in its metadata and\r\n * initialized with a default [[SettingsDb]].\r\n * @param args - The arguments for creating the container, including scope, metadata, and manifest.\r\n * @returns A promise that resolves to the new EditableSettingsCloudContainer.\r\n * @note The current user must have administrator rights for the iTwin for the container.\r\n * @note Requires [[IModelHost.authorizationClient]] to be configured.\r\n */\r\n createNewCloudContainer(args: CreateNewSettingsContainerArgs): Promise<EditableSettingsCloudContainer>;\r\n\r\n /**\r\n * Find and open existing settings containers by querying the [[BlobContainer]] service.\r\n * This is a convenience method that queries for all settings containers matching the given iTwinId\r\n * (and optionally iModelId), requests write access tokens, and opens each matching container.\r\n * @param args - The query arguments including iTwinId and optionally iModelId and label.\r\n * @returns A promise that resolves to an array of opened [[EditableSettingsCloudContainer]]s.\r\n * @note Requires [[IModelHost.authorizationClient]] and [[BlobContainer.service]] to be configured.\r\n */\r\n findContainers(args: SettingsEditor.QuerySettingsContainersArgs): Promise<EditableSettingsCloudContainer[]>;\r\n\r\n /**\r\n * Closes this editor. All settings containers are dropped.\r\n */\r\n close(): void;\r\n}\r\n"]}
@@ -399,7 +399,9 @@ export interface CloudSqliteContainer {
399
399
  export interface WorkspaceContainer extends CloudSqliteContainer {
400
400
  /** @internal */
401
401
  addWorkspaceDb(toAdd: WorkspaceDb): void;
402
- /** Obtain a [[WorkspaceDb]] satisfying the name and version criteria specified by `props`. */
402
+ /** Obtain a [[WorkspaceDb]] satisfying the name and version criteria specified by `props`.
403
+ * Repeated calls that resolve to the same WorkspaceDb return the same cached instance until it is closed.
404
+ */
403
405
  getWorkspaceDb(props?: WorkspaceDbProps): WorkspaceDb;
404
406
  /** Close and remove a currently opened [[WorkspaceDb]] from this Workspace.
405
407
  * @internal
@@ -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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"}