@itwin/core-backend 3.4.0-dev.57 → 3.4.0-dev.58

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (224) hide show
  1. package/lib/cjs/AliCloudStorageService.d.ts +23 -23
  2. package/lib/cjs/AliCloudStorageService.js +71 -71
  3. package/lib/cjs/AliCloudStorageService.js.map +1 -1
  4. package/lib/cjs/BackendHubAccess.d.ts +224 -224
  5. package/lib/cjs/BackendHubAccess.js +41 -41
  6. package/lib/cjs/BackendHubAccess.js.map +1 -1
  7. package/lib/cjs/BackendLoggerCategory.d.ts +91 -91
  8. package/lib/cjs/BackendLoggerCategory.js +99 -99
  9. package/lib/cjs/BackendLoggerCategory.js.map +1 -1
  10. package/lib/cjs/BisCoreSchema.d.ts +21 -21
  11. package/lib/cjs/BisCoreSchema.js +60 -60
  12. package/lib/cjs/BisCoreSchema.js.map +1 -1
  13. package/lib/cjs/BriefcaseManager.d.ts +165 -165
  14. package/lib/cjs/BriefcaseManager.js +405 -405
  15. package/lib/cjs/BriefcaseManager.js.map +1 -1
  16. package/lib/cjs/Category.d.ts +153 -153
  17. package/lib/cjs/Category.js +243 -243
  18. package/lib/cjs/Category.js.map +1 -1
  19. package/lib/cjs/ChangeSummaryManager.d.ts +187 -187
  20. package/lib/cjs/ChangeSummaryManager.js +445 -445
  21. package/lib/cjs/ChangeSummaryManager.js.map +1 -1
  22. package/lib/cjs/ChangedElementsDb.d.ts +99 -99
  23. package/lib/cjs/ChangedElementsDb.js +165 -165
  24. package/lib/cjs/ChangedElementsDb.js.map +1 -1
  25. package/lib/cjs/ChangedElementsManager.d.ts +39 -39
  26. package/lib/cjs/ChangedElementsManager.js +88 -88
  27. package/lib/cjs/ChangedElementsManager.js.map +1 -1
  28. package/lib/cjs/CheckpointManager.d.ts +120 -120
  29. package/lib/cjs/CheckpointManager.js +343 -343
  30. package/lib/cjs/CheckpointManager.js.map +1 -1
  31. package/lib/cjs/ClassRegistry.d.ts +71 -71
  32. package/lib/cjs/ClassRegistry.js +215 -215
  33. package/lib/cjs/ClassRegistry.js.map +1 -1
  34. package/lib/cjs/CloudSqlite.d.ts +349 -349
  35. package/lib/cjs/CloudSqlite.js +151 -151
  36. package/lib/cjs/CloudSqlite.js.map +1 -1
  37. package/lib/cjs/CloudStorageBackend.d.ts +58 -58
  38. package/lib/cjs/CloudStorageBackend.js +173 -173
  39. package/lib/cjs/CloudStorageBackend.js.map +1 -1
  40. package/lib/cjs/CodeService.d.ts +396 -396
  41. package/lib/cjs/CodeService.js +63 -63
  42. package/lib/cjs/CodeService.js.map +1 -1
  43. package/lib/cjs/CodeSpecs.d.ts +50 -50
  44. package/lib/cjs/CodeSpecs.js +112 -112
  45. package/lib/cjs/CodeSpecs.js.map +1 -1
  46. package/lib/cjs/ConcurrentQuery.d.ts +11 -11
  47. package/lib/cjs/ConcurrentQuery.js +30 -30
  48. package/lib/cjs/ConcurrentQuery.js.map +1 -1
  49. package/lib/cjs/CustomViewState3dCreator.d.ts +32 -32
  50. package/lib/cjs/CustomViewState3dCreator.js +113 -113
  51. package/lib/cjs/CustomViewState3dCreator.js.map +1 -1
  52. package/lib/cjs/DevTools.d.ts +71 -71
  53. package/lib/cjs/DevTools.js +154 -154
  54. package/lib/cjs/DevTools.js.map +1 -1
  55. package/lib/cjs/DisplayStyle.d.ts +106 -106
  56. package/lib/cjs/DisplayStyle.js +256 -256
  57. package/lib/cjs/DisplayStyle.js.map +1 -1
  58. package/lib/cjs/ECDb.d.ts +191 -191
  59. package/lib/cjs/ECDb.js +350 -350
  60. package/lib/cjs/ECDb.js.map +1 -1
  61. package/lib/cjs/ECSchemaXmlContext.d.ts +18 -18
  62. package/lib/cjs/ECSchemaXmlContext.js +41 -41
  63. package/lib/cjs/ECSchemaXmlContext.js.map +1 -1
  64. package/lib/cjs/ECSqlStatement.d.ts +466 -466
  65. package/lib/cjs/ECSqlStatement.js +791 -791
  66. package/lib/cjs/ECSqlStatement.js.map +1 -1
  67. package/lib/cjs/Element.d.ts +1109 -1109
  68. package/lib/cjs/Element.js +1420 -1420
  69. package/lib/cjs/Element.js.map +1 -1
  70. package/lib/cjs/ElementAspect.d.ts +156 -156
  71. package/lib/cjs/ElementAspect.js +178 -178
  72. package/lib/cjs/ElementAspect.js.map +1 -1
  73. package/lib/cjs/ElementGraphics.d.ts +9 -9
  74. package/lib/cjs/ElementGraphics.js +41 -41
  75. package/lib/cjs/ElementGraphics.js.map +1 -1
  76. package/lib/cjs/ElementTreeWalker.d.ts +162 -162
  77. package/lib/cjs/ElementTreeWalker.js +409 -409
  78. package/lib/cjs/ElementTreeWalker.js.map +1 -1
  79. package/lib/cjs/Entity.d.ts +76 -76
  80. package/lib/cjs/Entity.js +82 -82
  81. package/lib/cjs/Entity.js.map +1 -1
  82. package/lib/cjs/ExportGraphics.d.ts +317 -317
  83. package/lib/cjs/ExportGraphics.js +208 -208
  84. package/lib/cjs/ExportGraphics.js.map +1 -1
  85. package/lib/cjs/ExternalSource.d.ts +94 -94
  86. package/lib/cjs/ExternalSource.js +125 -125
  87. package/lib/cjs/ExternalSource.js.map +1 -1
  88. package/lib/cjs/GeoCoordConfig.d.ts +19 -19
  89. package/lib/cjs/GeoCoordConfig.js +82 -82
  90. package/lib/cjs/GeoCoordConfig.js.map +1 -1
  91. package/lib/cjs/GeometrySummary.d.ts +4 -4
  92. package/lib/cjs/GeometrySummary.js +380 -380
  93. package/lib/cjs/GeometrySummary.js.map +1 -1
  94. package/lib/cjs/HubMock.d.ts +93 -93
  95. package/lib/cjs/HubMock.js +190 -190
  96. package/lib/cjs/HubMock.js.map +1 -1
  97. package/lib/cjs/IModelCloneContext.d.ts +85 -85
  98. package/lib/cjs/IModelCloneContext.js +150 -150
  99. package/lib/cjs/IModelCloneContext.js.map +1 -1
  100. package/lib/cjs/IModelDb.d.ts +1164 -1164
  101. package/lib/cjs/IModelDb.js +2324 -2324
  102. package/lib/cjs/IModelDb.js.map +1 -1
  103. package/lib/cjs/IModelHost.d.ts +361 -361
  104. package/lib/cjs/IModelHost.js +489 -489
  105. package/lib/cjs/IModelHost.js.map +1 -1
  106. package/lib/cjs/IModelJsFs.d.ts +62 -62
  107. package/lib/cjs/IModelJsFs.d.ts.map +1 -1
  108. package/lib/cjs/IModelJsFs.js +140 -140
  109. package/lib/cjs/IModelJsFs.js.map +1 -1
  110. package/lib/cjs/IpcHost.d.ts +98 -98
  111. package/lib/cjs/IpcHost.js +234 -234
  112. package/lib/cjs/IpcHost.js.map +1 -1
  113. package/lib/cjs/LineStyle.d.ts +311 -311
  114. package/lib/cjs/LineStyle.js +295 -295
  115. package/lib/cjs/LineStyle.js.map +1 -1
  116. package/lib/cjs/LocalHub.d.ts +162 -162
  117. package/lib/cjs/LocalHub.js +587 -587
  118. package/lib/cjs/LocalHub.js.map +1 -1
  119. package/lib/cjs/LocalhostIpcHost.d.ts +20 -20
  120. package/lib/cjs/LocalhostIpcHost.js +81 -81
  121. package/lib/cjs/LocalhostIpcHost.js.map +1 -1
  122. package/lib/cjs/Material.d.ts +103 -103
  123. package/lib/cjs/Material.js +147 -147
  124. package/lib/cjs/Material.js.map +1 -1
  125. package/lib/cjs/Model.d.ts +386 -386
  126. package/lib/cjs/Model.js +471 -471
  127. package/lib/cjs/Model.js.map +1 -1
  128. package/lib/cjs/NativeAppStorage.d.ts +51 -51
  129. package/lib/cjs/NativeAppStorage.js +202 -202
  130. package/lib/cjs/NativeAppStorage.js.map +1 -1
  131. package/lib/cjs/NativeHost.d.ts +52 -52
  132. package/lib/cjs/NativeHost.js +168 -168
  133. package/lib/cjs/NativeHost.js.map +1 -1
  134. package/lib/cjs/NavigationRelationship.d.ts +156 -156
  135. package/lib/cjs/NavigationRelationship.js +225 -225
  136. package/lib/cjs/NavigationRelationship.js.map +1 -1
  137. package/lib/cjs/PromiseMemoizer.d.ts +51 -51
  138. package/lib/cjs/PromiseMemoizer.js +101 -101
  139. package/lib/cjs/PromiseMemoizer.js.map +1 -1
  140. package/lib/cjs/PropertyStore.d.ts +132 -132
  141. package/lib/cjs/PropertyStore.js +11 -11
  142. package/lib/cjs/PropertyStore.js.map +1 -1
  143. package/lib/cjs/Relationship.d.ts +400 -400
  144. package/lib/cjs/Relationship.js +465 -465
  145. package/lib/cjs/Relationship.js.map +1 -1
  146. package/lib/cjs/RpcBackend.d.ts +28 -28
  147. package/lib/cjs/RpcBackend.js +126 -126
  148. package/lib/cjs/RpcBackend.js.map +1 -1
  149. package/lib/cjs/SQLiteDb.d.ts +219 -219
  150. package/lib/cjs/SQLiteDb.js +214 -214
  151. package/lib/cjs/SQLiteDb.js.map +1 -1
  152. package/lib/cjs/Schema.d.ts +55 -55
  153. package/lib/cjs/Schema.js +83 -83
  154. package/lib/cjs/Schema.js.map +1 -1
  155. package/lib/cjs/ServerBasedLocks.d.ts +57 -57
  156. package/lib/cjs/ServerBasedLocks.js +168 -168
  157. package/lib/cjs/ServerBasedLocks.js.map +1 -1
  158. package/lib/cjs/SqliteStatement.d.ts +283 -283
  159. package/lib/cjs/SqliteStatement.js +448 -448
  160. package/lib/cjs/SqliteStatement.js.map +1 -1
  161. package/lib/cjs/Texture.d.ts +58 -58
  162. package/lib/cjs/Texture.js +82 -82
  163. package/lib/cjs/Texture.js.map +1 -1
  164. package/lib/cjs/TileStorage.d.ts +18 -18
  165. package/lib/cjs/TileStorage.d.ts.map +1 -1
  166. package/lib/cjs/TileStorage.js +90 -90
  167. package/lib/cjs/TileStorage.js.map +1 -1
  168. package/lib/cjs/TxnManager.d.ts +202 -202
  169. package/lib/cjs/TxnManager.js +356 -356
  170. package/lib/cjs/TxnManager.js.map +1 -1
  171. package/lib/cjs/ViewDefinition.d.ts +435 -435
  172. package/lib/cjs/ViewDefinition.js +635 -635
  173. package/lib/cjs/ViewDefinition.js.map +1 -1
  174. package/lib/cjs/ViewStateHydrator.d.ts +13 -13
  175. package/lib/cjs/ViewStateHydrator.js +103 -103
  176. package/lib/cjs/ViewStateHydrator.js.map +1 -1
  177. package/lib/cjs/assets/IModelChange.02.00.00.ecschema.xml +90 -90
  178. package/lib/cjs/assets/Settings/Schemas/Cloud.Schema.json +67 -67
  179. package/lib/cjs/assets/Settings/Schemas/Gcs.schema.json +31 -31
  180. package/lib/cjs/assets/Settings/Schemas/Workspace.Schema.json +52 -52
  181. package/lib/cjs/assets/Settings/backend.setting.json5 +138 -138
  182. package/lib/cjs/core-backend.d.ts +182 -182
  183. package/lib/cjs/core-backend.js +202 -202
  184. package/lib/cjs/core-backend.js.map +1 -1
  185. package/lib/cjs/domains/FunctionalElements.d.ts +101 -101
  186. package/lib/cjs/domains/FunctionalElements.js +145 -145
  187. package/lib/cjs/domains/FunctionalElements.js.map +1 -1
  188. package/lib/cjs/domains/FunctionalSchema.d.ts +13 -13
  189. package/lib/cjs/domains/FunctionalSchema.js +40 -40
  190. package/lib/cjs/domains/FunctionalSchema.js.map +1 -1
  191. package/lib/cjs/domains/GenericElements.d.ts +177 -177
  192. package/lib/cjs/domains/GenericElements.js +263 -263
  193. package/lib/cjs/domains/GenericElements.js.map +1 -1
  194. package/lib/cjs/domains/GenericSchema.d.ts +10 -10
  195. package/lib/cjs/domains/GenericSchema.js +28 -28
  196. package/lib/cjs/domains/GenericSchema.js.map +1 -1
  197. package/lib/cjs/rpc-impl/DevToolsRpcImpl.d.ts +15 -15
  198. package/lib/cjs/rpc-impl/DevToolsRpcImpl.js +32 -32
  199. package/lib/cjs/rpc-impl/DevToolsRpcImpl.js.map +1 -1
  200. package/lib/cjs/rpc-impl/IModelReadRpcImpl.d.ts +45 -45
  201. package/lib/cjs/rpc-impl/IModelReadRpcImpl.js +262 -262
  202. package/lib/cjs/rpc-impl/IModelReadRpcImpl.js.map +1 -1
  203. package/lib/cjs/rpc-impl/IModelTileRpcImpl.d.ts +22 -22
  204. package/lib/cjs/rpc-impl/IModelTileRpcImpl.js +204 -204
  205. package/lib/cjs/rpc-impl/IModelTileRpcImpl.js.map +1 -1
  206. package/lib/cjs/rpc-impl/RpcBriefcaseUtility.d.ts +36 -36
  207. package/lib/cjs/rpc-impl/RpcBriefcaseUtility.js +168 -168
  208. package/lib/cjs/rpc-impl/RpcBriefcaseUtility.js.map +1 -1
  209. package/lib/cjs/rpc-impl/SnapshotIModelRpcImpl.d.ts +16 -16
  210. package/lib/cjs/rpc-impl/SnapshotIModelRpcImpl.js +43 -43
  211. package/lib/cjs/rpc-impl/SnapshotIModelRpcImpl.js.map +1 -1
  212. package/lib/cjs/rpc-impl/WipRpcImpl.d.ts +15 -15
  213. package/lib/cjs/rpc-impl/WipRpcImpl.js +37 -37
  214. package/lib/cjs/rpc-impl/WipRpcImpl.js.map +1 -1
  215. package/lib/cjs/workspace/Settings.d.ts +186 -186
  216. package/lib/cjs/workspace/Settings.js +155 -155
  217. package/lib/cjs/workspace/Settings.js.map +1 -1
  218. package/lib/cjs/workspace/SettingsSchemas.d.ts +75 -75
  219. package/lib/cjs/workspace/SettingsSchemas.js +191 -191
  220. package/lib/cjs/workspace/SettingsSchemas.js.map +1 -1
  221. package/lib/cjs/workspace/Workspace.d.ts +414 -414
  222. package/lib/cjs/workspace/Workspace.js +543 -543
  223. package/lib/cjs/workspace/Workspace.js.map +1 -1
  224. package/package.json +14 -14
@@ -1,174 +1,174 @@
1
- "use strict";
2
- Object.defineProperty(exports, "__esModule", { value: true });
3
- exports.CloudStorageTileUploader = exports.AzureBlobStorage = exports.CloudStorageService = void 0;
4
- /*---------------------------------------------------------------------------------------------
5
- * Copyright (c) Bentley Systems, Incorporated. All rights reserved.
6
- * See LICENSE.md in the project root for license terms and full copyright notice.
7
- *--------------------------------------------------------------------------------------------*/
8
- const stream_1 = require("stream");
9
- const zlib = require("zlib");
10
- const Azure = require("@azure/storage-blob");
11
- const core_bentley_1 = require("@itwin/core-bentley");
12
- const core_common_1 = require("@itwin/core-common");
13
- const BackendLoggerCategory_1 = require("./BackendLoggerCategory");
14
- const IModelHost_1 = require("./IModelHost");
15
- /**
16
- * @beta
17
- * @deprecated
18
- */
19
- class CloudStorageService {
20
- initialize() { }
21
- terminate() { }
22
- async download(_name) { return undefined; }
23
- makeDescriptor(id) {
24
- return { name: id.name, provider: this.id };
25
- }
26
- }
27
- exports.CloudStorageService = CloudStorageService;
28
- /**
29
- * @beta
30
- * @deprecated
31
- */
32
- class AzureBlobStorage extends CloudStorageService {
33
- constructor(credentials) {
34
- var _a;
35
- super();
36
- this.id = core_common_1.CloudStorageProvider.Azure;
37
- if (!credentials.account || !credentials.accessKey) {
38
- throw new core_common_1.IModelError(core_common_1.BentleyStatus.ERROR, "Invalid credentials for Azure blob storage.");
39
- }
40
- this._baseUrl = (_a = credentials.baseUrl) !== null && _a !== void 0 ? _a : `https://${credentials.account}.blob.core.windows.net`;
41
- this._credential = new Azure.StorageSharedKeyCredential(credentials.account, credentials.accessKey);
42
- const options = {};
43
- const pipeline = Azure.newPipeline(this._credential, options);
44
- this._service = new Azure.BlobServiceClient(this._baseUrl, pipeline);
45
- }
46
- obtainContainerUrl(id, expiry, clientIp) {
47
- const policy = {
48
- containerName: id.name,
49
- permissions: Azure.ContainerSASPermissions.parse("rl"),
50
- expiresOn: expiry,
51
- };
52
- if (clientIp && clientIp !== "localhost" && clientIp !== "127.0.0.1" && clientIp !== "::1") {
53
- policy.ipRange = { start: clientIp };
54
- }
55
- const token = Azure.generateBlobSASQueryParameters(policy, this._credential);
56
- const url = new URL(this._baseUrl);
57
- url.pathname = `${url.pathname.replace(/\/*$/, "")}/${id.name}`;
58
- url.search = token.toString();
59
- const urlObject = {
60
- descriptor: this.makeDescriptor(id),
61
- valid: 0,
62
- expires: expiry.getTime(),
63
- url: url.toString(),
64
- };
65
- return urlObject;
66
- }
67
- async ensureContainer(name) {
68
- try {
69
- const container = this._service.getContainerClient(name);
70
- await container.create();
71
- return;
72
- }
73
- catch (maybeErr) {
74
- try {
75
- const err = maybeErr;
76
- if (err.statusCode === 409 && err.code === "ContainerAlreadyExists") {
77
- return;
78
- }
79
- }
80
- catch { }
81
- if (typeof (maybeErr) !== "undefined" && maybeErr) {
82
- throw maybeErr;
83
- }
84
- throw new core_common_1.IModelError(core_common_1.BentleyStatus.ERROR, `Unable to create container "${name}".`);
85
- }
86
- }
87
- async upload(container, name, data, options, metadata) {
88
- var _a, _b, _c;
89
- try {
90
- await this.ensureContainer(container);
91
- const containerClient = this._service.getContainerClient(container);
92
- const blocks = containerClient.getBlockBlobClient(name);
93
- const blobHTTPHeaders = {
94
- blobContentType: (_a = options === null || options === void 0 ? void 0 : options.type) !== null && _a !== void 0 ? _a : "application/octet-stream",
95
- blobCacheControl: (_b = options === null || options === void 0 ? void 0 : options.cacheControl) !== null && _b !== void 0 ? _b : "private, max-age=31536000, immutable",
96
- };
97
- const blobOptions = metadata ?
98
- {
99
- blobHTTPHeaders,
100
- metadata: { ...metadata },
101
- } : {
102
- blobHTTPHeaders,
103
- };
104
- const dataStream = new stream_1.PassThrough();
105
- dataStream.end(data);
106
- let source;
107
- if (options && options.contentEncoding === "gzip") {
108
- if (undefined === blobOptions.blobHTTPHeaders)
109
- throw new core_common_1.IModelError(core_common_1.BentleyStatus.ERROR, "Blob HTTP headers object is undefined.");
110
- blobOptions.blobHTTPHeaders.blobContentEncoding = options.contentEncoding;
111
- const compressor = zlib.createGzip();
112
- source = dataStream.pipe(compressor);
113
- }
114
- else {
115
- source = dataStream;
116
- }
117
- const blockSize = 100 * 1024 * 1024;
118
- const concurrency = 1;
119
- const result = await blocks.uploadStream(source, blockSize, concurrency, blobOptions);
120
- return (_c = result.etag) !== null && _c !== void 0 ? _c : "";
121
- }
122
- catch (maybeErr) {
123
- if (typeof (maybeErr) !== "undefined" && maybeErr) {
124
- throw maybeErr;
125
- }
126
- throw new core_common_1.IModelError(core_common_1.BentleyStatus.ERROR, `Unable to upload "${name}".`);
127
- }
128
- }
129
- }
130
- exports.AzureBlobStorage = AzureBlobStorage;
131
- /**
132
- * @beta
133
- * @deprecated
134
- */
135
- class CloudStorageTileUploader {
136
- constructor() {
137
- this._activeUploads = new Map();
138
- }
139
- get activeUploads() {
140
- return this._activeUploads.values();
141
- }
142
- async uploadToCache(id, content, containerKey, resourceKey, metadata) {
143
- var _a;
144
- await new Promise((resolve) => setTimeout(resolve));
145
- try {
146
- const options = {};
147
- if (IModelHost_1.IModelHost.compressCachedTiles) {
148
- options.contentEncoding = "gzip";
149
- }
150
- const perfInfo = { ...id.tokenProps, treeId: id.treeId, contentId: id.contentId, size: content.byteLength, compress: IModelHost_1.IModelHost.compressCachedTiles };
151
- const perfLogger = new core_bentley_1.PerfLogger("Uploading tile to external tile cache", () => perfInfo);
152
- await ((_a = IModelHost_1.IModelHost.tileCacheService) === null || _a === void 0 ? void 0 : _a.upload(containerKey, resourceKey, content, options, metadata));
153
- perfLogger.dispose();
154
- }
155
- catch (err) {
156
- core_bentley_1.Logger.logError(BackendLoggerCategory_1.BackendLoggerCategory.IModelTileUpload, (err instanceof Error) ? err.toString() : JSON.stringify(err));
157
- }
158
- this._activeUploads.delete(containerKey + resourceKey);
159
- }
160
- async cacheTile(tokenProps, treeId, contentId, content, guid, metadata) {
161
- const id = { tokenProps, treeId, contentId, guid };
162
- const cache = core_common_1.CloudStorageTileCache.getCache();
163
- const containerKey = cache.formContainerName(id);
164
- const resourceKey = cache.formResourceName(id);
165
- const key = containerKey + resourceKey;
166
- if (this._activeUploads.has(key))
167
- return;
168
- const promise = this.uploadToCache(id, content, containerKey, resourceKey, metadata);
169
- this._activeUploads.set(key, promise);
170
- await promise;
171
- }
172
- }
173
- exports.CloudStorageTileUploader = CloudStorageTileUploader;
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.CloudStorageTileUploader = exports.AzureBlobStorage = exports.CloudStorageService = void 0;
4
+ /*---------------------------------------------------------------------------------------------
5
+ * Copyright (c) Bentley Systems, Incorporated. All rights reserved.
6
+ * See LICENSE.md in the project root for license terms and full copyright notice.
7
+ *--------------------------------------------------------------------------------------------*/
8
+ const stream_1 = require("stream");
9
+ const zlib = require("zlib");
10
+ const Azure = require("@azure/storage-blob");
11
+ const core_bentley_1 = require("@itwin/core-bentley");
12
+ const core_common_1 = require("@itwin/core-common");
13
+ const BackendLoggerCategory_1 = require("./BackendLoggerCategory");
14
+ const IModelHost_1 = require("./IModelHost");
15
+ /**
16
+ * @beta
17
+ * @deprecated
18
+ */
19
+ class CloudStorageService {
20
+ initialize() { }
21
+ terminate() { }
22
+ async download(_name) { return undefined; }
23
+ makeDescriptor(id) {
24
+ return { name: id.name, provider: this.id };
25
+ }
26
+ }
27
+ exports.CloudStorageService = CloudStorageService;
28
+ /**
29
+ * @beta
30
+ * @deprecated
31
+ */
32
+ class AzureBlobStorage extends CloudStorageService {
33
+ constructor(credentials) {
34
+ var _a;
35
+ super();
36
+ this.id = core_common_1.CloudStorageProvider.Azure;
37
+ if (!credentials.account || !credentials.accessKey) {
38
+ throw new core_common_1.IModelError(core_common_1.BentleyStatus.ERROR, "Invalid credentials for Azure blob storage.");
39
+ }
40
+ this._baseUrl = (_a = credentials.baseUrl) !== null && _a !== void 0 ? _a : `https://${credentials.account}.blob.core.windows.net`;
41
+ this._credential = new Azure.StorageSharedKeyCredential(credentials.account, credentials.accessKey);
42
+ const options = {};
43
+ const pipeline = Azure.newPipeline(this._credential, options);
44
+ this._service = new Azure.BlobServiceClient(this._baseUrl, pipeline);
45
+ }
46
+ obtainContainerUrl(id, expiry, clientIp) {
47
+ const policy = {
48
+ containerName: id.name,
49
+ permissions: Azure.ContainerSASPermissions.parse("rl"),
50
+ expiresOn: expiry,
51
+ };
52
+ if (clientIp && clientIp !== "localhost" && clientIp !== "127.0.0.1" && clientIp !== "::1") {
53
+ policy.ipRange = { start: clientIp };
54
+ }
55
+ const token = Azure.generateBlobSASQueryParameters(policy, this._credential);
56
+ const url = new URL(this._baseUrl);
57
+ url.pathname = `${url.pathname.replace(/\/*$/, "")}/${id.name}`;
58
+ url.search = token.toString();
59
+ const urlObject = {
60
+ descriptor: this.makeDescriptor(id),
61
+ valid: 0,
62
+ expires: expiry.getTime(),
63
+ url: url.toString(),
64
+ };
65
+ return urlObject;
66
+ }
67
+ async ensureContainer(name) {
68
+ try {
69
+ const container = this._service.getContainerClient(name);
70
+ await container.create();
71
+ return;
72
+ }
73
+ catch (maybeErr) {
74
+ try {
75
+ const err = maybeErr;
76
+ if (err.statusCode === 409 && err.code === "ContainerAlreadyExists") {
77
+ return;
78
+ }
79
+ }
80
+ catch { }
81
+ if (typeof (maybeErr) !== "undefined" && maybeErr) {
82
+ throw maybeErr;
83
+ }
84
+ throw new core_common_1.IModelError(core_common_1.BentleyStatus.ERROR, `Unable to create container "${name}".`);
85
+ }
86
+ }
87
+ async upload(container, name, data, options, metadata) {
88
+ var _a, _b, _c;
89
+ try {
90
+ await this.ensureContainer(container);
91
+ const containerClient = this._service.getContainerClient(container);
92
+ const blocks = containerClient.getBlockBlobClient(name);
93
+ const blobHTTPHeaders = {
94
+ blobContentType: (_a = options === null || options === void 0 ? void 0 : options.type) !== null && _a !== void 0 ? _a : "application/octet-stream",
95
+ blobCacheControl: (_b = options === null || options === void 0 ? void 0 : options.cacheControl) !== null && _b !== void 0 ? _b : "private, max-age=31536000, immutable",
96
+ };
97
+ const blobOptions = metadata ?
98
+ {
99
+ blobHTTPHeaders,
100
+ metadata: { ...metadata },
101
+ } : {
102
+ blobHTTPHeaders,
103
+ };
104
+ const dataStream = new stream_1.PassThrough();
105
+ dataStream.end(data);
106
+ let source;
107
+ if (options && options.contentEncoding === "gzip") {
108
+ if (undefined === blobOptions.blobHTTPHeaders)
109
+ throw new core_common_1.IModelError(core_common_1.BentleyStatus.ERROR, "Blob HTTP headers object is undefined.");
110
+ blobOptions.blobHTTPHeaders.blobContentEncoding = options.contentEncoding;
111
+ const compressor = zlib.createGzip();
112
+ source = dataStream.pipe(compressor);
113
+ }
114
+ else {
115
+ source = dataStream;
116
+ }
117
+ const blockSize = 100 * 1024 * 1024;
118
+ const concurrency = 1;
119
+ const result = await blocks.uploadStream(source, blockSize, concurrency, blobOptions);
120
+ return (_c = result.etag) !== null && _c !== void 0 ? _c : "";
121
+ }
122
+ catch (maybeErr) {
123
+ if (typeof (maybeErr) !== "undefined" && maybeErr) {
124
+ throw maybeErr;
125
+ }
126
+ throw new core_common_1.IModelError(core_common_1.BentleyStatus.ERROR, `Unable to upload "${name}".`);
127
+ }
128
+ }
129
+ }
130
+ exports.AzureBlobStorage = AzureBlobStorage;
131
+ /**
132
+ * @beta
133
+ * @deprecated
134
+ */
135
+ class CloudStorageTileUploader {
136
+ constructor() {
137
+ this._activeUploads = new Map();
138
+ }
139
+ get activeUploads() {
140
+ return this._activeUploads.values();
141
+ }
142
+ async uploadToCache(id, content, containerKey, resourceKey, metadata) {
143
+ var _a;
144
+ await new Promise((resolve) => setTimeout(resolve));
145
+ try {
146
+ const options = {};
147
+ if (IModelHost_1.IModelHost.compressCachedTiles) {
148
+ options.contentEncoding = "gzip";
149
+ }
150
+ const perfInfo = { ...id.tokenProps, treeId: id.treeId, contentId: id.contentId, size: content.byteLength, compress: IModelHost_1.IModelHost.compressCachedTiles };
151
+ const perfLogger = new core_bentley_1.PerfLogger("Uploading tile to external tile cache", () => perfInfo);
152
+ await ((_a = IModelHost_1.IModelHost.tileCacheService) === null || _a === void 0 ? void 0 : _a.upload(containerKey, resourceKey, content, options, metadata));
153
+ perfLogger.dispose();
154
+ }
155
+ catch (err) {
156
+ core_bentley_1.Logger.logError(BackendLoggerCategory_1.BackendLoggerCategory.IModelTileUpload, (err instanceof Error) ? err.toString() : JSON.stringify(err));
157
+ }
158
+ this._activeUploads.delete(containerKey + resourceKey);
159
+ }
160
+ async cacheTile(tokenProps, treeId, contentId, content, guid, metadata) {
161
+ const id = { tokenProps, treeId, contentId, guid };
162
+ const cache = core_common_1.CloudStorageTileCache.getCache();
163
+ const containerKey = cache.formContainerName(id);
164
+ const resourceKey = cache.formResourceName(id);
165
+ const key = containerKey + resourceKey;
166
+ if (this._activeUploads.has(key))
167
+ return;
168
+ const promise = this.uploadToCache(id, content, containerKey, resourceKey, metadata);
169
+ this._activeUploads.set(key, promise);
170
+ await promise;
171
+ }
172
+ }
173
+ exports.CloudStorageTileUploader = CloudStorageTileUploader;
174
174
  //# sourceMappingURL=CloudStorageBackend.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"CloudStorageBackend.js","sourceRoot":"","sources":["../../src/CloudStorageBackend.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*--------------------------------------------------------------------------------------------*/\nimport { PassThrough, Readable } from \"stream\";\nimport * as zlib from \"zlib\";\nimport * as Azure from \"@azure/storage-blob\";\nimport { Logger, PerfLogger } from \"@itwin/core-bentley\";\nimport {\n BentleyStatus, CloudStorageContainerDescriptor, CloudStorageContainerUrl, CloudStorageProvider, CloudStorageTileCache, IModelError, IModelRpcProps,\n TileContentIdentifier,\n} from \"@itwin/core-common\";\nimport { BackendLoggerCategory } from \"./BackendLoggerCategory\";\nimport { IModelHost } from \"./IModelHost\";\n\n/* eslint-disable deprecation/deprecation */\n\n/** @beta */\nexport interface AzureBlobStorageCredentials {\n account: string;\n accessKey: string;\n baseUrl?: string;\n}\n\n/**\n * @beta\n * @deprecated\n */\nexport interface CloudStorageUploadOptions {\n type?: string;\n cacheControl?: string;\n contentEncoding?: \"gzip\";\n}\n\n/**\n * @beta\n * @deprecated\n */\nexport abstract class CloudStorageService {\n public initialize(): void { }\n public terminate(): void { }\n public abstract id: CloudStorageProvider;\n public abstract obtainContainerUrl(id: CloudStorageContainerDescriptor, expiry: Date, clientIp?: string): CloudStorageContainerUrl;\n public abstract upload(container: string, name: string, data: Uint8Array, options?: CloudStorageUploadOptions, metadata?: object): Promise<string>;\n public async download(_name: string): Promise<Readable | undefined> { return undefined; }\n\n protected makeDescriptor(id: CloudStorageContainerDescriptor) {\n return { name: id.name, provider: this.id };\n }\n}\n\n/**\n * @beta\n * @deprecated\n */\nexport class AzureBlobStorage extends CloudStorageService {\n private _service: Azure.BlobServiceClient;\n private _credential: Azure.StorageSharedKeyCredential;\n private _baseUrl: string;\n\n public constructor(credentials: AzureBlobStorageCredentials) {\n super();\n\n if (!credentials.account || !credentials.accessKey) {\n throw new IModelError(BentleyStatus.ERROR, \"Invalid credentials for Azure blob storage.\");\n }\n\n this._baseUrl = credentials.baseUrl ?? `https://${credentials.account}.blob.core.windows.net`;\n\n this._credential = new Azure.StorageSharedKeyCredential(credentials.account, credentials.accessKey);\n const options: Azure.StoragePipelineOptions = {};\n const pipeline = Azure.newPipeline(this._credential, options);\n this._service = new Azure.BlobServiceClient(this._baseUrl, pipeline);\n }\n\n public readonly id = CloudStorageProvider.Azure;\n\n public obtainContainerUrl(id: CloudStorageContainerDescriptor, expiry: Date, clientIp?: string): CloudStorageContainerUrl {\n const policy: Azure.BlobSASSignatureValues = {\n containerName: id.name,\n permissions: Azure.ContainerSASPermissions.parse(\"rl\"),\n expiresOn: expiry,\n };\n\n if (clientIp && clientIp !== \"localhost\" && clientIp !== \"127.0.0.1\" && clientIp !== \"::1\") {\n policy.ipRange = { start: clientIp };\n }\n\n const token = Azure.generateBlobSASQueryParameters(policy, this._credential);\n const url = new URL(this._baseUrl);\n url.pathname = `${url.pathname.replace(/\\/*$/, \"\")}/${id.name}`;\n url.search = token.toString();\n\n const urlObject: CloudStorageContainerUrl = {\n descriptor: this.makeDescriptor(id),\n valid: 0,\n expires: expiry.getTime(),\n url: url.toString(),\n };\n\n return urlObject;\n }\n\n public async ensureContainer(name: string): Promise<void> {\n try {\n const container = this._service.getContainerClient(name);\n await container.create();\n return;\n } catch (maybeErr) {\n try {\n const err = maybeErr as Azure.RestError;\n if (err.statusCode === 409 && err.code === \"ContainerAlreadyExists\") {\n return;\n }\n } catch { }\n\n if (typeof (maybeErr) !== \"undefined\" && maybeErr) {\n throw maybeErr;\n }\n\n throw new IModelError(BentleyStatus.ERROR, `Unable to create container \"${name}\".`);\n }\n }\n\n public async upload(container: string, name: string, data: Uint8Array, options?: CloudStorageUploadOptions, metadata?: object): Promise<string> {\n try {\n await this.ensureContainer(container);\n\n const containerClient = this._service.getContainerClient(container);\n const blocks = containerClient.getBlockBlobClient(name);\n const blobHTTPHeaders = {\n blobContentType: options?.type ?? \"application/octet-stream\",\n blobCacheControl: options?.cacheControl ?? \"private, max-age=31536000, immutable\",\n };\n\n const blobOptions: Azure.BlockBlobUploadStreamOptions = metadata ?\n {\n blobHTTPHeaders,\n metadata: { ...metadata },\n } : {\n blobHTTPHeaders,\n };\n\n const dataStream = new PassThrough();\n dataStream.end(data);\n\n let source: Readable;\n\n if (options && options.contentEncoding === \"gzip\") {\n if (undefined === blobOptions.blobHTTPHeaders)\n throw new IModelError(BentleyStatus.ERROR, \"Blob HTTP headers object is undefined.\");\n\n blobOptions.blobHTTPHeaders.blobContentEncoding = options.contentEncoding;\n const compressor = zlib.createGzip();\n source = dataStream.pipe(compressor);\n } else {\n source = dataStream;\n }\n\n const blockSize = 100 * 1024 * 1024;\n const concurrency = 1;\n const result = await blocks.uploadStream(source, blockSize, concurrency, blobOptions);\n return result.etag ?? \"\";\n } catch (maybeErr) {\n if (typeof (maybeErr) !== \"undefined\" && maybeErr) {\n throw maybeErr;\n }\n\n throw new IModelError(BentleyStatus.ERROR, `Unable to upload \"${name}\".`);\n }\n }\n}\n\n/**\n * @beta\n * @deprecated\n */\nexport class CloudStorageTileUploader {\n private _activeUploads: Map<string, Promise<void>> = new Map();\n\n public get activeUploads(): Iterable<Promise<void>> {\n return this._activeUploads.values();\n }\n\n private async uploadToCache(id: TileContentIdentifier, content: Uint8Array, containerKey: string, resourceKey: string, metadata?: object,) {\n await new Promise((resolve) => setTimeout(resolve));\n\n try {\n const options: CloudStorageUploadOptions = {};\n if (IModelHost.compressCachedTiles) {\n options.contentEncoding = \"gzip\";\n }\n\n const perfInfo = { ...id.tokenProps, treeId: id.treeId, contentId: id.contentId, size: content.byteLength, compress: IModelHost.compressCachedTiles };\n const perfLogger = new PerfLogger(\"Uploading tile to external tile cache\", () => perfInfo);\n await IModelHost.tileCacheService?.upload(containerKey, resourceKey, content, options, metadata);\n perfLogger.dispose();\n } catch (err) {\n Logger.logError(BackendLoggerCategory.IModelTileUpload, (err instanceof Error) ? err.toString() : JSON.stringify(err));\n }\n\n this._activeUploads.delete(containerKey + resourceKey);\n }\n\n public async cacheTile(tokenProps: IModelRpcProps, treeId: string, contentId: string, content: Uint8Array, guid: string | undefined, metadata?: object): Promise<void> {\n const id: TileContentIdentifier = { tokenProps, treeId, contentId, guid };\n\n const cache = CloudStorageTileCache.getCache();\n const containerKey = cache.formContainerName(id);\n const resourceKey = cache.formResourceName(id);\n const key = containerKey + resourceKey;\n\n if (this._activeUploads.has(key))\n return;\n\n const promise = this.uploadToCache(id, content, containerKey, resourceKey, metadata);\n this._activeUploads.set(key, promise);\n await promise;\n }\n}\n"]}
1
+ {"version":3,"file":"CloudStorageBackend.js","sourceRoot":"","sources":["../../src/CloudStorageBackend.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\nimport { PassThrough, Readable } from \"stream\";\r\nimport * as zlib from \"zlib\";\r\nimport * as Azure from \"@azure/storage-blob\";\r\nimport { Logger, PerfLogger } from \"@itwin/core-bentley\";\r\nimport {\r\n BentleyStatus, CloudStorageContainerDescriptor, CloudStorageContainerUrl, CloudStorageProvider, CloudStorageTileCache, IModelError, IModelRpcProps,\r\n TileContentIdentifier,\r\n} from \"@itwin/core-common\";\r\nimport { BackendLoggerCategory } from \"./BackendLoggerCategory\";\r\nimport { IModelHost } from \"./IModelHost\";\r\n\r\n/* eslint-disable deprecation/deprecation */\r\n\r\n/** @beta */\r\nexport interface AzureBlobStorageCredentials {\r\n account: string;\r\n accessKey: string;\r\n baseUrl?: string;\r\n}\r\n\r\n/**\r\n * @beta\r\n * @deprecated\r\n */\r\nexport interface CloudStorageUploadOptions {\r\n type?: string;\r\n cacheControl?: string;\r\n contentEncoding?: \"gzip\";\r\n}\r\n\r\n/**\r\n * @beta\r\n * @deprecated\r\n */\r\nexport abstract class CloudStorageService {\r\n public initialize(): void { }\r\n public terminate(): void { }\r\n public abstract id: CloudStorageProvider;\r\n public abstract obtainContainerUrl(id: CloudStorageContainerDescriptor, expiry: Date, clientIp?: string): CloudStorageContainerUrl;\r\n public abstract upload(container: string, name: string, data: Uint8Array, options?: CloudStorageUploadOptions, metadata?: object): Promise<string>;\r\n public async download(_name: string): Promise<Readable | undefined> { return undefined; }\r\n\r\n protected makeDescriptor(id: CloudStorageContainerDescriptor) {\r\n return { name: id.name, provider: this.id };\r\n }\r\n}\r\n\r\n/**\r\n * @beta\r\n * @deprecated\r\n */\r\nexport class AzureBlobStorage extends CloudStorageService {\r\n private _service: Azure.BlobServiceClient;\r\n private _credential: Azure.StorageSharedKeyCredential;\r\n private _baseUrl: string;\r\n\r\n public constructor(credentials: AzureBlobStorageCredentials) {\r\n super();\r\n\r\n if (!credentials.account || !credentials.accessKey) {\r\n throw new IModelError(BentleyStatus.ERROR, \"Invalid credentials for Azure blob storage.\");\r\n }\r\n\r\n this._baseUrl = credentials.baseUrl ?? `https://${credentials.account}.blob.core.windows.net`;\r\n\r\n this._credential = new Azure.StorageSharedKeyCredential(credentials.account, credentials.accessKey);\r\n const options: Azure.StoragePipelineOptions = {};\r\n const pipeline = Azure.newPipeline(this._credential, options);\r\n this._service = new Azure.BlobServiceClient(this._baseUrl, pipeline);\r\n }\r\n\r\n public readonly id = CloudStorageProvider.Azure;\r\n\r\n public obtainContainerUrl(id: CloudStorageContainerDescriptor, expiry: Date, clientIp?: string): CloudStorageContainerUrl {\r\n const policy: Azure.BlobSASSignatureValues = {\r\n containerName: id.name,\r\n permissions: Azure.ContainerSASPermissions.parse(\"rl\"),\r\n expiresOn: expiry,\r\n };\r\n\r\n if (clientIp && clientIp !== \"localhost\" && clientIp !== \"127.0.0.1\" && clientIp !== \"::1\") {\r\n policy.ipRange = { start: clientIp };\r\n }\r\n\r\n const token = Azure.generateBlobSASQueryParameters(policy, this._credential);\r\n const url = new URL(this._baseUrl);\r\n url.pathname = `${url.pathname.replace(/\\/*$/, \"\")}/${id.name}`;\r\n url.search = token.toString();\r\n\r\n const urlObject: CloudStorageContainerUrl = {\r\n descriptor: this.makeDescriptor(id),\r\n valid: 0,\r\n expires: expiry.getTime(),\r\n url: url.toString(),\r\n };\r\n\r\n return urlObject;\r\n }\r\n\r\n public async ensureContainer(name: string): Promise<void> {\r\n try {\r\n const container = this._service.getContainerClient(name);\r\n await container.create();\r\n return;\r\n } catch (maybeErr) {\r\n try {\r\n const err = maybeErr as Azure.RestError;\r\n if (err.statusCode === 409 && err.code === \"ContainerAlreadyExists\") {\r\n return;\r\n }\r\n } catch { }\r\n\r\n if (typeof (maybeErr) !== \"undefined\" && maybeErr) {\r\n throw maybeErr;\r\n }\r\n\r\n throw new IModelError(BentleyStatus.ERROR, `Unable to create container \"${name}\".`);\r\n }\r\n }\r\n\r\n public async upload(container: string, name: string, data: Uint8Array, options?: CloudStorageUploadOptions, metadata?: object): Promise<string> {\r\n try {\r\n await this.ensureContainer(container);\r\n\r\n const containerClient = this._service.getContainerClient(container);\r\n const blocks = containerClient.getBlockBlobClient(name);\r\n const blobHTTPHeaders = {\r\n blobContentType: options?.type ?? \"application/octet-stream\",\r\n blobCacheControl: options?.cacheControl ?? \"private, max-age=31536000, immutable\",\r\n };\r\n\r\n const blobOptions: Azure.BlockBlobUploadStreamOptions = metadata ?\r\n {\r\n blobHTTPHeaders,\r\n metadata: { ...metadata },\r\n } : {\r\n blobHTTPHeaders,\r\n };\r\n\r\n const dataStream = new PassThrough();\r\n dataStream.end(data);\r\n\r\n let source: Readable;\r\n\r\n if (options && options.contentEncoding === \"gzip\") {\r\n if (undefined === blobOptions.blobHTTPHeaders)\r\n throw new IModelError(BentleyStatus.ERROR, \"Blob HTTP headers object is undefined.\");\r\n\r\n blobOptions.blobHTTPHeaders.blobContentEncoding = options.contentEncoding;\r\n const compressor = zlib.createGzip();\r\n source = dataStream.pipe(compressor);\r\n } else {\r\n source = dataStream;\r\n }\r\n\r\n const blockSize = 100 * 1024 * 1024;\r\n const concurrency = 1;\r\n const result = await blocks.uploadStream(source, blockSize, concurrency, blobOptions);\r\n return result.etag ?? \"\";\r\n } catch (maybeErr) {\r\n if (typeof (maybeErr) !== \"undefined\" && maybeErr) {\r\n throw maybeErr;\r\n }\r\n\r\n throw new IModelError(BentleyStatus.ERROR, `Unable to upload \"${name}\".`);\r\n }\r\n }\r\n}\r\n\r\n/**\r\n * @beta\r\n * @deprecated\r\n */\r\nexport class CloudStorageTileUploader {\r\n private _activeUploads: Map<string, Promise<void>> = new Map();\r\n\r\n public get activeUploads(): Iterable<Promise<void>> {\r\n return this._activeUploads.values();\r\n }\r\n\r\n private async uploadToCache(id: TileContentIdentifier, content: Uint8Array, containerKey: string, resourceKey: string, metadata?: object,) {\r\n await new Promise((resolve) => setTimeout(resolve));\r\n\r\n try {\r\n const options: CloudStorageUploadOptions = {};\r\n if (IModelHost.compressCachedTiles) {\r\n options.contentEncoding = \"gzip\";\r\n }\r\n\r\n const perfInfo = { ...id.tokenProps, treeId: id.treeId, contentId: id.contentId, size: content.byteLength, compress: IModelHost.compressCachedTiles };\r\n const perfLogger = new PerfLogger(\"Uploading tile to external tile cache\", () => perfInfo);\r\n await IModelHost.tileCacheService?.upload(containerKey, resourceKey, content, options, metadata);\r\n perfLogger.dispose();\r\n } catch (err) {\r\n Logger.logError(BackendLoggerCategory.IModelTileUpload, (err instanceof Error) ? err.toString() : JSON.stringify(err));\r\n }\r\n\r\n this._activeUploads.delete(containerKey + resourceKey);\r\n }\r\n\r\n public async cacheTile(tokenProps: IModelRpcProps, treeId: string, contentId: string, content: Uint8Array, guid: string | undefined, metadata?: object): Promise<void> {\r\n const id: TileContentIdentifier = { tokenProps, treeId, contentId, guid };\r\n\r\n const cache = CloudStorageTileCache.getCache();\r\n const containerKey = cache.formContainerName(id);\r\n const resourceKey = cache.formResourceName(id);\r\n const key = containerKey + resourceKey;\r\n\r\n if (this._activeUploads.has(key))\r\n return;\r\n\r\n const promise = this.uploadToCache(id, content, containerKey, resourceKey, metadata);\r\n this._activeUploads.set(key, promise);\r\n await promise;\r\n }\r\n}\r\n"]}