microboard-temp 0.5.68 → 0.5.70

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.
@@ -678,6 +678,7 @@ __export(exports_browser, {
678
678
  getPlaceholderImage: () => getPlaceholderImage,
679
679
  getHotkeyLabel: () => getHotkeyLabel,
680
680
  getControlPointData: () => getControlPointData,
681
+ getBlobFromDataURL: () => getBlobFromDataURL,
681
682
  forceNumberIntoInterval: () => forceNumberIntoInterval,
682
683
  fileTosha256: () => fileTosha256,
683
684
  exportBoardSnapshot: () => exportBoardSnapshot,
@@ -41289,14 +41290,56 @@ async function fileTosha256(file) {
41289
41290
  return hashArray.map((byte) => byte.toString(16).padStart(2, "0")).join("");
41290
41291
  }
41291
41292
 
41293
+ // src/api/MediaHelpers.ts
41294
+ var uploadMediaToStorage = async (hash, blob, accessToken, boardId, type) => {
41295
+ try {
41296
+ const generateUrlResponse = await fetch(`${window.location.origin}/api/v1/media/generate-upload-url`, {
41297
+ method: "POST",
41298
+ headers: {
41299
+ "Content-Type": "application/json",
41300
+ Authorization: `Bearer ${accessToken}`
41301
+ },
41302
+ body: JSON.stringify({
41303
+ fileSize: blob.size,
41304
+ boardId,
41305
+ hash
41306
+ })
41307
+ });
41308
+ if (!generateUrlResponse.ok) {
41309
+ conf.hooks.onUploadMediaError(generateUrlResponse, type);
41310
+ throw new Error(`Failed to get presigned URL. Status: ${generateUrlResponse.status}`);
41311
+ }
41312
+ const data = await generateUrlResponse.json();
41313
+ if (data.mediaUrl) {
41314
+ console.log("Media already exists, skipping upload.");
41315
+ return data.mediaUrl;
41316
+ }
41317
+ const { uploadUrl, promisedMediaUrl } = data;
41318
+ if (!uploadUrl || !promisedMediaUrl) {
41319
+ throw new Error("Server did not provide an uploadUrl or promisedMediaUrl in the response.");
41320
+ }
41321
+ const uploadResponse = await fetch(uploadUrl, {
41322
+ method: "PUT",
41323
+ headers: {
41324
+ "Content-Type": blob.type
41325
+ },
41326
+ body: blob
41327
+ });
41328
+ if (!uploadResponse.ok) {
41329
+ console.error("Direct upload to storage failed:", uploadResponse.status, uploadResponse.statusText);
41330
+ throw new Error(`Direct upload to storage failed. Status: ${uploadResponse.status}`);
41331
+ }
41332
+ return promisedMediaUrl;
41333
+ } catch (error) {
41334
+ console.error("Media upload process error:", error);
41335
+ throw error;
41336
+ }
41337
+ };
41338
+
41292
41339
  // src/Items/Image/ImageHelpers.ts
41293
41340
  var uploadToTheStorage = async (hash, dataURL, accessToken, boardId) => {
41294
41341
  return new Promise((resolve2, reject) => {
41295
- const base64String = dataURL.split(",")[1];
41296
- const mimeType = dataURL.split(",")[0].split(":")[1].split(";")[0];
41297
- const binaryString = window.atob(base64String);
41298
- const bytes = Uint8Array.from(binaryString, (char) => char.charCodeAt(0));
41299
- const blob = new Blob([bytes], { type: mimeType });
41342
+ const { blob, mimeType } = getBlobFromDataURL(dataURL);
41300
41343
  fetch(`${window?.location.origin}/api/v1/media/image/${boardId}`, {
41301
41344
  method: "POST",
41302
41345
  headers: {
@@ -41318,6 +41361,14 @@ var uploadToTheStorage = async (hash, dataURL, accessToken, boardId) => {
41318
41361
  });
41319
41362
  });
41320
41363
  };
41364
+ var getBlobFromDataURL = (dataURL) => {
41365
+ const base64String = dataURL.split(",")[1];
41366
+ const mimeType = dataURL.split(",")[0].split(":")[1].split(";")[0];
41367
+ const binaryString = window.atob(base64String);
41368
+ const bytes = Uint8Array.from(binaryString, (char) => char.charCodeAt(0));
41369
+ const blob = new Blob([bytes], { type: mimeType });
41370
+ return { blob, base64String, mimeType };
41371
+ };
41321
41372
  var resizeAndConvertToPng = async (inp) => {
41322
41373
  return new Promise((resolve2, reject) => {
41323
41374
  if (typeof inp !== "string") {
@@ -41385,7 +41436,8 @@ var resizeAndConvertToPng = async (inp) => {
41385
41436
  });
41386
41437
  };
41387
41438
  var prepareImage = (inp, accessToken, boardId) => resizeAndConvertToPng(inp).then(({ width: width2, height: height2, dataURL, hash }) => {
41388
- return uploadToTheStorage(hash, dataURL, accessToken, boardId).then((src) => {
41439
+ const { blob } = getBlobFromDataURL(dataURL);
41440
+ return uploadMediaToStorage(hash, blob, accessToken, boardId, "image").then((src) => {
41389
41441
  return {
41390
41442
  imageDimension: { width: width2, height: height2 },
41391
41443
  base64: dataURL,
@@ -41456,7 +41508,7 @@ var prepareVideo = (file, accessToken, boardId) => {
41456
41508
  video.onseeked = null;
41457
41509
  prepareImage(captureFrame(0.1, video)?.src, accessToken, boardId).then((imageData) => {
41458
41510
  fileTosha256(file).then((hash) => {
41459
- uploadVideoToStorage(hash, file, accessToken, boardId).then((url) => {
41511
+ uploadMediaToStorage(hash, file, accessToken, boardId, "video").then((url) => {
41460
41512
  resolve2({
41461
41513
  url,
41462
41514
  previewUrl: imageData.storageLink
@@ -41757,37 +41809,13 @@ class AudioItem extends BaseItem {
41757
41809
  }
41758
41810
  }
41759
41811
  // src/Items/Audio/AudioHelpers.ts
41760
- var uploadAudioToStorage = async (hash, audioBlob, accessToken, boardId) => {
41761
- return new Promise((resolve2, reject) => {
41762
- fetch(`${window.location.origin}/api/v1/media/audio/${boardId}`, {
41763
- method: "POST",
41764
- headers: {
41765
- "Content-Type": audioBlob.type,
41766
- "x-audio-id": hash,
41767
- Authorization: `Bearer ${accessToken}`
41768
- },
41769
- body: audioBlob
41770
- }).then(async (response) => {
41771
- if (response.status !== 200) {
41772
- return conf.hooks.onUploadMediaError(response, "audio");
41773
- }
41774
- return response.json();
41775
- }).then((data) => {
41776
- console.log(data);
41777
- resolve2(data.src);
41778
- }).catch((error) => {
41779
- console.error("Media storage error:", error);
41780
- reject(error);
41781
- });
41782
- });
41783
- };
41784
41812
  var prepareAudio = (file, accessToken, boardId) => {
41785
41813
  return new Promise((resolve2, reject) => {
41786
41814
  const audio = document.createElement("audio");
41787
41815
  audio.src = URL.createObjectURL(file);
41788
41816
  audio.onloadedmetadata = () => {
41789
41817
  fileTosha256(file).then((hash) => {
41790
- uploadAudioToStorage(hash, file, accessToken, boardId).then((url) => {
41818
+ uploadMediaToStorage(hash, file, accessToken, boardId, "audio").then((url) => {
41791
41819
  resolve2(url);
41792
41820
  }).catch(reject);
41793
41821
  }).catch(() => {
package/dist/cjs/index.js CHANGED
@@ -678,6 +678,7 @@ __export(exports_src, {
678
678
  getPlaceholderImage: () => getPlaceholderImage,
679
679
  getHotkeyLabel: () => getHotkeyLabel,
680
680
  getControlPointData: () => getControlPointData,
681
+ getBlobFromDataURL: () => getBlobFromDataURL,
681
682
  forceNumberIntoInterval: () => forceNumberIntoInterval,
682
683
  fileTosha256: () => fileTosha256,
683
684
  exportBoardSnapshot: () => exportBoardSnapshot,
@@ -41289,14 +41290,56 @@ async function fileTosha256(file) {
41289
41290
  return hashArray.map((byte) => byte.toString(16).padStart(2, "0")).join("");
41290
41291
  }
41291
41292
 
41293
+ // src/api/MediaHelpers.ts
41294
+ var uploadMediaToStorage = async (hash, blob, accessToken, boardId, type) => {
41295
+ try {
41296
+ const generateUrlResponse = await fetch(`${window.location.origin}/api/v1/media/generate-upload-url`, {
41297
+ method: "POST",
41298
+ headers: {
41299
+ "Content-Type": "application/json",
41300
+ Authorization: `Bearer ${accessToken}`
41301
+ },
41302
+ body: JSON.stringify({
41303
+ fileSize: blob.size,
41304
+ boardId,
41305
+ hash
41306
+ })
41307
+ });
41308
+ if (!generateUrlResponse.ok) {
41309
+ conf.hooks.onUploadMediaError(generateUrlResponse, type);
41310
+ throw new Error(`Failed to get presigned URL. Status: ${generateUrlResponse.status}`);
41311
+ }
41312
+ const data = await generateUrlResponse.json();
41313
+ if (data.mediaUrl) {
41314
+ console.log("Media already exists, skipping upload.");
41315
+ return data.mediaUrl;
41316
+ }
41317
+ const { uploadUrl, promisedMediaUrl } = data;
41318
+ if (!uploadUrl || !promisedMediaUrl) {
41319
+ throw new Error("Server did not provide an uploadUrl or promisedMediaUrl in the response.");
41320
+ }
41321
+ const uploadResponse = await fetch(uploadUrl, {
41322
+ method: "PUT",
41323
+ headers: {
41324
+ "Content-Type": blob.type
41325
+ },
41326
+ body: blob
41327
+ });
41328
+ if (!uploadResponse.ok) {
41329
+ console.error("Direct upload to storage failed:", uploadResponse.status, uploadResponse.statusText);
41330
+ throw new Error(`Direct upload to storage failed. Status: ${uploadResponse.status}`);
41331
+ }
41332
+ return promisedMediaUrl;
41333
+ } catch (error) {
41334
+ console.error("Media upload process error:", error);
41335
+ throw error;
41336
+ }
41337
+ };
41338
+
41292
41339
  // src/Items/Image/ImageHelpers.ts
41293
41340
  var uploadToTheStorage = async (hash, dataURL, accessToken, boardId) => {
41294
41341
  return new Promise((resolve2, reject) => {
41295
- const base64String = dataURL.split(",")[1];
41296
- const mimeType = dataURL.split(",")[0].split(":")[1].split(";")[0];
41297
- const binaryString = window.atob(base64String);
41298
- const bytes = Uint8Array.from(binaryString, (char) => char.charCodeAt(0));
41299
- const blob = new Blob([bytes], { type: mimeType });
41342
+ const { blob, mimeType } = getBlobFromDataURL(dataURL);
41300
41343
  fetch(`${window?.location.origin}/api/v1/media/image/${boardId}`, {
41301
41344
  method: "POST",
41302
41345
  headers: {
@@ -41318,6 +41361,14 @@ var uploadToTheStorage = async (hash, dataURL, accessToken, boardId) => {
41318
41361
  });
41319
41362
  });
41320
41363
  };
41364
+ var getBlobFromDataURL = (dataURL) => {
41365
+ const base64String = dataURL.split(",")[1];
41366
+ const mimeType = dataURL.split(",")[0].split(":")[1].split(";")[0];
41367
+ const binaryString = window.atob(base64String);
41368
+ const bytes = Uint8Array.from(binaryString, (char) => char.charCodeAt(0));
41369
+ const blob = new Blob([bytes], { type: mimeType });
41370
+ return { blob, base64String, mimeType };
41371
+ };
41321
41372
  var resizeAndConvertToPng = async (inp) => {
41322
41373
  return new Promise((resolve2, reject) => {
41323
41374
  if (typeof inp !== "string") {
@@ -41385,7 +41436,8 @@ var resizeAndConvertToPng = async (inp) => {
41385
41436
  });
41386
41437
  };
41387
41438
  var prepareImage = (inp, accessToken, boardId) => resizeAndConvertToPng(inp).then(({ width: width2, height: height2, dataURL, hash }) => {
41388
- return uploadToTheStorage(hash, dataURL, accessToken, boardId).then((src) => {
41439
+ const { blob } = getBlobFromDataURL(dataURL);
41440
+ return uploadMediaToStorage(hash, blob, accessToken, boardId, "image").then((src) => {
41389
41441
  return {
41390
41442
  imageDimension: { width: width2, height: height2 },
41391
41443
  base64: dataURL,
@@ -41456,7 +41508,7 @@ var prepareVideo = (file, accessToken, boardId) => {
41456
41508
  video.onseeked = null;
41457
41509
  prepareImage(captureFrame(0.1, video)?.src, accessToken, boardId).then((imageData) => {
41458
41510
  fileTosha256(file).then((hash) => {
41459
- uploadVideoToStorage(hash, file, accessToken, boardId).then((url) => {
41511
+ uploadMediaToStorage(hash, file, accessToken, boardId, "video").then((url) => {
41460
41512
  resolve2({
41461
41513
  url,
41462
41514
  previewUrl: imageData.storageLink
@@ -41757,37 +41809,13 @@ class AudioItem extends BaseItem {
41757
41809
  }
41758
41810
  }
41759
41811
  // src/Items/Audio/AudioHelpers.ts
41760
- var uploadAudioToStorage = async (hash, audioBlob, accessToken, boardId) => {
41761
- return new Promise((resolve2, reject) => {
41762
- fetch(`${window.location.origin}/api/v1/media/audio/${boardId}`, {
41763
- method: "POST",
41764
- headers: {
41765
- "Content-Type": audioBlob.type,
41766
- "x-audio-id": hash,
41767
- Authorization: `Bearer ${accessToken}`
41768
- },
41769
- body: audioBlob
41770
- }).then(async (response) => {
41771
- if (response.status !== 200) {
41772
- return conf.hooks.onUploadMediaError(response, "audio");
41773
- }
41774
- return response.json();
41775
- }).then((data) => {
41776
- console.log(data);
41777
- resolve2(data.src);
41778
- }).catch((error) => {
41779
- console.error("Media storage error:", error);
41780
- reject(error);
41781
- });
41782
- });
41783
- };
41784
41812
  var prepareAudio = (file, accessToken, boardId) => {
41785
41813
  return new Promise((resolve2, reject) => {
41786
41814
  const audio = document.createElement("audio");
41787
41815
  audio.src = URL.createObjectURL(file);
41788
41816
  audio.onloadedmetadata = () => {
41789
41817
  fileTosha256(file).then((hash) => {
41790
- uploadAudioToStorage(hash, file, accessToken, boardId).then((url) => {
41818
+ uploadMediaToStorage(hash, file, accessToken, boardId, "audio").then((url) => {
41791
41819
  resolve2(url);
41792
41820
  }).catch(reject);
41793
41821
  }).catch(() => {
package/dist/cjs/node.js CHANGED
@@ -1715,6 +1715,7 @@ __export(exports_node, {
1715
1715
  getPlaceholderImage: () => getPlaceholderImage,
1716
1716
  getHotkeyLabel: () => getHotkeyLabel,
1717
1717
  getControlPointData: () => getControlPointData,
1718
+ getBlobFromDataURL: () => getBlobFromDataURL,
1718
1719
  forceNumberIntoInterval: () => forceNumberIntoInterval,
1719
1720
  fileTosha256: () => fileTosha256,
1720
1721
  exportBoardSnapshot: () => exportBoardSnapshot,
@@ -43762,14 +43763,56 @@ async function fileTosha256(file) {
43762
43763
  return hashArray.map((byte) => byte.toString(16).padStart(2, "0")).join("");
43763
43764
  }
43764
43765
 
43766
+ // src/api/MediaHelpers.ts
43767
+ var uploadMediaToStorage = async (hash, blob, accessToken, boardId, type) => {
43768
+ try {
43769
+ const generateUrlResponse = await fetch(`${window.location.origin}/api/v1/media/generate-upload-url`, {
43770
+ method: "POST",
43771
+ headers: {
43772
+ "Content-Type": "application/json",
43773
+ Authorization: `Bearer ${accessToken}`
43774
+ },
43775
+ body: JSON.stringify({
43776
+ fileSize: blob.size,
43777
+ boardId,
43778
+ hash
43779
+ })
43780
+ });
43781
+ if (!generateUrlResponse.ok) {
43782
+ conf.hooks.onUploadMediaError(generateUrlResponse, type);
43783
+ throw new Error(`Failed to get presigned URL. Status: ${generateUrlResponse.status}`);
43784
+ }
43785
+ const data = await generateUrlResponse.json();
43786
+ if (data.mediaUrl) {
43787
+ console.log("Media already exists, skipping upload.");
43788
+ return data.mediaUrl;
43789
+ }
43790
+ const { uploadUrl, promisedMediaUrl } = data;
43791
+ if (!uploadUrl || !promisedMediaUrl) {
43792
+ throw new Error("Server did not provide an uploadUrl or promisedMediaUrl in the response.");
43793
+ }
43794
+ const uploadResponse = await fetch(uploadUrl, {
43795
+ method: "PUT",
43796
+ headers: {
43797
+ "Content-Type": blob.type
43798
+ },
43799
+ body: blob
43800
+ });
43801
+ if (!uploadResponse.ok) {
43802
+ console.error("Direct upload to storage failed:", uploadResponse.status, uploadResponse.statusText);
43803
+ throw new Error(`Direct upload to storage failed. Status: ${uploadResponse.status}`);
43804
+ }
43805
+ return promisedMediaUrl;
43806
+ } catch (error) {
43807
+ console.error("Media upload process error:", error);
43808
+ throw error;
43809
+ }
43810
+ };
43811
+
43765
43812
  // src/Items/Image/ImageHelpers.ts
43766
43813
  var uploadToTheStorage = async (hash, dataURL, accessToken, boardId) => {
43767
43814
  return new Promise((resolve2, reject) => {
43768
- const base64String = dataURL.split(",")[1];
43769
- const mimeType = dataURL.split(",")[0].split(":")[1].split(";")[0];
43770
- const binaryString = window.atob(base64String);
43771
- const bytes = Uint8Array.from(binaryString, (char) => char.charCodeAt(0));
43772
- const blob = new Blob([bytes], { type: mimeType });
43815
+ const { blob, mimeType } = getBlobFromDataURL(dataURL);
43773
43816
  fetch(`${window?.location.origin}/api/v1/media/image/${boardId}`, {
43774
43817
  method: "POST",
43775
43818
  headers: {
@@ -43791,6 +43834,14 @@ var uploadToTheStorage = async (hash, dataURL, accessToken, boardId) => {
43791
43834
  });
43792
43835
  });
43793
43836
  };
43837
+ var getBlobFromDataURL = (dataURL) => {
43838
+ const base64String = dataURL.split(",")[1];
43839
+ const mimeType = dataURL.split(",")[0].split(":")[1].split(";")[0];
43840
+ const binaryString = window.atob(base64String);
43841
+ const bytes = Uint8Array.from(binaryString, (char) => char.charCodeAt(0));
43842
+ const blob = new Blob([bytes], { type: mimeType });
43843
+ return { blob, base64String, mimeType };
43844
+ };
43794
43845
  var resizeAndConvertToPng = async (inp) => {
43795
43846
  return new Promise((resolve2, reject) => {
43796
43847
  if (typeof inp !== "string") {
@@ -43858,7 +43909,8 @@ var resizeAndConvertToPng = async (inp) => {
43858
43909
  });
43859
43910
  };
43860
43911
  var prepareImage = (inp, accessToken, boardId) => resizeAndConvertToPng(inp).then(({ width: width2, height: height2, dataURL, hash }) => {
43861
- return uploadToTheStorage(hash, dataURL, accessToken, boardId).then((src) => {
43912
+ const { blob } = getBlobFromDataURL(dataURL);
43913
+ return uploadMediaToStorage(hash, blob, accessToken, boardId, "image").then((src) => {
43862
43914
  return {
43863
43915
  imageDimension: { width: width2, height: height2 },
43864
43916
  base64: dataURL,
@@ -43929,7 +43981,7 @@ var prepareVideo = (file, accessToken, boardId) => {
43929
43981
  video.onseeked = null;
43930
43982
  prepareImage(captureFrame(0.1, video)?.src, accessToken, boardId).then((imageData) => {
43931
43983
  fileTosha256(file).then((hash) => {
43932
- uploadVideoToStorage(hash, file, accessToken, boardId).then((url) => {
43984
+ uploadMediaToStorage(hash, file, accessToken, boardId, "video").then((url) => {
43933
43985
  resolve2({
43934
43986
  url,
43935
43987
  previewUrl: imageData.storageLink
@@ -44230,37 +44282,13 @@ class AudioItem extends BaseItem {
44230
44282
  }
44231
44283
  }
44232
44284
  // src/Items/Audio/AudioHelpers.ts
44233
- var uploadAudioToStorage = async (hash, audioBlob, accessToken, boardId) => {
44234
- return new Promise((resolve2, reject) => {
44235
- fetch(`${window.location.origin}/api/v1/media/audio/${boardId}`, {
44236
- method: "POST",
44237
- headers: {
44238
- "Content-Type": audioBlob.type,
44239
- "x-audio-id": hash,
44240
- Authorization: `Bearer ${accessToken}`
44241
- },
44242
- body: audioBlob
44243
- }).then(async (response) => {
44244
- if (response.status !== 200) {
44245
- return conf.hooks.onUploadMediaError(response, "audio");
44246
- }
44247
- return response.json();
44248
- }).then((data) => {
44249
- console.log(data);
44250
- resolve2(data.src);
44251
- }).catch((error) => {
44252
- console.error("Media storage error:", error);
44253
- reject(error);
44254
- });
44255
- });
44256
- };
44257
44285
  var prepareAudio = (file, accessToken, boardId) => {
44258
44286
  return new Promise((resolve2, reject) => {
44259
44287
  const audio = document.createElement("audio");
44260
44288
  audio.src = URL.createObjectURL(file);
44261
44289
  audio.onloadedmetadata = () => {
44262
44290
  fileTosha256(file).then((hash) => {
44263
- uploadAudioToStorage(hash, file, accessToken, boardId).then((url) => {
44291
+ uploadMediaToStorage(hash, file, accessToken, boardId, "audio").then((url) => {
44264
44292
  resolve2(url);
44265
44293
  }).catch(reject);
44266
44294
  }).catch(() => {
@@ -41135,14 +41135,56 @@ async function fileTosha256(file) {
41135
41135
  return hashArray.map((byte) => byte.toString(16).padStart(2, "0")).join("");
41136
41136
  }
41137
41137
 
41138
+ // src/api/MediaHelpers.ts
41139
+ var uploadMediaToStorage = async (hash, blob, accessToken, boardId, type) => {
41140
+ try {
41141
+ const generateUrlResponse = await fetch(`${window.location.origin}/api/v1/media/generate-upload-url`, {
41142
+ method: "POST",
41143
+ headers: {
41144
+ "Content-Type": "application/json",
41145
+ Authorization: `Bearer ${accessToken}`
41146
+ },
41147
+ body: JSON.stringify({
41148
+ fileSize: blob.size,
41149
+ boardId,
41150
+ hash
41151
+ })
41152
+ });
41153
+ if (!generateUrlResponse.ok) {
41154
+ conf.hooks.onUploadMediaError(generateUrlResponse, type);
41155
+ throw new Error(`Failed to get presigned URL. Status: ${generateUrlResponse.status}`);
41156
+ }
41157
+ const data = await generateUrlResponse.json();
41158
+ if (data.mediaUrl) {
41159
+ console.log("Media already exists, skipping upload.");
41160
+ return data.mediaUrl;
41161
+ }
41162
+ const { uploadUrl, promisedMediaUrl } = data;
41163
+ if (!uploadUrl || !promisedMediaUrl) {
41164
+ throw new Error("Server did not provide an uploadUrl or promisedMediaUrl in the response.");
41165
+ }
41166
+ const uploadResponse = await fetch(uploadUrl, {
41167
+ method: "PUT",
41168
+ headers: {
41169
+ "Content-Type": blob.type
41170
+ },
41171
+ body: blob
41172
+ });
41173
+ if (!uploadResponse.ok) {
41174
+ console.error("Direct upload to storage failed:", uploadResponse.status, uploadResponse.statusText);
41175
+ throw new Error(`Direct upload to storage failed. Status: ${uploadResponse.status}`);
41176
+ }
41177
+ return promisedMediaUrl;
41178
+ } catch (error) {
41179
+ console.error("Media upload process error:", error);
41180
+ throw error;
41181
+ }
41182
+ };
41183
+
41138
41184
  // src/Items/Image/ImageHelpers.ts
41139
41185
  var uploadToTheStorage = async (hash, dataURL, accessToken, boardId) => {
41140
41186
  return new Promise((resolve2, reject) => {
41141
- const base64String = dataURL.split(",")[1];
41142
- const mimeType = dataURL.split(",")[0].split(":")[1].split(";")[0];
41143
- const binaryString = window.atob(base64String);
41144
- const bytes = Uint8Array.from(binaryString, (char) => char.charCodeAt(0));
41145
- const blob = new Blob([bytes], { type: mimeType });
41187
+ const { blob, mimeType } = getBlobFromDataURL(dataURL);
41146
41188
  fetch(`${window?.location.origin}/api/v1/media/image/${boardId}`, {
41147
41189
  method: "POST",
41148
41190
  headers: {
@@ -41164,6 +41206,14 @@ var uploadToTheStorage = async (hash, dataURL, accessToken, boardId) => {
41164
41206
  });
41165
41207
  });
41166
41208
  };
41209
+ var getBlobFromDataURL = (dataURL) => {
41210
+ const base64String = dataURL.split(",")[1];
41211
+ const mimeType = dataURL.split(",")[0].split(":")[1].split(";")[0];
41212
+ const binaryString = window.atob(base64String);
41213
+ const bytes = Uint8Array.from(binaryString, (char) => char.charCodeAt(0));
41214
+ const blob = new Blob([bytes], { type: mimeType });
41215
+ return { blob, base64String, mimeType };
41216
+ };
41167
41217
  var resizeAndConvertToPng = async (inp) => {
41168
41218
  return new Promise((resolve2, reject) => {
41169
41219
  if (typeof inp !== "string") {
@@ -41231,7 +41281,8 @@ var resizeAndConvertToPng = async (inp) => {
41231
41281
  });
41232
41282
  };
41233
41283
  var prepareImage = (inp, accessToken, boardId) => resizeAndConvertToPng(inp).then(({ width: width2, height: height2, dataURL, hash }) => {
41234
- return uploadToTheStorage(hash, dataURL, accessToken, boardId).then((src) => {
41284
+ const { blob } = getBlobFromDataURL(dataURL);
41285
+ return uploadMediaToStorage(hash, blob, accessToken, boardId, "image").then((src) => {
41235
41286
  return {
41236
41287
  imageDimension: { width: width2, height: height2 },
41237
41288
  base64: dataURL,
@@ -41302,7 +41353,7 @@ var prepareVideo = (file, accessToken, boardId) => {
41302
41353
  video.onseeked = null;
41303
41354
  prepareImage(captureFrame(0.1, video)?.src, accessToken, boardId).then((imageData) => {
41304
41355
  fileTosha256(file).then((hash) => {
41305
- uploadVideoToStorage(hash, file, accessToken, boardId).then((url) => {
41356
+ uploadMediaToStorage(hash, file, accessToken, boardId, "video").then((url) => {
41306
41357
  resolve2({
41307
41358
  url,
41308
41359
  previewUrl: imageData.storageLink
@@ -41603,37 +41654,13 @@ class AudioItem extends BaseItem {
41603
41654
  }
41604
41655
  }
41605
41656
  // src/Items/Audio/AudioHelpers.ts
41606
- var uploadAudioToStorage = async (hash, audioBlob, accessToken, boardId) => {
41607
- return new Promise((resolve2, reject) => {
41608
- fetch(`${window.location.origin}/api/v1/media/audio/${boardId}`, {
41609
- method: "POST",
41610
- headers: {
41611
- "Content-Type": audioBlob.type,
41612
- "x-audio-id": hash,
41613
- Authorization: `Bearer ${accessToken}`
41614
- },
41615
- body: audioBlob
41616
- }).then(async (response) => {
41617
- if (response.status !== 200) {
41618
- return conf.hooks.onUploadMediaError(response, "audio");
41619
- }
41620
- return response.json();
41621
- }).then((data) => {
41622
- console.log(data);
41623
- resolve2(data.src);
41624
- }).catch((error) => {
41625
- console.error("Media storage error:", error);
41626
- reject(error);
41627
- });
41628
- });
41629
- };
41630
41657
  var prepareAudio = (file, accessToken, boardId) => {
41631
41658
  return new Promise((resolve2, reject) => {
41632
41659
  const audio = document.createElement("audio");
41633
41660
  audio.src = URL.createObjectURL(file);
41634
41661
  audio.onloadedmetadata = () => {
41635
41662
  fileTosha256(file).then((hash) => {
41636
- uploadAudioToStorage(hash, file, accessToken, boardId).then((url) => {
41663
+ uploadMediaToStorage(hash, file, accessToken, boardId, "audio").then((url) => {
41637
41664
  resolve2(url);
41638
41665
  }).catch(reject);
41639
41666
  }).catch(() => {
@@ -57068,6 +57095,7 @@ export {
57068
57095
  getPlaceholderImage,
57069
57096
  getHotkeyLabel,
57070
57097
  getControlPointData,
57098
+ getBlobFromDataURL,
57071
57099
  forceNumberIntoInterval,
57072
57100
  fileTosha256,
57073
57101
  exportBoardSnapshot,
package/dist/esm/index.js CHANGED
@@ -41128,14 +41128,56 @@ async function fileTosha256(file) {
41128
41128
  return hashArray.map((byte) => byte.toString(16).padStart(2, "0")).join("");
41129
41129
  }
41130
41130
 
41131
+ // src/api/MediaHelpers.ts
41132
+ var uploadMediaToStorage = async (hash, blob, accessToken, boardId, type) => {
41133
+ try {
41134
+ const generateUrlResponse = await fetch(`${window.location.origin}/api/v1/media/generate-upload-url`, {
41135
+ method: "POST",
41136
+ headers: {
41137
+ "Content-Type": "application/json",
41138
+ Authorization: `Bearer ${accessToken}`
41139
+ },
41140
+ body: JSON.stringify({
41141
+ fileSize: blob.size,
41142
+ boardId,
41143
+ hash
41144
+ })
41145
+ });
41146
+ if (!generateUrlResponse.ok) {
41147
+ conf.hooks.onUploadMediaError(generateUrlResponse, type);
41148
+ throw new Error(`Failed to get presigned URL. Status: ${generateUrlResponse.status}`);
41149
+ }
41150
+ const data = await generateUrlResponse.json();
41151
+ if (data.mediaUrl) {
41152
+ console.log("Media already exists, skipping upload.");
41153
+ return data.mediaUrl;
41154
+ }
41155
+ const { uploadUrl, promisedMediaUrl } = data;
41156
+ if (!uploadUrl || !promisedMediaUrl) {
41157
+ throw new Error("Server did not provide an uploadUrl or promisedMediaUrl in the response.");
41158
+ }
41159
+ const uploadResponse = await fetch(uploadUrl, {
41160
+ method: "PUT",
41161
+ headers: {
41162
+ "Content-Type": blob.type
41163
+ },
41164
+ body: blob
41165
+ });
41166
+ if (!uploadResponse.ok) {
41167
+ console.error("Direct upload to storage failed:", uploadResponse.status, uploadResponse.statusText);
41168
+ throw new Error(`Direct upload to storage failed. Status: ${uploadResponse.status}`);
41169
+ }
41170
+ return promisedMediaUrl;
41171
+ } catch (error) {
41172
+ console.error("Media upload process error:", error);
41173
+ throw error;
41174
+ }
41175
+ };
41176
+
41131
41177
  // src/Items/Image/ImageHelpers.ts
41132
41178
  var uploadToTheStorage = async (hash, dataURL, accessToken, boardId) => {
41133
41179
  return new Promise((resolve2, reject) => {
41134
- const base64String = dataURL.split(",")[1];
41135
- const mimeType = dataURL.split(",")[0].split(":")[1].split(";")[0];
41136
- const binaryString = window.atob(base64String);
41137
- const bytes = Uint8Array.from(binaryString, (char) => char.charCodeAt(0));
41138
- const blob = new Blob([bytes], { type: mimeType });
41180
+ const { blob, mimeType } = getBlobFromDataURL(dataURL);
41139
41181
  fetch(`${window?.location.origin}/api/v1/media/image/${boardId}`, {
41140
41182
  method: "POST",
41141
41183
  headers: {
@@ -41157,6 +41199,14 @@ var uploadToTheStorage = async (hash, dataURL, accessToken, boardId) => {
41157
41199
  });
41158
41200
  });
41159
41201
  };
41202
+ var getBlobFromDataURL = (dataURL) => {
41203
+ const base64String = dataURL.split(",")[1];
41204
+ const mimeType = dataURL.split(",")[0].split(":")[1].split(";")[0];
41205
+ const binaryString = window.atob(base64String);
41206
+ const bytes = Uint8Array.from(binaryString, (char) => char.charCodeAt(0));
41207
+ const blob = new Blob([bytes], { type: mimeType });
41208
+ return { blob, base64String, mimeType };
41209
+ };
41160
41210
  var resizeAndConvertToPng = async (inp) => {
41161
41211
  return new Promise((resolve2, reject) => {
41162
41212
  if (typeof inp !== "string") {
@@ -41224,7 +41274,8 @@ var resizeAndConvertToPng = async (inp) => {
41224
41274
  });
41225
41275
  };
41226
41276
  var prepareImage = (inp, accessToken, boardId) => resizeAndConvertToPng(inp).then(({ width: width2, height: height2, dataURL, hash }) => {
41227
- return uploadToTheStorage(hash, dataURL, accessToken, boardId).then((src) => {
41277
+ const { blob } = getBlobFromDataURL(dataURL);
41278
+ return uploadMediaToStorage(hash, blob, accessToken, boardId, "image").then((src) => {
41228
41279
  return {
41229
41280
  imageDimension: { width: width2, height: height2 },
41230
41281
  base64: dataURL,
@@ -41295,7 +41346,7 @@ var prepareVideo = (file, accessToken, boardId) => {
41295
41346
  video.onseeked = null;
41296
41347
  prepareImage(captureFrame(0.1, video)?.src, accessToken, boardId).then((imageData) => {
41297
41348
  fileTosha256(file).then((hash) => {
41298
- uploadVideoToStorage(hash, file, accessToken, boardId).then((url) => {
41349
+ uploadMediaToStorage(hash, file, accessToken, boardId, "video").then((url) => {
41299
41350
  resolve2({
41300
41351
  url,
41301
41352
  previewUrl: imageData.storageLink
@@ -41596,37 +41647,13 @@ class AudioItem extends BaseItem {
41596
41647
  }
41597
41648
  }
41598
41649
  // src/Items/Audio/AudioHelpers.ts
41599
- var uploadAudioToStorage = async (hash, audioBlob, accessToken, boardId) => {
41600
- return new Promise((resolve2, reject) => {
41601
- fetch(`${window.location.origin}/api/v1/media/audio/${boardId}`, {
41602
- method: "POST",
41603
- headers: {
41604
- "Content-Type": audioBlob.type,
41605
- "x-audio-id": hash,
41606
- Authorization: `Bearer ${accessToken}`
41607
- },
41608
- body: audioBlob
41609
- }).then(async (response) => {
41610
- if (response.status !== 200) {
41611
- return conf.hooks.onUploadMediaError(response, "audio");
41612
- }
41613
- return response.json();
41614
- }).then((data) => {
41615
- console.log(data);
41616
- resolve2(data.src);
41617
- }).catch((error) => {
41618
- console.error("Media storage error:", error);
41619
- reject(error);
41620
- });
41621
- });
41622
- };
41623
41650
  var prepareAudio = (file, accessToken, boardId) => {
41624
41651
  return new Promise((resolve2, reject) => {
41625
41652
  const audio = document.createElement("audio");
41626
41653
  audio.src = URL.createObjectURL(file);
41627
41654
  audio.onloadedmetadata = () => {
41628
41655
  fileTosha256(file).then((hash) => {
41629
- uploadAudioToStorage(hash, file, accessToken, boardId).then((url) => {
41656
+ uploadMediaToStorage(hash, file, accessToken, boardId, "audio").then((url) => {
41630
41657
  resolve2(url);
41631
41658
  }).catch(reject);
41632
41659
  }).catch(() => {
@@ -56966,6 +56993,7 @@ export {
56966
56993
  getPlaceholderImage,
56967
56994
  getHotkeyLabel,
56968
56995
  getControlPointData,
56996
+ getBlobFromDataURL,
56969
56997
  forceNumberIntoInterval,
56970
56998
  fileTosha256,
56971
56999
  exportBoardSnapshot,
package/dist/esm/node.js CHANGED
@@ -43596,14 +43596,56 @@ async function fileTosha256(file) {
43596
43596
  return hashArray.map((byte) => byte.toString(16).padStart(2, "0")).join("");
43597
43597
  }
43598
43598
 
43599
+ // src/api/MediaHelpers.ts
43600
+ var uploadMediaToStorage = async (hash, blob, accessToken, boardId, type) => {
43601
+ try {
43602
+ const generateUrlResponse = await fetch(`${window.location.origin}/api/v1/media/generate-upload-url`, {
43603
+ method: "POST",
43604
+ headers: {
43605
+ "Content-Type": "application/json",
43606
+ Authorization: `Bearer ${accessToken}`
43607
+ },
43608
+ body: JSON.stringify({
43609
+ fileSize: blob.size,
43610
+ boardId,
43611
+ hash
43612
+ })
43613
+ });
43614
+ if (!generateUrlResponse.ok) {
43615
+ conf.hooks.onUploadMediaError(generateUrlResponse, type);
43616
+ throw new Error(`Failed to get presigned URL. Status: ${generateUrlResponse.status}`);
43617
+ }
43618
+ const data = await generateUrlResponse.json();
43619
+ if (data.mediaUrl) {
43620
+ console.log("Media already exists, skipping upload.");
43621
+ return data.mediaUrl;
43622
+ }
43623
+ const { uploadUrl, promisedMediaUrl } = data;
43624
+ if (!uploadUrl || !promisedMediaUrl) {
43625
+ throw new Error("Server did not provide an uploadUrl or promisedMediaUrl in the response.");
43626
+ }
43627
+ const uploadResponse = await fetch(uploadUrl, {
43628
+ method: "PUT",
43629
+ headers: {
43630
+ "Content-Type": blob.type
43631
+ },
43632
+ body: blob
43633
+ });
43634
+ if (!uploadResponse.ok) {
43635
+ console.error("Direct upload to storage failed:", uploadResponse.status, uploadResponse.statusText);
43636
+ throw new Error(`Direct upload to storage failed. Status: ${uploadResponse.status}`);
43637
+ }
43638
+ return promisedMediaUrl;
43639
+ } catch (error) {
43640
+ console.error("Media upload process error:", error);
43641
+ throw error;
43642
+ }
43643
+ };
43644
+
43599
43645
  // src/Items/Image/ImageHelpers.ts
43600
43646
  var uploadToTheStorage = async (hash, dataURL, accessToken, boardId) => {
43601
43647
  return new Promise((resolve2, reject) => {
43602
- const base64String = dataURL.split(",")[1];
43603
- const mimeType = dataURL.split(",")[0].split(":")[1].split(";")[0];
43604
- const binaryString = window.atob(base64String);
43605
- const bytes = Uint8Array.from(binaryString, (char) => char.charCodeAt(0));
43606
- const blob = new Blob([bytes], { type: mimeType });
43648
+ const { blob, mimeType } = getBlobFromDataURL(dataURL);
43607
43649
  fetch(`${window?.location.origin}/api/v1/media/image/${boardId}`, {
43608
43650
  method: "POST",
43609
43651
  headers: {
@@ -43625,6 +43667,14 @@ var uploadToTheStorage = async (hash, dataURL, accessToken, boardId) => {
43625
43667
  });
43626
43668
  });
43627
43669
  };
43670
+ var getBlobFromDataURL = (dataURL) => {
43671
+ const base64String = dataURL.split(",")[1];
43672
+ const mimeType = dataURL.split(",")[0].split(":")[1].split(";")[0];
43673
+ const binaryString = window.atob(base64String);
43674
+ const bytes = Uint8Array.from(binaryString, (char) => char.charCodeAt(0));
43675
+ const blob = new Blob([bytes], { type: mimeType });
43676
+ return { blob, base64String, mimeType };
43677
+ };
43628
43678
  var resizeAndConvertToPng = async (inp) => {
43629
43679
  return new Promise((resolve2, reject) => {
43630
43680
  if (typeof inp !== "string") {
@@ -43692,7 +43742,8 @@ var resizeAndConvertToPng = async (inp) => {
43692
43742
  });
43693
43743
  };
43694
43744
  var prepareImage = (inp, accessToken, boardId) => resizeAndConvertToPng(inp).then(({ width: width2, height: height2, dataURL, hash }) => {
43695
- return uploadToTheStorage(hash, dataURL, accessToken, boardId).then((src) => {
43745
+ const { blob } = getBlobFromDataURL(dataURL);
43746
+ return uploadMediaToStorage(hash, blob, accessToken, boardId, "image").then((src) => {
43696
43747
  return {
43697
43748
  imageDimension: { width: width2, height: height2 },
43698
43749
  base64: dataURL,
@@ -43763,7 +43814,7 @@ var prepareVideo = (file, accessToken, boardId) => {
43763
43814
  video.onseeked = null;
43764
43815
  prepareImage(captureFrame(0.1, video)?.src, accessToken, boardId).then((imageData) => {
43765
43816
  fileTosha256(file).then((hash) => {
43766
- uploadVideoToStorage(hash, file, accessToken, boardId).then((url) => {
43817
+ uploadMediaToStorage(hash, file, accessToken, boardId, "video").then((url) => {
43767
43818
  resolve2({
43768
43819
  url,
43769
43820
  previewUrl: imageData.storageLink
@@ -44064,37 +44115,13 @@ class AudioItem extends BaseItem {
44064
44115
  }
44065
44116
  }
44066
44117
  // src/Items/Audio/AudioHelpers.ts
44067
- var uploadAudioToStorage = async (hash, audioBlob, accessToken, boardId) => {
44068
- return new Promise((resolve2, reject) => {
44069
- fetch(`${window.location.origin}/api/v1/media/audio/${boardId}`, {
44070
- method: "POST",
44071
- headers: {
44072
- "Content-Type": audioBlob.type,
44073
- "x-audio-id": hash,
44074
- Authorization: `Bearer ${accessToken}`
44075
- },
44076
- body: audioBlob
44077
- }).then(async (response) => {
44078
- if (response.status !== 200) {
44079
- return conf.hooks.onUploadMediaError(response, "audio");
44080
- }
44081
- return response.json();
44082
- }).then((data) => {
44083
- console.log(data);
44084
- resolve2(data.src);
44085
- }).catch((error) => {
44086
- console.error("Media storage error:", error);
44087
- reject(error);
44088
- });
44089
- });
44090
- };
44091
44118
  var prepareAudio = (file, accessToken, boardId) => {
44092
44119
  return new Promise((resolve2, reject) => {
44093
44120
  const audio = document.createElement("audio");
44094
44121
  audio.src = URL.createObjectURL(file);
44095
44122
  audio.onloadedmetadata = () => {
44096
44123
  fileTosha256(file).then((hash) => {
44097
- uploadAudioToStorage(hash, file, accessToken, boardId).then((url) => {
44124
+ uploadMediaToStorage(hash, file, accessToken, boardId, "audio").then((url) => {
44098
44125
  resolve2(url);
44099
44126
  }).catch(reject);
44100
44127
  }).catch(() => {
@@ -59601,6 +59628,7 @@ export {
59601
59628
  getPlaceholderImage,
59602
59629
  getHotkeyLabel,
59603
59630
  getControlPointData,
59631
+ getBlobFromDataURL,
59604
59632
  forceNumberIntoInterval,
59605
59633
  fileTosha256,
59606
59634
  exportBoardSnapshot,
@@ -1,5 +1,10 @@
1
1
  import { ImageConstructorData } from './Image';
2
2
  export declare const uploadToTheStorage: (hash: string, dataURL: string, accessToken: string | null, boardId: string) => Promise<string>;
3
+ export declare const getBlobFromDataURL: (dataURL: string) => {
4
+ blob: Blob;
5
+ base64String: string;
6
+ mimeType: string;
7
+ };
3
8
  export declare const resizeAndConvertToPng: (inp: string | ArrayBuffer | null | undefined) => Promise<{
4
9
  dataURL: string;
5
10
  width: number;
@@ -0,0 +1 @@
1
+ export declare const uploadMediaToStorage: (hash: string, blob: Blob, accessToken: string | null, boardId: string, type: "video" | "audio" | "image") => Promise<string>;
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "microboard-temp",
3
- "version": "0.5.68",
3
+ "version": "0.5.70",
4
4
  "description": "A flexible interactive whiteboard library",
5
5
  "main": "dist/cjs/index.js",
6
6
  "module": "dist/esm/index.js",