@itwin/core-backend 3.1.0-dev.31 → 3.1.0-dev.34

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.
@@ -5,6 +5,7 @@ import { CloudStorageContainerDescriptor, CloudStorageContainerUrl, CloudStorage
5
5
  export interface AzureBlobStorageCredentials {
6
6
  account: string;
7
7
  accessKey: string;
8
+ baseUrl?: string;
8
9
  }
9
10
  /** @beta */
10
11
  export interface CloudStorageUploadOptions {
@@ -29,6 +30,7 @@ export declare abstract class CloudStorageService {
29
30
  export declare class AzureBlobStorage extends CloudStorageService {
30
31
  private _service;
31
32
  private _credential;
33
+ private _baseUrl;
32
34
  constructor(credentials: AzureBlobStorageCredentials);
33
35
  readonly id = CloudStorageProvider.Azure;
34
36
  obtainContainerUrl(id: CloudStorageContainerDescriptor, expiry: Date, clientIp?: string): CloudStorageContainerUrl;
@@ -1 +1 @@
1
- {"version":3,"file":"CloudStorageBackend.d.ts","sourceRoot":"","sources":["../../src/CloudStorageBackend.ts"],"names":[],"mappings":";AAIA,OAAO,EAAe,QAAQ,EAAE,MAAM,QAAQ,CAAC;AAI/C,OAAO,EACU,+BAA+B,EAAE,wBAAwB,EAAE,oBAAoB,EAAsC,cAAc,EAEnJ,MAAM,oBAAoB,CAAC;AAI5B,YAAY;AACZ,MAAM,WAAW,2BAA2B;IAC1C,OAAO,EAAE,MAAM,CAAC;IAChB,SAAS,EAAE,MAAM,CAAC;CACnB;AAED,YAAY;AACZ,MAAM,WAAW,yBAAyB;IACxC,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,eAAe,CAAC,EAAE,MAAM,CAAC;CAC1B;AAED,YAAY;AACZ,8BAAsB,mBAAmB;IAChC,UAAU,IAAI,IAAI;IAClB,SAAS,IAAI,IAAI;IACxB,SAAgB,EAAE,EAAE,oBAAoB,CAAC;aACzB,kBAAkB,CAAC,EAAE,EAAE,+BAA+B,EAAE,MAAM,EAAE,IAAI,EAAE,QAAQ,CAAC,EAAE,MAAM,GAAG,wBAAwB;aAClH,MAAM,CAAC,SAAS,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,UAAU,EAAE,OAAO,CAAC,EAAE,yBAAyB,EAAE,QAAQ,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC;IACrI,QAAQ,CAAC,KAAK,EAAE,MAAM,GAAG,OAAO,CAAC,QAAQ,GAAG,SAAS,CAAC;IAEnE,SAAS,CAAC,cAAc,CAAC,EAAE,EAAE,+BAA+B;;;;CAG7D;AAED,YAAY;AACZ,qBAAa,gBAAiB,SAAQ,mBAAmB;IACvD,OAAO,CAAC,QAAQ,CAA0B;IAC1C,OAAO,CAAC,WAAW,CAAmC;gBAEnC,WAAW,EAAE,2BAA2B;IAa3D,SAAgB,EAAE,8BAA8B;IAEzC,kBAAkB,CAAC,EAAE,EAAE,+BAA+B,EAAE,MAAM,EAAE,IAAI,EAAE,QAAQ,CAAC,EAAE,MAAM,GAAG,wBAAwB;IAuB5G,eAAe,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IAqB5C,MAAM,CAAC,SAAS,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,UAAU,EAAE,OAAO,CAAC,EAAE,yBAAyB,EAAE,QAAQ,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC;CA+ChJ;AAED,gBAAgB;AAChB,qBAAa,wBAAwB;IACnC,OAAO,CAAC,cAAc,CAAyC;IAE/D,IAAW,aAAa,IAAI,QAAQ,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC,CAElD;YAEa,aAAa;IAoBd,SAAS,CAAC,UAAU,EAAE,cAAc,EAAE,MAAM,EAAE,MAAM,EAAE,SAAS,EAAE,MAAM,EAAE,OAAO,EAAE,UAAU,EAAE,IAAI,EAAE,MAAM,GAAG,SAAS,EAAE,QAAQ,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;CAevK"}
1
+ {"version":3,"file":"CloudStorageBackend.d.ts","sourceRoot":"","sources":["../../src/CloudStorageBackend.ts"],"names":[],"mappings":";AAIA,OAAO,EAAe,QAAQ,EAAE,MAAM,QAAQ,CAAC;AAI/C,OAAO,EACU,+BAA+B,EAAE,wBAAwB,EAAE,oBAAoB,EAAsC,cAAc,EAEnJ,MAAM,oBAAoB,CAAC;AAI5B,YAAY;AACZ,MAAM,WAAW,2BAA2B;IAC1C,OAAO,EAAE,MAAM,CAAC;IAChB,SAAS,EAAE,MAAM,CAAC;IAClB,OAAO,CAAC,EAAE,MAAM,CAAC;CAClB;AAED,YAAY;AACZ,MAAM,WAAW,yBAAyB;IACxC,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,eAAe,CAAC,EAAE,MAAM,CAAC;CAC1B;AAED,YAAY;AACZ,8BAAsB,mBAAmB;IAChC,UAAU,IAAI,IAAI;IAClB,SAAS,IAAI,IAAI;IACxB,SAAgB,EAAE,EAAE,oBAAoB,CAAC;aACzB,kBAAkB,CAAC,EAAE,EAAE,+BAA+B,EAAE,MAAM,EAAE,IAAI,EAAE,QAAQ,CAAC,EAAE,MAAM,GAAG,wBAAwB;aAClH,MAAM,CAAC,SAAS,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,UAAU,EAAE,OAAO,CAAC,EAAE,yBAAyB,EAAE,QAAQ,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC;IACrI,QAAQ,CAAC,KAAK,EAAE,MAAM,GAAG,OAAO,CAAC,QAAQ,GAAG,SAAS,CAAC;IAEnE,SAAS,CAAC,cAAc,CAAC,EAAE,EAAE,+BAA+B;;;;CAG7D;AAED,YAAY;AACZ,qBAAa,gBAAiB,SAAQ,mBAAmB;IACvD,OAAO,CAAC,QAAQ,CAA0B;IAC1C,OAAO,CAAC,WAAW,CAAmC;IACtD,OAAO,CAAC,QAAQ,CAAS;gBAEN,WAAW,EAAE,2BAA2B;IAe3D,SAAgB,EAAE,8BAA8B;IAEzC,kBAAkB,CAAC,EAAE,EAAE,+BAA+B,EAAE,MAAM,EAAE,IAAI,EAAE,QAAQ,CAAC,EAAE,MAAM,GAAG,wBAAwB;IA0B5G,eAAe,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IAqB5C,MAAM,CAAC,SAAS,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,UAAU,EAAE,OAAO,CAAC,EAAE,yBAAyB,EAAE,QAAQ,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC;CA+ChJ;AAED,gBAAgB;AAChB,qBAAa,wBAAwB;IACnC,OAAO,CAAC,cAAc,CAAyC;IAE/D,IAAW,aAAa,IAAI,QAAQ,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC,CAElD;YAEa,aAAa;IAoBd,SAAS,CAAC,UAAU,EAAE,cAAc,EAAE,MAAM,EAAE,MAAM,EAAE,SAAS,EAAE,MAAM,EAAE,OAAO,EAAE,UAAU,EAAE,IAAI,EAAE,MAAM,GAAG,SAAS,EAAE,QAAQ,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;CAevK"}
@@ -25,15 +25,17 @@ exports.CloudStorageService = CloudStorageService;
25
25
  /** @beta */
26
26
  class AzureBlobStorage extends CloudStorageService {
27
27
  constructor(credentials) {
28
+ var _a;
28
29
  super();
29
30
  this.id = core_common_1.CloudStorageProvider.Azure;
30
31
  if (!credentials.account || !credentials.accessKey) {
31
32
  throw new core_common_1.IModelError(core_common_1.BentleyStatus.ERROR, "Invalid credentials for Azure blob storage.");
32
33
  }
34
+ this._baseUrl = (_a = credentials.baseUrl) !== null && _a !== void 0 ? _a : `https://${credentials.account}.blob.core.windows.net`;
33
35
  this._credential = new Azure.StorageSharedKeyCredential(credentials.account, credentials.accessKey);
34
36
  const options = {};
35
37
  const pipeline = Azure.newPipeline(this._credential, options);
36
- this._service = new Azure.BlobServiceClient(`https://${credentials.account}.blob.core.windows.net`, pipeline);
38
+ this._service = new Azure.BlobServiceClient(this._baseUrl, pipeline);
37
39
  }
38
40
  obtainContainerUrl(id, expiry, clientIp) {
39
41
  const policy = {
@@ -45,13 +47,16 @@ class AzureBlobStorage extends CloudStorageService {
45
47
  policy.ipRange = { start: clientIp };
46
48
  }
47
49
  const token = Azure.generateBlobSASQueryParameters(policy, this._credential);
48
- const url = {
50
+ const url = new URL(this._baseUrl);
51
+ url.pathname = `${url.pathname.replace(/\/*$/, "")}/${id.name}`;
52
+ url.search = token.toString();
53
+ const urlObject = {
49
54
  descriptor: this.makeDescriptor(id),
50
55
  valid: 0,
51
56
  expires: expiry.getTime(),
52
- url: `https://${this._credential.accountName}.blob.core.windows.net/${id.name}?${token.toString()}`,
57
+ url: url.toString(),
53
58
  };
54
- return url;
59
+ return urlObject;
55
60
  }
56
61
  async ensureContainer(name) {
57
62
  try {
@@ -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/** @beta */\r\nexport interface AzureBlobStorageCredentials {\r\n account: string;\r\n accessKey: string;\r\n}\r\n\r\n/** @beta */\r\nexport interface CloudStorageUploadOptions {\r\n type?: string;\r\n cacheControl?: string;\r\n contentEncoding?: \"gzip\";\r\n}\r\n\r\n/** @beta */\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/** @beta */\r\nexport class AzureBlobStorage extends CloudStorageService {\r\n private _service: Azure.BlobServiceClient;\r\n private _credential: Azure.StorageSharedKeyCredential;\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._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(`https://${credentials.account}.blob.core.windows.net`, 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\r\n const url: CloudStorageContainerUrl = {\r\n descriptor: this.makeDescriptor(id),\r\n valid: 0,\r\n expires: expiry.getTime(),\r\n url: `https://${this._credential.accountName}.blob.core.windows.net/${id.name}?${token.toString()}`,\r\n };\r\n\r\n return url;\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/** @internal */\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":";;;AAAA;;;+FAG+F;AAC/F,mCAA+C;AAC/C,6BAA6B;AAC7B,6CAA6C;AAC7C,sDAAyD;AACzD,oDAG4B;AAC5B,mEAAgE;AAChE,6CAA0C;AAgB1C,YAAY;AACZ,MAAsB,mBAAmB;IAChC,UAAU,KAAW,CAAC;IACtB,SAAS,KAAW,CAAC;IAIrB,KAAK,CAAC,QAAQ,CAAC,KAAa,IAAmC,OAAO,SAAS,CAAC,CAAC,CAAC;IAE/E,cAAc,CAAC,EAAmC;QAC1D,OAAO,EAAE,IAAI,EAAE,EAAE,CAAC,IAAI,EAAE,QAAQ,EAAE,IAAI,CAAC,EAAE,EAAE,CAAC;IAC9C,CAAC;CACF;AAXD,kDAWC;AAED,YAAY;AACZ,MAAa,gBAAiB,SAAQ,mBAAmB;IAKvD,YAAmB,WAAwC;;QACzD,KAAK,EAAE,CAAC;QAcM,OAAE,GAAG,kCAAoB,CAAC,KAAK,CAAC;QAZ9C,IAAI,CAAC,WAAW,CAAC,OAAO,IAAI,CAAC,WAAW,CAAC,SAAS,EAAE;YAClD,MAAM,IAAI,yBAAW,CAAC,2BAAa,CAAC,KAAK,EAAE,6CAA6C,CAAC,CAAC;SAC3F;QAED,IAAI,CAAC,QAAQ,GAAG,MAAA,WAAW,CAAC,OAAO,mCAAI,WAAW,WAAW,CAAC,OAAO,wBAAwB,CAAC;QAE9F,IAAI,CAAC,WAAW,GAAG,IAAI,KAAK,CAAC,0BAA0B,CAAC,WAAW,CAAC,OAAO,EAAE,WAAW,CAAC,SAAS,CAAC,CAAC;QACpG,MAAM,OAAO,GAAiC,EAAE,CAAC;QACjD,MAAM,QAAQ,GAAG,KAAK,CAAC,WAAW,CAAC,IAAI,CAAC,WAAW,EAAE,OAAO,CAAC,CAAC;QAC9D,IAAI,CAAC,QAAQ,GAAG,IAAI,KAAK,CAAC,iBAAiB,CAAC,IAAI,CAAC,QAAQ,EAAE,QAAQ,CAAC,CAAC;IACvE,CAAC;IAIM,kBAAkB,CAAC,EAAmC,EAAE,MAAY,EAAE,QAAiB;QAC5F,MAAM,MAAM,GAAiC;YAC3C,aAAa,EAAE,EAAE,CAAC,IAAI;YACtB,WAAW,EAAE,KAAK,CAAC,uBAAuB,CAAC,KAAK,CAAC,IAAI,CAAC;YACtD,SAAS,EAAE,MAAM;SAClB,CAAC;QAEF,IAAI,QAAQ,IAAI,QAAQ,KAAK,WAAW,IAAI,QAAQ,KAAK,WAAW,IAAI,QAAQ,KAAK,KAAK,EAAE;YAC1F,MAAM,CAAC,OAAO,GAAG,EAAE,KAAK,EAAE,QAAQ,EAAE,CAAC;SACtC;QAED,MAAM,KAAK,GAAG,KAAK,CAAC,8BAA8B,CAAC,MAAM,EAAE,IAAI,CAAC,WAAW,CAAC,CAAC;QAC7E,MAAM,GAAG,GAAG,IAAI,GAAG,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC;QACnC,GAAG,CAAC,QAAQ,GAAG,GAAG,GAAG,CAAC,QAAQ,CAAC,OAAO,CAAC,MAAM,EAAE,EAAE,CAAC,IAAI,EAAE,CAAC,IAAI,EAAE,CAAC;QAChE,GAAG,CAAC,MAAM,GAAG,KAAK,CAAC,QAAQ,EAAE,CAAC;QAE9B,MAAM,SAAS,GAA6B;YAC1C,UAAU,EAAE,IAAI,CAAC,cAAc,CAAC,EAAE,CAAC;YACnC,KAAK,EAAE,CAAC;YACR,OAAO,EAAE,MAAM,CAAC,OAAO,EAAE;YACzB,GAAG,EAAE,GAAG,CAAC,QAAQ,EAAE;SACpB,CAAC;QAEF,OAAO,SAAS,CAAC;IACnB,CAAC;IAEM,KAAK,CAAC,eAAe,CAAC,IAAY;QACvC,IAAI;YACF,MAAM,SAAS,GAAG,IAAI,CAAC,QAAQ,CAAC,kBAAkB,CAAC,IAAI,CAAC,CAAC;YACzD,MAAM,SAAS,CAAC,MAAM,EAAE,CAAC;YACzB,OAAO;SACR;QAAC,OAAO,QAAQ,EAAE;YACjB,IAAI;gBACF,MAAM,GAAG,GAAG,QAA2B,CAAC;gBACxC,IAAI,GAAG,CAAC,UAAU,KAAK,GAAG,IAAI,GAAG,CAAC,IAAI,KAAK,wBAAwB,EAAE;oBACnE,OAAO;iBACR;aACF;YAAC,MAAM,GAAG;YAEX,IAAI,OAAO,CAAC,QAAQ,CAAC,KAAK,WAAW,IAAI,QAAQ,EAAE;gBACjD,MAAM,QAAQ,CAAC;aAChB;YAED,MAAM,IAAI,yBAAW,CAAC,2BAAa,CAAC,KAAK,EAAE,+BAA+B,IAAI,IAAI,CAAC,CAAC;SACrF;IACH,CAAC;IAEM,KAAK,CAAC,MAAM,CAAC,SAAiB,EAAE,IAAY,EAAE,IAAgB,EAAE,OAAmC,EAAE,QAAiB;;QAC3H,IAAI;YACF,MAAM,IAAI,CAAC,eAAe,CAAC,SAAS,CAAC,CAAC;YAEtC,MAAM,eAAe,GAAG,IAAI,CAAC,QAAQ,CAAC,kBAAkB,CAAC,SAAS,CAAC,CAAC;YACpE,MAAM,MAAM,GAAG,eAAe,CAAC,kBAAkB,CAAC,IAAI,CAAC,CAAC;YACxD,MAAM,eAAe,GAAG;gBACtB,eAAe,EAAE,MAAA,OAAO,aAAP,OAAO,uBAAP,OAAO,CAAE,IAAI,mCAAI,0BAA0B;gBAC5D,gBAAgB,EAAE,MAAA,OAAO,aAAP,OAAO,uBAAP,OAAO,CAAE,YAAY,mCAAI,sCAAsC;aAClF,CAAC;YAEF,MAAM,WAAW,GAAuC,QAAQ,CAAC,CAAC;gBAChE;oBACE,eAAe;oBACf,QAAQ,EAAE,EAAE,GAAG,QAAQ,EAAE;iBAC1B,CAAC,CAAC,CAAC;gBACF,eAAe;aAChB,CAAC;YAEJ,MAAM,UAAU,GAAG,IAAI,oBAAW,EAAE,CAAC;YACrC,UAAU,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC;YAErB,IAAI,MAAgB,CAAC;YAErB,IAAI,OAAO,IAAI,OAAO,CAAC,eAAe,KAAK,MAAM,EAAE;gBACjD,IAAI,SAAS,KAAK,WAAW,CAAC,eAAe;oBAC3C,MAAM,IAAI,yBAAW,CAAC,2BAAa,CAAC,KAAK,EAAE,wCAAwC,CAAC,CAAC;gBAEvF,WAAW,CAAC,eAAe,CAAC,mBAAmB,GAAG,OAAO,CAAC,eAAe,CAAC;gBAC1E,MAAM,UAAU,GAAG,IAAI,CAAC,UAAU,EAAE,CAAC;gBACrC,MAAM,GAAG,UAAU,CAAC,IAAI,CAAC,UAAU,CAAC,CAAC;aACtC;iBAAM;gBACL,MAAM,GAAG,UAAU,CAAC;aACrB;YAED,MAAM,SAAS,GAAG,GAAG,GAAG,IAAI,GAAG,IAAI,CAAC;YACpC,MAAM,WAAW,GAAG,CAAC,CAAC;YACtB,MAAM,MAAM,GAAG,MAAM,MAAM,CAAC,YAAY,CAAC,MAAM,EAAE,SAAS,EAAE,WAAW,EAAE,WAAW,CAAC,CAAC;YACtF,OAAO,MAAA,MAAM,CAAC,IAAI,mCAAI,EAAE,CAAC;SAC1B;QAAC,OAAO,QAAQ,EAAE;YACjB,IAAI,OAAO,CAAC,QAAQ,CAAC,KAAK,WAAW,IAAI,QAAQ,EAAE;gBACjD,MAAM,QAAQ,CAAC;aAChB;YAED,MAAM,IAAI,yBAAW,CAAC,2BAAa,CAAC,KAAK,EAAE,qBAAqB,IAAI,IAAI,CAAC,CAAC;SAC3E;IACH,CAAC;CACF;AApHD,4CAoHC;AAED,gBAAgB;AAChB,MAAa,wBAAwB;IAArC;QACU,mBAAc,GAA+B,IAAI,GAAG,EAAE,CAAC;IAyCjE,CAAC;IAvCC,IAAW,aAAa;QACtB,OAAO,IAAI,CAAC,cAAc,CAAC,MAAM,EAAE,CAAC;IACtC,CAAC;IAEO,KAAK,CAAC,aAAa,CAAC,EAAyB,EAAE,OAAmB,EAAE,YAAoB,EAAE,WAAmB,EAAE,QAAiB;;QACtI,MAAM,IAAI,OAAO,CAAC,CAAC,OAAO,EAAE,EAAE,CAAC,UAAU,CAAC,OAAO,CAAC,CAAC,CAAC;QAEpD,IAAI;YACF,MAAM,OAAO,GAA8B,EAAE,CAAC;YAC9C,IAAI,uBAAU,CAAC,mBAAmB,EAAE;gBAClC,OAAO,CAAC,eAAe,GAAG,MAAM,CAAC;aAClC;YAED,MAAM,QAAQ,GAAG,EAAE,GAAG,EAAE,CAAC,UAAU,EAAE,MAAM,EAAE,EAAE,CAAC,MAAM,EAAE,SAAS,EAAE,EAAE,CAAC,SAAS,EAAE,IAAI,EAAE,OAAO,CAAC,UAAU,EAAE,QAAQ,EAAE,uBAAU,CAAC,mBAAmB,EAAE,CAAC;YACtJ,MAAM,UAAU,GAAG,IAAI,yBAAU,CAAC,uCAAuC,EAAE,GAAG,EAAE,CAAC,QAAQ,CAAC,CAAC;YAC3F,MAAM,CAAA,MAAA,uBAAU,CAAC,gBAAgB,0CAAE,MAAM,CAAC,YAAY,EAAE,WAAW,EAAE,OAAO,EAAE,OAAO,EAAE,QAAQ,CAAC,CAAA,CAAC;YACjG,UAAU,CAAC,OAAO,EAAE,CAAC;SACtB;QAAC,OAAO,GAAG,EAAE;YACZ,qBAAM,CAAC,QAAQ,CAAC,6CAAqB,CAAC,gBAAgB,EAAE,CAAC,GAAG,YAAY,KAAK,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,QAAQ,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC,SAAS,CAAC,GAAG,CAAC,CAAC,CAAC;SACxH;QAED,IAAI,CAAC,cAAc,CAAC,MAAM,CAAC,YAAY,GAAG,WAAW,CAAC,CAAC;IACzD,CAAC;IAEM,KAAK,CAAC,SAAS,CAAC,UAA0B,EAAE,MAAc,EAAE,SAAiB,EAAE,OAAmB,EAAE,IAAwB,EAAE,QAAiB;QACpJ,MAAM,EAAE,GAA0B,EAAE,UAAU,EAAE,MAAM,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC;QAE1E,MAAM,KAAK,GAAG,mCAAqB,CAAC,QAAQ,EAAE,CAAC;QAC/C,MAAM,YAAY,GAAG,KAAK,CAAC,iBAAiB,CAAC,EAAE,CAAC,CAAC;QACjD,MAAM,WAAW,GAAG,KAAK,CAAC,gBAAgB,CAAC,EAAE,CAAC,CAAC;QAC/C,MAAM,GAAG,GAAG,YAAY,GAAG,WAAW,CAAC;QAEvC,IAAI,IAAI,CAAC,cAAc,CAAC,GAAG,CAAC,GAAG,CAAC;YAC9B,OAAO;QAET,MAAM,OAAO,GAAG,IAAI,CAAC,aAAa,CAAC,EAAE,EAAE,OAAO,EAAE,YAAY,EAAE,WAAW,EAAE,QAAQ,CAAC,CAAC;QACrF,IAAI,CAAC,cAAc,CAAC,GAAG,CAAC,GAAG,EAAE,OAAO,CAAC,CAAC;QACtC,MAAM,OAAO,CAAC;IAChB,CAAC;CACF;AA1CD,4DA0CC","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/** @beta */\r\nexport interface AzureBlobStorageCredentials {\r\n account: string;\r\n accessKey: string;\r\n baseUrl?: string;\r\n}\r\n\r\n/** @beta */\r\nexport interface CloudStorageUploadOptions {\r\n type?: string;\r\n cacheControl?: string;\r\n contentEncoding?: \"gzip\";\r\n}\r\n\r\n/** @beta */\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/** @beta */\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/** @internal */\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"]}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@itwin/core-backend",
3
- "version": "3.1.0-dev.31",
3
+ "version": "3.1.0-dev.34",
4
4
  "description": "iTwin.js backend components",
5
5
  "main": "lib/cjs/core-backend.js",
6
6
  "typings": "lib/cjs/core-backend",
@@ -24,10 +24,10 @@
24
24
  "url": "http://www.bentley.com"
25
25
  },
26
26
  "peerDependencies": {
27
- "@itwin/core-bentley": "^3.1.0-dev.31",
28
- "@itwin/core-common": "^3.1.0-dev.31",
29
- "@itwin/core-geometry": "^3.1.0-dev.31",
30
- "@itwin/ecschema-metadata": "^3.1.0-dev.31"
27
+ "@itwin/core-bentley": "^3.1.0-dev.34",
28
+ "@itwin/core-common": "^3.1.0-dev.34",
29
+ "@itwin/core-geometry": "^3.1.0-dev.34",
30
+ "@itwin/ecschema-metadata": "^3.1.0-dev.34"
31
31
  },
32
32
  "peerDependenciesMeta": {
33
33
  "@itwin/ecschema-metadata": {
@@ -39,12 +39,12 @@
39
39
  "NOTE: All tools used by scripts in this package must be listed as devDependencies"
40
40
  ],
41
41
  "devDependencies": {
42
- "@itwin/build-tools": "3.1.0-dev.31",
43
- "@itwin/core-bentley": "3.1.0-dev.31",
44
- "@itwin/core-common": "3.1.0-dev.31",
45
- "@itwin/core-geometry": "3.1.0-dev.31",
46
- "@itwin/ecschema-metadata": "3.1.0-dev.31",
47
- "@itwin/eslint-plugin": "3.1.0-dev.31",
42
+ "@itwin/build-tools": "3.1.0-dev.34",
43
+ "@itwin/core-bentley": "3.1.0-dev.34",
44
+ "@itwin/core-common": "3.1.0-dev.34",
45
+ "@itwin/core-geometry": "3.1.0-dev.34",
46
+ "@itwin/ecschema-metadata": "3.1.0-dev.34",
47
+ "@itwin/eslint-plugin": "3.1.0-dev.34",
48
48
  "@types/chai": "^4.1.4",
49
49
  "@types/chai-as-promised": "^7",
50
50
  "@types/fs-extra": "^4.0.7",
@@ -69,8 +69,8 @@
69
69
  },
70
70
  "dependencies": {
71
71
  "@azure/storage-blob": "^12.7.0",
72
- "@bentley/imodeljs-native": "3.1.5",
73
- "@itwin/core-telemetry": "3.1.0-dev.31",
72
+ "@bentley/imodeljs-native": "3.1.6",
73
+ "@itwin/core-telemetry": "3.1.0-dev.34",
74
74
  "form-data": "^2.3.2",
75
75
  "fs-extra": "^8.1.0",
76
76
  "json5": "^2.2.0",