rn,polyfills: refactor all mobile polyfills

Move all polyfills to a standalone feature, which gets imported before anything
else in the mobile entrypoint. This guarantees that any further import sees the
polyfilled environment.
This commit is contained in:
Saúl Ibarra Corretgé 2020-05-06 11:22:09 +02:00 committed by Saúl Ibarra Corretgé
parent 062bc13d4f
commit caabdadf19
13 changed files with 25 additions and 51 deletions

View File

@ -1,2 +1 @@
import './polyfills-browser';
import './WiFiStats';

View File

@ -1 +0,0 @@
export * from './native';

View File

@ -1,4 +1,3 @@
export * from './_';
export { default as PersistenceRegistry } from './PersistenceRegistry';
import './middleware';

View File

@ -1 +0,0 @@
import './polyfills-browser';

View File

@ -1,19 +0,0 @@
import Storage from './Storage';
(global => {
// localStorage
if (typeof global.localStorage === 'undefined') {
global.localStorage = new Storage('@jitsi-meet/');
}
// sessionStorage
//
// Required by:
// - herment
// - Strophe
if (typeof global.sessionStorage === 'undefined') {
global.sessionStorage = new Storage();
}
})(global || window || this); // eslint-disable-line no-invalid-this

View File

@ -3,8 +3,6 @@
import { NativeModules } from 'react-native';
import { RTCPeerConnection, RTCSessionDescription } from 'react-native-webrtc';
import logger from '../logger';
/* eslint-disable no-unused-vars */
// Address families.
@ -87,7 +85,7 @@ _RTCPeerConnection.prototype._invokeQueuedOnaddstream = function(q) {
// TODO Determine whether the combination of the standard
// setRemoteDescription and onaddstream results in a similar
// swallowing of errors.
_LOGE(e);
console.error(e);
}
});
};
@ -101,7 +99,7 @@ _RTCPeerConnection.prototype.setRemoteDescription = function(description) {
return (
_synthesizeIPv6Addresses(description)
.catch(reason => {
reason && _LOGE(reason);
reason && console.error(reason);
return description;
})
@ -109,16 +107,6 @@ _RTCPeerConnection.prototype.setRemoteDescription = function(description) {
};
/**
* Logs at error level.
*
* @private
* @returns {void}
*/
function _LOGE(...args) {
logger.error(...args);
}
/**
* Adapts react-native-webrtc's {@link RTCPeerConnection#setRemoteDescription}
* implementation which uses the deprecated, callback-based version to the

View File

@ -1,7 +1,9 @@
import { Platform } from 'react-native';
import BackgroundTimer from 'react-native-background-timer';
import '@webcomponents/url'; // Polyfill for URL constructor
import { Platform } from '../../react';
import Storage from './Storage';
/**
* Gets the first common prototype of two specified Objects (treating the
@ -372,7 +374,7 @@ function _visitNode(node, callback) {
}
// WebRTC
require('./polyfills-webrtc');
require('./webrtc');
// CallStats
//
@ -418,4 +420,18 @@ function _visitNode(node, callback) {
global.setInterval = BackgroundTimer.setInterval.bind(BackgroundTimer);
global.setTimeout = (fn, ms = 0) => BackgroundTimer.setTimeout(fn, ms);
// localStorage
if (typeof global.localStorage === 'undefined') {
global.localStorage = new Storage('@jitsi-meet/');
}
// sessionStorage
//
// Required by:
// - herment
// - Strophe
if (typeof global.sessionStorage === 'undefined') {
global.sessionStorage = new Storage();
}
})(global || window || this); // eslint-disable-line no-invalid-this

View File

@ -0,0 +1,2 @@
import './bundler';
import './browser';

View File

@ -1,17 +1,8 @@
// @flow
// FIXME The bundler-related (and the browser-related) polyfills were born at
// the very early days of prototyping the execution of lib-jitsi-meet on
// react-native. Today, the feature base/lib-jitsi-meet should not be
// responsible for such polyfills because it is not the only feature relying on
// them. Additionally, the polyfills are usually necessary earlier than the
// execution of base/lib-jitsi-meet (which is understandable given that the
// polyfills are globals). The remaining problem to be solved here is where to
// collect the polyfills' files.
import './features/base/lib-jitsi-meet/native/polyfills-bundler';
// Polyfill localStorage early so any library that requires it sees it available.
import './features/base/storage/native/polyfills-browser';
// Apply all necessary polyfills as early as possible to make sure anything imported henceforth
// sees them.
import './features/mobile/polyfills';
import React, { PureComponent } from 'react';
import { AppRegistry } from 'react-native';