Browse Source

add publish-data function

q-apps
Phillip 2 years ago
parent
commit
48af282ba0
  1. 34
      qortal-ui-plugins/plugins/core/qdn/browser/browser.src.js
  2. 92
      qortal-ui-plugins/plugins/core/qdn/browser/computePowWorkerFile.src.js
  3. 18
      qortal-ui-plugins/plugins/utils/publish-image.js

34
qortal-ui-plugins/plugins/core/qdn/browser/browser.src.js

@ -9,6 +9,8 @@ registerTranslateConfig({
import '@material/mwc-button'
import '@material/mwc-icon'
import WebWorker from 'web-worker:./computePowWorkerFile.src.js';
import {publishData} from '../../../utils/publish-image.js';
const parentEpml = new Epml({ type: 'WINDOW', source: window.parent })
@ -277,12 +279,42 @@ class WebBrowser extends LitElement {
case actions.PUBLISH_QDN_RESOURCE:
// Use "default" if user hasn't specified an identifer
const service = data.service
const name = data.name
let identifier = data.identifier
const data64 = data.data64
if(!service || !name || !data64){
return
}
if (data.identifier == null) {
data.identifier = "default";
identifier = "default";
}
console.log('hello')
const result = await showModalAndWait(actions.PUBLISH_QDN_RESOURCE);
console.log({result})
if (result.action === 'accept') {
const worker = new WebWorker();
console.log({worker})
try {
await publishData({
registeredName: name,
file: data64,
service: service,
identifier: identifier,
parentEpml,
uploadType: 'file',
selectedAddress: this.selectedAddress,
worker: worker,
isBase64: true,
});
worker.terminate();
} catch (error) {
worker.terminate();
return
}
console.log('User accepted:', result.userData);
} else if (result.action === 'reject') {
console.log('User rejected');

92
qortal-ui-plugins/plugins/core/qdn/browser/computePowWorkerFile.src.js

@ -0,0 +1,92 @@
import { Sha256 } from 'asmcrypto.js'
function sbrk(size, heap){
let brk = 512 * 1024 // stack top
let old = brk
brk += size
if (brk > heap.length)
throw new Error('heap exhausted')
return old
}
self.addEventListener('message', async e => {
const response = await computePow(e.data.convertedBytes, e.data.path)
postMessage(response)
})
const memory = new WebAssembly.Memory({ initial: 256, maximum: 256 })
const heap = new Uint8Array(memory.buffer)
const computePow = async (convertedBytes, path) => {
let response = null
await new Promise((resolve, reject)=> {
const _convertedBytesArray = Object.keys(convertedBytes).map(
function (key) {
return convertedBytes[key]
}
)
const convertedBytesArray = new Uint8Array(_convertedBytesArray)
const convertedBytesHash = new Sha256()
.process(convertedBytesArray)
.finish().result
const hashPtr = sbrk(32, heap)
const hashAry = new Uint8Array(
memory.buffer,
hashPtr,
32
)
hashAry.set(convertedBytesHash)
const difficulty = 14
const workBufferLength = 8 * 1024 * 1024
const workBufferPtr = sbrk(
workBufferLength,
heap
)
const importObject = {
env: {
memory: memory
},
};
function loadWebAssembly(filename, imports) {
return fetch(filename)
.then(response => response.arrayBuffer())
.then(buffer => WebAssembly.compile(buffer))
.then(module => {
return new WebAssembly.Instance(module, importObject);
});
}
loadWebAssembly(path)
.then(wasmModule => {
response = {
nonce : wasmModule.exports.compute2(hashPtr, workBufferPtr, workBufferLength, difficulty),
}
resolve()
});
})
return response
}

18
qortal-ui-plugins/plugins/utils/publish-image.js

@ -16,7 +16,9 @@ export const publishData = async ({
parentEpml,
uploadType,
selectedAddress,
worker
worker,
isBase64,
metaData
}) => {
const validateName = async (receiverName) => {
let nameRes = await parentEpml.request("apiCall", {
@ -115,16 +117,26 @@ export const publishData = async ({
}
// Base64 encode the file to work around compatibility issues between javascript and java byte arrays
if(isBase64){
postBody = file
}
if(!isBase64){
let fileBuffer = new Uint8Array(await file.arrayBuffer())
postBody = Buffer.from(fileBuffer).toString("base64")
}
}
let uploadDataUrl = `/arbitrary/${service}/${registeredName}${urlSuffix}?apiKey=${getApiKey()}`
if (identifier != null && identifier.trim().length > 0) {
uploadDataUrl = `/arbitrary/${service}/${registeredName}/${identifier}${urlSuffix}?apiKey=${getApiKey()}`
if(metaData){
uploadDataUrl = `/arbitrary/${service}/${registeredName}/${identifier}${urlSuffix}?${metaData}&apiKey=${getApiKey()}`
}
}
let uploadDataRes = await parentEpml.request("apiCall", {
type: "api",
method: "POST",

Loading…
Cancel
Save