@itwin/core-backend 3.4.0-dev.62 → 3.4.0-dev.63

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 (223) hide show
  1. package/CHANGELOG.md +23 -1
  2. package/lib/cjs/AliCloudStorageService.d.ts +23 -23
  3. package/lib/cjs/AliCloudStorageService.js +71 -71
  4. package/lib/cjs/AliCloudStorageService.js.map +1 -1
  5. package/lib/cjs/BackendHubAccess.d.ts +224 -224
  6. package/lib/cjs/BackendHubAccess.js +41 -41
  7. package/lib/cjs/BackendHubAccess.js.map +1 -1
  8. package/lib/cjs/BackendLoggerCategory.d.ts +91 -91
  9. package/lib/cjs/BackendLoggerCategory.js +99 -99
  10. package/lib/cjs/BackendLoggerCategory.js.map +1 -1
  11. package/lib/cjs/BisCoreSchema.d.ts +21 -21
  12. package/lib/cjs/BisCoreSchema.js +60 -60
  13. package/lib/cjs/BisCoreSchema.js.map +1 -1
  14. package/lib/cjs/BriefcaseManager.d.ts +165 -165
  15. package/lib/cjs/BriefcaseManager.js +405 -405
  16. package/lib/cjs/BriefcaseManager.js.map +1 -1
  17. package/lib/cjs/Category.d.ts +153 -153
  18. package/lib/cjs/Category.js +243 -243
  19. package/lib/cjs/Category.js.map +1 -1
  20. package/lib/cjs/ChangeSummaryManager.d.ts +187 -187
  21. package/lib/cjs/ChangeSummaryManager.js +445 -445
  22. package/lib/cjs/ChangeSummaryManager.js.map +1 -1
  23. package/lib/cjs/ChangedElementsDb.d.ts +99 -99
  24. package/lib/cjs/ChangedElementsDb.js +165 -165
  25. package/lib/cjs/ChangedElementsDb.js.map +1 -1
  26. package/lib/cjs/ChangedElementsManager.d.ts +39 -39
  27. package/lib/cjs/ChangedElementsManager.js +88 -88
  28. package/lib/cjs/ChangedElementsManager.js.map +1 -1
  29. package/lib/cjs/CheckpointManager.d.ts +120 -120
  30. package/lib/cjs/CheckpointManager.js +343 -343
  31. package/lib/cjs/CheckpointManager.js.map +1 -1
  32. package/lib/cjs/ClassRegistry.d.ts +71 -71
  33. package/lib/cjs/ClassRegistry.js +215 -215
  34. package/lib/cjs/ClassRegistry.js.map +1 -1
  35. package/lib/cjs/CloudSqlite.d.ts +349 -349
  36. package/lib/cjs/CloudSqlite.js +151 -151
  37. package/lib/cjs/CloudSqlite.js.map +1 -1
  38. package/lib/cjs/CloudStorageBackend.d.ts +58 -58
  39. package/lib/cjs/CloudStorageBackend.js +173 -173
  40. package/lib/cjs/CloudStorageBackend.js.map +1 -1
  41. package/lib/cjs/CodeService.d.ts +396 -396
  42. package/lib/cjs/CodeService.js +63 -63
  43. package/lib/cjs/CodeService.js.map +1 -1
  44. package/lib/cjs/CodeSpecs.d.ts +50 -50
  45. package/lib/cjs/CodeSpecs.js +112 -112
  46. package/lib/cjs/CodeSpecs.js.map +1 -1
  47. package/lib/cjs/ConcurrentQuery.d.ts +11 -11
  48. package/lib/cjs/ConcurrentQuery.js +30 -30
  49. package/lib/cjs/ConcurrentQuery.js.map +1 -1
  50. package/lib/cjs/CustomViewState3dCreator.d.ts +32 -32
  51. package/lib/cjs/CustomViewState3dCreator.js +113 -113
  52. package/lib/cjs/CustomViewState3dCreator.js.map +1 -1
  53. package/lib/cjs/DevTools.d.ts +71 -71
  54. package/lib/cjs/DevTools.js +154 -154
  55. package/lib/cjs/DevTools.js.map +1 -1
  56. package/lib/cjs/DisplayStyle.d.ts +106 -106
  57. package/lib/cjs/DisplayStyle.js +256 -256
  58. package/lib/cjs/DisplayStyle.js.map +1 -1
  59. package/lib/cjs/ECDb.d.ts +191 -191
  60. package/lib/cjs/ECDb.js +350 -350
  61. package/lib/cjs/ECDb.js.map +1 -1
  62. package/lib/cjs/ECSchemaXmlContext.d.ts +18 -18
  63. package/lib/cjs/ECSchemaXmlContext.js +41 -41
  64. package/lib/cjs/ECSchemaXmlContext.js.map +1 -1
  65. package/lib/cjs/ECSqlStatement.d.ts +466 -466
  66. package/lib/cjs/ECSqlStatement.js +791 -791
  67. package/lib/cjs/ECSqlStatement.js.map +1 -1
  68. package/lib/cjs/Element.d.ts +1109 -1109
  69. package/lib/cjs/Element.js +1420 -1420
  70. package/lib/cjs/Element.js.map +1 -1
  71. package/lib/cjs/ElementAspect.d.ts +156 -156
  72. package/lib/cjs/ElementAspect.js +178 -178
  73. package/lib/cjs/ElementAspect.js.map +1 -1
  74. package/lib/cjs/ElementGraphics.d.ts +9 -9
  75. package/lib/cjs/ElementGraphics.js +41 -41
  76. package/lib/cjs/ElementGraphics.js.map +1 -1
  77. package/lib/cjs/ElementTreeWalker.d.ts +162 -162
  78. package/lib/cjs/ElementTreeWalker.js +409 -409
  79. package/lib/cjs/ElementTreeWalker.js.map +1 -1
  80. package/lib/cjs/Entity.d.ts +76 -76
  81. package/lib/cjs/Entity.js +82 -82
  82. package/lib/cjs/Entity.js.map +1 -1
  83. package/lib/cjs/ExportGraphics.d.ts +317 -317
  84. package/lib/cjs/ExportGraphics.js +208 -208
  85. package/lib/cjs/ExportGraphics.js.map +1 -1
  86. package/lib/cjs/ExternalSource.d.ts +94 -94
  87. package/lib/cjs/ExternalSource.js +125 -125
  88. package/lib/cjs/ExternalSource.js.map +1 -1
  89. package/lib/cjs/GeoCoordConfig.d.ts +19 -19
  90. package/lib/cjs/GeoCoordConfig.js +82 -82
  91. package/lib/cjs/GeoCoordConfig.js.map +1 -1
  92. package/lib/cjs/GeometrySummary.d.ts +4 -4
  93. package/lib/cjs/GeometrySummary.js +380 -380
  94. package/lib/cjs/GeometrySummary.js.map +1 -1
  95. package/lib/cjs/HubMock.d.ts +93 -93
  96. package/lib/cjs/HubMock.js +190 -190
  97. package/lib/cjs/HubMock.js.map +1 -1
  98. package/lib/cjs/IModelCloneContext.d.ts +85 -85
  99. package/lib/cjs/IModelCloneContext.js +150 -150
  100. package/lib/cjs/IModelCloneContext.js.map +1 -1
  101. package/lib/cjs/IModelDb.d.ts +1164 -1164
  102. package/lib/cjs/IModelDb.js +2324 -2324
  103. package/lib/cjs/IModelDb.js.map +1 -1
  104. package/lib/cjs/IModelHost.d.ts +361 -361
  105. package/lib/cjs/IModelHost.js +489 -489
  106. package/lib/cjs/IModelHost.js.map +1 -1
  107. package/lib/cjs/IModelJsFs.d.ts +62 -62
  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.js +90 -90
  166. package/lib/cjs/TileStorage.js.map +1 -1
  167. package/lib/cjs/TxnManager.d.ts +202 -202
  168. package/lib/cjs/TxnManager.js +356 -356
  169. package/lib/cjs/TxnManager.js.map +1 -1
  170. package/lib/cjs/ViewDefinition.d.ts +435 -435
  171. package/lib/cjs/ViewDefinition.js +635 -635
  172. package/lib/cjs/ViewDefinition.js.map +1 -1
  173. package/lib/cjs/ViewStateHydrator.d.ts +13 -13
  174. package/lib/cjs/ViewStateHydrator.js +103 -103
  175. package/lib/cjs/ViewStateHydrator.js.map +1 -1
  176. package/lib/cjs/assets/IModelChange.02.00.00.ecschema.xml +90 -90
  177. package/lib/cjs/assets/Settings/Schemas/Cloud.Schema.json +67 -67
  178. package/lib/cjs/assets/Settings/Schemas/Gcs.schema.json +31 -31
  179. package/lib/cjs/assets/Settings/Schemas/Workspace.Schema.json +52 -52
  180. package/lib/cjs/assets/Settings/backend.setting.json5 +138 -138
  181. package/lib/cjs/core-backend.d.ts +182 -182
  182. package/lib/cjs/core-backend.js +202 -202
  183. package/lib/cjs/core-backend.js.map +1 -1
  184. package/lib/cjs/domains/FunctionalElements.d.ts +101 -101
  185. package/lib/cjs/domains/FunctionalElements.js +145 -145
  186. package/lib/cjs/domains/FunctionalElements.js.map +1 -1
  187. package/lib/cjs/domains/FunctionalSchema.d.ts +13 -13
  188. package/lib/cjs/domains/FunctionalSchema.js +40 -40
  189. package/lib/cjs/domains/FunctionalSchema.js.map +1 -1
  190. package/lib/cjs/domains/GenericElements.d.ts +177 -177
  191. package/lib/cjs/domains/GenericElements.js +263 -263
  192. package/lib/cjs/domains/GenericElements.js.map +1 -1
  193. package/lib/cjs/domains/GenericSchema.d.ts +10 -10
  194. package/lib/cjs/domains/GenericSchema.js +28 -28
  195. package/lib/cjs/domains/GenericSchema.js.map +1 -1
  196. package/lib/cjs/rpc-impl/DevToolsRpcImpl.d.ts +15 -15
  197. package/lib/cjs/rpc-impl/DevToolsRpcImpl.js +32 -32
  198. package/lib/cjs/rpc-impl/DevToolsRpcImpl.js.map +1 -1
  199. package/lib/cjs/rpc-impl/IModelReadRpcImpl.d.ts +45 -45
  200. package/lib/cjs/rpc-impl/IModelReadRpcImpl.js +262 -262
  201. package/lib/cjs/rpc-impl/IModelReadRpcImpl.js.map +1 -1
  202. package/lib/cjs/rpc-impl/IModelTileRpcImpl.d.ts +22 -22
  203. package/lib/cjs/rpc-impl/IModelTileRpcImpl.js +204 -204
  204. package/lib/cjs/rpc-impl/IModelTileRpcImpl.js.map +1 -1
  205. package/lib/cjs/rpc-impl/RpcBriefcaseUtility.d.ts +36 -36
  206. package/lib/cjs/rpc-impl/RpcBriefcaseUtility.js +168 -168
  207. package/lib/cjs/rpc-impl/RpcBriefcaseUtility.js.map +1 -1
  208. package/lib/cjs/rpc-impl/SnapshotIModelRpcImpl.d.ts +16 -16
  209. package/lib/cjs/rpc-impl/SnapshotIModelRpcImpl.js +43 -43
  210. package/lib/cjs/rpc-impl/SnapshotIModelRpcImpl.js.map +1 -1
  211. package/lib/cjs/rpc-impl/WipRpcImpl.d.ts +15 -15
  212. package/lib/cjs/rpc-impl/WipRpcImpl.js +37 -37
  213. package/lib/cjs/rpc-impl/WipRpcImpl.js.map +1 -1
  214. package/lib/cjs/workspace/Settings.d.ts +186 -186
  215. package/lib/cjs/workspace/Settings.js +155 -155
  216. package/lib/cjs/workspace/Settings.js.map +1 -1
  217. package/lib/cjs/workspace/SettingsSchemas.d.ts +75 -75
  218. package/lib/cjs/workspace/SettingsSchemas.js +191 -191
  219. package/lib/cjs/workspace/SettingsSchemas.js.map +1 -1
  220. package/lib/cjs/workspace/Workspace.d.ts +414 -414
  221. package/lib/cjs/workspace/Workspace.js +543 -543
  222. package/lib/cjs/workspace/Workspace.js.map +1 -1
  223. package/package.json +11 -11
@@ -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":["/*---------------------------------------------------------------------------------------------\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"]}
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"]}