{"_id":"@bluebillywig/react-native-channel","_rev":"5-d323e120eaa578a77dcf74af1a28befc","name":"@bluebillywig/react-native-channel","dist-tags":{"latest":"8.54.2"},"versions":{"1.1.0":{"name":"@bluebillywig/react-native-channel","version":"1.1.0","keywords":["react-native","ios","android","video","channel","blue-billywig","ovp","player","streaming"],"author":{"url":"https://www.bluebillywig.com","name":"Blue Billywig","email":"support@bluebillywig.com"},"license":"SEE LICENSE IN LICENSE.md","_id":"@bluebillywig/react-native-channel@1.1.0","maintainers":[{"name":"jkoppen-bluebillywig","email":"j.koppen@bluebillywig.com"},{"name":"martijnbots_bb","email":"m.bots@bluebillywig.com"},{"name":"ghultink","email":"g.hultink@bluebillywig.com"},{"name":"vvanlaar","email":"v.vanlaar@bluebillywig.com"},{"name":"p.vanderspek","email":"p.vanderspek@bluebillywig.com"}],"homepage":"https://github.com/bluebillywig/channel#readme","bugs":{"url":"https://github.com/bluebillywig/channel/issues"},"dist":{"shasum":"d66b8cb8987555e76476aeed0ec2202caa2c88e9","tarball":"https://registry.npmjs.org/@bluebillywig/react-native-channel/-/react-native-channel-1.1.0.tgz","fileCount":80,"integrity":"sha512-COu6DHJPI9DncrPgoUSObcdVOt3lV+NsNLMahogE3BpsGXHc1Sn54re/Jd8U4WIilPAlMQVOjKekw3IYXY8WCg==","signatures":[{"sig":"MEUCIGYjdKIGKT/OqOYuC7gBp0yDe9czcc95gFIJK736zEP0AiEA2FF0W9eghq/KL00IFqhPXJrDgb6AD5pmbPrf+DEJwoY=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":6071573},"main":"lib/commonjs/index.js","types":"lib/typescript/src/index.d.ts","module":"lib/module/index.js","source":"src/index.ts","engines":{"node":">= 20.0.0"},"gitHead":"2856ea2aa23adda625c509100150696093303da8","scripts":{"lint":"eslint \"**/*.{js,ts,tsx}\"","test":"jest","build":"npm run typescript && npm run clean && npm run build:sdk && cp package.json lib/package.json","clean":"del-cli lib","release":"release-it","build:sdk":"bob build","build:full":"npm run build:bundle && npm run build","test:watch":"jest --watch","typescript":"tsc --noEmit","build:bundle":"node scripts/bundle-channel.js","build:channel":"cd .. && npm run build:native","prepublishOnly":"npm run build"},"_npmUser":{"name":"ghultink","email":"g.hultink@bluebillywig.com"},"repository":{"url":"git+https://github.com/bluebillywig/channel.git","type":"git","directory":"sdk"},"_npmVersion":"10.9.2","description":"Blue Billywig Channel SDK for React Native - Embed video channels in your React Native apps","directories":{},"_nodeVersion":"22.14.0","react-native":"lib/module/index.js","codegenConfig":{"name":"RNBBChannelSpec","type":"modules","android":{"javaPackageName":"com.bluebillywig.channelsdk"},"jsSrcsDir":"src/specs"},"publishConfig":{"registry":"https://npm.pkg.github.com"},"_hasShrinkwrap":false,"devDependencies":{"jest":"^29.7.0","react":"19.2.0","eslint":"^8.57.0","del-cli":"^6.0.0","ts-jest":"^29.2.0","typescript":"^5.4.0","@types/jest":"^29.5.0","react-native":"0.83.1","react-native-webview":"^13.12.5","react-native-builder-bob":"^0.40.17","@react-native/eslint-config":"^0.83.1"},"peerDependencies":{"react":"*","react-native":"*","react-native-webview":">=13.0.0","react-native-safe-area-context":">=4.0.0","@bluebillywig/react-native-bb-player":">=8.0.0"},"peerDependenciesMeta":{"react-native-webview":{"optional":false},"react-native-safe-area-context":{"optional":true},"@bluebillywig/react-native-bb-player":{"optional":true}},"_npmOperationalInternal":{"tmp":"tmp/react-native-channel_1.1.0_1777886961579_0.9326242229813713","host":"s3://npm-registry-packages-npm-production"},"react-native-builder-bob":{"output":"lib","source":"src","targets":[["commonjs",{"configFile":"./babel.config.js"}],["module",{"configFile":"./babel.config.js"}],["typescript",{"project":"tsconfig.build.json"}]]}},"8.52.0":{"name":"@bluebillywig/react-native-channel","version":"8.52.0","keywords":["react-native","ios","android","video","channel","blue-billywig","ovp","player","streaming"],"author":{"url":"https://www.bluebillywig.com","name":"Blue Billywig","email":"support@bluebillywig.com"},"license":"MIT","_id":"@bluebillywig/react-native-channel@8.52.0","maintainers":[{"name":"jkoppen-bluebillywig","email":"j.koppen@bluebillywig.com"},{"name":"martijnbots_bb","email":"m.bots@bluebillywig.com"},{"name":"ghultink","email":"g.hultink@bluebillywig.com"},{"name":"vvanlaar","email":"v.vanlaar@bluebillywig.com"},{"name":"p.vanderspek","email":"p.vanderspek@bluebillywig.com"}],"homepage":"https://github.com/bluebillywig/channel#readme","bugs":{"url":"https://github.com/bluebillywig/channel/issues"},"dist":{"shasum":"c3ecedac9788d884872e8d1d80aae5af867e7844","tarball":"https://registry.npmjs.org/@bluebillywig/react-native-channel/-/react-native-channel-8.52.0.tgz","fileCount":79,"integrity":"sha512-ugAon0zN7A4jkKBhCX2I+hNStanBCrD10Srx7wO/QxLzz37R8QEHam5Lzb2mTAmOLe57Nob4RjNlIqj/DrB9XQ==","signatures":[{"sig":"MEUCIFkazKMEenP9N5aVK9y7Yx/pd0TYKW2+ikfgaOcItUu/AiEA58XyqgCF9mE3Y2j1MmLY14LkigbsvVGpQ+uGIjPDGRg=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":5892530},"main":"lib/commonjs/index.js","types":"lib/typescript/src/index.d.ts","module":"lib/module/index.js","source":"src/index.ts","engines":{"node":">=24"},"gitHead":"99efd80e380a7c1ef9dca8421d1e749580ec3f44","scripts":{"lint":"eslint \"**/*.{js,ts,tsx}\"","test":"jest","build":"npm run typescript && npm run clean && npm run build:sdk && cp package.json lib/package.json","clean":"del-cli lib","release":"release-it","test:ci":"jest --ci --coverage --reporters=default --reporters=github-actions","test:cov":"jest --coverage","build:sdk":"bob build","build:full":"npm run build:bundle && npm run build","test:watch":"jest --watch","typescript":"tsc --noEmit","build:bundle":"node scripts/bundle-channel.js","build:channel":"cd .. && npm run build:native","prepublishOnly":"npm run build"},"_npmUser":{"name":"GitHub Actions","email":"npm-oidc-no-reply@github.com","trustedPublisher":{"id":"github","oidcConfigId":"oidc:be7b1062-406c-4394-a3e9-0ed11d0e3854"}},"repository":{"url":"git+https://github.com/bluebillywig/channel.git","type":"git","directory":"sdk"},"_npmVersion":"11.13.0","description":"Blue Billywig Channel SDK for React Native - Embed video channels in your React Native apps","directories":{},"_nodeVersion":"24.16.0","react-native":"lib/module/index.js","codegenConfig":{"name":"RNBBChannelSpec","type":"modules","android":{"javaPackageName":"com.bluebillywig.channelsdk"},"jsSrcsDir":"src/specs"},"publishConfig":{"registry":"https://npm.pkg.github.com"},"_hasShrinkwrap":false,"devDependencies":{"jest":"^29.7.0","react":"19.2.3","eslint":"^8.57.0","del-cli":"^6.0.0","ts-jest":"^29.2.0","babel-jest":"^29.7.0","typescript":"^5.4.0","@types/jest":"^29.5.0","@types/react":"19.2.3","react-native":"0.85.2","react-test-renderer":"19.2.3","react-native-webview":"^13.12.5","react-native-builder-bob":"^0.40.17","@react-native/jest-preset":"^0.85.2","@react-native/babel-preset":"^0.85.2","@types/react-test-renderer":"^19.0.0","@react-native/eslint-config":"^0.85.2","@testing-library/react-native":"^13.0.0"},"peerDependencies":{"react":"*","react-native":"*","react-native-webview":">=13.0.0","react-native-safe-area-context":">=4.0.0","@bluebillywig/react-native-bb-player":">=8.0.0"},"peerDependenciesMeta":{"react-native-webview":{"optional":false},"react-native-safe-area-context":{"optional":true},"@bluebillywig/react-native-bb-player":{"optional":true}},"_npmOperationalInternal":{"tmp":"tmp/react-native-channel_8.52.0_1780917782953_0.15613430126144778","host":"s3://npm-registry-packages-npm-production"},"react-native-builder-bob":{"output":"lib","source":"src","targets":[["commonjs",{"configFile":"./babel.config.js"}],["module",{"configFile":"./babel.config.js"}],["typescript",{"project":"tsconfig.build.json"}]]}},"8.53.0":{"name":"@bluebillywig/react-native-channel","version":"8.53.0","keywords":["react-native","ios","android","video","channel","blue-billywig","ovp","player","streaming"],"author":{"url":"https://www.bluebillywig.com","name":"Blue Billywig","email":"support@bluebillywig.com"},"license":"MIT","_id":"@bluebillywig/react-native-channel@8.53.0","maintainers":[{"name":"jkoppen-bluebillywig","email":"j.koppen@bluebillywig.com"},{"name":"martijnbots_bb","email":"m.bots@bluebillywig.com"},{"name":"ghultink","email":"g.hultink@bluebillywig.com"},{"name":"vvanlaar","email":"v.vanlaar@bluebillywig.com"},{"name":"p.vanderspek","email":"p.vanderspek@bluebillywig.com"}],"homepage":"https://github.com/bluebillywig/channel#readme","bugs":{"url":"https://github.com/bluebillywig/channel/issues"},"dist":{"shasum":"4447fb61ecf36e17934bdf51834a0c6c097b39a5","tarball":"https://registry.npmjs.org/@bluebillywig/react-native-channel/-/react-native-channel-8.53.0.tgz","fileCount":79,"integrity":"sha512-54Vuj7HpvhliTjENKUxC2iiKRWpd+Su4YGeRrA6ZK9arPdYzXMS04KDzCWzqA7zw8sTF2QSHrP+RF1AVkCR3nw==","signatures":[{"sig":"MEYCIQC+UHe4/vD0JJRkGtcCRaGQ9FFdt/fBA5pb8wxqbU27LAIhAO9YjI41pRK8zr2mP9ufz20G+RP+vxCes3oxD9eMSeyi","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":5892778},"main":"lib/commonjs/index.js","types":"lib/typescript/src/index.d.ts","module":"lib/module/index.js","source":"src/index.ts","engines":{"node":">=24"},"gitHead":"740514122066a05fb3842fd849240cb570a5c6ac","scripts":{"lint":"eslint \"**/*.{js,ts,tsx}\"","test":"jest","build":"npm run typescript && npm run clean && npm run build:sdk && cp package.json lib/package.json","clean":"del-cli lib","release":"release-it","test:ci":"jest --ci --coverage --reporters=default --reporters=github-actions","test:cov":"jest --coverage","build:sdk":"bob build","build:full":"npm run build:bundle && npm run build","test:watch":"jest --watch","typescript":"tsc --noEmit","build:bundle":"node scripts/bundle-channel.js","build:channel":"cd .. && npm run build:native","prepublishOnly":"npm run build"},"_npmUser":{"name":"GitHub Actions","email":"npm-oidc-no-reply@github.com","trustedPublisher":{"id":"github","oidcConfigId":"oidc:be7b1062-406c-4394-a3e9-0ed11d0e3854"}},"repository":{"url":"git+https://github.com/bluebillywig/channel.git","type":"git","directory":"sdk"},"_npmVersion":"11.13.0","description":"Blue Billywig Channel SDK for React Native - Embed video channels in your React Native apps","directories":{},"_nodeVersion":"24.16.0","react-native":"lib/module/index.js","codegenConfig":{"name":"RNBBChannelSpec","type":"modules","android":{"javaPackageName":"com.bluebillywig.channelsdk"},"jsSrcsDir":"src/specs"},"_hasShrinkwrap":false,"devDependencies":{"jest":"^29.7.0","react":"19.2.3","eslint":"^8.57.0","del-cli":"^6.0.0","ts-jest":"^29.2.0","babel-jest":"^29.7.0","typescript":"^5.4.0","@types/jest":"^29.5.0","@types/react":"19.2.3","react-native":"0.85.2","react-test-renderer":"19.2.3","react-native-webview":"^13.12.5","react-native-builder-bob":"^0.40.17","@react-native/jest-preset":"^0.85.2","@react-native/babel-preset":"^0.85.2","@types/react-test-renderer":"^19.0.0","@react-native/eslint-config":"^0.85.2","@testing-library/react-native":"^13.0.0"},"peerDependencies":{"react":"*","react-native":"*","react-native-webview":">=13.0.0","react-native-safe-area-context":">=4.0.0","@bluebillywig/react-native-bb-player":">=8.0.0"},"peerDependenciesMeta":{"react-native-webview":{"optional":false},"react-native-safe-area-context":{"optional":true},"@bluebillywig/react-native-bb-player":{"optional":true}},"_npmOperationalInternal":{"tmp":"tmp/react-native-channel_8.53.0_1782126729441_0.5778553382306604","host":"s3://npm-registry-packages-npm-production"},"react-native-builder-bob":{"output":"lib","source":"src","targets":[["commonjs",{"configFile":"./babel.config.js"}],["module",{"configFile":"./babel.config.js"}],["typescript",{"project":"tsconfig.build.json"}]]}},"8.54.1":{"name":"@bluebillywig/react-native-channel","version":"8.54.1","keywords":["react-native","ios","android","video","channel","blue-billywig","ovp","player","streaming"],"author":{"url":"https://www.bluebillywig.com","name":"Blue Billywig","email":"support@bluebillywig.com"},"license":"MIT","_id":"@bluebillywig/react-native-channel@8.54.1","maintainers":[{"name":"jkoppen-bluebillywig","email":"j.koppen@bluebillywig.com"},{"name":"martijnbots_bb","email":"m.bots@bluebillywig.com"},{"name":"ghultink","email":"g.hultink@bluebillywig.com"},{"name":"vvanlaar","email":"v.vanlaar@bluebillywig.com"},{"name":"p.vanderspek","email":"p.vanderspek@bluebillywig.com"}],"homepage":"https://github.com/bluebillywig/channel#readme","bugs":{"url":"https://github.com/bluebillywig/channel/issues"},"dist":{"shasum":"0d7be6fb448b0cd9cf6082a9b3de187fe4af6560","tarball":"https://registry.npmjs.org/@bluebillywig/react-native-channel/-/react-native-channel-8.54.1.tgz","fileCount":79,"integrity":"sha512-z1t+sWlGHAW6UDKXGtTYU2aHIV1deKUd/qKPdJUgnPpE0CPfK4tiyT4o5sEUDRDiATRsRdaOPQaGUW21uHyahw==","signatures":[{"sig":"MEUCICmv9NdK671NumTWYU2QB5QYhOBiqx9zlrXTuXcuGTdgAiEArw0/GCmoInPLTaz/PVO9Vg7lxXMWf7EPUSs3z6Kq8VE=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":5903389},"main":"lib/commonjs/index.js","types":"lib/typescript/src/index.d.ts","module":"lib/module/index.js","source":"src/index.ts","engines":{"node":">=24"},"gitHead":"6b04a67dd4be92549f2151f1ae24cde85ca6003d","scripts":{"lint":"eslint \"**/*.{js,ts,tsx}\"","test":"jest","build":"npm run typescript && npm run clean && npm run build:sdk && cp package.json lib/package.json","clean":"del-cli lib","release":"release-it","test:ci":"jest --ci --coverage --reporters=default --reporters=github-actions","test:cov":"jest --coverage","build:sdk":"bob build","build:full":"npm run build:bundle && npm run build","test:watch":"jest --watch","typescript":"tsc --noEmit","build:bundle":"node scripts/bundle-channel.js","build:channel":"cd .. && npm run build:native","prepublishOnly":"npm run build"},"_npmUser":{"name":"GitHub Actions","email":"npm-oidc-no-reply@github.com","trustedPublisher":{"id":"github","oidcConfigId":"oidc:be7b1062-406c-4394-a3e9-0ed11d0e3854"}},"repository":{"url":"git+https://github.com/bluebillywig/channel.git","type":"git","directory":"sdk"},"_npmVersion":"11.16.0","description":"Blue Billywig Channel SDK for React Native - Embed video channels in your React Native apps","directories":{},"_nodeVersion":"24.18.0","react-native":"lib/module/index.js","codegenConfig":{"name":"RNBBChannelSpec","type":"modules","android":{"javaPackageName":"com.bluebillywig.channelsdk"},"jsSrcsDir":"src/specs"},"_hasShrinkwrap":false,"devDependencies":{"jest":"^29.7.0","react":"19.2.3","eslint":"^8.57.0","del-cli":"^6.0.0","ts-jest":"^29.2.0","babel-jest":"^29.7.0","typescript":"^5.4.0","@types/jest":"^29.5.0","@types/react":"19.2.3","react-native":"0.85.2","react-test-renderer":"19.2.3","react-native-webview":"^13.12.5","react-native-builder-bob":"^0.40.17","@react-native/jest-preset":"^0.85.2","@react-native/babel-preset":"^0.85.2","@types/react-test-renderer":"^19.0.0","@react-native/eslint-config":"^0.85.2","@testing-library/react-native":"^13.0.0"},"peerDependencies":{"react":"*","react-native":"*","react-native-webview":">=13.0.0","react-native-safe-area-context":">=4.0.0","@bluebillywig/react-native-bb-player":">=8.54.0 <8.55.0"},"peerDependenciesMeta":{"react-native-webview":{"optional":false},"react-native-safe-area-context":{"optional":true},"@bluebillywig/react-native-bb-player":{"optional":true}},"_npmOperationalInternal":{"tmp":"tmp/react-native-channel_8.54.1_1783499507506_0.35804034404250773","host":"s3://npm-registry-packages-npm-production"},"react-native-builder-bob":{"output":"lib","source":"src","targets":[["commonjs",{"configFile":"./babel.config.js"}],["module",{"configFile":"./babel.config.js"}],["typescript",{"project":"tsconfig.build.json"}]]}},"8.54.2":{"name":"@bluebillywig/react-native-channel","version":"8.54.2","description":"Blue Billywig Channel SDK for React Native - Embed video channels in your React Native apps","main":"lib/commonjs/index.js","module":"lib/module/index.js","types":"lib/typescript/src/index.d.ts","source":"src/index.ts","react-native":"lib/module/index.js","scripts":{"typescript":"tsc --noEmit","lint":"eslint \"**/*.{js,ts,tsx}\"","test":"jest","test:watch":"jest --watch","test:cov":"jest --coverage","test:ci":"jest --ci --coverage --reporters=default --reporters=github-actions","clean":"del-cli lib","build:channel":"cd .. && npm run build:native","build:sdk":"bob build","build:bundle":"node scripts/bundle-channel.js","build":"npm run typescript && npm run clean && npm run build:sdk && cp package.json lib/package.json","build:full":"npm run build:bundle && npm run build","prepublishOnly":"npm run build","release":"release-it"},"keywords":["react-native","ios","android","video","channel","blue-billywig","ovp","player","streaming"],"repository":{"type":"git","url":"git+https://github.com/bluebillywig/channel.git","directory":"sdk"},"author":{"name":"Blue Billywig","email":"support@bluebillywig.com","url":"https://www.bluebillywig.com"},"license":"MIT","bugs":{"url":"https://github.com/bluebillywig/channel/issues"},"homepage":"https://github.com/bluebillywig/channel#readme","devDependencies":{"@react-native/babel-preset":"^0.85.2","@react-native/eslint-config":"^0.85.2","@react-native/jest-preset":"^0.85.2","@testing-library/react-native":"^13.0.0","@types/jest":"^29.5.0","@types/react":"19.2.3","@types/react-test-renderer":"^19.0.0","babel-jest":"^29.7.0","del-cli":"^6.0.0","eslint":"^8.57.0","jest":"^29.7.0","react":"19.2.3","react-native":"0.85.2","react-native-builder-bob":"^0.40.17","react-native-webview":"^13.12.5","react-test-renderer":"19.2.3","ts-jest":"^29.2.0","typescript":"^5.4.0"},"peerDependencies":{"react":"*","react-native":"*","react-native-webview":">=13.0.0","react-native-safe-area-context":">=4.0.0","@bluebillywig/react-native-bb-player":">=8.54.0 <8.55.0"},"peerDependenciesMeta":{"react-native-webview":{"optional":false},"react-native-safe-area-context":{"optional":true},"@bluebillywig/react-native-bb-player":{"optional":true}},"engines":{"node":">=24"},"codegenConfig":{"name":"RNBBChannelSpec","type":"modules","jsSrcsDir":"src/specs","android":{"javaPackageName":"com.bluebillywig.channelsdk"}},"react-native-builder-bob":{"source":"src","output":"lib","targets":[["commonjs",{"configFile":"./babel.config.js"}],["module",{"configFile":"./babel.config.js"}],["typescript",{"project":"tsconfig.build.json"}]]},"gitHead":"6b04a67dd4be92549f2151f1ae24cde85ca6003d","_id":"@bluebillywig/react-native-channel@8.54.2","_nodeVersion":"24.18.0","_npmVersion":"11.16.0","dist":{"integrity":"sha512-Ggx56q+wAQ0I4c21m4WKU0gOBJjbFM6sk0z2LZNe2cIKadM/T5Kr8wesZS/sVezrhp2VFmUEjXGzsF2rOxGrjw==","shasum":"f83af60d86cb263e515e399c68941eeea32ce64f","tarball":"https://registry.npmjs.org/@bluebillywig/react-native-channel/-/react-native-channel-8.54.2.tgz","fileCount":79,"unpackedSize":5903389,"signatures":[{"keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U","sig":"MEUCIF6MUIbW1XiklWmlsaNvfiG4BUYhMwd4cbL3tC+l8LvOAiEAjBNAB6WnAJ59h2r6IM4xnhFdFwTOW3H8rojE5ugfXEE="}]},"_npmUser":{"name":"GitHub Actions","email":"npm-oidc-no-reply@github.com","trustedPublisher":{"id":"github","oidcConfigId":"oidc:be7b1062-406c-4394-a3e9-0ed11d0e3854"}},"directories":{},"maintainers":[{"name":"jkoppen-bluebillywig","email":"j.koppen@bluebillywig.com"},{"name":"martijnbots_bb","email":"m.bots@bluebillywig.com"},{"name":"ghultink","email":"g.hultink@bluebillywig.com"},{"name":"vvanlaar","email":"v.vanlaar@bluebillywig.com"},{"name":"p.vanderspek","email":"p.vanderspek@bluebillywig.com"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages-npm-production","tmp":"tmp/react-native-channel_8.54.2_1783685534570_0.8145852926309183"},"_hasShrinkwrap":false}},"time":{"created":"2026-05-04T09:29:21.415Z","modified":"2026-07-10T12:12:14.990Z","1.1.0":"2026-05-04T09:29:21.810Z","8.52.0":"2026-06-08T11:23:03.138Z","8.53.0":"2026-06-22T11:12:09.622Z","8.54.1":"2026-07-08T08:31:47.686Z","8.54.2":"2026-07-10T12:12:14.789Z"},"bugs":{"url":"https://github.com/bluebillywig/channel/issues"},"author":{"name":"Blue Billywig","email":"support@bluebillywig.com","url":"https://www.bluebillywig.com"},"license":"MIT","homepage":"https://github.com/bluebillywig/channel#readme","keywords":["react-native","ios","android","video","channel","blue-billywig","ovp","player","streaming"],"repository":{"type":"git","url":"git+https://github.com/bluebillywig/channel.git","directory":"sdk"},"description":"Blue Billywig Channel SDK for React Native - Embed video channels in your React Native apps","maintainers":[{"name":"jkoppen-bluebillywig","email":"j.koppen@bluebillywig.com"},{"name":"martijnbots_bb","email":"m.bots@bluebillywig.com"},{"name":"ghultink","email":"g.hultink@bluebillywig.com"},{"name":"vvanlaar","email":"v.vanlaar@bluebillywig.com"},{"name":"p.vanderspek","email":"p.vanderspek@bluebillywig.com"}],"readme":"# Blue Billywig React Native Channel SDK\n\nEmbed Blue Billywig video channels in your React Native app with full navigation, authentication, and player control support.\n\n## Installation\n\n```bash\nnpm install @bluebillywig/react-native-channel react-native-webview\n```\n\n### iOS Setup\n\n```bash\ncd ios && pod install\n```\n\n### Android Setup\n\nNo additional setup required.\n\n## Quick Start\n\n```tsx\nimport { BBChannel } from '@bluebillywig/react-native-channel';\n\nfunction App() {\n  return (\n    <BBChannel\n      channelUrl=\"https://demo.bbvms.com/ch/123.json\"\n      onReady={() => console.log('Channel loaded')}\n      onMediaPlay={(media) => console.log('Playing:', media.title)}\n    />\n  );\n}\n```\n\n## BBChannel Component\n\nThe main component for embedding a video channel.\n\n### Props\n\n#### Required\n\n| Prop | Type | Description |\n|------|------|-------------|\n| `channelUrl` | `string` | URL to the channel JSON configuration |\n\n#### Configuration Options\n\n| Prop | Type | Default | Description |\n|------|------|---------|-------------|\n| `options.autoPlay` | `boolean` | `true` | Enable/disable autoplay |\n| `options.searchBar` | `boolean` | `true` | Show/hide search bar |\n| `options.noStats` | `boolean` | `false` | Disable analytics |\n| `options.jwt` | `string` | - | JWT token for authenticated content |\n| `options.rpcToken` | `string` | - | RPC token for authenticated content |\n| `options.playout` | `string` | - | Custom playout configuration name |\n| `options.contentId` | `string` | - | Initial content ID to display |\n| `options.contentType` | `'mediaclip' \\| 'mediacliplist'` | - | Type of initial content |\n| `options.bundleUrl` | `string` | CDN URL | Custom bundle URL (must be *.bluebillywig.com) |\n| `options.fullscreenMode` | `'fullscreen' \\| 'landscape'` | `'landscape'` | Fullscreen behavior |\n\n#### Lifecycle Events\n\n| Prop | Type | Description |\n|------|------|-------------|\n| `onReady` | `() => void` | Called when channel is fully loaded |\n| `onError` | `(error: BBErrorEvent) => void` | Called on errors |\n\n#### Navigation Events\n\n| Prop | Type | Description |\n|------|------|-------------|\n| `onNavigate` | `(event: BBNavigationEvent) => void` | Called on navigation changes |\n| `onNavigationStateChange` | `(state: BBNavigationState) => void` | Called when navigation state changes |\n| `onCanGoBackChange` | `(canGoBack: boolean) => void` | Called when back navigation availability changes |\n| `initialNavigationState` | `BBNavigationState` | Initial state for deep linking |\n\n#### Search Events\n\n| Prop | Type | Description |\n|------|------|-------------|\n| `onSearch` | `(event: BBSearchEvent) => void` | Called when a search is performed |\n\n#### Media Events\n\n| Prop | Type | Description |\n|------|------|-------------|\n| `onMediaPlay` | `(media: BBMediaInfo) => void` | Called when media starts playing |\n| `onMediaPause` | `(media: BBMediaInfo) => void` | Called when media is paused |\n| `onMediaEnd` | `(media: BBMediaInfo) => void` | Called when media ends |\n| `onFirstPlayerMedia` | `(media: BBMediaInfo) => void` | Called when first player media is identified |\n\n#### Player Events\n\n| Prop | Type | Description |\n|------|------|-------------|\n| `onPlayerStateChange` | `(state: BBPlayerState) => void` | Called on player state changes |\n| `onPlayerEvent` | `(event: BBPlayerEvent) => void` | Called on any player event |\n| `onTimeUpdate` | `(data: BBTimeUpdateEvent) => void` | Called frequently during playback |\n| `onClipLoaded` | `(data: BBClipLoadedEvent) => void` | Called when a clip is loaded |\n| `onAdStart` | `(data: BBAdEvent) => void` | Called when an ad starts |\n| `onAdEnd` | `(data: BBAdEvent) => void` | Called when an ad ends |\n\n### Ref Methods\n\nAccess methods via ref:\n\n```tsx\nconst channelRef = useRef<BBChannelRef>(null);\n\n// Later...\nchannelRef.current?.play();\nchannelRef.current?.setJwt('new-token');\n```\n\n#### Authentication Methods\n\n| Method | Description |\n|--------|-------------|\n| `setJwt(jwt: string \\| null)` | Update JWT token for authenticated content |\n| `setRpcToken(token: string \\| null)` | Update RPC token |\n\n#### Navigation Methods\n\n| Method | Description |\n|--------|-------------|\n| `navigateTo(page: 'main' \\| 'search')` | Navigate to a page |\n| `goBack()` | Navigate back |\n| `search(query: string)` | Perform a search |\n| `reload()` | Reload the channel |\n| `playVideo(videoId: string, type?)` | Play a specific video |\n| `navigateToEntity(entityId, entityType, options?)` | Navigate to entity detail page |\n| `navigateToSubChannel(subChannelId: string)` | Navigate to sub-channel |\n| `resetNavigation()` | Clear history and go to main |\n| `setNavigationState(state: BBNavigationState)` | Restore navigation state |\n| `getNavigationState(): Promise<BBNavigationState>` | Get current navigation state |\n| `canGoBack(): Promise<boolean>` | Check if back navigation is possible |\n\n#### Player Control Methods\n\n| Method | Description |\n|--------|-------------|\n| `play()` | Start or resume playback |\n| `pause()` | Pause playback |\n| `seek(seconds: number)` | Seek to position |\n| `setVolume(volume: number)` | Set volume (0.0 - 1.0) |\n| `setMuted(muted: boolean)` | Mute or unmute |\n| `enterFullscreen()` | Enter fullscreen mode |\n| `exitFullscreen()` | Exit fullscreen mode |\n| `getPlayerState(): Promise<BBPlayerState \\| null>` | Get current player state |\n\n## Types\n\n### BBMediaInfo\n\nInformation about a media clip.\n\n```typescript\ninterface BBMediaInfo {\n  jsonUrl: string;        // URL for loading in native player\n  playoutId: string;      // Playout configuration ID\n  autoplay: boolean;      // Whether to autoplay\n  thumbnailUrl?: string;  // Thumbnail URL\n  title?: string;         // Media title\n  mediaType?: 'video' | 'audio';  // Content type\n}\n```\n\n### BBNavigationState\n\nFull navigation state for deep linking and state persistence.\n\n```typescript\ninterface BBNavigationState {\n  pageType: 'main' | 'detailPage' | 'overviewPage' | 'searchPage';\n  contentId?: string;           // Entity ID\n  contentType?: 'mediaclip' | 'mediacliplist';\n  searchQuery?: string;\n  clickedSearchResult?: boolean;\n  blockId?: string;\n  contextId?: string;\n  playout?: string;\n  collectionId?: string;\n  subChannelId?: string;\n}\n```\n\n### BBPlayerState\n\nCurrent player state.\n\n```typescript\ninterface BBPlayerState {\n  isPlaying: boolean;\n  currentTime?: number;   // In seconds\n  duration?: number;      // In seconds\n  volume?: number;        // 0.0 - 1.0\n  isMuted?: boolean;\n  isFullscreen?: boolean;\n}\n```\n\n### BBPlayerEvent\n\nUnion type for all player events. Use with `onPlayerEvent` for fine-grained control.\n\n```typescript\n// Event types:\n// 'play', 'pause', 'ended', 'canplay', 'waiting',\n// 'seeking', 'seeked', 'timeupdate', 'durationchange', 'progress',\n// 'volumechange', 'fullscreenchange', 'loadstart', 'loadedmetadata', 'loadeddata',\n// 'cliploaded', 'clipfailed', 'cliplistloaded',\n// 'adstart', 'adend', 'adskip', 'aderror', 'error'\n```\n\n### BBTimeUpdateEvent\n\nTime update data sent frequently during playback.\n\n```typescript\ninterface BBTimeUpdateEvent {\n  timestamp: number;\n  clipId?: string;\n  title?: string;\n  currentTime: number;  // In seconds\n  duration: number;     // In seconds\n  progress: number;     // 0-100 percentage\n}\n```\n\n### BBClipLoadedEvent\n\nClip loaded event data.\n\n```typescript\ninterface BBClipLoadedEvent {\n  timestamp: number;\n  clipId: string;\n  title: string;\n  duration: number;     // In seconds\n  thumbnailUrl?: string;\n  isLive?: boolean;\n}\n```\n\n### BBAdEvent\n\nAdvertisement event data.\n\n```typescript\ninterface BBAdEvent {\n  timestamp: number;\n  position?: 'pre' | 'mid' | 'post';\n  duration?: number;      // In seconds\n  remainingTime?: number; // In seconds\n  skippable?: boolean;\n  skipOffset?: number;    // Seconds until skip available\n}\n```\n\n### BBErrorEvent\n\nError event data.\n\n```typescript\ninterface BBErrorEvent {\n  code: string;\n  message: string;\n  details?: unknown;\n}\n```\n\n### BBSearchEvent\n\nSearch event data.\n\n```typescript\ninterface BBSearchEvent {\n  query: string;\n  resultCount: number;\n}\n```\n\n## Examples\n\n### Authentication\n\n```tsx\nfunction AuthenticatedChannel() {\n  const channelRef = useRef<BBChannelRef>(null);\n  const [token, setToken] = useState<string | null>(null);\n\n  // Update token when it changes\n  useEffect(() => {\n    channelRef.current?.setJwt(token);\n  }, [token]);\n\n  return (\n    <BBChannel\n      ref={channelRef}\n      channelUrl=\"https://demo.bbvms.com/ch/123.json\"\n      options={{ jwt: token ?? undefined }}\n    />\n  );\n}\n```\n\n### Player Progress Tracking\n\n```tsx\nfunction ProgressTrackingChannel() {\n  const [progress, setProgress] = useState(0);\n\n  return (\n    <>\n      <ProgressBar value={progress} />\n      <BBChannel\n        channelUrl=\"https://demo.bbvms.com/ch/123.json\"\n        onTimeUpdate={(data) => setProgress(data.progress)}\n        onPlayerEvent={(event) => {\n          if (event.type === 'ended') {\n            console.log('Video finished!');\n          }\n        }}\n      />\n    </>\n  );\n}\n```\n\n### Deep Linking\n\n```tsx\nfunction DeepLinkChannel() {\n  const channelRef = useRef<BBChannelRef>(null);\n\n  // Handle deep link\n  useEffect(() => {\n    const url = Linking.getInitialURL();\n    if (url?.includes('video=')) {\n      const videoId = extractVideoId(url);\n      channelRef.current?.navigateToEntity(videoId, 'mediaclip', { autoPlay: true });\n    }\n  }, []);\n\n  // Save state for restoration\n  const handleNavigationChange = (state: BBNavigationState) => {\n    AsyncStorage.setItem('channelState', JSON.stringify(state));\n  };\n\n  return (\n    <BBChannel\n      ref={channelRef}\n      channelUrl=\"https://demo.bbvms.com/ch/123.json\"\n      onNavigationStateChange={handleNavigationChange}\n    />\n  );\n}\n```\n\n### Android Back Button\n\n```tsx\nfunction BackButtonChannel() {\n  const channelRef = useRef<BBChannelRef>(null);\n  const [canGoBack, setCanGoBack] = useState(false);\n\n  useEffect(() => {\n    const backHandler = BackHandler.addEventListener('hardwareBackPress', () => {\n      if (canGoBack) {\n        channelRef.current?.goBack();\n        return true;\n      }\n      return false;\n    });\n    return () => backHandler.remove();\n  }, [canGoBack]);\n\n  return (\n    <BBChannel\n      ref={channelRef}\n      channelUrl=\"https://demo.bbvms.com/ch/123.json\"\n      onCanGoBackChange={setCanGoBack}\n    />\n  );\n}\n```\n\n### Player Controls\n\n```tsx\nfunction PlayerControlsChannel() {\n  const channelRef = useRef<BBChannelRef>(null);\n\n  const handlePlayPause = async () => {\n    const state = await channelRef.current?.getPlayerState();\n    if (state?.isPlaying) {\n      channelRef.current?.pause();\n    } else {\n      channelRef.current?.play();\n    }\n  };\n\n  return (\n    <>\n      <TouchableOpacity onPress={handlePlayPause}>\n        <Text>Play/Pause</Text>\n      </TouchableOpacity>\n      <BBChannel\n        ref={channelRef}\n        channelUrl=\"https://demo.bbvms.com/ch/123.json\"\n      />\n    </>\n  );\n}\n```\n\n## BBChannelWithPlayer Component\n\nA channel component with integrated native video player. Combines BBChannel (WebView) with BBPlayerView (native player) for optimal video playback. Requires `@bluebillywig/react-native-bb-player` as a peer dependency.\n\n```tsx\nimport { BBChannelWithPlayer } from '@bluebillywig/react-native-channel';\n\nfunction App() {\n  return (\n    <BBChannelWithPlayer\n      channelUrl=\"https://demo.bbvms.com/ch/123.json\"\n      playerMode=\"inline\"\n      onNativePlayerStateChange={(state) => console.log('Player:', state)}\n    />\n  );\n}\n```\n\n### Props (in addition to BBChannel props)\n\n| Prop | Type | Default | Description |\n|------|------|---------|-------------|\n| `playerMode` | `'inline' \\| 'fullscreen'` | `'inline'` | Player display mode |\n| `playerHeight` | `number` | - | Fixed height for inline player (uses aspectRatio if not set) |\n| `playerAspectRatio` | `number` | `16/9` | Aspect ratio for inline player |\n| `showBackArrow` | `boolean` | `true` | Show close button over inline player |\n| `jwt` | `string` | - | JWT token for both channel and player |\n| `onNativePlayerStateChange` | `(state) => void` | - | Called on player state changes |\n| `onNativePlayerError` | `(error) => void` | - | Called on player errors |\n\n## Troubleshooting\n\n### WebView not rendering\n\nMake sure `react-native-webview` is properly installed and linked:\n\n```bash\nnpm install react-native-webview\ncd ios && pod install\n```\n\n### Video not playing on iOS\n\nEnsure your app has the proper permissions:\n\n```xml\n<!-- ios/YourApp/Info.plist -->\n<key>NSAppTransportSecurity</key>\n<dict>\n    <key>NSAllowsArbitraryLoads</key>\n    <true/>\n</dict>\n```\n\n### Channel not loading\n\n1. Verify the channel URL is accessible\n2. Check network connectivity\n3. Ensure CORS is properly configured on your publication\n\n### Authentication errors\n\n- Verify JWT/RPC tokens are valid and not expired\n- Check that tokens have the correct permissions\n\n## Support\n\n- Documentation: https://support.bluebillywig.com\n- Email: support@bluebillywig.com\n\n## License\n\nProprietary - Blue Billywig\n","readmeFilename":"README.md"}