bruce-models 1.7.9 → 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.
@@ -3745,9 +3745,6 @@
3745
3745
  function Update(params) {
3746
3746
  return __awaiter(this, void 0, void 0, function* () {
3747
3747
  const { api, tag: data, req: reqParams } = params;
3748
- if (!(data === null || data === void 0 ? void 0 : data.ID)) {
3749
- throw ("Tag ID is required.");
3750
- }
3751
3748
  const url = data.ID ? `layer/${data.ID}` : "layer";
3752
3749
  const res = yield api.POST(url, data, exports.Api.PrepReqParams(reqParams));
3753
3750
  api.Cache.Remove(GetCacheKey(data.ID));
@@ -4599,6 +4596,68 @@
4599
4596
  EntityAttribute.GetAttribute = GetAttribute;
4600
4597
  })(exports.EntityAttribute || (exports.EntityAttribute = {}));
4601
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
+
4602
4661
  (function (ClientFile) {
4603
4662
  function GetCacheKey(fileId) {
4604
4663
  return `${exports.Api.ECacheKey.ClientFile}${exports.Api.ECacheKey.Id}${fileId}`;
@@ -4660,33 +4719,67 @@
4660
4719
  ClientFile.Delete = Delete;
4661
4720
  function Upload(params) {
4662
4721
  return __awaiter(this, void 0, void 0, function* () {
4663
- const { api, file, purpose, req } = params;
4722
+ const { api, file, purpose, req, onProgress } = params;
4664
4723
  if (!file) {
4665
4724
  throw ("File is required.");
4666
4725
  }
4667
- let formData = null;
4668
- if (purpose) {
4669
- formData = {
4670
- "Purpose": purpose
4671
- };
4726
+ const size = file === null || file === void 0 ? void 0 : file.size;
4727
+ if (!size) {
4728
+ throw ("You cannot upload a 0byte sized file.");
4672
4729
  }
4673
- const reqParams = exports.Api.PrepReqParams(req);
4674
- reqParams.formData = formData;
4675
- const prom = new Promise((res, rej) => __awaiter(this, void 0, void 0, function* () {
4676
- try {
4677
- const data = yield api.UPLOAD("file/uploadNew", file, reqParams);
4678
- res({
4679
- 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
4680
4747
  });
4681
- }
4682
- catch (e) {
4683
- rej(e);
4684
- }
4685
- }));
4686
- 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
+ };
4687
4766
  });
4688
4767
  }
4689
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;
4690
4783
  /**
4691
4784
  * Uploads a temp file.
4692
4785
  * This will return a temp file id which can be used in various endpoints.
@@ -4695,23 +4788,41 @@
4695
4788
  */
4696
4789
  function UploadTemp(params) {
4697
4790
  return __awaiter(this, void 0, void 0, function* () {
4698
- const { api, file, req } = params;
4791
+ const { api, file, req, onProgress } = params;
4699
4792
  if (!file) {
4700
4793
  throw ("File is required.");
4701
4794
  }
4702
- const prom = new Promise((res, rej) => __awaiter(this, void 0, void 0, function* () {
4703
- try {
4704
- const reqParams = exports.Api.PrepReqParams(req);
4705
- const data = yield api.UPLOAD("file/uploadTemp", file, reqParams);
4706
- res({
4707
- 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
4708
4815
  });
4709
- }
4710
- catch (e) {
4711
- rej(e);
4712
- }
4713
- }));
4714
- 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
+ };
4715
4826
  });
4716
4827
  }
4717
4828
  ClientFile.UploadTemp = UploadTemp;
@@ -5025,11 +5136,38 @@
5025
5136
  Tileset.Update = Update;
5026
5137
  function UploadFile(params) {
5027
5138
  return __awaiter(this, void 0, void 0, function* () {
5028
- const { api, tilesetId, file, req: reqParams } = params;
5139
+ const { api, file, req, tilesetId, onProgress } = params;
5029
5140
  if (!tilesetId || !file) {
5030
5141
  throw ("Tileset ID and file are required.");
5031
5142
  }
5032
- 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
+ });
5033
5171
  });
5034
5172
  }
5035
5173
  Tileset.UploadFile = UploadFile;
@@ -5046,12 +5184,39 @@
5046
5184
  Tileset.DeleteFile = DeleteFile;
5047
5185
  function UploadSrcFile(params) {
5048
5186
  return __awaiter(this, void 0, void 0, function* () {
5049
- const { api, tilesetId, file, req: reqParams } = params;
5187
+ const { api, file, req, tilesetId, onProgress } = params;
5050
5188
  if (!tilesetId || !file) {
5051
5189
  throw ("Tileset ID and file are required.");
5052
5190
  }
5053
- 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
+ }
5054
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;
5055
5220
  });
5056
5221
  }
5057
5222
  Tileset.UploadSrcFile = UploadSrcFile;