ringo / ringojs

RingoJS is a JavaScript platform built on the JVM and optimized for server-side applications.
https://ringojs.org
Apache License 2.0
838 stars 100 forks source link

Requiring `io` module should not polute the global scope #459

Open botic opened 2 years ago

botic commented 2 years ago

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 commented 2 years ago

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"