apache / apache/arrow-js

[JS] apache-arrow doesn't work on platform restricting eval/new Function

Open
#54 6 comments 1 reaction 0 assignees View on GitHub
Type: bug
Dominant language
TypeScript
Stars
112
Forks
23
Avg merge
21h 18m
Merged PRs (30d)
8

Description

### Describe the bug, including details regarding any error messages, version, and platform.

Some platforms don't allow eval or `new Function`. CloudFlare workers is one such platform.

`createIsValidFunction` templates out a validation function using switch, since it's very fast. However, this doesn't work on CloudFlare workers (or generally workerd).

The function in question:

`builder/valid.ts`
```
export function createIsValidFunction(nullValues?: ReadonlyArray) {

if (!nullValues || nullValues.length <= 0) {
// @ts-ignore
return function isValid(value: any) { return true; };
}

let fnBody = '';
const noNaNs = nullValues.filter((x) => x === x);

if (noNaNs.length > 0) {
fnBody = `
switch (x) {${noNaNs.map((x) => `
case ${valueToCase(x)}:`).join('')}
return false;
}`;
}

// NaN doesn't equal anything including itself, so it doesn't work as a
// switch case. Instead we must explicitly check for NaN before the switch.
if (nullValues.length !== noNaNs.length) {
fnBody = `if (x !== x) return false;\n${fnBody}`;
}

return new Function(`x`, `${fnBody}\nreturn true;`) as (value: T['TValue'] | TNull) => boolean;
}
```
This is the only place in apache-arrow that uses new Function.

I have been able to patch it locally and moved forward doing that. I'd like to know if there's any interest in having the library function out-of-the-box on CloudFlare. If so, we would be willing to refine our patch and submit for review.

Thank you.

### Component(s)

JavaScript

Contributor guide

Open the contributing guide

Assessment

This issue has not been assessed yet.

Get new issues in your inbox

A short digest of beginner-friendly GitHub issues.