Revert "fix: stop user code after 100ms of execution" (#37965)

This reverts commit 01b37f664f.
This commit is contained in:
Oliver Eyton-Williams
2019-12-21 06:39:32 +01:00
committed by mrugesh
parent c49aee9edc
commit e5abfa15ad
9 changed files with 75 additions and 143 deletions

View File

@@ -1236,11 +1236,6 @@
"prop-types": "^15.5.10"
}
},
"@freecodecamp/loop-protect": {
"version": "2.2.0",
"resolved": "https://registry.npmjs.org/@freecodecamp/loop-protect/-/loop-protect-2.2.0.tgz",
"integrity": "sha512-WwYmQn6Xrk7KE22xANbye/qyg3U0aupWtMaJpN/k22/cdSBpWyjdrGSStEqg3DxFxdJoR/O/yhe8gqbtTYKI3g=="
},
"@freecodecamp/react-bootstrap": {
"version": "0.32.3",
"resolved": "https://registry.npmjs.org/@freecodecamp/react-bootstrap/-/react-bootstrap-0.32.3.tgz",
@@ -15518,6 +15513,11 @@
"resolved": "https://registry.npmjs.org/longest-streak/-/longest-streak-2.0.3.tgz",
"integrity": "sha512-9lz5IVdpwsKLMzQi0MQ+oD9EA0mIGcWYP7jXMTZVXP8D42PwuAk+M/HBFYQoxt1G5OR8m7aSIgb1UymfWGBWEw=="
},
"loop-protect": {
"version": "2.1.6",
"resolved": "https://registry.npmjs.org/loop-protect/-/loop-protect-2.1.6.tgz",
"integrity": "sha512-eGNk917T5jQ9A/ER/zJlEXCGD/NQepYyLnLBgVPSuspHauG2HUiDx5oKDSpyVQOzGb+yUKMA1k41+Old2ZmcRQ=="
},
"loose-envify": {
"version": "1.3.1",
"resolved": "https://registry.npmjs.org/loose-envify/-/loose-envify-1.3.1.tgz",

View File

@@ -14,7 +14,6 @@
"@fortawesome/free-regular-svg-icons": "^5.11.2",
"@fortawesome/free-solid-svg-icons": "^5.11.2",
"@fortawesome/react-fontawesome": "^0.1.4",
"@freecodecamp/loop-protect": "^2.2.0",
"@freecodecamp/react-bootstrap": "^0.32.3",
"@reach/router": "^1.2.1",
"algoliasearch": "^3.35.1",
@@ -41,6 +40,7 @@
"gatsby-transformer-remark": "^2.6.30",
"jquery": "^3.4.1",
"lodash": "^4.17.15",
"loop-protect": "^2.1.6",
"monaco-editor": "^0.18.1",
"monaco-editor-webpack-plugin": "^1.7.0",
"nanoid": "^1.2.2",

View File

@@ -13,7 +13,7 @@ import {
import * as Babel from '@babel/standalone';
import presetEnv from '@babel/preset-env';
import presetReact from '@babel/preset-react';
import protect from '@freecodecamp/loop-protect';
import protect from 'loop-protect';
import * as vinyl from '../utils/polyvinyl.js';
import createWorker from '../utils/worker-executor';
@@ -23,26 +23,7 @@ import createWorker from '../utils/worker-executor';
import { filename as sassCompile } from '../../../../config/sass-compile';
const protectTimeout = 100;
const testProtectTimeout = 1500;
const loopsPerTimeoutCheck = 2000;
function loopProtectCB(line) {
console.log(
`Potential infinite loop detected on line ${line}. Tests may fail if this is not changed.`
);
}
function testLoopProtectCB(line) {
console.log(
`Potential infinite loop detected on line ${line}. Tests may be failing because of this.`
);
}
Babel.registerPlugin('loopProtection', protect(protectTimeout, loopProtectCB));
Babel.registerPlugin(
'testLoopProtection',
protect(testProtectTimeout, testLoopProtectCB, loopsPerTimeoutCheck)
);
Babel.registerPlugin('loopProtection', protect(protectTimeout));
const babelOptionsJSX = {
plugins: ['loopProtection'],
@@ -50,15 +31,9 @@ const babelOptionsJSX = {
};
const babelOptionsJS = {
plugins: ['testLoopProtection'],
presets: [presetEnv]
};
const babelOptionsJSPreview = {
...babelOptionsJS,
plugins: ['loopProtection']
};
const babelTransformCode = options => code =>
Babel.transform(code, options).code;
@@ -94,31 +69,28 @@ function tryTransform(wrap = identity) {
};
}
const babelTransformer = (preview = false) =>
cond([
[
testJS,
flow(
partial(
vinyl.transformHeadTailAndContents,
tryTransform(
babelTransformCode(preview ? babelOptionsJSPreview : babelOptionsJS)
)
)
export const babelTransformer = cond([
[
testJS,
flow(
partial(
vinyl.transformHeadTailAndContents,
tryTransform(babelTransformCode(babelOptionsJS))
)
],
[
testJSX,
flow(
partial(
vinyl.transformHeadTailAndContents,
tryTransform(babelTransformCode(babelOptionsJSX))
),
partial(vinyl.setExt, 'js')
)
],
[stubTrue, identity]
]);
)
],
[
testJSX,
flow(
partial(
vinyl.transformHeadTailAndContents,
tryTransform(babelTransformCode(babelOptionsJSX))
),
partial(vinyl.setExt, 'js')
)
],
[stubTrue, identity]
]);
const sassWorker = createWorker(sassCompile);
async function transformSASS(element) {
@@ -169,14 +141,7 @@ export const htmlTransformer = cond([
export const transformers = [
replaceNBSP,
babelTransformer(),
composeHTML,
htmlTransformer
];
export const transformersPreview = [
replaceNBSP,
babelTransformer(true),
babelTransformer,
composeHTML,
htmlTransformer
];

View File

@@ -33,9 +33,6 @@ import {
isJavaScriptChallenge
} from '../utils/build';
// How long before bailing out of a preview.
const previewTimeout = 2500;
export function* executeChallengeSaga() {
const isBuildEnabled = yield select(isBuildEnabledSelector);
if (!isBuildEnabled) {
@@ -93,9 +90,9 @@ function* takeEveryConsole(channel) {
});
}
function* buildChallengeData(challengeData, preview) {
function* buildChallengeData(challengeData) {
try {
return yield call(buildChallenge, challengeData, preview);
return yield call(buildChallenge, challengeData);
} catch (e) {
yield put(disableBuildOnError());
throw e;
@@ -158,7 +155,7 @@ function* previewChallengeSaga() {
const challengeData = yield select(challengeDataSelector);
if (canBuildChallenge(challengeData)) {
const buildData = yield buildChallengeData(challengeData, true);
const buildData = yield buildChallengeData(challengeData);
// evaluate the user code in the preview frame or in the worker
if (challengeHasPreview(challengeData)) {
const document = yield getContext('document');
@@ -166,14 +163,10 @@ function* previewChallengeSaga() {
} else if (isJavaScriptChallenge(challengeData)) {
const runUserCode = getTestRunner(buildData, { proxyLogger });
// without a testString the testRunner just evaluates the user's code
yield call(runUserCode, null, previewTimeout);
yield call(runUserCode, null, 5000);
}
}
} catch (err) {
if (err === 'timeout') {
// eslint-disable-next-line no-ex-assign
err = `The code you have written is taking longer than the ${previewTimeout}ms our challenges allow. You may have created an infinite loop or need to write a more efficient algorithm`;
}
console.log(err);
yield put(updateConsole(escape(err)));
}

View File

@@ -1,4 +1,4 @@
import { transformers, transformersPreview } from '../rechallenge/transformers';
import { transformers } from '../rechallenge/transformers';
import { cssToHtml, jsToHtml, concatHtml } from '../rechallenge/builders.js';
import { challengeTypes } from '../../../../utils/challengeTypes';
import createWorker from './worker-executor';
@@ -76,11 +76,11 @@ export function canBuildChallenge(challengeData) {
return buildFunctions.hasOwnProperty(challengeType);
}
export async function buildChallenge(challengeData, preview = false) {
export async function buildChallenge(challengeData) {
const { challengeType } = challengeData;
let build = buildFunctions[challengeType];
if (build) {
return build(challengeData, preview);
return build(challengeData);
}
throw new Error(`Cannot build challenge of type ${challengeType}`);
}
@@ -137,10 +137,8 @@ export function buildDOMChallenge({ files, required = [], template = '' }) {
}));
}
export function buildJSChallenge({ files }, preview = false) {
const pipeLine = preview
? composeFunctions(...transformersPreview)
: composeFunctions(...transformers);
export function buildJSChallenge({ files }) {
const pipeLine = composeFunctions(...transformers);
const finalFiles = Object.keys(files)
.map(key => files[key])
.map(pipeLine);