@itwin/core-backend 4.2.0-dev.5 → 4.2.0-dev.7

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.
@@ -95,8 +95,8 @@ class RpcBriefcaseUtility {
95
95
  */
96
96
  static async findOpenIModel(accessToken, iModel) {
97
97
  const iModelDb = IModelDb_1.IModelDb.findByKey(iModel.key);
98
- // call refreshContainerSas, just in case this is a V2 checkpoint whose sasToken is about to expire.
99
- await iModelDb.refreshContainerSas(accessToken);
98
+ // call refreshContainer, just in case this is a V2 checkpoint whose sasToken is about to expire, or its default transaction is about to be restarted.
99
+ await iModelDb.refreshContainer(accessToken);
100
100
  return iModelDb;
101
101
  }
102
102
  /**
@@ -1 +1 @@
1
- {"version":3,"file":"RpcBriefcaseUtility.js","sourceRoot":"","sources":["../../../src/rpc-impl/RpcBriefcaseUtility.ts"],"names":[],"mappings":";AAAA;;;+FAG+F;AAC/F;;GAEG;;;AAEH,sDAA0G;AAC1G,oDAE4B;AAC5B,oEAAiE;AACjE,0DAA+E;AAC/E,4DAA+F;AAC/F,0CAAgE;AAChE,8CAA2C;AAC3C,8CAA2C;AAE3C,MAAM,cAAc,GAAW,6CAAqB,CAAC,QAAQ,CAAC;AAW9D;;;GAGG;AACH,MAAa,mBAAmB;IAEtB,MAAM,CAAC,KAAK,CAAC,eAAe,CAAC,IAAyB;QAC5D,MAAM,EAAE,QAAQ,EAAE,UAAU,EAAE,GAAG,IAAI,CAAC;QACtC,MAAM,WAAW,GAAG,QAAQ,CAAC,WAAW,CAAC;QACzC,IAAA,qBAAM,EAAC,SAAS,KAAK,UAAU,CAAC,QAAQ,CAAC,CAAC;QAE1C,MAAM,QAAQ,GAAG,UAAU,CAAC,QAAQ,CAAC;QACrC,IAAI,cAAwB,CAAC;QAC7B,IAAI,IAAI,CAAC,QAAQ,KAAK,sBAAQ,CAAC,QAAQ,EAAE;YACvC,cAAc,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,+BAA+B;SACtD;aAAM;YACL,4EAA4E;YAC5E,cAAc,GAAG,MAAM,uBAAU,CAAC,SAAS,CAAC,iBAAiB,CAAC,EAAE,WAAW,EAAE,QAAQ,EAAE,CAAC,CAAC;SAC1F;QAED,MAAM,SAAS,GAAG,IAAI,CAAC,iBAAiB,IAAI,CAAC,CAAC,GAAG,EAAE,EAAE,CAAC,mCAAgB,CAAC,WAAW,CAAC,GAAG,CAAC,CAAC,CAAC;QAEzF,gFAAgF;QAChF,IAAI,SAAS,EAAE;YACb,KAAK,MAAM,QAAQ,IAAI,SAAS,EAAE;gBAChC,KAAK,MAAM,WAAW,IAAI,cAAc,EAAE;oBACxC,MAAM,QAAQ,GAAG,QAAQ,CAAC,EAAE,WAAW,EAAE,QAAQ,EAAE,CAAC,CAAC;oBACrD,IAAI,uBAAU,CAAC,UAAU,CAAC,QAAQ,CAAC,EAAE;wBACnC,MAAM,WAAW,GAAG,sBAAW,CAAC,cAAc,CAAC,QAAQ,CAAC,CAAC;wBACzD,IAAI,WAAW,KAAK,SAAS;4BAC3B,OAAO,WAA0B,CAAC;wBACpC,IAAI;4BACF,IAAI,IAAI,CAAC,aAAa;gCACpB,MAAM,IAAI,KAAK,EAAE,CAAC,CAAC,sBAAsB;4BAC3C,MAAM,EAAE,GAAG,MAAM,sBAAW,CAAC,IAAI,CAAC,EAAE,QAAQ,EAAE,CAAC,CAAC;4BAChD,IAAI,EAAE,CAAC,SAAS,CAAC,EAAE,KAAK,UAAU,CAAC,SAAS,EAAE,EAAE,EAAE;gCAChD,IAAA,qBAAM,EAAC,SAAS,KAAK,UAAU,CAAC,SAAS,CAAC,CAAC;gCAC3C,MAAM,OAAO,GAAG,UAAU,CAAC,SAAS,EAAE,KAAK;oCACzC,CAAC,MAAM,uBAAU,CAAC,SAAS,CAAC,uBAAuB,CAAC,EAAE,WAAW,EAAE,QAAQ,EAAE,OAAO,EAAE,2BAAa,CAAC,aAAa,CAAC,UAAU,CAAC,SAAS,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC,CAAC,KAAK,CAAC;gCACvJ,MAAM,mCAAgB,CAAC,sBAAsB,CAAC,EAAE,EAAE,EAAE,WAAW,EAAE,OAAO,EAAE,CAAC,CAAC;6BAC7E;4BACD,OAAO,EAAE,CAAC;yBACX;wBAAC,OAAO,KAAU,EAAE;4BACnB,IAAI,CAAC,CAAC,KAAK,CAAC,WAAW,KAAK,2BAAY,CAAC,WAAW,CAAC;gCACnD,yFAAyF;gCACzF,MAAM,mCAAgB,CAAC,oBAAoB,CAAC,QAAQ,EAAE,WAAW,CAAC,CAAC;yBACtE;qBACF;iBACF;aACF;SACF;QAED,0DAA0D;QAC1D,IAAA,qBAAM,EAAC,SAAS,KAAK,UAAU,CAAC,OAAO,CAAC,CAAC;QACzC,MAAM,OAAO,GAA2B;YACtC,WAAW;YACX,OAAO,EAAE,UAAU,CAAC,OAAO;YAC3B,QAAQ;YACR,WAAW,EAAE,IAAI,CAAC,QAAQ,KAAK,sBAAQ,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,SAAS,EAAE,wDAAwD;SAC3H,CAAC;QAEF,MAAM,KAAK,GAAG,MAAM,mCAAgB,CAAC,iBAAiB,CAAC,OAAO,CAAC,CAAC;QAChE,OAAO,sBAAW,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;IACjC,CAAC;IAGO,MAAM,CAAC,KAAK,CAAC,aAAa,CAAC,IAAyB;QAC1D,IAAI,IAAI,CAAC,iBAAiB;YACxB,OAAO,IAAI,CAAC,iBAAiB,CAAC;QAEhC,IAAI;YACF,IAAI,CAAC,iBAAiB,GAAG,IAAI,CAAC,eAAe,CAAC,IAAI,CAAC,CAAC,CAAC,8FAA8F;YACnJ,OAAO,MAAM,IAAI,CAAC,iBAAiB,CAAC;SACrC;gBAAS;YACR,IAAI,CAAC,iBAAiB,GAAG,SAAS,CAAC,CAAE,oCAAoC;SAC1E;IACH,CAAC;IAED;;;;OAIG;IACI,MAAM,CAAC,KAAK,CAAC,cAAc,CAAC,WAAwB,EAAE,MAAsB;QACjF,MAAM,QAAQ,GAAG,mBAAQ,CAAC,SAAS,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC;QAEhD,oGAAoG;QACpG,MAAM,QAAQ,CAAC,mBAAmB,CAAC,WAAW,CAAC,CAAC;QAChD,OAAO,QAAQ,CAAC;IAClB,CAAC;IAED;;;OAGG;IACI,MAAM,CAAC,KAAK,CAAC,IAAI,CAAC,IAAyB;QAChD,MAAM,EAAE,QAAQ,EAAE,UAAU,EAAE,QAAQ,EAAE,GAAG,IAAI,CAAC;QAChD,qBAAM,CAAC,QAAQ,CAAC,cAAc,EAAE,0BAA0B,EAAE,GAAG,EAAE,CAAC,CAAC,EAAE,GAAG,UAAU,EAAE,CAAC,CAAC,CAAC;QAEvF,MAAM,OAAO,GAAG,IAAI,CAAC,OAAO,IAAI,IAAI,CAAC;QACrC,IAAI,QAAQ,KAAK,sBAAQ,CAAC,QAAQ,IAAI,QAAQ,KAAK,sBAAQ,CAAC,WAAW,EAAE;YACvE,MAAM,WAAW,GAAG,MAAM,yBAAU,CAAC,IAAI,CAAC,OAAO,EAAE,IAAI,CAAC,aAAa,CAAC,IAAI,CAAC,CAAC,CAAC;YAE7E,IAAI,WAAW,KAAK,SAAS,EAAE;gBAC7B,qBAAM,CAAC,QAAQ,CAAC,cAAc,EAAE,0BAA0B,EAAE,GAAG,EAAE,CAAC,CAAC,EAAE,GAAG,UAAU,EAAE,CAAC,CAAC,CAAC;gBACvF,MAAM,IAAI,gCAAkB,EAAE,CAAC,CAAC,8CAA8C;aAC/E;YACD,qFAAqF;YACrF,OAAO,WAAW,CAAC;SACpB;QAED,IAAA,qBAAM,EAAC,SAAS,KAAK,UAAU,CAAC,QAAQ,CAAC,CAAC;QAC1C,IAAA,qBAAM,EAAC,SAAS,KAAK,UAAU,CAAC,OAAO,CAAC,CAAC;QACzC,IAAA,qBAAM,EAAC,SAAS,KAAK,UAAU,CAAC,SAAS,CAAC,CAAC;QAE3C,MAAM,UAAU,GAAoB;YAClC,QAAQ,EAAE,UAAU,CAAC,QAAQ;YAC7B,OAAO,EAAE,UAAU,CAAC,OAAO;YAC3B,SAAS,EAAE,UAAU,CAAC,SAAS;YAC/B,WAAW,EAAE,QAAQ,CAAC,WAAW;SAClC,CAAC;QAEF,kCAAkC;QAClC,IAAI,EAAqB,CAAC;QAC1B,mCAAmC;QACnC,EAAE,GAAG,qBAAU,CAAC,YAAY,CAAC,qCAAiB,CAAC,MAAM,CAAC,UAAU,CAAC,CAAC,CAAC;QACnE,IAAI,EAAE,EAAE;YACN,qBAAM,CAAC,QAAQ,CAAC,cAAc,EAAE,6BAA6B,EAAE,GAAG,EAAE,CAAC,CAAC,EAAE,GAAG,UAAU,EAAE,CAAC,CAAC,CAAC;YAC1F,OAAO,EAAE,CAAC;SACX;QAED,IAAI;YACF,wBAAwB;YACxB,EAAE,GAAG,MAAM,qBAAU,CAAC,gBAAgB,CAAC,UAAU,CAAC,CAAC;YACnD,qBAAM,CAAC,QAAQ,CAAC,cAAc,EAAE,+BAA+B,EAAE,GAAG,EAAE,CAAC,CAAC,EAAE,GAAG,UAAU,EAAE,CAAC,CAAC,CAAC;SAC7F;QAAC,OAAO,CAAC,EAAE;YACV,qBAAM,CAAC,QAAQ,CAAC,cAAc,EAAE,8DAA8D,EAAE,GAAG,EAAE,CAAC,CAAC,EAAE,KAAK,EAAE,2BAAY,CAAC,aAAa,CAAC,CAAC,CAAC,EAAE,GAAG,UAAU,EAAE,CAAC,CAAC,CAAC;YAEjK,mKAAmK;YACnK,MAAM,OAAO,GAAG;gBACd,UAAU;gBACV,SAAS,EAAE,uCAAmB,CAAC,WAAW,CAAC,UAAU,CAAC;gBACtD,UAAU,EAAE,EAAE;aACf,CAAC;YACF,EAAE,GAAG,MAAM,yBAAU,CAAC,IAAI,CAAC,OAAO,EAAE,uCAAmB,CAAC,eAAe,CAAC,OAAO,CAAC,CAAC,CAAC;YAElF,IAAI,EAAE,KAAK,SAAS,EAAE;gBACpB,qBAAM,CAAC,QAAQ,CAAC,cAAc,EAAE,8BAA8B,EAAE,GAAG,EAAE,CAAC,CAAC,EAAE,GAAG,UAAU,EAAE,CAAC,CAAC,CAAC;gBAC3F,MAAM,IAAI,gCAAkB,EAAE,CAAC,CAAC,8CAA8C;aAC/E;YACD,qBAAM,CAAC,QAAQ,CAAC,cAAc,EAAE,sBAAsB,EAAE,GAAG,EAAE,CAAC,CAAC,EAAE,GAAG,UAAU,EAAE,CAAC,CAAC,CAAC;SACpF;QAED,OAAO,EAAE,CAAC;IACZ,CAAC;IAEM,MAAM,CAAC,KAAK,CAAC,eAAe,CAAC,QAAqB,EAAE,UAA8B,EAAE,QAAkB,EAAE,UAAkB,IAAI;QACnI,IAAI,UAAU,CAAC,QAAQ;YACrB,MAAM,uBAAU,CAAC,WAAW,EAAE,UAAU,CAAC,UAAU,CAAC,QAAQ,CAAC,CAAC;QAChE,OAAO,CAAC,MAAM,IAAI,CAAC,IAAI,CAAC,EAAE,QAAQ,EAAE,UAAU,EAAE,QAAQ,EAAE,OAAO,EAAE,CAAC,CAAC,CAAC,MAAM,EAAE,CAAC;IACjF,CAAC;CAEF;AA9JD,kDA8JC","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 RpcInterface\r\n */\r\n\r\nimport { AccessToken, assert, BeDuration, BentleyError, IModelStatus, Logger } from \"@itwin/core-bentley\";\r\nimport {\r\n BriefcaseProps, IModelConnectionProps, IModelRpcOpenProps, IModelRpcProps, IModelVersion, RpcActivity, RpcPendingResponse, SyncMode,\r\n} from \"@itwin/core-common\";\r\nimport { BackendLoggerCategory } from \"../BackendLoggerCategory\";\r\nimport { BriefcaseManager, RequestNewBriefcaseArg } from \"../BriefcaseManager\";\r\nimport { CheckpointManager, CheckpointProps, V1CheckpointManager } from \"../CheckpointManager\";\r\nimport { BriefcaseDb, IModelDb, SnapshotDb } from \"../IModelDb\";\r\nimport { IModelHost } from \"../IModelHost\";\r\nimport { IModelJsFs } from \"../IModelJsFs\";\r\n\r\nconst loggerCategory: string = BackendLoggerCategory.IModelDb;\r\n\r\n/** @internal */\r\nexport interface DownloadAndOpenArgs {\r\n activity: RpcActivity; // eslint-disable-line deprecation/deprecation\r\n tokenProps: IModelRpcOpenProps;\r\n syncMode: SyncMode;\r\n fileNameResolvers?: ((arg: BriefcaseProps) => string)[];\r\n timeout?: number;\r\n forceDownload?: boolean;\r\n}\r\n/**\r\n * Utility to open the iModel for RPC interfaces\r\n * @internal\r\n */\r\nexport class RpcBriefcaseUtility {\r\n\r\n private static async downloadAndOpen(args: DownloadAndOpenArgs): Promise<BriefcaseDb> {\r\n const { activity, tokenProps } = args;\r\n const accessToken = activity.accessToken;\r\n assert(undefined !== tokenProps.iModelId);\r\n\r\n const iModelId = tokenProps.iModelId;\r\n let myBriefcaseIds: number[];\r\n if (args.syncMode === SyncMode.PullOnly) {\r\n myBriefcaseIds = [0]; // PullOnly means briefcaseId 0\r\n } else {\r\n // check with iModelHub and see if we already have acquired any briefcaseIds\r\n myBriefcaseIds = await IModelHost.hubAccess.getMyBriefcaseIds({ accessToken, iModelId });\r\n }\r\n\r\n const resolvers = args.fileNameResolvers ?? [(arg) => BriefcaseManager.getFileName(arg)];\r\n\r\n // see if we can open any of the briefcaseIds we already acquired from iModelHub\r\n if (resolvers) {\r\n for (const resolver of resolvers) {\r\n for (const briefcaseId of myBriefcaseIds) {\r\n const fileName = resolver({ briefcaseId, iModelId });\r\n if (IModelJsFs.existsSync(fileName)) {\r\n const briefcaseDb = BriefcaseDb.findByFilename(fileName);\r\n if (briefcaseDb !== undefined)\r\n return briefcaseDb as BriefcaseDb;\r\n try {\r\n if (args.forceDownload)\r\n throw new Error(); // causes delete below\r\n const db = await BriefcaseDb.open({ fileName });\r\n if (db.changeset.id !== tokenProps.changeset?.id) {\r\n assert(undefined !== tokenProps.changeset);\r\n const toIndex = tokenProps.changeset?.index ??\r\n (await IModelHost.hubAccess.getChangesetFromVersion({ accessToken, iModelId, version: IModelVersion.asOfChangeSet(tokenProps.changeset.id) })).index;\r\n await BriefcaseManager.pullAndApplyChangesets(db, { accessToken, toIndex });\r\n }\r\n return db;\r\n } catch (error: any) {\r\n if (!(error.errorNumber === IModelStatus.AlreadyOpen))\r\n // somehow we have this briefcaseId and the file exists, but we can't open it. Delete it.\r\n await BriefcaseManager.deleteBriefcaseFiles(fileName, accessToken);\r\n }\r\n }\r\n }\r\n }\r\n }\r\n\r\n // no local briefcase available. Download one and open it.\r\n assert(undefined !== tokenProps.iTwinId);\r\n const request: RequestNewBriefcaseArg = {\r\n accessToken,\r\n iTwinId: tokenProps.iTwinId,\r\n iModelId,\r\n briefcaseId: args.syncMode === SyncMode.PullOnly ? 0 : undefined, // if briefcaseId is undefined, we'll acquire a new one.\r\n };\r\n\r\n const props = await BriefcaseManager.downloadBriefcase(request);\r\n return BriefcaseDb.open(props);\r\n }\r\n\r\n private static _briefcasePromise: Promise<BriefcaseDb> | undefined;\r\n private static async openBriefcase(args: DownloadAndOpenArgs): Promise<BriefcaseDb> {\r\n if (this._briefcasePromise)\r\n return this._briefcasePromise;\r\n\r\n try {\r\n this._briefcasePromise = this.downloadAndOpen(args); // save the fact that we're working on downloading so if we timeout, we'll reuse this request.\r\n return await this._briefcasePromise;\r\n } finally {\r\n this._briefcasePromise = undefined; // the download and open is now done\r\n }\r\n }\r\n\r\n /** find a previously opened iModel for RPC.\r\n * @param accessToken necessary (only) for V2 checkpoints to refresh access token in daemon if it has expired. We use the accessToken of the current RPC request\r\n * to refresh the daemon, even though it will be used for all authorized users.\r\n * @param the IModelRpcProps to locate the opened iModel.\r\n */\r\n public static async findOpenIModel(accessToken: AccessToken, iModel: IModelRpcProps) {\r\n const iModelDb = IModelDb.findByKey(iModel.key);\r\n\r\n // call refreshContainerSas, just in case this is a V2 checkpoint whose sasToken is about to expire.\r\n await iModelDb.refreshContainerSas(accessToken);\r\n return iModelDb;\r\n }\r\n\r\n /**\r\n * Download and open a checkpoint or briefcase, ensuring the operation completes within a default timeout. If the time to open exceeds the timeout period,\r\n * a RpcPendingResponse exception is thrown\r\n */\r\n public static async open(args: DownloadAndOpenArgs): Promise<IModelDb> {\r\n const { activity, tokenProps, syncMode } = args;\r\n Logger.logTrace(loggerCategory, \"RpcBriefcaseUtility.open\", () => ({ ...tokenProps }));\r\n\r\n const timeout = args.timeout ?? 1000;\r\n if (syncMode === SyncMode.PullOnly || syncMode === SyncMode.PullAndPush) {\r\n const briefcaseDb = await BeDuration.race(timeout, this.openBriefcase(args));\r\n\r\n if (briefcaseDb === undefined) {\r\n Logger.logTrace(loggerCategory, \"Open briefcase - pending\", () => ({ ...tokenProps }));\r\n throw new RpcPendingResponse(); // eslint-disable-line deprecation/deprecation\r\n }\r\n // note: usage is logged in the function BriefcaseManager.downloadNewBriefcaseAndOpen\r\n return briefcaseDb;\r\n }\r\n\r\n assert(undefined !== tokenProps.iModelId);\r\n assert(undefined !== tokenProps.iTwinId);\r\n assert(undefined !== tokenProps.changeset);\r\n\r\n const checkpoint: CheckpointProps = {\r\n iModelId: tokenProps.iModelId,\r\n iTwinId: tokenProps.iTwinId,\r\n changeset: tokenProps.changeset,\r\n accessToken: activity.accessToken,\r\n };\r\n\r\n // opening a checkpoint, readonly.\r\n let db: SnapshotDb | void;\r\n // first check if it's already open\r\n db = SnapshotDb.tryFindByKey(CheckpointManager.getKey(checkpoint));\r\n if (db) {\r\n Logger.logTrace(loggerCategory, \"Checkpoint was already open\", () => ({ ...tokenProps }));\r\n return db;\r\n }\r\n\r\n try {\r\n // now try V2 checkpoint\r\n db = await SnapshotDb.openCheckpointV2(checkpoint);\r\n Logger.logTrace(loggerCategory, \"using V2 checkpoint briefcase\", () => ({ ...tokenProps }));\r\n } catch (e) {\r\n Logger.logTrace(loggerCategory, \"unable to open V2 checkpoint - falling back to V1 checkpoint\", () => ({ error: BentleyError.getErrorProps(e), ...tokenProps }));\r\n\r\n // this isn't a v2 checkpoint. Set up a race between the specified timeout period and the open. Throw an RpcPendingResponse exception if the timeout happens first.\r\n const request = {\r\n checkpoint,\r\n localFile: V1CheckpointManager.getFileName(checkpoint),\r\n aliasFiles: [],\r\n };\r\n db = await BeDuration.race(timeout, V1CheckpointManager.getCheckpointDb(request));\r\n\r\n if (db === undefined) {\r\n Logger.logTrace(loggerCategory, \"Open V1 checkpoint - pending\", () => ({ ...tokenProps }));\r\n throw new RpcPendingResponse(); // eslint-disable-line deprecation/deprecation\r\n }\r\n Logger.logTrace(loggerCategory, \"Opened V1 checkpoint\", () => ({ ...tokenProps }));\r\n }\r\n\r\n return db;\r\n }\r\n\r\n public static async openWithTimeout(activity: RpcActivity, tokenProps: IModelRpcOpenProps, syncMode: SyncMode, timeout: number = 1000): Promise<IModelConnectionProps> { // eslint-disable-line deprecation/deprecation\r\n if (tokenProps.iModelId)\r\n await IModelHost.tileStorage?.initialize(tokenProps.iModelId);\r\n return (await this.open({ activity, tokenProps, syncMode, timeout })).toJSON();\r\n }\r\n\r\n}\r\n"]}
1
+ {"version":3,"file":"RpcBriefcaseUtility.js","sourceRoot":"","sources":["../../../src/rpc-impl/RpcBriefcaseUtility.ts"],"names":[],"mappings":";AAAA;;;+FAG+F;AAC/F;;GAEG;;;AAEH,sDAA0G;AAC1G,oDAE4B;AAC5B,oEAAiE;AACjE,0DAA+E;AAC/E,4DAA+F;AAC/F,0CAAgE;AAChE,8CAA2C;AAC3C,8CAA2C;AAE3C,MAAM,cAAc,GAAW,6CAAqB,CAAC,QAAQ,CAAC;AAW9D;;;GAGG;AACH,MAAa,mBAAmB;IAEtB,MAAM,CAAC,KAAK,CAAC,eAAe,CAAC,IAAyB;QAC5D,MAAM,EAAE,QAAQ,EAAE,UAAU,EAAE,GAAG,IAAI,CAAC;QACtC,MAAM,WAAW,GAAG,QAAQ,CAAC,WAAW,CAAC;QACzC,IAAA,qBAAM,EAAC,SAAS,KAAK,UAAU,CAAC,QAAQ,CAAC,CAAC;QAE1C,MAAM,QAAQ,GAAG,UAAU,CAAC,QAAQ,CAAC;QACrC,IAAI,cAAwB,CAAC;QAC7B,IAAI,IAAI,CAAC,QAAQ,KAAK,sBAAQ,CAAC,QAAQ,EAAE;YACvC,cAAc,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,+BAA+B;SACtD;aAAM;YACL,4EAA4E;YAC5E,cAAc,GAAG,MAAM,uBAAU,CAAC,SAAS,CAAC,iBAAiB,CAAC,EAAE,WAAW,EAAE,QAAQ,EAAE,CAAC,CAAC;SAC1F;QAED,MAAM,SAAS,GAAG,IAAI,CAAC,iBAAiB,IAAI,CAAC,CAAC,GAAG,EAAE,EAAE,CAAC,mCAAgB,CAAC,WAAW,CAAC,GAAG,CAAC,CAAC,CAAC;QAEzF,gFAAgF;QAChF,IAAI,SAAS,EAAE;YACb,KAAK,MAAM,QAAQ,IAAI,SAAS,EAAE;gBAChC,KAAK,MAAM,WAAW,IAAI,cAAc,EAAE;oBACxC,MAAM,QAAQ,GAAG,QAAQ,CAAC,EAAE,WAAW,EAAE,QAAQ,EAAE,CAAC,CAAC;oBACrD,IAAI,uBAAU,CAAC,UAAU,CAAC,QAAQ,CAAC,EAAE;wBACnC,MAAM,WAAW,GAAG,sBAAW,CAAC,cAAc,CAAC,QAAQ,CAAC,CAAC;wBACzD,IAAI,WAAW,KAAK,SAAS;4BAC3B,OAAO,WAA0B,CAAC;wBACpC,IAAI;4BACF,IAAI,IAAI,CAAC,aAAa;gCACpB,MAAM,IAAI,KAAK,EAAE,CAAC,CAAC,sBAAsB;4BAC3C,MAAM,EAAE,GAAG,MAAM,sBAAW,CAAC,IAAI,CAAC,EAAE,QAAQ,EAAE,CAAC,CAAC;4BAChD,IAAI,EAAE,CAAC,SAAS,CAAC,EAAE,KAAK,UAAU,CAAC,SAAS,EAAE,EAAE,EAAE;gCAChD,IAAA,qBAAM,EAAC,SAAS,KAAK,UAAU,CAAC,SAAS,CAAC,CAAC;gCAC3C,MAAM,OAAO,GAAG,UAAU,CAAC,SAAS,EAAE,KAAK;oCACzC,CAAC,MAAM,uBAAU,CAAC,SAAS,CAAC,uBAAuB,CAAC,EAAE,WAAW,EAAE,QAAQ,EAAE,OAAO,EAAE,2BAAa,CAAC,aAAa,CAAC,UAAU,CAAC,SAAS,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC,CAAC,KAAK,CAAC;gCACvJ,MAAM,mCAAgB,CAAC,sBAAsB,CAAC,EAAE,EAAE,EAAE,WAAW,EAAE,OAAO,EAAE,CAAC,CAAC;6BAC7E;4BACD,OAAO,EAAE,CAAC;yBACX;wBAAC,OAAO,KAAU,EAAE;4BACnB,IAAI,CAAC,CAAC,KAAK,CAAC,WAAW,KAAK,2BAAY,CAAC,WAAW,CAAC;gCACnD,yFAAyF;gCACzF,MAAM,mCAAgB,CAAC,oBAAoB,CAAC,QAAQ,EAAE,WAAW,CAAC,CAAC;yBACtE;qBACF;iBACF;aACF;SACF;QAED,0DAA0D;QAC1D,IAAA,qBAAM,EAAC,SAAS,KAAK,UAAU,CAAC,OAAO,CAAC,CAAC;QACzC,MAAM,OAAO,GAA2B;YACtC,WAAW;YACX,OAAO,EAAE,UAAU,CAAC,OAAO;YAC3B,QAAQ;YACR,WAAW,EAAE,IAAI,CAAC,QAAQ,KAAK,sBAAQ,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,SAAS,EAAE,wDAAwD;SAC3H,CAAC;QAEF,MAAM,KAAK,GAAG,MAAM,mCAAgB,CAAC,iBAAiB,CAAC,OAAO,CAAC,CAAC;QAChE,OAAO,sBAAW,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;IACjC,CAAC;IAGO,MAAM,CAAC,KAAK,CAAC,aAAa,CAAC,IAAyB;QAC1D,IAAI,IAAI,CAAC,iBAAiB;YACxB,OAAO,IAAI,CAAC,iBAAiB,CAAC;QAEhC,IAAI;YACF,IAAI,CAAC,iBAAiB,GAAG,IAAI,CAAC,eAAe,CAAC,IAAI,CAAC,CAAC,CAAC,8FAA8F;YACnJ,OAAO,MAAM,IAAI,CAAC,iBAAiB,CAAC;SACrC;gBAAS;YACR,IAAI,CAAC,iBAAiB,GAAG,SAAS,CAAC,CAAE,oCAAoC;SAC1E;IACH,CAAC;IAED;;;;OAIG;IACI,MAAM,CAAC,KAAK,CAAC,cAAc,CAAC,WAAwB,EAAE,MAAsB;QACjF,MAAM,QAAQ,GAAG,mBAAQ,CAAC,SAAS,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC;QAEhD,sJAAsJ;QACtJ,MAAM,QAAQ,CAAC,gBAAgB,CAAC,WAAW,CAAC,CAAC;QAC7C,OAAO,QAAQ,CAAC;IAClB,CAAC;IAED;;;OAGG;IACI,MAAM,CAAC,KAAK,CAAC,IAAI,CAAC,IAAyB;QAChD,MAAM,EAAE,QAAQ,EAAE,UAAU,EAAE,QAAQ,EAAE,GAAG,IAAI,CAAC;QAChD,qBAAM,CAAC,QAAQ,CAAC,cAAc,EAAE,0BAA0B,EAAE,GAAG,EAAE,CAAC,CAAC,EAAE,GAAG,UAAU,EAAE,CAAC,CAAC,CAAC;QAEvF,MAAM,OAAO,GAAG,IAAI,CAAC,OAAO,IAAI,IAAI,CAAC;QACrC,IAAI,QAAQ,KAAK,sBAAQ,CAAC,QAAQ,IAAI,QAAQ,KAAK,sBAAQ,CAAC,WAAW,EAAE;YACvE,MAAM,WAAW,GAAG,MAAM,yBAAU,CAAC,IAAI,CAAC,OAAO,EAAE,IAAI,CAAC,aAAa,CAAC,IAAI,CAAC,CAAC,CAAC;YAE7E,IAAI,WAAW,KAAK,SAAS,EAAE;gBAC7B,qBAAM,CAAC,QAAQ,CAAC,cAAc,EAAE,0BAA0B,EAAE,GAAG,EAAE,CAAC,CAAC,EAAE,GAAG,UAAU,EAAE,CAAC,CAAC,CAAC;gBACvF,MAAM,IAAI,gCAAkB,EAAE,CAAC,CAAC,8CAA8C;aAC/E;YACD,qFAAqF;YACrF,OAAO,WAAW,CAAC;SACpB;QAED,IAAA,qBAAM,EAAC,SAAS,KAAK,UAAU,CAAC,QAAQ,CAAC,CAAC;QAC1C,IAAA,qBAAM,EAAC,SAAS,KAAK,UAAU,CAAC,OAAO,CAAC,CAAC;QACzC,IAAA,qBAAM,EAAC,SAAS,KAAK,UAAU,CAAC,SAAS,CAAC,CAAC;QAE3C,MAAM,UAAU,GAAoB;YAClC,QAAQ,EAAE,UAAU,CAAC,QAAQ;YAC7B,OAAO,EAAE,UAAU,CAAC,OAAO;YAC3B,SAAS,EAAE,UAAU,CAAC,SAAS;YAC/B,WAAW,EAAE,QAAQ,CAAC,WAAW;SAClC,CAAC;QAEF,kCAAkC;QAClC,IAAI,EAAqB,CAAC;QAC1B,mCAAmC;QACnC,EAAE,GAAG,qBAAU,CAAC,YAAY,CAAC,qCAAiB,CAAC,MAAM,CAAC,UAAU,CAAC,CAAC,CAAC;QACnE,IAAI,EAAE,EAAE;YACN,qBAAM,CAAC,QAAQ,CAAC,cAAc,EAAE,6BAA6B,EAAE,GAAG,EAAE,CAAC,CAAC,EAAE,GAAG,UAAU,EAAE,CAAC,CAAC,CAAC;YAC1F,OAAO,EAAE,CAAC;SACX;QAED,IAAI;YACF,wBAAwB;YACxB,EAAE,GAAG,MAAM,qBAAU,CAAC,gBAAgB,CAAC,UAAU,CAAC,CAAC;YACnD,qBAAM,CAAC,QAAQ,CAAC,cAAc,EAAE,+BAA+B,EAAE,GAAG,EAAE,CAAC,CAAC,EAAE,GAAG,UAAU,EAAE,CAAC,CAAC,CAAC;SAC7F;QAAC,OAAO,CAAC,EAAE;YACV,qBAAM,CAAC,QAAQ,CAAC,cAAc,EAAE,8DAA8D,EAAE,GAAG,EAAE,CAAC,CAAC,EAAE,KAAK,EAAE,2BAAY,CAAC,aAAa,CAAC,CAAC,CAAC,EAAE,GAAG,UAAU,EAAE,CAAC,CAAC,CAAC;YAEjK,mKAAmK;YACnK,MAAM,OAAO,GAAG;gBACd,UAAU;gBACV,SAAS,EAAE,uCAAmB,CAAC,WAAW,CAAC,UAAU,CAAC;gBACtD,UAAU,EAAE,EAAE;aACf,CAAC;YACF,EAAE,GAAG,MAAM,yBAAU,CAAC,IAAI,CAAC,OAAO,EAAE,uCAAmB,CAAC,eAAe,CAAC,OAAO,CAAC,CAAC,CAAC;YAElF,IAAI,EAAE,KAAK,SAAS,EAAE;gBACpB,qBAAM,CAAC,QAAQ,CAAC,cAAc,EAAE,8BAA8B,EAAE,GAAG,EAAE,CAAC,CAAC,EAAE,GAAG,UAAU,EAAE,CAAC,CAAC,CAAC;gBAC3F,MAAM,IAAI,gCAAkB,EAAE,CAAC,CAAC,8CAA8C;aAC/E;YACD,qBAAM,CAAC,QAAQ,CAAC,cAAc,EAAE,sBAAsB,EAAE,GAAG,EAAE,CAAC,CAAC,EAAE,GAAG,UAAU,EAAE,CAAC,CAAC,CAAC;SACpF;QAED,OAAO,EAAE,CAAC;IACZ,CAAC;IAEM,MAAM,CAAC,KAAK,CAAC,eAAe,CAAC,QAAqB,EAAE,UAA8B,EAAE,QAAkB,EAAE,UAAkB,IAAI;QACnI,IAAI,UAAU,CAAC,QAAQ;YACrB,MAAM,uBAAU,CAAC,WAAW,EAAE,UAAU,CAAC,UAAU,CAAC,QAAQ,CAAC,CAAC;QAChE,OAAO,CAAC,MAAM,IAAI,CAAC,IAAI,CAAC,EAAE,QAAQ,EAAE,UAAU,EAAE,QAAQ,EAAE,OAAO,EAAE,CAAC,CAAC,CAAC,MAAM,EAAE,CAAC;IACjF,CAAC;CAEF;AA9JD,kDA8JC","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 RpcInterface\r\n */\r\n\r\nimport { AccessToken, assert, BeDuration, BentleyError, IModelStatus, Logger } from \"@itwin/core-bentley\";\r\nimport {\r\n BriefcaseProps, IModelConnectionProps, IModelRpcOpenProps, IModelRpcProps, IModelVersion, RpcActivity, RpcPendingResponse, SyncMode,\r\n} from \"@itwin/core-common\";\r\nimport { BackendLoggerCategory } from \"../BackendLoggerCategory\";\r\nimport { BriefcaseManager, RequestNewBriefcaseArg } from \"../BriefcaseManager\";\r\nimport { CheckpointManager, CheckpointProps, V1CheckpointManager } from \"../CheckpointManager\";\r\nimport { BriefcaseDb, IModelDb, SnapshotDb } from \"../IModelDb\";\r\nimport { IModelHost } from \"../IModelHost\";\r\nimport { IModelJsFs } from \"../IModelJsFs\";\r\n\r\nconst loggerCategory: string = BackendLoggerCategory.IModelDb;\r\n\r\n/** @internal */\r\nexport interface DownloadAndOpenArgs {\r\n activity: RpcActivity; // eslint-disable-line deprecation/deprecation\r\n tokenProps: IModelRpcOpenProps;\r\n syncMode: SyncMode;\r\n fileNameResolvers?: ((arg: BriefcaseProps) => string)[];\r\n timeout?: number;\r\n forceDownload?: boolean;\r\n}\r\n/**\r\n * Utility to open the iModel for RPC interfaces\r\n * @internal\r\n */\r\nexport class RpcBriefcaseUtility {\r\n\r\n private static async downloadAndOpen(args: DownloadAndOpenArgs): Promise<BriefcaseDb> {\r\n const { activity, tokenProps } = args;\r\n const accessToken = activity.accessToken;\r\n assert(undefined !== tokenProps.iModelId);\r\n\r\n const iModelId = tokenProps.iModelId;\r\n let myBriefcaseIds: number[];\r\n if (args.syncMode === SyncMode.PullOnly) {\r\n myBriefcaseIds = [0]; // PullOnly means briefcaseId 0\r\n } else {\r\n // check with iModelHub and see if we already have acquired any briefcaseIds\r\n myBriefcaseIds = await IModelHost.hubAccess.getMyBriefcaseIds({ accessToken, iModelId });\r\n }\r\n\r\n const resolvers = args.fileNameResolvers ?? [(arg) => BriefcaseManager.getFileName(arg)];\r\n\r\n // see if we can open any of the briefcaseIds we already acquired from iModelHub\r\n if (resolvers) {\r\n for (const resolver of resolvers) {\r\n for (const briefcaseId of myBriefcaseIds) {\r\n const fileName = resolver({ briefcaseId, iModelId });\r\n if (IModelJsFs.existsSync(fileName)) {\r\n const briefcaseDb = BriefcaseDb.findByFilename(fileName);\r\n if (briefcaseDb !== undefined)\r\n return briefcaseDb as BriefcaseDb;\r\n try {\r\n if (args.forceDownload)\r\n throw new Error(); // causes delete below\r\n const db = await BriefcaseDb.open({ fileName });\r\n if (db.changeset.id !== tokenProps.changeset?.id) {\r\n assert(undefined !== tokenProps.changeset);\r\n const toIndex = tokenProps.changeset?.index ??\r\n (await IModelHost.hubAccess.getChangesetFromVersion({ accessToken, iModelId, version: IModelVersion.asOfChangeSet(tokenProps.changeset.id) })).index;\r\n await BriefcaseManager.pullAndApplyChangesets(db, { accessToken, toIndex });\r\n }\r\n return db;\r\n } catch (error: any) {\r\n if (!(error.errorNumber === IModelStatus.AlreadyOpen))\r\n // somehow we have this briefcaseId and the file exists, but we can't open it. Delete it.\r\n await BriefcaseManager.deleteBriefcaseFiles(fileName, accessToken);\r\n }\r\n }\r\n }\r\n }\r\n }\r\n\r\n // no local briefcase available. Download one and open it.\r\n assert(undefined !== tokenProps.iTwinId);\r\n const request: RequestNewBriefcaseArg = {\r\n accessToken,\r\n iTwinId: tokenProps.iTwinId,\r\n iModelId,\r\n briefcaseId: args.syncMode === SyncMode.PullOnly ? 0 : undefined, // if briefcaseId is undefined, we'll acquire a new one.\r\n };\r\n\r\n const props = await BriefcaseManager.downloadBriefcase(request);\r\n return BriefcaseDb.open(props);\r\n }\r\n\r\n private static _briefcasePromise: Promise<BriefcaseDb> | undefined;\r\n private static async openBriefcase(args: DownloadAndOpenArgs): Promise<BriefcaseDb> {\r\n if (this._briefcasePromise)\r\n return this._briefcasePromise;\r\n\r\n try {\r\n this._briefcasePromise = this.downloadAndOpen(args); // save the fact that we're working on downloading so if we timeout, we'll reuse this request.\r\n return await this._briefcasePromise;\r\n } finally {\r\n this._briefcasePromise = undefined; // the download and open is now done\r\n }\r\n }\r\n\r\n /** find a previously opened iModel for RPC.\r\n * @param accessToken necessary (only) for V2 checkpoints to refresh access token in daemon if it has expired. We use the accessToken of the current RPC request\r\n * to refresh the daemon, even though it will be used for all authorized users.\r\n * @param the IModelRpcProps to locate the opened iModel.\r\n */\r\n public static async findOpenIModel(accessToken: AccessToken, iModel: IModelRpcProps) {\r\n const iModelDb = IModelDb.findByKey(iModel.key);\r\n\r\n // call refreshContainer, just in case this is a V2 checkpoint whose sasToken is about to expire, or its default transaction is about to be restarted.\r\n await iModelDb.refreshContainer(accessToken);\r\n return iModelDb;\r\n }\r\n\r\n /**\r\n * Download and open a checkpoint or briefcase, ensuring the operation completes within a default timeout. If the time to open exceeds the timeout period,\r\n * a RpcPendingResponse exception is thrown\r\n */\r\n public static async open(args: DownloadAndOpenArgs): Promise<IModelDb> {\r\n const { activity, tokenProps, syncMode } = args;\r\n Logger.logTrace(loggerCategory, \"RpcBriefcaseUtility.open\", () => ({ ...tokenProps }));\r\n\r\n const timeout = args.timeout ?? 1000;\r\n if (syncMode === SyncMode.PullOnly || syncMode === SyncMode.PullAndPush) {\r\n const briefcaseDb = await BeDuration.race(timeout, this.openBriefcase(args));\r\n\r\n if (briefcaseDb === undefined) {\r\n Logger.logTrace(loggerCategory, \"Open briefcase - pending\", () => ({ ...tokenProps }));\r\n throw new RpcPendingResponse(); // eslint-disable-line deprecation/deprecation\r\n }\r\n // note: usage is logged in the function BriefcaseManager.downloadNewBriefcaseAndOpen\r\n return briefcaseDb;\r\n }\r\n\r\n assert(undefined !== tokenProps.iModelId);\r\n assert(undefined !== tokenProps.iTwinId);\r\n assert(undefined !== tokenProps.changeset);\r\n\r\n const checkpoint: CheckpointProps = {\r\n iModelId: tokenProps.iModelId,\r\n iTwinId: tokenProps.iTwinId,\r\n changeset: tokenProps.changeset,\r\n accessToken: activity.accessToken,\r\n };\r\n\r\n // opening a checkpoint, readonly.\r\n let db: SnapshotDb | void;\r\n // first check if it's already open\r\n db = SnapshotDb.tryFindByKey(CheckpointManager.getKey(checkpoint));\r\n if (db) {\r\n Logger.logTrace(loggerCategory, \"Checkpoint was already open\", () => ({ ...tokenProps }));\r\n return db;\r\n }\r\n\r\n try {\r\n // now try V2 checkpoint\r\n db = await SnapshotDb.openCheckpointV2(checkpoint);\r\n Logger.logTrace(loggerCategory, \"using V2 checkpoint briefcase\", () => ({ ...tokenProps }));\r\n } catch (e) {\r\n Logger.logTrace(loggerCategory, \"unable to open V2 checkpoint - falling back to V1 checkpoint\", () => ({ error: BentleyError.getErrorProps(e), ...tokenProps }));\r\n\r\n // this isn't a v2 checkpoint. Set up a race between the specified timeout period and the open. Throw an RpcPendingResponse exception if the timeout happens first.\r\n const request = {\r\n checkpoint,\r\n localFile: V1CheckpointManager.getFileName(checkpoint),\r\n aliasFiles: [],\r\n };\r\n db = await BeDuration.race(timeout, V1CheckpointManager.getCheckpointDb(request));\r\n\r\n if (db === undefined) {\r\n Logger.logTrace(loggerCategory, \"Open V1 checkpoint - pending\", () => ({ ...tokenProps }));\r\n throw new RpcPendingResponse(); // eslint-disable-line deprecation/deprecation\r\n }\r\n Logger.logTrace(loggerCategory, \"Opened V1 checkpoint\", () => ({ ...tokenProps }));\r\n }\r\n\r\n return db;\r\n }\r\n\r\n public static async openWithTimeout(activity: RpcActivity, tokenProps: IModelRpcOpenProps, syncMode: SyncMode, timeout: number = 1000): Promise<IModelConnectionProps> { // eslint-disable-line deprecation/deprecation\r\n if (tokenProps.iModelId)\r\n await IModelHost.tileStorage?.initialize(tokenProps.iModelId);\r\n return (await this.open({ activity, tokenProps, syncMode, timeout })).toJSON();\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": "4.2.0-dev.5",
3
+ "version": "4.2.0-dev.7",
4
4
  "description": "iTwin.js backend components",
5
5
  "main": "lib/cjs/core-backend.js",
6
6
  "typings": "lib/cjs/core-backend",
@@ -25,9 +25,9 @@
25
25
  "url": "http://www.bentley.com"
26
26
  },
27
27
  "peerDependencies": {
28
- "@itwin/core-bentley": "^4.2.0-dev.5",
29
- "@itwin/core-common": "^4.2.0-dev.5",
30
- "@itwin/core-geometry": "^4.2.0-dev.5",
28
+ "@itwin/core-bentley": "^4.2.0-dev.7",
29
+ "@itwin/core-common": "^4.2.0-dev.7",
30
+ "@itwin/core-geometry": "^4.2.0-dev.7",
31
31
  "@opentelemetry/api": "^1.0.4"
32
32
  },
33
33
  "peerDependenciesMeta": {
@@ -66,11 +66,11 @@
66
66
  "source-map-loader": "^4.0.0",
67
67
  "typescript": "~5.0.2",
68
68
  "webpack": "^5.76.0",
69
- "@itwin/build-tools": "4.2.0-dev.5",
70
- "@itwin/core-bentley": "4.2.0-dev.5",
71
- "@itwin/core-geometry": "4.2.0-dev.5",
72
- "@itwin/core-common": "4.2.0-dev.5",
73
- "@itwin/core-webpack-tools": "4.2.0-dev.5",
69
+ "@itwin/build-tools": "4.2.0-dev.7",
70
+ "@itwin/core-bentley": "4.2.0-dev.7",
71
+ "@itwin/core-common": "4.2.0-dev.7",
72
+ "@itwin/core-geometry": "4.2.0-dev.7",
73
+ "@itwin/core-webpack-tools": "4.2.0-dev.7",
74
74
  "internal-tools": "3.0.0-dev.69"
75
75
  },
76
76
  "dependencies": {
@@ -86,7 +86,7 @@
86
86
  "reflect-metadata": "^0.1.13",
87
87
  "semver": "^7.3.5",
88
88
  "ws": "^7.5.3",
89
- "@itwin/core-telemetry": "4.2.0-dev.5"
89
+ "@itwin/core-telemetry": "4.2.0-dev.7"
90
90
  },
91
91
  "nyc": {
92
92
  "extends": "./node_modules/@itwin/build-tools/.nycrc"