dollarshaveclub / cloudworker

Run Cloudflare Worker scripts locally
MIT License
516 stars 89 forks source link

Array literals aren't Arrays #123

Open fluidsonic opened 5 years ago

fluidsonic commented 5 years ago

For some reason [] instanceof Array is false when a script is run within Cloudworker. That messes up our script :)

No idea how that can happen but in plain Node and in a Cloudflare Worker it's working correctly.

Related: https://github.com/nodejs/node/issues/3425 Related: https://github.com/nodejs/node/issues/11593

I guess there isn't even a way around that when using Node's VM functionality. Cloudworker cannot reliably rebuild a Cloudflare Worker environment like that. As far as I know, Cloudflare Workers use v8 isolates instead.

hankjacobs commented 5 years ago

I’m pretty sure this has to do with an architectural issue I discuss here and improvements I made in an attempt to make the corners less sharp. It has to do with executing worker scripts within different node realms. Are you able to reproduce it in a worker with just [] instanceof Array in it?

fluidsonic commented 5 years ago

From what I understand about Node now there is no way to fix this issue.

The Array and Object types that you pass to the context will become contextified. Arrays created with [] and objects with {} are not contextified. Therefor using instanceof with contextified types on non-contextified literals will never work.

Simple example:

require('vm').runInNewContext('[] instanceof Array',{Array:Array}) // false
iameli commented 4 years ago

The way vm2 handles this is with Proxies — I don't know all the details but this apparently allows them to muck around around with the internals enough to get instanceof and everything functioning properly.