bruce-models 1.8.0 → 1.8.1

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