@itwin/core-backend 3.0.0-dev.125 → 3.0.0-dev.129

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.
@@ -12,7 +12,7 @@ exports.BriefcaseManager = void 0;
12
12
  const path = require("path");
13
13
  const core_bentley_1 = require("@itwin/core-bentley");
14
14
  const core_common_1 = require("@itwin/core-common");
15
- const telemetry_client_1 = require("@bentley/telemetry-client");
15
+ const core_telemetry_1 = require("@itwin/core-telemetry");
16
16
  const BackendLoggerCategory_1 = require("./BackendLoggerCategory");
17
17
  const CheckpointManager_1 = require("./CheckpointManager");
18
18
  const IModelDb_1 = require("./IModelDb");
@@ -390,7 +390,7 @@ class BriefcaseManager {
390
390
  /** @internal */
391
391
  static logUsage(imodel, activity) {
392
392
  var _a;
393
- const telemetryEvent = new telemetry_client_1.TelemetryEvent("core-backend - Open iModel", "7a6424d1-2114-4e89-b13b-43670a38ccd4", // Feature: "iModel Use"
393
+ const telemetryEvent = new core_telemetry_1.TelemetryEvent("core-backend - Open iModel", "7a6424d1-2114-4e89-b13b-43670a38ccd4", // Feature: "iModel Use"
394
394
  imodel.iTwinId, imodel.iModelId, (_a = imodel.changeset) === null || _a === void 0 ? void 0 : _a.id);
395
395
  activity = activity !== null && activity !== void 0 ? activity : {
396
396
  activityId: "",
@@ -1 +1 @@
1
- {"version":3,"file":"BriefcaseManager.js","sourceRoot":"","sources":["../../src/BriefcaseManager.ts"],"names":[],"mappings":"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","sourcesContent":["/*---------------------------------------------------------------------------------------------\r\n* Copyright (c) Bentley Systems, Incorporated. All rights reserved.\r\n* See LICENSE.md in the project root for license terms and full copyright notice.\r\n*--------------------------------------------------------------------------------------------*/\r\n/** @packageDocumentation\r\n * @module iModels\r\n */\r\n\r\n// cspell:ignore cset csets ecchanges\r\n\r\nimport * as path from \"path\";\r\nimport {\r\n AccessToken, BeDuration, ChangeSetStatus, GuidString, IModelHubStatus, IModelStatus, Logger, OpenMode,\r\n} from \"@itwin/core-bentley\";\r\nimport {\r\n BriefcaseId, BriefcaseIdValue, BriefcaseProps, ChangesetFileProps, ChangesetIndex, ChangesetType, IModelError, IModelVersion, LocalBriefcaseProps,\r\n LocalDirName, LocalFileName, RequestNewBriefcaseProps, RpcActivity,\r\n} from \"@itwin/core-common\";\r\nimport { TelemetryEvent } from \"@bentley/telemetry-client\";\r\nimport { AcquireNewBriefcaseIdArg } from \"./BackendHubAccess\";\r\nimport { BackendLoggerCategory } from \"./BackendLoggerCategory\";\r\nimport { CheckpointManager, CheckpointProps, ProgressFunction } from \"./CheckpointManager\";\r\nimport { BriefcaseDb, IModelDb, TokenArg } from \"./IModelDb\";\r\nimport { IModelHost } from \"./IModelHost\";\r\nimport { IModelJsFs } from \"./IModelJsFs\";\r\n\r\nconst loggerCategory = BackendLoggerCategory.IModelDb;\r\n\r\n/** The argument for [[BriefcaseManager.downloadBriefcase]]\r\n * @public\r\n*/\r\nexport interface RequestNewBriefcaseArg extends TokenArg, RequestNewBriefcaseProps {\r\n /** If present, a function called periodically during the download to indicate progress.\r\n * @note return non-zero from this function to abort the download.\r\n */\r\n onProgress?: ProgressFunction;\r\n}\r\n\r\n/**\r\n * Parameters for pushing changesets to iModelHub\r\n * @public\r\n */\r\nexport interface PushChangesArgs extends TokenArg {\r\n /** A description of the changes. This is visible on the iModel's timeline. */\r\n description: string;\r\n /** if present, the locks are retained after the operation. Otherwise, *all* locks are released after the changeset is successfully pushed. */\r\n retainLocks?: true;\r\n /** number of times to retry pull/merge if other users are pushing at the same time. Default is 5 */\r\n mergeRetryCount?: number;\r\n /** delay to wait between pull/merge retry attempts. Default is 3 seconds */\r\n mergeRetryDelay?: BeDuration;\r\n /** the number of time to attempt to retry to push the changeset upon failure. Default is 3 */\r\n pushRetryCount?: number;\r\n /** The delay to wait between retry attempts on failed pushes. Default is 3 seconds. */\r\n pushRetryDelay?: BeDuration;\r\n}\r\n\r\n/**\r\n * Specifies a specific index for pulling changes.\r\n * @public\r\n */\r\nexport interface ToChangesetArgs extends TokenArg {\r\n /** The last ChangesetIndex to pull. If not present, pull *all* newer changesets. */\r\n toIndex?: ChangesetIndex;\r\n}\r\n\r\n/** Arguments for [[BriefcaseManager.pullAndApplyChangesets]]\r\n * @public\r\n */\r\nexport type PullChangesArgs = ToChangesetArgs;\r\n\r\n/** Manages downloading Briefcases and downloading and uploading changesets.\r\n * @public\r\n */\r\nexport class BriefcaseManager {\r\n /** Get the local path of the folder storing files that are associated with an imodel */\r\n public static getIModelPath(iModelId: GuidString): LocalDirName { return path.join(this._cacheDir, iModelId); }\r\n\r\n /** @internal */\r\n public static getChangeSetsPath(iModelId: GuidString): LocalDirName { return path.join(this.getIModelPath(iModelId), \"changesets\"); }\r\n\r\n /** @internal */\r\n public static getChangeCachePathName(iModelId: GuidString): LocalFileName { return path.join(this.getIModelPath(iModelId), iModelId.concat(\".bim.ecchanges\")); }\r\n\r\n /** @internal */\r\n public static getChangedElementsPathName(iModelId: GuidString): LocalFileName { return path.join(this.getIModelPath(iModelId), iModelId.concat(\".bim.elems\")); }\r\n\r\n private static _briefcaseSubDir = \"briefcases\";\r\n /** @internal */\r\n public static getBriefcaseBasePath(iModelId: GuidString): LocalDirName {\r\n return path.join(this.getIModelPath(iModelId), this._briefcaseSubDir);\r\n }\r\n\r\n /** Get the name of the local file that holds, or will hold, a local briefcase in the briefcase cache.\r\n * @note The briefcase cache is a local directory established in the call to [[BriefcaseManager.initialize]].\r\n * @param briefcase the iModelId and BriefcaseId for the filename\r\n * @see getIModelPath\r\n */\r\n public static getFileName(briefcase: BriefcaseProps): LocalFileName {\r\n return path.join(this.getBriefcaseBasePath(briefcase.iModelId), `${briefcase.briefcaseId}.bim`);\r\n }\r\n\r\n private static setupCacheDir(cacheRootDir: LocalDirName) {\r\n this._cacheDir = cacheRootDir;\r\n IModelJsFs.recursiveMkDirSync(this._cacheDir);\r\n }\r\n\r\n private static _initialized?: boolean;\r\n /** Initialize BriefcaseManager\r\n * @param cacheRootDir The root directory for storing a cache of downloaded briefcase files on the local computer.\r\n * Briefcases are stored relative to this path in sub-folders organized by IModelId.\r\n * @note It is perfectly valid for applications to store briefcases in locations they manage, outside of `cacheRootDir`.\r\n */\r\n public static initialize(cacheRootDir: LocalDirName) {\r\n if (this._initialized)\r\n return;\r\n this.setupCacheDir(cacheRootDir);\r\n IModelHost.onBeforeShutdown.addOnce(this.finalize, this);\r\n this._initialized = true;\r\n }\r\n\r\n private static finalize() {\r\n this._initialized = false;\r\n }\r\n\r\n /** Get a list of the local briefcase held in the briefcase cache, optionally for a single iModelId\r\n * @param iModelId if present, only briefcases for this iModelId are returned, otherwise all briefcases for all\r\n * iModels in the briefcase cache are returned.\r\n * @note usually there should only be one briefcase per iModel.\r\n */\r\n public static getCachedBriefcases(iModelId?: GuidString): LocalBriefcaseProps[] {\r\n const briefcaseList: LocalBriefcaseProps[] = [];\r\n const iModelDirs = IModelJsFs.readdirSync(this._cacheDir);\r\n for (const iModelDir of iModelDirs) {\r\n if (iModelId && iModelId !== iModelDir)\r\n continue;\r\n const bcPath = path.join(this._cacheDir, iModelDir, this._briefcaseSubDir);\r\n try {\r\n if (!IModelJsFs.lstatSync(bcPath)?.isDirectory)\r\n continue;\r\n } catch (err) {\r\n continue;\r\n }\r\n\r\n const briefcases = IModelJsFs.readdirSync(bcPath);\r\n for (const briefcaseName of briefcases) {\r\n if (briefcaseName.endsWith(\".bim\")) {\r\n try {\r\n const fileName = path.join(bcPath, briefcaseName);\r\n const fileSize = IModelJsFs.lstatSync(fileName)?.size ?? 0;\r\n const db = IModelDb.openDgnDb({ path: fileName }, OpenMode.Readonly);\r\n briefcaseList.push({ fileName, iTwinId: db.getITwinId(), iModelId: db.getIModelId(), briefcaseId: db.getBriefcaseId(), changeset: db.getCurrentChangeset(), fileSize });\r\n db.closeIModel();\r\n } catch (_err) {\r\n }\r\n }\r\n }\r\n }\r\n return briefcaseList;\r\n }\r\n\r\n private static _cacheDir: LocalDirName;\r\n /** Get the root directory for the briefcase cache */\r\n public static get cacheDir(): LocalDirName { return this._cacheDir; }\r\n\r\n /** Determine whether the supplied briefcaseId is in the range of assigned BriefcaseIds issued by iModelHub\r\n * @note this does check whether the id was actually acquired by the caller.\r\n */\r\n public static isValidBriefcaseId(id: BriefcaseId) {\r\n return id >= BriefcaseIdValue.FirstValid && id <= BriefcaseIdValue.LastValid;\r\n }\r\n\r\n /** Acquire a new briefcaseId from iModelHub for the supplied iModelId\r\n * @note usually there should only be one briefcase per iModel per user. If a single user acquires more than one briefcaseId,\r\n * it's a good idea to supply different aliases for each of them.\r\n */\r\n public static async acquireNewBriefcaseId(arg: AcquireNewBriefcaseIdArg): Promise<BriefcaseId> {\r\n return IModelHost.hubAccess.acquireNewBriefcaseId(arg);\r\n }\r\n\r\n /** Download a new briefcase from iModelHub for the supplied iModelId.\r\n *\r\n * The process of downloading a briefcase file involves first obtaining a valid BriefcaseId from IModelHub. For each IModel, IModelHub maintains\r\n * a list of BriefcaseIds assigned to users, to ensure that no two users have the same BriefcaseId. Typically a given user will have only\r\n * one briefcase on their machine for a given iModelId. Rarely, it may be necessary to use more than one briefcase to make isolated independent sets of changes,\r\n * but that is exceedingly complicated and rare. If no BriefcaseId is supplied, a new one is acquired from iModelHub.\r\n *\r\n * Then, a Checkpoint file (as of a ChangeSetId, typically \"Latest\") is downloaded from IModelHub. After the download completes,\r\n * the briefcaseId in the local file is changed to acquired briefcaseId, changing the checkpoint file into a briefcase file.\r\n *\r\n * Each of these steps requires a valid `AuthorizedClientRequestContext` to provide the user's credentials for the requests.\r\n *\r\n * @param request The properties that specify the briefcase file to be downloaded.\r\n * @returns The properties of the local briefcase in a Promise that is resolved after the briefcase is fully downloaded and the briefcase file is ready for use via [BriefcaseDb.open]($backend).\r\n * @note The location of the local file to hold the briefcase is arbitrary and may be any valid *local* path on your machine. If you don't supply\r\n * a filename, the local briefcase cache is used by creating a file with the briefcaseId as its name in the `briefcases` folder below the folder named\r\n * for the IModelId.\r\n * @note *It is invalid to edit briefcases on a shared network drive* and that is a sure way to corrupt your briefcase (see https://www.sqlite.org/howtocorrupt.html)\r\n * @note The special briefcaseId [[BriefcaseIdValue.Unassigned]] (0) can be used for a local briefcase that can accept changesets but may not be generate changesets.\r\n * @see CheckpointManager.downloadCheckpoint\r\n */\r\n public static async downloadBriefcase(arg: RequestNewBriefcaseArg): Promise<LocalBriefcaseProps> {\r\n const briefcaseId = arg.briefcaseId = arg.briefcaseId ?? await this.acquireNewBriefcaseId(arg);\r\n const fileName = arg.fileName ?? this.getFileName(arg as BriefcaseProps);\r\n\r\n if (IModelJsFs.existsSync(fileName))\r\n throw new IModelError(IModelStatus.FileAlreadyExists, `Briefcase \"${fileName}\" already exists`);\r\n\r\n const asOf = arg.asOf ?? IModelVersion.latest().toJSON();\r\n const changeset = await IModelHost.hubAccess.getChangesetFromVersion({ ...arg, version: IModelVersion.fromJSON(asOf) });\r\n const checkpoint: CheckpointProps = { ...arg, changeset };\r\n\r\n await CheckpointManager.downloadCheckpoint({ localFile: fileName, checkpoint, onProgress: arg.onProgress });\r\n const fileSize = IModelJsFs.lstatSync(fileName)?.size ?? 0;\r\n const response: LocalBriefcaseProps = {\r\n fileName,\r\n briefcaseId,\r\n iModelId: arg.iModelId,\r\n iTwinId: arg.iTwinId,\r\n changeset: checkpoint.changeset,\r\n fileSize,\r\n };\r\n\r\n // now open the downloaded checkpoint and reset its BriefcaseId\r\n const nativeDb = new IModelHost.platform.DgnDb();\r\n try {\r\n nativeDb.openIModel(fileName, OpenMode.ReadWrite);\r\n } catch (err: any) {\r\n throw new IModelError(err.errorNumber, `Could not open downloaded briefcase for write access: ${fileName}, err=${err.message}`);\r\n }\r\n try {\r\n nativeDb.resetBriefcaseId(briefcaseId);\r\n if (nativeDb.getCurrentChangeset().id !== checkpoint.changeset.id)\r\n throw new IModelError(IModelStatus.InvalidId, `Downloaded briefcase has wrong changesetId: ${fileName}`);\r\n } finally {\r\n nativeDb.saveChanges();\r\n nativeDb.closeIModel();\r\n }\r\n return response;\r\n }\r\n\r\n /** Deletes change sets of an iModel from local disk\r\n * @internal\r\n */\r\n public static deleteChangeSetsFromLocalDisk(iModelId: string) {\r\n const changesetsPath = BriefcaseManager.getChangeSetsPath(iModelId);\r\n BriefcaseManager.deleteFolderAndContents(changesetsPath);\r\n }\r\n\r\n /** Releases a briefcaseId from iModelHub. After this call it is illegal to generate changesets for the released briefcaseId.\r\n * @note generally, this method should not be called directly. Instead use [[deleteBriefcaseFiles]].\r\n * @see deleteBriefcaseFiles\r\n */\r\n public static async releaseBriefcase(accessToken: AccessToken, briefcase: BriefcaseProps): Promise<void> {\r\n if (this.isValidBriefcaseId(briefcase.briefcaseId))\r\n return IModelHost.hubAccess.releaseBriefcase({ accessToken, iModelId: briefcase.iModelId, briefcaseId: briefcase.briefcaseId });\r\n }\r\n\r\n /**\r\n * Delete and clean up a briefcase and all of its associated files. First, this method opens the supplied filename to determine its briefcaseId.\r\n * Then, if a requestContext is supplied, it releases a BriefcaseId from iModelHub. Finally it deletes the local briefcase file and\r\n * associated files (that is, all files in the same directory that start with the briefcase name).\r\n * @param filePath the full file name of the Briefcase to delete\r\n * @param accessToken for releasing the briefcaseId\r\n */\r\n public static async deleteBriefcaseFiles(filePath: LocalFileName, accessToken?: AccessToken): Promise<void> {\r\n try {\r\n const db = IModelDb.openDgnDb({ path: filePath }, OpenMode.Readonly);\r\n const briefcase: BriefcaseProps = {\r\n iModelId: db.getIModelId(),\r\n briefcaseId: db.getBriefcaseId(),\r\n };\r\n db.closeIModel();\r\n\r\n if (accessToken) {\r\n if (this.isValidBriefcaseId(briefcase.briefcaseId)) {\r\n await BriefcaseManager.releaseBriefcase(accessToken, briefcase);\r\n }\r\n }\r\n } catch (error) {\r\n }\r\n\r\n // first try to delete the briefcase file\r\n try {\r\n if (IModelJsFs.existsSync(filePath))\r\n IModelJsFs.unlinkSync(filePath);\r\n } catch (err) {\r\n throw new IModelError(IModelStatus.BadRequest, `cannot delete briefcase file ${err}`);\r\n }\r\n\r\n // next, delete all files that start with the briefcase's filePath (e.g. \"a.bim-locks\", \"a.bim-journal\", etc.)\r\n try {\r\n const dirName = path.dirname(filePath);\r\n const fileName = path.basename(filePath);\r\n const files = IModelJsFs.readdirSync(dirName);\r\n for (const file of files) {\r\n if (file.startsWith(fileName))\r\n this.deleteFile(path.join(dirName, file)); // don't throw on error\r\n }\r\n } catch (err) {\r\n }\r\n }\r\n\r\n /** Deletes a file\r\n * - Does not throw any error, but logs it instead\r\n * - Returns true if the delete was successful\r\n */\r\n private static deleteFile(pathname: LocalFileName): boolean {\r\n try {\r\n IModelJsFs.unlinkSync(pathname);\r\n } catch (error) {\r\n Logger.logError(loggerCategory, `Cannot delete file ${pathname}, ${error}`);\r\n return false;\r\n }\r\n return true;\r\n }\r\n\r\n /** Deletes a folder, checking if it's empty\r\n * - Does not throw any error, but logs it instead\r\n * - Returns true if the delete was successful\r\n */\r\n private static deleteFolderIfEmpty(folderPathname: LocalDirName): boolean {\r\n try {\r\n const files = IModelJsFs.readdirSync(folderPathname);\r\n if (files.length > 0)\r\n return false;\r\n\r\n IModelJsFs.rmdirSync(folderPathname);\r\n } catch (error) {\r\n Logger.logError(loggerCategory, `Cannot delete folder: ${folderPathname}`);\r\n return false;\r\n }\r\n return true;\r\n }\r\n\r\n /** Deletes the contents of a folder, but not the folder itself\r\n * - Does not throw any errors, but logs them.\r\n * - returns true if the delete was successful.\r\n */\r\n private static deleteFolderContents(folderPathname: LocalDirName): boolean {\r\n if (!IModelJsFs.existsSync(folderPathname))\r\n return false;\r\n\r\n let status = true;\r\n const files = IModelJsFs.readdirSync(folderPathname);\r\n for (const file of files) {\r\n const curPath = path.join(folderPathname, file);\r\n const locStatus = (IModelJsFs.lstatSync(curPath)?.isDirectory) ? BriefcaseManager.deleteFolderAndContents(curPath) : BriefcaseManager.deleteFile(curPath);\r\n if (!locStatus)\r\n status = false;\r\n }\r\n return status;\r\n }\r\n\r\n /** Deletes a folder and all it's contents.\r\n * - Does not throw any errors, but logs them.\r\n * - returns true if the delete was successful.\r\n */\r\n private static deleteFolderAndContents(folderPathname: LocalDirName): boolean {\r\n if (!IModelJsFs.existsSync(folderPathname))\r\n return true;\r\n\r\n let status = false;\r\n status = BriefcaseManager.deleteFolderContents(folderPathname);\r\n if (!status)\r\n return false;\r\n\r\n status = BriefcaseManager.deleteFolderIfEmpty(folderPathname);\r\n return status;\r\n }\r\n\r\n private static async applySingleChangeset(db: IModelDb, changesetFile: ChangesetFileProps) {\r\n if (changesetFile.changesType === ChangesetType.Schema)\r\n db.clearCaches(); // for schema changesets, statement caches may become invalid. Do this *before* applying, in case db needs to be closed (open statements hold db open.)\r\n\r\n db.nativeDb.applyChangeset(changesetFile);\r\n db.changeset = db.nativeDb.getCurrentChangeset();\r\n\r\n // we're done with this changeset, delete it\r\n IModelJsFs.removeSync(changesetFile.pathname);\r\n }\r\n\r\n /** @internal */\r\n public static async pullAndApplyChangesets(db: IModelDb, arg: ToChangesetArgs): Promise<void> {\r\n if (!db.isOpen || db.nativeDb.isReadonly()) // don't use db.isReadonly - we reopen the file writable just for this operation but db.isReadonly is still true\r\n throw new IModelError(ChangeSetStatus.ApplyError, \"Briefcase must be open ReadWrite to process change sets\");\r\n\r\n let currentIndex = db.changeset.index;\r\n if (currentIndex === undefined)\r\n currentIndex = (await IModelHost.hubAccess.queryChangeset({ accessToken: arg.accessToken, iModelId: db.iModelId, changeset: { id: db.changeset.id } })).index;\r\n\r\n const reverse = (arg.toIndex && arg.toIndex < currentIndex) ? true : false;\r\n\r\n // Download change sets\r\n const changesets = await IModelHost.hubAccess.downloadChangesets({\r\n accessToken: arg.accessToken,\r\n iModelId: db.iModelId,\r\n range: { first: reverse ? arg.toIndex! + 1 : currentIndex + 1, end: reverse ? currentIndex : arg.toIndex }, // eslint-disable-line @typescript-eslint/no-non-null-assertion\r\n targetDir: BriefcaseManager.getChangeSetsPath(db.iModelId),\r\n });\r\n\r\n if (changesets.length === 0)\r\n return; // nothing to apply\r\n\r\n if (reverse)\r\n changesets.reverse();\r\n\r\n for (const changeset of changesets)\r\n await this.applySingleChangeset(db, changeset);\r\n\r\n // notify listeners\r\n db.notifyChangesetApplied();\r\n }\r\n\r\n /** create a changeset from the current changes, and push it to iModelHub */\r\n private static async pushChanges(db: BriefcaseDb, arg: PushChangesArgs): Promise<void> {\r\n const changesetProps = db.nativeDb.startCreateChangeset();\r\n changesetProps.briefcaseId = db.briefcaseId;\r\n changesetProps.description = arg.description;\r\n changesetProps.size = IModelJsFs.lstatSync(changesetProps.pathname)?.size;\r\n if (!changesetProps.size) // either undefined or 0 means error\r\n throw new IModelError(IModelStatus.NoContent, \"error creating changeset\");\r\n\r\n let retryCount = arg.pushRetryCount ?? 3;\r\n while (true) {\r\n try {\r\n const accessToken = await IModelHost.getAccessToken();\r\n const index = await IModelHost.hubAccess.pushChangeset({ accessToken, iModelId: db.iModelId, changesetProps });\r\n db.nativeDb.completeCreateChangeset({ index });\r\n db.changeset = db.nativeDb.getCurrentChangeset();\r\n if (!arg.retainLocks)\r\n await db.locks.releaseAllLocks();\r\n\r\n return;\r\n } catch (err: any) {\r\n const shouldRetry = () => {\r\n if (retryCount-- <= 0)\r\n return false;\r\n switch (err.errorNumber) {\r\n case IModelHubStatus.AnotherUserPushing:\r\n case IModelHubStatus.DatabaseTemporarilyLocked:\r\n case IModelHubStatus.OperationFailed:\r\n return true;\r\n }\r\n return false;\r\n };\r\n\r\n if (!shouldRetry()) {\r\n db.nativeDb.abandonCreateChangeset();\r\n throw err;\r\n }\r\n } finally {\r\n IModelJsFs.removeSync(changesetProps.pathname);\r\n }\r\n }\r\n }\r\n\r\n /** Pull/merge (if necessary), then push all local changes as a changeset. Called by [[BriefcaseDb.pushChanges]]\r\n * @internal\r\n */\r\n public static async pullMergePush(db: BriefcaseDb, arg: PushChangesArgs): Promise<void> {\r\n let retryCount = arg.mergeRetryCount ?? 5;\r\n while (true) {\r\n try {\r\n await BriefcaseManager.pullAndApplyChangesets(db, arg);\r\n return await BriefcaseManager.pushChanges(db, arg);\r\n } catch (err: any) {\r\n if (retryCount-- <= 0 || err.errorNumber !== IModelHubStatus.PullIsRequired)\r\n throw (err);\r\n await (arg.mergeRetryDelay ?? BeDuration.fromSeconds(3)).wait();\r\n }\r\n }\r\n }\r\n\r\n /** @internal */\r\n public static logUsage(imodel: IModelDb, activity?: RpcActivity) {\r\n\r\n const telemetryEvent = new TelemetryEvent(\r\n \"core-backend - Open iModel\",\r\n \"7a6424d1-2114-4e89-b13b-43670a38ccd4\", // Feature: \"iModel Use\"\r\n imodel.iTwinId,\r\n imodel.iModelId,\r\n imodel.changeset?.id,\r\n );\r\n activity = activity ?? {\r\n activityId: \"\",\r\n applicationId: IModelHost.applicationId,\r\n applicationVersion: IModelHost.applicationVersion,\r\n sessionId: IModelHost.sessionId,\r\n accessToken: \"\", // IModelHost.getAccessToken(); ACCESS_TOKEN_NEEDS_WORK\r\n };\r\n\r\n IModelHost.telemetry.postTelemetry(activity, telemetryEvent); // eslint-disable-line @typescript-eslint/no-floating-promises\r\n }\r\n}\r\n"]}
1
+ {"version":3,"file":"BriefcaseManager.js","sourceRoot":"","sources":["../../src/BriefcaseManager.ts"],"names":[],"mappings":"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","sourcesContent":["/*---------------------------------------------------------------------------------------------\r\n* Copyright (c) Bentley Systems, Incorporated. All rights reserved.\r\n* See LICENSE.md in the project root for license terms and full copyright notice.\r\n*--------------------------------------------------------------------------------------------*/\r\n/** @packageDocumentation\r\n * @module iModels\r\n */\r\n\r\n// cspell:ignore cset csets ecchanges\r\n\r\nimport * as path from \"path\";\r\nimport {\r\n AccessToken, BeDuration, ChangeSetStatus, GuidString, IModelHubStatus, IModelStatus, Logger, OpenMode,\r\n} from \"@itwin/core-bentley\";\r\nimport {\r\n BriefcaseId, BriefcaseIdValue, BriefcaseProps, ChangesetFileProps, ChangesetIndex, ChangesetType, IModelError, IModelVersion, LocalBriefcaseProps,\r\n LocalDirName, LocalFileName, RequestNewBriefcaseProps, RpcActivity,\r\n} from \"@itwin/core-common\";\r\nimport { TelemetryEvent } from \"@itwin/core-telemetry\";\r\nimport { AcquireNewBriefcaseIdArg } from \"./BackendHubAccess\";\r\nimport { BackendLoggerCategory } from \"./BackendLoggerCategory\";\r\nimport { CheckpointManager, CheckpointProps, ProgressFunction } from \"./CheckpointManager\";\r\nimport { BriefcaseDb, IModelDb, TokenArg } from \"./IModelDb\";\r\nimport { IModelHost } from \"./IModelHost\";\r\nimport { IModelJsFs } from \"./IModelJsFs\";\r\n\r\nconst loggerCategory = BackendLoggerCategory.IModelDb;\r\n\r\n/** The argument for [[BriefcaseManager.downloadBriefcase]]\r\n * @public\r\n*/\r\nexport interface RequestNewBriefcaseArg extends TokenArg, RequestNewBriefcaseProps {\r\n /** If present, a function called periodically during the download to indicate progress.\r\n * @note return non-zero from this function to abort the download.\r\n */\r\n onProgress?: ProgressFunction;\r\n}\r\n\r\n/**\r\n * Parameters for pushing changesets to iModelHub\r\n * @public\r\n */\r\nexport interface PushChangesArgs extends TokenArg {\r\n /** A description of the changes. This is visible on the iModel's timeline. */\r\n description: string;\r\n /** if present, the locks are retained after the operation. Otherwise, *all* locks are released after the changeset is successfully pushed. */\r\n retainLocks?: true;\r\n /** number of times to retry pull/merge if other users are pushing at the same time. Default is 5 */\r\n mergeRetryCount?: number;\r\n /** delay to wait between pull/merge retry attempts. Default is 3 seconds */\r\n mergeRetryDelay?: BeDuration;\r\n /** the number of time to attempt to retry to push the changeset upon failure. Default is 3 */\r\n pushRetryCount?: number;\r\n /** The delay to wait between retry attempts on failed pushes. Default is 3 seconds. */\r\n pushRetryDelay?: BeDuration;\r\n}\r\n\r\n/**\r\n * Specifies a specific index for pulling changes.\r\n * @public\r\n */\r\nexport interface ToChangesetArgs extends TokenArg {\r\n /** The last ChangesetIndex to pull. If not present, pull *all* newer changesets. */\r\n toIndex?: ChangesetIndex;\r\n}\r\n\r\n/** Arguments for [[BriefcaseManager.pullAndApplyChangesets]]\r\n * @public\r\n */\r\nexport type PullChangesArgs = ToChangesetArgs;\r\n\r\n/** Manages downloading Briefcases and downloading and uploading changesets.\r\n * @public\r\n */\r\nexport class BriefcaseManager {\r\n /** Get the local path of the folder storing files that are associated with an imodel */\r\n public static getIModelPath(iModelId: GuidString): LocalDirName { return path.join(this._cacheDir, iModelId); }\r\n\r\n /** @internal */\r\n public static getChangeSetsPath(iModelId: GuidString): LocalDirName { return path.join(this.getIModelPath(iModelId), \"changesets\"); }\r\n\r\n /** @internal */\r\n public static getChangeCachePathName(iModelId: GuidString): LocalFileName { return path.join(this.getIModelPath(iModelId), iModelId.concat(\".bim.ecchanges\")); }\r\n\r\n /** @internal */\r\n public static getChangedElementsPathName(iModelId: GuidString): LocalFileName { return path.join(this.getIModelPath(iModelId), iModelId.concat(\".bim.elems\")); }\r\n\r\n private static _briefcaseSubDir = \"briefcases\";\r\n /** @internal */\r\n public static getBriefcaseBasePath(iModelId: GuidString): LocalDirName {\r\n return path.join(this.getIModelPath(iModelId), this._briefcaseSubDir);\r\n }\r\n\r\n /** Get the name of the local file that holds, or will hold, a local briefcase in the briefcase cache.\r\n * @note The briefcase cache is a local directory established in the call to [[BriefcaseManager.initialize]].\r\n * @param briefcase the iModelId and BriefcaseId for the filename\r\n * @see getIModelPath\r\n */\r\n public static getFileName(briefcase: BriefcaseProps): LocalFileName {\r\n return path.join(this.getBriefcaseBasePath(briefcase.iModelId), `${briefcase.briefcaseId}.bim`);\r\n }\r\n\r\n private static setupCacheDir(cacheRootDir: LocalDirName) {\r\n this._cacheDir = cacheRootDir;\r\n IModelJsFs.recursiveMkDirSync(this._cacheDir);\r\n }\r\n\r\n private static _initialized?: boolean;\r\n /** Initialize BriefcaseManager\r\n * @param cacheRootDir The root directory for storing a cache of downloaded briefcase files on the local computer.\r\n * Briefcases are stored relative to this path in sub-folders organized by IModelId.\r\n * @note It is perfectly valid for applications to store briefcases in locations they manage, outside of `cacheRootDir`.\r\n */\r\n public static initialize(cacheRootDir: LocalDirName) {\r\n if (this._initialized)\r\n return;\r\n this.setupCacheDir(cacheRootDir);\r\n IModelHost.onBeforeShutdown.addOnce(this.finalize, this);\r\n this._initialized = true;\r\n }\r\n\r\n private static finalize() {\r\n this._initialized = false;\r\n }\r\n\r\n /** Get a list of the local briefcase held in the briefcase cache, optionally for a single iModelId\r\n * @param iModelId if present, only briefcases for this iModelId are returned, otherwise all briefcases for all\r\n * iModels in the briefcase cache are returned.\r\n * @note usually there should only be one briefcase per iModel.\r\n */\r\n public static getCachedBriefcases(iModelId?: GuidString): LocalBriefcaseProps[] {\r\n const briefcaseList: LocalBriefcaseProps[] = [];\r\n const iModelDirs = IModelJsFs.readdirSync(this._cacheDir);\r\n for (const iModelDir of iModelDirs) {\r\n if (iModelId && iModelId !== iModelDir)\r\n continue;\r\n const bcPath = path.join(this._cacheDir, iModelDir, this._briefcaseSubDir);\r\n try {\r\n if (!IModelJsFs.lstatSync(bcPath)?.isDirectory)\r\n continue;\r\n } catch (err) {\r\n continue;\r\n }\r\n\r\n const briefcases = IModelJsFs.readdirSync(bcPath);\r\n for (const briefcaseName of briefcases) {\r\n if (briefcaseName.endsWith(\".bim\")) {\r\n try {\r\n const fileName = path.join(bcPath, briefcaseName);\r\n const fileSize = IModelJsFs.lstatSync(fileName)?.size ?? 0;\r\n const db = IModelDb.openDgnDb({ path: fileName }, OpenMode.Readonly);\r\n briefcaseList.push({ fileName, iTwinId: db.getITwinId(), iModelId: db.getIModelId(), briefcaseId: db.getBriefcaseId(), changeset: db.getCurrentChangeset(), fileSize });\r\n db.closeIModel();\r\n } catch (_err) {\r\n }\r\n }\r\n }\r\n }\r\n return briefcaseList;\r\n }\r\n\r\n private static _cacheDir: LocalDirName;\r\n /** Get the root directory for the briefcase cache */\r\n public static get cacheDir(): LocalDirName { return this._cacheDir; }\r\n\r\n /** Determine whether the supplied briefcaseId is in the range of assigned BriefcaseIds issued by iModelHub\r\n * @note this does check whether the id was actually acquired by the caller.\r\n */\r\n public static isValidBriefcaseId(id: BriefcaseId) {\r\n return id >= BriefcaseIdValue.FirstValid && id <= BriefcaseIdValue.LastValid;\r\n }\r\n\r\n /** Acquire a new briefcaseId from iModelHub for the supplied iModelId\r\n * @note usually there should only be one briefcase per iModel per user. If a single user acquires more than one briefcaseId,\r\n * it's a good idea to supply different aliases for each of them.\r\n */\r\n public static async acquireNewBriefcaseId(arg: AcquireNewBriefcaseIdArg): Promise<BriefcaseId> {\r\n return IModelHost.hubAccess.acquireNewBriefcaseId(arg);\r\n }\r\n\r\n /** Download a new briefcase from iModelHub for the supplied iModelId.\r\n *\r\n * The process of downloading a briefcase file involves first obtaining a valid BriefcaseId from IModelHub. For each IModel, IModelHub maintains\r\n * a list of BriefcaseIds assigned to users, to ensure that no two users have the same BriefcaseId. Typically a given user will have only\r\n * one briefcase on their machine for a given iModelId. Rarely, it may be necessary to use more than one briefcase to make isolated independent sets of changes,\r\n * but that is exceedingly complicated and rare. If no BriefcaseId is supplied, a new one is acquired from iModelHub.\r\n *\r\n * Then, a Checkpoint file (as of a ChangeSetId, typically \"Latest\") is downloaded from IModelHub. After the download completes,\r\n * the briefcaseId in the local file is changed to acquired briefcaseId, changing the checkpoint file into a briefcase file.\r\n *\r\n * Each of these steps requires a valid `AuthorizedClientRequestContext` to provide the user's credentials for the requests.\r\n *\r\n * @param request The properties that specify the briefcase file to be downloaded.\r\n * @returns The properties of the local briefcase in a Promise that is resolved after the briefcase is fully downloaded and the briefcase file is ready for use via [BriefcaseDb.open]($backend).\r\n * @note The location of the local file to hold the briefcase is arbitrary and may be any valid *local* path on your machine. If you don't supply\r\n * a filename, the local briefcase cache is used by creating a file with the briefcaseId as its name in the `briefcases` folder below the folder named\r\n * for the IModelId.\r\n * @note *It is invalid to edit briefcases on a shared network drive* and that is a sure way to corrupt your briefcase (see https://www.sqlite.org/howtocorrupt.html)\r\n * @note The special briefcaseId [[BriefcaseIdValue.Unassigned]] (0) can be used for a local briefcase that can accept changesets but may not be generate changesets.\r\n * @see CheckpointManager.downloadCheckpoint\r\n */\r\n public static async downloadBriefcase(arg: RequestNewBriefcaseArg): Promise<LocalBriefcaseProps> {\r\n const briefcaseId = arg.briefcaseId = arg.briefcaseId ?? await this.acquireNewBriefcaseId(arg);\r\n const fileName = arg.fileName ?? this.getFileName(arg as BriefcaseProps);\r\n\r\n if (IModelJsFs.existsSync(fileName))\r\n throw new IModelError(IModelStatus.FileAlreadyExists, `Briefcase \"${fileName}\" already exists`);\r\n\r\n const asOf = arg.asOf ?? IModelVersion.latest().toJSON();\r\n const changeset = await IModelHost.hubAccess.getChangesetFromVersion({ ...arg, version: IModelVersion.fromJSON(asOf) });\r\n const checkpoint: CheckpointProps = { ...arg, changeset };\r\n\r\n await CheckpointManager.downloadCheckpoint({ localFile: fileName, checkpoint, onProgress: arg.onProgress });\r\n const fileSize = IModelJsFs.lstatSync(fileName)?.size ?? 0;\r\n const response: LocalBriefcaseProps = {\r\n fileName,\r\n briefcaseId,\r\n iModelId: arg.iModelId,\r\n iTwinId: arg.iTwinId,\r\n changeset: checkpoint.changeset,\r\n fileSize,\r\n };\r\n\r\n // now open the downloaded checkpoint and reset its BriefcaseId\r\n const nativeDb = new IModelHost.platform.DgnDb();\r\n try {\r\n nativeDb.openIModel(fileName, OpenMode.ReadWrite);\r\n } catch (err: any) {\r\n throw new IModelError(err.errorNumber, `Could not open downloaded briefcase for write access: ${fileName}, err=${err.message}`);\r\n }\r\n try {\r\n nativeDb.resetBriefcaseId(briefcaseId);\r\n if (nativeDb.getCurrentChangeset().id !== checkpoint.changeset.id)\r\n throw new IModelError(IModelStatus.InvalidId, `Downloaded briefcase has wrong changesetId: ${fileName}`);\r\n } finally {\r\n nativeDb.saveChanges();\r\n nativeDb.closeIModel();\r\n }\r\n return response;\r\n }\r\n\r\n /** Deletes change sets of an iModel from local disk\r\n * @internal\r\n */\r\n public static deleteChangeSetsFromLocalDisk(iModelId: string) {\r\n const changesetsPath = BriefcaseManager.getChangeSetsPath(iModelId);\r\n BriefcaseManager.deleteFolderAndContents(changesetsPath);\r\n }\r\n\r\n /** Releases a briefcaseId from iModelHub. After this call it is illegal to generate changesets for the released briefcaseId.\r\n * @note generally, this method should not be called directly. Instead use [[deleteBriefcaseFiles]].\r\n * @see deleteBriefcaseFiles\r\n */\r\n public static async releaseBriefcase(accessToken: AccessToken, briefcase: BriefcaseProps): Promise<void> {\r\n if (this.isValidBriefcaseId(briefcase.briefcaseId))\r\n return IModelHost.hubAccess.releaseBriefcase({ accessToken, iModelId: briefcase.iModelId, briefcaseId: briefcase.briefcaseId });\r\n }\r\n\r\n /**\r\n * Delete and clean up a briefcase and all of its associated files. First, this method opens the supplied filename to determine its briefcaseId.\r\n * Then, if a requestContext is supplied, it releases a BriefcaseId from iModelHub. Finally it deletes the local briefcase file and\r\n * associated files (that is, all files in the same directory that start with the briefcase name).\r\n * @param filePath the full file name of the Briefcase to delete\r\n * @param accessToken for releasing the briefcaseId\r\n */\r\n public static async deleteBriefcaseFiles(filePath: LocalFileName, accessToken?: AccessToken): Promise<void> {\r\n try {\r\n const db = IModelDb.openDgnDb({ path: filePath }, OpenMode.Readonly);\r\n const briefcase: BriefcaseProps = {\r\n iModelId: db.getIModelId(),\r\n briefcaseId: db.getBriefcaseId(),\r\n };\r\n db.closeIModel();\r\n\r\n if (accessToken) {\r\n if (this.isValidBriefcaseId(briefcase.briefcaseId)) {\r\n await BriefcaseManager.releaseBriefcase(accessToken, briefcase);\r\n }\r\n }\r\n } catch (error) {\r\n }\r\n\r\n // first try to delete the briefcase file\r\n try {\r\n if (IModelJsFs.existsSync(filePath))\r\n IModelJsFs.unlinkSync(filePath);\r\n } catch (err) {\r\n throw new IModelError(IModelStatus.BadRequest, `cannot delete briefcase file ${err}`);\r\n }\r\n\r\n // next, delete all files that start with the briefcase's filePath (e.g. \"a.bim-locks\", \"a.bim-journal\", etc.)\r\n try {\r\n const dirName = path.dirname(filePath);\r\n const fileName = path.basename(filePath);\r\n const files = IModelJsFs.readdirSync(dirName);\r\n for (const file of files) {\r\n if (file.startsWith(fileName))\r\n this.deleteFile(path.join(dirName, file)); // don't throw on error\r\n }\r\n } catch (err) {\r\n }\r\n }\r\n\r\n /** Deletes a file\r\n * - Does not throw any error, but logs it instead\r\n * - Returns true if the delete was successful\r\n */\r\n private static deleteFile(pathname: LocalFileName): boolean {\r\n try {\r\n IModelJsFs.unlinkSync(pathname);\r\n } catch (error) {\r\n Logger.logError(loggerCategory, `Cannot delete file ${pathname}, ${error}`);\r\n return false;\r\n }\r\n return true;\r\n }\r\n\r\n /** Deletes a folder, checking if it's empty\r\n * - Does not throw any error, but logs it instead\r\n * - Returns true if the delete was successful\r\n */\r\n private static deleteFolderIfEmpty(folderPathname: LocalDirName): boolean {\r\n try {\r\n const files = IModelJsFs.readdirSync(folderPathname);\r\n if (files.length > 0)\r\n return false;\r\n\r\n IModelJsFs.rmdirSync(folderPathname);\r\n } catch (error) {\r\n Logger.logError(loggerCategory, `Cannot delete folder: ${folderPathname}`);\r\n return false;\r\n }\r\n return true;\r\n }\r\n\r\n /** Deletes the contents of a folder, but not the folder itself\r\n * - Does not throw any errors, but logs them.\r\n * - returns true if the delete was successful.\r\n */\r\n private static deleteFolderContents(folderPathname: LocalDirName): boolean {\r\n if (!IModelJsFs.existsSync(folderPathname))\r\n return false;\r\n\r\n let status = true;\r\n const files = IModelJsFs.readdirSync(folderPathname);\r\n for (const file of files) {\r\n const curPath = path.join(folderPathname, file);\r\n const locStatus = (IModelJsFs.lstatSync(curPath)?.isDirectory) ? BriefcaseManager.deleteFolderAndContents(curPath) : BriefcaseManager.deleteFile(curPath);\r\n if (!locStatus)\r\n status = false;\r\n }\r\n return status;\r\n }\r\n\r\n /** Deletes a folder and all it's contents.\r\n * - Does not throw any errors, but logs them.\r\n * - returns true if the delete was successful.\r\n */\r\n private static deleteFolderAndContents(folderPathname: LocalDirName): boolean {\r\n if (!IModelJsFs.existsSync(folderPathname))\r\n return true;\r\n\r\n let status = false;\r\n status = BriefcaseManager.deleteFolderContents(folderPathname);\r\n if (!status)\r\n return false;\r\n\r\n status = BriefcaseManager.deleteFolderIfEmpty(folderPathname);\r\n return status;\r\n }\r\n\r\n private static async applySingleChangeset(db: IModelDb, changesetFile: ChangesetFileProps) {\r\n if (changesetFile.changesType === ChangesetType.Schema)\r\n db.clearCaches(); // for schema changesets, statement caches may become invalid. Do this *before* applying, in case db needs to be closed (open statements hold db open.)\r\n\r\n db.nativeDb.applyChangeset(changesetFile);\r\n db.changeset = db.nativeDb.getCurrentChangeset();\r\n\r\n // we're done with this changeset, delete it\r\n IModelJsFs.removeSync(changesetFile.pathname);\r\n }\r\n\r\n /** @internal */\r\n public static async pullAndApplyChangesets(db: IModelDb, arg: ToChangesetArgs): Promise<void> {\r\n if (!db.isOpen || db.nativeDb.isReadonly()) // don't use db.isReadonly - we reopen the file writable just for this operation but db.isReadonly is still true\r\n throw new IModelError(ChangeSetStatus.ApplyError, \"Briefcase must be open ReadWrite to process change sets\");\r\n\r\n let currentIndex = db.changeset.index;\r\n if (currentIndex === undefined)\r\n currentIndex = (await IModelHost.hubAccess.queryChangeset({ accessToken: arg.accessToken, iModelId: db.iModelId, changeset: { id: db.changeset.id } })).index;\r\n\r\n const reverse = (arg.toIndex && arg.toIndex < currentIndex) ? true : false;\r\n\r\n // Download change sets\r\n const changesets = await IModelHost.hubAccess.downloadChangesets({\r\n accessToken: arg.accessToken,\r\n iModelId: db.iModelId,\r\n range: { first: reverse ? arg.toIndex! + 1 : currentIndex + 1, end: reverse ? currentIndex : arg.toIndex }, // eslint-disable-line @typescript-eslint/no-non-null-assertion\r\n targetDir: BriefcaseManager.getChangeSetsPath(db.iModelId),\r\n });\r\n\r\n if (changesets.length === 0)\r\n return; // nothing to apply\r\n\r\n if (reverse)\r\n changesets.reverse();\r\n\r\n for (const changeset of changesets)\r\n await this.applySingleChangeset(db, changeset);\r\n\r\n // notify listeners\r\n db.notifyChangesetApplied();\r\n }\r\n\r\n /** create a changeset from the current changes, and push it to iModelHub */\r\n private static async pushChanges(db: BriefcaseDb, arg: PushChangesArgs): Promise<void> {\r\n const changesetProps = db.nativeDb.startCreateChangeset();\r\n changesetProps.briefcaseId = db.briefcaseId;\r\n changesetProps.description = arg.description;\r\n changesetProps.size = IModelJsFs.lstatSync(changesetProps.pathname)?.size;\r\n if (!changesetProps.size) // either undefined or 0 means error\r\n throw new IModelError(IModelStatus.NoContent, \"error creating changeset\");\r\n\r\n let retryCount = arg.pushRetryCount ?? 3;\r\n while (true) {\r\n try {\r\n const accessToken = await IModelHost.getAccessToken();\r\n const index = await IModelHost.hubAccess.pushChangeset({ accessToken, iModelId: db.iModelId, changesetProps });\r\n db.nativeDb.completeCreateChangeset({ index });\r\n db.changeset = db.nativeDb.getCurrentChangeset();\r\n if (!arg.retainLocks)\r\n await db.locks.releaseAllLocks();\r\n\r\n return;\r\n } catch (err: any) {\r\n const shouldRetry = () => {\r\n if (retryCount-- <= 0)\r\n return false;\r\n switch (err.errorNumber) {\r\n case IModelHubStatus.AnotherUserPushing:\r\n case IModelHubStatus.DatabaseTemporarilyLocked:\r\n case IModelHubStatus.OperationFailed:\r\n return true;\r\n }\r\n return false;\r\n };\r\n\r\n if (!shouldRetry()) {\r\n db.nativeDb.abandonCreateChangeset();\r\n throw err;\r\n }\r\n } finally {\r\n IModelJsFs.removeSync(changesetProps.pathname);\r\n }\r\n }\r\n }\r\n\r\n /** Pull/merge (if necessary), then push all local changes as a changeset. Called by [[BriefcaseDb.pushChanges]]\r\n * @internal\r\n */\r\n public static async pullMergePush(db: BriefcaseDb, arg: PushChangesArgs): Promise<void> {\r\n let retryCount = arg.mergeRetryCount ?? 5;\r\n while (true) {\r\n try {\r\n await BriefcaseManager.pullAndApplyChangesets(db, arg);\r\n return await BriefcaseManager.pushChanges(db, arg);\r\n } catch (err: any) {\r\n if (retryCount-- <= 0 || err.errorNumber !== IModelHubStatus.PullIsRequired)\r\n throw (err);\r\n await (arg.mergeRetryDelay ?? BeDuration.fromSeconds(3)).wait();\r\n }\r\n }\r\n }\r\n\r\n /** @internal */\r\n public static logUsage(imodel: IModelDb, activity?: RpcActivity) {\r\n\r\n const telemetryEvent = new TelemetryEvent(\r\n \"core-backend - Open iModel\",\r\n \"7a6424d1-2114-4e89-b13b-43670a38ccd4\", // Feature: \"iModel Use\"\r\n imodel.iTwinId,\r\n imodel.iModelId,\r\n imodel.changeset?.id,\r\n );\r\n activity = activity ?? {\r\n activityId: \"\",\r\n applicationId: IModelHost.applicationId,\r\n applicationVersion: IModelHost.applicationVersion,\r\n sessionId: IModelHost.sessionId,\r\n accessToken: \"\", // IModelHost.getAccessToken(); ACCESS_TOKEN_NEEDS_WORK\r\n };\r\n\r\n IModelHost.telemetry.postTelemetry(activity, telemetryEvent); // eslint-disable-line @typescript-eslint/no-floating-promises\r\n }\r\n}\r\n"]}
@@ -2,7 +2,7 @@
2
2
  * @module IModelHost
3
3
  */
4
4
  import { IModelJsNative } from "@bentley/imodeljs-native";
5
- import { TelemetryManager } from "@bentley/telemetry-client";
5
+ import { TelemetryManager } from "@itwin/core-telemetry";
6
6
  import { AccessToken, BeEvent, GuidString, Mutable } from "@itwin/core-bentley";
7
7
  import { AuthorizationClient, LocalDirName, SessionProps } from "@itwin/core-common";
8
8
  import { BackendHubAccess } from "./BackendHubAccess";
@@ -118,6 +118,10 @@ export declare class IModelHostConfiguration {
118
118
  * @alpha
119
119
  */
120
120
  crashReportingConfig?: CrashReportingConfig;
121
+ /** The AuthorizationClient used to get accessTokens
122
+ * @beta
123
+ */
124
+ authorizationClient?: AuthorizationClient;
121
125
  }
122
126
  /** IModelHost initializes ($backend) and captures its configuration. A backend must call [[IModelHost.startup]] before using any backend classes.
123
127
  * See [the learning article]($docs/learning/backend/IModelHost.md)
@@ -1 +1 @@
1
- {"version":3,"file":"IModelHost.d.ts","sourceRoot":"","sources":["../../src/IModelHost.ts"],"names":[],"mappings":"AAIA;;GAEG;AAKH,OAAO,EAAE,cAAc,EAAiB,MAAM,0BAA0B,CAAC;AACzE,OAAO,EAAE,gBAAgB,EAAE,MAAM,2BAA2B,CAAC;AAC7D,OAAO,EAAE,WAAW,EAAU,OAAO,EAAQ,UAAU,EAAkC,OAAO,EAAmB,MAAM,qBAAqB,CAAC;AAC/I,OAAO,EAAE,mBAAmB,EAA8B,YAAY,EAAE,YAAY,EAAE,MAAM,oBAAoB,CAAC;AACjH,OAAO,EAAE,gBAAgB,EAAE,MAAM,oBAAoB,CAAC;AAItD,OAAO,EAAoB,2BAA2B,EAAE,mBAAmB,EAAE,wBAAwB,EAAE,MAAM,uBAAuB,CAAC;AAUrI,OAAO,EAAkB,SAAS,EAAE,aAAa,EAAE,MAAM,uBAAuB,CAAC;AAQjF,aAAa;AACb,MAAM,WAAW,iCAAiC;IAChD,IAAI,EAAE,MAAM,CAAC;IACb,KAAK,EAAE,MAAM,CAAC;CACf;AAED;;GAEG;AACH,MAAM,WAAW,oBAAoB;IACnC,8JAA8J;IAC9J,QAAQ,EAAE,MAAM,CAAC;IACjB,sEAAsE;IACtE,aAAa,CAAC,EAAE,MAAM,CAAC;IACvB,wOAAwO;IACxO,gBAAgB,CAAC,EAAE,OAAO,CAAC;IAC3B,sFAAsF;IACtF,mBAAmB,CAAC,EAAE,OAAO,CAAC;IAC9B,0KAA0K;IAC1K,gBAAgB,CAAC,EAAE,OAAO,CAAC;IAC3B,iHAAiH;IACjH,MAAM,CAAC,EAAE,iCAAiC,EAAE,CAAC;IAC7C;;;;;OAKG;IACH,2BAA2B,CAAC,EAAE,MAAM,CAAC;IACrC,iGAAiG;IACjG,eAAe,CAAC,EAAE,OAAO,CAAC;CAC3B;AAED;;GAEG;AACH,qBAAa,uBAAuB;IAElC;;;;;;;;;;;;;OAaG;IACI,QAAQ,CAAC,EAAE,YAAY,CAAC;IAE/B;;OAEG;IACI,SAAS,CAAC,EAAE,aAAa,CAAC;IAEjC,sDAAsD;IAC/C,YAAY,CAAC,EAAE,YAAY,CAAC;IAEnC;;OAEG;IACI,SAAS,CAAC,EAAE,gBAAgB,CAAC;IAEpC;;OAEG;IACI,yBAAyB,CAAC,EAAE,2BAA2B,CAAC;IAE/D;;;;OAIG;IACI,gBAAgB,CAAC,EAAE,mBAAmB,CAAC;IAE9C;;OAEG;IACI,0BAA0B,CAAC,EAAE,OAAO,CAAC;IAE5C;;OAEG;IACI,mBAAmB,CAAC,EAAE,OAAO,CAAC;IAErC;;OAEG;IACI,sBAAsB,SAAqD;IAClF;;OAEG;IACI,yBAAyB,SAAqD;IACrF;;OAEG;IACH,OAAc,yBAAyB,SAAa;IAEpD;;OAEG;IACH,OAAc,+BAA+B,SAAM;IACnD;;OAEG;IACI,wBAAwB,EAAE,MAAM,CAA2D;IAElG;;OAEG;IACH,OAAc,2BAA2B,SAAgB;IACzD;;OAEG;IACI,oBAAoB,EAAE,MAAM,CAAuD;IAE1F;;OAEG;IACI,oBAAoB,CAAC,EAAE,oBAAoB,CAAC;CAEpD;AAkCD;;;GAGG;AACH,qBAAa,UAAU;IACrB,OAAO;IACP,OAAc,mBAAmB,CAAC,EAAE,mBAAmB,CAAC;IAExD,aAAa;IACb,gBAAuB,SAAS,mBAA0B;IAE1D,OAAc,cAAc,SAAM;IAClC,OAAO,CAAC,MAAM,CAAC,SAAS,CAAM;IAC9B,OAAO,CAAC,MAAM,CAAC,aAAa,CAAC,CAAY;IAEzC,OAAO,CAAC,MAAM,CAAC,SAAS,CAAC,CAAwB;IACjD,gBAAgB;IAChB,WAAkB,QAAQ,IAAI,OAAO,cAAc,CAIlD;IAED,OAAc,aAAa,CAAC,EAAE,uBAAuB,CAAC;IACtD,iEAAiE;IACjE,gBAAuB,cAAc,gBAAqB,IAAI,EAAI;IAElE,yEAAyE;IACzE,gBAAuB,gBAAgB,gBAAqB,IAAI,EAAI;IAEpE,gBAAgB;IAChB,gBAAuB,OAAO,EAAE,OAAO,CAAC,YAAY,CAAC,CAAyE;IAE9H,kCAAkC;IAClC,WAAkB,SAAS,IACK,UAAU,CADsB;IAChE,WAAkB,SAAS,CAAC,EAAE,EAAE,UAAU,EAAkC;IAE5E,mJAAmJ;IACnJ,WAAkB,aAAa,IACK,MAAM,CAD8B;IACxE,WAAkB,aAAa,CAAC,EAAE,EAAE,MAAM,EAAsC;IAEhF,qJAAqJ;IACrJ,WAAkB,kBAAkB,IACU,MAAM,CAD8B;IAClF,WAAkB,kBAAkB,CAAC,OAAO,EAAE,MAAM,EAAgD;IAEpG,wDAAwD;IACxD,WAAkB,QAAQ,IAAI,YAAY,CAA2B;IAErE;;;;;OAKG;IACH,WAAkB,YAAY,IAAI,SAAS,CAAgC;IAE3E,wGAAwG;IACxG,OAAc,wBAAwB,CAAC,EAAE,gBAAgB,CAAC;IAE1D;;;;;;OAMG;WACiB,cAAc,IAAI,OAAO,CAAC,WAAW,CAAC;IAQ1D,gBAAgB;WACF,QAAQ;IAGtB,gBAAgB;WACF,UAAU,IAAI,IAAI;IAKhC,OAAO,CAAC,MAAM,CAAC,gBAAgB;IAW/B,OAAO,CAAC,MAAM,CAAC,6BAA6B;IAa5C;;;OAGG;IACH,OAAc,gBAAgB,CAAC,EAAE,mBAAmB,CAAC;IAErD,gBAAgB;IAChB,OAAc,YAAY,CAAC,EAAE,wBAAwB,CAAC;IAEtD,OAAO,CAAC,MAAM,CAAC,UAAU,CAAmB;IAC5C,gBAAgB;WACF,YAAY,CAAC,SAAS,EAAE,gBAAgB;IAEtD;;OAEG;IACH,WAAkB,SAAS,IAAI,gBAAgB,CAA4B;IAE3E,OAAO,CAAC,MAAM,CAAC,QAAQ,CAAS;IAChC,8CAA8C;IAC9C,WAAkB,OAAO,YAA4B;IACrD;;;;OAIG;WACiB,OAAO,CAAC,aAAa,GAAE,uBAAuD,GAAG,OAAO,CAAC,IAAI,CAAC;IA4ElH,OAAO,CAAC,MAAM,CAAC,kBAAkB,CAAe;IAEhD,OAAO,CAAC,MAAM,CAAC,UAAU;IAuBzB,OAAO,CAAC,MAAM,CAAC,aAAa;IAU5B,sGAAsG;WAClF,QAAQ,IAAI,OAAO,CAAC,IAAI,CAAC;IAe7C;;;;;OAKG;WACW,sBAAsB,CAAC,IAAI,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,GAAG,IAAI;IAKvE;;;;OAIG;WACW,yBAAyB,CAAC,IAAI,EAAE,MAAM,GAAG,IAAI;IAK3D;;;OAGG;WACW,wBAAwB,IAAI,iCAAiC,EAAE;IAK7E,0DAA0D;IAC1D,WAAkB,YAAY,IAAI,MAAM,GAAG,SAAS,CAAuG;IAE3J;;OAEG;IACH,WAAkB,sBAAsB,IAAI,MAAM,CAEjD;IACD;;OAEG;IACH,WAAkB,yBAAyB,IAAI,MAAM,CAEpD;IAED,2FAA2F;IAC3F,WAAkB,wBAAwB,IAAI,MAAM,CAAiK;IACrN,4FAA4F;IAC5F,WAAkB,oBAAoB,IAAI,MAAM,CAAyJ;IAEzM;;OAEG;IACH,WAAkB,sBAAsB,IAAI,OAAO,CAElD;IAED;;OAEG;IACH,WAAkB,0BAA0B,IAAI,OAAO,CAA2H;IAElL;;OAEG;IACH,WAAkB,mBAAmB,IAAI,OAAO,CAAoE;IAEpH,OAAO,CAAC,MAAM,CAAC,cAAc;CAmB9B;AAED;;GAEG;AACH,qBAAa,QAAQ;IACnB,oCAAoC;IACpC,WAAkB,YAAY,IAAI,OAAO,GAAG,OAAO,GAAG,QAAQ,GAAG,KAAK,GAAG,SAAS,GAAG,KAAK,CAEzF;IAED,gBAAgB;WACF,IAAI,IAAI,OAAO,cAAc;CAG5C;AAED;;GAEG;AACH,qBAAa,cAAc;IAEzB,iEAAiE;IACjE,WAAkB,eAAe,IAAI,MAAM,CAAqD;IAEhG,8DAA8D;IAC9D,WAAkB,gBAAgB,IAAI,MAAM,CAE3C;IAED,+BAA+B;IAC/B,WAAkB,MAAM,IAAI,MAAM,CAEjC;CACF;AAED;;;;GAIG;AACH,8BAAsB,gBAAgB;IACpC;;;OAGG;IACI,aAAa,CAAC,QAAQ,EAAE,MAAM,GAAG,MAAM,GAAG,SAAS;IAC1D;;;;OAIG;IACI,UAAU,CAAC,OAAO,EAAE,MAAM,GAAG,MAAM;IAO1C;;;OAGG;IACI,kBAAkB,CAAC,UAAU,EAAE,MAAM,GAAG,MAAM,GAAG,SAAS;IACjE;;;;OAIG;IACI,eAAe,CAAC,UAAU,EAAE,MAAM,GAAG,MAAM;CAOnD"}
1
+ {"version":3,"file":"IModelHost.d.ts","sourceRoot":"","sources":["../../src/IModelHost.ts"],"names":[],"mappings":"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"}
@@ -12,7 +12,7 @@ const os = require("os");
12
12
  const path = require("path");
13
13
  const semver = require("semver");
14
14
  const imodeljs_native_1 = require("@bentley/imodeljs-native");
15
- const telemetry_client_1 = require("@bentley/telemetry-client");
15
+ const core_telemetry_1 = require("@itwin/core-telemetry");
16
16
  const core_bentley_1 = require("@itwin/core-bentley");
17
17
  const core_common_1 = require("@itwin/core-common");
18
18
  const BackendLoggerCategory_1 = require("./BackendLoggerCategory");
@@ -191,6 +191,7 @@ class IModelHost {
191
191
  this._isValid = true;
192
192
  if (IModelHost.sessionId === "")
193
193
  IModelHost.sessionId = core_bentley_1.Guid.createValue();
194
+ this.authorizationClient = configuration.authorizationClient;
194
195
  this.logStartup();
195
196
  this.backendVersion = require("../../package.json").version; // eslint-disable-line @typescript-eslint/no-var-requires
196
197
  (0, RpcBackend_1.initializeRpcBackend)();
@@ -375,7 +376,7 @@ class IModelHost {
375
376
  }
376
377
  exports.IModelHost = IModelHost;
377
378
  /** @alpha */
378
- IModelHost.telemetry = new telemetry_client_1.TelemetryManager();
379
+ IModelHost.telemetry = new core_telemetry_1.TelemetryManager();
379
380
  IModelHost.backendVersion = "";
380
381
  IModelHost._cacheDir = "";
381
382
  /** Event raised just after the backend IModelHost was started */
@@ -1 +1 @@
1
- {"version":3,"file":"IModelHost.js","sourceRoot":"","sources":["../../src/IModelHost.ts"],"names":[],"mappings":"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","sourcesContent":["/*---------------------------------------------------------------------------------------------\r\n* Copyright (c) Bentley Systems, Incorporated. All rights reserved.\r\n* See LICENSE.md in the project root for license terms and full copyright notice.\r\n*--------------------------------------------------------------------------------------------*/\r\n/** @packageDocumentation\r\n * @module IModelHost\r\n */\r\n\r\nimport * as os from \"os\";\r\nimport * as path from \"path\";\r\nimport * as semver from \"semver\";\r\nimport { IModelJsNative, NativeLibrary } from \"@bentley/imodeljs-native\";\r\nimport { TelemetryManager } from \"@bentley/telemetry-client\";\r\nimport { AccessToken, assert, BeEvent, Guid, GuidString, IModelStatus, Logger, LogLevel, Mutable, ProcessDetector } from \"@itwin/core-bentley\";\r\nimport { AuthorizationClient, BentleyStatus, IModelError, LocalDirName, SessionProps } from \"@itwin/core-common\";\r\nimport { BackendHubAccess } from \"./BackendHubAccess\";\r\nimport { BackendLoggerCategory } from \"./BackendLoggerCategory\";\r\nimport { BisCoreSchema } from \"./BisCoreSchema\";\r\nimport { BriefcaseManager } from \"./BriefcaseManager\";\r\nimport { AzureBlobStorage, AzureBlobStorageCredentials, CloudStorageService, CloudStorageTileUploader } from \"./CloudStorageBackend\";\r\nimport { FunctionalSchema } from \"./domains/FunctionalSchema\";\r\nimport { GenericSchema } from \"./domains/GenericSchema\";\r\nimport { IModelJsFs } from \"./IModelJsFs\";\r\nimport { DevToolsRpcImpl } from \"./rpc-impl/DevToolsRpcImpl\";\r\nimport { IModelReadRpcImpl } from \"./rpc-impl/IModelReadRpcImpl\";\r\nimport { IModelTileRpcImpl } from \"./rpc-impl/IModelTileRpcImpl\";\r\nimport { SnapshotIModelRpcImpl } from \"./rpc-impl/SnapshotIModelRpcImpl\";\r\nimport { WipRpcImpl } from \"./rpc-impl/WipRpcImpl\";\r\nimport { initializeRpcBackend } from \"./RpcBackend\";\r\nimport { ITwinWorkspace, Workspace, WorkspaceOpts } from \"./workspace/Workspace\";\r\nimport { BaseSettings, SettingDictionary, SettingsPriority } from \"./workspace/Settings\";\r\nimport { SettingsSpecRegistry } from \"./workspace/SettingsSpecRegistry\";\r\n\r\nconst loggerCategory = BackendLoggerCategory.IModelHost;\r\n\r\n// cspell:ignore nodereport fatalerror apicall alicloud rpcs\r\n\r\n/** @alpha */\r\nexport interface CrashReportingConfigNameValuePair {\r\n name: string;\r\n value: string;\r\n}\r\n\r\n/** Configuration of the crash-reporting system.\r\n * @alpha\r\n */\r\nexport interface CrashReportingConfig {\r\n /** The directory to which *.dmp and/or iModelJsNativeCrash*.properties.txt files are written. This directory will be created if it does not already exist. */\r\n crashDir: string;\r\n /** max # .dmp files that may exist in crashDir. The default is 50. */\r\n maxDumpsInDir?: number;\r\n /** Enable crash-dumps? If so, .dmp and .properties.txt files will be generated and written to crashDir in the event of an unhandled native-code exception. If not, only .properties.txt files will be written. The default is false. */\r\n enableCrashDumps?: boolean;\r\n /** If enableCrashDumps is true, do you want a full-memory dump? Defaults to false. */\r\n wantFullMemoryDumps?: boolean;\r\n /** Enable node-report? If so, node-report files will be generated in the event of an unhandled exception or fatal error and written to crashDir. The default is false. */\r\n enableNodeReport?: boolean;\r\n /** Additional name, value pairs to write to iModelJsNativeCrash*.properties.txt file in the event of a crash. */\r\n params?: CrashReportingConfigNameValuePair[];\r\n /** Run this .js file to process .dmp and node-report files in the event of a crash.\r\n * This script will be executed with a single command-line parameter: the name of the dump or node-report file.\r\n * In the case of a dump file, there will be a second file with the same basename and the extension \".properties.txt\".\r\n * Since it runs in a separate process, this script will have no access to the Javascript\r\n * context of the exiting backend. No default.\r\n */\r\n dumpProcessorScriptFileName?: string;\r\n /** Upload crash dump and node-reports to Bentley's crash-reporting service? Defaults to false */\r\n uploadToBentley?: boolean;\r\n}\r\n\r\n/** Configuration of core-backend.\r\n * @public\r\n */\r\nexport class IModelHostConfiguration {\r\n\r\n /**\r\n * Root of the directory holding all the files that iModel.js caches\r\n * - If not specified at startup a platform specific default is used -\r\n * - Windows: $(HOMEDIR)/AppData/Local/iModelJs/\r\n * - Mac/iOS: $(HOMEDIR)/Library/Caches/iModelJs/\r\n * - Linux: $(HOMEDIR)/.cache/iModelJs/\r\n * where $(HOMEDIR) is documented [here](https://nodejs.org/api/os.html#os_os_homedir)\r\n * - if specified, ensure it is set to a folder with read/write access.\r\n * - Sub-folders within this folder organize various caches -\r\n * - bc/ -> Briefcases\r\n * - appSettings/ -> Offline application settings (only relevant in native applications)\r\n * - etc.\r\n * @see [[IModelHost.cacheDir]] for the value it's set to after startup\r\n */\r\n public cacheDir?: LocalDirName;\r\n\r\n /** Options for creating the [[Workspace]]\r\n * @beta\r\n */\r\n public workspace?: WorkspaceOpts;\r\n\r\n /** The directory where the app's assets are found. */\r\n public appAssetsDir?: LocalDirName;\r\n\r\n /** The kind of iModel hub server to use.\r\n * @beta\r\n */\r\n public hubAccess?: BackendHubAccess;\r\n\r\n /** The Azure blob storage credentials to use for the tile cache service. If omitted and no external service implementation is provided, a local cache will be used.\r\n * @beta\r\n */\r\n public tileCacheAzureCredentials?: AzureBlobStorageCredentials;\r\n\r\n /**\r\n * @beta\r\n * @note A reference implementation is set for [[AzureBlobStorage]] if [[tileCacheAzureCredentials]] property is set. To supply a different implementation for any service provider (such as AWS),\r\n * set this property with a custom [[CloudStorageService]].\r\n */\r\n public tileCacheService?: CloudStorageService;\r\n\r\n /** Whether to restrict tile cache URLs by client IP address (if available).\r\n * @beta\r\n */\r\n public restrictTileUrlsByClientIp?: boolean;\r\n\r\n /** Whether to compress cached tiles.\r\n * Defaults to `true`.\r\n */\r\n public compressCachedTiles?: boolean;\r\n\r\n /** The time, in milliseconds, for which [IModelTileRpcInterface.requestTileTreeProps]($common) should wait before returning a \"pending\" status.\r\n * @internal\r\n */\r\n public tileTreeRequestTimeout = IModelHostConfiguration.defaultTileRequestTimeout;\r\n /** The time, in milliseconds, for which [IModelTileRpcInterface.requestTileContent]($common) should wait before returning a \"pending\" status.\r\n * @internal\r\n */\r\n public tileContentRequestTimeout = IModelHostConfiguration.defaultTileRequestTimeout;\r\n /** The default time, in milliseconds, used for [[tileTreeRequestTimeout]] and [[tileContentRequestTimeout]]. To change this, override one or both of those properties.\r\n * @internal\r\n */\r\n public static defaultTileRequestTimeout = 20 * 1000;\r\n\r\n /** The default time, in seconds, used for [[logTileLoadTimeThreshold]]. To change this, override that property.\r\n * @internal\r\n */\r\n public static defaultLogTileLoadTimeThreshold = 40;\r\n /** The backend will log when a tile took longer to load than this threshold in seconds.\r\n * @internal\r\n */\r\n public logTileLoadTimeThreshold: number = IModelHostConfiguration.defaultLogTileLoadTimeThreshold;\r\n\r\n /** The default size, in bytes, used for [[logTileSizeThreshold]]. To change this, override that property.\r\n * @internal\r\n */\r\n public static defaultLogTileSizeThreshold = 20 * 1000000;\r\n /** The backend will log when a tile is loaded with a size in bytes above this threshold.\r\n * @internal\r\n */\r\n public logTileSizeThreshold: number = IModelHostConfiguration.defaultLogTileSizeThreshold;\r\n\r\n /** Crash-reporting configuration\r\n * @alpha\r\n */\r\n public crashReportingConfig?: CrashReportingConfig;\r\n\r\n}\r\n\r\n/**\r\n * Settings for the application workspace.\r\n * @note this includes the default dictionary from the SettingsSpecRegistry\r\n */\r\nclass ApplicationSettings extends BaseSettings {\r\n private _remove?: VoidFunction;\r\n protected override verifyPriority(priority: SettingsPriority) {\r\n if (priority >= SettingsPriority.iModel) // iModel settings may not appear in ApplicationSettings\r\n throw new Error(\"Use IModelSettings\");\r\n }\r\n private updateDefaults() {\r\n const defaults: SettingDictionary = {};\r\n for (const [specName, val] of SettingsSpecRegistry.allSpecs) {\r\n if (val.default)\r\n defaults[specName] = val.default;\r\n }\r\n this.addDictionary(\"_default_\", 0, defaults);\r\n }\r\n\r\n public constructor() {\r\n super();\r\n this._remove = SettingsSpecRegistry.onSpecsChanged.addListener(() => this.updateDefaults());\r\n this.updateDefaults();\r\n }\r\n public override close() {\r\n if (this._remove) {\r\n this._remove();\r\n this._remove = undefined;\r\n }\r\n }\r\n}\r\n\r\n/** IModelHost initializes ($backend) and captures its configuration. A backend must call [[IModelHost.startup]] before using any backend classes.\r\n * See [the learning article]($docs/learning/backend/IModelHost.md)\r\n * @public\r\n */\r\nexport class IModelHost {\r\n private constructor() { }\r\n public static authorizationClient?: AuthorizationClient;\r\n\r\n /** @alpha */\r\n public static readonly telemetry = new TelemetryManager();\r\n\r\n public static backendVersion = \"\";\r\n private static _cacheDir = \"\";\r\n private static _appWorkspace?: Workspace;\r\n\r\n private static _platform?: typeof IModelJsNative;\r\n /** @internal */\r\n public static get platform(): typeof IModelJsNative {\r\n if (this._platform === undefined)\r\n throw new Error(\"IModelHost.startup must be called first\");\r\n return this._platform;\r\n }\r\n\r\n public static configuration?: IModelHostConfiguration;\r\n /** Event raised just after the backend IModelHost was started */\r\n public static readonly onAfterStartup = new BeEvent<() => void>();\r\n\r\n /** Event raised just before the backend IModelHost is to be shut down */\r\n public static readonly onBeforeShutdown = new BeEvent<() => void>();\r\n\r\n /** @internal */\r\n public static readonly session: Mutable<SessionProps> = { applicationId: \"2686\", applicationVersion: \"1.0.0\", sessionId: \"\" };\r\n\r\n /** A uniqueId for this session */\r\n public static get sessionId() { return this.session.sessionId; }\r\n public static set sessionId(id: GuidString) { this.session.sessionId = id; }\r\n\r\n /** The Id of this application - needs to be set only if it is an agent application. The applicationId will otherwise originate at the frontend. */\r\n public static get applicationId() { return this.session.applicationId; }\r\n public static set applicationId(id: string) { this.session.applicationId = id; }\r\n\r\n /** The version of this application - needs to be set if is an agent application. The applicationVersion will otherwise originate at the frontend. */\r\n public static get applicationVersion() { return this.session.applicationVersion; }\r\n public static set applicationVersion(version: string) { this.session.applicationVersion = version; }\r\n\r\n /** Root directory holding files that iTwin.js caches */\r\n public static get cacheDir(): LocalDirName { return this._cacheDir; }\r\n\r\n /** The application [[Workspace]] for this `IModelHost`\r\n * @note this `Workspace` only holds [[WorkspaceContainer]]s and [[Settings]] scoped to the currently loaded application(s).\r\n * All organization, iTwin, and iModel based containers or settings must be accessed through [[IModelDb.workspace]] and\r\n * attempting to add them to this Workspace will fail.\r\n * @beta\r\n */\r\n public static get appWorkspace(): Workspace { return this._appWorkspace!; } // eslint-disable-line @typescript-eslint/no-non-null-assertion\r\n\r\n /** The optional [[FileNameResolver]] that resolves keys and partial file names for snapshot iModels. */\r\n public static snapshotFileNameResolver?: FileNameResolver;\r\n\r\n /** Get the current access token for this IModelHost, or a blank string if none is available.\r\n * @note for web backends, this will *always* return a blank string because the backend itself has no token (but never needs one either.)\r\n * For all IpcHosts, where this backend is servicing a single frontend, this will be the user's token. For ElectronHost, the backend\r\n * obtains the token and forwards it to the frontend.\r\n * @note accessTokens expire periodically and are automatically refreshed, if possible. Therefore tokens should not be saved, and the value\r\n * returned by this method may change over time throughout the course of a session.\r\n */\r\n public static async getAccessToken(): Promise<AccessToken> {\r\n try {\r\n return (await this.authorizationClient?.getAccessToken()) ?? \"\";\r\n } catch (e) {\r\n return \"\";\r\n }\r\n }\r\n\r\n /** @internal */\r\n public static flushLog() {\r\n return this.platform.DgnDb.flushLog();\r\n }\r\n /** @internal */\r\n public static loadNative(): void {\r\n const platform = Platform.load();\r\n this.registerPlatform(platform);\r\n }\r\n\r\n private static registerPlatform(platform: typeof IModelJsNative): void {\r\n this._platform = platform;\r\n if (undefined === platform)\r\n return;\r\n\r\n if (!ProcessDetector.isMobileAppBackend)\r\n this.validateNativePlatformVersion();\r\n\r\n platform.logger = Logger;\r\n }\r\n\r\n private static validateNativePlatformVersion(): void {\r\n const requiredVersion = require(\"../../package.json\").dependencies[\"@bentley/imodeljs-native\"]; // eslint-disable-line @typescript-eslint/no-var-requires\r\n const thisVersion = this.platform.version;\r\n if (semver.satisfies(thisVersion, requiredVersion))\r\n return;\r\n if (IModelJsFs.existsSync(path.join(__dirname, \"DevBuild.txt\"))) {\r\n console.log(\"Bypassing version checks for development build\"); // eslint-disable-line no-console\r\n return;\r\n }\r\n this._platform = undefined;\r\n throw new IModelError(IModelStatus.BadRequest, `imodeljs-native version is (${thisVersion}). core-backend requires version (${requiredVersion})`);\r\n }\r\n\r\n /**\r\n * @internal\r\n * @note Use [[IModelHostConfiguration.tileCacheService]] to set the service provider.\r\n */\r\n public static tileCacheService?: CloudStorageService;\r\n\r\n /** @internal */\r\n public static tileUploader?: CloudStorageTileUploader;\r\n\r\n private static _hubAccess: BackendHubAccess;\r\n /** @internal */\r\n public static setHubAccess(hubAccess: BackendHubAccess) { this._hubAccess = hubAccess; }\r\n\r\n /** Provides access to the IModelHub for this IModelHost\r\n * @beta\r\n */\r\n public static get hubAccess(): BackendHubAccess { return this._hubAccess; }\r\n\r\n private static _isValid = false;\r\n /** Returns true if IModelHost is started. */\r\n public static get isValid() { return this._isValid; }\r\n /** This method must be called before any iModel.js services are used.\r\n * @param configuration Host configuration data.\r\n * Raises [[onAfterStartup]].\r\n * @see [[shutdown]].\r\n */\r\n public static async startup(configuration: IModelHostConfiguration = new IModelHostConfiguration()): Promise<void> {\r\n if (this._isValid)\r\n return; // we're already initialized\r\n this._isValid = true;\r\n\r\n if (IModelHost.sessionId === \"\")\r\n IModelHost.sessionId = Guid.createValue();\r\n\r\n this.logStartup();\r\n\r\n this.backendVersion = require(\"../../package.json\").version; // eslint-disable-line @typescript-eslint/no-var-requires\r\n initializeRpcBackend();\r\n\r\n if (this._platform === undefined) {\r\n try {\r\n this.loadNative();\r\n } catch (error) {\r\n Logger.logError(loggerCategory, \"Error registering/loading the native platform API\", () => (configuration));\r\n throw error;\r\n }\r\n }\r\n\r\n if (configuration.crashReportingConfig && configuration.crashReportingConfig.crashDir && !ProcessDetector.isElectronAppBackend && !ProcessDetector.isMobileAppBackend) {\r\n this.platform.setCrashReporting(configuration.crashReportingConfig);\r\n\r\n Logger.logTrace(loggerCategory, \"Configured crash reporting\", () => ({\r\n enableCrashDumps: configuration.crashReportingConfig?.enableCrashDumps,\r\n wantFullMemoryDumps: configuration.crashReportingConfig?.wantFullMemoryDumps,\r\n enableNodeReport: configuration.crashReportingConfig?.enableNodeReport,\r\n uploadToBentley: configuration.crashReportingConfig?.uploadToBentley,\r\n }));\r\n\r\n if (configuration.crashReportingConfig.enableNodeReport) {\r\n try {\r\n // node-report reports on V8 fatal errors and unhandled exceptions/Promise rejections.\r\n const nodereport = require(\"node-report/api\"); // eslint-disable-line @typescript-eslint/no-var-requires\r\n nodereport.setEvents(\"exception+fatalerror+apicall\");\r\n nodereport.setDirectory(configuration.crashReportingConfig.crashDir);\r\n nodereport.setVerbose(\"yes\");\r\n Logger.logTrace(loggerCategory, \"Configured native crash reporting (node-report)\");\r\n } catch (err) {\r\n Logger.logWarning(loggerCategory, \"node-report is not installed.\");\r\n }\r\n }\r\n }\r\n\r\n this.setupHostDirs(configuration);\r\n this._appWorkspace = new ITwinWorkspace(new ApplicationSettings(), configuration.workspace);\r\n\r\n BriefcaseManager.initialize(this._briefcaseCacheDir);\r\n\r\n [\r\n IModelReadRpcImpl,\r\n IModelTileRpcImpl,\r\n SnapshotIModelRpcImpl,\r\n WipRpcImpl,\r\n DevToolsRpcImpl,\r\n ].forEach((rpc) => rpc.register()); // register all of the RPC implementations\r\n\r\n [\r\n BisCoreSchema,\r\n GenericSchema,\r\n FunctionalSchema,\r\n ].forEach((schema) => schema.registerSchema()); // register all of the schemas\r\n\r\n if (undefined !== configuration.hubAccess)\r\n IModelHost._hubAccess = configuration.hubAccess;\r\n IModelHost.configuration = configuration;\r\n IModelHost.setupTileCache();\r\n\r\n this.platform.setUseTileCache(IModelHost.tileCacheService ? false : true);\r\n\r\n process.once(\"beforeExit\", IModelHost.shutdown);\r\n IModelHost.onAfterStartup.raiseEvent();\r\n }\r\n\r\n private static _briefcaseCacheDir: LocalDirName;\r\n\r\n private static logStartup() {\r\n if (!Logger.isEnabled(loggerCategory, LogLevel.Trace))\r\n return;\r\n\r\n // Extract the iModel details from environment - note this is very specific to Bentley hosted backends, but is quite useful for tracing\r\n let startupInfo: any = {};\r\n const serviceName = process.env.FABRIC_SERVICE_NAME;\r\n if (serviceName) {\r\n // e.g., fabric:/iModelWebViewer3.0/iModelJSGuest/1/08daaeb3-b56f-480b-9051-7efc834d18ae/512d971d-b641-4735-bb1c-c07ab3e44ce7/c1315fcce125ca40b2d405bb7809214daf8b4c85\r\n const serviceNameComponents = serviceName.split(\"/\");\r\n if (serviceNameComponents.length === 7) {\r\n startupInfo = {\r\n ...startupInfo,\r\n iTwinId: serviceNameComponents[4],\r\n iModelId: serviceNameComponents[5],\r\n changesetId: serviceNameComponents[6],\r\n };\r\n }\r\n }\r\n\r\n Logger.logTrace(loggerCategory, \"IModelHost.startup\", () => startupInfo);\r\n }\r\n\r\n private static setupHostDirs(configuration: IModelHostConfiguration) {\r\n const setupDir = (dir: LocalDirName) => {\r\n dir = path.normalize(dir);\r\n IModelJsFs.recursiveMkDirSync(dir);\r\n return dir;\r\n };\r\n this._cacheDir = setupDir(configuration.cacheDir ?? NativeLibrary.defaultCacheDir);\r\n this._briefcaseCacheDir = path.join(this._cacheDir, \"imodels\");\r\n }\r\n\r\n /** This method must be called when an iModel.js services is shut down. Raises [[onBeforeShutdown]] */\r\n public static async shutdown(): Promise<void> {\r\n // NB: This method is set as a node listener where `this` is unbound\r\n if (!IModelHost._isValid)\r\n return;\r\n\r\n IModelHost._isValid = false;\r\n IModelHost.onBeforeShutdown.raiseEvent();\r\n IModelHost.configuration = undefined;\r\n IModelHost.tileCacheService = undefined;\r\n IModelHost.tileUploader = undefined;\r\n IModelHost.appWorkspace.close();\r\n IModelHost._appWorkspace = undefined;\r\n process.removeListener(\"beforeExit\", IModelHost.shutdown);\r\n }\r\n\r\n /**\r\n * Add or update a property that should be included in a crash report.\r\n * @param name The name of the property\r\n * @param value The value of the property\r\n * @alpha\r\n */\r\n public static setCrashReportProperty(name: string, value: string): void {\r\n assert(undefined !== this._platform);\r\n this._platform.setCrashReportProperty(name, value);\r\n }\r\n\r\n /**\r\n * Remove a previously defined property so that will not be included in a crash report.\r\n * @param name The name of the property\r\n * @alpha\r\n */\r\n public static removeCrashReportProperty(name: string): void {\r\n assert(undefined !== this._platform);\r\n this._platform.setCrashReportProperty(name, undefined);\r\n }\r\n\r\n /**\r\n * Get all properties that will be included in a crash report.\r\n * @alpha\r\n */\r\n public static getCrashReportProperties(): CrashReportingConfigNameValuePair[] {\r\n assert(undefined !== this._platform);\r\n return this._platform.getCrashReportProperties();\r\n }\r\n\r\n /** The directory where application assets may be found */\r\n public static get appAssetsDir(): string | undefined { return undefined !== IModelHost.configuration ? IModelHost.configuration.appAssetsDir : undefined; }\r\n\r\n /** The time, in milliseconds, for which [IModelTileRpcInterface.requestTileTreeProps]($common) should wait before returning a \"pending\" status.\r\n * @internal\r\n */\r\n public static get tileTreeRequestTimeout(): number {\r\n return undefined !== IModelHost.configuration ? IModelHost.configuration.tileTreeRequestTimeout : IModelHostConfiguration.defaultTileRequestTimeout;\r\n }\r\n /** The time, in milliseconds, for which [IModelTileRpcInterface.requestTileContent]($common) should wait before returning a \"pending\" status.\r\n * @internal\r\n */\r\n public static get tileContentRequestTimeout(): number {\r\n return undefined !== IModelHost.configuration ? IModelHost.configuration.tileContentRequestTimeout : IModelHostConfiguration.defaultTileRequestTimeout;\r\n }\r\n\r\n /** The backend will log when a tile took longer to load than this threshold in seconds. */\r\n public static get logTileLoadTimeThreshold(): number { return undefined !== IModelHost.configuration ? IModelHost.configuration.logTileLoadTimeThreshold : IModelHostConfiguration.defaultLogTileLoadTimeThreshold; }\r\n /** The backend will log when a tile is loaded with a size in bytes above this threshold. */\r\n public static get logTileSizeThreshold(): number { return undefined !== IModelHost.configuration ? IModelHost.configuration.logTileSizeThreshold : IModelHostConfiguration.defaultLogTileSizeThreshold; }\r\n\r\n /** Whether external tile caching is active.\r\n * @internal\r\n */\r\n public static get usingExternalTileCache(): boolean {\r\n return undefined !== IModelHost.tileCacheService;\r\n }\r\n\r\n /** Whether to restrict tile cache URLs by client IP address.\r\n * @internal\r\n */\r\n public static get restrictTileUrlsByClientIp(): boolean { return undefined !== IModelHost.configuration && (IModelHost.configuration.restrictTileUrlsByClientIp ? true : false); }\r\n\r\n /** Whether to compress cached tiles.\r\n * @internal\r\n */\r\n public static get compressCachedTiles(): boolean { return false !== IModelHost.configuration?.compressCachedTiles; }\r\n\r\n private static setupTileCache() {\r\n assert(undefined !== IModelHost.configuration);\r\n const config = IModelHost.configuration;\r\n const service = config.tileCacheService;\r\n const credentials = config.tileCacheAzureCredentials;\r\n\r\n if (!service && !credentials)\r\n return;\r\n\r\n IModelHost.tileUploader = new CloudStorageTileUploader();\r\n\r\n if (credentials && !service) {\r\n IModelHost.tileCacheService = new AzureBlobStorage(credentials);\r\n } else if (!credentials && service) {\r\n IModelHost.tileCacheService = service;\r\n } else {\r\n throw new IModelError(BentleyStatus.ERROR, \"Cannot use both Azure and custom cloud storage providers for tile cache.\");\r\n }\r\n }\r\n}\r\n\r\n/** Information about the platform on which the app is running. Also see [[KnownLocations]] and [[IModelJsFs]].\r\n * @public\r\n */\r\nexport class Platform {\r\n /** Get the name of the platform. */\r\n public static get platformName(): \"win32\" | \"linux\" | \"darwin\" | \"ios\" | \"android\" | \"uwp\" {\r\n return process.platform as any;\r\n }\r\n\r\n /** @internal */\r\n public static load(): typeof IModelJsNative {\r\n return ProcessDetector.isMobileAppBackend ? (process as any)._linkedBinding(\"iModelJsNative\") : NativeLibrary.load();\r\n }\r\n}\r\n\r\n/** Well known directories that may be used by the application. Also see [[Platform]]\r\n * @public\r\n */\r\nexport class KnownLocations {\r\n\r\n /** The directory where the imodeljs-native assets are stored. */\r\n public static get nativeAssetsDir(): string { return IModelHost.platform.DgnDb.getAssetsDir(); }\r\n\r\n /** The directory where the core-backend assets are stored. */\r\n public static get packageAssetsDir(): string {\r\n return path.join(__dirname, \"assets\");\r\n }\r\n\r\n /** The temporary directory. */\r\n public static get tmpdir(): string {\r\n return os.tmpdir();\r\n }\r\n}\r\n\r\n/** Extend this class to provide custom file name resolution behavior.\r\n * @note Only `tryResolveKey` and/or `tryResolveFileName` need to be overridden as the implementations of `resolveKey` and `resolveFileName` work for most purposes.\r\n * @see [[IModelHost.snapshotFileNameResolver]]\r\n * @public\r\n */\r\nexport abstract class FileNameResolver {\r\n /** Resolve a file name from the specified key.\r\n * @param _fileKey The key that identifies the file name in a `Map` or other similar data structure.\r\n * @returns The resolved file name or `undefined` if not found.\r\n */\r\n public tryResolveKey(_fileKey: string): string | undefined { return undefined; }\r\n /** Resolve a file name from the specified key.\r\n * @param fileKey The key that identifies the file name in a `Map` or other similar data structure.\r\n * @returns The resolved file name.\r\n * @throws [[IModelError]] if not found.\r\n */\r\n public resolveKey(fileKey: string): string {\r\n const resolvedFileName: string | undefined = this.tryResolveKey(fileKey);\r\n if (undefined === resolvedFileName) {\r\n throw new IModelError(IModelStatus.NotFound, `${fileKey} not resolved`);\r\n }\r\n return resolvedFileName;\r\n }\r\n /** Resolve the input file name, which may be a partial name, into a full path file name.\r\n * @param inFileName The partial file name.\r\n * @returns The resolved full path file name or `undefined` if not found.\r\n */\r\n public tryResolveFileName(inFileName: string): string | undefined { return inFileName; }\r\n /** Resolve the input file name, which may be a partial name, into a full path file name.\r\n * @param inFileName The partial file name.\r\n * @returns The resolved full path file name.\r\n * @throws [[IModelError]] if not found.\r\n */\r\n public resolveFileName(inFileName: string): string {\r\n const resolvedFileName: string | undefined = this.tryResolveFileName(inFileName);\r\n if (undefined === resolvedFileName) {\r\n throw new IModelError(IModelStatus.NotFound, `${inFileName} not resolved`);\r\n }\r\n return resolvedFileName;\r\n }\r\n}\r\n"]}
1
+ {"version":3,"file":"IModelHost.js","sourceRoot":"","sources":["../../src/IModelHost.ts"],"names":[],"mappings":"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","sourcesContent":["/*---------------------------------------------------------------------------------------------\r\n* Copyright (c) Bentley Systems, Incorporated. All rights reserved.\r\n* See LICENSE.md in the project root for license terms and full copyright notice.\r\n*--------------------------------------------------------------------------------------------*/\r\n/** @packageDocumentation\r\n * @module IModelHost\r\n */\r\n\r\nimport * as os from \"os\";\r\nimport * as path from \"path\";\r\nimport * as semver from \"semver\";\r\nimport { IModelJsNative, NativeLibrary } from \"@bentley/imodeljs-native\";\r\nimport { TelemetryManager } from \"@itwin/core-telemetry\";\r\nimport { AccessToken, assert, BeEvent, Guid, GuidString, IModelStatus, Logger, LogLevel, Mutable, ProcessDetector } from \"@itwin/core-bentley\";\r\nimport { AuthorizationClient, BentleyStatus, IModelError, LocalDirName, SessionProps } from \"@itwin/core-common\";\r\nimport { BackendHubAccess } from \"./BackendHubAccess\";\r\nimport { BackendLoggerCategory } from \"./BackendLoggerCategory\";\r\nimport { BisCoreSchema } from \"./BisCoreSchema\";\r\nimport { BriefcaseManager } from \"./BriefcaseManager\";\r\nimport { AzureBlobStorage, AzureBlobStorageCredentials, CloudStorageService, CloudStorageTileUploader } from \"./CloudStorageBackend\";\r\nimport { FunctionalSchema } from \"./domains/FunctionalSchema\";\r\nimport { GenericSchema } from \"./domains/GenericSchema\";\r\nimport { IModelJsFs } from \"./IModelJsFs\";\r\nimport { DevToolsRpcImpl } from \"./rpc-impl/DevToolsRpcImpl\";\r\nimport { IModelReadRpcImpl } from \"./rpc-impl/IModelReadRpcImpl\";\r\nimport { IModelTileRpcImpl } from \"./rpc-impl/IModelTileRpcImpl\";\r\nimport { SnapshotIModelRpcImpl } from \"./rpc-impl/SnapshotIModelRpcImpl\";\r\nimport { WipRpcImpl } from \"./rpc-impl/WipRpcImpl\";\r\nimport { initializeRpcBackend } from \"./RpcBackend\";\r\nimport { ITwinWorkspace, Workspace, WorkspaceOpts } from \"./workspace/Workspace\";\r\nimport { BaseSettings, SettingDictionary, SettingsPriority } from \"./workspace/Settings\";\r\nimport { SettingsSpecRegistry } from \"./workspace/SettingsSpecRegistry\";\r\n\r\nconst loggerCategory = BackendLoggerCategory.IModelHost;\r\n\r\n// cspell:ignore nodereport fatalerror apicall alicloud rpcs\r\n\r\n/** @alpha */\r\nexport interface CrashReportingConfigNameValuePair {\r\n name: string;\r\n value: string;\r\n}\r\n\r\n/** Configuration of the crash-reporting system.\r\n * @alpha\r\n */\r\nexport interface CrashReportingConfig {\r\n /** The directory to which *.dmp and/or iModelJsNativeCrash*.properties.txt files are written. This directory will be created if it does not already exist. */\r\n crashDir: string;\r\n /** max # .dmp files that may exist in crashDir. The default is 50. */\r\n maxDumpsInDir?: number;\r\n /** Enable crash-dumps? If so, .dmp and .properties.txt files will be generated and written to crashDir in the event of an unhandled native-code exception. If not, only .properties.txt files will be written. The default is false. */\r\n enableCrashDumps?: boolean;\r\n /** If enableCrashDumps is true, do you want a full-memory dump? Defaults to false. */\r\n wantFullMemoryDumps?: boolean;\r\n /** Enable node-report? If so, node-report files will be generated in the event of an unhandled exception or fatal error and written to crashDir. The default is false. */\r\n enableNodeReport?: boolean;\r\n /** Additional name, value pairs to write to iModelJsNativeCrash*.properties.txt file in the event of a crash. */\r\n params?: CrashReportingConfigNameValuePair[];\r\n /** Run this .js file to process .dmp and node-report files in the event of a crash.\r\n * This script will be executed with a single command-line parameter: the name of the dump or node-report file.\r\n * In the case of a dump file, there will be a second file with the same basename and the extension \".properties.txt\".\r\n * Since it runs in a separate process, this script will have no access to the Javascript\r\n * context of the exiting backend. No default.\r\n */\r\n dumpProcessorScriptFileName?: string;\r\n /** Upload crash dump and node-reports to Bentley's crash-reporting service? Defaults to false */\r\n uploadToBentley?: boolean;\r\n}\r\n\r\n/** Configuration of core-backend.\r\n * @public\r\n */\r\nexport class IModelHostConfiguration {\r\n\r\n /**\r\n * Root of the directory holding all the files that iModel.js caches\r\n * - If not specified at startup a platform specific default is used -\r\n * - Windows: $(HOMEDIR)/AppData/Local/iModelJs/\r\n * - Mac/iOS: $(HOMEDIR)/Library/Caches/iModelJs/\r\n * - Linux: $(HOMEDIR)/.cache/iModelJs/\r\n * where $(HOMEDIR) is documented [here](https://nodejs.org/api/os.html#os_os_homedir)\r\n * - if specified, ensure it is set to a folder with read/write access.\r\n * - Sub-folders within this folder organize various caches -\r\n * - bc/ -> Briefcases\r\n * - appSettings/ -> Offline application settings (only relevant in native applications)\r\n * - etc.\r\n * @see [[IModelHost.cacheDir]] for the value it's set to after startup\r\n */\r\n public cacheDir?: LocalDirName;\r\n\r\n /** Options for creating the [[Workspace]]\r\n * @beta\r\n */\r\n public workspace?: WorkspaceOpts;\r\n\r\n /** The directory where the app's assets are found. */\r\n public appAssetsDir?: LocalDirName;\r\n\r\n /** The kind of iModel hub server to use.\r\n * @beta\r\n */\r\n public hubAccess?: BackendHubAccess;\r\n\r\n /** The Azure blob storage credentials to use for the tile cache service. If omitted and no external service implementation is provided, a local cache will be used.\r\n * @beta\r\n */\r\n public tileCacheAzureCredentials?: AzureBlobStorageCredentials;\r\n\r\n /**\r\n * @beta\r\n * @note A reference implementation is set for [[AzureBlobStorage]] if [[tileCacheAzureCredentials]] property is set. To supply a different implementation for any service provider (such as AWS),\r\n * set this property with a custom [[CloudStorageService]].\r\n */\r\n public tileCacheService?: CloudStorageService;\r\n\r\n /** Whether to restrict tile cache URLs by client IP address (if available).\r\n * @beta\r\n */\r\n public restrictTileUrlsByClientIp?: boolean;\r\n\r\n /** Whether to compress cached tiles.\r\n * Defaults to `true`.\r\n */\r\n public compressCachedTiles?: boolean;\r\n\r\n /** The time, in milliseconds, for which [IModelTileRpcInterface.requestTileTreeProps]($common) should wait before returning a \"pending\" status.\r\n * @internal\r\n */\r\n public tileTreeRequestTimeout = IModelHostConfiguration.defaultTileRequestTimeout;\r\n /** The time, in milliseconds, for which [IModelTileRpcInterface.requestTileContent]($common) should wait before returning a \"pending\" status.\r\n * @internal\r\n */\r\n public tileContentRequestTimeout = IModelHostConfiguration.defaultTileRequestTimeout;\r\n /** The default time, in milliseconds, used for [[tileTreeRequestTimeout]] and [[tileContentRequestTimeout]]. To change this, override one or both of those properties.\r\n * @internal\r\n */\r\n public static defaultTileRequestTimeout = 20 * 1000;\r\n\r\n /** The default time, in seconds, used for [[logTileLoadTimeThreshold]]. To change this, override that property.\r\n * @internal\r\n */\r\n public static defaultLogTileLoadTimeThreshold = 40;\r\n /** The backend will log when a tile took longer to load than this threshold in seconds.\r\n * @internal\r\n */\r\n public logTileLoadTimeThreshold: number = IModelHostConfiguration.defaultLogTileLoadTimeThreshold;\r\n\r\n /** The default size, in bytes, used for [[logTileSizeThreshold]]. To change this, override that property.\r\n * @internal\r\n */\r\n public static defaultLogTileSizeThreshold = 20 * 1000000;\r\n /** The backend will log when a tile is loaded with a size in bytes above this threshold.\r\n * @internal\r\n */\r\n public logTileSizeThreshold: number = IModelHostConfiguration.defaultLogTileSizeThreshold;\r\n\r\n /** Crash-reporting configuration\r\n * @alpha\r\n */\r\n public crashReportingConfig?: CrashReportingConfig;\r\n\r\n /** The AuthorizationClient used to get accessTokens\r\n * @beta\r\n */\r\n public authorizationClient?: AuthorizationClient;\r\n}\r\n\r\n/**\r\n * Settings for the application workspace.\r\n * @note this includes the default dictionary from the SettingsSpecRegistry\r\n */\r\nclass ApplicationSettings extends BaseSettings {\r\n private _remove?: VoidFunction;\r\n protected override verifyPriority(priority: SettingsPriority) {\r\n if (priority >= SettingsPriority.iModel) // iModel settings may not appear in ApplicationSettings\r\n throw new Error(\"Use IModelSettings\");\r\n }\r\n private updateDefaults() {\r\n const defaults: SettingDictionary = {};\r\n for (const [specName, val] of SettingsSpecRegistry.allSpecs) {\r\n if (val.default)\r\n defaults[specName] = val.default;\r\n }\r\n this.addDictionary(\"_default_\", 0, defaults);\r\n }\r\n\r\n public constructor() {\r\n super();\r\n this._remove = SettingsSpecRegistry.onSpecsChanged.addListener(() => this.updateDefaults());\r\n this.updateDefaults();\r\n }\r\n public override close() {\r\n if (this._remove) {\r\n this._remove();\r\n this._remove = undefined;\r\n }\r\n }\r\n}\r\n\r\n/** IModelHost initializes ($backend) and captures its configuration. A backend must call [[IModelHost.startup]] before using any backend classes.\r\n * See [the learning article]($docs/learning/backend/IModelHost.md)\r\n * @public\r\n */\r\nexport class IModelHost {\r\n private constructor() { }\r\n public static authorizationClient?: AuthorizationClient;\r\n\r\n /** @alpha */\r\n public static readonly telemetry = new TelemetryManager();\r\n\r\n public static backendVersion = \"\";\r\n private static _cacheDir = \"\";\r\n private static _appWorkspace?: Workspace;\r\n\r\n private static _platform?: typeof IModelJsNative;\r\n /** @internal */\r\n public static get platform(): typeof IModelJsNative {\r\n if (this._platform === undefined)\r\n throw new Error(\"IModelHost.startup must be called first\");\r\n return this._platform;\r\n }\r\n\r\n public static configuration?: IModelHostConfiguration;\r\n /** Event raised just after the backend IModelHost was started */\r\n public static readonly onAfterStartup = new BeEvent<() => void>();\r\n\r\n /** Event raised just before the backend IModelHost is to be shut down */\r\n public static readonly onBeforeShutdown = new BeEvent<() => void>();\r\n\r\n /** @internal */\r\n public static readonly session: Mutable<SessionProps> = { applicationId: \"2686\", applicationVersion: \"1.0.0\", sessionId: \"\" };\r\n\r\n /** A uniqueId for this session */\r\n public static get sessionId() { return this.session.sessionId; }\r\n public static set sessionId(id: GuidString) { this.session.sessionId = id; }\r\n\r\n /** The Id of this application - needs to be set only if it is an agent application. The applicationId will otherwise originate at the frontend. */\r\n public static get applicationId() { return this.session.applicationId; }\r\n public static set applicationId(id: string) { this.session.applicationId = id; }\r\n\r\n /** The version of this application - needs to be set if is an agent application. The applicationVersion will otherwise originate at the frontend. */\r\n public static get applicationVersion() { return this.session.applicationVersion; }\r\n public static set applicationVersion(version: string) { this.session.applicationVersion = version; }\r\n\r\n /** Root directory holding files that iTwin.js caches */\r\n public static get cacheDir(): LocalDirName { return this._cacheDir; }\r\n\r\n /** The application [[Workspace]] for this `IModelHost`\r\n * @note this `Workspace` only holds [[WorkspaceContainer]]s and [[Settings]] scoped to the currently loaded application(s).\r\n * All organization, iTwin, and iModel based containers or settings must be accessed through [[IModelDb.workspace]] and\r\n * attempting to add them to this Workspace will fail.\r\n * @beta\r\n */\r\n public static get appWorkspace(): Workspace { return this._appWorkspace!; } // eslint-disable-line @typescript-eslint/no-non-null-assertion\r\n\r\n /** The optional [[FileNameResolver]] that resolves keys and partial file names for snapshot iModels. */\r\n public static snapshotFileNameResolver?: FileNameResolver;\r\n\r\n /** Get the current access token for this IModelHost, or a blank string if none is available.\r\n * @note for web backends, this will *always* return a blank string because the backend itself has no token (but never needs one either.)\r\n * For all IpcHosts, where this backend is servicing a single frontend, this will be the user's token. For ElectronHost, the backend\r\n * obtains the token and forwards it to the frontend.\r\n * @note accessTokens expire periodically and are automatically refreshed, if possible. Therefore tokens should not be saved, and the value\r\n * returned by this method may change over time throughout the course of a session.\r\n */\r\n public static async getAccessToken(): Promise<AccessToken> {\r\n try {\r\n return (await this.authorizationClient?.getAccessToken()) ?? \"\";\r\n } catch (e) {\r\n return \"\";\r\n }\r\n }\r\n\r\n /** @internal */\r\n public static flushLog() {\r\n return this.platform.DgnDb.flushLog();\r\n }\r\n /** @internal */\r\n public static loadNative(): void {\r\n const platform = Platform.load();\r\n this.registerPlatform(platform);\r\n }\r\n\r\n private static registerPlatform(platform: typeof IModelJsNative): void {\r\n this._platform = platform;\r\n if (undefined === platform)\r\n return;\r\n\r\n if (!ProcessDetector.isMobileAppBackend)\r\n this.validateNativePlatformVersion();\r\n\r\n platform.logger = Logger;\r\n }\r\n\r\n private static validateNativePlatformVersion(): void {\r\n const requiredVersion = require(\"../../package.json\").dependencies[\"@bentley/imodeljs-native\"]; // eslint-disable-line @typescript-eslint/no-var-requires\r\n const thisVersion = this.platform.version;\r\n if (semver.satisfies(thisVersion, requiredVersion))\r\n return;\r\n if (IModelJsFs.existsSync(path.join(__dirname, \"DevBuild.txt\"))) {\r\n console.log(\"Bypassing version checks for development build\"); // eslint-disable-line no-console\r\n return;\r\n }\r\n this._platform = undefined;\r\n throw new IModelError(IModelStatus.BadRequest, `imodeljs-native version is (${thisVersion}). core-backend requires version (${requiredVersion})`);\r\n }\r\n\r\n /**\r\n * @internal\r\n * @note Use [[IModelHostConfiguration.tileCacheService]] to set the service provider.\r\n */\r\n public static tileCacheService?: CloudStorageService;\r\n\r\n /** @internal */\r\n public static tileUploader?: CloudStorageTileUploader;\r\n\r\n private static _hubAccess: BackendHubAccess;\r\n /** @internal */\r\n public static setHubAccess(hubAccess: BackendHubAccess) { this._hubAccess = hubAccess; }\r\n\r\n /** Provides access to the IModelHub for this IModelHost\r\n * @beta\r\n */\r\n public static get hubAccess(): BackendHubAccess { return this._hubAccess; }\r\n\r\n private static _isValid = false;\r\n /** Returns true if IModelHost is started. */\r\n public static get isValid() { return this._isValid; }\r\n /** This method must be called before any iModel.js services are used.\r\n * @param configuration Host configuration data.\r\n * Raises [[onAfterStartup]].\r\n * @see [[shutdown]].\r\n */\r\n public static async startup(configuration: IModelHostConfiguration = new IModelHostConfiguration()): Promise<void> {\r\n if (this._isValid)\r\n return; // we're already initialized\r\n this._isValid = true;\r\n\r\n if (IModelHost.sessionId === \"\")\r\n IModelHost.sessionId = Guid.createValue();\r\n\r\n this.authorizationClient = configuration.authorizationClient;\r\n\r\n this.logStartup();\r\n\r\n this.backendVersion = require(\"../../package.json\").version; // eslint-disable-line @typescript-eslint/no-var-requires\r\n initializeRpcBackend();\r\n\r\n if (this._platform === undefined) {\r\n try {\r\n this.loadNative();\r\n } catch (error) {\r\n Logger.logError(loggerCategory, \"Error registering/loading the native platform API\", () => (configuration));\r\n throw error;\r\n }\r\n }\r\n\r\n if (configuration.crashReportingConfig && configuration.crashReportingConfig.crashDir && !ProcessDetector.isElectronAppBackend && !ProcessDetector.isMobileAppBackend) {\r\n this.platform.setCrashReporting(configuration.crashReportingConfig);\r\n\r\n Logger.logTrace(loggerCategory, \"Configured crash reporting\", () => ({\r\n enableCrashDumps: configuration.crashReportingConfig?.enableCrashDumps,\r\n wantFullMemoryDumps: configuration.crashReportingConfig?.wantFullMemoryDumps,\r\n enableNodeReport: configuration.crashReportingConfig?.enableNodeReport,\r\n uploadToBentley: configuration.crashReportingConfig?.uploadToBentley,\r\n }));\r\n\r\n if (configuration.crashReportingConfig.enableNodeReport) {\r\n try {\r\n // node-report reports on V8 fatal errors and unhandled exceptions/Promise rejections.\r\n const nodereport = require(\"node-report/api\"); // eslint-disable-line @typescript-eslint/no-var-requires\r\n nodereport.setEvents(\"exception+fatalerror+apicall\");\r\n nodereport.setDirectory(configuration.crashReportingConfig.crashDir);\r\n nodereport.setVerbose(\"yes\");\r\n Logger.logTrace(loggerCategory, \"Configured native crash reporting (node-report)\");\r\n } catch (err) {\r\n Logger.logWarning(loggerCategory, \"node-report is not installed.\");\r\n }\r\n }\r\n }\r\n\r\n this.setupHostDirs(configuration);\r\n this._appWorkspace = new ITwinWorkspace(new ApplicationSettings(), configuration.workspace);\r\n\r\n BriefcaseManager.initialize(this._briefcaseCacheDir);\r\n\r\n [\r\n IModelReadRpcImpl,\r\n IModelTileRpcImpl,\r\n SnapshotIModelRpcImpl,\r\n WipRpcImpl,\r\n DevToolsRpcImpl,\r\n ].forEach((rpc) => rpc.register()); // register all of the RPC implementations\r\n\r\n [\r\n BisCoreSchema,\r\n GenericSchema,\r\n FunctionalSchema,\r\n ].forEach((schema) => schema.registerSchema()); // register all of the schemas\r\n\r\n if (undefined !== configuration.hubAccess)\r\n IModelHost._hubAccess = configuration.hubAccess;\r\n IModelHost.configuration = configuration;\r\n IModelHost.setupTileCache();\r\n\r\n this.platform.setUseTileCache(IModelHost.tileCacheService ? false : true);\r\n\r\n process.once(\"beforeExit\", IModelHost.shutdown);\r\n IModelHost.onAfterStartup.raiseEvent();\r\n }\r\n\r\n private static _briefcaseCacheDir: LocalDirName;\r\n\r\n private static logStartup() {\r\n if (!Logger.isEnabled(loggerCategory, LogLevel.Trace))\r\n return;\r\n\r\n // Extract the iModel details from environment - note this is very specific to Bentley hosted backends, but is quite useful for tracing\r\n let startupInfo: any = {};\r\n const serviceName = process.env.FABRIC_SERVICE_NAME;\r\n if (serviceName) {\r\n // e.g., fabric:/iModelWebViewer3.0/iModelJSGuest/1/08daaeb3-b56f-480b-9051-7efc834d18ae/512d971d-b641-4735-bb1c-c07ab3e44ce7/c1315fcce125ca40b2d405bb7809214daf8b4c85\r\n const serviceNameComponents = serviceName.split(\"/\");\r\n if (serviceNameComponents.length === 7) {\r\n startupInfo = {\r\n ...startupInfo,\r\n iTwinId: serviceNameComponents[4],\r\n iModelId: serviceNameComponents[5],\r\n changesetId: serviceNameComponents[6],\r\n };\r\n }\r\n }\r\n\r\n Logger.logTrace(loggerCategory, \"IModelHost.startup\", () => startupInfo);\r\n }\r\n\r\n private static setupHostDirs(configuration: IModelHostConfiguration) {\r\n const setupDir = (dir: LocalDirName) => {\r\n dir = path.normalize(dir);\r\n IModelJsFs.recursiveMkDirSync(dir);\r\n return dir;\r\n };\r\n this._cacheDir = setupDir(configuration.cacheDir ?? NativeLibrary.defaultCacheDir);\r\n this._briefcaseCacheDir = path.join(this._cacheDir, \"imodels\");\r\n }\r\n\r\n /** This method must be called when an iModel.js services is shut down. Raises [[onBeforeShutdown]] */\r\n public static async shutdown(): Promise<void> {\r\n // NB: This method is set as a node listener where `this` is unbound\r\n if (!IModelHost._isValid)\r\n return;\r\n\r\n IModelHost._isValid = false;\r\n IModelHost.onBeforeShutdown.raiseEvent();\r\n IModelHost.configuration = undefined;\r\n IModelHost.tileCacheService = undefined;\r\n IModelHost.tileUploader = undefined;\r\n IModelHost.appWorkspace.close();\r\n IModelHost._appWorkspace = undefined;\r\n process.removeListener(\"beforeExit\", IModelHost.shutdown);\r\n }\r\n\r\n /**\r\n * Add or update a property that should be included in a crash report.\r\n * @param name The name of the property\r\n * @param value The value of the property\r\n * @alpha\r\n */\r\n public static setCrashReportProperty(name: string, value: string): void {\r\n assert(undefined !== this._platform);\r\n this._platform.setCrashReportProperty(name, value);\r\n }\r\n\r\n /**\r\n * Remove a previously defined property so that will not be included in a crash report.\r\n * @param name The name of the property\r\n * @alpha\r\n */\r\n public static removeCrashReportProperty(name: string): void {\r\n assert(undefined !== this._platform);\r\n this._platform.setCrashReportProperty(name, undefined);\r\n }\r\n\r\n /**\r\n * Get all properties that will be included in a crash report.\r\n * @alpha\r\n */\r\n public static getCrashReportProperties(): CrashReportingConfigNameValuePair[] {\r\n assert(undefined !== this._platform);\r\n return this._platform.getCrashReportProperties();\r\n }\r\n\r\n /** The directory where application assets may be found */\r\n public static get appAssetsDir(): string | undefined { return undefined !== IModelHost.configuration ? IModelHost.configuration.appAssetsDir : undefined; }\r\n\r\n /** The time, in milliseconds, for which [IModelTileRpcInterface.requestTileTreeProps]($common) should wait before returning a \"pending\" status.\r\n * @internal\r\n */\r\n public static get tileTreeRequestTimeout(): number {\r\n return undefined !== IModelHost.configuration ? IModelHost.configuration.tileTreeRequestTimeout : IModelHostConfiguration.defaultTileRequestTimeout;\r\n }\r\n /** The time, in milliseconds, for which [IModelTileRpcInterface.requestTileContent]($common) should wait before returning a \"pending\" status.\r\n * @internal\r\n */\r\n public static get tileContentRequestTimeout(): number {\r\n return undefined !== IModelHost.configuration ? IModelHost.configuration.tileContentRequestTimeout : IModelHostConfiguration.defaultTileRequestTimeout;\r\n }\r\n\r\n /** The backend will log when a tile took longer to load than this threshold in seconds. */\r\n public static get logTileLoadTimeThreshold(): number { return undefined !== IModelHost.configuration ? IModelHost.configuration.logTileLoadTimeThreshold : IModelHostConfiguration.defaultLogTileLoadTimeThreshold; }\r\n /** The backend will log when a tile is loaded with a size in bytes above this threshold. */\r\n public static get logTileSizeThreshold(): number { return undefined !== IModelHost.configuration ? IModelHost.configuration.logTileSizeThreshold : IModelHostConfiguration.defaultLogTileSizeThreshold; }\r\n\r\n /** Whether external tile caching is active.\r\n * @internal\r\n */\r\n public static get usingExternalTileCache(): boolean {\r\n return undefined !== IModelHost.tileCacheService;\r\n }\r\n\r\n /** Whether to restrict tile cache URLs by client IP address.\r\n * @internal\r\n */\r\n public static get restrictTileUrlsByClientIp(): boolean { return undefined !== IModelHost.configuration && (IModelHost.configuration.restrictTileUrlsByClientIp ? true : false); }\r\n\r\n /** Whether to compress cached tiles.\r\n * @internal\r\n */\r\n public static get compressCachedTiles(): boolean { return false !== IModelHost.configuration?.compressCachedTiles; }\r\n\r\n private static setupTileCache() {\r\n assert(undefined !== IModelHost.configuration);\r\n const config = IModelHost.configuration;\r\n const service = config.tileCacheService;\r\n const credentials = config.tileCacheAzureCredentials;\r\n\r\n if (!service && !credentials)\r\n return;\r\n\r\n IModelHost.tileUploader = new CloudStorageTileUploader();\r\n\r\n if (credentials && !service) {\r\n IModelHost.tileCacheService = new AzureBlobStorage(credentials);\r\n } else if (!credentials && service) {\r\n IModelHost.tileCacheService = service;\r\n } else {\r\n throw new IModelError(BentleyStatus.ERROR, \"Cannot use both Azure and custom cloud storage providers for tile cache.\");\r\n }\r\n }\r\n}\r\n\r\n/** Information about the platform on which the app is running. Also see [[KnownLocations]] and [[IModelJsFs]].\r\n * @public\r\n */\r\nexport class Platform {\r\n /** Get the name of the platform. */\r\n public static get platformName(): \"win32\" | \"linux\" | \"darwin\" | \"ios\" | \"android\" | \"uwp\" {\r\n return process.platform as any;\r\n }\r\n\r\n /** @internal */\r\n public static load(): typeof IModelJsNative {\r\n return ProcessDetector.isMobileAppBackend ? (process as any)._linkedBinding(\"iModelJsNative\") : NativeLibrary.load();\r\n }\r\n}\r\n\r\n/** Well known directories that may be used by the application. Also see [[Platform]]\r\n * @public\r\n */\r\nexport class KnownLocations {\r\n\r\n /** The directory where the imodeljs-native assets are stored. */\r\n public static get nativeAssetsDir(): string { return IModelHost.platform.DgnDb.getAssetsDir(); }\r\n\r\n /** The directory where the core-backend assets are stored. */\r\n public static get packageAssetsDir(): string {\r\n return path.join(__dirname, \"assets\");\r\n }\r\n\r\n /** The temporary directory. */\r\n public static get tmpdir(): string {\r\n return os.tmpdir();\r\n }\r\n}\r\n\r\n/** Extend this class to provide custom file name resolution behavior.\r\n * @note Only `tryResolveKey` and/or `tryResolveFileName` need to be overridden as the implementations of `resolveKey` and `resolveFileName` work for most purposes.\r\n * @see [[IModelHost.snapshotFileNameResolver]]\r\n * @public\r\n */\r\nexport abstract class FileNameResolver {\r\n /** Resolve a file name from the specified key.\r\n * @param _fileKey The key that identifies the file name in a `Map` or other similar data structure.\r\n * @returns The resolved file name or `undefined` if not found.\r\n */\r\n public tryResolveKey(_fileKey: string): string | undefined { return undefined; }\r\n /** Resolve a file name from the specified key.\r\n * @param fileKey The key that identifies the file name in a `Map` or other similar data structure.\r\n * @returns The resolved file name.\r\n * @throws [[IModelError]] if not found.\r\n */\r\n public resolveKey(fileKey: string): string {\r\n const resolvedFileName: string | undefined = this.tryResolveKey(fileKey);\r\n if (undefined === resolvedFileName) {\r\n throw new IModelError(IModelStatus.NotFound, `${fileKey} not resolved`);\r\n }\r\n return resolvedFileName;\r\n }\r\n /** Resolve the input file name, which may be a partial name, into a full path file name.\r\n * @param inFileName The partial file name.\r\n * @returns The resolved full path file name or `undefined` if not found.\r\n */\r\n public tryResolveFileName(inFileName: string): string | undefined { return inFileName; }\r\n /** Resolve the input file name, which may be a partial name, into a full path file name.\r\n * @param inFileName The partial file name.\r\n * @returns The resolved full path file name.\r\n * @throws [[IModelError]] if not found.\r\n */\r\n public resolveFileName(inFileName: string): string {\r\n const resolvedFileName: string | undefined = this.tryResolveFileName(inFileName);\r\n if (undefined === resolvedFileName) {\r\n throw new IModelError(IModelStatus.NotFound, `${inFileName} not resolved`);\r\n }\r\n return resolvedFileName;\r\n }\r\n}\r\n"]}
@@ -1,27 +1,13 @@
1
1
  /** @packageDocumentation
2
2
  * @module NativeApp
3
3
  */
4
- import { AccessToken, BeEvent } from "@itwin/core-bentley";
5
- import { AuthorizationClient, InternetConnectivityStatus, NativeAppAuthorizationConfiguration, NativeAppNotifications, OverriddenBy } from "@itwin/core-common";
6
- import { ImsAuthorizationClient } from "@bentley/itwin-client";
4
+ import { BeEvent } from "@itwin/core-bentley";
5
+ import { InternetConnectivityStatus, NativeAppNotifications, OverriddenBy } from "@itwin/core-common";
7
6
  import { IpcHostOpts } from "./IpcHost";
8
7
  import { NativeAppStorage } from "./NativeAppStorage";
9
- /** @internal */
10
- export declare abstract class NativeAppAuthorizationBackend extends ImsAuthorizationClient implements AuthorizationClient {
11
- protected _accessToken: AccessToken;
12
- abstract signIn(): Promise<void>;
13
- abstract signOut(): Promise<void>;
14
- protected abstract refreshToken(): Promise<AccessToken>;
15
- config?: NativeAppAuthorizationConfiguration;
16
- expireSafety: number;
17
- issuerUrl?: string;
18
- protected constructor(config?: NativeAppAuthorizationConfiguration);
19
- setAccessToken(token: AccessToken): void;
20
- getAccessToken(): Promise<AccessToken>;
21
- initialize(config?: NativeAppAuthorizationConfiguration): Promise<void>;
22
- }
23
8
  /** Options for [[NativeHost.startup]]
24
- * @public */
9
+ * @public
10
+ */
25
11
  export interface NativeHostOpts extends IpcHostOpts {
26
12
  nativeHost?: {
27
13
  /** Application name. Used, for example, to name the settings file. If not supplied, defaults to "iTwinApp". */
@@ -36,10 +22,6 @@ export declare class NativeHost {
36
22
  private static _reachability?;
37
23
  private static _applicationName;
38
24
  private constructor();
39
- /** @internal */
40
- static get authorization(): NativeAppAuthorizationBackend;
41
- /** Event called when the user's sign-in state changes - this may be due to calls to signIn(), signOut() or because the token was refreshed */
42
- static readonly onAccessTokenChanged: BeEvent<(token: AccessToken) => void>;
43
25
  /** Event called when the internet connectivity changes, if known. */
44
26
  static readonly onInternetConnectivityChanged: BeEvent<(status: InternetConnectivityStatus) => void>;
45
27
  private static _appSettingsCacheDir?;
@@ -1 +1 @@
1
- {"version":3,"file":"NativeHost.d.ts","sourceRoot":"","sources":["../../src/NativeHost.ts"],"names":[],"mappings":"AAIA;;GAEG;AAGH,OAAO,EAAE,WAAW,EAAsB,OAAO,EAAc,MAAM,qBAAqB,CAAC;AAC3F,OAAO,EACL,mBAAmB,EAA+B,0BAA0B,EAAuB,mCAAmC,EAClH,sBAAsB,EAAmB,YAAY,EAC1E,MAAM,oBAAoB,CAAC;AAC5B,OAAO,EAAE,sBAAsB,EAAwB,MAAM,uBAAuB,CAAC;AAIrF,OAAO,EAAuB,WAAW,EAAE,MAAM,WAAW,CAAC;AAC7D,OAAO,EAAE,gBAAgB,EAAE,MAAM,oBAAoB,CAAC;AAEtD,gBAAgB;AAChB,8BAAsB,6BAA8B,SAAQ,sBAAuB,YAAW,mBAAmB;IAC/G,SAAS,CAAC,YAAY,EAAE,WAAW,CAAM;aACzB,MAAM,IAAI,OAAO,CAAC,IAAI,CAAC;aACvB,OAAO,IAAI,OAAO,CAAC,IAAI,CAAC;IACxC,SAAS,CAAC,QAAQ,CAAC,YAAY,IAAI,OAAO,CAAC,WAAW,CAAC;IAChD,MAAM,CAAC,EAAE,mCAAmC,CAAC;IAC7C,YAAY,SAAW;IACvB,SAAS,CAAC,EAAE,MAAM,CAAC;IAE1B,SAAS,aAAa,MAAM,CAAC,EAAE,mCAAmC;IAK3D,cAAc,CAAC,KAAK,EAAE,WAAW;IAO3B,cAAc,IAAI,OAAO,CAAC,WAAW,CAAC;IAMtC,UAAU,CAAC,MAAM,CAAC,EAAE,mCAAmC;CAQrE;AAwHD;aACa;AACb,MAAM,WAAW,cAAe,SAAQ,WAAW;IACjD,UAAU,CAAC,EAAE;QACX,+GAA+G;QAC/G,eAAe,CAAC,EAAE,MAAM,CAAC;KAC1B,CAAC;CACH;AAED;;;GAGG;AACH,qBAAa,UAAU;IACrB,OAAO,CAAC,MAAM,CAAC,aAAa,CAAC,CAA6B;IAC1D,OAAO,CAAC,MAAM,CAAC,gBAAgB,CAAS;IACxC,OAAO;IAEP,gBAAgB;IAChB,WAAkB,aAAa,kCAA8E;IAE7G,8IAA8I;IAC9I,gBAAuB,oBAAoB,kBAAuB,WAAW,KAAK,IAAI,EAAI;IAE1F,qEAAqE;IACrE,gBAAuB,6BAA6B,mBAAwB,0BAA0B,KAAK,IAAI,EAAI;IAEnH,OAAO,CAAC,MAAM,CAAC,oBAAoB,CAAC,CAAS;IAE7C,0DAA0D;IAC1D,WAAkB,mBAAmB,IAAI,MAAM,CAI9C;IAED,yEAAyE;WAC3D,oBAAoB,CAAC,CAAC,SAAS,MAAM,sBAAsB,EAAE,UAAU,EAAE,CAAC,EAAE,GAAG,IAAI,EAAE,UAAU,CAAC,sBAAsB,CAAC,CAAC,CAAC,CAAC;IAIxI,OAAO,CAAC,MAAM,CAAC,QAAQ,CAAS;IAChC,WAAkB,OAAO,IAAI,OAAO,CAA0B;IAC9D,WAAkB,eAAe,WAAoC;IACrE,kDAAkD;IAClD,WAAkB,aAAa,qBAE9B;IAED;;;OAGG;WACiB,OAAO,CAAC,GAAG,CAAC,EAAE,cAAc,GAAG,OAAO,CAAC,IAAI,CAAC;IAehE,mEAAmE;WAC/C,QAAQ,IAAI,OAAO,CAAC,IAAI,CAAC;IAO7C,iDAAiD;WACnC,yBAAyB,IAAI,0BAA0B;IAIrE;;;;OAIG;WACW,4BAA4B,CAAC,YAAY,EAAE,YAAY,EAAE,MAAM,EAAE,0BAA0B,GAAG,IAAI;CAOjH"}
1
+ {"version":3,"file":"NativeHost.d.ts","sourceRoot":"","sources":["../../src/NativeHost.ts"],"names":[],"mappings":"AAIA;;GAEG;AAGH,OAAO,EAAuB,OAAO,EAAc,MAAM,qBAAqB,CAAC;AAC/E,OAAO,EACW,0BAA0B,EAA6D,sBAAsB,EAC7H,YAAY,EACb,MAAM,oBAAoB,CAAC;AAK5B,OAAO,EAAuB,WAAW,EAAE,MAAM,WAAW,CAAC;AAC7D,OAAO,EAAE,gBAAgB,EAAE,MAAM,oBAAoB,CAAC;AAwGtD;;GAEG;AACH,MAAM,WAAW,cAAe,SAAQ,WAAW;IACjD,UAAU,CAAC,EAAE;QACX,+GAA+G;QAC/G,eAAe,CAAC,EAAE,MAAM,CAAC;KAC1B,CAAC;CACH;AAED;;;GAGG;AACH,qBAAa,UAAU;IACrB,OAAO,CAAC,MAAM,CAAC,aAAa,CAAC,CAA6B;IAC1D,OAAO,CAAC,MAAM,CAAC,gBAAgB,CAAS;IACxC,OAAO;IAEP,qEAAqE;IACrE,gBAAuB,6BAA6B,mBAAwB,0BAA0B,KAAK,IAAI,EAAI;IAEnH,OAAO,CAAC,MAAM,CAAC,oBAAoB,CAAC,CAAS;IAE7C,0DAA0D;IAC1D,WAAkB,mBAAmB,IAAI,MAAM,CAI9C;IAED,yEAAyE;WAC3D,oBAAoB,CAAC,CAAC,SAAS,MAAM,sBAAsB,EAAE,UAAU,EAAE,CAAC,EAAE,GAAG,IAAI,EAAE,UAAU,CAAC,sBAAsB,CAAC,CAAC,CAAC,CAAC;IAIxI,OAAO,CAAC,MAAM,CAAC,QAAQ,CAAS;IAChC,WAAkB,OAAO,IAAI,OAAO,CAA0B;IAC9D,WAAkB,eAAe,WAAoC;IACrE,kDAAkD;IAClD,WAAkB,aAAa,qBAE9B;IAED;;;OAGG;WACiB,OAAO,CAAC,GAAG,CAAC,EAAE,cAAc,GAAG,OAAO,CAAC,IAAI,CAAC;IAahE,mEAAmE;WAC/C,QAAQ,IAAI,OAAO,CAAC,IAAI,CAAC;IAM7C,iDAAiD;WACnC,yBAAyB,IAAI,0BAA0B;IAIrE;;;;OAIG;WACW,4BAA4B,CAAC,YAAY,EAAE,YAAY,EAAE,MAAM,EAAE,0BAA0B,GAAG,IAAI;CAOjH"}
@@ -7,7 +7,7 @@
7
7
  * @module NativeApp
8
8
  */
9
9
  Object.defineProperty(exports, "__esModule", { value: true });
10
- exports.NativeHost = exports.NativeAppAuthorizationBackend = void 0;
10
+ exports.NativeHost = void 0;
11
11
  const path_1 = require("path");
12
12
  const core_bentley_1 = require("@itwin/core-bentley");
13
13
  const core_common_1 = require("@itwin/core-common");
@@ -17,59 +17,14 @@ const CheckpointManager_1 = require("./CheckpointManager");
17
17
  const IModelHost_1 = require("./IModelHost");
18
18
  const IpcHost_1 = require("./IpcHost");
19
19
  const NativeAppStorage_1 = require("./NativeAppStorage");
20
- /** @internal */
21
- class NativeAppAuthorizationBackend extends itwin_client_1.ImsAuthorizationClient {
22
- constructor(config) {
23
- super();
24
- this._accessToken = "";
25
- this.expireSafety = 60 * 10; // refresh token 10 minutes before real expiration time
26
- this.config = config;
27
- }
28
- setAccessToken(token) {
29
- if (token === this._accessToken)
30
- return;
31
- this._accessToken = token;
32
- NativeHost.onAccessTokenChanged.raiseEvent(token);
33
- }
34
- async getAccessToken() {
35
- if (!this._accessToken) // TODO: This should happen from a timer, not here
36
- this.setAccessToken(await this.refreshToken());
37
- return this._accessToken;
38
- }
39
- async initialize(config) {
40
- var _c;
41
- this.config = config !== null && config !== void 0 ? config : this.config;
42
- if (!this.config)
43
- throw new core_common_1.IModelError(core_bentley_1.AuthStatus.Error, "Must specify a valid configuration when initializing authorization");
44
- if (this.config.expiryBuffer)
45
- this.expireSafety = this.config.expiryBuffer;
46
- this.issuerUrl = (_c = this.config.issuerUrl) !== null && _c !== void 0 ? _c : await this.getUrl();
47
- }
48
- }
49
- exports.NativeAppAuthorizationBackend = NativeAppAuthorizationBackend;
50
20
  /**
51
21
  * Implementation of NativeAppFunctions
52
22
  */
53
23
  class NativeAppHandler extends IpcHost_1.IpcHandler {
54
24
  get channelName() { return core_common_1.nativeAppChannel; }
55
- async setAccessToken(token) {
56
- NativeHost.authorization.setAccessToken(token);
57
- }
58
25
  async getAccessToken() {
59
- return NativeHost.authorization.getAccessToken();
60
- }
61
- async initializeAuth(props, config) {
62
- IModelHost_1.IModelHost.session.applicationId = props.applicationId;
63
- IModelHost_1.IModelHost.applicationVersion = props.applicationVersion;
64
- IModelHost_1.IModelHost.sessionId = props.sessionId;
65
- await NativeHost.authorization.initialize(config);
66
- return NativeHost.authorization.expireSafety;
67
- }
68
- async signIn() {
69
- return NativeHost.authorization.signIn();
70
- }
71
- async signOut() {
72
- return NativeHost.authorization.signOut();
26
+ var _c;
27
+ return (_c = IModelHost_1.IModelHost.authorizationClient) === null || _c === void 0 ? void 0 : _c.getAccessToken();
73
28
  }
74
29
  async checkInternetConnectivity() {
75
30
  return NativeHost.checkInternetConnectivity();
@@ -154,8 +109,6 @@ class NativeAppHandler extends IpcHost_1.IpcHandler {
154
109
  */
155
110
  class NativeHost {
156
111
  constructor() { } // no instances - static methods only
157
- /** @internal */
158
- static get authorization() { return IModelHost_1.IModelHost.authorizationClient; }
159
112
  /** Get the local cache folder for application settings */
160
113
  static get appSettingsCacheDir() {
161
114
  if (this._appSettingsCacheDir === undefined)
@@ -181,7 +134,6 @@ class NativeHost {
181
134
  if (!this.isValid) {
182
135
  this._isValid = true;
183
136
  this.onInternetConnectivityChanged.addListener((status) => NativeHost.notifyNativeFrontend("notifyInternetConnectivityChanged", status));
184
- this.onAccessTokenChanged.addListener((token) => NativeHost.notifyNativeFrontend("notifyAccessTokenChanged", token));
185
137
  this._applicationName = (_d = (_c = opt === null || opt === void 0 ? void 0 : opt.nativeHost) === null || _c === void 0 ? void 0 : _c.applicationName) !== null && _d !== void 0 ? _d : "iTwinApp";
186
138
  }
187
139
  await IpcHost_1.IpcHost.startup(opt);
@@ -192,7 +144,6 @@ class NativeHost {
192
144
  static async shutdown() {
193
145
  this._isValid = false;
194
146
  this.onInternetConnectivityChanged.clear();
195
- this.onAccessTokenChanged.clear();
196
147
  await IpcHost_1.IpcHost.shutdown();
197
148
  }
198
149
  /** get current value of internet connectivity */
@@ -214,8 +165,6 @@ class NativeHost {
214
165
  }
215
166
  }
216
167
  exports.NativeHost = NativeHost;
217
- /** Event called when the user's sign-in state changes - this may be due to calls to signIn(), signOut() or because the token was refreshed */
218
- NativeHost.onAccessTokenChanged = new core_bentley_1.BeEvent();
219
168
  /** Event called when the internet connectivity changes, if known. */
220
169
  NativeHost.onInternetConnectivityChanged = new core_bentley_1.BeEvent();
221
170
  NativeHost._isValid = false;
@@ -1 +1 @@
1
- {"version":3,"file":"NativeHost.js","sourceRoot":"","sources":["../../src/NativeHost.ts"],"names":[],"mappings":"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","sourcesContent":["/*---------------------------------------------------------------------------------------------\r\n* Copyright (c) Bentley Systems, Incorporated. All rights reserved.\r\n* See LICENSE.md in the project root for license terms and full copyright notice.\r\n*--------------------------------------------------------------------------------------------*/\r\n/** @packageDocumentation\r\n * @module NativeApp\r\n */\r\n\r\nimport { join } from \"path\";\r\nimport { AccessToken, assert, AuthStatus, BeEvent, GuidString } from \"@itwin/core-bentley\";\r\nimport {\r\n AuthorizationClient, BriefcaseProps, IModelError, InternetConnectivityStatus, LocalBriefcaseProps, NativeAppAuthorizationConfiguration, nativeAppChannel,\r\n NativeAppFunctions, NativeAppNotifications, nativeAppNotify, OverriddenBy, RequestNewBriefcaseProps, SessionProps, StorageValue,\r\n} from \"@itwin/core-common\";\r\nimport { ImsAuthorizationClient, RequestGlobalOptions } from \"@bentley/itwin-client\";\r\nimport { BriefcaseManager } from \"./BriefcaseManager\";\r\nimport { Downloads } from \"./CheckpointManager\";\r\nimport { IModelHost } from \"./IModelHost\";\r\nimport { IpcHandler, IpcHost, IpcHostOpts } from \"./IpcHost\";\r\nimport { NativeAppStorage } from \"./NativeAppStorage\";\r\n\r\n/** @internal */\r\nexport abstract class NativeAppAuthorizationBackend extends ImsAuthorizationClient implements AuthorizationClient {\r\n protected _accessToken: AccessToken = \"\";\r\n public abstract signIn(): Promise<void>;\r\n public abstract signOut(): Promise<void>;\r\n protected abstract refreshToken(): Promise<AccessToken>;\r\n public config?: NativeAppAuthorizationConfiguration;\r\n public expireSafety = 60 * 10; // refresh token 10 minutes before real expiration time\r\n public issuerUrl?: string;\r\n\r\n protected constructor(config?: NativeAppAuthorizationConfiguration) {\r\n super();\r\n this.config = config;\r\n }\r\n\r\n public setAccessToken(token: AccessToken) {\r\n if (token === this._accessToken)\r\n return;\r\n this._accessToken = token;\r\n NativeHost.onAccessTokenChanged.raiseEvent(token);\r\n }\r\n\r\n public async getAccessToken(): Promise<AccessToken> {\r\n if (!this._accessToken) // TODO: This should happen from a timer, not here\r\n this.setAccessToken(await this.refreshToken());\r\n return this._accessToken;\r\n }\r\n\r\n public async initialize(config?: NativeAppAuthorizationConfiguration) {\r\n this.config = config ?? this.config;\r\n if (!this.config)\r\n throw new IModelError(AuthStatus.Error, \"Must specify a valid configuration when initializing authorization\");\r\n if (this.config.expiryBuffer)\r\n this.expireSafety = this.config.expiryBuffer;\r\n this.issuerUrl = this.config.issuerUrl ?? await this.getUrl();\r\n }\r\n}\r\n\r\n/**\r\n * Implementation of NativeAppFunctions\r\n */\r\nclass NativeAppHandler extends IpcHandler implements NativeAppFunctions {\r\n public get channelName() { return nativeAppChannel; }\r\n\r\n public async setAccessToken(token: AccessToken) {\r\n NativeHost.authorization.setAccessToken(token);\r\n }\r\n public async getAccessToken(): Promise<AccessToken> {\r\n return NativeHost.authorization.getAccessToken();\r\n }\r\n public async initializeAuth(props: SessionProps, config?: NativeAppAuthorizationConfiguration): Promise<number> {\r\n IModelHost.session.applicationId = props.applicationId;\r\n IModelHost.applicationVersion = props.applicationVersion;\r\n IModelHost.sessionId = props.sessionId;\r\n\r\n await NativeHost.authorization.initialize(config);\r\n return NativeHost.authorization.expireSafety;\r\n }\r\n public async signIn(): Promise<void> {\r\n return NativeHost.authorization.signIn();\r\n }\r\n public async signOut(): Promise<void> {\r\n return NativeHost.authorization.signOut();\r\n }\r\n public async checkInternetConnectivity(): Promise<InternetConnectivityStatus> {\r\n return NativeHost.checkInternetConnectivity();\r\n }\r\n public async overrideInternetConnectivity(by: OverriddenBy, status: InternetConnectivityStatus): Promise<void> {\r\n NativeHost.overrideInternetConnectivity(by, status);\r\n }\r\n public async acquireNewBriefcaseId(iModelId: GuidString): Promise<number> {\r\n return BriefcaseManager.acquireNewBriefcaseId({ iModelId });\r\n }\r\n public async getBriefcaseFileName(props: BriefcaseProps): Promise<string> {\r\n return BriefcaseManager.getFileName(props);\r\n }\r\n public async downloadBriefcase(request: RequestNewBriefcaseProps, reportProgress: boolean, progressInterval?: number): Promise<LocalBriefcaseProps> {\r\n const args = {\r\n ...request,\r\n onProgress: (_a: number, _b: number) => checkAbort(),\r\n };\r\n\r\n if (reportProgress) {\r\n const interval = progressInterval ?? 250; // by default, only send progress events every 250 milliseconds\r\n let nextTime = Date.now() + interval;\r\n args.onProgress = (loaded, total) => {\r\n const now = Date.now();\r\n if (loaded >= total || now >= nextTime) {\r\n nextTime = now + interval;\r\n IpcHost.send(`nativeApp.progress-${request.iModelId}`, { loaded, total });\r\n }\r\n return checkAbort();\r\n };\r\n }\r\n\r\n const downloadPromise = BriefcaseManager.downloadBriefcase(args);\r\n const checkAbort = () => {\r\n assert(undefined !== args.fileName);\r\n const job = Downloads.isInProgress(args.fileName);\r\n return (job && (job.request as any).abort === 1) ? 1 : 0;\r\n };\r\n return downloadPromise;\r\n }\r\n\r\n public async requestCancelDownloadBriefcase(fileName: string): Promise<boolean> {\r\n const job = Downloads.isInProgress(fileName);\r\n if (job)\r\n (job.request as any).abort = 1;\r\n return job !== undefined;\r\n }\r\n\r\n public async deleteBriefcaseFiles(fileName: string): Promise<void> {\r\n await BriefcaseManager.deleteBriefcaseFiles(fileName, await IModelHost.getAccessToken());\r\n }\r\n\r\n public async getCachedBriefcases(iModelId?: GuidString): Promise<LocalBriefcaseProps[]> {\r\n return BriefcaseManager.getCachedBriefcases(iModelId);\r\n }\r\n\r\n public async storageMgrOpen(storageId: string): Promise<string> {\r\n return NativeAppStorage.open(storageId).id;\r\n }\r\n\r\n public async storageMgrClose(storageId: string, deleteIt: boolean): Promise<void> {\r\n NativeAppStorage.find(storageId).close(deleteIt);\r\n }\r\n\r\n public async storageMgrNames(): Promise<string[]> {\r\n return NativeAppStorage.getStorageNames();\r\n }\r\n\r\n public async storageGetValueType(storageId: string, key: string): Promise<\"number\" | \"string\" | \"boolean\" | \"Uint8Array\" | \"null\" | undefined> {\r\n return NativeAppStorage.find(storageId).getValueType(key);\r\n }\r\n\r\n public async storageGet(storageId: string, key: string): Promise<StorageValue | undefined> {\r\n return NativeAppStorage.find(storageId).getData(key);\r\n }\r\n\r\n public async storageSet(storageId: string, key: string, value: StorageValue): Promise<void> {\r\n NativeAppStorage.find(storageId).setData(key, value);\r\n }\r\n\r\n public async storageRemove(storageId: string, key: string): Promise<void> {\r\n NativeAppStorage.find(storageId).removeData(key);\r\n }\r\n\r\n public async storageKeys(storageId: string): Promise<string[]> {\r\n return NativeAppStorage.find(storageId).getKeys();\r\n }\r\n\r\n public async storageRemoveAll(storageId: string): Promise<void> {\r\n NativeAppStorage.find(storageId).removeAll();\r\n }\r\n}\r\n\r\n/** Options for [[NativeHost.startup]]\r\n * @public */\r\nexport interface NativeHostOpts extends IpcHostOpts {\r\n nativeHost?: {\r\n /** Application name. Used, for example, to name the settings file. If not supplied, defaults to \"iTwinApp\". */\r\n applicationName?: string;\r\n };\r\n}\r\n\r\n/**\r\n * Backend for desktop/mobile native applications\r\n * @public\r\n */\r\nexport class NativeHost {\r\n private static _reachability?: InternetConnectivityStatus;\r\n private static _applicationName: string;\r\n private constructor() { } // no instances - static methods only\r\n\r\n /** @internal */\r\n public static get authorization() { return IModelHost.authorizationClient as NativeAppAuthorizationBackend; }\r\n\r\n /** Event called when the user's sign-in state changes - this may be due to calls to signIn(), signOut() or because the token was refreshed */\r\n public static readonly onAccessTokenChanged = new BeEvent<(token: AccessToken) => void>();\r\n\r\n /** Event called when the internet connectivity changes, if known. */\r\n public static readonly onInternetConnectivityChanged = new BeEvent<(status: InternetConnectivityStatus) => void>();\r\n\r\n private static _appSettingsCacheDir?: string;\r\n\r\n /** Get the local cache folder for application settings */\r\n public static get appSettingsCacheDir(): string {\r\n if (this._appSettingsCacheDir === undefined)\r\n this._appSettingsCacheDir = join(IModelHost.cacheDir, \"appSettings\");\r\n return this._appSettingsCacheDir;\r\n }\r\n\r\n /** Send a notification to the NativeApp connected to this NativeHost. */\r\n public static notifyNativeFrontend<T extends keyof NativeAppNotifications>(methodName: T, ...args: Parameters<NativeAppNotifications[T]>) {\r\n return IpcHost.send(nativeAppNotify, methodName, ...args);\r\n }\r\n\r\n private static _isValid = false;\r\n public static get isValid(): boolean { return this._isValid; }\r\n public static get applicationName() { return this._applicationName; }\r\n /** Get the settings store for this NativeHost. */\r\n public static get settingsStore() {\r\n return NativeAppStorage.open(this.applicationName);\r\n }\r\n\r\n /**\r\n * Start the backend of a native app.\r\n * @note this method calls [[IpcHost.startup]] internally.\r\n */\r\n public static async startup(opt?: NativeHostOpts): Promise<void> {\r\n if (!this.isValid) {\r\n this._isValid = true;\r\n this.onInternetConnectivityChanged.addListener((status: InternetConnectivityStatus) =>\r\n NativeHost.notifyNativeFrontend(\"notifyInternetConnectivityChanged\", status));\r\n this.onAccessTokenChanged.addListener((token: AccessToken) =>\r\n NativeHost.notifyNativeFrontend(\"notifyAccessTokenChanged\", token));\r\n this._applicationName = opt?.nativeHost?.applicationName ?? \"iTwinApp\";\r\n }\r\n\r\n await IpcHost.startup(opt);\r\n if (IpcHost.isValid) // for tests, we use NativeHost but don't have a frontend\r\n NativeAppHandler.register();\r\n }\r\n\r\n /** Shutdown native app backend. Also calls [[IpcHost.shutdown]] */\r\n public static async shutdown(): Promise<void> {\r\n this._isValid = false;\r\n this.onInternetConnectivityChanged.clear();\r\n this.onAccessTokenChanged.clear();\r\n await IpcHost.shutdown();\r\n }\r\n\r\n /** get current value of internet connectivity */\r\n public static checkInternetConnectivity(): InternetConnectivityStatus {\r\n return this._reachability ?? InternetConnectivityStatus.Online;\r\n }\r\n\r\n /**\r\n * Override internet connectivity state\r\n * @param _overridenBy who overrode the value.\r\n * @internal\r\n */\r\n public static overrideInternetConnectivity(_overridenBy: OverriddenBy, status: InternetConnectivityStatus): void {\r\n if (this._reachability !== status) {\r\n this._reachability = status;\r\n RequestGlobalOptions.online = this._reachability === InternetConnectivityStatus.Online;\r\n this.onInternetConnectivityChanged.raiseEvent(status);\r\n }\r\n }\r\n}\r\n"]}
1
+ {"version":3,"file":"NativeHost.js","sourceRoot":"","sources":["../../src/NativeHost.ts"],"names":[],"mappings":"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","sourcesContent":["/*---------------------------------------------------------------------------------------------\r\n* Copyright (c) Bentley Systems, Incorporated. All rights reserved.\r\n* See LICENSE.md in the project root for license terms and full copyright notice.\r\n*--------------------------------------------------------------------------------------------*/\r\n/** @packageDocumentation\r\n * @module NativeApp\r\n */\r\n\r\nimport { join } from \"path\";\r\nimport { AccessToken, assert, BeEvent, GuidString } from \"@itwin/core-bentley\";\r\nimport {\r\n BriefcaseProps, InternetConnectivityStatus, LocalBriefcaseProps, nativeAppChannel, NativeAppFunctions, NativeAppNotifications, nativeAppNotify,\r\n OverriddenBy, RequestNewBriefcaseProps, StorageValue,\r\n} from \"@itwin/core-common\";\r\nimport { RequestGlobalOptions } from \"@bentley/itwin-client\";\r\nimport { BriefcaseManager } from \"./BriefcaseManager\";\r\nimport { Downloads } from \"./CheckpointManager\";\r\nimport { IModelHost } from \"./IModelHost\";\r\nimport { IpcHandler, IpcHost, IpcHostOpts } from \"./IpcHost\";\r\nimport { NativeAppStorage } from \"./NativeAppStorage\";\r\n\r\n/**\r\n * Implementation of NativeAppFunctions\r\n */\r\nclass NativeAppHandler extends IpcHandler implements NativeAppFunctions {\r\n public get channelName() { return nativeAppChannel; }\r\n\r\n public async getAccessToken(): Promise<AccessToken | undefined> {\r\n return IModelHost.authorizationClient?.getAccessToken();\r\n }\r\n\r\n public async checkInternetConnectivity(): Promise<InternetConnectivityStatus> {\r\n return NativeHost.checkInternetConnectivity();\r\n }\r\n public async overrideInternetConnectivity(by: OverriddenBy, status: InternetConnectivityStatus): Promise<void> {\r\n NativeHost.overrideInternetConnectivity(by, status);\r\n }\r\n public async acquireNewBriefcaseId(iModelId: GuidString): Promise<number> {\r\n return BriefcaseManager.acquireNewBriefcaseId({ iModelId });\r\n }\r\n public async getBriefcaseFileName(props: BriefcaseProps): Promise<string> {\r\n return BriefcaseManager.getFileName(props);\r\n }\r\n public async downloadBriefcase(request: RequestNewBriefcaseProps, reportProgress: boolean, progressInterval?: number): Promise<LocalBriefcaseProps> {\r\n const args = {\r\n ...request,\r\n onProgress: (_a: number, _b: number) => checkAbort(),\r\n };\r\n\r\n if (reportProgress) {\r\n const interval = progressInterval ?? 250; // by default, only send progress events every 250 milliseconds\r\n let nextTime = Date.now() + interval;\r\n args.onProgress = (loaded, total) => {\r\n const now = Date.now();\r\n if (loaded >= total || now >= nextTime) {\r\n nextTime = now + interval;\r\n IpcHost.send(`nativeApp.progress-${request.iModelId}`, { loaded, total });\r\n }\r\n return checkAbort();\r\n };\r\n }\r\n\r\n const downloadPromise = BriefcaseManager.downloadBriefcase(args);\r\n const checkAbort = () => {\r\n assert(undefined !== args.fileName);\r\n const job = Downloads.isInProgress(args.fileName);\r\n return (job && (job.request as any).abort === 1) ? 1 : 0;\r\n };\r\n return downloadPromise;\r\n }\r\n\r\n public async requestCancelDownloadBriefcase(fileName: string): Promise<boolean> {\r\n const job = Downloads.isInProgress(fileName);\r\n if (job)\r\n (job.request as any).abort = 1;\r\n return job !== undefined;\r\n }\r\n\r\n public async deleteBriefcaseFiles(fileName: string): Promise<void> {\r\n await BriefcaseManager.deleteBriefcaseFiles(fileName, await IModelHost.getAccessToken());\r\n }\r\n\r\n public async getCachedBriefcases(iModelId?: GuidString): Promise<LocalBriefcaseProps[]> {\r\n return BriefcaseManager.getCachedBriefcases(iModelId);\r\n }\r\n\r\n public async storageMgrOpen(storageId: string): Promise<string> {\r\n return NativeAppStorage.open(storageId).id;\r\n }\r\n\r\n public async storageMgrClose(storageId: string, deleteIt: boolean): Promise<void> {\r\n NativeAppStorage.find(storageId).close(deleteIt);\r\n }\r\n\r\n public async storageMgrNames(): Promise<string[]> {\r\n return NativeAppStorage.getStorageNames();\r\n }\r\n\r\n public async storageGetValueType(storageId: string, key: string): Promise<\"number\" | \"string\" | \"boolean\" | \"Uint8Array\" | \"null\" | undefined> {\r\n return NativeAppStorage.find(storageId).getValueType(key);\r\n }\r\n\r\n public async storageGet(storageId: string, key: string): Promise<StorageValue | undefined> {\r\n return NativeAppStorage.find(storageId).getData(key);\r\n }\r\n\r\n public async storageSet(storageId: string, key: string, value: StorageValue): Promise<void> {\r\n NativeAppStorage.find(storageId).setData(key, value);\r\n }\r\n\r\n public async storageRemove(storageId: string, key: string): Promise<void> {\r\n NativeAppStorage.find(storageId).removeData(key);\r\n }\r\n\r\n public async storageKeys(storageId: string): Promise<string[]> {\r\n return NativeAppStorage.find(storageId).getKeys();\r\n }\r\n\r\n public async storageRemoveAll(storageId: string): Promise<void> {\r\n NativeAppStorage.find(storageId).removeAll();\r\n }\r\n}\r\n\r\n/** Options for [[NativeHost.startup]]\r\n * @public\r\n */\r\nexport interface NativeHostOpts extends IpcHostOpts {\r\n nativeHost?: {\r\n /** Application name. Used, for example, to name the settings file. If not supplied, defaults to \"iTwinApp\". */\r\n applicationName?: string;\r\n };\r\n}\r\n\r\n/**\r\n * Backend for desktop/mobile native applications\r\n * @public\r\n */\r\nexport class NativeHost {\r\n private static _reachability?: InternetConnectivityStatus;\r\n private static _applicationName: string;\r\n private constructor() { } // no instances - static methods only\r\n\r\n /** Event called when the internet connectivity changes, if known. */\r\n public static readonly onInternetConnectivityChanged = new BeEvent<(status: InternetConnectivityStatus) => void>();\r\n\r\n private static _appSettingsCacheDir?: string;\r\n\r\n /** Get the local cache folder for application settings */\r\n public static get appSettingsCacheDir(): string {\r\n if (this._appSettingsCacheDir === undefined)\r\n this._appSettingsCacheDir = join(IModelHost.cacheDir, \"appSettings\");\r\n return this._appSettingsCacheDir;\r\n }\r\n\r\n /** Send a notification to the NativeApp connected to this NativeHost. */\r\n public static notifyNativeFrontend<T extends keyof NativeAppNotifications>(methodName: T, ...args: Parameters<NativeAppNotifications[T]>) {\r\n return IpcHost.send(nativeAppNotify, methodName, ...args);\r\n }\r\n\r\n private static _isValid = false;\r\n public static get isValid(): boolean { return this._isValid; }\r\n public static get applicationName() { return this._applicationName; }\r\n /** Get the settings store for this NativeHost. */\r\n public static get settingsStore() {\r\n return NativeAppStorage.open(this.applicationName);\r\n }\r\n\r\n /**\r\n * Start the backend of a native app.\r\n * @note this method calls [[IpcHost.startup]] internally.\r\n */\r\n public static async startup(opt?: NativeHostOpts): Promise<void> {\r\n if (!this.isValid) {\r\n this._isValid = true;\r\n this.onInternetConnectivityChanged.addListener((status: InternetConnectivityStatus) =>\r\n NativeHost.notifyNativeFrontend(\"notifyInternetConnectivityChanged\", status));\r\n this._applicationName = opt?.nativeHost?.applicationName ?? \"iTwinApp\";\r\n }\r\n\r\n await IpcHost.startup(opt);\r\n if (IpcHost.isValid) // for tests, we use NativeHost but don't have a frontend\r\n NativeAppHandler.register();\r\n }\r\n\r\n /** Shutdown native app backend. Also calls [[IpcHost.shutdown]] */\r\n public static async shutdown(): Promise<void> {\r\n this._isValid = false;\r\n this.onInternetConnectivityChanged.clear();\r\n await IpcHost.shutdown();\r\n }\r\n\r\n /** get current value of internet connectivity */\r\n public static checkInternetConnectivity(): InternetConnectivityStatus {\r\n return this._reachability ?? InternetConnectivityStatus.Online;\r\n }\r\n\r\n /**\r\n * Override internet connectivity state\r\n * @param _overridenBy who overrode the value.\r\n * @internal\r\n */\r\n public static overrideInternetConnectivity(_overridenBy: OverriddenBy, status: InternetConnectivityStatus): void {\r\n if (this._reachability !== status) {\r\n this._reachability = status;\r\n RequestGlobalOptions.online = this._reachability === InternetConnectivityStatus.Online;\r\n this.onInternetConnectivityChanged.raiseEvent(status);\r\n }\r\n }\r\n}\r\n"]}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@itwin/core-backend",
3
- "version": "3.0.0-dev.125",
3
+ "version": "3.0.0-dev.129",
4
4
  "description": "iTwin.js backend components",
5
5
  "main": "lib/cjs/core-backend.js",
6
6
  "typings": "lib/cjs/core-backend",
@@ -24,24 +24,24 @@
24
24
  "url": "http://www.bentley.com"
25
25
  },
26
26
  "peerDependencies": {
27
- "@bentley/itwin-client": "^3.0.0-dev.125",
28
- "@itwin/core-bentley": "^3.0.0-dev.125",
29
- "@itwin/core-common": "^3.0.0-dev.125",
30
- "@itwin/core-geometry": "^3.0.0-dev.125",
31
- "@itwin/ecschema-metadata": "^3.0.0-dev.125"
27
+ "@bentley/itwin-client": "^3.0.0-dev.129",
28
+ "@itwin/core-bentley": "^3.0.0-dev.129",
29
+ "@itwin/core-common": "^3.0.0-dev.129",
30
+ "@itwin/core-geometry": "^3.0.0-dev.129",
31
+ "@itwin/ecschema-metadata": "^3.0.0-dev.129"
32
32
  },
33
33
  "//devDependencies": [
34
34
  "NOTE: All peerDependencies should also be listed as devDependencies since peerDependencies are not considered by npm install",
35
35
  "NOTE: All tools used by scripts in this package must be listed as devDependencies"
36
36
  ],
37
37
  "devDependencies": {
38
- "@bentley/itwin-client": "3.0.0-dev.125",
39
- "@itwin/build-tools": "3.0.0-dev.125",
40
- "@itwin/core-bentley": "3.0.0-dev.125",
41
- "@itwin/core-common": "3.0.0-dev.125",
42
- "@itwin/core-geometry": "3.0.0-dev.125",
43
- "@itwin/ecschema-metadata": "3.0.0-dev.125",
44
- "@itwin/eslint-plugin": "3.0.0-dev.125",
38
+ "@bentley/itwin-client": "3.0.0-dev.129",
39
+ "@itwin/build-tools": "3.0.0-dev.129",
40
+ "@itwin/core-bentley": "3.0.0-dev.129",
41
+ "@itwin/core-common": "3.0.0-dev.129",
42
+ "@itwin/core-geometry": "3.0.0-dev.129",
43
+ "@itwin/ecschema-metadata": "3.0.0-dev.129",
44
+ "@itwin/eslint-plugin": "3.0.0-dev.129",
45
45
  "@types/chai": "^4.1.4",
46
46
  "@types/chai-as-promised": "^7",
47
47
  "@types/fs-extra": "^4.0.7",
@@ -67,7 +67,7 @@
67
67
  "dependencies": {
68
68
  "@azure/storage-blob": "^12.7.0",
69
69
  "@bentley/imodeljs-native": "3.0.18",
70
- "@bentley/telemetry-client": "3.0.0-dev.125",
70
+ "@itwin/core-telemetry": "3.0.0-dev.129",
71
71
  "form-data": "^2.3.2",
72
72
  "fs-extra": "^8.1.0",
73
73
  "json5": "^2.2.0",