Revert "Remove some polyfills"

This commit is contained in:
Tim Visée 2022-08-10 19:24:20 +02:00 committed by GitHub
parent 643287e235
commit 71587a604e
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
24 changed files with 3784 additions and 1429 deletions

View File

@ -5,24 +5,21 @@ env:
extends: extends:
- eslint:recommended - eslint:recommended
- prettier - prettier
- plugin:n/recommended - plugin:node/recommended
- plugin:security/recommended - plugin:security/recommended
plugins: plugins:
- n - node
- security - security
root: true root: true
rules: rules:
n/no-deprecated-api: off node/no-deprecated-api: off
n/no-unsupported-features/es-syntax: off node/no-unsupported-features/es-syntax: off
n/no-unsupported-features/node-builtins: off node/no-unsupported-features/node-builtins: off
n/no-unpublished-require: off node/no-unpublished-require: off
n/no-unpublished-import: off node/no-unpublished-import: off
n/no-process-exit: off
# This forces using file extensions in imports, which is a best practice, but refactoring would take some time
n/no-missing-import: off
security/detect-non-literal-fs-filename: off security/detect-non-literal-fs-filename: off
security/detect-object-injection: off security/detect-object-injection: off

View File

@ -63,6 +63,7 @@ COPY --chown=app:app server server
COPY --chown=app:app --from=builder /app/dist dist COPY --chown=app:app --from=builder /app/dist dist
RUN npm ci --production && npm cache clean --force RUN npm ci --production && npm cache clean --force
RUN mkdir -p /app/.config/configstore
RUN ln -s dist/version.json version.json RUN ln -s dist/version.json version.json
ENV PORT=1443 ENV PORT=1443

View File

@ -6,4 +6,4 @@ parserOptions:
sourceType: module sourceType: module
rules: rules:
n/no-unsupported-features: off node/no-unsupported-features: off

View File

@ -45,7 +45,13 @@ async function checkCrypto() {
); );
return true; return true;
} catch (err) { } catch (err) {
return false; try {
window.asmCrypto = await import('asmcrypto.js');
await import('@dannycoates/webcrypto-liner/build/shim');
return true;
} catch (e) {
return false;
}
} }
} }
@ -60,12 +66,25 @@ function checkStreams() {
} }
} }
async function polyfillStreams() {
try {
await import('@mattiasbuelens/web-streams-polyfill');
return true;
} catch (e) {
return false;
}
}
export default async function getCapabilities() { export default async function getCapabilities() {
const browser = browserName(); const browser = browserName();
const isMobile = /mobi|android/i.test(navigator.userAgent); const isMobile = /mobi|android/i.test(navigator.userAgent);
const serviceWorker = 'serviceWorker' in navigator && browser !== 'edge'; const serviceWorker = 'serviceWorker' in navigator && browser !== 'edge';
let crypto = await checkCrypto(); let crypto = await checkCrypto();
const nativeStreams = checkStreams(); const nativeStreams = checkStreams();
let polyStreams = false;
if (!nativeStreams) {
polyStreams = await polyfillStreams();
}
let account = typeof AUTH_CONFIG !== 'undefined'; let account = typeof AUTH_CONFIG !== 'undefined';
try { try {
account = account && !!localStorage; account = account && !!localStorage;
@ -87,10 +106,10 @@ export default async function getCapabilities() {
account, account,
crypto, crypto,
serviceWorker, serviceWorker,
streamUpload: nativeStreams, streamUpload: nativeStreams || polyStreams,
streamDownload: streamDownload:
nativeStreams && serviceWorker && browser !== 'safari' && !mobileFirefox, nativeStreams && serviceWorker && browser !== 'safari' && !mobileFirefox,
multifile: nativeStreams, multifile: nativeStreams || polyStreams,
share, share,
standalone standalone
}; };

View File

@ -48,7 +48,7 @@ class ECETransformer {
name: 'AES-GCM', name: 'AES-GCM',
length: 128 length: 128
}, },
false, true, // Edge polyfill requires key to be extractable to encrypt :/
['encrypt', 'decrypt'] ['encrypt', 'decrypt']
); );
} }

View File

@ -1,5 +1,6 @@
/* global DEFAULTS LIMITS WEB_UI PREFS */ /* global DEFAULTS LIMITS WEB_UI PREFS */
import 'core-js'; import 'core-js';
import 'fast-text-encoding'; // MS Edge support
import 'intl-pluralrules'; import 'intl-pluralrules';
import choo from 'choo'; import choo from 'choo';
import nanotiming from 'nanotiming'; import nanotiming from 'nanotiming';

View File

@ -110,7 +110,7 @@ class Storage {
} }
set user(info) { set user(info) {
this.engine.setItem('user', JSON.stringify(info)); return this.engine.setItem('user', JSON.stringify(info));
} }
getFileById(id) { getFileById(id) {

View File

@ -1,3 +1,5 @@
/* global TransformStream */
export function transformStream(readable, transformer, oncancel) { export function transformStream(readable, transformer, oncancel) {
try { try {
return readable.pipeThrough(new TransformStream(transformer)); return readable.pipeThrough(new TransformStream(transformer));

View File

@ -23,34 +23,39 @@ function locale() {
return document.querySelector('html').lang; return document.querySelector('html').lang;
} }
function loadShim(polyfill) {
return new Promise((resolve, reject) => {
const shim = document.createElement('script');
shim.src = polyfill;
shim.addEventListener('load', () => resolve(true));
shim.addEventListener('error', () => resolve(false));
document.head.appendChild(shim);
});
}
function isFile(id) { function isFile(id) {
return /^[0-9a-fA-F]{10,16}$/.test(id); return /^[0-9a-fA-F]{10,16}$/.test(id);
} }
async function copyToClipboard(str) { function copyToClipboard(str) {
try { const aux = document.createElement('input');
await navigator.clipboard.writeText(str); aux.setAttribute('value', str);
} catch { aux.contentEditable = true;
// Older browsers or the clipboard API fails because of a missing permission aux.readOnly = true;
const aux = document.createElement('input'); document.body.appendChild(aux);
aux.setAttribute('value', str); if (navigator.userAgent.match(/iphone|ipad|ipod/i)) {
aux.contentEditable = true; const range = document.createRange();
aux.readOnly = true; range.selectNodeContents(aux);
document.body.appendChild(aux); const sel = getSelection();
if (navigator.userAgent.match(/iphone|ipad|ipod/i)) { sel.removeAllRanges();
const range = document.createRange(); sel.addRange(range);
range.selectNodeContents(aux); aux.setSelectionRange(0, str.length);
const sel = getSelection(); } else {
sel.removeAllRanges(); aux.select();
sel.addRange(range);
aux.setSelectionRange(0, str.length);
} else {
aux.select();
}
const result = document.execCommand('copy');
document.body.removeChild(aux);
return result;
} }
const result = document.execCommand('copy');
document.body.removeChild(aux);
return result;
} }
const LOCALIZE_NUMBERS = !!( const LOCALIZE_NUMBERS = !!(
@ -282,6 +287,7 @@ module.exports = {
copyToClipboard, copyToClipboard,
arrayToB64, arrayToB64,
b64ToArray, b64ToArray,
loadShim,
isFile, isFile,
openLinksInNewTab, openLinksInNewTab,
browserName, browserName,

View File

@ -3,7 +3,7 @@ const isServer = typeof genmap === 'function';
let prefix = ''; let prefix = '';
let manifest = {}; let manifest = {};
try { try {
//eslint-disable-next-line n/no-missing-require //eslint-disable-next-line node/no-missing-require
manifest = require('../dist/manifest.json'); manifest = require('../dist/manifest.json');
} catch (e) { } catch (e) {
// use middleware // use middleware

View File

@ -6,6 +6,8 @@
- https://github.com/whatwg/streams/tree/master/reference-implementation - https://github.com/whatwg/streams/tree/master/reference-implementation
- Examples - Examples
- https://github.com/mdn/dom-examples/tree/master/streams - https://github.com/mdn/dom-examples/tree/master/streams
- Polyfill
- https://github.com/MattiasBuelens/web-streams-polyfill
# Encrypted Content Encoding # Encrypted Content Encoding

View File

@ -1,4 +1,4 @@
/* global window, document */ /* global window, document, fetch */
const MAXFILESIZE = 1024 * 1024 * 1024 * 2; const MAXFILESIZE = 1024 * 1024 * 1024 * 2;

5053
package-lock.json generated

File diff suppressed because it is too large Load Diff

View File

@ -66,10 +66,13 @@
"@babel/plugin-proposal-class-properties": "^7.16.7", "@babel/plugin-proposal-class-properties": "^7.16.7",
"@babel/plugin-syntax-dynamic-import": "^7.2.0", "@babel/plugin-syntax-dynamic-import": "^7.2.0",
"@babel/preset-env": "^7.16.11", "@babel/preset-env": "^7.16.11",
"@dannycoates/webcrypto-liner": "^0.1.37",
"@fullhuman/postcss-purgecss": "^4.1.3", "@fullhuman/postcss-purgecss": "^4.1.3",
"@mattiasbuelens/web-streams-polyfill": "0.2.1",
"@sentry/browser": "^5.30.0", "@sentry/browser": "^5.30.0",
"asmcrypto.js": "^0.22.0",
"babel-loader": "^8.2.4", "babel-loader": "^8.2.4",
"babel-plugin-istanbul": "^6.1.1", "babel-plugin-istanbul": "^5.2.0",
"base64-js": "^1.5.1", "base64-js": "^1.5.1",
"content-disposition": "^0.5.4", "content-disposition": "^0.5.4",
"copy-webpack-plugin": "^6.4.0", "copy-webpack-plugin": "^6.4.0",
@ -77,15 +80,20 @@
"crc": "^3.8.0", "crc": "^3.8.0",
"cross-env": "^6.0.3", "cross-env": "^6.0.3",
"css-loader": "^5.2.7", "css-loader": "^5.2.7",
"css-mqpacker": "^7.0.0",
"cssnano": "^5.1.12", "cssnano": "^5.1.12",
"eslint": "^8.21.0", "eslint": "^6.6.0",
"eslint-config-prettier": "^8.5.0", "eslint-config-prettier": "^6.15.0",
"eslint-plugin-mocha": "^10.1.0", "eslint-plugin-mocha": "^6.2.1",
"eslint-plugin-n": "^15.2.4", "eslint-plugin-node": "^10.0.0",
"eslint-plugin-security": "^1.5.0", "eslint-plugin-security": "^1.4.0",
"expose-loader": "^0.7.5",
"extract-loader": "^3.2.0",
"extract-text-webpack-plugin": "^4.0.0-beta.0", "extract-text-webpack-plugin": "^4.0.0-beta.0",
"fast-text-encoding": "^1.0.3",
"file-loader": "^6.2.0", "file-loader": "^6.2.0",
"git-rev-sync": "^3.0.2", "git-rev-sync": "^3.0.2",
"html-loader": "^0.5.5",
"http_ece": "^1.1.0", "http_ece": "^1.1.0",
"husky": "^3.0.9", "husky": "^3.0.9",
"intl-pluralrules": "^1.3.1", "intl-pluralrules": "^1.3.1",
@ -105,6 +113,7 @@
"puppeteer": "^2.0.0", "puppeteer": "^2.0.0",
"raw-loader": "^3.1.0", "raw-loader": "^3.1.0",
"rimraf": "^3.0.0", "rimraf": "^3.0.0",
"script-loader": "^0.7.2",
"sinon": "^7.5.0", "sinon": "^7.5.0",
"string-hash": "^1.1.3", "string-hash": "^1.1.3",
"stylelint": "^14.9.1", "stylelint": "^14.9.1",
@ -131,8 +140,10 @@
"body-parser": "^1.20.0", "body-parser": "^1.20.0",
"choo": "^7.0.0", "choo": "^7.0.0",
"cldr-core": "^35.1.0", "cldr-core": "^35.1.0",
"configstore": "github:dannycoates/configstore#master",
"convict": "^6.2.3", "convict": "^6.2.3",
"convict-format-with-validator": "^6.2.0", "convict-format-with-validator": "^6.2.0",
"double-ended-queue": "^2.1.0-0",
"express": "^4.17.3", "express": "^4.17.3",
"helmet": "^3.23.3", "helmet": "^3.23.3",
"mozlog": "^3.0.1", "mozlog": "^3.0.1",

View File

@ -1,5 +1,5 @@
rules: rules:
n/shebang: off node/shebang: off
security/detect-child-process: off security/detect-child-process: off
no-console: off no-console: off

View File

@ -5,7 +5,7 @@ const clientConstants = require('./clientConstants');
let sentry = ''; let sentry = '';
if (config.sentry_id) { if (config.sentry_id) {
//eslint-disable-next-line n/no-missing-require //eslint-disable-next-line node/no-missing-require
const version = require('../dist/version.json'); const version = require('../dist/version.json');
sentry = ` sentry = `
var SENTRY_CONFIG = { var SENTRY_CONFIG = {

View File

@ -120,7 +120,7 @@ module.exports = function(app) {
); );
app.post(`/api/info/:id${ID_REGEX}`, auth.owner, require('./info')); app.post(`/api/info/:id${ID_REGEX}`, auth.owner, require('./info'));
app.get('/__version__', function(req, res) { app.get('/__version__', function(req, res) {
// eslint-disable-next-line n/no-missing-require // eslint-disable-next-line node/no-missing-require
res.sendFile(require.resolve('../../dist/version.json')); res.sendFile(require.resolve('../../dist/version.json'));
}); });

View File

@ -6,10 +6,10 @@ extends:
plugins: plugins:
- mocha - mocha
- n - node
rules: rules:
n/no-unpublished-require: off node/no-unpublished-require: off
mocha/handle-done-callback: error mocha/handle-done-callback: error
mocha/no-exclusive-tests: error mocha/no-exclusive-tests: error

View File

@ -5,4 +5,4 @@ parserOptions:
sourceType: module sourceType: module
rules: rules:
n/no-unsupported-features: off node/no-unsupported-features: off

View File

@ -9,7 +9,7 @@ module.exports = function() {
const files = fs const files = fs
.readdirSync(path.join(__dirname, 'tests')) .readdirSync(path.join(__dirname, 'tests'))
.filter(p => /\.js$/.test(p)); .filter(p => /\.js$/.test(p));
const code = files.map(kv).join(';\n'); const code = "require('fast-text-encoding');\n" + files.map(kv).join(';\n');
return { return {
code, code,
dependencies: files.map(f => require.resolve('./tests/' + f)), dependencies: files.map(f => require.resolve('./tests/' + f)),

View File

@ -1,4 +1,4 @@
// eslint-disable-next-line n/no-extraneous-require // eslint-disable-next-line node/no-extraneous-require
const ip = require('ip'); const ip = require('ip');
const common = require('./wdio.common.conf'); const common = require('./wdio.common.conf');

View File

@ -1,4 +1,4 @@
// eslint-disable-next-line n/no-extraneous-require // eslint-disable-next-line node/no-extraneous-require
const ip = require('ip'); const ip = require('ip');
const common = require('./wdio.common.conf'); const common = require('./wdio.common.conf');
const dir = const dir =

View File

@ -1,4 +1,4 @@
// eslint-disable-next-line n/no-extraneous-require // eslint-disable-next-line node/no-extraneous-require
const ip = require('ip'); const ip = require('ip');
const common = require('./wdio.common.conf'); const common = require('./wdio.common.conf');

View File

@ -111,6 +111,10 @@ const web = {
path.resolve(__dirname, 'common'), path.resolve(__dirname, 'common'),
// some dependencies need to get re-babeled because we // some dependencies need to get re-babeled because we
// have different targets than their default configs // have different targets than their default configs
path.resolve(
__dirname,
'node_modules/@dannycoates/webcrypto-liner'
),
path.resolve(__dirname, 'node_modules/@fluent'), path.resolve(__dirname, 'node_modules/@fluent'),
path.resolve(__dirname, 'node_modules/intl-pluralrules') path.resolve(__dirname, 'node_modules/intl-pluralrules')
], ],
@ -123,7 +127,8 @@ const web = {
path.resolve(__dirname, 'node_modules/crc'), path.resolve(__dirname, 'node_modules/crc'),
path.resolve(__dirname, 'node_modules/@fluent'), path.resolve(__dirname, 'node_modules/@fluent'),
path.resolve(__dirname, 'node_modules/@sentry'), path.resolve(__dirname, 'node_modules/@sentry'),
path.resolve(__dirname, 'node_modules/tslib') path.resolve(__dirname, 'node_modules/tslib'),
path.resolve(__dirname, 'node_modules/webcrypto-core')
], ],
loader: 'webpack-unassert-loader' loader: 'webpack-unassert-loader'
} }