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.
@@ -669,10 +669,16 @@
669
669
  if (this.ssidHeader && this.ssid) {
670
670
  xhr.setRequestHeader(this.ssidHeader, this.ssid);
671
671
  }
672
- const formData = new FormData();
673
- if (params === null || params === void 0 ? void 0 : params.formData) {
674
- for (const key in params.formData) {
675
- formData.append(key, params.formData[key]);
672
+ let formData;
673
+ if ((params === null || params === void 0 ? void 0 : params.formData) instanceof FormData) {
674
+ formData = params === null || params === void 0 ? void 0 : params.formData;
675
+ }
676
+ else {
677
+ formData = new FormData();
678
+ if (params.formData) {
679
+ for (const key in params.formData) {
680
+ formData.append(key, params.formData[key]);
681
+ }
676
682
  }
677
683
  }
678
684
  formData.append("file", blob);
@@ -4596,6 +4602,68 @@
4596
4602
  EntityAttribute.GetAttribute = GetAttribute;
4597
4603
  })(exports.EntityAttribute || (exports.EntityAttribute = {}));
4598
4604
 
4605
+ (function (Uploader) {
4606
+ Uploader.MIN_LARGE_FILE_SIZE = 100000000; // 100MB.
4607
+ function DoMultiPartUpload(params) {
4608
+ return __awaiter(this, void 0, void 0, function* () {
4609
+ const { file, api, urlSuffix: url, req, onProgress } = params;
4610
+ const FILE_PORTION_SIZE = 100000000; // 100MB.
4611
+ let fileSize = file.size;
4612
+ let fileOffset = 0;
4613
+ let filePartsCount = fileSize / FILE_PORTION_SIZE;
4614
+ let t = Math.trunc(filePartsCount);
4615
+ filePartsCount = filePartsCount > t ? t + 1 : t;
4616
+ let filePartIndex = 1;
4617
+ let uploadToken = exports.ObjectUtils.UId();
4618
+ let data;
4619
+ while (fileOffset < fileSize) {
4620
+ let partSize = Math.min(FILE_PORTION_SIZE, fileSize - fileOffset);
4621
+ let retryCount = 5;
4622
+ let retryWait = 1000;
4623
+ while (retryCount > 0) {
4624
+ try {
4625
+ const blob = file.slice(fileOffset, fileOffset + partSize);
4626
+ const formData = new FormData();
4627
+ formData.append("originalFileName", file.name);
4628
+ formData.append("token", uploadToken);
4629
+ formData.append("count", "" + filePartsCount);
4630
+ formData.append("part", "" + filePartIndex);
4631
+ formData.append("file", blob);
4632
+ const reqParams = exports.Api.PrepReqParams(req);
4633
+ reqParams.formData = formData;
4634
+ reqParams.onProgress = (progress) => {
4635
+ const sofar = fileOffset + progress.loaded;
4636
+ const percent = Math.round((sofar / file.size) * 100);
4637
+ onProgress === null || onProgress === void 0 ? void 0 : onProgress({
4638
+ percent: percent,
4639
+ uploaded: false
4640
+ });
4641
+ };
4642
+ data = yield api.UPLOAD(url, blob, reqParams);
4643
+ retryCount = 0;
4644
+ }
4645
+ catch (up) {
4646
+ retryCount -= 1;
4647
+ if (retryCount <= 0) {
4648
+ throw up;
4649
+ }
4650
+ yield new Promise((res) => setTimeout(res, retryWait));
4651
+ retryWait = retryWait * 2;
4652
+ }
4653
+ }
4654
+ fileOffset += partSize;
4655
+ filePartIndex++;
4656
+ }
4657
+ onProgress === null || onProgress === void 0 ? void 0 : onProgress({
4658
+ percent: 100,
4659
+ uploaded: true
4660
+ });
4661
+ return data;
4662
+ });
4663
+ }
4664
+ Uploader.DoMultiPartUpload = DoMultiPartUpload;
4665
+ })(exports.Uploader || (exports.Uploader = {}));
4666
+
4599
4667
  (function (ClientFile) {
4600
4668
  function GetCacheKey(fileId) {
4601
4669
  return `${exports.Api.ECacheKey.ClientFile}${exports.Api.ECacheKey.Id}${fileId}`;
@@ -4657,33 +4725,67 @@
4657
4725
  ClientFile.Delete = Delete;
4658
4726
  function Upload(params) {
4659
4727
  return __awaiter(this, void 0, void 0, function* () {
4660
- const { api, file, purpose, req } = params;
4728
+ const { api, file, purpose, req, onProgress } = params;
4661
4729
  if (!file) {
4662
4730
  throw ("File is required.");
4663
4731
  }
4664
- let formData = null;
4665
- if (purpose) {
4666
- formData = {
4667
- "Purpose": purpose
4668
- };
4732
+ const size = file === null || file === void 0 ? void 0 : file.size;
4733
+ if (!size) {
4734
+ throw ("You cannot upload a 0byte sized file.");
4669
4735
  }
4670
- const reqParams = exports.Api.PrepReqParams(req);
4671
- reqParams.formData = formData;
4672
- const prom = new Promise((res, rej) => __awaiter(this, void 0, void 0, function* () {
4673
- try {
4674
- const data = yield api.UPLOAD("file/uploadNew", file, reqParams);
4675
- res({
4676
- clientFile: data
4736
+ let clientFile;
4737
+ if (size > exports.Uploader.MIN_LARGE_FILE_SIZE) {
4738
+ clientFile = yield exports.Uploader.DoMultiPartUpload({
4739
+ api,
4740
+ file,
4741
+ urlSuffix: "fileUpload",
4742
+ req,
4743
+ onProgress
4744
+ });
4745
+ }
4746
+ else {
4747
+ const reqParams = exports.Api.PrepReqParams(Object.assign({}, req));
4748
+ reqParams.onProgress = (progress) => {
4749
+ const percent = Math.round((progress.loaded / file.size) * 100);
4750
+ onProgress === null || onProgress === void 0 ? void 0 : onProgress({
4751
+ percent: percent,
4752
+ uploaded: false
4677
4753
  });
4678
- }
4679
- catch (e) {
4680
- rej(e);
4681
- }
4682
- }));
4683
- return prom;
4754
+ };
4755
+ clientFile = yield api.UPLOAD("file/uploadNew", file, req);
4756
+ }
4757
+ if ((clientFile === null || clientFile === void 0 ? void 0 : clientFile.ID) && purpose) {
4758
+ yield UpdatePurpose({
4759
+ api,
4760
+ fileId: clientFile.ID,
4761
+ purpose,
4762
+ req
4763
+ });
4764
+ }
4765
+ onProgress === null || onProgress === void 0 ? void 0 : onProgress({
4766
+ percent: 100,
4767
+ uploaded: true
4768
+ });
4769
+ return {
4770
+ clientFile
4771
+ };
4684
4772
  });
4685
4773
  }
4686
4774
  ClientFile.Upload = Upload;
4775
+ function UpdatePurpose(params) {
4776
+ return __awaiter(this, void 0, void 0, function* () {
4777
+ let { api, fileId, purpose, req: reqParams } = params;
4778
+ if (!purpose) {
4779
+ purpose = "";
4780
+ }
4781
+ yield api.POST("file/updatepurpose/" + fileId + "/?Purpose=" + purpose, {
4782
+ Purpose: purpose
4783
+ }, exports.Api.PrepReqParams(reqParams));
4784
+ const cacheKey = GetCacheKey(fileId);
4785
+ api.Cache.RemoveByContains(cacheKey);
4786
+ });
4787
+ }
4788
+ ClientFile.UpdatePurpose = UpdatePurpose;
4687
4789
  /**
4688
4790
  * Uploads a temp file.
4689
4791
  * This will return a temp file id which can be used in various endpoints.
@@ -4692,23 +4794,41 @@
4692
4794
  */
4693
4795
  function UploadTemp(params) {
4694
4796
  return __awaiter(this, void 0, void 0, function* () {
4695
- const { api, file, req } = params;
4797
+ const { api, file, req, onProgress } = params;
4696
4798
  if (!file) {
4697
4799
  throw ("File is required.");
4698
4800
  }
4699
- const prom = new Promise((res, rej) => __awaiter(this, void 0, void 0, function* () {
4700
- try {
4701
- const reqParams = exports.Api.PrepReqParams(req);
4702
- const data = yield api.UPLOAD("file/uploadTemp", file, reqParams);
4703
- res({
4704
- tempFileId: data["TempFile.ID"]
4801
+ const size = file === null || file === void 0 ? void 0 : file.size;
4802
+ if (!size) {
4803
+ throw ("You cannot upload a 0byte sized file.");
4804
+ }
4805
+ let tempFile;
4806
+ if (size > exports.Uploader.MIN_LARGE_FILE_SIZE) {
4807
+ tempFile = yield exports.Uploader.DoMultiPartUpload({
4808
+ api,
4809
+ file,
4810
+ urlSuffix: "tempFileUpload",
4811
+ req,
4812
+ onProgress
4813
+ });
4814
+ }
4815
+ else {
4816
+ req.onProgress = (progress) => {
4817
+ const percent = Math.round((progress.loaded / file.size) * 100);
4818
+ onProgress === null || onProgress === void 0 ? void 0 : onProgress({
4819
+ percent: percent,
4820
+ uploaded: false
4705
4821
  });
4706
- }
4707
- catch (e) {
4708
- rej(e);
4709
- }
4710
- }));
4711
- return prom;
4822
+ };
4823
+ tempFile = yield api.UPLOAD("file/uploadTemp", file, req);
4824
+ }
4825
+ onProgress === null || onProgress === void 0 ? void 0 : onProgress({
4826
+ percent: 100,
4827
+ uploaded: true
4828
+ });
4829
+ return {
4830
+ tempFileId: tempFile["TempFile.ID"]
4831
+ };
4712
4832
  });
4713
4833
  }
4714
4834
  ClientFile.UploadTemp = UploadTemp;
@@ -5022,11 +5142,38 @@
5022
5142
  Tileset.Update = Update;
5023
5143
  function UploadFile(params) {
5024
5144
  return __awaiter(this, void 0, void 0, function* () {
5025
- const { api, tilesetId, file, req: reqParams } = params;
5145
+ const { api, file, req, tilesetId, onProgress } = params;
5026
5146
  if (!tilesetId || !file) {
5027
5147
  throw ("Tileset ID and file are required.");
5028
5148
  }
5029
- return api.UPLOAD(`tileset/uploadFile/${tilesetId}/files`, file, exports.Api.PrepReqParams(reqParams));
5149
+ const size = file === null || file === void 0 ? void 0 : file.size;
5150
+ if (!size) {
5151
+ throw ("You cannot upload a 0byte sized file.");
5152
+ }
5153
+ if (size > exports.Uploader.MIN_LARGE_FILE_SIZE) {
5154
+ yield exports.Uploader.DoMultiPartUpload({
5155
+ api,
5156
+ file,
5157
+ urlSuffix: `tileset/uploadFileEx/${tilesetId}/add`,
5158
+ req,
5159
+ onProgress
5160
+ });
5161
+ }
5162
+ else {
5163
+ req.onProgress = (progress) => {
5164
+ const percent = Math.round((progress.loaded / file.size) * 100);
5165
+ onProgress === null || onProgress === void 0 ? void 0 : onProgress({
5166
+ percent: percent,
5167
+ uploaded: false
5168
+ });
5169
+ };
5170
+ yield api.UPLOAD(`tileset/uploadFile/${tilesetId}/files`, file, req);
5171
+ }
5172
+ api.Cache.Remove(GetCacheKey(tilesetId, true));
5173
+ onProgress === null || onProgress === void 0 ? void 0 : onProgress({
5174
+ percent: 100,
5175
+ uploaded: true
5176
+ });
5030
5177
  });
5031
5178
  }
5032
5179
  Tileset.UploadFile = UploadFile;
@@ -5043,12 +5190,39 @@
5043
5190
  Tileset.DeleteFile = DeleteFile;
5044
5191
  function UploadSrcFile(params) {
5045
5192
  return __awaiter(this, void 0, void 0, function* () {
5046
- const { api, tilesetId, file, req: reqParams } = params;
5193
+ const { api, file, req, tilesetId, onProgress } = params;
5047
5194
  if (!tilesetId || !file) {
5048
5195
  throw ("Tileset ID and file are required.");
5049
5196
  }
5050
- yield api.UPLOAD(`tileset/uploadFile/${tilesetId}/src`, file, exports.Api.PrepReqParams(reqParams));
5197
+ const size = file === null || file === void 0 ? void 0 : file.size;
5198
+ if (!size) {
5199
+ throw ("You cannot upload a 0byte sized file.");
5200
+ }
5201
+ if (size > exports.Uploader.MIN_LARGE_FILE_SIZE) {
5202
+ yield exports.Uploader.DoMultiPartUpload({
5203
+ api,
5204
+ file,
5205
+ urlSuffix: `tileset/uploadFileEx/${tilesetId}/src`,
5206
+ req,
5207
+ onProgress
5208
+ });
5209
+ }
5210
+ else {
5211
+ req.onProgress = (progress) => {
5212
+ const percent = Math.round((progress.loaded / file.size) * 100);
5213
+ onProgress === null || onProgress === void 0 ? void 0 : onProgress({
5214
+ percent: percent,
5215
+ uploaded: false
5216
+ });
5217
+ };
5218
+ yield api.UPLOAD(`tileset/uploadFile/${tilesetId}/src`, file, req);
5219
+ }
5051
5220
  api.Cache.Remove(GetCacheKey(tilesetId, true));
5221
+ onProgress === null || onProgress === void 0 ? void 0 : onProgress({
5222
+ percent: 100,
5223
+ uploaded: true
5224
+ });
5225
+ return;
5052
5226
  });
5053
5227
  }
5054
5228
  Tileset.UploadSrcFile = UploadSrcFile;