bruce-models 1.8.0 → 1.8.2

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.
@@ -675,10 +675,16 @@ class AbstractApi {
675
675
  if (this.ssidHeader && this.ssid) {
676
676
  xhr.setRequestHeader(this.ssidHeader, this.ssid);
677
677
  }
678
- const formData = new FormData();
679
- if (params === null || params === void 0 ? void 0 : params.formData) {
680
- for (const key in params.formData) {
681
- formData.append(key, params.formData[key]);
678
+ let formData;
679
+ if ((params === null || params === void 0 ? void 0 : params.formData) instanceof FormData) {
680
+ formData = params === null || params === void 0 ? void 0 : params.formData;
681
+ }
682
+ else {
683
+ formData = new FormData();
684
+ if (params.formData) {
685
+ for (const key in params.formData) {
686
+ formData.append(key, params.formData[key]);
687
+ }
682
688
  }
683
689
  }
684
690
  formData.append("file", blob);
@@ -4717,6 +4723,69 @@ var EntityAttribute;
4717
4723
  EntityAttribute.GetAttribute = GetAttribute;
4718
4724
  })(EntityAttribute || (EntityAttribute = {}));
4719
4725
 
4726
+ var Uploader;
4727
+ (function (Uploader) {
4728
+ Uploader.MIN_LARGE_FILE_SIZE = 100000000; // 100MB.
4729
+ function DoMultiPartUpload(params) {
4730
+ return __awaiter(this, void 0, void 0, function* () {
4731
+ const { file, api, urlSuffix: url, req, onProgress } = params;
4732
+ const FILE_PORTION_SIZE = 100000000; // 100MB.
4733
+ let fileSize = file.size;
4734
+ let fileOffset = 0;
4735
+ let filePartsCount = fileSize / FILE_PORTION_SIZE;
4736
+ let t = Math.trunc(filePartsCount);
4737
+ filePartsCount = filePartsCount > t ? t + 1 : t;
4738
+ let filePartIndex = 1;
4739
+ let uploadToken = ObjectUtils.UId();
4740
+ let data;
4741
+ while (fileOffset < fileSize) {
4742
+ let partSize = Math.min(FILE_PORTION_SIZE, fileSize - fileOffset);
4743
+ let retryCount = 5;
4744
+ let retryWait = 1000;
4745
+ while (retryCount > 0) {
4746
+ try {
4747
+ const blob = file.slice(fileOffset, fileOffset + partSize);
4748
+ const formData = new FormData();
4749
+ formData.append("originalFileName", file.name);
4750
+ formData.append("token", uploadToken);
4751
+ formData.append("count", "" + filePartsCount);
4752
+ formData.append("part", "" + filePartIndex);
4753
+ formData.append("file", blob);
4754
+ const reqParams = Api.PrepReqParams(req);
4755
+ reqParams.formData = formData;
4756
+ reqParams.onProgress = (progress) => {
4757
+ const sofar = fileOffset + progress.loaded;
4758
+ const percent = Math.round((sofar / file.size) * 100);
4759
+ onProgress === null || onProgress === void 0 ? void 0 : onProgress({
4760
+ percent: percent,
4761
+ uploaded: false
4762
+ });
4763
+ };
4764
+ data = yield api.UPLOAD(url, blob, reqParams);
4765
+ retryCount = 0;
4766
+ }
4767
+ catch (up) {
4768
+ retryCount -= 1;
4769
+ if (retryCount <= 0) {
4770
+ throw up;
4771
+ }
4772
+ yield new Promise((res) => setTimeout(res, retryWait));
4773
+ retryWait = retryWait * 2;
4774
+ }
4775
+ }
4776
+ fileOffset += partSize;
4777
+ filePartIndex++;
4778
+ }
4779
+ onProgress === null || onProgress === void 0 ? void 0 : onProgress({
4780
+ percent: 100,
4781
+ uploaded: true
4782
+ });
4783
+ return data;
4784
+ });
4785
+ }
4786
+ Uploader.DoMultiPartUpload = DoMultiPartUpload;
4787
+ })(Uploader || (Uploader = {}));
4788
+
4720
4789
  /**
4721
4790
  * Describes the "Client File" concept within Bruce.
4722
4791
  * A client file is a record of a file uploaded to Bruce.
@@ -4783,33 +4852,67 @@ var ClientFile;
4783
4852
  ClientFile.Delete = Delete;
4784
4853
  function Upload(params) {
4785
4854
  return __awaiter(this, void 0, void 0, function* () {
4786
- const { api, file, purpose, req } = params;
4855
+ const { api, file, purpose, req, onProgress } = params;
4787
4856
  if (!file) {
4788
4857
  throw ("File is required.");
4789
4858
  }
4790
- let formData = null;
4791
- if (purpose) {
4792
- formData = {
4793
- "Purpose": purpose
4794
- };
4859
+ const size = file === null || file === void 0 ? void 0 : file.size;
4860
+ if (!size) {
4861
+ throw ("You cannot upload a 0byte sized file.");
4795
4862
  }
4796
- const reqParams = Api.PrepReqParams(req);
4797
- reqParams.formData = formData;
4798
- const prom = new Promise((res, rej) => __awaiter(this, void 0, void 0, function* () {
4799
- try {
4800
- const data = yield api.UPLOAD("file/uploadNew", file, reqParams);
4801
- res({
4802
- clientFile: data
4863
+ let clientFile;
4864
+ if (size > Uploader.MIN_LARGE_FILE_SIZE) {
4865
+ clientFile = yield Uploader.DoMultiPartUpload({
4866
+ api,
4867
+ file,
4868
+ urlSuffix: "fileUpload",
4869
+ req,
4870
+ onProgress
4871
+ });
4872
+ }
4873
+ else {
4874
+ const reqParams = Api.PrepReqParams(Object.assign({}, req));
4875
+ reqParams.onProgress = (progress) => {
4876
+ const percent = Math.round((progress.loaded / file.size) * 100);
4877
+ onProgress === null || onProgress === void 0 ? void 0 : onProgress({
4878
+ percent: percent,
4879
+ uploaded: false
4803
4880
  });
4804
- }
4805
- catch (e) {
4806
- rej(e);
4807
- }
4808
- }));
4809
- return prom;
4881
+ };
4882
+ clientFile = yield api.UPLOAD("file/uploadNew", file, req);
4883
+ }
4884
+ if ((clientFile === null || clientFile === void 0 ? void 0 : clientFile.ID) && purpose) {
4885
+ yield UpdatePurpose({
4886
+ api,
4887
+ fileId: clientFile.ID,
4888
+ purpose,
4889
+ req
4890
+ });
4891
+ }
4892
+ onProgress === null || onProgress === void 0 ? void 0 : onProgress({
4893
+ percent: 100,
4894
+ uploaded: true
4895
+ });
4896
+ return {
4897
+ clientFile
4898
+ };
4810
4899
  });
4811
4900
  }
4812
4901
  ClientFile.Upload = Upload;
4902
+ function UpdatePurpose(params) {
4903
+ return __awaiter(this, void 0, void 0, function* () {
4904
+ let { api, fileId, purpose, req: reqParams } = params;
4905
+ if (!purpose) {
4906
+ purpose = "";
4907
+ }
4908
+ yield api.POST("file/updatepurpose/" + fileId + "/?Purpose=" + purpose, {
4909
+ Purpose: purpose
4910
+ }, Api.PrepReqParams(reqParams));
4911
+ const cacheKey = GetCacheKey(fileId);
4912
+ api.Cache.RemoveByContains(cacheKey);
4913
+ });
4914
+ }
4915
+ ClientFile.UpdatePurpose = UpdatePurpose;
4813
4916
  /**
4814
4917
  * Uploads a temp file.
4815
4918
  * This will return a temp file id which can be used in various endpoints.
@@ -4818,23 +4921,41 @@ var ClientFile;
4818
4921
  */
4819
4922
  function UploadTemp(params) {
4820
4923
  return __awaiter(this, void 0, void 0, function* () {
4821
- const { api, file, req } = params;
4924
+ const { api, file, req, onProgress } = params;
4822
4925
  if (!file) {
4823
4926
  throw ("File is required.");
4824
4927
  }
4825
- const prom = new Promise((res, rej) => __awaiter(this, void 0, void 0, function* () {
4826
- try {
4827
- const reqParams = Api.PrepReqParams(req);
4828
- const data = yield api.UPLOAD("file/uploadTemp", file, reqParams);
4829
- res({
4830
- tempFileId: data["TempFile.ID"]
4928
+ const size = file === null || file === void 0 ? void 0 : file.size;
4929
+ if (!size) {
4930
+ throw ("You cannot upload a 0byte sized file.");
4931
+ }
4932
+ let tempFile;
4933
+ if (size > Uploader.MIN_LARGE_FILE_SIZE) {
4934
+ tempFile = yield Uploader.DoMultiPartUpload({
4935
+ api,
4936
+ file,
4937
+ urlSuffix: "tempFileUpload",
4938
+ req,
4939
+ onProgress
4940
+ });
4941
+ }
4942
+ else {
4943
+ req.onProgress = (progress) => {
4944
+ const percent = Math.round((progress.loaded / file.size) * 100);
4945
+ onProgress === null || onProgress === void 0 ? void 0 : onProgress({
4946
+ percent: percent,
4947
+ uploaded: false
4831
4948
  });
4832
- }
4833
- catch (e) {
4834
- rej(e);
4835
- }
4836
- }));
4837
- return prom;
4949
+ };
4950
+ tempFile = yield api.UPLOAD("file/uploadTemp", file, req);
4951
+ }
4952
+ onProgress === null || onProgress === void 0 ? void 0 : onProgress({
4953
+ percent: 100,
4954
+ uploaded: true
4955
+ });
4956
+ return {
4957
+ tempFileId: tempFile["TempFile.ID"]
4958
+ };
4838
4959
  });
4839
4960
  }
4840
4961
  ClientFile.UploadTemp = UploadTemp;
@@ -5165,11 +5286,38 @@ var Tileset;
5165
5286
  Tileset.Update = Update;
5166
5287
  function UploadFile(params) {
5167
5288
  return __awaiter(this, void 0, void 0, function* () {
5168
- const { api, tilesetId, file, req: reqParams } = params;
5289
+ const { api, file, req, tilesetId, onProgress } = params;
5169
5290
  if (!tilesetId || !file) {
5170
5291
  throw ("Tileset ID and file are required.");
5171
5292
  }
5172
- return api.UPLOAD(`tileset/uploadFile/${tilesetId}/files`, file, Api.PrepReqParams(reqParams));
5293
+ const size = file === null || file === void 0 ? void 0 : file.size;
5294
+ if (!size) {
5295
+ throw ("You cannot upload a 0byte sized file.");
5296
+ }
5297
+ if (size > Uploader.MIN_LARGE_FILE_SIZE) {
5298
+ yield Uploader.DoMultiPartUpload({
5299
+ api,
5300
+ file,
5301
+ urlSuffix: `tileset/uploadFileEx/${tilesetId}/add`,
5302
+ req,
5303
+ onProgress
5304
+ });
5305
+ }
5306
+ else {
5307
+ req.onProgress = (progress) => {
5308
+ const percent = Math.round((progress.loaded / file.size) * 100);
5309
+ onProgress === null || onProgress === void 0 ? void 0 : onProgress({
5310
+ percent: percent,
5311
+ uploaded: false
5312
+ });
5313
+ };
5314
+ yield api.UPLOAD(`tileset/uploadFile/${tilesetId}/files`, file, req);
5315
+ }
5316
+ api.Cache.Remove(GetCacheKey(tilesetId, true));
5317
+ onProgress === null || onProgress === void 0 ? void 0 : onProgress({
5318
+ percent: 100,
5319
+ uploaded: true
5320
+ });
5173
5321
  });
5174
5322
  }
5175
5323
  Tileset.UploadFile = UploadFile;
@@ -5186,12 +5334,39 @@ var Tileset;
5186
5334
  Tileset.DeleteFile = DeleteFile;
5187
5335
  function UploadSrcFile(params) {
5188
5336
  return __awaiter(this, void 0, void 0, function* () {
5189
- const { api, tilesetId, file, req: reqParams } = params;
5337
+ const { api, file, req, tilesetId, onProgress } = params;
5190
5338
  if (!tilesetId || !file) {
5191
5339
  throw ("Tileset ID and file are required.");
5192
5340
  }
5193
- yield api.UPLOAD(`tileset/uploadFile/${tilesetId}/src`, file, Api.PrepReqParams(reqParams));
5341
+ const size = file === null || file === void 0 ? void 0 : file.size;
5342
+ if (!size) {
5343
+ throw ("You cannot upload a 0byte sized file.");
5344
+ }
5345
+ if (size > Uploader.MIN_LARGE_FILE_SIZE) {
5346
+ yield Uploader.DoMultiPartUpload({
5347
+ api,
5348
+ file,
5349
+ urlSuffix: `tileset/uploadFileEx/${tilesetId}/src`,
5350
+ req,
5351
+ onProgress
5352
+ });
5353
+ }
5354
+ else {
5355
+ req.onProgress = (progress) => {
5356
+ const percent = Math.round((progress.loaded / file.size) * 100);
5357
+ onProgress === null || onProgress === void 0 ? void 0 : onProgress({
5358
+ percent: percent,
5359
+ uploaded: false
5360
+ });
5361
+ };
5362
+ yield api.UPLOAD(`tileset/uploadFile/${tilesetId}/src`, file, req);
5363
+ }
5194
5364
  api.Cache.Remove(GetCacheKey(tilesetId, true));
5365
+ onProgress === null || onProgress === void 0 ? void 0 : onProgress({
5366
+ percent: 100,
5367
+ uploaded: true
5368
+ });
5369
+ return;
5195
5370
  });
5196
5371
  }
5197
5372
  Tileset.UploadSrcFile = UploadSrcFile;
@@ -7217,5 +7392,5 @@ var Markup;
7217
7392
  })(Circle = Markup.Circle || (Markup.Circle = {}));
7218
7393
  })(Markup || (Markup = {}));
7219
7394
 
7220
- export { AnnDocument, CustomForm, CustomFormContent, AbstractApi, Api, BruceApi, CamApi, IdmApi, GlobalApi, ApiGetters, Calculator, Bounds, BruceEvent, CacheControl, Camera, Cartes, Carto, Color, DelayQueue, Geometry, UTC, BruceVariable, EntityAttachmentType, EntityAttachment, EntityComment, EntityLink, EntityLod, EntityLodCategory, EntityRelationType, EntityRelation, EntitySource, EntityTag, EntityType, Entity, EntityGlobe, EntityFilterGetter, BatchedDataGetter, EntityCoords, EntityTypeVisualSettings, EntityAttribute, ClientFile, ProgramKey, ZoomControl, MenuItem, ProjectViewBookmark, ProjectView, ProjectViewLegacyTile, ProjectViewTile, PendingAction, MessageBroker, Style, Tileset, Permission, Session, UserGroup, User, Account, EncryptUtils, MathUtils, ObjectUtils, PathUtils, UrlUtils, DataLab, ImportCad, ImportCsv, ImportJson, ImportKml, ImportedFile, Markup };
7395
+ export { AnnDocument, CustomForm, CustomFormContent, AbstractApi, Api, BruceApi, CamApi, IdmApi, GlobalApi, ApiGetters, Calculator, Bounds, BruceEvent, CacheControl, Camera, Cartes, Carto, Color, DelayQueue, Geometry, UTC, BruceVariable, EntityAttachmentType, EntityAttachment, EntityComment, EntityLink, EntityLod, EntityLodCategory, EntityRelationType, EntityRelation, EntitySource, EntityTag, EntityType, Entity, EntityGlobe, EntityFilterGetter, BatchedDataGetter, EntityCoords, EntityTypeVisualSettings, EntityAttribute, ClientFile, ProgramKey, ZoomControl, MenuItem, ProjectViewBookmark, ProjectView, ProjectViewLegacyTile, ProjectViewTile, PendingAction, MessageBroker, Style, Tileset, Permission, Session, UserGroup, User, Account, EncryptUtils, MathUtils, ObjectUtils, PathUtils, UrlUtils, DataLab, ImportCad, ImportCsv, ImportJson, ImportKml, ImportedFile, Markup, Uploader };
7221
7396
  //# sourceMappingURL=bruce-models.es5.js.map