@itwin/core-backend 3.0.0-dev.89 → 3.0.0-dev.93

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (35) hide show
  1. package/lib/cjs/BackendHubAccess.d.ts +37 -34
  2. package/lib/cjs/BackendHubAccess.d.ts.map +1 -1
  3. package/lib/cjs/BackendHubAccess.js +1 -1
  4. package/lib/cjs/BackendHubAccess.js.map +1 -1
  5. package/lib/cjs/BriefcaseManager.js +3 -3
  6. package/lib/cjs/BriefcaseManager.js.map +1 -1
  7. package/lib/cjs/CheckpointManager.js +2 -2
  8. package/lib/cjs/CheckpointManager.js.map +1 -1
  9. package/lib/cjs/ECDb.d.ts +2 -2
  10. package/lib/cjs/ECDb.js +3 -3
  11. package/lib/cjs/ECDb.js.map +1 -1
  12. package/lib/cjs/IModelDb.d.ts +0 -1
  13. package/lib/cjs/IModelDb.d.ts.map +1 -1
  14. package/lib/cjs/IModelDb.js +0 -2
  15. package/lib/cjs/IModelDb.js.map +1 -1
  16. package/lib/cjs/IModelHost.d.ts +6 -5
  17. package/lib/cjs/IModelHost.d.ts.map +1 -1
  18. package/lib/cjs/IModelHost.js +7 -10
  19. package/lib/cjs/IModelHost.js.map +1 -1
  20. package/lib/cjs/PromiseMemoizer.d.ts +4 -1
  21. package/lib/cjs/PromiseMemoizer.d.ts.map +1 -1
  22. package/lib/cjs/PromiseMemoizer.js +12 -1
  23. package/lib/cjs/PromiseMemoizer.js.map +1 -1
  24. package/lib/cjs/core-backend.d.ts +2 -2
  25. package/lib/cjs/core-backend.d.ts.map +1 -1
  26. package/lib/cjs/core-backend.js +2 -2
  27. package/lib/cjs/core-backend.js.map +1 -1
  28. package/lib/cjs/rpc-impl/IModelTileRpcImpl.d.ts.map +1 -1
  29. package/lib/cjs/rpc-impl/IModelTileRpcImpl.js +9 -1
  30. package/lib/cjs/rpc-impl/IModelTileRpcImpl.js.map +1 -1
  31. package/package.json +18 -54
  32. package/lib/cjs/IModelHubBackend.d.ts +0 -66
  33. package/lib/cjs/IModelHubBackend.d.ts.map +0 -1
  34. package/lib/cjs/IModelHubBackend.js +0 -359
  35. package/lib/cjs/IModelHubBackend.js.map +0 -1
@@ -1,359 +0,0 @@
1
- "use strict";
2
- /*---------------------------------------------------------------------------------------------
3
- * Copyright (c) Bentley Systems, Incorporated. All rights reserved.
4
- * See LICENSE.md in the project root for license terms and full copyright notice.
5
- *--------------------------------------------------------------------------------------------*/
6
- /** @packageDocumentation
7
- * @module HubAccess
8
- */
9
- Object.defineProperty(exports, "__esModule", { value: true });
10
- exports.IModelHubBackend = void 0;
11
- const path_1 = require("path");
12
- const backend_itwin_client_1 = require("@bentley/backend-itwin-client");
13
- const core_bentley_1 = require("@itwin/core-bentley");
14
- const imodelhub_client_1 = require("@bentley/imodelhub-client");
15
- const core_common_1 = require("@itwin/core-common");
16
- const itwin_client_1 = require("@bentley/itwin-client");
17
- const BriefcaseManager_1 = require("./BriefcaseManager");
18
- const IModelDb_1 = require("./IModelDb");
19
- const IModelHost_1 = require("./IModelHost");
20
- const IModelJsFs_1 = require("./IModelJsFs");
21
- /** @internal */
22
- class IModelHubBackend {
23
- static setIModelClient(client) {
24
- this._imodelClient = client;
25
- this._isIModelBankClient = client instanceof imodelhub_client_1.IModelBankClient;
26
- }
27
- static get isUsingIModelBankClient() {
28
- return this._isIModelBankClient;
29
- }
30
- static get iModelClient() {
31
- if (!this._imodelClient)
32
- this._imodelClient = new imodelhub_client_1.IModelHubClient(new backend_itwin_client_1.AzureFileHandler());
33
- return this._imodelClient;
34
- }
35
- static async getAccessToken(arg) {
36
- var _a;
37
- return (_a = arg.accessToken) !== null && _a !== void 0 ? _a : await IModelHost_1.IModelHost.getAccessToken();
38
- }
39
- static async getLatestChangeset(arg) {
40
- const accessToken = await this.getAccessToken(arg);
41
- const changeSets = await this.iModelClient.changeSets.get(accessToken, arg.iModelId, new imodelhub_client_1.ChangeSetQuery().top(1).latest());
42
- return (changeSets.length === 0) ? this.changeSet0 : this.toChangeSetProps(changeSets[changeSets.length - 1]);
43
- }
44
- static async getChangesetFromNamedVersion(arg) {
45
- const accessToken = await this.getAccessToken(arg);
46
- const versions = await this.iModelClient.versions.get(accessToken, arg.iModelId, new imodelhub_client_1.VersionQuery().select("ChangeSetId").byName(arg.versionName));
47
- if (!versions[0] || !versions[0].changeSetId)
48
- throw new core_common_1.IModelError(core_bentley_1.IModelStatus.NotFound, `Named version ${arg.versionName} not found`);
49
- return this.queryChangeset({ ...arg, changeset: { id: versions[0].changeSetId } });
50
- }
51
- static async getChangesetFromVersion(arg) {
52
- const version = arg.version;
53
- if (version.isFirst)
54
- return this.queryChangeset({ ...arg, changeset: { index: 0 } });
55
- const asOf = version.getAsOfChangeSet();
56
- if (asOf)
57
- return this.queryChangeset({ ...arg, changeset: { id: asOf } });
58
- const versionName = version.getName();
59
- if (versionName)
60
- return this.getChangesetFromNamedVersion({ ...arg, versionName });
61
- return this.getLatestChangeset(arg);
62
- }
63
- static async createNewIModel(arg) {
64
- var _a;
65
- if (this.isUsingIModelBankClient)
66
- throw new core_common_1.IModelError(core_bentley_1.IModelStatus.BadRequest, "This is a iModelHub only operation");
67
- const revision0 = (0, path_1.join)(IModelHost_1.IModelHost.cacheDir, "temp-revision0.bim");
68
- IModelJsFs_1.IModelJsFs.removeSync(revision0);
69
- if (!arg.revision0) { // if they didn't supply a revision0 file, create a blank one.
70
- const blank = IModelDb_1.SnapshotDb.createEmpty(revision0, { rootSubject: { name: (_a = arg.description) !== null && _a !== void 0 ? _a : arg.iModelName } });
71
- blank.saveChanges();
72
- blank.close();
73
- }
74
- else {
75
- IModelJsFs_1.IModelJsFs.copySync(revision0, arg.revision0);
76
- }
77
- const nativeDb = IModelDb_1.IModelDb.openDgnDb({ path: revision0 }, core_bentley_1.OpenMode.ReadWrite);
78
- try {
79
- nativeDb.setITwinId(arg.iTwinId);
80
- // nativeDb.setDbGuid(this.iModelId); NEEDS_WORK - iModelHub should accept this value, not create it.
81
- nativeDb.saveChanges();
82
- nativeDb.deleteAllTxns(); // necessary before resetting briefcaseId
83
- nativeDb.resetBriefcaseId(core_common_1.BriefcaseIdValue.Unassigned);
84
- nativeDb.saveLocalValue(IModelDb_1.BriefcaseLocalValue.NoLocking, arg.noLocks ? "true" : undefined);
85
- nativeDb.saveChanges();
86
- }
87
- finally {
88
- nativeDb.closeIModel();
89
- }
90
- const accessToken = await this.getAccessToken(arg);
91
- const hubIModel = await this.iModelClient.iModels.create(accessToken, arg.iTwinId, arg.iModelName, { path: revision0, description: arg.description });
92
- IModelJsFs_1.IModelJsFs.removeSync(revision0);
93
- return hubIModel.wsgId;
94
- }
95
- static async deleteIModel(arg) {
96
- const dirName = BriefcaseManager_1.BriefcaseManager.getIModelPath(arg.iModelId);
97
- if (IModelJsFs_1.IModelJsFs.existsSync(dirName)) {
98
- IModelJsFs_1.IModelJsFs.purgeDirSync(dirName);
99
- IModelJsFs_1.IModelJsFs.rmdirSync(dirName);
100
- }
101
- const accessToken = await this.getAccessToken(arg);
102
- return this.iModelClient.iModels.delete(accessToken, arg.iTwinId, arg.iModelId);
103
- }
104
- static async queryIModelByName(arg) {
105
- const accessToken = await this.getAccessToken(arg);
106
- const iModels = await this.iModelClient.iModels.get(accessToken, arg.iTwinId, new imodelhub_client_1.IModelQuery().byName(arg.iModelName));
107
- return iModels.length === 0 ? undefined : iModels[0].id;
108
- }
109
- static async pushChangeset(arg) {
110
- const changeset = new imodelhub_client_1.ChangeSet();
111
- const changesetProps = arg.changesetProps;
112
- changeset.id = changesetProps.id;
113
- changeset.parentId = changesetProps.parentId;
114
- changeset.changesType = changesetProps.changesType;
115
- changeset.fileSize = changesetProps.size.toString();
116
- changeset.description = changesetProps.description;
117
- changeset.briefcaseId = changesetProps.briefcaseId;
118
- if (changeset.description.length >= 255) {
119
- core_bentley_1.Logger.logWarning("imodelhub-access", `pushChanges - Truncating description to 255 characters. ${changeset.description}`);
120
- changeset.description = changeset.description.slice(0, 254);
121
- }
122
- const accessToken = await this.getAccessToken(arg);
123
- return +(await this.iModelClient.changeSets.create(accessToken, arg.iModelId, changeset, changesetProps.pathname)).index;
124
- }
125
- /** Releases a briefcaseId from iModelHub. After this call it is illegal to generate changesets for the released briefcaseId.
126
- * @note generally, this method should not be called directly. Instead use [[deleteBriefcaseFiles]].
127
- * @see deleteBriefcaseFiles
128
- */
129
- static async releaseBriefcase(arg) {
130
- const { briefcaseId, iModelId } = arg;
131
- const accessToken = await this.getAccessToken(arg);
132
- try {
133
- await this.iModelClient.briefcases.get(accessToken, iModelId, new imodelhub_client_1.BriefcaseQuery().byId(briefcaseId));
134
- }
135
- catch (error) {
136
- throw error;
137
- }
138
- await this.iModelClient.briefcases.delete(accessToken, iModelId, briefcaseId);
139
- }
140
- static async getMyBriefcaseIds(arg) {
141
- const accessToken = await this.getAccessToken(arg);
142
- const myHubBriefcases = await this.iModelClient.briefcases.get(accessToken, arg.iModelId, new imodelhub_client_1.BriefcaseQuery().ownedByMe().selectDownloadUrl());
143
- const myBriefcaseIds = [];
144
- for (const hubBc of myHubBriefcases)
145
- myBriefcaseIds.push(hubBc.briefcaseId); // save the list of briefcaseIds we already own.
146
- return myBriefcaseIds;
147
- }
148
- static async acquireNewBriefcaseId(arg) {
149
- const accessToken = await this.getAccessToken(arg);
150
- const briefcase = await this.iModelClient.briefcases.create(accessToken, arg.iModelId);
151
- if (!briefcase)
152
- throw new core_common_1.IModelError(core_bentley_1.BriefcaseStatus.CannotAcquire, "Could not acquire briefcase");
153
- return briefcase.briefcaseId;
154
- }
155
- static toChangeSetProps(cs) {
156
- var _a, _b;
157
- return {
158
- id: cs.wsgId, parentId: cs.parentId ? cs.parentId : "", briefcaseId: cs.briefcaseId, pushDate: cs.pushDate,
159
- description: (_a = cs.description) !== null && _a !== void 0 ? _a : "", changesType: ((_b = cs.changesType) !== null && _b !== void 0 ? _b : imodelhub_client_1.ChangesType.Regular), userCreated: cs.userCreated,
160
- index: +cs.index,
161
- };
162
- }
163
- static toChangeSetFileProps(cs, basePath) {
164
- const csProps = this.toChangeSetProps(cs);
165
- csProps.pathname = (0, path_1.join)(basePath, cs.fileName);
166
- return csProps;
167
- }
168
- static async downloadChangeset(arg) {
169
- const accessToken = await this.getAccessToken(arg);
170
- const changeSetsPath = BriefcaseManager_1.BriefcaseManager.getChangeSetsPath(arg.iModelId);
171
- // NEEDS_WORK - allow download by index
172
- const cSet = await this.queryChangeset(arg);
173
- const changeSets = await this.iModelClient.changeSets.download(accessToken, arg.iModelId, new imodelhub_client_1.ChangeSetQuery().byId(cSet.id), changeSetsPath);
174
- if (undefined === changeSets)
175
- throw new core_common_1.IModelError(core_bentley_1.IModelStatus.NotFound, `Cannot download changeset`);
176
- return this.toChangeSetFileProps(changeSets[0], arg.targetDir);
177
- }
178
- static async queryChangeset(arg) {
179
- const hasIndex = (undefined !== arg.changeset.index);
180
- if ((hasIndex && arg.changeset.index <= 0) || arg.changeset.id === "")
181
- return this.changeSet0;
182
- const query = new imodelhub_client_1.ChangeSetQuery();
183
- if (hasIndex)
184
- query.filter(`Index+eq+${arg.changeset.index}`);
185
- else
186
- query.byId(arg.changeset.id);
187
- const accessToken = await this.getAccessToken(arg);
188
- const changeSets = await this.iModelClient.changeSets.get(accessToken, arg.iModelId, query);
189
- if (undefined === changeSets)
190
- throw new core_common_1.IModelError(core_bentley_1.IModelStatus.NotFound, `Changeset not found`);
191
- return this.toChangeSetProps(changeSets[0]);
192
- }
193
- static async getQueryFromRange(arg) {
194
- const query = new imodelhub_client_1.ChangeSetQuery();
195
- if (!arg.range)
196
- return query; // returns all changesets
197
- const range = arg.range;
198
- const after = range.first === 0 ? "" : (await this.queryChangeset({ ...arg, changeset: { index: range.first } })).parentId;
199
- if (!range.end)
200
- query.fromId(after); //
201
- else {
202
- const last = (await this.queryChangeset({ ...arg, changeset: { index: range.end } })).id;
203
- if (range.end === 0 || after === last)
204
- return undefined;
205
- query.betweenChangeSets(last, after); // note: weird order is necessary because second arg being blank means "from start"
206
- }
207
- return query;
208
- }
209
- /** queries for change sets in the specified range. */
210
- static async queryChangesets(arg) {
211
- const query = await this.getQueryFromRange(arg);
212
- const val = [];
213
- if (query) {
214
- const accessToken = await this.getAccessToken(arg);
215
- const changeSets = await this.iModelClient.changeSets.get(accessToken, arg.iModelId, query);
216
- for (const cs of changeSets)
217
- val.push(this.toChangeSetProps(cs));
218
- }
219
- return val;
220
- }
221
- /** Downloads change sets in the specified range. */
222
- static async downloadChangesets(arg) {
223
- const val = [];
224
- const query = await this.getQueryFromRange(arg);
225
- if (query) {
226
- const accessToken = await this.getAccessToken(arg);
227
- const changeSets = await this.iModelClient.changeSets.download(accessToken, arg.iModelId, query, arg.targetDir);
228
- for (const cs of changeSets)
229
- val.push(this.toChangeSetFileProps(cs, arg.targetDir));
230
- }
231
- return val;
232
- }
233
- static async downloadV1Checkpoint(arg) {
234
- const checkpoint = arg.checkpoint;
235
- let checkpointQuery = new imodelhub_client_1.CheckpointQuery().selectDownloadUrl();
236
- checkpointQuery = checkpointQuery.precedingCheckpoint(checkpoint.changeset.id);
237
- const accessToken = await this.getAccessToken(checkpoint);
238
- const checkpoints = await this.iModelClient.checkpoints.get(accessToken, checkpoint.iModelId, checkpointQuery);
239
- if (checkpoints.length !== 1)
240
- throw new core_common_1.IModelError(core_bentley_1.BriefcaseStatus.VersionNotFound, "no checkpoints not found");
241
- const cancelRequest = {};
242
- const progressCallback = (progress) => {
243
- var _a;
244
- if (arg.onProgress && arg.onProgress(progress.loaded, progress.total) !== 0)
245
- (_a = cancelRequest.cancel) === null || _a === void 0 ? void 0 : _a.call(cancelRequest);
246
- };
247
- await this.iModelClient.checkpoints.download(accessToken, checkpoints[0], arg.localFile, progressCallback, cancelRequest);
248
- return checkpoints[0].mergedChangeSetId;
249
- }
250
- static async queryV2Checkpoint(arg) {
251
- const checkpointQuery = new imodelhub_client_1.CheckpointV2Query().byChangeSetId(arg.changeset.id).selectContainerAccessKey();
252
- const accessToken = await this.getAccessToken(arg);
253
- const checkpoints = await this.iModelClient.checkpointsV2.get(accessToken, arg.iModelId, checkpointQuery);
254
- if (checkpoints.length < 1)
255
- return undefined;
256
- const { containerAccessKeyContainer, containerAccessKeySAS, containerAccessKeyAccount, containerAccessKeyDbName } = checkpoints[0];
257
- if (!containerAccessKeyContainer || !containerAccessKeySAS || !containerAccessKeyAccount || !containerAccessKeyDbName)
258
- throw new Error("Invalid V2 checkpoint in iModelHub");
259
- return {
260
- container: containerAccessKeyContainer,
261
- auth: containerAccessKeySAS,
262
- user: containerAccessKeyAccount,
263
- dbAlias: containerAccessKeyDbName,
264
- storageType: "azure?sas=1",
265
- };
266
- }
267
- static async downloadV2Checkpoint(arg) {
268
- const checkpoint = arg.checkpoint;
269
- let checkpointQuery = new imodelhub_client_1.CheckpointV2Query();
270
- checkpointQuery = checkpointQuery.precedingCheckpointV2(checkpoint.changeset.id).selectContainerAccessKey();
271
- const accessToken = await this.getAccessToken(checkpoint);
272
- let checkpoints = [];
273
- try {
274
- checkpoints = await this.iModelClient.checkpointsV2.get(accessToken, checkpoint.iModelId, checkpointQuery);
275
- }
276
- catch (error) {
277
- if (error instanceof core_bentley_1.BentleyError && error.errorNumber === core_bentley_1.IModelHubStatus.Unknown)
278
- throw new core_common_1.IModelError(core_bentley_1.IModelStatus.NotFound, "V2 checkpoints not supported");
279
- throw error;
280
- }
281
- if (checkpoints.length !== 1)
282
- throw new core_common_1.IModelError(core_bentley_1.IModelStatus.NotFound, "V2 checkpoint not found");
283
- const { containerAccessKeyContainer, containerAccessKeySAS, containerAccessKeyAccount, containerAccessKeyDbName } = checkpoints[0];
284
- if (!containerAccessKeyContainer || !containerAccessKeySAS || !containerAccessKeyAccount || !containerAccessKeyDbName)
285
- throw new core_common_1.IModelError(core_bentley_1.IModelStatus.NotFound, "invalid V2 checkpoint");
286
- const downloader = new IModelHost_1.IModelHost.platform.DownloadV2Checkpoint({
287
- container: containerAccessKeyContainer,
288
- auth: containerAccessKeySAS,
289
- storageType: "azure?sas=1",
290
- user: containerAccessKeyAccount,
291
- dbAlias: containerAccessKeyDbName,
292
- writeable: false,
293
- localFile: arg.localFile,
294
- });
295
- let timer;
296
- try {
297
- let total = 0;
298
- const onProgress = arg.onProgress;
299
- if (onProgress) {
300
- timer = setInterval(async () => {
301
- const progress = downloader.getProgress();
302
- total = progress.total;
303
- if (onProgress(progress.loaded, progress.total))
304
- downloader.cancelDownload();
305
- }, 250);
306
- }
307
- await downloader.downloadPromise;
308
- onProgress === null || onProgress === void 0 ? void 0 : onProgress(total, total); // make sure we call progress func one last time when download completes
309
- }
310
- catch (err) {
311
- throw (err.message === "cancelled") ? new itwin_client_1.UserCancelledError(core_bentley_1.BriefcaseStatus.DownloadCancelled, "download cancelled") : err;
312
- }
313
- finally {
314
- if (timer)
315
- clearInterval(timer);
316
- }
317
- return checkpoints[0].changeSetId;
318
- }
319
- static async releaseAllLocks(arg) {
320
- const accessToken = await this.getAccessToken(arg);
321
- return this.iModelClient.locks.deleteAll(accessToken, arg.iModelId, arg.briefcaseId);
322
- }
323
- static async releaseAllCodes(arg) {
324
- const accessToken = await this.getAccessToken(arg);
325
- return this.iModelClient.codes.deleteAll(accessToken, arg.iModelId, arg.briefcaseId);
326
- }
327
- static async queryAllLocks(arg) {
328
- const accessToken = await this.getAccessToken(arg);
329
- const heldLocks = await this.iModelClient.locks.get(accessToken, arg.iModelId, new imodelhub_client_1.LockQuery().byBriefcaseId(arg.briefcaseId));
330
- return heldLocks.map((lock) => ({ id: lock.objectId, state: lock.lockLevel }));
331
- }
332
- static async queryAllCodes(arg) {
333
- const accessToken = await this.getAccessToken(arg);
334
- const reservedCodes = await this.iModelClient.codes.get(accessToken, arg.iModelId, new imodelhub_client_1.CodeQuery().byBriefcaseId(arg.briefcaseId));
335
- return reservedCodes.map((code) => ({ spec: code.codeSpecId, scope: code.codeScope, value: code.value }));
336
- }
337
- static toHubLock(arg, reqLock) {
338
- const lock = new imodelhub_client_1.Lock();
339
- lock.briefcaseId = arg.briefcaseId;
340
- lock.lockLevel = reqLock.state;
341
- lock.lockType = imodelhub_client_1.LockType.Element;
342
- lock.objectId = reqLock.id;
343
- lock.releasedWithChangeSet = arg.changeset.id;
344
- lock.seedFileId = arg.iModelId;
345
- return lock;
346
- }
347
- static toHubLocks(arg) {
348
- return arg.locks.map((lock) => this.toHubLock(arg, lock));
349
- }
350
- static async acquireLocks(arg) {
351
- const hubLocks = this.toHubLocks(arg);
352
- const accessToken = await this.getAccessToken(arg);
353
- await this.iModelClient.locks.update(accessToken, arg.iModelId, hubLocks);
354
- }
355
- }
356
- exports.IModelHubBackend = IModelHubBackend;
357
- IModelHubBackend._isIModelBankClient = false;
358
- IModelHubBackend.changeSet0 = { id: "", changesType: 0, description: "revision0", parentId: "", briefcaseId: 0, pushDate: "", userCreated: "", index: 0 };
359
- //# sourceMappingURL=IModelHubBackend.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"IModelHubBackend.js","sourceRoot":"","sources":["../../src/IModelHubBackend.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 HubAccess\r\n */\r\n\r\nimport { join } from \"path\";\r\nimport { AzureFileHandler } from \"@bentley/backend-itwin-client\";\r\nimport { BentleyError, BriefcaseStatus, GuidString, IModelHubStatus, IModelStatus, Logger, OpenMode } from \"@itwin/core-bentley\";\r\nimport {\r\n BriefcaseQuery, ChangeSet, ChangeSetQuery, ChangesType, CheckpointQuery, CheckpointV2, CheckpointV2Query, CodeQuery, IModelBankClient, IModelClient,\r\n IModelHubClient, IModelQuery, Lock, LockQuery, LockType, VersionQuery,\r\n} from \"@bentley/imodelhub-client\";\r\nimport {\r\n BriefcaseIdValue, ChangesetFileProps, ChangesetId, ChangesetIndex, ChangesetProps, CodeProps, IModelError, IModelVersion, LocalDirName,\r\n} from \"@itwin/core-common\";\r\nimport { ProgressCallback, UserCancelledError } from \"@bentley/itwin-client\";\r\nimport {\r\n AcquireNewBriefcaseIdArg, BriefcaseDbArg, BriefcaseIdArg, ChangesetArg, ChangesetRangeArg, CheckPointArg, CreateNewIModelProps, IModelIdArg,\r\n IModelNameArg, ITwinIdArg, LockProps, V2CheckpointAccessProps,\r\n} from \"./BackendHubAccess\";\r\nimport { BriefcaseManager } from \"./BriefcaseManager\";\r\nimport { CheckpointProps } from \"./CheckpointManager\";\r\nimport { BriefcaseLocalValue, IModelDb, SnapshotDb, TokenArg } from \"./IModelDb\";\r\nimport { IModelHost } from \"./IModelHost\";\r\nimport { IModelJsFs } from \"./IModelJsFs\";\r\n\r\n/** @internal */\r\nexport class IModelHubBackend {\r\n\r\n private static _imodelClient?: IModelClient;\r\n private static _isIModelBankClient = false;\r\n private static changeSet0 = { id: \"\", changesType: 0, description: \"revision0\", parentId: \"\", briefcaseId: 0, pushDate: \"\", userCreated: \"\", index: 0 };\r\n\r\n public static setIModelClient(client?: IModelClient) {\r\n this._imodelClient = client;\r\n this._isIModelBankClient = client instanceof IModelBankClient;\r\n }\r\n\r\n public static get isUsingIModelBankClient(): boolean {\r\n return this._isIModelBankClient;\r\n }\r\n\r\n public static get iModelClient(): IModelClient {\r\n if (!this._imodelClient)\r\n this._imodelClient = new IModelHubClient(new AzureFileHandler());\r\n\r\n return this._imodelClient;\r\n }\r\n\r\n private static async getAccessToken(arg: TokenArg) {\r\n return arg.accessToken ?? await IModelHost.getAccessToken();\r\n }\r\n public static async getLatestChangeset(arg: IModelIdArg): Promise<ChangesetProps> {\r\n const accessToken = await this.getAccessToken(arg);\r\n const changeSets: ChangeSet[] = await this.iModelClient.changeSets.get(accessToken, arg.iModelId, new ChangeSetQuery().top(1).latest());\r\n return (changeSets.length === 0) ? this.changeSet0 : this.toChangeSetProps(changeSets[changeSets.length - 1]);\r\n }\r\n\r\n public static async getChangesetFromNamedVersion(arg: IModelIdArg & { versionName: string }): Promise<ChangesetProps> {\r\n const accessToken = await this.getAccessToken(arg);\r\n const versions = await this.iModelClient.versions.get(accessToken, arg.iModelId, new VersionQuery().select(\"ChangeSetId\").byName(arg.versionName));\r\n if (!versions[0] || !versions[0].changeSetId)\r\n throw new IModelError(IModelStatus.NotFound, `Named version ${arg.versionName} not found`);\r\n\r\n return this.queryChangeset({ ...arg, changeset: { id: versions[0].changeSetId } });\r\n }\r\n\r\n public static async getChangesetFromVersion(arg: IModelIdArg & { version: IModelVersion }): Promise<ChangesetProps> {\r\n const version = arg.version;\r\n if (version.isFirst)\r\n return this.queryChangeset({ ...arg, changeset: { index: 0 } });\r\n\r\n const asOf = version.getAsOfChangeSet();\r\n if (asOf)\r\n return this.queryChangeset({ ...arg, changeset: { id: asOf } });\r\n\r\n const versionName = version.getName();\r\n if (versionName)\r\n return this.getChangesetFromNamedVersion({ ...arg, versionName });\r\n\r\n return this.getLatestChangeset(arg);\r\n }\r\n\r\n public static async createNewIModel(arg: CreateNewIModelProps): Promise<GuidString> {\r\n if (this.isUsingIModelBankClient)\r\n throw new IModelError(IModelStatus.BadRequest, \"This is a iModelHub only operation\");\r\n\r\n const revision0 = join(IModelHost.cacheDir, \"temp-revision0.bim\");\r\n IModelJsFs.removeSync(revision0);\r\n if (!arg.revision0) { // if they didn't supply a revision0 file, create a blank one.\r\n const blank = SnapshotDb.createEmpty(revision0, { rootSubject: { name: arg.description ?? arg.iModelName } });\r\n blank.saveChanges();\r\n blank.close();\r\n } else {\r\n IModelJsFs.copySync(revision0, arg.revision0);\r\n }\r\n\r\n const nativeDb = IModelDb.openDgnDb({ path: revision0 }, OpenMode.ReadWrite);\r\n try {\r\n nativeDb.setITwinId(arg.iTwinId);\r\n // nativeDb.setDbGuid(this.iModelId); NEEDS_WORK - iModelHub should accept this value, not create it.\r\n nativeDb.saveChanges();\r\n nativeDb.deleteAllTxns(); // necessary before resetting briefcaseId\r\n nativeDb.resetBriefcaseId(BriefcaseIdValue.Unassigned);\r\n nativeDb.saveLocalValue(BriefcaseLocalValue.NoLocking, arg.noLocks ? \"true\" : undefined);\r\n nativeDb.saveChanges();\r\n } finally {\r\n nativeDb.closeIModel();\r\n }\r\n\r\n const accessToken = await this.getAccessToken(arg);\r\n const hubIModel = await this.iModelClient.iModels.create(accessToken, arg.iTwinId, arg.iModelName, { path: revision0, description: arg.description });\r\n IModelJsFs.removeSync(revision0);\r\n return hubIModel.wsgId;\r\n }\r\n\r\n public static async deleteIModel(arg: IModelIdArg & ITwinIdArg): Promise<void> {\r\n const dirName = BriefcaseManager.getIModelPath(arg.iModelId);\r\n if (IModelJsFs.existsSync(dirName)) {\r\n IModelJsFs.purgeDirSync(dirName);\r\n IModelJsFs.rmdirSync(dirName);\r\n }\r\n\r\n const accessToken = await this.getAccessToken(arg);\r\n return this.iModelClient.iModels.delete(accessToken, arg.iTwinId, arg.iModelId);\r\n }\r\n\r\n public static async queryIModelByName(arg: IModelNameArg): Promise<GuidString | undefined> {\r\n const accessToken = await this.getAccessToken(arg);\r\n const iModels = await this.iModelClient.iModels.get(accessToken, arg.iTwinId, new IModelQuery().byName(arg.iModelName));\r\n return iModels.length === 0 ? undefined : iModels[0].id!;\r\n }\r\n\r\n public static async pushChangeset(arg: IModelIdArg & { changesetProps: ChangesetFileProps }): Promise<ChangesetIndex> {\r\n const changeset = new ChangeSet();\r\n const changesetProps = arg.changesetProps;\r\n changeset.id = changesetProps.id;\r\n changeset.parentId = changesetProps.parentId;\r\n changeset.changesType = changesetProps.changesType as number;\r\n changeset.fileSize = changesetProps.size!.toString();\r\n changeset.description = changesetProps.description;\r\n changeset.briefcaseId = changesetProps.briefcaseId;\r\n if (changeset.description.length >= 255) {\r\n Logger.logWarning(\"imodelhub-access\", `pushChanges - Truncating description to 255 characters. ${changeset.description}`);\r\n changeset.description = changeset.description.slice(0, 254);\r\n }\r\n\r\n const accessToken = await this.getAccessToken(arg);\r\n return +(await this.iModelClient.changeSets.create(accessToken, arg.iModelId, changeset, changesetProps.pathname)).index!;\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(arg: BriefcaseIdArg): Promise<void> {\r\n const { briefcaseId, iModelId } = arg;\r\n const accessToken = await this.getAccessToken(arg);\r\n try {\r\n await this.iModelClient.briefcases.get(accessToken, iModelId, new BriefcaseQuery().byId(briefcaseId));\r\n } catch (error) {\r\n throw error;\r\n }\r\n\r\n await this.iModelClient.briefcases.delete(accessToken, iModelId, briefcaseId);\r\n }\r\n\r\n public static async getMyBriefcaseIds(arg: IModelIdArg): Promise<number[]> {\r\n const accessToken = await this.getAccessToken(arg);\r\n const myHubBriefcases = await this.iModelClient.briefcases.get(accessToken, arg.iModelId, new BriefcaseQuery().ownedByMe().selectDownloadUrl());\r\n const myBriefcaseIds: number[] = [];\r\n for (const hubBc of myHubBriefcases)\r\n myBriefcaseIds.push(hubBc.briefcaseId!); // save the list of briefcaseIds we already own.\r\n return myBriefcaseIds;\r\n }\r\n\r\n public static async acquireNewBriefcaseId(arg: AcquireNewBriefcaseIdArg): Promise<number> {\r\n const accessToken = await this.getAccessToken(arg);\r\n const briefcase = await this.iModelClient.briefcases.create(accessToken, arg.iModelId);\r\n\r\n if (!briefcase)\r\n throw new IModelError(BriefcaseStatus.CannotAcquire, \"Could not acquire briefcase\");\r\n\r\n return briefcase.briefcaseId!;\r\n }\r\n\r\n public static toChangeSetProps(cs: ChangeSet): ChangesetProps {\r\n return {\r\n id: cs.wsgId, parentId: cs.parentId ? cs.parentId : \"\", briefcaseId: cs.briefcaseId!, pushDate: cs.pushDate!,\r\n description: cs.description ?? \"\", changesType: (cs.changesType ?? ChangesType.Regular) as number, userCreated: cs.userCreated!,\r\n index: +cs.index!,\r\n };\r\n }\r\n private static toChangeSetFileProps(cs: ChangeSet, basePath: string): ChangesetFileProps {\r\n const csProps = this.toChangeSetProps(cs) as ChangesetFileProps;\r\n csProps.pathname = join(basePath, cs.fileName!);\r\n return csProps;\r\n }\r\n\r\n public static async downloadChangeset(arg: ChangesetArg & { targetDir: LocalDirName }): Promise<ChangesetFileProps> {\r\n const accessToken = await this.getAccessToken(arg);\r\n const changeSetsPath = BriefcaseManager.getChangeSetsPath(arg.iModelId);\r\n\r\n // NEEDS_WORK - allow download by index\r\n const cSet = await this.queryChangeset(arg);\r\n const changeSets = await this.iModelClient.changeSets.download(accessToken, arg.iModelId, new ChangeSetQuery().byId(cSet.id), changeSetsPath);\r\n if (undefined === changeSets)\r\n throw new IModelError(IModelStatus.NotFound, `Cannot download changeset`);\r\n\r\n return this.toChangeSetFileProps(changeSets[0], arg.targetDir);\r\n }\r\n\r\n public static async queryChangeset(arg: ChangesetArg): Promise<ChangesetProps> {\r\n const hasIndex = (undefined !== arg.changeset.index);\r\n if ((hasIndex && arg.changeset.index <= 0) || arg.changeset.id === \"\")\r\n return this.changeSet0;\r\n\r\n const query = new ChangeSetQuery();\r\n if (hasIndex)\r\n query.filter(`Index+eq+${arg.changeset.index}`);\r\n else\r\n query.byId(arg.changeset.id);\r\n\r\n const accessToken = await this.getAccessToken(arg);\r\n const changeSets = await this.iModelClient.changeSets.get(accessToken, arg.iModelId, query);\r\n if (undefined === changeSets)\r\n throw new IModelError(IModelStatus.NotFound, `Changeset not found`);\r\n\r\n return this.toChangeSetProps(changeSets[0]);\r\n }\r\n\r\n private static async getQueryFromRange(arg: ChangesetRangeArg): Promise<ChangeSetQuery | undefined> {\r\n const query = new ChangeSetQuery();\r\n if (!arg.range)\r\n return query; // returns all changesets\r\n\r\n const range = arg.range;\r\n const after = range.first === 0 ? \"\" : (await this.queryChangeset({ ...arg, changeset: { index: range.first } })).parentId;\r\n\r\n if (!range.end)\r\n query.fromId(after); //\r\n else {\r\n const last = (await this.queryChangeset({ ...arg, changeset: { index: range.end } })).id;\r\n if (range.end === 0 || after === last)\r\n return undefined;\r\n query.betweenChangeSets(last, after); // note: weird order is necessary because second arg being blank means \"from start\"\r\n }\r\n\r\n return query;\r\n }\r\n\r\n /** queries for change sets in the specified range. */\r\n public static async queryChangesets(arg: ChangesetRangeArg): Promise<ChangesetProps[]> {\r\n const query = await this.getQueryFromRange(arg);\r\n const val: ChangesetProps[] = [];\r\n if (query) {\r\n const accessToken = await this.getAccessToken(arg);\r\n const changeSets = await this.iModelClient.changeSets.get(accessToken, arg.iModelId, query);\r\n\r\n for (const cs of changeSets)\r\n val.push(this.toChangeSetProps(cs));\r\n }\r\n return val;\r\n }\r\n\r\n /** Downloads change sets in the specified range. */\r\n public static async downloadChangesets(arg: ChangesetRangeArg & { targetDir: LocalDirName }): Promise<ChangesetFileProps[]> {\r\n const val: ChangesetFileProps[] = [];\r\n const query = await this.getQueryFromRange(arg);\r\n if (query) {\r\n const accessToken = await this.getAccessToken(arg);\r\n const changeSets = await this.iModelClient.changeSets.download(accessToken, arg.iModelId, query, arg.targetDir);\r\n\r\n for (const cs of changeSets)\r\n val.push(this.toChangeSetFileProps(cs, arg.targetDir));\r\n }\r\n return val;\r\n }\r\n\r\n public static async downloadV1Checkpoint(arg: CheckPointArg): Promise<ChangesetId> {\r\n const checkpoint = arg.checkpoint;\r\n let checkpointQuery = new CheckpointQuery().selectDownloadUrl();\r\n checkpointQuery = checkpointQuery.precedingCheckpoint(checkpoint.changeset.id);\r\n const accessToken = await this.getAccessToken(checkpoint);\r\n const checkpoints = await this.iModelClient.checkpoints.get(accessToken, checkpoint.iModelId, checkpointQuery);\r\n if (checkpoints.length !== 1)\r\n throw new IModelError(BriefcaseStatus.VersionNotFound, \"no checkpoints not found\");\r\n\r\n const cancelRequest: any = {};\r\n const progressCallback: ProgressCallback = (progress) => {\r\n if (arg.onProgress && arg.onProgress(progress.loaded, progress.total!) !== 0)\r\n cancelRequest.cancel?.();\r\n };\r\n\r\n await this.iModelClient.checkpoints.download(accessToken, checkpoints[0], arg.localFile, progressCallback, cancelRequest);\r\n return checkpoints[0].mergedChangeSetId!;\r\n }\r\n\r\n public static async queryV2Checkpoint(arg: CheckpointProps): Promise<V2CheckpointAccessProps | undefined> {\r\n const checkpointQuery = new CheckpointV2Query().byChangeSetId(arg.changeset.id).selectContainerAccessKey();\r\n const accessToken = await this.getAccessToken(arg);\r\n const checkpoints = await this.iModelClient.checkpointsV2.get(accessToken, arg.iModelId, checkpointQuery);\r\n if (checkpoints.length < 1)\r\n return undefined;\r\n\r\n const { containerAccessKeyContainer, containerAccessKeySAS, containerAccessKeyAccount, containerAccessKeyDbName } = checkpoints[0];\r\n if (!containerAccessKeyContainer || !containerAccessKeySAS || !containerAccessKeyAccount || !containerAccessKeyDbName)\r\n throw new Error(\"Invalid V2 checkpoint in iModelHub\");\r\n\r\n return {\r\n container: containerAccessKeyContainer,\r\n auth: containerAccessKeySAS,\r\n user: containerAccessKeyAccount,\r\n dbAlias: containerAccessKeyDbName,\r\n storageType: \"azure?sas=1\",\r\n };\r\n }\r\n\r\n public static async downloadV2Checkpoint(arg: CheckPointArg): Promise<ChangesetId> {\r\n const checkpoint = arg.checkpoint;\r\n let checkpointQuery = new CheckpointV2Query();\r\n checkpointQuery = checkpointQuery.precedingCheckpointV2(checkpoint.changeset.id).selectContainerAccessKey();\r\n const accessToken = await this.getAccessToken(checkpoint);\r\n let checkpoints: CheckpointV2[] = [];\r\n try {\r\n checkpoints = await this.iModelClient.checkpointsV2.get(accessToken, checkpoint.iModelId, checkpointQuery);\r\n } catch (error) {\r\n if (error instanceof BentleyError && error.errorNumber === IModelHubStatus.Unknown)\r\n throw new IModelError(IModelStatus.NotFound, \"V2 checkpoints not supported\");\r\n throw error;\r\n }\r\n\r\n if (checkpoints.length !== 1)\r\n throw new IModelError(IModelStatus.NotFound, \"V2 checkpoint not found\");\r\n\r\n const { containerAccessKeyContainer, containerAccessKeySAS, containerAccessKeyAccount, containerAccessKeyDbName } = checkpoints[0];\r\n if (!containerAccessKeyContainer || !containerAccessKeySAS || !containerAccessKeyAccount || !containerAccessKeyDbName)\r\n throw new IModelError(IModelStatus.NotFound, \"invalid V2 checkpoint\");\r\n\r\n const downloader = new IModelHost.platform.DownloadV2Checkpoint({\r\n container: containerAccessKeyContainer,\r\n auth: containerAccessKeySAS,\r\n storageType: \"azure?sas=1\",\r\n user: containerAccessKeyAccount,\r\n dbAlias: containerAccessKeyDbName,\r\n writeable: false,\r\n localFile: arg.localFile,\r\n });\r\n\r\n let timer: NodeJS.Timeout | undefined;\r\n try {\r\n let total = 0;\r\n const onProgress = arg.onProgress;\r\n if (onProgress) {\r\n timer = setInterval(async () => { // set an interval timer to show progress every 250ms\r\n const progress = downloader.getProgress();\r\n total = progress.total;\r\n if (onProgress(progress.loaded, progress.total))\r\n downloader.cancelDownload();\r\n }, 250);\r\n }\r\n await downloader.downloadPromise;\r\n onProgress?.(total, total); // make sure we call progress func one last time when download completes\r\n } catch (err: any) {\r\n throw (err.message === \"cancelled\") ? new UserCancelledError(BriefcaseStatus.DownloadCancelled, \"download cancelled\") : err;\r\n } finally {\r\n if (timer)\r\n clearInterval(timer);\r\n }\r\n return checkpoints[0].changeSetId!;\r\n }\r\n\r\n public static async releaseAllLocks(arg: BriefcaseDbArg) {\r\n const accessToken = await this.getAccessToken(arg);\r\n return this.iModelClient.locks.deleteAll(accessToken, arg.iModelId, arg.briefcaseId);\r\n }\r\n\r\n public static async releaseAllCodes(arg: BriefcaseDbArg) {\r\n const accessToken = await this.getAccessToken(arg);\r\n return this.iModelClient.codes.deleteAll(accessToken, arg.iModelId, arg.briefcaseId);\r\n }\r\n\r\n public static async queryAllLocks(arg: BriefcaseDbArg): Promise<LockProps[]> {\r\n const accessToken = await this.getAccessToken(arg);\r\n const heldLocks = await this.iModelClient.locks.get(accessToken, arg.iModelId, new LockQuery().byBriefcaseId(arg.briefcaseId));\r\n return heldLocks.map((lock) => ({ id: lock.objectId!, state: lock.lockLevel! as number }));\r\n }\r\n\r\n public static async queryAllCodes(arg: BriefcaseDbArg): Promise<CodeProps[]> {\r\n const accessToken = await this.getAccessToken(arg);\r\n const reservedCodes = await this.iModelClient.codes.get(accessToken, arg.iModelId, new CodeQuery().byBriefcaseId(arg.briefcaseId));\r\n return reservedCodes.map((code) => ({ spec: code.codeSpecId!, scope: code.codeScope!, value: code.value! }));\r\n }\r\n\r\n public static toHubLock(arg: BriefcaseDbArg, reqLock: LockProps): Lock {\r\n const lock = new Lock();\r\n lock.briefcaseId = arg.briefcaseId;\r\n lock.lockLevel = reqLock.state as number;\r\n lock.lockType = LockType.Element;\r\n lock.objectId = reqLock.id;\r\n lock.releasedWithChangeSet = arg.changeset.id;\r\n lock.seedFileId = arg.iModelId;\r\n return lock;\r\n }\r\n\r\n public static toHubLocks(arg: BriefcaseDbArg & { locks: LockProps[] }): Lock[] {\r\n return arg.locks.map((lock) => this.toHubLock(arg, lock));\r\n }\r\n\r\n public static async acquireLocks(arg: BriefcaseDbArg & { locks: LockProps[] }): Promise<void> {\r\n const hubLocks = this.toHubLocks(arg);\r\n const accessToken = await this.getAccessToken(arg);\r\n await this.iModelClient.locks.update(accessToken, arg.iModelId, hubLocks);\r\n }\r\n}\r\n"]}