The BrightScript Engine implements the BrightScript language specification up to Roku OS 15.3. However, some features and components remain unsupported or only partially implemented. These limitations fall into three categories: features planned for future development, components that will remain as mock objects for compatibility purposes, and functionality considered outside the project's scope. The following sections detail each category and its current status.
- Roku SceneGraph SDK support is currently being implemented as an extension published separately as the brs-scenegraph NPM package, with the following features implemented with some limitations:
- Load XML component files and create SceneGraph nodes tree.
- Basic support for
roSGNodeandroSGScreencomponents and rendering. - The
Tasknode is implemented but its behavior is limited:- For now only 10 concurrent task threads are supported per application, both in the browser and under Node.js/CLI
- Only one
portinstance can be used on Taskinit()to observe fields - Rendezvous is supported, but still not working properly for all edge cases.
Tasknodes never spawn under the synchronousexecuteFile()execution model of the Node.js library — useexecuteApp()for Task support, see the Node.js library guide.
- All concrete SceneGraph nodes documented by Roku are implemented. Because the engine is a simulator and not a hardware emulator, expect rendering differences from a real Roku device, and some nodes may not have full functionality yet — please open a GitHub issue if you find any problem or missing feature.
- The support for focus change animation on grids, lists and panel nodes is not implemented yet.
- The remaining abstract base nodes are not implemented on their own and fall back to a plain
Group(the Standard Dialog framework'sStdDlgAreaBase,StdDlgItemGroupandStdDlgGraphicItem). - Component Libraries are supported, both declared in XML (
<ComponentLibrary id="..." uri="..."/>) and created at runtime viaCreateObject("roSGNode", "ComponentLibrary")with theuriassigned in code. The component namespace is the library manifest'ssg_component_libs_providedvalue (falling back to the nodeidwhen not declared), so its components are referenced asLibraryName:ComponentName. Theurimay point to a local volume (pkg:/,tmp:/,ext1:/) or a remotehttp(s)://package (the configured CORS proxy is honored). Current limitations:- Libraries are fetched and compiled synchronously (the BrightScript event loop never yields, so an asynchronous load could not complete mid-execution). The node reports
loadStatus = "loading"immediately and the"ready"/"failed"transition is emitted on the next render frame, soobserveField("loadStatus", ...)callbacks are notified as on a real device — provided the app is pumping its screen message loop (wait(...)). - Inside a library,
pkg:/still resolves to the host app's package (not the library's own); reference a library's bundled scripts with relativeuripaths in its component XML. - Library
source/global functions and intra-library component inheritance (a library component extending another library component) are not supported yet. - Encrypted/signed libraries are not supported (plain
.ziponly).
- Libraries are fetched and compiled synchronously (the BrightScript event loop never yields, so an asynchronous load could not complete mid-execution). The node reports
- Audio playback is implemented via
roAudioResources,roAudioPlayercomponents andSoundEffect,Audionodes, but with some limitations:- Only one instance of
roAudioPlayercomponent orAudionode should be used, if more are created those will share the content playlist. - If the
roAudioPlayercomponent orAudionode instance is destroyed the audio keeps playing, make sure to stop the playback before discarding the object. - No
Timed Metadatasupport.
- Only one instance of
- The component
roAudioMetadataonly supports MP3 (for now). - The component
roImageMetadataonly supports JPEG images (for now). - Video playback is implemented via
roVideoPlayercomponent andVideonode, but with some limitations:- If the instance of
roVideoPlayerorVideois destroyed the video keeps playing, make sure tostopbefore discarding the object. - The following
roVideoPlayermethods are not supported, implemented as mock:setCGMS,setMaxVideoDecodeResolution,setTimedMetadataForKeys,getCaptionRenderer - Check what formats (container and codec) can be used on each browser, using
roDeviceInfo.canDecodeVideo(), to make sure your video can be played. - Under Node.js/CLI there is no audio or video output:
autoPlayEnabledis forced off and media events are only simulated, so apps behave as if playback never starts. - Subtitles are only supported for HLS streams and only in
Videonode, theroVideoPlayerdoes not support subtitles untilroCaptionRendereris implemented. - DASH streams and BIF (Base Index Frames) thumbnails are not yet supported.
- If the instance of
- The component
roUrlTransferis implemented with basic functionality but with the following limitations:- To make a web app access urls from domains other than the one it is hosted, the Cross-Origin Resource Sharing (CORS) browser policy requires the server called to respond with the header
Access-Control-Allow-Origin, read more.- A simple way to overcome this limitation is to use a CORS proxy like the cors-anywhere, see customization documentation to learn how to configure
brs-engineto use it. - If you are using a Chromium based browser (Chrome, Edge, Brave, etc) you can install this extension to bypass CORS.
- A simple way to overcome this limitation is to use a CORS proxy like the cors-anywhere, see customization documentation to learn how to configure
- The async methods are actually synchronous and evaluated when
WaitMessageorGetMessageare called. - Custom/Self-Signed SSL certificates are not supported, the engine will use default browser client certificate database.
- As custom certificates are not supported these methods are just mocked and do nothing:
EnablePeerVerification,EnableHostVerification,SetCertificatesDepth. - Cookies are only partially supported, if
EnableCookiesis called andEnableFreshConnectionis set tofalse, then Cookies from previous calls will be preserved. - The other Cookies related methods are just mocked and do nothing:
GetCookies,AddCookies,ClearCookies. - The following methods are also only mocked but do nothing:
EnableResume,SetHttpVersionandSetMinimumTransferRate.
- To make a web app access urls from domains other than the one it is hosted, the Cross-Origin Resource Sharing (CORS) browser policy requires the server called to respond with the header
- The complete Roku OS file system is available and shared among threads (main, render and tasks), with all volumes:
pkg:,common:,tmp:,cachefs:andext1:. By default, the external volume (ext1:) and the writeable volumes (tmp:cachefs:) are limited to 32 MB each. The writable volumestmp:andcachefs:are configurable, see customization documentation; theext1:limit is fixed. - The
roInputdeep link events are supported, but the events related to Voice Commands are not available yet. - The component
roAppMemoryMonitorwill only return measured data in Node.JS and Chromium browsers. For browsers the memory heap info only accounts for the main thread, as WebWorkers do not have support forperformance.memoryAPI. TheroAppMemoryMonitorEventis not yet implemented. - The global functions
Eval(),GetLastRunCompileError()andGetLastRunRuntimeError()are not available. - The string
modcannot be used as variable or function parameter name, because it conflicts with remainder operatorMod(Roku devices allows that). - Screensaver functionality is not yet implemented.
- SDK 1.0 deprecated components are not supported, but will be implemented in the future as a legacy apps preservation initiative.
- RAF (Roku Ads Framework) library that exposes
Roku_Adsobject is mocked with the most common methods available returning static values. - RED (Roku Event Dispatcher) and Google IMA3 libraries are also mocked.
- Channel Store components (
ChannelStore,roChannelStoreandroChannelStoreEvent) are mocked with support for thefakeServer()feature. - The
roStreamSocketandroDataGramSocketcomponents are mocked, and were only implemented to prevent crash on apps that use those. - The Text to Speech components (
roAudioGuide,roTextToSpeechandroMicrophone) and the Signing Algorithm components (roDSAandroRSA) are mocked: they expose their documented methods returning static values, but perform no real speech, recording or cryptographic signing. - Several components have their methods and events mocked, they return constant values to prevent crash. Those are mostly related to device behaviors that are not possible to replicate in a browser environment or simply not applicable to the engine.
- Roku OS User Interface.
- Roku Channel Store features.
- Video playback with Ads.