1
0
mirror of https://github.com/laurent22/joplin.git synced 2024-12-12 08:54:00 +02:00
joplin/ReactNativeClient/lib/shim.js

224 lines
6.1 KiB
JavaScript
Raw Normal View History

/* eslint @typescript-eslint/no-unused-vars: 0, no-unused-vars: ["error", { "argsIgnorePattern": ".*" }], */
const shim = {};
2017-07-10 20:09:58 +02:00
shim.isNode = () => {
if (typeof process === 'undefined') return false;
2017-11-11 00:18:00 +02:00
if (shim.isElectron()) return true;
return process.title == 'node';
2017-07-10 20:09:58 +02:00
};
shim.isReactNative = () => {
if (typeof navigator === 'object' && typeof navigator.userAgent === 'string' && navigator.userAgent.indexOf('ReactNativeDebugger') >= 0) {
return true;
}
2019-07-29 15:43:53 +02:00
2017-07-10 20:09:58 +02:00
return !shim.isNode();
};
2017-11-14 20:02:58 +02:00
shim.isLinux = () => {
return process && process.platform === 'linux';
2019-07-29 15:43:53 +02:00
};
2017-11-14 20:02:58 +02:00
2018-10-24 20:16:15 +02:00
shim.isFreeBSD = () => {
return process && process.platform === 'freebsd';
2019-07-29 15:43:53 +02:00
};
2018-10-24 20:16:15 +02:00
2017-11-14 20:02:58 +02:00
shim.isWindows = () => {
return process && process.platform === 'win32';
2019-07-29 15:43:53 +02:00
};
2017-11-14 20:02:58 +02:00
shim.isMac = () => {
return process && process.platform === 'darwin';
2019-07-29 15:43:53 +02:00
};
2017-11-14 20:02:58 +02:00
shim.platformName = function() {
if (shim.isReactNative()) return shim.mobilePlatform();
2019-07-29 15:43:53 +02:00
if (shim.isMac()) return 'darwin';
if (shim.isWindows()) return 'win32';
if (shim.isLinux()) return 'linux';
2019-07-29 15:43:53 +02:00
if (shim.isFreeBSD()) return 'freebsd';
if (process && process.platform) return process.platform;
throw new Error('Cannot determine platform');
2019-07-29 15:43:53 +02:00
};
// "ios" or "android", or "" if not on mobile
shim.mobilePlatform = function() {
return ''; // Default if we're not on mobile (React Native)
};
2017-11-11 00:18:00 +02:00
// https://github.com/cheton/is-electron
shim.isElectron = () => {
2017-11-14 20:02:58 +02:00
// Renderer process
if (typeof window !== 'undefined' && typeof window.process === 'object' && window.process.type === 'renderer') {
2017-11-14 20:02:58 +02:00
return true;
}
// Main process
if (typeof process !== 'undefined' && typeof process.versions === 'object' && !!process.versions.electron) {
2017-11-14 20:02:58 +02:00
return true;
}
// Detect the user agent when the `nodeIntegration` option is set to true
if (typeof navigator === 'object' && typeof navigator.userAgent === 'string' && navigator.userAgent.indexOf('Electron') >= 0) {
2017-11-14 20:02:58 +02:00
return true;
}
return false;
2019-07-29 15:43:53 +02:00
};
2017-11-11 00:18:00 +02:00
shim.isPortable = function() {
2018-05-14 13:18:00 +02:00
return typeof process !== 'undefined' && typeof process.env === 'object' && !!process.env.PORTABLE_EXECUTABLE_DIR;
2019-07-29 15:43:53 +02:00
};
// Node requests can go wrong is so many different ways and with so
// many different error messages... This handler inspects the error
// and decides whether the request can safely be repeated or not.
shim.fetchRequestCanBeRetried = function(error) {
2017-11-14 20:02:58 +02:00
if (!error) return false;
// Unfortunately the error 'Network request failed' doesn't have a type
// or error code, so hopefully that message won't change and is not localized
if (error.message == 'Network request failed') return true;
2017-11-14 20:02:58 +02:00
// request to https://public-ch3302....1fab24cb1bd5f.md failed, reason: socket hang up"
if (error.code == 'ECONNRESET') return true;
2017-11-14 20:02:58 +02:00
// OneDrive (or Node?) sometimes sends back a "not found" error for resources
// that definitely exist and in this case repeating the request works.
// Error is:
2019-07-29 15:43:53 +02:00
// request to https://graph.microsoft.com/v1.0/drive/special/approot failed, reason: getaddrinfo ENOTFOUND graph.microsoft.com graph.microsoft.com:443
if (error.code == 'ENOTFOUND') return true;
2017-11-14 20:02:58 +02:00
// network timeout at: https://public-ch3302...859f9b0e3ab.md
if (error.message && error.message.indexOf('network timeout') === 0) return true;
2017-11-14 20:02:58 +02:00
// name: 'FetchError',
// message: 'request to https://api.ipify.org/?format=json failed, reason: getaddrinfo EAI_AGAIN api.ipify.org:443',
// type: 'system',
// errno: 'EAI_AGAIN',
// code: 'EAI_AGAIN' } } reason: { FetchError: request to https://api.ipify.org/?format=json failed, reason: getaddrinfo EAI_AGAIN api.ipify.org:443
//
// It's a Microsoft error: "A temporary failure in name resolution occurred."
if (error.code == 'EAI_AGAIN') return true;
2017-11-14 20:02:58 +02:00
// request to https://public-...8fd8bc6bb68e9c4d17a.md failed, reason: connect ETIMEDOUT 204.79.197.213:443
// Code: ETIMEDOUT
if (error.code === 'ETIMEDOUT') return true;
2017-11-14 20:02:58 +02:00
2018-03-27 18:48:55 +02:00
// ECONNREFUSED is generally temporary
if (error.code === 'ECONNREFUSED') return true;
2017-11-14 20:02:58 +02:00
return false;
};
shim.fetchMaxRetry_ = 5;
shim.fetchMaxRetrySet = v => {
const previous = shim.fetchMaxRetry_;
shim.fetchMaxRetry_ = v;
return previous;
2019-07-29 15:43:53 +02:00
};
shim.fetchWithRetry = async function(fetchFn, options = null) {
const { time } = require('lib/time-utils.js');
2017-11-14 20:02:58 +02:00
if (!options) options = {};
if (!options.timeout) options.timeout = 1000 * 120; // ms
if (!('maxRetry' in options)) options.maxRetry = shim.fetchMaxRetry_;
2017-11-14 20:02:58 +02:00
let retryCount = 0;
while (true) {
try {
const response = await fetchFn();
return response;
} catch (error) {
if (shim.fetchRequestCanBeRetried(error)) {
2017-11-14 20:02:58 +02:00
retryCount++;
if (retryCount > options.maxRetry) throw error;
await time.sleep(retryCount * 3);
} else {
throw error;
}
}
}
2019-07-29 15:43:53 +02:00
};
2019-07-29 15:43:53 +02:00
shim.fetch = () => {
throw new Error('Not implemented');
};
shim.FormData = typeof FormData !== 'undefined' ? FormData : null;
2019-07-29 15:43:53 +02:00
shim.fsDriver = () => {
throw new Error('Not implemented');
};
shim.FileApiDriverLocal = null;
2019-07-29 15:43:53 +02:00
shim.readLocalFileBase64 = path => {
throw new Error('Not implemented');
};
2019-07-29 15:43:53 +02:00
shim.uploadBlob = () => {
throw new Error('Not implemented');
};
shim.sjclModule = null;
2019-07-29 15:43:53 +02:00
shim.randomBytes = async count => {
throw new Error('Not implemented');
};
shim.setInterval = function(fn, interval) {
return setInterval(fn, interval);
2019-07-29 15:43:53 +02:00
};
shim.clearInterval = function(id) {
return clearInterval(id);
2019-07-29 15:43:53 +02:00
};
2019-07-29 15:43:53 +02:00
shim.stringByteLength = function(string) {
throw new Error('Not implemented');
};
shim.detectAndSetLocale = null;
2019-07-29 15:43:53 +02:00
shim.attachFileToNote = async (note, filePath) => {};
shim.imageFromDataUrl = async function(imageDataUrl, filePath) {
2019-07-29 15:43:53 +02:00
throw new Error('Not implemented');
};
2018-03-24 21:35:10 +02:00
shim.Buffer = null;
2019-07-29 15:43:53 +02:00
shim.openUrl = () => {
throw new Error('Not implemented');
};
shim.httpAgent = () => {
throw new Error('Not implemented');
};
shim.openOrCreateFile = () => {
throw new Error('Not implemented');
};
2019-07-29 15:43:53 +02:00
shim.waitForFrame = () => {
throw new Error('Not implemented');
};
shim.appVersion = () => {
throw new Error('Not implemented');
};
shim.injectedJs = name => '';
let isTestingEnv_ = false;
shim.isTestingEnv = () => {
return isTestingEnv_;
};
shim.setIsTestingEnv = (v) => {
isTestingEnv_ = v;
};
Desktop: Resolves #176: Added experimental WYSIWYG editor (#2556) * Trying to get TuiEditor to work * Tests with TinyMCE * Fixed build * Improved asset loading * Added support for Joplin source blocks * Added support for Joplin source blocks * Better integration * Make sure noteDidUpdate event is always dispatched at the right time * Minor tweaks * Fixed tests * Add support for checkboxes * Minor refactoring * Added support for file attachments * Add support for fenced code blocks * Fix new line issue on code block * Added support for Fountain scripts * Refactoring * Better handling of saving and loading notes * Fix saving and loading ntoes * Handle multi-note selection and fixed new note creation issue * Fixed newline issue in test * Fixed newline issue in test * Improve saving and loading * Improve saving and loading note * Removed undeeded prop * Fixed issue when new note being saved is incorrectly reloaded * Refactoring and improve saving of note when unmounting component * Fixed TypeScript error * Small changes * Improved further handling of saving and loading notes * Handle provisional notes and fixed various saving and loading bugs * Adding back support for HTML notes * Added support for HTML notes * Better handling of editable nodes * Preserve image HTML tag when the size is set * Handle switching between editor when the note has note finished saving * Handle templates * Handle templates * Handle loading note that is being saved * Handle note being reloaded via sync * Clean up * Clean up and improved logging * Fixed TS error * Fixed a few issues * Fixed test * Logging * Various improvements * Add blockquote support * Moved CWD operation to shim * Removed deleted files * Added support for Joplin commands
2020-03-10 01:24:57 +02:00
shim.pathRelativeToCwd = (path) => {
throw new Error('Not implemented');
};
2018-10-24 20:16:15 +02:00
module.exports = { shim };