@itwin/core-backend 4.5.0-dev.3 → 4.5.0-dev.32
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 +51 -1
- package/LICENSE.md +1 -1
- package/lib/cjs/BackendHubAccess.d.ts +1 -1
- package/lib/cjs/BackendHubAccess.d.ts.map +1 -1
- package/lib/cjs/BackendHubAccess.js.map +1 -1
- package/lib/cjs/CheckpointManager.d.ts +4 -3
- package/lib/cjs/CheckpointManager.d.ts.map +1 -1
- package/lib/cjs/CheckpointManager.js +37 -28
- package/lib/cjs/CheckpointManager.js.map +1 -1
- package/lib/cjs/CloudSqlite.d.ts +3 -1
- package/lib/cjs/CloudSqlite.d.ts.map +1 -1
- package/lib/cjs/CloudSqlite.js +2 -2
- package/lib/cjs/CloudSqlite.js.map +1 -1
- package/lib/cjs/Element.d.ts +6 -0
- package/lib/cjs/Element.d.ts.map +1 -1
- package/lib/cjs/Element.js +7 -1
- package/lib/cjs/Element.js.map +1 -1
- package/lib/cjs/IModelDb.d.ts +32 -27
- package/lib/cjs/IModelDb.d.ts.map +1 -1
- package/lib/cjs/IModelDb.js +153 -28
- package/lib/cjs/IModelDb.js.map +1 -1
- package/lib/cjs/IModelHost.d.ts +0 -2
- package/lib/cjs/IModelHost.d.ts.map +1 -1
- package/lib/cjs/IModelHost.js +0 -4
- package/lib/cjs/IModelHost.js.map +1 -1
- package/lib/cjs/IpcHost.d.ts.map +1 -1
- package/lib/cjs/IpcHost.js +3 -0
- package/lib/cjs/IpcHost.js.map +1 -1
- package/lib/cjs/Material.js +1 -1
- package/lib/cjs/Material.js.map +1 -1
- package/lib/cjs/TileStorage.d.ts.map +1 -1
- package/lib/cjs/TileStorage.js +9 -1
- package/lib/cjs/TileStorage.js.map +1 -1
- package/lib/cjs/rpc/web/logging.d.ts.map +1 -1
- package/lib/cjs/rpc/web/logging.js +3 -2
- package/lib/cjs/rpc/web/logging.js.map +1 -1
- package/lib/cjs/rpc/web/response.d.ts.map +1 -1
- package/lib/cjs/rpc/web/response.js +16 -0
- package/lib/cjs/rpc/web/response.js.map +1 -1
- package/lib/cjs/rpc-impl/RpcBriefcaseUtility.d.ts.map +1 -1
- package/lib/cjs/rpc-impl/RpcBriefcaseUtility.js +12 -13
- package/lib/cjs/rpc-impl/RpcBriefcaseUtility.js.map +1 -1
- package/package.json +13 -13
package/CHANGELOG.md
CHANGED
|
@@ -1,6 +1,56 @@
|
|
|
1
1
|
# Change Log - @itwin/core-backend
|
|
2
2
|
|
|
3
|
-
This log was last generated on
|
|
3
|
+
This log was last generated on Fri, 08 Mar 2024 15:58:53 GMT and should not be manually modified.
|
|
4
|
+
|
|
5
|
+
## 4.4.6
|
|
6
|
+
Fri, 08 Mar 2024 15:57:11 GMT
|
|
7
|
+
|
|
8
|
+
_Version update only_
|
|
9
|
+
|
|
10
|
+
## 4.4.5
|
|
11
|
+
Tue, 05 Mar 2024 20:37:18 GMT
|
|
12
|
+
|
|
13
|
+
_Version update only_
|
|
14
|
+
|
|
15
|
+
## 4.4.4
|
|
16
|
+
Fri, 01 Mar 2024 18:21:01 GMT
|
|
17
|
+
|
|
18
|
+
_Version update only_
|
|
19
|
+
|
|
20
|
+
## 4.4.3
|
|
21
|
+
Fri, 23 Feb 2024 21:26:07 GMT
|
|
22
|
+
|
|
23
|
+
_Version update only_
|
|
24
|
+
|
|
25
|
+
## 4.4.2
|
|
26
|
+
Fri, 16 Feb 2024 14:22:01 GMT
|
|
27
|
+
|
|
28
|
+
_Version update only_
|
|
29
|
+
|
|
30
|
+
## 4.4.1
|
|
31
|
+
Fri, 16 Feb 2024 14:17:48 GMT
|
|
32
|
+
|
|
33
|
+
_Version update only_
|
|
34
|
+
|
|
35
|
+
## 4.4.0
|
|
36
|
+
Mon, 12 Feb 2024 18:15:58 GMT
|
|
37
|
+
|
|
38
|
+
### Updates
|
|
39
|
+
|
|
40
|
+
- Inserting, updating and deleting of an element aspect requires exclusive lock on the element that owns it
|
|
41
|
+
- Add changeset reader api
|
|
42
|
+
- Update ChangesetReader API and fix bug.
|
|
43
|
+
- Save changes before closing IModels opened in ReadWrite mode
|
|
44
|
+
- Bump @itwin/object-storage-azure and @itwin/object-storage-core
|
|
45
|
+
- vDirection is deprecated
|
|
46
|
+
- Add `ECDb.getSchemaProps`
|
|
47
|
+
- fix texture remapping in RenderMaterialElement.onCloned
|
|
48
|
+
- Add support for Node 20.
|
|
49
|
+
- make case of pattern_useconstantlod match backend code
|
|
50
|
+
- Fix a breaking internal API change affecting @itwin/imodels-access-backend"
|
|
51
|
+
- Change reserved SQLite keywords from tests.
|
|
52
|
+
- modified getAspects to handle dot separator in full class name
|
|
53
|
+
- lint fix
|
|
4
54
|
|
|
5
55
|
## 4.3.3
|
|
6
56
|
Wed, 03 Jan 2024 19:28:38 GMT
|
package/LICENSE.md
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
# MIT License
|
|
2
2
|
|
|
3
|
-
Copyright © 2017-
|
|
3
|
+
Copyright © 2017-2024 Bentley Systems, Incorporated. All rights reserved.
|
|
4
4
|
|
|
5
5
|
Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions:
|
|
6
6
|
|
|
@@ -4,7 +4,7 @@
|
|
|
4
4
|
import { AccessToken, GuidString, Id64String } from "@itwin/core-bentley";
|
|
5
5
|
import { BriefcaseId, ChangesetFileProps, ChangesetIdWithIndex, ChangesetIndex, ChangesetIndexAndId, ChangesetIndexOrId, ChangesetProps, ChangesetRange, IModelError, IModelVersion, LocalDirName, LocalFileName } from "@itwin/core-common";
|
|
6
6
|
import { CheckpointProps, DownloadRequest, ProgressFunction } from "./CheckpointManager";
|
|
7
|
-
import { TokenArg } from "./IModelDb";
|
|
7
|
+
import type { TokenArg } from "./IModelDb";
|
|
8
8
|
/** The state of a lock.
|
|
9
9
|
* @public
|
|
10
10
|
*/
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"BackendHubAccess.d.ts","sourceRoot":"","sources":["../../src/BackendHubAccess.ts"],"names":[],"mappings":"AAIA;;GAEG;AAEH,OAAO,EAAE,WAAW,EAAE,UAAU,EAAE,UAAU,EAAmB,MAAM,qBAAqB,CAAC;AAC3F,OAAO,EACL,WAAW,EAAE,kBAAkB,EAAE,oBAAoB,EAAE,cAAc,EAAE,mBAAmB,EAAE,kBAAkB,EAAE,cAAc,EAAE,cAAc,EAC9I,WAAW,EAAE,aAAa,EAAE,YAAY,EAAE,aAAa,EACxD,MAAM,oBAAoB,CAAC;AAC5B,OAAO,EAAE,eAAe,EAAE,eAAe,EAAE,gBAAgB,EAAE,MAAM,qBAAqB,CAAC;AACzF,OAAO,EAAE,QAAQ,EAAE,MAAM,YAAY,CAAC;
|
|
1
|
+
{"version":3,"file":"BackendHubAccess.d.ts","sourceRoot":"","sources":["../../src/BackendHubAccess.ts"],"names":[],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"BackendHubAccess.js","sourceRoot":"","sources":["../../src/BackendHubAccess.ts"],"names":[],"mappings":";AAAA;;;+FAG+F;AAC/F;;GAEG;;;AAEH,sDAA2F;AAC3F,oDAG4B;AAI5B;;GAEG;AACH,IAAY,SASX;AATD,WAAY,SAAS;IACnB,gCAAgC;IAChC,yCAAQ,CAAA;IACR,mJAAmJ;IACnJ,6CAAU,CAAA;IACV;;OAEG;IACH,mDAAa,CAAA;AACf,CAAC,EATW,SAAS,GAAT,iBAAS,KAAT,iBAAS,QASpB;AAED;;EAEE;AACF,MAAa,YAAa,SAAQ,yBAAW;IAC3C;IACE,mCAAmC;IACnB,WAAwB;IACxC,sCAAsC;IACtB,cAAsB,EACtC,GAA6D;QAE7D,KAAK,CAAC,8BAAe,CAAC,2BAA2B,EAAE,GAAG,CAAC,CAAC;QALxC,gBAAW,GAAX,WAAW,CAAa;QAExB,mBAAc,GAAd,cAAc,CAAQ;IAIxC,CAAC;CACF;AAVD,oCAUC","sourcesContent":["/*---------------------------------------------------------------------------------------------\r\n* Copyright (c) Bentley Systems, Incorporated. All rights reserved.\r\n* See LICENSE.md in the project root for license terms and full copyright notice.\r\n*--------------------------------------------------------------------------------------------*/\r\n/** @packageDocumentation\r\n * @module HubAccess\r\n */\r\n\r\nimport { AccessToken, GuidString, Id64String, IModelHubStatus } from \"@itwin/core-bentley\";\r\nimport {\r\n BriefcaseId, ChangesetFileProps, ChangesetIdWithIndex, ChangesetIndex, ChangesetIndexAndId, ChangesetIndexOrId, ChangesetProps, ChangesetRange,\r\n IModelError, IModelVersion, LocalDirName, LocalFileName,\r\n} from \"@itwin/core-common\";\r\nimport { CheckpointProps, DownloadRequest, ProgressFunction } from \"./CheckpointManager\";\r\nimport { TokenArg } from \"./IModelDb\";\r\n\r\n/** The state of a lock.\r\n * @public\r\n */\r\nexport enum LockState {\r\n /** The element is not locked */\r\n None = 0,\r\n /** Holding a shared lock on an element blocks other users from acquiring the Exclusive lock it. More than one user may acquire the shared lock. */\r\n Shared = 1,\r\n /** A Lock that permits modifications to an element and blocks other users from making modifications to it.\r\n * Holding an exclusive lock on an \"owner\" (a model or a parent element), implicitly exclusively locks all its members.\r\n */\r\n Exclusive = 2,\r\n}\r\n\r\n/** Exception thrown if lock cannot be acquired.\r\n * @beta\r\n*/\r\nexport class LockConflict extends IModelError {\r\n public constructor(\r\n /** Id of Briefcase holding lock */\r\n public readonly briefcaseId: BriefcaseId,\r\n /** Alias of Briefcase holding lock */\r\n public readonly briefcaseAlias: string,\r\n msg: \"shared lock is held\" | \"exclusive lock is already held\",\r\n ) {\r\n super(IModelHubStatus.LockOwnedByAnotherBriefcase, msg);\r\n }\r\n}\r\n\r\n/**\r\n * The properties to access a V2 checkpoint through a daemon.\r\n * @internal\r\n */\r\nexport interface V2CheckpointAccessProps {\r\n /** blob store account name. */\r\n readonly accountName: string;\r\n /** AccessToken that grants access to the container. */\r\n readonly sasToken: AccessToken;\r\n /** The name of the iModel's blob store container holding all checkpoints. */\r\n readonly containerId: string;\r\n /** The name of the virtual file within the container, used for the checkpoint */\r\n readonly dbName: string;\r\n /** blob storage module: e.g. \"azure\", \"google\", \"aws\". May also include URI style parameters. */\r\n readonly storageType: string;\r\n}\r\n\r\n/** @internal */\r\nexport type LockMap = Map<Id64String, LockState>;\r\n\r\n/**\r\n * The properties of a lock that may be obtained from a lock server.\r\n * @beta\r\n */\r\nexport interface LockProps {\r\n /** The elementId for the lock */\r\n readonly id: Id64String;\r\n /** the lock state */\r\n readonly state: LockState;\r\n}\r\n\r\n/**\r\n * Argument for cancelling and tracking download progress.\r\n * @beta\r\n */\r\nexport interface DownloadProgressArg {\r\n /** Called to show progress during a download. If this function returns non-zero, the download is aborted. */\r\n progressCallback?: ProgressFunction;\r\n}\r\n\r\n/**\r\n * Argument for methods that must supply an iTwinId\r\n * @public\r\n */\r\nexport interface ITwinIdArg {\r\n readonly iTwinId: GuidString;\r\n}\r\n\r\n/**\r\n * Argument for methods that must supply an IModelId\r\n * @public\r\n */\r\nexport interface IModelIdArg extends TokenArg {\r\n readonly iModelId: GuidString;\r\n}\r\n\r\n/**\r\n * Argument for acquiring a new BriefcaseId\r\n * @public\r\n */\r\nexport interface AcquireNewBriefcaseIdArg extends IModelIdArg {\r\n /** A string to be reported to other users to identify this briefcase, for example in the case of conflicts or lock collisions. */\r\n readonly briefcaseAlias?: string;\r\n}\r\n\r\n/** Argument for methods that must supply an IModel name and iTwinId\r\n * @public\r\n */\r\nexport interface IModelNameArg extends TokenArg, ITwinIdArg {\r\n readonly iModelName: string;\r\n}\r\n\r\n/** Argument for methods that must supply an IModelId and a BriefcaseId\r\n * @public\r\n */\r\nexport interface BriefcaseIdArg extends IModelIdArg {\r\n readonly briefcaseId: BriefcaseId;\r\n}\r\n\r\n/** Argument for methods that must supply a briefcaseId and a changeset\r\n * @public\r\n */\r\nexport interface BriefcaseDbArg extends BriefcaseIdArg {\r\n readonly changeset: ChangesetIdWithIndex;\r\n}\r\n\r\n/** Argument for methods that must supply an IModelId and a changeset\r\n * @public\r\n */\r\nexport interface ChangesetArg extends IModelIdArg {\r\n readonly changeset: ChangesetIndexOrId;\r\n}\r\n\r\n/** Argument for downloading a changeset.\r\n * @beta\r\n */\r\nexport interface DownloadChangesetArg extends ChangesetArg, DownloadProgressArg {\r\n /** Directory where the changeset should be downloaded. */\r\n targetDir: LocalDirName;\r\n}\r\n\r\n/** @internal */\r\nexport interface ChangesetIndexArg extends IModelIdArg {\r\n readonly changeset: ChangesetIdWithIndex;\r\n}\r\n\r\n/** Argument for methods that must supply an IModelId and a range of Changesets.\r\n * @public\r\n */\r\nexport interface ChangesetRangeArg extends IModelIdArg {\r\n /** the range of changesets desired. If is undefined, *all* changesets are returned. */\r\n readonly range?: ChangesetRange;\r\n}\r\n\r\n/** Argument for downloading a changeset range.\r\n * @beta\r\n */\r\nexport interface DownloadChangesetRangeArg extends ChangesetRangeArg, DownloadProgressArg {\r\n /** Directory where the changesets should be downloaded. */\r\n targetDir: LocalDirName;\r\n}\r\n\r\n/**\r\n * @deprecated in 3.x. Use [[DownloadRequest]].\r\n * @internal\r\n */\r\nexport type CheckpointArg = DownloadRequest;\r\n\r\n/**\r\n * Arguments to create a new iModel in iModelHub\r\n * @public\r\n */\r\nexport interface CreateNewIModelProps extends IModelNameArg {\r\n readonly description?: string;\r\n readonly version0?: LocalFileName;\r\n readonly noLocks?: true;\r\n}\r\n\r\n/**\r\n * Methods for accessing services of IModelHub from an iTwin.js backend.\r\n * Generally direct access to these methods should not be required, since higher-level apis are provided.\r\n * @note This interface is implemented in another repository. Any changes made to this interface must be validated against\r\n * the implementation found here: https://github.com/iTwin/imodels-clients/blob/main/itwin-platform-access/imodels-access-backend/src/BackendIModelsAccess.ts\r\n * @internal\r\n */\r\nexport interface BackendHubAccess {\r\n /** Download all the changesets in the specified range. */\r\n downloadChangesets: (arg: DownloadChangesetRangeArg) => Promise<ChangesetFileProps[]>;\r\n /** Download a single changeset. */\r\n downloadChangeset: (arg: DownloadChangesetArg) => Promise<ChangesetFileProps>;\r\n /** Query the changeset properties given a ChangesetIndex */\r\n queryChangeset: (arg: ChangesetArg) => Promise<ChangesetProps>;\r\n /** Query an array of changeset properties given a range of ChangesetIndexes */\r\n queryChangesets: (arg: ChangesetRangeArg) => Promise<ChangesetProps[]>;\r\n /** Push a changeset to iModelHub. Returns the newly pushed changeset's index */\r\n pushChangeset: (arg: IModelIdArg & { changesetProps: ChangesetFileProps }) => Promise<ChangesetIndex>;\r\n /** Get the ChangesetProps of the most recent changeset */\r\n getLatestChangeset: (arg: IModelIdArg) => Promise<ChangesetProps>;\r\n /** Get the ChangesetProps for an IModelVersion */\r\n getChangesetFromVersion: (arg: IModelIdArg & { version: IModelVersion }) => Promise<ChangesetProps>;\r\n /** Get the ChangesetProps for a named version */\r\n getChangesetFromNamedVersion: (arg: IModelIdArg & { versionName: string }) => Promise<ChangesetProps>;\r\n\r\n /** Acquire a new briefcaseId for the supplied iModelId\r\n * @note usually there should only be one briefcase per iModel per user.\r\n */\r\n acquireNewBriefcaseId: (arg: AcquireNewBriefcaseIdArg) => Promise<BriefcaseId>;\r\n /** Release a briefcaseId. After this call it is illegal to generate changesets for the released briefcaseId. */\r\n releaseBriefcase: (arg: BriefcaseIdArg) => Promise<void>;\r\n\r\n /** get an array of the briefcases assigned to a user. */\r\n getMyBriefcaseIds: (arg: IModelIdArg) => Promise<BriefcaseId[]>;\r\n\r\n /**\r\n * Download a v1 checkpoint\r\n * @deprecated in 3.x. V1 checkpoints are deprecated. Download V2 checkpoint using [[V2CheckpointManager.downloadCheckpoint]].\r\n * @internal\r\n */\r\n downloadV1Checkpoint: (arg: CheckpointArg) => Promise<ChangesetIndexAndId>; // eslint-disable-line deprecation/deprecation\r\n\r\n /**\r\n * Get the access props for a V2 checkpoint. Returns undefined if no V2 checkpoint exists.\r\n * @internal\r\n */\r\n queryV2Checkpoint: (arg: CheckpointProps) => Promise<V2CheckpointAccessProps | undefined>;\r\n\r\n /**\r\n * acquire one or more locks. Throws if unsuccessful. If *any* lock cannot be obtained, no locks are acquired\r\n * @internal\r\n */\r\n acquireLocks: (arg: BriefcaseDbArg, locks: LockMap) => Promise<void>;\r\n\r\n /**\r\n * Get the list of all held locks for a briefcase. This can be very expensive and is currently used only for tests.\r\n * @internal\r\n */\r\n queryAllLocks: (arg: BriefcaseDbArg) => Promise<LockProps[]>;\r\n\r\n /**\r\n * Release all currently held locks\r\n * @internal\r\n */\r\n releaseAllLocks: (arg: BriefcaseDbArg) => Promise<void>;\r\n\r\n /** Get the iModelId of an iModel by name. Undefined if no iModel with that name exists. */\r\n queryIModelByName: (arg: IModelNameArg) => Promise<GuidString | undefined>;\r\n\r\n /** create a new iModel. Returns the Guid of the newly created iModel */\r\n createNewIModel: (arg: CreateNewIModelProps) => Promise<GuidString>;\r\n\r\n /** delete an iModel */\r\n deleteIModel: (arg: IModelIdArg & ITwinIdArg) => Promise<void>;\r\n}\r\n"]}
|
|
1
|
+
{"version":3,"file":"BackendHubAccess.js","sourceRoot":"","sources":["../../src/BackendHubAccess.ts"],"names":[],"mappings":";AAAA;;;+FAG+F;AAC/F;;GAEG;;;AAEH,sDAA2F;AAC3F,oDAG4B;AAI5B;;GAEG;AACH,IAAY,SASX;AATD,WAAY,SAAS;IACnB,gCAAgC;IAChC,yCAAQ,CAAA;IACR,mJAAmJ;IACnJ,6CAAU,CAAA;IACV;;OAEG;IACH,mDAAa,CAAA;AACf,CAAC,EATW,SAAS,GAAT,iBAAS,KAAT,iBAAS,QASpB;AAED;;EAEE;AACF,MAAa,YAAa,SAAQ,yBAAW;IAC3C;IACE,mCAAmC;IACnB,WAAwB;IACxC,sCAAsC;IACtB,cAAsB,EACtC,GAA6D;QAE7D,KAAK,CAAC,8BAAe,CAAC,2BAA2B,EAAE,GAAG,CAAC,CAAC;QALxC,gBAAW,GAAX,WAAW,CAAa;QAExB,mBAAc,GAAd,cAAc,CAAQ;IAIxC,CAAC;CACF;AAVD,oCAUC","sourcesContent":["/*---------------------------------------------------------------------------------------------\r\n* Copyright (c) Bentley Systems, Incorporated. All rights reserved.\r\n* See LICENSE.md in the project root for license terms and full copyright notice.\r\n*--------------------------------------------------------------------------------------------*/\r\n/** @packageDocumentation\r\n * @module HubAccess\r\n */\r\n\r\nimport { AccessToken, GuidString, Id64String, IModelHubStatus } from \"@itwin/core-bentley\";\r\nimport {\r\n BriefcaseId, ChangesetFileProps, ChangesetIdWithIndex, ChangesetIndex, ChangesetIndexAndId, ChangesetIndexOrId, ChangesetProps, ChangesetRange,\r\n IModelError, IModelVersion, LocalDirName, LocalFileName,\r\n} from \"@itwin/core-common\";\r\nimport { CheckpointProps, DownloadRequest, ProgressFunction } from \"./CheckpointManager\";\r\nimport type { TokenArg } from \"./IModelDb\";\r\n\r\n/** The state of a lock.\r\n * @public\r\n */\r\nexport enum LockState {\r\n /** The element is not locked */\r\n None = 0,\r\n /** Holding a shared lock on an element blocks other users from acquiring the Exclusive lock it. More than one user may acquire the shared lock. */\r\n Shared = 1,\r\n /** A Lock that permits modifications to an element and blocks other users from making modifications to it.\r\n * Holding an exclusive lock on an \"owner\" (a model or a parent element), implicitly exclusively locks all its members.\r\n */\r\n Exclusive = 2,\r\n}\r\n\r\n/** Exception thrown if lock cannot be acquired.\r\n * @beta\r\n*/\r\nexport class LockConflict extends IModelError {\r\n public constructor(\r\n /** Id of Briefcase holding lock */\r\n public readonly briefcaseId: BriefcaseId,\r\n /** Alias of Briefcase holding lock */\r\n public readonly briefcaseAlias: string,\r\n msg: \"shared lock is held\" | \"exclusive lock is already held\",\r\n ) {\r\n super(IModelHubStatus.LockOwnedByAnotherBriefcase, msg);\r\n }\r\n}\r\n\r\n/**\r\n * The properties to access a V2 checkpoint through a daemon.\r\n * @internal\r\n */\r\nexport interface V2CheckpointAccessProps {\r\n /** blob store account name. */\r\n readonly accountName: string;\r\n /** AccessToken that grants access to the container. */\r\n readonly sasToken: AccessToken;\r\n /** The name of the iModel's blob store container holding all checkpoints. */\r\n readonly containerId: string;\r\n /** The name of the virtual file within the container, used for the checkpoint */\r\n readonly dbName: string;\r\n /** blob storage module: e.g. \"azure\", \"google\", \"aws\". May also include URI style parameters. */\r\n readonly storageType: string;\r\n}\r\n\r\n/** @internal */\r\nexport type LockMap = Map<Id64String, LockState>;\r\n\r\n/**\r\n * The properties of a lock that may be obtained from a lock server.\r\n * @beta\r\n */\r\nexport interface LockProps {\r\n /** The elementId for the lock */\r\n readonly id: Id64String;\r\n /** the lock state */\r\n readonly state: LockState;\r\n}\r\n\r\n/**\r\n * Argument for cancelling and tracking download progress.\r\n * @beta\r\n */\r\nexport interface DownloadProgressArg {\r\n /** Called to show progress during a download. If this function returns non-zero, the download is aborted. */\r\n progressCallback?: ProgressFunction;\r\n}\r\n\r\n/**\r\n * Argument for methods that must supply an iTwinId\r\n * @public\r\n */\r\nexport interface ITwinIdArg {\r\n readonly iTwinId: GuidString;\r\n}\r\n\r\n/**\r\n * Argument for methods that must supply an IModelId\r\n * @public\r\n */\r\nexport interface IModelIdArg extends TokenArg {\r\n readonly iModelId: GuidString;\r\n}\r\n\r\n/**\r\n * Argument for acquiring a new BriefcaseId\r\n * @public\r\n */\r\nexport interface AcquireNewBriefcaseIdArg extends IModelIdArg {\r\n /** A string to be reported to other users to identify this briefcase, for example in the case of conflicts or lock collisions. */\r\n readonly briefcaseAlias?: string;\r\n}\r\n\r\n/** Argument for methods that must supply an IModel name and iTwinId\r\n * @public\r\n */\r\nexport interface IModelNameArg extends TokenArg, ITwinIdArg {\r\n readonly iModelName: string;\r\n}\r\n\r\n/** Argument for methods that must supply an IModelId and a BriefcaseId\r\n * @public\r\n */\r\nexport interface BriefcaseIdArg extends IModelIdArg {\r\n readonly briefcaseId: BriefcaseId;\r\n}\r\n\r\n/** Argument for methods that must supply a briefcaseId and a changeset\r\n * @public\r\n */\r\nexport interface BriefcaseDbArg extends BriefcaseIdArg {\r\n readonly changeset: ChangesetIdWithIndex;\r\n}\r\n\r\n/** Argument for methods that must supply an IModelId and a changeset\r\n * @public\r\n */\r\nexport interface ChangesetArg extends IModelIdArg {\r\n readonly changeset: ChangesetIndexOrId;\r\n}\r\n\r\n/** Argument for downloading a changeset.\r\n * @beta\r\n */\r\nexport interface DownloadChangesetArg extends ChangesetArg, DownloadProgressArg {\r\n /** Directory where the changeset should be downloaded. */\r\n targetDir: LocalDirName;\r\n}\r\n\r\n/** @internal */\r\nexport interface ChangesetIndexArg extends IModelIdArg {\r\n readonly changeset: ChangesetIdWithIndex;\r\n}\r\n\r\n/** Argument for methods that must supply an IModelId and a range of Changesets.\r\n * @public\r\n */\r\nexport interface ChangesetRangeArg extends IModelIdArg {\r\n /** the range of changesets desired. If is undefined, *all* changesets are returned. */\r\n readonly range?: ChangesetRange;\r\n}\r\n\r\n/** Argument for downloading a changeset range.\r\n * @beta\r\n */\r\nexport interface DownloadChangesetRangeArg extends ChangesetRangeArg, DownloadProgressArg {\r\n /** Directory where the changesets should be downloaded. */\r\n targetDir: LocalDirName;\r\n}\r\n\r\n/**\r\n * @deprecated in 3.x. Use [[DownloadRequest]].\r\n * @internal\r\n */\r\nexport type CheckpointArg = DownloadRequest;\r\n\r\n/**\r\n * Arguments to create a new iModel in iModelHub\r\n * @public\r\n */\r\nexport interface CreateNewIModelProps extends IModelNameArg {\r\n readonly description?: string;\r\n readonly version0?: LocalFileName;\r\n readonly noLocks?: true;\r\n}\r\n\r\n/**\r\n * Methods for accessing services of IModelHub from an iTwin.js backend.\r\n * Generally direct access to these methods should not be required, since higher-level apis are provided.\r\n * @note This interface is implemented in another repository. Any changes made to this interface must be validated against\r\n * the implementation found here: https://github.com/iTwin/imodels-clients/blob/main/itwin-platform-access/imodels-access-backend/src/BackendIModelsAccess.ts\r\n * @internal\r\n */\r\nexport interface BackendHubAccess {\r\n /** Download all the changesets in the specified range. */\r\n downloadChangesets: (arg: DownloadChangesetRangeArg) => Promise<ChangesetFileProps[]>;\r\n /** Download a single changeset. */\r\n downloadChangeset: (arg: DownloadChangesetArg) => Promise<ChangesetFileProps>;\r\n /** Query the changeset properties given a ChangesetIndex */\r\n queryChangeset: (arg: ChangesetArg) => Promise<ChangesetProps>;\r\n /** Query an array of changeset properties given a range of ChangesetIndexes */\r\n queryChangesets: (arg: ChangesetRangeArg) => Promise<ChangesetProps[]>;\r\n /** Push a changeset to iModelHub. Returns the newly pushed changeset's index */\r\n pushChangeset: (arg: IModelIdArg & { changesetProps: ChangesetFileProps }) => Promise<ChangesetIndex>;\r\n /** Get the ChangesetProps of the most recent changeset */\r\n getLatestChangeset: (arg: IModelIdArg) => Promise<ChangesetProps>;\r\n /** Get the ChangesetProps for an IModelVersion */\r\n getChangesetFromVersion: (arg: IModelIdArg & { version: IModelVersion }) => Promise<ChangesetProps>;\r\n /** Get the ChangesetProps for a named version */\r\n getChangesetFromNamedVersion: (arg: IModelIdArg & { versionName: string }) => Promise<ChangesetProps>;\r\n\r\n /** Acquire a new briefcaseId for the supplied iModelId\r\n * @note usually there should only be one briefcase per iModel per user.\r\n */\r\n acquireNewBriefcaseId: (arg: AcquireNewBriefcaseIdArg) => Promise<BriefcaseId>;\r\n /** Release a briefcaseId. After this call it is illegal to generate changesets for the released briefcaseId. */\r\n releaseBriefcase: (arg: BriefcaseIdArg) => Promise<void>;\r\n\r\n /** get an array of the briefcases assigned to a user. */\r\n getMyBriefcaseIds: (arg: IModelIdArg) => Promise<BriefcaseId[]>;\r\n\r\n /**\r\n * Download a v1 checkpoint\r\n * @deprecated in 3.x. V1 checkpoints are deprecated. Download V2 checkpoint using [[V2CheckpointManager.downloadCheckpoint]].\r\n * @internal\r\n */\r\n downloadV1Checkpoint: (arg: CheckpointArg) => Promise<ChangesetIndexAndId>; // eslint-disable-line deprecation/deprecation\r\n\r\n /**\r\n * Get the access props for a V2 checkpoint. Returns undefined if no V2 checkpoint exists.\r\n * @internal\r\n */\r\n queryV2Checkpoint: (arg: CheckpointProps) => Promise<V2CheckpointAccessProps | undefined>;\r\n\r\n /**\r\n * acquire one or more locks. Throws if unsuccessful. If *any* lock cannot be obtained, no locks are acquired\r\n * @internal\r\n */\r\n acquireLocks: (arg: BriefcaseDbArg, locks: LockMap) => Promise<void>;\r\n\r\n /**\r\n * Get the list of all held locks for a briefcase. This can be very expensive and is currently used only for tests.\r\n * @internal\r\n */\r\n queryAllLocks: (arg: BriefcaseDbArg) => Promise<LockProps[]>;\r\n\r\n /**\r\n * Release all currently held locks\r\n * @internal\r\n */\r\n releaseAllLocks: (arg: BriefcaseDbArg) => Promise<void>;\r\n\r\n /** Get the iModelId of an iModel by name. Undefined if no iModel with that name exists. */\r\n queryIModelByName: (arg: IModelNameArg) => Promise<GuidString | undefined>;\r\n\r\n /** create a new iModel. Returns the Guid of the newly created iModel */\r\n createNewIModel: (arg: CreateNewIModelProps) => Promise<GuidString>;\r\n\r\n /** delete an iModel */\r\n deleteIModel: (arg: IModelIdArg & ITwinIdArg) => Promise<void>;\r\n}\r\n"]}
|
|
@@ -2,7 +2,7 @@
|
|
|
2
2
|
* @module iModels
|
|
3
3
|
*/
|
|
4
4
|
import { BeEvent, GuidString } from "@itwin/core-bentley";
|
|
5
|
-
import { ChangesetId, ChangesetIdWithIndex, LocalDirName, LocalFileName } from "@itwin/core-common";
|
|
5
|
+
import { ChangesetId, ChangesetIdWithIndex, LocalDirName, LocalFileName, OpenCheckpointArgs } from "@itwin/core-common";
|
|
6
6
|
import { CloudSqlite } from "./CloudSqlite";
|
|
7
7
|
import { SnapshotDb, TokenArg } from "./IModelDb";
|
|
8
8
|
/**
|
|
@@ -70,12 +70,11 @@ export declare class Downloads {
|
|
|
70
70
|
* @internal
|
|
71
71
|
*/
|
|
72
72
|
export declare class V2CheckpointManager {
|
|
73
|
-
static readonly cloudCacheName = "
|
|
73
|
+
static readonly cloudCacheName = "Checkpoints";
|
|
74
74
|
private static _cloudCache?;
|
|
75
75
|
private static containers;
|
|
76
76
|
static getFolder(): LocalDirName;
|
|
77
77
|
static cleanup(): void;
|
|
78
|
-
static getFileName(checkpoint: CheckpointProps): LocalFileName;
|
|
79
78
|
private static get cloudCache();
|
|
80
79
|
/** Member names differ slightly between the V2Checkpoint api and the CloudSqlite api. Add aliases `accessName` for `accountName` and `accessToken` for `sasToken` */
|
|
81
80
|
private static toCloudContainerProps;
|
|
@@ -100,6 +99,7 @@ export declare class V1CheckpointManager {
|
|
|
100
99
|
static getCheckpointDb(request: DownloadRequest): Promise<SnapshotDb>;
|
|
101
100
|
/** Download a V1 checkpoint */
|
|
102
101
|
static downloadCheckpoint(request: DownloadRequest): Promise<ChangesetId>;
|
|
102
|
+
static openCheckpointV1(fileName: LocalFileName, checkpoint: CheckpointProps): SnapshotDb;
|
|
103
103
|
private static downloadAndOpen;
|
|
104
104
|
private static performDownload;
|
|
105
105
|
}
|
|
@@ -118,5 +118,6 @@ export declare class CheckpointManager {
|
|
|
118
118
|
static verifyCheckpoint(checkpoint: CheckpointProps, fileName: LocalFileName): boolean;
|
|
119
119
|
/** try to open an existing local file to satisfy a download request */
|
|
120
120
|
static tryOpenLocalFile(request: DownloadRequest): SnapshotDb | undefined;
|
|
121
|
+
static toCheckpointProps(args: OpenCheckpointArgs): Promise<CheckpointProps>;
|
|
121
122
|
}
|
|
122
123
|
//# sourceMappingURL=CheckpointManager.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"CheckpointManager.d.ts","sourceRoot":"","sources":["../../src/CheckpointManager.ts"],"names":[],"mappings":"AAIA;;GAEG;AAMH,OAAO,
|
|
1
|
+
{"version":3,"file":"CheckpointManager.d.ts","sourceRoot":"","sources":["../../src/CheckpointManager.ts"],"names":[],"mappings":"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"}
|
|
@@ -79,28 +79,13 @@ class V2CheckpointManager {
|
|
|
79
79
|
this._cloudCache = undefined;
|
|
80
80
|
this.containers.clear();
|
|
81
81
|
}
|
|
82
|
-
static getFileName(checkpoint) {
|
|
83
|
-
const changesetId = checkpoint.changeset.id || "first";
|
|
84
|
-
return path.join(this.getFolder(), `${changesetId}.bim`);
|
|
85
|
-
}
|
|
86
82
|
static get cloudCache() {
|
|
87
83
|
if (!this._cloudCache) {
|
|
88
|
-
let cacheDir = process.env.CHECKPOINT_CACHE_DIR;
|
|
89
|
-
if
|
|
90
|
-
|
|
91
|
-
|
|
92
|
-
}
|
|
93
|
-
else {
|
|
94
|
-
// Make sure the checkpoint_cache_dir has an iTwinDaemon specific file in it, otherwise fall back to other directory.
|
|
95
|
-
if (!(IModelJsFs_1.IModelJsFs.existsSync(path.join(cacheDir, "portnumber.bcv")))) {
|
|
96
|
-
cacheDir = this.getFolder();
|
|
97
|
-
core_bentley_1.Logger.logWarning(loggerCategory, `No evidence of the iTwinDaemon in provided CHECKPOINT_CACHE_DIR: ${process.env.CHECKPOINT_CACHE_DIR}, using ${cacheDir} instead.`);
|
|
98
|
-
}
|
|
99
|
-
}
|
|
84
|
+
let cacheDir = process.env.CHECKPOINT_CACHE_DIR ?? this.getFolder();
|
|
85
|
+
// See if there is a daemon running, otherwise use profile directory for cloudCache
|
|
86
|
+
if (!(IModelJsFs_1.IModelJsFs.existsSync(path.join(cacheDir, "portnumber.bcv"))))
|
|
87
|
+
cacheDir = undefined; // no daemon running, use profile directory
|
|
100
88
|
this._cloudCache = CloudSqlite_1.CloudSqlite.CloudCaches.getCache({ cacheName: this.cloudCacheName, cacheDir, cacheSize: "50G" });
|
|
101
|
-
// Its fine if its not a daemon, but lets log an info message
|
|
102
|
-
if (!this._cloudCache.isDaemon)
|
|
103
|
-
core_bentley_1.Logger.logInfo(loggerCategory, "V2Checkpoint manager running with no iTwinDaemon.");
|
|
104
89
|
}
|
|
105
90
|
return this._cloudCache;
|
|
106
91
|
}
|
|
@@ -108,11 +93,19 @@ class V2CheckpointManager {
|
|
|
108
93
|
static toCloudContainerProps(from) {
|
|
109
94
|
return { ...from, baseUri: `https://${from.accountName}.blob.core.windows.net`, accessToken: from.sasToken, storageType: "azure" };
|
|
110
95
|
}
|
|
111
|
-
static getContainer(v2Props) {
|
|
96
|
+
static getContainer(v2Props, checkpoint) {
|
|
112
97
|
let container = this.containers.get(v2Props.containerId);
|
|
113
|
-
if (
|
|
114
|
-
|
|
115
|
-
|
|
98
|
+
if (undefined === container) {
|
|
99
|
+
let tokenFn;
|
|
100
|
+
let tokenRefreshSeconds = -1;
|
|
101
|
+
// from Rpc, the accessToken in the checkpoint request is from the current user. It is used to request the sasToken for the container and
|
|
102
|
+
// the sasToken is checked for refresh (before it expires) on every Rpc request using that user's accessToken. For Ipc, the
|
|
103
|
+
// accessToken in the checkpoint request is undefined, and the sasToken is requested by IModelHost.getAccessToken(). It is refreshed on a timer.
|
|
104
|
+
if (undefined === checkpoint.accessToken) {
|
|
105
|
+
tokenFn = async () => (await IModelHost_1.IModelHost.hubAccess.queryV2Checkpoint(checkpoint))?.sasToken ?? "";
|
|
106
|
+
tokenRefreshSeconds = undefined;
|
|
107
|
+
}
|
|
108
|
+
container = CloudSqlite_1.CloudSqlite.createCloudContainer({ ...this.toCloudContainerProps(v2Props), tokenRefreshSeconds, logId: process.env.POD_NAME, tokenFn });
|
|
116
109
|
this.containers.set(v2Props.containerId, container);
|
|
117
110
|
}
|
|
118
111
|
return container;
|
|
@@ -128,7 +121,7 @@ class V2CheckpointManager {
|
|
|
128
121
|
throw new core_common_1.IModelError(core_bentley_1.IModelStatus.NotFound, `V2 checkpoint not found: err: ${err.message}`);
|
|
129
122
|
}
|
|
130
123
|
try {
|
|
131
|
-
const container = this.getContainer(v2props);
|
|
124
|
+
const container = this.getContainer(v2props, checkpoint);
|
|
132
125
|
const dbName = v2props.dbName;
|
|
133
126
|
if (!container.isConnected)
|
|
134
127
|
container.connect(this.cloudCache);
|
|
@@ -181,7 +174,7 @@ class V2CheckpointManager {
|
|
|
181
174
|
return Downloads.download(request, async (job) => this.performDownload(job));
|
|
182
175
|
}
|
|
183
176
|
}
|
|
184
|
-
V2CheckpointManager.cloudCacheName = "
|
|
177
|
+
V2CheckpointManager.cloudCacheName = "Checkpoints";
|
|
185
178
|
V2CheckpointManager.containers = new Map();
|
|
186
179
|
exports.V2CheckpointManager = V2CheckpointManager;
|
|
187
180
|
/** Utility class to deal with downloading V1 checkpoints from iModelHub.
|
|
@@ -203,13 +196,18 @@ class V1CheckpointManager {
|
|
|
203
196
|
static async downloadCheckpoint(request) {
|
|
204
197
|
return Downloads.download(request, async (job) => this.performDownload(job));
|
|
205
198
|
}
|
|
199
|
+
static openCheckpointV1(fileName, checkpoint) {
|
|
200
|
+
const snapshot = IModelDb_1.SnapshotDb.openFile(fileName, { key: CheckpointManager.getKey(checkpoint) });
|
|
201
|
+
snapshot._iTwinId = checkpoint.iTwinId;
|
|
202
|
+
return snapshot;
|
|
203
|
+
}
|
|
206
204
|
static async downloadAndOpen(job) {
|
|
207
205
|
const db = CheckpointManager.tryOpenLocalFile(job.request);
|
|
208
206
|
if (db)
|
|
209
207
|
return db;
|
|
210
208
|
await this.performDownload(job);
|
|
211
209
|
await CheckpointManager.updateToRequestedVersion(job.request);
|
|
212
|
-
return
|
|
210
|
+
return this.openCheckpointV1(job.request.localFile, job.request.checkpoint);
|
|
213
211
|
}
|
|
214
212
|
static async performDownload(job) {
|
|
215
213
|
CheckpointManager.onDownloadV1.raiseEvent(job);
|
|
@@ -349,18 +347,29 @@ class CheckpointManager {
|
|
|
349
347
|
static tryOpenLocalFile(request) {
|
|
350
348
|
const checkpoint = request.checkpoint;
|
|
351
349
|
if (this.verifyCheckpoint(checkpoint, request.localFile))
|
|
352
|
-
return
|
|
350
|
+
return V1CheckpointManager.openCheckpointV1(request.localFile, checkpoint);
|
|
353
351
|
// check a list of aliases for finding checkpoints downloaded to non-default locations (e.g. from older versions)
|
|
354
352
|
if (request.aliasFiles) {
|
|
355
353
|
for (const alias of request.aliasFiles) {
|
|
356
354
|
if (this.verifyCheckpoint(checkpoint, alias)) {
|
|
357
355
|
request.localFile = alias;
|
|
358
|
-
return
|
|
356
|
+
return V1CheckpointManager.openCheckpointV1(alias, checkpoint);
|
|
359
357
|
}
|
|
360
358
|
}
|
|
361
359
|
}
|
|
362
360
|
return undefined;
|
|
363
361
|
}
|
|
362
|
+
static async toCheckpointProps(args) {
|
|
363
|
+
const changeset = args.changeset ?? await IModelHost_1.IModelHost.hubAccess.getLatestChangeset({ ...args, accessToken: await IModelHost_1.IModelHost.getAccessToken() });
|
|
364
|
+
return {
|
|
365
|
+
iModelId: args.iModelId,
|
|
366
|
+
iTwinId: args.iTwinId,
|
|
367
|
+
changeset: {
|
|
368
|
+
index: changeset.index,
|
|
369
|
+
id: changeset.id ?? (await IModelHost_1.IModelHost.hubAccess.queryChangeset({ ...args, changeset, accessToken: await IModelHost_1.IModelHost.getAccessToken() })).id,
|
|
370
|
+
},
|
|
371
|
+
};
|
|
372
|
+
}
|
|
364
373
|
}
|
|
365
374
|
CheckpointManager.onDownloadV1 = new core_bentley_1.BeEvent();
|
|
366
375
|
CheckpointManager.onDownloadV2 = new core_bentley_1.BeEvent();
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"CheckpointManager.js","sourceRoot":"","sources":["../../src/CheckpointManager.ts"],"names":[],"mappings":"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","sourcesContent":["/*---------------------------------------------------------------------------------------------\r\n* Copyright (c) Bentley Systems, Incorporated. All rights reserved.\r\n* See LICENSE.md in the project root for license terms and full copyright notice.\r\n*--------------------------------------------------------------------------------------------*/\r\n/** @packageDocumentation\r\n * @module iModels\r\n */\r\n\r\n// cspell:ignore BLOCKCACHE\r\n\r\nimport * as path from \"path\";\r\nimport { NativeLoggerCategory } from \"@bentley/imodeljs-native\";\r\nimport { BeEvent, ChangeSetStatus, Guid, GuidString, IModelStatus, Logger, LogLevel, Mutable, OpenMode, StopWatch } from \"@itwin/core-bentley\";\r\nimport {\r\n BriefcaseIdValue, ChangesetId, ChangesetIdWithIndex, ChangesetIndexAndId, IModelError, IModelVersion, LocalDirName, LocalFileName,\r\n} from \"@itwin/core-common\";\r\nimport { V2CheckpointAccessProps } from \"./BackendHubAccess\";\r\nimport { BackendLoggerCategory } from \"./BackendLoggerCategory\";\r\nimport { BriefcaseManager } from \"./BriefcaseManager\";\r\nimport { CloudSqlite } from \"./CloudSqlite\";\r\nimport { IModelHost } from \"./IModelHost\";\r\nimport { IModelJsFs } from \"./IModelJsFs\";\r\nimport { SnapshotDb, TokenArg } from \"./IModelDb\";\r\n\r\nconst loggerCategory = BackendLoggerCategory.IModelDb;\r\n\r\n/**\r\n * Properties of a checkpoint\r\n * @public\r\n */\r\nexport interface CheckpointProps extends TokenArg {\r\n readonly expectV2?: boolean;\r\n\r\n /** iTwin that the iModel belongs to */\r\n readonly iTwinId: GuidString;\r\n\r\n /** Id of the iModel */\r\n readonly iModelId: GuidString;\r\n\r\n /** changeset for the checkpoint */\r\n readonly changeset: ChangesetIdWithIndex;\r\n\r\n /** If true, then the latest successful v2 checkpoint at or before the provided changeset will be returned when calling queryV2Checkpoint. */\r\n readonly allowPreceding?: boolean;\r\n\r\n /** The number of seconds before the current token expires to attempt to reacquire a new token. Default is 1 hour. */\r\n readonly reattachSafetySeconds?: number;\r\n}\r\n\r\n/** Return value from [[ProgressFunction]].\r\n * @public\r\n */\r\nexport enum ProgressStatus {\r\n /** Continue download. */\r\n Continue = 0,\r\n /** Abort download. */\r\n Abort = 1,\r\n}\r\n\r\n/** Called to show progress during a download. If this function returns non-zero, the download is aborted.\r\n * @public\r\n */\r\nexport type ProgressFunction = (loaded: number, total: number) => ProgressStatus;\r\n\r\n/** The parameters that specify a request to download a checkpoint file from iModelHub.\r\n * @internal\r\n */\r\nexport interface DownloadRequest {\r\n /** name of local file to hold the downloaded data. */\r\n localFile: LocalFileName;\r\n\r\n /** A list of full fileName paths to test before downloading. If a valid file exists by one of these names,\r\n * no download is performed and `localFile` is updated to reflect the fact that the file exists with that name.\r\n * This can be used, for example, to look for checkpoints from previous versions if the naming strategy changes.\r\n */\r\n readonly aliasFiles?: ReadonlyArray<string>;\r\n\r\n /** Properties of the checkpoint to be downloaded */\r\n readonly checkpoint: CheckpointProps;\r\n\r\n /** If present, this function will be called to indicate progress as the briefcase is downloaded. If this\r\n * function returns a non-zero value, the download is aborted.\r\n */\r\n readonly onProgress?: ProgressFunction;\r\n}\r\n\r\n/** @internal */\r\nexport interface DownloadJob {\r\n request: DownloadRequest;\r\n promise?: Promise<any>;\r\n}\r\n\r\n/** @internal */\r\nexport class Downloads {\r\n private static _active = new Map<string, DownloadJob>();\r\n\r\n private static async process<T>(job: DownloadJob, fn: (job: DownloadJob) => Promise<T>) {\r\n const jobName = job.request.localFile; // save this, it can change inside call to `fn`!\r\n this._active.set(jobName, job);\r\n try {\r\n return await fn(job);\r\n } finally {\r\n this._active.delete(jobName);\r\n }\r\n }\r\n\r\n public static isInProgress(pathName: LocalFileName): DownloadJob | undefined {\r\n return this._active.get(pathName);\r\n }\r\n\r\n public static async download<T>(request: DownloadRequest, downloadFn: (job: DownloadJob) => Promise<T>) {\r\n const pathName = request.localFile;\r\n let job = this.isInProgress(pathName);\r\n if (undefined !== job)\r\n return job.promise;\r\n\r\n IModelJsFs.recursiveMkDirSync(path.dirname(pathName));\r\n job = { request };\r\n return job.promise = this.process(job, downloadFn);\r\n }\r\n}\r\n\r\n/**\r\n * Utility class for opening V2 checkpoints from cloud containers, and also for downloading them.\r\n * @internal\r\n*/\r\nexport class V2CheckpointManager {\r\n public static readonly cloudCacheName = \"v2Checkpoints\";\r\n private static _cloudCache?: CloudSqlite.CloudCache;\r\n private static containers = new Map<string, CloudSqlite.CloudContainer>();\r\n\r\n public static getFolder(): LocalDirName {\r\n const cloudCachePath = path.join(BriefcaseManager.cacheDir, V2CheckpointManager.cloudCacheName);\r\n if (!(IModelJsFs.existsSync(cloudCachePath))) {\r\n IModelJsFs.recursiveMkDirSync(cloudCachePath);\r\n }\r\n return cloudCachePath;\r\n }\r\n\r\n /* only used by tests that reset the state of the v2CheckpointManager. all dbs should be closed before calling this function. */\r\n public static cleanup(): void {\r\n for (const [_, value] of this.containers.entries()) {\r\n if (value.isConnected)\r\n value.disconnect({ detach: true });\r\n }\r\n\r\n CloudSqlite.CloudCaches.dropCache(this.cloudCacheName)?.destroy();\r\n this._cloudCache = undefined;\r\n this.containers.clear();\r\n }\r\n\r\n public static getFileName(checkpoint: CheckpointProps): LocalFileName {\r\n const changesetId = checkpoint.changeset.id || \"first\";\r\n return path.join(this.getFolder(), `${changesetId}.bim`);\r\n }\r\n\r\n private static get cloudCache(): CloudSqlite.CloudCache {\r\n if (!this._cloudCache) {\r\n let cacheDir = process.env.CHECKPOINT_CACHE_DIR;\r\n if (!cacheDir) {\r\n cacheDir = this.getFolder();\r\n Logger.logWarning(loggerCategory, `No CHECKPOINT_CACHE_DIR found in process.env, using ${cacheDir} instead.`);\r\n } else {\r\n // Make sure the checkpoint_cache_dir has an iTwinDaemon specific file in it, otherwise fall back to other directory.\r\n if (!(IModelJsFs.existsSync(path.join(cacheDir, \"portnumber.bcv\")))) {\r\n cacheDir = this.getFolder();\r\n Logger.logWarning(loggerCategory, `No evidence of the iTwinDaemon in provided CHECKPOINT_CACHE_DIR: ${process.env.CHECKPOINT_CACHE_DIR}, using ${cacheDir} instead.`);\r\n }\r\n }\r\n\r\n this._cloudCache = CloudSqlite.CloudCaches.getCache({ cacheName: this.cloudCacheName, cacheDir, cacheSize: \"50G\" });\r\n\r\n // Its fine if its not a daemon, but lets log an info message\r\n if (!this._cloudCache.isDaemon)\r\n Logger.logInfo(loggerCategory, \"V2Checkpoint manager running with no iTwinDaemon.\");\r\n }\r\n return this._cloudCache;\r\n }\r\n\r\n /** Member names differ slightly between the V2Checkpoint api and the CloudSqlite api. Add aliases `accessName` for `accountName` and `accessToken` for `sasToken` */\r\n private static toCloudContainerProps(from: V2CheckpointAccessProps): CloudSqlite.ContainerAccessProps {\r\n return { ...from, baseUri: `https://${from.accountName}.blob.core.windows.net`, accessToken: from.sasToken, storageType: \"azure\" };\r\n }\r\n\r\n private static getContainer(v2Props: V2CheckpointAccessProps) {\r\n let container = this.containers.get(v2Props.containerId);\r\n if (!container) {\r\n // note checkpoint tokens can't be auto-refreshed because they rely on user credentials supplied through RPC. They're refreshed in SnapshotDb._refreshSas.\r\n container = CloudSqlite.createCloudContainer({ ...this.toCloudContainerProps(v2Props), tokenRefreshSeconds: -1, logId: process.env.POD_NAME });\r\n this.containers.set(v2Props.containerId, container);\r\n }\r\n return container;\r\n }\r\n\r\n public static async attach(checkpoint: CheckpointProps): Promise<{ dbName: string, container: CloudSqlite.CloudContainer }> {\r\n let v2props: V2CheckpointAccessProps | undefined;\r\n try {\r\n v2props = await IModelHost.hubAccess.queryV2Checkpoint(checkpoint);\r\n if (!v2props)\r\n throw new Error(\"no checkpoint\");\r\n } catch (err: any) {\r\n throw new IModelError(IModelStatus.NotFound, `V2 checkpoint not found: err: ${err.message}`);\r\n }\r\n\r\n try {\r\n const container = this.getContainer(v2props);\r\n const dbName = v2props.dbName;\r\n if (!container.isConnected)\r\n container.connect(this.cloudCache);\r\n container.checkForChanges();\r\n const dbStats = container.queryDatabase(dbName);\r\n if (IModelHost.appWorkspace.settings.getBoolean(\"Checkpoints/prefetch\", false)) {\r\n const getPrefetchConfig = (name: string, defaultVal: number) => IModelHost.appWorkspace.settings.getNumber(`Checkpoints/prefetch/${name}`, defaultVal);\r\n const minRequests = getPrefetchConfig(\"minRequests\", 3);\r\n const maxRequests = getPrefetchConfig(\"maxRequests\", 6);\r\n const timeout = getPrefetchConfig(\"timeout\", 100);\r\n const maxBlocks = getPrefetchConfig(\"maxBlocks\", 500); // default size of 2GB. Assumes a checkpoint block size of 4MB.\r\n if (dbStats?.totalBlocks !== undefined && dbStats.totalBlocks <= maxBlocks && dbStats.nPrefetch === 0) {\r\n const logPrefetch = async (prefetch: CloudSqlite.CloudPrefetch) => {\r\n const stopwatch = new StopWatch(`[${container.containerId}/${dbName}]`, true);\r\n Logger.logInfo(loggerCategory, `Starting prefetch of ${stopwatch.description}`, { minRequests, maxRequests, timeout });\r\n const done = await prefetch.promise;\r\n Logger.logInfo(loggerCategory, `Prefetch of ${stopwatch.description} complete=${done} (${stopwatch.elapsedSeconds} seconds)`, { minRequests, maxRequests, timeout });\r\n };\r\n // eslint-disable-next-line @typescript-eslint/no-floating-promises\r\n logPrefetch(CloudSqlite.startCloudPrefetch(container, dbName, { minRequests, nRequests: maxRequests, timeout }));\r\n } else {\r\n Logger.logInfo(loggerCategory, `Skipping prefetch due to size limits or ongoing prefetch.`, { maxBlocks, numPrefetches: dbStats?.nPrefetch, totalBlocksInDb: dbStats?.totalBlocks, v2props });\r\n }\r\n }\r\n return { dbName, container };\r\n } catch (e: any) {\r\n const error = `Cloud cache connect failed: ${e.message}`;\r\n if (checkpoint.expectV2)\r\n Logger.logError(loggerCategory, error);\r\n\r\n throw new IModelError(e.errorNumber, error);\r\n }\r\n }\r\n\r\n private static async performDownload(job: DownloadJob): Promise<ChangesetId> {\r\n const request = job.request;\r\n const v2props: V2CheckpointAccessProps | undefined = await IModelHost.hubAccess.queryV2Checkpoint({ ...request.checkpoint, allowPreceding: true });\r\n if (!v2props)\r\n throw new IModelError(IModelStatus.NotFound, \"V2 checkpoint not found\");\r\n\r\n CheckpointManager.onDownloadV2.raiseEvent(job);\r\n const container = CloudSqlite.createCloudContainer(this.toCloudContainerProps(v2props));\r\n await CloudSqlite.transferDb(\"download\", container, { dbName: v2props.dbName, localFileName: request.localFile, onProgress: request.onProgress });\r\n return request.checkpoint.changeset.id;\r\n }\r\n\r\n /** Fully download a V2 checkpoint to a local file that can be used to create a briefcase or to work offline.\r\n * @returns a Promise that is resolved when the download completes with the changesetId of the downloaded checkpoint (which will\r\n * be the same as the requested changesetId or the most recent checkpoint before it.)\r\n */\r\n public static async downloadCheckpoint(request: DownloadRequest): Promise<ChangesetId> {\r\n return Downloads.download(request, async (job: DownloadJob) => this.performDownload(job));\r\n }\r\n}\r\n\r\n/** Utility class to deal with downloading V1 checkpoints from iModelHub.\r\n * @internal\r\n */\r\nexport class V1CheckpointManager {\r\n public static getFolder(iModelId: GuidString): LocalDirName {\r\n return path.join(BriefcaseManager.getIModelPath(iModelId), \"checkpoints\");\r\n }\r\n\r\n public static getFileName(checkpoint: CheckpointProps): LocalFileName {\r\n const changesetId = checkpoint.changeset.id || \"first\";\r\n return path.join(this.getFolder(checkpoint.iModelId), `${changesetId}.bim`);\r\n }\r\n\r\n public static async getCheckpointDb(request: DownloadRequest): Promise<SnapshotDb> {\r\n const db = SnapshotDb.tryFindByKey(CheckpointManager.getKey(request.checkpoint));\r\n return (undefined !== db) ? db : Downloads.download(request, async (job: DownloadJob) => this.downloadAndOpen(job));\r\n }\r\n\r\n /** Download a V1 checkpoint */\r\n public static async downloadCheckpoint(request: DownloadRequest): Promise<ChangesetId> {\r\n return Downloads.download(request, async (job: DownloadJob) => this.performDownload(job));\r\n }\r\n\r\n private static async downloadAndOpen(job: DownloadJob) {\r\n const db = CheckpointManager.tryOpenLocalFile(job.request);\r\n if (db)\r\n return db;\r\n await this.performDownload(job);\r\n await CheckpointManager.updateToRequestedVersion(job.request);\r\n return SnapshotDb.openCheckpointV1(job.request.localFile, job.request.checkpoint);\r\n }\r\n\r\n private static async performDownload(job: DownloadJob): Promise<ChangesetId> {\r\n CheckpointManager.onDownloadV1.raiseEvent(job);\r\n // eslint-disable-next-line deprecation/deprecation\r\n return (await IModelHost.hubAccess.downloadV1Checkpoint(job.request)).id;\r\n }\r\n}\r\n\r\n/** @internal */\r\nexport class CheckpointManager {\r\n public static readonly onDownloadV1 = new BeEvent<(job: DownloadJob) => void>();\r\n public static readonly onDownloadV2 = new BeEvent<(job: DownloadJob) => void>();\r\n public static getKey(checkpoint: CheckpointProps) { return `${checkpoint.iModelId}:${checkpoint.changeset.id}`; }\r\n\r\n private static async doDownload(request: DownloadRequest): Promise<ChangesetId> {\r\n try {\r\n // first see if there's a V2 checkpoint available.\r\n const stopwatch = new StopWatch(`[${request.checkpoint.changeset.id}]`, true);\r\n Logger.logInfo(loggerCategory, `Starting download of V2 checkpoint with id ${stopwatch.description}`);\r\n const changesetId = await V2CheckpointManager.downloadCheckpoint(request);\r\n Logger.logInfo(loggerCategory, `Downloaded V2 checkpoint with id ${stopwatch.description} (${stopwatch.elapsedSeconds} seconds)`);\r\n if (changesetId !== request.checkpoint.changeset.id)\r\n Logger.logInfo(loggerCategory, `Downloaded previous v2 checkpoint because requested checkpoint not found.`, { requestedChangesetId: request.checkpoint.changeset.id, iModelId: request.checkpoint.iModelId, changesetId, iTwinId: request.checkpoint.iTwinId });\r\n else\r\n Logger.logInfo(loggerCategory, `Downloaded v2 checkpoint.`, { iModelId: request.checkpoint.iModelId, changesetId: request.checkpoint.changeset.id, iTwinId: request.checkpoint.iTwinId });\r\n return changesetId;\r\n } catch (error: any) {\r\n if (error.errorNumber === IModelStatus.NotFound) { // No V2 checkpoint available, try a v1 checkpoint\r\n const changeset = await V1CheckpointManager.downloadCheckpoint(request);\r\n Logger.logWarning(loggerCategory, `Got an error downloading v2 checkpoint, but downloaded v1 checkpoint successfully!`, { error, iModelId: request.checkpoint.iModelId, iTwinId: request.checkpoint.iTwinId, requestedChangesetId: request.checkpoint.changeset.id, changesetId: changeset });\r\n return changeset;\r\n }\r\n throw error; // most likely, was aborted\r\n }\r\n }\r\n\r\n public static async updateToRequestedVersion(request: DownloadRequest) {\r\n const checkpoint = request.checkpoint;\r\n const targetFile = request.localFile;\r\n const traceInfo = { iTwinId: checkpoint.iTwinId, iModelId: checkpoint.iModelId, changeset: checkpoint.changeset };\r\n try {\r\n // Open checkpoint for write\r\n const prevLogLevel = Logger.getLevel(NativeLoggerCategory.SQLite) ?? LogLevel.Error; // Get log level before we set it to None.\r\n Logger.setLevel(NativeLoggerCategory.SQLite, LogLevel.None); // Ignores noisy error messages when applying changesets.\r\n const db = SnapshotDb.openForApplyChangesets(targetFile);\r\n const nativeDb = db.nativeDb;\r\n try {\r\n\r\n if (nativeDb.hasPendingTxns()) {\r\n Logger.logWarning(loggerCategory, \"Checkpoint with Txns found - deleting them\", () => traceInfo);\r\n nativeDb.deleteAllTxns();\r\n }\r\n\r\n if (nativeDb.getBriefcaseId() !== BriefcaseIdValue.Unassigned)\r\n nativeDb.resetBriefcaseId(BriefcaseIdValue.Unassigned);\r\n\r\n CheckpointManager.validateCheckpointGuids(checkpoint, db);\r\n // Apply change sets if necessary\r\n const currentChangeset: Mutable<ChangesetIndexAndId> = nativeDb.getCurrentChangeset();\r\n if (currentChangeset.id !== checkpoint.changeset.id) {\r\n const accessToken = checkpoint.accessToken;\r\n const toIndex = checkpoint.changeset.index ??\r\n (await IModelHost.hubAccess.getChangesetFromVersion({ accessToken, iModelId: checkpoint.iModelId, version: IModelVersion.asOfChangeSet(checkpoint.changeset.id) })).index;\r\n await BriefcaseManager.pullAndApplyChangesets(db, { accessToken, toIndex });\r\n } else {\r\n // make sure the parent changeset index is saved in the file - old versions didn't have it.\r\n currentChangeset.index = checkpoint.changeset.index!; // eslint-disable-line @typescript-eslint/no-non-null-assertion\r\n nativeDb.saveLocalValue(\"parentChangeSet\", JSON.stringify(currentChangeset));\r\n }\r\n } finally {\r\n Logger.setLevel(NativeLoggerCategory.SQLite, prevLogLevel); // Set logging to what it was before we started applying changesets.\r\n db.saveChanges();\r\n db.close();\r\n }\r\n } catch (error: any) {\r\n\r\n Logger.logError(loggerCategory, \"Error downloading checkpoint - deleting it\", () => traceInfo);\r\n IModelJsFs.removeSync(targetFile);\r\n\r\n if (error.errorNumber === ChangeSetStatus.CorruptedChangeStream || error.errorNumber === ChangeSetStatus.InvalidId || error.errorNumber === ChangeSetStatus.InvalidVersion) {\r\n Logger.logError(loggerCategory, \"Detected potential corruption of change sets. Deleting them to enable retries\", () => traceInfo);\r\n BriefcaseManager.deleteChangeSetsFromLocalDisk(checkpoint.iModelId);\r\n }\r\n throw error;\r\n }\r\n }\r\n\r\n /** Download a checkpoint file from iModelHub into a local file specified in the request parameters. */\r\n public static async downloadCheckpoint(request: DownloadRequest): Promise<void> {\r\n if (this.verifyCheckpoint(request.checkpoint, request.localFile))\r\n return;\r\n\r\n if (request.aliasFiles) {\r\n for (const alias of request.aliasFiles) {\r\n if (this.verifyCheckpoint(request.checkpoint, alias)) {\r\n request.localFile = alias;\r\n return;\r\n }\r\n }\r\n }\r\n\r\n await this.doDownload(request);\r\n return this.updateToRequestedVersion(request);\r\n }\r\n\r\n /** checks a file's dbGuid & iTwinId for consistency, and updates the dbGuid when possible */\r\n public static validateCheckpointGuids(checkpoint: CheckpointProps, snapshotDb: SnapshotDb) {\r\n const traceInfo = { iTwinId: checkpoint.iTwinId, iModelId: checkpoint.iModelId };\r\n\r\n const nativeDb = snapshotDb.nativeDb;\r\n const dbChangeset = nativeDb.getCurrentChangeset();\r\n const iModelId = Guid.normalize(nativeDb.getIModelId());\r\n if (iModelId !== Guid.normalize(checkpoint.iModelId)) {\r\n if (nativeDb.isReadonly())\r\n throw new IModelError(IModelStatus.ValidationFailed, \"iModelId is not properly set up in the checkpoint\");\r\n\r\n Logger.logWarning(loggerCategory, \"iModelId is not properly set up in the checkpoint. Updated checkpoint to the correct iModelId.\", () => ({ ...traceInfo, dbGuid: iModelId }));\r\n const iModelIdNormalized = Guid.normalize(checkpoint.iModelId);\r\n nativeDb.setIModelId(iModelIdNormalized);\r\n (snapshotDb as any)._iModelId = iModelIdNormalized;\r\n // Required to reset the ChangeSetId because setDbGuid clears the value.\r\n nativeDb.saveLocalValue(\"ParentChangeSetId\", dbChangeset.id);\r\n if (undefined !== dbChangeset.index)\r\n nativeDb.saveLocalValue(\"parentChangeSet\", JSON.stringify(dbChangeset));\r\n }\r\n\r\n const iTwinId = Guid.normalize(nativeDb.getITwinId());\r\n if (iTwinId !== Guid.normalize(checkpoint.iTwinId))\r\n throw new IModelError(IModelStatus.ValidationFailed, \"iTwinId was not properly set up in the checkpoint\");\r\n }\r\n\r\n /** @returns true if the file is the checkpoint requested */\r\n public static verifyCheckpoint(checkpoint: CheckpointProps, fileName: LocalFileName): boolean {\r\n if (!IModelJsFs.existsSync(fileName))\r\n return false;\r\n\r\n const nativeDb = new IModelHost.platform.DgnDb();\r\n try {\r\n nativeDb.openIModel(fileName, OpenMode.Readonly);\r\n } catch (error) {\r\n return false;\r\n }\r\n\r\n const isValid = checkpoint.iModelId === nativeDb.getIModelId() && checkpoint.changeset.id === nativeDb.getCurrentChangeset().id;\r\n nativeDb.closeFile();\r\n if (!isValid)\r\n IModelJsFs.removeSync(fileName);\r\n\r\n return isValid;\r\n }\r\n\r\n /** try to open an existing local file to satisfy a download request */\r\n public static tryOpenLocalFile(request: DownloadRequest): SnapshotDb | undefined {\r\n const checkpoint = request.checkpoint;\r\n if (this.verifyCheckpoint(checkpoint, request.localFile))\r\n return SnapshotDb.openCheckpointV1(request.localFile, checkpoint);\r\n\r\n // check a list of aliases for finding checkpoints downloaded to non-default locations (e.g. from older versions)\r\n if (request.aliasFiles) {\r\n for (const alias of request.aliasFiles) {\r\n if (this.verifyCheckpoint(checkpoint, alias)) {\r\n request.localFile = alias;\r\n return SnapshotDb.openCheckpointV1(alias, checkpoint);\r\n }\r\n }\r\n }\r\n return undefined;\r\n }\r\n}\r\n"]}
|
|
1
|
+
{"version":3,"file":"CheckpointManager.js","sourceRoot":"","sources":["../../src/CheckpointManager.ts"],"names":[],"mappings":"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","sourcesContent":["/*---------------------------------------------------------------------------------------------\r\n* Copyright (c) Bentley Systems, Incorporated. All rights reserved.\r\n* See LICENSE.md in the project root for license terms and full copyright notice.\r\n*--------------------------------------------------------------------------------------------*/\r\n/** @packageDocumentation\r\n * @module iModels\r\n */\r\n\r\n// cspell:ignore BLOCKCACHE\r\n\r\nimport * as path from \"path\";\r\nimport { NativeLoggerCategory } from \"@bentley/imodeljs-native\";\r\nimport { AccessToken, BeEvent, ChangeSetStatus, Guid, GuidString, IModelStatus, Logger, LogLevel, Mutable, OpenMode, StopWatch } from \"@itwin/core-bentley\";\r\nimport {\r\n BriefcaseIdValue, ChangesetId, ChangesetIdWithIndex, ChangesetIndexAndId, IModelError, IModelVersion, LocalDirName, LocalFileName, OpenCheckpointArgs,\r\n} from \"@itwin/core-common\";\r\nimport { V2CheckpointAccessProps } from \"./BackendHubAccess\";\r\nimport { BackendLoggerCategory } from \"./BackendLoggerCategory\";\r\nimport { BriefcaseManager } from \"./BriefcaseManager\";\r\nimport { CloudSqlite } from \"./CloudSqlite\";\r\nimport { IModelHost } from \"./IModelHost\";\r\nimport { IModelJsFs } from \"./IModelJsFs\";\r\nimport { SnapshotDb, TokenArg } from \"./IModelDb\";\r\n\r\nconst loggerCategory = BackendLoggerCategory.IModelDb;\r\n\r\n/**\r\n * Properties of a checkpoint\r\n * @public\r\n */\r\nexport interface CheckpointProps extends TokenArg {\r\n readonly expectV2?: boolean;\r\n\r\n /** iTwin that the iModel belongs to */\r\n readonly iTwinId: GuidString;\r\n\r\n /** Id of the iModel */\r\n readonly iModelId: GuidString;\r\n\r\n /** changeset for the checkpoint */\r\n readonly changeset: ChangesetIdWithIndex;\r\n\r\n /** If true, then the latest successful v2 checkpoint at or before the provided changeset will be returned when calling queryV2Checkpoint. */\r\n readonly allowPreceding?: boolean;\r\n\r\n /** The number of seconds before the current token expires to attempt to reacquire a new token. Default is 1 hour. */\r\n readonly reattachSafetySeconds?: number;\r\n}\r\n\r\n/** Return value from [[ProgressFunction]].\r\n * @public\r\n */\r\nexport enum ProgressStatus {\r\n /** Continue download. */\r\n Continue = 0,\r\n /** Abort download. */\r\n Abort = 1,\r\n}\r\n\r\n/** Called to show progress during a download. If this function returns non-zero, the download is aborted.\r\n * @public\r\n */\r\nexport type ProgressFunction = (loaded: number, total: number) => ProgressStatus;\r\n\r\n/** The parameters that specify a request to download a checkpoint file from iModelHub.\r\n * @internal\r\n */\r\nexport interface DownloadRequest {\r\n /** name of local file to hold the downloaded data. */\r\n localFile: LocalFileName;\r\n\r\n /** A list of full fileName paths to test before downloading. If a valid file exists by one of these names,\r\n * no download is performed and `localFile` is updated to reflect the fact that the file exists with that name.\r\n * This can be used, for example, to look for checkpoints from previous versions if the naming strategy changes.\r\n */\r\n readonly aliasFiles?: ReadonlyArray<string>;\r\n\r\n /** Properties of the checkpoint to be downloaded */\r\n readonly checkpoint: CheckpointProps;\r\n\r\n /** If present, this function will be called to indicate progress as the briefcase is downloaded. If this\r\n * function returns a non-zero value, the download is aborted.\r\n */\r\n readonly onProgress?: ProgressFunction;\r\n}\r\n\r\n/** @internal */\r\nexport interface DownloadJob {\r\n request: DownloadRequest;\r\n promise?: Promise<any>;\r\n}\r\n\r\n/** @internal */\r\nexport class Downloads {\r\n private static _active = new Map<string, DownloadJob>();\r\n\r\n private static async process<T>(job: DownloadJob, fn: (job: DownloadJob) => Promise<T>) {\r\n const jobName = job.request.localFile; // save this, it can change inside call to `fn`!\r\n this._active.set(jobName, job);\r\n try {\r\n return await fn(job);\r\n } finally {\r\n this._active.delete(jobName);\r\n }\r\n }\r\n\r\n public static isInProgress(pathName: LocalFileName): DownloadJob | undefined {\r\n return this._active.get(pathName);\r\n }\r\n\r\n public static async download<T>(request: DownloadRequest, downloadFn: (job: DownloadJob) => Promise<T>) {\r\n const pathName = request.localFile;\r\n let job = this.isInProgress(pathName);\r\n if (undefined !== job)\r\n return job.promise;\r\n\r\n IModelJsFs.recursiveMkDirSync(path.dirname(pathName));\r\n job = { request };\r\n return job.promise = this.process(job, downloadFn);\r\n }\r\n}\r\n\r\n/**\r\n * Utility class for opening V2 checkpoints from cloud containers, and also for downloading them.\r\n * @internal\r\n*/\r\nexport class V2CheckpointManager {\r\n public static readonly cloudCacheName = \"Checkpoints\";\r\n private static _cloudCache?: CloudSqlite.CloudCache;\r\n private static containers = new Map<string, CloudSqlite.CloudContainer>();\r\n\r\n public static getFolder(): LocalDirName {\r\n const cloudCachePath = path.join(BriefcaseManager.cacheDir, V2CheckpointManager.cloudCacheName);\r\n if (!(IModelJsFs.existsSync(cloudCachePath))) {\r\n IModelJsFs.recursiveMkDirSync(cloudCachePath);\r\n }\r\n return cloudCachePath;\r\n }\r\n\r\n /* only used by tests that reset the state of the v2CheckpointManager. all dbs should be closed before calling this function. */\r\n public static cleanup(): void {\r\n for (const [_, value] of this.containers.entries()) {\r\n if (value.isConnected)\r\n value.disconnect({ detach: true });\r\n }\r\n\r\n CloudSqlite.CloudCaches.dropCache(this.cloudCacheName)?.destroy();\r\n this._cloudCache = undefined;\r\n this.containers.clear();\r\n }\r\n\r\n private static get cloudCache(): CloudSqlite.CloudCache {\r\n if (!this._cloudCache) {\r\n let cacheDir: string | undefined = process.env.CHECKPOINT_CACHE_DIR ?? this.getFolder();\r\n // See if there is a daemon running, otherwise use profile directory for cloudCache\r\n if (!(IModelJsFs.existsSync(path.join(cacheDir, \"portnumber.bcv\"))))\r\n cacheDir = undefined; // no daemon running, use profile directory\r\n\r\n this._cloudCache = CloudSqlite.CloudCaches.getCache({ cacheName: this.cloudCacheName, cacheDir, cacheSize: \"50G\" });\r\n }\r\n return this._cloudCache;\r\n }\r\n\r\n /** Member names differ slightly between the V2Checkpoint api and the CloudSqlite api. Add aliases `accessName` for `accountName` and `accessToken` for `sasToken` */\r\n private static toCloudContainerProps(from: V2CheckpointAccessProps): CloudSqlite.ContainerAccessProps {\r\n return { ...from, baseUri: `https://${from.accountName}.blob.core.windows.net`, accessToken: from.sasToken, storageType: \"azure\" };\r\n }\r\n\r\n private static getContainer(v2Props: V2CheckpointAccessProps, checkpoint: CheckpointProps) {\r\n let container = this.containers.get(v2Props.containerId);\r\n if (undefined === container) {\r\n let tokenFn: ((args: CloudSqlite.RequestTokenArgs) => Promise<AccessToken>) | undefined;\r\n let tokenRefreshSeconds: number | undefined = -1;\r\n // from Rpc, the accessToken in the checkpoint request is from the current user. It is used to request the sasToken for the container and\r\n // the sasToken is checked for refresh (before it expires) on every Rpc request using that user's accessToken. For Ipc, the\r\n // accessToken in the checkpoint request is undefined, and the sasToken is requested by IModelHost.getAccessToken(). It is refreshed on a timer.\r\n if (undefined === checkpoint.accessToken) {\r\n tokenFn = async () => (await IModelHost.hubAccess.queryV2Checkpoint(checkpoint))?.sasToken ?? \"\";\r\n tokenRefreshSeconds = undefined;\r\n }\r\n container = CloudSqlite.createCloudContainer({ ...this.toCloudContainerProps(v2Props), tokenRefreshSeconds, logId: process.env.POD_NAME, tokenFn });\r\n this.containers.set(v2Props.containerId, container);\r\n }\r\n return container;\r\n }\r\n\r\n public static async attach(checkpoint: CheckpointProps): Promise<{ dbName: string, container: CloudSqlite.CloudContainer }> {\r\n let v2props: V2CheckpointAccessProps | undefined;\r\n try {\r\n v2props = await IModelHost.hubAccess.queryV2Checkpoint(checkpoint);\r\n if (!v2props)\r\n throw new Error(\"no checkpoint\");\r\n } catch (err: any) {\r\n throw new IModelError(IModelStatus.NotFound, `V2 checkpoint not found: err: ${err.message}`);\r\n }\r\n\r\n try {\r\n const container = this.getContainer(v2props, checkpoint);\r\n const dbName = v2props.dbName;\r\n if (!container.isConnected)\r\n container.connect(this.cloudCache);\r\n container.checkForChanges();\r\n const dbStats = container.queryDatabase(dbName);\r\n if (IModelHost.appWorkspace.settings.getBoolean(\"Checkpoints/prefetch\", false)) {\r\n const getPrefetchConfig = (name: string, defaultVal: number) => IModelHost.appWorkspace.settings.getNumber(`Checkpoints/prefetch/${name}`, defaultVal);\r\n const minRequests = getPrefetchConfig(\"minRequests\", 3);\r\n const maxRequests = getPrefetchConfig(\"maxRequests\", 6);\r\n const timeout = getPrefetchConfig(\"timeout\", 100);\r\n const maxBlocks = getPrefetchConfig(\"maxBlocks\", 500); // default size of 2GB. Assumes a checkpoint block size of 4MB.\r\n if (dbStats?.totalBlocks !== undefined && dbStats.totalBlocks <= maxBlocks && dbStats.nPrefetch === 0) {\r\n const logPrefetch = async (prefetch: CloudSqlite.CloudPrefetch) => {\r\n const stopwatch = new StopWatch(`[${container.containerId}/${dbName}]`, true);\r\n Logger.logInfo(loggerCategory, `Starting prefetch of ${stopwatch.description}`, { minRequests, maxRequests, timeout });\r\n const done = await prefetch.promise;\r\n Logger.logInfo(loggerCategory, `Prefetch of ${stopwatch.description} complete=${done} (${stopwatch.elapsedSeconds} seconds)`, { minRequests, maxRequests, timeout });\r\n };\r\n // eslint-disable-next-line @typescript-eslint/no-floating-promises\r\n logPrefetch(CloudSqlite.startCloudPrefetch(container, dbName, { minRequests, nRequests: maxRequests, timeout }));\r\n } else {\r\n Logger.logInfo(loggerCategory, `Skipping prefetch due to size limits or ongoing prefetch.`, { maxBlocks, numPrefetches: dbStats?.nPrefetch, totalBlocksInDb: dbStats?.totalBlocks, v2props });\r\n }\r\n }\r\n return { dbName, container };\r\n } catch (e: any) {\r\n const error = `Cloud cache connect failed: ${e.message}`;\r\n if (checkpoint.expectV2)\r\n Logger.logError(loggerCategory, error);\r\n\r\n throw new IModelError(e.errorNumber, error);\r\n }\r\n }\r\n\r\n private static async performDownload(job: DownloadJob): Promise<ChangesetId> {\r\n const request = job.request;\r\n const v2props: V2CheckpointAccessProps | undefined = await IModelHost.hubAccess.queryV2Checkpoint({ ...request.checkpoint, allowPreceding: true });\r\n if (!v2props)\r\n throw new IModelError(IModelStatus.NotFound, \"V2 checkpoint not found\");\r\n\r\n CheckpointManager.onDownloadV2.raiseEvent(job);\r\n const container = CloudSqlite.createCloudContainer(this.toCloudContainerProps(v2props));\r\n await CloudSqlite.transferDb(\"download\", container, { dbName: v2props.dbName, localFileName: request.localFile, onProgress: request.onProgress });\r\n return request.checkpoint.changeset.id;\r\n }\r\n\r\n /** Fully download a V2 checkpoint to a local file that can be used to create a briefcase or to work offline.\r\n * @returns a Promise that is resolved when the download completes with the changesetId of the downloaded checkpoint (which will\r\n * be the same as the requested changesetId or the most recent checkpoint before it.)\r\n */\r\n public static async downloadCheckpoint(request: DownloadRequest): Promise<ChangesetId> {\r\n return Downloads.download(request, async (job: DownloadJob) => this.performDownload(job));\r\n }\r\n}\r\n\r\n/** Utility class to deal with downloading V1 checkpoints from iModelHub.\r\n * @internal\r\n */\r\nexport class V1CheckpointManager {\r\n public static getFolder(iModelId: GuidString): LocalDirName {\r\n return path.join(BriefcaseManager.getIModelPath(iModelId), \"checkpoints\");\r\n }\r\n\r\n public static getFileName(checkpoint: CheckpointProps): LocalFileName {\r\n const changesetId = checkpoint.changeset.id || \"first\";\r\n return path.join(this.getFolder(checkpoint.iModelId), `${changesetId}.bim`);\r\n }\r\n\r\n public static async getCheckpointDb(request: DownloadRequest): Promise<SnapshotDb> {\r\n const db = SnapshotDb.tryFindByKey(CheckpointManager.getKey(request.checkpoint));\r\n return (undefined !== db) ? db : Downloads.download(request, async (job: DownloadJob) => this.downloadAndOpen(job));\r\n }\r\n\r\n /** Download a V1 checkpoint */\r\n public static async downloadCheckpoint(request: DownloadRequest): Promise<ChangesetId> {\r\n return Downloads.download(request, async (job: DownloadJob) => this.performDownload(job));\r\n }\r\n\r\n public static openCheckpointV1(fileName: LocalFileName, checkpoint: CheckpointProps) {\r\n const snapshot = SnapshotDb.openFile(fileName, { key: CheckpointManager.getKey(checkpoint) });\r\n (snapshot as any)._iTwinId = checkpoint.iTwinId;\r\n return snapshot;\r\n }\r\n\r\n private static async downloadAndOpen(job: DownloadJob) {\r\n const db = CheckpointManager.tryOpenLocalFile(job.request);\r\n if (db)\r\n return db;\r\n await this.performDownload(job);\r\n await CheckpointManager.updateToRequestedVersion(job.request);\r\n return this.openCheckpointV1(job.request.localFile, job.request.checkpoint);\r\n }\r\n\r\n private static async performDownload(job: DownloadJob): Promise<ChangesetId> {\r\n CheckpointManager.onDownloadV1.raiseEvent(job);\r\n // eslint-disable-next-line deprecation/deprecation\r\n return (await IModelHost.hubAccess.downloadV1Checkpoint(job.request)).id;\r\n }\r\n}\r\n\r\n/** @internal */\r\nexport class CheckpointManager {\r\n public static readonly onDownloadV1 = new BeEvent<(job: DownloadJob) => void>();\r\n public static readonly onDownloadV2 = new BeEvent<(job: DownloadJob) => void>();\r\n public static getKey(checkpoint: CheckpointProps) { return `${checkpoint.iModelId}:${checkpoint.changeset.id}`; }\r\n\r\n private static async doDownload(request: DownloadRequest): Promise<ChangesetId> {\r\n try {\r\n // first see if there's a V2 checkpoint available.\r\n const stopwatch = new StopWatch(`[${request.checkpoint.changeset.id}]`, true);\r\n Logger.logInfo(loggerCategory, `Starting download of V2 checkpoint with id ${stopwatch.description}`);\r\n const changesetId = await V2CheckpointManager.downloadCheckpoint(request);\r\n Logger.logInfo(loggerCategory, `Downloaded V2 checkpoint with id ${stopwatch.description} (${stopwatch.elapsedSeconds} seconds)`);\r\n if (changesetId !== request.checkpoint.changeset.id)\r\n Logger.logInfo(loggerCategory, `Downloaded previous v2 checkpoint because requested checkpoint not found.`, { requestedChangesetId: request.checkpoint.changeset.id, iModelId: request.checkpoint.iModelId, changesetId, iTwinId: request.checkpoint.iTwinId });\r\n else\r\n Logger.logInfo(loggerCategory, `Downloaded v2 checkpoint.`, { iModelId: request.checkpoint.iModelId, changesetId: request.checkpoint.changeset.id, iTwinId: request.checkpoint.iTwinId });\r\n return changesetId;\r\n } catch (error: any) {\r\n if (error.errorNumber === IModelStatus.NotFound) { // No V2 checkpoint available, try a v1 checkpoint\r\n const changeset = await V1CheckpointManager.downloadCheckpoint(request);\r\n Logger.logWarning(loggerCategory, `Got an error downloading v2 checkpoint, but downloaded v1 checkpoint successfully!`, { error, iModelId: request.checkpoint.iModelId, iTwinId: request.checkpoint.iTwinId, requestedChangesetId: request.checkpoint.changeset.id, changesetId: changeset });\r\n return changeset;\r\n }\r\n throw error; // most likely, was aborted\r\n }\r\n }\r\n\r\n public static async updateToRequestedVersion(request: DownloadRequest) {\r\n const checkpoint = request.checkpoint;\r\n const targetFile = request.localFile;\r\n const traceInfo = { iTwinId: checkpoint.iTwinId, iModelId: checkpoint.iModelId, changeset: checkpoint.changeset };\r\n try {\r\n // Open checkpoint for write\r\n const prevLogLevel = Logger.getLevel(NativeLoggerCategory.SQLite) ?? LogLevel.Error; // Get log level before we set it to None.\r\n Logger.setLevel(NativeLoggerCategory.SQLite, LogLevel.None); // Ignores noisy error messages when applying changesets.\r\n const db = SnapshotDb.openForApplyChangesets(targetFile);\r\n const nativeDb = db.nativeDb;\r\n try {\r\n\r\n if (nativeDb.hasPendingTxns()) {\r\n Logger.logWarning(loggerCategory, \"Checkpoint with Txns found - deleting them\", () => traceInfo);\r\n nativeDb.deleteAllTxns();\r\n }\r\n\r\n if (nativeDb.getBriefcaseId() !== BriefcaseIdValue.Unassigned)\r\n nativeDb.resetBriefcaseId(BriefcaseIdValue.Unassigned);\r\n\r\n CheckpointManager.validateCheckpointGuids(checkpoint, db);\r\n // Apply change sets if necessary\r\n const currentChangeset: Mutable<ChangesetIndexAndId> = nativeDb.getCurrentChangeset();\r\n if (currentChangeset.id !== checkpoint.changeset.id) {\r\n const accessToken = checkpoint.accessToken;\r\n const toIndex = checkpoint.changeset.index ??\r\n (await IModelHost.hubAccess.getChangesetFromVersion({ accessToken, iModelId: checkpoint.iModelId, version: IModelVersion.asOfChangeSet(checkpoint.changeset.id) })).index;\r\n await BriefcaseManager.pullAndApplyChangesets(db, { accessToken, toIndex });\r\n } else {\r\n // make sure the parent changeset index is saved in the file - old versions didn't have it.\r\n currentChangeset.index = checkpoint.changeset.index!; // eslint-disable-line @typescript-eslint/no-non-null-assertion\r\n nativeDb.saveLocalValue(\"parentChangeSet\", JSON.stringify(currentChangeset));\r\n }\r\n } finally {\r\n Logger.setLevel(NativeLoggerCategory.SQLite, prevLogLevel); // Set logging to what it was before we started applying changesets.\r\n db.saveChanges();\r\n db.close();\r\n }\r\n } catch (error: any) {\r\n\r\n Logger.logError(loggerCategory, \"Error downloading checkpoint - deleting it\", () => traceInfo);\r\n IModelJsFs.removeSync(targetFile);\r\n\r\n if (error.errorNumber === ChangeSetStatus.CorruptedChangeStream || error.errorNumber === ChangeSetStatus.InvalidId || error.errorNumber === ChangeSetStatus.InvalidVersion) {\r\n Logger.logError(loggerCategory, \"Detected potential corruption of change sets. Deleting them to enable retries\", () => traceInfo);\r\n BriefcaseManager.deleteChangeSetsFromLocalDisk(checkpoint.iModelId);\r\n }\r\n throw error;\r\n }\r\n }\r\n\r\n /** Download a checkpoint file from iModelHub into a local file specified in the request parameters. */\r\n public static async downloadCheckpoint(request: DownloadRequest): Promise<void> {\r\n if (this.verifyCheckpoint(request.checkpoint, request.localFile))\r\n return;\r\n\r\n if (request.aliasFiles) {\r\n for (const alias of request.aliasFiles) {\r\n if (this.verifyCheckpoint(request.checkpoint, alias)) {\r\n request.localFile = alias;\r\n return;\r\n }\r\n }\r\n }\r\n\r\n await this.doDownload(request);\r\n return this.updateToRequestedVersion(request);\r\n }\r\n\r\n /** checks a file's dbGuid & iTwinId for consistency, and updates the dbGuid when possible */\r\n public static validateCheckpointGuids(checkpoint: CheckpointProps, snapshotDb: SnapshotDb) {\r\n const traceInfo = { iTwinId: checkpoint.iTwinId, iModelId: checkpoint.iModelId };\r\n\r\n const nativeDb = snapshotDb.nativeDb;\r\n const dbChangeset = nativeDb.getCurrentChangeset();\r\n const iModelId = Guid.normalize(nativeDb.getIModelId());\r\n if (iModelId !== Guid.normalize(checkpoint.iModelId)) {\r\n if (nativeDb.isReadonly())\r\n throw new IModelError(IModelStatus.ValidationFailed, \"iModelId is not properly set up in the checkpoint\");\r\n\r\n Logger.logWarning(loggerCategory, \"iModelId is not properly set up in the checkpoint. Updated checkpoint to the correct iModelId.\", () => ({ ...traceInfo, dbGuid: iModelId }));\r\n const iModelIdNormalized = Guid.normalize(checkpoint.iModelId);\r\n nativeDb.setIModelId(iModelIdNormalized);\r\n (snapshotDb as any)._iModelId = iModelIdNormalized;\r\n // Required to reset the ChangeSetId because setDbGuid clears the value.\r\n nativeDb.saveLocalValue(\"ParentChangeSetId\", dbChangeset.id);\r\n if (undefined !== dbChangeset.index)\r\n nativeDb.saveLocalValue(\"parentChangeSet\", JSON.stringify(dbChangeset));\r\n }\r\n\r\n const iTwinId = Guid.normalize(nativeDb.getITwinId());\r\n if (iTwinId !== Guid.normalize(checkpoint.iTwinId))\r\n throw new IModelError(IModelStatus.ValidationFailed, \"iTwinId was not properly set up in the checkpoint\");\r\n }\r\n\r\n /** @returns true if the file is the checkpoint requested */\r\n public static verifyCheckpoint(checkpoint: CheckpointProps, fileName: LocalFileName): boolean {\r\n if (!IModelJsFs.existsSync(fileName))\r\n return false;\r\n\r\n const nativeDb = new IModelHost.platform.DgnDb();\r\n try {\r\n nativeDb.openIModel(fileName, OpenMode.Readonly);\r\n } catch (error) {\r\n return false;\r\n }\r\n\r\n const isValid = checkpoint.iModelId === nativeDb.getIModelId() && checkpoint.changeset.id === nativeDb.getCurrentChangeset().id;\r\n nativeDb.closeFile();\r\n if (!isValid)\r\n IModelJsFs.removeSync(fileName);\r\n\r\n return isValid;\r\n }\r\n\r\n /** try to open an existing local file to satisfy a download request */\r\n public static tryOpenLocalFile(request: DownloadRequest): SnapshotDb | undefined {\r\n const checkpoint = request.checkpoint;\r\n if (this.verifyCheckpoint(checkpoint, request.localFile))\r\n return V1CheckpointManager.openCheckpointV1(request.localFile, checkpoint);\r\n\r\n // check a list of aliases for finding checkpoints downloaded to non-default locations (e.g. from older versions)\r\n if (request.aliasFiles) {\r\n for (const alias of request.aliasFiles) {\r\n if (this.verifyCheckpoint(checkpoint, alias)) {\r\n request.localFile = alias;\r\n return V1CheckpointManager.openCheckpointV1(alias, checkpoint);\r\n }\r\n }\r\n }\r\n return undefined;\r\n }\r\n\r\n public static async toCheckpointProps(args: OpenCheckpointArgs): Promise<CheckpointProps> {\r\n const changeset = args.changeset ?? await IModelHost.hubAccess.getLatestChangeset({ ...args, accessToken: await IModelHost.getAccessToken() });\r\n\r\n return {\r\n iModelId: args.iModelId,\r\n iTwinId: args.iTwinId,\r\n changeset: {\r\n index: changeset.index,\r\n id: changeset.id ?? (await IModelHost.hubAccess.queryChangeset({ ...args, changeset, accessToken: await IModelHost.getAccessToken() })).id,\r\n },\r\n };\r\n }\r\n}\r\n"]}
|
package/lib/cjs/CloudSqlite.d.ts
CHANGED
|
@@ -10,11 +10,12 @@ import type { SQLiteDb, VersionedSqliteDb } from "./SQLiteDb";
|
|
|
10
10
|
* @beta
|
|
11
11
|
*/
|
|
12
12
|
export declare namespace CloudSqlite {
|
|
13
|
+
export type RequestTokenArgs = Optional<BlobContainer.RequestTokenProps, "userToken">;
|
|
13
14
|
/**
|
|
14
15
|
* Request a new AccessToken for a cloud container using the [[BlobContainer]] service.
|
|
15
16
|
* If the service is unavailable or returns an error, an empty token is returned.
|
|
16
17
|
*/
|
|
17
|
-
export function requestToken(args:
|
|
18
|
+
export function requestToken(args: RequestTokenArgs): Promise<AccessToken>;
|
|
18
19
|
/**
|
|
19
20
|
* Create a new CloudContainer from a ContainerAccessProps. For non-public containers, a valid accessToken must be provided before the container
|
|
20
21
|
* can be used (e.g. via [[CloudSqlite.requestToken]]).
|
|
@@ -23,6 +24,7 @@ export declare namespace CloudSqlite {
|
|
|
23
24
|
*/
|
|
24
25
|
export function createCloudContainer(args: ContainerAccessProps & {
|
|
25
26
|
accessLevel?: BlobContainer.RequestAccessLevel;
|
|
27
|
+
tokenFn?: (args: RequestTokenArgs) => Promise<AccessToken>;
|
|
26
28
|
}): CloudContainer;
|
|
27
29
|
/** Begin prefetching all blocks for a database in a CloudContainer in the background. */
|
|
28
30
|
export function startCloudPrefetch(container: CloudContainer, dbName: string, args?: PrefetchProps): CloudPrefetch;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"CloudSqlite.d.ts","sourceRoot":"","sources":["../../src/CloudSqlite.ts"],"names":[],"mappings":"AAIA;;GAEG;AAKH,OAAO,EACL,WAAW,EAA+B,WAAW,EAAE,UAAU,EAAU,QAAQ,EAAE,QAAQ,EAAE,gBAAgB,EAAE,WAAW,EAC7H,MAAM,qBAAqB,CAAC;AAC7B,OAAO,EAAE,YAAY,EAAE,aAAa,EAAE,MAAM,oBAAoB,CAAC;AACjE,OAAO,EAAE,aAAa,EAAE,MAAM,wBAAwB,CAAC;AAKvD,OAAO,KAAK,EAAE,QAAQ,EAAE,iBAAiB,EAAE,MAAM,YAAY,CAAC;AAI9D;;;GAGG;AACH,yBAAiB,WAAW,CAAC;IAK3B
|
|
1
|
+
{"version":3,"file":"CloudSqlite.d.ts","sourceRoot":"","sources":["../../src/CloudSqlite.ts"],"names":[],"mappings":"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"}
|
package/lib/cjs/CloudSqlite.js
CHANGED
|
@@ -16,7 +16,7 @@ const BlobContainerService_1 = require("./BlobContainerService");
|
|
|
16
16
|
const IModelHost_1 = require("./IModelHost");
|
|
17
17
|
const IModelJsFs_1 = require("./IModelJsFs");
|
|
18
18
|
const tracing_1 = require("./rpc/tracing");
|
|
19
|
-
// spell:ignore logmsg httpcode
|
|
19
|
+
// spell:ignore logmsg httpcode daemonless cachefile cacheslots ddthh
|
|
20
20
|
/**
|
|
21
21
|
* Types for accessing SQLite databases stored in cloud containers.
|
|
22
22
|
* @beta
|
|
@@ -53,7 +53,7 @@ var CloudSqlite;
|
|
|
53
53
|
let newToken;
|
|
54
54
|
const url = `[${tokenProps.baseUri}/${tokenProps.containerId}]`;
|
|
55
55
|
try {
|
|
56
|
-
newToken = await CloudSqlite.requestToken(tokenProps);
|
|
56
|
+
newToken = await (args.tokenFn ?? CloudSqlite.requestToken)(tokenProps);
|
|
57
57
|
logInfo(`Refreshed token for container ${url}`);
|
|
58
58
|
}
|
|
59
59
|
catch (err) {
|