lbry-desktop/web/setup/publish.js

97 lines
3 KiB
JavaScript
Raw Permalink Normal View History

2019-02-22 06:01:59 +01:00
// @flow
/*
https://api.lbry.tv/api/v1/proxy currently expects publish to consist
of a multipart/form-data POST request with:
- 'file' binary
- 'json_payload' collection of publish params to be passed to the server's sdk.
*/
2019-11-07 20:39:22 +01:00
import { X_LBRY_AUTH_TOKEN } from '../../ui/constants/token';
import { doUpdateUploadProgress } from 'lbryinc';
2019-02-22 06:01:59 +01:00
// A modified version of Lbry.apiCall that allows
// to perform calling methods at arbitrary urls
// and pass form file fields
2019-09-30 22:11:45 +02:00
export default function apiPublishCallViaWeb(
2020-04-21 07:41:01 +02:00
apiCall: (any, any, any, any) => any,
2019-02-22 06:01:59 +01:00
connectionString: string,
2019-09-30 22:11:45 +02:00
token: string,
2019-02-22 06:01:59 +01:00
method: string,
params: { file_path: string, preview: boolean },
2019-02-22 06:01:59 +01:00
resolve: Function,
reject: Function
) {
const { file_path: filePath, preview } = params;
2019-11-04 16:16:56 +01:00
if (!filePath) {
return apiCall(method, params, resolve, reject);
}
2019-02-22 06:01:59 +01:00
const counter = new Date().getTime();
let fileField = filePath;
if (preview) {
// Send dummy file for the preview. The tx-fee calculation does not depend on it.
const dummyContent = 'x';
fileField = new File([dummyContent], 'dummy.md', { type: 'text/markdown' });
}
2019-11-04 16:16:56 +01:00
2019-02-22 06:01:59 +01:00
// Putting a dummy value here, the server is going to process the POSTed file
// and set the file_path itself
params.file_path = '__POST_FILE__';
2019-11-04 16:16:56 +01:00
2019-02-22 06:01:59 +01:00
const jsonPayload = JSON.stringify({
jsonrpc: '2.0',
method,
params,
id: counter,
});
const body = new FormData();
body.append('file', fileField);
body.append('json_payload', jsonPayload);
function makeRequest(connectionString, method, token, body, params) {
return new Promise((resolve, reject) => {
let xhr = new XMLHttpRequest();
xhr.open(method, connectionString);
xhr.setRequestHeader(X_LBRY_AUTH_TOKEN, token);
xhr.responseType = 'json';
xhr.upload.onprogress = e => {
let percentComplete = Math.ceil((e.loaded / e.total) * 100);
window.store.dispatch(doUpdateUploadProgress(percentComplete, params, xhr));
};
xhr.onload = () => {
window.store.dispatch(doUpdateUploadProgress(undefined, params));
resolve(xhr);
};
xhr.onerror = () => {
window.store.dispatch(doUpdateUploadProgress(undefined, params));
2021-01-08 22:38:01 +01:00
reject(new Error(__('There was a problem with your upload. Please try again.')));
};
xhr.onabort = () => {
window.store.dispatch(doUpdateUploadProgress(undefined, params));
};
xhr.send(body);
});
}
return makeRequest(connectionString, 'POST', token, body, params)
.then(xhr => {
let error;
if (xhr && xhr.response) {
if (xhr.status >= 200 && xhr.status < 300 && !xhr.response.error) {
return resolve(xhr.response.result);
} else if (xhr.response.error) {
error = new Error(xhr.response.error.message);
} else {
error = new Error(__('Upload likely timed out. Try a smaller file while we work on this.'));
}
}
2019-02-22 06:01:59 +01:00
if (error) {
return Promise.reject(error);
2019-02-22 06:01:59 +01:00
}
})
.catch(reject);
}