@itwin/core-backend 4.0.0-dev.23 → 4.0.0-dev.28
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/CHANGELOG.md +71 -66
- package/lib/cjs/BriefcaseManager.js +13 -19
- package/lib/cjs/BriefcaseManager.js.map +1 -1
- package/lib/cjs/ChangeSummaryManager.js +6 -7
- package/lib/cjs/ChangeSummaryManager.js.map +1 -1
- package/lib/cjs/CheckpointManager.js +3 -4
- package/lib/cjs/CheckpointManager.js.map +1 -1
- package/lib/cjs/ClassRegistry.js +1 -2
- package/lib/cjs/ClassRegistry.js.map +1 -1
- package/lib/cjs/CloudSqlite.js +1 -1
- package/lib/cjs/CloudSqlite.js.map +1 -1
- package/lib/cjs/CloudStorageBackend.js +5 -8
- package/lib/cjs/CloudStorageBackend.js.map +1 -1
- package/lib/cjs/CustomViewState3dCreator.js +2 -2
- package/lib/cjs/CustomViewState3dCreator.js.map +1 -1
- package/lib/cjs/DisplayStyle.js +8 -11
- package/lib/cjs/DisplayStyle.js.map +1 -1
- package/lib/cjs/ECDb.js +2 -4
- package/lib/cjs/ECDb.js.map +1 -1
- package/lib/cjs/Element.js +13 -21
- package/lib/cjs/Element.js.map +1 -1
- package/lib/cjs/ElementTreeWalker.js +2 -2
- package/lib/cjs/ElementTreeWalker.js.map +1 -1
- package/lib/cjs/GeoCoordConfig.js +1 -1
- package/lib/cjs/GeoCoordConfig.js.map +1 -1
- package/lib/cjs/HubMock.js +3 -5
- package/lib/cjs/HubMock.js.map +1 -1
- package/lib/cjs/IModelDb.d.ts +15 -1
- package/lib/cjs/IModelDb.d.ts.map +1 -1
- package/lib/cjs/IModelDb.js +44 -59
- package/lib/cjs/IModelDb.js.map +1 -1
- package/lib/cjs/IModelHost.js +15 -23
- package/lib/cjs/IModelHost.js.map +1 -1
- package/lib/cjs/IModelJsFs.js +2 -3
- package/lib/cjs/IModelJsFs.js.map +1 -1
- package/lib/cjs/IpcHost.js +11 -13
- package/lib/cjs/IpcHost.js.map +1 -1
- package/lib/cjs/LocalHub.js +11 -16
- package/lib/cjs/LocalHub.js.map +1 -1
- package/lib/cjs/LocalhostIpcHost.js +3 -5
- package/lib/cjs/LocalhostIpcHost.js.map +1 -1
- package/lib/cjs/Material.js +1 -2
- package/lib/cjs/Material.js.map +1 -1
- package/lib/cjs/NativeHost.js +3 -6
- package/lib/cjs/NativeHost.js.map +1 -1
- package/lib/cjs/SQLiteDb.js +2 -4
- package/lib/cjs/SQLiteDb.js.map +1 -1
- package/lib/cjs/TileStorage.js +4 -7
- package/lib/cjs/TileStorage.js.map +1 -1
- package/lib/cjs/rpc/tracing.js +1 -2
- package/lib/cjs/rpc/tracing.js.map +1 -1
- package/lib/cjs/rpc/web/request.js +1 -2
- package/lib/cjs/rpc/web/request.js.map +1 -1
- package/lib/cjs/rpc/web/response.js +1 -2
- package/lib/cjs/rpc/web/response.js.map +1 -1
- package/lib/cjs/rpc-impl/IModelReadRpcImpl.js +1 -2
- package/lib/cjs/rpc-impl/IModelReadRpcImpl.js.map +1 -1
- package/lib/cjs/rpc-impl/IModelTileRpcImpl.js +4 -7
- package/lib/cjs/rpc-impl/IModelTileRpcImpl.js.map +1 -1
- package/lib/cjs/rpc-impl/RpcBriefcaseUtility.js +6 -8
- package/lib/cjs/rpc-impl/RpcBriefcaseUtility.js.map +1 -1
- package/lib/cjs/rpc-impl/SnapshotIModelRpcImpl.js +1 -2
- package/lib/cjs/rpc-impl/SnapshotIModelRpcImpl.js.map +1 -1
- package/lib/cjs/workspace/Settings.js +1 -2
- package/lib/cjs/workspace/Settings.js.map +1 -1
- package/lib/cjs/workspace/SettingsSchemas.js +3 -4
- package/lib/cjs/workspace/SettingsSchemas.js.map +1 -1
- package/lib/cjs/workspace/Workspace.js +15 -21
- package/lib/cjs/workspace/Workspace.js.map +1 -1
- package/package.json +12 -12
package/lib/cjs/LocalHub.js
CHANGED
|
@@ -19,7 +19,6 @@ const SQLiteDb_1 = require("./SQLiteDb");
|
|
|
19
19
|
*/
|
|
20
20
|
class LocalHub {
|
|
21
21
|
constructor(rootDir, arg) {
|
|
22
|
-
var _a, _b;
|
|
23
22
|
this.rootDir = rootDir;
|
|
24
23
|
this._nextBriefcaseId = core_common_1.BriefcaseIdValue.FirstValid;
|
|
25
24
|
this._latestChangesetIndex = 0;
|
|
@@ -44,11 +43,11 @@ class LocalHub {
|
|
|
44
43
|
db.executeSQL("CREATE INDEX SharedLockIdx ON sharedLocks(briefcaseId)");
|
|
45
44
|
db.saveChanges();
|
|
46
45
|
const version0Root = `${rootDir}_version0`;
|
|
47
|
-
const version0 =
|
|
46
|
+
const version0 = arg.version0 ?? (0, path_1.join)(version0Root, "version0.bim");
|
|
48
47
|
if (!arg.version0) { // if they didn't supply a version0 file, create a blank one.
|
|
49
48
|
IModelJsFs_1.IModelJsFs.recursiveMkDirSync(version0Root);
|
|
50
49
|
IModelJsFs_1.IModelJsFs.removeSync(version0);
|
|
51
|
-
IModelDb_1.SnapshotDb.createEmpty(version0, { rootSubject: { name:
|
|
50
|
+
IModelDb_1.SnapshotDb.createEmpty(version0, { rootSubject: { name: arg.description ?? arg.iModelName } }).close();
|
|
52
51
|
}
|
|
53
52
|
const path = this.uploadCheckpoint({ changesetIndex: 0, localFile: version0 });
|
|
54
53
|
if (!arg.version0)
|
|
@@ -80,7 +79,7 @@ class LocalHub {
|
|
|
80
79
|
db.withSqliteStatement("INSERT INTO briefcases(id,user,alias) VALUES (?,?,?)", (stmt) => {
|
|
81
80
|
stmt.bindInteger(1, newId);
|
|
82
81
|
stmt.bindString(2, user);
|
|
83
|
-
stmt.bindString(3, alias
|
|
82
|
+
stmt.bindString(3, alias ?? `${user} (${newId})`);
|
|
84
83
|
const rc = stmt.step();
|
|
85
84
|
if (core_bentley_1.DbResult.BE_SQLITE_DONE !== rc)
|
|
86
85
|
throw new core_common_1.IModelError(rc, "can't insert briefcaseId in mock database");
|
|
@@ -153,14 +152,13 @@ class LocalHub {
|
|
|
153
152
|
const db = this.db;
|
|
154
153
|
changeset.index = this._latestChangesetIndex + 1;
|
|
155
154
|
db.withSqliteStatement("INSERT INTO timeline(csIndex,csId,description,size,type,pushDate,user,briefcaseId) VALUES (?,?,?,?,?,?,?,?)", (stmt) => {
|
|
156
|
-
var _a, _b, _c;
|
|
157
155
|
stmt.bindInteger(1, changeset.index);
|
|
158
156
|
stmt.bindString(2, changeset.id);
|
|
159
157
|
stmt.bindString(3, changeset.description);
|
|
160
158
|
stmt.bindInteger(4, stats.size);
|
|
161
|
-
stmt.bindInteger(5,
|
|
162
|
-
stmt.bindString(6,
|
|
163
|
-
stmt.bindString(7,
|
|
159
|
+
stmt.bindInteger(5, changeset.changesType ?? 0);
|
|
160
|
+
stmt.bindString(6, changeset.pushDate ?? new Date().toISOString());
|
|
161
|
+
stmt.bindString(7, changeset.userCreated ?? "");
|
|
164
162
|
stmt.bindInteger(8, changeset.briefcaseId);
|
|
165
163
|
const rc = stmt.step();
|
|
166
164
|
if (core_bentley_1.DbResult.BE_SQLITE_DONE !== rc)
|
|
@@ -172,8 +170,7 @@ class LocalHub {
|
|
|
172
170
|
return changeset.index;
|
|
173
171
|
}
|
|
174
172
|
getIndexFromChangeset(changeset) {
|
|
175
|
-
|
|
176
|
-
return (_a = changeset.index) !== null && _a !== void 0 ? _a : this.getChangesetIndex(changeset.id);
|
|
173
|
+
return changeset.index ?? this.getChangesetIndex(changeset.id);
|
|
177
174
|
}
|
|
178
175
|
/** Get the index of a changeset by its Id */
|
|
179
176
|
getChangesetIndex(id) {
|
|
@@ -239,10 +236,9 @@ class LocalHub {
|
|
|
239
236
|
}
|
|
240
237
|
/** Get an array of changesets starting with first to last, by index */
|
|
241
238
|
queryChangesets(range) {
|
|
242
|
-
var _a, _b;
|
|
243
239
|
const changesets = [];
|
|
244
|
-
const first =
|
|
245
|
-
const last =
|
|
240
|
+
const first = range?.first ?? 0;
|
|
241
|
+
const last = range?.end ?? this.latestChangesetIndex;
|
|
246
242
|
this.db.withPreparedSqliteStatement("SELECT csIndex FROM timeline WHERE csIndex>=? AND csIndex<=? ORDER BY csIndex", (stmt) => {
|
|
247
243
|
stmt.bindInteger(1, first);
|
|
248
244
|
stmt.bindInteger(2, last);
|
|
@@ -304,9 +300,8 @@ class LocalHub {
|
|
|
304
300
|
}
|
|
305
301
|
/** Get an array of the indexes for a range of checkpoints */
|
|
306
302
|
getCheckpoints(range) {
|
|
307
|
-
|
|
308
|
-
const
|
|
309
|
-
const last = (_b = range === null || range === void 0 ? void 0 : range.end) !== null && _b !== void 0 ? _b : this.latestChangesetIndex;
|
|
303
|
+
const first = range?.first ?? 0;
|
|
304
|
+
const last = range?.end ?? this.latestChangesetIndex;
|
|
310
305
|
const checkpoints = [];
|
|
311
306
|
this.db.withSqliteStatement("SELECT csIndex FROM checkpoints WHERE csIndex>=? AND csIndex<=? ORDER BY csIndex", (stmt) => {
|
|
312
307
|
stmt.bindInteger(1, first);
|
package/lib/cjs/LocalHub.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"LocalHub.js","sourceRoot":"","sources":["../../src/LocalHub.ts"],"names":[],"mappings":"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","sourcesContent":["/*---------------------------------------------------------------------------------------------\n* Copyright (c) Bentley Systems, Incorporated. All rights reserved.\n* See LICENSE.md in the project root for license terms and full copyright notice.\n*--------------------------------------------------------------------------------------------*/\n\nimport { join } from \"path\";\nimport { DbResult, GuidString, Id64String, IModelHubStatus, IModelStatus, OpenMode } from \"@itwin/core-bentley\";\nimport {\n BriefcaseId, BriefcaseIdValue, ChangesetFileProps, ChangesetId, ChangesetIdWithIndex, ChangesetIndex, ChangesetIndexOrId, ChangesetProps,\n ChangesetRange, IModelError, LocalDirName, LocalFileName,\n} from \"@itwin/core-common\";\nimport { LockConflict, LockMap, LockProps, LockState } from \"./BackendHubAccess\";\nimport { BriefcaseManager } from \"./BriefcaseManager\";\nimport { BriefcaseLocalValue, IModelDb, SnapshotDb } from \"./IModelDb\";\nimport { IModelJsFs } from \"./IModelJsFs\";\nimport { SQLiteDb } from \"./SQLiteDb\";\n\n// cspell:ignore rowid\n\n/** @internal */\ninterface MockBriefcaseIdProps {\n id: BriefcaseId;\n user: string; // Just an AccessToken that simulates a user\n alias: string;\n assigned: boolean;\n}\n\n/** @internal */\ninterface LocalHubProps {\n readonly iTwinId: GuidString;\n readonly iModelId: GuidString;\n readonly iModelName: string;\n readonly description?: string;\n readonly version0?: string;\n readonly noLocks?: true;\n}\n\ninterface LocksEntry {\n id: Id64String;\n level: LockState;\n lastCsIndex?: ChangesetIndex;\n briefcaseId?: BriefcaseId;\n}\n\ninterface LockStatusNone {\n state: LockState.None;\n lastCsIndex?: ChangesetIndex;\n}\n\n/** @internal exported for tests. */\nexport interface LockStatusExclusive {\n state: LockState.Exclusive;\n briefcaseId: BriefcaseId;\n lastCsIndex?: ChangesetIndex;\n}\n\n/** @internal exported for tests. */\nexport interface LockStatusShared {\n state: LockState.Shared;\n sharedBy: Set<BriefcaseId>;\n lastCsIndex?: ChangesetIndex;\n}\n\ninterface BriefcaseIdAndChangeset {\n changeset: ChangesetIdWithIndex;\n briefcaseId: BriefcaseId;\n}\n\ntype LockStatus = LockStatusNone | LockStatusExclusive | LockStatusShared;\n\n/**\n * A \"local\" mock for IModelHub to provide access to a single iModel. Used by HubMock.\n * @internal\n */\nexport class LocalHub {\n public readonly iTwinId: GuidString;\n public readonly iModelId: GuidString;\n public readonly iModelName: string;\n public readonly description?: string;\n private _hubDb?: SQLiteDb;\n private _nextBriefcaseId = BriefcaseIdValue.FirstValid;\n private _latestChangesetIndex = 0;\n public get latestChangesetIndex() { return this._latestChangesetIndex; }\n\n public constructor(public readonly rootDir: LocalDirName, arg: LocalHubProps) {\n this.iTwinId = arg.iTwinId;\n this.iModelId = arg.iModelId;\n this.iModelName = arg.iModelName;\n this.description = arg.description;\n\n this.cleanup();\n\n IModelJsFs.recursiveMkDirSync(this.rootDir);\n IModelJsFs.mkdirSync(this.changesetDir);\n IModelJsFs.mkdirSync(this.checkpointDir);\n\n const db = this._hubDb = new SQLiteDb();\n db.createDb(this.mockDbName);\n db.executeSQL(\"CREATE TABLE briefcases(id INTEGER PRIMARY KEY NOT NULL,user TEXT NOT NULL,alias TEXT NOT NULL,assigned INTEGER DEFAULT 1)\");\n db.executeSQL(\"CREATE TABLE timeline(csIndex INTEGER PRIMARY KEY NOT NULL,csId TEXT NOT NULL UNIQUE,description TEXT,user TEXT,size BIGINT,type INTEGER,pushDate TEXT,briefcaseId INTEGER,\\\n FOREIGN KEY(briefcaseId) REFERENCES briefcases(id))\");\n db.executeSQL(\"CREATE TABLE checkpoints(csIndex INTEGER PRIMARY KEY NOT NULL)\");\n db.executeSQL(\"CREATE TABLE versions(name TEXT PRIMARY KEY NOT NULL,csIndex TEXT,FOREIGN KEY(csIndex) REFERENCES timeline(csIndex))\");\n db.executeSQL(\"CREATE TABLE locks(id INTEGER PRIMARY KEY NOT NULL,level INTEGER NOT NULL,lastCSetIndex INTEGER,briefcaseId INTEGER)\");\n db.executeSQL(\"CREATE TABLE sharedLocks(lockId INTEGER NOT NULL,briefcaseId INTEGER NOT NULL,PRIMARY KEY(lockId,briefcaseId))\");\n db.executeSQL(\"CREATE INDEX LockIdx ON locks(briefcaseId)\");\n db.executeSQL(\"CREATE INDEX SharedLockIdx ON sharedLocks(briefcaseId)\");\n db.saveChanges();\n\n const version0Root = `${rootDir}_version0`;\n const version0 = arg.version0 ?? join(version0Root, \"version0.bim\");\n\n if (!arg.version0) { // if they didn't supply a version0 file, create a blank one.\n IModelJsFs.recursiveMkDirSync(version0Root);\n IModelJsFs.removeSync(version0);\n SnapshotDb.createEmpty(version0, { rootSubject: { name: arg.description ?? arg.iModelName } }).close();\n }\n\n const path = this.uploadCheckpoint({ changesetIndex: 0, localFile: version0 });\n if (!arg.version0)\n IModelJsFs.removeSync(version0);\n\n const nativeDb = IModelDb.openDgnDb({ path }, OpenMode.ReadWrite);\n try {\n nativeDb.setITwinId(this.iTwinId);\n nativeDb.setIModelId(this.iModelId);\n nativeDb.saveChanges();\n nativeDb.deleteAllTxns(); // necessary before resetting briefcaseId\n nativeDb.resetBriefcaseId(BriefcaseIdValue.Unassigned);\n nativeDb.saveLocalValue(BriefcaseLocalValue.NoLocking, arg.noLocks ? \"true\" : undefined);\n nativeDb.saveChanges();\n } finally {\n nativeDb.closeIModel();\n }\n }\n\n // eslint-disable-next-line @typescript-eslint/no-non-null-assertion\n private get db(): SQLiteDb { return this._hubDb!; } // eslint-disable-line @typescript-eslint/naming-convention\n public get changesetDir() { return join(this.rootDir, \"changesets\"); }\n public get checkpointDir() { return join(this.rootDir, \"checkpoints\"); }\n public get mockDbName() { return join(this.rootDir, \"localHub.db\"); }\n\n /** Acquire the next available briefcaseId and assign it to the supplied user */\n public acquireNewBriefcaseId(user: string, alias?: string): BriefcaseId {\n const db = this.db;\n const newId = this._nextBriefcaseId++;\n db.withSqliteStatement(\"INSERT INTO briefcases(id,user,alias) VALUES (?,?,?)\", (stmt) => {\n stmt.bindInteger(1, newId);\n stmt.bindString(2, user);\n stmt.bindString(3, alias ?? `${user} (${newId})`);\n const rc = stmt.step();\n if (DbResult.BE_SQLITE_DONE !== rc)\n throw new IModelError(rc, \"can't insert briefcaseId in mock database\");\n });\n db.saveChanges();\n return newId;\n }\n\n /** Release a briefcaseId */\n public releaseBriefcaseId(id: BriefcaseId) {\n const db = this.db;\n this.releaseAllLocks({ briefcaseId: id, changesetIndex: 0 });\n db.withSqliteStatement(\"UPDATE briefcases SET assigned=0 WHERE id=?\", (stmt) => {\n stmt.bindInteger(1, id);\n const rc = stmt.step();\n if (DbResult.BE_SQLITE_DONE !== rc)\n throw new IModelError(rc, `briefcaseId ${id} was not reserved`);\n });\n db.saveChanges();\n }\n\n /** Get an array of all of the currently assigned Briefcases */\n public getBriefcases(onlyAssigned = true): MockBriefcaseIdProps[] {\n const briefcases: MockBriefcaseIdProps[] = [];\n let sql = \"SELECT id,user,alias,assigned FROM briefcases\";\n if (onlyAssigned)\n sql += \" WHERE assigned=1\";\n\n this.db.withSqliteStatement(sql, (stmt) => {\n while (DbResult.BE_SQLITE_ROW === stmt.step()) {\n briefcases.push({\n id: stmt.getValueInteger(0),\n user: stmt.getValueString(1),\n alias: stmt.getValueString(2),\n assigned: stmt.getValueInteger(3) !== 0,\n });\n }\n });\n return briefcases;\n }\n\n /** Get an array of all of the currently assigned BriefcaseIds for a user */\n public getBriefcaseIds(user: string): BriefcaseId[] {\n const briefcases: BriefcaseId[] = [];\n this.db.withSqliteStatement(\"SELECT id FROM briefcases WHERE user=? AND assigned=1\", (stmt) => {\n stmt.bindString(1, user);\n while (DbResult.BE_SQLITE_ROW === stmt.step())\n briefcases.push(stmt.getValueInteger(0));\n });\n return briefcases;\n }\n\n public getBriefcase(id: BriefcaseId): MockBriefcaseIdProps {\n return this.db.withSqliteStatement(\"SELECT user,alias,assigned FROM briefcases WHERE id=?\", (stmt) => {\n stmt.bindInteger(1, id);\n if (DbResult.BE_SQLITE_ROW !== stmt.step())\n throw new IModelError(IModelStatus.NotFound, \"no briefcase with that id\");\n return { id, user: stmt.getValueString(0), alias: stmt.getValueString(1), assigned: stmt.getValueInteger(2) !== 0 };\n });\n }\n\n private getChangesetFileName(index: ChangesetIndex) {\n return join(this.changesetDir, `changeset-${index}`);\n }\n\n /** Add a changeset to the timeline\n * @return the changesetIndex of the added changeset\n */\n public addChangeset(changeset: ChangesetFileProps): ChangesetIndex {\n const stats = IModelJsFs.lstatSync(changeset.pathname);\n if (!stats)\n throw new Error(`cannot read changeset file ${changeset.pathname}`);\n\n const parentIndex = this.getChangesetById(changeset.parentId).index;\n if (parentIndex !== this.latestChangesetIndex)\n throw new IModelError(IModelStatus.InvalidParent, \"changeset parent is not latest changeset\");\n\n this.getBriefcase(changeset.briefcaseId); // throws if invalid id\n const db = this.db;\n changeset.index = this._latestChangesetIndex + 1;\n db.withSqliteStatement(\"INSERT INTO timeline(csIndex,csId,description,size,type,pushDate,user,briefcaseId) VALUES (?,?,?,?,?,?,?,?)\", (stmt) => {\n stmt.bindInteger(1, changeset.index);\n stmt.bindString(2, changeset.id);\n stmt.bindString(3, changeset.description);\n stmt.bindInteger(4, stats.size);\n stmt.bindInteger(5, changeset.changesType ?? 0);\n stmt.bindString(6, changeset.pushDate ?? new Date().toISOString());\n stmt.bindString(7, changeset.userCreated ?? \"\");\n stmt.bindInteger(8, changeset.briefcaseId);\n const rc = stmt.step();\n if (DbResult.BE_SQLITE_DONE !== rc)\n throw new IModelError(rc, \"can't insert changeset into mock db\");\n });\n this._latestChangesetIndex = changeset.index; // only change this after insert succeeds\n db.saveChanges();\n IModelJsFs.copySync(changeset.pathname, this.getChangesetFileName(changeset.index));\n return changeset.index;\n }\n\n public getIndexFromChangeset(changeset: ChangesetIndexOrId): ChangesetIndex {\n return changeset.index ?? this.getChangesetIndex(changeset.id);\n }\n\n /** Get the index of a changeset by its Id */\n public getChangesetIndex(id: ChangesetId): ChangesetIndex {\n if (id === \"\")\n return 0;\n\n return this.db.withPreparedSqliteStatement(\"SELECT csIndex FROM timeline WHERE csId=?\", (stmt) => {\n stmt.bindString(1, id);\n const rc = stmt.step();\n if (DbResult.BE_SQLITE_ROW !== rc)\n throw new IModelError(rc, `changeset ${id} not found`);\n\n return stmt.getValueInteger(0);\n });\n }\n\n /** Get the properties of a changeset by its Id */\n public getChangesetById(id: ChangesetId): ChangesetProps {\n return this.getChangesetByIndex(this.getChangesetIndex(id));\n }\n\n public getPreviousIndex(index: ChangesetIndex) {\n return this.db.withPreparedSqliteStatement(\"SELECT max(csIndex) FROM timeline WHERE csIndex<?\", (stmt) => {\n stmt.bindInteger(1, index);\n const rc = stmt.step();\n if (DbResult.BE_SQLITE_ROW !== rc)\n throw new IModelError(rc, `cannot get previous index`);\n\n return stmt.getValueInteger(0);\n });\n }\n\n public getParentId(index: ChangesetIndex): ChangesetId {\n if (index === 0)\n return \"\";\n\n return this.db.withPreparedSqliteStatement(\"SELECT csId FROM timeline WHERE csIndex=?\", (stmt) => {\n stmt.bindInteger(1, this.getPreviousIndex(index));\n stmt.step();\n return stmt.getValueString(0);\n });\n }\n\n /** Get the properties of a changeset by its index */\n public getChangesetByIndex(index: ChangesetIndex): ChangesetProps {\n if (index <= 0)\n return { id: \"\", changesType: 0, description: \"version0\", parentId: \"\", briefcaseId: 0, pushDate: \"\", userCreated: \"\", index: 0 };\n\n return this.db.withPreparedSqliteStatement(\"SELECT description,size,type,pushDate,user,csId,briefcaseId FROM timeline WHERE csIndex=?\", (stmt) => {\n stmt.bindInteger(1, index);\n const rc = stmt.step();\n if (DbResult.BE_SQLITE_ROW !== rc)\n throw new IModelError(rc, `changeset at index ${index} not found`);\n\n return {\n description: stmt.getValueString(0),\n size: stmt.getValueDouble(1),\n changesType: stmt.getValueInteger(2),\n pushDate: stmt.getValueString(3),\n userCreated: stmt.getValueString(4),\n id: stmt.getValueString(5),\n briefcaseId: stmt.getValueInteger(6),\n index,\n parentId: this.getParentId(index),\n };\n });\n }\n\n public getLatestChangeset(): ChangesetProps {\n return this.getChangesetByIndex(this.latestChangesetIndex);\n }\n\n public getChangesetId(index: ChangesetIndex): ChangesetId {\n return this.getChangesetByIndex(index).id;\n }\n\n /** Get an array of changesets starting with first to last, by index */\n public queryChangesets(range?: ChangesetRange): ChangesetProps[] {\n const changesets: ChangesetProps[] = [];\n const first = range?.first ?? 0;\n const last = range?.end ?? this.latestChangesetIndex;\n\n this.db.withPreparedSqliteStatement(\"SELECT csIndex FROM timeline WHERE csIndex>=? AND csIndex<=? ORDER BY csIndex\", (stmt) => {\n stmt.bindInteger(1, first);\n stmt.bindInteger(2, last);\n while (DbResult.BE_SQLITE_ROW === stmt.step())\n changesets.push(this.getChangesetByIndex(stmt.getValueInteger(0)));\n });\n return changesets;\n }\n\n /** Name a version */\n public addNamedVersion(arg: { versionName: string, csIndex: ChangesetIndex }) {\n const db = this.db;\n db.withSqliteStatement(\"INSERT INTO versions(name,csIndex) VALUES (?,?)\", (stmt) => {\n stmt.bindString(1, arg.versionName);\n stmt.bindInteger(2, arg.csIndex);\n const rc = stmt.step();\n if (DbResult.BE_SQLITE_DONE !== rc)\n throw new IModelError(rc, \"can't insert named version\");\n });\n db.saveChanges();\n }\n\n /** Delete a named version */\n public deleteNamedVersion(versionName: string) {\n const db = this.db;\n db.withSqliteStatement(\"DELETE FROM versions WHERE name=?\", (stmt) => {\n stmt.bindString(1, versionName);\n const rc = stmt.step();\n if (DbResult.BE_SQLITE_DONE !== rc)\n throw new IModelError(rc, \"can't delete named version\");\n });\n db.saveChanges();\n }\n\n /** find the changeset for a named version */\n public findNamedVersion(versionName: string): ChangesetProps {\n const index = this.db.withSqliteStatement(\"SELECT csIndex FROM versions WHERE name=?\", (stmt) => {\n stmt.bindString(1, versionName);\n const rc = stmt.step();\n if (DbResult.BE_SQLITE_ROW !== rc)\n throw new IModelError(IModelStatus.NotFound, `Named version ${versionName} not found`);\n return stmt.getValueInteger(0);\n });\n return this.getChangesetByIndex(index);\n }\n\n public checkpointNameFromIndex(csIndex: ChangesetIndex) {\n return `checkpoint-${csIndex}`;\n }\n\n /** \"upload\" a checkpoint */\n public uploadCheckpoint(arg: { changesetIndex: ChangesetIndex, localFile: LocalFileName }) {\n const db = this.db;\n db.withSqliteStatement(\"INSERT INTO checkpoints(csIndex) VALUES (?)\", (stmt) => {\n stmt.bindInteger(1, arg.changesetIndex);\n const res = stmt.step();\n if (DbResult.BE_SQLITE_DONE !== res)\n throw new IModelError(res, \"can't insert checkpoint into mock db\");\n });\n db.saveChanges();\n const outName = join(this.checkpointDir, this.checkpointNameFromIndex(arg.changesetIndex));\n IModelJsFs.copySync(arg.localFile, outName);\n return outName;\n }\n\n /** Get an array of the indexes for a range of checkpoints */\n public getCheckpoints(range?: ChangesetRange): ChangesetIndex[] {\n const first = range?.first ?? 0;\n const last = range?.end ?? this.latestChangesetIndex;\n\n const checkpoints: ChangesetIndex[] = [];\n this.db.withSqliteStatement(\"SELECT csIndex FROM checkpoints WHERE csIndex>=? AND csIndex<=? ORDER BY csIndex\", (stmt) => {\n stmt.bindInteger(1, first);\n stmt.bindInteger(2, last);\n while (DbResult.BE_SQLITE_ROW === stmt.step())\n checkpoints.push(stmt.getValueInteger(0));\n\n });\n return checkpoints;\n }\n\n /** Find the checkpoint that is no newer than a changesetIndex */\n public queryPreviousCheckpoint(changesetIndex: ChangesetIndex): ChangesetIndex {\n if (changesetIndex <= 0)\n return 0;\n\n return this.db.withSqliteStatement(\"SELECT max(csIndex) FROM checkpoints WHERE csIndex <= ? \", (stmt) => {\n stmt.bindInteger(1, changesetIndex);\n const res = stmt.step();\n if (DbResult.BE_SQLITE_ROW !== res)\n throw new IModelError(res, \"can't get previous checkpoint\");\n return stmt.getValueInteger(0);\n });\n }\n\n /** \"download\" a checkpoint */\n public downloadCheckpoint(arg: { changeset: ChangesetIndexOrId, targetFile: LocalFileName }) {\n const index = this.getIndexFromChangeset(arg.changeset);\n const prev = this.queryPreviousCheckpoint(index);\n IModelJsFs.copySync(join(this.checkpointDir, this.checkpointNameFromIndex(prev)), arg.targetFile);\n const changeset = this.getChangesetByIndex(index);\n return { index, id: changeset.id };\n }\n\n private copyChangeset(arg: ChangesetFileProps): ChangesetFileProps {\n IModelJsFs.copySync(this.getChangesetFileName(arg.index), arg.pathname);\n return arg;\n }\n\n /** \"download\" a changeset */\n public downloadChangeset(arg: { index: ChangesetIndex, targetDir: LocalDirName }) {\n const cs = this.getChangesetByIndex(arg.index);\n const csProps = { ...cs, pathname: join(arg.targetDir, cs.id), index: arg.index };\n return this.copyChangeset(csProps);\n }\n\n /** \"download\" all the changesets in a given range */\n public downloadChangesets(arg: { range?: ChangesetRange, targetDir: LocalDirName }): ChangesetFileProps[] {\n const cSets = this.queryChangesets(arg.range) as ChangesetFileProps[];\n for (const cs of cSets) {\n cs.pathname = join(arg.targetDir, cs.id);\n this.copyChangeset(cs);\n }\n return cSets;\n }\n\n private querySharedLockHolders(elementId: Id64String) {\n return this.db.withPreparedSqliteStatement(\"SELECT briefcaseId FROM sharedLocks WHERE lockId=?\", (stmt) => {\n stmt.bindId(1, elementId);\n const briefcases = new Set<BriefcaseId>();\n while (DbResult.BE_SQLITE_ROW === stmt.step())\n briefcases.add(stmt.getValueInteger(0));\n return briefcases;\n });\n }\n\n public queryAllLocks(briefcaseId: BriefcaseId) {\n this.getBriefcase(briefcaseId); // throws if briefcaseId invalid.\n const locks: LockProps[] = [];\n this.db.withPreparedSqliteStatement(\"SELECT id FROM locks WHERE briefcaseId=?\", (stmt) => {\n stmt.bindInteger(1, briefcaseId);\n while (DbResult.BE_SQLITE_ROW === stmt.step())\n locks.push({ id: stmt.getValueId(0), state: LockState.Exclusive });\n });\n this.db.withPreparedSqliteStatement(\"SELECT lockId FROM sharedLocks WHERE briefcaseId=?\", (stmt) => {\n stmt.bindInteger(1, briefcaseId);\n while (DbResult.BE_SQLITE_ROW === stmt.step())\n locks.push({ id: stmt.getValueId(0), state: LockState.Shared });\n });\n return locks;\n }\n\n public queryLockStatus(elementId: Id64String): LockStatus {\n return this.db.withPreparedSqliteStatement(\"SELECT lastCSetIndex,level,briefcaseId FROM locks WHERE id=?\", (stmt) => {\n stmt.bindId(1, elementId);\n const rc = stmt.step();\n if (DbResult.BE_SQLITE_ROW !== rc)\n return { state: LockState.None };\n const lastCsVal = stmt.getValue(0);\n const lock = {\n lastCsIndex: lastCsVal.isNull ? undefined : lastCsVal.getInteger(),\n state: stmt.getValueInteger(1),\n };\n switch (lock.state) {\n case LockState.None:\n return lock;\n case LockState.Exclusive:\n return { ...lock, briefcaseId: stmt.getValueInteger(2) };\n case LockState.Shared:\n return { ...lock, sharedBy: this.querySharedLockHolders(elementId) };\n default:\n throw new Error(\"illegal lock state\");\n }\n });\n }\n\n private reserveLock(currStatus: LockStatus, props: LockProps, briefcase: BriefcaseIdAndChangeset) {\n if (props.state === LockState.Exclusive && currStatus.lastCsIndex && (currStatus.lastCsIndex > this.getIndexFromChangeset(briefcase.changeset)))\n throw new IModelError(IModelHubStatus.PullIsRequired, \"pull is required to obtain lock\");\n\n const wantShared = props.state === LockState.Shared;\n if (wantShared && (currStatus.state === LockState.Exclusive))\n throw new Error(\"cannot acquire shared lock because an exclusive lock is already held\");\n\n this.db.withPreparedSqliteStatement(\"INSERT INTO locks(id,level,briefcaseId) VALUES(?,?,?) ON CONFLICT(id) DO UPDATE SET briefcaseId=excluded.briefcaseId,level=excluded.level\", (stmt) => {\n stmt.bindId(1, props.id);\n stmt.bindInteger(2, props.state);\n stmt.bindValue(3, wantShared ? undefined : briefcase.briefcaseId);\n const rc = stmt.step();\n if (rc !== DbResult.BE_SQLITE_DONE)\n throw new IModelError(rc, \"cannot insert lock\");\n });\n\n if (wantShared) {\n this.db.withPreparedSqliteStatement(\"INSERT INTO sharedLocks(lockId,briefcaseId) VALUES(?,?)\", (stmt) => {\n stmt.bindId(1, props.id);\n stmt.bindInteger(2, briefcase.briefcaseId);\n const rc = stmt.step();\n if (rc !== DbResult.BE_SQLITE_DONE)\n throw new IModelError(rc, \"cannot insert shared lock\");\n });\n }\n }\n\n private clearLock(id: Id64String) {\n this.db.withPreparedSqliteStatement(\"UPDATE locks SET level=0,briefcaseId=NULL WHERE id=?\", (stmt) => {\n stmt.bindId(1, id);\n const rc = stmt.step();\n if (rc !== DbResult.BE_SQLITE_DONE)\n throw new IModelError(rc, \"can't release lock\");\n });\n }\n\n private updateLockChangeset(id: Id64String, index: ChangesetIndex) {\n if (index <= 0)\n return;\n\n this.db.withPreparedSqliteStatement(\"UPDATE locks SET lastCSetIndex=? WHERE id=?\", (stmt) => {\n stmt.bindInteger(1, index);\n stmt.bindId(2, id);\n const rc = stmt.step();\n if (rc !== DbResult.BE_SQLITE_DONE)\n throw new IModelError(rc, \"can't update lock changeSetId\");\n });\n }\n\n private requestLock(props: LockProps, briefcase: BriefcaseIdAndChangeset) {\n if (props.state === LockState.None)\n throw new Error(\"cannot request lock for LockState.None\");\n\n this.getBriefcase(briefcase.briefcaseId); // throws if briefcaseId invalid.\n\n const lockStatus = this.queryLockStatus(props.id);\n switch (lockStatus.state) {\n case LockState.None:\n return this.reserveLock(lockStatus, props, briefcase);\n\n case LockState.Shared:\n if (props.state === LockState.Shared) {\n if (!lockStatus.sharedBy.has(briefcase.briefcaseId))\n this.reserveLock(lockStatus, props, briefcase);\n } else {\n // if requester is the only one holding a shared lock, \"upgrade\" the lock from shared to exclusive\n if (lockStatus.sharedBy.size > 1 || !lockStatus.sharedBy.has(briefcase.briefcaseId)) {\n const id = lockStatus.sharedBy.values().next().value;\n throw new LockConflict(id, this.getBriefcase(id).alias, \"shared lock is held\");\n }\n this.removeSharedLock(props.id, briefcase.briefcaseId);\n this.reserveLock(this.queryLockStatus(props.id), props, briefcase);\n }\n return;\n\n case LockState.Exclusive:\n if (lockStatus.briefcaseId !== briefcase.briefcaseId)\n throw new LockConflict(lockStatus.briefcaseId, this.getBriefcase(lockStatus.briefcaseId).alias, \"exclusive lock is already held\");\n }\n }\n\n private removeSharedLock(lockId: Id64String, briefcaseId: BriefcaseId) {\n this.db.withPreparedSqliteStatement(\"DELETE FROM sharedLocks WHERE lockId=? AND briefcaseId=?\", (stmt) => {\n stmt.bindId(1, lockId);\n stmt.bindInteger(2, briefcaseId);\n const rc = stmt.step();\n if (rc !== DbResult.BE_SQLITE_DONE)\n throw new IModelError(rc, \"can't remove shared lock\");\n });\n }\n\n private releaseLock(props: LockProps, arg: { briefcaseId: BriefcaseId, changesetIndex: ChangesetIndex }) {\n const lockId = props.id;\n const lockStatus = this.queryLockStatus(lockId);\n switch (lockStatus.state) {\n case LockState.None:\n throw new IModelError(IModelHubStatus.LockDoesNotExist, \"lock not held\");\n\n case LockState.Exclusive:\n if (lockStatus.briefcaseId !== arg.briefcaseId)\n throw new IModelError(IModelHubStatus.LockOwnedByAnotherBriefcase, \"lock not held by this briefcase\");\n this.updateLockChangeset(lockId, arg.changesetIndex);\n this.clearLock(lockId);\n break;\n\n case LockState.Shared:\n if (!lockStatus.sharedBy.has(arg.briefcaseId))\n throw new IModelError(IModelHubStatus.LockDoesNotExist, \"shared lock not held by this briefcase\");\n this.removeSharedLock(lockId, arg.briefcaseId);\n if (lockStatus.sharedBy.size === 1)\n this.clearLock(lockId);\n }\n }\n\n /** Acquire a set of locks. If any lock cannot be acquired, no locks are acquired */\n public acquireLocks(locks: LockMap, briefcase: BriefcaseIdAndChangeset) {\n try {\n for (const lock of locks)\n this.requestLock({ id: lock[0], state: lock[1] }, briefcase);\n this.db.saveChanges(); // only after all locks have been acquired\n } catch (err) {\n this.db.abandonChanges(); // abandon all locks that may have been acquired\n throw err;\n }\n }\n\n public acquireLock(props: LockProps, briefcase: BriefcaseIdAndChangeset) {\n const locks = new Map<Id64String, LockState>();\n locks.set(props.id, props.state);\n this.acquireLocks(locks, briefcase);\n }\n\n public releaseLocks(locks: LockProps[], arg: { briefcaseId: BriefcaseId, changesetIndex: ChangesetIndex }) {\n for (const props of locks)\n this.releaseLock(props, arg);\n this.db.saveChanges();\n }\n\n public releaseAllLocks(arg: { briefcaseId: BriefcaseId, changesetIndex: ChangesetIndex }) {\n const locks = this.queryAllLocks(arg.briefcaseId);\n this.releaseLocks(locks, arg);\n }\n\n private countTable(tableName: string): number {\n return this.db.withSqliteStatement(`SELECT count(*) from ${tableName}`, (stmt) => {\n stmt.step();\n return stmt.getValueInteger(0);\n });\n }\n\n // for debugging\n public countSharedLocks(): number { return this.countTable(\"sharedLocks\"); }\n // for debugging\n public countLocks(): number { return this.countTable(\"locks\"); }\n\n // for debugging\n public queryAllSharedLocks(): { id: Id64String, briefcaseId: BriefcaseId }[] {\n const locks: { id: Id64String, briefcaseId: BriefcaseId }[] = [];\n this.db.withPreparedSqliteStatement(\"SELECT lockId,briefcaseId FROM sharedLocks\", (stmt) => {\n while (DbResult.BE_SQLITE_ROW === stmt.step())\n locks.push({ id: stmt.getValueId(0), briefcaseId: stmt.getValueInteger(1) });\n });\n return locks;\n }\n\n // for debugging\n public queryLocks(): LocksEntry[] {\n const locks: LocksEntry[] = [];\n this.db.withPreparedSqliteStatement(\"SELECT id,level,lastCSetIndex,briefcaseId FROM locks\", (stmt) => {\n while (DbResult.BE_SQLITE_ROW === stmt.step())\n locks.push({\n id: stmt.getValueId(0),\n level: stmt.getValueInteger(1),\n lastCsIndex: stmt.getValue(2).isNull ? undefined : stmt.getValueInteger(2),\n briefcaseId: stmt.getValue(3).isNull ? undefined : stmt.getValueInteger(3),\n });\n });\n return locks;\n }\n\n public removeDir(dirName: string) {\n if (IModelJsFs.existsSync(dirName)) {\n IModelJsFs.purgeDirSync(dirName);\n IModelJsFs.rmdirSync(dirName);\n }\n\n }\n public cleanup() {\n if (this._hubDb) {\n this._hubDb.closeDb();\n this._hubDb = undefined;\n }\n try {\n this.removeDir(BriefcaseManager.getIModelPath(this.iModelId));\n this.removeDir(this.rootDir);\n } catch (err) {\n // eslint-disable-next-line no-console\n console.log(`ERROR: test left an iModel open for [${this.iModelName}]. LocalMock cannot clean up - make sure you call imodel.close() in your test`);\n }\n }\n}\n"]}
|
|
1
|
+
{"version":3,"file":"LocalHub.js","sourceRoot":"","sources":["../../src/LocalHub.ts"],"names":[],"mappings":"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","sourcesContent":["/*---------------------------------------------------------------------------------------------\n* Copyright (c) Bentley Systems, Incorporated. All rights reserved.\n* See LICENSE.md in the project root for license terms and full copyright notice.\n*--------------------------------------------------------------------------------------------*/\n\nimport { join } from \"path\";\nimport { DbResult, GuidString, Id64String, IModelHubStatus, IModelStatus, OpenMode } from \"@itwin/core-bentley\";\nimport {\n BriefcaseId, BriefcaseIdValue, ChangesetFileProps, ChangesetId, ChangesetIdWithIndex, ChangesetIndex, ChangesetIndexOrId, ChangesetProps,\n ChangesetRange, IModelError, LocalDirName, LocalFileName,\n} from \"@itwin/core-common\";\nimport { LockConflict, LockMap, LockProps, LockState } from \"./BackendHubAccess\";\nimport { BriefcaseManager } from \"./BriefcaseManager\";\nimport { BriefcaseLocalValue, IModelDb, SnapshotDb } from \"./IModelDb\";\nimport { IModelJsFs } from \"./IModelJsFs\";\nimport { SQLiteDb } from \"./SQLiteDb\";\n\n// cspell:ignore rowid\n\n/** @internal */\ninterface MockBriefcaseIdProps {\n id: BriefcaseId;\n user: string; // Just an AccessToken that simulates a user\n alias: string;\n assigned: boolean;\n}\n\n/** @internal */\ninterface LocalHubProps {\n readonly iTwinId: GuidString;\n readonly iModelId: GuidString;\n readonly iModelName: string;\n readonly description?: string;\n readonly version0?: string;\n readonly noLocks?: true;\n}\n\ninterface LocksEntry {\n id: Id64String;\n level: LockState;\n lastCsIndex?: ChangesetIndex;\n briefcaseId?: BriefcaseId;\n}\n\ninterface LockStatusNone {\n state: LockState.None;\n lastCsIndex?: ChangesetIndex;\n}\n\n/** @internal exported for tests. */\nexport interface LockStatusExclusive {\n state: LockState.Exclusive;\n briefcaseId: BriefcaseId;\n lastCsIndex?: ChangesetIndex;\n}\n\n/** @internal exported for tests. */\nexport interface LockStatusShared {\n state: LockState.Shared;\n sharedBy: Set<BriefcaseId>;\n lastCsIndex?: ChangesetIndex;\n}\n\ninterface BriefcaseIdAndChangeset {\n changeset: ChangesetIdWithIndex;\n briefcaseId: BriefcaseId;\n}\n\ntype LockStatus = LockStatusNone | LockStatusExclusive | LockStatusShared;\n\n/**\n * A \"local\" mock for IModelHub to provide access to a single iModel. Used by HubMock.\n * @internal\n */\nexport class LocalHub {\n public readonly iTwinId: GuidString;\n public readonly iModelId: GuidString;\n public readonly iModelName: string;\n public readonly description?: string;\n private _hubDb?: SQLiteDb;\n private _nextBriefcaseId = BriefcaseIdValue.FirstValid;\n private _latestChangesetIndex = 0;\n public get latestChangesetIndex() { return this._latestChangesetIndex; }\n\n public constructor(public readonly rootDir: LocalDirName, arg: LocalHubProps) {\n this.iTwinId = arg.iTwinId;\n this.iModelId = arg.iModelId;\n this.iModelName = arg.iModelName;\n this.description = arg.description;\n\n this.cleanup();\n\n IModelJsFs.recursiveMkDirSync(this.rootDir);\n IModelJsFs.mkdirSync(this.changesetDir);\n IModelJsFs.mkdirSync(this.checkpointDir);\n\n const db = this._hubDb = new SQLiteDb();\n db.createDb(this.mockDbName);\n db.executeSQL(\"CREATE TABLE briefcases(id INTEGER PRIMARY KEY NOT NULL,user TEXT NOT NULL,alias TEXT NOT NULL,assigned INTEGER DEFAULT 1)\");\n db.executeSQL(\"CREATE TABLE timeline(csIndex INTEGER PRIMARY KEY NOT NULL,csId TEXT NOT NULL UNIQUE,description TEXT,user TEXT,size BIGINT,type INTEGER,pushDate TEXT,briefcaseId INTEGER,\\\n FOREIGN KEY(briefcaseId) REFERENCES briefcases(id))\");\n db.executeSQL(\"CREATE TABLE checkpoints(csIndex INTEGER PRIMARY KEY NOT NULL)\");\n db.executeSQL(\"CREATE TABLE versions(name TEXT PRIMARY KEY NOT NULL,csIndex TEXT,FOREIGN KEY(csIndex) REFERENCES timeline(csIndex))\");\n db.executeSQL(\"CREATE TABLE locks(id INTEGER PRIMARY KEY NOT NULL,level INTEGER NOT NULL,lastCSetIndex INTEGER,briefcaseId INTEGER)\");\n db.executeSQL(\"CREATE TABLE sharedLocks(lockId INTEGER NOT NULL,briefcaseId INTEGER NOT NULL,PRIMARY KEY(lockId,briefcaseId))\");\n db.executeSQL(\"CREATE INDEX LockIdx ON locks(briefcaseId)\");\n db.executeSQL(\"CREATE INDEX SharedLockIdx ON sharedLocks(briefcaseId)\");\n db.saveChanges();\n\n const version0Root = `${rootDir}_version0`;\n const version0 = arg.version0 ?? join(version0Root, \"version0.bim\");\n\n if (!arg.version0) { // if they didn't supply a version0 file, create a blank one.\n IModelJsFs.recursiveMkDirSync(version0Root);\n IModelJsFs.removeSync(version0);\n SnapshotDb.createEmpty(version0, { rootSubject: { name: arg.description ?? arg.iModelName } }).close();\n }\n\n const path = this.uploadCheckpoint({ changesetIndex: 0, localFile: version0 });\n if (!arg.version0)\n IModelJsFs.removeSync(version0);\n\n const nativeDb = IModelDb.openDgnDb({ path }, OpenMode.ReadWrite);\n try {\n nativeDb.setITwinId(this.iTwinId);\n nativeDb.setIModelId(this.iModelId);\n nativeDb.saveChanges();\n nativeDb.deleteAllTxns(); // necessary before resetting briefcaseId\n nativeDb.resetBriefcaseId(BriefcaseIdValue.Unassigned);\n nativeDb.saveLocalValue(BriefcaseLocalValue.NoLocking, arg.noLocks ? \"true\" : undefined);\n nativeDb.saveChanges();\n } finally {\n nativeDb.closeIModel();\n }\n }\n\n // eslint-disable-next-line @typescript-eslint/no-non-null-assertion\n private get db(): SQLiteDb { return this._hubDb!; } // eslint-disable-line @typescript-eslint/naming-convention\n public get changesetDir() { return join(this.rootDir, \"changesets\"); }\n public get checkpointDir() { return join(this.rootDir, \"checkpoints\"); }\n public get mockDbName() { return join(this.rootDir, \"localHub.db\"); }\n\n /** Acquire the next available briefcaseId and assign it to the supplied user */\n public acquireNewBriefcaseId(user: string, alias?: string): BriefcaseId {\n const db = this.db;\n const newId = this._nextBriefcaseId++;\n db.withSqliteStatement(\"INSERT INTO briefcases(id,user,alias) VALUES (?,?,?)\", (stmt) => {\n stmt.bindInteger(1, newId);\n stmt.bindString(2, user);\n stmt.bindString(3, alias ?? `${user} (${newId})`);\n const rc = stmt.step();\n if (DbResult.BE_SQLITE_DONE !== rc)\n throw new IModelError(rc, \"can't insert briefcaseId in mock database\");\n });\n db.saveChanges();\n return newId;\n }\n\n /** Release a briefcaseId */\n public releaseBriefcaseId(id: BriefcaseId) {\n const db = this.db;\n this.releaseAllLocks({ briefcaseId: id, changesetIndex: 0 });\n db.withSqliteStatement(\"UPDATE briefcases SET assigned=0 WHERE id=?\", (stmt) => {\n stmt.bindInteger(1, id);\n const rc = stmt.step();\n if (DbResult.BE_SQLITE_DONE !== rc)\n throw new IModelError(rc, `briefcaseId ${id} was not reserved`);\n });\n db.saveChanges();\n }\n\n /** Get an array of all of the currently assigned Briefcases */\n public getBriefcases(onlyAssigned = true): MockBriefcaseIdProps[] {\n const briefcases: MockBriefcaseIdProps[] = [];\n let sql = \"SELECT id,user,alias,assigned FROM briefcases\";\n if (onlyAssigned)\n sql += \" WHERE assigned=1\";\n\n this.db.withSqliteStatement(sql, (stmt) => {\n while (DbResult.BE_SQLITE_ROW === stmt.step()) {\n briefcases.push({\n id: stmt.getValueInteger(0),\n user: stmt.getValueString(1),\n alias: stmt.getValueString(2),\n assigned: stmt.getValueInteger(3) !== 0,\n });\n }\n });\n return briefcases;\n }\n\n /** Get an array of all of the currently assigned BriefcaseIds for a user */\n public getBriefcaseIds(user: string): BriefcaseId[] {\n const briefcases: BriefcaseId[] = [];\n this.db.withSqliteStatement(\"SELECT id FROM briefcases WHERE user=? AND assigned=1\", (stmt) => {\n stmt.bindString(1, user);\n while (DbResult.BE_SQLITE_ROW === stmt.step())\n briefcases.push(stmt.getValueInteger(0));\n });\n return briefcases;\n }\n\n public getBriefcase(id: BriefcaseId): MockBriefcaseIdProps {\n return this.db.withSqliteStatement(\"SELECT user,alias,assigned FROM briefcases WHERE id=?\", (stmt) => {\n stmt.bindInteger(1, id);\n if (DbResult.BE_SQLITE_ROW !== stmt.step())\n throw new IModelError(IModelStatus.NotFound, \"no briefcase with that id\");\n return { id, user: stmt.getValueString(0), alias: stmt.getValueString(1), assigned: stmt.getValueInteger(2) !== 0 };\n });\n }\n\n private getChangesetFileName(index: ChangesetIndex) {\n return join(this.changesetDir, `changeset-${index}`);\n }\n\n /** Add a changeset to the timeline\n * @return the changesetIndex of the added changeset\n */\n public addChangeset(changeset: ChangesetFileProps): ChangesetIndex {\n const stats = IModelJsFs.lstatSync(changeset.pathname);\n if (!stats)\n throw new Error(`cannot read changeset file ${changeset.pathname}`);\n\n const parentIndex = this.getChangesetById(changeset.parentId).index;\n if (parentIndex !== this.latestChangesetIndex)\n throw new IModelError(IModelStatus.InvalidParent, \"changeset parent is not latest changeset\");\n\n this.getBriefcase(changeset.briefcaseId); // throws if invalid id\n const db = this.db;\n changeset.index = this._latestChangesetIndex + 1;\n db.withSqliteStatement(\"INSERT INTO timeline(csIndex,csId,description,size,type,pushDate,user,briefcaseId) VALUES (?,?,?,?,?,?,?,?)\", (stmt) => {\n stmt.bindInteger(1, changeset.index);\n stmt.bindString(2, changeset.id);\n stmt.bindString(3, changeset.description);\n stmt.bindInteger(4, stats.size);\n stmt.bindInteger(5, changeset.changesType ?? 0);\n stmt.bindString(6, changeset.pushDate ?? new Date().toISOString());\n stmt.bindString(7, changeset.userCreated ?? \"\");\n stmt.bindInteger(8, changeset.briefcaseId);\n const rc = stmt.step();\n if (DbResult.BE_SQLITE_DONE !== rc)\n throw new IModelError(rc, \"can't insert changeset into mock db\");\n });\n this._latestChangesetIndex = changeset.index; // only change this after insert succeeds\n db.saveChanges();\n IModelJsFs.copySync(changeset.pathname, this.getChangesetFileName(changeset.index));\n return changeset.index;\n }\n\n public getIndexFromChangeset(changeset: ChangesetIndexOrId): ChangesetIndex {\n return changeset.index ?? this.getChangesetIndex(changeset.id);\n }\n\n /** Get the index of a changeset by its Id */\n public getChangesetIndex(id: ChangesetId): ChangesetIndex {\n if (id === \"\")\n return 0;\n\n return this.db.withPreparedSqliteStatement(\"SELECT csIndex FROM timeline WHERE csId=?\", (stmt) => {\n stmt.bindString(1, id);\n const rc = stmt.step();\n if (DbResult.BE_SQLITE_ROW !== rc)\n throw new IModelError(rc, `changeset ${id} not found`);\n\n return stmt.getValueInteger(0);\n });\n }\n\n /** Get the properties of a changeset by its Id */\n public getChangesetById(id: ChangesetId): ChangesetProps {\n return this.getChangesetByIndex(this.getChangesetIndex(id));\n }\n\n public getPreviousIndex(index: ChangesetIndex) {\n return this.db.withPreparedSqliteStatement(\"SELECT max(csIndex) FROM timeline WHERE csIndex<?\", (stmt) => {\n stmt.bindInteger(1, index);\n const rc = stmt.step();\n if (DbResult.BE_SQLITE_ROW !== rc)\n throw new IModelError(rc, `cannot get previous index`);\n\n return stmt.getValueInteger(0);\n });\n }\n\n public getParentId(index: ChangesetIndex): ChangesetId {\n if (index === 0)\n return \"\";\n\n return this.db.withPreparedSqliteStatement(\"SELECT csId FROM timeline WHERE csIndex=?\", (stmt) => {\n stmt.bindInteger(1, this.getPreviousIndex(index));\n stmt.step();\n return stmt.getValueString(0);\n });\n }\n\n /** Get the properties of a changeset by its index */\n public getChangesetByIndex(index: ChangesetIndex): ChangesetProps {\n if (index <= 0)\n return { id: \"\", changesType: 0, description: \"version0\", parentId: \"\", briefcaseId: 0, pushDate: \"\", userCreated: \"\", index: 0 };\n\n return this.db.withPreparedSqliteStatement(\"SELECT description,size,type,pushDate,user,csId,briefcaseId FROM timeline WHERE csIndex=?\", (stmt) => {\n stmt.bindInteger(1, index);\n const rc = stmt.step();\n if (DbResult.BE_SQLITE_ROW !== rc)\n throw new IModelError(rc, `changeset at index ${index} not found`);\n\n return {\n description: stmt.getValueString(0),\n size: stmt.getValueDouble(1),\n changesType: stmt.getValueInteger(2),\n pushDate: stmt.getValueString(3),\n userCreated: stmt.getValueString(4),\n id: stmt.getValueString(5),\n briefcaseId: stmt.getValueInteger(6),\n index,\n parentId: this.getParentId(index),\n };\n });\n }\n\n public getLatestChangeset(): ChangesetProps {\n return this.getChangesetByIndex(this.latestChangesetIndex);\n }\n\n public getChangesetId(index: ChangesetIndex): ChangesetId {\n return this.getChangesetByIndex(index).id;\n }\n\n /** Get an array of changesets starting with first to last, by index */\n public queryChangesets(range?: ChangesetRange): ChangesetProps[] {\n const changesets: ChangesetProps[] = [];\n const first = range?.first ?? 0;\n const last = range?.end ?? this.latestChangesetIndex;\n\n this.db.withPreparedSqliteStatement(\"SELECT csIndex FROM timeline WHERE csIndex>=? AND csIndex<=? ORDER BY csIndex\", (stmt) => {\n stmt.bindInteger(1, first);\n stmt.bindInteger(2, last);\n while (DbResult.BE_SQLITE_ROW === stmt.step())\n changesets.push(this.getChangesetByIndex(stmt.getValueInteger(0)));\n });\n return changesets;\n }\n\n /** Name a version */\n public addNamedVersion(arg: { versionName: string, csIndex: ChangesetIndex }) {\n const db = this.db;\n db.withSqliteStatement(\"INSERT INTO versions(name,csIndex) VALUES (?,?)\", (stmt) => {\n stmt.bindString(1, arg.versionName);\n stmt.bindInteger(2, arg.csIndex);\n const rc = stmt.step();\n if (DbResult.BE_SQLITE_DONE !== rc)\n throw new IModelError(rc, \"can't insert named version\");\n });\n db.saveChanges();\n }\n\n /** Delete a named version */\n public deleteNamedVersion(versionName: string) {\n const db = this.db;\n db.withSqliteStatement(\"DELETE FROM versions WHERE name=?\", (stmt) => {\n stmt.bindString(1, versionName);\n const rc = stmt.step();\n if (DbResult.BE_SQLITE_DONE !== rc)\n throw new IModelError(rc, \"can't delete named version\");\n });\n db.saveChanges();\n }\n\n /** find the changeset for a named version */\n public findNamedVersion(versionName: string): ChangesetProps {\n const index = this.db.withSqliteStatement(\"SELECT csIndex FROM versions WHERE name=?\", (stmt) => {\n stmt.bindString(1, versionName);\n const rc = stmt.step();\n if (DbResult.BE_SQLITE_ROW !== rc)\n throw new IModelError(IModelStatus.NotFound, `Named version ${versionName} not found`);\n return stmt.getValueInteger(0);\n });\n return this.getChangesetByIndex(index);\n }\n\n public checkpointNameFromIndex(csIndex: ChangesetIndex) {\n return `checkpoint-${csIndex}`;\n }\n\n /** \"upload\" a checkpoint */\n public uploadCheckpoint(arg: { changesetIndex: ChangesetIndex, localFile: LocalFileName }) {\n const db = this.db;\n db.withSqliteStatement(\"INSERT INTO checkpoints(csIndex) VALUES (?)\", (stmt) => {\n stmt.bindInteger(1, arg.changesetIndex);\n const res = stmt.step();\n if (DbResult.BE_SQLITE_DONE !== res)\n throw new IModelError(res, \"can't insert checkpoint into mock db\");\n });\n db.saveChanges();\n const outName = join(this.checkpointDir, this.checkpointNameFromIndex(arg.changesetIndex));\n IModelJsFs.copySync(arg.localFile, outName);\n return outName;\n }\n\n /** Get an array of the indexes for a range of checkpoints */\n public getCheckpoints(range?: ChangesetRange): ChangesetIndex[] {\n const first = range?.first ?? 0;\n const last = range?.end ?? this.latestChangesetIndex;\n\n const checkpoints: ChangesetIndex[] = [];\n this.db.withSqliteStatement(\"SELECT csIndex FROM checkpoints WHERE csIndex>=? AND csIndex<=? ORDER BY csIndex\", (stmt) => {\n stmt.bindInteger(1, first);\n stmt.bindInteger(2, last);\n while (DbResult.BE_SQLITE_ROW === stmt.step())\n checkpoints.push(stmt.getValueInteger(0));\n\n });\n return checkpoints;\n }\n\n /** Find the checkpoint that is no newer than a changesetIndex */\n public queryPreviousCheckpoint(changesetIndex: ChangesetIndex): ChangesetIndex {\n if (changesetIndex <= 0)\n return 0;\n\n return this.db.withSqliteStatement(\"SELECT max(csIndex) FROM checkpoints WHERE csIndex <= ? \", (stmt) => {\n stmt.bindInteger(1, changesetIndex);\n const res = stmt.step();\n if (DbResult.BE_SQLITE_ROW !== res)\n throw new IModelError(res, \"can't get previous checkpoint\");\n return stmt.getValueInteger(0);\n });\n }\n\n /** \"download\" a checkpoint */\n public downloadCheckpoint(arg: { changeset: ChangesetIndexOrId, targetFile: LocalFileName }) {\n const index = this.getIndexFromChangeset(arg.changeset);\n const prev = this.queryPreviousCheckpoint(index);\n IModelJsFs.copySync(join(this.checkpointDir, this.checkpointNameFromIndex(prev)), arg.targetFile);\n const changeset = this.getChangesetByIndex(index);\n return { index, id: changeset.id };\n }\n\n private copyChangeset(arg: ChangesetFileProps): ChangesetFileProps {\n IModelJsFs.copySync(this.getChangesetFileName(arg.index), arg.pathname);\n return arg;\n }\n\n /** \"download\" a changeset */\n public downloadChangeset(arg: { index: ChangesetIndex, targetDir: LocalDirName }) {\n const cs = this.getChangesetByIndex(arg.index);\n const csProps = { ...cs, pathname: join(arg.targetDir, cs.id), index: arg.index };\n return this.copyChangeset(csProps);\n }\n\n /** \"download\" all the changesets in a given range */\n public downloadChangesets(arg: { range?: ChangesetRange, targetDir: LocalDirName }): ChangesetFileProps[] {\n const cSets = this.queryChangesets(arg.range) as ChangesetFileProps[];\n for (const cs of cSets) {\n cs.pathname = join(arg.targetDir, cs.id);\n this.copyChangeset(cs);\n }\n return cSets;\n }\n\n private querySharedLockHolders(elementId: Id64String) {\n return this.db.withPreparedSqliteStatement(\"SELECT briefcaseId FROM sharedLocks WHERE lockId=?\", (stmt) => {\n stmt.bindId(1, elementId);\n const briefcases = new Set<BriefcaseId>();\n while (DbResult.BE_SQLITE_ROW === stmt.step())\n briefcases.add(stmt.getValueInteger(0));\n return briefcases;\n });\n }\n\n public queryAllLocks(briefcaseId: BriefcaseId) {\n this.getBriefcase(briefcaseId); // throws if briefcaseId invalid.\n const locks: LockProps[] = [];\n this.db.withPreparedSqliteStatement(\"SELECT id FROM locks WHERE briefcaseId=?\", (stmt) => {\n stmt.bindInteger(1, briefcaseId);\n while (DbResult.BE_SQLITE_ROW === stmt.step())\n locks.push({ id: stmt.getValueId(0), state: LockState.Exclusive });\n });\n this.db.withPreparedSqliteStatement(\"SELECT lockId FROM sharedLocks WHERE briefcaseId=?\", (stmt) => {\n stmt.bindInteger(1, briefcaseId);\n while (DbResult.BE_SQLITE_ROW === stmt.step())\n locks.push({ id: stmt.getValueId(0), state: LockState.Shared });\n });\n return locks;\n }\n\n public queryLockStatus(elementId: Id64String): LockStatus {\n return this.db.withPreparedSqliteStatement(\"SELECT lastCSetIndex,level,briefcaseId FROM locks WHERE id=?\", (stmt) => {\n stmt.bindId(1, elementId);\n const rc = stmt.step();\n if (DbResult.BE_SQLITE_ROW !== rc)\n return { state: LockState.None };\n const lastCsVal = stmt.getValue(0);\n const lock = {\n lastCsIndex: lastCsVal.isNull ? undefined : lastCsVal.getInteger(),\n state: stmt.getValueInteger(1),\n };\n switch (lock.state) {\n case LockState.None:\n return lock;\n case LockState.Exclusive:\n return { ...lock, briefcaseId: stmt.getValueInteger(2) };\n case LockState.Shared:\n return { ...lock, sharedBy: this.querySharedLockHolders(elementId) };\n default:\n throw new Error(\"illegal lock state\");\n }\n });\n }\n\n private reserveLock(currStatus: LockStatus, props: LockProps, briefcase: BriefcaseIdAndChangeset) {\n if (props.state === LockState.Exclusive && currStatus.lastCsIndex && (currStatus.lastCsIndex > this.getIndexFromChangeset(briefcase.changeset)))\n throw new IModelError(IModelHubStatus.PullIsRequired, \"pull is required to obtain lock\");\n\n const wantShared = props.state === LockState.Shared;\n if (wantShared && (currStatus.state === LockState.Exclusive))\n throw new Error(\"cannot acquire shared lock because an exclusive lock is already held\");\n\n this.db.withPreparedSqliteStatement(\"INSERT INTO locks(id,level,briefcaseId) VALUES(?,?,?) ON CONFLICT(id) DO UPDATE SET briefcaseId=excluded.briefcaseId,level=excluded.level\", (stmt) => {\n stmt.bindId(1, props.id);\n stmt.bindInteger(2, props.state);\n stmt.bindValue(3, wantShared ? undefined : briefcase.briefcaseId);\n const rc = stmt.step();\n if (rc !== DbResult.BE_SQLITE_DONE)\n throw new IModelError(rc, \"cannot insert lock\");\n });\n\n if (wantShared) {\n this.db.withPreparedSqliteStatement(\"INSERT INTO sharedLocks(lockId,briefcaseId) VALUES(?,?)\", (stmt) => {\n stmt.bindId(1, props.id);\n stmt.bindInteger(2, briefcase.briefcaseId);\n const rc = stmt.step();\n if (rc !== DbResult.BE_SQLITE_DONE)\n throw new IModelError(rc, \"cannot insert shared lock\");\n });\n }\n }\n\n private clearLock(id: Id64String) {\n this.db.withPreparedSqliteStatement(\"UPDATE locks SET level=0,briefcaseId=NULL WHERE id=?\", (stmt) => {\n stmt.bindId(1, id);\n const rc = stmt.step();\n if (rc !== DbResult.BE_SQLITE_DONE)\n throw new IModelError(rc, \"can't release lock\");\n });\n }\n\n private updateLockChangeset(id: Id64String, index: ChangesetIndex) {\n if (index <= 0)\n return;\n\n this.db.withPreparedSqliteStatement(\"UPDATE locks SET lastCSetIndex=? WHERE id=?\", (stmt) => {\n stmt.bindInteger(1, index);\n stmt.bindId(2, id);\n const rc = stmt.step();\n if (rc !== DbResult.BE_SQLITE_DONE)\n throw new IModelError(rc, \"can't update lock changeSetId\");\n });\n }\n\n private requestLock(props: LockProps, briefcase: BriefcaseIdAndChangeset) {\n if (props.state === LockState.None)\n throw new Error(\"cannot request lock for LockState.None\");\n\n this.getBriefcase(briefcase.briefcaseId); // throws if briefcaseId invalid.\n\n const lockStatus = this.queryLockStatus(props.id);\n switch (lockStatus.state) {\n case LockState.None:\n return this.reserveLock(lockStatus, props, briefcase);\n\n case LockState.Shared:\n if (props.state === LockState.Shared) {\n if (!lockStatus.sharedBy.has(briefcase.briefcaseId))\n this.reserveLock(lockStatus, props, briefcase);\n } else {\n // if requester is the only one holding a shared lock, \"upgrade\" the lock from shared to exclusive\n if (lockStatus.sharedBy.size > 1 || !lockStatus.sharedBy.has(briefcase.briefcaseId)) {\n const id = lockStatus.sharedBy.values().next().value;\n throw new LockConflict(id, this.getBriefcase(id).alias, \"shared lock is held\");\n }\n this.removeSharedLock(props.id, briefcase.briefcaseId);\n this.reserveLock(this.queryLockStatus(props.id), props, briefcase);\n }\n return;\n\n case LockState.Exclusive:\n if (lockStatus.briefcaseId !== briefcase.briefcaseId)\n throw new LockConflict(lockStatus.briefcaseId, this.getBriefcase(lockStatus.briefcaseId).alias, \"exclusive lock is already held\");\n }\n }\n\n private removeSharedLock(lockId: Id64String, briefcaseId: BriefcaseId) {\n this.db.withPreparedSqliteStatement(\"DELETE FROM sharedLocks WHERE lockId=? AND briefcaseId=?\", (stmt) => {\n stmt.bindId(1, lockId);\n stmt.bindInteger(2, briefcaseId);\n const rc = stmt.step();\n if (rc !== DbResult.BE_SQLITE_DONE)\n throw new IModelError(rc, \"can't remove shared lock\");\n });\n }\n\n private releaseLock(props: LockProps, arg: { briefcaseId: BriefcaseId, changesetIndex: ChangesetIndex }) {\n const lockId = props.id;\n const lockStatus = this.queryLockStatus(lockId);\n switch (lockStatus.state) {\n case LockState.None:\n throw new IModelError(IModelHubStatus.LockDoesNotExist, \"lock not held\");\n\n case LockState.Exclusive:\n if (lockStatus.briefcaseId !== arg.briefcaseId)\n throw new IModelError(IModelHubStatus.LockOwnedByAnotherBriefcase, \"lock not held by this briefcase\");\n this.updateLockChangeset(lockId, arg.changesetIndex);\n this.clearLock(lockId);\n break;\n\n case LockState.Shared:\n if (!lockStatus.sharedBy.has(arg.briefcaseId))\n throw new IModelError(IModelHubStatus.LockDoesNotExist, \"shared lock not held by this briefcase\");\n this.removeSharedLock(lockId, arg.briefcaseId);\n if (lockStatus.sharedBy.size === 1)\n this.clearLock(lockId);\n }\n }\n\n /** Acquire a set of locks. If any lock cannot be acquired, no locks are acquired */\n public acquireLocks(locks: LockMap, briefcase: BriefcaseIdAndChangeset) {\n try {\n for (const lock of locks)\n this.requestLock({ id: lock[0], state: lock[1] }, briefcase);\n this.db.saveChanges(); // only after all locks have been acquired\n } catch (err) {\n this.db.abandonChanges(); // abandon all locks that may have been acquired\n throw err;\n }\n }\n\n public acquireLock(props: LockProps, briefcase: BriefcaseIdAndChangeset) {\n const locks = new Map<Id64String, LockState>();\n locks.set(props.id, props.state);\n this.acquireLocks(locks, briefcase);\n }\n\n public releaseLocks(locks: LockProps[], arg: { briefcaseId: BriefcaseId, changesetIndex: ChangesetIndex }) {\n for (const props of locks)\n this.releaseLock(props, arg);\n this.db.saveChanges();\n }\n\n public releaseAllLocks(arg: { briefcaseId: BriefcaseId, changesetIndex: ChangesetIndex }) {\n const locks = this.queryAllLocks(arg.briefcaseId);\n this.releaseLocks(locks, arg);\n }\n\n private countTable(tableName: string): number {\n return this.db.withSqliteStatement(`SELECT count(*) from ${tableName}`, (stmt) => {\n stmt.step();\n return stmt.getValueInteger(0);\n });\n }\n\n // for debugging\n public countSharedLocks(): number { return this.countTable(\"sharedLocks\"); }\n // for debugging\n public countLocks(): number { return this.countTable(\"locks\"); }\n\n // for debugging\n public queryAllSharedLocks(): { id: Id64String, briefcaseId: BriefcaseId }[] {\n const locks: { id: Id64String, briefcaseId: BriefcaseId }[] = [];\n this.db.withPreparedSqliteStatement(\"SELECT lockId,briefcaseId FROM sharedLocks\", (stmt) => {\n while (DbResult.BE_SQLITE_ROW === stmt.step())\n locks.push({ id: stmt.getValueId(0), briefcaseId: stmt.getValueInteger(1) });\n });\n return locks;\n }\n\n // for debugging\n public queryLocks(): LocksEntry[] {\n const locks: LocksEntry[] = [];\n this.db.withPreparedSqliteStatement(\"SELECT id,level,lastCSetIndex,briefcaseId FROM locks\", (stmt) => {\n while (DbResult.BE_SQLITE_ROW === stmt.step())\n locks.push({\n id: stmt.getValueId(0),\n level: stmt.getValueInteger(1),\n lastCsIndex: stmt.getValue(2).isNull ? undefined : stmt.getValueInteger(2),\n briefcaseId: stmt.getValue(3).isNull ? undefined : stmt.getValueInteger(3),\n });\n });\n return locks;\n }\n\n public removeDir(dirName: string) {\n if (IModelJsFs.existsSync(dirName)) {\n IModelJsFs.purgeDirSync(dirName);\n IModelJsFs.rmdirSync(dirName);\n }\n\n }\n public cleanup() {\n if (this._hubDb) {\n this._hubDb.closeDb();\n this._hubDb = undefined;\n }\n try {\n this.removeDir(BriefcaseManager.getIModelPath(this.iModelId));\n this.removeDir(this.rootDir);\n } catch (err) {\n // eslint-disable-next-line no-console\n console.log(`ERROR: test left an iModel open for [${this.iModelName}]. LocalMock cannot clean up - make sure you call imodel.close() in your test`);\n }\n }\n}\n"]}
|
|
@@ -13,11 +13,10 @@ const core_common_1 = require("@itwin/core-common");
|
|
|
13
13
|
const IpcHost_1 = require("./IpcHost");
|
|
14
14
|
class LocalTransport extends core_common_1.IpcWebSocketTransport {
|
|
15
15
|
constructor(opts) {
|
|
16
|
-
var _a;
|
|
17
16
|
super();
|
|
18
17
|
this._connections = new Map();
|
|
19
18
|
if (!opts.noServer) {
|
|
20
|
-
this._server = new ws.Server({ port:
|
|
19
|
+
this._server = new ws.Server({ port: opts.socketPort ?? 3002 });
|
|
21
20
|
this._server.on("connection", (connection) => LocalhostIpcHost.connect(connection));
|
|
22
21
|
}
|
|
23
22
|
}
|
|
@@ -63,15 +62,14 @@ class LocalhostIpcHost {
|
|
|
63
62
|
core_common_1.IpcWebSocket.transport.connect(connection);
|
|
64
63
|
}
|
|
65
64
|
static async startup(opts) {
|
|
66
|
-
var _a;
|
|
67
65
|
let registerHandler = false;
|
|
68
66
|
if (!this._initialized) {
|
|
69
67
|
registerHandler = true;
|
|
70
|
-
core_common_1.IpcWebSocket.transport = new LocalTransport(
|
|
68
|
+
core_common_1.IpcWebSocket.transport = new LocalTransport(opts?.localhostIpcHost ?? {});
|
|
71
69
|
this._socket = new core_common_1.IpcWebSocketBackend();
|
|
72
70
|
this._initialized = true;
|
|
73
71
|
}
|
|
74
|
-
await IpcHost_1.IpcHost.startup({ ipcHost: { socket: this._socket }, iModelHost: opts
|
|
72
|
+
await IpcHost_1.IpcHost.startup({ ipcHost: { socket: this._socket }, iModelHost: opts?.iModelHost });
|
|
75
73
|
if (registerHandler) {
|
|
76
74
|
RpcHandler.register();
|
|
77
75
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"LocalhostIpcHost.js","sourceRoot":"","sources":["../../src/LocalhostIpcHost.ts"],"names":[],"mappings":";AAAA;;;+FAG+F;AAC/F;;GAEG;;;AAEH,yBAAyB;AACzB,oDAAgK;AAChK,uCAAgD;AAShD,MAAM,cAAe,SAAQ,mCAAqB;IAIhD,YAAmB,IAA0B
|
|
1
|
+
{"version":3,"file":"LocalhostIpcHost.js","sourceRoot":"","sources":["../../src/LocalhostIpcHost.ts"],"names":[],"mappings":"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","sourcesContent":["/*---------------------------------------------------------------------------------------------\n* Copyright (c) Bentley Systems, Incorporated. All rights reserved.\n* See LICENSE.md in the project root for license terms and full copyright notice.\n*--------------------------------------------------------------------------------------------*/\n/** @packageDocumentation\n * @module IModelHost\n */\n\nimport * as ws from \"ws\";\nimport { InterceptedRpcRequest, IpcWebSocket, IpcWebSocketBackend, IpcWebSocketMessage, IpcWebSocketTransport, RpcSessionInvocation } from \"@itwin/core-common\";\nimport { IpcHandler, IpcHost } from \"./IpcHost\";\nimport { IModelHostOptions } from \"./IModelHost\";\n\n/** @internal */\nexport interface LocalhostIpcHostOpts {\n socketPort?: number;\n noServer?: boolean;\n}\n\nclass LocalTransport extends IpcWebSocketTransport {\n private _server: ws.Server | undefined;\n private _connections: Map<ws, number> = new Map();\n\n public constructor(opts: LocalhostIpcHostOpts) {\n super();\n\n if (!opts.noServer) {\n this._server = new ws.Server({ port: opts.socketPort ?? 3002 });\n this._server.on(\"connection\", (connection) => LocalhostIpcHost.connect(connection));\n }\n }\n\n public send(message: IpcWebSocketMessage): void {\n this._connections.forEach((last, connection) => {\n message.sequence = last + 1;\n this._connections.set(connection, message.sequence);\n const parts = this.serialize(message);\n parts.forEach((part) => connection.send(part));\n });\n }\n\n public connect(connection: ws) {\n this._connections.set(connection, -1);\n\n connection.on(\"message\", async (data) => {\n const message = await this.notifyIncoming(data, connection);\n if (IpcWebSocketMessage.skip(message)) {\n return;\n }\n\n for (const listener of IpcWebSocket.receivers) {\n listener({} as Event, message);\n }\n });\n\n connection.on(\"close\", () => {\n this._connections.delete(connection);\n this.notifyClose(connection);\n });\n }\n}\n\nclass RpcHandler extends IpcHandler {\n public channelName = \"RPC\";\n\n public async request(info: InterceptedRpcRequest) {\n const invocation = RpcSessionInvocation.create(info);\n const fulfillment = await invocation.fulfillment;\n return invocation.rejected ? Promise.reject(fulfillment.rawResult) : fulfillment.rawResult;\n }\n}\n\n/** @internal */\nexport class LocalhostIpcHost {\n private static _initialized = false;\n private static _socket: IpcWebSocketBackend;\n\n public static connect(connection: ws) {\n (IpcWebSocket.transport as LocalTransport).connect(connection);\n }\n\n public static async startup(opts?: { localhostIpcHost?: LocalhostIpcHostOpts, iModelHost?: IModelHostOptions }) {\n let registerHandler = false;\n\n if (!this._initialized) {\n registerHandler = true;\n IpcWebSocket.transport = new LocalTransport(opts?.localhostIpcHost ?? {});\n this._socket = new IpcWebSocketBackend();\n this._initialized = true;\n }\n\n await IpcHost.startup({ ipcHost: { socket: this._socket }, iModelHost: opts?.iModelHost });\n\n if (registerHandler) {\n RpcHandler.register();\n }\n }\n}\n"]}
|
package/lib/cjs/Material.js
CHANGED
|
@@ -83,9 +83,8 @@ class RenderMaterialElement extends Element_1.DefinitionElement {
|
|
|
83
83
|
* @throws [[IModelError]] if unable to create the element.
|
|
84
84
|
*/
|
|
85
85
|
static create(iModelDb, definitionModelId, materialName, params) {
|
|
86
|
-
var _a;
|
|
87
86
|
let maps;
|
|
88
|
-
const pbr_normal =
|
|
87
|
+
const pbr_normal = params.normalMap?.scale;
|
|
89
88
|
if (params.patternMap || params.normalMap) {
|
|
90
89
|
function choose(obj, key) {
|
|
91
90
|
const pat = params.patternMap;
|
package/lib/cjs/Material.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"Material.js","sourceRoot":"","sources":["../../src/Material.ts"],"names":[],"mappings":"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","sourcesContent":["/*---------------------------------------------------------------------------------------------\n* Copyright (c) Bentley Systems, Incorporated. All rights reserved.\n* See LICENSE.md in the project root for license terms and full copyright notice.\n*--------------------------------------------------------------------------------------------*/\n/** @packageDocumentation\n * @module Elements\n */\n\nimport { Id64String } from \"@itwin/core-bentley\";\nimport {\n BisCodeSpec, Code, CodeScopeProps, CodeSpec, DefinitionElementProps, NormalMapProps, RenderMaterialAssetMapsProps, RenderMaterialProps, RgbFactorProps, TextureMapProps,\n} from \"@itwin/core-common\";\nimport { DefinitionElement } from \"./Element\";\nimport { IModelDb } from \"./IModelDb\";\n\n/* eslint-disable @typescript-eslint/naming-convention */\n\n/** A PhysicalMaterial defines the matter that makes up physical elements.\n * @note See [[RenderMaterialElement]] for the DefinitionElement used to define rendering characteristics.\n * @public\n */\nexport abstract class PhysicalMaterial extends DefinitionElement {\n /** @internal */\n public static override get className(): string { return \"PhysicalMaterial\"; }\n /** Create a Code for a PhysicalMaterial given a name that is meant to be unique within the scope of the specified DefinitionModel.\n * @param iModel The IModelDb\n * @param definitionModelId The Id of the DefinitionModel that will contain the PhysicalMaterial and provide the scope for its name.\n * @param name The name (codeValue) of the PhysicalMaterial\n */\n public static createCode(iModel: IModelDb, definitionModelId: CodeScopeProps, name: string): Code {\n const codeSpec: CodeSpec = iModel.codeSpecs.getByName(BisCodeSpec.physicalMaterial);\n return new Code({ spec: codeSpec.id, scope: definitionModelId, value: name });\n }\n /** Create a PhysicalMaterial\n * @param iModelDb The IModelDb\n * @param definitionModelId The Id of the DefinitionModel that will contain the PhysicalMaterial and provide the scope for its name.\n * @param name The name (codeValue) of the PhysicalMaterial\n * @returns The newly constructed PhysicalMaterial\n * @throws [[IModelError]] if there is a problem creating the PhysicalMaterial\n */\n public static create<T extends PhysicalMaterial>(iModelDb: IModelDb, definitionModelId: CodeScopeProps, name: string): T {\n const elementProps: DefinitionElementProps = {\n classFullName: this.classFullName,\n model: definitionModelId,\n code: this.createCode(iModelDb, definitionModelId, name),\n };\n return iModelDb.elements.createElement(elementProps);\n }\n}\n\n/** Defines a rendering material.\n * @note See [[PhysicalMaterial]] for the DefinitionElement used to define the matter that makes up physical elements.\n * @public\n */\nexport class RenderMaterialElement extends DefinitionElement {\n /** @internal */\n public static override get className(): string { return \"RenderMaterial\"; }\n\n /** The name of a palette that can be used to categorize multiple materials. */\n public paletteName: string;\n /** An optional description of the material. */\n public description?: string;\n /** @internal */\n constructor(props: RenderMaterialProps, iModel: IModelDb) {\n super(props, iModel);\n this.paletteName = props.paletteName;\n this.description = props.description;\n }\n /** @internal */\n public override toJSON(): RenderMaterialProps {\n const val = super.toJSON() as RenderMaterialProps;\n val.paletteName = this.paletteName;\n val.description = this.description;\n return val;\n }\n /** Create a Code for a RenderMaterial given a name that is meant to be unique within the scope of the specified DefinitionModel.\n * @param iModel The IModelDb\n * @param scopeModelId The Id of the DefinitionModel that contains the RenderMaterial and provides the scope for its name.\n * @param name The RenderMaterial name\n */\n public static createCode(iModel: IModelDb, scopeModelId: CodeScopeProps, name: string): Code {\n const codeSpec: CodeSpec = iModel.codeSpecs.getByName(BisCodeSpec.texture);\n return 0 === name.length ? Code.createEmpty() : new Code({ spec: codeSpec.id, scope: scopeModelId, value: name });\n }\n /**\n * Create a RenderMaterial with given parameters.\n * @param iModelDb The iModel\n * @param definitionModelId The [[DefinitionModel]]\n * @param materialName The name/CodeValue of the RenderMaterial\n * @param params Parameters object which describes how to construct the RenderMaterial\n * @returns The newly constructed RenderMaterial element.\n * @throws [[IModelError]] if unable to create the element.\n */\n public static create(iModelDb: IModelDb, definitionModelId: Id64String, materialName: string, params: RenderMaterialElementParams): RenderMaterialElement {\n let maps: RenderMaterialAssetMapsProps | undefined;\n const pbr_normal = params.normalMap?.scale;\n if (params.patternMap || params.normalMap) {\n // If both normal and pattern map are present, their texture mapping modes, angles, scales, etc are expected to match.\n type TexMap = Omit<TextureMapProps, \"TextureId\">;\n function choose<K extends keyof TexMap>(obj: TexMap, key: K): void {\n const pat = params.patternMap;\n if (pat && undefined !== pat[key])\n obj[key] = pat[key];\n else if (params.normalMap && undefined !== params.normalMap[key])\n obj[key] = params.normalMap[key];\n }\n\n const baseProps: TexMap = { };\n choose(baseProps, \"pattern_angle\");\n choose(baseProps, \"pattern_u_flip\");\n choose(baseProps, \"pattern_flip\");\n choose(baseProps, \"pattern_scale\");\n choose(baseProps, \"pattern_offset\");\n choose(baseProps, \"pattern_scalemode\");\n choose(baseProps, \"pattern_mapping\");\n choose(baseProps, \"pattern_weight\");\n\n maps = { };\n if (params.patternMap)\n maps.Pattern = { ...params.patternMap, ...baseProps };\n\n if (params.normalMap) {\n maps.Normal = {\n ...params.normalMap,\n ...baseProps,\n };\n\n delete (maps.Normal as any).scale;\n }\n }\n\n // const map = undefined !== params.patternMap ? { Pattern: params.patternMap } : undefined;\n const renderMaterialProps: RenderMaterialProps = {\n classFullName: this.classFullName,\n code: this.createCode(iModelDb, definitionModelId, materialName),\n paletteName: params.paletteName,\n description: params.description,\n jsonProperties: {\n materialAssets: {\n renderMaterial: {\n HasBaseColor: params.color !== undefined,\n color: params.color,\n HasSpecularColor: params.specularColor !== undefined,\n specular_color: params.specularColor,\n HasFinish: params.finish !== undefined,\n finish: params.finish,\n HasTransmit: params.transmit !== undefined,\n transmit: params.transmit,\n HasDiffuse: params.diffuse !== undefined,\n diffuse: params.diffuse,\n HasSpecular: params.specular !== undefined,\n specular: params.specular,\n HasReflect: params.reflect !== undefined,\n reflect: params.reflect,\n HasReflectColor: params.reflectColor !== undefined,\n reflect_color: params.reflectColor,\n Map: maps,\n pbr_normal,\n },\n },\n },\n model: definitionModelId,\n isPrivate: false,\n };\n\n return new RenderMaterialElement(renderMaterialProps, iModelDb);\n }\n\n /**\n * Insert a new RenderMaterial into a model.\n * @param iModelDb Insert into this iModel\n * @param definitionModelId Insert the new Texture into this DefinitionModel\n * @param materialName The name/CodeValue of the RenderMaterial\n * @param params Parameters object which describes how to construct the RenderMaterial\n * @returns The Id of the newly inserted RenderMaterial element.\n * @throws [[IModelError]] if unable to insert the element.\n */\n public static insert(iModelDb: IModelDb, definitionModelId: Id64String, materialName: string, params: RenderMaterialElementParams): Id64String {\n const renderMaterial = this.create(iModelDb, definitionModelId, materialName, params);\n return iModelDb.elements.insertElement(renderMaterial.toJSON());\n }\n}\n\n/** @public */\nexport namespace RenderMaterialElement { // eslint-disable-line no-redeclare\n /** Parameters used to construct a [[RenderMaterial]].\n * The persistent JSON representation - [RenderMaterialAssetProps]($common) - is quite verbose and unwieldy. This representation simplifies it somewhat.\n * @see [[RenderMaterialElement.create]] and [[RenderMaterialElement.insert]] to create a [[RenderMaterial]] from parameters of this type.\n * @deprecated in 3.6 because it is not useful to use a `class` - just use [[RenderMaterialElementParams]] directly instead.\n */\n export class Params {\n /** A required palette name that categorizes this RenderMaterial */\n public paletteName: string;\n /** An optional description of this RenderMaterial */\n public description?: string;\n /** If defined, the color to use for surface fill or diffuse illumination, overriding the surface's own color. */\n public color?: RgbFactorProps;\n /** The color to use for specular illumination. Default: black. */\n public specularColor?: RgbFactorProps;\n /** The specular exponent describing the surface's shininess, in the range 0 through 128.\n * Default: 0.\n */\n public finish?: number;\n /** A transparency to be applied to the surface, ranging from 0 (fully opaque) to 1 (fully transparent).\n * The surface's own transparency will be multiplied by `(1 - transmit)`. permitting the material to increase but not decrease the surface transparency.\n * Default: 13.5.\n */\n public transmit?: number;\n /** The surface's diffuse reflectivity from 0.0 to 1.0. Default: 0.6. */\n public diffuse?: number;\n /** The surface's specular reflectivity from 0.0 to 1.0. Default: 0.0. */\n public specular?: number;\n /** Currently unused. */\n public reflect?: number;\n /** Currently unused. */\n public reflectColor?: number[];\n /** Specifies a texture image to map onto the surface, replacing or mixing with the surface's own color and transparency.\n * @note With the exception of `TextureId`, the [TextureMapProps]($common) of [[patternMap]] and [[normalMap]] are expected to be identical. If a property is defined in both\n * [[patternMap]]] and [[normalMap]], the value in [[patternMap]] takes precedence.\n */\n public patternMap?: TextureMapProps;\n /** Specifies a [normal map](https://en.wikipedia.org/wiki/Normal_mapping) to apply to the surface to simulate more surface detail than is present in the\n * surface's geometry.\n * @note With the exception of `TextureId`, the [TextureMapProps]($common) of [[patternMap]] and [[normalMap]] are expected to be identical. If a property is defined in both\n * [[patternMap]]] and [[normalMap]], the value in [[patternMap]] takes precedence.\n */\n public normalMap?: NormalMapProps & {\n /** A factor by which to multiply the components of the normal vectors read from the texture.\n * Default: 1.\n */\n scale?: number;\n };\n\n /** Construct a new RenderMaterial.Params object with the specified paletteName. Alter the public members on that object to specify settings. */\n public constructor(paletteName: string) {\n this.paletteName = paletteName;\n }\n }\n}\n\n/** Parameters used to create a [[RenderMaterial]] element.\n * The persistent JSON representation - [RenderMaterialAssetProps]($common) - is quite verbose and unwieldy. This representation simplifies it somewhat.\n * @see [[RenderMaterialElement.create]] and [[RenderMaterialElement.insert]] to create a [[RenderMaterial]] from parameters of this type.\n * @public\n */\nexport interface RenderMaterialElementParams extends RenderMaterialElement.Params { // eslint-disable-line deprecation/deprecation, @typescript-eslint/no-empty-interface\n}\n"]}
|
|
1
|
+
{"version":3,"file":"Material.js","sourceRoot":"","sources":["../../src/Material.ts"],"names":[],"mappings":";AAAA;;;+FAG+F;AAC/F;;GAEG;;;AAGH,oDAE4B;AAC5B,uCAA8C;AAG9C,yDAAyD;AAEzD;;;GAGG;AACH,MAAsB,gBAAiB,SAAQ,2BAAiB;IAC9D,gBAAgB;IACT,MAAM,KAAc,SAAS,KAAa,OAAO,kBAAkB,CAAC,CAAC,CAAC;IAC7E;;;;OAIG;IACI,MAAM,CAAC,UAAU,CAAC,MAAgB,EAAE,iBAAiC,EAAE,IAAY;QACxF,MAAM,QAAQ,GAAa,MAAM,CAAC,SAAS,CAAC,SAAS,CAAC,yBAAW,CAAC,gBAAgB,CAAC,CAAC;QACpF,OAAO,IAAI,kBAAI,CAAC,EAAE,IAAI,EAAE,QAAQ,CAAC,EAAE,EAAE,KAAK,EAAE,iBAAiB,EAAE,KAAK,EAAE,IAAI,EAAE,CAAC,CAAC;IAChF,CAAC;IACD;;;;;;OAMG;IACI,MAAM,CAAC,MAAM,CAA6B,QAAkB,EAAE,iBAAiC,EAAE,IAAY;QAClH,MAAM,YAAY,GAA2B;YAC3C,aAAa,EAAE,IAAI,CAAC,aAAa;YACjC,KAAK,EAAE,iBAAiB;YACxB,IAAI,EAAE,IAAI,CAAC,UAAU,CAAC,QAAQ,EAAE,iBAAiB,EAAE,IAAI,CAAC;SACzD,CAAC;QACF,OAAO,QAAQ,CAAC,QAAQ,CAAC,aAAa,CAAC,YAAY,CAAC,CAAC;IACvD,CAAC;CACF;AA3BD,4CA2BC;AAED;;;GAGG;AACH,MAAa,qBAAsB,SAAQ,2BAAiB;IAQ1D,gBAAgB;IAChB,YAAY,KAA0B,EAAE,MAAgB;QACtD,KAAK,CAAC,KAAK,EAAE,MAAM,CAAC,CAAC;QACrB,IAAI,CAAC,WAAW,GAAG,KAAK,CAAC,WAAW,CAAC;QACrC,IAAI,CAAC,WAAW,GAAG,KAAK,CAAC,WAAW,CAAC;IACvC,CAAC;IAZD,gBAAgB;IACT,MAAM,KAAc,SAAS,KAAa,OAAO,gBAAgB,CAAC,CAAC,CAAC;IAY3E,gBAAgB;IACA,MAAM;QACpB,MAAM,GAAG,GAAG,KAAK,CAAC,MAAM,EAAyB,CAAC;QAClD,GAAG,CAAC,WAAW,GAAG,IAAI,CAAC,WAAW,CAAC;QACnC,GAAG,CAAC,WAAW,GAAG,IAAI,CAAC,WAAW,CAAC;QACnC,OAAO,GAAG,CAAC;IACb,CAAC;IACD;;;;OAIG;IACI,MAAM,CAAC,UAAU,CAAC,MAAgB,EAAE,YAA4B,EAAE,IAAY;QACnF,MAAM,QAAQ,GAAa,MAAM,CAAC,SAAS,CAAC,SAAS,CAAC,yBAAW,CAAC,OAAO,CAAC,CAAC;QAC3E,OAAO,CAAC,KAAK,IAAI,CAAC,MAAM,CAAC,CAAC,CAAC,kBAAI,CAAC,WAAW,EAAE,CAAC,CAAC,CAAC,IAAI,kBAAI,CAAC,EAAE,IAAI,EAAE,QAAQ,CAAC,EAAE,EAAE,KAAK,EAAE,YAAY,EAAE,KAAK,EAAE,IAAI,EAAE,CAAC,CAAC;IACpH,CAAC;IACD;;;;;;;;OAQG;IACI,MAAM,CAAC,MAAM,CAAC,QAAkB,EAAE,iBAA6B,EAAE,YAAoB,EAAE,MAAmC;QAC/H,IAAI,IAA8C,CAAC;QACnD,MAAM,UAAU,GAAG,MAAM,CAAC,SAAS,EAAE,KAAK,CAAC;QAC3C,IAAI,MAAM,CAAC,UAAU,IAAI,MAAM,CAAC,SAAS,EAAE;YAGzC,SAAS,MAAM,CAAyB,GAAW,EAAE,GAAM;gBACzD,MAAM,GAAG,GAAG,MAAM,CAAC,UAAU,CAAC;gBAC9B,IAAI,GAAG,IAAI,SAAS,KAAK,GAAG,CAAC,GAAG,CAAC;oBAC/B,GAAG,CAAC,GAAG,CAAC,GAAG,GAAG,CAAC,GAAG,CAAC,CAAC;qBACjB,IAAI,MAAM,CAAC,SAAS,IAAI,SAAS,KAAK,MAAM,CAAC,SAAS,CAAC,GAAG,CAAC;oBAC9D,GAAG,CAAC,GAAG,CAAC,GAAG,MAAM,CAAC,SAAS,CAAC,GAAG,CAAC,CAAC;YACrC,CAAC;YAED,MAAM,SAAS,GAAW,EAAG,CAAC;YAC9B,MAAM,CAAC,SAAS,EAAE,eAAe,CAAC,CAAC;YACnC,MAAM,CAAC,SAAS,EAAE,gBAAgB,CAAC,CAAC;YACpC,MAAM,CAAC,SAAS,EAAE,cAAc,CAAC,CAAC;YAClC,MAAM,CAAC,SAAS,EAAE,eAAe,CAAC,CAAC;YACnC,MAAM,CAAC,SAAS,EAAE,gBAAgB,CAAC,CAAC;YACpC,MAAM,CAAC,SAAS,EAAE,mBAAmB,CAAC,CAAC;YACvC,MAAM,CAAC,SAAS,EAAE,iBAAiB,CAAC,CAAC;YACrC,MAAM,CAAC,SAAS,EAAE,gBAAgB,CAAC,CAAC;YAEpC,IAAI,GAAG,EAAG,CAAC;YACX,IAAI,MAAM,CAAC,UAAU;gBACnB,IAAI,CAAC,OAAO,GAAG,EAAE,GAAG,MAAM,CAAC,UAAU,EAAE,GAAG,SAAS,EAAE,CAAC;YAExD,IAAI,MAAM,CAAC,SAAS,EAAE;gBACpB,IAAI,CAAC,MAAM,GAAG;oBACZ,GAAG,MAAM,CAAC,SAAS;oBACnB,GAAG,SAAS;iBACb,CAAC;gBAEF,OAAQ,IAAI,CAAC,MAAc,CAAC,KAAK,CAAC;aACnC;SACF;QAED,4FAA4F;QAC5F,MAAM,mBAAmB,GAAwB;YAC/C,aAAa,EAAE,IAAI,CAAC,aAAa;YACjC,IAAI,EAAE,IAAI,CAAC,UAAU,CAAC,QAAQ,EAAE,iBAAiB,EAAE,YAAY,CAAC;YAChE,WAAW,EAAE,MAAM,CAAC,WAAW;YAC/B,WAAW,EAAE,MAAM,CAAC,WAAW;YAC/B,cAAc,EAAE;gBACd,cAAc,EAAE;oBACd,cAAc,EAAE;wBACd,YAAY,EAAE,MAAM,CAAC,KAAK,KAAK,SAAS;wBACxC,KAAK,EAAE,MAAM,CAAC,KAAK;wBACnB,gBAAgB,EAAE,MAAM,CAAC,aAAa,KAAK,SAAS;wBACpD,cAAc,EAAE,MAAM,CAAC,aAAa;wBACpC,SAAS,EAAE,MAAM,CAAC,MAAM,KAAK,SAAS;wBACtC,MAAM,EAAE,MAAM,CAAC,MAAM;wBACrB,WAAW,EAAE,MAAM,CAAC,QAAQ,KAAK,SAAS;wBAC1C,QAAQ,EAAE,MAAM,CAAC,QAAQ;wBACzB,UAAU,EAAE,MAAM,CAAC,OAAO,KAAK,SAAS;wBACxC,OAAO,EAAE,MAAM,CAAC,OAAO;wBACvB,WAAW,EAAE,MAAM,CAAC,QAAQ,KAAK,SAAS;wBAC1C,QAAQ,EAAE,MAAM,CAAC,QAAQ;wBACzB,UAAU,EAAE,MAAM,CAAC,OAAO,KAAK,SAAS;wBACxC,OAAO,EAAE,MAAM,CAAC,OAAO;wBACvB,eAAe,EAAE,MAAM,CAAC,YAAY,KAAK,SAAS;wBAClD,aAAa,EAAE,MAAM,CAAC,YAAY;wBAClC,GAAG,EAAE,IAAI;wBACT,UAAU;qBACX;iBACF;aACF;YACD,KAAK,EAAE,iBAAiB;YACxB,SAAS,EAAE,KAAK;SACjB,CAAC;QAEF,OAAO,IAAI,qBAAqB,CAAC,mBAAmB,EAAE,QAAQ,CAAC,CAAC;IAClE,CAAC;IAED;;;;;;;;OAQG;IACI,MAAM,CAAC,MAAM,CAAC,QAAkB,EAAE,iBAA6B,EAAE,YAAoB,EAAE,MAAmC;QAC/H,MAAM,cAAc,GAAG,IAAI,CAAC,MAAM,CAAC,QAAQ,EAAE,iBAAiB,EAAE,YAAY,EAAE,MAAM,CAAC,CAAC;QACtF,OAAO,QAAQ,CAAC,QAAQ,CAAC,aAAa,CAAC,cAAc,CAAC,MAAM,EAAE,CAAC,CAAC;IAClE,CAAC;CACF;AA/HD,sDA+HC;AAED,cAAc;AACd,WAAiB,qBAAqB;IACpC;;;;OAIG;IACH,MAAa,MAAM;QA2CjB,gJAAgJ;QAChJ,YAAmB,WAAmB;YACpC,IAAI,CAAC,WAAW,GAAG,WAAW,CAAC;QACjC,CAAC;KACF;IA/CY,4BAAM,SA+ClB,CAAA;AACH,CAAC,EAtDgB,qBAAqB,GAArB,6BAAqB,KAArB,6BAAqB,QAsDrC","sourcesContent":["/*---------------------------------------------------------------------------------------------\n* Copyright (c) Bentley Systems, Incorporated. All rights reserved.\n* See LICENSE.md in the project root for license terms and full copyright notice.\n*--------------------------------------------------------------------------------------------*/\n/** @packageDocumentation\n * @module Elements\n */\n\nimport { Id64String } from \"@itwin/core-bentley\";\nimport {\n BisCodeSpec, Code, CodeScopeProps, CodeSpec, DefinitionElementProps, NormalMapProps, RenderMaterialAssetMapsProps, RenderMaterialProps, RgbFactorProps, TextureMapProps,\n} from \"@itwin/core-common\";\nimport { DefinitionElement } from \"./Element\";\nimport { IModelDb } from \"./IModelDb\";\n\n/* eslint-disable @typescript-eslint/naming-convention */\n\n/** A PhysicalMaterial defines the matter that makes up physical elements.\n * @note See [[RenderMaterialElement]] for the DefinitionElement used to define rendering characteristics.\n * @public\n */\nexport abstract class PhysicalMaterial extends DefinitionElement {\n /** @internal */\n public static override get className(): string { return \"PhysicalMaterial\"; }\n /** Create a Code for a PhysicalMaterial given a name that is meant to be unique within the scope of the specified DefinitionModel.\n * @param iModel The IModelDb\n * @param definitionModelId The Id of the DefinitionModel that will contain the PhysicalMaterial and provide the scope for its name.\n * @param name The name (codeValue) of the PhysicalMaterial\n */\n public static createCode(iModel: IModelDb, definitionModelId: CodeScopeProps, name: string): Code {\n const codeSpec: CodeSpec = iModel.codeSpecs.getByName(BisCodeSpec.physicalMaterial);\n return new Code({ spec: codeSpec.id, scope: definitionModelId, value: name });\n }\n /** Create a PhysicalMaterial\n * @param iModelDb The IModelDb\n * @param definitionModelId The Id of the DefinitionModel that will contain the PhysicalMaterial and provide the scope for its name.\n * @param name The name (codeValue) of the PhysicalMaterial\n * @returns The newly constructed PhysicalMaterial\n * @throws [[IModelError]] if there is a problem creating the PhysicalMaterial\n */\n public static create<T extends PhysicalMaterial>(iModelDb: IModelDb, definitionModelId: CodeScopeProps, name: string): T {\n const elementProps: DefinitionElementProps = {\n classFullName: this.classFullName,\n model: definitionModelId,\n code: this.createCode(iModelDb, definitionModelId, name),\n };\n return iModelDb.elements.createElement(elementProps);\n }\n}\n\n/** Defines a rendering material.\n * @note See [[PhysicalMaterial]] for the DefinitionElement used to define the matter that makes up physical elements.\n * @public\n */\nexport class RenderMaterialElement extends DefinitionElement {\n /** @internal */\n public static override get className(): string { return \"RenderMaterial\"; }\n\n /** The name of a palette that can be used to categorize multiple materials. */\n public paletteName: string;\n /** An optional description of the material. */\n public description?: string;\n /** @internal */\n constructor(props: RenderMaterialProps, iModel: IModelDb) {\n super(props, iModel);\n this.paletteName = props.paletteName;\n this.description = props.description;\n }\n /** @internal */\n public override toJSON(): RenderMaterialProps {\n const val = super.toJSON() as RenderMaterialProps;\n val.paletteName = this.paletteName;\n val.description = this.description;\n return val;\n }\n /** Create a Code for a RenderMaterial given a name that is meant to be unique within the scope of the specified DefinitionModel.\n * @param iModel The IModelDb\n * @param scopeModelId The Id of the DefinitionModel that contains the RenderMaterial and provides the scope for its name.\n * @param name The RenderMaterial name\n */\n public static createCode(iModel: IModelDb, scopeModelId: CodeScopeProps, name: string): Code {\n const codeSpec: CodeSpec = iModel.codeSpecs.getByName(BisCodeSpec.texture);\n return 0 === name.length ? Code.createEmpty() : new Code({ spec: codeSpec.id, scope: scopeModelId, value: name });\n }\n /**\n * Create a RenderMaterial with given parameters.\n * @param iModelDb The iModel\n * @param definitionModelId The [[DefinitionModel]]\n * @param materialName The name/CodeValue of the RenderMaterial\n * @param params Parameters object which describes how to construct the RenderMaterial\n * @returns The newly constructed RenderMaterial element.\n * @throws [[IModelError]] if unable to create the element.\n */\n public static create(iModelDb: IModelDb, definitionModelId: Id64String, materialName: string, params: RenderMaterialElementParams): RenderMaterialElement {\n let maps: RenderMaterialAssetMapsProps | undefined;\n const pbr_normal = params.normalMap?.scale;\n if (params.patternMap || params.normalMap) {\n // If both normal and pattern map are present, their texture mapping modes, angles, scales, etc are expected to match.\n type TexMap = Omit<TextureMapProps, \"TextureId\">;\n function choose<K extends keyof TexMap>(obj: TexMap, key: K): void {\n const pat = params.patternMap;\n if (pat && undefined !== pat[key])\n obj[key] = pat[key];\n else if (params.normalMap && undefined !== params.normalMap[key])\n obj[key] = params.normalMap[key];\n }\n\n const baseProps: TexMap = { };\n choose(baseProps, \"pattern_angle\");\n choose(baseProps, \"pattern_u_flip\");\n choose(baseProps, \"pattern_flip\");\n choose(baseProps, \"pattern_scale\");\n choose(baseProps, \"pattern_offset\");\n choose(baseProps, \"pattern_scalemode\");\n choose(baseProps, \"pattern_mapping\");\n choose(baseProps, \"pattern_weight\");\n\n maps = { };\n if (params.patternMap)\n maps.Pattern = { ...params.patternMap, ...baseProps };\n\n if (params.normalMap) {\n maps.Normal = {\n ...params.normalMap,\n ...baseProps,\n };\n\n delete (maps.Normal as any).scale;\n }\n }\n\n // const map = undefined !== params.patternMap ? { Pattern: params.patternMap } : undefined;\n const renderMaterialProps: RenderMaterialProps = {\n classFullName: this.classFullName,\n code: this.createCode(iModelDb, definitionModelId, materialName),\n paletteName: params.paletteName,\n description: params.description,\n jsonProperties: {\n materialAssets: {\n renderMaterial: {\n HasBaseColor: params.color !== undefined,\n color: params.color,\n HasSpecularColor: params.specularColor !== undefined,\n specular_color: params.specularColor,\n HasFinish: params.finish !== undefined,\n finish: params.finish,\n HasTransmit: params.transmit !== undefined,\n transmit: params.transmit,\n HasDiffuse: params.diffuse !== undefined,\n diffuse: params.diffuse,\n HasSpecular: params.specular !== undefined,\n specular: params.specular,\n HasReflect: params.reflect !== undefined,\n reflect: params.reflect,\n HasReflectColor: params.reflectColor !== undefined,\n reflect_color: params.reflectColor,\n Map: maps,\n pbr_normal,\n },\n },\n },\n model: definitionModelId,\n isPrivate: false,\n };\n\n return new RenderMaterialElement(renderMaterialProps, iModelDb);\n }\n\n /**\n * Insert a new RenderMaterial into a model.\n * @param iModelDb Insert into this iModel\n * @param definitionModelId Insert the new Texture into this DefinitionModel\n * @param materialName The name/CodeValue of the RenderMaterial\n * @param params Parameters object which describes how to construct the RenderMaterial\n * @returns The Id of the newly inserted RenderMaterial element.\n * @throws [[IModelError]] if unable to insert the element.\n */\n public static insert(iModelDb: IModelDb, definitionModelId: Id64String, materialName: string, params: RenderMaterialElementParams): Id64String {\n const renderMaterial = this.create(iModelDb, definitionModelId, materialName, params);\n return iModelDb.elements.insertElement(renderMaterial.toJSON());\n }\n}\n\n/** @public */\nexport namespace RenderMaterialElement { // eslint-disable-line no-redeclare\n /** Parameters used to construct a [[RenderMaterial]].\n * The persistent JSON representation - [RenderMaterialAssetProps]($common) - is quite verbose and unwieldy. This representation simplifies it somewhat.\n * @see [[RenderMaterialElement.create]] and [[RenderMaterialElement.insert]] to create a [[RenderMaterial]] from parameters of this type.\n * @deprecated in 3.6 because it is not useful to use a `class` - just use [[RenderMaterialElementParams]] directly instead.\n */\n export class Params {\n /** A required palette name that categorizes this RenderMaterial */\n public paletteName: string;\n /** An optional description of this RenderMaterial */\n public description?: string;\n /** If defined, the color to use for surface fill or diffuse illumination, overriding the surface's own color. */\n public color?: RgbFactorProps;\n /** The color to use for specular illumination. Default: black. */\n public specularColor?: RgbFactorProps;\n /** The specular exponent describing the surface's shininess, in the range 0 through 128.\n * Default: 0.\n */\n public finish?: number;\n /** A transparency to be applied to the surface, ranging from 0 (fully opaque) to 1 (fully transparent).\n * The surface's own transparency will be multiplied by `(1 - transmit)`. permitting the material to increase but not decrease the surface transparency.\n * Default: 13.5.\n */\n public transmit?: number;\n /** The surface's diffuse reflectivity from 0.0 to 1.0. Default: 0.6. */\n public diffuse?: number;\n /** The surface's specular reflectivity from 0.0 to 1.0. Default: 0.0. */\n public specular?: number;\n /** Currently unused. */\n public reflect?: number;\n /** Currently unused. */\n public reflectColor?: number[];\n /** Specifies a texture image to map onto the surface, replacing or mixing with the surface's own color and transparency.\n * @note With the exception of `TextureId`, the [TextureMapProps]($common) of [[patternMap]] and [[normalMap]] are expected to be identical. If a property is defined in both\n * [[patternMap]]] and [[normalMap]], the value in [[patternMap]] takes precedence.\n */\n public patternMap?: TextureMapProps;\n /** Specifies a [normal map](https://en.wikipedia.org/wiki/Normal_mapping) to apply to the surface to simulate more surface detail than is present in the\n * surface's geometry.\n * @note With the exception of `TextureId`, the [TextureMapProps]($common) of [[patternMap]] and [[normalMap]] are expected to be identical. If a property is defined in both\n * [[patternMap]]] and [[normalMap]], the value in [[patternMap]] takes precedence.\n */\n public normalMap?: NormalMapProps & {\n /** A factor by which to multiply the components of the normal vectors read from the texture.\n * Default: 1.\n */\n scale?: number;\n };\n\n /** Construct a new RenderMaterial.Params object with the specified paletteName. Alter the public members on that object to specify settings. */\n public constructor(paletteName: string) {\n this.paletteName = paletteName;\n }\n }\n}\n\n/** Parameters used to create a [[RenderMaterial]] element.\n * The persistent JSON representation - [RenderMaterialAssetProps]($common) - is quite verbose and unwieldy. This representation simplifies it somewhat.\n * @see [[RenderMaterialElement.create]] and [[RenderMaterialElement.insert]] to create a [[RenderMaterial]] from parameters of this type.\n * @public\n */\nexport interface RenderMaterialElementParams extends RenderMaterialElement.Params { // eslint-disable-line deprecation/deprecation, @typescript-eslint/no-empty-interface\n}\n"]}
|
package/lib/cjs/NativeHost.js
CHANGED
|
@@ -22,8 +22,7 @@ const NativeAppStorage_1 = require("./NativeAppStorage");
|
|
|
22
22
|
class NativeAppHandler extends IpcHost_1.IpcHandler {
|
|
23
23
|
get channelName() { return core_common_1.nativeAppChannel; }
|
|
24
24
|
async getAccessToken() {
|
|
25
|
-
|
|
26
|
-
return (_c = IModelHost_1.IModelHost.authorizationClient) === null || _c === void 0 ? void 0 : _c.getAccessToken();
|
|
25
|
+
return IModelHost_1.IModelHost.authorizationClient?.getAccessToken();
|
|
27
26
|
}
|
|
28
27
|
async checkInternetConnectivity() {
|
|
29
28
|
return NativeHost.checkInternetConnectivity();
|
|
@@ -124,11 +123,10 @@ class NativeHost {
|
|
|
124
123
|
* @note this method calls [[IpcHost.startup]] internally.
|
|
125
124
|
*/
|
|
126
125
|
static async startup(opt) {
|
|
127
|
-
var _c, _d;
|
|
128
126
|
if (!this.isValid) {
|
|
129
127
|
this._isValid = true;
|
|
130
128
|
this.onInternetConnectivityChanged.addListener((status) => NativeHost.notifyNativeFrontend("notifyInternetConnectivityChanged", status));
|
|
131
|
-
this._applicationName =
|
|
129
|
+
this._applicationName = opt?.nativeHost?.applicationName ?? "iTwinApp";
|
|
132
130
|
}
|
|
133
131
|
await IpcHost_1.IpcHost.startup(opt);
|
|
134
132
|
if (IpcHost_1.IpcHost.isValid) // for tests, we use NativeHost but don't have a frontend
|
|
@@ -142,8 +140,7 @@ class NativeHost {
|
|
|
142
140
|
}
|
|
143
141
|
/** get current value of internet connectivity */
|
|
144
142
|
static checkInternetConnectivity() {
|
|
145
|
-
|
|
146
|
-
return (_c = this._reachability) !== null && _c !== void 0 ? _c : core_common_1.InternetConnectivityStatus.Online;
|
|
143
|
+
return this._reachability ?? core_common_1.InternetConnectivityStatus.Online;
|
|
147
144
|
}
|
|
148
145
|
/**
|
|
149
146
|
* Override internet connectivity state
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"NativeHost.js","sourceRoot":"","sources":["../../src/NativeHost.ts"],"names":[],"mappings":"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","sourcesContent":["/*---------------------------------------------------------------------------------------------\n* Copyright (c) Bentley Systems, Incorporated. All rights reserved.\n* See LICENSE.md in the project root for license terms and full copyright notice.\n*--------------------------------------------------------------------------------------------*/\n/** @packageDocumentation\n * @module NativeApp\n */\n\nimport { join } from \"path\";\nimport { AccessToken, assert, BeEvent, GuidString } from \"@itwin/core-bentley\";\nimport {\n BriefcaseProps, InternetConnectivityStatus, LocalBriefcaseProps, nativeAppChannel, NativeAppFunctions, NativeAppNotifications, nativeAppNotify,\n OverriddenBy, RequestNewBriefcaseProps, StorageValue,\n} from \"@itwin/core-common\";\nimport { BriefcaseManager, RequestNewBriefcaseArg } from \"./BriefcaseManager\";\nimport { Downloads, ProgressFunction, ProgressStatus } from \"./CheckpointManager\";\nimport { IModelHost } from \"./IModelHost\";\nimport { IpcHandler, IpcHost, IpcHostOpts, throttleProgressCallback } from \"./IpcHost\";\nimport { NativeAppStorage } from \"./NativeAppStorage\";\n\n/**\n * Implementation of NativeAppFunctions\n */\nclass NativeAppHandler extends IpcHandler implements NativeAppFunctions {\n public get channelName() { return nativeAppChannel; }\n\n public async getAccessToken(): Promise<AccessToken | undefined> {\n return IModelHost.authorizationClient?.getAccessToken();\n }\n\n public async checkInternetConnectivity(): Promise<InternetConnectivityStatus> {\n return NativeHost.checkInternetConnectivity();\n }\n public async overrideInternetConnectivity(by: OverriddenBy, status: InternetConnectivityStatus): Promise<void> {\n NativeHost.overrideInternetConnectivity(by, status);\n }\n public async acquireNewBriefcaseId(iModelId: GuidString): Promise<number> {\n return BriefcaseManager.acquireNewBriefcaseId({ iModelId });\n }\n public async getBriefcaseFileName(props: BriefcaseProps): Promise<string> {\n return BriefcaseManager.getFileName(props);\n }\n public async downloadBriefcase(request: RequestNewBriefcaseProps, reportProgress: boolean, progressInterval?: number): Promise<LocalBriefcaseProps> {\n const args: RequestNewBriefcaseArg = {\n ...request,\n accessToken: await this.getAccessToken(),\n onProgress: (_a: number, _b: number) => checkAbort(),\n };\n\n const checkAbort = () => {\n assert(undefined !== args.fileName);\n const job = Downloads.isInProgress(args.fileName);\n return (job && (job.request as any).abort === 1) ? ProgressStatus.Abort : ProgressStatus.Continue;\n };\n\n if (reportProgress) {\n const progressCallback: ProgressFunction = (loaded, total) => {\n IpcHost.send(`nativeApp.progress-${request.iModelId}`, { loaded, total });\n return checkAbort();\n };\n args.onProgress = throttleProgressCallback(progressCallback, checkAbort, progressInterval);\n }\n\n return BriefcaseManager.downloadBriefcase(args);\n }\n\n public async requestCancelDownloadBriefcase(fileName: string): Promise<boolean> {\n const job = Downloads.isInProgress(fileName);\n if (job)\n (job.request as any).abort = 1;\n return job !== undefined;\n }\n\n public async deleteBriefcaseFiles(fileName: string): Promise<void> {\n await BriefcaseManager.deleteBriefcaseFiles(fileName, await IModelHost.getAccessToken());\n }\n\n public async getCachedBriefcases(iModelId?: GuidString): Promise<LocalBriefcaseProps[]> {\n return BriefcaseManager.getCachedBriefcases(iModelId);\n }\n\n public async storageMgrOpen(storageId: string): Promise<string> {\n return NativeAppStorage.open(storageId).id;\n }\n\n public async storageMgrClose(storageId: string, deleteIt: boolean): Promise<void> {\n NativeAppStorage.find(storageId).close(deleteIt);\n }\n\n public async storageMgrNames(): Promise<string[]> {\n return NativeAppStorage.getStorageNames();\n }\n\n public async storageGetValueType(storageId: string, key: string): Promise<\"number\" | \"string\" | \"boolean\" | \"Uint8Array\" | \"null\" | undefined> {\n return NativeAppStorage.find(storageId).getValueType(key);\n }\n\n public async storageGet(storageId: string, key: string): Promise<StorageValue | undefined> {\n return NativeAppStorage.find(storageId).getData(key);\n }\n\n public async storageSet(storageId: string, key: string, value: StorageValue): Promise<void> {\n NativeAppStorage.find(storageId).setData(key, value);\n }\n\n public async storageRemove(storageId: string, key: string): Promise<void> {\n NativeAppStorage.find(storageId).removeData(key);\n }\n\n public async storageKeys(storageId: string): Promise<string[]> {\n return NativeAppStorage.find(storageId).getKeys();\n }\n\n public async storageRemoveAll(storageId: string): Promise<void> {\n NativeAppStorage.find(storageId).removeAll();\n }\n}\n\n/** Options for [[NativeHost.startup]]\n * @public\n */\nexport interface NativeHostOpts extends IpcHostOpts {\n nativeHost?: {\n /** Application name. Used, for example, to name the settings file. If not supplied, defaults to \"iTwinApp\". */\n applicationName?: string;\n };\n}\n\n/**\n * Backend for desktop/mobile native applications\n * @public\n */\nexport class NativeHost {\n private static _reachability?: InternetConnectivityStatus;\n private static _applicationName: string;\n private constructor() { } // no instances - static methods only\n\n /** Event called when the internet connectivity changes, if known. */\n public static readonly onInternetConnectivityChanged = new BeEvent<(status: InternetConnectivityStatus) => void>();\n\n private static _appSettingsCacheDir?: string;\n\n /** Get the local cache folder for application settings */\n public static get appSettingsCacheDir(): string {\n if (this._appSettingsCacheDir === undefined)\n this._appSettingsCacheDir = join(IModelHost.cacheDir, \"appSettings\");\n return this._appSettingsCacheDir;\n }\n\n /** Send a notification to the NativeApp connected to this NativeHost. */\n public static notifyNativeFrontend<T extends keyof NativeAppNotifications>(methodName: T, ...args: Parameters<NativeAppNotifications[T]>) {\n return IpcHost.send(nativeAppNotify, methodName, ...args);\n }\n\n private static _isValid = false;\n public static get isValid(): boolean { return this._isValid; }\n public static get applicationName() { return this._applicationName; }\n /** Get the settings store for this NativeHost. */\n public static get settingsStore() {\n return NativeAppStorage.open(this.applicationName);\n }\n\n /**\n * Start the backend of a native app.\n * @note this method calls [[IpcHost.startup]] internally.\n */\n public static async startup(opt?: NativeHostOpts): Promise<void> {\n if (!this.isValid) {\n this._isValid = true;\n this.onInternetConnectivityChanged.addListener((status: InternetConnectivityStatus) =>\n NativeHost.notifyNativeFrontend(\"notifyInternetConnectivityChanged\", status));\n this._applicationName = opt?.nativeHost?.applicationName ?? \"iTwinApp\";\n }\n\n await IpcHost.startup(opt);\n if (IpcHost.isValid) // for tests, we use NativeHost but don't have a frontend\n NativeAppHandler.register();\n }\n\n /** Shutdown native app backend. Also calls [[IpcHost.shutdown]] */\n public static async shutdown(): Promise<void> {\n this._isValid = false;\n this.onInternetConnectivityChanged.clear();\n await IpcHost.shutdown();\n }\n\n /** get current value of internet connectivity */\n public static checkInternetConnectivity(): InternetConnectivityStatus {\n return this._reachability ?? InternetConnectivityStatus.Online;\n }\n\n /**\n * Override internet connectivity state\n * @param _overridenBy who overrode the value.\n * @internal\n */\n public static overrideInternetConnectivity(_overridenBy: OverriddenBy, status: InternetConnectivityStatus): void {\n if (this._reachability !== status) {\n this._reachability = status;\n this.onInternetConnectivityChanged.raiseEvent(status);\n }\n }\n}\n"]}
|
|
1
|
+
{"version":3,"file":"NativeHost.js","sourceRoot":"","sources":["../../src/NativeHost.ts"],"names":[],"mappings":"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","sourcesContent":["/*---------------------------------------------------------------------------------------------\n* Copyright (c) Bentley Systems, Incorporated. All rights reserved.\n* See LICENSE.md in the project root for license terms and full copyright notice.\n*--------------------------------------------------------------------------------------------*/\n/** @packageDocumentation\n * @module NativeApp\n */\n\nimport { join } from \"path\";\nimport { AccessToken, assert, BeEvent, GuidString } from \"@itwin/core-bentley\";\nimport {\n BriefcaseProps, InternetConnectivityStatus, LocalBriefcaseProps, nativeAppChannel, NativeAppFunctions, NativeAppNotifications, nativeAppNotify,\n OverriddenBy, RequestNewBriefcaseProps, StorageValue,\n} from \"@itwin/core-common\";\nimport { BriefcaseManager, RequestNewBriefcaseArg } from \"./BriefcaseManager\";\nimport { Downloads, ProgressFunction, ProgressStatus } from \"./CheckpointManager\";\nimport { IModelHost } from \"./IModelHost\";\nimport { IpcHandler, IpcHost, IpcHostOpts, throttleProgressCallback } from \"./IpcHost\";\nimport { NativeAppStorage } from \"./NativeAppStorage\";\n\n/**\n * Implementation of NativeAppFunctions\n */\nclass NativeAppHandler extends IpcHandler implements NativeAppFunctions {\n public get channelName() { return nativeAppChannel; }\n\n public async getAccessToken(): Promise<AccessToken | undefined> {\n return IModelHost.authorizationClient?.getAccessToken();\n }\n\n public async checkInternetConnectivity(): Promise<InternetConnectivityStatus> {\n return NativeHost.checkInternetConnectivity();\n }\n public async overrideInternetConnectivity(by: OverriddenBy, status: InternetConnectivityStatus): Promise<void> {\n NativeHost.overrideInternetConnectivity(by, status);\n }\n public async acquireNewBriefcaseId(iModelId: GuidString): Promise<number> {\n return BriefcaseManager.acquireNewBriefcaseId({ iModelId });\n }\n public async getBriefcaseFileName(props: BriefcaseProps): Promise<string> {\n return BriefcaseManager.getFileName(props);\n }\n public async downloadBriefcase(request: RequestNewBriefcaseProps, reportProgress: boolean, progressInterval?: number): Promise<LocalBriefcaseProps> {\n const args: RequestNewBriefcaseArg = {\n ...request,\n accessToken: await this.getAccessToken(),\n onProgress: (_a: number, _b: number) => checkAbort(),\n };\n\n const checkAbort = () => {\n assert(undefined !== args.fileName);\n const job = Downloads.isInProgress(args.fileName);\n return (job && (job.request as any).abort === 1) ? ProgressStatus.Abort : ProgressStatus.Continue;\n };\n\n if (reportProgress) {\n const progressCallback: ProgressFunction = (loaded, total) => {\n IpcHost.send(`nativeApp.progress-${request.iModelId}`, { loaded, total });\n return checkAbort();\n };\n args.onProgress = throttleProgressCallback(progressCallback, checkAbort, progressInterval);\n }\n\n return BriefcaseManager.downloadBriefcase(args);\n }\n\n public async requestCancelDownloadBriefcase(fileName: string): Promise<boolean> {\n const job = Downloads.isInProgress(fileName);\n if (job)\n (job.request as any).abort = 1;\n return job !== undefined;\n }\n\n public async deleteBriefcaseFiles(fileName: string): Promise<void> {\n await BriefcaseManager.deleteBriefcaseFiles(fileName, await IModelHost.getAccessToken());\n }\n\n public async getCachedBriefcases(iModelId?: GuidString): Promise<LocalBriefcaseProps[]> {\n return BriefcaseManager.getCachedBriefcases(iModelId);\n }\n\n public async storageMgrOpen(storageId: string): Promise<string> {\n return NativeAppStorage.open(storageId).id;\n }\n\n public async storageMgrClose(storageId: string, deleteIt: boolean): Promise<void> {\n NativeAppStorage.find(storageId).close(deleteIt);\n }\n\n public async storageMgrNames(): Promise<string[]> {\n return NativeAppStorage.getStorageNames();\n }\n\n public async storageGetValueType(storageId: string, key: string): Promise<\"number\" | \"string\" | \"boolean\" | \"Uint8Array\" | \"null\" | undefined> {\n return NativeAppStorage.find(storageId).getValueType(key);\n }\n\n public async storageGet(storageId: string, key: string): Promise<StorageValue | undefined> {\n return NativeAppStorage.find(storageId).getData(key);\n }\n\n public async storageSet(storageId: string, key: string, value: StorageValue): Promise<void> {\n NativeAppStorage.find(storageId).setData(key, value);\n }\n\n public async storageRemove(storageId: string, key: string): Promise<void> {\n NativeAppStorage.find(storageId).removeData(key);\n }\n\n public async storageKeys(storageId: string): Promise<string[]> {\n return NativeAppStorage.find(storageId).getKeys();\n }\n\n public async storageRemoveAll(storageId: string): Promise<void> {\n NativeAppStorage.find(storageId).removeAll();\n }\n}\n\n/** Options for [[NativeHost.startup]]\n * @public\n */\nexport interface NativeHostOpts extends IpcHostOpts {\n nativeHost?: {\n /** Application name. Used, for example, to name the settings file. If not supplied, defaults to \"iTwinApp\". */\n applicationName?: string;\n };\n}\n\n/**\n * Backend for desktop/mobile native applications\n * @public\n */\nexport class NativeHost {\n private static _reachability?: InternetConnectivityStatus;\n private static _applicationName: string;\n private constructor() { } // no instances - static methods only\n\n /** Event called when the internet connectivity changes, if known. */\n public static readonly onInternetConnectivityChanged = new BeEvent<(status: InternetConnectivityStatus) => void>();\n\n private static _appSettingsCacheDir?: string;\n\n /** Get the local cache folder for application settings */\n public static get appSettingsCacheDir(): string {\n if (this._appSettingsCacheDir === undefined)\n this._appSettingsCacheDir = join(IModelHost.cacheDir, \"appSettings\");\n return this._appSettingsCacheDir;\n }\n\n /** Send a notification to the NativeApp connected to this NativeHost. */\n public static notifyNativeFrontend<T extends keyof NativeAppNotifications>(methodName: T, ...args: Parameters<NativeAppNotifications[T]>) {\n return IpcHost.send(nativeAppNotify, methodName, ...args);\n }\n\n private static _isValid = false;\n public static get isValid(): boolean { return this._isValid; }\n public static get applicationName() { return this._applicationName; }\n /** Get the settings store for this NativeHost. */\n public static get settingsStore() {\n return NativeAppStorage.open(this.applicationName);\n }\n\n /**\n * Start the backend of a native app.\n * @note this method calls [[IpcHost.startup]] internally.\n */\n public static async startup(opt?: NativeHostOpts): Promise<void> {\n if (!this.isValid) {\n this._isValid = true;\n this.onInternetConnectivityChanged.addListener((status: InternetConnectivityStatus) =>\n NativeHost.notifyNativeFrontend(\"notifyInternetConnectivityChanged\", status));\n this._applicationName = opt?.nativeHost?.applicationName ?? \"iTwinApp\";\n }\n\n await IpcHost.startup(opt);\n if (IpcHost.isValid) // for tests, we use NativeHost but don't have a frontend\n NativeAppHandler.register();\n }\n\n /** Shutdown native app backend. Also calls [[IpcHost.shutdown]] */\n public static async shutdown(): Promise<void> {\n this._isValid = false;\n this.onInternetConnectivityChanged.clear();\n await IpcHost.shutdown();\n }\n\n /** get current value of internet connectivity */\n public static checkInternetConnectivity(): InternetConnectivityStatus {\n return this._reachability ?? InternetConnectivityStatus.Online;\n }\n\n /**\n * Override internet connectivity state\n * @param _overridenBy who overrode the value.\n * @internal\n */\n public static overrideInternetConnectivity(_overridenBy: OverriddenBy, status: InternetConnectivityStatus): void {\n if (this._reachability !== status) {\n this._reachability = status;\n this.onInternetConnectivityChanged.raiseEvent(status);\n }\n }\n}\n"]}
|