cloudworker
cloudworker copied to clipboard
Array literals aren't Arrays
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.
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?
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
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.