review changes move file size limit to conig fix posts not showing up on desktop force type=file if livestream disabled livestream replay upload styling form error on no replay selected fix check livestreams results redirect? Update live stream FAQ
104 lines
3.3 KiB
JavaScript
104 lines
3.3 KiB
JavaScript
// @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.
|
|
*/
|
|
import { X_LBRY_AUTH_TOKEN } from '../../ui/constants/token';
|
|
import { doUpdateUploadProgress } from 'lbryinc';
|
|
|
|
// A modified version of Lbry.apiCall that allows
|
|
// to perform calling methods at arbitrary urls
|
|
// and pass form file fields
|
|
export default function apiPublishCallViaWeb(
|
|
apiCall: (any, any, any, any) => any,
|
|
connectionString: string,
|
|
token: string,
|
|
method: string,
|
|
params: { file_path: string, preview: boolean, remote_url?: string }, // new param for remoteUrl
|
|
resolve: Function,
|
|
reject: Function
|
|
) {
|
|
const { file_path: filePath, preview, remote_url: remoteUrl } = params;
|
|
|
|
if (!filePath && !remoteUrl) {
|
|
return apiCall(method, params, resolve, reject);
|
|
}
|
|
|
|
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' });
|
|
}
|
|
|
|
// Putting a dummy value here, the server is going to process the POSTed file
|
|
// and set the file_path itself
|
|
|
|
const body = new FormData();
|
|
if (fileField) {
|
|
body.append('file', fileField);
|
|
params.file_path = '__POST_FILE__';
|
|
delete params['remote_url'];
|
|
} else if (remoteUrl) {
|
|
body.append('remote_url', remoteUrl);
|
|
delete params['remote_url'];
|
|
}
|
|
|
|
const jsonPayload = JSON.stringify({
|
|
jsonrpc: '2.0',
|
|
method,
|
|
params,
|
|
id: counter,
|
|
});
|
|
// no fileData? do the livestream remote publish
|
|
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));
|
|
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.'));
|
|
}
|
|
}
|
|
|
|
if (error) {
|
|
return Promise.reject(error);
|
|
}
|
|
})
|
|
.catch(reject);
|
|
}
|