forked from Qortal/qortal-ui
You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
143 lines
3.8 KiB
143 lines
3.8 KiB
const getApiKey = () => { |
|
const myNode = |
|
window.parent.reduxStore.getState().app.nodeConfig.knownNodes[ |
|
window.parent.reduxStore.getState().app.nodeConfig.node |
|
] |
|
let apiKey = myNode.apiKey |
|
return apiKey |
|
} |
|
|
|
export const publishData = async ({ |
|
registeredName, |
|
path, |
|
file, |
|
service, |
|
identifier, |
|
parentEpml, |
|
uploadType, |
|
selectedAddress, |
|
worker |
|
}) => { |
|
const validateName = async (receiverName) => { |
|
let nameRes = await parentEpml.request("apiCall", { |
|
type: "api", |
|
url: `/names/${receiverName}`, |
|
}) |
|
|
|
return nameRes |
|
} |
|
|
|
const convertBytesForSigning = async (transactionBytesBase58) => { |
|
let convertedBytes = await parentEpml.request("apiCall", { |
|
type: "api", |
|
method: "POST", |
|
url: `/transactions/convert`, |
|
body: `${transactionBytesBase58}`, |
|
}) |
|
return convertedBytes |
|
} |
|
|
|
const signAndProcess = async (transactionBytesBase58) => { |
|
let convertedBytesBase58 = await convertBytesForSigning( |
|
transactionBytesBase58 |
|
) |
|
if (convertedBytesBase58.error) { |
|
return |
|
} |
|
|
|
const convertedBytes = |
|
window.parent.Base58.decode(convertedBytesBase58) |
|
let nonce = null |
|
const computPath =window.parent.location.origin + '/memory-pow/memory-pow.wasm.full' |
|
await new Promise((res, rej) => { |
|
|
|
worker.postMessage({convertedBytes, path: computPath}); |
|
|
|
worker.onmessage = e => { |
|
|
|
worker.terminate() |
|
|
|
nonce = e.data.nonce |
|
res() |
|
|
|
} |
|
}) |
|
|
|
|
|
let response = await parentEpml.request("sign_arbitrary", { |
|
nonce: selectedAddress.nonce, |
|
arbitraryBytesBase58: transactionBytesBase58, |
|
arbitraryBytesForSigningBase58: convertedBytesBase58, |
|
arbitraryNonce: nonce, |
|
}) |
|
let myResponse = { error: "" } |
|
if (response === false) { |
|
return |
|
} else { |
|
myResponse = response |
|
} |
|
|
|
return myResponse |
|
} |
|
|
|
const validate = async () => { |
|
let validNameRes = await validateName(registeredName) |
|
if (validNameRes.error) { |
|
return |
|
} |
|
let transactionBytes = await uploadData(registeredName, path, file) |
|
if (transactionBytes.error) { |
|
return |
|
} else if ( |
|
transactionBytes.includes("Error 500 Internal Server Error") |
|
) { |
|
return |
|
} |
|
|
|
let signAndProcessRes = await signAndProcess(transactionBytes) |
|
if (signAndProcessRes.error) { |
|
return |
|
} |
|
} |
|
|
|
const uploadData = async (registeredName, path, file) => { |
|
if (identifier != null && identifier.trim().length > 0) { |
|
let postBody = path |
|
let urlSuffix = "" |
|
if (file != null) { |
|
// If we're sending zipped data, make sure to use the /zip version of the POST /arbitrary/* API |
|
if (uploadType === "zip") { |
|
urlSuffix = "/zip" |
|
} |
|
// If we're sending file data, use the /base64 version of the POST /arbitrary/* API |
|
else if (uploadType === "file") { |
|
urlSuffix = "/base64" |
|
} |
|
|
|
// Base64 encode the file to work around compatibility issues between javascript and java byte arrays |
|
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()}` |
|
} |
|
let uploadDataRes = await parentEpml.request("apiCall", { |
|
type: "api", |
|
method: "POST", |
|
url: `${uploadDataUrl}`, |
|
body: `${postBody}`, |
|
}) |
|
return uploadDataRes |
|
} |
|
} |
|
try { |
|
await validate() |
|
} catch (error) { |
|
throw new Error(error.message) |
|
} |
|
|
|
}
|
|
|