@itwin/core-backend 5.0.0-dev.32 → 5.0.0-dev.34
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/lib/cjs/BriefcaseManager.js +1 -1
- package/lib/cjs/BriefcaseManager.js.map +1 -1
- package/lib/cjs/ChangeSummaryManager.js +1 -1
- package/lib/cjs/ChangeSummaryManager.js.map +1 -1
- package/lib/cjs/CheckpointManager.js +5 -5
- package/lib/cjs/CheckpointManager.js.map +1 -1
- package/lib/cjs/ClassRegistry.js +8 -14
- package/lib/cjs/ClassRegistry.js.map +1 -1
- package/lib/cjs/CloudSqlite.js +2 -2
- package/lib/cjs/CloudSqlite.js.map +1 -1
- package/lib/cjs/CodeSpecs.js +1 -1
- package/lib/cjs/CodeSpecs.js.map +1 -1
- package/lib/cjs/DevTools.js +16 -16
- package/lib/cjs/DevTools.js.map +1 -1
- package/lib/cjs/ECDb.d.ts +0 -4
- package/lib/cjs/ECDb.d.ts.map +1 -1
- package/lib/cjs/ECDb.js +0 -4
- package/lib/cjs/ECDb.js.map +1 -1
- package/lib/cjs/Element.js +23 -25
- package/lib/cjs/Element.js.map +1 -1
- package/lib/cjs/GeoCoordConfig.js +8 -8
- package/lib/cjs/GeoCoordConfig.js.map +1 -1
- package/lib/cjs/HubMock.js +1 -1
- package/lib/cjs/HubMock.js.map +1 -1
- package/lib/cjs/IModelDb.d.ts +82 -5
- package/lib/cjs/IModelDb.d.ts.map +1 -1
- package/lib/cjs/IModelDb.js +98 -40
- package/lib/cjs/IModelDb.js.map +1 -1
- package/lib/cjs/IModelHost.d.ts +0 -7
- package/lib/cjs/IModelHost.d.ts.map +1 -1
- package/lib/cjs/IModelHost.js +18 -24
- package/lib/cjs/IModelHost.js.map +1 -1
- package/lib/cjs/IpcHost.js +1 -1
- package/lib/cjs/IpcHost.js.map +1 -1
- package/lib/cjs/LocalhostIpcHost.js +1 -1
- package/lib/cjs/LocalhostIpcHost.js.map +1 -1
- package/lib/cjs/NativeAppStorage.js +3 -3
- package/lib/cjs/NativeAppStorage.js.map +1 -1
- package/lib/cjs/NativeHost.js +3 -3
- package/lib/cjs/NativeHost.js.map +1 -1
- package/lib/cjs/NavigationRelationship.js +25 -25
- package/lib/cjs/NavigationRelationship.js.map +1 -1
- package/lib/cjs/SQLiteDb.d.ts +6 -4
- package/lib/cjs/SQLiteDb.d.ts.map +1 -1
- package/lib/cjs/SQLiteDb.js +12 -6
- package/lib/cjs/SQLiteDb.js.map +1 -1
- package/lib/cjs/Schema.js +1 -1
- package/lib/cjs/Schema.js.map +1 -1
- package/lib/cjs/TxnManager.d.ts +4 -0
- package/lib/cjs/TxnManager.d.ts.map +1 -1
- package/lib/cjs/TxnManager.js +7 -1
- package/lib/cjs/TxnManager.js.map +1 -1
- package/lib/cjs/ViewDefinition.js +19 -22
- package/lib/cjs/ViewDefinition.js.map +1 -1
- package/lib/cjs/domains/FunctionalElements.js +1 -1
- package/lib/cjs/domains/FunctionalElements.js.map +1 -1
- package/lib/cjs/internal/ChannelAdmin.js +1 -1
- package/lib/cjs/internal/ChannelAdmin.js.map +1 -1
- package/lib/cjs/internal/FontFileImpl.js +26 -37
- package/lib/cjs/internal/FontFileImpl.js.map +1 -1
- package/lib/cjs/internal/IModelDbFontsImpl.js +76 -84
- package/lib/cjs/internal/IModelDbFontsImpl.js.map +1 -1
- package/lib/cjs/internal/workspace/SettingsImpl.js +2 -2
- package/lib/cjs/internal/workspace/SettingsImpl.js.map +1 -1
- package/lib/cjs/internal/workspace/SettingsSchemasImpl.js +1 -1
- package/lib/cjs/internal/workspace/SettingsSchemasImpl.js.map +1 -1
- package/lib/cjs/internal/workspace/WorkspaceImpl.js +5 -5
- package/lib/cjs/internal/workspace/WorkspaceImpl.js.map +1 -1
- package/lib/cjs/rpc/tracing.js +1 -1
- package/lib/cjs/rpc/tracing.js.map +1 -1
- package/lib/cjs/rpc-impl/RpcBriefcaseUtility.js +1 -1
- package/lib/cjs/rpc-impl/RpcBriefcaseUtility.js.map +1 -1
- package/package.json +11 -11
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"WorkspaceImpl.js","sourceRoot":"","sources":["../../../../src/internal/workspace/WorkspaceImpl.ts"],"names":[],"mappings":"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","sourcesContent":["/*---------------------------------------------------------------------------------------------\n* Copyright (c) Bentley Systems, Incorporated. All rights reserved.\n* See LICENSE.md in the project root for license terms and full copyright notice.\n*--------------------------------------------------------------------------------------------*/\n/** @packageDocumentation\n * @module Workspace\n */\n\nimport { createHash } from \"crypto\";\nimport * as fs from \"fs-extra\";\nimport { dirname, extname, join } from \"path\";\nimport * as semver from \"semver\";\nimport { AccessToken, assert, BeEvent, DbResult, Mutable, OpenMode } from \"@itwin/core-bentley\";\nimport { FilePropertyProps, IModelError, LocalDirName, LocalFileName } from \"@itwin/core-common\";\nimport { CloudSqlite } from \"../../CloudSqlite\";\nimport { IModelHost, KnownLocations } from \"../../IModelHost\";\nimport { IModelJsFs } from \"../../IModelJsFs\";\nimport { SQLiteDb } from \"../../SQLiteDb\";\nimport { SqliteStatement } from \"../../SqliteStatement\";\nimport { SettingName, Settings, SettingsContainer, SettingsDictionaryProps, SettingsPriority } from \"../../workspace/Settings\";\nimport type { IModelJsNative } from \"@bentley/imodeljs-native\";\nimport {\n GetWorkspaceContainerArgs, Workspace, WorkspaceContainer, WorkspaceContainerId, WorkspaceContainerProps, WorkspaceDb, WorkspaceDbCloudProps,\n WorkspaceDbFullName, WorkspaceDbLoadError, WorkspaceDbLoadErrors, WorkspaceDbManifest, WorkspaceDbName, WorkspaceDbNameAndVersion, WorkspaceDbProps,\n WorkspaceDbQueryResourcesArgs, WorkspaceDbSettingsProps, WorkspaceDbVersion, WorkspaceOpts, WorkspaceResourceName, WorkspaceSettingNames,\n} from \"../../workspace/Workspace\";\nimport { CreateNewWorkspaceContainerArgs, CreateNewWorkspaceDbVersionArgs, EditableWorkspaceContainer, EditableWorkspaceDb, WorkspaceEditor } from \"../../workspace/WorkspaceEditor\";\nimport { WorkspaceSqliteDb } from \"./WorkspaceSqliteDb\";\nimport { SettingsImpl } from \"./SettingsImpl\";\nimport { _implementationProhibited, _nativeDb } from \"../Symbols\";\n\nfunction workspaceDbNameWithDefault(dbName?: WorkspaceDbName): WorkspaceDbName {\n return dbName ?? \"workspace-db\";\n}\n\n/** file extension for local WorkspaceDbs */\nexport const workspaceDbFileExt = \"itwin-workspace\";\n\ninterface WorkspaceCloudContainer extends CloudSqlite.CloudContainer {\n connectCount: number;\n sharedConnect(): boolean;\n sharedDisconnect(): void;\n}\n\ninterface WorkspaceCloudCache extends CloudSqlite.CloudCache {\n workspaceContainers: Map<string, WorkspaceCloudContainer>;\n}\n\nfunction makeWorkspaceCloudCache(arg: CloudSqlite.CreateCloudCacheArg): WorkspaceCloudCache {\n const cache = CloudSqlite.CloudCaches.getCache(arg) as WorkspaceCloudCache;\n if (undefined === cache.workspaceContainers) // if we just created this container, add the map.\n cache.workspaceContainers = new Map<string, WorkspaceCloudContainer>();\n return cache;\n}\n\nfunction getContainerFullId(props: WorkspaceContainerProps) {\n return `${props.baseUri}/${props.containerId}`;\n}\n\nfunction getWorkspaceCloudContainer(props: CloudSqlite.ContainerAccessProps, cache: WorkspaceCloudCache) {\n const id = getContainerFullId(props);\n let cloudContainer = cache.workspaceContainers.get(id);\n if (undefined !== cloudContainer)\n return cloudContainer;\n\n cloudContainer = CloudSqlite.createCloudContainer(props) as WorkspaceCloudContainer;\n cache.workspaceContainers.set(id, cloudContainer);\n cloudContainer.connectCount = 0;\n cloudContainer.sharedConnect = function (this: WorkspaceCloudContainer) {\n if (this.connectCount++ === 0) {\n this.connect(cache);\n return true;\n }\n\n return false;\n };\n\n cloudContainer.sharedDisconnect = function (this: WorkspaceCloudContainer) {\n if (--this.connectCount <= 0) {\n this.disconnect();\n cache.workspaceContainers.delete(id);\n this.connectCount = 0;\n }\n };\n\n return cloudContainer;\n}\n\nclass WorkspaceContainerImpl implements WorkspaceContainer {\n public readonly [_implementationProhibited] = undefined;\n public readonly workspace: WorkspaceImpl;\n public readonly filesDir: LocalDirName;\n public readonly id: WorkspaceContainerId;\n public readonly fromProps: WorkspaceContainerProps;\n private readonly _cloudContainer?: WorkspaceCloudContainer | undefined;\n\n public get cloudContainer(): WorkspaceCloudContainer | undefined {\n return this._cloudContainer;\n }\n\n protected _wsDbs = new Map<WorkspaceDbName, WorkspaceDb>();\n public get dirName() { return join(this.workspace.containerDir, this.id); }\n\n public constructor(workspace: WorkspaceImpl, props: WorkspaceContainerProps & { accessToken: AccessToken }) {\n validateWorkspaceContainerId(props.containerId);\n this.workspace = workspace;\n this.id = props.containerId;\n this.fromProps = props;\n\n if (props.baseUri !== \"\")\n this._cloudContainer = getWorkspaceCloudContainer(props, this.workspace.getCloudCache());\n\n workspace.addContainer(this);\n this.filesDir = join(this.dirName, \"Files\");\n\n const cloudContainer = this.cloudContainer;\n if (undefined === cloudContainer)\n return;\n\n // sharedConnect returns true if we just connected (if the container is shared, it may have already been connected)\n if (cloudContainer.sharedConnect() && false !== props.syncOnConnect) {\n try {\n cloudContainer.checkForChanges();\n } catch {\n // must be offline\n }\n }\n }\n\n public resolveDbFileName(props: WorkspaceDbProps): WorkspaceDbFullName {\n const cloudContainer = this.cloudContainer;\n if (undefined === cloudContainer)\n return join(this.dirName, `${props.dbName}.${workspaceDbFileExt}`); // local file, versions not allowed\n\n const dbName = workspaceDbNameWithDefault(props.dbName);\n const dbs = cloudContainer.queryDatabases(`${dbName}*`); // get all databases that start with dbName\n\n const versions = [];\n for (const db of dbs) {\n const thisDb = parseWorkspaceDbFileName(db);\n if (thisDb.dbName === dbName && \"string\" === typeof thisDb.version && thisDb.version.length > 0)\n versions.push(thisDb.version);\n }\n\n if (versions.length === 0)\n versions[0] = \"0.0.0\";\n\n const range = props.version ?? \"*\";\n try {\n const version = semver.maxSatisfying(versions, range, { loose: true, includePrerelease: props.includePrerelease });\n if (version)\n return `${dbName}:${version}`;\n } catch { }\n throwWorkspaceDbLoadError(`No version of '${dbName}' available for \"${range}\"`, props);\n }\n\n public addWorkspaceDb(toAdd: WorkspaceDb) {\n if (undefined !== this._wsDbs.get(toAdd.dbName))\n throw new Error(`workspaceDb '${toAdd.dbName}' already exists in workspace`);\n this._wsDbs.set(toAdd.dbName, toAdd);\n }\n\n public getWorkspaceDb(props?: WorkspaceDbProps): WorkspaceDb {\n return this._wsDbs.get(workspaceDbNameWithDefault(props?.dbName)) ?? new WorkspaceDbImpl(props ?? {}, this);\n }\n\n public closeWorkspaceDb(toDrop: WorkspaceDb) {\n const name = toDrop.dbName;\n const wsDb = this._wsDbs.get(name);\n if (wsDb === toDrop) {\n this._wsDbs.delete(name);\n wsDb.close();\n }\n }\n\n public close() {\n for (const [_name, db] of this._wsDbs)\n db.close();\n this._wsDbs.clear();\n this.cloudContainer?.sharedDisconnect();\n }\n}\n\n/** Implementation of WorkspaceDb */\nclass WorkspaceDbImpl implements WorkspaceDb {\n public readonly [_implementationProhibited] = undefined;\n public readonly sqliteDb = new WorkspaceSqliteDb();\n public readonly dbName: WorkspaceDbName;\n protected readonly _container: WorkspaceContainer;\n public readonly onClose = new BeEvent<() => void>();\n public readonly dbFileName: string;\n protected _manifest?: WorkspaceDbManifest;\n\n /** true if this WorkspaceDb is currently open */\n public get isOpen() { return this.sqliteDb.isOpen; }\n public get container(): WorkspaceContainer { return this._container; }\n public queryFileResource(rscName: WorkspaceResourceName): { localFileName: LocalFileName, info: IModelJsNative.EmbedFileQuery } | undefined {\n const info = this.sqliteDb[_nativeDb].queryEmbeddedFile(rscName);\n if (undefined === info)\n return undefined;\n\n // since resource names can contain illegal characters, path separators, etc., we make the local file name from its hash, in hex.\n let localFileName = join(this._container.filesDir, createHash(\"sha1\").update(this.dbFileName).update(rscName).digest(\"hex\"));\n if (info.fileExt !== \"\") // since some applications may expect to see the extension, append it here if it was supplied.\n localFileName = `${localFileName}.${info.fileExt}`;\n return { localFileName, info };\n }\n\n public constructor(props: WorkspaceDbProps, container: WorkspaceContainer) {\n this.dbName = workspaceDbNameWithDefault(props.dbName);\n validateWorkspaceDbName(this.dbName);\n this._container = container;\n this.dbFileName = container.resolveDbFileName(props);\n container.addWorkspaceDb(this);\n if (true === props.prefetch)\n this.prefetch();\n }\n\n public open() {\n this.sqliteDb.openDb(this.dbFileName, OpenMode.Readonly, this._container.cloudContainer);\n }\n\n public close() {\n if (this.isOpen) {\n this.onClose.raiseEvent();\n this.sqliteDb.closeDb();\n this._container.closeWorkspaceDb(this);\n }\n }\n public get version() {\n const cloudContainer = this.container.cloudContainer;\n if (undefined === cloudContainer)\n return \"1.0.0\"; // local file, no versioning. return default\n return parseWorkspaceDbFileName(this.dbFileName).version;\n }\n\n public get manifest(): WorkspaceDbManifest {\n return this._manifest ??= this.withOpenDb((db) => {\n const manifestJson = db[_nativeDb].queryFileProperty(workspaceManifestProperty, true) as string | undefined;\n return manifestJson ? JSON.parse(manifestJson) : { workspaceName: this.dbName };\n });\n }\n\n private withOpenDb<T>(operation: (db: WorkspaceSqliteDb) => T): T {\n const done = this.isOpen ? () => { } : (this.open(), () => this.close());\n try {\n return operation(this.sqliteDb);\n } finally {\n done();\n }\n }\n\n public getString(rscName: WorkspaceResourceName): string | undefined {\n return this.withOpenDb((db) => {\n return db.withSqliteStatement(\"SELECT value from strings WHERE id=?\", (stmt) => {\n stmt.bindString(1, rscName);\n return DbResult.BE_SQLITE_ROW === stmt.step() ? stmt.getValueString(0) : undefined;\n });\n });\n }\n\n public getBlobReader(rscName: WorkspaceResourceName): SQLiteDb.BlobIO {\n return this.sqliteDb.withSqliteStatement(\"SELECT rowid from blobs WHERE id=?\", (stmt) => {\n stmt.bindString(1, rscName);\n const blobReader = SQLiteDb.createBlobIO();\n blobReader.open(this.sqliteDb[_nativeDb], { tableName: \"blobs\", columnName: \"value\", row: stmt.getValueInteger(0) });\n return blobReader;\n });\n }\n\n public getBlob(rscName: WorkspaceResourceName): Uint8Array | undefined {\n return this.withOpenDb((db) => {\n return db.withSqliteStatement(\"SELECT value from blobs WHERE id=?\", (stmt) => {\n stmt.bindString(1, rscName);\n return DbResult.BE_SQLITE_ROW === stmt.step() ? stmt.getValueBlob(0) : undefined;\n });\n });\n }\n\n public getFile(rscName: WorkspaceResourceName, targetFileName?: LocalFileName): LocalFileName | undefined {\n return this.withOpenDb((db) => {\n const file = this.queryFileResource(rscName);\n if (!file)\n return undefined;\n\n const info = file.info;\n const localFileName = targetFileName ?? file.localFileName;\n\n // check whether the file is already up to date.\n const stat = fs.existsSync(localFileName) && fs.statSync(localFileName);\n if (stat && Math.round(stat.mtimeMs) === info.date && stat.size === info.size)\n return localFileName; // yes, we're done\n\n // extractEmbeddedFile fails if the file exists or if the directory does not exist\n if (stat)\n fs.removeSync(localFileName);\n else\n IModelJsFs.recursiveMkDirSync(dirname(localFileName));\n\n db[_nativeDb].extractEmbeddedFile({ name: rscName, localFileName });\n const date = new Date(info.date);\n fs.utimesSync(localFileName, date, date); // set the last-modified date of the file to match date in container\n fs.chmodSync(localFileName, \"0444\"); // set file readonly\n return localFileName;\n });\n }\n\n public prefetch(opts?: CloudSqlite.PrefetchProps): CloudSqlite.CloudPrefetch {\n const cloudContainer = this._container.cloudContainer;\n if (cloudContainer === undefined)\n throw new Error(\"no cloud container to prefetch\");\n return CloudSqlite.startCloudPrefetch(cloudContainer, this.dbFileName, opts);\n }\n\n public queryResources(args: WorkspaceDbQueryResourcesArgs): void {\n const table = \"blob\" !== args.type ? \"strings\" : \"blobs\";\n this.withOpenDb((db) => {\n const where = undefined !== args.namePattern ? ` WHERE id ${args.nameCompare ?? \"=\"} ?` : \"\";\n db.withSqliteStatement(`SELECT id from ${table}${where}`, (stmt) => {\n function* makeIterable() {\n while (DbResult.BE_SQLITE_ROW === stmt.step()) {\n yield stmt.getValueString(0);\n }\n }\n\n if (undefined !== args.namePattern) {\n stmt.bindString(1, args.namePattern);\n }\n\n args.callback(makeIterable());\n });\n });\n }\n}\n\n/** Implementation of Workspace */\nclass WorkspaceImpl implements Workspace {\n public readonly [_implementationProhibited] = undefined;\n private _containers = new Map<WorkspaceContainerId, WorkspaceContainerImpl>();\n public readonly containerDir: LocalDirName;\n public readonly settings: Settings;\n protected _cloudCache?: WorkspaceCloudCache;\n public getCloudCache(): WorkspaceCloudCache {\n return this._cloudCache ??= makeWorkspaceCloudCache({ cacheName: \"Workspace\", cacheSize: \"20G\" });\n }\n\n public constructor(settings: Settings, opts?: WorkspaceOpts) {\n this.settings = settings;\n this.containerDir = opts?.containerDir ?? join(IModelHost.cacheDir, \"Workspace\");\n let settingsFiles = opts?.settingsFiles;\n if (settingsFiles) {\n if (typeof settingsFiles === \"string\")\n settingsFiles = [settingsFiles];\n settingsFiles.forEach((file) => settings.addFile(file, SettingsPriority.application));\n }\n }\n\n public addContainer(toAdd: WorkspaceContainerImpl) {\n if (undefined !== this._containers.get(toAdd.id))\n throw new Error(\"container already exists in workspace\");\n this._containers.set(toAdd.id, toAdd);\n }\n\n public findContainer(containerId: WorkspaceContainerId) {\n return this._containers.get(containerId);\n }\n\n public getContainer(props: GetWorkspaceContainerArgs): WorkspaceContainer {\n return this.findContainer(props.containerId) ?? new WorkspaceContainerImpl(this, props);\n }\n\n public async getContainerAsync(props: WorkspaceContainerProps): Promise<WorkspaceContainer> {\n const accessToken = props.accessToken ?? ((props.baseUri === \"\") || props.isPublic) ? \"\" : await CloudSqlite.requestToken({ ...props, accessLevel: \"read\" });\n return this.getContainer({ ...props, accessToken });\n }\n\n public async getWorkspaceDb(props: WorkspaceDbCloudProps): Promise<WorkspaceDb> {\n let container: WorkspaceContainer | undefined = this.findContainer(props.containerId);\n if (undefined === container) {\n const accessToken = props.isPublic ? \"\" : await CloudSqlite.requestToken({ accessLevel: \"read\", ...props });\n container = new WorkspaceContainerImpl(this, { ...props, accessToken });\n }\n return container.getWorkspaceDb(props);\n }\n\n public async loadSettingsDictionary(props: WorkspaceDbSettingsProps | WorkspaceDbSettingsProps[], problems?: WorkspaceDbLoadError[]) {\n if (!Array.isArray(props))\n props = [props];\n\n for (const prop of props) {\n const db = await this.getWorkspaceDb(prop);\n db.open();\n try {\n const manifest = db.manifest;\n const dictProps: SettingsDictionaryProps = { name: prop.resourceName, workspaceDb: db, priority: prop.priority };\n // don't load if we already have this dictionary. Happens if the same WorkspaceDb is in more than one list\n if (undefined === this.settings.getDictionary(dictProps)) {\n const settingsJson = db.getString(prop.resourceName);\n if (undefined === settingsJson)\n throwWorkspaceDbLoadError(`could not load setting dictionary resource '${prop.resourceName}' from: '${manifest.workspaceName}'`, prop, db);\n\n db.close(); // don't leave this db open in case we're going to find another dictionary in it recursively.\n\n this.settings.addJson(dictProps, settingsJson);\n const dict = this.settings.getDictionary(dictProps);\n if (dict) {\n Workspace.onSettingsDictionaryLoadedFn({ dict, from: db });\n // if the dictionary we just loaded has a \"settingsWorkspaces\" entry, load them too, recursively\n const nested = dict.getSetting<WorkspaceDbSettingsProps[]>(WorkspaceSettingNames.settingsWorkspaces);\n if (nested !== undefined) {\n IModelHost.settingsSchemas.validateSetting<WorkspaceDbSettingsProps[]>(nested, WorkspaceSettingNames.settingsWorkspaces);\n await this.loadSettingsDictionary(nested, problems);\n }\n }\n }\n } catch (e) {\n db.close();\n problems?.push(e as WorkspaceDbLoadError);\n }\n }\n }\n\n public close() {\n this.settings.close();\n for (const [_id, container] of this._containers)\n container.close();\n this._containers.clear();\n }\n\n public resolveWorkspaceDbSetting(settingName: SettingName, filter?: Workspace.DbListFilter): WorkspaceDbCloudProps[] {\n const settingDef = IModelHost.settingsSchemas.settingDefs.get(settingName);\n const combine = settingDef?.combineArray === true;\n filter = filter ?? (() => true);\n const result: WorkspaceDbCloudProps[] = [];\n for (const entry of this.settings.getSettingEntries<WorkspaceDbCloudProps[]>(settingName)) {\n for (const dbProp of entry.value) {\n if (filter(dbProp, entry.dictionary)) {\n result.push(dbProp);\n }\n }\n\n if (!combine) {\n break;\n }\n }\n\n return result;\n }\n\n public async getWorkspaceDbs(args: Workspace.DbListOrSettingName & { filter?: Workspace.DbListFilter, problems?: WorkspaceDbLoadError[] }): Promise<WorkspaceDb[]> {\n const dbList = (args.settingName !== undefined) ? this.resolveWorkspaceDbSetting(args.settingName, args.filter) : args.dbs;\n const result: WorkspaceDb[] = [];\n const pushUnique = (wsDb: WorkspaceDb) => {\n for (const db of result) {\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\n // database from more than one Workspace (though then they must use a \"shared\" CloudContainer).\n if (db === wsDb || ((db.container.cloudContainer === wsDb.container.cloudContainer) && (db.dbFileName === wsDb.dbFileName)))\n return; // this db is redundant\n }\n result.push(wsDb);\n };\n\n for (const dbProps of dbList) {\n try {\n pushUnique(await this.getWorkspaceDb(dbProps));\n } catch (e) {\n const loadErr = e as WorkspaceDbLoadError;\n loadErr.wsDbProps = dbProps;\n args.problems?.push(loadErr);\n }\n }\n return result;\n }\n}\n\nconst workspaceEditorName = \"WorkspaceEditor\"; // name of the cache for the editor workspace\nclass EditorWorkspaceImpl extends WorkspaceImpl {\n public override getCloudCache(): WorkspaceCloudCache {\n return this._cloudCache ??= makeWorkspaceCloudCache({ cacheName: workspaceEditorName, cacheSize: \"20G\" });\n }\n}\n\nclass EditorImpl implements WorkspaceEditor {\n public readonly [_implementationProhibited] = undefined;\n public workspace = new EditorWorkspaceImpl(new SettingsImpl(), { containerDir: join(IModelHost.cacheDir, workspaceEditorName) });\n\n public async initializeContainer(args: CreateNewWorkspaceContainerArgs) {\n class CloudAccess extends CloudSqlite.DbAccess<WorkspaceSqliteDb> {\n protected static override _cacheName = workspaceEditorName;\n public static async initializeWorkspace(args: CreateNewWorkspaceContainerArgs) {\n const props = await this.createBlobContainer({ scope: args.scope, metadata: { ...args.metadata, containerType: \"workspace\" } });\n const dbFullName = makeWorkspaceDbFileName(workspaceDbNameWithDefault(args.dbName), \"0.0.0\");\n await super._initializeDb({ ...args, props, dbName: dbFullName, dbType: WorkspaceSqliteDb, blockSize: \"4M\" });\n return props;\n }\n }\n return CloudAccess.initializeWorkspace(args);\n }\n\n public async createNewCloudContainer(args: CreateNewWorkspaceContainerArgs): Promise<EditableWorkspaceContainer> {\n const cloudContainer = await this.initializeContainer(args);\n const userToken = await IModelHost.authorizationClient?.getAccessToken();\n const accessToken = await CloudSqlite.requestToken({ ...cloudContainer, accessLevel: \"write\", userToken });\n return this.getContainer({ accessToken, ...cloudContainer, writeable: true, description: args.metadata.description });\n }\n\n public getContainer(props: GetWorkspaceContainerArgs): EditableWorkspaceContainer {\n return this.workspace.findContainer(props.containerId) as EditableWorkspaceContainer | undefined ?? new EditorContainerImpl(this.workspace, props);\n }\n public async getContainerAsync(props: WorkspaceContainerProps): Promise<EditableWorkspaceContainer> {\n const accessToken = props.accessToken ?? (props.baseUri === \"\") ? \"\" : await CloudSqlite.requestToken({ ...props, accessLevel: \"write\" });\n return this.getContainer({ ...props, accessToken });\n }\n\n public close() {\n this.workspace.close();\n }\n}\n\ninterface EditCloudContainer extends WorkspaceCloudContainer {\n writeLockHeldBy?: string; // added by acquireWriteLock\n}\n\nclass EditorContainerImpl extends WorkspaceContainerImpl implements EditableWorkspaceContainer {\n public override get cloudContainer(): EditCloudContainer | undefined {\n return super.cloudContainer as EditCloudContainer | undefined;\n }\n\n public get cloudProps(): WorkspaceContainerProps | undefined {\n const cloudContainer = this.cloudContainer;\n if (undefined === cloudContainer)\n return undefined;\n return {\n baseUri: cloudContainer.baseUri,\n containerId: cloudContainer.containerId,\n storageType: cloudContainer.storageType as \"azure\" | \"google\",\n isPublic: cloudContainer.isPublic,\n };\n }\n\n public async createNewWorkspaceDbVersion(args: CreateNewWorkspaceDbVersionArgs): Promise<{ oldDb: WorkspaceDbNameAndVersion, newDb: WorkspaceDbNameAndVersion }> {\n const cloudContainer = this.cloudContainer;\n if (undefined === cloudContainer)\n throw new Error(\"versions require cloud containers\");\n\n const oldName = this.resolveDbFileName(args.fromProps ?? {});\n const oldDb = parseWorkspaceDbFileName(oldName);\n const newVersion = semver.inc(oldDb.version, args.versionType, args.identifier);\n if (!newVersion)\n throwWorkspaceDbLoadError(\"invalid version\", args.fromProps ?? {});\n\n const newName = makeWorkspaceDbFileName(oldDb.dbName, newVersion);\n await cloudContainer.copyDatabase(oldName, newName);\n // return the old and new db names and versions\n return { oldDb, newDb: { dbName: oldDb.dbName, version: newVersion } };\n }\n\n public override getWorkspaceDb(props: WorkspaceDbProps): EditableWorkspaceDb {\n return this.getEditableDb(props);\n }\n\n public getEditableDb(props: WorkspaceDbProps): EditableWorkspaceDb {\n const db = this._wsDbs.get(workspaceDbNameWithDefault(props.dbName)) as EditableDbImpl | undefined ?? new EditableDbImpl(props, this);\n const isPrerelease = semver.major(db.version) === 0 || semver.prerelease(db.version);\n\n if (!isPrerelease && this.cloudContainer && this.cloudContainer.queryDatabase(db.dbFileName)?.state !== \"copied\") {\n this._wsDbs.delete(workspaceDbNameWithDefault(props.dbName));\n throw new Error(`${db.dbFileName} has been published and is not editable. Make a new version first.`);\n }\n\n return db;\n }\n\n public acquireWriteLock(user: string): void {\n if (this.cloudContainer) {\n this.cloudContainer.acquireWriteLock(user);\n this.cloudContainer.writeLockHeldBy = user;\n }\n }\n public releaseWriteLock() {\n if (this.cloudContainer) {\n this.cloudContainer.releaseWriteLock();\n this.cloudContainer.writeLockHeldBy = undefined;\n }\n }\n\n public abandonChanges() {\n if (this.cloudContainer) {\n this.cloudContainer.abandonChanges();\n this.cloudContainer.writeLockHeldBy = undefined;\n }\n }\n\n public async createDb(args: { dbName?: string, manifest: WorkspaceDbManifest }): Promise<EditableWorkspaceDb> {\n if (!this.cloudContainer) {\n WorkspaceEditor.createEmptyDb({ localFileName: this.resolveDbFileName(args), manifest: args.manifest });\n } else {\n // currently the only way to create a workspaceDb in a cloud container is to create a temporary workspaceDb and upload it.\n const tempDbFile = join(KnownLocations.tmpdir, `empty.${workspaceDbFileExt}`);\n if (fs.existsSync(tempDbFile))\n IModelJsFs.removeSync(tempDbFile);\n\n WorkspaceEditor.createEmptyDb({ localFileName: tempDbFile, manifest: args.manifest });\n await CloudSqlite.uploadDb(this.cloudContainer, { localFileName: tempDbFile, dbName: makeWorkspaceDbFileName(workspaceDbNameWithDefault(args.dbName)) });\n IModelJsFs.removeSync(tempDbFile);\n }\n\n return this.getWorkspaceDb(args);\n }\n}\n\nclass EditableDbImpl extends WorkspaceDbImpl implements EditableWorkspaceDb {\n public override get container(): EditableWorkspaceContainer {\n assert(this._container instanceof EditorContainerImpl);\n return this._container;\n }\n\n private static validateResourceName(name: WorkspaceResourceName) {\n if (name.trim() !== name) {\n throw new Error(\"resource name may not have leading or trailing spaces\");\n }\n\n if (name.length > 1024) {\n throw new Error(\"resource name too long\");\n }\n }\n\n private validateResourceSize(val: Uint8Array | string) {\n const len = typeof val === \"string\" ? val.length : val.byteLength;\n if (len > (1024 * 1024 * 1024)) // one gigabyte\n throw new Error(\"value is too large\");\n }\n public get cloudProps(): WorkspaceDbCloudProps | undefined {\n const props = (this._container as EditorContainerImpl).cloudProps as Mutable<WorkspaceDbCloudProps>;\n if (props === undefined)\n return undefined;\n\n const parsed = parseWorkspaceDbFileName(this.dbFileName);\n return { ...props, dbName: parsed.dbName, version: parsed.version };\n }\n\n public override open() {\n this.sqliteDb.openDb(this.dbFileName, OpenMode.ReadWrite, this._container.cloudContainer);\n }\n\n public override close() {\n if (this.isOpen) {\n // whenever we close an EditableDb, update the name of the last editor in the manifest\n const lastEditedBy = (this._container.cloudContainer as any)?.writeLockHeldBy;\n if (lastEditedBy !== undefined)\n this.updateManifest({ ...this.manifest, lastEditedBy });\n\n // make sure all changes were saved before we close\n this.sqliteDb.saveChanges();\n }\n super.close();\n }\n\n private getFileModifiedTime(localFileName: LocalFileName): number {\n return Math.round(fs.statSync(localFileName).mtimeMs);\n }\n\n private performWriteSql(rscName: WorkspaceResourceName, sql: string, bind?: (stmt: SqliteStatement) => void) {\n this.sqliteDb.withSqliteStatement(sql, (stmt) => {\n stmt.bindString(1, rscName);\n bind?.(stmt);\n const rc = stmt.step();\n if (DbResult.BE_SQLITE_DONE !== rc) {\n if (DbResult.BE_SQLITE_CONSTRAINT_PRIMARYKEY === rc)\n throw new IModelError(rc, `resource \"${rscName}\" already exists`);\n\n throw new IModelError(rc, `workspace [${sql}]`);\n }\n });\n this.sqliteDb.saveChanges();\n }\n\n public updateManifest(manifest: WorkspaceDbManifest) {\n this.sqliteDb[_nativeDb].saveFileProperty(workspaceManifestProperty, JSON.stringify(manifest));\n this._manifest = undefined;\n }\n public updateSettingsResource(settings: SettingsContainer, rscName?: string) {\n this.updateString(rscName ?? \"settingsDictionary\", JSON.stringify(settings));\n }\n public addString(rscName: WorkspaceResourceName, val: string): void {\n EditableDbImpl.validateResourceName(rscName);\n this.validateResourceSize(val);\n this.performWriteSql(rscName, \"INSERT INTO strings(id,value) VALUES(?,?)\", (stmt) => stmt.bindString(2, val));\n }\n public updateString(rscName: WorkspaceResourceName, val: string): void {\n this.validateResourceSize(val);\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));\n }\n public removeString(rscName: WorkspaceResourceName): void {\n this.performWriteSql(rscName, \"DELETE FROM strings WHERE id=?\");\n }\n public addBlob(rscName: WorkspaceResourceName, val: Uint8Array): void {\n EditableDbImpl.validateResourceName(rscName);\n this.validateResourceSize(val);\n this.performWriteSql(rscName, \"INSERT INTO blobs(id,value) VALUES(?,?)\", (stmt) => stmt.bindBlob(2, val));\n }\n public updateBlob(rscName: WorkspaceResourceName, val: Uint8Array): void {\n this.validateResourceSize(val);\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));\n }\n public getBlobWriter(rscName: WorkspaceResourceName): SQLiteDb.BlobIO {\n return this.sqliteDb.withSqliteStatement(\"SELECT rowid from blobs WHERE id=?\", (stmt) => {\n stmt.bindString(1, rscName);\n const blobWriter = SQLiteDb.createBlobIO();\n blobWriter.open(this.sqliteDb[_nativeDb], { tableName: \"blobs\", columnName: \"value\", row: stmt.getValueInteger(0), writeable: true });\n return blobWriter;\n });\n }\n public removeBlob(rscName: WorkspaceResourceName): void {\n this.performWriteSql(rscName, \"DELETE FROM blobs WHERE id=?\");\n }\n public addFile(rscName: WorkspaceResourceName, localFileName: LocalFileName, fileExt?: string): void {\n EditableDbImpl.validateResourceName(rscName);\n fileExt = fileExt ?? extname(localFileName);\n if (fileExt?.[0] === \".\")\n fileExt = fileExt.slice(1);\n this.sqliteDb[_nativeDb].embedFile({ name: rscName, localFileName, date: this.getFileModifiedTime(localFileName), fileExt });\n }\n public updateFile(rscName: WorkspaceResourceName, localFileName: LocalFileName): void {\n this.queryFileResource(rscName); // throws if not present\n this.sqliteDb[_nativeDb].replaceEmbeddedFile({ name: rscName, localFileName, date: this.getFileModifiedTime(localFileName) });\n }\n public removeFile(rscName: WorkspaceResourceName): void {\n const file = this.queryFileResource(rscName);\n if (undefined === file)\n throw new Error(`file resource \"${rscName}\" does not exist`);\n if (file && fs.existsSync(file.localFileName))\n fs.unlinkSync(file.localFileName);\n this.sqliteDb[_nativeDb].removeEmbeddedFile(rscName);\n }\n}\n\nexport function constructWorkspaceDb(props: WorkspaceDbProps, container: WorkspaceContainer): WorkspaceDb {\n return new WorkspaceDbImpl(props, container);\n}\n\nexport function constructWorkspace(settings: Settings, opts?: WorkspaceOpts): OwnedWorkspace {\n return new WorkspaceImpl(settings, opts);\n}\n\nexport function constructWorkspaceEditor(): WorkspaceEditor {\n return new EditorImpl();\n}\n\nexport function noLeadingOrTrailingSpaces(name: string, msg: string) {\n if (name.trim() !== name)\n throw new Error(`${msg} [${name}] may not have leading or trailing spaces`);\n}\n\nexport function validateWorkspaceDbName(dbName: WorkspaceDbName) {\n if (dbName === \"\" || dbName.length > 255 || /[#\\.<>:\"/\\\\\"`'|?*\\u0000-\\u001F]/g.test(dbName) || /^(con|prn|aux|nul|com\\d|lpt\\d)$/i.test(dbName))\n throw new Error(`invalid dbName: [${dbName}]`);\n\n noLeadingOrTrailingSpaces(dbName, \"dbName\");\n}\n\n/**\n * Validate that a WorkspaceContainer.Id is valid.\n * The rules for ContainerIds (from Azure, see https://docs.microsoft.com/en-us/rest/api/storageservices/naming-and-referencing-containers--blobs--and-metadata):\n * - may only contain lower case letters, numbers or dashes\n * - may not start or end with with a dash nor have more than one dash in a row\n * - may not be shorter than 3 or longer than 63 characters\n */\nexport function validateWorkspaceContainerId(id: WorkspaceContainerId) {\n if (!/^(?=.{3,63}$)[a-z0-9]+(-[a-z0-9]+)*$/g.test(id))\n throw new Error(`invalid containerId: [${id}]`);\n}\n\nexport function validateWorkspaceDbVersion(version?: WorkspaceDbVersion) {\n version = version ?? \"0.0.0\";\n const opts = { loose: true, includePrerelease: true };\n // clean allows prerelease, so try it first. If that fails attempt to coerce it (coerce strips prerelease even if you say not to.)\n const semVersion = semver.clean(version, opts) ?? semver.coerce(version, opts)?.version;\n if (!semVersion)\n throw new Error(\"invalid version specification\");\n version = semVersion;\n return version;\n}\n\n/**\n * Parse the name stored in a WorkspaceContainer into the dbName and version number. A single WorkspaceContainer may hold\n * many versions of the same WorkspaceDb. The name of the Db in the WorkspaceContainer is in the format \"name:version\". This\n * function splits them into separate strings.\n */\nexport function parseWorkspaceDbFileName(dbFileName: WorkspaceDbFullName): { dbName: WorkspaceDbName, version: WorkspaceDbVersion } {\n const parts = dbFileName.split(\":\");\n return { dbName: parts[0], version: parts[1] };\n}\n\n/** Create a dbName for a WorkspaceDb from its base name and version. This will be in the format \"name:version\" */\nexport function makeWorkspaceDbFileName(dbName: WorkspaceDbName, version?: WorkspaceDbVersion): WorkspaceDbName {\n return `${dbName}:${validateWorkspaceDbVersion(version)}`;\n}\n\nexport const workspaceManifestProperty: FilePropertyProps = { namespace: \"workspace\", name: \"manifest\" };\n\nfunction throwWorkspaceDbLoadError(msg: string, wsDbProps: WorkspaceDbProps | WorkspaceDbCloudProps, db?: WorkspaceDb): never {\n const error = new Error(msg) as WorkspaceDbLoadError;\n error.wsDbProps = wsDbProps;\n error.wsDb = db;\n throw error;\n}\n\nexport function throwWorkspaceDbLoadErrors(msg: string, errors: WorkspaceDbLoadError[]): never {\n const error = new Error(msg) as WorkspaceDbLoadErrors;\n error.wsLoadErrors = errors;\n throw error;\n}\n\nexport interface OwnedWorkspace extends Workspace {\n /** Only the owner of a Workspace may close it. */\n close(): void;\n}\n"]}
|
|
1
|
+
{"version":3,"file":"WorkspaceImpl.js","sourceRoot":"","sources":["../../../../src/internal/workspace/WorkspaceImpl.ts"],"names":[],"mappings":"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","sourcesContent":["/*---------------------------------------------------------------------------------------------\n* Copyright (c) Bentley Systems, Incorporated. All rights reserved.\n* See LICENSE.md in the project root for license terms and full copyright notice.\n*--------------------------------------------------------------------------------------------*/\n/** @packageDocumentation\n * @module Workspace\n */\n\nimport { createHash } from \"crypto\";\nimport * as fs from \"fs-extra\";\nimport { dirname, extname, join } from \"path\";\nimport * as semver from \"semver\";\nimport { AccessToken, assert, BeEvent, DbResult, Mutable, OpenMode } from \"@itwin/core-bentley\";\nimport { FilePropertyProps, IModelError, LocalDirName, LocalFileName } from \"@itwin/core-common\";\nimport { CloudSqlite } from \"../../CloudSqlite\";\nimport { IModelHost, KnownLocations } from \"../../IModelHost\";\nimport { IModelJsFs } from \"../../IModelJsFs\";\nimport { SQLiteDb } from \"../../SQLiteDb\";\nimport { SqliteStatement } from \"../../SqliteStatement\";\nimport { SettingName, Settings, SettingsContainer, SettingsDictionaryProps, SettingsPriority } from \"../../workspace/Settings\";\nimport type { IModelJsNative } from \"@bentley/imodeljs-native\";\nimport {\n GetWorkspaceContainerArgs, Workspace, WorkspaceContainer, WorkspaceContainerId, WorkspaceContainerProps, WorkspaceDb, WorkspaceDbCloudProps,\n WorkspaceDbFullName, WorkspaceDbLoadError, WorkspaceDbLoadErrors, WorkspaceDbManifest, WorkspaceDbName, WorkspaceDbNameAndVersion, WorkspaceDbProps,\n WorkspaceDbQueryResourcesArgs, WorkspaceDbSettingsProps, WorkspaceDbVersion, WorkspaceOpts, WorkspaceResourceName, WorkspaceSettingNames,\n} from \"../../workspace/Workspace\";\nimport { CreateNewWorkspaceContainerArgs, CreateNewWorkspaceDbVersionArgs, EditableWorkspaceContainer, EditableWorkspaceDb, WorkspaceEditor } from \"../../workspace/WorkspaceEditor\";\nimport { WorkspaceSqliteDb } from \"./WorkspaceSqliteDb\";\nimport { SettingsImpl } from \"./SettingsImpl\";\nimport { _implementationProhibited, _nativeDb } from \"../Symbols\";\n\nfunction workspaceDbNameWithDefault(dbName?: WorkspaceDbName): WorkspaceDbName {\n return dbName ?? \"workspace-db\";\n}\n\n/** file extension for local WorkspaceDbs */\nexport const workspaceDbFileExt = \"itwin-workspace\";\n\ninterface WorkspaceCloudContainer extends CloudSqlite.CloudContainer {\n connectCount: number;\n sharedConnect(): boolean;\n sharedDisconnect(): void;\n}\n\ninterface WorkspaceCloudCache extends CloudSqlite.CloudCache {\n workspaceContainers: Map<string, WorkspaceCloudContainer>;\n}\n\nfunction makeWorkspaceCloudCache(arg: CloudSqlite.CreateCloudCacheArg): WorkspaceCloudCache {\n const cache = CloudSqlite.CloudCaches.getCache(arg) as WorkspaceCloudCache;\n if (undefined === cache.workspaceContainers) // if we just created this container, add the map.\n cache.workspaceContainers = new Map<string, WorkspaceCloudContainer>();\n return cache;\n}\n\nfunction getContainerFullId(props: WorkspaceContainerProps) {\n return `${props.baseUri}/${props.containerId}`;\n}\n\nfunction getWorkspaceCloudContainer(props: CloudSqlite.ContainerAccessProps, cache: WorkspaceCloudCache) {\n const id = getContainerFullId(props);\n let cloudContainer = cache.workspaceContainers.get(id);\n if (undefined !== cloudContainer)\n return cloudContainer;\n\n cloudContainer = CloudSqlite.createCloudContainer(props) as WorkspaceCloudContainer;\n cache.workspaceContainers.set(id, cloudContainer);\n cloudContainer.connectCount = 0;\n cloudContainer.sharedConnect = function (this: WorkspaceCloudContainer) {\n if (this.connectCount++ === 0) {\n this.connect(cache);\n return true;\n }\n\n return false;\n };\n\n cloudContainer.sharedDisconnect = function (this: WorkspaceCloudContainer) {\n if (--this.connectCount <= 0) {\n this.disconnect();\n cache.workspaceContainers.delete(id);\n this.connectCount = 0;\n }\n };\n\n return cloudContainer;\n}\n\nclass WorkspaceContainerImpl implements WorkspaceContainer {\n public readonly [_implementationProhibited] = undefined;\n public readonly workspace: WorkspaceImpl;\n public readonly filesDir: LocalDirName;\n public readonly id: WorkspaceContainerId;\n public readonly fromProps: WorkspaceContainerProps;\n private readonly _cloudContainer?: WorkspaceCloudContainer | undefined;\n\n public get cloudContainer(): WorkspaceCloudContainer | undefined {\n return this._cloudContainer;\n }\n\n protected _wsDbs = new Map<WorkspaceDbName, WorkspaceDb>();\n public get dirName() { return join(this.workspace.containerDir, this.id); }\n\n public constructor(workspace: WorkspaceImpl, props: WorkspaceContainerProps & { accessToken: AccessToken }) {\n validateWorkspaceContainerId(props.containerId);\n this.workspace = workspace;\n this.id = props.containerId;\n this.fromProps = props;\n\n if (props.baseUri !== \"\")\n this._cloudContainer = getWorkspaceCloudContainer(props, this.workspace.getCloudCache());\n\n workspace.addContainer(this);\n this.filesDir = join(this.dirName, \"Files\");\n\n const cloudContainer = this.cloudContainer;\n if (undefined === cloudContainer)\n return;\n\n // sharedConnect returns true if we just connected (if the container is shared, it may have already been connected)\n if (cloudContainer.sharedConnect() && false !== props.syncOnConnect) {\n try {\n cloudContainer.checkForChanges();\n } catch {\n // must be offline\n }\n }\n }\n\n public resolveDbFileName(props: WorkspaceDbProps): WorkspaceDbFullName {\n const cloudContainer = this.cloudContainer;\n if (undefined === cloudContainer)\n return join(this.dirName, `${props.dbName}.${workspaceDbFileExt}`); // local file, versions not allowed\n\n const dbName = workspaceDbNameWithDefault(props.dbName);\n const dbs = cloudContainer.queryDatabases(`${dbName}*`); // get all databases that start with dbName\n\n const versions = [];\n for (const db of dbs) {\n const thisDb = parseWorkspaceDbFileName(db);\n if (thisDb.dbName === dbName && \"string\" === typeof thisDb.version && thisDb.version.length > 0)\n versions.push(thisDb.version);\n }\n\n if (versions.length === 0)\n versions[0] = \"0.0.0\";\n\n const range = props.version ?? \"*\";\n try {\n const version = semver.maxSatisfying(versions, range, { loose: true, includePrerelease: props.includePrerelease });\n if (version)\n return `${dbName}:${version}`;\n } catch { }\n throwWorkspaceDbLoadError(`No version of '${dbName}' available for \"${range}\"`, props);\n }\n\n public addWorkspaceDb(toAdd: WorkspaceDb) {\n if (undefined !== this._wsDbs.get(toAdd.dbName))\n throw new Error(`workspaceDb '${toAdd.dbName}' already exists in workspace`);\n this._wsDbs.set(toAdd.dbName, toAdd);\n }\n\n public getWorkspaceDb(props?: WorkspaceDbProps): WorkspaceDb {\n return this._wsDbs.get(workspaceDbNameWithDefault(props?.dbName)) ?? new WorkspaceDbImpl(props ?? {}, this);\n }\n\n public closeWorkspaceDb(toDrop: WorkspaceDb) {\n const name = toDrop.dbName;\n const wsDb = this._wsDbs.get(name);\n if (wsDb === toDrop) {\n this._wsDbs.delete(name);\n wsDb.close();\n }\n }\n\n public close() {\n for (const [_name, db] of this._wsDbs)\n db.close();\n this._wsDbs.clear();\n this.cloudContainer?.sharedDisconnect();\n }\n}\n\n/** Implementation of WorkspaceDb */\nclass WorkspaceDbImpl implements WorkspaceDb {\n public readonly [_implementationProhibited] = undefined;\n public readonly sqliteDb = new WorkspaceSqliteDb();\n public readonly dbName: WorkspaceDbName;\n protected readonly _container: WorkspaceContainer;\n public readonly onClose = new BeEvent<() => void>();\n public readonly dbFileName: string;\n protected _manifest?: WorkspaceDbManifest;\n\n /** true if this WorkspaceDb is currently open */\n public get isOpen() { return this.sqliteDb.isOpen; }\n public get container(): WorkspaceContainer { return this._container; }\n public queryFileResource(rscName: WorkspaceResourceName): { localFileName: LocalFileName, info: IModelJsNative.EmbedFileQuery } | undefined {\n const info = this.sqliteDb[_nativeDb].queryEmbeddedFile(rscName);\n if (undefined === info)\n return undefined;\n\n // since resource names can contain illegal characters, path separators, etc., we make the local file name from its hash, in hex.\n let localFileName = join(this._container.filesDir, createHash(\"sha1\").update(this.dbFileName).update(rscName).digest(\"hex\"));\n if (info.fileExt !== \"\") // since some applications may expect to see the extension, append it here if it was supplied.\n localFileName = `${localFileName}.${info.fileExt}`;\n return { localFileName, info };\n }\n\n public constructor(props: WorkspaceDbProps, container: WorkspaceContainer) {\n this.dbName = workspaceDbNameWithDefault(props.dbName);\n validateWorkspaceDbName(this.dbName);\n this._container = container;\n this.dbFileName = container.resolveDbFileName(props);\n container.addWorkspaceDb(this);\n if (true === props.prefetch)\n this.prefetch();\n }\n\n public open() {\n this.sqliteDb.openDb(this.dbFileName, OpenMode.Readonly, this._container.cloudContainer);\n }\n\n public close() {\n if (this.isOpen) {\n this.onClose.raiseEvent();\n this.sqliteDb.closeDb();\n this._container.closeWorkspaceDb(this);\n }\n }\n public get version() {\n const cloudContainer = this.container.cloudContainer;\n if (undefined === cloudContainer)\n return \"1.0.0\"; // local file, no versioning. return default\n return parseWorkspaceDbFileName(this.dbFileName).version;\n }\n\n public get manifest(): WorkspaceDbManifest {\n return this._manifest ??= this.withOpenDb((db) => {\n const manifestJson = db[_nativeDb].queryFileProperty(workspaceManifestProperty, true) as string | undefined;\n return manifestJson ? JSON.parse(manifestJson) : { workspaceName: this.dbName };\n });\n }\n\n private withOpenDb<T>(operation: (db: WorkspaceSqliteDb) => T): T {\n const done = this.isOpen ? () => { } : (this.open(), () => this.close());\n try {\n return operation(this.sqliteDb);\n } finally {\n done();\n }\n }\n\n public getString(rscName: WorkspaceResourceName): string | undefined {\n return this.withOpenDb((db) => {\n return db.withSqliteStatement(\"SELECT value from strings WHERE id=?\", (stmt) => {\n stmt.bindString(1, rscName);\n return DbResult.BE_SQLITE_ROW === stmt.step() ? stmt.getValueString(0) : undefined;\n });\n });\n }\n\n public getBlobReader(rscName: WorkspaceResourceName): SQLiteDb.BlobIO {\n return this.sqliteDb.withSqliteStatement(\"SELECT rowid from blobs WHERE id=?\", (stmt) => {\n stmt.bindString(1, rscName);\n const blobReader = SQLiteDb.createBlobIO();\n blobReader.open(this.sqliteDb[_nativeDb], { tableName: \"blobs\", columnName: \"value\", row: stmt.getValueInteger(0) });\n return blobReader;\n });\n }\n\n public getBlob(rscName: WorkspaceResourceName): Uint8Array | undefined {\n return this.withOpenDb((db) => {\n return db.withSqliteStatement(\"SELECT value from blobs WHERE id=?\", (stmt) => {\n stmt.bindString(1, rscName);\n return DbResult.BE_SQLITE_ROW === stmt.step() ? stmt.getValueBlob(0) : undefined;\n });\n });\n }\n\n public getFile(rscName: WorkspaceResourceName, targetFileName?: LocalFileName): LocalFileName | undefined {\n return this.withOpenDb((db) => {\n const file = this.queryFileResource(rscName);\n if (!file)\n return undefined;\n\n const info = file.info;\n const localFileName = targetFileName ?? file.localFileName;\n\n // check whether the file is already up to date.\n const stat = fs.existsSync(localFileName) && fs.statSync(localFileName);\n if (stat && Math.round(stat.mtimeMs) === info.date && stat.size === info.size)\n return localFileName; // yes, we're done\n\n // extractEmbeddedFile fails if the file exists or if the directory does not exist\n if (stat)\n fs.removeSync(localFileName);\n else\n IModelJsFs.recursiveMkDirSync(dirname(localFileName));\n\n db[_nativeDb].extractEmbeddedFile({ name: rscName, localFileName });\n const date = new Date(info.date);\n fs.utimesSync(localFileName, date, date); // set the last-modified date of the file to match date in container\n fs.chmodSync(localFileName, \"0444\"); // set file readonly\n return localFileName;\n });\n }\n\n public prefetch(opts?: CloudSqlite.PrefetchProps): CloudSqlite.CloudPrefetch {\n const cloudContainer = this._container.cloudContainer;\n if (cloudContainer === undefined)\n throw new Error(\"no cloud container to prefetch\");\n return CloudSqlite.startCloudPrefetch(cloudContainer, this.dbFileName, opts);\n }\n\n public queryResources(args: WorkspaceDbQueryResourcesArgs): void {\n const table = \"blob\" !== args.type ? \"strings\" : \"blobs\";\n this.withOpenDb((db) => {\n const where = undefined !== args.namePattern ? ` WHERE id ${args.nameCompare ?? \"=\"} ?` : \"\";\n db.withSqliteStatement(`SELECT id from ${table}${where}`, (stmt) => {\n function* makeIterable() {\n while (DbResult.BE_SQLITE_ROW === stmt.step()) {\n yield stmt.getValueString(0);\n }\n }\n\n if (undefined !== args.namePattern) {\n stmt.bindString(1, args.namePattern);\n }\n\n args.callback(makeIterable());\n });\n });\n }\n}\n\n/** Implementation of Workspace */\nclass WorkspaceImpl implements Workspace {\n public readonly [_implementationProhibited] = undefined;\n private _containers = new Map<WorkspaceContainerId, WorkspaceContainerImpl>();\n public readonly containerDir: LocalDirName;\n public readonly settings: Settings;\n protected _cloudCache?: WorkspaceCloudCache;\n public getCloudCache(): WorkspaceCloudCache {\n return this._cloudCache ??= makeWorkspaceCloudCache({ cacheName: \"Workspace\", cacheSize: \"20G\" });\n }\n\n public constructor(settings: Settings, opts?: WorkspaceOpts) {\n this.settings = settings;\n this.containerDir = opts?.containerDir ?? join(IModelHost.cacheDir, \"Workspace\");\n let settingsFiles = opts?.settingsFiles;\n if (settingsFiles) {\n if (typeof settingsFiles === \"string\")\n settingsFiles = [settingsFiles];\n settingsFiles.forEach((file) => settings.addFile(file, SettingsPriority.application));\n }\n }\n\n public addContainer(toAdd: WorkspaceContainerImpl) {\n if (undefined !== this._containers.get(toAdd.id))\n throw new Error(\"container already exists in workspace\");\n this._containers.set(toAdd.id, toAdd);\n }\n\n public findContainer(containerId: WorkspaceContainerId) {\n return this._containers.get(containerId);\n }\n\n public getContainer(props: GetWorkspaceContainerArgs): WorkspaceContainer {\n return this.findContainer(props.containerId) ?? new WorkspaceContainerImpl(this, props);\n }\n\n public async getContainerAsync(props: WorkspaceContainerProps): Promise<WorkspaceContainer> {\n const accessToken = props.accessToken ?? ((props.baseUri === \"\") || props.isPublic) ? \"\" : await CloudSqlite.requestToken({ ...props, accessLevel: \"read\" });\n return this.getContainer({ ...props, accessToken });\n }\n\n public async getWorkspaceDb(props: WorkspaceDbCloudProps): Promise<WorkspaceDb> {\n let container: WorkspaceContainer | undefined = this.findContainer(props.containerId);\n if (undefined === container) {\n const accessToken = props.isPublic ? \"\" : await CloudSqlite.requestToken({ accessLevel: \"read\", ...props });\n container = new WorkspaceContainerImpl(this, { ...props, accessToken });\n }\n return container.getWorkspaceDb(props);\n }\n\n public async loadSettingsDictionary(props: WorkspaceDbSettingsProps | WorkspaceDbSettingsProps[], problems?: WorkspaceDbLoadError[]) {\n if (!Array.isArray(props))\n props = [props];\n\n for (const prop of props) {\n const db = await this.getWorkspaceDb(prop);\n db.open();\n try {\n const manifest = db.manifest;\n const dictProps: SettingsDictionaryProps = { name: prop.resourceName, workspaceDb: db, priority: prop.priority };\n // don't load if we already have this dictionary. Happens if the same WorkspaceDb is in more than one list\n if (undefined === this.settings.getDictionary(dictProps)) {\n const settingsJson = db.getString(prop.resourceName);\n if (undefined === settingsJson)\n throwWorkspaceDbLoadError(`could not load setting dictionary resource '${prop.resourceName}' from: '${manifest.workspaceName}'`, prop, db);\n\n db.close(); // don't leave this db open in case we're going to find another dictionary in it recursively.\n\n this.settings.addJson(dictProps, settingsJson);\n const dict = this.settings.getDictionary(dictProps);\n if (dict) {\n Workspace.onSettingsDictionaryLoadedFn({ dict, from: db });\n // if the dictionary we just loaded has a \"settingsWorkspaces\" entry, load them too, recursively\n const nested = dict.getSetting<WorkspaceDbSettingsProps[]>(WorkspaceSettingNames.settingsWorkspaces);\n if (nested !== undefined) {\n IModelHost.settingsSchemas.validateSetting<WorkspaceDbSettingsProps[]>(nested, WorkspaceSettingNames.settingsWorkspaces);\n await this.loadSettingsDictionary(nested, problems);\n }\n }\n }\n } catch (e) {\n db.close();\n problems?.push(e as WorkspaceDbLoadError);\n }\n }\n }\n\n public close() {\n this.settings.close();\n for (const [_id, container] of this._containers)\n container.close();\n this._containers.clear();\n }\n\n public resolveWorkspaceDbSetting(settingName: SettingName, filter?: Workspace.DbListFilter): WorkspaceDbCloudProps[] {\n const settingDef = IModelHost.settingsSchemas.settingDefs.get(settingName);\n const combine = settingDef?.combineArray === true;\n filter = filter ?? (() => true);\n const result: WorkspaceDbCloudProps[] = [];\n for (const entry of this.settings.getSettingEntries<WorkspaceDbCloudProps[]>(settingName)) {\n for (const dbProp of entry.value) {\n if (filter(dbProp, entry.dictionary)) {\n result.push(dbProp);\n }\n }\n\n if (!combine) {\n break;\n }\n }\n\n return result;\n }\n\n public async getWorkspaceDbs(args: Workspace.DbListOrSettingName & { filter?: Workspace.DbListFilter, problems?: WorkspaceDbLoadError[] }): Promise<WorkspaceDb[]> {\n const dbList = (args.settingName !== undefined) ? this.resolveWorkspaceDbSetting(args.settingName, args.filter) : args.dbs;\n const result: WorkspaceDb[] = [];\n const pushUnique = (wsDb: WorkspaceDb) => {\n for (const db of result) {\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\n // database from more than one Workspace (though then they must use a \"shared\" CloudContainer).\n if (db === wsDb || ((db.container.cloudContainer === wsDb.container.cloudContainer) && (db.dbFileName === wsDb.dbFileName)))\n return; // this db is redundant\n }\n result.push(wsDb);\n };\n\n for (const dbProps of dbList) {\n try {\n pushUnique(await this.getWorkspaceDb(dbProps));\n } catch (e) {\n const loadErr = e as WorkspaceDbLoadError;\n loadErr.wsDbProps = dbProps;\n args.problems?.push(loadErr);\n }\n }\n return result;\n }\n}\n\nconst workspaceEditorName = \"WorkspaceEditor\"; // name of the cache for the editor workspace\nclass EditorWorkspaceImpl extends WorkspaceImpl {\n public override getCloudCache(): WorkspaceCloudCache {\n return this._cloudCache ??= makeWorkspaceCloudCache({ cacheName: workspaceEditorName, cacheSize: \"20G\" });\n }\n}\n\nclass EditorImpl implements WorkspaceEditor {\n public readonly [_implementationProhibited] = undefined;\n public workspace = new EditorWorkspaceImpl(new SettingsImpl(), { containerDir: join(IModelHost.cacheDir, workspaceEditorName) });\n\n public async initializeContainer(args: CreateNewWorkspaceContainerArgs) {\n class CloudAccess extends CloudSqlite.DbAccess<WorkspaceSqliteDb> {\n protected static override _cacheName = workspaceEditorName;\n public static async initializeWorkspace(args: CreateNewWorkspaceContainerArgs) {\n const props = await this.createBlobContainer({ scope: args.scope, metadata: { ...args.metadata, containerType: \"workspace\" } });\n const dbFullName = makeWorkspaceDbFileName(workspaceDbNameWithDefault(args.dbName), \"0.0.0\");\n await super._initializeDb({ ...args, props, dbName: dbFullName, dbType: WorkspaceSqliteDb, blockSize: \"4M\" });\n return props;\n }\n }\n return CloudAccess.initializeWorkspace(args);\n }\n\n public async createNewCloudContainer(args: CreateNewWorkspaceContainerArgs): Promise<EditableWorkspaceContainer> {\n const cloudContainer = await this.initializeContainer(args);\n const userToken = await IModelHost.authorizationClient?.getAccessToken();\n const accessToken = await CloudSqlite.requestToken({ ...cloudContainer, accessLevel: \"write\", userToken });\n return this.getContainer({ accessToken, ...cloudContainer, writeable: true, description: args.metadata.description });\n }\n\n public getContainer(props: GetWorkspaceContainerArgs): EditableWorkspaceContainer {\n return this.workspace.findContainer(props.containerId) as EditableWorkspaceContainer | undefined ?? new EditorContainerImpl(this.workspace, props);\n }\n public async getContainerAsync(props: WorkspaceContainerProps): Promise<EditableWorkspaceContainer> {\n const accessToken = props.accessToken ?? (props.baseUri === \"\") ? \"\" : await CloudSqlite.requestToken({ ...props, accessLevel: \"write\" });\n return this.getContainer({ ...props, accessToken });\n }\n\n public close() {\n this.workspace.close();\n }\n}\n\ninterface EditCloudContainer extends WorkspaceCloudContainer {\n writeLockHeldBy?: string; // added by acquireWriteLock\n}\n\nclass EditorContainerImpl extends WorkspaceContainerImpl implements EditableWorkspaceContainer {\n public override get cloudContainer(): EditCloudContainer | undefined {\n return super.cloudContainer as EditCloudContainer | undefined;\n }\n\n public get cloudProps(): WorkspaceContainerProps | undefined {\n const cloudContainer = this.cloudContainer;\n if (undefined === cloudContainer)\n return undefined;\n return {\n baseUri: cloudContainer.baseUri,\n containerId: cloudContainer.containerId,\n storageType: cloudContainer.storageType as \"azure\" | \"google\",\n isPublic: cloudContainer.isPublic,\n };\n }\n\n public async createNewWorkspaceDbVersion(args: CreateNewWorkspaceDbVersionArgs): Promise<{ oldDb: WorkspaceDbNameAndVersion, newDb: WorkspaceDbNameAndVersion }> {\n const cloudContainer = this.cloudContainer;\n if (undefined === cloudContainer)\n throw new Error(\"versions require cloud containers\");\n\n const oldName = this.resolveDbFileName(args.fromProps ?? {});\n const oldDb = parseWorkspaceDbFileName(oldName);\n const newVersion = semver.inc(oldDb.version, args.versionType, args.identifier);\n if (!newVersion)\n throwWorkspaceDbLoadError(\"invalid version\", args.fromProps ?? {});\n\n const newName = makeWorkspaceDbFileName(oldDb.dbName, newVersion);\n await cloudContainer.copyDatabase(oldName, newName);\n // return the old and new db names and versions\n return { oldDb, newDb: { dbName: oldDb.dbName, version: newVersion } };\n }\n\n public override getWorkspaceDb(props: WorkspaceDbProps): EditableWorkspaceDb {\n return this.getEditableDb(props);\n }\n\n public getEditableDb(props: WorkspaceDbProps): EditableWorkspaceDb {\n const db = this._wsDbs.get(workspaceDbNameWithDefault(props.dbName)) as EditableDbImpl | undefined ?? new EditableDbImpl(props, this);\n const isPrerelease = semver.major(db.version) === 0 || semver.prerelease(db.version);\n\n if (!isPrerelease && this.cloudContainer && this.cloudContainer.queryDatabase(db.dbFileName)?.state !== \"copied\") {\n this._wsDbs.delete(workspaceDbNameWithDefault(props.dbName));\n throw new Error(`${db.dbFileName} has been published and is not editable. Make a new version first.`);\n }\n\n return db;\n }\n\n public acquireWriteLock(user: string): void {\n if (this.cloudContainer) {\n this.cloudContainer.acquireWriteLock(user);\n this.cloudContainer.writeLockHeldBy = user;\n }\n }\n public releaseWriteLock() {\n if (this.cloudContainer) {\n this.cloudContainer.releaseWriteLock();\n this.cloudContainer.writeLockHeldBy = undefined;\n }\n }\n\n public abandonChanges() {\n if (this.cloudContainer) {\n this.cloudContainer.abandonChanges();\n this.cloudContainer.writeLockHeldBy = undefined;\n }\n }\n\n public async createDb(args: { dbName?: string, manifest: WorkspaceDbManifest }): Promise<EditableWorkspaceDb> {\n if (!this.cloudContainer) {\n WorkspaceEditor.createEmptyDb({ localFileName: this.resolveDbFileName(args), manifest: args.manifest });\n } else {\n // currently the only way to create a workspaceDb in a cloud container is to create a temporary workspaceDb and upload it.\n const tempDbFile = join(KnownLocations.tmpdir, `empty.${workspaceDbFileExt}`);\n if (fs.existsSync(tempDbFile))\n IModelJsFs.removeSync(tempDbFile);\n\n WorkspaceEditor.createEmptyDb({ localFileName: tempDbFile, manifest: args.manifest });\n await CloudSqlite.uploadDb(this.cloudContainer, { localFileName: tempDbFile, dbName: makeWorkspaceDbFileName(workspaceDbNameWithDefault(args.dbName)) });\n IModelJsFs.removeSync(tempDbFile);\n }\n\n return this.getWorkspaceDb(args);\n }\n}\n\nclass EditableDbImpl extends WorkspaceDbImpl implements EditableWorkspaceDb {\n public override get container(): EditableWorkspaceContainer {\n assert(this._container instanceof EditorContainerImpl);\n return this._container;\n }\n\n private static validateResourceName(name: WorkspaceResourceName) {\n if (name.trim() !== name) {\n throw new Error(\"resource name may not have leading or trailing spaces\");\n }\n\n if (name.length > 1024) {\n throw new Error(\"resource name too long\");\n }\n }\n\n private validateResourceSize(val: Uint8Array | string) {\n const len = typeof val === \"string\" ? val.length : val.byteLength;\n if (len > (1024 * 1024 * 1024)) // one gigabyte\n throw new Error(\"value is too large\");\n }\n public get cloudProps(): WorkspaceDbCloudProps | undefined {\n const props = (this._container as EditorContainerImpl).cloudProps as Mutable<WorkspaceDbCloudProps>;\n if (props === undefined)\n return undefined;\n\n const parsed = parseWorkspaceDbFileName(this.dbFileName);\n return { ...props, dbName: parsed.dbName, version: parsed.version };\n }\n\n public override open() {\n this.sqliteDb.openDb(this.dbFileName, OpenMode.ReadWrite, this._container.cloudContainer);\n }\n\n public override close() {\n if (this.isOpen) {\n // whenever we close an EditableDb, update the name of the last editor in the manifest\n const lastEditedBy = (this._container.cloudContainer as any)?.writeLockHeldBy;\n if (lastEditedBy !== undefined)\n this.updateManifest({ ...this.manifest, lastEditedBy });\n\n // make sure all changes were saved before we close\n this.sqliteDb.saveChanges();\n }\n super.close();\n }\n\n private getFileModifiedTime(localFileName: LocalFileName): number {\n return Math.round(fs.statSync(localFileName).mtimeMs);\n }\n\n private performWriteSql(rscName: WorkspaceResourceName, sql: string, bind?: (stmt: SqliteStatement) => void) {\n this.sqliteDb.withSqliteStatement(sql, (stmt) => {\n stmt.bindString(1, rscName);\n bind?.(stmt);\n const rc = stmt.step();\n if (DbResult.BE_SQLITE_DONE !== rc) {\n if (DbResult.BE_SQLITE_CONSTRAINT_PRIMARYKEY === rc)\n throw new IModelError(rc, `resource \"${rscName}\" already exists`);\n\n throw new IModelError(rc, `workspace [${sql}]`);\n }\n });\n this.sqliteDb.saveChanges();\n }\n\n public updateManifest(manifest: WorkspaceDbManifest) {\n this.sqliteDb[_nativeDb].saveFileProperty(workspaceManifestProperty, JSON.stringify(manifest));\n this._manifest = undefined;\n }\n public updateSettingsResource(settings: SettingsContainer, rscName?: string) {\n this.updateString(rscName ?? \"settingsDictionary\", JSON.stringify(settings));\n }\n public addString(rscName: WorkspaceResourceName, val: string): void {\n EditableDbImpl.validateResourceName(rscName);\n this.validateResourceSize(val);\n this.performWriteSql(rscName, \"INSERT INTO strings(id,value) VALUES(?,?)\", (stmt) => stmt.bindString(2, val));\n }\n public updateString(rscName: WorkspaceResourceName, val: string): void {\n this.validateResourceSize(val);\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));\n }\n public removeString(rscName: WorkspaceResourceName): void {\n this.performWriteSql(rscName, \"DELETE FROM strings WHERE id=?\");\n }\n public addBlob(rscName: WorkspaceResourceName, val: Uint8Array): void {\n EditableDbImpl.validateResourceName(rscName);\n this.validateResourceSize(val);\n this.performWriteSql(rscName, \"INSERT INTO blobs(id,value) VALUES(?,?)\", (stmt) => stmt.bindBlob(2, val));\n }\n public updateBlob(rscName: WorkspaceResourceName, val: Uint8Array): void {\n this.validateResourceSize(val);\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));\n }\n public getBlobWriter(rscName: WorkspaceResourceName): SQLiteDb.BlobIO {\n return this.sqliteDb.withSqliteStatement(\"SELECT rowid from blobs WHERE id=?\", (stmt) => {\n stmt.bindString(1, rscName);\n const blobWriter = SQLiteDb.createBlobIO();\n blobWriter.open(this.sqliteDb[_nativeDb], { tableName: \"blobs\", columnName: \"value\", row: stmt.getValueInteger(0), writeable: true });\n return blobWriter;\n });\n }\n public removeBlob(rscName: WorkspaceResourceName): void {\n this.performWriteSql(rscName, \"DELETE FROM blobs WHERE id=?\");\n }\n public addFile(rscName: WorkspaceResourceName, localFileName: LocalFileName, fileExt?: string): void {\n EditableDbImpl.validateResourceName(rscName);\n fileExt = fileExt ?? extname(localFileName);\n if (fileExt?.[0] === \".\")\n fileExt = fileExt.slice(1);\n this.sqliteDb[_nativeDb].embedFile({ name: rscName, localFileName, date: this.getFileModifiedTime(localFileName), fileExt });\n }\n public updateFile(rscName: WorkspaceResourceName, localFileName: LocalFileName): void {\n this.queryFileResource(rscName); // throws if not present\n this.sqliteDb[_nativeDb].replaceEmbeddedFile({ name: rscName, localFileName, date: this.getFileModifiedTime(localFileName) });\n }\n public removeFile(rscName: WorkspaceResourceName): void {\n const file = this.queryFileResource(rscName);\n if (undefined === file)\n throw new Error(`file resource \"${rscName}\" does not exist`);\n if (file && fs.existsSync(file.localFileName))\n fs.unlinkSync(file.localFileName);\n this.sqliteDb[_nativeDb].removeEmbeddedFile(rscName);\n }\n}\n\nexport function constructWorkspaceDb(props: WorkspaceDbProps, container: WorkspaceContainer): WorkspaceDb {\n return new WorkspaceDbImpl(props, container);\n}\n\nexport function constructWorkspace(settings: Settings, opts?: WorkspaceOpts): OwnedWorkspace {\n return new WorkspaceImpl(settings, opts);\n}\n\nexport function constructWorkspaceEditor(): WorkspaceEditor {\n return new EditorImpl();\n}\n\nexport function noLeadingOrTrailingSpaces(name: string, msg: string) {\n if (name.trim() !== name)\n throw new Error(`${msg} [${name}] may not have leading or trailing spaces`);\n}\n\nexport function validateWorkspaceDbName(dbName: WorkspaceDbName) {\n if (dbName === \"\" || dbName.length > 255 || /[#\\.<>:\"/\\\\\"`'|?*\\u0000-\\u001F]/g.test(dbName) || /^(con|prn|aux|nul|com\\d|lpt\\d)$/i.test(dbName))\n throw new Error(`invalid dbName: [${dbName}]`);\n\n noLeadingOrTrailingSpaces(dbName, \"dbName\");\n}\n\n/**\n * Validate that a WorkspaceContainer.Id is valid.\n * The rules for ContainerIds (from Azure, see https://docs.microsoft.com/en-us/rest/api/storageservices/naming-and-referencing-containers--blobs--and-metadata):\n * - may only contain lower case letters, numbers or dashes\n * - may not start or end with with a dash nor have more than one dash in a row\n * - may not be shorter than 3 or longer than 63 characters\n */\nexport function validateWorkspaceContainerId(id: WorkspaceContainerId) {\n if (!/^(?=.{3,63}$)[a-z0-9]+(-[a-z0-9]+)*$/g.test(id))\n throw new Error(`invalid containerId: [${id}]`);\n}\n\nexport function validateWorkspaceDbVersion(version?: WorkspaceDbVersion) {\n version = version ?? \"0.0.0\";\n const opts = { loose: true, includePrerelease: true };\n // clean allows prerelease, so try it first. If that fails attempt to coerce it (coerce strips prerelease even if you say not to.)\n const semVersion = semver.clean(version, opts) ?? semver.coerce(version, opts)?.version;\n if (!semVersion)\n throw new Error(\"invalid version specification\");\n version = semVersion;\n return version;\n}\n\n/**\n * Parse the name stored in a WorkspaceContainer into the dbName and version number. A single WorkspaceContainer may hold\n * many versions of the same WorkspaceDb. The name of the Db in the WorkspaceContainer is in the format \"name:version\". This\n * function splits them into separate strings.\n */\nexport function parseWorkspaceDbFileName(dbFileName: WorkspaceDbFullName): { dbName: WorkspaceDbName, version: WorkspaceDbVersion } {\n const parts = dbFileName.split(\":\");\n return { dbName: parts[0], version: parts[1] };\n}\n\n/** Create a dbName for a WorkspaceDb from its base name and version. This will be in the format \"name:version\" */\nexport function makeWorkspaceDbFileName(dbName: WorkspaceDbName, version?: WorkspaceDbVersion): WorkspaceDbName {\n return `${dbName}:${validateWorkspaceDbVersion(version)}`;\n}\n\nexport const workspaceManifestProperty: FilePropertyProps = { namespace: \"workspace\", name: \"manifest\" };\n\nfunction throwWorkspaceDbLoadError(msg: string, wsDbProps: WorkspaceDbProps | WorkspaceDbCloudProps, db?: WorkspaceDb): never {\n const error = new Error(msg) as WorkspaceDbLoadError;\n error.wsDbProps = wsDbProps;\n error.wsDb = db;\n throw error;\n}\n\nexport function throwWorkspaceDbLoadErrors(msg: string, errors: WorkspaceDbLoadError[]): never {\n const error = new Error(msg) as WorkspaceDbLoadErrors;\n error.wsLoadErrors = errors;\n throw error;\n}\n\nexport interface OwnedWorkspace extends Workspace {\n /** Only the owner of a Workspace may close it. */\n close(): void;\n}\n"]}
|
package/lib/cjs/rpc/tracing.js
CHANGED
|
@@ -24,6 +24,7 @@ const IModelHost_1 = require("../IModelHost");
|
|
|
24
24
|
* @public
|
|
25
25
|
*/
|
|
26
26
|
class RpcTrace {
|
|
27
|
+
static { this._storage = new async_hooks_1.AsyncLocalStorage(); }
|
|
27
28
|
/** Get the [RpcActivity]($common) for the currently executing async, or `undefined` if there is no
|
|
28
29
|
* RpcActivity in the current call stack.
|
|
29
30
|
* */
|
|
@@ -53,7 +54,6 @@ class RpcTrace {
|
|
|
53
54
|
}
|
|
54
55
|
}
|
|
55
56
|
exports.RpcTrace = RpcTrace;
|
|
56
|
-
RpcTrace._storage = new async_hooks_1.AsyncLocalStorage();
|
|
57
57
|
/** @internal */
|
|
58
58
|
function initializeTracing(enableOpenTelemetry = false) {
|
|
59
59
|
core_common_1.RpcInvocation.runActivity = async (activity, fn) => RpcTrace.run(activity, fn); // redirect the invocation processing to the tracer
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"tracing.js","sourceRoot":"","sources":["../../../src/rpc/tracing.ts"],"names":[],"mappings":";AAAA;;;+FAG+F;AAC/F;;GAEG;;;AAuDH,8CAkBC;AAvED,0BAA0B;AAE1B,sDAAwE;AACxE,oDAAgE;AAChE,6CAAgD;AAChD,oEAAiE;AACjE,8CAA2C;AAE3C,qDAAqD;AAErD;;;;;;GAMG;AACH,MAAa,QAAQ;
|
|
1
|
+
{"version":3,"file":"tracing.js","sourceRoot":"","sources":["../../../src/rpc/tracing.ts"],"names":[],"mappings":";AAAA;;;+FAG+F;AAC/F;;GAEG;;;AAuDH,8CAkBC;AAvED,0BAA0B;AAE1B,sDAAwE;AACxE,oDAAgE;AAChE,6CAAgD;AAChD,oEAAiE;AACjE,8CAA2C;AAE3C,qDAAqD;AAErD;;;;;;GAMG;AACH,MAAa,QAAQ;aACJ,aAAQ,GAAG,IAAI,+BAAiB,EAAE,CAAC;IAElD;;SAEK;IACE,MAAM,KAAK,eAAe;QAC/B,OAAO,QAAQ,CAAC,QAAQ,CAAC,QAAQ,EAA6B,CAAC;IACjE,CAAC;IAED;;SAEK;IACE,MAAM,KAAK,qBAAqB;QACrC,IAAA,qBAAM,EAAC,SAAS,KAAK,QAAQ,CAAC,eAAe,CAAC,CAAC;QAC/C,OAAO,QAAQ,CAAC,eAAe,CAAC;IAClC,CAAC;IAED,8CAA8C;IACvC,MAAM,CAAC,KAAK,CAAC,GAAG,CAAI,QAAqB,EAAE,EAAoB;QACpE,OAAO,QAAQ,CAAC,QAAQ,CAAC,GAAG,CAAC,QAAQ,EAAE,EAAE,CAAC,CAAC;IAC7C,CAAC;IAED,0EAA0E;IACnE,MAAM,CAAC,KAAK,CAAC,WAAW,CAAI,QAAqB,EAAE,EAAoB;QAC5E,OAAO,sBAAO,CAAC,QAAQ,CAAC,QAAQ,CAAC,SAAS,IAAI,oBAAoB,EAAE,KAAK,IAAI,EAAE,CAAC,QAAQ,CAAC,GAAG,CAAC,QAAQ,EAAE,EAAE,CAAC,EAAE;YAC1G,UAAU,EAAE;gBACV,GAAG,qBAAM,CAAC,WAAW,EAAE,EAAE,uBAAuB;gBAChD,GAAG,2BAAa,CAAC,cAAc,CAAC,QAAQ,CAAC,EAAE,wCAAwC;aACpF;YACD,IAAI,EAAE,uBAAQ,CAAC,QAAQ;SACxB,CAAC,CAAC;IACL,CAAC;;AAhCH,4BAiCC;AAED,gBAAgB;AAChB,SAAgB,iBAAiB,CAAC,sBAA+B,KAAK;IACpE,2BAAa,CAAC,WAAW,GAAG,KAAK,EAAE,QAAQ,EAAE,EAAE,EAAE,EAAE,CAAC,QAAQ,CAAC,GAAG,CAAC,QAAQ,EAAE,EAAE,CAAC,CAAC,CAAC,mDAAmD;IAEnI,IAAI,mBAAmB,EAAE,CAAC;QACxB,IAAI,CAAC;YACH,iEAAiE;YACjE,MAAM,GAAG,GAAG,OAAO,CAAC,oBAAoB,CAAC,CAAC;YAC1C,MAAM,MAAM,GAAG,GAAG,CAAC,KAAK,CAAC,SAAS,CAAC,qBAAqB,EAAE,uBAAU,CAAC,cAAc,CAAC,CAAC;YACrF,sBAAO,CAAC,mBAAmB,CAAC,MAAM,EAAE,GAAG,CAAC,CAAC;YACzC,2BAAa,CAAC,WAAW,GAAG,KAAK,EAAE,QAAQ,EAAE,EAAE,EAAE,EAAE,CAAC,QAAQ,CAAC,WAAW,CAAC,QAAQ,EAAE,EAAE,CAAC,CAAC,CAAC,mEAAmE;QAC7J,CAAC;QAAC,OAAO,CAAC,EAAE,CAAC;YACX,qBAAM,CAAC,QAAQ,CAAC,6CAAqB,CAAC,UAAU,EAAE,oCAAoC,CAAC,CAAC;YACxF,qBAAM,CAAC,YAAY,CAAC,6CAAqB,CAAC,UAAU,EAAE,CAAC,CAAC,CAAC;QAC3D,CAAC;IACH,CAAC;IAED,0GAA0G;IAC1G,qBAAM,CAAC,cAAc,CAAC,GAAG,CAAC,KAAK,EAAE,GAAG,EAAE,CAAC,2BAAa,CAAC,cAAc,CAAC,QAAQ,CAAC,eAAe,CAAC,CAAC,CAAC;AACjG,CAAC","sourcesContent":["/*---------------------------------------------------------------------------------------------\n* Copyright (c) Bentley Systems, Incorporated. All rights reserved.\n* See LICENSE.md in the project root for license terms and full copyright notice.\n*--------------------------------------------------------------------------------------------*/\n/** @packageDocumentation\n * @module RpcInterface\n */\n\n// cspell:ignore calltrace\n\nimport { assert, Logger, SpanKind, Tracing } from \"@itwin/core-bentley\";\nimport { RpcActivity, RpcInvocation } from \"@itwin/core-common\";\nimport { AsyncLocalStorage } from \"async_hooks\";\nimport { BackendLoggerCategory } from \"../BackendLoggerCategory\";\nimport { IModelHost } from \"../IModelHost\";\n\n/* eslint-disable @typescript-eslint/no-deprecated */\n\n/**\n * Utility for tracing Rpc activity processing. When multiple Rpc requests are being processed asynchronously, this\n * class can be used to correlate the current calltrace with the originating RpcActivity. This is used for automatic appending\n * of RpcActivity to log messages emitted during Rpc processing. It may also be used to retrieve the user accessToken\n * from the RpcActivity.\n * @public\n */\nexport class RpcTrace {\n private static _storage = new AsyncLocalStorage();\n\n /** Get the [RpcActivity]($common) for the currently executing async, or `undefined` if there is no\n * RpcActivity in the current call stack.\n * */\n public static get currentActivity(): RpcActivity | undefined {\n return RpcTrace._storage.getStore() as RpcActivity | undefined;\n }\n\n /** Get the [RpcActivity]($common) for the currently executing async. Asserts that the RpcActivity\n * exists in the current call stack.\n * */\n public static get expectCurrentActivity(): RpcActivity {\n assert(undefined !== RpcTrace.currentActivity);\n return RpcTrace.currentActivity;\n }\n\n /** Start the processing of an RpcActivity. */\n public static async run<T>(activity: RpcActivity, fn: () => Promise<T>): Promise<T> {\n return RpcTrace._storage.run(activity, fn);\n }\n\n /** Start the processing of an RpcActivity inside an OpenTelemetry span */\n public static async runWithSpan<T>(activity: RpcActivity, fn: () => Promise<T>): Promise<T> {\n return Tracing.withSpan(activity.rpcMethod ?? \"unknown RPC method\", async () => RpcTrace.run(activity, fn), {\n attributes: {\n ...Logger.getMetaData(), // add default metadata\n ...RpcInvocation.sanitizeForLog(activity), // override with the correct RpcActivity\n },\n kind: SpanKind.INTERNAL,\n });\n }\n}\n\n/** @internal */\nexport function initializeTracing(enableOpenTelemetry: boolean = false) {\n RpcInvocation.runActivity = async (activity, fn) => RpcTrace.run(activity, fn); // redirect the invocation processing to the tracer\n\n if (enableOpenTelemetry) {\n try {\n // eslint-disable-next-line @typescript-eslint/no-require-imports\n const api = require(\"@opentelemetry/api\");\n const tracer = api.trace.getTracer(\"@itwin/core-backend\", IModelHost.backendVersion);\n Tracing.enableOpenTelemetry(tracer, api);\n RpcInvocation.runActivity = async (activity, fn) => RpcTrace.runWithSpan(activity, fn); // wrap invocation in an OpenTelemetry span in addition to RpcTrace\n } catch (e) {\n Logger.logError(BackendLoggerCategory.IModelHost, \"Failed to initialize OpenTelemetry\");\n Logger.logException(BackendLoggerCategory.IModelHost, e);\n }\n }\n\n // set up static logger metadata to include current RpcActivity information for logs during rpc processing\n Logger.staticMetaData.set(\"rpc\", () => RpcInvocation.sanitizeForLog(RpcTrace.currentActivity));\n}\n"]}
|
|
@@ -77,6 +77,7 @@ class RpcBriefcaseUtility {
|
|
|
77
77
|
const props = await BriefcaseManager_1.BriefcaseManager.downloadBriefcase(request);
|
|
78
78
|
return IModelDb_1.BriefcaseDb.open(props);
|
|
79
79
|
}
|
|
80
|
+
static { this._briefcasePromises = new Map(); }
|
|
80
81
|
static async openBriefcase(args) {
|
|
81
82
|
const key = `${args.tokenProps.iModelId}:${args.tokenProps.changeset?.id}:${args.tokenProps.changeset?.index}:${args.syncMode}`;
|
|
82
83
|
const cachedPromise = this._briefcasePromises.get(key);
|
|
@@ -165,5 +166,4 @@ class RpcBriefcaseUtility {
|
|
|
165
166
|
}
|
|
166
167
|
}
|
|
167
168
|
exports.RpcBriefcaseUtility = RpcBriefcaseUtility;
|
|
168
|
-
RpcBriefcaseUtility._briefcasePromises = new Map();
|
|
169
169
|
//# sourceMappingURL=RpcBriefcaseUtility.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"RpcBriefcaseUtility.js","sourceRoot":"","sources":["../../../src/rpc-impl/RpcBriefcaseUtility.ts"],"names":[],"mappings":"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","sourcesContent":["/*---------------------------------------------------------------------------------------------\n* Copyright (c) Bentley Systems, Incorporated. All rights reserved.\n* See LICENSE.md in the project root for license terms and full copyright notice.\n*--------------------------------------------------------------------------------------------*/\n/** @packageDocumentation\n * @module RpcInterface\n */\n\nimport { AccessToken, assert, BeDuration, BentleyError, IModelStatus, Logger } from \"@itwin/core-bentley\";\nimport {\n BriefcaseProps, IModelConnectionProps, IModelError, IModelRpcOpenProps, IModelRpcProps, IModelVersion, RpcActivity, RpcPendingResponse, SyncMode,\n} from \"@itwin/core-common\";\nimport { BackendLoggerCategory } from \"../BackendLoggerCategory\";\nimport { BriefcaseManager, RequestNewBriefcaseArg } from \"../BriefcaseManager\";\nimport { CheckpointManager, V1CheckpointManager } from \"../CheckpointManager\";\nimport { BriefcaseDb, IModelDb, SnapshotDb } from \"../IModelDb\";\nimport { IModelHost } from \"../IModelHost\";\nimport { IModelJsFs } from \"../IModelJsFs\";\n\nconst loggerCategory: string = BackendLoggerCategory.IModelDb;\n\n/** @internal */\nexport interface DownloadAndOpenArgs {\n activity: RpcActivity;\n tokenProps: IModelRpcOpenProps;\n syncMode: SyncMode;\n fileNameResolvers?: ((arg: BriefcaseProps) => string)[];\n timeout?: number;\n forceDownload?: boolean;\n}\n/**\n * Utility to open the iModel for RPC interfaces\n * @internal\n */\nexport class RpcBriefcaseUtility {\n\n private static async downloadAndOpen(args: DownloadAndOpenArgs): Promise<BriefcaseDb> {\n const { activity, tokenProps } = args;\n const accessToken = activity.accessToken;\n assert(undefined !== tokenProps.iModelId);\n\n const iModelId = tokenProps.iModelId;\n let myBriefcaseIds: number[];\n if (args.syncMode === SyncMode.PullOnly) {\n myBriefcaseIds = [0]; // PullOnly means briefcaseId 0\n } else {\n // check with iModelHub and see if we already have acquired any briefcaseIds\n myBriefcaseIds = await IModelHost.hubAccess.getMyBriefcaseIds({ accessToken, iModelId });\n }\n\n const resolvers = args.fileNameResolvers ?? [(arg) => BriefcaseManager.getFileName(arg)];\n\n // see if we can open any of the briefcaseIds we already acquired from iModelHub\n if (resolvers) {\n for (const resolver of resolvers) {\n for (const briefcaseId of myBriefcaseIds) {\n const fileName = resolver({ briefcaseId, iModelId });\n if (IModelJsFs.existsSync(fileName)) {\n const briefcaseDb = BriefcaseDb.findByFilename(fileName);\n if (briefcaseDb !== undefined)\n return briefcaseDb as BriefcaseDb;\n try {\n if (args.forceDownload)\n throw new Error(); // causes delete below\n const db = await BriefcaseDb.open({ fileName });\n if (db.changeset.id !== tokenProps.changeset?.id) {\n assert(undefined !== tokenProps.changeset);\n const toIndex = tokenProps.changeset?.index ??\n (await IModelHost.hubAccess.getChangesetFromVersion({ accessToken, iModelId, version: IModelVersion.asOfChangeSet(tokenProps.changeset.id) })).index;\n await BriefcaseManager.pullAndApplyChangesets(db, { accessToken, toIndex });\n }\n return db;\n } catch (error: any) {\n if (!(error.errorNumber === IModelStatus.AlreadyOpen))\n // somehow we have this briefcaseId and the file exists, but we can't open it. Delete it.\n await BriefcaseManager.deleteBriefcaseFiles(fileName, accessToken);\n }\n }\n }\n }\n }\n\n // no local briefcase available. Download one and open it.\n assert(undefined !== tokenProps.iTwinId);\n const request: RequestNewBriefcaseArg = {\n accessToken,\n iTwinId: tokenProps.iTwinId,\n iModelId,\n briefcaseId: args.syncMode === SyncMode.PullOnly ? 0 : undefined, // if briefcaseId is undefined, we'll acquire a new one.\n };\n\n const props = await BriefcaseManager.downloadBriefcase(request);\n return BriefcaseDb.open(props);\n }\n\n private static _briefcasePromises: Map<string, Promise<BriefcaseDb>> = new Map();\n private static async openBriefcase(args: DownloadAndOpenArgs): Promise<BriefcaseDb> {\n const key = `${args.tokenProps.iModelId}:${args.tokenProps.changeset?.id}:${args.tokenProps.changeset?.index}:${args.syncMode}`;\n const cachedPromise = this._briefcasePromises.get(key);\n if (cachedPromise)\n return cachedPromise;\n\n try {\n const briefcasePromise = this.downloadAndOpen(args); // save the fact that we're working on downloading so if we timeout, we'll reuse this request.\n this._briefcasePromises.set(key, briefcasePromise);\n return await briefcasePromise;\n } finally {\n this._briefcasePromises.delete(key); // the download and open is now done\n }\n }\n\n /** find a previously opened iModel for RPC.\n * @param accessToken necessary (only) for V2 checkpoints to refresh access token in daemon if it has expired. We use the accessToken of the current RPC request\n * to refresh the daemon, even though it will be used for all authorized users.\n * @param the IModelRpcProps to locate the opened iModel.\n */\n public static async findOpenIModel(accessToken: AccessToken, iModel: IModelRpcProps) {\n const iModelDb = IModelDb.findByKey(iModel.key);\n\n // call refreshContainer, just in case this is a V2 checkpoint whose sasToken is about to expire, or its default transaction is about to be restarted.\n await iModelDb.refreshContainerForRpc(accessToken);\n return iModelDb;\n }\n\n public static async open(args: DownloadAndOpenArgs & { syncMode: SyncMode.FixedVersion }): Promise<IModelDb>;\n /**\n * @deprecated in 4.4.0 - only `SyncMode.FixedVersion` should be used in RPC backends\n */\n // eslint-disable-next-line @typescript-eslint/unified-signatures -- these are separate to explicitly deprecate some SyncMode members.\n public static async open(args: DownloadAndOpenArgs & { syncMode: Exclude<SyncMode, \"FixedVersion\"> }): Promise<IModelDb>;\n /**\n * Download and open a checkpoint or briefcase, ensuring the operation completes within a default timeout. If the time to open exceeds the timeout period,\n * a RpcPendingResponse exception is thrown\n */\n public static async open(args: DownloadAndOpenArgs): Promise<IModelDb> {\n const { activity, tokenProps, syncMode } = args;\n Logger.logTrace(loggerCategory, \"RpcBriefcaseUtility.open\", tokenProps);\n\n const timeout = args.timeout ?? 1000;\n if (syncMode === SyncMode.PullOnly || syncMode === SyncMode.PullAndPush) {\n const briefcaseDb = await BeDuration.race(timeout, this.openBriefcase(args));\n\n if (briefcaseDb === undefined) {\n Logger.logTrace(loggerCategory, \"Open briefcase - pending\", tokenProps);\n throw new RpcPendingResponse(); // eslint-disable-line @typescript-eslint/only-throw-error\n }\n // note: usage is logged in the function BriefcaseManager.downloadNewBriefcaseAndOpen\n return briefcaseDb;\n }\n if (!tokenProps.iModelId || !tokenProps.iTwinId || !tokenProps.changeset)\n throw new IModelError(IModelStatus.BadArg, \"invalid arguments\");\n\n const checkpoint = {\n iModelId: tokenProps.iModelId,\n iTwinId: tokenProps.iTwinId,\n changeset: tokenProps.changeset,\n accessToken: activity.accessToken,\n };\n\n // opening a checkpoint.\n let db: SnapshotDb | void;\n // first check if it's already open\n db = SnapshotDb.tryFindByKey(CheckpointManager.getKey(checkpoint));\n if (db) {\n Logger.logTrace(loggerCategory, \"Checkpoint was already open\", tokenProps);\n return db;\n }\n\n try {\n // now try V2 checkpoint\n db = await SnapshotDb.openCheckpointFromRpc(checkpoint);\n Logger.logTrace(loggerCategory, \"using V2 checkpoint\", tokenProps);\n } catch (e) {\n Logger.logTrace(loggerCategory, \"unable to open V2 checkpoint - falling back to V1 checkpoint\", { error: BentleyError.getErrorProps(e), ...tokenProps });\n\n // this isn't a v2 checkpoint. Set up a race between the specified timeout period and the open. Throw an RpcPendingResponse exception if the timeout happens first.\n const request = {\n checkpoint,\n localFile: V1CheckpointManager.getFileName(checkpoint),\n aliasFiles: [],\n };\n db = await BeDuration.race(timeout, V1CheckpointManager.getCheckpointDb(request));\n\n if (db === undefined) {\n Logger.logTrace(loggerCategory, \"Open V1 checkpoint - pending\", tokenProps);\n throw new RpcPendingResponse(); // eslint-disable-line @typescript-eslint/only-throw-error\n }\n Logger.logTrace(loggerCategory, \"Opened V1 checkpoint\", tokenProps);\n }\n\n return db;\n }\n\n public static async openWithTimeout(activity: RpcActivity, tokenProps: IModelRpcOpenProps, syncMode: SyncMode.FixedVersion, timeout?: number): Promise<IModelConnectionProps>;\n /**\n * @deprecated in 4.4.0 - only `SyncMode.FixedVersion` should be used in RPC backends\n */\n // eslint-disable-next-line @typescript-eslint/unified-signatures -- these are separate to explicitly deprecate some SyncMode members.\n public static async openWithTimeout(activity: RpcActivity, tokenProps: IModelRpcOpenProps, syncMode: Exclude<SyncMode, \"FixedVersion\">, timeout?: number): Promise<IModelConnectionProps>;\n public static async openWithTimeout(activity: RpcActivity, tokenProps: IModelRpcOpenProps, syncMode: SyncMode, timeout: number = 1000): Promise<IModelConnectionProps> {\n if (tokenProps.iModelId)\n await IModelHost.tileStorage?.initialize(tokenProps.iModelId);\n // eslint-disable-next-line @typescript-eslint/no-deprecated\n return (await this.open({ activity, tokenProps, syncMode, timeout })).toJSON();\n }\n\n}\n"]}
|
|
1
|
+
{"version":3,"file":"RpcBriefcaseUtility.js","sourceRoot":"","sources":["../../../src/rpc-impl/RpcBriefcaseUtility.ts"],"names":[],"mappings":"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","sourcesContent":["/*---------------------------------------------------------------------------------------------\n* Copyright (c) Bentley Systems, Incorporated. All rights reserved.\n* See LICENSE.md in the project root for license terms and full copyright notice.\n*--------------------------------------------------------------------------------------------*/\n/** @packageDocumentation\n * @module RpcInterface\n */\n\nimport { AccessToken, assert, BeDuration, BentleyError, IModelStatus, Logger } from \"@itwin/core-bentley\";\nimport {\n BriefcaseProps, IModelConnectionProps, IModelError, IModelRpcOpenProps, IModelRpcProps, IModelVersion, RpcActivity, RpcPendingResponse, SyncMode,\n} from \"@itwin/core-common\";\nimport { BackendLoggerCategory } from \"../BackendLoggerCategory\";\nimport { BriefcaseManager, RequestNewBriefcaseArg } from \"../BriefcaseManager\";\nimport { CheckpointManager, V1CheckpointManager } from \"../CheckpointManager\";\nimport { BriefcaseDb, IModelDb, SnapshotDb } from \"../IModelDb\";\nimport { IModelHost } from \"../IModelHost\";\nimport { IModelJsFs } from \"../IModelJsFs\";\n\nconst loggerCategory: string = BackendLoggerCategory.IModelDb;\n\n/** @internal */\nexport interface DownloadAndOpenArgs {\n activity: RpcActivity;\n tokenProps: IModelRpcOpenProps;\n syncMode: SyncMode;\n fileNameResolvers?: ((arg: BriefcaseProps) => string)[];\n timeout?: number;\n forceDownload?: boolean;\n}\n/**\n * Utility to open the iModel for RPC interfaces\n * @internal\n */\nexport class RpcBriefcaseUtility {\n\n private static async downloadAndOpen(args: DownloadAndOpenArgs): Promise<BriefcaseDb> {\n const { activity, tokenProps } = args;\n const accessToken = activity.accessToken;\n assert(undefined !== tokenProps.iModelId);\n\n const iModelId = tokenProps.iModelId;\n let myBriefcaseIds: number[];\n if (args.syncMode === SyncMode.PullOnly) {\n myBriefcaseIds = [0]; // PullOnly means briefcaseId 0\n } else {\n // check with iModelHub and see if we already have acquired any briefcaseIds\n myBriefcaseIds = await IModelHost.hubAccess.getMyBriefcaseIds({ accessToken, iModelId });\n }\n\n const resolvers = args.fileNameResolvers ?? [(arg) => BriefcaseManager.getFileName(arg)];\n\n // see if we can open any of the briefcaseIds we already acquired from iModelHub\n if (resolvers) {\n for (const resolver of resolvers) {\n for (const briefcaseId of myBriefcaseIds) {\n const fileName = resolver({ briefcaseId, iModelId });\n if (IModelJsFs.existsSync(fileName)) {\n const briefcaseDb = BriefcaseDb.findByFilename(fileName);\n if (briefcaseDb !== undefined)\n return briefcaseDb as BriefcaseDb;\n try {\n if (args.forceDownload)\n throw new Error(); // causes delete below\n const db = await BriefcaseDb.open({ fileName });\n if (db.changeset.id !== tokenProps.changeset?.id) {\n assert(undefined !== tokenProps.changeset);\n const toIndex = tokenProps.changeset?.index ??\n (await IModelHost.hubAccess.getChangesetFromVersion({ accessToken, iModelId, version: IModelVersion.asOfChangeSet(tokenProps.changeset.id) })).index;\n await BriefcaseManager.pullAndApplyChangesets(db, { accessToken, toIndex });\n }\n return db;\n } catch (error: any) {\n if (!(error.errorNumber === IModelStatus.AlreadyOpen))\n // somehow we have this briefcaseId and the file exists, but we can't open it. Delete it.\n await BriefcaseManager.deleteBriefcaseFiles(fileName, accessToken);\n }\n }\n }\n }\n }\n\n // no local briefcase available. Download one and open it.\n assert(undefined !== tokenProps.iTwinId);\n const request: RequestNewBriefcaseArg = {\n accessToken,\n iTwinId: tokenProps.iTwinId,\n iModelId,\n briefcaseId: args.syncMode === SyncMode.PullOnly ? 0 : undefined, // if briefcaseId is undefined, we'll acquire a new one.\n };\n\n const props = await BriefcaseManager.downloadBriefcase(request);\n return BriefcaseDb.open(props);\n }\n\n private static _briefcasePromises: Map<string, Promise<BriefcaseDb>> = new Map();\n private static async openBriefcase(args: DownloadAndOpenArgs): Promise<BriefcaseDb> {\n const key = `${args.tokenProps.iModelId}:${args.tokenProps.changeset?.id}:${args.tokenProps.changeset?.index}:${args.syncMode}`;\n const cachedPromise = this._briefcasePromises.get(key);\n if (cachedPromise)\n return cachedPromise;\n\n try {\n const briefcasePromise = this.downloadAndOpen(args); // save the fact that we're working on downloading so if we timeout, we'll reuse this request.\n this._briefcasePromises.set(key, briefcasePromise);\n return await briefcasePromise;\n } finally {\n this._briefcasePromises.delete(key); // the download and open is now done\n }\n }\n\n /** find a previously opened iModel for RPC.\n * @param accessToken necessary (only) for V2 checkpoints to refresh access token in daemon if it has expired. We use the accessToken of the current RPC request\n * to refresh the daemon, even though it will be used for all authorized users.\n * @param the IModelRpcProps to locate the opened iModel.\n */\n public static async findOpenIModel(accessToken: AccessToken, iModel: IModelRpcProps) {\n const iModelDb = IModelDb.findByKey(iModel.key);\n\n // call refreshContainer, just in case this is a V2 checkpoint whose sasToken is about to expire, or its default transaction is about to be restarted.\n await iModelDb.refreshContainerForRpc(accessToken);\n return iModelDb;\n }\n\n public static async open(args: DownloadAndOpenArgs & { syncMode: SyncMode.FixedVersion }): Promise<IModelDb>;\n /**\n * @deprecated in 4.4.0 - only `SyncMode.FixedVersion` should be used in RPC backends\n */\n // eslint-disable-next-line @typescript-eslint/unified-signatures -- these are separate to explicitly deprecate some SyncMode members.\n public static async open(args: DownloadAndOpenArgs & { syncMode: Exclude<SyncMode, \"FixedVersion\"> }): Promise<IModelDb>;\n /**\n * Download and open a checkpoint or briefcase, ensuring the operation completes within a default timeout. If the time to open exceeds the timeout period,\n * a RpcPendingResponse exception is thrown\n */\n public static async open(args: DownloadAndOpenArgs): Promise<IModelDb> {\n const { activity, tokenProps, syncMode } = args;\n Logger.logTrace(loggerCategory, \"RpcBriefcaseUtility.open\", tokenProps);\n\n const timeout = args.timeout ?? 1000;\n if (syncMode === SyncMode.PullOnly || syncMode === SyncMode.PullAndPush) {\n const briefcaseDb = await BeDuration.race(timeout, this.openBriefcase(args));\n\n if (briefcaseDb === undefined) {\n Logger.logTrace(loggerCategory, \"Open briefcase - pending\", tokenProps);\n throw new RpcPendingResponse(); // eslint-disable-line @typescript-eslint/only-throw-error\n }\n // note: usage is logged in the function BriefcaseManager.downloadNewBriefcaseAndOpen\n return briefcaseDb;\n }\n if (!tokenProps.iModelId || !tokenProps.iTwinId || !tokenProps.changeset)\n throw new IModelError(IModelStatus.BadArg, \"invalid arguments\");\n\n const checkpoint = {\n iModelId: tokenProps.iModelId,\n iTwinId: tokenProps.iTwinId,\n changeset: tokenProps.changeset,\n accessToken: activity.accessToken,\n };\n\n // opening a checkpoint.\n let db: SnapshotDb | void;\n // first check if it's already open\n db = SnapshotDb.tryFindByKey(CheckpointManager.getKey(checkpoint));\n if (db) {\n Logger.logTrace(loggerCategory, \"Checkpoint was already open\", tokenProps);\n return db;\n }\n\n try {\n // now try V2 checkpoint\n db = await SnapshotDb.openCheckpointFromRpc(checkpoint);\n Logger.logTrace(loggerCategory, \"using V2 checkpoint\", tokenProps);\n } catch (e) {\n Logger.logTrace(loggerCategory, \"unable to open V2 checkpoint - falling back to V1 checkpoint\", { error: BentleyError.getErrorProps(e), ...tokenProps });\n\n // this isn't a v2 checkpoint. Set up a race between the specified timeout period and the open. Throw an RpcPendingResponse exception if the timeout happens first.\n const request = {\n checkpoint,\n localFile: V1CheckpointManager.getFileName(checkpoint),\n aliasFiles: [],\n };\n db = await BeDuration.race(timeout, V1CheckpointManager.getCheckpointDb(request));\n\n if (db === undefined) {\n Logger.logTrace(loggerCategory, \"Open V1 checkpoint - pending\", tokenProps);\n throw new RpcPendingResponse(); // eslint-disable-line @typescript-eslint/only-throw-error\n }\n Logger.logTrace(loggerCategory, \"Opened V1 checkpoint\", tokenProps);\n }\n\n return db;\n }\n\n public static async openWithTimeout(activity: RpcActivity, tokenProps: IModelRpcOpenProps, syncMode: SyncMode.FixedVersion, timeout?: number): Promise<IModelConnectionProps>;\n /**\n * @deprecated in 4.4.0 - only `SyncMode.FixedVersion` should be used in RPC backends\n */\n // eslint-disable-next-line @typescript-eslint/unified-signatures -- these are separate to explicitly deprecate some SyncMode members.\n public static async openWithTimeout(activity: RpcActivity, tokenProps: IModelRpcOpenProps, syncMode: Exclude<SyncMode, \"FixedVersion\">, timeout?: number): Promise<IModelConnectionProps>;\n public static async openWithTimeout(activity: RpcActivity, tokenProps: IModelRpcOpenProps, syncMode: SyncMode, timeout: number = 1000): Promise<IModelConnectionProps> {\n if (tokenProps.iModelId)\n await IModelHost.tileStorage?.initialize(tokenProps.iModelId);\n // eslint-disable-next-line @typescript-eslint/no-deprecated\n return (await this.open({ activity, tokenProps, syncMode, timeout })).toJSON();\n }\n\n}\n"]}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@itwin/core-backend",
|
|
3
|
-
"version": "5.0.0-dev.
|
|
3
|
+
"version": "5.0.0-dev.34",
|
|
4
4
|
"description": "iTwin.js backend components",
|
|
5
5
|
"main": "lib/cjs/core-backend.js",
|
|
6
6
|
"typings": "lib/cjs/core-backend",
|
|
@@ -26,9 +26,9 @@
|
|
|
26
26
|
},
|
|
27
27
|
"peerDependencies": {
|
|
28
28
|
"@opentelemetry/api": "^1.0.4",
|
|
29
|
-
"@itwin/core-
|
|
30
|
-
"@itwin/core-
|
|
31
|
-
"@itwin/core-geometry": "5.0.0-dev.
|
|
29
|
+
"@itwin/core-bentley": "5.0.0-dev.34",
|
|
30
|
+
"@itwin/core-common": "5.0.0-dev.34",
|
|
31
|
+
"@itwin/core-geometry": "5.0.0-dev.34"
|
|
32
32
|
},
|
|
33
33
|
"peerDependenciesMeta": {
|
|
34
34
|
"@opentelemetry/api": {
|
|
@@ -70,15 +70,15 @@
|
|
|
70
70
|
"marked": "^14.1.3",
|
|
71
71
|
"sql-formatter": "^15.4.6",
|
|
72
72
|
"webpack": "^5.97.1",
|
|
73
|
-
"@itwin/core-bentley": "5.0.0-dev.
|
|
74
|
-
"@itwin/
|
|
75
|
-
"@itwin/
|
|
76
|
-
"@itwin/core-geometry": "5.0.0-dev.
|
|
77
|
-
"@itwin/ecsql-common": "5.0.0-dev.
|
|
73
|
+
"@itwin/core-bentley": "5.0.0-dev.34",
|
|
74
|
+
"@itwin/build-tools": "5.0.0-dev.34",
|
|
75
|
+
"@itwin/core-common": "5.0.0-dev.34",
|
|
76
|
+
"@itwin/core-geometry": "5.0.0-dev.34",
|
|
77
|
+
"@itwin/ecsql-common": "5.0.0-dev.34",
|
|
78
78
|
"internal-tools": "3.0.0-dev.69"
|
|
79
79
|
},
|
|
80
80
|
"dependencies": {
|
|
81
|
-
"@bentley/imodeljs-native": "5.0.
|
|
81
|
+
"@bentley/imodeljs-native": "5.0.24",
|
|
82
82
|
"@itwin/cloud-agnostic-core": "^2.2.4",
|
|
83
83
|
"@itwin/object-storage-azure": "^2.2.5",
|
|
84
84
|
"@itwin/object-storage-core": "^2.2.5",
|
|
@@ -92,7 +92,7 @@
|
|
|
92
92
|
"semver": "^7.5.2",
|
|
93
93
|
"touch": "^3.1.0",
|
|
94
94
|
"ws": "^7.5.10",
|
|
95
|
-
"@itwin/core-telemetry": "5.0.0-dev.
|
|
95
|
+
"@itwin/core-telemetry": "5.0.0-dev.34"
|
|
96
96
|
},
|
|
97
97
|
"nyc": {
|
|
98
98
|
"extends": "./node_modules/@itwin/build-tools/.nycrc"
|