ringojs icon indicating copy to clipboard operation
ringojs copied to clipboard

Requiring `io` module should not polute the global scope

Open botic opened this issue 2 years ago • 1 comments

The io module introduces ByteArray and ByteString via defineClass(). This adds both to the engine's global host objects. This prevents using const in the context of i/o.

~ > ringo -e "ByteArray();"
ReferenceError: "ByteArray" is not defined.
	at <expr>:1

~ > ringo -e "const io = require('io'); console.log(ByteArray());"
[ByteArray 0]

I don't see a chance to fix this anyway, but leave this as an issue to discuss for the future. Maybe we find a non-radical solution to this problem.

botic avatar May 18 '22 08:05 botic

Rewriting this will be fun. The org.ringojs.wrappers.Binary class relies on initialization as host object inside the current RhinoEngine instance. The Java implementation of Binary registers the ByteArray and ByteString subtypes in a Rhino lifecycle hook with:

initClass(scope, prototype, Type.ByteArray);
initClass(scope, prototype, Type.ByteString);

I haven't found why these must be host objects of the engine. But I guess it's because there of CommonJS' Binary/B:

In multi-sandbox scenarios, the implementation should strive to consistently export the same "Binary", "ByteArray", and "ByteString"

botic avatar May 20 '22 11:05 botic