1
0
mirror of https://github.com/laurent22/joplin.git synced 2025-03-11 14:09:55 +02:00
joplin/ReactNativeClient/lib/shim-init-node.js
2018-03-09 17:49:35 +00:00

191 lines
5.4 KiB
JavaScript

const fs = require("fs-extra");
const { shim } = require("lib/shim.js");
const { GeolocationNode } = require("lib/geolocation-node.js");
const { FileApiDriverLocal } = require("lib/file-api-driver-local.js");
const { time } = require("lib/time-utils.js");
const { setLocale, defaultLocale, closestSupportedLocale } = require("lib/locale.js");
const { FsDriverNode } = require("lib/fs-driver-node.js");
function shimInit() {
shim.fsDriver = () => {
throw new Error("Not implemented");
};
shim.FileApiDriverLocal = FileApiDriverLocal;
shim.Geolocation = GeolocationNode;
shim.FormData = require("form-data");
shim.sjclModule = require("lib/vendor/sjcl.js");
shim.fsDriver = () => {
if (!shim.fsDriver_) shim.fsDriver_ = new FsDriverNode();
return shim.fsDriver_;
};
shim.randomBytes = async count => {
const buffer = require("crypto").randomBytes(count);
return Array.from(buffer);
};
shim.detectAndSetLocale = function(Setting) {
let locale = process.env.LANG;
if (!locale) locale = defaultLocale();
locale = locale.split(".");
locale = locale[0];
locale = closestSupportedLocale(locale);
Setting.setValue("locale", locale);
setLocale(locale);
return locale;
};
const resizeImage_ = async function(filePath, targetPath) {
const sharp = require("sharp");
const Resource = require("lib/models/Resource.js");
return new Promise((resolve, reject) => {
sharp(filePath)
.resize(Resource.IMAGE_MAX_DIMENSION, Resource.IMAGE_MAX_DIMENSION)
.max()
.withoutEnlargement()
.toFile(targetPath, (err, info) => {
if (err) {
reject(err);
} else {
resolve(info);
}
});
});
};
shim.attachFileToNote = async function(note, filePath) {
const Resource = require("lib/models/Resource.js");
const { uuid } = require("lib/uuid.js");
const { basename, fileExtension, safeFileExtension } = require("lib/path-utils.js");
const mime = require("mime/lite");
const Note = require("lib/models/Note.js");
if (!await fs.pathExists(filePath)) throw new Error(_("Cannot access %s", filePath));
let resource = Resource.new();
resource.id = uuid.create();
resource.mime = mime.getType(filePath);
resource.title = basename(filePath);
resource.file_extension = safeFileExtension(fileExtension(filePath));
if (!resource.mime) resource.mime = "application/octet-stream";
let targetPath = Resource.fullPath(resource);
if (resource.mime == "image/jpeg" || resource.mime == "image/jpg" || resource.mime == "image/png") {
const result = await resizeImage_(filePath, targetPath);
} else {
await fs.copy(filePath, targetPath, { overwrite: true });
}
await Resource.save(resource, { isNew: true });
const newBody = [];
if (note.body) newBody.push(note.body);
newBody.push(Resource.markdownTag(resource));
const newNote = Object.assign({}, note, {
body: newBody.join("\n\n"),
});
return await Note.save(newNote);
};
const nodeFetch = require("node-fetch");
shim.readLocalFileBase64 = path => {
const data = fs.readFileSync(path);
return new Buffer(data).toString("base64");
};
shim.fetch = async function(url, options = null) {
return shim.fetchWithRetry(() => {
return nodeFetch(url, options);
}, options);
};
shim.fetchBlob = async function(url, options) {
if (!options || !options.path) throw new Error("fetchBlob: target file path is missing");
if (!options.method) options.method = "GET";
//if (!('maxRetry' in options)) options.maxRetry = 5;
const urlParse = require("url").parse;
url = urlParse(url.trim());
const http = url.protocol.toLowerCase() == "http:" ? require("follow-redirects").http : require("follow-redirects").https;
const headers = options.headers ? options.headers : {};
const method = options.method ? options.method : "GET";
if (method != "GET") throw new Error("Only GET is supported");
const filePath = options.path;
function makeResponse(response) {
return {
ok: response.statusCode < 400,
path: filePath,
text: () => {
return response.statusMessage;
},
json: () => {
return { message: response.statusCode + ": " + response.statusMessage };
},
status: response.statusCode,
headers: response.headers,
};
}
const requestOptions = {
protocol: url.protocol,
host: url.host,
port: url.port,
method: method,
path: url.path + (url.query ? "?" + url.query : ""),
headers: headers,
};
const doFetchOperation = async () => {
return new Promise((resolve, reject) => {
try {
// Note: relative paths aren't supported
const file = fs.createWriteStream(filePath);
const request = http.get(requestOptions, function(response) {
response.pipe(file);
file.on("finish", function() {
file.close(() => {
resolve(makeResponse(response));
});
});
});
request.on("error", function(error) {
fs.unlink(filePath);
reject(error);
});
} catch (error) {
fs.unlink(filePath);
reject(error);
}
});
};
return shim.fetchWithRetry(doFetchOperation, options);
};
shim.uploadBlob = async function(url, options) {
if (!options || !options.path) throw new Error("uploadBlob: source file path is missing");
const content = await fs.readFile(options.path);
options = Object.assign({}, options, {
body: content,
});
return shim.fetch(url, options);
};
shim.stringByteLength = function(string) {
return Buffer.byteLength(string, "utf-8");
};
}
module.exports = { shimInit };