From ce16c2b37fd248c5c0cb5815a52f391721237c41 Mon Sep 17 00:00:00 2001 From: Evan Morgan Date: Wed, 1 Apr 2026 15:41:44 +0100 Subject: [PATCH 1/9] refactor(PE-987): restructure examples into browser, node-14, and node-18 subdirectories --- .../{ => browser}/bluetooth-scan/README.md | 0 .../bluetooth-scan/architecture.md | 0 .../{ => browser}/bluetooth-scan/autorun.brs | 0 .../{ => browser}/bluetooth-scan/index.html | 0 examples/{ => browser}/bs-sqlite-db/README.md | 0 .../bs-sqlite-db/architecture.md | 0 .../{ => browser}/bs-sqlite-db/autorun.brs | 0 examples/{ => browser}/bs-sqlite-db/index.js | 0 .../cec-interface/architecture.md | 0 .../cec-interface/brightscript/README.md | 0 .../cec-interface/brightscript/autorun.brs | 0 .../cec-interface/brightscript/index.html | 0 .../cec-interface/javascript/README.md | 0 .../cec-interface/javascript/autorun.brs | 0 .../cec-interface/javascript/index.html | 0 .../cec-interface/javascript/index.js | 0 examples/{ => browser}/enable-ldws/README.md | 0 .../{ => browser}/enable-ldws/architecture.md | 0 .../{ => browser}/enable-ldws/autorun.brs | 0 .../enable-ldws/javascript/autorun.brs | 0 .../enable-ldws/javascript/index.js | 0 .../enable-ldws/registry-config/autorun.brs | 0 examples/{ => browser}/html-starter/README.md | 0 .../html-starter/architecture.md | 0 .../{ => browser}/html-starter/autorun.brs | 0 .../{ => browser}/html-starter/index.html | 0 .../html-starter/static/XD-1035.png | Bin .../html-starter/static/logo192.png | Bin .../htmlwidget-iframes/README.md | 0 .../htmlwidget-iframes/architecture.md | 0 .../htmlwidget-iframes/autorun.brs | 0 .../{ => browser}/indexeddb-caching/README.md | 0 .../indexeddb-caching/architecture.md | 0 .../indexeddb-caching/autorun.brs | 0 .../indexeddb-caching/index.html | 0 .../{ => browser}/local-storage/README.md | 0 .../local-storage/architecture.md | 0 .../{ => browser}/local-storage/autorun.brs | 0 .../{ => browser}/local-storage/index.html | 0 .../send-plugin-message/README.md | 0 .../send-plugin-message/architecture.md | 0 .../plugin-message-transfer.bpfx | 0 .../send-plugin-message/pluginMessageApp.html | 0 .../pluginMessageTransfer.brs | 0 .../{ => browser}/syncmanager-js/README.md | 0 .../{ => browser}/syncmanager-js/autorun.brs | 0 .../syncmanager-js/index-follower.html | 0 .../syncmanager-js/index-leader.html | 0 .../autorun-zip-package/.gitignore | 0 .../autorun-zip-package/CHANGELOG.md | 0 .../autorun-zip-package/README.md | 0 .../autorun-zip-package/STRUCTURE.md | 0 .../autorun-zip-package/build-autorun-zip.js | 0 .../autorun-zip-package/package.json | 4 +- .../setup-files/autorun.brs | 0 .../setup-files/autozip.brs | 0 .../setup-files/brightsign-dumps/.gitkeep | 0 .../setup-files/config/app-config.json | 0 .../setup-files/index.html | 0 .../setup-files/logs/.gitkeep | 0 .../node-simple-server/README.md | 98 +++++++++++------- .../node-simple-server/architecture.md | 18 ++-- .../node-simple-server/jest.config.js | 0 .../node-simple-server/package.json | 8 +- .../src/__mocks__/@brightsign/deviceinfo.js | 0 .../node-simple-server/src/app.js | 0 .../node-simple-server/src/app.test.js | 0 .../node-simple-server/src/autorun.brs | 0 .../node-simple-server/src/index.js | 0 .../node-simple-server/webpack.config.js | 0 examples/{ => node-14}/node-starter/README.md | 0 .../node-starter/architecture.md | 0 .../{ => node-14}/node-starter/autorun.brs | 0 examples/{ => node-14}/node-starter/index.js | 0 .../{ => node-18}/bs-self-updater/README.md | 0 .../bs-self-updater/architecture.md | 0 .../{ => node-18}/bs-self-updater/autorun.brs | 0 .../{ => node-18}/bs-self-updater/index.ts | 0 .../bs-self-updater/package.json | 4 +- .../bs-self-updater/server/autorun.zip | Bin .../bs-self-updater/server/index.js | 0 .../bs-self-updater/server/package.json | 0 .../bs-self-updater/tsconfig.json | 0 .../bs-self-updater/webpack.config.js | 0 .../provisioning-server/.dockerignore | 0 .../provisioning-server/.gitignore | 0 .../provisioning-server/Dockerfile | 0 .../provisioning-server/README.md | 0 .../provisioning-server/architecture.md | 0 .../provisioning-server/autorun/provision.brs | 0 .../provisioning-server/content/autorun.brs | 0 .../provisioning-server/content/index.html | 0 .../content/static/XD-1035.png | Bin .../content/static/logo192.png | Bin .../provisioning-server/docker-compose.yml | 0 .../provisioning-server/package.json | 0 .../provisioning-server/server.js | 0 .../{ => node-18}/self-signed-certs/README.md | 0 .../self-signed-certs/architecture.md | 0 .../{ => node-18}/self-signed-certs/index.js | 0 package.json | 18 +--- 101 files changed, 80 insertions(+), 70 deletions(-) rename examples/{ => browser}/bluetooth-scan/README.md (100%) rename examples/{ => browser}/bluetooth-scan/architecture.md (100%) rename examples/{ => browser}/bluetooth-scan/autorun.brs (100%) rename examples/{ => browser}/bluetooth-scan/index.html (100%) rename examples/{ => browser}/bs-sqlite-db/README.md (100%) rename examples/{ => browser}/bs-sqlite-db/architecture.md (100%) rename examples/{ => browser}/bs-sqlite-db/autorun.brs (100%) rename examples/{ => browser}/bs-sqlite-db/index.js (100%) rename examples/{ => browser}/cec-interface/architecture.md (100%) rename examples/{ => browser}/cec-interface/brightscript/README.md (100%) rename examples/{ => browser}/cec-interface/brightscript/autorun.brs (100%) rename examples/{ => browser}/cec-interface/brightscript/index.html (100%) rename examples/{ => browser}/cec-interface/javascript/README.md (100%) rename examples/{ => browser}/cec-interface/javascript/autorun.brs (100%) rename examples/{ => browser}/cec-interface/javascript/index.html (100%) rename examples/{ => browser}/cec-interface/javascript/index.js (100%) rename examples/{ => browser}/enable-ldws/README.md (100%) rename examples/{ => browser}/enable-ldws/architecture.md (100%) rename examples/{ => browser}/enable-ldws/autorun.brs (100%) rename examples/{ => browser}/enable-ldws/javascript/autorun.brs (100%) rename examples/{ => browser}/enable-ldws/javascript/index.js (100%) rename examples/{ => browser}/enable-ldws/registry-config/autorun.brs (100%) rename examples/{ => browser}/html-starter/README.md (100%) rename examples/{ => browser}/html-starter/architecture.md (100%) rename examples/{ => browser}/html-starter/autorun.brs (100%) rename examples/{ => browser}/html-starter/index.html (100%) rename examples/{ => browser}/html-starter/static/XD-1035.png (100%) rename examples/{ => browser}/html-starter/static/logo192.png (100%) rename examples/{ => browser}/htmlwidget-iframes/README.md (100%) rename examples/{ => browser}/htmlwidget-iframes/architecture.md (100%) rename examples/{ => browser}/htmlwidget-iframes/autorun.brs (100%) rename examples/{ => browser}/indexeddb-caching/README.md (100%) rename examples/{ => browser}/indexeddb-caching/architecture.md (100%) rename examples/{ => browser}/indexeddb-caching/autorun.brs (100%) rename examples/{ => browser}/indexeddb-caching/index.html (100%) rename examples/{ => browser}/local-storage/README.md (100%) rename examples/{ => browser}/local-storage/architecture.md (100%) rename examples/{ => browser}/local-storage/autorun.brs (100%) rename examples/{ => browser}/local-storage/index.html (100%) rename examples/{ => browser}/send-plugin-message/README.md (100%) rename examples/{ => browser}/send-plugin-message/architecture.md (100%) rename examples/{ => browser}/send-plugin-message/plugin-message-transfer.bpfx (100%) rename examples/{ => browser}/send-plugin-message/pluginMessageApp.html (100%) rename examples/{ => browser}/send-plugin-message/pluginMessageTransfer.brs (100%) rename examples/{ => browser}/syncmanager-js/README.md (100%) rename examples/{ => browser}/syncmanager-js/autorun.brs (100%) rename examples/{ => browser}/syncmanager-js/index-follower.html (100%) rename examples/{ => browser}/syncmanager-js/index-leader.html (100%) rename examples/{ => node-14}/autorun-zip-package/.gitignore (100%) rename examples/{ => node-14}/autorun-zip-package/CHANGELOG.md (100%) rename examples/{ => node-14}/autorun-zip-package/README.md (100%) rename examples/{ => node-14}/autorun-zip-package/STRUCTURE.md (100%) rename examples/{ => node-14}/autorun-zip-package/build-autorun-zip.js (100%) rename examples/{ => node-14}/autorun-zip-package/package.json (78%) rename examples/{ => node-14}/autorun-zip-package/setup-files/autorun.brs (100%) rename examples/{ => node-14}/autorun-zip-package/setup-files/autozip.brs (100%) rename examples/{ => node-14}/autorun-zip-package/setup-files/brightsign-dumps/.gitkeep (100%) rename examples/{ => node-14}/autorun-zip-package/setup-files/config/app-config.json (100%) rename examples/{ => node-14}/autorun-zip-package/setup-files/index.html (100%) rename examples/{ => node-14}/autorun-zip-package/setup-files/logs/.gitkeep (100%) rename examples/{ => node-14}/node-simple-server/README.md (62%) rename examples/{ => node-14}/node-simple-server/architecture.md (80%) rename examples/{ => node-14}/node-simple-server/jest.config.js (100%) rename examples/{ => node-14}/node-simple-server/package.json (70%) rename examples/{ => node-14}/node-simple-server/src/__mocks__/@brightsign/deviceinfo.js (100%) rename examples/{ => node-14}/node-simple-server/src/app.js (100%) rename examples/{ => node-14}/node-simple-server/src/app.test.js (100%) rename examples/{ => node-14}/node-simple-server/src/autorun.brs (100%) rename examples/{ => node-14}/node-simple-server/src/index.js (100%) rename examples/{ => node-14}/node-simple-server/webpack.config.js (100%) rename examples/{ => node-14}/node-starter/README.md (100%) rename examples/{ => node-14}/node-starter/architecture.md (100%) rename examples/{ => node-14}/node-starter/autorun.brs (100%) rename examples/{ => node-14}/node-starter/index.js (100%) rename examples/{ => node-18}/bs-self-updater/README.md (100%) rename examples/{ => node-18}/bs-self-updater/architecture.md (100%) rename examples/{ => node-18}/bs-self-updater/autorun.brs (100%) rename examples/{ => node-18}/bs-self-updater/index.ts (100%) rename examples/{ => node-18}/bs-self-updater/package.json (77%) rename examples/{ => node-18}/bs-self-updater/server/autorun.zip (100%) rename examples/{ => node-18}/bs-self-updater/server/index.js (100%) rename examples/{ => node-18}/bs-self-updater/server/package.json (100%) rename examples/{ => node-18}/bs-self-updater/tsconfig.json (100%) rename examples/{ => node-18}/bs-self-updater/webpack.config.js (100%) rename examples/{ => node-18}/provisioning-server/.dockerignore (100%) rename examples/{ => node-18}/provisioning-server/.gitignore (100%) rename examples/{ => node-18}/provisioning-server/Dockerfile (100%) rename examples/{ => node-18}/provisioning-server/README.md (100%) rename examples/{ => node-18}/provisioning-server/architecture.md (100%) rename examples/{ => node-18}/provisioning-server/autorun/provision.brs (100%) rename examples/{ => node-18}/provisioning-server/content/autorun.brs (100%) rename examples/{ => node-18}/provisioning-server/content/index.html (100%) rename examples/{ => node-18}/provisioning-server/content/static/XD-1035.png (100%) rename examples/{ => node-18}/provisioning-server/content/static/logo192.png (100%) rename examples/{ => node-18}/provisioning-server/docker-compose.yml (100%) rename examples/{ => node-18}/provisioning-server/package.json (100%) rename examples/{ => node-18}/provisioning-server/server.js (100%) rename examples/{ => node-18}/self-signed-certs/README.md (100%) rename examples/{ => node-18}/self-signed-certs/architecture.md (100%) rename examples/{ => node-18}/self-signed-certs/index.js (100%) diff --git a/examples/bluetooth-scan/README.md b/examples/browser/bluetooth-scan/README.md similarity index 100% rename from examples/bluetooth-scan/README.md rename to examples/browser/bluetooth-scan/README.md diff --git a/examples/bluetooth-scan/architecture.md b/examples/browser/bluetooth-scan/architecture.md similarity index 100% rename from examples/bluetooth-scan/architecture.md rename to examples/browser/bluetooth-scan/architecture.md diff --git a/examples/bluetooth-scan/autorun.brs b/examples/browser/bluetooth-scan/autorun.brs similarity index 100% rename from examples/bluetooth-scan/autorun.brs rename to examples/browser/bluetooth-scan/autorun.brs diff --git a/examples/bluetooth-scan/index.html b/examples/browser/bluetooth-scan/index.html similarity index 100% rename from examples/bluetooth-scan/index.html rename to examples/browser/bluetooth-scan/index.html diff --git a/examples/bs-sqlite-db/README.md b/examples/browser/bs-sqlite-db/README.md similarity index 100% rename from examples/bs-sqlite-db/README.md rename to examples/browser/bs-sqlite-db/README.md diff --git a/examples/bs-sqlite-db/architecture.md b/examples/browser/bs-sqlite-db/architecture.md similarity index 100% rename from examples/bs-sqlite-db/architecture.md rename to examples/browser/bs-sqlite-db/architecture.md diff --git a/examples/bs-sqlite-db/autorun.brs b/examples/browser/bs-sqlite-db/autorun.brs similarity index 100% rename from examples/bs-sqlite-db/autorun.brs rename to examples/browser/bs-sqlite-db/autorun.brs diff --git a/examples/bs-sqlite-db/index.js b/examples/browser/bs-sqlite-db/index.js similarity index 100% rename from examples/bs-sqlite-db/index.js rename to examples/browser/bs-sqlite-db/index.js diff --git a/examples/cec-interface/architecture.md b/examples/browser/cec-interface/architecture.md similarity index 100% rename from examples/cec-interface/architecture.md rename to examples/browser/cec-interface/architecture.md diff --git a/examples/cec-interface/brightscript/README.md b/examples/browser/cec-interface/brightscript/README.md similarity index 100% rename from examples/cec-interface/brightscript/README.md rename to examples/browser/cec-interface/brightscript/README.md diff --git a/examples/cec-interface/brightscript/autorun.brs b/examples/browser/cec-interface/brightscript/autorun.brs similarity index 100% rename from examples/cec-interface/brightscript/autorun.brs rename to examples/browser/cec-interface/brightscript/autorun.brs diff --git a/examples/cec-interface/brightscript/index.html b/examples/browser/cec-interface/brightscript/index.html similarity index 100% rename from examples/cec-interface/brightscript/index.html rename to examples/browser/cec-interface/brightscript/index.html diff --git a/examples/cec-interface/javascript/README.md b/examples/browser/cec-interface/javascript/README.md similarity index 100% rename from examples/cec-interface/javascript/README.md rename to examples/browser/cec-interface/javascript/README.md diff --git a/examples/cec-interface/javascript/autorun.brs b/examples/browser/cec-interface/javascript/autorun.brs similarity index 100% rename from examples/cec-interface/javascript/autorun.brs rename to examples/browser/cec-interface/javascript/autorun.brs diff --git a/examples/cec-interface/javascript/index.html b/examples/browser/cec-interface/javascript/index.html similarity index 100% rename from examples/cec-interface/javascript/index.html rename to examples/browser/cec-interface/javascript/index.html diff --git a/examples/cec-interface/javascript/index.js b/examples/browser/cec-interface/javascript/index.js similarity index 100% rename from examples/cec-interface/javascript/index.js rename to examples/browser/cec-interface/javascript/index.js diff --git a/examples/enable-ldws/README.md b/examples/browser/enable-ldws/README.md similarity index 100% rename from examples/enable-ldws/README.md rename to examples/browser/enable-ldws/README.md diff --git a/examples/enable-ldws/architecture.md b/examples/browser/enable-ldws/architecture.md similarity index 100% rename from examples/enable-ldws/architecture.md rename to examples/browser/enable-ldws/architecture.md diff --git a/examples/enable-ldws/autorun.brs b/examples/browser/enable-ldws/autorun.brs similarity index 100% rename from examples/enable-ldws/autorun.brs rename to examples/browser/enable-ldws/autorun.brs diff --git a/examples/enable-ldws/javascript/autorun.brs b/examples/browser/enable-ldws/javascript/autorun.brs similarity index 100% rename from examples/enable-ldws/javascript/autorun.brs rename to examples/browser/enable-ldws/javascript/autorun.brs diff --git a/examples/enable-ldws/javascript/index.js b/examples/browser/enable-ldws/javascript/index.js similarity index 100% rename from examples/enable-ldws/javascript/index.js rename to examples/browser/enable-ldws/javascript/index.js diff --git a/examples/enable-ldws/registry-config/autorun.brs b/examples/browser/enable-ldws/registry-config/autorun.brs similarity index 100% rename from examples/enable-ldws/registry-config/autorun.brs rename to examples/browser/enable-ldws/registry-config/autorun.brs diff --git a/examples/html-starter/README.md b/examples/browser/html-starter/README.md similarity index 100% rename from examples/html-starter/README.md rename to examples/browser/html-starter/README.md diff --git a/examples/html-starter/architecture.md b/examples/browser/html-starter/architecture.md similarity index 100% rename from examples/html-starter/architecture.md rename to examples/browser/html-starter/architecture.md diff --git a/examples/html-starter/autorun.brs b/examples/browser/html-starter/autorun.brs similarity index 100% rename from examples/html-starter/autorun.brs rename to examples/browser/html-starter/autorun.brs diff --git a/examples/html-starter/index.html b/examples/browser/html-starter/index.html similarity index 100% rename from examples/html-starter/index.html rename to examples/browser/html-starter/index.html diff --git a/examples/html-starter/static/XD-1035.png b/examples/browser/html-starter/static/XD-1035.png similarity index 100% rename from examples/html-starter/static/XD-1035.png rename to examples/browser/html-starter/static/XD-1035.png diff --git a/examples/html-starter/static/logo192.png b/examples/browser/html-starter/static/logo192.png similarity index 100% rename from examples/html-starter/static/logo192.png rename to examples/browser/html-starter/static/logo192.png diff --git a/examples/htmlwidget-iframes/README.md b/examples/browser/htmlwidget-iframes/README.md similarity index 100% rename from examples/htmlwidget-iframes/README.md rename to examples/browser/htmlwidget-iframes/README.md diff --git a/examples/htmlwidget-iframes/architecture.md b/examples/browser/htmlwidget-iframes/architecture.md similarity index 100% rename from examples/htmlwidget-iframes/architecture.md rename to examples/browser/htmlwidget-iframes/architecture.md diff --git a/examples/htmlwidget-iframes/autorun.brs b/examples/browser/htmlwidget-iframes/autorun.brs similarity index 100% rename from examples/htmlwidget-iframes/autorun.brs rename to examples/browser/htmlwidget-iframes/autorun.brs diff --git a/examples/indexeddb-caching/README.md b/examples/browser/indexeddb-caching/README.md similarity index 100% rename from examples/indexeddb-caching/README.md rename to examples/browser/indexeddb-caching/README.md diff --git a/examples/indexeddb-caching/architecture.md b/examples/browser/indexeddb-caching/architecture.md similarity index 100% rename from examples/indexeddb-caching/architecture.md rename to examples/browser/indexeddb-caching/architecture.md diff --git a/examples/indexeddb-caching/autorun.brs b/examples/browser/indexeddb-caching/autorun.brs similarity index 100% rename from examples/indexeddb-caching/autorun.brs rename to examples/browser/indexeddb-caching/autorun.brs diff --git a/examples/indexeddb-caching/index.html b/examples/browser/indexeddb-caching/index.html similarity index 100% rename from examples/indexeddb-caching/index.html rename to examples/browser/indexeddb-caching/index.html diff --git a/examples/local-storage/README.md b/examples/browser/local-storage/README.md similarity index 100% rename from examples/local-storage/README.md rename to examples/browser/local-storage/README.md diff --git a/examples/local-storage/architecture.md b/examples/browser/local-storage/architecture.md similarity index 100% rename from examples/local-storage/architecture.md rename to examples/browser/local-storage/architecture.md diff --git a/examples/local-storage/autorun.brs b/examples/browser/local-storage/autorun.brs similarity index 100% rename from examples/local-storage/autorun.brs rename to examples/browser/local-storage/autorun.brs diff --git a/examples/local-storage/index.html b/examples/browser/local-storage/index.html similarity index 100% rename from examples/local-storage/index.html rename to examples/browser/local-storage/index.html diff --git a/examples/send-plugin-message/README.md b/examples/browser/send-plugin-message/README.md similarity index 100% rename from examples/send-plugin-message/README.md rename to examples/browser/send-plugin-message/README.md diff --git a/examples/send-plugin-message/architecture.md b/examples/browser/send-plugin-message/architecture.md similarity index 100% rename from examples/send-plugin-message/architecture.md rename to examples/browser/send-plugin-message/architecture.md diff --git a/examples/send-plugin-message/plugin-message-transfer.bpfx b/examples/browser/send-plugin-message/plugin-message-transfer.bpfx similarity index 100% rename from examples/send-plugin-message/plugin-message-transfer.bpfx rename to examples/browser/send-plugin-message/plugin-message-transfer.bpfx diff --git a/examples/send-plugin-message/pluginMessageApp.html b/examples/browser/send-plugin-message/pluginMessageApp.html similarity index 100% rename from examples/send-plugin-message/pluginMessageApp.html rename to examples/browser/send-plugin-message/pluginMessageApp.html diff --git a/examples/send-plugin-message/pluginMessageTransfer.brs b/examples/browser/send-plugin-message/pluginMessageTransfer.brs similarity index 100% rename from examples/send-plugin-message/pluginMessageTransfer.brs rename to examples/browser/send-plugin-message/pluginMessageTransfer.brs diff --git a/examples/syncmanager-js/README.md b/examples/browser/syncmanager-js/README.md similarity index 100% rename from examples/syncmanager-js/README.md rename to examples/browser/syncmanager-js/README.md diff --git a/examples/syncmanager-js/autorun.brs b/examples/browser/syncmanager-js/autorun.brs similarity index 100% rename from examples/syncmanager-js/autorun.brs rename to examples/browser/syncmanager-js/autorun.brs diff --git a/examples/syncmanager-js/index-follower.html b/examples/browser/syncmanager-js/index-follower.html similarity index 100% rename from examples/syncmanager-js/index-follower.html rename to examples/browser/syncmanager-js/index-follower.html diff --git a/examples/syncmanager-js/index-leader.html b/examples/browser/syncmanager-js/index-leader.html similarity index 100% rename from examples/syncmanager-js/index-leader.html rename to examples/browser/syncmanager-js/index-leader.html diff --git a/examples/autorun-zip-package/.gitignore b/examples/node-14/autorun-zip-package/.gitignore similarity index 100% rename from examples/autorun-zip-package/.gitignore rename to examples/node-14/autorun-zip-package/.gitignore diff --git a/examples/autorun-zip-package/CHANGELOG.md b/examples/node-14/autorun-zip-package/CHANGELOG.md similarity index 100% rename from examples/autorun-zip-package/CHANGELOG.md rename to examples/node-14/autorun-zip-package/CHANGELOG.md diff --git a/examples/autorun-zip-package/README.md b/examples/node-14/autorun-zip-package/README.md similarity index 100% rename from examples/autorun-zip-package/README.md rename to examples/node-14/autorun-zip-package/README.md diff --git a/examples/autorun-zip-package/STRUCTURE.md b/examples/node-14/autorun-zip-package/STRUCTURE.md similarity index 100% rename from examples/autorun-zip-package/STRUCTURE.md rename to examples/node-14/autorun-zip-package/STRUCTURE.md diff --git a/examples/autorun-zip-package/build-autorun-zip.js b/examples/node-14/autorun-zip-package/build-autorun-zip.js similarity index 100% rename from examples/autorun-zip-package/build-autorun-zip.js rename to examples/node-14/autorun-zip-package/build-autorun-zip.js diff --git a/examples/autorun-zip-package/package.json b/examples/node-14/autorun-zip-package/package.json similarity index 78% rename from examples/autorun-zip-package/package.json rename to examples/node-14/autorun-zip-package/package.json index dd25b1a..6beaecd 100644 --- a/examples/autorun-zip-package/package.json +++ b/examples/node-14/autorun-zip-package/package.json @@ -5,7 +5,7 @@ "private": true, "scripts": { "build": "node build-autorun-zip.js", - "format": "prettier . --write --config ../../.prettierrc.js --cache --cache-location=../../prettiercache", + "format": "prettier . --write --config ../../../.prettierrc.js --cache --cache-location=../../../prettiercache", "lint": "echo 'No linting needed for BrightScript files'" }, "dependencies": { @@ -22,6 +22,6 @@ "repository": { "type": "git", "url": "https://github.com/brightsign/dev-cookbook", - "directory": "examples/autorun-zip-package" + "directory": "examples/node-14/autorun-zip-package" } } diff --git a/examples/autorun-zip-package/setup-files/autorun.brs b/examples/node-14/autorun-zip-package/setup-files/autorun.brs similarity index 100% rename from examples/autorun-zip-package/setup-files/autorun.brs rename to examples/node-14/autorun-zip-package/setup-files/autorun.brs diff --git a/examples/autorun-zip-package/setup-files/autozip.brs b/examples/node-14/autorun-zip-package/setup-files/autozip.brs similarity index 100% rename from examples/autorun-zip-package/setup-files/autozip.brs rename to examples/node-14/autorun-zip-package/setup-files/autozip.brs diff --git a/examples/autorun-zip-package/setup-files/brightsign-dumps/.gitkeep b/examples/node-14/autorun-zip-package/setup-files/brightsign-dumps/.gitkeep similarity index 100% rename from examples/autorun-zip-package/setup-files/brightsign-dumps/.gitkeep rename to examples/node-14/autorun-zip-package/setup-files/brightsign-dumps/.gitkeep diff --git a/examples/autorun-zip-package/setup-files/config/app-config.json b/examples/node-14/autorun-zip-package/setup-files/config/app-config.json similarity index 100% rename from examples/autorun-zip-package/setup-files/config/app-config.json rename to examples/node-14/autorun-zip-package/setup-files/config/app-config.json diff --git a/examples/autorun-zip-package/setup-files/index.html b/examples/node-14/autorun-zip-package/setup-files/index.html similarity index 100% rename from examples/autorun-zip-package/setup-files/index.html rename to examples/node-14/autorun-zip-package/setup-files/index.html diff --git a/examples/autorun-zip-package/setup-files/logs/.gitkeep b/examples/node-14/autorun-zip-package/setup-files/logs/.gitkeep similarity index 100% rename from examples/autorun-zip-package/setup-files/logs/.gitkeep rename to examples/node-14/autorun-zip-package/setup-files/logs/.gitkeep diff --git a/examples/node-simple-server/README.md b/examples/node-14/node-simple-server/README.md similarity index 62% rename from examples/node-simple-server/README.md rename to examples/node-14/node-simple-server/README.md index 6a19a03..1687d4e 100644 --- a/examples/node-simple-server/README.md +++ b/examples/node-14/node-simple-server/README.md @@ -2,67 +2,75 @@ ## Overview -This example is designed to help you get familiarized with running Node.js on a BrightSign player. It demonstrates how to run a Node.js server directly on the player that can serve both static files and fetch device information. Additionally, it introduces tools and configurations that go beyond the basics covered in starter examples. +This example is designed to help you get familiarized with running Node.js on a BrightSign player. It demonstrates how to run a Node.js server directly on the player that can serve both static files and fetch device information. Additionally, it introduces tools and configurations that go beyond the basics covered in starter examples. The core Node.js application is defined in `app.js`, which: -- Serves static files from the `/storage/sd/` directory -- Provides device information via a REST API endpoint -- Includes proper content-type handling for common file types + +- Serves static files from the `/storage/sd/` directory +- Provides device information via a REST API endpoint +- Includes proper content-type handling for common file types ## Static File Serving This example includes a built-in static file server that serves files from the `/storage/sd/` directory. The server: -- Automatically serves `index.html` when accessing the root URL (`/`) -- Handles common file types with appropriate content-type headers (HTML, CSS, JavaScript, images) -- Returns 404 errors for files that don't exist + +- Automatically serves `index.html` when accessing the root URL (`/`) +- Handles common file types with appropriate content-type headers (HTML, CSS, JavaScript, images) +- Returns 404 errors for files that don't exist ### Example Usage 1. Create an `index.html` file in your SD card root: + ```html - - My BrightSign App - - -

Hello from BrightSign!

-
- - + }); + + ``` 2. Access your content: - - Main page: `http://:13131/` - - Individual files: `http://:13131/styles.css`, `http://:13131/images/logo.png`, etc. + + - Main page: `http://:13131/` + - Individual files: `http://:13131/styles.css`, `http://:13131/images/logo.png`, etc. 3. Supported file types: - - HTML (`.html`): `text/html` - - JavaScript (`.js`): `text/javascript` - - CSS (`.css`): `text/css` - - JSON (`.json`): `application/json` - - Images (`.png`, `.jpg`): `image/png`, `image/jpeg` - - Other files: `text/plain` + - HTML (`.html`): `text/html` + - JavaScript (`.js`): `text/javascript` + - CSS (`.css`): `text/css` + - JSON (`.json`): `application/json` + - Images (`.png`, `.jpg`): `image/png`, `image/jpeg` + - Other files: `text/plain` ## Building and Running the Application ### Step 1: Install Dependencies + Ensure that Node.js is installed on your machine. From your project directory, install the necessary dependencies by running the following command: + ```bash npm install ``` Next, build and bundle the application: + ```bash npm run build ``` @@ -70,7 +78,9 @@ npm run build ### Step 2: Transfer Files to the Player #### Manual Transfer + After the application is bundled, you need to transfer the required files to your BrightSign player: + 1. Copy the `dist` folder to the SD card 2. Place the `autorun.brs` file at the root of the SD card 3. Place any static files (HTML, CSS, images) you want to serve in the root of the SD card @@ -78,19 +88,23 @@ After the application is bundled, you need to transfer the required files to you 5. Reboot the player #### Automated Transfer Using BrightSign CLI for DWS + BrightSign's player CLI: [player-CLI](https://www.npmjs.com/package/@brightsign/bsc). To deploy this app with the CLI: Configure the CLI by choosing a name for your player and passing your player's information: + ```sh bsc local player --add --player playerName --ip ip-address --user username --pass password --storage sd ``` This is an example command for pushing files to your player: + ```sh bsc local file --upload --player playerName --file ./path-to-your-file --destination sd/path-on-player ``` Alternatively, there is a script that can be run that is configured for this application: + ```sh npm run upload --playerName=playerName ``` @@ -102,21 +116,25 @@ Once the player is running, you can access the Node.js server from a web browser #### Available Endpoints 1. Static Files: - ``` - http://:13131/ - ``` - Serves files from the `/storage/sd/` directory. The root URL (`/`) will serve `index.html` if present. + + ``` + http://:13131/ + ``` + + Serves files from the `/storage/sd/` directory. The root URL (`/`) will serve `index.html` if present. 2. Device Info API: - ``` - http://:13131/api/device-info - ``` - Returns JSON with device information like model, OS version, and serial number. + ``` + http://:13131/api/device-info + ``` + Returns JSON with device information like model, OS version, and serial number. ## Testing and mocking This example is equipped with basic mocking to make testing easier with local development. In the `__mocks__` directory, there is a `deviceinfo.js` file which defines mock values when the application is run in a development environment. To run the test(s) located in `App.test.js`, execute the following: + ```bash -npm run test \ No newline at end of file +npm run test +``` diff --git a/examples/node-simple-server/architecture.md b/examples/node-14/node-simple-server/architecture.md similarity index 80% rename from examples/node-simple-server/architecture.md rename to examples/node-14/node-simple-server/architecture.md index 28b1d02..65f7e1a 100644 --- a/examples/node-simple-server/architecture.md +++ b/examples/node-14/node-simple-server/architecture.md @@ -24,13 +24,15 @@ graph TD ``` ## Endpoints -- `/` → index.html -- `/api/device-info` → JSON + +- `/` → index.html +- `/api/device-info` → JSON ## Legend -- **Blue**: BrightSign Player -- **Orange**: BrightScript -- **Purple**: Node.js Application -- **Green**: API Endpoint -- **Light Gray**: File/Content -- **Gray**: Network/Browser + +- **Blue**: BrightSign Player +- **Orange**: BrightScript +- **Purple**: Node.js Application +- **Green**: API Endpoint +- **Light Gray**: File/Content +- **Gray**: Network/Browser diff --git a/examples/node-simple-server/jest.config.js b/examples/node-14/node-simple-server/jest.config.js similarity index 100% rename from examples/node-simple-server/jest.config.js rename to examples/node-14/node-simple-server/jest.config.js diff --git a/examples/node-simple-server/package.json b/examples/node-14/node-simple-server/package.json similarity index 70% rename from examples/node-simple-server/package.json rename to examples/node-14/node-simple-server/package.json index 121ef8d..df44ad4 100644 --- a/examples/node-simple-server/package.json +++ b/examples/node-14/node-simple-server/package.json @@ -7,15 +7,15 @@ "test": "jest --config jest.config.js src/", "build:prod": "webpack --mode=production --node-env=production", "build": "webpack --mode=development", - "format:check": "prettier . --check --config ../.prettierrc.js --cache --cache-location=../prettiercache", - "format": "prettier . --write --config ../.prettierrc.js --cache --cache-location=../prettiercache && yarn lint --fix", - "lint": "eslint --no-error-on-unmatched-pattern --config ../../.eslintrc src/**/*.{js,jsx}", + "format:check": "prettier . --check --config ../../../.prettierrc.js --cache --cache-location=../../../prettiercache", + "format": "prettier . --write --config ../../../.prettierrc.js --cache --cache-location=../../../prettiercache && yarn lint --fix", + "lint": "eslint --no-error-on-unmatched-pattern --config ../../../.eslintrc src/**/*.{js,jsx}", "publish-package": "npm publish --access public" }, "repository": { "url": "https://github.com/brightsign/dev-cookbook.git", "type": "git", - "directory": "node-simple-server-example/" + "directory": "examples/node-14/node-simple-server" }, "publishConfig": { "registry": "https://registry.npmjs.org" diff --git a/examples/node-simple-server/src/__mocks__/@brightsign/deviceinfo.js b/examples/node-14/node-simple-server/src/__mocks__/@brightsign/deviceinfo.js similarity index 100% rename from examples/node-simple-server/src/__mocks__/@brightsign/deviceinfo.js rename to examples/node-14/node-simple-server/src/__mocks__/@brightsign/deviceinfo.js diff --git a/examples/node-simple-server/src/app.js b/examples/node-14/node-simple-server/src/app.js similarity index 100% rename from examples/node-simple-server/src/app.js rename to examples/node-14/node-simple-server/src/app.js diff --git a/examples/node-simple-server/src/app.test.js b/examples/node-14/node-simple-server/src/app.test.js similarity index 100% rename from examples/node-simple-server/src/app.test.js rename to examples/node-14/node-simple-server/src/app.test.js diff --git a/examples/node-simple-server/src/autorun.brs b/examples/node-14/node-simple-server/src/autorun.brs similarity index 100% rename from examples/node-simple-server/src/autorun.brs rename to examples/node-14/node-simple-server/src/autorun.brs diff --git a/examples/node-simple-server/src/index.js b/examples/node-14/node-simple-server/src/index.js similarity index 100% rename from examples/node-simple-server/src/index.js rename to examples/node-14/node-simple-server/src/index.js diff --git a/examples/node-simple-server/webpack.config.js b/examples/node-14/node-simple-server/webpack.config.js similarity index 100% rename from examples/node-simple-server/webpack.config.js rename to examples/node-14/node-simple-server/webpack.config.js diff --git a/examples/node-starter/README.md b/examples/node-14/node-starter/README.md similarity index 100% rename from examples/node-starter/README.md rename to examples/node-14/node-starter/README.md diff --git a/examples/node-starter/architecture.md b/examples/node-14/node-starter/architecture.md similarity index 100% rename from examples/node-starter/architecture.md rename to examples/node-14/node-starter/architecture.md diff --git a/examples/node-starter/autorun.brs b/examples/node-14/node-starter/autorun.brs similarity index 100% rename from examples/node-starter/autorun.brs rename to examples/node-14/node-starter/autorun.brs diff --git a/examples/node-starter/index.js b/examples/node-14/node-starter/index.js similarity index 100% rename from examples/node-starter/index.js rename to examples/node-14/node-starter/index.js diff --git a/examples/bs-self-updater/README.md b/examples/node-18/bs-self-updater/README.md similarity index 100% rename from examples/bs-self-updater/README.md rename to examples/node-18/bs-self-updater/README.md diff --git a/examples/bs-self-updater/architecture.md b/examples/node-18/bs-self-updater/architecture.md similarity index 100% rename from examples/bs-self-updater/architecture.md rename to examples/node-18/bs-self-updater/architecture.md diff --git a/examples/bs-self-updater/autorun.brs b/examples/node-18/bs-self-updater/autorun.brs similarity index 100% rename from examples/bs-self-updater/autorun.brs rename to examples/node-18/bs-self-updater/autorun.brs diff --git a/examples/bs-self-updater/index.ts b/examples/node-18/bs-self-updater/index.ts similarity index 100% rename from examples/bs-self-updater/index.ts rename to examples/node-18/bs-self-updater/index.ts diff --git a/examples/bs-self-updater/package.json b/examples/node-18/bs-self-updater/package.json similarity index 77% rename from examples/bs-self-updater/package.json rename to examples/node-18/bs-self-updater/package.json index c7c1aa6..8a89cc4 100644 --- a/examples/bs-self-updater/package.json +++ b/examples/node-18/bs-self-updater/package.json @@ -4,8 +4,8 @@ "version": "1.0.0", "main": "dist/index.js", "scripts": { - "format": "prettier . --write --config ../../.prettierrc.js --cache --cache-location=../../prettiercache && yarn lint --fix", - "lint": "eslint --no-error-on-unmatched-pattern --config ../../.eslintrc template/src/**/*.{js,jsx}", + "format": "prettier . --write --config ../../../.prettierrc.js --cache --cache-location=../../../prettiercache && yarn lint --fix", + "lint": "eslint --no-error-on-unmatched-pattern --config ../../../.eslintrc template/src/**/*.{js,jsx}", "build": "webpack" }, "dependencies": { diff --git a/examples/bs-self-updater/server/autorun.zip b/examples/node-18/bs-self-updater/server/autorun.zip similarity index 100% rename from examples/bs-self-updater/server/autorun.zip rename to examples/node-18/bs-self-updater/server/autorun.zip diff --git a/examples/bs-self-updater/server/index.js b/examples/node-18/bs-self-updater/server/index.js similarity index 100% rename from examples/bs-self-updater/server/index.js rename to examples/node-18/bs-self-updater/server/index.js diff --git a/examples/bs-self-updater/server/package.json b/examples/node-18/bs-self-updater/server/package.json similarity index 100% rename from examples/bs-self-updater/server/package.json rename to examples/node-18/bs-self-updater/server/package.json diff --git a/examples/bs-self-updater/tsconfig.json b/examples/node-18/bs-self-updater/tsconfig.json similarity index 100% rename from examples/bs-self-updater/tsconfig.json rename to examples/node-18/bs-self-updater/tsconfig.json diff --git a/examples/bs-self-updater/webpack.config.js b/examples/node-18/bs-self-updater/webpack.config.js similarity index 100% rename from examples/bs-self-updater/webpack.config.js rename to examples/node-18/bs-self-updater/webpack.config.js diff --git a/examples/provisioning-server/.dockerignore b/examples/node-18/provisioning-server/.dockerignore similarity index 100% rename from examples/provisioning-server/.dockerignore rename to examples/node-18/provisioning-server/.dockerignore diff --git a/examples/provisioning-server/.gitignore b/examples/node-18/provisioning-server/.gitignore similarity index 100% rename from examples/provisioning-server/.gitignore rename to examples/node-18/provisioning-server/.gitignore diff --git a/examples/provisioning-server/Dockerfile b/examples/node-18/provisioning-server/Dockerfile similarity index 100% rename from examples/provisioning-server/Dockerfile rename to examples/node-18/provisioning-server/Dockerfile diff --git a/examples/provisioning-server/README.md b/examples/node-18/provisioning-server/README.md similarity index 100% rename from examples/provisioning-server/README.md rename to examples/node-18/provisioning-server/README.md diff --git a/examples/provisioning-server/architecture.md b/examples/node-18/provisioning-server/architecture.md similarity index 100% rename from examples/provisioning-server/architecture.md rename to examples/node-18/provisioning-server/architecture.md diff --git a/examples/provisioning-server/autorun/provision.brs b/examples/node-18/provisioning-server/autorun/provision.brs similarity index 100% rename from examples/provisioning-server/autorun/provision.brs rename to examples/node-18/provisioning-server/autorun/provision.brs diff --git a/examples/provisioning-server/content/autorun.brs b/examples/node-18/provisioning-server/content/autorun.brs similarity index 100% rename from examples/provisioning-server/content/autorun.brs rename to examples/node-18/provisioning-server/content/autorun.brs diff --git a/examples/provisioning-server/content/index.html b/examples/node-18/provisioning-server/content/index.html similarity index 100% rename from examples/provisioning-server/content/index.html rename to examples/node-18/provisioning-server/content/index.html diff --git a/examples/provisioning-server/content/static/XD-1035.png b/examples/node-18/provisioning-server/content/static/XD-1035.png similarity index 100% rename from examples/provisioning-server/content/static/XD-1035.png rename to examples/node-18/provisioning-server/content/static/XD-1035.png diff --git a/examples/provisioning-server/content/static/logo192.png b/examples/node-18/provisioning-server/content/static/logo192.png similarity index 100% rename from examples/provisioning-server/content/static/logo192.png rename to examples/node-18/provisioning-server/content/static/logo192.png diff --git a/examples/provisioning-server/docker-compose.yml b/examples/node-18/provisioning-server/docker-compose.yml similarity index 100% rename from examples/provisioning-server/docker-compose.yml rename to examples/node-18/provisioning-server/docker-compose.yml diff --git a/examples/provisioning-server/package.json b/examples/node-18/provisioning-server/package.json similarity index 100% rename from examples/provisioning-server/package.json rename to examples/node-18/provisioning-server/package.json diff --git a/examples/provisioning-server/server.js b/examples/node-18/provisioning-server/server.js similarity index 100% rename from examples/provisioning-server/server.js rename to examples/node-18/provisioning-server/server.js diff --git a/examples/self-signed-certs/README.md b/examples/node-18/self-signed-certs/README.md similarity index 100% rename from examples/self-signed-certs/README.md rename to examples/node-18/self-signed-certs/README.md diff --git a/examples/self-signed-certs/architecture.md b/examples/node-18/self-signed-certs/architecture.md similarity index 100% rename from examples/self-signed-certs/architecture.md rename to examples/node-18/self-signed-certs/architecture.md diff --git a/examples/self-signed-certs/index.js b/examples/node-18/self-signed-certs/index.js similarity index 100% rename from examples/self-signed-certs/index.js rename to examples/node-18/self-signed-certs/index.js diff --git a/package.json b/package.json index ab1dee4..40d7d8d 100644 --- a/package.json +++ b/package.json @@ -1,20 +1,10 @@ { "private": true, "workspaces": [ - "examples/autorun-zip-package", - "examples/bluetooth-scan", - "examples/bs-self-updater", - "examples/bs-sqlite-db", - "examples/enable-ldws", - "examples/html-starter", - "examples/htmlwidget-iframes", - "examples/indexeddb-caching", - "examples/local-storage", - "examples/node-simple-server", - "examples/node-starter", - "examples/nodejs-web-app", - "examples/self-signed-certs", - "examples/send-plugin-message", + "examples/node-14/autorun-zip-package", + "examples/node-14/node-simple-server", + "examples/node-18/bs-self-updater", + "examples/node-18/provisioning-server", "templates/**" ], "dependencies": { From ee5fdc37bcfc27857b508f208a8a0837019d2d5a Mon Sep 17 00:00:00 2001 From: Evan Morgan Date: Wed, 1 Apr 2026 15:45:07 +0100 Subject: [PATCH 2/9] feat(PE-987): add .nvmrc files and engines fields for node version metadata --- examples/node-14/autorun-zip-package/.nvmrc | 1 + examples/node-14/autorun-zip-package/package.json | 3 +++ examples/node-14/node-simple-server/.nvmrc | 1 + examples/node-14/node-simple-server/package.json | 3 +++ examples/node-14/node-starter/.nvmrc | 1 + examples/node-18/bs-self-updater/.nvmrc | 1 + examples/node-18/bs-self-updater/package.json | 3 +++ examples/node-18/provisioning-server/.nvmrc | 1 + examples/node-18/provisioning-server/package.json | 3 +++ examples/node-18/self-signed-certs/.nvmrc | 1 + templates/html5-app-template/package.json | 2 +- 11 files changed, 19 insertions(+), 1 deletion(-) create mode 100644 examples/node-14/autorun-zip-package/.nvmrc create mode 100644 examples/node-14/node-simple-server/.nvmrc create mode 100644 examples/node-14/node-starter/.nvmrc create mode 100644 examples/node-18/bs-self-updater/.nvmrc create mode 100644 examples/node-18/provisioning-server/.nvmrc create mode 100644 examples/node-18/self-signed-certs/.nvmrc diff --git a/examples/node-14/autorun-zip-package/.nvmrc b/examples/node-14/autorun-zip-package/.nvmrc new file mode 100644 index 0000000..5595ae1 --- /dev/null +++ b/examples/node-14/autorun-zip-package/.nvmrc @@ -0,0 +1 @@ +14.17.6 diff --git a/examples/node-14/autorun-zip-package/package.json b/examples/node-14/autorun-zip-package/package.json index 6beaecd..3e7ae0d 100644 --- a/examples/node-14/autorun-zip-package/package.json +++ b/examples/node-14/autorun-zip-package/package.json @@ -8,6 +8,9 @@ "format": "prettier . --write --config ../../../.prettierrc.js --cache --cache-location=../../../prettiercache", "lint": "echo 'No linting needed for BrightScript files'" }, + "engines": { + "node": ">=14.17.6" + }, "dependencies": { "archiver": "^6.0.0" }, diff --git a/examples/node-14/node-simple-server/.nvmrc b/examples/node-14/node-simple-server/.nvmrc new file mode 100644 index 0000000..5595ae1 --- /dev/null +++ b/examples/node-14/node-simple-server/.nvmrc @@ -0,0 +1 @@ +14.17.6 diff --git a/examples/node-14/node-simple-server/package.json b/examples/node-14/node-simple-server/package.json index df44ad4..9f087ce 100644 --- a/examples/node-14/node-simple-server/package.json +++ b/examples/node-14/node-simple-server/package.json @@ -27,6 +27,9 @@ "webpack": "^5.94.0", "webpack-cli": "^5.1.0" }, + "engines": { + "node": "14.17.6" + }, "dependencies": { "http": "^0.0.1-security", "node": "14.17.6" diff --git a/examples/node-14/node-starter/.nvmrc b/examples/node-14/node-starter/.nvmrc new file mode 100644 index 0000000..5595ae1 --- /dev/null +++ b/examples/node-14/node-starter/.nvmrc @@ -0,0 +1 @@ +14.17.6 diff --git a/examples/node-18/bs-self-updater/.nvmrc b/examples/node-18/bs-self-updater/.nvmrc new file mode 100644 index 0000000..3c03207 --- /dev/null +++ b/examples/node-18/bs-self-updater/.nvmrc @@ -0,0 +1 @@ +18 diff --git a/examples/node-18/bs-self-updater/package.json b/examples/node-18/bs-self-updater/package.json index 8a89cc4..f623a43 100644 --- a/examples/node-18/bs-self-updater/package.json +++ b/examples/node-18/bs-self-updater/package.json @@ -8,6 +8,9 @@ "lint": "eslint --no-error-on-unmatched-pattern --config ../../../.eslintrc template/src/**/*.{js,jsx}", "build": "webpack" }, + "engines": { + "node": ">=18" + }, "dependencies": { "@types/decompress": "^4.2.7", "@types/node-fetch": "^2.6.12", diff --git a/examples/node-18/provisioning-server/.nvmrc b/examples/node-18/provisioning-server/.nvmrc new file mode 100644 index 0000000..3c03207 --- /dev/null +++ b/examples/node-18/provisioning-server/.nvmrc @@ -0,0 +1 @@ +18 diff --git a/examples/node-18/provisioning-server/package.json b/examples/node-18/provisioning-server/package.json index 9fcd00c..74880dc 100644 --- a/examples/node-18/provisioning-server/package.json +++ b/examples/node-18/provisioning-server/package.json @@ -15,6 +15,9 @@ ], "author": "", "license": "MIT", + "engines": { + "node": ">=18" + }, "dependencies": { "express": "^4.18.2", "better-sqlite3": "^9.2.2" diff --git a/examples/node-18/self-signed-certs/.nvmrc b/examples/node-18/self-signed-certs/.nvmrc new file mode 100644 index 0000000..3c03207 --- /dev/null +++ b/examples/node-18/self-signed-certs/.nvmrc @@ -0,0 +1 @@ +18 diff --git a/templates/html5-app-template/package.json b/templates/html5-app-template/package.json index 83a7b48..8f11edf 100644 --- a/templates/html5-app-template/package.json +++ b/templates/html5-app-template/package.json @@ -56,7 +56,7 @@ "webpack": "^5.96.1", "webpack-cli": "^4.10.0" }, - "engine": { + "engines": { "node": "14.17.6" } } From d2a6407b08bb8e6c847aa83d5e3d205042155e1c Mon Sep 17 00:00:00 2001 From: Evan Morgan Date: Wed, 1 Apr 2026 15:48:05 +0100 Subject: [PATCH 3/9] docs(PE-987): add version and runtime badges to all example READMEs --- examples/browser/bluetooth-scan/README.md | 3 +++ examples/browser/bs-sqlite-db/README.md | 3 +++ examples/browser/cec-interface/README.md | 9 +++++++++ examples/browser/cec-interface/brightscript/README.md | 3 +++ examples/browser/cec-interface/javascript/README.md | 3 +++ examples/browser/enable-ldws/README.md | 3 +++ examples/browser/html-starter/README.md | 3 +++ examples/browser/htmlwidget-iframes/README.md | 3 +++ examples/browser/indexeddb-caching/README.md | 3 +++ examples/browser/local-storage/README.md | 3 +++ examples/browser/send-plugin-message/README.md | 4 ++++ examples/browser/syncmanager-js/README.md | 3 +++ examples/node-14/autorun-zip-package/README.md | 3 +++ examples/node-14/node-simple-server/README.md | 3 +++ examples/node-14/node-starter/README.md | 4 +++- examples/node-18/bs-self-updater/README.md | 3 +++ examples/node-18/provisioning-server/README.md | 3 +++ examples/node-18/self-signed-certs/README.md | 3 +++ 18 files changed, 61 insertions(+), 1 deletion(-) create mode 100644 examples/browser/cec-interface/README.md diff --git a/examples/browser/bluetooth-scan/README.md b/examples/browser/bluetooth-scan/README.md index 9cf0f11..7d65682 100644 --- a/examples/browser/bluetooth-scan/README.md +++ b/examples/browser/bluetooth-scan/README.md @@ -1,5 +1,8 @@ # Bluetooth scan example on BrightSign players +![Runtime: Browser](https://img.shields.io/badge/runtime-browser-blue) +![BrightSign OS: 8.x | 9.x](https://img.shields.io/badge/BrightSign_OS-8.x_%7C_9.x-purple) + ## Introduction The intention of this example is to show how to get a Bluetooth scanning application (HTML+JS) running on your BrightSign player. diff --git a/examples/browser/bs-sqlite-db/README.md b/examples/browser/bs-sqlite-db/README.md index 5ad977a..cf2dbf0 100644 --- a/examples/browser/bs-sqlite-db/README.md +++ b/examples/browser/bs-sqlite-db/README.md @@ -1,5 +1,8 @@ # BrightSign SQLite Database Example +![Runtime: Browser](https://img.shields.io/badge/runtime-browser-blue) +![BrightSign OS: 8.x | 9.x](https://img.shields.io/badge/BrightSign_OS-8.x_%7C_9.x-purple) + This example demonstrates how to use SQLite database functionality in a BrightSign application, showing the communication between BrightScript and JavaScript for database operations. ## Overview diff --git a/examples/browser/cec-interface/README.md b/examples/browser/cec-interface/README.md new file mode 100644 index 0000000..cf4b461 --- /dev/null +++ b/examples/browser/cec-interface/README.md @@ -0,0 +1,9 @@ +# CEC Interface Examples + +![Runtime: Browser](https://img.shields.io/badge/runtime-browser-blue) +![BrightSign OS: 8.x | 9.x](https://img.shields.io/badge/BrightSign_OS-8.x_%7C_9.x-purple) + +Examples demonstrating CEC (Consumer Electronics Control) on BrightSign devices. Two implementations are provided: + +- [BrightScript implementation](brightscript/README.md) +- [JavaScript implementation](javascript/README.md) diff --git a/examples/browser/cec-interface/brightscript/README.md b/examples/browser/cec-interface/brightscript/README.md index 3586f3a..68478e7 100644 --- a/examples/browser/cec-interface/brightscript/README.md +++ b/examples/browser/cec-interface/brightscript/README.md @@ -1,5 +1,8 @@ # BrightScript CEC Example +![Runtime: Browser](https://img.shields.io/badge/runtime-browser-blue) +![BrightSign OS: 8.x | 9.x](https://img.shields.io/badge/BrightSign_OS-8.x_%7C_9.x-purple) + This example demonstrates how to send CEC (Consumer Electronics Control) commands using BrightScript on BrightSign devices. ## What it does diff --git a/examples/browser/cec-interface/javascript/README.md b/examples/browser/cec-interface/javascript/README.md index 5c1b5da..037113b 100644 --- a/examples/browser/cec-interface/javascript/README.md +++ b/examples/browser/cec-interface/javascript/README.md @@ -1,5 +1,8 @@ # JavaScript CEC Example +![Runtime: Browser](https://img.shields.io/badge/runtime-browser-blue) +![BrightSign OS: 8.x | 9.x](https://img.shields.io/badge/BrightSign_OS-8.x_%7C_9.x-purple) + This example demonstrates how to send and receive CEC (Consumer Electronics Control) commands using JavaScript on BrightSign devices. ## What it does diff --git a/examples/browser/enable-ldws/README.md b/examples/browser/enable-ldws/README.md index 46eccfc..57337c0 100644 --- a/examples/browser/enable-ldws/README.md +++ b/examples/browser/enable-ldws/README.md @@ -1,5 +1,8 @@ # Enable Local Diagnostic Web Server (LDWS) Example +![Runtime: Browser](https://img.shields.io/badge/runtime-browser-blue) +![BrightSign OS: 8.x | 9.x](https://img.shields.io/badge/BrightSign_OS-8.x_%7C_9.x-purple) + ## Introduction This example demonstrates three different methods to enable and configure the Local Diagnostic Web Server (LDWS) on a BrightSign device. The LDWS provides a web interface for device diagnostics, monitoring, and configuration that can be accessed from a web browser on the same network. diff --git a/examples/browser/html-starter/README.md b/examples/browser/html-starter/README.md index 77522cc..23b3f7a 100644 --- a/examples/browser/html-starter/README.md +++ b/examples/browser/html-starter/README.md @@ -1,5 +1,8 @@ # Example HTML App +![Runtime: Browser](https://img.shields.io/badge/runtime-browser-blue) +![BrightSign OS: 8.x | 9.x](https://img.shields.io/badge/BrightSign_OS-8.x_%7C_9.x-purple) + ## Introduction This example is the first stepping stone of the starter examples to get familiar with developing with a BrightSign. The intention of this example is to show how to get a simple HTML application running on your player. diff --git a/examples/browser/htmlwidget-iframes/README.md b/examples/browser/htmlwidget-iframes/README.md index 282ea76..1256ca7 100644 --- a/examples/browser/htmlwidget-iframes/README.md +++ b/examples/browser/htmlwidget-iframes/README.md @@ -1,5 +1,8 @@ # HTML Widget Iframes Example +![Runtime: Browser](https://img.shields.io/badge/runtime-browser-blue) +![BrightSign OS: 8.x | 9.x](https://img.shields.io/badge/BrightSign_OS-8.x_%7C_9.x-purple) + To enhance security, the BrightSign OS has disabled the access to JavaScript APIs, BS-JS objects, and Node.js within iframes in BOS v9.1. However, a security parameter `trusted_iframes_enabled` has been added to the `roHtmlWidget` configuration, which will enable iframes to have access to that functionality. We DO NOT recommend this configuration as the content in these iframes can gain access to core player APIs, and this content is not always under the application's control. See the following pages for details: diff --git a/examples/browser/indexeddb-caching/README.md b/examples/browser/indexeddb-caching/README.md index 712e410..8525042 100644 --- a/examples/browser/indexeddb-caching/README.md +++ b/examples/browser/indexeddb-caching/README.md @@ -1,5 +1,8 @@ # IndexedDB Video Caching Example +![Runtime: Browser](https://img.shields.io/badge/runtime-browser-blue) +![BrightSign OS: 8.x | 9.x](https://img.shields.io/badge/BrightSign_OS-8.x_%7C_9.x-purple) + This example demonstrates how to use IndexedDB for caching video content in a BrightSign HTML5 application. The application creates a video playlist that intelligently caches videos in the background for smooth playback. ## File Structure diff --git a/examples/browser/local-storage/README.md b/examples/browser/local-storage/README.md index ae33557..b7af216 100644 --- a/examples/browser/local-storage/README.md +++ b/examples/browser/local-storage/README.md @@ -1,5 +1,8 @@ # Local Storage Image Slideshow Example +![Runtime: Browser](https://img.shields.io/badge/runtime-browser-blue) +![BrightSign OS: 8.x | 9.x](https://img.shields.io/badge/BrightSign_OS-8.x_%7C_9.x-purple) + ## Introduction This example demonstrates how to create an image slideshow application that caches images in the browser's localStorage and displays them in sequence. The application downloads and stores images persistently for smooth playback and implements a looping slideshow that automatically advances to the next image after a specified duration. diff --git a/examples/browser/send-plugin-message/README.md b/examples/browser/send-plugin-message/README.md index 2c0cb21..776267e 100644 --- a/examples/browser/send-plugin-message/README.md +++ b/examples/browser/send-plugin-message/README.md @@ -1,4 +1,8 @@ # How to send a plugin message to your html application + +![Runtime: Browser](https://img.shields.io/badge/runtime-browser-blue) +![BrightSign OS: 8.x | 9.x](https://img.shields.io/badge/BrightSign_OS-8.x_%7C_9.x-purple) + This example demonstrates how to set up a presentation that sends plugin messages to your HTML application. Once received, these messages can be forwarded to your backend for processing. The setup consists of three components: diff --git a/examples/browser/syncmanager-js/README.md b/examples/browser/syncmanager-js/README.md index 8b62b5e..d8e7b26 100644 --- a/examples/browser/syncmanager-js/README.md +++ b/examples/browser/syncmanager-js/README.md @@ -1,5 +1,8 @@ # Sync Manager Application +![Runtime: Browser](https://img.shields.io/badge/runtime-browser-blue) +![BrightSign OS: 8.x | 9.x](https://img.shields.io/badge/BrightSign_OS-8.x_%7C_9.x-purple) + ## Summary This application demonstrates synchronized video playback across multiple BrightSign players using the `@brightsign/syncmanager` JavaScript API. One player acts as the **leader** that initiates synchronization events, while other players act as **followers** that respond to those events. All players play the same video in sync using PTP (Precision Time Protocol) and multicast communication. diff --git a/examples/node-14/autorun-zip-package/README.md b/examples/node-14/autorun-zip-package/README.md index c7156ea..4a034c7 100644 --- a/examples/node-14/autorun-zip-package/README.md +++ b/examples/node-14/autorun-zip-package/README.md @@ -1,5 +1,8 @@ # BrightSign autorun.zip Package Example +![Node.js: >=14.17.6](https://img.shields.io/badge/node.js-%3E%3D14.17.6-green) +![Runs on: Dev Machine](https://img.shields.io/badge/runs_on-dev_machine-orange) + A complete, version-controlled example of creating and deploying an `autorun.zip` package for BrightSign players. This example demonstrates the recommended structure and best practices for deploying applications to BrightSign devices using the autorun.zip method. ## Overview diff --git a/examples/node-14/node-simple-server/README.md b/examples/node-14/node-simple-server/README.md index 1687d4e..10cb324 100644 --- a/examples/node-14/node-simple-server/README.md +++ b/examples/node-14/node-simple-server/README.md @@ -1,5 +1,8 @@ # Hosting a Node.js Server Example +![Node.js: 14.17.6](https://img.shields.io/badge/node.js-14.17.6-green) +![BrightSign OS: 8.x | 9.x](https://img.shields.io/badge/BrightSign_OS-8.x_%7C_9.x-purple) + ## Overview This example is designed to help you get familiarized with running Node.js on a BrightSign player. It demonstrates how to run a Node.js server directly on the player that can serve both static files and fetch device information. Additionally, it introduces tools and configurations that go beyond the basics covered in starter examples. diff --git a/examples/node-14/node-starter/README.md b/examples/node-14/node-starter/README.md index 56778c6..c7879da 100644 --- a/examples/node-14/node-starter/README.md +++ b/examples/node-14/node-starter/README.md @@ -1,6 +1,8 @@ - # Starter Node.js HTTP Server on BrightSign Device +![Node.js: 14.17.6](https://img.shields.io/badge/node.js-14.17.6-green) +![BrightSign OS: 8.x | 9.x](https://img.shields.io/badge/BrightSign_OS-8.x_%7C_9.x-purple) + ## Introduction This example is the second stepping stone of the starter examples to get familiar with developing with a BrightSign. The intention of this example is to show how to get a simple node application running on your player. Once the server is running, you’ll be able to access a congratulatory message by making a request to the server's `/` endpoint. diff --git a/examples/node-18/bs-self-updater/README.md b/examples/node-18/bs-self-updater/README.md index 524e27c..07708a6 100644 --- a/examples/node-18/bs-self-updater/README.md +++ b/examples/node-18/bs-self-updater/README.md @@ -1,5 +1,8 @@ # bs-self-updater +![Node.js: >=18](https://img.shields.io/badge/node.js-%3E%3D18-green) +![BrightSign OS: 9.x](https://img.shields.io/badge/BrightSign_OS-9.x-purple) + A simple self-updating application written using TypeScript and designed to run on BrightSign players. ## Overview diff --git a/examples/node-18/provisioning-server/README.md b/examples/node-18/provisioning-server/README.md index 0484d03..220d51c 100644 --- a/examples/node-18/provisioning-server/README.md +++ b/examples/node-18/provisioning-server/README.md @@ -1,5 +1,8 @@ # BrightSign Provisioning Server Example +![Node.js: >=18](https://img.shields.io/badge/node.js-%3E%3D18-green) +![Runs on: Dev Machine](https://img.shields.io/badge/runs_on-dev_machine-orange) + A Docker-based provisioning server for BrightSign players on a local network. This server implements the BrightSign provisioning and recovery protocol, allowing players to automatically download and install content. ## Overview diff --git a/examples/node-18/self-signed-certs/README.md b/examples/node-18/self-signed-certs/README.md index c77361f..042214d 100644 --- a/examples/node-18/self-signed-certs/README.md +++ b/examples/node-18/self-signed-certs/README.md @@ -1,5 +1,8 @@ # Self-Signed Certificate Handling Example +![Node.js: >=18](https://img.shields.io/badge/node.js-%3E%3D18-green) +![Runs on: Dev Machine](https://img.shields.io/badge/runs_on-dev_machine-orange) + ## Introduction This example demonstrates how to handle self-signed certificates when communicating with BrightSign players via the local Diagnostic Web Server (DWS). BrightSign players use self-signed certificates for HTTPS communication, which requires configuring your HTTP client to accept these certificates for successful player communication and management. From 0631b4778d59eb56d0ee32bf9bfcca5e4af6699c Mon Sep 17 00:00:00 2001 From: Evan Morgan Date: Wed, 1 Apr 2026 15:51:58 +0100 Subject: [PATCH 4/9] docs(PE-987): rewrite examples README with compatibility matrix and directory structure --- examples/README.md | 100 +++++++++++++++++---------------------------- 1 file changed, 37 insertions(+), 63 deletions(-) diff --git a/examples/README.md b/examples/README.md index 9a2ee5d..5d6447c 100644 --- a/examples/README.md +++ b/examples/README.md @@ -1,83 +1,56 @@ # Examples -Welcome to the examples directory! This guide will help you get started with the provided examples. Each example is independent and can be used based on your specific needs. +Welcome to the examples directory! Each example is independent and can be used based on your specific needs. -## Available Examples +## Node Version Compatibility -Note that some starter examples include the creation of a `brightsign-dumps` folder, which is used by the BrightSign OS to store crash information and is very useful to BrightSign Support when troubleshooting. The creation of this folder is an optional but recommended step to help with diagnosing application issues. - -### HTML & Web Storage Examples - -#### HTML Starter Example - -- **Location**: `examples/html-starter` -- **Features**: Simple HTML application for BrightSign, demonstrates running HTML and displaying images using a static directory. Great for getting started with HTML on BrightSign. - -#### IndexedDB Caching Example - -- **Location**: `examples/indexeddb-caching` -- **Features**: Demonstrates video caching using IndexedDB in a BrightSign HTML5 app. Implements a smart playlist and background caching for smooth video playback. - -#### Local Storage Example - -- **Location**: `examples/local-storage` -- **Features**: Image slideshow that caches images in browser localStorage for persistent, smooth playback and looping. - -#### Large File Download Example - -- **Location**: `examples/large-file-download` -- **Features**: Downloads large files (multi-GB) to SD card on memory-constrained players without OOM or UI blocking. Uses Node.js streams with TCP-level backpressure via `roHtmlWidget`. +BrightSign players ship with different Node.js versions depending on the OS: -### Node.js Examples +- **BrightSign OS 8.x**: Node.js 14.17.6 +- **BrightSign OS 9.x**: Node.js 18 -#### Node Starter Example +Examples are organized into subdirectories based on their runtime requirements: -- **Location**: `examples/node-starter` -- **Features**: Minimal Node.js HTTP server for BrightSign. Boots a simple server and responds to requests at the root endpoint. +- **`browser/`** - HTML and BrightScript examples that run in the player's browser. No Node.js dependency. +- **`node-14/`** - Node.js examples compatible with BrightSign OS 8.x (Node 14.17.6). +- **`node-18/`** - Node.js examples requiring BrightSign OS 9.x (Node 18) or a dev machine with Node 18+. -#### Node Simple Server Example +Each Node.js example includes an `.nvmrc` file. Run `nvm use` in the example directory to switch to the correct version. -- **Location**: `examples/node-simple-server` -- **Features**: Advanced Node.js server with static file serving, device info REST API, Jest tests, and webpack config. Good for learning about full-featured Node.js deployments on BrightSign. - -### Deployment & Provisioning Examples - -#### autorun.zip Package Example - -- **Location**: `examples/autorun-zip-package` -- **Features**: Complete example of creating and deploying an `autorun.zip` package for BrightSign players. Includes the `autozip.brs` unpacking script, sample application files, build script, and comprehensive documentation for Partner Gallery integration. Essential for CMS providers and partners deploying applications to fleets of BrightSign players. - -#### Provisioning Server Example - -- **Location**: `examples/provisioning-server` -- **Features**: Docker-based provisioning server implementing BrightSign's provisioning protocol. Demonstrates automated content delivery to players on a local network with player tracking and deployment management. - -### Device & Plugin Integration Examples - -#### Bluetooth Scan Example - -- **Location**: `examples/bluetooth-scan` -- **Features**: HTML+JS app for scanning Bluetooth devices on BrightSign. Requires a compatible Bluetooth adapter and uses BrightSign's proprietary JS API. +Note that some starter examples include the creation of a `brightsign-dumps` folder, which is used by the BrightSign OS to store crash information and is very useful to BrightSign Support when troubleshooting. The creation of this folder is an optional but recommended step to help with diagnosing application issues. -#### BS Self Updater Example +## Compatibility Matrix -- **Location**: `examples/bs-self-updater` -- **Features**: TypeScript utility for self-updating BrightSign apps by downloading and applying new `autorun.zip` packages from a server. Works in conjunction with the autorun.zip package example. +### Browser Examples (`browser/`) -#### BS SQLite DB Example +| Example | Description | BrightSign OS | +|---------|-------------|---------------| +| [html-starter](browser/html-starter) | Simple HTML app, displays images using a static directory | 8.x, 9.x | +| [indexeddb-caching](browser/indexeddb-caching) | Video caching using IndexedDB with smart playlist and background caching | 8.x, 9.x | +| [local-storage](browser/local-storage) | Image slideshow with localStorage caching for persistent playback | 8.x, 9.x | +| [bluetooth-scan](browser/bluetooth-scan) | Bluetooth device scanning using BrightSign's JS API | 8.x, 9.x | +| [bs-sqlite-db](browser/bs-sqlite-db) | SQLite database usage with BrightScript/JavaScript communication | 8.x, 9.x | +| [cec-interface](browser/cec-interface) | CEC commands via BrightScript and JavaScript implementations | 8.x, 9.x | +| [enable-ldws](browser/enable-ldws) | Enable Local Diagnostic Web Server with multiple approaches | 8.x, 9.x | +| [htmlwidget-iframes](browser/htmlwidget-iframes) | HTML widgets with iframes and security configuration | 8.x, 9.x | +| [send-plugin-message](browser/send-plugin-message) | Plugin message communication between BrightScript and HTML/JS | 8.x, 9.x | +| [syncmanager-js](browser/syncmanager-js) | Multi-player content synchronization using SyncManager JS API | 8.x, 9.x | -- **Location**: `examples/bs-sqlite-db` -- **Features**: Demonstrates SQLite database usage on BrightSign, including table creation, data insertion, querying, and cleanup via BrightScript and JavaScript communication. -#### Send Plugin Message Example +### Node.js 14 Examples (`node-14/`) -- **Location**: `examples/send-plugin-message` -- **Features**: Shows how to send plugin messages between BrightScript and HTML/JavaScript apps, useful for integrating BrightAuthor:connected presentations with custom logic. +| Example | Description | Node Version | Runs On | +|---------|-------------|-------------|---------| +| [node-starter](node-14/node-starter) | Minimal Node.js HTTP server for BrightSign | 14.17.6 | Player | +| [node-simple-server](node-14/node-simple-server) | Advanced Node.js server with REST API, Jest tests, and webpack | 14.17.6 | Player | -#### Syncmanager Example +### Node.js 18 Examples (`node-18/`) -- **Location**: `examples/syncmanager` -- **Features**: Demonstrates using BrightSign's `@brightsign/syncmanager` JS API for synchronizing content across multiple players. +| Example | Description | Node Version | Runs On | +|---------|-------------|-------------|---------| +| [bs-self-updater](node-18/bs-self-updater) | TypeScript self-updating app that downloads and applies new autorun.zip packages | >=18 | Player | +| [provisioning-server](node-18/provisioning-server) | Docker-based provisioning server implementing BrightSign's provisioning protocol | >=18 | Dev Machine | +| [self-signed-certs](node-18/self-signed-certs) | Self-signed certificate handling using native fetch and undici | >=18 | Dev Machine | ## Next Steps @@ -86,3 +59,4 @@ After exploring these examples, you can: 1. Combine concepts from different examples to build more complex applications 2. Add testing to your applications following the `node-simple-server` example 3. Implement plugin message communication for advanced BrightScript integration +4. Use one of the [templates](../templates) to start a production project From 196ad332086146c1fc988d563b76832a7b89fd53 Mon Sep 17 00:00:00 2001 From: Evan Morgan Date: Wed, 1 Apr 2026 15:54:12 +0100 Subject: [PATCH 5/9] docs(PE-987): update root README with node version guidance and fix broken links --- README.md | 19 ++++++++++++------- 1 file changed, 12 insertions(+), 7 deletions(-) diff --git a/README.md b/README.md index 384cded..bee2aa4 100644 --- a/README.md +++ b/README.md @@ -55,11 +55,11 @@ The examples in this repository are designed to help you get started with develo ### Learning the basics with examples -If you've never worked with a BrightSign before, we recommend starting with a [barebones example](examples/README.md#1-starter-html-example). +If you've never worked with a BrightSign before, we recommend starting with the [HTML starter example](examples/browser/html-starter/README.md). -After this, we recommend integrating Node.js into the application on the BrightSign player. An example of this can be found in [html_node_example](examples/node-simple-server-example/README.md). +After this, we recommend integrating Node.js into the application on the BrightSign player. An example of this can be found in [node-simple-server](examples/node-14/node-simple-server/README.md). -Once this seems familiar, we recommend adding auxiliary tools to make the development experience smoother. This includes introducing a script to copy files to the player's SD card, defining multiple environments to develop locally rather than needing to only rely on the player for visibility, and a mock library for populating values when running the example locally. This can be found [here](robust_example). +Once this seems familiar, explore more advanced examples like the [self-updater](examples/node-18/bs-self-updater/README.md) or [provisioning server](examples/node-18/provisioning-server/README.md) to learn about deployment and fleet management. From here, we recommend using one of the templates to start developing your own project! @@ -73,14 +73,19 @@ The templates in this repository are starter projects that you can use to begin The templates in this repository are intended for developers who are familiar with Node.js, React, and running scripts that connect to devices over a local network. -We recommend managing your Node.js version using [nvm](https://github.com/nvm-sh/nvm/blob/master/README.md). The preferred version is `14.17.6` since this is the version currently pre-installed on most BrightSign devices. +We recommend managing your Node.js version using [nvm](https://github.com/nvm-sh/nvm/blob/master/README.md). BrightSign devices ship with different Node.js versions depending on the OS: + +- **BrightSign OS 8.x**: Node.js `14.17.6` +- **BrightSign OS 9.x**: Node.js `18` + +Each Node.js example includes an `.nvmrc` file. Run `nvm use` in the example directory to automatically switch to the correct version. See the [examples README](examples/README.md) for a full compatibility matrix. ## Project structure Here's an overview of the project structure and what each part is responsible for: - `templates/` : React templates for new projects with custom configurations tailored for BrightSign development. -- `examples/` : A collection of examples demonstrating different capabilities and how to implement them on your BrightSign device. +- `examples/` : A collection of examples organized by runtime: `browser/` (HTML/BrightScript), `node-14/` (OS 8.x), and `node-18/` (OS 9.x). - `.github/` : Contains GitHub Actions configurations for automated build and deployment processes. - `scripts/` : Utility scripts to facilitate build, deployment, and development workflows. - `.eslintrc` : Lint configuration to ensure code quality and consistency across the project. @@ -100,7 +105,7 @@ Feel free to open an issue or submit a PR; see `CONTRIBUTING.MD` for further inf ## Building on M1 Mac -You might see an error like `npm ERR! Error: Cannot find module 'node-bin-darwin-arm64/package.json'` +When using Node 14.17.6 on Apple Silicon, you might see an error like `npm ERR! Error: Cannot find module 'node-bin-darwin-arm64/package.json'` Run the following commands: @@ -113,7 +118,7 @@ arm64 > nvm uninstall 14.17.6 && nvm install 14.17.6 ``` -You might need to do this each time you restart your terminal. +You might need to do this each time you restart your terminal. This issue does not affect Node 18+. For more details, see this [Stack Overflow thread](https://stackoverflow.com/questions/68896696/having-trouble-installing-npm-on-mac-m1). From 65b13229fa5f37e6382d57e98b1925bca69d124c Mon Sep 17 00:00:00 2001 From: Evan Morgan Date: Wed, 1 Apr 2026 15:56:58 +0100 Subject: [PATCH 6/9] feat(PE-987): add node version matrix to CI and version-aware workspace filtering --- .github/workflows/run-tests.yml | 15 +++++++++------ scripts/workspace_actions.js | 22 +++++++++++++++++++++- 2 files changed, 30 insertions(+), 7 deletions(-) diff --git a/.github/workflows/run-tests.yml b/.github/workflows/run-tests.yml index 9fbf38c..0f54b1e 100644 --- a/.github/workflows/run-tests.yml +++ b/.github/workflows/run-tests.yml @@ -5,18 +5,21 @@ on: [push] jobs: install_and_test: runs-on: ubuntu-latest + strategy: + matrix: + node-version: ['14.17.6', '18'] steps: - uses: actions/checkout@v4 with: fetch-depth: 1 - name: Fetch latest main branch commit run: git fetch --no-tags --depth=1 origin +refs/heads/main:refs/remotes/origin/main - - name: Use Node.js + - name: Use Node.js ${{ matrix.node-version }} uses: actions/setup-node@v4 with: - node-version: '14.17.6' + node-version: ${{ matrix.node-version }} cache: 'yarn' - - run: yarn --frozen-lockfile + - run: yarn --frozen-lockfile --ignore-engines - run: node ./scripts/workspace_actions.js test format_all: @@ -31,12 +34,12 @@ jobs: - name: Use Node.js uses: actions/setup-node@v4 with: - node-version: '14.17.6' + node-version: '18' cache: 'yarn' - - run: yarn --frozen-lockfile + - run: yarn --frozen-lockfile --ignore-engines - run: node ./scripts/workspace_actions.js format - name: Commit formatting changes uses: stefanzweifel/git-auto-commit-action@v5 with: commit_message: Applied automatic formatting changes - branch: ${{ github.head_ref }} \ No newline at end of file + branch: ${{ github.head_ref }} diff --git a/scripts/workspace_actions.js b/scripts/workspace_actions.js index 666ac86..278e708 100755 --- a/scripts/workspace_actions.js +++ b/scripts/workspace_actions.js @@ -6,7 +6,7 @@ * */ const { execSync } = require("child_process"); -const { existsSync } = require("fs"); +const { existsSync, readFileSync } = require("fs"); const path = require("path"); const mainBranchName = "origin/main"; @@ -53,6 +53,20 @@ function isPathInWorkspace(filePath, workspacePath) { return isInWorkspace; } +// Check if the current Node.js version is compatible with a workspace's .nvmrc +function isNodeVersionCompatible(workspacePath) { + const nvmrcPath = path.join(workspacePath, ".nvmrc"); + if (!existsSync(nvmrcPath)) { + return true; + } + + const requiredVersion = readFileSync(nvmrcPath, "utf-8").trim(); + const requiredMajor = parseInt(requiredVersion.split(".")[0], 10); + const currentMajor = parseInt(process.versions.node.split(".")[0], 10); + + return currentMajor >= requiredMajor; +} + // Main function to run configurable commands in changed workspaces function runCommandsInChangedWorkspaces() { const workspaces = getWorkspacesInfo(); @@ -73,6 +87,12 @@ function runCommandsInChangedWorkspaces() { changedWorkspaces )) { if (existsSync(`${workspacePath}/package.json`)) { + if (!isNodeVersionCompatible(workspacePath)) { + console.log( + `Skipping workspace '${workspace}': requires Node.js version not compatible with current ${process.versions.node}` + ); + continue; + } for (const command of commandsToRun) { try { exec(`cd ${workspacePath} && yarn ${command}`); From 7d4c8f4603317f9f2f8b404d534387a0a8acff25 Mon Sep 17 00:00:00 2001 From: Evan Morgan Date: Wed, 1 Apr 2026 15:57:43 +0100 Subject: [PATCH 7/9] docs(PE-987): add new example guidelines to CONTRIBUTING.md --- CONTRIBUTING.md | 26 ++++++++++++++++++++++++++ 1 file changed, 26 insertions(+) diff --git a/CONTRIBUTING.md b/CONTRIBUTING.md index 64c3a81..f4cfa8e 100644 --- a/CONTRIBUTING.md +++ b/CONTRIBUTING.md @@ -11,6 +11,32 @@ Thank you for contributing to the BrightSign Dev Cookbook! We look forward to your contributions and suggestions! +# Adding new examples + +When adding a new example, follow these conventions: + +1. **Place it in the correct subdirectory** based on its Node.js requirement: + - `examples/browser/` for HTML/BrightScript examples with no Node.js dependency + - `examples/node-14/` for examples targeting BrightSign OS 8.x (Node 14.17.6) + - `examples/node-18/` for examples requiring BrightSign OS 9.x (Node 18+) + +2. **Include an `.nvmrc` file** in every Node.js example declaring the minimum required version (e.g., `14.17.6` or `18`). + +3. **Add an `engines` field** in `package.json` (if the example has one): + ```json + "engines": { + "node": ">=18" + } + ``` + +4. **Add version badges** at the top of the example's README, right after the title: + - Browser: `![Runtime: Browser](https://img.shields.io/badge/runtime-browser-blue)` and `![BrightSign OS: 8.x | 9.x](https://img.shields.io/badge/BrightSign_OS-8.x_%7C_9.x-purple)` + - Node on player: `![Node.js: >=18](https://img.shields.io/badge/node.js-%3E%3D18-green)` and `![BrightSign OS: 9.x](https://img.shields.io/badge/BrightSign_OS-9.x-purple)` + - Dev machine tool: `![Node.js: >=18](https://img.shields.io/badge/node.js-%3E%3D18-green)` and `![Runs on: Dev Machine](https://img.shields.io/badge/runs_on-dev_machine-orange)` + +5. **Update the compatibility matrix** in `examples/README.md` with the new example. + + # How to submit changes To contribute enhancements or fixes to `dev-cookbook`, please follow these steps: From 224d4681d6c7a889888f1ae26d2536b49f47872d Mon Sep 17 00:00:00 2001 From: Evan Morgan Date: Wed, 1 Apr 2026 17:26:43 +0100 Subject: [PATCH 8/9] fix(PE-987): skip native compilation on node 14 CI to avoid node-gyp/python incompatibility --- .github/workflows/run-tests.yml | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/.github/workflows/run-tests.yml b/.github/workflows/run-tests.yml index 0f54b1e..bb41afe 100644 --- a/.github/workflows/run-tests.yml +++ b/.github/workflows/run-tests.yml @@ -19,7 +19,8 @@ jobs: with: node-version: ${{ matrix.node-version }} cache: 'yarn' - - run: yarn --frozen-lockfile --ignore-engines + - name: Install dependencies + run: yarn --frozen-lockfile --ignore-engines ${{ matrix.node-version == '14.17.6' && '--ignore-scripts' || '' }} - run: node ./scripts/workspace_actions.js test format_all: From 73b372455196ada44b6d1e179e04477efcc7cb60 Mon Sep 17 00:00:00 2001 From: Evan Morgan Date: Tue, 5 May 2026 15:27:57 +0100 Subject: [PATCH 9/9] refactor(PE-987): move large-file-download example to browser/ --- .gitignore | 6 +++++- examples/README.md | 1 + examples/{ => browser}/large-file-download/README.md | 3 +++ examples/{ => browser}/large-file-download/autorun.brs | 0 examples/{ => browser}/large-file-download/index.html | 0 5 files changed, 9 insertions(+), 1 deletion(-) rename examples/{ => browser}/large-file-download/README.md (95%) rename examples/{ => browser}/large-file-download/autorun.brs (100%) rename examples/{ => browser}/large-file-download/index.html (100%) diff --git a/.gitignore b/.gitignore index a916c0e..5eba8ec 100644 --- a/.gitignore +++ b/.gitignore @@ -4,4 +4,8 @@ dist package-lock.json .DS_Store prettiercache -.npmrc \ No newline at end of file +.npmrc + +# Claude Code +.claude/ +CLAUDE.md \ No newline at end of file diff --git a/examples/README.md b/examples/README.md index 5d6447c..49f383e 100644 --- a/examples/README.md +++ b/examples/README.md @@ -35,6 +35,7 @@ Note that some starter examples include the creation of a `brightsign-dumps` fol | [htmlwidget-iframes](browser/htmlwidget-iframes) | HTML widgets with iframes and security configuration | 8.x, 9.x | | [send-plugin-message](browser/send-plugin-message) | Plugin message communication between BrightScript and HTML/JS | 8.x, 9.x | | [syncmanager-js](browser/syncmanager-js) | Multi-player content synchronization using SyncManager JS API | 8.x, 9.x | +| [large-file-download](browser/large-file-download) | Memory-bounded multi-GB download using Node streams in roHtmlWidget | 8.x, 9.x | ### Node.js 14 Examples (`node-14/`) diff --git a/examples/large-file-download/README.md b/examples/browser/large-file-download/README.md similarity index 95% rename from examples/large-file-download/README.md rename to examples/browser/large-file-download/README.md index 37a5afb..5c1642e 100644 --- a/examples/large-file-download/README.md +++ b/examples/browser/large-file-download/README.md @@ -1,5 +1,8 @@ # Large File Download Example +![Runtime: Browser](https://img.shields.io/badge/runtime-browser-blue) +![BrightSign OS: 8.x | 9.x](https://img.shields.io/badge/BrightSign_OS-8.x_%7C_9.x-purple) + ## Introduction This example demonstrates how to download a large file (multi-GB) to an SD card on a memory-constrained BrightSign player without running out of memory or blocking the UI. diff --git a/examples/large-file-download/autorun.brs b/examples/browser/large-file-download/autorun.brs similarity index 100% rename from examples/large-file-download/autorun.brs rename to examples/browser/large-file-download/autorun.brs diff --git a/examples/large-file-download/index.html b/examples/browser/large-file-download/index.html similarity index 100% rename from examples/large-file-download/index.html rename to examples/browser/large-file-download/index.html