mirror of
https://github.com/Qortal/Qortal-Hub.git
synced 2025-06-15 04:21:21 +00:00
67 lines
1.4 KiB
TypeScript
67 lines
1.4 KiB
TypeScript
// @ts-nocheck
|
|
|
|
class Semaphore {
|
|
constructor(count) {
|
|
this.count = count
|
|
this.waiting = []
|
|
}
|
|
acquire() {
|
|
return new Promise(resolve => {
|
|
if (this.count > 0) {
|
|
this.count--
|
|
resolve()
|
|
} else {
|
|
this.waiting.push(resolve)
|
|
}
|
|
})
|
|
}
|
|
release() {
|
|
if (this.waiting.length > 0) {
|
|
const resolve = this.waiting.shift()
|
|
resolve()
|
|
} else {
|
|
this.count++
|
|
}
|
|
}
|
|
}
|
|
|
|
let semaphore = new Semaphore(1)
|
|
let reader = new FileReader()
|
|
|
|
export const fileToBase64 = (file) => new Promise(async (resolve, reject) => {
|
|
if (!reader) {
|
|
reader = new FileReader()
|
|
}
|
|
await semaphore.acquire()
|
|
reader.readAsDataURL(file)
|
|
reader.onload = () => {
|
|
const dataUrl = reader.result
|
|
if (typeof dataUrl === "string") {
|
|
const base64String = dataUrl.split(',')[1]
|
|
reader.onload = null
|
|
reader.onerror = null
|
|
resolve(base64String)
|
|
} else {
|
|
reader.onload = null
|
|
reader.onerror = null
|
|
reject(new Error('Invalid data URL'))
|
|
}
|
|
semaphore.release()
|
|
}
|
|
reader.onerror = (error) => {
|
|
reader.onload = null
|
|
reader.onerror = null
|
|
reject(error)
|
|
semaphore.release()
|
|
}
|
|
})
|
|
|
|
export const base64ToBlobUrl = (base64, mimeType = "image/png") => {
|
|
const binary = atob(base64);
|
|
const array = [];
|
|
for (let i = 0; i < binary.length; i++) {
|
|
array.push(binary.charCodeAt(i));
|
|
}
|
|
const blob = new Blob([new Uint8Array(array)], { type: mimeType });
|
|
return URL.createObjectURL(blob);
|
|
}; |