cloudworker icon indicating copy to clipboard operation
cloudworker copied to clipboard

Array literals aren't Arrays

Open fluidsonic opened this issue 5 years ago • 3 comments

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.

fluidsonic avatar Oct 02 '19 05:10 fluidsonic

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?

hankjacobs avatar Oct 13 '19 17:10 hankjacobs

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

fluidsonic avatar Oct 15 '19 09:10 fluidsonic

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.

iameli avatar Mar 27 '20 22:03 iameli