1
0
mirror of https://github.com/laurent22/joplin.git synced 2025-04-20 11:28:40 +02:00
joplin/ReactNativeClient/lib/shim-init-react.js

122 lines
3.8 KiB
JavaScript
Raw Normal View History

2018-03-09 17:49:35 +00:00
const { shim } = require("lib/shim.js");
const { GeolocationReact } = require("lib/geolocation-react.js");
const { PoorManIntervals } = require("lib/poor-man-intervals.js");
const RNFetchBlob = require("react-native-fetch-blob").default;
const { generateSecureRandom } = require("react-native-securerandom");
const FsDriverRN = require("lib/fs-driver-rn.js").FsDriverRN;
const urlValidator = require("valid-url");
const { Buffer } = require("buffer");
2017-07-10 18:09:58 +00:00
function shimInit() {
shim.Geolocation = GeolocationReact;
2017-10-18 23:13:53 +01:00
shim.setInterval = PoorManIntervals.setInterval;
shim.clearInterval = PoorManIntervals.clearInterval;
2018-03-09 17:49:35 +00:00
shim.sjclModule = require("lib/vendor/sjcl-rn.js");
2017-10-18 23:13:53 +01:00
shim.fsDriver = () => {
if (!shim.fsDriver_) shim.fsDriver_ = new FsDriverRN();
return shim.fsDriver_;
2018-03-09 17:49:35 +00:00
};
2018-03-09 17:49:35 +00:00
shim.randomBytes = async count => {
const randomBytes = await generateSecureRandom(count);
let temp = [];
for (let n in randomBytes) {
if (!randomBytes.hasOwnProperty(n)) continue;
temp.push(randomBytes[n]);
}
return temp;
2018-03-09 17:49:35 +00:00
};
shim.fetch = async function(url, options = null) {
// The native fetch() throws an uncatable error that crashes the app if calling it with an
// invalid URL such as '//.resource' or "http://ocloud. de" so detect if the URL is valid beforehand
// and throw a catchable error.
// Bug: https://github.com/facebook/react-native/issues/7436
const validatedUrl = urlValidator.isUri(url);
2018-03-09 17:49:35 +00:00
if (!validatedUrl) throw new Error("Not a valid URL: " + url);
return shim.fetchWithRetry(() => {
return fetch(validatedUrl, options);
}, options);
2018-03-09 17:49:35 +00:00
};
2017-07-10 18:09:58 +00:00
shim.fetchBlob = async function(url, options) {
2018-03-09 17:49:35 +00:00
if (!options || !options.path) throw new Error("fetchBlob: target file path is missing");
2017-07-10 18:09:58 +00:00
let headers = options.headers ? options.headers : {};
2018-03-09 17:49:35 +00:00
let method = options.method ? options.method : "GET";
const overwrite = "overwrite" in options ? options.overwrite : true;
2017-07-10 18:09:58 +00:00
let dirs = RNFetchBlob.fs.dirs;
let localFilePath = options.path;
2018-03-09 17:49:35 +00:00
if (localFilePath.indexOf("/") !== 0) localFilePath = dirs.DocumentDir + "/" + localFilePath;
2017-07-10 18:09:58 +00:00
2018-02-04 17:12:24 +00:00
if (!overwrite) {
if (await shim.fsDriver().exists(localFilePath)) {
return { ok: true };
}
}
2017-07-10 18:09:58 +00:00
delete options.path;
2018-02-04 17:12:24 +00:00
delete options.overwrite;
2017-07-10 18:09:58 +00:00
const doFetchBlob = () => {
return RNFetchBlob.config({
2018-03-09 17:49:35 +00:00
path: localFilePath,
2017-07-10 18:09:58 +00:00
}).fetch(method, url, headers);
2018-03-09 17:49:35 +00:00
};
try {
const response = await shim.fetchWithRetry(doFetchBlob, options);
2018-03-09 17:49:35 +00:00
2017-07-10 18:09:58 +00:00
// Returns an object that's roughtly compatible with a standard Response object
let output = {
ok: response.respInfo.status < 400,
path: response.data,
text: response.text,
json: response.json,
status: response.respInfo.status,
headers: response.respInfo.headers,
};
return output;
} catch (error) {
2018-03-09 17:49:35 +00:00
throw new Error("fetchBlob: " + method + " " + url + ": " + error.toString());
2017-07-10 18:09:58 +00:00
}
2018-03-09 17:49:35 +00:00
};
2017-08-01 23:40:14 +02:00
shim.uploadBlob = async function(url, options) {
2018-03-09 17:49:35 +00:00
if (!options || !options.path) throw new Error("uploadBlob: source file path is missing");
2017-08-01 23:40:14 +02:00
const headers = options.headers ? options.headers : {};
2018-03-09 17:49:35 +00:00
const method = options.method ? options.method : "POST";
2017-08-01 23:40:14 +02:00
try {
let response = await RNFetchBlob.fetch(method, url, headers, RNFetchBlob.wrap(options.path));
// Returns an object that's roughtly compatible with a standard Response object
return {
ok: response.respInfo.status < 400,
data: response.data,
text: response.text,
json: response.json,
status: response.respInfo.status,
headers: response.respInfo.headers,
};
} catch (error) {
2018-03-09 17:49:35 +00:00
throw new Error("uploadBlob: " + method + " " + url + ": " + error.toString());
2017-08-01 23:40:14 +02:00
}
2018-03-09 17:49:35 +00:00
};
2017-08-01 23:40:14 +02:00
shim.readLocalFileBase64 = async function(path) {
2018-03-09 17:49:35 +00:00
return RNFetchBlob.fs.readFile(path, "base64");
};
shim.stringByteLength = function(string) {
2018-03-09 17:49:35 +00:00
return Buffer.byteLength(string, "utf-8");
};
2017-07-10 18:09:58 +00:00
}
2018-03-09 17:49:35 +00:00
module.exports = { shimInit };