From cc78a1e432e7259650969255f623f304e48835b0 Mon Sep 17 00:00:00 2001 From: Luong Minh Date: Mon, 4 Dec 2023 18:17:20 +0700 Subject: [PATCH] first init --- .eslintrc.js | 4 + LICENSE | 2 +- README.md | 24 +- dist/index.cjs | 959 +++++++++++++++++++++++- dist/index.cjs.map | 2 +- dist/index.esm.js | 937 +++++++++++++++++++++++- dist/index.esm.js.map | 2 +- dist/index.js | 959 +++++++++++++++++++++++- dist/index.js.map | 2 +- dist/index.mjs | 937 +++++++++++++++++++++++- dist/index.mjs.map | 2 +- dist/index.umd.js | 968 ++++++++++++++++++++++++- dist/index.umd.js.map | 2 +- dist/index.umd.min.js | 6 +- dist/index.umd.min.js.map | 2 +- docs/README.md | 4 +- package-lock.json | 30 +- package.json | 15 +- prettier.config.js | 2 + rollup.config.mjs | 2 +- setup.js | 128 ---- src/components/index.ts | 7 + src/components/provider.tsx | 486 +++++++++++++ src/components/video_viewer.tsx | 26 + src/hooks/actions.ts | 20 + src/hooks/audio_level.ts | 97 +++ src/hooks/consumer.ts | 130 ++++ src/hooks/device.ts | 216 ++++++ src/hooks/index.ts | 28 + src/hooks/publisher.ts | 33 + src/hooks/remote.ts | 29 + src/hooks/session.ts | 8 + src/hooks/state.ts | 7 + src/index.test.ts | 16 - src/index.ts | 29 +- src/polyfill.ts | 8 + tsconfig.json | 23 +- typedoc.json | 2 +- types/components/index.d.ts | 3 + types/components/index.d.ts.map | 1 + types/components/provider.d.ts | 55 ++ types/components/provider.d.ts.map | 1 + types/components/video_viewer.d.ts | 14 + types/components/video_viewer.d.ts.map | 1 + types/hooks/actions.d.ts | 9 + types/hooks/actions.d.ts.map | 1 + types/hooks/audio_level.d.ts | 12 + types/hooks/audio_level.d.ts.map | 1 + types/hooks/consumer.d.ts | 6 + types/hooks/consumer.d.ts.map | 1 + types/hooks/device.d.ts | 8 + types/hooks/device.d.ts.map | 1 + types/hooks/index.d.ts | 10 + types/hooks/index.d.ts.map | 1 + types/hooks/publisher.d.ts | 4 + types/hooks/publisher.d.ts.map | 1 + types/hooks/remote.d.ts | 4 + types/hooks/remote.d.ts.map | 1 + types/hooks/session.d.ts | 3 + types/hooks/session.d.ts.map | 1 + types/hooks/state.d.ts | 3 + types/hooks/state.d.ts.map | 1 + types/index.d.ts | 26 +- types/index.d.ts.map | 2 +- types/polyfill.d.ts | 7 + types/polyfill.d.ts.map | 1 + 66 files changed, 5984 insertions(+), 349 deletions(-) delete mode 100644 setup.js create mode 100644 src/components/index.ts create mode 100644 src/components/provider.tsx create mode 100644 src/components/video_viewer.tsx create mode 100644 src/hooks/actions.ts create mode 100644 src/hooks/audio_level.ts create mode 100644 src/hooks/consumer.ts create mode 100644 src/hooks/device.ts create mode 100644 src/hooks/index.ts create mode 100644 src/hooks/publisher.ts create mode 100644 src/hooks/remote.ts create mode 100644 src/hooks/session.ts create mode 100644 src/hooks/state.ts delete mode 100644 src/index.test.ts create mode 100644 src/polyfill.ts create mode 100644 types/components/index.d.ts create mode 100644 types/components/index.d.ts.map create mode 100644 types/components/provider.d.ts create mode 100644 types/components/provider.d.ts.map create mode 100644 types/components/video_viewer.d.ts create mode 100644 types/components/video_viewer.d.ts.map create mode 100644 types/hooks/actions.d.ts create mode 100644 types/hooks/actions.d.ts.map create mode 100644 types/hooks/audio_level.d.ts create mode 100644 types/hooks/audio_level.d.ts.map create mode 100644 types/hooks/consumer.d.ts create mode 100644 types/hooks/consumer.d.ts.map create mode 100644 types/hooks/device.d.ts create mode 100644 types/hooks/device.d.ts.map create mode 100644 types/hooks/index.d.ts create mode 100644 types/hooks/index.d.ts.map create mode 100644 types/hooks/publisher.d.ts create mode 100644 types/hooks/publisher.d.ts.map create mode 100644 types/hooks/remote.d.ts create mode 100644 types/hooks/remote.d.ts.map create mode 100644 types/hooks/session.d.ts create mode 100644 types/hooks/session.d.ts.map create mode 100644 types/hooks/state.d.ts create mode 100644 types/hooks/state.d.ts.map create mode 100644 types/polyfill.d.ts create mode 100644 types/polyfill.d.ts.map diff --git a/.eslintrc.js b/.eslintrc.js index 67be951..9ff1c8b 100644 --- a/.eslintrc.js +++ b/.eslintrc.js @@ -23,6 +23,10 @@ const options = { 'plugin:@typescript-eslint/eslint-recommended', 'plugin:@typescript-eslint/recommended', ], + rules: { + 'max-len': ['error', { code: 120 }], + 'camelcase': 'error', + }, }; module.exports = options; diff --git a/LICENSE b/LICENSE index 3de7ba8..1043d97 100644 --- a/LICENSE +++ b/LICENSE @@ -1,6 +1,6 @@ MIT License -Copyright (c) [year] [authorFullName] +Copyright (c) 2023 Luong Ngoc Minh Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal diff --git a/README.md b/README.md index e9b23f4..9c238e3 100644 --- a/README.md +++ b/README.md @@ -1,20 +1,20 @@ -# [libraryNameWithSpacesAndUpperCases] +# Atm0s React SDK -[![Continuous Integrations](https://github.com/[repositoryOwner]/[repositoryName]/actions/workflows/continuous-integrations.yaml/badge.svg?branch=main)](https://github.com/[repositoryOwner]/[repositoryName]/actions/workflows/continuous-integrations.yaml) -[![License](https://badgen.net/github/license/[repositoryOwner]/[repositoryName])](./LICENSE) -[![Package tree-shaking](https://badgen.net/bundlephobia/tree-shaking/[libraryName])](https://bundlephobia.com/package/[libraryName]) -[![Package minified & gzipped size](https://badgen.net/bundlephobia/minzip/[libraryName])](https://bundlephobia.com/package/[libraryName]) -[![Package dependency count](https://badgen.net/bundlephobia/dependency-count/react[libraryName])](https://bundlephobia.com/package/[libraryName]) +[![Continuous Integrations](https://github.com/8xff/media-sdk-react/actions/workflows/continuous-integrations.yaml/badge.svg?branch=main)](https://github.com/8xff/media-sdk-react/actions/workflows/continuous-integrations.yaml) +[![License](https://badgen.net/github/license/8xff/media-sdk-react)](./LICENSE) +[![Package tree-shaking](https://badgen.net/bundlephobia/tree-shaking/@8xff/atm0s-media-react)](https://bundlephobia.com/package/@8xff/atm0s-media-react) +[![Package minified & gzipped size](https://badgen.net/bundlephobia/minzip/@8xff/atm0s-media-react)](https://bundlephobia.com/package/@8xff/atm0s-media-react) +[![Package dependency count](https://badgen.net/bundlephobia/dependency-count/react@8xff/atm0s-media-react)](https://bundlephobia.com/package/@8xff/atm0s-media-react) ## Installation This library is published in the NPM registry and can be installed using any compatible package manager. ```sh -npm install [libraryName] --save +npm install @8xff/atm0s-media-react --save # For Yarn, use the command below. -yarn add [libraryName] +yarn add @8xff/atm0s-media-react ``` ### Installation from CDN @@ -23,14 +23,14 @@ This module has an UMD bundle available through JSDelivr and Unpkg CDNs. ```html - + - + ``` diff --git a/dist/index.cjs b/dist/index.cjs index 2ed207b..f6b7e87 100644 --- a/dist/index.cjs +++ b/dist/index.cjs @@ -1,30 +1,947 @@ /*! - * [libraryName] v0.0.0 - * (c) [authorFullName] + * @8xff/atm0s-media-react v0.0.0 + * (c) Luong Ngoc Minh * Released under the MIT License. */ 'use strict'; -/** - * Check if value is parseable to number. - * @example - * ```js - * isNumberParseable('AAAA'); - * //=> false - * - * isNumberParseable('100'); - * //=> true - * - * if (!isNumberParseable(value)) - * throw new Error('Value can\'t be parseable to `Number`.') - * return Number(value); - * ``` - * @param value - An `unknown` value to be checked. - */ -var isNumberParseable = function (value) { - return !Number.isNaN(Number(value)); +var React = require('react'); +var Atm0s = require('@8xff/atm0s-media-js'); +var typedEventEmitter = require('@8xff/atm0s-media-js/types/lib/utils/typed-event-emitter'); +var logger$1 = require('@8xff/atm0s-media-js/types/lib/utils/logger'); + +/****************************************************************************** +Copyright (c) Microsoft Corporation. + +Permission to use, copy, modify, and/or distribute this software for any +purpose with or without fee is hereby granted. + +THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES WITH +REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY +AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT, +INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM +LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR +OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR +PERFORMANCE OF THIS SOFTWARE. +***************************************************************************** */ +/* global Reflect, Promise, SuppressedError, Symbol */ + +var extendStatics = function(d, b) { + extendStatics = Object.setPrototypeOf || + ({ __proto__: [] } instanceof Array && function (d, b) { d.__proto__ = b; }) || + function (d, b) { for (var p in b) if (Object.prototype.hasOwnProperty.call(b, p)) d[p] = b[p]; }; + return extendStatics(d, b); +}; + +function __extends(d, b) { + if (typeof b !== "function" && b !== null) + throw new TypeError("Class extends value " + String(b) + " is not a constructor or null"); + extendStatics(d, b); + function __() { this.constructor = d; } + d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __()); +} + +typeof SuppressedError === "function" ? SuppressedError : function (error, suppressed, message) { + var e = new Error(message); + return e.name = "SuppressedError", e.error = error, e.suppressed = suppressed, e; +}; + +var logger = logger$1.getLogger('DeviceHook'); +var StreamContainer = /** @class */ (function (_super) { + __extends(StreamContainer, _super); + function StreamContainer(key) { + var _this = _super.call(this) || this; + _this.key = key; + _this.count = 0; + _this.data = {}; + logger.log('Created container for local stream', key); + return _this; + } + StreamContainer.prototype.setData = function (data) { + this.data = data; + this.emit('changed', data); + }; + StreamContainer.prototype.retain = function () { + this.count += 1; + logger.log('Retain local stream', this.key, this.count); + return this.count; + }; + StreamContainer.prototype.release = function () { + var _a; + this.count -= 1; + logger.log('Release local stream', this.key, this.count); + if (this.count == 0) { + logger.log('Destroy local stream', this.key); + (_a = this.data.media) === null || _a === void 0 ? void 0 : _a.getTracks().map(function (track) { + track.stop(); + }); + } + return this.count; + }; + return StreamContainer; +}(typedEventEmitter.TypedEventEmitter)); +var globalStore = new Map(); +var useDevices = function (kind) { + var _a = React.useState([]), devices = _a[0], setDevices = _a[1]; + var _b = React.useState(null), error = _b[0], setError = _b[1]; + React.useEffect(function () { + navigator.mediaDevices + .enumerateDevices() + .then(function (devices) { + setDevices(devices.filter(function (d) { return d.kind == kind; })); + }) + .catch(function (error) { + setDevices([]); + setError(error); + }); + }, [kind]); + return [devices, error]; +}; +function getDevicePrivate(kind, deviceId, callback) { + var key = kind + '-' + deviceId; + var containerSlot = globalStore.get(key); + if (containerSlot) { + containerSlot.on('changed', callback); + callback(containerSlot.data); + } + else { + containerSlot = new StreamContainer(key); + globalStore.set(key, containerSlot); + var constraints = {}; + if (kind == 'audioinput') { + constraints = { + audio: typeof deviceId == 'string' + ? { + deviceId: deviceId, + } + : true, + }; + } + else if (kind == 'videoinput') { + constraints = { + video: typeof deviceId == 'string' + ? { + deviceId: deviceId, + } + : true, + }; + } + navigator.mediaDevices + .getUserMedia(constraints) + .then(function (stream) { + stream.cachedKey = key; + containerSlot === null || containerSlot === void 0 ? void 0 : containerSlot.setData({ media: stream }); + callback({ media: stream }); + }) + .catch(function (err) { + containerSlot === null || containerSlot === void 0 ? void 0 : containerSlot.setData({ error: err }); + callback({ error: err }); + }); + } + return [containerSlot, key]; +} +function getDevice(kind, deviceId) { + return new Promise(function (resolve, reject) { + getDevicePrivate(kind, deviceId, function (res) { + if (res.error) { + reject(res.error); + } + else { + resolve(res.media); + } + }); + }); +} +function retainDevice(key) { + var slot = globalStore.get(key); + slot === null || slot === void 0 ? void 0 : slot.retain(); +} +function releaseDevice(key) { + var slot = globalStore.get(key); + if ((slot === null || slot === void 0 ? void 0 : slot.release()) == 0) { + globalStore.delete(key); + } +} +var useDevice = function (kind, deviceId) { + var _a = React.useState({}), res = _a[0], setRes = _a[1]; + React.useEffect(function () { + if (deviceId != false) { + var _a = getDevicePrivate(kind, deviceId, setRes), containerSlot_1 = _a[0], key_1 = _a[1]; + containerSlot_1.retain(); + return function () { + setRes({ media: undefined, error: undefined }); + if ((containerSlot_1 === null || containerSlot_1 === void 0 ? void 0 : containerSlot_1.release()) == 0) { + globalStore.delete(key_1); + } + }; + } + }, [kind, deviceId]); + return [res.media, res.error]; +}; +var useUserMedia = function (constraints, active) { + var _a = React.useState({}), res = _a[0], setRes = _a[1]; + React.useEffect(function () { + if (active) { + var gotStream_1; + navigator.mediaDevices + .getUserMedia(constraints) + .then(function (stream) { + gotStream_1 = stream; + setRes({ media: stream }); + }) + .catch(function (err) { + gotStream_1 = undefined; + setRes({ error: err }); + }); + return function () { + setRes({ media: undefined, error: undefined }); + gotStream_1 === null || gotStream_1 === void 0 ? void 0 : gotStream_1.getTracks().forEach(function (track) { + track.stop(); + }); + }; + } + }, [JSON.stringify(constraints), active]); + return [res.media, res.error]; +}; +var useDisplayMedia = function (constraints, active) { + var _a = React.useState({}), res = _a[0], setRes = _a[1]; + React.useEffect(function () { + if (active) { + var gotStream_2; + navigator.mediaDevices + .getDisplayMedia(constraints) + .then(function (stream) { + gotStream_2 = stream; + setRes({ media: stream }); + }) + .catch(function (err) { + gotStream_2 = undefined; + setRes({ error: err }); + }); + return function () { + setRes({ media: undefined, error: undefined }); + gotStream_2 === null || gotStream_2 === void 0 ? void 0 : gotStream_2.getTracks().forEach(function (track) { + track.stop(); + }); + }; + } + }, [JSON.stringify(constraints), active]); + return [res.media, res.error]; +}; + +exports.SessionState = void 0; +(function (SessionState) { + SessionState["New"] = "new"; + SessionState["Connecting"] = "connecting"; + SessionState["Connected"] = "connected"; + SessionState["Reconnecting"] = "reconnecting"; + SessionState["Disconnected"] = "disconnected"; + SessionState["Error"] = "error"; +})(exports.SessionState || (exports.SessionState = {})); +var StreamPublisherWrap = /** @class */ (function () { + function StreamPublisherWrap(publisher) { + this.publisher = publisher; + } + Object.defineProperty(StreamPublisherWrap.prototype, "state", { + get: function () { + return this.publisher.state; + }, + enumerable: false, + configurable: true + }); + Object.defineProperty(StreamPublisherWrap.prototype, "localStream", { + get: function () { + return this.publisher.localStream; + }, + enumerable: false, + configurable: true + }); + StreamPublisherWrap.prototype.on = function (type, callback) { + this.publisher.on(type, callback); + }; + StreamPublisherWrap.prototype.off = function (type, callback) { + this.publisher.on(type, callback); + }; + StreamPublisherWrap.prototype.switchStream = function (stream) { + if (stream) { + // eslint-disable-next-line @typescript-eslint/no-explicit-any + var cachedKey = stream.cachedKey; + if (cachedKey) { + retainDevice(cachedKey); + } + } + if (this.publisher.localStream) { + // eslint-disable-next-line @typescript-eslint/no-explicit-any + var cacheKey = this.publisher.localStream.cachedKey; + if (cacheKey) { + releaseDevice(cacheKey); + } + } + return this.publisher.switch(stream); + }; + return StreamPublisherWrap; +}()); +var SessionContext = React.createContext({}); +var GlobalVer = 0; +var SessionProvider = function (props) { + // if (props.log_level != undefined) { + // Atm0s.setLogLevel(props.log_level); + // } + var _a = React.useState(0), setVer = _a[1]; + var storage = React.useMemo(function () { + return { data: undefined }; + }, []); + var update = React.useCallback(function (data) { + storage.data = data; + setVer(GlobalVer++); + }, [storage, setVer]); + var connect = React.useCallback(function (url, config) { + var _a, _b; + if ((_a = storage.data) === null || _a === void 0 ? void 0 : _a.session) { + return function () { + var _a; + (_a = storage.data) === null || _a === void 0 ? void 0 : _a.session.disconnect(); + }; + } + var session = Atm0s.createSession(url, config); + var myAudioStreams = new Map(); + var myVideoStreams = new Map(); + var audioStreams = new Map(); + var videoStreams = new Map(); + var publishers = new Map(); + var consumers = new Map(); + var consumerPairs = new Map(); + (_b = config === null || config === void 0 ? void 0 : config.senders) === null || _b === void 0 ? void 0 : _b.map(function (sender) { + if (sender.stream) { + // eslint-disable-next-line @typescript-eslint/no-explicit-any + var cachedKey = sender.stream.cachedKey; + if (cachedKey) { + retainDevice(cachedKey); + } + } + }); + session.on('connected', function () { + var _a; + if (((_a = storage.data) === null || _a === void 0 ? void 0 : _a.session) != session) + return; + update({ + session: session, + state: exports.SessionState.Connected, + myAudioStreams: Array.from(myAudioStreams.values()), + myVideoStreams: Array.from(myVideoStreams.values()), + audioStreams: Array.from(audioStreams.values()), + videoStreams: Array.from(videoStreams.values()), + publishers: publishers, + consumers: consumers, + consumerPairs: consumerPairs, + }); + }); + session.on('mystream_added', function (stream) { + var _a; + if (((_a = storage.data) === null || _a === void 0 ? void 0 : _a.session) != session) + return; + var key = stream.peerId + '-' + stream.name; + if (stream.kind === Atm0s.StreamKinds.AUDIO) { + myAudioStreams.set(key, stream); + } + else { + myVideoStreams.set(key, stream); + } + update({ + session: session, + state: exports.SessionState.Connected, + myAudioStreams: Array.from(myAudioStreams.values()), + myVideoStreams: Array.from(myVideoStreams.values()), + audioStreams: Array.from(audioStreams.values()), + videoStreams: Array.from(videoStreams.values()), + publishers: publishers, + consumers: consumers, + consumerPairs: consumerPairs, + }); + }); + session.on('mystream_updated', function (stream) { + var _a; + if (((_a = storage.data) === null || _a === void 0 ? void 0 : _a.session) != session) + return; + var key = stream.peerId + '-' + stream.name; + if (stream.kind === Atm0s.StreamKinds.AUDIO) { + myAudioStreams.set(key, stream); + } + else { + myVideoStreams.set(key, stream); + } + update({ + session: session, + state: exports.SessionState.Connected, + myAudioStreams: Array.from(myAudioStreams.values()), + myVideoStreams: Array.from(myVideoStreams.values()), + audioStreams: Array.from(audioStreams.values()), + videoStreams: Array.from(videoStreams.values()), + publishers: publishers, + consumers: consumers, + consumerPairs: consumerPairs, + }); + }); + session.on('mystream_removed', function (stream) { + var _a; + if (((_a = storage.data) === null || _a === void 0 ? void 0 : _a.session) != session) + return; + var key = stream.peerId + '-' + stream.name; + if (stream.kind === Atm0s.StreamKinds.AUDIO) { + myAudioStreams.delete(key); + } + else { + myVideoStreams.delete(key); + } + update({ + session: session, + state: exports.SessionState.Connected, + myAudioStreams: Array.from(myAudioStreams.values()), + myVideoStreams: Array.from(myVideoStreams.values()), + audioStreams: Array.from(audioStreams.values()), + videoStreams: Array.from(videoStreams.values()), + publishers: publishers, + consumers: consumers, + consumerPairs: consumerPairs, + }); + }); + session.on('stream_added', function (stream) { + var _a; + if (((_a = storage.data) === null || _a === void 0 ? void 0 : _a.session) != session) + return; + var key = stream.peerId + '-' + stream.name; + if (stream.kind === Atm0s.StreamKinds.AUDIO) { + audioStreams.set(key, stream); + } + else { + videoStreams.set(key, stream); + } + update({ + session: session, + state: exports.SessionState.Connected, + myAudioStreams: Array.from(myAudioStreams.values()), + myVideoStreams: Array.from(myVideoStreams.values()), + audioStreams: Array.from(audioStreams.values()), + videoStreams: Array.from(videoStreams.values()), + publishers: publishers, + consumers: consumers, + consumerPairs: consumerPairs, + }); + }); + session.on('stream_updated', function (stream) { + var _a; + if (((_a = storage.data) === null || _a === void 0 ? void 0 : _a.session) != session) + return; + var key = stream.peerId + '-' + stream.name; + if (stream.kind === Atm0s.StreamKinds.AUDIO) { + audioStreams.set(key, stream); + } + else { + videoStreams.set(key, stream); + } + update({ + session: session, + state: exports.SessionState.Connected, + myAudioStreams: Array.from(myAudioStreams.values()), + myVideoStreams: Array.from(myVideoStreams.values()), + audioStreams: Array.from(audioStreams.values()), + videoStreams: Array.from(videoStreams.values()), + publishers: publishers, + consumers: consumers, + consumerPairs: consumerPairs, + }); + }); + session.on('stream_removed', function (stream) { + var _a; + if (((_a = storage.data) === null || _a === void 0 ? void 0 : _a.session) != session) + return; + var key = stream.peerId + '-' + stream.name; + if (stream.kind === Atm0s.StreamKinds.AUDIO) { + audioStreams.delete(key); + } + else { + videoStreams.delete(key); + } + update({ + session: session, + state: exports.SessionState.Connected, + myAudioStreams: Array.from(myAudioStreams.values()), + myVideoStreams: Array.from(myVideoStreams.values()), + audioStreams: Array.from(audioStreams.values()), + videoStreams: Array.from(videoStreams.values()), + publishers: publishers, + consumers: consumers, + consumerPairs: consumerPairs, + }); + }); + session.on('disconnected', function () { + var _a; + if (((_a = storage.data) === null || _a === void 0 ? void 0 : _a.session) != session) + return; + update({ + session: session, + state: exports.SessionState.Disconnected, + myAudioStreams: Array.from(myAudioStreams.values()), + myVideoStreams: Array.from(myVideoStreams.values()), + audioStreams: Array.from(audioStreams.values()), + videoStreams: Array.from(videoStreams.values()), + publishers: publishers, + consumers: consumers, + consumerPairs: consumerPairs, + }); + }); + session.connect().catch(function (err) { + var _a; + if (((_a = storage.data) === null || _a === void 0 ? void 0 : _a.session) != session) + return; + console.error(err); + update({ + session: session, + state: exports.SessionState.Error, + myAudioStreams: Array.from(myAudioStreams.values()), + myVideoStreams: Array.from(myVideoStreams.values()), + audioStreams: Array.from(audioStreams.values()), + videoStreams: Array.from(videoStreams.values()), + publishers: publishers, + consumers: consumers, + consumerPairs: consumerPairs, + }); + }); + update({ + session: session, + state: exports.SessionState.Connecting, + myAudioStreams: [], + myVideoStreams: [], + audioStreams: [], + videoStreams: [], + publishers: publishers, + consumers: consumers, + consumerPairs: consumerPairs, + }); + return; + }, [storage, update]); + var disconnect = React.useCallback(function () { + var _a; + if ((_a = storage.data) === null || _a === void 0 ? void 0 : _a.session) { + storage.data.session.disconnect(); + update(undefined); + } + }, [storage, update]); + var getPublisher = React.useCallback(function (ownerId, cfg) { + var _a; + var data = storage.data; + if (data === null || data === void 0 ? void 0 : data.session) { + var publisher = data.publishers.get(cfg.name); + if (!publisher) { + publisher = { + data: new StreamPublisherWrap(data.session.createPublisher({ + stream: cfg.stream, + name: cfg.name, + kind: cfg.kind, + preferredCodecs: cfg.preferredCodecs, + simulcast: cfg.simulcast, + maxBitrate: cfg.maxBitrate, + contentHint: cfg.contentHint, + screen: cfg.screen, + })), + owners: new Map(), + }; + data.publishers.set(cfg.name, publisher); + } + (_a = data.publishers.get(cfg.name)) === null || _a === void 0 ? void 0 : _a.owners.set(ownerId, new Date().getTime()); + return publisher.data; + } + return undefined; + }, [storage]); + var backPublisher = React.useCallback(function (ownerId, cfg) { + var data = storage.data; + if (data === null || data === void 0 ? void 0 : data.session) { + var publisher = data.publishers.get(cfg.name); + if (publisher) { + publisher.owners.delete(ownerId); + if (publisher.owners.size == 0) { + publisher.data.switchStream(null); + data.publishers.delete(cfg.name); + } + } + } + return undefined; + }, [storage]); + var getConsumer = React.useCallback(function (ownerId, stream) { + var _a; + var data = storage.data; + if (data === null || data === void 0 ? void 0 : data.session) { + var key = stream.peerId + '-' + stream.name; + var consumer = data.consumers.get(key); + if (!consumer) { + consumer = { + data: data.session.createConsumer(stream), + owners: new Map(), + }; + data.consumers.set(key, consumer); + } + (_a = data.consumers.get(key)) === null || _a === void 0 ? void 0 : _a.owners.set(ownerId, new Date().getTime()); + return consumer.data; + } + return undefined; + }, [storage]); + var backConsumer = React.useCallback(function (ownerId, stream) { + var data = storage.data; + if (data === null || data === void 0 ? void 0 : data.session) { + var key = stream.peerId + '-' + stream.name; + var consumer = data.consumers.get(key); + if (consumer) { + consumer.owners.delete(ownerId); + if (consumer.owners.size == 0) { + data.consumers.delete(key); + } + } + } + return undefined; + }, [storage]); + var getConsumerPair = React.useCallback(function (ownerId, peerId, audioName, videoName) { + var _a; + var data = storage.data; + if (data === null || data === void 0 ? void 0 : data.session) { + var key = peerId + '-' + audioName + '-' + videoName; + var consumer = data.consumerPairs.get(key); + if (!consumer) { + consumer = { + data: data.session.createConsumerPair(peerId, audioName, videoName), + owners: new Map(), + }; + data.consumerPairs.set(key, consumer); + } + (_a = data.consumerPairs.get(key)) === null || _a === void 0 ? void 0 : _a.owners.set(ownerId, new Date().getTime()); + return consumer.data; + } + return undefined; + }, [storage]); + var backConsumerPair = React.useCallback(function (ownerId, peerId, audioName, videoName) { + var data = storage.data; + if (data === null || data === void 0 ? void 0 : data.session) { + var key = peerId + '-' + audioName + '-' + videoName; + var consumer = data.consumerPairs.get(key); + if (consumer) { + consumer.owners.delete(ownerId); + if (consumer.owners.size == 0) { + data.consumerPairs.delete(key); + } + } + } + return undefined; + }, [storage]); + React.useEffect(function () { + if (props.url && props.config) { + connect(props.url, props.config); + return function () { + disconnect(); + }; + } + }, [props.url, props.config, connect, disconnect]); + return (React.createElement(SessionContext.Provider, { value: { + data: storage.data, + connect: connect, + disconnect: disconnect, + getPublisher: getPublisher, + backPublisher: backPublisher, + getConsumer: getConsumer, + backConsumer: backConsumer, + getConsumerPair: getConsumerPair, + backConsumerPair: backConsumerPair, + update: update, + } }, props.children)); +}; + +var useRemoteStreams = function (kind, isMine) { + var data = React.useContext(SessionContext).data; + if (kind == Atm0s.StreamKinds.AUDIO) { + if (isMine === true) { + return (data === null || data === void 0 ? void 0 : data.myAudioStreams) || []; + } + else { + return (data === null || data === void 0 ? void 0 : data.audioStreams) || []; + } + } + else { + if (isMine === true) { + return (data === null || data === void 0 ? void 0 : data.myVideoStreams) || []; + } + else { + return (data === null || data === void 0 ? void 0 : data.videoStreams) || []; + } + } +}; + +var useSession = function () { + var data = React.useContext(SessionContext).data; + return data === null || data === void 0 ? void 0 : data.session; +}; + +var useSessionState = function () { + var data = React.useContext(SessionContext).data; + return (data === null || data === void 0 ? void 0 : data.state) || exports.SessionState.New; +}; + +var useActions = function () { + var _a = React.useContext(SessionContext), connect = _a.connect, disconnect = _a.disconnect; + return { + connect: connect, + disconnect: disconnect, + playAudioMix: function () { + // data?.session.getMixMinusAudio()?.play(); + }, + }; +}; + +var idSeed$1 = 0; +var useConsumer = function (remote, priority, maxSpatial, maxTemporal) { + var consumerId = React.useMemo(function () { return idSeed$1++; }, []); + var sessionState = useSessionState(); + var _a = React.useState(), consumer = _a[0], setConsumer = _a[1]; + var _b = React.useState(Atm0s.StreamReceiverState.NoSource), state = _b[0], setState = _b[1]; + var _c = React.useState(), element = _c[0], setElement = _c[1]; + var _d = React.useContext(SessionContext), data = _d.data, getConsumer = _d.getConsumer, backConsumer = _d.backConsumer; + var isConnectionEstablished = [exports.SessionState.Connected, exports.SessionState.Reconnecting].indexOf(sessionState) >= 0; + React.useEffect(function () { + if ((data === null || data === void 0 ? void 0 : data.session) && remote) { + var consumer_1 = getConsumer(consumerId, remote); + if (consumer_1) { + consumer_1.on('state', setState); + setState(consumer_1.state); + setConsumer(consumer_1); + return function () { + consumer_1 === null || consumer_1 === void 0 ? void 0 : consumer_1.unview('use-consumer-' + consumerId); + consumer_1 === null || consumer_1 === void 0 ? void 0 : consumer_1.off('state', setState); + backConsumer(consumerId, remote); + }; + } + } + }, [data === null || data === void 0 ? void 0 : data.session, remote]); + React.useEffect(function () { + if (element && consumer && isConnectionEstablished) { + element.srcObject = consumer.view('use-consumer-' + consumerId, priority, maxSpatial, maxTemporal); + return function () { + element.srcObject = null; + consumer.unview('use-consumer-' + consumerId); + }; + } + }, [element, consumer, isConnectionEstablished]); + React.useEffect(function () { + if (element && consumer && isConnectionEstablished) { + consumer.limit('use-consumer-' + consumerId, priority, maxSpatial, maxTemporal); + } + }, [element, consumer, isConnectionEstablished, priority, maxSpatial, maxTemporal]); + var ref = function (instance) { + setElement(instance || undefined); + }; + return [ref, state, consumer]; +}; +var useConsumerPair = function (peerId, audioName, videoName, priority, maxSpatial, maxTemporal) { + var consumerId = React.useMemo(function () { return idSeed$1++; }, []); + var sessionState = useSessionState(); + var _a = React.useState(), consumer = _a[0], setConsumer = _a[1]; + var _b = React.useState(Atm0s.StreamReceiverState.NoSource), state = _b[0], setState = _b[1]; + var _c = React.useState(), element = _c[0], setElement = _c[1]; + var _d = React.useContext(SessionContext), data = _d.data, getConsumerPair = _d.getConsumerPair, backConsumerPair = _d.backConsumerPair; + var isConnectionEstablished = [exports.SessionState.Connected, exports.SessionState.Reconnecting].indexOf(sessionState) >= 0; + React.useEffect(function () { + if (data === null || data === void 0 ? void 0 : data.session) { + var consumer_2 = getConsumerPair(consumerId, peerId, audioName, videoName); + if (consumer_2) { + consumer_2.on('state', setState); + setState(consumer_2.state); + setConsumer(consumer_2); + return function () { + consumer_2 === null || consumer_2 === void 0 ? void 0 : consumer_2.off('state', setState); + backConsumerPair(consumerId, peerId, audioName, videoName); + }; + } + } + }, [data === null || data === void 0 ? void 0 : data.session, peerId, audioName, videoName]); + React.useEffect(function () { + if (element && consumer && isConnectionEstablished) { + element.srcObject = consumer.view('use-consumer-' + consumerId, priority, maxSpatial, maxTemporal); + return function () { + element.srcObject = null; + consumer.unview('use-consumer-' + consumerId); + }; + } + }, [element, consumer, isConnectionEstablished]); + React.useEffect(function () { + if (element && consumer && isConnectionEstablished) { + consumer.limit('use-consumer-' + consumerId, priority, maxSpatial, maxTemporal); + } + }, [element, consumer, isConnectionEstablished, priority, maxSpatial, maxTemporal]); + var ref = function (instance) { + setElement(instance || undefined); + }; + return [ref, state, consumer]; +}; +var useLocalConsumer = function (stream) { + var _a = React.useState(), element = _a[0], setElement = _a[1]; + React.useEffect(function () { + if (element && stream) { + element.srcObject = stream; + return function () { + element.srcObject = null; + }; + } + }, [element, stream]); + return function (instance) { + setElement(instance || undefined); + }; +}; + +var idSeed = 0; +var usePublisher = function (cfg) { + var publisherId = React.useMemo(function () { return idSeed++; }, []); + var _a = React.useState(Atm0s.StreamSenderState.Created), state = _a[0], setState = _a[1]; + var _b = React.useState(), producer = _b[0], setProducer = _b[1]; + var _c = React.useContext(SessionContext), data = _c.data, getPublisher = _c.getPublisher, backPublisher = _c.backPublisher; + React.useEffect(function () { + if (data === null || data === void 0 ? void 0 : data.session) { + var newProducer_1 = getPublisher(publisherId, cfg); + if (newProducer_1) { + var onUpdateState_1 = function (state) { + setState(state); + }; + newProducer_1.on('state', onUpdateState_1); + setProducer(newProducer_1); + setState(newProducer_1.state); + return function () { + newProducer_1 === null || newProducer_1 === void 0 ? void 0 : newProducer_1.off('state', onUpdateState_1); + backPublisher(publisherId, cfg); + }; + } + } + }, [data === null || data === void 0 ? void 0 : data.session, cfg.kind + cfg.name]); + return [state, producer === null || producer === void 0 ? void 0 : producer.localStream, producer]; +}; + +var useAudioLevelConsumer = function (consumer) { + var _a = React.useState(undefined), audioLevel = _a[0], setAudioLevel = _a[1]; + React.useEffect(function () { + if (consumer) { + var handler_1 = function (level) { + setAudioLevel(level); + }; + consumer.on('audio_level', handler_1); + return function () { + consumer.off('audio_level', handler_1); + }; + } + else { + setAudioLevel(undefined); + } + }, [consumer]); + return audioLevel; +}; +var useAudioLevelProducer = function (producer) { + var _a = React.useState(undefined), audioLevel = _a[0], setAudioLevel = _a[1]; + React.useEffect(function () { + if (producer) { + var handler_2 = function (level) { + setAudioLevel(level); + }; + producer.on('audio_level', handler_2); + return function () { + producer.off('audio_level', handler_2); + }; + } + else { + setAudioLevel(undefined); + } + }, [producer]); + return audioLevel; +}; +var useAudioSlotMix = function (slotIndex) { + var _a = React.useState(undefined), slot = _a[0], setSlot = _a[1]; + var data = React.useContext(SessionContext).data; + React.useEffect(function () { + var mixMinus = data === null || data === void 0 ? void 0 : data.session.getMixMinusAudio(); + if (mixMinus) { + // eslint-disable-next-line @typescript-eslint/no-explicit-any + var handler_3 = function (info) { + if (info) { + var sourceId = info[0].split(':'); + setSlot({ + peerId: sourceId[0], + streamName: sourceId[1], + audioLevel: info[1], + }); + } + else { + setSlot(undefined); + } + }; + mixMinus.on("slot_".concat(slotIndex), handler_3); + return function () { + mixMinus === null || mixMinus === void 0 ? void 0 : mixMinus.off("slot_".concat(slotIndex), handler_3); + }; + } + }, [slotIndex, data === null || data === void 0 ? void 0 : data.session.getMixMinusAudio()]); + return slot; +}; +var useAudioLevelMix = function (peerId, streamName) { + var _a = React.useState(undefined), audioLevel = _a[0], setAudioLevel = _a[1]; + var data = React.useContext(SessionContext).data; + React.useEffect(function () { + var mixMinus = data === null || data === void 0 ? void 0 : data.session.getMixMinusAudio(); + if (mixMinus) { + var handler_4 = function (level) { + setAudioLevel(level || undefined); + }; + mixMinus.on("source_".concat(peerId, ":").concat(streamName), handler_4); + return function () { + mixMinus === null || mixMinus === void 0 ? void 0 : mixMinus.off("source_".concat(peerId, ":").concat(streamName), handler_4); + }; + } + }, [peerId, streamName, data === null || data === void 0 ? void 0 : data.session.getMixMinusAudio()]); + return audioLevel; +}; + +var RemoteViewer = function (props) { + var _a = useConsumer(props.remote, props.priority), ref = _a[0], state = _a[1]; + return (React.createElement("div", { className: "w-full h-full" }, + React.createElement("div", null, state), + React.createElement("video", { muted: true, autoPlay: true, className: "w-full h-full", ref: ref }))); +}; +var LocalViewer = function (props) { + var ref = useLocalConsumer(props.stream); + return React.createElement("video", { muted: true, autoPlay: true, className: "w-full h-full", ref: ref }); +}; +var VideoViewer = function (props) { + if (props.stream instanceof Atm0s.StreamRemote) { + return React.createElement(RemoteViewer, { remote: props.stream, priority: props.priority }); + } + else { + return React.createElement(LocalViewer, { stream: props.stream }); + } }; -exports.isNumberParseable = isNumberParseable; +exports.BlueseaSessionContext = SessionContext; +exports.LocalViewer = LocalViewer; +exports.RemoteViewer = RemoteViewer; +exports.SessionProvider = SessionProvider; +exports.StreamPublisherWrap = StreamPublisherWrap; +exports.VideoViewer = VideoViewer; +exports.getDevice = getDevice; +exports.useActions = useActions; +exports.useAudioLevelConsumer = useAudioLevelConsumer; +exports.useAudioLevelMix = useAudioLevelMix; +exports.useAudioLevelProducer = useAudioLevelProducer; +exports.useAudioSlotMix = useAudioSlotMix; +exports.useConsumer = useConsumer; +exports.useConsumerPair = useConsumerPair; +exports.useDevice = useDevice; +exports.useDevices = useDevices; +exports.useDisplayMedia = useDisplayMedia; +exports.useLocalConsumer = useLocalConsumer; +exports.usePublisher = usePublisher; +exports.useRemoteStreams = useRemoteStreams; +exports.useSession = useSession; +exports.useSessionState = useSessionState; +exports.useUserMedia = useUserMedia; //# sourceMappingURL=index.cjs.map diff --git a/dist/index.cjs.map b/dist/index.cjs.map index 0be77d6..da4afb2 100644 --- a/dist/index.cjs.map +++ b/dist/index.cjs.map @@ -1 +1 @@ -{"version":3,"file":"index.cjs","sources":["../src/index.ts"],"sourcesContent":["/**\n * A Branded Type for values parseable to number.\n */\nexport type NumberParseable = (number | string | boolean) & {\n readonly isNumberParseble: unique symbol;\n};\n\n/**\n * Check if value is parseable to number.\n * @example\n * ```js\n * isNumberParseable('AAAA');\n * //=> false\n *\n * isNumberParseable('100');\n * //=> true\n *\n * if (!isNumberParseable(value))\n * throw new Error('Value can\\'t be parseable to `Number`.')\n * return Number(value);\n * ```\n * @param value - An `unknown` value to be checked.\n */\nexport const isNumberParseable = (value: unknown): value is NumberParseable =>\n !Number.isNaN(Number(value));\n"],"names":[],"mappings":";;;;;;;;AAOA;;;;;;;;;;;;;;;AAeG;AACI,IAAM,iBAAiB,GAAG,UAAC,KAAc,EAAA;IAC9C,OAAA,CAAC,MAAM,CAAC,KAAK,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC,CAAA;AAA5B;;;;"} \ No newline at end of file +{"version":3,"file":"index.cjs","sources":["../src/hooks/device.ts","../src/components/provider.tsx","../src/hooks/remote.ts","../src/hooks/session.ts","../src/hooks/state.ts","../src/hooks/actions.ts","../src/hooks/consumer.ts","../src/hooks/publisher.ts","../src/hooks/audio_level.ts","../src/components/video_viewer.tsx"],"sourcesContent":["import { TypedEventEmitter } from '@8xff/atm0s-media-js/types/lib/utils/typed-event-emitter';\nimport { getLogger } from '@8xff/atm0s-media-js/types/lib/utils/logger';\nimport { useEffect, useState } from 'react';\n\nconst logger = getLogger('DeviceHook');\n\ninterface Return {\n media?: MediaStream;\n error?: Error;\n}\n\nclass StreamContainer extends TypedEventEmitter<{ changed: (data: Return) => void }> {\n count = 0;\n data: Return = {};\n\n constructor(private key: string) {\n super();\n logger.log('Created container for local stream', key);\n }\n\n setData(data: Return) {\n this.data = data;\n this.emit('changed', data);\n }\n\n retain() {\n this.count += 1;\n logger.log('Retain local stream', this.key, this.count);\n return this.count;\n }\n\n release() {\n this.count -= 1;\n logger.log('Release local stream', this.key, this.count);\n if (this.count == 0) {\n logger.log('Destroy local stream', this.key);\n this.data.media?.getTracks().map((track) => {\n track.stop();\n });\n }\n return this.count;\n }\n}\nconst globalStore: Map = new Map();\n\nexport const useDevices = (\n kind: MediaDeviceKind,\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n): [MediaDeviceInfo[], any | null] => {\n const [devices, setDevices] = useState([]);\n const [error, setError] = useState(null);\n useEffect(() => {\n navigator.mediaDevices\n .enumerateDevices()\n .then((devices) => {\n setDevices(devices.filter((d) => d.kind == kind));\n })\n .catch((error) => {\n setDevices([]);\n setError(error);\n });\n }, [kind]);\n\n return [devices, error];\n};\n\nfunction getDevicePrivate(\n kind: MediaDeviceKind,\n deviceId: string | boolean,\n callback: (data: Return) => void,\n): [StreamContainer, string] {\n const key = kind + '-' + deviceId;\n let containerSlot = globalStore.get(key);\n if (containerSlot) {\n containerSlot.on('changed', callback);\n callback(containerSlot.data);\n } else {\n containerSlot = new StreamContainer(key);\n globalStore.set(key, containerSlot);\n let constraints: MediaStreamConstraints = {};\n if (kind == 'audioinput') {\n constraints = {\n audio:\n typeof deviceId == 'string'\n ? {\n deviceId: deviceId,\n }\n : true,\n };\n } else if (kind == 'videoinput') {\n constraints = {\n video:\n typeof deviceId == 'string'\n ? {\n deviceId: deviceId,\n }\n : true,\n };\n }\n navigator.mediaDevices\n .getUserMedia(constraints)\n .then((stream) => {\n stream.cachedKey = key;\n containerSlot?.setData({ media: stream });\n callback({ media: stream });\n })\n .catch((err) => {\n containerSlot?.setData({ error: err });\n callback({ error: err });\n });\n }\n\n return [containerSlot, key];\n}\n\nexport function getDevice(kind: MediaDeviceKind, deviceId: string | boolean): Promise {\n return new Promise((resolve, reject) => {\n getDevicePrivate(kind, deviceId, (res) => {\n if (res.error) {\n reject(res.error);\n } else {\n resolve(res.media!);\n }\n });\n });\n}\n\nexport function retainDevice(key: string) {\n const slot = globalStore.get(key);\n slot?.retain();\n}\n\nexport function releaseDevice(key: string) {\n const slot = globalStore.get(key);\n if (slot?.release() == 0) {\n globalStore.delete(key);\n }\n}\n\nexport const useDevice = (\n kind: MediaDeviceKind,\n deviceId: string | boolean,\n): [MediaStream | undefined, Error | undefined] => {\n const [res, setRes] = useState({} as Return);\n useEffect(() => {\n if (deviceId != false) {\n const [containerSlot, key] = getDevicePrivate(kind, deviceId, setRes);\n containerSlot.retain();\n return () => {\n setRes({ media: undefined, error: undefined });\n if (containerSlot?.release() == 0) {\n globalStore.delete(key);\n }\n };\n }\n }, [kind, deviceId]);\n return [res.media, res.error];\n};\n\nexport const useUserMedia = (\n constraints?: MediaStreamConstraints,\n active?: boolean,\n): [MediaStream | undefined, Error | undefined] => {\n const [res, setRes] = useState({} as Return);\n useEffect(() => {\n if (active) {\n let gotStream: MediaStream | undefined;\n navigator.mediaDevices\n .getUserMedia(constraints)\n .then((stream) => {\n gotStream = stream;\n setRes({ media: stream });\n })\n .catch((err) => {\n gotStream = undefined;\n setRes({ error: err });\n });\n return () => {\n setRes({ media: undefined, error: undefined });\n gotStream?.getTracks().forEach((track) => {\n track.stop();\n });\n };\n }\n }, [JSON.stringify(constraints), active]);\n return [res.media, res.error];\n};\n\nexport const useDisplayMedia = (\n constraints?: DisplayMediaStreamOptions,\n active?: boolean,\n): [MediaStream | undefined, Error | undefined] => {\n const [res, setRes] = useState({} as Return);\n useEffect(() => {\n if (active) {\n let gotStream: MediaStream | undefined;\n navigator.mediaDevices\n .getDisplayMedia(constraints)\n .then((stream) => {\n gotStream = stream;\n setRes({ media: stream });\n })\n .catch((err) => {\n gotStream = undefined;\n setRes({ error: err });\n });\n return () => {\n setRes({ media: undefined, error: undefined });\n gotStream?.getTracks().forEach((track) => {\n track.stop();\n });\n };\n }\n }, [JSON.stringify(constraints), active]);\n return [res.media, res.error];\n};\n","import React, { useCallback, useMemo, useState } from 'react';\nimport Atm0s, { type AnyFunction, type IPublisherCallbacks } from '@8xff/atm0s-media-js';\nimport { releaseDevice, retainDevice } from '../hooks/device';\n\nexport enum SessionState {\n New = 'new',\n Connecting = 'connecting',\n Connected = 'connected',\n Reconnecting = 'reconnecting',\n Disconnected = 'disconnected',\n Error = 'error',\n}\n\nexport class StreamPublisherWrap {\n constructor(private publisher: Atm0s.StreamPublisher) {}\n\n get state() {\n return this.publisher.state;\n }\n\n get localStream() {\n return this.publisher.localStream;\n }\n\n on(type: keyof IPublisherCallbacks, callback: AnyFunction) {\n this.publisher.on(type, callback);\n }\n\n off(type: keyof IPublisherCallbacks, callback: AnyFunction) {\n this.publisher.on(type, callback);\n }\n\n switchStream(stream: MediaStream | null) {\n if (stream) {\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n const cachedKey = stream.cachedKey;\n if (cachedKey) {\n retainDevice(cachedKey);\n }\n }\n if (this.publisher.localStream) {\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n const cacheKey = this.publisher.localStream.cachedKey;\n if (cacheKey) {\n releaseDevice(cacheKey);\n }\n }\n return this.publisher.switch(stream);\n }\n}\n\ninterface SessionContainer {\n session: Atm0s.Session;\n state: SessionState;\n myAudioStreams: Atm0s.StreamRemote[];\n myVideoStreams: Atm0s.StreamRemote[];\n audioStreams: Atm0s.StreamRemote[];\n videoStreams: Atm0s.StreamRemote[];\n publishers: Map>;\n consumers: Map>;\n consumerPairs: Map>;\n}\n\ninterface ArcContainer {\n data: T;\n owners: Map;\n}\n\ninterface SessionContextInfo {\n data?: SessionContainer;\n connect: (url: string, config: Atm0s.ISessionConfig) => void;\n disconnect: () => void;\n getPublisher(ownerId: number, cfg: Atm0s.SenderConfig): StreamPublisherWrap | undefined;\n backPublisher(ownerId: number, cfg: Atm0s.SenderConfig): void;\n getConsumer(ownerId: number, remote: Atm0s.StreamRemote): Atm0s.StreamConsumer | undefined;\n backConsumer(owner_id: number, remote: Atm0s.StreamRemote): void;\n getConsumerPair(\n ownerId: number,\n peerId: string,\n audioName: string,\n videoName: string,\n ): Atm0s.StreamConsumerPair | undefined;\n backConsumerPair(ownerId: number, peerId: string, audioName: string, videoName: string): void;\n update: (new_info: SessionContainer) => void;\n}\n\nexport const SessionContext = React.createContext({} as SessionContextInfo);\n\ninterface Props {\n children: React.ReactNode;\n // log_level?: Atm0s.LogLevel;\n url?: string;\n config?: Atm0s.ISessionConfig;\n}\n\nlet GlobalVer = 0;\n\nexport const SessionProvider = (props: Props) => {\n // if (props.log_level != undefined) {\n // Atm0s.setLogLevel(props.log_level);\n // }\n const [, setVer] = useState(0);\n const storage = useMemo<{ data: SessionContainer | undefined }>(() => {\n return { data: undefined };\n }, []);\n const update = useCallback(\n (data: SessionContainer | undefined) => {\n storage.data = data;\n setVer(GlobalVer++);\n },\n [storage, setVer],\n );\n const connect = useCallback(\n (url: string, config: Atm0s.ISessionConfig) => {\n if (storage.data?.session) {\n return () => {\n storage.data?.session.disconnect();\n };\n }\n const session = Atm0s.createSession(url, config);\n const myAudioStreams = new Map();\n const myVideoStreams = new Map();\n const audioStreams = new Map();\n const videoStreams = new Map();\n\n const publishers: Map> = new Map();\n const consumers: Map> = new Map();\n const consumerPairs: Map> = new Map();\n\n config?.senders?.map((sender) => {\n if (sender.stream) {\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n const cachedKey = sender.stream.cachedKey;\n if (cachedKey) {\n retainDevice(cachedKey);\n }\n }\n });\n\n session.on('connected', () => {\n if (storage.data?.session != session) return;\n update({\n session,\n state: SessionState.Connected,\n myAudioStreams: Array.from(myAudioStreams.values()),\n myVideoStreams: Array.from(myVideoStreams.values()),\n audioStreams: Array.from(audioStreams.values()),\n videoStreams: Array.from(videoStreams.values()),\n publishers,\n consumers,\n consumerPairs,\n });\n });\n\n session.on('mystream_added', (stream: Atm0s.StreamRemote) => {\n if (storage.data?.session != session) return;\n const key = stream.peerId + '-' + stream.name;\n if (stream.kind === Atm0s.StreamKinds.AUDIO) {\n myAudioStreams.set(key, stream);\n } else {\n myVideoStreams.set(key, stream);\n }\n update({\n session,\n state: SessionState.Connected,\n myAudioStreams: Array.from(myAudioStreams.values()),\n myVideoStreams: Array.from(myVideoStreams.values()),\n audioStreams: Array.from(audioStreams.values()),\n videoStreams: Array.from(videoStreams.values()),\n publishers,\n consumers,\n consumerPairs,\n });\n });\n\n session.on('mystream_updated', (stream: Atm0s.StreamRemote) => {\n if (storage.data?.session != session) return;\n const key = stream.peerId + '-' + stream.name;\n if (stream.kind === Atm0s.StreamKinds.AUDIO) {\n myAudioStreams.set(key, stream);\n } else {\n myVideoStreams.set(key, stream);\n }\n update({\n session,\n state: SessionState.Connected,\n myAudioStreams: Array.from(myAudioStreams.values()),\n myVideoStreams: Array.from(myVideoStreams.values()),\n audioStreams: Array.from(audioStreams.values()),\n videoStreams: Array.from(videoStreams.values()),\n publishers,\n consumers,\n consumerPairs,\n });\n });\n\n session.on('mystream_removed', (stream: Atm0s.StreamRemote) => {\n if (storage.data?.session != session) return;\n const key = stream.peerId + '-' + stream.name;\n if (stream.kind === Atm0s.StreamKinds.AUDIO) {\n myAudioStreams.delete(key);\n } else {\n myVideoStreams.delete(key);\n }\n update({\n session,\n state: SessionState.Connected,\n myAudioStreams: Array.from(myAudioStreams.values()),\n myVideoStreams: Array.from(myVideoStreams.values()),\n audioStreams: Array.from(audioStreams.values()),\n videoStreams: Array.from(videoStreams.values()),\n publishers,\n consumers,\n consumerPairs,\n });\n });\n\n session.on('stream_added', (stream: Atm0s.StreamRemote) => {\n if (storage.data?.session != session) return;\n const key = stream.peerId + '-' + stream.name;\n if (stream.kind === Atm0s.StreamKinds.AUDIO) {\n audioStreams.set(key, stream);\n } else {\n videoStreams.set(key, stream);\n }\n update({\n session,\n state: SessionState.Connected,\n myAudioStreams: Array.from(myAudioStreams.values()),\n myVideoStreams: Array.from(myVideoStreams.values()),\n audioStreams: Array.from(audioStreams.values()),\n videoStreams: Array.from(videoStreams.values()),\n publishers,\n consumers,\n consumerPairs: consumerPairs,\n });\n });\n\n session.on('stream_updated', (stream: Atm0s.StreamRemote) => {\n if (storage.data?.session != session) return;\n const key = stream.peerId + '-' + stream.name;\n if (stream.kind === Atm0s.StreamKinds.AUDIO) {\n audioStreams.set(key, stream);\n } else {\n videoStreams.set(key, stream);\n }\n update({\n session,\n state: SessionState.Connected,\n myAudioStreams: Array.from(myAudioStreams.values()),\n myVideoStreams: Array.from(myVideoStreams.values()),\n audioStreams: Array.from(audioStreams.values()),\n videoStreams: Array.from(videoStreams.values()),\n publishers,\n consumers,\n consumerPairs,\n });\n });\n\n session.on('stream_removed', (stream: Atm0s.StreamRemote) => {\n if (storage.data?.session != session) return;\n const key = stream.peerId + '-' + stream.name;\n if (stream.kind === Atm0s.StreamKinds.AUDIO) {\n audioStreams.delete(key);\n } else {\n videoStreams.delete(key);\n }\n update({\n session,\n state: SessionState.Connected,\n myAudioStreams: Array.from(myAudioStreams.values()),\n myVideoStreams: Array.from(myVideoStreams.values()),\n audioStreams: Array.from(audioStreams.values()),\n videoStreams: Array.from(videoStreams.values()),\n publishers,\n consumers,\n consumerPairs,\n });\n });\n\n session.on('disconnected', () => {\n if (storage.data?.session != session) return;\n update({\n session,\n state: SessionState.Disconnected,\n myAudioStreams: Array.from(myAudioStreams.values()),\n myVideoStreams: Array.from(myVideoStreams.values()),\n audioStreams: Array.from(audioStreams.values()),\n videoStreams: Array.from(videoStreams.values()),\n publishers,\n consumers,\n consumerPairs,\n });\n });\n session.connect().catch((err) => {\n if (storage.data?.session != session) return;\n console.error(err);\n update({\n session,\n state: SessionState.Error,\n myAudioStreams: Array.from(myAudioStreams.values()),\n myVideoStreams: Array.from(myVideoStreams.values()),\n audioStreams: Array.from(audioStreams.values()),\n videoStreams: Array.from(videoStreams.values()),\n publishers,\n consumers,\n consumerPairs,\n });\n });\n update({\n session,\n state: SessionState.Connecting,\n myAudioStreams: [],\n myVideoStreams: [],\n audioStreams: [],\n videoStreams: [],\n publishers,\n consumers,\n consumerPairs,\n });\n return;\n },\n [storage, update],\n );\n\n const disconnect = useCallback(() => {\n if (storage.data?.session) {\n storage.data.session.disconnect();\n update(undefined);\n }\n }, [storage, update]);\n\n const getPublisher = useCallback(\n (ownerId: number, cfg: Atm0s.SenderConfig) => {\n const data = storage.data;\n if (data?.session) {\n let publisher = data.publishers.get(cfg.name);\n if (!publisher) {\n publisher = {\n data: new StreamPublisherWrap(\n data.session.createPublisher({\n stream: cfg.stream,\n name: cfg.name,\n kind: cfg.kind,\n preferredCodecs: cfg.preferredCodecs,\n simulcast: cfg.simulcast,\n maxBitrate: cfg.maxBitrate,\n contentHint: cfg.contentHint,\n screen: cfg.screen,\n }),\n ),\n owners: new Map(),\n };\n data.publishers.set(cfg.name, publisher);\n }\n data.publishers.get(cfg.name)?.owners.set(ownerId, new Date().getTime());\n return publisher.data;\n }\n return undefined;\n },\n [storage],\n );\n\n const backPublisher = useCallback(\n (ownerId: number, cfg: Atm0s.SenderConfig) => {\n const data = storage.data;\n if (data?.session) {\n const publisher = data.publishers.get(cfg.name);\n if (publisher) {\n publisher.owners.delete(ownerId);\n if (publisher.owners.size == 0) {\n publisher.data.switchStream(null);\n data.publishers.delete(cfg.name);\n }\n }\n }\n return undefined;\n },\n [storage],\n );\n\n const getConsumer = useCallback(\n (ownerId: number, stream: Atm0s.StreamRemote) => {\n const data = storage.data;\n if (data?.session) {\n const key = stream.peerId + '-' + stream.name;\n let consumer = data.consumers.get(key);\n if (!consumer) {\n consumer = {\n data: data.session.createConsumer(stream),\n owners: new Map(),\n };\n data.consumers.set(key, consumer);\n }\n data.consumers.get(key)?.owners.set(ownerId, new Date().getTime());\n return consumer.data;\n }\n return undefined;\n },\n [storage],\n );\n\n const backConsumer = useCallback(\n (ownerId: number, stream: Atm0s.StreamRemote) => {\n const data = storage.data;\n if (data?.session) {\n const key = stream.peerId + '-' + stream.name;\n const consumer = data.consumers.get(key);\n if (consumer) {\n consumer.owners.delete(ownerId);\n if (consumer.owners.size == 0) {\n data.consumers.delete(key);\n }\n }\n }\n return undefined;\n },\n [storage],\n );\n\n const getConsumerPair = useCallback(\n (ownerId: number, peerId: string, audioName: string, videoName: string) => {\n const data = storage.data;\n if (data?.session) {\n const key = peerId + '-' + audioName + '-' + videoName;\n let consumer = data.consumerPairs.get(key);\n if (!consumer) {\n consumer = {\n data: data.session.createConsumerPair(peerId, audioName, videoName),\n owners: new Map(),\n };\n data.consumerPairs.set(key, consumer);\n }\n data.consumerPairs.get(key)?.owners.set(ownerId, new Date().getTime());\n return consumer.data;\n }\n return undefined;\n },\n [storage],\n );\n\n const backConsumerPair = useCallback(\n (ownerId: number, peerId: string, audioName: string, videoName: string) => {\n const data = storage.data;\n if (data?.session) {\n const key = peerId + '-' + audioName + '-' + videoName;\n const consumer = data.consumerPairs.get(key);\n if (consumer) {\n consumer.owners.delete(ownerId);\n if (consumer.owners.size == 0) {\n data.consumerPairs.delete(key);\n }\n }\n }\n return undefined;\n },\n [storage],\n );\n\n React.useEffect(() => {\n if (props.url && props.config) {\n connect(props.url, props.config);\n return () => {\n disconnect();\n };\n }\n }, [props.url, props.config, connect, disconnect]);\n\n return (\n \n {props.children}\n \n );\n};\n","import { useContext } from 'react';\nimport { SessionContext } from '../components/provider';\nimport Atm0s from '@8xff/atm0s-media-js';\n\nexport const useRemoteStreams = (kind: Atm0s.StreamKinds, isMine?: boolean): Atm0s.StreamRemote[] => {\n const { data } = useContext(SessionContext);\n if (kind == Atm0s.StreamKinds.AUDIO) {\n if (isMine === true) {\n return data?.myAudioStreams || [];\n } else {\n return data?.audioStreams || [];\n }\n } else {\n if (isMine === true) {\n return data?.myVideoStreams || [];\n } else {\n return data?.videoStreams || [];\n }\n }\n};\n\nexport const usePeerRemoteStreams = (peerId: string, kind: Atm0s.StreamKinds): Atm0s.StreamRemote[] => {\n const { data } = useContext(SessionContext);\n if (kind == Atm0s.StreamKinds.AUDIO) {\n return data?.audioStreams.filter((a) => a.peerId === peerId) || [];\n } else {\n return data?.videoStreams.filter((a) => a.peerId === peerId) || [];\n }\n};\n","import { useContext } from 'react';\nimport { SessionContext } from '../components/provider';\nimport Atm0s from '@8xff/atm0s-media-js';\n\nexport const useSession = (): Atm0s.Session | undefined => {\n const { data } = useContext(SessionContext);\n return data?.session;\n};\n","import { useContext } from 'react';\nimport { SessionContext, SessionState } from '../components/provider';\n\nexport const useSessionState = (): SessionState => {\n const { data } = useContext(SessionContext);\n return data?.state || SessionState.New;\n};\n","import { useContext } from 'react';\nimport { SessionContext } from '../components/provider';\nimport type { ISessionConfig } from '@8xff/atm0s-media-js';\n\ninterface Actions {\n connect: (url: string, config: ISessionConfig) => void;\n disconnect: () => void;\n playAudioMix: () => void;\n}\n\nexport const useActions = (): Actions => {\n const { connect, disconnect } = useContext(SessionContext);\n return {\n connect,\n disconnect,\n playAudioMix: () => {\n // data?.session.getMixMinusAudio()?.play();\n },\n };\n};\n","import { useContext, useEffect, useMemo, useState, type LegacyRef } from 'react';\nimport { SessionContext, SessionState } from '../components/provider';\nimport Atm0s from '@8xff/atm0s-media-js';\nimport { useSessionState } from './state';\n\nlet idSeed = 0;\nexport const useConsumer = (\n remote?: Atm0s.StreamRemote,\n priority?: number,\n maxSpatial?: number,\n maxTemporal?: number,\n): [LegacyRef | undefined, Atm0s.StreamReceiverState, Atm0s.StreamConsumer | undefined] => {\n const consumerId = useMemo(() => idSeed++, []);\n const sessionState = useSessionState();\n const [consumer, setConsumer] = useState();\n const [state, setState] = useState(Atm0s.StreamReceiverState.NoSource);\n const [element, setElement] = useState();\n const { data, getConsumer, backConsumer } = useContext(SessionContext);\n\n const isConnectionEstablished = [SessionState.Connected, SessionState.Reconnecting].indexOf(sessionState) >= 0;\n\n useEffect(() => {\n if (data?.session && remote) {\n const consumer = getConsumer(consumerId, remote);\n if (consumer) {\n consumer.on('state', setState);\n setState(consumer.state);\n setConsumer(consumer);\n return () => {\n consumer?.unview('use-consumer-' + consumerId);\n consumer?.off('state', setState);\n backConsumer(consumerId, remote);\n };\n }\n }\n }, [data?.session, remote]);\n\n useEffect(() => {\n if (element && consumer && isConnectionEstablished) {\n element.srcObject = consumer.view('use-consumer-' + consumerId, priority, maxSpatial, maxTemporal);\n return () => {\n element.srcObject = null;\n consumer.unview('use-consumer-' + consumerId);\n };\n }\n }, [element, consumer, isConnectionEstablished]);\n\n useEffect(() => {\n if (element && consumer && isConnectionEstablished) {\n consumer.limit('use-consumer-' + consumerId, priority, maxSpatial, maxTemporal);\n }\n }, [element, consumer, isConnectionEstablished, priority, maxSpatial, maxTemporal]);\n\n const ref = (instance: HTMLVideoElement | null) => {\n setElement(instance || undefined);\n };\n\n return [ref, state, consumer];\n};\n\nexport const useConsumerPair = (\n peerId: string,\n audioName: string,\n videoName: string,\n priority?: number,\n maxSpatial?: number,\n maxTemporal?: number,\n): [LegacyRef | undefined, Atm0s.StreamReceiverState, Atm0s.StreamConsumerPair | undefined] => {\n const consumerId = useMemo(() => idSeed++, []);\n const sessionState = useSessionState();\n const [consumer, setConsumer] = useState();\n const [state, setState] = useState(Atm0s.StreamReceiverState.NoSource);\n const [element, setElement] = useState();\n const { data, getConsumerPair: getConsumerPair, backConsumerPair: backConsumerPair } = useContext(SessionContext);\n\n const isConnectionEstablished = [SessionState.Connected, SessionState.Reconnecting].indexOf(sessionState) >= 0;\n\n useEffect(() => {\n if (data?.session) {\n const consumer = getConsumerPair(consumerId, peerId, audioName, videoName);\n if (consumer) {\n consumer.on('state', setState);\n setState(consumer.state);\n setConsumer(consumer);\n return () => {\n consumer?.off('state', setState);\n backConsumerPair(consumerId, peerId, audioName, videoName);\n };\n }\n }\n }, [data?.session, peerId, audioName, videoName]);\n\n useEffect(() => {\n if (element && consumer && isConnectionEstablished) {\n element.srcObject = consumer.view('use-consumer-' + consumerId, priority, maxSpatial, maxTemporal);\n return () => {\n element.srcObject = null;\n consumer.unview('use-consumer-' + consumerId);\n };\n }\n }, [element, consumer, isConnectionEstablished]);\n\n useEffect(() => {\n if (element && consumer && isConnectionEstablished) {\n consumer.limit('use-consumer-' + consumerId, priority, maxSpatial, maxTemporal);\n }\n }, [element, consumer, isConnectionEstablished, priority, maxSpatial, maxTemporal]);\n\n const ref = (instance: HTMLVideoElement | null) => {\n setElement(instance || undefined);\n };\n\n return [ref, state, consumer];\n};\n\nexport const useLocalConsumer = (stream?: MediaStream) => {\n const [element, setElement] = useState();\n useEffect(() => {\n if (element && stream) {\n element.srcObject = stream;\n return () => {\n element.srcObject = null;\n };\n }\n }, [element, stream]);\n\n return (instance: HTMLVideoElement | null) => {\n setElement(instance || undefined);\n };\n};\n","import { useContext, useEffect, useMemo, useState } from 'react';\nimport { SessionContext, StreamPublisherWrap } from '../components/provider';\nimport Atm0s from '@8xff/atm0s-media-js';\n\nlet idSeed = 0;\n\nexport const usePublisher = (\n cfg: Atm0s.SenderConfig,\n): [Atm0s.StreamSenderState, MediaStream | undefined | null, StreamPublisherWrap | undefined] => {\n const publisherId = useMemo(() => idSeed++, []);\n const [state, setState] = useState(Atm0s.StreamSenderState.Created);\n const [producer, setProducer] = useState();\n const { data, getPublisher: getPublisher, backPublisher: backPublisher } = useContext(SessionContext);\n useEffect(() => {\n if (data?.session) {\n const newProducer = getPublisher(publisherId, cfg);\n if (newProducer) {\n const onUpdateState = (state: Atm0s.StreamSenderState) => {\n setState(state);\n };\n newProducer.on('state', onUpdateState);\n setProducer(newProducer);\n setState(newProducer.state);\n return () => {\n newProducer?.off('state', onUpdateState);\n backPublisher(publisherId, cfg);\n };\n }\n }\n }, [data?.session, cfg.kind + cfg.name]);\n\n return [state, producer?.localStream, producer];\n};\n","import { useContext, useEffect, useState } from 'react';\nimport * as Bluesea from '@8xff/atm0s-media-js';\nimport { StreamPublisherWrap, BlueseaSessionContext } from '../components';\n\nexport const useAudioLevelConsumer = (\n consumer?: Bluesea.StreamConsumer | Bluesea.StreamConsumerPair,\n): number | undefined => {\n const [audioLevel, setAudioLevel] = useState(undefined);\n useEffect(() => {\n if (consumer) {\n const handler = (level: number) => {\n setAudioLevel(level);\n };\n consumer.on('audio_level', handler);\n\n return () => {\n consumer.off('audio_level', handler);\n };\n } else {\n setAudioLevel(undefined);\n }\n }, [consumer]);\n return audioLevel;\n};\n\nexport const useAudioLevelProducer = (producer?: StreamPublisherWrap): number | undefined => {\n const [audioLevel, setAudioLevel] = useState(undefined);\n useEffect(() => {\n if (producer) {\n const handler = (level: number) => {\n setAudioLevel(level);\n };\n producer.on('audio_level', handler);\n\n return () => {\n producer.off('audio_level', handler);\n };\n } else {\n setAudioLevel(undefined);\n }\n }, [producer]);\n return audioLevel;\n};\n\nexport interface AudioMixSlotInfo {\n peerId: string;\n streamName: string;\n audioLevel: number;\n}\n\nexport const useAudioSlotMix = (slotIndex: number) => {\n const [slot, setSlot] = useState(undefined);\n const { data } = useContext(BlueseaSessionContext);\n useEffect(() => {\n const mixMinus = data?.session.getMixMinusAudio();\n if (mixMinus) {\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n const handler = (info: any | null) => {\n if (info) {\n const sourceId = info[0].split(':');\n setSlot({\n peerId: sourceId[0],\n streamName: sourceId[1],\n audioLevel: info[1],\n });\n } else {\n setSlot(undefined);\n }\n };\n mixMinus.on(`slot_${slotIndex}`, handler);\n\n return () => {\n mixMinus?.off(`slot_${slotIndex}`, handler);\n };\n }\n }, [slotIndex, data?.session.getMixMinusAudio()]);\n return slot;\n};\n\nexport const useAudioLevelMix = (peerId: string, streamName: string) => {\n const [audioLevel, setAudioLevel] = useState(undefined);\n const { data } = useContext(BlueseaSessionContext);\n useEffect(() => {\n const mixMinus = data?.session.getMixMinusAudio();\n if (mixMinus) {\n const handler = (level: number | null) => {\n setAudioLevel(level || undefined);\n };\n mixMinus.on(`source_${peerId}:${streamName}`, handler);\n\n return () => {\n mixMinus?.off(`source_${peerId}:${streamName}`, handler);\n };\n }\n }, [peerId, streamName, data?.session.getMixMinusAudio()]);\n return audioLevel;\n};\n","import { StreamRemote } from '@8xff/atm0s-media-js';\nimport React from 'react';\nimport { useConsumer, useLocalConsumer } from '../hooks';\n\nexport const RemoteViewer = (props: { remote: StreamRemote; priority?: number }) => {\n const [ref, state] = useConsumer(props.remote, props.priority);\n return (\n
\n
{state}
\n \n
\n );\n};\n\nexport const LocalViewer = (props: { stream: MediaStream }) => {\n const ref = useLocalConsumer(props.stream);\n return ;\n};\n\nexport const VideoViewer = (props: { stream: MediaStream | StreamRemote; priority?: number }) => {\n if (props.stream instanceof StreamRemote) {\n return ;\n } else {\n return ;\n }\n};\n"],"names":["getLogger","TypedEventEmitter","useState","useEffect","SessionState","useMemo","useCallback","useContext","idSeed","BlueseaSessionContext","StreamRemote"],"mappings":"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"} \ No newline at end of file diff --git a/dist/index.esm.js b/dist/index.esm.js index b6a73fc..f8335a6 100644 --- a/dist/index.esm.js +++ b/dist/index.esm.js @@ -1,28 +1,923 @@ /*! - * [libraryName] v0.0.0 - * (c) [authorFullName] + * @8xff/atm0s-media-react v0.0.0 + * (c) Luong Ngoc Minh * Released under the MIT License. */ -/** - * Check if value is parseable to number. - * @example - * ```js - * isNumberParseable('AAAA'); - * //=> false - * - * isNumberParseable('100'); - * //=> true - * - * if (!isNumberParseable(value)) - * throw new Error('Value can\'t be parseable to `Number`.') - * return Number(value); - * ``` - * @param value - An `unknown` value to be checked. - */ -var isNumberParseable = function (value) { - return !Number.isNaN(Number(value)); +import React, { useState, useEffect, useMemo, useCallback, useContext } from 'react'; +import Atm0s, { StreamRemote } from '@8xff/atm0s-media-js'; +import { TypedEventEmitter } from '@8xff/atm0s-media-js/types/lib/utils/typed-event-emitter'; +import { getLogger } from '@8xff/atm0s-media-js/types/lib/utils/logger'; + +/****************************************************************************** +Copyright (c) Microsoft Corporation. + +Permission to use, copy, modify, and/or distribute this software for any +purpose with or without fee is hereby granted. + +THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES WITH +REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY +AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT, +INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM +LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR +OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR +PERFORMANCE OF THIS SOFTWARE. +***************************************************************************** */ +/* global Reflect, Promise, SuppressedError, Symbol */ + +var extendStatics = function(d, b) { + extendStatics = Object.setPrototypeOf || + ({ __proto__: [] } instanceof Array && function (d, b) { d.__proto__ = b; }) || + function (d, b) { for (var p in b) if (Object.prototype.hasOwnProperty.call(b, p)) d[p] = b[p]; }; + return extendStatics(d, b); +}; + +function __extends(d, b) { + if (typeof b !== "function" && b !== null) + throw new TypeError("Class extends value " + String(b) + " is not a constructor or null"); + extendStatics(d, b); + function __() { this.constructor = d; } + d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __()); +} + +typeof SuppressedError === "function" ? SuppressedError : function (error, suppressed, message) { + var e = new Error(message); + return e.name = "SuppressedError", e.error = error, e.suppressed = suppressed, e; +}; + +var logger = getLogger('DeviceHook'); +var StreamContainer = /** @class */ (function (_super) { + __extends(StreamContainer, _super); + function StreamContainer(key) { + var _this = _super.call(this) || this; + _this.key = key; + _this.count = 0; + _this.data = {}; + logger.log('Created container for local stream', key); + return _this; + } + StreamContainer.prototype.setData = function (data) { + this.data = data; + this.emit('changed', data); + }; + StreamContainer.prototype.retain = function () { + this.count += 1; + logger.log('Retain local stream', this.key, this.count); + return this.count; + }; + StreamContainer.prototype.release = function () { + var _a; + this.count -= 1; + logger.log('Release local stream', this.key, this.count); + if (this.count == 0) { + logger.log('Destroy local stream', this.key); + (_a = this.data.media) === null || _a === void 0 ? void 0 : _a.getTracks().map(function (track) { + track.stop(); + }); + } + return this.count; + }; + return StreamContainer; +}(TypedEventEmitter)); +var globalStore = new Map(); +var useDevices = function (kind) { + var _a = useState([]), devices = _a[0], setDevices = _a[1]; + var _b = useState(null), error = _b[0], setError = _b[1]; + useEffect(function () { + navigator.mediaDevices + .enumerateDevices() + .then(function (devices) { + setDevices(devices.filter(function (d) { return d.kind == kind; })); + }) + .catch(function (error) { + setDevices([]); + setError(error); + }); + }, [kind]); + return [devices, error]; +}; +function getDevicePrivate(kind, deviceId, callback) { + var key = kind + '-' + deviceId; + var containerSlot = globalStore.get(key); + if (containerSlot) { + containerSlot.on('changed', callback); + callback(containerSlot.data); + } + else { + containerSlot = new StreamContainer(key); + globalStore.set(key, containerSlot); + var constraints = {}; + if (kind == 'audioinput') { + constraints = { + audio: typeof deviceId == 'string' + ? { + deviceId: deviceId, + } + : true, + }; + } + else if (kind == 'videoinput') { + constraints = { + video: typeof deviceId == 'string' + ? { + deviceId: deviceId, + } + : true, + }; + } + navigator.mediaDevices + .getUserMedia(constraints) + .then(function (stream) { + stream.cachedKey = key; + containerSlot === null || containerSlot === void 0 ? void 0 : containerSlot.setData({ media: stream }); + callback({ media: stream }); + }) + .catch(function (err) { + containerSlot === null || containerSlot === void 0 ? void 0 : containerSlot.setData({ error: err }); + callback({ error: err }); + }); + } + return [containerSlot, key]; +} +function getDevice(kind, deviceId) { + return new Promise(function (resolve, reject) { + getDevicePrivate(kind, deviceId, function (res) { + if (res.error) { + reject(res.error); + } + else { + resolve(res.media); + } + }); + }); +} +function retainDevice(key) { + var slot = globalStore.get(key); + slot === null || slot === void 0 ? void 0 : slot.retain(); +} +function releaseDevice(key) { + var slot = globalStore.get(key); + if ((slot === null || slot === void 0 ? void 0 : slot.release()) == 0) { + globalStore.delete(key); + } +} +var useDevice = function (kind, deviceId) { + var _a = useState({}), res = _a[0], setRes = _a[1]; + useEffect(function () { + if (deviceId != false) { + var _a = getDevicePrivate(kind, deviceId, setRes), containerSlot_1 = _a[0], key_1 = _a[1]; + containerSlot_1.retain(); + return function () { + setRes({ media: undefined, error: undefined }); + if ((containerSlot_1 === null || containerSlot_1 === void 0 ? void 0 : containerSlot_1.release()) == 0) { + globalStore.delete(key_1); + } + }; + } + }, [kind, deviceId]); + return [res.media, res.error]; +}; +var useUserMedia = function (constraints, active) { + var _a = useState({}), res = _a[0], setRes = _a[1]; + useEffect(function () { + if (active) { + var gotStream_1; + navigator.mediaDevices + .getUserMedia(constraints) + .then(function (stream) { + gotStream_1 = stream; + setRes({ media: stream }); + }) + .catch(function (err) { + gotStream_1 = undefined; + setRes({ error: err }); + }); + return function () { + setRes({ media: undefined, error: undefined }); + gotStream_1 === null || gotStream_1 === void 0 ? void 0 : gotStream_1.getTracks().forEach(function (track) { + track.stop(); + }); + }; + } + }, [JSON.stringify(constraints), active]); + return [res.media, res.error]; +}; +var useDisplayMedia = function (constraints, active) { + var _a = useState({}), res = _a[0], setRes = _a[1]; + useEffect(function () { + if (active) { + var gotStream_2; + navigator.mediaDevices + .getDisplayMedia(constraints) + .then(function (stream) { + gotStream_2 = stream; + setRes({ media: stream }); + }) + .catch(function (err) { + gotStream_2 = undefined; + setRes({ error: err }); + }); + return function () { + setRes({ media: undefined, error: undefined }); + gotStream_2 === null || gotStream_2 === void 0 ? void 0 : gotStream_2.getTracks().forEach(function (track) { + track.stop(); + }); + }; + } + }, [JSON.stringify(constraints), active]); + return [res.media, res.error]; +}; + +var SessionState; +(function (SessionState) { + SessionState["New"] = "new"; + SessionState["Connecting"] = "connecting"; + SessionState["Connected"] = "connected"; + SessionState["Reconnecting"] = "reconnecting"; + SessionState["Disconnected"] = "disconnected"; + SessionState["Error"] = "error"; +})(SessionState || (SessionState = {})); +var StreamPublisherWrap = /** @class */ (function () { + function StreamPublisherWrap(publisher) { + this.publisher = publisher; + } + Object.defineProperty(StreamPublisherWrap.prototype, "state", { + get: function () { + return this.publisher.state; + }, + enumerable: false, + configurable: true + }); + Object.defineProperty(StreamPublisherWrap.prototype, "localStream", { + get: function () { + return this.publisher.localStream; + }, + enumerable: false, + configurable: true + }); + StreamPublisherWrap.prototype.on = function (type, callback) { + this.publisher.on(type, callback); + }; + StreamPublisherWrap.prototype.off = function (type, callback) { + this.publisher.on(type, callback); + }; + StreamPublisherWrap.prototype.switchStream = function (stream) { + if (stream) { + // eslint-disable-next-line @typescript-eslint/no-explicit-any + var cachedKey = stream.cachedKey; + if (cachedKey) { + retainDevice(cachedKey); + } + } + if (this.publisher.localStream) { + // eslint-disable-next-line @typescript-eslint/no-explicit-any + var cacheKey = this.publisher.localStream.cachedKey; + if (cacheKey) { + releaseDevice(cacheKey); + } + } + return this.publisher.switch(stream); + }; + return StreamPublisherWrap; +}()); +var SessionContext = React.createContext({}); +var GlobalVer = 0; +var SessionProvider = function (props) { + // if (props.log_level != undefined) { + // Atm0s.setLogLevel(props.log_level); + // } + var _a = useState(0), setVer = _a[1]; + var storage = useMemo(function () { + return { data: undefined }; + }, []); + var update = useCallback(function (data) { + storage.data = data; + setVer(GlobalVer++); + }, [storage, setVer]); + var connect = useCallback(function (url, config) { + var _a, _b; + if ((_a = storage.data) === null || _a === void 0 ? void 0 : _a.session) { + return function () { + var _a; + (_a = storage.data) === null || _a === void 0 ? void 0 : _a.session.disconnect(); + }; + } + var session = Atm0s.createSession(url, config); + var myAudioStreams = new Map(); + var myVideoStreams = new Map(); + var audioStreams = new Map(); + var videoStreams = new Map(); + var publishers = new Map(); + var consumers = new Map(); + var consumerPairs = new Map(); + (_b = config === null || config === void 0 ? void 0 : config.senders) === null || _b === void 0 ? void 0 : _b.map(function (sender) { + if (sender.stream) { + // eslint-disable-next-line @typescript-eslint/no-explicit-any + var cachedKey = sender.stream.cachedKey; + if (cachedKey) { + retainDevice(cachedKey); + } + } + }); + session.on('connected', function () { + var _a; + if (((_a = storage.data) === null || _a === void 0 ? void 0 : _a.session) != session) + return; + update({ + session: session, + state: SessionState.Connected, + myAudioStreams: Array.from(myAudioStreams.values()), + myVideoStreams: Array.from(myVideoStreams.values()), + audioStreams: Array.from(audioStreams.values()), + videoStreams: Array.from(videoStreams.values()), + publishers: publishers, + consumers: consumers, + consumerPairs: consumerPairs, + }); + }); + session.on('mystream_added', function (stream) { + var _a; + if (((_a = storage.data) === null || _a === void 0 ? void 0 : _a.session) != session) + return; + var key = stream.peerId + '-' + stream.name; + if (stream.kind === Atm0s.StreamKinds.AUDIO) { + myAudioStreams.set(key, stream); + } + else { + myVideoStreams.set(key, stream); + } + update({ + session: session, + state: SessionState.Connected, + myAudioStreams: Array.from(myAudioStreams.values()), + myVideoStreams: Array.from(myVideoStreams.values()), + audioStreams: Array.from(audioStreams.values()), + videoStreams: Array.from(videoStreams.values()), + publishers: publishers, + consumers: consumers, + consumerPairs: consumerPairs, + }); + }); + session.on('mystream_updated', function (stream) { + var _a; + if (((_a = storage.data) === null || _a === void 0 ? void 0 : _a.session) != session) + return; + var key = stream.peerId + '-' + stream.name; + if (stream.kind === Atm0s.StreamKinds.AUDIO) { + myAudioStreams.set(key, stream); + } + else { + myVideoStreams.set(key, stream); + } + update({ + session: session, + state: SessionState.Connected, + myAudioStreams: Array.from(myAudioStreams.values()), + myVideoStreams: Array.from(myVideoStreams.values()), + audioStreams: Array.from(audioStreams.values()), + videoStreams: Array.from(videoStreams.values()), + publishers: publishers, + consumers: consumers, + consumerPairs: consumerPairs, + }); + }); + session.on('mystream_removed', function (stream) { + var _a; + if (((_a = storage.data) === null || _a === void 0 ? void 0 : _a.session) != session) + return; + var key = stream.peerId + '-' + stream.name; + if (stream.kind === Atm0s.StreamKinds.AUDIO) { + myAudioStreams.delete(key); + } + else { + myVideoStreams.delete(key); + } + update({ + session: session, + state: SessionState.Connected, + myAudioStreams: Array.from(myAudioStreams.values()), + myVideoStreams: Array.from(myVideoStreams.values()), + audioStreams: Array.from(audioStreams.values()), + videoStreams: Array.from(videoStreams.values()), + publishers: publishers, + consumers: consumers, + consumerPairs: consumerPairs, + }); + }); + session.on('stream_added', function (stream) { + var _a; + if (((_a = storage.data) === null || _a === void 0 ? void 0 : _a.session) != session) + return; + var key = stream.peerId + '-' + stream.name; + if (stream.kind === Atm0s.StreamKinds.AUDIO) { + audioStreams.set(key, stream); + } + else { + videoStreams.set(key, stream); + } + update({ + session: session, + state: SessionState.Connected, + myAudioStreams: Array.from(myAudioStreams.values()), + myVideoStreams: Array.from(myVideoStreams.values()), + audioStreams: Array.from(audioStreams.values()), + videoStreams: Array.from(videoStreams.values()), + publishers: publishers, + consumers: consumers, + consumerPairs: consumerPairs, + }); + }); + session.on('stream_updated', function (stream) { + var _a; + if (((_a = storage.data) === null || _a === void 0 ? void 0 : _a.session) != session) + return; + var key = stream.peerId + '-' + stream.name; + if (stream.kind === Atm0s.StreamKinds.AUDIO) { + audioStreams.set(key, stream); + } + else { + videoStreams.set(key, stream); + } + update({ + session: session, + state: SessionState.Connected, + myAudioStreams: Array.from(myAudioStreams.values()), + myVideoStreams: Array.from(myVideoStreams.values()), + audioStreams: Array.from(audioStreams.values()), + videoStreams: Array.from(videoStreams.values()), + publishers: publishers, + consumers: consumers, + consumerPairs: consumerPairs, + }); + }); + session.on('stream_removed', function (stream) { + var _a; + if (((_a = storage.data) === null || _a === void 0 ? void 0 : _a.session) != session) + return; + var key = stream.peerId + '-' + stream.name; + if (stream.kind === Atm0s.StreamKinds.AUDIO) { + audioStreams.delete(key); + } + else { + videoStreams.delete(key); + } + update({ + session: session, + state: SessionState.Connected, + myAudioStreams: Array.from(myAudioStreams.values()), + myVideoStreams: Array.from(myVideoStreams.values()), + audioStreams: Array.from(audioStreams.values()), + videoStreams: Array.from(videoStreams.values()), + publishers: publishers, + consumers: consumers, + consumerPairs: consumerPairs, + }); + }); + session.on('disconnected', function () { + var _a; + if (((_a = storage.data) === null || _a === void 0 ? void 0 : _a.session) != session) + return; + update({ + session: session, + state: SessionState.Disconnected, + myAudioStreams: Array.from(myAudioStreams.values()), + myVideoStreams: Array.from(myVideoStreams.values()), + audioStreams: Array.from(audioStreams.values()), + videoStreams: Array.from(videoStreams.values()), + publishers: publishers, + consumers: consumers, + consumerPairs: consumerPairs, + }); + }); + session.connect().catch(function (err) { + var _a; + if (((_a = storage.data) === null || _a === void 0 ? void 0 : _a.session) != session) + return; + console.error(err); + update({ + session: session, + state: SessionState.Error, + myAudioStreams: Array.from(myAudioStreams.values()), + myVideoStreams: Array.from(myVideoStreams.values()), + audioStreams: Array.from(audioStreams.values()), + videoStreams: Array.from(videoStreams.values()), + publishers: publishers, + consumers: consumers, + consumerPairs: consumerPairs, + }); + }); + update({ + session: session, + state: SessionState.Connecting, + myAudioStreams: [], + myVideoStreams: [], + audioStreams: [], + videoStreams: [], + publishers: publishers, + consumers: consumers, + consumerPairs: consumerPairs, + }); + return; + }, [storage, update]); + var disconnect = useCallback(function () { + var _a; + if ((_a = storage.data) === null || _a === void 0 ? void 0 : _a.session) { + storage.data.session.disconnect(); + update(undefined); + } + }, [storage, update]); + var getPublisher = useCallback(function (ownerId, cfg) { + var _a; + var data = storage.data; + if (data === null || data === void 0 ? void 0 : data.session) { + var publisher = data.publishers.get(cfg.name); + if (!publisher) { + publisher = { + data: new StreamPublisherWrap(data.session.createPublisher({ + stream: cfg.stream, + name: cfg.name, + kind: cfg.kind, + preferredCodecs: cfg.preferredCodecs, + simulcast: cfg.simulcast, + maxBitrate: cfg.maxBitrate, + contentHint: cfg.contentHint, + screen: cfg.screen, + })), + owners: new Map(), + }; + data.publishers.set(cfg.name, publisher); + } + (_a = data.publishers.get(cfg.name)) === null || _a === void 0 ? void 0 : _a.owners.set(ownerId, new Date().getTime()); + return publisher.data; + } + return undefined; + }, [storage]); + var backPublisher = useCallback(function (ownerId, cfg) { + var data = storage.data; + if (data === null || data === void 0 ? void 0 : data.session) { + var publisher = data.publishers.get(cfg.name); + if (publisher) { + publisher.owners.delete(ownerId); + if (publisher.owners.size == 0) { + publisher.data.switchStream(null); + data.publishers.delete(cfg.name); + } + } + } + return undefined; + }, [storage]); + var getConsumer = useCallback(function (ownerId, stream) { + var _a; + var data = storage.data; + if (data === null || data === void 0 ? void 0 : data.session) { + var key = stream.peerId + '-' + stream.name; + var consumer = data.consumers.get(key); + if (!consumer) { + consumer = { + data: data.session.createConsumer(stream), + owners: new Map(), + }; + data.consumers.set(key, consumer); + } + (_a = data.consumers.get(key)) === null || _a === void 0 ? void 0 : _a.owners.set(ownerId, new Date().getTime()); + return consumer.data; + } + return undefined; + }, [storage]); + var backConsumer = useCallback(function (ownerId, stream) { + var data = storage.data; + if (data === null || data === void 0 ? void 0 : data.session) { + var key = stream.peerId + '-' + stream.name; + var consumer = data.consumers.get(key); + if (consumer) { + consumer.owners.delete(ownerId); + if (consumer.owners.size == 0) { + data.consumers.delete(key); + } + } + } + return undefined; + }, [storage]); + var getConsumerPair = useCallback(function (ownerId, peerId, audioName, videoName) { + var _a; + var data = storage.data; + if (data === null || data === void 0 ? void 0 : data.session) { + var key = peerId + '-' + audioName + '-' + videoName; + var consumer = data.consumerPairs.get(key); + if (!consumer) { + consumer = { + data: data.session.createConsumerPair(peerId, audioName, videoName), + owners: new Map(), + }; + data.consumerPairs.set(key, consumer); + } + (_a = data.consumerPairs.get(key)) === null || _a === void 0 ? void 0 : _a.owners.set(ownerId, new Date().getTime()); + return consumer.data; + } + return undefined; + }, [storage]); + var backConsumerPair = useCallback(function (ownerId, peerId, audioName, videoName) { + var data = storage.data; + if (data === null || data === void 0 ? void 0 : data.session) { + var key = peerId + '-' + audioName + '-' + videoName; + var consumer = data.consumerPairs.get(key); + if (consumer) { + consumer.owners.delete(ownerId); + if (consumer.owners.size == 0) { + data.consumerPairs.delete(key); + } + } + } + return undefined; + }, [storage]); + React.useEffect(function () { + if (props.url && props.config) { + connect(props.url, props.config); + return function () { + disconnect(); + }; + } + }, [props.url, props.config, connect, disconnect]); + return (React.createElement(SessionContext.Provider, { value: { + data: storage.data, + connect: connect, + disconnect: disconnect, + getPublisher: getPublisher, + backPublisher: backPublisher, + getConsumer: getConsumer, + backConsumer: backConsumer, + getConsumerPair: getConsumerPair, + backConsumerPair: backConsumerPair, + update: update, + } }, props.children)); +}; + +var useRemoteStreams = function (kind, isMine) { + var data = useContext(SessionContext).data; + if (kind == Atm0s.StreamKinds.AUDIO) { + if (isMine === true) { + return (data === null || data === void 0 ? void 0 : data.myAudioStreams) || []; + } + else { + return (data === null || data === void 0 ? void 0 : data.audioStreams) || []; + } + } + else { + if (isMine === true) { + return (data === null || data === void 0 ? void 0 : data.myVideoStreams) || []; + } + else { + return (data === null || data === void 0 ? void 0 : data.videoStreams) || []; + } + } +}; + +var useSession = function () { + var data = useContext(SessionContext).data; + return data === null || data === void 0 ? void 0 : data.session; +}; + +var useSessionState = function () { + var data = useContext(SessionContext).data; + return (data === null || data === void 0 ? void 0 : data.state) || SessionState.New; +}; + +var useActions = function () { + var _a = useContext(SessionContext), connect = _a.connect, disconnect = _a.disconnect; + return { + connect: connect, + disconnect: disconnect, + playAudioMix: function () { + // data?.session.getMixMinusAudio()?.play(); + }, + }; +}; + +var idSeed$1 = 0; +var useConsumer = function (remote, priority, maxSpatial, maxTemporal) { + var consumerId = useMemo(function () { return idSeed$1++; }, []); + var sessionState = useSessionState(); + var _a = useState(), consumer = _a[0], setConsumer = _a[1]; + var _b = useState(Atm0s.StreamReceiverState.NoSource), state = _b[0], setState = _b[1]; + var _c = useState(), element = _c[0], setElement = _c[1]; + var _d = useContext(SessionContext), data = _d.data, getConsumer = _d.getConsumer, backConsumer = _d.backConsumer; + var isConnectionEstablished = [SessionState.Connected, SessionState.Reconnecting].indexOf(sessionState) >= 0; + useEffect(function () { + if ((data === null || data === void 0 ? void 0 : data.session) && remote) { + var consumer_1 = getConsumer(consumerId, remote); + if (consumer_1) { + consumer_1.on('state', setState); + setState(consumer_1.state); + setConsumer(consumer_1); + return function () { + consumer_1 === null || consumer_1 === void 0 ? void 0 : consumer_1.unview('use-consumer-' + consumerId); + consumer_1 === null || consumer_1 === void 0 ? void 0 : consumer_1.off('state', setState); + backConsumer(consumerId, remote); + }; + } + } + }, [data === null || data === void 0 ? void 0 : data.session, remote]); + useEffect(function () { + if (element && consumer && isConnectionEstablished) { + element.srcObject = consumer.view('use-consumer-' + consumerId, priority, maxSpatial, maxTemporal); + return function () { + element.srcObject = null; + consumer.unview('use-consumer-' + consumerId); + }; + } + }, [element, consumer, isConnectionEstablished]); + useEffect(function () { + if (element && consumer && isConnectionEstablished) { + consumer.limit('use-consumer-' + consumerId, priority, maxSpatial, maxTemporal); + } + }, [element, consumer, isConnectionEstablished, priority, maxSpatial, maxTemporal]); + var ref = function (instance) { + setElement(instance || undefined); + }; + return [ref, state, consumer]; +}; +var useConsumerPair = function (peerId, audioName, videoName, priority, maxSpatial, maxTemporal) { + var consumerId = useMemo(function () { return idSeed$1++; }, []); + var sessionState = useSessionState(); + var _a = useState(), consumer = _a[0], setConsumer = _a[1]; + var _b = useState(Atm0s.StreamReceiverState.NoSource), state = _b[0], setState = _b[1]; + var _c = useState(), element = _c[0], setElement = _c[1]; + var _d = useContext(SessionContext), data = _d.data, getConsumerPair = _d.getConsumerPair, backConsumerPair = _d.backConsumerPair; + var isConnectionEstablished = [SessionState.Connected, SessionState.Reconnecting].indexOf(sessionState) >= 0; + useEffect(function () { + if (data === null || data === void 0 ? void 0 : data.session) { + var consumer_2 = getConsumerPair(consumerId, peerId, audioName, videoName); + if (consumer_2) { + consumer_2.on('state', setState); + setState(consumer_2.state); + setConsumer(consumer_2); + return function () { + consumer_2 === null || consumer_2 === void 0 ? void 0 : consumer_2.off('state', setState); + backConsumerPair(consumerId, peerId, audioName, videoName); + }; + } + } + }, [data === null || data === void 0 ? void 0 : data.session, peerId, audioName, videoName]); + useEffect(function () { + if (element && consumer && isConnectionEstablished) { + element.srcObject = consumer.view('use-consumer-' + consumerId, priority, maxSpatial, maxTemporal); + return function () { + element.srcObject = null; + consumer.unview('use-consumer-' + consumerId); + }; + } + }, [element, consumer, isConnectionEstablished]); + useEffect(function () { + if (element && consumer && isConnectionEstablished) { + consumer.limit('use-consumer-' + consumerId, priority, maxSpatial, maxTemporal); + } + }, [element, consumer, isConnectionEstablished, priority, maxSpatial, maxTemporal]); + var ref = function (instance) { + setElement(instance || undefined); + }; + return [ref, state, consumer]; +}; +var useLocalConsumer = function (stream) { + var _a = useState(), element = _a[0], setElement = _a[1]; + useEffect(function () { + if (element && stream) { + element.srcObject = stream; + return function () { + element.srcObject = null; + }; + } + }, [element, stream]); + return function (instance) { + setElement(instance || undefined); + }; +}; + +var idSeed = 0; +var usePublisher = function (cfg) { + var publisherId = useMemo(function () { return idSeed++; }, []); + var _a = useState(Atm0s.StreamSenderState.Created), state = _a[0], setState = _a[1]; + var _b = useState(), producer = _b[0], setProducer = _b[1]; + var _c = useContext(SessionContext), data = _c.data, getPublisher = _c.getPublisher, backPublisher = _c.backPublisher; + useEffect(function () { + if (data === null || data === void 0 ? void 0 : data.session) { + var newProducer_1 = getPublisher(publisherId, cfg); + if (newProducer_1) { + var onUpdateState_1 = function (state) { + setState(state); + }; + newProducer_1.on('state', onUpdateState_1); + setProducer(newProducer_1); + setState(newProducer_1.state); + return function () { + newProducer_1 === null || newProducer_1 === void 0 ? void 0 : newProducer_1.off('state', onUpdateState_1); + backPublisher(publisherId, cfg); + }; + } + } + }, [data === null || data === void 0 ? void 0 : data.session, cfg.kind + cfg.name]); + return [state, producer === null || producer === void 0 ? void 0 : producer.localStream, producer]; +}; + +var useAudioLevelConsumer = function (consumer) { + var _a = useState(undefined), audioLevel = _a[0], setAudioLevel = _a[1]; + useEffect(function () { + if (consumer) { + var handler_1 = function (level) { + setAudioLevel(level); + }; + consumer.on('audio_level', handler_1); + return function () { + consumer.off('audio_level', handler_1); + }; + } + else { + setAudioLevel(undefined); + } + }, [consumer]); + return audioLevel; +}; +var useAudioLevelProducer = function (producer) { + var _a = useState(undefined), audioLevel = _a[0], setAudioLevel = _a[1]; + useEffect(function () { + if (producer) { + var handler_2 = function (level) { + setAudioLevel(level); + }; + producer.on('audio_level', handler_2); + return function () { + producer.off('audio_level', handler_2); + }; + } + else { + setAudioLevel(undefined); + } + }, [producer]); + return audioLevel; +}; +var useAudioSlotMix = function (slotIndex) { + var _a = useState(undefined), slot = _a[0], setSlot = _a[1]; + var data = useContext(SessionContext).data; + useEffect(function () { + var mixMinus = data === null || data === void 0 ? void 0 : data.session.getMixMinusAudio(); + if (mixMinus) { + // eslint-disable-next-line @typescript-eslint/no-explicit-any + var handler_3 = function (info) { + if (info) { + var sourceId = info[0].split(':'); + setSlot({ + peerId: sourceId[0], + streamName: sourceId[1], + audioLevel: info[1], + }); + } + else { + setSlot(undefined); + } + }; + mixMinus.on("slot_".concat(slotIndex), handler_3); + return function () { + mixMinus === null || mixMinus === void 0 ? void 0 : mixMinus.off("slot_".concat(slotIndex), handler_3); + }; + } + }, [slotIndex, data === null || data === void 0 ? void 0 : data.session.getMixMinusAudio()]); + return slot; +}; +var useAudioLevelMix = function (peerId, streamName) { + var _a = useState(undefined), audioLevel = _a[0], setAudioLevel = _a[1]; + var data = useContext(SessionContext).data; + useEffect(function () { + var mixMinus = data === null || data === void 0 ? void 0 : data.session.getMixMinusAudio(); + if (mixMinus) { + var handler_4 = function (level) { + setAudioLevel(level || undefined); + }; + mixMinus.on("source_".concat(peerId, ":").concat(streamName), handler_4); + return function () { + mixMinus === null || mixMinus === void 0 ? void 0 : mixMinus.off("source_".concat(peerId, ":").concat(streamName), handler_4); + }; + } + }, [peerId, streamName, data === null || data === void 0 ? void 0 : data.session.getMixMinusAudio()]); + return audioLevel; +}; + +var RemoteViewer = function (props) { + var _a = useConsumer(props.remote, props.priority), ref = _a[0], state = _a[1]; + return (React.createElement("div", { className: "w-full h-full" }, + React.createElement("div", null, state), + React.createElement("video", { muted: true, autoPlay: true, className: "w-full h-full", ref: ref }))); +}; +var LocalViewer = function (props) { + var ref = useLocalConsumer(props.stream); + return React.createElement("video", { muted: true, autoPlay: true, className: "w-full h-full", ref: ref }); +}; +var VideoViewer = function (props) { + if (props.stream instanceof StreamRemote) { + return React.createElement(RemoteViewer, { remote: props.stream, priority: props.priority }); + } + else { + return React.createElement(LocalViewer, { stream: props.stream }); + } }; -export { isNumberParseable }; +export { SessionContext as BlueseaSessionContext, LocalViewer, RemoteViewer, SessionProvider, SessionState, StreamPublisherWrap, VideoViewer, getDevice, useActions, useAudioLevelConsumer, useAudioLevelMix, useAudioLevelProducer, useAudioSlotMix, useConsumer, useConsumerPair, useDevice, useDevices, useDisplayMedia, useLocalConsumer, usePublisher, useRemoteStreams, useSession, useSessionState, useUserMedia }; //# sourceMappingURL=index.esm.js.map diff --git a/dist/index.esm.js.map b/dist/index.esm.js.map index 9ac598c..ab28725 100644 --- a/dist/index.esm.js.map +++ b/dist/index.esm.js.map @@ -1 +1 @@ -{"version":3,"file":"index.esm.js","sources":["../src/index.ts"],"sourcesContent":["/**\n * A Branded Type for values parseable to number.\n */\nexport type NumberParseable = (number | string | boolean) & {\n readonly isNumberParseble: unique symbol;\n};\n\n/**\n * Check if value is parseable to number.\n * @example\n * ```js\n * isNumberParseable('AAAA');\n * //=> false\n *\n * isNumberParseable('100');\n * //=> true\n *\n * if (!isNumberParseable(value))\n * throw new Error('Value can\\'t be parseable to `Number`.')\n * return Number(value);\n * ```\n * @param value - An `unknown` value to be checked.\n */\nexport const isNumberParseable = (value: unknown): value is NumberParseable =>\n !Number.isNaN(Number(value));\n"],"names":[],"mappings":";;;;;;AAOA;;;;;;;;;;;;;;;AAeG;AACI,IAAM,iBAAiB,GAAG,UAAC,KAAc,EAAA;IAC9C,OAAA,CAAC,MAAM,CAAC,KAAK,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC,CAAA;AAA5B;;;;"} \ No newline at end of file +{"version":3,"file":"index.esm.js","sources":["../src/hooks/device.ts","../src/components/provider.tsx","../src/hooks/remote.ts","../src/hooks/session.ts","../src/hooks/state.ts","../src/hooks/actions.ts","../src/hooks/consumer.ts","../src/hooks/publisher.ts","../src/hooks/audio_level.ts","../src/components/video_viewer.tsx"],"sourcesContent":["import { TypedEventEmitter } from '@8xff/atm0s-media-js/types/lib/utils/typed-event-emitter';\nimport { getLogger } from '@8xff/atm0s-media-js/types/lib/utils/logger';\nimport { useEffect, useState } from 'react';\n\nconst logger = getLogger('DeviceHook');\n\ninterface Return {\n media?: MediaStream;\n error?: Error;\n}\n\nclass StreamContainer extends TypedEventEmitter<{ changed: (data: Return) => void }> {\n count = 0;\n data: Return = {};\n\n constructor(private key: string) {\n super();\n logger.log('Created container for local stream', key);\n }\n\n setData(data: Return) {\n this.data = data;\n this.emit('changed', data);\n }\n\n retain() {\n this.count += 1;\n logger.log('Retain local stream', this.key, this.count);\n return this.count;\n }\n\n release() {\n this.count -= 1;\n logger.log('Release local stream', this.key, this.count);\n if (this.count == 0) {\n logger.log('Destroy local stream', this.key);\n this.data.media?.getTracks().map((track) => {\n track.stop();\n });\n }\n return this.count;\n }\n}\nconst globalStore: Map = new Map();\n\nexport const useDevices = (\n kind: MediaDeviceKind,\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n): [MediaDeviceInfo[], any | null] => {\n const [devices, setDevices] = useState([]);\n const [error, setError] = useState(null);\n useEffect(() => {\n navigator.mediaDevices\n .enumerateDevices()\n .then((devices) => {\n setDevices(devices.filter((d) => d.kind == kind));\n })\n .catch((error) => {\n setDevices([]);\n setError(error);\n });\n }, [kind]);\n\n return [devices, error];\n};\n\nfunction getDevicePrivate(\n kind: MediaDeviceKind,\n deviceId: string | boolean,\n callback: (data: Return) => void,\n): [StreamContainer, string] {\n const key = kind + '-' + deviceId;\n let containerSlot = globalStore.get(key);\n if (containerSlot) {\n containerSlot.on('changed', callback);\n callback(containerSlot.data);\n } else {\n containerSlot = new StreamContainer(key);\n globalStore.set(key, containerSlot);\n let constraints: MediaStreamConstraints = {};\n if (kind == 'audioinput') {\n constraints = {\n audio:\n typeof deviceId == 'string'\n ? {\n deviceId: deviceId,\n }\n : true,\n };\n } else if (kind == 'videoinput') {\n constraints = {\n video:\n typeof deviceId == 'string'\n ? {\n deviceId: deviceId,\n }\n : true,\n };\n }\n navigator.mediaDevices\n .getUserMedia(constraints)\n .then((stream) => {\n stream.cachedKey = key;\n containerSlot?.setData({ media: stream });\n callback({ media: stream });\n })\n .catch((err) => {\n containerSlot?.setData({ error: err });\n callback({ error: err });\n });\n }\n\n return [containerSlot, key];\n}\n\nexport function getDevice(kind: MediaDeviceKind, deviceId: string | boolean): Promise {\n return new Promise((resolve, reject) => {\n getDevicePrivate(kind, deviceId, (res) => {\n if (res.error) {\n reject(res.error);\n } else {\n resolve(res.media!);\n }\n });\n });\n}\n\nexport function retainDevice(key: string) {\n const slot = globalStore.get(key);\n slot?.retain();\n}\n\nexport function releaseDevice(key: string) {\n const slot = globalStore.get(key);\n if (slot?.release() == 0) {\n globalStore.delete(key);\n }\n}\n\nexport const useDevice = (\n kind: MediaDeviceKind,\n deviceId: string | boolean,\n): [MediaStream | undefined, Error | undefined] => {\n const [res, setRes] = useState({} as Return);\n useEffect(() => {\n if (deviceId != false) {\n const [containerSlot, key] = getDevicePrivate(kind, deviceId, setRes);\n containerSlot.retain();\n return () => {\n setRes({ media: undefined, error: undefined });\n if (containerSlot?.release() == 0) {\n globalStore.delete(key);\n }\n };\n }\n }, [kind, deviceId]);\n return [res.media, res.error];\n};\n\nexport const useUserMedia = (\n constraints?: MediaStreamConstraints,\n active?: boolean,\n): [MediaStream | undefined, Error | undefined] => {\n const [res, setRes] = useState({} as Return);\n useEffect(() => {\n if (active) {\n let gotStream: MediaStream | undefined;\n navigator.mediaDevices\n .getUserMedia(constraints)\n .then((stream) => {\n gotStream = stream;\n setRes({ media: stream });\n })\n .catch((err) => {\n gotStream = undefined;\n setRes({ error: err });\n });\n return () => {\n setRes({ media: undefined, error: undefined });\n gotStream?.getTracks().forEach((track) => {\n track.stop();\n });\n };\n }\n }, [JSON.stringify(constraints), active]);\n return [res.media, res.error];\n};\n\nexport const useDisplayMedia = (\n constraints?: DisplayMediaStreamOptions,\n active?: boolean,\n): [MediaStream | undefined, Error | undefined] => {\n const [res, setRes] = useState({} as Return);\n useEffect(() => {\n if (active) {\n let gotStream: MediaStream | undefined;\n navigator.mediaDevices\n .getDisplayMedia(constraints)\n .then((stream) => {\n gotStream = stream;\n setRes({ media: stream });\n })\n .catch((err) => {\n gotStream = undefined;\n setRes({ error: err });\n });\n return () => {\n setRes({ media: undefined, error: undefined });\n gotStream?.getTracks().forEach((track) => {\n track.stop();\n });\n };\n }\n }, [JSON.stringify(constraints), active]);\n return [res.media, res.error];\n};\n","import React, { useCallback, useMemo, useState } from 'react';\nimport Atm0s, { type AnyFunction, type IPublisherCallbacks } from '@8xff/atm0s-media-js';\nimport { releaseDevice, retainDevice } from '../hooks/device';\n\nexport enum SessionState {\n New = 'new',\n Connecting = 'connecting',\n Connected = 'connected',\n Reconnecting = 'reconnecting',\n Disconnected = 'disconnected',\n Error = 'error',\n}\n\nexport class StreamPublisherWrap {\n constructor(private publisher: Atm0s.StreamPublisher) {}\n\n get state() {\n return this.publisher.state;\n }\n\n get localStream() {\n return this.publisher.localStream;\n }\n\n on(type: keyof IPublisherCallbacks, callback: AnyFunction) {\n this.publisher.on(type, callback);\n }\n\n off(type: keyof IPublisherCallbacks, callback: AnyFunction) {\n this.publisher.on(type, callback);\n }\n\n switchStream(stream: MediaStream | null) {\n if (stream) {\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n const cachedKey = stream.cachedKey;\n if (cachedKey) {\n retainDevice(cachedKey);\n }\n }\n if (this.publisher.localStream) {\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n const cacheKey = this.publisher.localStream.cachedKey;\n if (cacheKey) {\n releaseDevice(cacheKey);\n }\n }\n return this.publisher.switch(stream);\n }\n}\n\ninterface SessionContainer {\n session: Atm0s.Session;\n state: SessionState;\n myAudioStreams: Atm0s.StreamRemote[];\n myVideoStreams: Atm0s.StreamRemote[];\n audioStreams: Atm0s.StreamRemote[];\n videoStreams: Atm0s.StreamRemote[];\n publishers: Map>;\n consumers: Map>;\n consumerPairs: Map>;\n}\n\ninterface ArcContainer {\n data: T;\n owners: Map;\n}\n\ninterface SessionContextInfo {\n data?: SessionContainer;\n connect: (url: string, config: Atm0s.ISessionConfig) => void;\n disconnect: () => void;\n getPublisher(ownerId: number, cfg: Atm0s.SenderConfig): StreamPublisherWrap | undefined;\n backPublisher(ownerId: number, cfg: Atm0s.SenderConfig): void;\n getConsumer(ownerId: number, remote: Atm0s.StreamRemote): Atm0s.StreamConsumer | undefined;\n backConsumer(owner_id: number, remote: Atm0s.StreamRemote): void;\n getConsumerPair(\n ownerId: number,\n peerId: string,\n audioName: string,\n videoName: string,\n ): Atm0s.StreamConsumerPair | undefined;\n backConsumerPair(ownerId: number, peerId: string, audioName: string, videoName: string): void;\n update: (new_info: SessionContainer) => void;\n}\n\nexport const SessionContext = React.createContext({} as SessionContextInfo);\n\ninterface Props {\n children: React.ReactNode;\n // log_level?: Atm0s.LogLevel;\n url?: string;\n config?: Atm0s.ISessionConfig;\n}\n\nlet GlobalVer = 0;\n\nexport const SessionProvider = (props: Props) => {\n // if (props.log_level != undefined) {\n // Atm0s.setLogLevel(props.log_level);\n // }\n const [, setVer] = useState(0);\n const storage = useMemo<{ data: SessionContainer | undefined }>(() => {\n return { data: undefined };\n }, []);\n const update = useCallback(\n (data: SessionContainer | undefined) => {\n storage.data = data;\n setVer(GlobalVer++);\n },\n [storage, setVer],\n );\n const connect = useCallback(\n (url: string, config: Atm0s.ISessionConfig) => {\n if (storage.data?.session) {\n return () => {\n storage.data?.session.disconnect();\n };\n }\n const session = Atm0s.createSession(url, config);\n const myAudioStreams = new Map();\n const myVideoStreams = new Map();\n const audioStreams = new Map();\n const videoStreams = new Map();\n\n const publishers: Map> = new Map();\n const consumers: Map> = new Map();\n const consumerPairs: Map> = new Map();\n\n config?.senders?.map((sender) => {\n if (sender.stream) {\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n const cachedKey = sender.stream.cachedKey;\n if (cachedKey) {\n retainDevice(cachedKey);\n }\n }\n });\n\n session.on('connected', () => {\n if (storage.data?.session != session) return;\n update({\n session,\n state: SessionState.Connected,\n myAudioStreams: Array.from(myAudioStreams.values()),\n myVideoStreams: Array.from(myVideoStreams.values()),\n audioStreams: Array.from(audioStreams.values()),\n videoStreams: Array.from(videoStreams.values()),\n publishers,\n consumers,\n consumerPairs,\n });\n });\n\n session.on('mystream_added', (stream: Atm0s.StreamRemote) => {\n if (storage.data?.session != session) return;\n const key = stream.peerId + '-' + stream.name;\n if (stream.kind === Atm0s.StreamKinds.AUDIO) {\n myAudioStreams.set(key, stream);\n } else {\n myVideoStreams.set(key, stream);\n }\n update({\n session,\n state: SessionState.Connected,\n myAudioStreams: Array.from(myAudioStreams.values()),\n myVideoStreams: Array.from(myVideoStreams.values()),\n audioStreams: Array.from(audioStreams.values()),\n videoStreams: Array.from(videoStreams.values()),\n publishers,\n consumers,\n consumerPairs,\n });\n });\n\n session.on('mystream_updated', (stream: Atm0s.StreamRemote) => {\n if (storage.data?.session != session) return;\n const key = stream.peerId + '-' + stream.name;\n if (stream.kind === Atm0s.StreamKinds.AUDIO) {\n myAudioStreams.set(key, stream);\n } else {\n myVideoStreams.set(key, stream);\n }\n update({\n session,\n state: SessionState.Connected,\n myAudioStreams: Array.from(myAudioStreams.values()),\n myVideoStreams: Array.from(myVideoStreams.values()),\n audioStreams: Array.from(audioStreams.values()),\n videoStreams: Array.from(videoStreams.values()),\n publishers,\n consumers,\n consumerPairs,\n });\n });\n\n session.on('mystream_removed', (stream: Atm0s.StreamRemote) => {\n if (storage.data?.session != session) return;\n const key = stream.peerId + '-' + stream.name;\n if (stream.kind === Atm0s.StreamKinds.AUDIO) {\n myAudioStreams.delete(key);\n } else {\n myVideoStreams.delete(key);\n }\n update({\n session,\n state: SessionState.Connected,\n myAudioStreams: Array.from(myAudioStreams.values()),\n myVideoStreams: Array.from(myVideoStreams.values()),\n audioStreams: Array.from(audioStreams.values()),\n videoStreams: Array.from(videoStreams.values()),\n publishers,\n consumers,\n consumerPairs,\n });\n });\n\n session.on('stream_added', (stream: Atm0s.StreamRemote) => {\n if (storage.data?.session != session) return;\n const key = stream.peerId + '-' + stream.name;\n if (stream.kind === Atm0s.StreamKinds.AUDIO) {\n audioStreams.set(key, stream);\n } else {\n videoStreams.set(key, stream);\n }\n update({\n session,\n state: SessionState.Connected,\n myAudioStreams: Array.from(myAudioStreams.values()),\n myVideoStreams: Array.from(myVideoStreams.values()),\n audioStreams: Array.from(audioStreams.values()),\n videoStreams: Array.from(videoStreams.values()),\n publishers,\n consumers,\n consumerPairs: consumerPairs,\n });\n });\n\n session.on('stream_updated', (stream: Atm0s.StreamRemote) => {\n if (storage.data?.session != session) return;\n const key = stream.peerId + '-' + stream.name;\n if (stream.kind === Atm0s.StreamKinds.AUDIO) {\n audioStreams.set(key, stream);\n } else {\n videoStreams.set(key, stream);\n }\n update({\n session,\n state: SessionState.Connected,\n myAudioStreams: Array.from(myAudioStreams.values()),\n myVideoStreams: Array.from(myVideoStreams.values()),\n audioStreams: Array.from(audioStreams.values()),\n videoStreams: Array.from(videoStreams.values()),\n publishers,\n consumers,\n consumerPairs,\n });\n });\n\n session.on('stream_removed', (stream: Atm0s.StreamRemote) => {\n if (storage.data?.session != session) return;\n const key = stream.peerId + '-' + stream.name;\n if (stream.kind === Atm0s.StreamKinds.AUDIO) {\n audioStreams.delete(key);\n } else {\n videoStreams.delete(key);\n }\n update({\n session,\n state: SessionState.Connected,\n myAudioStreams: Array.from(myAudioStreams.values()),\n myVideoStreams: Array.from(myVideoStreams.values()),\n audioStreams: Array.from(audioStreams.values()),\n videoStreams: Array.from(videoStreams.values()),\n publishers,\n consumers,\n consumerPairs,\n });\n });\n\n session.on('disconnected', () => {\n if (storage.data?.session != session) return;\n update({\n session,\n state: SessionState.Disconnected,\n myAudioStreams: Array.from(myAudioStreams.values()),\n myVideoStreams: Array.from(myVideoStreams.values()),\n audioStreams: Array.from(audioStreams.values()),\n videoStreams: Array.from(videoStreams.values()),\n publishers,\n consumers,\n consumerPairs,\n });\n });\n session.connect().catch((err) => {\n if (storage.data?.session != session) return;\n console.error(err);\n update({\n session,\n state: SessionState.Error,\n myAudioStreams: Array.from(myAudioStreams.values()),\n myVideoStreams: Array.from(myVideoStreams.values()),\n audioStreams: Array.from(audioStreams.values()),\n videoStreams: Array.from(videoStreams.values()),\n publishers,\n consumers,\n consumerPairs,\n });\n });\n update({\n session,\n state: SessionState.Connecting,\n myAudioStreams: [],\n myVideoStreams: [],\n audioStreams: [],\n videoStreams: [],\n publishers,\n consumers,\n consumerPairs,\n });\n return;\n },\n [storage, update],\n );\n\n const disconnect = useCallback(() => {\n if (storage.data?.session) {\n storage.data.session.disconnect();\n update(undefined);\n }\n }, [storage, update]);\n\n const getPublisher = useCallback(\n (ownerId: number, cfg: Atm0s.SenderConfig) => {\n const data = storage.data;\n if (data?.session) {\n let publisher = data.publishers.get(cfg.name);\n if (!publisher) {\n publisher = {\n data: new StreamPublisherWrap(\n data.session.createPublisher({\n stream: cfg.stream,\n name: cfg.name,\n kind: cfg.kind,\n preferredCodecs: cfg.preferredCodecs,\n simulcast: cfg.simulcast,\n maxBitrate: cfg.maxBitrate,\n contentHint: cfg.contentHint,\n screen: cfg.screen,\n }),\n ),\n owners: new Map(),\n };\n data.publishers.set(cfg.name, publisher);\n }\n data.publishers.get(cfg.name)?.owners.set(ownerId, new Date().getTime());\n return publisher.data;\n }\n return undefined;\n },\n [storage],\n );\n\n const backPublisher = useCallback(\n (ownerId: number, cfg: Atm0s.SenderConfig) => {\n const data = storage.data;\n if (data?.session) {\n const publisher = data.publishers.get(cfg.name);\n if (publisher) {\n publisher.owners.delete(ownerId);\n if (publisher.owners.size == 0) {\n publisher.data.switchStream(null);\n data.publishers.delete(cfg.name);\n }\n }\n }\n return undefined;\n },\n [storage],\n );\n\n const getConsumer = useCallback(\n (ownerId: number, stream: Atm0s.StreamRemote) => {\n const data = storage.data;\n if (data?.session) {\n const key = stream.peerId + '-' + stream.name;\n let consumer = data.consumers.get(key);\n if (!consumer) {\n consumer = {\n data: data.session.createConsumer(stream),\n owners: new Map(),\n };\n data.consumers.set(key, consumer);\n }\n data.consumers.get(key)?.owners.set(ownerId, new Date().getTime());\n return consumer.data;\n }\n return undefined;\n },\n [storage],\n );\n\n const backConsumer = useCallback(\n (ownerId: number, stream: Atm0s.StreamRemote) => {\n const data = storage.data;\n if (data?.session) {\n const key = stream.peerId + '-' + stream.name;\n const consumer = data.consumers.get(key);\n if (consumer) {\n consumer.owners.delete(ownerId);\n if (consumer.owners.size == 0) {\n data.consumers.delete(key);\n }\n }\n }\n return undefined;\n },\n [storage],\n );\n\n const getConsumerPair = useCallback(\n (ownerId: number, peerId: string, audioName: string, videoName: string) => {\n const data = storage.data;\n if (data?.session) {\n const key = peerId + '-' + audioName + '-' + videoName;\n let consumer = data.consumerPairs.get(key);\n if (!consumer) {\n consumer = {\n data: data.session.createConsumerPair(peerId, audioName, videoName),\n owners: new Map(),\n };\n data.consumerPairs.set(key, consumer);\n }\n data.consumerPairs.get(key)?.owners.set(ownerId, new Date().getTime());\n return consumer.data;\n }\n return undefined;\n },\n [storage],\n );\n\n const backConsumerPair = useCallback(\n (ownerId: number, peerId: string, audioName: string, videoName: string) => {\n const data = storage.data;\n if (data?.session) {\n const key = peerId + '-' + audioName + '-' + videoName;\n const consumer = data.consumerPairs.get(key);\n if (consumer) {\n consumer.owners.delete(ownerId);\n if (consumer.owners.size == 0) {\n data.consumerPairs.delete(key);\n }\n }\n }\n return undefined;\n },\n [storage],\n );\n\n React.useEffect(() => {\n if (props.url && props.config) {\n connect(props.url, props.config);\n return () => {\n disconnect();\n };\n }\n }, [props.url, props.config, connect, disconnect]);\n\n return (\n \n {props.children}\n \n );\n};\n","import { useContext } from 'react';\nimport { SessionContext } from '../components/provider';\nimport Atm0s from '@8xff/atm0s-media-js';\n\nexport const useRemoteStreams = (kind: Atm0s.StreamKinds, isMine?: boolean): Atm0s.StreamRemote[] => {\n const { data } = useContext(SessionContext);\n if (kind == Atm0s.StreamKinds.AUDIO) {\n if (isMine === true) {\n return data?.myAudioStreams || [];\n } else {\n return data?.audioStreams || [];\n }\n } else {\n if (isMine === true) {\n return data?.myVideoStreams || [];\n } else {\n return data?.videoStreams || [];\n }\n }\n};\n\nexport const usePeerRemoteStreams = (peerId: string, kind: Atm0s.StreamKinds): Atm0s.StreamRemote[] => {\n const { data } = useContext(SessionContext);\n if (kind == Atm0s.StreamKinds.AUDIO) {\n return data?.audioStreams.filter((a) => a.peerId === peerId) || [];\n } else {\n return data?.videoStreams.filter((a) => a.peerId === peerId) || [];\n }\n};\n","import { useContext } from 'react';\nimport { SessionContext } from '../components/provider';\nimport Atm0s from '@8xff/atm0s-media-js';\n\nexport const useSession = (): Atm0s.Session | undefined => {\n const { data } = useContext(SessionContext);\n return data?.session;\n};\n","import { useContext } from 'react';\nimport { SessionContext, SessionState } from '../components/provider';\n\nexport const useSessionState = (): SessionState => {\n const { data } = useContext(SessionContext);\n return data?.state || SessionState.New;\n};\n","import { useContext } from 'react';\nimport { SessionContext } from '../components/provider';\nimport type { ISessionConfig } from '@8xff/atm0s-media-js';\n\ninterface Actions {\n connect: (url: string, config: ISessionConfig) => void;\n disconnect: () => void;\n playAudioMix: () => void;\n}\n\nexport const useActions = (): Actions => {\n const { connect, disconnect } = useContext(SessionContext);\n return {\n connect,\n disconnect,\n playAudioMix: () => {\n // data?.session.getMixMinusAudio()?.play();\n },\n };\n};\n","import { useContext, useEffect, useMemo, useState, type LegacyRef } from 'react';\nimport { SessionContext, SessionState } from '../components/provider';\nimport Atm0s from '@8xff/atm0s-media-js';\nimport { useSessionState } from './state';\n\nlet idSeed = 0;\nexport const useConsumer = (\n remote?: Atm0s.StreamRemote,\n priority?: number,\n maxSpatial?: number,\n maxTemporal?: number,\n): [LegacyRef | undefined, Atm0s.StreamReceiverState, Atm0s.StreamConsumer | undefined] => {\n const consumerId = useMemo(() => idSeed++, []);\n const sessionState = useSessionState();\n const [consumer, setConsumer] = useState();\n const [state, setState] = useState(Atm0s.StreamReceiverState.NoSource);\n const [element, setElement] = useState();\n const { data, getConsumer, backConsumer } = useContext(SessionContext);\n\n const isConnectionEstablished = [SessionState.Connected, SessionState.Reconnecting].indexOf(sessionState) >= 0;\n\n useEffect(() => {\n if (data?.session && remote) {\n const consumer = getConsumer(consumerId, remote);\n if (consumer) {\n consumer.on('state', setState);\n setState(consumer.state);\n setConsumer(consumer);\n return () => {\n consumer?.unview('use-consumer-' + consumerId);\n consumer?.off('state', setState);\n backConsumer(consumerId, remote);\n };\n }\n }\n }, [data?.session, remote]);\n\n useEffect(() => {\n if (element && consumer && isConnectionEstablished) {\n element.srcObject = consumer.view('use-consumer-' + consumerId, priority, maxSpatial, maxTemporal);\n return () => {\n element.srcObject = null;\n consumer.unview('use-consumer-' + consumerId);\n };\n }\n }, [element, consumer, isConnectionEstablished]);\n\n useEffect(() => {\n if (element && consumer && isConnectionEstablished) {\n consumer.limit('use-consumer-' + consumerId, priority, maxSpatial, maxTemporal);\n }\n }, [element, consumer, isConnectionEstablished, priority, maxSpatial, maxTemporal]);\n\n const ref = (instance: HTMLVideoElement | null) => {\n setElement(instance || undefined);\n };\n\n return [ref, state, consumer];\n};\n\nexport const useConsumerPair = (\n peerId: string,\n audioName: string,\n videoName: string,\n priority?: number,\n maxSpatial?: number,\n maxTemporal?: number,\n): [LegacyRef | undefined, Atm0s.StreamReceiverState, Atm0s.StreamConsumerPair | undefined] => {\n const consumerId = useMemo(() => idSeed++, []);\n const sessionState = useSessionState();\n const [consumer, setConsumer] = useState();\n const [state, setState] = useState(Atm0s.StreamReceiverState.NoSource);\n const [element, setElement] = useState();\n const { data, getConsumerPair: getConsumerPair, backConsumerPair: backConsumerPair } = useContext(SessionContext);\n\n const isConnectionEstablished = [SessionState.Connected, SessionState.Reconnecting].indexOf(sessionState) >= 0;\n\n useEffect(() => {\n if (data?.session) {\n const consumer = getConsumerPair(consumerId, peerId, audioName, videoName);\n if (consumer) {\n consumer.on('state', setState);\n setState(consumer.state);\n setConsumer(consumer);\n return () => {\n consumer?.off('state', setState);\n backConsumerPair(consumerId, peerId, audioName, videoName);\n };\n }\n }\n }, [data?.session, peerId, audioName, videoName]);\n\n useEffect(() => {\n if (element && consumer && isConnectionEstablished) {\n element.srcObject = consumer.view('use-consumer-' + consumerId, priority, maxSpatial, maxTemporal);\n return () => {\n element.srcObject = null;\n consumer.unview('use-consumer-' + consumerId);\n };\n }\n }, [element, consumer, isConnectionEstablished]);\n\n useEffect(() => {\n if (element && consumer && isConnectionEstablished) {\n consumer.limit('use-consumer-' + consumerId, priority, maxSpatial, maxTemporal);\n }\n }, [element, consumer, isConnectionEstablished, priority, maxSpatial, maxTemporal]);\n\n const ref = (instance: HTMLVideoElement | null) => {\n setElement(instance || undefined);\n };\n\n return [ref, state, consumer];\n};\n\nexport const useLocalConsumer = (stream?: MediaStream) => {\n const [element, setElement] = useState();\n useEffect(() => {\n if (element && stream) {\n element.srcObject = stream;\n return () => {\n element.srcObject = null;\n };\n }\n }, [element, stream]);\n\n return (instance: HTMLVideoElement | null) => {\n setElement(instance || undefined);\n };\n};\n","import { useContext, useEffect, useMemo, useState } from 'react';\nimport { SessionContext, StreamPublisherWrap } from '../components/provider';\nimport Atm0s from '@8xff/atm0s-media-js';\n\nlet idSeed = 0;\n\nexport const usePublisher = (\n cfg: Atm0s.SenderConfig,\n): [Atm0s.StreamSenderState, MediaStream | undefined | null, StreamPublisherWrap | undefined] => {\n const publisherId = useMemo(() => idSeed++, []);\n const [state, setState] = useState(Atm0s.StreamSenderState.Created);\n const [producer, setProducer] = useState();\n const { data, getPublisher: getPublisher, backPublisher: backPublisher } = useContext(SessionContext);\n useEffect(() => {\n if (data?.session) {\n const newProducer = getPublisher(publisherId, cfg);\n if (newProducer) {\n const onUpdateState = (state: Atm0s.StreamSenderState) => {\n setState(state);\n };\n newProducer.on('state', onUpdateState);\n setProducer(newProducer);\n setState(newProducer.state);\n return () => {\n newProducer?.off('state', onUpdateState);\n backPublisher(publisherId, cfg);\n };\n }\n }\n }, [data?.session, cfg.kind + cfg.name]);\n\n return [state, producer?.localStream, producer];\n};\n","import { useContext, useEffect, useState } from 'react';\nimport * as Bluesea from '@8xff/atm0s-media-js';\nimport { StreamPublisherWrap, BlueseaSessionContext } from '../components';\n\nexport const useAudioLevelConsumer = (\n consumer?: Bluesea.StreamConsumer | Bluesea.StreamConsumerPair,\n): number | undefined => {\n const [audioLevel, setAudioLevel] = useState(undefined);\n useEffect(() => {\n if (consumer) {\n const handler = (level: number) => {\n setAudioLevel(level);\n };\n consumer.on('audio_level', handler);\n\n return () => {\n consumer.off('audio_level', handler);\n };\n } else {\n setAudioLevel(undefined);\n }\n }, [consumer]);\n return audioLevel;\n};\n\nexport const useAudioLevelProducer = (producer?: StreamPublisherWrap): number | undefined => {\n const [audioLevel, setAudioLevel] = useState(undefined);\n useEffect(() => {\n if (producer) {\n const handler = (level: number) => {\n setAudioLevel(level);\n };\n producer.on('audio_level', handler);\n\n return () => {\n producer.off('audio_level', handler);\n };\n } else {\n setAudioLevel(undefined);\n }\n }, [producer]);\n return audioLevel;\n};\n\nexport interface AudioMixSlotInfo {\n peerId: string;\n streamName: string;\n audioLevel: number;\n}\n\nexport const useAudioSlotMix = (slotIndex: number) => {\n const [slot, setSlot] = useState(undefined);\n const { data } = useContext(BlueseaSessionContext);\n useEffect(() => {\n const mixMinus = data?.session.getMixMinusAudio();\n if (mixMinus) {\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n const handler = (info: any | null) => {\n if (info) {\n const sourceId = info[0].split(':');\n setSlot({\n peerId: sourceId[0],\n streamName: sourceId[1],\n audioLevel: info[1],\n });\n } else {\n setSlot(undefined);\n }\n };\n mixMinus.on(`slot_${slotIndex}`, handler);\n\n return () => {\n mixMinus?.off(`slot_${slotIndex}`, handler);\n };\n }\n }, [slotIndex, data?.session.getMixMinusAudio()]);\n return slot;\n};\n\nexport const useAudioLevelMix = (peerId: string, streamName: string) => {\n const [audioLevel, setAudioLevel] = useState(undefined);\n const { data } = useContext(BlueseaSessionContext);\n useEffect(() => {\n const mixMinus = data?.session.getMixMinusAudio();\n if (mixMinus) {\n const handler = (level: number | null) => {\n setAudioLevel(level || undefined);\n };\n mixMinus.on(`source_${peerId}:${streamName}`, handler);\n\n return () => {\n mixMinus?.off(`source_${peerId}:${streamName}`, handler);\n };\n }\n }, [peerId, streamName, data?.session.getMixMinusAudio()]);\n return audioLevel;\n};\n","import { StreamRemote } from '@8xff/atm0s-media-js';\nimport React from 'react';\nimport { useConsumer, useLocalConsumer } from '../hooks';\n\nexport const RemoteViewer = (props: { remote: StreamRemote; priority?: number }) => {\n const [ref, state] = useConsumer(props.remote, props.priority);\n return (\n
\n
{state}
\n \n
\n );\n};\n\nexport const LocalViewer = (props: { stream: MediaStream }) => {\n const ref = useLocalConsumer(props.stream);\n return ;\n};\n\nexport const VideoViewer = (props: { stream: MediaStream | StreamRemote; priority?: number }) => {\n if (props.stream instanceof StreamRemote) {\n return ;\n } else {\n return ;\n }\n};\n"],"names":["idSeed","BlueseaSessionContext"],"mappings":"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"} \ No newline at end of file diff --git a/dist/index.js b/dist/index.js index 223ad89..c3d8371 100644 --- a/dist/index.js +++ b/dist/index.js @@ -1,30 +1,947 @@ /*! - * [libraryName] v0.0.0 - * (c) [authorFullName] + * @8xff/atm0s-media-react v0.0.0 + * (c) Luong Ngoc Minh * Released under the MIT License. */ 'use strict'; -/** - * Check if value is parseable to number. - * @example - * ```js - * isNumberParseable('AAAA'); - * //=> false - * - * isNumberParseable('100'); - * //=> true - * - * if (!isNumberParseable(value)) - * throw new Error('Value can\'t be parseable to `Number`.') - * return Number(value); - * ``` - * @param value - An `unknown` value to be checked. - */ -var isNumberParseable = function (value) { - return !Number.isNaN(Number(value)); +var React = require('react'); +var Atm0s = require('@8xff/atm0s-media-js'); +var typedEventEmitter = require('@8xff/atm0s-media-js/types/lib/utils/typed-event-emitter'); +var logger$1 = require('@8xff/atm0s-media-js/types/lib/utils/logger'); + +/****************************************************************************** +Copyright (c) Microsoft Corporation. + +Permission to use, copy, modify, and/or distribute this software for any +purpose with or without fee is hereby granted. + +THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES WITH +REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY +AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT, +INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM +LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR +OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR +PERFORMANCE OF THIS SOFTWARE. +***************************************************************************** */ +/* global Reflect, Promise, SuppressedError, Symbol */ + +var extendStatics = function(d, b) { + extendStatics = Object.setPrototypeOf || + ({ __proto__: [] } instanceof Array && function (d, b) { d.__proto__ = b; }) || + function (d, b) { for (var p in b) if (Object.prototype.hasOwnProperty.call(b, p)) d[p] = b[p]; }; + return extendStatics(d, b); +}; + +function __extends(d, b) { + if (typeof b !== "function" && b !== null) + throw new TypeError("Class extends value " + String(b) + " is not a constructor or null"); + extendStatics(d, b); + function __() { this.constructor = d; } + d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __()); +} + +typeof SuppressedError === "function" ? SuppressedError : function (error, suppressed, message) { + var e = new Error(message); + return e.name = "SuppressedError", e.error = error, e.suppressed = suppressed, e; +}; + +var logger = logger$1.getLogger('DeviceHook'); +var StreamContainer = /** @class */ (function (_super) { + __extends(StreamContainer, _super); + function StreamContainer(key) { + var _this = _super.call(this) || this; + _this.key = key; + _this.count = 0; + _this.data = {}; + logger.log('Created container for local stream', key); + return _this; + } + StreamContainer.prototype.setData = function (data) { + this.data = data; + this.emit('changed', data); + }; + StreamContainer.prototype.retain = function () { + this.count += 1; + logger.log('Retain local stream', this.key, this.count); + return this.count; + }; + StreamContainer.prototype.release = function () { + var _a; + this.count -= 1; + logger.log('Release local stream', this.key, this.count); + if (this.count == 0) { + logger.log('Destroy local stream', this.key); + (_a = this.data.media) === null || _a === void 0 ? void 0 : _a.getTracks().map(function (track) { + track.stop(); + }); + } + return this.count; + }; + return StreamContainer; +}(typedEventEmitter.TypedEventEmitter)); +var globalStore = new Map(); +var useDevices = function (kind) { + var _a = React.useState([]), devices = _a[0], setDevices = _a[1]; + var _b = React.useState(null), error = _b[0], setError = _b[1]; + React.useEffect(function () { + navigator.mediaDevices + .enumerateDevices() + .then(function (devices) { + setDevices(devices.filter(function (d) { return d.kind == kind; })); + }) + .catch(function (error) { + setDevices([]); + setError(error); + }); + }, [kind]); + return [devices, error]; +}; +function getDevicePrivate(kind, deviceId, callback) { + var key = kind + '-' + deviceId; + var containerSlot = globalStore.get(key); + if (containerSlot) { + containerSlot.on('changed', callback); + callback(containerSlot.data); + } + else { + containerSlot = new StreamContainer(key); + globalStore.set(key, containerSlot); + var constraints = {}; + if (kind == 'audioinput') { + constraints = { + audio: typeof deviceId == 'string' + ? { + deviceId: deviceId, + } + : true, + }; + } + else if (kind == 'videoinput') { + constraints = { + video: typeof deviceId == 'string' + ? { + deviceId: deviceId, + } + : true, + }; + } + navigator.mediaDevices + .getUserMedia(constraints) + .then(function (stream) { + stream.cachedKey = key; + containerSlot === null || containerSlot === void 0 ? void 0 : containerSlot.setData({ media: stream }); + callback({ media: stream }); + }) + .catch(function (err) { + containerSlot === null || containerSlot === void 0 ? void 0 : containerSlot.setData({ error: err }); + callback({ error: err }); + }); + } + return [containerSlot, key]; +} +function getDevice(kind, deviceId) { + return new Promise(function (resolve, reject) { + getDevicePrivate(kind, deviceId, function (res) { + if (res.error) { + reject(res.error); + } + else { + resolve(res.media); + } + }); + }); +} +function retainDevice(key) { + var slot = globalStore.get(key); + slot === null || slot === void 0 ? void 0 : slot.retain(); +} +function releaseDevice(key) { + var slot = globalStore.get(key); + if ((slot === null || slot === void 0 ? void 0 : slot.release()) == 0) { + globalStore.delete(key); + } +} +var useDevice = function (kind, deviceId) { + var _a = React.useState({}), res = _a[0], setRes = _a[1]; + React.useEffect(function () { + if (deviceId != false) { + var _a = getDevicePrivate(kind, deviceId, setRes), containerSlot_1 = _a[0], key_1 = _a[1]; + containerSlot_1.retain(); + return function () { + setRes({ media: undefined, error: undefined }); + if ((containerSlot_1 === null || containerSlot_1 === void 0 ? void 0 : containerSlot_1.release()) == 0) { + globalStore.delete(key_1); + } + }; + } + }, [kind, deviceId]); + return [res.media, res.error]; +}; +var useUserMedia = function (constraints, active) { + var _a = React.useState({}), res = _a[0], setRes = _a[1]; + React.useEffect(function () { + if (active) { + var gotStream_1; + navigator.mediaDevices + .getUserMedia(constraints) + .then(function (stream) { + gotStream_1 = stream; + setRes({ media: stream }); + }) + .catch(function (err) { + gotStream_1 = undefined; + setRes({ error: err }); + }); + return function () { + setRes({ media: undefined, error: undefined }); + gotStream_1 === null || gotStream_1 === void 0 ? void 0 : gotStream_1.getTracks().forEach(function (track) { + track.stop(); + }); + }; + } + }, [JSON.stringify(constraints), active]); + return [res.media, res.error]; +}; +var useDisplayMedia = function (constraints, active) { + var _a = React.useState({}), res = _a[0], setRes = _a[1]; + React.useEffect(function () { + if (active) { + var gotStream_2; + navigator.mediaDevices + .getDisplayMedia(constraints) + .then(function (stream) { + gotStream_2 = stream; + setRes({ media: stream }); + }) + .catch(function (err) { + gotStream_2 = undefined; + setRes({ error: err }); + }); + return function () { + setRes({ media: undefined, error: undefined }); + gotStream_2 === null || gotStream_2 === void 0 ? void 0 : gotStream_2.getTracks().forEach(function (track) { + track.stop(); + }); + }; + } + }, [JSON.stringify(constraints), active]); + return [res.media, res.error]; +}; + +exports.SessionState = void 0; +(function (SessionState) { + SessionState["New"] = "new"; + SessionState["Connecting"] = "connecting"; + SessionState["Connected"] = "connected"; + SessionState["Reconnecting"] = "reconnecting"; + SessionState["Disconnected"] = "disconnected"; + SessionState["Error"] = "error"; +})(exports.SessionState || (exports.SessionState = {})); +var StreamPublisherWrap = /** @class */ (function () { + function StreamPublisherWrap(publisher) { + this.publisher = publisher; + } + Object.defineProperty(StreamPublisherWrap.prototype, "state", { + get: function () { + return this.publisher.state; + }, + enumerable: false, + configurable: true + }); + Object.defineProperty(StreamPublisherWrap.prototype, "localStream", { + get: function () { + return this.publisher.localStream; + }, + enumerable: false, + configurable: true + }); + StreamPublisherWrap.prototype.on = function (type, callback) { + this.publisher.on(type, callback); + }; + StreamPublisherWrap.prototype.off = function (type, callback) { + this.publisher.on(type, callback); + }; + StreamPublisherWrap.prototype.switchStream = function (stream) { + if (stream) { + // eslint-disable-next-line @typescript-eslint/no-explicit-any + var cachedKey = stream.cachedKey; + if (cachedKey) { + retainDevice(cachedKey); + } + } + if (this.publisher.localStream) { + // eslint-disable-next-line @typescript-eslint/no-explicit-any + var cacheKey = this.publisher.localStream.cachedKey; + if (cacheKey) { + releaseDevice(cacheKey); + } + } + return this.publisher.switch(stream); + }; + return StreamPublisherWrap; +}()); +var SessionContext = React.createContext({}); +var GlobalVer = 0; +var SessionProvider = function (props) { + // if (props.log_level != undefined) { + // Atm0s.setLogLevel(props.log_level); + // } + var _a = React.useState(0), setVer = _a[1]; + var storage = React.useMemo(function () { + return { data: undefined }; + }, []); + var update = React.useCallback(function (data) { + storage.data = data; + setVer(GlobalVer++); + }, [storage, setVer]); + var connect = React.useCallback(function (url, config) { + var _a, _b; + if ((_a = storage.data) === null || _a === void 0 ? void 0 : _a.session) { + return function () { + var _a; + (_a = storage.data) === null || _a === void 0 ? void 0 : _a.session.disconnect(); + }; + } + var session = Atm0s.createSession(url, config); + var myAudioStreams = new Map(); + var myVideoStreams = new Map(); + var audioStreams = new Map(); + var videoStreams = new Map(); + var publishers = new Map(); + var consumers = new Map(); + var consumerPairs = new Map(); + (_b = config === null || config === void 0 ? void 0 : config.senders) === null || _b === void 0 ? void 0 : _b.map(function (sender) { + if (sender.stream) { + // eslint-disable-next-line @typescript-eslint/no-explicit-any + var cachedKey = sender.stream.cachedKey; + if (cachedKey) { + retainDevice(cachedKey); + } + } + }); + session.on('connected', function () { + var _a; + if (((_a = storage.data) === null || _a === void 0 ? void 0 : _a.session) != session) + return; + update({ + session: session, + state: exports.SessionState.Connected, + myAudioStreams: Array.from(myAudioStreams.values()), + myVideoStreams: Array.from(myVideoStreams.values()), + audioStreams: Array.from(audioStreams.values()), + videoStreams: Array.from(videoStreams.values()), + publishers: publishers, + consumers: consumers, + consumerPairs: consumerPairs, + }); + }); + session.on('mystream_added', function (stream) { + var _a; + if (((_a = storage.data) === null || _a === void 0 ? void 0 : _a.session) != session) + return; + var key = stream.peerId + '-' + stream.name; + if (stream.kind === Atm0s.StreamKinds.AUDIO) { + myAudioStreams.set(key, stream); + } + else { + myVideoStreams.set(key, stream); + } + update({ + session: session, + state: exports.SessionState.Connected, + myAudioStreams: Array.from(myAudioStreams.values()), + myVideoStreams: Array.from(myVideoStreams.values()), + audioStreams: Array.from(audioStreams.values()), + videoStreams: Array.from(videoStreams.values()), + publishers: publishers, + consumers: consumers, + consumerPairs: consumerPairs, + }); + }); + session.on('mystream_updated', function (stream) { + var _a; + if (((_a = storage.data) === null || _a === void 0 ? void 0 : _a.session) != session) + return; + var key = stream.peerId + '-' + stream.name; + if (stream.kind === Atm0s.StreamKinds.AUDIO) { + myAudioStreams.set(key, stream); + } + else { + myVideoStreams.set(key, stream); + } + update({ + session: session, + state: exports.SessionState.Connected, + myAudioStreams: Array.from(myAudioStreams.values()), + myVideoStreams: Array.from(myVideoStreams.values()), + audioStreams: Array.from(audioStreams.values()), + videoStreams: Array.from(videoStreams.values()), + publishers: publishers, + consumers: consumers, + consumerPairs: consumerPairs, + }); + }); + session.on('mystream_removed', function (stream) { + var _a; + if (((_a = storage.data) === null || _a === void 0 ? void 0 : _a.session) != session) + return; + var key = stream.peerId + '-' + stream.name; + if (stream.kind === Atm0s.StreamKinds.AUDIO) { + myAudioStreams.delete(key); + } + else { + myVideoStreams.delete(key); + } + update({ + session: session, + state: exports.SessionState.Connected, + myAudioStreams: Array.from(myAudioStreams.values()), + myVideoStreams: Array.from(myVideoStreams.values()), + audioStreams: Array.from(audioStreams.values()), + videoStreams: Array.from(videoStreams.values()), + publishers: publishers, + consumers: consumers, + consumerPairs: consumerPairs, + }); + }); + session.on('stream_added', function (stream) { + var _a; + if (((_a = storage.data) === null || _a === void 0 ? void 0 : _a.session) != session) + return; + var key = stream.peerId + '-' + stream.name; + if (stream.kind === Atm0s.StreamKinds.AUDIO) { + audioStreams.set(key, stream); + } + else { + videoStreams.set(key, stream); + } + update({ + session: session, + state: exports.SessionState.Connected, + myAudioStreams: Array.from(myAudioStreams.values()), + myVideoStreams: Array.from(myVideoStreams.values()), + audioStreams: Array.from(audioStreams.values()), + videoStreams: Array.from(videoStreams.values()), + publishers: publishers, + consumers: consumers, + consumerPairs: consumerPairs, + }); + }); + session.on('stream_updated', function (stream) { + var _a; + if (((_a = storage.data) === null || _a === void 0 ? void 0 : _a.session) != session) + return; + var key = stream.peerId + '-' + stream.name; + if (stream.kind === Atm0s.StreamKinds.AUDIO) { + audioStreams.set(key, stream); + } + else { + videoStreams.set(key, stream); + } + update({ + session: session, + state: exports.SessionState.Connected, + myAudioStreams: Array.from(myAudioStreams.values()), + myVideoStreams: Array.from(myVideoStreams.values()), + audioStreams: Array.from(audioStreams.values()), + videoStreams: Array.from(videoStreams.values()), + publishers: publishers, + consumers: consumers, + consumerPairs: consumerPairs, + }); + }); + session.on('stream_removed', function (stream) { + var _a; + if (((_a = storage.data) === null || _a === void 0 ? void 0 : _a.session) != session) + return; + var key = stream.peerId + '-' + stream.name; + if (stream.kind === Atm0s.StreamKinds.AUDIO) { + audioStreams.delete(key); + } + else { + videoStreams.delete(key); + } + update({ + session: session, + state: exports.SessionState.Connected, + myAudioStreams: Array.from(myAudioStreams.values()), + myVideoStreams: Array.from(myVideoStreams.values()), + audioStreams: Array.from(audioStreams.values()), + videoStreams: Array.from(videoStreams.values()), + publishers: publishers, + consumers: consumers, + consumerPairs: consumerPairs, + }); + }); + session.on('disconnected', function () { + var _a; + if (((_a = storage.data) === null || _a === void 0 ? void 0 : _a.session) != session) + return; + update({ + session: session, + state: exports.SessionState.Disconnected, + myAudioStreams: Array.from(myAudioStreams.values()), + myVideoStreams: Array.from(myVideoStreams.values()), + audioStreams: Array.from(audioStreams.values()), + videoStreams: Array.from(videoStreams.values()), + publishers: publishers, + consumers: consumers, + consumerPairs: consumerPairs, + }); + }); + session.connect().catch(function (err) { + var _a; + if (((_a = storage.data) === null || _a === void 0 ? void 0 : _a.session) != session) + return; + console.error(err); + update({ + session: session, + state: exports.SessionState.Error, + myAudioStreams: Array.from(myAudioStreams.values()), + myVideoStreams: Array.from(myVideoStreams.values()), + audioStreams: Array.from(audioStreams.values()), + videoStreams: Array.from(videoStreams.values()), + publishers: publishers, + consumers: consumers, + consumerPairs: consumerPairs, + }); + }); + update({ + session: session, + state: exports.SessionState.Connecting, + myAudioStreams: [], + myVideoStreams: [], + audioStreams: [], + videoStreams: [], + publishers: publishers, + consumers: consumers, + consumerPairs: consumerPairs, + }); + return; + }, [storage, update]); + var disconnect = React.useCallback(function () { + var _a; + if ((_a = storage.data) === null || _a === void 0 ? void 0 : _a.session) { + storage.data.session.disconnect(); + update(undefined); + } + }, [storage, update]); + var getPublisher = React.useCallback(function (ownerId, cfg) { + var _a; + var data = storage.data; + if (data === null || data === void 0 ? void 0 : data.session) { + var publisher = data.publishers.get(cfg.name); + if (!publisher) { + publisher = { + data: new StreamPublisherWrap(data.session.createPublisher({ + stream: cfg.stream, + name: cfg.name, + kind: cfg.kind, + preferredCodecs: cfg.preferredCodecs, + simulcast: cfg.simulcast, + maxBitrate: cfg.maxBitrate, + contentHint: cfg.contentHint, + screen: cfg.screen, + })), + owners: new Map(), + }; + data.publishers.set(cfg.name, publisher); + } + (_a = data.publishers.get(cfg.name)) === null || _a === void 0 ? void 0 : _a.owners.set(ownerId, new Date().getTime()); + return publisher.data; + } + return undefined; + }, [storage]); + var backPublisher = React.useCallback(function (ownerId, cfg) { + var data = storage.data; + if (data === null || data === void 0 ? void 0 : data.session) { + var publisher = data.publishers.get(cfg.name); + if (publisher) { + publisher.owners.delete(ownerId); + if (publisher.owners.size == 0) { + publisher.data.switchStream(null); + data.publishers.delete(cfg.name); + } + } + } + return undefined; + }, [storage]); + var getConsumer = React.useCallback(function (ownerId, stream) { + var _a; + var data = storage.data; + if (data === null || data === void 0 ? void 0 : data.session) { + var key = stream.peerId + '-' + stream.name; + var consumer = data.consumers.get(key); + if (!consumer) { + consumer = { + data: data.session.createConsumer(stream), + owners: new Map(), + }; + data.consumers.set(key, consumer); + } + (_a = data.consumers.get(key)) === null || _a === void 0 ? void 0 : _a.owners.set(ownerId, new Date().getTime()); + return consumer.data; + } + return undefined; + }, [storage]); + var backConsumer = React.useCallback(function (ownerId, stream) { + var data = storage.data; + if (data === null || data === void 0 ? void 0 : data.session) { + var key = stream.peerId + '-' + stream.name; + var consumer = data.consumers.get(key); + if (consumer) { + consumer.owners.delete(ownerId); + if (consumer.owners.size == 0) { + data.consumers.delete(key); + } + } + } + return undefined; + }, [storage]); + var getConsumerPair = React.useCallback(function (ownerId, peerId, audioName, videoName) { + var _a; + var data = storage.data; + if (data === null || data === void 0 ? void 0 : data.session) { + var key = peerId + '-' + audioName + '-' + videoName; + var consumer = data.consumerPairs.get(key); + if (!consumer) { + consumer = { + data: data.session.createConsumerPair(peerId, audioName, videoName), + owners: new Map(), + }; + data.consumerPairs.set(key, consumer); + } + (_a = data.consumerPairs.get(key)) === null || _a === void 0 ? void 0 : _a.owners.set(ownerId, new Date().getTime()); + return consumer.data; + } + return undefined; + }, [storage]); + var backConsumerPair = React.useCallback(function (ownerId, peerId, audioName, videoName) { + var data = storage.data; + if (data === null || data === void 0 ? void 0 : data.session) { + var key = peerId + '-' + audioName + '-' + videoName; + var consumer = data.consumerPairs.get(key); + if (consumer) { + consumer.owners.delete(ownerId); + if (consumer.owners.size == 0) { + data.consumerPairs.delete(key); + } + } + } + return undefined; + }, [storage]); + React.useEffect(function () { + if (props.url && props.config) { + connect(props.url, props.config); + return function () { + disconnect(); + }; + } + }, [props.url, props.config, connect, disconnect]); + return (React.createElement(SessionContext.Provider, { value: { + data: storage.data, + connect: connect, + disconnect: disconnect, + getPublisher: getPublisher, + backPublisher: backPublisher, + getConsumer: getConsumer, + backConsumer: backConsumer, + getConsumerPair: getConsumerPair, + backConsumerPair: backConsumerPair, + update: update, + } }, props.children)); +}; + +var useRemoteStreams = function (kind, isMine) { + var data = React.useContext(SessionContext).data; + if (kind == Atm0s.StreamKinds.AUDIO) { + if (isMine === true) { + return (data === null || data === void 0 ? void 0 : data.myAudioStreams) || []; + } + else { + return (data === null || data === void 0 ? void 0 : data.audioStreams) || []; + } + } + else { + if (isMine === true) { + return (data === null || data === void 0 ? void 0 : data.myVideoStreams) || []; + } + else { + return (data === null || data === void 0 ? void 0 : data.videoStreams) || []; + } + } +}; + +var useSession = function () { + var data = React.useContext(SessionContext).data; + return data === null || data === void 0 ? void 0 : data.session; +}; + +var useSessionState = function () { + var data = React.useContext(SessionContext).data; + return (data === null || data === void 0 ? void 0 : data.state) || exports.SessionState.New; +}; + +var useActions = function () { + var _a = React.useContext(SessionContext), connect = _a.connect, disconnect = _a.disconnect; + return { + connect: connect, + disconnect: disconnect, + playAudioMix: function () { + // data?.session.getMixMinusAudio()?.play(); + }, + }; +}; + +var idSeed$1 = 0; +var useConsumer = function (remote, priority, maxSpatial, maxTemporal) { + var consumerId = React.useMemo(function () { return idSeed$1++; }, []); + var sessionState = useSessionState(); + var _a = React.useState(), consumer = _a[0], setConsumer = _a[1]; + var _b = React.useState(Atm0s.StreamReceiverState.NoSource), state = _b[0], setState = _b[1]; + var _c = React.useState(), element = _c[0], setElement = _c[1]; + var _d = React.useContext(SessionContext), data = _d.data, getConsumer = _d.getConsumer, backConsumer = _d.backConsumer; + var isConnectionEstablished = [exports.SessionState.Connected, exports.SessionState.Reconnecting].indexOf(sessionState) >= 0; + React.useEffect(function () { + if ((data === null || data === void 0 ? void 0 : data.session) && remote) { + var consumer_1 = getConsumer(consumerId, remote); + if (consumer_1) { + consumer_1.on('state', setState); + setState(consumer_1.state); + setConsumer(consumer_1); + return function () { + consumer_1 === null || consumer_1 === void 0 ? void 0 : consumer_1.unview('use-consumer-' + consumerId); + consumer_1 === null || consumer_1 === void 0 ? void 0 : consumer_1.off('state', setState); + backConsumer(consumerId, remote); + }; + } + } + }, [data === null || data === void 0 ? void 0 : data.session, remote]); + React.useEffect(function () { + if (element && consumer && isConnectionEstablished) { + element.srcObject = consumer.view('use-consumer-' + consumerId, priority, maxSpatial, maxTemporal); + return function () { + element.srcObject = null; + consumer.unview('use-consumer-' + consumerId); + }; + } + }, [element, consumer, isConnectionEstablished]); + React.useEffect(function () { + if (element && consumer && isConnectionEstablished) { + consumer.limit('use-consumer-' + consumerId, priority, maxSpatial, maxTemporal); + } + }, [element, consumer, isConnectionEstablished, priority, maxSpatial, maxTemporal]); + var ref = function (instance) { + setElement(instance || undefined); + }; + return [ref, state, consumer]; +}; +var useConsumerPair = function (peerId, audioName, videoName, priority, maxSpatial, maxTemporal) { + var consumerId = React.useMemo(function () { return idSeed$1++; }, []); + var sessionState = useSessionState(); + var _a = React.useState(), consumer = _a[0], setConsumer = _a[1]; + var _b = React.useState(Atm0s.StreamReceiverState.NoSource), state = _b[0], setState = _b[1]; + var _c = React.useState(), element = _c[0], setElement = _c[1]; + var _d = React.useContext(SessionContext), data = _d.data, getConsumerPair = _d.getConsumerPair, backConsumerPair = _d.backConsumerPair; + var isConnectionEstablished = [exports.SessionState.Connected, exports.SessionState.Reconnecting].indexOf(sessionState) >= 0; + React.useEffect(function () { + if (data === null || data === void 0 ? void 0 : data.session) { + var consumer_2 = getConsumerPair(consumerId, peerId, audioName, videoName); + if (consumer_2) { + consumer_2.on('state', setState); + setState(consumer_2.state); + setConsumer(consumer_2); + return function () { + consumer_2 === null || consumer_2 === void 0 ? void 0 : consumer_2.off('state', setState); + backConsumerPair(consumerId, peerId, audioName, videoName); + }; + } + } + }, [data === null || data === void 0 ? void 0 : data.session, peerId, audioName, videoName]); + React.useEffect(function () { + if (element && consumer && isConnectionEstablished) { + element.srcObject = consumer.view('use-consumer-' + consumerId, priority, maxSpatial, maxTemporal); + return function () { + element.srcObject = null; + consumer.unview('use-consumer-' + consumerId); + }; + } + }, [element, consumer, isConnectionEstablished]); + React.useEffect(function () { + if (element && consumer && isConnectionEstablished) { + consumer.limit('use-consumer-' + consumerId, priority, maxSpatial, maxTemporal); + } + }, [element, consumer, isConnectionEstablished, priority, maxSpatial, maxTemporal]); + var ref = function (instance) { + setElement(instance || undefined); + }; + return [ref, state, consumer]; +}; +var useLocalConsumer = function (stream) { + var _a = React.useState(), element = _a[0], setElement = _a[1]; + React.useEffect(function () { + if (element && stream) { + element.srcObject = stream; + return function () { + element.srcObject = null; + }; + } + }, [element, stream]); + return function (instance) { + setElement(instance || undefined); + }; +}; + +var idSeed = 0; +var usePublisher = function (cfg) { + var publisherId = React.useMemo(function () { return idSeed++; }, []); + var _a = React.useState(Atm0s.StreamSenderState.Created), state = _a[0], setState = _a[1]; + var _b = React.useState(), producer = _b[0], setProducer = _b[1]; + var _c = React.useContext(SessionContext), data = _c.data, getPublisher = _c.getPublisher, backPublisher = _c.backPublisher; + React.useEffect(function () { + if (data === null || data === void 0 ? void 0 : data.session) { + var newProducer_1 = getPublisher(publisherId, cfg); + if (newProducer_1) { + var onUpdateState_1 = function (state) { + setState(state); + }; + newProducer_1.on('state', onUpdateState_1); + setProducer(newProducer_1); + setState(newProducer_1.state); + return function () { + newProducer_1 === null || newProducer_1 === void 0 ? void 0 : newProducer_1.off('state', onUpdateState_1); + backPublisher(publisherId, cfg); + }; + } + } + }, [data === null || data === void 0 ? void 0 : data.session, cfg.kind + cfg.name]); + return [state, producer === null || producer === void 0 ? void 0 : producer.localStream, producer]; +}; + +var useAudioLevelConsumer = function (consumer) { + var _a = React.useState(undefined), audioLevel = _a[0], setAudioLevel = _a[1]; + React.useEffect(function () { + if (consumer) { + var handler_1 = function (level) { + setAudioLevel(level); + }; + consumer.on('audio_level', handler_1); + return function () { + consumer.off('audio_level', handler_1); + }; + } + else { + setAudioLevel(undefined); + } + }, [consumer]); + return audioLevel; +}; +var useAudioLevelProducer = function (producer) { + var _a = React.useState(undefined), audioLevel = _a[0], setAudioLevel = _a[1]; + React.useEffect(function () { + if (producer) { + var handler_2 = function (level) { + setAudioLevel(level); + }; + producer.on('audio_level', handler_2); + return function () { + producer.off('audio_level', handler_2); + }; + } + else { + setAudioLevel(undefined); + } + }, [producer]); + return audioLevel; +}; +var useAudioSlotMix = function (slotIndex) { + var _a = React.useState(undefined), slot = _a[0], setSlot = _a[1]; + var data = React.useContext(SessionContext).data; + React.useEffect(function () { + var mixMinus = data === null || data === void 0 ? void 0 : data.session.getMixMinusAudio(); + if (mixMinus) { + // eslint-disable-next-line @typescript-eslint/no-explicit-any + var handler_3 = function (info) { + if (info) { + var sourceId = info[0].split(':'); + setSlot({ + peerId: sourceId[0], + streamName: sourceId[1], + audioLevel: info[1], + }); + } + else { + setSlot(undefined); + } + }; + mixMinus.on("slot_".concat(slotIndex), handler_3); + return function () { + mixMinus === null || mixMinus === void 0 ? void 0 : mixMinus.off("slot_".concat(slotIndex), handler_3); + }; + } + }, [slotIndex, data === null || data === void 0 ? void 0 : data.session.getMixMinusAudio()]); + return slot; +}; +var useAudioLevelMix = function (peerId, streamName) { + var _a = React.useState(undefined), audioLevel = _a[0], setAudioLevel = _a[1]; + var data = React.useContext(SessionContext).data; + React.useEffect(function () { + var mixMinus = data === null || data === void 0 ? void 0 : data.session.getMixMinusAudio(); + if (mixMinus) { + var handler_4 = function (level) { + setAudioLevel(level || undefined); + }; + mixMinus.on("source_".concat(peerId, ":").concat(streamName), handler_4); + return function () { + mixMinus === null || mixMinus === void 0 ? void 0 : mixMinus.off("source_".concat(peerId, ":").concat(streamName), handler_4); + }; + } + }, [peerId, streamName, data === null || data === void 0 ? void 0 : data.session.getMixMinusAudio()]); + return audioLevel; +}; + +var RemoteViewer = function (props) { + var _a = useConsumer(props.remote, props.priority), ref = _a[0], state = _a[1]; + return (React.createElement("div", { className: "w-full h-full" }, + React.createElement("div", null, state), + React.createElement("video", { muted: true, autoPlay: true, className: "w-full h-full", ref: ref }))); +}; +var LocalViewer = function (props) { + var ref = useLocalConsumer(props.stream); + return React.createElement("video", { muted: true, autoPlay: true, className: "w-full h-full", ref: ref }); +}; +var VideoViewer = function (props) { + if (props.stream instanceof Atm0s.StreamRemote) { + return React.createElement(RemoteViewer, { remote: props.stream, priority: props.priority }); + } + else { + return React.createElement(LocalViewer, { stream: props.stream }); + } }; -exports.isNumberParseable = isNumberParseable; +exports.BlueseaSessionContext = SessionContext; +exports.LocalViewer = LocalViewer; +exports.RemoteViewer = RemoteViewer; +exports.SessionProvider = SessionProvider; +exports.StreamPublisherWrap = StreamPublisherWrap; +exports.VideoViewer = VideoViewer; +exports.getDevice = getDevice; +exports.useActions = useActions; +exports.useAudioLevelConsumer = useAudioLevelConsumer; +exports.useAudioLevelMix = useAudioLevelMix; +exports.useAudioLevelProducer = useAudioLevelProducer; +exports.useAudioSlotMix = useAudioSlotMix; +exports.useConsumer = useConsumer; +exports.useConsumerPair = useConsumerPair; +exports.useDevice = useDevice; +exports.useDevices = useDevices; +exports.useDisplayMedia = useDisplayMedia; +exports.useLocalConsumer = useLocalConsumer; +exports.usePublisher = usePublisher; +exports.useRemoteStreams = useRemoteStreams; +exports.useSession = useSession; +exports.useSessionState = useSessionState; +exports.useUserMedia = useUserMedia; //# sourceMappingURL=index.js.map diff --git a/dist/index.js.map b/dist/index.js.map index eacb77e..41ed322 100644 --- a/dist/index.js.map +++ b/dist/index.js.map @@ -1 +1 @@ -{"version":3,"file":"index.js","sources":["../src/index.ts"],"sourcesContent":["/**\n * A Branded Type for values parseable to number.\n */\nexport type NumberParseable = (number | string | boolean) & {\n readonly isNumberParseble: unique symbol;\n};\n\n/**\n * Check if value is parseable to number.\n * @example\n * ```js\n * isNumberParseable('AAAA');\n * //=> false\n *\n * isNumberParseable('100');\n * //=> true\n *\n * if (!isNumberParseable(value))\n * throw new Error('Value can\\'t be parseable to `Number`.')\n * return Number(value);\n * ```\n * @param value - An `unknown` value to be checked.\n */\nexport const isNumberParseable = (value: unknown): value is NumberParseable =>\n !Number.isNaN(Number(value));\n"],"names":[],"mappings":";;;;;;;;AAOA;;;;;;;;;;;;;;;AAeG;AACI,IAAM,iBAAiB,GAAG,UAAC,KAAc,EAAA;IAC9C,OAAA,CAAC,MAAM,CAAC,KAAK,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC,CAAA;AAA5B;;;;"} \ No newline at end of file +{"version":3,"file":"index.js","sources":["../src/hooks/device.ts","../src/components/provider.tsx","../src/hooks/remote.ts","../src/hooks/session.ts","../src/hooks/state.ts","../src/hooks/actions.ts","../src/hooks/consumer.ts","../src/hooks/publisher.ts","../src/hooks/audio_level.ts","../src/components/video_viewer.tsx"],"sourcesContent":["import { TypedEventEmitter } from '@8xff/atm0s-media-js/types/lib/utils/typed-event-emitter';\nimport { getLogger } from '@8xff/atm0s-media-js/types/lib/utils/logger';\nimport { useEffect, useState } from 'react';\n\nconst logger = getLogger('DeviceHook');\n\ninterface Return {\n media?: MediaStream;\n error?: Error;\n}\n\nclass StreamContainer extends TypedEventEmitter<{ changed: (data: Return) => void }> {\n count = 0;\n data: Return = {};\n\n constructor(private key: string) {\n super();\n logger.log('Created container for local stream', key);\n }\n\n setData(data: Return) {\n this.data = data;\n this.emit('changed', data);\n }\n\n retain() {\n this.count += 1;\n logger.log('Retain local stream', this.key, this.count);\n return this.count;\n }\n\n release() {\n this.count -= 1;\n logger.log('Release local stream', this.key, this.count);\n if (this.count == 0) {\n logger.log('Destroy local stream', this.key);\n this.data.media?.getTracks().map((track) => {\n track.stop();\n });\n }\n return this.count;\n }\n}\nconst globalStore: Map = new Map();\n\nexport const useDevices = (\n kind: MediaDeviceKind,\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n): [MediaDeviceInfo[], any | null] => {\n const [devices, setDevices] = useState([]);\n const [error, setError] = useState(null);\n useEffect(() => {\n navigator.mediaDevices\n .enumerateDevices()\n .then((devices) => {\n setDevices(devices.filter((d) => d.kind == kind));\n })\n .catch((error) => {\n setDevices([]);\n setError(error);\n });\n }, [kind]);\n\n return [devices, error];\n};\n\nfunction getDevicePrivate(\n kind: MediaDeviceKind,\n deviceId: string | boolean,\n callback: (data: Return) => void,\n): [StreamContainer, string] {\n const key = kind + '-' + deviceId;\n let containerSlot = globalStore.get(key);\n if (containerSlot) {\n containerSlot.on('changed', callback);\n callback(containerSlot.data);\n } else {\n containerSlot = new StreamContainer(key);\n globalStore.set(key, containerSlot);\n let constraints: MediaStreamConstraints = {};\n if (kind == 'audioinput') {\n constraints = {\n audio:\n typeof deviceId == 'string'\n ? {\n deviceId: deviceId,\n }\n : true,\n };\n } else if (kind == 'videoinput') {\n constraints = {\n video:\n typeof deviceId == 'string'\n ? {\n deviceId: deviceId,\n }\n : true,\n };\n }\n navigator.mediaDevices\n .getUserMedia(constraints)\n .then((stream) => {\n stream.cachedKey = key;\n containerSlot?.setData({ media: stream });\n callback({ media: stream });\n })\n .catch((err) => {\n containerSlot?.setData({ error: err });\n callback({ error: err });\n });\n }\n\n return [containerSlot, key];\n}\n\nexport function getDevice(kind: MediaDeviceKind, deviceId: string | boolean): Promise {\n return new Promise((resolve, reject) => {\n getDevicePrivate(kind, deviceId, (res) => {\n if (res.error) {\n reject(res.error);\n } else {\n resolve(res.media!);\n }\n });\n });\n}\n\nexport function retainDevice(key: string) {\n const slot = globalStore.get(key);\n slot?.retain();\n}\n\nexport function releaseDevice(key: string) {\n const slot = globalStore.get(key);\n if (slot?.release() == 0) {\n globalStore.delete(key);\n }\n}\n\nexport const useDevice = (\n kind: MediaDeviceKind,\n deviceId: string | boolean,\n): [MediaStream | undefined, Error | undefined] => {\n const [res, setRes] = useState({} as Return);\n useEffect(() => {\n if (deviceId != false) {\n const [containerSlot, key] = getDevicePrivate(kind, deviceId, setRes);\n containerSlot.retain();\n return () => {\n setRes({ media: undefined, error: undefined });\n if (containerSlot?.release() == 0) {\n globalStore.delete(key);\n }\n };\n }\n }, [kind, deviceId]);\n return [res.media, res.error];\n};\n\nexport const useUserMedia = (\n constraints?: MediaStreamConstraints,\n active?: boolean,\n): [MediaStream | undefined, Error | undefined] => {\n const [res, setRes] = useState({} as Return);\n useEffect(() => {\n if (active) {\n let gotStream: MediaStream | undefined;\n navigator.mediaDevices\n .getUserMedia(constraints)\n .then((stream) => {\n gotStream = stream;\n setRes({ media: stream });\n })\n .catch((err) => {\n gotStream = undefined;\n setRes({ error: err });\n });\n return () => {\n setRes({ media: undefined, error: undefined });\n gotStream?.getTracks().forEach((track) => {\n track.stop();\n });\n };\n }\n }, [JSON.stringify(constraints), active]);\n return [res.media, res.error];\n};\n\nexport const useDisplayMedia = (\n constraints?: DisplayMediaStreamOptions,\n active?: boolean,\n): [MediaStream | undefined, Error | undefined] => {\n const [res, setRes] = useState({} as Return);\n useEffect(() => {\n if (active) {\n let gotStream: MediaStream | undefined;\n navigator.mediaDevices\n .getDisplayMedia(constraints)\n .then((stream) => {\n gotStream = stream;\n setRes({ media: stream });\n })\n .catch((err) => {\n gotStream = undefined;\n setRes({ error: err });\n });\n return () => {\n setRes({ media: undefined, error: undefined });\n gotStream?.getTracks().forEach((track) => {\n track.stop();\n });\n };\n }\n }, [JSON.stringify(constraints), active]);\n return [res.media, res.error];\n};\n","import React, { useCallback, useMemo, useState } from 'react';\nimport Atm0s, { type AnyFunction, type IPublisherCallbacks } from '@8xff/atm0s-media-js';\nimport { releaseDevice, retainDevice } from '../hooks/device';\n\nexport enum SessionState {\n New = 'new',\n Connecting = 'connecting',\n Connected = 'connected',\n Reconnecting = 'reconnecting',\n Disconnected = 'disconnected',\n Error = 'error',\n}\n\nexport class StreamPublisherWrap {\n constructor(private publisher: Atm0s.StreamPublisher) {}\n\n get state() {\n return this.publisher.state;\n }\n\n get localStream() {\n return this.publisher.localStream;\n }\n\n on(type: keyof IPublisherCallbacks, callback: AnyFunction) {\n this.publisher.on(type, callback);\n }\n\n off(type: keyof IPublisherCallbacks, callback: AnyFunction) {\n this.publisher.on(type, callback);\n }\n\n switchStream(stream: MediaStream | null) {\n if (stream) {\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n const cachedKey = stream.cachedKey;\n if (cachedKey) {\n retainDevice(cachedKey);\n }\n }\n if (this.publisher.localStream) {\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n const cacheKey = this.publisher.localStream.cachedKey;\n if (cacheKey) {\n releaseDevice(cacheKey);\n }\n }\n return this.publisher.switch(stream);\n }\n}\n\ninterface SessionContainer {\n session: Atm0s.Session;\n state: SessionState;\n myAudioStreams: Atm0s.StreamRemote[];\n myVideoStreams: Atm0s.StreamRemote[];\n audioStreams: Atm0s.StreamRemote[];\n videoStreams: Atm0s.StreamRemote[];\n publishers: Map>;\n consumers: Map>;\n consumerPairs: Map>;\n}\n\ninterface ArcContainer {\n data: T;\n owners: Map;\n}\n\ninterface SessionContextInfo {\n data?: SessionContainer;\n connect: (url: string, config: Atm0s.ISessionConfig) => void;\n disconnect: () => void;\n getPublisher(ownerId: number, cfg: Atm0s.SenderConfig): StreamPublisherWrap | undefined;\n backPublisher(ownerId: number, cfg: Atm0s.SenderConfig): void;\n getConsumer(ownerId: number, remote: Atm0s.StreamRemote): Atm0s.StreamConsumer | undefined;\n backConsumer(owner_id: number, remote: Atm0s.StreamRemote): void;\n getConsumerPair(\n ownerId: number,\n peerId: string,\n audioName: string,\n videoName: string,\n ): Atm0s.StreamConsumerPair | undefined;\n backConsumerPair(ownerId: number, peerId: string, audioName: string, videoName: string): void;\n update: (new_info: SessionContainer) => void;\n}\n\nexport const SessionContext = React.createContext({} as SessionContextInfo);\n\ninterface Props {\n children: React.ReactNode;\n // log_level?: Atm0s.LogLevel;\n url?: string;\n config?: Atm0s.ISessionConfig;\n}\n\nlet GlobalVer = 0;\n\nexport const SessionProvider = (props: Props) => {\n // if (props.log_level != undefined) {\n // Atm0s.setLogLevel(props.log_level);\n // }\n const [, setVer] = useState(0);\n const storage = useMemo<{ data: SessionContainer | undefined }>(() => {\n return { data: undefined };\n }, []);\n const update = useCallback(\n (data: SessionContainer | undefined) => {\n storage.data = data;\n setVer(GlobalVer++);\n },\n [storage, setVer],\n );\n const connect = useCallback(\n (url: string, config: Atm0s.ISessionConfig) => {\n if (storage.data?.session) {\n return () => {\n storage.data?.session.disconnect();\n };\n }\n const session = Atm0s.createSession(url, config);\n const myAudioStreams = new Map();\n const myVideoStreams = new Map();\n const audioStreams = new Map();\n const videoStreams = new Map();\n\n const publishers: Map> = new Map();\n const consumers: Map> = new Map();\n const consumerPairs: Map> = new Map();\n\n config?.senders?.map((sender) => {\n if (sender.stream) {\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n const cachedKey = sender.stream.cachedKey;\n if (cachedKey) {\n retainDevice(cachedKey);\n }\n }\n });\n\n session.on('connected', () => {\n if (storage.data?.session != session) return;\n update({\n session,\n state: SessionState.Connected,\n myAudioStreams: Array.from(myAudioStreams.values()),\n myVideoStreams: Array.from(myVideoStreams.values()),\n audioStreams: Array.from(audioStreams.values()),\n videoStreams: Array.from(videoStreams.values()),\n publishers,\n consumers,\n consumerPairs,\n });\n });\n\n session.on('mystream_added', (stream: Atm0s.StreamRemote) => {\n if (storage.data?.session != session) return;\n const key = stream.peerId + '-' + stream.name;\n if (stream.kind === Atm0s.StreamKinds.AUDIO) {\n myAudioStreams.set(key, stream);\n } else {\n myVideoStreams.set(key, stream);\n }\n update({\n session,\n state: SessionState.Connected,\n myAudioStreams: Array.from(myAudioStreams.values()),\n myVideoStreams: Array.from(myVideoStreams.values()),\n audioStreams: Array.from(audioStreams.values()),\n videoStreams: Array.from(videoStreams.values()),\n publishers,\n consumers,\n consumerPairs,\n });\n });\n\n session.on('mystream_updated', (stream: Atm0s.StreamRemote) => {\n if (storage.data?.session != session) return;\n const key = stream.peerId + '-' + stream.name;\n if (stream.kind === Atm0s.StreamKinds.AUDIO) {\n myAudioStreams.set(key, stream);\n } else {\n myVideoStreams.set(key, stream);\n }\n update({\n session,\n state: SessionState.Connected,\n myAudioStreams: Array.from(myAudioStreams.values()),\n myVideoStreams: Array.from(myVideoStreams.values()),\n audioStreams: Array.from(audioStreams.values()),\n videoStreams: Array.from(videoStreams.values()),\n publishers,\n consumers,\n consumerPairs,\n });\n });\n\n session.on('mystream_removed', (stream: Atm0s.StreamRemote) => {\n if (storage.data?.session != session) return;\n const key = stream.peerId + '-' + stream.name;\n if (stream.kind === Atm0s.StreamKinds.AUDIO) {\n myAudioStreams.delete(key);\n } else {\n myVideoStreams.delete(key);\n }\n update({\n session,\n state: SessionState.Connected,\n myAudioStreams: Array.from(myAudioStreams.values()),\n myVideoStreams: Array.from(myVideoStreams.values()),\n audioStreams: Array.from(audioStreams.values()),\n videoStreams: Array.from(videoStreams.values()),\n publishers,\n consumers,\n consumerPairs,\n });\n });\n\n session.on('stream_added', (stream: Atm0s.StreamRemote) => {\n if (storage.data?.session != session) return;\n const key = stream.peerId + '-' + stream.name;\n if (stream.kind === Atm0s.StreamKinds.AUDIO) {\n audioStreams.set(key, stream);\n } else {\n videoStreams.set(key, stream);\n }\n update({\n session,\n state: SessionState.Connected,\n myAudioStreams: Array.from(myAudioStreams.values()),\n myVideoStreams: Array.from(myVideoStreams.values()),\n audioStreams: Array.from(audioStreams.values()),\n videoStreams: Array.from(videoStreams.values()),\n publishers,\n consumers,\n consumerPairs: consumerPairs,\n });\n });\n\n session.on('stream_updated', (stream: Atm0s.StreamRemote) => {\n if (storage.data?.session != session) return;\n const key = stream.peerId + '-' + stream.name;\n if (stream.kind === Atm0s.StreamKinds.AUDIO) {\n audioStreams.set(key, stream);\n } else {\n videoStreams.set(key, stream);\n }\n update({\n session,\n state: SessionState.Connected,\n myAudioStreams: Array.from(myAudioStreams.values()),\n myVideoStreams: Array.from(myVideoStreams.values()),\n audioStreams: Array.from(audioStreams.values()),\n videoStreams: Array.from(videoStreams.values()),\n publishers,\n consumers,\n consumerPairs,\n });\n });\n\n session.on('stream_removed', (stream: Atm0s.StreamRemote) => {\n if (storage.data?.session != session) return;\n const key = stream.peerId + '-' + stream.name;\n if (stream.kind === Atm0s.StreamKinds.AUDIO) {\n audioStreams.delete(key);\n } else {\n videoStreams.delete(key);\n }\n update({\n session,\n state: SessionState.Connected,\n myAudioStreams: Array.from(myAudioStreams.values()),\n myVideoStreams: Array.from(myVideoStreams.values()),\n audioStreams: Array.from(audioStreams.values()),\n videoStreams: Array.from(videoStreams.values()),\n publishers,\n consumers,\n consumerPairs,\n });\n });\n\n session.on('disconnected', () => {\n if (storage.data?.session != session) return;\n update({\n session,\n state: SessionState.Disconnected,\n myAudioStreams: Array.from(myAudioStreams.values()),\n myVideoStreams: Array.from(myVideoStreams.values()),\n audioStreams: Array.from(audioStreams.values()),\n videoStreams: Array.from(videoStreams.values()),\n publishers,\n consumers,\n consumerPairs,\n });\n });\n session.connect().catch((err) => {\n if (storage.data?.session != session) return;\n console.error(err);\n update({\n session,\n state: SessionState.Error,\n myAudioStreams: Array.from(myAudioStreams.values()),\n myVideoStreams: Array.from(myVideoStreams.values()),\n audioStreams: Array.from(audioStreams.values()),\n videoStreams: Array.from(videoStreams.values()),\n publishers,\n consumers,\n consumerPairs,\n });\n });\n update({\n session,\n state: SessionState.Connecting,\n myAudioStreams: [],\n myVideoStreams: [],\n audioStreams: [],\n videoStreams: [],\n publishers,\n consumers,\n consumerPairs,\n });\n return;\n },\n [storage, update],\n );\n\n const disconnect = useCallback(() => {\n if (storage.data?.session) {\n storage.data.session.disconnect();\n update(undefined);\n }\n }, [storage, update]);\n\n const getPublisher = useCallback(\n (ownerId: number, cfg: Atm0s.SenderConfig) => {\n const data = storage.data;\n if (data?.session) {\n let publisher = data.publishers.get(cfg.name);\n if (!publisher) {\n publisher = {\n data: new StreamPublisherWrap(\n data.session.createPublisher({\n stream: cfg.stream,\n name: cfg.name,\n kind: cfg.kind,\n preferredCodecs: cfg.preferredCodecs,\n simulcast: cfg.simulcast,\n maxBitrate: cfg.maxBitrate,\n contentHint: cfg.contentHint,\n screen: cfg.screen,\n }),\n ),\n owners: new Map(),\n };\n data.publishers.set(cfg.name, publisher);\n }\n data.publishers.get(cfg.name)?.owners.set(ownerId, new Date().getTime());\n return publisher.data;\n }\n return undefined;\n },\n [storage],\n );\n\n const backPublisher = useCallback(\n (ownerId: number, cfg: Atm0s.SenderConfig) => {\n const data = storage.data;\n if (data?.session) {\n const publisher = data.publishers.get(cfg.name);\n if (publisher) {\n publisher.owners.delete(ownerId);\n if (publisher.owners.size == 0) {\n publisher.data.switchStream(null);\n data.publishers.delete(cfg.name);\n }\n }\n }\n return undefined;\n },\n [storage],\n );\n\n const getConsumer = useCallback(\n (ownerId: number, stream: Atm0s.StreamRemote) => {\n const data = storage.data;\n if (data?.session) {\n const key = stream.peerId + '-' + stream.name;\n let consumer = data.consumers.get(key);\n if (!consumer) {\n consumer = {\n data: data.session.createConsumer(stream),\n owners: new Map(),\n };\n data.consumers.set(key, consumer);\n }\n data.consumers.get(key)?.owners.set(ownerId, new Date().getTime());\n return consumer.data;\n }\n return undefined;\n },\n [storage],\n );\n\n const backConsumer = useCallback(\n (ownerId: number, stream: Atm0s.StreamRemote) => {\n const data = storage.data;\n if (data?.session) {\n const key = stream.peerId + '-' + stream.name;\n const consumer = data.consumers.get(key);\n if (consumer) {\n consumer.owners.delete(ownerId);\n if (consumer.owners.size == 0) {\n data.consumers.delete(key);\n }\n }\n }\n return undefined;\n },\n [storage],\n );\n\n const getConsumerPair = useCallback(\n (ownerId: number, peerId: string, audioName: string, videoName: string) => {\n const data = storage.data;\n if (data?.session) {\n const key = peerId + '-' + audioName + '-' + videoName;\n let consumer = data.consumerPairs.get(key);\n if (!consumer) {\n consumer = {\n data: data.session.createConsumerPair(peerId, audioName, videoName),\n owners: new Map(),\n };\n data.consumerPairs.set(key, consumer);\n }\n data.consumerPairs.get(key)?.owners.set(ownerId, new Date().getTime());\n return consumer.data;\n }\n return undefined;\n },\n [storage],\n );\n\n const backConsumerPair = useCallback(\n (ownerId: number, peerId: string, audioName: string, videoName: string) => {\n const data = storage.data;\n if (data?.session) {\n const key = peerId + '-' + audioName + '-' + videoName;\n const consumer = data.consumerPairs.get(key);\n if (consumer) {\n consumer.owners.delete(ownerId);\n if (consumer.owners.size == 0) {\n data.consumerPairs.delete(key);\n }\n }\n }\n return undefined;\n },\n [storage],\n );\n\n React.useEffect(() => {\n if (props.url && props.config) {\n connect(props.url, props.config);\n return () => {\n disconnect();\n };\n }\n }, [props.url, props.config, connect, disconnect]);\n\n return (\n \n {props.children}\n \n );\n};\n","import { useContext } from 'react';\nimport { SessionContext } from '../components/provider';\nimport Atm0s from '@8xff/atm0s-media-js';\n\nexport const useRemoteStreams = (kind: Atm0s.StreamKinds, isMine?: boolean): Atm0s.StreamRemote[] => {\n const { data } = useContext(SessionContext);\n if (kind == Atm0s.StreamKinds.AUDIO) {\n if (isMine === true) {\n return data?.myAudioStreams || [];\n } else {\n return data?.audioStreams || [];\n }\n } else {\n if (isMine === true) {\n return data?.myVideoStreams || [];\n } else {\n return data?.videoStreams || [];\n }\n }\n};\n\nexport const usePeerRemoteStreams = (peerId: string, kind: Atm0s.StreamKinds): Atm0s.StreamRemote[] => {\n const { data } = useContext(SessionContext);\n if (kind == Atm0s.StreamKinds.AUDIO) {\n return data?.audioStreams.filter((a) => a.peerId === peerId) || [];\n } else {\n return data?.videoStreams.filter((a) => a.peerId === peerId) || [];\n }\n};\n","import { useContext } from 'react';\nimport { SessionContext } from '../components/provider';\nimport Atm0s from '@8xff/atm0s-media-js';\n\nexport const useSession = (): Atm0s.Session | undefined => {\n const { data } = useContext(SessionContext);\n return data?.session;\n};\n","import { useContext } from 'react';\nimport { SessionContext, SessionState } from '../components/provider';\n\nexport const useSessionState = (): SessionState => {\n const { data } = useContext(SessionContext);\n return data?.state || SessionState.New;\n};\n","import { useContext } from 'react';\nimport { SessionContext } from '../components/provider';\nimport type { ISessionConfig } from '@8xff/atm0s-media-js';\n\ninterface Actions {\n connect: (url: string, config: ISessionConfig) => void;\n disconnect: () => void;\n playAudioMix: () => void;\n}\n\nexport const useActions = (): Actions => {\n const { connect, disconnect } = useContext(SessionContext);\n return {\n connect,\n disconnect,\n playAudioMix: () => {\n // data?.session.getMixMinusAudio()?.play();\n },\n };\n};\n","import { useContext, useEffect, useMemo, useState, type LegacyRef } from 'react';\nimport { SessionContext, SessionState } from '../components/provider';\nimport Atm0s from '@8xff/atm0s-media-js';\nimport { useSessionState } from './state';\n\nlet idSeed = 0;\nexport const useConsumer = (\n remote?: Atm0s.StreamRemote,\n priority?: number,\n maxSpatial?: number,\n maxTemporal?: number,\n): [LegacyRef | undefined, Atm0s.StreamReceiverState, Atm0s.StreamConsumer | undefined] => {\n const consumerId = useMemo(() => idSeed++, []);\n const sessionState = useSessionState();\n const [consumer, setConsumer] = useState();\n const [state, setState] = useState(Atm0s.StreamReceiverState.NoSource);\n const [element, setElement] = useState();\n const { data, getConsumer, backConsumer } = useContext(SessionContext);\n\n const isConnectionEstablished = [SessionState.Connected, SessionState.Reconnecting].indexOf(sessionState) >= 0;\n\n useEffect(() => {\n if (data?.session && remote) {\n const consumer = getConsumer(consumerId, remote);\n if (consumer) {\n consumer.on('state', setState);\n setState(consumer.state);\n setConsumer(consumer);\n return () => {\n consumer?.unview('use-consumer-' + consumerId);\n consumer?.off('state', setState);\n backConsumer(consumerId, remote);\n };\n }\n }\n }, [data?.session, remote]);\n\n useEffect(() => {\n if (element && consumer && isConnectionEstablished) {\n element.srcObject = consumer.view('use-consumer-' + consumerId, priority, maxSpatial, maxTemporal);\n return () => {\n element.srcObject = null;\n consumer.unview('use-consumer-' + consumerId);\n };\n }\n }, [element, consumer, isConnectionEstablished]);\n\n useEffect(() => {\n if (element && consumer && isConnectionEstablished) {\n consumer.limit('use-consumer-' + consumerId, priority, maxSpatial, maxTemporal);\n }\n }, [element, consumer, isConnectionEstablished, priority, maxSpatial, maxTemporal]);\n\n const ref = (instance: HTMLVideoElement | null) => {\n setElement(instance || undefined);\n };\n\n return [ref, state, consumer];\n};\n\nexport const useConsumerPair = (\n peerId: string,\n audioName: string,\n videoName: string,\n priority?: number,\n maxSpatial?: number,\n maxTemporal?: number,\n): [LegacyRef | undefined, Atm0s.StreamReceiverState, Atm0s.StreamConsumerPair | undefined] => {\n const consumerId = useMemo(() => idSeed++, []);\n const sessionState = useSessionState();\n const [consumer, setConsumer] = useState();\n const [state, setState] = useState(Atm0s.StreamReceiverState.NoSource);\n const [element, setElement] = useState();\n const { data, getConsumerPair: getConsumerPair, backConsumerPair: backConsumerPair } = useContext(SessionContext);\n\n const isConnectionEstablished = [SessionState.Connected, SessionState.Reconnecting].indexOf(sessionState) >= 0;\n\n useEffect(() => {\n if (data?.session) {\n const consumer = getConsumerPair(consumerId, peerId, audioName, videoName);\n if (consumer) {\n consumer.on('state', setState);\n setState(consumer.state);\n setConsumer(consumer);\n return () => {\n consumer?.off('state', setState);\n backConsumerPair(consumerId, peerId, audioName, videoName);\n };\n }\n }\n }, [data?.session, peerId, audioName, videoName]);\n\n useEffect(() => {\n if (element && consumer && isConnectionEstablished) {\n element.srcObject = consumer.view('use-consumer-' + consumerId, priority, maxSpatial, maxTemporal);\n return () => {\n element.srcObject = null;\n consumer.unview('use-consumer-' + consumerId);\n };\n }\n }, [element, consumer, isConnectionEstablished]);\n\n useEffect(() => {\n if (element && consumer && isConnectionEstablished) {\n consumer.limit('use-consumer-' + consumerId, priority, maxSpatial, maxTemporal);\n }\n }, [element, consumer, isConnectionEstablished, priority, maxSpatial, maxTemporal]);\n\n const ref = (instance: HTMLVideoElement | null) => {\n setElement(instance || undefined);\n };\n\n return [ref, state, consumer];\n};\n\nexport const useLocalConsumer = (stream?: MediaStream) => {\n const [element, setElement] = useState();\n useEffect(() => {\n if (element && stream) {\n element.srcObject = stream;\n return () => {\n element.srcObject = null;\n };\n }\n }, [element, stream]);\n\n return (instance: HTMLVideoElement | null) => {\n setElement(instance || undefined);\n };\n};\n","import { useContext, useEffect, useMemo, useState } from 'react';\nimport { SessionContext, StreamPublisherWrap } from '../components/provider';\nimport Atm0s from '@8xff/atm0s-media-js';\n\nlet idSeed = 0;\n\nexport const usePublisher = (\n cfg: Atm0s.SenderConfig,\n): [Atm0s.StreamSenderState, MediaStream | undefined | null, StreamPublisherWrap | undefined] => {\n const publisherId = useMemo(() => idSeed++, []);\n const [state, setState] = useState(Atm0s.StreamSenderState.Created);\n const [producer, setProducer] = useState();\n const { data, getPublisher: getPublisher, backPublisher: backPublisher } = useContext(SessionContext);\n useEffect(() => {\n if (data?.session) {\n const newProducer = getPublisher(publisherId, cfg);\n if (newProducer) {\n const onUpdateState = (state: Atm0s.StreamSenderState) => {\n setState(state);\n };\n newProducer.on('state', onUpdateState);\n setProducer(newProducer);\n setState(newProducer.state);\n return () => {\n newProducer?.off('state', onUpdateState);\n backPublisher(publisherId, cfg);\n };\n }\n }\n }, [data?.session, cfg.kind + cfg.name]);\n\n return [state, producer?.localStream, producer];\n};\n","import { useContext, useEffect, useState } from 'react';\nimport * as Bluesea from '@8xff/atm0s-media-js';\nimport { StreamPublisherWrap, BlueseaSessionContext } from '../components';\n\nexport const useAudioLevelConsumer = (\n consumer?: Bluesea.StreamConsumer | Bluesea.StreamConsumerPair,\n): number | undefined => {\n const [audioLevel, setAudioLevel] = useState(undefined);\n useEffect(() => {\n if (consumer) {\n const handler = (level: number) => {\n setAudioLevel(level);\n };\n consumer.on('audio_level', handler);\n\n return () => {\n consumer.off('audio_level', handler);\n };\n } else {\n setAudioLevel(undefined);\n }\n }, [consumer]);\n return audioLevel;\n};\n\nexport const useAudioLevelProducer = (producer?: StreamPublisherWrap): number | undefined => {\n const [audioLevel, setAudioLevel] = useState(undefined);\n useEffect(() => {\n if (producer) {\n const handler = (level: number) => {\n setAudioLevel(level);\n };\n producer.on('audio_level', handler);\n\n return () => {\n producer.off('audio_level', handler);\n };\n } else {\n setAudioLevel(undefined);\n }\n }, [producer]);\n return audioLevel;\n};\n\nexport interface AudioMixSlotInfo {\n peerId: string;\n streamName: string;\n audioLevel: number;\n}\n\nexport const useAudioSlotMix = (slotIndex: number) => {\n const [slot, setSlot] = useState(undefined);\n const { data } = useContext(BlueseaSessionContext);\n useEffect(() => {\n const mixMinus = data?.session.getMixMinusAudio();\n if (mixMinus) {\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n const handler = (info: any | null) => {\n if (info) {\n const sourceId = info[0].split(':');\n setSlot({\n peerId: sourceId[0],\n streamName: sourceId[1],\n audioLevel: info[1],\n });\n } else {\n setSlot(undefined);\n }\n };\n mixMinus.on(`slot_${slotIndex}`, handler);\n\n return () => {\n mixMinus?.off(`slot_${slotIndex}`, handler);\n };\n }\n }, [slotIndex, data?.session.getMixMinusAudio()]);\n return slot;\n};\n\nexport const useAudioLevelMix = (peerId: string, streamName: string) => {\n const [audioLevel, setAudioLevel] = useState(undefined);\n const { data } = useContext(BlueseaSessionContext);\n useEffect(() => {\n const mixMinus = data?.session.getMixMinusAudio();\n if (mixMinus) {\n const handler = (level: number | null) => {\n setAudioLevel(level || undefined);\n };\n mixMinus.on(`source_${peerId}:${streamName}`, handler);\n\n return () => {\n mixMinus?.off(`source_${peerId}:${streamName}`, handler);\n };\n }\n }, [peerId, streamName, data?.session.getMixMinusAudio()]);\n return audioLevel;\n};\n","import { StreamRemote } from '@8xff/atm0s-media-js';\nimport React from 'react';\nimport { useConsumer, useLocalConsumer } from '../hooks';\n\nexport const RemoteViewer = (props: { remote: StreamRemote; priority?: number }) => {\n const [ref, state] = useConsumer(props.remote, props.priority);\n return (\n
\n
{state}
\n \n
\n );\n};\n\nexport const LocalViewer = (props: { stream: MediaStream }) => {\n const ref = useLocalConsumer(props.stream);\n return ;\n};\n\nexport const VideoViewer = (props: { stream: MediaStream | StreamRemote; priority?: number }) => {\n if (props.stream instanceof StreamRemote) {\n return ;\n } else {\n return ;\n }\n};\n"],"names":["getLogger","TypedEventEmitter","useState","useEffect","SessionState","useMemo","useCallback","useContext","idSeed","BlueseaSessionContext","StreamRemote"],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAIA,IAAM,MAAM,GAAGA,kBAAS,CAAC,YAAY,CAAC,CAAC;AAOvC,IAAA,eAAA,kBAAA,UAAA,MAAA,EAAA;IAA8B,SAAsD,CAAA,eAAA,EAAA,MAAA,CAAA,CAAA;AAIlF,IAAA,SAAA,eAAA,CAAoB,GAAW,EAAA;AAA/B,QAAA,IAAA,KAAA,GACE,iBAAO,IAER,IAAA,CAAA;QAHmB,KAAG,CAAA,GAAA,GAAH,GAAG,CAAQ;QAH/B,KAAK,CAAA,KAAA,GAAG,CAAC,CAAC;QACV,KAAI,CAAA,IAAA,GAAW,EAAE,CAAC;AAIhB,QAAA,MAAM,CAAC,GAAG,CAAC,oCAAoC,EAAE,GAAG,CAAC,CAAC;;KACvD;IAED,eAAO,CAAA,SAAA,CAAA,OAAA,GAAP,UAAQ,IAAY,EAAA;AAClB,QAAA,IAAI,CAAC,IAAI,GAAG,IAAI,CAAC;AACjB,QAAA,IAAI,CAAC,IAAI,CAAC,SAAS,EAAE,IAAI,CAAC,CAAC;KAC5B,CAAA;AAED,IAAA,eAAA,CAAA,SAAA,CAAA,MAAM,GAAN,YAAA;AACE,QAAA,IAAI,CAAC,KAAK,IAAI,CAAC,CAAC;AAChB,QAAA,MAAM,CAAC,GAAG,CAAC,qBAAqB,EAAE,IAAI,CAAC,GAAG,EAAE,IAAI,CAAC,KAAK,CAAC,CAAC;QACxD,OAAO,IAAI,CAAC,KAAK,CAAC;KACnB,CAAA;AAED,IAAA,eAAA,CAAA,SAAA,CAAA,OAAO,GAAP,YAAA;;AACE,QAAA,IAAI,CAAC,KAAK,IAAI,CAAC,CAAC;AAChB,QAAA,MAAM,CAAC,GAAG,CAAC,sBAAsB,EAAE,IAAI,CAAC,GAAG,EAAE,IAAI,CAAC,KAAK,CAAC,CAAC;AACzD,QAAA,IAAI,IAAI,CAAC,KAAK,IAAI,CAAC,EAAE;YACnB,MAAM,CAAC,GAAG,CAAC,sBAAsB,EAAE,IAAI,CAAC,GAAG,CAAC,CAAC;YAC7C,CAAA,EAAA,GAAA,IAAI,CAAC,IAAI,CAAC,KAAK,MAAE,IAAA,IAAA,EAAA,KAAA,KAAA,CAAA,GAAA,KAAA,CAAA,GAAA,EAAA,CAAA,SAAS,EAAG,CAAA,GAAG,CAAC,UAAC,KAAK,EAAA;gBACrC,KAAK,CAAC,IAAI,EAAE,CAAC;AACf,aAAC,CAAC,CAAC;AACJ,SAAA;QACD,OAAO,IAAI,CAAC,KAAK,CAAC;KACnB,CAAA;IACH,OAAC,eAAA,CAAA;AAAD,CA/BA,CAA8BC,mCAAiB,CA+B9C,CAAA,CAAA;AACD,IAAM,WAAW,GAAiC,IAAI,GAAG,EAAE,CAAC;AAErD,IAAM,UAAU,GAAG,UACxB,IAAqB,EAAA;IAGf,IAAA,EAAA,GAAwBC,cAAQ,CAAoB,EAAE,CAAC,EAAtD,OAAO,GAAA,EAAA,CAAA,CAAA,CAAA,EAAE,UAAU,GAAA,EAAA,CAAA,CAAA,CAAmC,CAAC;IACxD,IAAA,EAAA,GAAoBA,cAAQ,CAAC,IAAI,CAAC,EAAjC,KAAK,GAAA,EAAA,CAAA,CAAA,CAAA,EAAE,QAAQ,GAAA,EAAA,CAAA,CAAA,CAAkB,CAAC;AACzC,IAAAC,eAAS,CAAC,YAAA;AACR,QAAA,SAAS,CAAC,YAAY;AACnB,aAAA,gBAAgB,EAAE;aAClB,IAAI,CAAC,UAAC,OAAO,EAAA;AACZ,YAAA,UAAU,CAAC,OAAO,CAAC,MAAM,CAAC,UAAC,CAAC,EAAK,EAAA,OAAA,CAAC,CAAC,IAAI,IAAI,IAAI,GAAA,CAAC,CAAC,CAAC;AACpD,SAAC,CAAC;aACD,KAAK,CAAC,UAAC,KAAK,EAAA;YACX,UAAU,CAAC,EAAE,CAAC,CAAC;YACf,QAAQ,CAAC,KAAK,CAAC,CAAC;AAClB,SAAC,CAAC,CAAC;AACP,KAAC,EAAE,CAAC,IAAI,CAAC,CAAC,CAAC;AAEX,IAAA,OAAO,CAAC,OAAO,EAAE,KAAK,CAAC,CAAC;AAC1B,EAAE;AAEF,SAAS,gBAAgB,CACvB,IAAqB,EACrB,QAA0B,EAC1B,QAAgC,EAAA;AAEhC,IAAA,IAAM,GAAG,GAAG,IAAI,GAAG,GAAG,GAAG,QAAQ,CAAC;IAClC,IAAI,aAAa,GAAG,WAAW,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC;AACzC,IAAA,IAAI,aAAa,EAAE;AACjB,QAAA,aAAa,CAAC,EAAE,CAAC,SAAS,EAAE,QAAQ,CAAC,CAAC;AACtC,QAAA,QAAQ,CAAC,aAAa,CAAC,IAAI,CAAC,CAAC;AAC9B,KAAA;AAAM,SAAA;AACL,QAAA,aAAa,GAAG,IAAI,eAAe,CAAC,GAAG,CAAC,CAAC;AACzC,QAAA,WAAW,CAAC,GAAG,CAAC,GAAG,EAAE,aAAa,CAAC,CAAC;QACpC,IAAI,WAAW,GAA2B,EAAE,CAAC;QAC7C,IAAI,IAAI,IAAI,YAAY,EAAE;AACxB,YAAA,WAAW,GAAG;AACZ,gBAAA,KAAK,EACH,OAAO,QAAQ,IAAI,QAAQ;AACzB,sBAAE;AACE,wBAAA,QAAQ,EAAE,QAAQ;AACnB,qBAAA;AACH,sBAAE,IAAI;aACX,CAAC;AACH,SAAA;aAAM,IAAI,IAAI,IAAI,YAAY,EAAE;AAC/B,YAAA,WAAW,GAAG;AACZ,gBAAA,KAAK,EACH,OAAO,QAAQ,IAAI,QAAQ;AACzB,sBAAE;AACE,wBAAA,QAAQ,EAAE,QAAQ;AACnB,qBAAA;AACH,sBAAE,IAAI;aACX,CAAC;AACH,SAAA;AACD,QAAA,SAAS,CAAC,YAAY;aACnB,YAAY,CAAC,WAAW,CAAC;aACzB,IAAI,CAAC,UAAC,MAAM,EAAA;AACX,YAAA,MAAM,CAAC,SAAS,GAAG,GAAG,CAAC;AACvB,YAAA,aAAa,KAAb,IAAA,IAAA,aAAa,KAAb,KAAA,CAAA,GAAA,KAAA,CAAA,GAAA,aAAa,CAAE,OAAO,CAAC,EAAE,KAAK,EAAE,MAAM,EAAE,CAAC,CAAC;AAC1C,YAAA,QAAQ,CAAC,EAAE,KAAK,EAAE,MAAM,EAAE,CAAC,CAAC;AAC9B,SAAC,CAAC;aACD,KAAK,CAAC,UAAC,GAAG,EAAA;AACT,YAAA,aAAa,KAAb,IAAA,IAAA,aAAa,KAAb,KAAA,CAAA,GAAA,KAAA,CAAA,GAAA,aAAa,CAAE,OAAO,CAAC,EAAE,KAAK,EAAE,GAAG,EAAE,CAAC,CAAC;AACvC,YAAA,QAAQ,CAAC,EAAE,KAAK,EAAE,GAAG,EAAE,CAAC,CAAC;AAC3B,SAAC,CAAC,CAAC;AACN,KAAA;AAED,IAAA,OAAO,CAAC,aAAa,EAAE,GAAG,CAAC,CAAC;AAC9B,CAAC;AAEe,SAAA,SAAS,CAAC,IAAqB,EAAE,QAA0B,EAAA;AACzE,IAAA,OAAO,IAAI,OAAO,CAAC,UAAC,OAAO,EAAE,MAAM,EAAA;AACjC,QAAA,gBAAgB,CAAC,IAAI,EAAE,QAAQ,EAAE,UAAC,GAAG,EAAA;YACnC,IAAI,GAAG,CAAC,KAAK,EAAE;AACb,gBAAA,MAAM,CAAC,GAAG,CAAC,KAAK,CAAC,CAAC;AACnB,aAAA;AAAM,iBAAA;AACL,gBAAA,OAAO,CAAC,GAAG,CAAC,KAAM,CAAC,CAAC;AACrB,aAAA;AACH,SAAC,CAAC,CAAC;AACL,KAAC,CAAC,CAAC;AACL,CAAC;AAEK,SAAU,YAAY,CAAC,GAAW,EAAA;IACtC,IAAM,IAAI,GAAG,WAAW,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC;AAClC,IAAA,IAAI,aAAJ,IAAI,KAAA,KAAA,CAAA,GAAA,KAAA,CAAA,GAAJ,IAAI,CAAE,MAAM,EAAE,CAAC;AACjB,CAAC;AAEK,SAAU,aAAa,CAAC,GAAW,EAAA;IACvC,IAAM,IAAI,GAAG,WAAW,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC;IAClC,IAAI,CAAA,IAAI,KAAA,IAAA,IAAJ,IAAI,KAAA,KAAA,CAAA,GAAA,KAAA,CAAA,GAAJ,IAAI,CAAE,OAAO,EAAE,KAAI,CAAC,EAAE;AACxB,QAAA,WAAW,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC;AACzB,KAAA;AACH,CAAC;AAEY,IAAA,SAAS,GAAG,UACvB,IAAqB,EACrB,QAA0B,EAAA;IAEpB,IAAA,EAAA,GAAgBD,cAAQ,CAAC,EAAY,CAAC,EAArC,GAAG,GAAA,EAAA,CAAA,CAAA,CAAA,EAAE,MAAM,GAAA,EAAA,CAAA,CAAA,CAA0B,CAAC;AAC7C,IAAAC,eAAS,CAAC,YAAA;QACR,IAAI,QAAQ,IAAI,KAAK,EAAE;AACf,YAAA,IAAA,EAAuB,GAAA,gBAAgB,CAAC,IAAI,EAAE,QAAQ,EAAE,MAAM,CAAC,EAA9D,eAAa,GAAA,EAAA,CAAA,CAAA,CAAA,EAAE,KAAG,QAA4C,CAAC;YACtE,eAAa,CAAC,MAAM,EAAE,CAAC;YACvB,OAAO,YAAA;gBACL,MAAM,CAAC,EAAE,KAAK,EAAE,SAAS,EAAE,KAAK,EAAE,SAAS,EAAE,CAAC,CAAC;gBAC/C,IAAI,CAAA,eAAa,KAAA,IAAA,IAAb,eAAa,KAAA,KAAA,CAAA,GAAA,KAAA,CAAA,GAAb,eAAa,CAAE,OAAO,EAAE,KAAI,CAAC,EAAE;AACjC,oBAAA,WAAW,CAAC,MAAM,CAAC,KAAG,CAAC,CAAC;AACzB,iBAAA;AACH,aAAC,CAAC;AACH,SAAA;AACH,KAAC,EAAE,CAAC,IAAI,EAAE,QAAQ,CAAC,CAAC,CAAC;IACrB,OAAO,CAAC,GAAG,CAAC,KAAK,EAAE,GAAG,CAAC,KAAK,CAAC,CAAC;AAChC,EAAE;AAEW,IAAA,YAAY,GAAG,UAC1B,WAAoC,EACpC,MAAgB,EAAA;IAEV,IAAA,EAAA,GAAgBD,cAAQ,CAAC,EAAY,CAAC,EAArC,GAAG,GAAA,EAAA,CAAA,CAAA,CAAA,EAAE,MAAM,GAAA,EAAA,CAAA,CAAA,CAA0B,CAAC;AAC7C,IAAAC,eAAS,CAAC,YAAA;AACR,QAAA,IAAI,MAAM,EAAE;AACV,YAAA,IAAI,WAAkC,CAAC;AACvC,YAAA,SAAS,CAAC,YAAY;iBACnB,YAAY,CAAC,WAAW,CAAC;iBACzB,IAAI,CAAC,UAAC,MAAM,EAAA;gBACX,WAAS,GAAG,MAAM,CAAC;AACnB,gBAAA,MAAM,CAAC,EAAE,KAAK,EAAE,MAAM,EAAE,CAAC,CAAC;AAC5B,aAAC,CAAC;iBACD,KAAK,CAAC,UAAC,GAAG,EAAA;gBACT,WAAS,GAAG,SAAS,CAAC;AACtB,gBAAA,MAAM,CAAC,EAAE,KAAK,EAAE,GAAG,EAAE,CAAC,CAAC;AACzB,aAAC,CAAC,CAAC;YACL,OAAO,YAAA;gBACL,MAAM,CAAC,EAAE,KAAK,EAAE,SAAS,EAAE,KAAK,EAAE,SAAS,EAAE,CAAC,CAAC;gBAC/C,WAAS,KAAA,IAAA,IAAT,WAAS,KAAA,KAAA,CAAA,GAAA,KAAA,CAAA,GAAT,WAAS,CAAE,SAAS,EAAG,CAAA,OAAO,CAAC,UAAC,KAAK,EAAA;oBACnC,KAAK,CAAC,IAAI,EAAE,CAAC;AACf,iBAAC,CAAC,CAAC;AACL,aAAC,CAAC;AACH,SAAA;AACH,KAAC,EAAE,CAAC,IAAI,CAAC,SAAS,CAAC,WAAW,CAAC,EAAE,MAAM,CAAC,CAAC,CAAC;IAC1C,OAAO,CAAC,GAAG,CAAC,KAAK,EAAE,GAAG,CAAC,KAAK,CAAC,CAAC;AAChC,EAAE;AAEW,IAAA,eAAe,GAAG,UAC7B,WAAuC,EACvC,MAAgB,EAAA;IAEV,IAAA,EAAA,GAAgBD,cAAQ,CAAC,EAAY,CAAC,EAArC,GAAG,GAAA,EAAA,CAAA,CAAA,CAAA,EAAE,MAAM,GAAA,EAAA,CAAA,CAAA,CAA0B,CAAC;AAC7C,IAAAC,eAAS,CAAC,YAAA;AACR,QAAA,IAAI,MAAM,EAAE;AACV,YAAA,IAAI,WAAkC,CAAC;AACvC,YAAA,SAAS,CAAC,YAAY;iBACnB,eAAe,CAAC,WAAW,CAAC;iBAC5B,IAAI,CAAC,UAAC,MAAM,EAAA;gBACX,WAAS,GAAG,MAAM,CAAC;AACnB,gBAAA,MAAM,CAAC,EAAE,KAAK,EAAE,MAAM,EAAE,CAAC,CAAC;AAC5B,aAAC,CAAC;iBACD,KAAK,CAAC,UAAC,GAAG,EAAA;gBACT,WAAS,GAAG,SAAS,CAAC;AACtB,gBAAA,MAAM,CAAC,EAAE,KAAK,EAAE,GAAG,EAAE,CAAC,CAAC;AACzB,aAAC,CAAC,CAAC;YACL,OAAO,YAAA;gBACL,MAAM,CAAC,EAAE,KAAK,EAAE,SAAS,EAAE,KAAK,EAAE,SAAS,EAAE,CAAC,CAAC;gBAC/C,WAAS,KAAA,IAAA,IAAT,WAAS,KAAA,KAAA,CAAA,GAAA,KAAA,CAAA,GAAT,WAAS,CAAE,SAAS,EAAG,CAAA,OAAO,CAAC,UAAC,KAAK,EAAA;oBACnC,KAAK,CAAC,IAAI,EAAE,CAAC;AACf,iBAAC,CAAC,CAAC;AACL,aAAC,CAAC;AACH,SAAA;AACH,KAAC,EAAE,CAAC,IAAI,CAAC,SAAS,CAAC,WAAW,CAAC,EAAE,MAAM,CAAC,CAAC,CAAC;IAC1C,OAAO,CAAC,GAAG,CAAC,KAAK,EAAE,GAAG,CAAC,KAAK,CAAC,CAAC;AAChC;;ACnNYC,8BAOX;AAPD,CAAA,UAAY,YAAY,EAAA;AACtB,IAAA,YAAA,CAAA,KAAA,CAAA,GAAA,KAAW,CAAA;AACX,IAAA,YAAA,CAAA,YAAA,CAAA,GAAA,YAAyB,CAAA;AACzB,IAAA,YAAA,CAAA,WAAA,CAAA,GAAA,WAAuB,CAAA;AACvB,IAAA,YAAA,CAAA,cAAA,CAAA,GAAA,cAA6B,CAAA;AAC7B,IAAA,YAAA,CAAA,cAAA,CAAA,GAAA,cAA6B,CAAA;AAC7B,IAAA,YAAA,CAAA,OAAA,CAAA,GAAA,OAAe,CAAA;AACjB,CAAC,EAPWA,oBAAY,KAAZA,oBAAY,GAOvB,EAAA,CAAA,CAAA,CAAA;AAED,IAAA,mBAAA,kBAAA,YAAA;AACE,IAAA,SAAA,mBAAA,CAAoB,SAAgC,EAAA;QAAhC,IAAS,CAAA,SAAA,GAAT,SAAS,CAAuB;KAAI;AAExD,IAAA,MAAA,CAAA,cAAA,CAAI,mBAAK,CAAA,SAAA,EAAA,OAAA,EAAA;AAAT,QAAA,GAAA,EAAA,YAAA;AACE,YAAA,OAAO,IAAI,CAAC,SAAS,CAAC,KAAK,CAAC;SAC7B;;;AAAA,KAAA,CAAA,CAAA;AAED,IAAA,MAAA,CAAA,cAAA,CAAI,mBAAW,CAAA,SAAA,EAAA,aAAA,EAAA;AAAf,QAAA,GAAA,EAAA,YAAA;AACE,YAAA,OAAO,IAAI,CAAC,SAAS,CAAC,WAAW,CAAC;SACnC;;;AAAA,KAAA,CAAA,CAAA;AAED,IAAA,mBAAA,CAAA,SAAA,CAAA,EAAE,GAAF,UAAG,IAA+B,EAAE,QAAqB,EAAA;QACvD,IAAI,CAAC,SAAS,CAAC,EAAE,CAAC,IAAI,EAAE,QAAQ,CAAC,CAAC;KACnC,CAAA;AAED,IAAA,mBAAA,CAAA,SAAA,CAAA,GAAG,GAAH,UAAI,IAA+B,EAAE,QAAqB,EAAA;QACxD,IAAI,CAAC,SAAS,CAAC,EAAE,CAAC,IAAI,EAAE,QAAQ,CAAC,CAAC;KACnC,CAAA;IAED,mBAAY,CAAA,SAAA,CAAA,YAAA,GAAZ,UAAa,MAA0B,EAAA;AACrC,QAAA,IAAI,MAAM,EAAE;;AAEV,YAAA,IAAM,SAAS,GAAG,MAAM,CAAC,SAAS,CAAC;AACnC,YAAA,IAAI,SAAS,EAAE;gBACb,YAAY,CAAC,SAAS,CAAC,CAAC;AACzB,aAAA;AACF,SAAA;AACD,QAAA,IAAI,IAAI,CAAC,SAAS,CAAC,WAAW,EAAE;;YAE9B,IAAM,QAAQ,GAAG,IAAI,CAAC,SAAS,CAAC,WAAW,CAAC,SAAS,CAAC;AACtD,YAAA,IAAI,QAAQ,EAAE;gBACZ,aAAa,CAAC,QAAQ,CAAC,CAAC;AACzB,aAAA;AACF,SAAA;QACD,OAAO,IAAI,CAAC,SAAS,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC;KACtC,CAAA;IACH,OAAC,mBAAA,CAAA;AAAD,CAAC,EAAA,EAAA;AAqCY,IAAA,cAAc,GAAG,KAAK,CAAC,aAAa,CAAC,EAAwB,EAAE;AAS5E,IAAI,SAAS,GAAG,CAAC,CAAC;AAEX,IAAM,eAAe,GAAG,UAAC,KAAY,EAAA;;;;IAIpC,IAAA,EAAA,GAAaF,cAAQ,CAAC,CAAC,CAAC,EAArB,MAAM,QAAe,CAAC;IAC/B,IAAM,OAAO,GAAGG,aAAO,CAAyC,YAAA;AAC9D,QAAA,OAAO,EAAE,IAAI,EAAE,SAAS,EAAE,CAAC;KAC5B,EAAE,EAAE,CAAC,CAAC;AACP,IAAA,IAAM,MAAM,GAAGC,iBAAW,CACxB,UAAC,IAAkC,EAAA;AACjC,QAAA,OAAO,CAAC,IAAI,GAAG,IAAI,CAAC;AACpB,QAAA,MAAM,CAAC,SAAS,EAAE,CAAC,CAAC;AACtB,KAAC,EACD,CAAC,OAAO,EAAE,MAAM,CAAC,CAClB,CAAC;AACF,IAAA,IAAM,OAAO,GAAGA,iBAAW,CACzB,UAAC,GAAW,EAAE,MAA4B,EAAA;;AACxC,QAAA,IAAI,MAAA,OAAO,CAAC,IAAI,MAAA,IAAA,IAAA,EAAA,KAAA,KAAA,CAAA,GAAA,KAAA,CAAA,GAAA,EAAA,CAAE,OAAO,EAAE;YACzB,OAAO,YAAA;;gBACL,CAAA,EAAA,GAAA,OAAO,CAAC,IAAI,MAAA,IAAA,IAAA,EAAA,KAAA,KAAA,CAAA,GAAA,KAAA,CAAA,GAAA,EAAA,CAAE,OAAO,CAAC,UAAU,EAAE,CAAC;AACrC,aAAC,CAAC;AACH,SAAA;QACD,IAAM,OAAO,GAAG,KAAK,CAAC,aAAa,CAAC,GAAG,EAAE,MAAM,CAAC,CAAC;AACjD,QAAA,IAAM,cAAc,GAAG,IAAI,GAAG,EAA8B,CAAC;AAC7D,QAAA,IAAM,cAAc,GAAG,IAAI,GAAG,EAA8B,CAAC;AAC7D,QAAA,IAAM,YAAY,GAAG,IAAI,GAAG,EAA8B,CAAC;AAC3D,QAAA,IAAM,YAAY,GAAG,IAAI,GAAG,EAA8B,CAAC;AAE3D,QAAA,IAAM,UAAU,GAAmD,IAAI,GAAG,EAAE,CAAC;AAC7E,QAAA,IAAM,SAAS,GAAoD,IAAI,GAAG,EAAE,CAAC;AAC7E,QAAA,IAAM,aAAa,GAAwD,IAAI,GAAG,EAAE,CAAC;QAErF,CAAA,EAAA,GAAA,MAAM,KAAN,IAAA,IAAA,MAAM,KAAN,KAAA,CAAA,GAAA,KAAA,CAAA,GAAA,MAAM,CAAE,OAAO,MAAE,IAAA,IAAA,EAAA,KAAA,KAAA,CAAA,GAAA,KAAA,CAAA,GAAA,EAAA,CAAA,GAAG,CAAC,UAAC,MAAM,EAAA;YAC1B,IAAI,MAAM,CAAC,MAAM,EAAE;;AAEjB,gBAAA,IAAM,SAAS,GAAG,MAAM,CAAC,MAAM,CAAC,SAAS,CAAC;AAC1C,gBAAA,IAAI,SAAS,EAAE;oBACb,YAAY,CAAC,SAAS,CAAC,CAAC;AACzB,iBAAA;AACF,aAAA;AACH,SAAC,CAAC,CAAC;AAEH,QAAA,OAAO,CAAC,EAAE,CAAC,WAAW,EAAE,YAAA;;YACtB,IAAI,CAAA,MAAA,OAAO,CAAC,IAAI,MAAE,IAAA,IAAA,EAAA,KAAA,KAAA,CAAA,GAAA,KAAA,CAAA,GAAA,EAAA,CAAA,OAAO,KAAI,OAAO;gBAAE,OAAO;AAC7C,YAAA,MAAM,CAAC;AACL,gBAAA,OAAO,EAAA,OAAA;gBACP,KAAK,EAAEF,oBAAY,CAAC,SAAS;gBAC7B,cAAc,EAAE,KAAK,CAAC,IAAI,CAAC,cAAc,CAAC,MAAM,EAAE,CAAC;gBACnD,cAAc,EAAE,KAAK,CAAC,IAAI,CAAC,cAAc,CAAC,MAAM,EAAE,CAAC;gBACnD,YAAY,EAAE,KAAK,CAAC,IAAI,CAAC,YAAY,CAAC,MAAM,EAAE,CAAC;gBAC/C,YAAY,EAAE,KAAK,CAAC,IAAI,CAAC,YAAY,CAAC,MAAM,EAAE,CAAC;AAC/C,gBAAA,UAAU,EAAA,UAAA;AACV,gBAAA,SAAS,EAAA,SAAA;AACT,gBAAA,aAAa,EAAA,aAAA;AACd,aAAA,CAAC,CAAC;AACL,SAAC,CAAC,CAAC;AAEH,QAAA,OAAO,CAAC,EAAE,CAAC,gBAAgB,EAAE,UAAC,MAA0B,EAAA;;YACtD,IAAI,CAAA,MAAA,OAAO,CAAC,IAAI,MAAE,IAAA,IAAA,EAAA,KAAA,KAAA,CAAA,GAAA,KAAA,CAAA,GAAA,EAAA,CAAA,OAAO,KAAI,OAAO;gBAAE,OAAO;YAC7C,IAAM,GAAG,GAAG,MAAM,CAAC,MAAM,GAAG,GAAG,GAAG,MAAM,CAAC,IAAI,CAAC;YAC9C,IAAI,MAAM,CAAC,IAAI,KAAK,KAAK,CAAC,WAAW,CAAC,KAAK,EAAE;AAC3C,gBAAA,cAAc,CAAC,GAAG,CAAC,GAAG,EAAE,MAAM,CAAC,CAAC;AACjC,aAAA;AAAM,iBAAA;AACL,gBAAA,cAAc,CAAC,GAAG,CAAC,GAAG,EAAE,MAAM,CAAC,CAAC;AACjC,aAAA;AACD,YAAA,MAAM,CAAC;AACL,gBAAA,OAAO,EAAA,OAAA;gBACP,KAAK,EAAEA,oBAAY,CAAC,SAAS;gBAC7B,cAAc,EAAE,KAAK,CAAC,IAAI,CAAC,cAAc,CAAC,MAAM,EAAE,CAAC;gBACnD,cAAc,EAAE,KAAK,CAAC,IAAI,CAAC,cAAc,CAAC,MAAM,EAAE,CAAC;gBACnD,YAAY,EAAE,KAAK,CAAC,IAAI,CAAC,YAAY,CAAC,MAAM,EAAE,CAAC;gBAC/C,YAAY,EAAE,KAAK,CAAC,IAAI,CAAC,YAAY,CAAC,MAAM,EAAE,CAAC;AAC/C,gBAAA,UAAU,EAAA,UAAA;AACV,gBAAA,SAAS,EAAA,SAAA;AACT,gBAAA,aAAa,EAAA,aAAA;AACd,aAAA,CAAC,CAAC;AACL,SAAC,CAAC,CAAC;AAEH,QAAA,OAAO,CAAC,EAAE,CAAC,kBAAkB,EAAE,UAAC,MAA0B,EAAA;;YACxD,IAAI,CAAA,MAAA,OAAO,CAAC,IAAI,MAAE,IAAA,IAAA,EAAA,KAAA,KAAA,CAAA,GAAA,KAAA,CAAA,GAAA,EAAA,CAAA,OAAO,KAAI,OAAO;gBAAE,OAAO;YAC7C,IAAM,GAAG,GAAG,MAAM,CAAC,MAAM,GAAG,GAAG,GAAG,MAAM,CAAC,IAAI,CAAC;YAC9C,IAAI,MAAM,CAAC,IAAI,KAAK,KAAK,CAAC,WAAW,CAAC,KAAK,EAAE;AAC3C,gBAAA,cAAc,CAAC,GAAG,CAAC,GAAG,EAAE,MAAM,CAAC,CAAC;AACjC,aAAA;AAAM,iBAAA;AACL,gBAAA,cAAc,CAAC,GAAG,CAAC,GAAG,EAAE,MAAM,CAAC,CAAC;AACjC,aAAA;AACD,YAAA,MAAM,CAAC;AACL,gBAAA,OAAO,EAAA,OAAA;gBACP,KAAK,EAAEA,oBAAY,CAAC,SAAS;gBAC7B,cAAc,EAAE,KAAK,CAAC,IAAI,CAAC,cAAc,CAAC,MAAM,EAAE,CAAC;gBACnD,cAAc,EAAE,KAAK,CAAC,IAAI,CAAC,cAAc,CAAC,MAAM,EAAE,CAAC;gBACnD,YAAY,EAAE,KAAK,CAAC,IAAI,CAAC,YAAY,CAAC,MAAM,EAAE,CAAC;gBAC/C,YAAY,EAAE,KAAK,CAAC,IAAI,CAAC,YAAY,CAAC,MAAM,EAAE,CAAC;AAC/C,gBAAA,UAAU,EAAA,UAAA;AACV,gBAAA,SAAS,EAAA,SAAA;AACT,gBAAA,aAAa,EAAA,aAAA;AACd,aAAA,CAAC,CAAC;AACL,SAAC,CAAC,CAAC;AAEH,QAAA,OAAO,CAAC,EAAE,CAAC,kBAAkB,EAAE,UAAC,MAA0B,EAAA;;YACxD,IAAI,CAAA,MAAA,OAAO,CAAC,IAAI,MAAE,IAAA,IAAA,EAAA,KAAA,KAAA,CAAA,GAAA,KAAA,CAAA,GAAA,EAAA,CAAA,OAAO,KAAI,OAAO;gBAAE,OAAO;YAC7C,IAAM,GAAG,GAAG,MAAM,CAAC,MAAM,GAAG,GAAG,GAAG,MAAM,CAAC,IAAI,CAAC;YAC9C,IAAI,MAAM,CAAC,IAAI,KAAK,KAAK,CAAC,WAAW,CAAC,KAAK,EAAE;AAC3C,gBAAA,cAAc,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC;AAC5B,aAAA;AAAM,iBAAA;AACL,gBAAA,cAAc,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC;AAC5B,aAAA;AACD,YAAA,MAAM,CAAC;AACL,gBAAA,OAAO,EAAA,OAAA;gBACP,KAAK,EAAEA,oBAAY,CAAC,SAAS;gBAC7B,cAAc,EAAE,KAAK,CAAC,IAAI,CAAC,cAAc,CAAC,MAAM,EAAE,CAAC;gBACnD,cAAc,EAAE,KAAK,CAAC,IAAI,CAAC,cAAc,CAAC,MAAM,EAAE,CAAC;gBACnD,YAAY,EAAE,KAAK,CAAC,IAAI,CAAC,YAAY,CAAC,MAAM,EAAE,CAAC;gBAC/C,YAAY,EAAE,KAAK,CAAC,IAAI,CAAC,YAAY,CAAC,MAAM,EAAE,CAAC;AAC/C,gBAAA,UAAU,EAAA,UAAA;AACV,gBAAA,SAAS,EAAA,SAAA;AACT,gBAAA,aAAa,EAAA,aAAA;AACd,aAAA,CAAC,CAAC;AACL,SAAC,CAAC,CAAC;AAEH,QAAA,OAAO,CAAC,EAAE,CAAC,cAAc,EAAE,UAAC,MAA0B,EAAA;;YACpD,IAAI,CAAA,MAAA,OAAO,CAAC,IAAI,MAAE,IAAA,IAAA,EAAA,KAAA,KAAA,CAAA,GAAA,KAAA,CAAA,GAAA,EAAA,CAAA,OAAO,KAAI,OAAO;gBAAE,OAAO;YAC7C,IAAM,GAAG,GAAG,MAAM,CAAC,MAAM,GAAG,GAAG,GAAG,MAAM,CAAC,IAAI,CAAC;YAC9C,IAAI,MAAM,CAAC,IAAI,KAAK,KAAK,CAAC,WAAW,CAAC,KAAK,EAAE;AAC3C,gBAAA,YAAY,CAAC,GAAG,CAAC,GAAG,EAAE,MAAM,CAAC,CAAC;AAC/B,aAAA;AAAM,iBAAA;AACL,gBAAA,YAAY,CAAC,GAAG,CAAC,GAAG,EAAE,MAAM,CAAC,CAAC;AAC/B,aAAA;AACD,YAAA,MAAM,CAAC;AACL,gBAAA,OAAO,EAAA,OAAA;gBACP,KAAK,EAAEA,oBAAY,CAAC,SAAS;gBAC7B,cAAc,EAAE,KAAK,CAAC,IAAI,CAAC,cAAc,CAAC,MAAM,EAAE,CAAC;gBACnD,cAAc,EAAE,KAAK,CAAC,IAAI,CAAC,cAAc,CAAC,MAAM,EAAE,CAAC;gBACnD,YAAY,EAAE,KAAK,CAAC,IAAI,CAAC,YAAY,CAAC,MAAM,EAAE,CAAC;gBAC/C,YAAY,EAAE,KAAK,CAAC,IAAI,CAAC,YAAY,CAAC,MAAM,EAAE,CAAC;AAC/C,gBAAA,UAAU,EAAA,UAAA;AACV,gBAAA,SAAS,EAAA,SAAA;AACT,gBAAA,aAAa,EAAE,aAAa;AAC7B,aAAA,CAAC,CAAC;AACL,SAAC,CAAC,CAAC;AAEH,QAAA,OAAO,CAAC,EAAE,CAAC,gBAAgB,EAAE,UAAC,MAA0B,EAAA;;YACtD,IAAI,CAAA,MAAA,OAAO,CAAC,IAAI,MAAE,IAAA,IAAA,EAAA,KAAA,KAAA,CAAA,GAAA,KAAA,CAAA,GAAA,EAAA,CAAA,OAAO,KAAI,OAAO;gBAAE,OAAO;YAC7C,IAAM,GAAG,GAAG,MAAM,CAAC,MAAM,GAAG,GAAG,GAAG,MAAM,CAAC,IAAI,CAAC;YAC9C,IAAI,MAAM,CAAC,IAAI,KAAK,KAAK,CAAC,WAAW,CAAC,KAAK,EAAE;AAC3C,gBAAA,YAAY,CAAC,GAAG,CAAC,GAAG,EAAE,MAAM,CAAC,CAAC;AAC/B,aAAA;AAAM,iBAAA;AACL,gBAAA,YAAY,CAAC,GAAG,CAAC,GAAG,EAAE,MAAM,CAAC,CAAC;AAC/B,aAAA;AACD,YAAA,MAAM,CAAC;AACL,gBAAA,OAAO,EAAA,OAAA;gBACP,KAAK,EAAEA,oBAAY,CAAC,SAAS;gBAC7B,cAAc,EAAE,KAAK,CAAC,IAAI,CAAC,cAAc,CAAC,MAAM,EAAE,CAAC;gBACnD,cAAc,EAAE,KAAK,CAAC,IAAI,CAAC,cAAc,CAAC,MAAM,EAAE,CAAC;gBACnD,YAAY,EAAE,KAAK,CAAC,IAAI,CAAC,YAAY,CAAC,MAAM,EAAE,CAAC;gBAC/C,YAAY,EAAE,KAAK,CAAC,IAAI,CAAC,YAAY,CAAC,MAAM,EAAE,CAAC;AAC/C,gBAAA,UAAU,EAAA,UAAA;AACV,gBAAA,SAAS,EAAA,SAAA;AACT,gBAAA,aAAa,EAAA,aAAA;AACd,aAAA,CAAC,CAAC;AACL,SAAC,CAAC,CAAC;AAEH,QAAA,OAAO,CAAC,EAAE,CAAC,gBAAgB,EAAE,UAAC,MAA0B,EAAA;;YACtD,IAAI,CAAA,MAAA,OAAO,CAAC,IAAI,MAAE,IAAA,IAAA,EAAA,KAAA,KAAA,CAAA,GAAA,KAAA,CAAA,GAAA,EAAA,CAAA,OAAO,KAAI,OAAO;gBAAE,OAAO;YAC7C,IAAM,GAAG,GAAG,MAAM,CAAC,MAAM,GAAG,GAAG,GAAG,MAAM,CAAC,IAAI,CAAC;YAC9C,IAAI,MAAM,CAAC,IAAI,KAAK,KAAK,CAAC,WAAW,CAAC,KAAK,EAAE;AAC3C,gBAAA,YAAY,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC;AAC1B,aAAA;AAAM,iBAAA;AACL,gBAAA,YAAY,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC;AAC1B,aAAA;AACD,YAAA,MAAM,CAAC;AACL,gBAAA,OAAO,EAAA,OAAA;gBACP,KAAK,EAAEA,oBAAY,CAAC,SAAS;gBAC7B,cAAc,EAAE,KAAK,CAAC,IAAI,CAAC,cAAc,CAAC,MAAM,EAAE,CAAC;gBACnD,cAAc,EAAE,KAAK,CAAC,IAAI,CAAC,cAAc,CAAC,MAAM,EAAE,CAAC;gBACnD,YAAY,EAAE,KAAK,CAAC,IAAI,CAAC,YAAY,CAAC,MAAM,EAAE,CAAC;gBAC/C,YAAY,EAAE,KAAK,CAAC,IAAI,CAAC,YAAY,CAAC,MAAM,EAAE,CAAC;AAC/C,gBAAA,UAAU,EAAA,UAAA;AACV,gBAAA,SAAS,EAAA,SAAA;AACT,gBAAA,aAAa,EAAA,aAAA;AACd,aAAA,CAAC,CAAC;AACL,SAAC,CAAC,CAAC;AAEH,QAAA,OAAO,CAAC,EAAE,CAAC,cAAc,EAAE,YAAA;;YACzB,IAAI,CAAA,MAAA,OAAO,CAAC,IAAI,MAAE,IAAA,IAAA,EAAA,KAAA,KAAA,CAAA,GAAA,KAAA,CAAA,GAAA,EAAA,CAAA,OAAO,KAAI,OAAO;gBAAE,OAAO;AAC7C,YAAA,MAAM,CAAC;AACL,gBAAA,OAAO,EAAA,OAAA;gBACP,KAAK,EAAEA,oBAAY,CAAC,YAAY;gBAChC,cAAc,EAAE,KAAK,CAAC,IAAI,CAAC,cAAc,CAAC,MAAM,EAAE,CAAC;gBACnD,cAAc,EAAE,KAAK,CAAC,IAAI,CAAC,cAAc,CAAC,MAAM,EAAE,CAAC;gBACnD,YAAY,EAAE,KAAK,CAAC,IAAI,CAAC,YAAY,CAAC,MAAM,EAAE,CAAC;gBAC/C,YAAY,EAAE,KAAK,CAAC,IAAI,CAAC,YAAY,CAAC,MAAM,EAAE,CAAC;AAC/C,gBAAA,UAAU,EAAA,UAAA;AACV,gBAAA,SAAS,EAAA,SAAA;AACT,gBAAA,aAAa,EAAA,aAAA;AACd,aAAA,CAAC,CAAC;AACL,SAAC,CAAC,CAAC;AACH,QAAA,OAAO,CAAC,OAAO,EAAE,CAAC,KAAK,CAAC,UAAC,GAAG,EAAA;;YAC1B,IAAI,CAAA,MAAA,OAAO,CAAC,IAAI,MAAE,IAAA,IAAA,EAAA,KAAA,KAAA,CAAA,GAAA,KAAA,CAAA,GAAA,EAAA,CAAA,OAAO,KAAI,OAAO;gBAAE,OAAO;AAC7C,YAAA,OAAO,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC;AACnB,YAAA,MAAM,CAAC;AACL,gBAAA,OAAO,EAAA,OAAA;gBACP,KAAK,EAAEA,oBAAY,CAAC,KAAK;gBACzB,cAAc,EAAE,KAAK,CAAC,IAAI,CAAC,cAAc,CAAC,MAAM,EAAE,CAAC;gBACnD,cAAc,EAAE,KAAK,CAAC,IAAI,CAAC,cAAc,CAAC,MAAM,EAAE,CAAC;gBACnD,YAAY,EAAE,KAAK,CAAC,IAAI,CAAC,YAAY,CAAC,MAAM,EAAE,CAAC;gBAC/C,YAAY,EAAE,KAAK,CAAC,IAAI,CAAC,YAAY,CAAC,MAAM,EAAE,CAAC;AAC/C,gBAAA,UAAU,EAAA,UAAA;AACV,gBAAA,SAAS,EAAA,SAAA;AACT,gBAAA,aAAa,EAAA,aAAA;AACd,aAAA,CAAC,CAAC;AACL,SAAC,CAAC,CAAC;AACH,QAAA,MAAM,CAAC;AACL,YAAA,OAAO,EAAA,OAAA;YACP,KAAK,EAAEA,oBAAY,CAAC,UAAU;AAC9B,YAAA,cAAc,EAAE,EAAE;AAClB,YAAA,cAAc,EAAE,EAAE;AAClB,YAAA,YAAY,EAAE,EAAE;AAChB,YAAA,YAAY,EAAE,EAAE;AAChB,YAAA,UAAU,EAAA,UAAA;AACV,YAAA,SAAS,EAAA,SAAA;AACT,YAAA,aAAa,EAAA,aAAA;AACd,SAAA,CAAC,CAAC;QACH,OAAO;AACT,KAAC,EACD,CAAC,OAAO,EAAE,MAAM,CAAC,CAClB,CAAC;IAEF,IAAM,UAAU,GAAGE,iBAAW,CAAC,YAAA;;AAC7B,QAAA,IAAI,MAAA,OAAO,CAAC,IAAI,MAAA,IAAA,IAAA,EAAA,KAAA,KAAA,CAAA,GAAA,KAAA,CAAA,GAAA,EAAA,CAAE,OAAO,EAAE;AACzB,YAAA,OAAO,CAAC,IAAI,CAAC,OAAO,CAAC,UAAU,EAAE,CAAC;YAClC,MAAM,CAAC,SAAS,CAAC,CAAC;AACnB,SAAA;AACH,KAAC,EAAE,CAAC,OAAO,EAAE,MAAM,CAAC,CAAC,CAAC;AAEtB,IAAA,IAAM,YAAY,GAAGA,iBAAW,CAC9B,UAAC,OAAe,EAAE,GAAuB,EAAA;;AACvC,QAAA,IAAM,IAAI,GAAG,OAAO,CAAC,IAAI,CAAC;AAC1B,QAAA,IAAI,IAAI,KAAJ,IAAA,IAAA,IAAI,uBAAJ,IAAI,CAAE,OAAO,EAAE;AACjB,YAAA,IAAI,SAAS,GAAG,IAAI,CAAC,UAAU,CAAC,GAAG,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC;YAC9C,IAAI,CAAC,SAAS,EAAE;AACd,gBAAA,SAAS,GAAG;oBACV,IAAI,EAAE,IAAI,mBAAmB,CAC3B,IAAI,CAAC,OAAO,CAAC,eAAe,CAAC;wBAC3B,MAAM,EAAE,GAAG,CAAC,MAAM;wBAClB,IAAI,EAAE,GAAG,CAAC,IAAI;wBACd,IAAI,EAAE,GAAG,CAAC,IAAI;wBACd,eAAe,EAAE,GAAG,CAAC,eAAe;wBACpC,SAAS,EAAE,GAAG,CAAC,SAAS;wBACxB,UAAU,EAAE,GAAG,CAAC,UAAU;wBAC1B,WAAW,EAAE,GAAG,CAAC,WAAW;wBAC5B,MAAM,EAAE,GAAG,CAAC,MAAM;AACnB,qBAAA,CAAC,CACH;oBACD,MAAM,EAAE,IAAI,GAAG,EAAE;iBAClB,CAAC;gBACF,IAAI,CAAC,UAAU,CAAC,GAAG,CAAC,GAAG,CAAC,IAAI,EAAE,SAAS,CAAC,CAAC;AAC1C,aAAA;YACD,CAAA,EAAA,GAAA,IAAI,CAAC,UAAU,CAAC,GAAG,CAAC,GAAG,CAAC,IAAI,CAAC,MAAE,IAAA,IAAA,EAAA,KAAA,KAAA,CAAA,GAAA,KAAA,CAAA,GAAA,EAAA,CAAA,MAAM,CAAC,GAAG,CAAC,OAAO,EAAE,IAAI,IAAI,EAAE,CAAC,OAAO,EAAE,CAAC,CAAC;YACzE,OAAO,SAAS,CAAC,IAAI,CAAC;AACvB,SAAA;AACD,QAAA,OAAO,SAAS,CAAC;AACnB,KAAC,EACD,CAAC,OAAO,CAAC,CACV,CAAC;AAEF,IAAA,IAAM,aAAa,GAAGA,iBAAW,CAC/B,UAAC,OAAe,EAAE,GAAuB,EAAA;AACvC,QAAA,IAAM,IAAI,GAAG,OAAO,CAAC,IAAI,CAAC;AAC1B,QAAA,IAAI,IAAI,KAAJ,IAAA,IAAA,IAAI,uBAAJ,IAAI,CAAE,OAAO,EAAE;AACjB,YAAA,IAAM,SAAS,GAAG,IAAI,CAAC,UAAU,CAAC,GAAG,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC;AAChD,YAAA,IAAI,SAAS,EAAE;AACb,gBAAA,SAAS,CAAC,MAAM,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC;AACjC,gBAAA,IAAI,SAAS,CAAC,MAAM,CAAC,IAAI,IAAI,CAAC,EAAE;AAC9B,oBAAA,SAAS,CAAC,IAAI,CAAC,YAAY,CAAC,IAAI,CAAC,CAAC;oBAClC,IAAI,CAAC,UAAU,CAAC,MAAM,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC;AAClC,iBAAA;AACF,aAAA;AACF,SAAA;AACD,QAAA,OAAO,SAAS,CAAC;AACnB,KAAC,EACD,CAAC,OAAO,CAAC,CACV,CAAC;AAEF,IAAA,IAAM,WAAW,GAAGA,iBAAW,CAC7B,UAAC,OAAe,EAAE,MAA0B,EAAA;;AAC1C,QAAA,IAAM,IAAI,GAAG,OAAO,CAAC,IAAI,CAAC;AAC1B,QAAA,IAAI,IAAI,KAAJ,IAAA,IAAA,IAAI,uBAAJ,IAAI,CAAE,OAAO,EAAE;YACjB,IAAM,GAAG,GAAG,MAAM,CAAC,MAAM,GAAG,GAAG,GAAG,MAAM,CAAC,IAAI,CAAC;YAC9C,IAAI,QAAQ,GAAG,IAAI,CAAC,SAAS,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC;YACvC,IAAI,CAAC,QAAQ,EAAE;AACb,gBAAA,QAAQ,GAAG;oBACT,IAAI,EAAE,IAAI,CAAC,OAAO,CAAC,cAAc,CAAC,MAAM,CAAC;oBACzC,MAAM,EAAE,IAAI,GAAG,EAAE;iBAClB,CAAC;gBACF,IAAI,CAAC,SAAS,CAAC,GAAG,CAAC,GAAG,EAAE,QAAQ,CAAC,CAAC;AACnC,aAAA;YACD,CAAA,EAAA,GAAA,IAAI,CAAC,SAAS,CAAC,GAAG,CAAC,GAAG,CAAC,MAAA,IAAA,IAAA,EAAA,KAAA,KAAA,CAAA,GAAA,KAAA,CAAA,GAAA,EAAA,CAAE,MAAM,CAAC,GAAG,CAAC,OAAO,EAAE,IAAI,IAAI,EAAE,CAAC,OAAO,EAAE,CAAC,CAAC;YACnE,OAAO,QAAQ,CAAC,IAAI,CAAC;AACtB,SAAA;AACD,QAAA,OAAO,SAAS,CAAC;AACnB,KAAC,EACD,CAAC,OAAO,CAAC,CACV,CAAC;AAEF,IAAA,IAAM,YAAY,GAAGA,iBAAW,CAC9B,UAAC,OAAe,EAAE,MAA0B,EAAA;AAC1C,QAAA,IAAM,IAAI,GAAG,OAAO,CAAC,IAAI,CAAC;AAC1B,QAAA,IAAI,IAAI,KAAJ,IAAA,IAAA,IAAI,uBAAJ,IAAI,CAAE,OAAO,EAAE;YACjB,IAAM,GAAG,GAAG,MAAM,CAAC,MAAM,GAAG,GAAG,GAAG,MAAM,CAAC,IAAI,CAAC;YAC9C,IAAM,QAAQ,GAAG,IAAI,CAAC,SAAS,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC;AACzC,YAAA,IAAI,QAAQ,EAAE;AACZ,gBAAA,QAAQ,CAAC,MAAM,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC;AAChC,gBAAA,IAAI,QAAQ,CAAC,MAAM,CAAC,IAAI,IAAI,CAAC,EAAE;AAC7B,oBAAA,IAAI,CAAC,SAAS,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC;AAC5B,iBAAA;AACF,aAAA;AACF,SAAA;AACD,QAAA,OAAO,SAAS,CAAC;AACnB,KAAC,EACD,CAAC,OAAO,CAAC,CACV,CAAC;IAEF,IAAM,eAAe,GAAGA,iBAAW,CACjC,UAAC,OAAe,EAAE,MAAc,EAAE,SAAiB,EAAE,SAAiB,EAAA;;AACpE,QAAA,IAAM,IAAI,GAAG,OAAO,CAAC,IAAI,CAAC;AAC1B,QAAA,IAAI,IAAI,KAAJ,IAAA,IAAA,IAAI,uBAAJ,IAAI,CAAE,OAAO,EAAE;YACjB,IAAM,GAAG,GAAG,MAAM,GAAG,GAAG,GAAG,SAAS,GAAG,GAAG,GAAG,SAAS,CAAC;YACvD,IAAI,QAAQ,GAAG,IAAI,CAAC,aAAa,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC;YAC3C,IAAI,CAAC,QAAQ,EAAE;AACb,gBAAA,QAAQ,GAAG;AACT,oBAAA,IAAI,EAAE,IAAI,CAAC,OAAO,CAAC,kBAAkB,CAAC,MAAM,EAAE,SAAS,EAAE,SAAS,CAAC;oBACnE,MAAM,EAAE,IAAI,GAAG,EAAE;iBAClB,CAAC;gBACF,IAAI,CAAC,aAAa,CAAC,GAAG,CAAC,GAAG,EAAE,QAAQ,CAAC,CAAC;AACvC,aAAA;YACD,CAAA,EAAA,GAAA,IAAI,CAAC,aAAa,CAAC,GAAG,CAAC,GAAG,CAAC,MAAA,IAAA,IAAA,EAAA,KAAA,KAAA,CAAA,GAAA,KAAA,CAAA,GAAA,EAAA,CAAE,MAAM,CAAC,GAAG,CAAC,OAAO,EAAE,IAAI,IAAI,EAAE,CAAC,OAAO,EAAE,CAAC,CAAC;YACvE,OAAO,QAAQ,CAAC,IAAI,CAAC;AACtB,SAAA;AACD,QAAA,OAAO,SAAS,CAAC;AACnB,KAAC,EACD,CAAC,OAAO,CAAC,CACV,CAAC;IAEF,IAAM,gBAAgB,GAAGA,iBAAW,CAClC,UAAC,OAAe,EAAE,MAAc,EAAE,SAAiB,EAAE,SAAiB,EAAA;AACpE,QAAA,IAAM,IAAI,GAAG,OAAO,CAAC,IAAI,CAAC;AAC1B,QAAA,IAAI,IAAI,KAAJ,IAAA,IAAA,IAAI,uBAAJ,IAAI,CAAE,OAAO,EAAE;YACjB,IAAM,GAAG,GAAG,MAAM,GAAG,GAAG,GAAG,SAAS,GAAG,GAAG,GAAG,SAAS,CAAC;YACvD,IAAM,QAAQ,GAAG,IAAI,CAAC,aAAa,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC;AAC7C,YAAA,IAAI,QAAQ,EAAE;AACZ,gBAAA,QAAQ,CAAC,MAAM,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC;AAChC,gBAAA,IAAI,QAAQ,CAAC,MAAM,CAAC,IAAI,IAAI,CAAC,EAAE;AAC7B,oBAAA,IAAI,CAAC,aAAa,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC;AAChC,iBAAA;AACF,aAAA;AACF,SAAA;AACD,QAAA,OAAO,SAAS,CAAC;AACnB,KAAC,EACD,CAAC,OAAO,CAAC,CACV,CAAC;IAEF,KAAK,CAAC,SAAS,CAAC,YAAA;AACd,QAAA,IAAI,KAAK,CAAC,GAAG,IAAI,KAAK,CAAC,MAAM,EAAE;YAC7B,OAAO,CAAC,KAAK,CAAC,GAAG,EAAE,KAAK,CAAC,MAAM,CAAC,CAAC;YACjC,OAAO,YAAA;AACL,gBAAA,UAAU,EAAE,CAAC;AACf,aAAC,CAAC;AACH,SAAA;AACH,KAAC,EAAE,CAAC,KAAK,CAAC,GAAG,EAAE,KAAK,CAAC,MAAM,EAAE,OAAO,EAAE,UAAU,CAAC,CAAC,CAAC;AAEnD,IAAA,QACE,KAAC,CAAA,aAAA,CAAA,cAAc,CAAC,QAAQ,EAAA,EACtB,KAAK,EAAE;YACL,IAAI,EAAE,OAAO,CAAC,IAAI;AAClB,YAAA,OAAO,EAAA,OAAA;AACP,YAAA,UAAU,EAAA,UAAA;AACV,YAAA,YAAY,EAAE,YAAY;AAC1B,YAAA,aAAa,EAAE,aAAa;AAC5B,YAAA,WAAW,EAAE,WAAW;AACxB,YAAA,YAAY,EAAE,YAAY;AAC1B,YAAA,eAAe,EAAE,eAAe;AAChC,YAAA,gBAAgB,EAAE,gBAAgB;AAClC,YAAA,MAAM,EAAA,MAAA;AACP,SAAA,EAAA,EACA,KAAK,CAAC,QAAQ,CACS,EAC1B;AACJ;;ACjea,IAAA,gBAAgB,GAAG,UAAC,IAAuB,EAAE,MAAgB,EAAA;AAChE,IAAA,IAAA,IAAI,GAAKC,gBAAU,CAAC,cAAc,CAAC,KAA/B,CAAgC;AAC5C,IAAA,IAAI,IAAI,IAAI,KAAK,CAAC,WAAW,CAAC,KAAK,EAAE;QACnC,IAAI,MAAM,KAAK,IAAI,EAAE;YACnB,OAAO,CAAA,IAAI,KAAA,IAAA,IAAJ,IAAI,KAAA,KAAA,CAAA,GAAA,KAAA,CAAA,GAAJ,IAAI,CAAE,cAAc,KAAI,EAAE,CAAC;AACnC,SAAA;AAAM,aAAA;YACL,OAAO,CAAA,IAAI,KAAA,IAAA,IAAJ,IAAI,KAAA,KAAA,CAAA,GAAA,KAAA,CAAA,GAAJ,IAAI,CAAE,YAAY,KAAI,EAAE,CAAC;AACjC,SAAA;AACF,KAAA;AAAM,SAAA;QACL,IAAI,MAAM,KAAK,IAAI,EAAE;YACnB,OAAO,CAAA,IAAI,KAAA,IAAA,IAAJ,IAAI,KAAA,KAAA,CAAA,GAAA,KAAA,CAAA,GAAJ,IAAI,CAAE,cAAc,KAAI,EAAE,CAAC;AACnC,SAAA;AAAM,aAAA;YACL,OAAO,CAAA,IAAI,KAAA,IAAA,IAAJ,IAAI,KAAA,KAAA,CAAA,GAAA,KAAA,CAAA,GAAJ,IAAI,CAAE,YAAY,KAAI,EAAE,CAAC;AACjC,SAAA;AACF,KAAA;AACH;;ACfa,IAAA,UAAU,GAAG,YAAA;AAChB,IAAA,IAAA,IAAI,GAAKA,gBAAU,CAAC,cAAc,CAAC,KAA/B,CAAgC;AAC5C,IAAA,OAAO,IAAI,KAAJ,IAAA,IAAA,IAAI,uBAAJ,IAAI,CAAE,OAAO,CAAC;AACvB;;ACJa,IAAA,eAAe,GAAG,YAAA;AACrB,IAAA,IAAA,IAAI,GAAKA,gBAAU,CAAC,cAAc,CAAC,KAA/B,CAAgC;AAC5C,IAAA,OAAO,CAAA,IAAI,KAAJ,IAAA,IAAA,IAAI,KAAJ,KAAA,CAAA,GAAA,KAAA,CAAA,GAAA,IAAI,CAAE,KAAK,KAAIH,oBAAY,CAAC,GAAG,CAAC;AACzC;;ACIa,IAAA,UAAU,GAAG,YAAA;IAClB,IAAA,EAAA,GAA0BG,gBAAU,CAAC,cAAc,CAAC,EAAlD,OAAO,GAAA,EAAA,CAAA,OAAA,EAAE,UAAU,GAAA,EAAA,CAAA,UAA+B,CAAC;IAC3D,OAAO;AACL,QAAA,OAAO,EAAA,OAAA;AACP,QAAA,UAAU,EAAA,UAAA;AACV,QAAA,YAAY,EAAE,YAAA;;SAEb;KACF,CAAC;AACJ;;ACdA,IAAIC,QAAM,GAAG,CAAC,CAAC;AACF,IAAA,WAAW,GAAG,UACzB,MAA2B,EAC3B,QAAiB,EACjB,UAAmB,EACnB,WAAoB,EAAA;AAEpB,IAAA,IAAM,UAAU,GAAGH,aAAO,CAAC,YAAM,EAAA,OAAAG,QAAM,EAAE,CAAR,EAAQ,EAAE,EAAE,CAAC,CAAC;AAC/C,IAAA,IAAM,YAAY,GAAG,eAAe,EAAE,CAAC;IACjC,IAAA,EAAA,GAA0BN,cAAQ,EAAwB,EAAzD,QAAQ,GAAA,EAAA,CAAA,CAAA,CAAA,EAAE,WAAW,GAAA,EAAA,CAAA,CAAA,CAAoC,CAAC;AAC3D,IAAA,IAAA,EAAoB,GAAAA,cAAQ,CAA4B,KAAK,CAAC,mBAAmB,CAAC,QAAQ,CAAC,EAA1F,KAAK,GAAA,EAAA,CAAA,CAAA,CAAA,EAAE,QAAQ,QAA2E,CAAC;IAC5F,IAAA,EAAA,GAAwBA,cAAQ,EAAoB,EAAnD,OAAO,GAAA,EAAA,CAAA,CAAA,CAAA,EAAE,UAAU,GAAA,EAAA,CAAA,CAAA,CAAgC,CAAC;AACrD,IAAA,IAAA,EAAsC,GAAAK,gBAAU,CAAC,cAAc,CAAC,EAA9D,IAAI,GAAA,EAAA,CAAA,IAAA,EAAE,WAAW,GAAA,EAAA,CAAA,WAAA,EAAE,YAAY,kBAA+B,CAAC;AAEvE,IAAA,IAAM,uBAAuB,GAAG,CAACH,oBAAY,CAAC,SAAS,EAAEA,oBAAY,CAAC,YAAY,CAAC,CAAC,OAAO,CAAC,YAAY,CAAC,IAAI,CAAC,CAAC;AAE/G,IAAAD,eAAS,CAAC,YAAA;QACR,IAAI,CAAA,IAAI,KAAA,IAAA,IAAJ,IAAI,KAAA,KAAA,CAAA,GAAA,KAAA,CAAA,GAAJ,IAAI,CAAE,OAAO,KAAI,MAAM,EAAE;YAC3B,IAAM,UAAQ,GAAG,WAAW,CAAC,UAAU,EAAE,MAAM,CAAC,CAAC;AACjD,YAAA,IAAI,UAAQ,EAAE;AACZ,gBAAA,UAAQ,CAAC,EAAE,CAAC,OAAO,EAAE,QAAQ,CAAC,CAAC;AAC/B,gBAAA,QAAQ,CAAC,UAAQ,CAAC,KAAK,CAAC,CAAC;gBACzB,WAAW,CAAC,UAAQ,CAAC,CAAC;gBACtB,OAAO,YAAA;oBACL,UAAQ,KAAA,IAAA,IAAR,UAAQ,KAAA,KAAA,CAAA,GAAA,KAAA,CAAA,GAAR,UAAQ,CAAE,MAAM,CAAC,eAAe,GAAG,UAAU,CAAC,CAAC;oBAC/C,UAAQ,KAAA,IAAA,IAAR,UAAQ,KAAA,KAAA,CAAA,GAAA,KAAA,CAAA,GAAR,UAAQ,CAAE,GAAG,CAAC,OAAO,EAAE,QAAQ,CAAC,CAAC;AACjC,oBAAA,YAAY,CAAC,UAAU,EAAE,MAAM,CAAC,CAAC;AACnC,iBAAC,CAAC;AACH,aAAA;AACF,SAAA;AACH,KAAC,EAAE,CAAC,IAAI,KAAA,IAAA,IAAJ,IAAI,KAAA,KAAA,CAAA,GAAA,KAAA,CAAA,GAAJ,IAAI,CAAE,OAAO,EAAE,MAAM,CAAC,CAAC,CAAC;AAE5B,IAAAA,eAAS,CAAC,YAAA;AACR,QAAA,IAAI,OAAO,IAAI,QAAQ,IAAI,uBAAuB,EAAE;AAClD,YAAA,OAAO,CAAC,SAAS,GAAG,QAAQ,CAAC,IAAI,CAAC,eAAe,GAAG,UAAU,EAAE,QAAQ,EAAE,UAAU,EAAE,WAAW,CAAC,CAAC;YACnG,OAAO,YAAA;AACL,gBAAA,OAAO,CAAC,SAAS,GAAG,IAAI,CAAC;AACzB,gBAAA,QAAQ,CAAC,MAAM,CAAC,eAAe,GAAG,UAAU,CAAC,CAAC;AAChD,aAAC,CAAC;AACH,SAAA;KACF,EAAE,CAAC,OAAO,EAAE,QAAQ,EAAE,uBAAuB,CAAC,CAAC,CAAC;AAEjD,IAAAA,eAAS,CAAC,YAAA;AACR,QAAA,IAAI,OAAO,IAAI,QAAQ,IAAI,uBAAuB,EAAE;AAClD,YAAA,QAAQ,CAAC,KAAK,CAAC,eAAe,GAAG,UAAU,EAAE,QAAQ,EAAE,UAAU,EAAE,WAAW,CAAC,CAAC;AACjF,SAAA;AACH,KAAC,EAAE,CAAC,OAAO,EAAE,QAAQ,EAAE,uBAAuB,EAAE,QAAQ,EAAE,UAAU,EAAE,WAAW,CAAC,CAAC,CAAC;IAEpF,IAAM,GAAG,GAAG,UAAC,QAAiC,EAAA;AAC5C,QAAA,UAAU,CAAC,QAAQ,IAAI,SAAS,CAAC,CAAC;AACpC,KAAC,CAAC;AAEF,IAAA,OAAO,CAAC,GAAG,EAAE,KAAK,EAAE,QAAQ,CAAC,CAAC;AAChC,EAAE;AAEK,IAAM,eAAe,GAAG,UAC7B,MAAc,EACd,SAAiB,EACjB,SAAiB,EACjB,QAAiB,EACjB,UAAmB,EACnB,WAAoB,EAAA;AAEpB,IAAA,IAAM,UAAU,GAAGE,aAAO,CAAC,YAAM,EAAA,OAAAG,QAAM,EAAE,CAAR,EAAQ,EAAE,EAAE,CAAC,CAAC;AAC/C,IAAA,IAAM,YAAY,GAAG,eAAe,EAAE,CAAC;IACjC,IAAA,EAAA,GAA0BN,cAAQ,EAA4B,EAA7D,QAAQ,GAAA,EAAA,CAAA,CAAA,CAAA,EAAE,WAAW,GAAA,EAAA,CAAA,CAAA,CAAwC,CAAC;AAC/D,IAAA,IAAA,EAAoB,GAAAA,cAAQ,CAA4B,KAAK,CAAC,mBAAmB,CAAC,QAAQ,CAAC,EAA1F,KAAK,GAAA,EAAA,CAAA,CAAA,CAAA,EAAE,QAAQ,QAA2E,CAAC;IAC5F,IAAA,EAAA,GAAwBA,cAAQ,EAAoB,EAAnD,OAAO,GAAA,EAAA,CAAA,CAAA,CAAA,EAAE,UAAU,GAAA,EAAA,CAAA,CAAA,CAAgC,CAAC;AACrD,IAAA,IAAA,EAAiF,GAAAK,gBAAU,CAAC,cAAc,CAAC,EAAzG,IAAI,GAAA,EAAA,CAAA,IAAA,EAAmB,eAAe,GAAA,EAAA,CAAA,eAAA,EAAoB,gBAAgB,sBAA+B,CAAC;AAElH,IAAA,IAAM,uBAAuB,GAAG,CAACH,oBAAY,CAAC,SAAS,EAAEA,oBAAY,CAAC,YAAY,CAAC,CAAC,OAAO,CAAC,YAAY,CAAC,IAAI,CAAC,CAAC;AAE/G,IAAAD,eAAS,CAAC,YAAA;AACR,QAAA,IAAI,IAAI,KAAJ,IAAA,IAAA,IAAI,uBAAJ,IAAI,CAAE,OAAO,EAAE;AACjB,YAAA,IAAM,UAAQ,GAAG,eAAe,CAAC,UAAU,EAAE,MAAM,EAAE,SAAS,EAAE,SAAS,CAAC,CAAC;AAC3E,YAAA,IAAI,UAAQ,EAAE;AACZ,gBAAA,UAAQ,CAAC,EAAE,CAAC,OAAO,EAAE,QAAQ,CAAC,CAAC;AAC/B,gBAAA,QAAQ,CAAC,UAAQ,CAAC,KAAK,CAAC,CAAC;gBACzB,WAAW,CAAC,UAAQ,CAAC,CAAC;gBACtB,OAAO,YAAA;oBACL,UAAQ,KAAA,IAAA,IAAR,UAAQ,KAAA,KAAA,CAAA,GAAA,KAAA,CAAA,GAAR,UAAQ,CAAE,GAAG,CAAC,OAAO,EAAE,QAAQ,CAAC,CAAC;oBACjC,gBAAgB,CAAC,UAAU,EAAE,MAAM,EAAE,SAAS,EAAE,SAAS,CAAC,CAAC;AAC7D,iBAAC,CAAC;AACH,aAAA;AACF,SAAA;AACH,KAAC,EAAE,CAAC,IAAI,KAAJ,IAAA,IAAA,IAAI,uBAAJ,IAAI,CAAE,OAAO,EAAE,MAAM,EAAE,SAAS,EAAE,SAAS,CAAC,CAAC,CAAC;AAElD,IAAAA,eAAS,CAAC,YAAA;AACR,QAAA,IAAI,OAAO,IAAI,QAAQ,IAAI,uBAAuB,EAAE;AAClD,YAAA,OAAO,CAAC,SAAS,GAAG,QAAQ,CAAC,IAAI,CAAC,eAAe,GAAG,UAAU,EAAE,QAAQ,EAAE,UAAU,EAAE,WAAW,CAAC,CAAC;YACnG,OAAO,YAAA;AACL,gBAAA,OAAO,CAAC,SAAS,GAAG,IAAI,CAAC;AACzB,gBAAA,QAAQ,CAAC,MAAM,CAAC,eAAe,GAAG,UAAU,CAAC,CAAC;AAChD,aAAC,CAAC;AACH,SAAA;KACF,EAAE,CAAC,OAAO,EAAE,QAAQ,EAAE,uBAAuB,CAAC,CAAC,CAAC;AAEjD,IAAAA,eAAS,CAAC,YAAA;AACR,QAAA,IAAI,OAAO,IAAI,QAAQ,IAAI,uBAAuB,EAAE;AAClD,YAAA,QAAQ,CAAC,KAAK,CAAC,eAAe,GAAG,UAAU,EAAE,QAAQ,EAAE,UAAU,EAAE,WAAW,CAAC,CAAC;AACjF,SAAA;AACH,KAAC,EAAE,CAAC,OAAO,EAAE,QAAQ,EAAE,uBAAuB,EAAE,QAAQ,EAAE,UAAU,EAAE,WAAW,CAAC,CAAC,CAAC;IAEpF,IAAM,GAAG,GAAG,UAAC,QAAiC,EAAA;AAC5C,QAAA,UAAU,CAAC,QAAQ,IAAI,SAAS,CAAC,CAAC;AACpC,KAAC,CAAC;AAEF,IAAA,OAAO,CAAC,GAAG,EAAE,KAAK,EAAE,QAAQ,CAAC,CAAC;AAChC,EAAE;AAEK,IAAM,gBAAgB,GAAG,UAAC,MAAoB,EAAA;IAC7C,IAAA,EAAA,GAAwBD,cAAQ,EAAoB,EAAnD,OAAO,GAAA,EAAA,CAAA,CAAA,CAAA,EAAE,UAAU,GAAA,EAAA,CAAA,CAAA,CAAgC,CAAC;AAC3D,IAAAC,eAAS,CAAC,YAAA;QACR,IAAI,OAAO,IAAI,MAAM,EAAE;AACrB,YAAA,OAAO,CAAC,SAAS,GAAG,MAAM,CAAC;YAC3B,OAAO,YAAA;AACL,gBAAA,OAAO,CAAC,SAAS,GAAG,IAAI,CAAC;AAC3B,aAAC,CAAC;AACH,SAAA;AACH,KAAC,EAAE,CAAC,OAAO,EAAE,MAAM,CAAC,CAAC,CAAC;AAEtB,IAAA,OAAO,UAAC,QAAiC,EAAA;AACvC,QAAA,UAAU,CAAC,QAAQ,IAAI,SAAS,CAAC,CAAC;AACpC,KAAC,CAAC;AACJ;;AC7HA,IAAI,MAAM,GAAG,CAAC,CAAC;AAER,IAAM,YAAY,GAAG,UAC1B,GAAuB,EAAA;AAEvB,IAAA,IAAM,WAAW,GAAGE,aAAO,CAAC,YAAM,EAAA,OAAA,MAAM,EAAE,CAAR,EAAQ,EAAE,EAAE,CAAC,CAAC;AAC1C,IAAA,IAAA,EAAoB,GAAAH,cAAQ,CAA0B,KAAK,CAAC,iBAAiB,CAAC,OAAO,CAAC,EAArF,KAAK,GAAA,EAAA,CAAA,CAAA,CAAA,EAAE,QAAQ,QAAsE,CAAC;IACvF,IAAA,EAAA,GAA0BA,cAAQ,EAAuB,EAAxD,QAAQ,GAAA,EAAA,CAAA,CAAA,CAAA,EAAE,WAAW,GAAA,EAAA,CAAA,CAAA,CAAmC,CAAC;AAC1D,IAAA,IAAA,EAAqE,GAAAK,gBAAU,CAAC,cAAc,CAAC,EAA7F,IAAI,GAAA,EAAA,CAAA,IAAA,EAAgB,YAAY,GAAA,EAAA,CAAA,YAAA,EAAiB,aAAa,mBAA+B,CAAC;AACtG,IAAAJ,eAAS,CAAC,YAAA;AACR,QAAA,IAAI,IAAI,KAAJ,IAAA,IAAA,IAAI,uBAAJ,IAAI,CAAE,OAAO,EAAE;YACjB,IAAM,aAAW,GAAG,YAAY,CAAC,WAAW,EAAE,GAAG,CAAC,CAAC;AACnD,YAAA,IAAI,aAAW,EAAE;gBACf,IAAM,eAAa,GAAG,UAAC,KAA8B,EAAA;oBACnD,QAAQ,CAAC,KAAK,CAAC,CAAC;AAClB,iBAAC,CAAC;AACF,gBAAA,aAAW,CAAC,EAAE,CAAC,OAAO,EAAE,eAAa,CAAC,CAAC;gBACvC,WAAW,CAAC,aAAW,CAAC,CAAC;AACzB,gBAAA,QAAQ,CAAC,aAAW,CAAC,KAAK,CAAC,CAAC;gBAC5B,OAAO,YAAA;oBACL,aAAW,KAAA,IAAA,IAAX,aAAW,KAAA,KAAA,CAAA,GAAA,KAAA,CAAA,GAAX,aAAW,CAAE,GAAG,CAAC,OAAO,EAAE,eAAa,CAAC,CAAC;AACzC,oBAAA,aAAa,CAAC,WAAW,EAAE,GAAG,CAAC,CAAC;AAClC,iBAAC,CAAC;AACH,aAAA;AACF,SAAA;AACH,KAAC,EAAE,CAAC,IAAI,aAAJ,IAAI,KAAA,KAAA,CAAA,GAAA,KAAA,CAAA,GAAJ,IAAI,CAAE,OAAO,EAAE,GAAG,CAAC,IAAI,GAAG,GAAG,CAAC,IAAI,CAAC,CAAC,CAAC;AAEzC,IAAA,OAAO,CAAC,KAAK,EAAE,QAAQ,KAAR,IAAA,IAAA,QAAQ,KAAR,KAAA,CAAA,GAAA,KAAA,CAAA,GAAA,QAAQ,CAAE,WAAW,EAAE,QAAQ,CAAC,CAAC;AAClD;;AC5BO,IAAM,qBAAqB,GAAG,UACnC,QAA8D,EAAA;IAExD,IAAA,EAAA,GAA8BD,cAAQ,CAAqB,SAAS,CAAC,EAApE,UAAU,GAAA,EAAA,CAAA,CAAA,CAAA,EAAE,aAAa,GAAA,EAAA,CAAA,CAAA,CAA2C,CAAC;AAC5E,IAAAC,eAAS,CAAC,YAAA;AACR,QAAA,IAAI,QAAQ,EAAE;YACZ,IAAM,SAAO,GAAG,UAAC,KAAa,EAAA;gBAC5B,aAAa,CAAC,KAAK,CAAC,CAAC;AACvB,aAAC,CAAC;AACF,YAAA,QAAQ,CAAC,EAAE,CAAC,aAAa,EAAE,SAAO,CAAC,CAAC;YAEpC,OAAO,YAAA;AACL,gBAAA,QAAQ,CAAC,GAAG,CAAC,aAAa,EAAE,SAAO,CAAC,CAAC;AACvC,aAAC,CAAC;AACH,SAAA;AAAM,aAAA;YACL,aAAa,CAAC,SAAS,CAAC,CAAC;AAC1B,SAAA;AACH,KAAC,EAAE,CAAC,QAAQ,CAAC,CAAC,CAAC;AACf,IAAA,OAAO,UAAU,CAAC;AACpB,EAAE;AAEK,IAAM,qBAAqB,GAAG,UAAC,QAA8B,EAAA;IAC5D,IAAA,EAAA,GAA8BD,cAAQ,CAAqB,SAAS,CAAC,EAApE,UAAU,GAAA,EAAA,CAAA,CAAA,CAAA,EAAE,aAAa,GAAA,EAAA,CAAA,CAAA,CAA2C,CAAC;AAC5E,IAAAC,eAAS,CAAC,YAAA;AACR,QAAA,IAAI,QAAQ,EAAE;YACZ,IAAM,SAAO,GAAG,UAAC,KAAa,EAAA;gBAC5B,aAAa,CAAC,KAAK,CAAC,CAAC;AACvB,aAAC,CAAC;AACF,YAAA,QAAQ,CAAC,EAAE,CAAC,aAAa,EAAE,SAAO,CAAC,CAAC;YAEpC,OAAO,YAAA;AACL,gBAAA,QAAQ,CAAC,GAAG,CAAC,aAAa,EAAE,SAAO,CAAC,CAAC;AACvC,aAAC,CAAC;AACH,SAAA;AAAM,aAAA;YACL,aAAa,CAAC,SAAS,CAAC,CAAC;AAC1B,SAAA;AACH,KAAC,EAAE,CAAC,QAAQ,CAAC,CAAC,CAAC;AACf,IAAA,OAAO,UAAU,CAAC;AACpB,EAAE;AAQK,IAAM,eAAe,GAAG,UAAC,SAAiB,EAAA;IACzC,IAAA,EAAA,GAAkBD,cAAQ,CAA+B,SAAS,CAAC,EAAlE,IAAI,GAAA,EAAA,CAAA,CAAA,CAAA,EAAE,OAAO,GAAA,EAAA,CAAA,CAAA,CAAqD,CAAC;AAClE,IAAA,IAAA,IAAI,GAAKK,gBAAU,CAACE,cAAqB,CAAC,KAAtC,CAAuC;AACnD,IAAAN,eAAS,CAAC,YAAA;AACR,QAAA,IAAM,QAAQ,GAAG,IAAI,KAAA,IAAA,IAAJ,IAAI,KAAA,KAAA,CAAA,GAAA,KAAA,CAAA,GAAJ,IAAI,CAAE,OAAO,CAAC,gBAAgB,EAAE,CAAC;AAClD,QAAA,IAAI,QAAQ,EAAE;;YAEZ,IAAM,SAAO,GAAG,UAAC,IAAgB,EAAA;AAC/B,gBAAA,IAAI,IAAI,EAAE;oBACR,IAAM,QAAQ,GAAG,IAAI,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC;AACpC,oBAAA,OAAO,CAAC;AACN,wBAAA,MAAM,EAAE,QAAQ,CAAC,CAAC,CAAC;AACnB,wBAAA,UAAU,EAAE,QAAQ,CAAC,CAAC,CAAC;AACvB,wBAAA,UAAU,EAAE,IAAI,CAAC,CAAC,CAAC;AACpB,qBAAA,CAAC,CAAC;AACJ,iBAAA;AAAM,qBAAA;oBACL,OAAO,CAAC,SAAS,CAAC,CAAC;AACpB,iBAAA;AACH,aAAC,CAAC;YACF,QAAQ,CAAC,EAAE,CAAC,OAAA,CAAA,MAAA,CAAQ,SAAS,CAAE,EAAE,SAAO,CAAC,CAAC;YAE1C,OAAO,YAAA;AACL,gBAAA,QAAQ,KAAR,IAAA,IAAA,QAAQ,KAAR,KAAA,CAAA,GAAA,KAAA,CAAA,GAAA,QAAQ,CAAE,GAAG,CAAC,OAAA,CAAA,MAAA,CAAQ,SAAS,CAAE,EAAE,SAAO,CAAC,CAAC;AAC9C,aAAC,CAAC;AACH,SAAA;AACH,KAAC,EAAE,CAAC,SAAS,EAAE,IAAI,aAAJ,IAAI,KAAA,KAAA,CAAA,GAAA,KAAA,CAAA,GAAJ,IAAI,CAAE,OAAO,CAAC,gBAAgB,EAAE,CAAC,CAAC,CAAC;AAClD,IAAA,OAAO,IAAI,CAAC;AACd,EAAE;AAEW,IAAA,gBAAgB,GAAG,UAAC,MAAc,EAAE,UAAkB,EAAA;IAC3D,IAAA,EAAA,GAA8BD,cAAQ,CAAqB,SAAS,CAAC,EAApE,UAAU,GAAA,EAAA,CAAA,CAAA,CAAA,EAAE,aAAa,GAAA,EAAA,CAAA,CAAA,CAA2C,CAAC;AACpE,IAAA,IAAA,IAAI,GAAKK,gBAAU,CAACE,cAAqB,CAAC,KAAtC,CAAuC;AACnD,IAAAN,eAAS,CAAC,YAAA;AACR,QAAA,IAAM,QAAQ,GAAG,IAAI,KAAA,IAAA,IAAJ,IAAI,KAAA,KAAA,CAAA,GAAA,KAAA,CAAA,GAAJ,IAAI,CAAE,OAAO,CAAC,gBAAgB,EAAE,CAAC;AAClD,QAAA,IAAI,QAAQ,EAAE;YACZ,IAAM,SAAO,GAAG,UAAC,KAAoB,EAAA;AACnC,gBAAA,aAAa,CAAC,KAAK,IAAI,SAAS,CAAC,CAAC;AACpC,aAAC,CAAC;YACF,QAAQ,CAAC,EAAE,CAAC,SAAU,CAAA,MAAA,CAAA,MAAM,EAAI,GAAA,CAAA,CAAA,MAAA,CAAA,UAAU,CAAE,EAAE,SAAO,CAAC,CAAC;YAEvD,OAAO,YAAA;AACL,gBAAA,QAAQ,KAAR,IAAA,IAAA,QAAQ,KAAR,KAAA,CAAA,GAAA,KAAA,CAAA,GAAA,QAAQ,CAAE,GAAG,CAAC,SAAU,CAAA,MAAA,CAAA,MAAM,cAAI,UAAU,CAAE,EAAE,SAAO,CAAC,CAAC;AAC3D,aAAC,CAAC;AACH,SAAA;AACH,KAAC,EAAE,CAAC,MAAM,EAAE,UAAU,EAAE,IAAI,KAAJ,IAAA,IAAA,IAAI,KAAJ,KAAA,CAAA,GAAA,KAAA,CAAA,GAAA,IAAI,CAAE,OAAO,CAAC,gBAAgB,EAAE,CAAC,CAAC,CAAC;AAC3D,IAAA,OAAO,UAAU,CAAC;AACpB;;AC5FO,IAAM,YAAY,GAAG,UAAC,KAAkD,EAAA;AACvE,IAAA,IAAA,KAAe,WAAW,CAAC,KAAK,CAAC,MAAM,EAAE,KAAK,CAAC,QAAQ,CAAC,EAAvD,GAAG,QAAA,EAAE,KAAK,QAA6C,CAAC;AAC/D,IAAA,QACE,KAAA,CAAA,aAAA,CAAA,KAAA,EAAA,EAAK,SAAS,EAAC,eAAe,EAAA;AAC5B,QAAA,KAAA,CAAA,aAAA,CAAA,KAAA,EAAA,IAAA,EAAM,KAAK,CAAO;AAClB,QAAA,KAAA,CAAA,aAAA,CAAA,OAAA,EAAA,EAAO,KAAK,EAAA,IAAA,EAAC,QAAQ,EAAA,IAAA,EAAC,SAAS,EAAC,eAAe,EAAC,GAAG,EAAE,GAAG,EAAU,CAAA,CAC9D,EACN;AACJ,EAAE;AAEK,IAAM,WAAW,GAAG,UAAC,KAA8B,EAAA;IACxD,IAAM,GAAG,GAAG,gBAAgB,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC;AAC3C,IAAA,OAAO,KAAO,CAAA,aAAA,CAAA,OAAA,EAAA,EAAA,KAAK,EAAC,IAAA,EAAA,QAAQ,EAAC,IAAA,EAAA,SAAS,EAAC,eAAe,EAAC,GAAG,EAAE,GAAG,GAAU,CAAC;AAC5E,EAAE;AAEK,IAAM,WAAW,GAAG,UAAC,KAAgE,EAAA;AAC1F,IAAA,IAAI,KAAK,CAAC,MAAM,YAAYO,kBAAY,EAAE;AACxC,QAAA,OAAO,KAAC,CAAA,aAAA,CAAA,YAAY,EAAC,EAAA,MAAM,EAAE,KAAK,CAAC,MAAM,EAAE,QAAQ,EAAE,KAAK,CAAC,QAAQ,GAAiB,CAAC;AACtF,KAAA;AAAM,SAAA;QACL,OAAO,KAAA,CAAA,aAAA,CAAC,WAAW,EAAC,EAAA,MAAM,EAAE,KAAK,CAAC,MAAM,EAAA,CAAgB,CAAC;AAC1D,KAAA;AACH;;;;;;;;;;;;;;;;;;;;;;;;;;"} \ No newline at end of file diff --git a/dist/index.mjs b/dist/index.mjs index 2e31360..3d9183c 100644 --- a/dist/index.mjs +++ b/dist/index.mjs @@ -1,28 +1,923 @@ /*! - * [libraryName] v0.0.0 - * (c) [authorFullName] + * @8xff/atm0s-media-react v0.0.0 + * (c) Luong Ngoc Minh * Released under the MIT License. */ -/** - * Check if value is parseable to number. - * @example - * ```js - * isNumberParseable('AAAA'); - * //=> false - * - * isNumberParseable('100'); - * //=> true - * - * if (!isNumberParseable(value)) - * throw new Error('Value can\'t be parseable to `Number`.') - * return Number(value); - * ``` - * @param value - An `unknown` value to be checked. - */ -var isNumberParseable = function (value) { - return !Number.isNaN(Number(value)); +import React, { useState, useEffect, useMemo, useCallback, useContext } from 'react'; +import Atm0s, { StreamRemote } from '@8xff/atm0s-media-js'; +import { TypedEventEmitter } from '@8xff/atm0s-media-js/types/lib/utils/typed-event-emitter'; +import { getLogger } from '@8xff/atm0s-media-js/types/lib/utils/logger'; + +/****************************************************************************** +Copyright (c) Microsoft Corporation. + +Permission to use, copy, modify, and/or distribute this software for any +purpose with or without fee is hereby granted. + +THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES WITH +REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY +AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT, +INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM +LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR +OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR +PERFORMANCE OF THIS SOFTWARE. +***************************************************************************** */ +/* global Reflect, Promise, SuppressedError, Symbol */ + +var extendStatics = function(d, b) { + extendStatics = Object.setPrototypeOf || + ({ __proto__: [] } instanceof Array && function (d, b) { d.__proto__ = b; }) || + function (d, b) { for (var p in b) if (Object.prototype.hasOwnProperty.call(b, p)) d[p] = b[p]; }; + return extendStatics(d, b); +}; + +function __extends(d, b) { + if (typeof b !== "function" && b !== null) + throw new TypeError("Class extends value " + String(b) + " is not a constructor or null"); + extendStatics(d, b); + function __() { this.constructor = d; } + d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __()); +} + +typeof SuppressedError === "function" ? SuppressedError : function (error, suppressed, message) { + var e = new Error(message); + return e.name = "SuppressedError", e.error = error, e.suppressed = suppressed, e; +}; + +var logger = getLogger('DeviceHook'); +var StreamContainer = /** @class */ (function (_super) { + __extends(StreamContainer, _super); + function StreamContainer(key) { + var _this = _super.call(this) || this; + _this.key = key; + _this.count = 0; + _this.data = {}; + logger.log('Created container for local stream', key); + return _this; + } + StreamContainer.prototype.setData = function (data) { + this.data = data; + this.emit('changed', data); + }; + StreamContainer.prototype.retain = function () { + this.count += 1; + logger.log('Retain local stream', this.key, this.count); + return this.count; + }; + StreamContainer.prototype.release = function () { + var _a; + this.count -= 1; + logger.log('Release local stream', this.key, this.count); + if (this.count == 0) { + logger.log('Destroy local stream', this.key); + (_a = this.data.media) === null || _a === void 0 ? void 0 : _a.getTracks().map(function (track) { + track.stop(); + }); + } + return this.count; + }; + return StreamContainer; +}(TypedEventEmitter)); +var globalStore = new Map(); +var useDevices = function (kind) { + var _a = useState([]), devices = _a[0], setDevices = _a[1]; + var _b = useState(null), error = _b[0], setError = _b[1]; + useEffect(function () { + navigator.mediaDevices + .enumerateDevices() + .then(function (devices) { + setDevices(devices.filter(function (d) { return d.kind == kind; })); + }) + .catch(function (error) { + setDevices([]); + setError(error); + }); + }, [kind]); + return [devices, error]; +}; +function getDevicePrivate(kind, deviceId, callback) { + var key = kind + '-' + deviceId; + var containerSlot = globalStore.get(key); + if (containerSlot) { + containerSlot.on('changed', callback); + callback(containerSlot.data); + } + else { + containerSlot = new StreamContainer(key); + globalStore.set(key, containerSlot); + var constraints = {}; + if (kind == 'audioinput') { + constraints = { + audio: typeof deviceId == 'string' + ? { + deviceId: deviceId, + } + : true, + }; + } + else if (kind == 'videoinput') { + constraints = { + video: typeof deviceId == 'string' + ? { + deviceId: deviceId, + } + : true, + }; + } + navigator.mediaDevices + .getUserMedia(constraints) + .then(function (stream) { + stream.cachedKey = key; + containerSlot === null || containerSlot === void 0 ? void 0 : containerSlot.setData({ media: stream }); + callback({ media: stream }); + }) + .catch(function (err) { + containerSlot === null || containerSlot === void 0 ? void 0 : containerSlot.setData({ error: err }); + callback({ error: err }); + }); + } + return [containerSlot, key]; +} +function getDevice(kind, deviceId) { + return new Promise(function (resolve, reject) { + getDevicePrivate(kind, deviceId, function (res) { + if (res.error) { + reject(res.error); + } + else { + resolve(res.media); + } + }); + }); +} +function retainDevice(key) { + var slot = globalStore.get(key); + slot === null || slot === void 0 ? void 0 : slot.retain(); +} +function releaseDevice(key) { + var slot = globalStore.get(key); + if ((slot === null || slot === void 0 ? void 0 : slot.release()) == 0) { + globalStore.delete(key); + } +} +var useDevice = function (kind, deviceId) { + var _a = useState({}), res = _a[0], setRes = _a[1]; + useEffect(function () { + if (deviceId != false) { + var _a = getDevicePrivate(kind, deviceId, setRes), containerSlot_1 = _a[0], key_1 = _a[1]; + containerSlot_1.retain(); + return function () { + setRes({ media: undefined, error: undefined }); + if ((containerSlot_1 === null || containerSlot_1 === void 0 ? void 0 : containerSlot_1.release()) == 0) { + globalStore.delete(key_1); + } + }; + } + }, [kind, deviceId]); + return [res.media, res.error]; +}; +var useUserMedia = function (constraints, active) { + var _a = useState({}), res = _a[0], setRes = _a[1]; + useEffect(function () { + if (active) { + var gotStream_1; + navigator.mediaDevices + .getUserMedia(constraints) + .then(function (stream) { + gotStream_1 = stream; + setRes({ media: stream }); + }) + .catch(function (err) { + gotStream_1 = undefined; + setRes({ error: err }); + }); + return function () { + setRes({ media: undefined, error: undefined }); + gotStream_1 === null || gotStream_1 === void 0 ? void 0 : gotStream_1.getTracks().forEach(function (track) { + track.stop(); + }); + }; + } + }, [JSON.stringify(constraints), active]); + return [res.media, res.error]; +}; +var useDisplayMedia = function (constraints, active) { + var _a = useState({}), res = _a[0], setRes = _a[1]; + useEffect(function () { + if (active) { + var gotStream_2; + navigator.mediaDevices + .getDisplayMedia(constraints) + .then(function (stream) { + gotStream_2 = stream; + setRes({ media: stream }); + }) + .catch(function (err) { + gotStream_2 = undefined; + setRes({ error: err }); + }); + return function () { + setRes({ media: undefined, error: undefined }); + gotStream_2 === null || gotStream_2 === void 0 ? void 0 : gotStream_2.getTracks().forEach(function (track) { + track.stop(); + }); + }; + } + }, [JSON.stringify(constraints), active]); + return [res.media, res.error]; +}; + +var SessionState; +(function (SessionState) { + SessionState["New"] = "new"; + SessionState["Connecting"] = "connecting"; + SessionState["Connected"] = "connected"; + SessionState["Reconnecting"] = "reconnecting"; + SessionState["Disconnected"] = "disconnected"; + SessionState["Error"] = "error"; +})(SessionState || (SessionState = {})); +var StreamPublisherWrap = /** @class */ (function () { + function StreamPublisherWrap(publisher) { + this.publisher = publisher; + } + Object.defineProperty(StreamPublisherWrap.prototype, "state", { + get: function () { + return this.publisher.state; + }, + enumerable: false, + configurable: true + }); + Object.defineProperty(StreamPublisherWrap.prototype, "localStream", { + get: function () { + return this.publisher.localStream; + }, + enumerable: false, + configurable: true + }); + StreamPublisherWrap.prototype.on = function (type, callback) { + this.publisher.on(type, callback); + }; + StreamPublisherWrap.prototype.off = function (type, callback) { + this.publisher.on(type, callback); + }; + StreamPublisherWrap.prototype.switchStream = function (stream) { + if (stream) { + // eslint-disable-next-line @typescript-eslint/no-explicit-any + var cachedKey = stream.cachedKey; + if (cachedKey) { + retainDevice(cachedKey); + } + } + if (this.publisher.localStream) { + // eslint-disable-next-line @typescript-eslint/no-explicit-any + var cacheKey = this.publisher.localStream.cachedKey; + if (cacheKey) { + releaseDevice(cacheKey); + } + } + return this.publisher.switch(stream); + }; + return StreamPublisherWrap; +}()); +var SessionContext = React.createContext({}); +var GlobalVer = 0; +var SessionProvider = function (props) { + // if (props.log_level != undefined) { + // Atm0s.setLogLevel(props.log_level); + // } + var _a = useState(0), setVer = _a[1]; + var storage = useMemo(function () { + return { data: undefined }; + }, []); + var update = useCallback(function (data) { + storage.data = data; + setVer(GlobalVer++); + }, [storage, setVer]); + var connect = useCallback(function (url, config) { + var _a, _b; + if ((_a = storage.data) === null || _a === void 0 ? void 0 : _a.session) { + return function () { + var _a; + (_a = storage.data) === null || _a === void 0 ? void 0 : _a.session.disconnect(); + }; + } + var session = Atm0s.createSession(url, config); + var myAudioStreams = new Map(); + var myVideoStreams = new Map(); + var audioStreams = new Map(); + var videoStreams = new Map(); + var publishers = new Map(); + var consumers = new Map(); + var consumerPairs = new Map(); + (_b = config === null || config === void 0 ? void 0 : config.senders) === null || _b === void 0 ? void 0 : _b.map(function (sender) { + if (sender.stream) { + // eslint-disable-next-line @typescript-eslint/no-explicit-any + var cachedKey = sender.stream.cachedKey; + if (cachedKey) { + retainDevice(cachedKey); + } + } + }); + session.on('connected', function () { + var _a; + if (((_a = storage.data) === null || _a === void 0 ? void 0 : _a.session) != session) + return; + update({ + session: session, + state: SessionState.Connected, + myAudioStreams: Array.from(myAudioStreams.values()), + myVideoStreams: Array.from(myVideoStreams.values()), + audioStreams: Array.from(audioStreams.values()), + videoStreams: Array.from(videoStreams.values()), + publishers: publishers, + consumers: consumers, + consumerPairs: consumerPairs, + }); + }); + session.on('mystream_added', function (stream) { + var _a; + if (((_a = storage.data) === null || _a === void 0 ? void 0 : _a.session) != session) + return; + var key = stream.peerId + '-' + stream.name; + if (stream.kind === Atm0s.StreamKinds.AUDIO) { + myAudioStreams.set(key, stream); + } + else { + myVideoStreams.set(key, stream); + } + update({ + session: session, + state: SessionState.Connected, + myAudioStreams: Array.from(myAudioStreams.values()), + myVideoStreams: Array.from(myVideoStreams.values()), + audioStreams: Array.from(audioStreams.values()), + videoStreams: Array.from(videoStreams.values()), + publishers: publishers, + consumers: consumers, + consumerPairs: consumerPairs, + }); + }); + session.on('mystream_updated', function (stream) { + var _a; + if (((_a = storage.data) === null || _a === void 0 ? void 0 : _a.session) != session) + return; + var key = stream.peerId + '-' + stream.name; + if (stream.kind === Atm0s.StreamKinds.AUDIO) { + myAudioStreams.set(key, stream); + } + else { + myVideoStreams.set(key, stream); + } + update({ + session: session, + state: SessionState.Connected, + myAudioStreams: Array.from(myAudioStreams.values()), + myVideoStreams: Array.from(myVideoStreams.values()), + audioStreams: Array.from(audioStreams.values()), + videoStreams: Array.from(videoStreams.values()), + publishers: publishers, + consumers: consumers, + consumerPairs: consumerPairs, + }); + }); + session.on('mystream_removed', function (stream) { + var _a; + if (((_a = storage.data) === null || _a === void 0 ? void 0 : _a.session) != session) + return; + var key = stream.peerId + '-' + stream.name; + if (stream.kind === Atm0s.StreamKinds.AUDIO) { + myAudioStreams.delete(key); + } + else { + myVideoStreams.delete(key); + } + update({ + session: session, + state: SessionState.Connected, + myAudioStreams: Array.from(myAudioStreams.values()), + myVideoStreams: Array.from(myVideoStreams.values()), + audioStreams: Array.from(audioStreams.values()), + videoStreams: Array.from(videoStreams.values()), + publishers: publishers, + consumers: consumers, + consumerPairs: consumerPairs, + }); + }); + session.on('stream_added', function (stream) { + var _a; + if (((_a = storage.data) === null || _a === void 0 ? void 0 : _a.session) != session) + return; + var key = stream.peerId + '-' + stream.name; + if (stream.kind === Atm0s.StreamKinds.AUDIO) { + audioStreams.set(key, stream); + } + else { + videoStreams.set(key, stream); + } + update({ + session: session, + state: SessionState.Connected, + myAudioStreams: Array.from(myAudioStreams.values()), + myVideoStreams: Array.from(myVideoStreams.values()), + audioStreams: Array.from(audioStreams.values()), + videoStreams: Array.from(videoStreams.values()), + publishers: publishers, + consumers: consumers, + consumerPairs: consumerPairs, + }); + }); + session.on('stream_updated', function (stream) { + var _a; + if (((_a = storage.data) === null || _a === void 0 ? void 0 : _a.session) != session) + return; + var key = stream.peerId + '-' + stream.name; + if (stream.kind === Atm0s.StreamKinds.AUDIO) { + audioStreams.set(key, stream); + } + else { + videoStreams.set(key, stream); + } + update({ + session: session, + state: SessionState.Connected, + myAudioStreams: Array.from(myAudioStreams.values()), + myVideoStreams: Array.from(myVideoStreams.values()), + audioStreams: Array.from(audioStreams.values()), + videoStreams: Array.from(videoStreams.values()), + publishers: publishers, + consumers: consumers, + consumerPairs: consumerPairs, + }); + }); + session.on('stream_removed', function (stream) { + var _a; + if (((_a = storage.data) === null || _a === void 0 ? void 0 : _a.session) != session) + return; + var key = stream.peerId + '-' + stream.name; + if (stream.kind === Atm0s.StreamKinds.AUDIO) { + audioStreams.delete(key); + } + else { + videoStreams.delete(key); + } + update({ + session: session, + state: SessionState.Connected, + myAudioStreams: Array.from(myAudioStreams.values()), + myVideoStreams: Array.from(myVideoStreams.values()), + audioStreams: Array.from(audioStreams.values()), + videoStreams: Array.from(videoStreams.values()), + publishers: publishers, + consumers: consumers, + consumerPairs: consumerPairs, + }); + }); + session.on('disconnected', function () { + var _a; + if (((_a = storage.data) === null || _a === void 0 ? void 0 : _a.session) != session) + return; + update({ + session: session, + state: SessionState.Disconnected, + myAudioStreams: Array.from(myAudioStreams.values()), + myVideoStreams: Array.from(myVideoStreams.values()), + audioStreams: Array.from(audioStreams.values()), + videoStreams: Array.from(videoStreams.values()), + publishers: publishers, + consumers: consumers, + consumerPairs: consumerPairs, + }); + }); + session.connect().catch(function (err) { + var _a; + if (((_a = storage.data) === null || _a === void 0 ? void 0 : _a.session) != session) + return; + console.error(err); + update({ + session: session, + state: SessionState.Error, + myAudioStreams: Array.from(myAudioStreams.values()), + myVideoStreams: Array.from(myVideoStreams.values()), + audioStreams: Array.from(audioStreams.values()), + videoStreams: Array.from(videoStreams.values()), + publishers: publishers, + consumers: consumers, + consumerPairs: consumerPairs, + }); + }); + update({ + session: session, + state: SessionState.Connecting, + myAudioStreams: [], + myVideoStreams: [], + audioStreams: [], + videoStreams: [], + publishers: publishers, + consumers: consumers, + consumerPairs: consumerPairs, + }); + return; + }, [storage, update]); + var disconnect = useCallback(function () { + var _a; + if ((_a = storage.data) === null || _a === void 0 ? void 0 : _a.session) { + storage.data.session.disconnect(); + update(undefined); + } + }, [storage, update]); + var getPublisher = useCallback(function (ownerId, cfg) { + var _a; + var data = storage.data; + if (data === null || data === void 0 ? void 0 : data.session) { + var publisher = data.publishers.get(cfg.name); + if (!publisher) { + publisher = { + data: new StreamPublisherWrap(data.session.createPublisher({ + stream: cfg.stream, + name: cfg.name, + kind: cfg.kind, + preferredCodecs: cfg.preferredCodecs, + simulcast: cfg.simulcast, + maxBitrate: cfg.maxBitrate, + contentHint: cfg.contentHint, + screen: cfg.screen, + })), + owners: new Map(), + }; + data.publishers.set(cfg.name, publisher); + } + (_a = data.publishers.get(cfg.name)) === null || _a === void 0 ? void 0 : _a.owners.set(ownerId, new Date().getTime()); + return publisher.data; + } + return undefined; + }, [storage]); + var backPublisher = useCallback(function (ownerId, cfg) { + var data = storage.data; + if (data === null || data === void 0 ? void 0 : data.session) { + var publisher = data.publishers.get(cfg.name); + if (publisher) { + publisher.owners.delete(ownerId); + if (publisher.owners.size == 0) { + publisher.data.switchStream(null); + data.publishers.delete(cfg.name); + } + } + } + return undefined; + }, [storage]); + var getConsumer = useCallback(function (ownerId, stream) { + var _a; + var data = storage.data; + if (data === null || data === void 0 ? void 0 : data.session) { + var key = stream.peerId + '-' + stream.name; + var consumer = data.consumers.get(key); + if (!consumer) { + consumer = { + data: data.session.createConsumer(stream), + owners: new Map(), + }; + data.consumers.set(key, consumer); + } + (_a = data.consumers.get(key)) === null || _a === void 0 ? void 0 : _a.owners.set(ownerId, new Date().getTime()); + return consumer.data; + } + return undefined; + }, [storage]); + var backConsumer = useCallback(function (ownerId, stream) { + var data = storage.data; + if (data === null || data === void 0 ? void 0 : data.session) { + var key = stream.peerId + '-' + stream.name; + var consumer = data.consumers.get(key); + if (consumer) { + consumer.owners.delete(ownerId); + if (consumer.owners.size == 0) { + data.consumers.delete(key); + } + } + } + return undefined; + }, [storage]); + var getConsumerPair = useCallback(function (ownerId, peerId, audioName, videoName) { + var _a; + var data = storage.data; + if (data === null || data === void 0 ? void 0 : data.session) { + var key = peerId + '-' + audioName + '-' + videoName; + var consumer = data.consumerPairs.get(key); + if (!consumer) { + consumer = { + data: data.session.createConsumerPair(peerId, audioName, videoName), + owners: new Map(), + }; + data.consumerPairs.set(key, consumer); + } + (_a = data.consumerPairs.get(key)) === null || _a === void 0 ? void 0 : _a.owners.set(ownerId, new Date().getTime()); + return consumer.data; + } + return undefined; + }, [storage]); + var backConsumerPair = useCallback(function (ownerId, peerId, audioName, videoName) { + var data = storage.data; + if (data === null || data === void 0 ? void 0 : data.session) { + var key = peerId + '-' + audioName + '-' + videoName; + var consumer = data.consumerPairs.get(key); + if (consumer) { + consumer.owners.delete(ownerId); + if (consumer.owners.size == 0) { + data.consumerPairs.delete(key); + } + } + } + return undefined; + }, [storage]); + React.useEffect(function () { + if (props.url && props.config) { + connect(props.url, props.config); + return function () { + disconnect(); + }; + } + }, [props.url, props.config, connect, disconnect]); + return (React.createElement(SessionContext.Provider, { value: { + data: storage.data, + connect: connect, + disconnect: disconnect, + getPublisher: getPublisher, + backPublisher: backPublisher, + getConsumer: getConsumer, + backConsumer: backConsumer, + getConsumerPair: getConsumerPair, + backConsumerPair: backConsumerPair, + update: update, + } }, props.children)); +}; + +var useRemoteStreams = function (kind, isMine) { + var data = useContext(SessionContext).data; + if (kind == Atm0s.StreamKinds.AUDIO) { + if (isMine === true) { + return (data === null || data === void 0 ? void 0 : data.myAudioStreams) || []; + } + else { + return (data === null || data === void 0 ? void 0 : data.audioStreams) || []; + } + } + else { + if (isMine === true) { + return (data === null || data === void 0 ? void 0 : data.myVideoStreams) || []; + } + else { + return (data === null || data === void 0 ? void 0 : data.videoStreams) || []; + } + } +}; + +var useSession = function () { + var data = useContext(SessionContext).data; + return data === null || data === void 0 ? void 0 : data.session; +}; + +var useSessionState = function () { + var data = useContext(SessionContext).data; + return (data === null || data === void 0 ? void 0 : data.state) || SessionState.New; +}; + +var useActions = function () { + var _a = useContext(SessionContext), connect = _a.connect, disconnect = _a.disconnect; + return { + connect: connect, + disconnect: disconnect, + playAudioMix: function () { + // data?.session.getMixMinusAudio()?.play(); + }, + }; +}; + +var idSeed$1 = 0; +var useConsumer = function (remote, priority, maxSpatial, maxTemporal) { + var consumerId = useMemo(function () { return idSeed$1++; }, []); + var sessionState = useSessionState(); + var _a = useState(), consumer = _a[0], setConsumer = _a[1]; + var _b = useState(Atm0s.StreamReceiverState.NoSource), state = _b[0], setState = _b[1]; + var _c = useState(), element = _c[0], setElement = _c[1]; + var _d = useContext(SessionContext), data = _d.data, getConsumer = _d.getConsumer, backConsumer = _d.backConsumer; + var isConnectionEstablished = [SessionState.Connected, SessionState.Reconnecting].indexOf(sessionState) >= 0; + useEffect(function () { + if ((data === null || data === void 0 ? void 0 : data.session) && remote) { + var consumer_1 = getConsumer(consumerId, remote); + if (consumer_1) { + consumer_1.on('state', setState); + setState(consumer_1.state); + setConsumer(consumer_1); + return function () { + consumer_1 === null || consumer_1 === void 0 ? void 0 : consumer_1.unview('use-consumer-' + consumerId); + consumer_1 === null || consumer_1 === void 0 ? void 0 : consumer_1.off('state', setState); + backConsumer(consumerId, remote); + }; + } + } + }, [data === null || data === void 0 ? void 0 : data.session, remote]); + useEffect(function () { + if (element && consumer && isConnectionEstablished) { + element.srcObject = consumer.view('use-consumer-' + consumerId, priority, maxSpatial, maxTemporal); + return function () { + element.srcObject = null; + consumer.unview('use-consumer-' + consumerId); + }; + } + }, [element, consumer, isConnectionEstablished]); + useEffect(function () { + if (element && consumer && isConnectionEstablished) { + consumer.limit('use-consumer-' + consumerId, priority, maxSpatial, maxTemporal); + } + }, [element, consumer, isConnectionEstablished, priority, maxSpatial, maxTemporal]); + var ref = function (instance) { + setElement(instance || undefined); + }; + return [ref, state, consumer]; +}; +var useConsumerPair = function (peerId, audioName, videoName, priority, maxSpatial, maxTemporal) { + var consumerId = useMemo(function () { return idSeed$1++; }, []); + var sessionState = useSessionState(); + var _a = useState(), consumer = _a[0], setConsumer = _a[1]; + var _b = useState(Atm0s.StreamReceiverState.NoSource), state = _b[0], setState = _b[1]; + var _c = useState(), element = _c[0], setElement = _c[1]; + var _d = useContext(SessionContext), data = _d.data, getConsumerPair = _d.getConsumerPair, backConsumerPair = _d.backConsumerPair; + var isConnectionEstablished = [SessionState.Connected, SessionState.Reconnecting].indexOf(sessionState) >= 0; + useEffect(function () { + if (data === null || data === void 0 ? void 0 : data.session) { + var consumer_2 = getConsumerPair(consumerId, peerId, audioName, videoName); + if (consumer_2) { + consumer_2.on('state', setState); + setState(consumer_2.state); + setConsumer(consumer_2); + return function () { + consumer_2 === null || consumer_2 === void 0 ? void 0 : consumer_2.off('state', setState); + backConsumerPair(consumerId, peerId, audioName, videoName); + }; + } + } + }, [data === null || data === void 0 ? void 0 : data.session, peerId, audioName, videoName]); + useEffect(function () { + if (element && consumer && isConnectionEstablished) { + element.srcObject = consumer.view('use-consumer-' + consumerId, priority, maxSpatial, maxTemporal); + return function () { + element.srcObject = null; + consumer.unview('use-consumer-' + consumerId); + }; + } + }, [element, consumer, isConnectionEstablished]); + useEffect(function () { + if (element && consumer && isConnectionEstablished) { + consumer.limit('use-consumer-' + consumerId, priority, maxSpatial, maxTemporal); + } + }, [element, consumer, isConnectionEstablished, priority, maxSpatial, maxTemporal]); + var ref = function (instance) { + setElement(instance || undefined); + }; + return [ref, state, consumer]; +}; +var useLocalConsumer = function (stream) { + var _a = useState(), element = _a[0], setElement = _a[1]; + useEffect(function () { + if (element && stream) { + element.srcObject = stream; + return function () { + element.srcObject = null; + }; + } + }, [element, stream]); + return function (instance) { + setElement(instance || undefined); + }; +}; + +var idSeed = 0; +var usePublisher = function (cfg) { + var publisherId = useMemo(function () { return idSeed++; }, []); + var _a = useState(Atm0s.StreamSenderState.Created), state = _a[0], setState = _a[1]; + var _b = useState(), producer = _b[0], setProducer = _b[1]; + var _c = useContext(SessionContext), data = _c.data, getPublisher = _c.getPublisher, backPublisher = _c.backPublisher; + useEffect(function () { + if (data === null || data === void 0 ? void 0 : data.session) { + var newProducer_1 = getPublisher(publisherId, cfg); + if (newProducer_1) { + var onUpdateState_1 = function (state) { + setState(state); + }; + newProducer_1.on('state', onUpdateState_1); + setProducer(newProducer_1); + setState(newProducer_1.state); + return function () { + newProducer_1 === null || newProducer_1 === void 0 ? void 0 : newProducer_1.off('state', onUpdateState_1); + backPublisher(publisherId, cfg); + }; + } + } + }, [data === null || data === void 0 ? void 0 : data.session, cfg.kind + cfg.name]); + return [state, producer === null || producer === void 0 ? void 0 : producer.localStream, producer]; +}; + +var useAudioLevelConsumer = function (consumer) { + var _a = useState(undefined), audioLevel = _a[0], setAudioLevel = _a[1]; + useEffect(function () { + if (consumer) { + var handler_1 = function (level) { + setAudioLevel(level); + }; + consumer.on('audio_level', handler_1); + return function () { + consumer.off('audio_level', handler_1); + }; + } + else { + setAudioLevel(undefined); + } + }, [consumer]); + return audioLevel; +}; +var useAudioLevelProducer = function (producer) { + var _a = useState(undefined), audioLevel = _a[0], setAudioLevel = _a[1]; + useEffect(function () { + if (producer) { + var handler_2 = function (level) { + setAudioLevel(level); + }; + producer.on('audio_level', handler_2); + return function () { + producer.off('audio_level', handler_2); + }; + } + else { + setAudioLevel(undefined); + } + }, [producer]); + return audioLevel; +}; +var useAudioSlotMix = function (slotIndex) { + var _a = useState(undefined), slot = _a[0], setSlot = _a[1]; + var data = useContext(SessionContext).data; + useEffect(function () { + var mixMinus = data === null || data === void 0 ? void 0 : data.session.getMixMinusAudio(); + if (mixMinus) { + // eslint-disable-next-line @typescript-eslint/no-explicit-any + var handler_3 = function (info) { + if (info) { + var sourceId = info[0].split(':'); + setSlot({ + peerId: sourceId[0], + streamName: sourceId[1], + audioLevel: info[1], + }); + } + else { + setSlot(undefined); + } + }; + mixMinus.on("slot_".concat(slotIndex), handler_3); + return function () { + mixMinus === null || mixMinus === void 0 ? void 0 : mixMinus.off("slot_".concat(slotIndex), handler_3); + }; + } + }, [slotIndex, data === null || data === void 0 ? void 0 : data.session.getMixMinusAudio()]); + return slot; +}; +var useAudioLevelMix = function (peerId, streamName) { + var _a = useState(undefined), audioLevel = _a[0], setAudioLevel = _a[1]; + var data = useContext(SessionContext).data; + useEffect(function () { + var mixMinus = data === null || data === void 0 ? void 0 : data.session.getMixMinusAudio(); + if (mixMinus) { + var handler_4 = function (level) { + setAudioLevel(level || undefined); + }; + mixMinus.on("source_".concat(peerId, ":").concat(streamName), handler_4); + return function () { + mixMinus === null || mixMinus === void 0 ? void 0 : mixMinus.off("source_".concat(peerId, ":").concat(streamName), handler_4); + }; + } + }, [peerId, streamName, data === null || data === void 0 ? void 0 : data.session.getMixMinusAudio()]); + return audioLevel; +}; + +var RemoteViewer = function (props) { + var _a = useConsumer(props.remote, props.priority), ref = _a[0], state = _a[1]; + return (React.createElement("div", { className: "w-full h-full" }, + React.createElement("div", null, state), + React.createElement("video", { muted: true, autoPlay: true, className: "w-full h-full", ref: ref }))); +}; +var LocalViewer = function (props) { + var ref = useLocalConsumer(props.stream); + return React.createElement("video", { muted: true, autoPlay: true, className: "w-full h-full", ref: ref }); +}; +var VideoViewer = function (props) { + if (props.stream instanceof StreamRemote) { + return React.createElement(RemoteViewer, { remote: props.stream, priority: props.priority }); + } + else { + return React.createElement(LocalViewer, { stream: props.stream }); + } }; -export { isNumberParseable }; +export { SessionContext as BlueseaSessionContext, LocalViewer, RemoteViewer, SessionProvider, SessionState, StreamPublisherWrap, VideoViewer, getDevice, useActions, useAudioLevelConsumer, useAudioLevelMix, useAudioLevelProducer, useAudioSlotMix, useConsumer, useConsumerPair, useDevice, useDevices, useDisplayMedia, useLocalConsumer, usePublisher, useRemoteStreams, useSession, useSessionState, useUserMedia }; //# sourceMappingURL=index.mjs.map diff --git a/dist/index.mjs.map b/dist/index.mjs.map index c8c6b99..a000203 100644 --- a/dist/index.mjs.map +++ b/dist/index.mjs.map @@ -1 +1 @@ -{"version":3,"file":"index.mjs","sources":["../src/index.ts"],"sourcesContent":["/**\n * A Branded Type for values parseable to number.\n */\nexport type NumberParseable = (number | string | boolean) & {\n readonly isNumberParseble: unique symbol;\n};\n\n/**\n * Check if value is parseable to number.\n * @example\n * ```js\n * isNumberParseable('AAAA');\n * //=> false\n *\n * isNumberParseable('100');\n * //=> true\n *\n * if (!isNumberParseable(value))\n * throw new Error('Value can\\'t be parseable to `Number`.')\n * return Number(value);\n * ```\n * @param value - An `unknown` value to be checked.\n */\nexport const isNumberParseable = (value: unknown): value is NumberParseable =>\n !Number.isNaN(Number(value));\n"],"names":[],"mappings":";;;;;;AAOA;;;;;;;;;;;;;;;AAeG;AACI,IAAM,iBAAiB,GAAG,UAAC,KAAc,EAAA;IAC9C,OAAA,CAAC,MAAM,CAAC,KAAK,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC,CAAA;AAA5B;;;;"} \ No newline at end of file +{"version":3,"file":"index.mjs","sources":["../src/hooks/device.ts","../src/components/provider.tsx","../src/hooks/remote.ts","../src/hooks/session.ts","../src/hooks/state.ts","../src/hooks/actions.ts","../src/hooks/consumer.ts","../src/hooks/publisher.ts","../src/hooks/audio_level.ts","../src/components/video_viewer.tsx"],"sourcesContent":["import { TypedEventEmitter } from '@8xff/atm0s-media-js/types/lib/utils/typed-event-emitter';\nimport { getLogger } from '@8xff/atm0s-media-js/types/lib/utils/logger';\nimport { useEffect, useState } from 'react';\n\nconst logger = getLogger('DeviceHook');\n\ninterface Return {\n media?: MediaStream;\n error?: Error;\n}\n\nclass StreamContainer extends TypedEventEmitter<{ changed: (data: Return) => void }> {\n count = 0;\n data: Return = {};\n\n constructor(private key: string) {\n super();\n logger.log('Created container for local stream', key);\n }\n\n setData(data: Return) {\n this.data = data;\n this.emit('changed', data);\n }\n\n retain() {\n this.count += 1;\n logger.log('Retain local stream', this.key, this.count);\n return this.count;\n }\n\n release() {\n this.count -= 1;\n logger.log('Release local stream', this.key, this.count);\n if (this.count == 0) {\n logger.log('Destroy local stream', this.key);\n this.data.media?.getTracks().map((track) => {\n track.stop();\n });\n }\n return this.count;\n }\n}\nconst globalStore: Map = new Map();\n\nexport const useDevices = (\n kind: MediaDeviceKind,\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n): [MediaDeviceInfo[], any | null] => {\n const [devices, setDevices] = useState([]);\n const [error, setError] = useState(null);\n useEffect(() => {\n navigator.mediaDevices\n .enumerateDevices()\n .then((devices) => {\n setDevices(devices.filter((d) => d.kind == kind));\n })\n .catch((error) => {\n setDevices([]);\n setError(error);\n });\n }, [kind]);\n\n return [devices, error];\n};\n\nfunction getDevicePrivate(\n kind: MediaDeviceKind,\n deviceId: string | boolean,\n callback: (data: Return) => void,\n): [StreamContainer, string] {\n const key = kind + '-' + deviceId;\n let containerSlot = globalStore.get(key);\n if (containerSlot) {\n containerSlot.on('changed', callback);\n callback(containerSlot.data);\n } else {\n containerSlot = new StreamContainer(key);\n globalStore.set(key, containerSlot);\n let constraints: MediaStreamConstraints = {};\n if (kind == 'audioinput') {\n constraints = {\n audio:\n typeof deviceId == 'string'\n ? {\n deviceId: deviceId,\n }\n : true,\n };\n } else if (kind == 'videoinput') {\n constraints = {\n video:\n typeof deviceId == 'string'\n ? {\n deviceId: deviceId,\n }\n : true,\n };\n }\n navigator.mediaDevices\n .getUserMedia(constraints)\n .then((stream) => {\n stream.cachedKey = key;\n containerSlot?.setData({ media: stream });\n callback({ media: stream });\n })\n .catch((err) => {\n containerSlot?.setData({ error: err });\n callback({ error: err });\n });\n }\n\n return [containerSlot, key];\n}\n\nexport function getDevice(kind: MediaDeviceKind, deviceId: string | boolean): Promise {\n return new Promise((resolve, reject) => {\n getDevicePrivate(kind, deviceId, (res) => {\n if (res.error) {\n reject(res.error);\n } else {\n resolve(res.media!);\n }\n });\n });\n}\n\nexport function retainDevice(key: string) {\n const slot = globalStore.get(key);\n slot?.retain();\n}\n\nexport function releaseDevice(key: string) {\n const slot = globalStore.get(key);\n if (slot?.release() == 0) {\n globalStore.delete(key);\n }\n}\n\nexport const useDevice = (\n kind: MediaDeviceKind,\n deviceId: string | boolean,\n): [MediaStream | undefined, Error | undefined] => {\n const [res, setRes] = useState({} as Return);\n useEffect(() => {\n if (deviceId != false) {\n const [containerSlot, key] = getDevicePrivate(kind, deviceId, setRes);\n containerSlot.retain();\n return () => {\n setRes({ media: undefined, error: undefined });\n if (containerSlot?.release() == 0) {\n globalStore.delete(key);\n }\n };\n }\n }, [kind, deviceId]);\n return [res.media, res.error];\n};\n\nexport const useUserMedia = (\n constraints?: MediaStreamConstraints,\n active?: boolean,\n): [MediaStream | undefined, Error | undefined] => {\n const [res, setRes] = useState({} as Return);\n useEffect(() => {\n if (active) {\n let gotStream: MediaStream | undefined;\n navigator.mediaDevices\n .getUserMedia(constraints)\n .then((stream) => {\n gotStream = stream;\n setRes({ media: stream });\n })\n .catch((err) => {\n gotStream = undefined;\n setRes({ error: err });\n });\n return () => {\n setRes({ media: undefined, error: undefined });\n gotStream?.getTracks().forEach((track) => {\n track.stop();\n });\n };\n }\n }, [JSON.stringify(constraints), active]);\n return [res.media, res.error];\n};\n\nexport const useDisplayMedia = (\n constraints?: DisplayMediaStreamOptions,\n active?: boolean,\n): [MediaStream | undefined, Error | undefined] => {\n const [res, setRes] = useState({} as Return);\n useEffect(() => {\n if (active) {\n let gotStream: MediaStream | undefined;\n navigator.mediaDevices\n .getDisplayMedia(constraints)\n .then((stream) => {\n gotStream = stream;\n setRes({ media: stream });\n })\n .catch((err) => {\n gotStream = undefined;\n setRes({ error: err });\n });\n return () => {\n setRes({ media: undefined, error: undefined });\n gotStream?.getTracks().forEach((track) => {\n track.stop();\n });\n };\n }\n }, [JSON.stringify(constraints), active]);\n return [res.media, res.error];\n};\n","import React, { useCallback, useMemo, useState } from 'react';\nimport Atm0s, { type AnyFunction, type IPublisherCallbacks } from '@8xff/atm0s-media-js';\nimport { releaseDevice, retainDevice } from '../hooks/device';\n\nexport enum SessionState {\n New = 'new',\n Connecting = 'connecting',\n Connected = 'connected',\n Reconnecting = 'reconnecting',\n Disconnected = 'disconnected',\n Error = 'error',\n}\n\nexport class StreamPublisherWrap {\n constructor(private publisher: Atm0s.StreamPublisher) {}\n\n get state() {\n return this.publisher.state;\n }\n\n get localStream() {\n return this.publisher.localStream;\n }\n\n on(type: keyof IPublisherCallbacks, callback: AnyFunction) {\n this.publisher.on(type, callback);\n }\n\n off(type: keyof IPublisherCallbacks, callback: AnyFunction) {\n this.publisher.on(type, callback);\n }\n\n switchStream(stream: MediaStream | null) {\n if (stream) {\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n const cachedKey = stream.cachedKey;\n if (cachedKey) {\n retainDevice(cachedKey);\n }\n }\n if (this.publisher.localStream) {\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n const cacheKey = this.publisher.localStream.cachedKey;\n if (cacheKey) {\n releaseDevice(cacheKey);\n }\n }\n return this.publisher.switch(stream);\n }\n}\n\ninterface SessionContainer {\n session: Atm0s.Session;\n state: SessionState;\n myAudioStreams: Atm0s.StreamRemote[];\n myVideoStreams: Atm0s.StreamRemote[];\n audioStreams: Atm0s.StreamRemote[];\n videoStreams: Atm0s.StreamRemote[];\n publishers: Map>;\n consumers: Map>;\n consumerPairs: Map>;\n}\n\ninterface ArcContainer {\n data: T;\n owners: Map;\n}\n\ninterface SessionContextInfo {\n data?: SessionContainer;\n connect: (url: string, config: Atm0s.ISessionConfig) => void;\n disconnect: () => void;\n getPublisher(ownerId: number, cfg: Atm0s.SenderConfig): StreamPublisherWrap | undefined;\n backPublisher(ownerId: number, cfg: Atm0s.SenderConfig): void;\n getConsumer(ownerId: number, remote: Atm0s.StreamRemote): Atm0s.StreamConsumer | undefined;\n backConsumer(owner_id: number, remote: Atm0s.StreamRemote): void;\n getConsumerPair(\n ownerId: number,\n peerId: string,\n audioName: string,\n videoName: string,\n ): Atm0s.StreamConsumerPair | undefined;\n backConsumerPair(ownerId: number, peerId: string, audioName: string, videoName: string): void;\n update: (new_info: SessionContainer) => void;\n}\n\nexport const SessionContext = React.createContext({} as SessionContextInfo);\n\ninterface Props {\n children: React.ReactNode;\n // log_level?: Atm0s.LogLevel;\n url?: string;\n config?: Atm0s.ISessionConfig;\n}\n\nlet GlobalVer = 0;\n\nexport const SessionProvider = (props: Props) => {\n // if (props.log_level != undefined) {\n // Atm0s.setLogLevel(props.log_level);\n // }\n const [, setVer] = useState(0);\n const storage = useMemo<{ data: SessionContainer | undefined }>(() => {\n return { data: undefined };\n }, []);\n const update = useCallback(\n (data: SessionContainer | undefined) => {\n storage.data = data;\n setVer(GlobalVer++);\n },\n [storage, setVer],\n );\n const connect = useCallback(\n (url: string, config: Atm0s.ISessionConfig) => {\n if (storage.data?.session) {\n return () => {\n storage.data?.session.disconnect();\n };\n }\n const session = Atm0s.createSession(url, config);\n const myAudioStreams = new Map();\n const myVideoStreams = new Map();\n const audioStreams = new Map();\n const videoStreams = new Map();\n\n const publishers: Map> = new Map();\n const consumers: Map> = new Map();\n const consumerPairs: Map> = new Map();\n\n config?.senders?.map((sender) => {\n if (sender.stream) {\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n const cachedKey = sender.stream.cachedKey;\n if (cachedKey) {\n retainDevice(cachedKey);\n }\n }\n });\n\n session.on('connected', () => {\n if (storage.data?.session != session) return;\n update({\n session,\n state: SessionState.Connected,\n myAudioStreams: Array.from(myAudioStreams.values()),\n myVideoStreams: Array.from(myVideoStreams.values()),\n audioStreams: Array.from(audioStreams.values()),\n videoStreams: Array.from(videoStreams.values()),\n publishers,\n consumers,\n consumerPairs,\n });\n });\n\n session.on('mystream_added', (stream: Atm0s.StreamRemote) => {\n if (storage.data?.session != session) return;\n const key = stream.peerId + '-' + stream.name;\n if (stream.kind === Atm0s.StreamKinds.AUDIO) {\n myAudioStreams.set(key, stream);\n } else {\n myVideoStreams.set(key, stream);\n }\n update({\n session,\n state: SessionState.Connected,\n myAudioStreams: Array.from(myAudioStreams.values()),\n myVideoStreams: Array.from(myVideoStreams.values()),\n audioStreams: Array.from(audioStreams.values()),\n videoStreams: Array.from(videoStreams.values()),\n publishers,\n consumers,\n consumerPairs,\n });\n });\n\n session.on('mystream_updated', (stream: Atm0s.StreamRemote) => {\n if (storage.data?.session != session) return;\n const key = stream.peerId + '-' + stream.name;\n if (stream.kind === Atm0s.StreamKinds.AUDIO) {\n myAudioStreams.set(key, stream);\n } else {\n myVideoStreams.set(key, stream);\n }\n update({\n session,\n state: SessionState.Connected,\n myAudioStreams: Array.from(myAudioStreams.values()),\n myVideoStreams: Array.from(myVideoStreams.values()),\n audioStreams: Array.from(audioStreams.values()),\n videoStreams: Array.from(videoStreams.values()),\n publishers,\n consumers,\n consumerPairs,\n });\n });\n\n session.on('mystream_removed', (stream: Atm0s.StreamRemote) => {\n if (storage.data?.session != session) return;\n const key = stream.peerId + '-' + stream.name;\n if (stream.kind === Atm0s.StreamKinds.AUDIO) {\n myAudioStreams.delete(key);\n } else {\n myVideoStreams.delete(key);\n }\n update({\n session,\n state: SessionState.Connected,\n myAudioStreams: Array.from(myAudioStreams.values()),\n myVideoStreams: Array.from(myVideoStreams.values()),\n audioStreams: Array.from(audioStreams.values()),\n videoStreams: Array.from(videoStreams.values()),\n publishers,\n consumers,\n consumerPairs,\n });\n });\n\n session.on('stream_added', (stream: Atm0s.StreamRemote) => {\n if (storage.data?.session != session) return;\n const key = stream.peerId + '-' + stream.name;\n if (stream.kind === Atm0s.StreamKinds.AUDIO) {\n audioStreams.set(key, stream);\n } else {\n videoStreams.set(key, stream);\n }\n update({\n session,\n state: SessionState.Connected,\n myAudioStreams: Array.from(myAudioStreams.values()),\n myVideoStreams: Array.from(myVideoStreams.values()),\n audioStreams: Array.from(audioStreams.values()),\n videoStreams: Array.from(videoStreams.values()),\n publishers,\n consumers,\n consumerPairs: consumerPairs,\n });\n });\n\n session.on('stream_updated', (stream: Atm0s.StreamRemote) => {\n if (storage.data?.session != session) return;\n const key = stream.peerId + '-' + stream.name;\n if (stream.kind === Atm0s.StreamKinds.AUDIO) {\n audioStreams.set(key, stream);\n } else {\n videoStreams.set(key, stream);\n }\n update({\n session,\n state: SessionState.Connected,\n myAudioStreams: Array.from(myAudioStreams.values()),\n myVideoStreams: Array.from(myVideoStreams.values()),\n audioStreams: Array.from(audioStreams.values()),\n videoStreams: Array.from(videoStreams.values()),\n publishers,\n consumers,\n consumerPairs,\n });\n });\n\n session.on('stream_removed', (stream: Atm0s.StreamRemote) => {\n if (storage.data?.session != session) return;\n const key = stream.peerId + '-' + stream.name;\n if (stream.kind === Atm0s.StreamKinds.AUDIO) {\n audioStreams.delete(key);\n } else {\n videoStreams.delete(key);\n }\n update({\n session,\n state: SessionState.Connected,\n myAudioStreams: Array.from(myAudioStreams.values()),\n myVideoStreams: Array.from(myVideoStreams.values()),\n audioStreams: Array.from(audioStreams.values()),\n videoStreams: Array.from(videoStreams.values()),\n publishers,\n consumers,\n consumerPairs,\n });\n });\n\n session.on('disconnected', () => {\n if (storage.data?.session != session) return;\n update({\n session,\n state: SessionState.Disconnected,\n myAudioStreams: Array.from(myAudioStreams.values()),\n myVideoStreams: Array.from(myVideoStreams.values()),\n audioStreams: Array.from(audioStreams.values()),\n videoStreams: Array.from(videoStreams.values()),\n publishers,\n consumers,\n consumerPairs,\n });\n });\n session.connect().catch((err) => {\n if (storage.data?.session != session) return;\n console.error(err);\n update({\n session,\n state: SessionState.Error,\n myAudioStreams: Array.from(myAudioStreams.values()),\n myVideoStreams: Array.from(myVideoStreams.values()),\n audioStreams: Array.from(audioStreams.values()),\n videoStreams: Array.from(videoStreams.values()),\n publishers,\n consumers,\n consumerPairs,\n });\n });\n update({\n session,\n state: SessionState.Connecting,\n myAudioStreams: [],\n myVideoStreams: [],\n audioStreams: [],\n videoStreams: [],\n publishers,\n consumers,\n consumerPairs,\n });\n return;\n },\n [storage, update],\n );\n\n const disconnect = useCallback(() => {\n if (storage.data?.session) {\n storage.data.session.disconnect();\n update(undefined);\n }\n }, [storage, update]);\n\n const getPublisher = useCallback(\n (ownerId: number, cfg: Atm0s.SenderConfig) => {\n const data = storage.data;\n if (data?.session) {\n let publisher = data.publishers.get(cfg.name);\n if (!publisher) {\n publisher = {\n data: new StreamPublisherWrap(\n data.session.createPublisher({\n stream: cfg.stream,\n name: cfg.name,\n kind: cfg.kind,\n preferredCodecs: cfg.preferredCodecs,\n simulcast: cfg.simulcast,\n maxBitrate: cfg.maxBitrate,\n contentHint: cfg.contentHint,\n screen: cfg.screen,\n }),\n ),\n owners: new Map(),\n };\n data.publishers.set(cfg.name, publisher);\n }\n data.publishers.get(cfg.name)?.owners.set(ownerId, new Date().getTime());\n return publisher.data;\n }\n return undefined;\n },\n [storage],\n );\n\n const backPublisher = useCallback(\n (ownerId: number, cfg: Atm0s.SenderConfig) => {\n const data = storage.data;\n if (data?.session) {\n const publisher = data.publishers.get(cfg.name);\n if (publisher) {\n publisher.owners.delete(ownerId);\n if (publisher.owners.size == 0) {\n publisher.data.switchStream(null);\n data.publishers.delete(cfg.name);\n }\n }\n }\n return undefined;\n },\n [storage],\n );\n\n const getConsumer = useCallback(\n (ownerId: number, stream: Atm0s.StreamRemote) => {\n const data = storage.data;\n if (data?.session) {\n const key = stream.peerId + '-' + stream.name;\n let consumer = data.consumers.get(key);\n if (!consumer) {\n consumer = {\n data: data.session.createConsumer(stream),\n owners: new Map(),\n };\n data.consumers.set(key, consumer);\n }\n data.consumers.get(key)?.owners.set(ownerId, new Date().getTime());\n return consumer.data;\n }\n return undefined;\n },\n [storage],\n );\n\n const backConsumer = useCallback(\n (ownerId: number, stream: Atm0s.StreamRemote) => {\n const data = storage.data;\n if (data?.session) {\n const key = stream.peerId + '-' + stream.name;\n const consumer = data.consumers.get(key);\n if (consumer) {\n consumer.owners.delete(ownerId);\n if (consumer.owners.size == 0) {\n data.consumers.delete(key);\n }\n }\n }\n return undefined;\n },\n [storage],\n );\n\n const getConsumerPair = useCallback(\n (ownerId: number, peerId: string, audioName: string, videoName: string) => {\n const data = storage.data;\n if (data?.session) {\n const key = peerId + '-' + audioName + '-' + videoName;\n let consumer = data.consumerPairs.get(key);\n if (!consumer) {\n consumer = {\n data: data.session.createConsumerPair(peerId, audioName, videoName),\n owners: new Map(),\n };\n data.consumerPairs.set(key, consumer);\n }\n data.consumerPairs.get(key)?.owners.set(ownerId, new Date().getTime());\n return consumer.data;\n }\n return undefined;\n },\n [storage],\n );\n\n const backConsumerPair = useCallback(\n (ownerId: number, peerId: string, audioName: string, videoName: string) => {\n const data = storage.data;\n if (data?.session) {\n const key = peerId + '-' + audioName + '-' + videoName;\n const consumer = data.consumerPairs.get(key);\n if (consumer) {\n consumer.owners.delete(ownerId);\n if (consumer.owners.size == 0) {\n data.consumerPairs.delete(key);\n }\n }\n }\n return undefined;\n },\n [storage],\n );\n\n React.useEffect(() => {\n if (props.url && props.config) {\n connect(props.url, props.config);\n return () => {\n disconnect();\n };\n }\n }, [props.url, props.config, connect, disconnect]);\n\n return (\n \n {props.children}\n \n );\n};\n","import { useContext } from 'react';\nimport { SessionContext } from '../components/provider';\nimport Atm0s from '@8xff/atm0s-media-js';\n\nexport const useRemoteStreams = (kind: Atm0s.StreamKinds, isMine?: boolean): Atm0s.StreamRemote[] => {\n const { data } = useContext(SessionContext);\n if (kind == Atm0s.StreamKinds.AUDIO) {\n if (isMine === true) {\n return data?.myAudioStreams || [];\n } else {\n return data?.audioStreams || [];\n }\n } else {\n if (isMine === true) {\n return data?.myVideoStreams || [];\n } else {\n return data?.videoStreams || [];\n }\n }\n};\n\nexport const usePeerRemoteStreams = (peerId: string, kind: Atm0s.StreamKinds): Atm0s.StreamRemote[] => {\n const { data } = useContext(SessionContext);\n if (kind == Atm0s.StreamKinds.AUDIO) {\n return data?.audioStreams.filter((a) => a.peerId === peerId) || [];\n } else {\n return data?.videoStreams.filter((a) => a.peerId === peerId) || [];\n }\n};\n","import { useContext } from 'react';\nimport { SessionContext } from '../components/provider';\nimport Atm0s from '@8xff/atm0s-media-js';\n\nexport const useSession = (): Atm0s.Session | undefined => {\n const { data } = useContext(SessionContext);\n return data?.session;\n};\n","import { useContext } from 'react';\nimport { SessionContext, SessionState } from '../components/provider';\n\nexport const useSessionState = (): SessionState => {\n const { data } = useContext(SessionContext);\n return data?.state || SessionState.New;\n};\n","import { useContext } from 'react';\nimport { SessionContext } from '../components/provider';\nimport type { ISessionConfig } from '@8xff/atm0s-media-js';\n\ninterface Actions {\n connect: (url: string, config: ISessionConfig) => void;\n disconnect: () => void;\n playAudioMix: () => void;\n}\n\nexport const useActions = (): Actions => {\n const { connect, disconnect } = useContext(SessionContext);\n return {\n connect,\n disconnect,\n playAudioMix: () => {\n // data?.session.getMixMinusAudio()?.play();\n },\n };\n};\n","import { useContext, useEffect, useMemo, useState, type LegacyRef } from 'react';\nimport { SessionContext, SessionState } from '../components/provider';\nimport Atm0s from '@8xff/atm0s-media-js';\nimport { useSessionState } from './state';\n\nlet idSeed = 0;\nexport const useConsumer = (\n remote?: Atm0s.StreamRemote,\n priority?: number,\n maxSpatial?: number,\n maxTemporal?: number,\n): [LegacyRef | undefined, Atm0s.StreamReceiverState, Atm0s.StreamConsumer | undefined] => {\n const consumerId = useMemo(() => idSeed++, []);\n const sessionState = useSessionState();\n const [consumer, setConsumer] = useState();\n const [state, setState] = useState(Atm0s.StreamReceiverState.NoSource);\n const [element, setElement] = useState();\n const { data, getConsumer, backConsumer } = useContext(SessionContext);\n\n const isConnectionEstablished = [SessionState.Connected, SessionState.Reconnecting].indexOf(sessionState) >= 0;\n\n useEffect(() => {\n if (data?.session && remote) {\n const consumer = getConsumer(consumerId, remote);\n if (consumer) {\n consumer.on('state', setState);\n setState(consumer.state);\n setConsumer(consumer);\n return () => {\n consumer?.unview('use-consumer-' + consumerId);\n consumer?.off('state', setState);\n backConsumer(consumerId, remote);\n };\n }\n }\n }, [data?.session, remote]);\n\n useEffect(() => {\n if (element && consumer && isConnectionEstablished) {\n element.srcObject = consumer.view('use-consumer-' + consumerId, priority, maxSpatial, maxTemporal);\n return () => {\n element.srcObject = null;\n consumer.unview('use-consumer-' + consumerId);\n };\n }\n }, [element, consumer, isConnectionEstablished]);\n\n useEffect(() => {\n if (element && consumer && isConnectionEstablished) {\n consumer.limit('use-consumer-' + consumerId, priority, maxSpatial, maxTemporal);\n }\n }, [element, consumer, isConnectionEstablished, priority, maxSpatial, maxTemporal]);\n\n const ref = (instance: HTMLVideoElement | null) => {\n setElement(instance || undefined);\n };\n\n return [ref, state, consumer];\n};\n\nexport const useConsumerPair = (\n peerId: string,\n audioName: string,\n videoName: string,\n priority?: number,\n maxSpatial?: number,\n maxTemporal?: number,\n): [LegacyRef | undefined, Atm0s.StreamReceiverState, Atm0s.StreamConsumerPair | undefined] => {\n const consumerId = useMemo(() => idSeed++, []);\n const sessionState = useSessionState();\n const [consumer, setConsumer] = useState();\n const [state, setState] = useState(Atm0s.StreamReceiverState.NoSource);\n const [element, setElement] = useState();\n const { data, getConsumerPair: getConsumerPair, backConsumerPair: backConsumerPair } = useContext(SessionContext);\n\n const isConnectionEstablished = [SessionState.Connected, SessionState.Reconnecting].indexOf(sessionState) >= 0;\n\n useEffect(() => {\n if (data?.session) {\n const consumer = getConsumerPair(consumerId, peerId, audioName, videoName);\n if (consumer) {\n consumer.on('state', setState);\n setState(consumer.state);\n setConsumer(consumer);\n return () => {\n consumer?.off('state', setState);\n backConsumerPair(consumerId, peerId, audioName, videoName);\n };\n }\n }\n }, [data?.session, peerId, audioName, videoName]);\n\n useEffect(() => {\n if (element && consumer && isConnectionEstablished) {\n element.srcObject = consumer.view('use-consumer-' + consumerId, priority, maxSpatial, maxTemporal);\n return () => {\n element.srcObject = null;\n consumer.unview('use-consumer-' + consumerId);\n };\n }\n }, [element, consumer, isConnectionEstablished]);\n\n useEffect(() => {\n if (element && consumer && isConnectionEstablished) {\n consumer.limit('use-consumer-' + consumerId, priority, maxSpatial, maxTemporal);\n }\n }, [element, consumer, isConnectionEstablished, priority, maxSpatial, maxTemporal]);\n\n const ref = (instance: HTMLVideoElement | null) => {\n setElement(instance || undefined);\n };\n\n return [ref, state, consumer];\n};\n\nexport const useLocalConsumer = (stream?: MediaStream) => {\n const [element, setElement] = useState();\n useEffect(() => {\n if (element && stream) {\n element.srcObject = stream;\n return () => {\n element.srcObject = null;\n };\n }\n }, [element, stream]);\n\n return (instance: HTMLVideoElement | null) => {\n setElement(instance || undefined);\n };\n};\n","import { useContext, useEffect, useMemo, useState } from 'react';\nimport { SessionContext, StreamPublisherWrap } from '../components/provider';\nimport Atm0s from '@8xff/atm0s-media-js';\n\nlet idSeed = 0;\n\nexport const usePublisher = (\n cfg: Atm0s.SenderConfig,\n): [Atm0s.StreamSenderState, MediaStream | undefined | null, StreamPublisherWrap | undefined] => {\n const publisherId = useMemo(() => idSeed++, []);\n const [state, setState] = useState(Atm0s.StreamSenderState.Created);\n const [producer, setProducer] = useState();\n const { data, getPublisher: getPublisher, backPublisher: backPublisher } = useContext(SessionContext);\n useEffect(() => {\n if (data?.session) {\n const newProducer = getPublisher(publisherId, cfg);\n if (newProducer) {\n const onUpdateState = (state: Atm0s.StreamSenderState) => {\n setState(state);\n };\n newProducer.on('state', onUpdateState);\n setProducer(newProducer);\n setState(newProducer.state);\n return () => {\n newProducer?.off('state', onUpdateState);\n backPublisher(publisherId, cfg);\n };\n }\n }\n }, [data?.session, cfg.kind + cfg.name]);\n\n return [state, producer?.localStream, producer];\n};\n","import { useContext, useEffect, useState } from 'react';\nimport * as Bluesea from '@8xff/atm0s-media-js';\nimport { StreamPublisherWrap, BlueseaSessionContext } from '../components';\n\nexport const useAudioLevelConsumer = (\n consumer?: Bluesea.StreamConsumer | Bluesea.StreamConsumerPair,\n): number | undefined => {\n const [audioLevel, setAudioLevel] = useState(undefined);\n useEffect(() => {\n if (consumer) {\n const handler = (level: number) => {\n setAudioLevel(level);\n };\n consumer.on('audio_level', handler);\n\n return () => {\n consumer.off('audio_level', handler);\n };\n } else {\n setAudioLevel(undefined);\n }\n }, [consumer]);\n return audioLevel;\n};\n\nexport const useAudioLevelProducer = (producer?: StreamPublisherWrap): number | undefined => {\n const [audioLevel, setAudioLevel] = useState(undefined);\n useEffect(() => {\n if (producer) {\n const handler = (level: number) => {\n setAudioLevel(level);\n };\n producer.on('audio_level', handler);\n\n return () => {\n producer.off('audio_level', handler);\n };\n } else {\n setAudioLevel(undefined);\n }\n }, [producer]);\n return audioLevel;\n};\n\nexport interface AudioMixSlotInfo {\n peerId: string;\n streamName: string;\n audioLevel: number;\n}\n\nexport const useAudioSlotMix = (slotIndex: number) => {\n const [slot, setSlot] = useState(undefined);\n const { data } = useContext(BlueseaSessionContext);\n useEffect(() => {\n const mixMinus = data?.session.getMixMinusAudio();\n if (mixMinus) {\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n const handler = (info: any | null) => {\n if (info) {\n const sourceId = info[0].split(':');\n setSlot({\n peerId: sourceId[0],\n streamName: sourceId[1],\n audioLevel: info[1],\n });\n } else {\n setSlot(undefined);\n }\n };\n mixMinus.on(`slot_${slotIndex}`, handler);\n\n return () => {\n mixMinus?.off(`slot_${slotIndex}`, handler);\n };\n }\n }, [slotIndex, data?.session.getMixMinusAudio()]);\n return slot;\n};\n\nexport const useAudioLevelMix = (peerId: string, streamName: string) => {\n const [audioLevel, setAudioLevel] = useState(undefined);\n const { data } = useContext(BlueseaSessionContext);\n useEffect(() => {\n const mixMinus = data?.session.getMixMinusAudio();\n if (mixMinus) {\n const handler = (level: number | null) => {\n setAudioLevel(level || undefined);\n };\n mixMinus.on(`source_${peerId}:${streamName}`, handler);\n\n return () => {\n mixMinus?.off(`source_${peerId}:${streamName}`, handler);\n };\n }\n }, [peerId, streamName, data?.session.getMixMinusAudio()]);\n return audioLevel;\n};\n","import { StreamRemote } from '@8xff/atm0s-media-js';\nimport React from 'react';\nimport { useConsumer, useLocalConsumer } from '../hooks';\n\nexport const RemoteViewer = (props: { remote: StreamRemote; priority?: number }) => {\n const [ref, state] = useConsumer(props.remote, props.priority);\n return (\n
\n
{state}
\n \n
\n );\n};\n\nexport const LocalViewer = (props: { stream: MediaStream }) => {\n const ref = useLocalConsumer(props.stream);\n return ;\n};\n\nexport const VideoViewer = (props: { stream: MediaStream | StreamRemote; priority?: number }) => {\n if (props.stream instanceof StreamRemote) {\n return ;\n } else {\n return ;\n }\n};\n"],"names":["idSeed","BlueseaSessionContext"],"mappings":"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"} \ No newline at end of file diff --git a/dist/index.umd.js b/dist/index.umd.js index 9a223c5..4d3c9d2 100644 --- a/dist/index.umd.js +++ b/dist/index.umd.js @@ -1,36 +1,948 @@ /*! - * [libraryName] v0.0.0 - * (c) [authorFullName] + * @8xff/atm0s-media-react v0.0.0 + * (c) Luong Ngoc Minh * Released under the MIT License. */ (function (global, factory) { - typeof exports === 'object' && typeof module !== 'undefined' ? factory(exports) : - typeof define === 'function' && define.amd ? define(['exports'], factory) : - (global = typeof globalThis !== 'undefined' ? globalThis : global || self, factory(global["[libraryCamelCaseName]"] = {})); -})(this, (function (exports) { 'use strict'; - - /** - * Check if value is parseable to number. - * @example - * ```js - * isNumberParseable('AAAA'); - * //=> false - * - * isNumberParseable('100'); - * //=> true - * - * if (!isNumberParseable(value)) - * throw new Error('Value can\'t be parseable to `Number`.') - * return Number(value); - * ``` - * @param value - An `unknown` value to be checked. - */ - var isNumberParseable = function (value) { - return !Number.isNaN(Number(value)); - }; - - exports.isNumberParseable = isNumberParseable; + typeof exports === 'object' && typeof module !== 'undefined' ? factory(exports, require('react'), require('@8xff/atm0s-media-js'), require('@8xff/atm0s-media-js/types/lib/utils/typed-event-emitter'), require('@8xff/atm0s-media-js/types/lib/utils/logger')) : + typeof define === 'function' && define.amd ? define(['exports', 'react', '@8xff/atm0s-media-js', '@8xff/atm0s-media-js/types/lib/utils/typed-event-emitter', '@8xff/atm0s-media-js/types/lib/utils/logger'], factory) : + (global = typeof globalThis !== 'undefined' ? globalThis : global || self, factory(global.Atm0s = {}, global.React, global.Atm0s, global.typedEventEmitter, global.logger$1)); +})(this, (function (exports, React, Atm0s, typedEventEmitter, logger$1) { 'use strict'; + + /****************************************************************************** + Copyright (c) Microsoft Corporation. + + Permission to use, copy, modify, and/or distribute this software for any + purpose with or without fee is hereby granted. + + THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES WITH + REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY + AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT, + INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM + LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR + OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR + PERFORMANCE OF THIS SOFTWARE. + ***************************************************************************** */ + /* global Reflect, Promise, SuppressedError, Symbol */ + + var extendStatics = function(d, b) { + extendStatics = Object.setPrototypeOf || + ({ __proto__: [] } instanceof Array && function (d, b) { d.__proto__ = b; }) || + function (d, b) { for (var p in b) if (Object.prototype.hasOwnProperty.call(b, p)) d[p] = b[p]; }; + return extendStatics(d, b); + }; + + function __extends(d, b) { + if (typeof b !== "function" && b !== null) + throw new TypeError("Class extends value " + String(b) + " is not a constructor or null"); + extendStatics(d, b); + function __() { this.constructor = d; } + d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __()); + } + + typeof SuppressedError === "function" ? SuppressedError : function (error, suppressed, message) { + var e = new Error(message); + return e.name = "SuppressedError", e.error = error, e.suppressed = suppressed, e; + }; + + var logger = logger$1.getLogger('DeviceHook'); + var StreamContainer = /** @class */ (function (_super) { + __extends(StreamContainer, _super); + function StreamContainer(key) { + var _this = _super.call(this) || this; + _this.key = key; + _this.count = 0; + _this.data = {}; + logger.log('Created container for local stream', key); + return _this; + } + StreamContainer.prototype.setData = function (data) { + this.data = data; + this.emit('changed', data); + }; + StreamContainer.prototype.retain = function () { + this.count += 1; + logger.log('Retain local stream', this.key, this.count); + return this.count; + }; + StreamContainer.prototype.release = function () { + var _a; + this.count -= 1; + logger.log('Release local stream', this.key, this.count); + if (this.count == 0) { + logger.log('Destroy local stream', this.key); + (_a = this.data.media) === null || _a === void 0 ? void 0 : _a.getTracks().map(function (track) { + track.stop(); + }); + } + return this.count; + }; + return StreamContainer; + }(typedEventEmitter.TypedEventEmitter)); + var globalStore = new Map(); + var useDevices = function (kind) { + var _a = React.useState([]), devices = _a[0], setDevices = _a[1]; + var _b = React.useState(null), error = _b[0], setError = _b[1]; + React.useEffect(function () { + navigator.mediaDevices + .enumerateDevices() + .then(function (devices) { + setDevices(devices.filter(function (d) { return d.kind == kind; })); + }) + .catch(function (error) { + setDevices([]); + setError(error); + }); + }, [kind]); + return [devices, error]; + }; + function getDevicePrivate(kind, deviceId, callback) { + var key = kind + '-' + deviceId; + var containerSlot = globalStore.get(key); + if (containerSlot) { + containerSlot.on('changed', callback); + callback(containerSlot.data); + } + else { + containerSlot = new StreamContainer(key); + globalStore.set(key, containerSlot); + var constraints = {}; + if (kind == 'audioinput') { + constraints = { + audio: typeof deviceId == 'string' + ? { + deviceId: deviceId, + } + : true, + }; + } + else if (kind == 'videoinput') { + constraints = { + video: typeof deviceId == 'string' + ? { + deviceId: deviceId, + } + : true, + }; + } + navigator.mediaDevices + .getUserMedia(constraints) + .then(function (stream) { + stream.cachedKey = key; + containerSlot === null || containerSlot === void 0 ? void 0 : containerSlot.setData({ media: stream }); + callback({ media: stream }); + }) + .catch(function (err) { + containerSlot === null || containerSlot === void 0 ? void 0 : containerSlot.setData({ error: err }); + callback({ error: err }); + }); + } + return [containerSlot, key]; + } + function getDevice(kind, deviceId) { + return new Promise(function (resolve, reject) { + getDevicePrivate(kind, deviceId, function (res) { + if (res.error) { + reject(res.error); + } + else { + resolve(res.media); + } + }); + }); + } + function retainDevice(key) { + var slot = globalStore.get(key); + slot === null || slot === void 0 ? void 0 : slot.retain(); + } + function releaseDevice(key) { + var slot = globalStore.get(key); + if ((slot === null || slot === void 0 ? void 0 : slot.release()) == 0) { + globalStore.delete(key); + } + } + var useDevice = function (kind, deviceId) { + var _a = React.useState({}), res = _a[0], setRes = _a[1]; + React.useEffect(function () { + if (deviceId != false) { + var _a = getDevicePrivate(kind, deviceId, setRes), containerSlot_1 = _a[0], key_1 = _a[1]; + containerSlot_1.retain(); + return function () { + setRes({ media: undefined, error: undefined }); + if ((containerSlot_1 === null || containerSlot_1 === void 0 ? void 0 : containerSlot_1.release()) == 0) { + globalStore.delete(key_1); + } + }; + } + }, [kind, deviceId]); + return [res.media, res.error]; + }; + var useUserMedia = function (constraints, active) { + var _a = React.useState({}), res = _a[0], setRes = _a[1]; + React.useEffect(function () { + if (active) { + var gotStream_1; + navigator.mediaDevices + .getUserMedia(constraints) + .then(function (stream) { + gotStream_1 = stream; + setRes({ media: stream }); + }) + .catch(function (err) { + gotStream_1 = undefined; + setRes({ error: err }); + }); + return function () { + setRes({ media: undefined, error: undefined }); + gotStream_1 === null || gotStream_1 === void 0 ? void 0 : gotStream_1.getTracks().forEach(function (track) { + track.stop(); + }); + }; + } + }, [JSON.stringify(constraints), active]); + return [res.media, res.error]; + }; + var useDisplayMedia = function (constraints, active) { + var _a = React.useState({}), res = _a[0], setRes = _a[1]; + React.useEffect(function () { + if (active) { + var gotStream_2; + navigator.mediaDevices + .getDisplayMedia(constraints) + .then(function (stream) { + gotStream_2 = stream; + setRes({ media: stream }); + }) + .catch(function (err) { + gotStream_2 = undefined; + setRes({ error: err }); + }); + return function () { + setRes({ media: undefined, error: undefined }); + gotStream_2 === null || gotStream_2 === void 0 ? void 0 : gotStream_2.getTracks().forEach(function (track) { + track.stop(); + }); + }; + } + }, [JSON.stringify(constraints), active]); + return [res.media, res.error]; + }; + + exports.SessionState = void 0; + (function (SessionState) { + SessionState["New"] = "new"; + SessionState["Connecting"] = "connecting"; + SessionState["Connected"] = "connected"; + SessionState["Reconnecting"] = "reconnecting"; + SessionState["Disconnected"] = "disconnected"; + SessionState["Error"] = "error"; + })(exports.SessionState || (exports.SessionState = {})); + var StreamPublisherWrap = /** @class */ (function () { + function StreamPublisherWrap(publisher) { + this.publisher = publisher; + } + Object.defineProperty(StreamPublisherWrap.prototype, "state", { + get: function () { + return this.publisher.state; + }, + enumerable: false, + configurable: true + }); + Object.defineProperty(StreamPublisherWrap.prototype, "localStream", { + get: function () { + return this.publisher.localStream; + }, + enumerable: false, + configurable: true + }); + StreamPublisherWrap.prototype.on = function (type, callback) { + this.publisher.on(type, callback); + }; + StreamPublisherWrap.prototype.off = function (type, callback) { + this.publisher.on(type, callback); + }; + StreamPublisherWrap.prototype.switchStream = function (stream) { + if (stream) { + // eslint-disable-next-line @typescript-eslint/no-explicit-any + var cachedKey = stream.cachedKey; + if (cachedKey) { + retainDevice(cachedKey); + } + } + if (this.publisher.localStream) { + // eslint-disable-next-line @typescript-eslint/no-explicit-any + var cacheKey = this.publisher.localStream.cachedKey; + if (cacheKey) { + releaseDevice(cacheKey); + } + } + return this.publisher.switch(stream); + }; + return StreamPublisherWrap; + }()); + var SessionContext = React.createContext({}); + var GlobalVer = 0; + var SessionProvider = function (props) { + // if (props.log_level != undefined) { + // Atm0s.setLogLevel(props.log_level); + // } + var _a = React.useState(0), setVer = _a[1]; + var storage = React.useMemo(function () { + return { data: undefined }; + }, []); + var update = React.useCallback(function (data) { + storage.data = data; + setVer(GlobalVer++); + }, [storage, setVer]); + var connect = React.useCallback(function (url, config) { + var _a, _b; + if ((_a = storage.data) === null || _a === void 0 ? void 0 : _a.session) { + return function () { + var _a; + (_a = storage.data) === null || _a === void 0 ? void 0 : _a.session.disconnect(); + }; + } + var session = Atm0s.createSession(url, config); + var myAudioStreams = new Map(); + var myVideoStreams = new Map(); + var audioStreams = new Map(); + var videoStreams = new Map(); + var publishers = new Map(); + var consumers = new Map(); + var consumerPairs = new Map(); + (_b = config === null || config === void 0 ? void 0 : config.senders) === null || _b === void 0 ? void 0 : _b.map(function (sender) { + if (sender.stream) { + // eslint-disable-next-line @typescript-eslint/no-explicit-any + var cachedKey = sender.stream.cachedKey; + if (cachedKey) { + retainDevice(cachedKey); + } + } + }); + session.on('connected', function () { + var _a; + if (((_a = storage.data) === null || _a === void 0 ? void 0 : _a.session) != session) + return; + update({ + session: session, + state: exports.SessionState.Connected, + myAudioStreams: Array.from(myAudioStreams.values()), + myVideoStreams: Array.from(myVideoStreams.values()), + audioStreams: Array.from(audioStreams.values()), + videoStreams: Array.from(videoStreams.values()), + publishers: publishers, + consumers: consumers, + consumerPairs: consumerPairs, + }); + }); + session.on('mystream_added', function (stream) { + var _a; + if (((_a = storage.data) === null || _a === void 0 ? void 0 : _a.session) != session) + return; + var key = stream.peerId + '-' + stream.name; + if (stream.kind === Atm0s.StreamKinds.AUDIO) { + myAudioStreams.set(key, stream); + } + else { + myVideoStreams.set(key, stream); + } + update({ + session: session, + state: exports.SessionState.Connected, + myAudioStreams: Array.from(myAudioStreams.values()), + myVideoStreams: Array.from(myVideoStreams.values()), + audioStreams: Array.from(audioStreams.values()), + videoStreams: Array.from(videoStreams.values()), + publishers: publishers, + consumers: consumers, + consumerPairs: consumerPairs, + }); + }); + session.on('mystream_updated', function (stream) { + var _a; + if (((_a = storage.data) === null || _a === void 0 ? void 0 : _a.session) != session) + return; + var key = stream.peerId + '-' + stream.name; + if (stream.kind === Atm0s.StreamKinds.AUDIO) { + myAudioStreams.set(key, stream); + } + else { + myVideoStreams.set(key, stream); + } + update({ + session: session, + state: exports.SessionState.Connected, + myAudioStreams: Array.from(myAudioStreams.values()), + myVideoStreams: Array.from(myVideoStreams.values()), + audioStreams: Array.from(audioStreams.values()), + videoStreams: Array.from(videoStreams.values()), + publishers: publishers, + consumers: consumers, + consumerPairs: consumerPairs, + }); + }); + session.on('mystream_removed', function (stream) { + var _a; + if (((_a = storage.data) === null || _a === void 0 ? void 0 : _a.session) != session) + return; + var key = stream.peerId + '-' + stream.name; + if (stream.kind === Atm0s.StreamKinds.AUDIO) { + myAudioStreams.delete(key); + } + else { + myVideoStreams.delete(key); + } + update({ + session: session, + state: exports.SessionState.Connected, + myAudioStreams: Array.from(myAudioStreams.values()), + myVideoStreams: Array.from(myVideoStreams.values()), + audioStreams: Array.from(audioStreams.values()), + videoStreams: Array.from(videoStreams.values()), + publishers: publishers, + consumers: consumers, + consumerPairs: consumerPairs, + }); + }); + session.on('stream_added', function (stream) { + var _a; + if (((_a = storage.data) === null || _a === void 0 ? void 0 : _a.session) != session) + return; + var key = stream.peerId + '-' + stream.name; + if (stream.kind === Atm0s.StreamKinds.AUDIO) { + audioStreams.set(key, stream); + } + else { + videoStreams.set(key, stream); + } + update({ + session: session, + state: exports.SessionState.Connected, + myAudioStreams: Array.from(myAudioStreams.values()), + myVideoStreams: Array.from(myVideoStreams.values()), + audioStreams: Array.from(audioStreams.values()), + videoStreams: Array.from(videoStreams.values()), + publishers: publishers, + consumers: consumers, + consumerPairs: consumerPairs, + }); + }); + session.on('stream_updated', function (stream) { + var _a; + if (((_a = storage.data) === null || _a === void 0 ? void 0 : _a.session) != session) + return; + var key = stream.peerId + '-' + stream.name; + if (stream.kind === Atm0s.StreamKinds.AUDIO) { + audioStreams.set(key, stream); + } + else { + videoStreams.set(key, stream); + } + update({ + session: session, + state: exports.SessionState.Connected, + myAudioStreams: Array.from(myAudioStreams.values()), + myVideoStreams: Array.from(myVideoStreams.values()), + audioStreams: Array.from(audioStreams.values()), + videoStreams: Array.from(videoStreams.values()), + publishers: publishers, + consumers: consumers, + consumerPairs: consumerPairs, + }); + }); + session.on('stream_removed', function (stream) { + var _a; + if (((_a = storage.data) === null || _a === void 0 ? void 0 : _a.session) != session) + return; + var key = stream.peerId + '-' + stream.name; + if (stream.kind === Atm0s.StreamKinds.AUDIO) { + audioStreams.delete(key); + } + else { + videoStreams.delete(key); + } + update({ + session: session, + state: exports.SessionState.Connected, + myAudioStreams: Array.from(myAudioStreams.values()), + myVideoStreams: Array.from(myVideoStreams.values()), + audioStreams: Array.from(audioStreams.values()), + videoStreams: Array.from(videoStreams.values()), + publishers: publishers, + consumers: consumers, + consumerPairs: consumerPairs, + }); + }); + session.on('disconnected', function () { + var _a; + if (((_a = storage.data) === null || _a === void 0 ? void 0 : _a.session) != session) + return; + update({ + session: session, + state: exports.SessionState.Disconnected, + myAudioStreams: Array.from(myAudioStreams.values()), + myVideoStreams: Array.from(myVideoStreams.values()), + audioStreams: Array.from(audioStreams.values()), + videoStreams: Array.from(videoStreams.values()), + publishers: publishers, + consumers: consumers, + consumerPairs: consumerPairs, + }); + }); + session.connect().catch(function (err) { + var _a; + if (((_a = storage.data) === null || _a === void 0 ? void 0 : _a.session) != session) + return; + console.error(err); + update({ + session: session, + state: exports.SessionState.Error, + myAudioStreams: Array.from(myAudioStreams.values()), + myVideoStreams: Array.from(myVideoStreams.values()), + audioStreams: Array.from(audioStreams.values()), + videoStreams: Array.from(videoStreams.values()), + publishers: publishers, + consumers: consumers, + consumerPairs: consumerPairs, + }); + }); + update({ + session: session, + state: exports.SessionState.Connecting, + myAudioStreams: [], + myVideoStreams: [], + audioStreams: [], + videoStreams: [], + publishers: publishers, + consumers: consumers, + consumerPairs: consumerPairs, + }); + return; + }, [storage, update]); + var disconnect = React.useCallback(function () { + var _a; + if ((_a = storage.data) === null || _a === void 0 ? void 0 : _a.session) { + storage.data.session.disconnect(); + update(undefined); + } + }, [storage, update]); + var getPublisher = React.useCallback(function (ownerId, cfg) { + var _a; + var data = storage.data; + if (data === null || data === void 0 ? void 0 : data.session) { + var publisher = data.publishers.get(cfg.name); + if (!publisher) { + publisher = { + data: new StreamPublisherWrap(data.session.createPublisher({ + stream: cfg.stream, + name: cfg.name, + kind: cfg.kind, + preferredCodecs: cfg.preferredCodecs, + simulcast: cfg.simulcast, + maxBitrate: cfg.maxBitrate, + contentHint: cfg.contentHint, + screen: cfg.screen, + })), + owners: new Map(), + }; + data.publishers.set(cfg.name, publisher); + } + (_a = data.publishers.get(cfg.name)) === null || _a === void 0 ? void 0 : _a.owners.set(ownerId, new Date().getTime()); + return publisher.data; + } + return undefined; + }, [storage]); + var backPublisher = React.useCallback(function (ownerId, cfg) { + var data = storage.data; + if (data === null || data === void 0 ? void 0 : data.session) { + var publisher = data.publishers.get(cfg.name); + if (publisher) { + publisher.owners.delete(ownerId); + if (publisher.owners.size == 0) { + publisher.data.switchStream(null); + data.publishers.delete(cfg.name); + } + } + } + return undefined; + }, [storage]); + var getConsumer = React.useCallback(function (ownerId, stream) { + var _a; + var data = storage.data; + if (data === null || data === void 0 ? void 0 : data.session) { + var key = stream.peerId + '-' + stream.name; + var consumer = data.consumers.get(key); + if (!consumer) { + consumer = { + data: data.session.createConsumer(stream), + owners: new Map(), + }; + data.consumers.set(key, consumer); + } + (_a = data.consumers.get(key)) === null || _a === void 0 ? void 0 : _a.owners.set(ownerId, new Date().getTime()); + return consumer.data; + } + return undefined; + }, [storage]); + var backConsumer = React.useCallback(function (ownerId, stream) { + var data = storage.data; + if (data === null || data === void 0 ? void 0 : data.session) { + var key = stream.peerId + '-' + stream.name; + var consumer = data.consumers.get(key); + if (consumer) { + consumer.owners.delete(ownerId); + if (consumer.owners.size == 0) { + data.consumers.delete(key); + } + } + } + return undefined; + }, [storage]); + var getConsumerPair = React.useCallback(function (ownerId, peerId, audioName, videoName) { + var _a; + var data = storage.data; + if (data === null || data === void 0 ? void 0 : data.session) { + var key = peerId + '-' + audioName + '-' + videoName; + var consumer = data.consumerPairs.get(key); + if (!consumer) { + consumer = { + data: data.session.createConsumerPair(peerId, audioName, videoName), + owners: new Map(), + }; + data.consumerPairs.set(key, consumer); + } + (_a = data.consumerPairs.get(key)) === null || _a === void 0 ? void 0 : _a.owners.set(ownerId, new Date().getTime()); + return consumer.data; + } + return undefined; + }, [storage]); + var backConsumerPair = React.useCallback(function (ownerId, peerId, audioName, videoName) { + var data = storage.data; + if (data === null || data === void 0 ? void 0 : data.session) { + var key = peerId + '-' + audioName + '-' + videoName; + var consumer = data.consumerPairs.get(key); + if (consumer) { + consumer.owners.delete(ownerId); + if (consumer.owners.size == 0) { + data.consumerPairs.delete(key); + } + } + } + return undefined; + }, [storage]); + React.useEffect(function () { + if (props.url && props.config) { + connect(props.url, props.config); + return function () { + disconnect(); + }; + } + }, [props.url, props.config, connect, disconnect]); + return (React.createElement(SessionContext.Provider, { value: { + data: storage.data, + connect: connect, + disconnect: disconnect, + getPublisher: getPublisher, + backPublisher: backPublisher, + getConsumer: getConsumer, + backConsumer: backConsumer, + getConsumerPair: getConsumerPair, + backConsumerPair: backConsumerPair, + update: update, + } }, props.children)); + }; + + var useRemoteStreams = function (kind, isMine) { + var data = React.useContext(SessionContext).data; + if (kind == Atm0s.StreamKinds.AUDIO) { + if (isMine === true) { + return (data === null || data === void 0 ? void 0 : data.myAudioStreams) || []; + } + else { + return (data === null || data === void 0 ? void 0 : data.audioStreams) || []; + } + } + else { + if (isMine === true) { + return (data === null || data === void 0 ? void 0 : data.myVideoStreams) || []; + } + else { + return (data === null || data === void 0 ? void 0 : data.videoStreams) || []; + } + } + }; + + var useSession = function () { + var data = React.useContext(SessionContext).data; + return data === null || data === void 0 ? void 0 : data.session; + }; + + var useSessionState = function () { + var data = React.useContext(SessionContext).data; + return (data === null || data === void 0 ? void 0 : data.state) || exports.SessionState.New; + }; + + var useActions = function () { + var _a = React.useContext(SessionContext), connect = _a.connect, disconnect = _a.disconnect; + return { + connect: connect, + disconnect: disconnect, + playAudioMix: function () { + // data?.session.getMixMinusAudio()?.play(); + }, + }; + }; + + var idSeed$1 = 0; + var useConsumer = function (remote, priority, maxSpatial, maxTemporal) { + var consumerId = React.useMemo(function () { return idSeed$1++; }, []); + var sessionState = useSessionState(); + var _a = React.useState(), consumer = _a[0], setConsumer = _a[1]; + var _b = React.useState(Atm0s.StreamReceiverState.NoSource), state = _b[0], setState = _b[1]; + var _c = React.useState(), element = _c[0], setElement = _c[1]; + var _d = React.useContext(SessionContext), data = _d.data, getConsumer = _d.getConsumer, backConsumer = _d.backConsumer; + var isConnectionEstablished = [exports.SessionState.Connected, exports.SessionState.Reconnecting].indexOf(sessionState) >= 0; + React.useEffect(function () { + if ((data === null || data === void 0 ? void 0 : data.session) && remote) { + var consumer_1 = getConsumer(consumerId, remote); + if (consumer_1) { + consumer_1.on('state', setState); + setState(consumer_1.state); + setConsumer(consumer_1); + return function () { + consumer_1 === null || consumer_1 === void 0 ? void 0 : consumer_1.unview('use-consumer-' + consumerId); + consumer_1 === null || consumer_1 === void 0 ? void 0 : consumer_1.off('state', setState); + backConsumer(consumerId, remote); + }; + } + } + }, [data === null || data === void 0 ? void 0 : data.session, remote]); + React.useEffect(function () { + if (element && consumer && isConnectionEstablished) { + element.srcObject = consumer.view('use-consumer-' + consumerId, priority, maxSpatial, maxTemporal); + return function () { + element.srcObject = null; + consumer.unview('use-consumer-' + consumerId); + }; + } + }, [element, consumer, isConnectionEstablished]); + React.useEffect(function () { + if (element && consumer && isConnectionEstablished) { + consumer.limit('use-consumer-' + consumerId, priority, maxSpatial, maxTemporal); + } + }, [element, consumer, isConnectionEstablished, priority, maxSpatial, maxTemporal]); + var ref = function (instance) { + setElement(instance || undefined); + }; + return [ref, state, consumer]; + }; + var useConsumerPair = function (peerId, audioName, videoName, priority, maxSpatial, maxTemporal) { + var consumerId = React.useMemo(function () { return idSeed$1++; }, []); + var sessionState = useSessionState(); + var _a = React.useState(), consumer = _a[0], setConsumer = _a[1]; + var _b = React.useState(Atm0s.StreamReceiverState.NoSource), state = _b[0], setState = _b[1]; + var _c = React.useState(), element = _c[0], setElement = _c[1]; + var _d = React.useContext(SessionContext), data = _d.data, getConsumerPair = _d.getConsumerPair, backConsumerPair = _d.backConsumerPair; + var isConnectionEstablished = [exports.SessionState.Connected, exports.SessionState.Reconnecting].indexOf(sessionState) >= 0; + React.useEffect(function () { + if (data === null || data === void 0 ? void 0 : data.session) { + var consumer_2 = getConsumerPair(consumerId, peerId, audioName, videoName); + if (consumer_2) { + consumer_2.on('state', setState); + setState(consumer_2.state); + setConsumer(consumer_2); + return function () { + consumer_2 === null || consumer_2 === void 0 ? void 0 : consumer_2.off('state', setState); + backConsumerPair(consumerId, peerId, audioName, videoName); + }; + } + } + }, [data === null || data === void 0 ? void 0 : data.session, peerId, audioName, videoName]); + React.useEffect(function () { + if (element && consumer && isConnectionEstablished) { + element.srcObject = consumer.view('use-consumer-' + consumerId, priority, maxSpatial, maxTemporal); + return function () { + element.srcObject = null; + consumer.unview('use-consumer-' + consumerId); + }; + } + }, [element, consumer, isConnectionEstablished]); + React.useEffect(function () { + if (element && consumer && isConnectionEstablished) { + consumer.limit('use-consumer-' + consumerId, priority, maxSpatial, maxTemporal); + } + }, [element, consumer, isConnectionEstablished, priority, maxSpatial, maxTemporal]); + var ref = function (instance) { + setElement(instance || undefined); + }; + return [ref, state, consumer]; + }; + var useLocalConsumer = function (stream) { + var _a = React.useState(), element = _a[0], setElement = _a[1]; + React.useEffect(function () { + if (element && stream) { + element.srcObject = stream; + return function () { + element.srcObject = null; + }; + } + }, [element, stream]); + return function (instance) { + setElement(instance || undefined); + }; + }; + + var idSeed = 0; + var usePublisher = function (cfg) { + var publisherId = React.useMemo(function () { return idSeed++; }, []); + var _a = React.useState(Atm0s.StreamSenderState.Created), state = _a[0], setState = _a[1]; + var _b = React.useState(), producer = _b[0], setProducer = _b[1]; + var _c = React.useContext(SessionContext), data = _c.data, getPublisher = _c.getPublisher, backPublisher = _c.backPublisher; + React.useEffect(function () { + if (data === null || data === void 0 ? void 0 : data.session) { + var newProducer_1 = getPublisher(publisherId, cfg); + if (newProducer_1) { + var onUpdateState_1 = function (state) { + setState(state); + }; + newProducer_1.on('state', onUpdateState_1); + setProducer(newProducer_1); + setState(newProducer_1.state); + return function () { + newProducer_1 === null || newProducer_1 === void 0 ? void 0 : newProducer_1.off('state', onUpdateState_1); + backPublisher(publisherId, cfg); + }; + } + } + }, [data === null || data === void 0 ? void 0 : data.session, cfg.kind + cfg.name]); + return [state, producer === null || producer === void 0 ? void 0 : producer.localStream, producer]; + }; + + var useAudioLevelConsumer = function (consumer) { + var _a = React.useState(undefined), audioLevel = _a[0], setAudioLevel = _a[1]; + React.useEffect(function () { + if (consumer) { + var handler_1 = function (level) { + setAudioLevel(level); + }; + consumer.on('audio_level', handler_1); + return function () { + consumer.off('audio_level', handler_1); + }; + } + else { + setAudioLevel(undefined); + } + }, [consumer]); + return audioLevel; + }; + var useAudioLevelProducer = function (producer) { + var _a = React.useState(undefined), audioLevel = _a[0], setAudioLevel = _a[1]; + React.useEffect(function () { + if (producer) { + var handler_2 = function (level) { + setAudioLevel(level); + }; + producer.on('audio_level', handler_2); + return function () { + producer.off('audio_level', handler_2); + }; + } + else { + setAudioLevel(undefined); + } + }, [producer]); + return audioLevel; + }; + var useAudioSlotMix = function (slotIndex) { + var _a = React.useState(undefined), slot = _a[0], setSlot = _a[1]; + var data = React.useContext(SessionContext).data; + React.useEffect(function () { + var mixMinus = data === null || data === void 0 ? void 0 : data.session.getMixMinusAudio(); + if (mixMinus) { + // eslint-disable-next-line @typescript-eslint/no-explicit-any + var handler_3 = function (info) { + if (info) { + var sourceId = info[0].split(':'); + setSlot({ + peerId: sourceId[0], + streamName: sourceId[1], + audioLevel: info[1], + }); + } + else { + setSlot(undefined); + } + }; + mixMinus.on("slot_".concat(slotIndex), handler_3); + return function () { + mixMinus === null || mixMinus === void 0 ? void 0 : mixMinus.off("slot_".concat(slotIndex), handler_3); + }; + } + }, [slotIndex, data === null || data === void 0 ? void 0 : data.session.getMixMinusAudio()]); + return slot; + }; + var useAudioLevelMix = function (peerId, streamName) { + var _a = React.useState(undefined), audioLevel = _a[0], setAudioLevel = _a[1]; + var data = React.useContext(SessionContext).data; + React.useEffect(function () { + var mixMinus = data === null || data === void 0 ? void 0 : data.session.getMixMinusAudio(); + if (mixMinus) { + var handler_4 = function (level) { + setAudioLevel(level || undefined); + }; + mixMinus.on("source_".concat(peerId, ":").concat(streamName), handler_4); + return function () { + mixMinus === null || mixMinus === void 0 ? void 0 : mixMinus.off("source_".concat(peerId, ":").concat(streamName), handler_4); + }; + } + }, [peerId, streamName, data === null || data === void 0 ? void 0 : data.session.getMixMinusAudio()]); + return audioLevel; + }; + + var RemoteViewer = function (props) { + var _a = useConsumer(props.remote, props.priority), ref = _a[0], state = _a[1]; + return (React.createElement("div", { className: "w-full h-full" }, + React.createElement("div", null, state), + React.createElement("video", { muted: true, autoPlay: true, className: "w-full h-full", ref: ref }))); + }; + var LocalViewer = function (props) { + var ref = useLocalConsumer(props.stream); + return React.createElement("video", { muted: true, autoPlay: true, className: "w-full h-full", ref: ref }); + }; + var VideoViewer = function (props) { + if (props.stream instanceof Atm0s.StreamRemote) { + return React.createElement(RemoteViewer, { remote: props.stream, priority: props.priority }); + } + else { + return React.createElement(LocalViewer, { stream: props.stream }); + } + }; + + exports.BlueseaSessionContext = SessionContext; + exports.LocalViewer = LocalViewer; + exports.RemoteViewer = RemoteViewer; + exports.SessionProvider = SessionProvider; + exports.StreamPublisherWrap = StreamPublisherWrap; + exports.VideoViewer = VideoViewer; + exports.getDevice = getDevice; + exports.useActions = useActions; + exports.useAudioLevelConsumer = useAudioLevelConsumer; + exports.useAudioLevelMix = useAudioLevelMix; + exports.useAudioLevelProducer = useAudioLevelProducer; + exports.useAudioSlotMix = useAudioSlotMix; + exports.useConsumer = useConsumer; + exports.useConsumerPair = useConsumerPair; + exports.useDevice = useDevice; + exports.useDevices = useDevices; + exports.useDisplayMedia = useDisplayMedia; + exports.useLocalConsumer = useLocalConsumer; + exports.usePublisher = usePublisher; + exports.useRemoteStreams = useRemoteStreams; + exports.useSession = useSession; + exports.useSessionState = useSessionState; + exports.useUserMedia = useUserMedia; })); //# sourceMappingURL=index.umd.js.map diff --git a/dist/index.umd.js.map b/dist/index.umd.js.map index 3bad2fe..d114acf 100644 --- a/dist/index.umd.js.map +++ b/dist/index.umd.js.map @@ -1 +1 @@ -{"version":3,"file":"index.umd.js","sources":["../src/index.ts"],"sourcesContent":["/**\n * A Branded Type for values parseable to number.\n */\nexport type NumberParseable = (number | string | boolean) & {\n readonly isNumberParseble: unique symbol;\n};\n\n/**\n * Check if value is parseable to number.\n * @example\n * ```js\n * isNumberParseable('AAAA');\n * //=> false\n *\n * isNumberParseable('100');\n * //=> true\n *\n * if (!isNumberParseable(value))\n * throw new Error('Value can\\'t be parseable to `Number`.')\n * return Number(value);\n * ```\n * @param value - An `unknown` value to be checked.\n */\nexport const isNumberParseable = (value: unknown): value is NumberParseable =>\n !Number.isNaN(Number(value));\n"],"names":[],"mappings":";;;;;;;;;;;;EAOA;;;;;;;;;;;;;;;EAeG;AACI,MAAM,iBAAiB,GAAG,UAAC,KAAc,EAAA;MAC9C,OAAA,CAAC,MAAM,CAAC,KAAK,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC,CAAA;EAA5B;;;;;;;;"} \ No newline at end of file +{"version":3,"file":"index.umd.js","sources":["../src/hooks/device.ts","../src/components/provider.tsx","../src/hooks/remote.ts","../src/hooks/session.ts","../src/hooks/state.ts","../src/hooks/actions.ts","../src/hooks/consumer.ts","../src/hooks/publisher.ts","../src/hooks/audio_level.ts","../src/components/video_viewer.tsx"],"sourcesContent":["import { TypedEventEmitter } from '@8xff/atm0s-media-js/types/lib/utils/typed-event-emitter';\nimport { getLogger } from '@8xff/atm0s-media-js/types/lib/utils/logger';\nimport { useEffect, useState } from 'react';\n\nconst logger = getLogger('DeviceHook');\n\ninterface Return {\n media?: MediaStream;\n error?: Error;\n}\n\nclass StreamContainer extends TypedEventEmitter<{ changed: (data: Return) => void }> {\n count = 0;\n data: Return = {};\n\n constructor(private key: string) {\n super();\n logger.log('Created container for local stream', key);\n }\n\n setData(data: Return) {\n this.data = data;\n this.emit('changed', data);\n }\n\n retain() {\n this.count += 1;\n logger.log('Retain local stream', this.key, this.count);\n return this.count;\n }\n\n release() {\n this.count -= 1;\n logger.log('Release local stream', this.key, this.count);\n if (this.count == 0) {\n logger.log('Destroy local stream', this.key);\n this.data.media?.getTracks().map((track) => {\n track.stop();\n });\n }\n return this.count;\n }\n}\nconst globalStore: Map = new Map();\n\nexport const useDevices = (\n kind: MediaDeviceKind,\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n): [MediaDeviceInfo[], any | null] => {\n const [devices, setDevices] = useState([]);\n const [error, setError] = useState(null);\n useEffect(() => {\n navigator.mediaDevices\n .enumerateDevices()\n .then((devices) => {\n setDevices(devices.filter((d) => d.kind == kind));\n })\n .catch((error) => {\n setDevices([]);\n setError(error);\n });\n }, [kind]);\n\n return [devices, error];\n};\n\nfunction getDevicePrivate(\n kind: MediaDeviceKind,\n deviceId: string | boolean,\n callback: (data: Return) => void,\n): [StreamContainer, string] {\n const key = kind + '-' + deviceId;\n let containerSlot = globalStore.get(key);\n if (containerSlot) {\n containerSlot.on('changed', callback);\n callback(containerSlot.data);\n } else {\n containerSlot = new StreamContainer(key);\n globalStore.set(key, containerSlot);\n let constraints: MediaStreamConstraints = {};\n if (kind == 'audioinput') {\n constraints = {\n audio:\n typeof deviceId == 'string'\n ? {\n deviceId: deviceId,\n }\n : true,\n };\n } else if (kind == 'videoinput') {\n constraints = {\n video:\n typeof deviceId == 'string'\n ? {\n deviceId: deviceId,\n }\n : true,\n };\n }\n navigator.mediaDevices\n .getUserMedia(constraints)\n .then((stream) => {\n stream.cachedKey = key;\n containerSlot?.setData({ media: stream });\n callback({ media: stream });\n })\n .catch((err) => {\n containerSlot?.setData({ error: err });\n callback({ error: err });\n });\n }\n\n return [containerSlot, key];\n}\n\nexport function getDevice(kind: MediaDeviceKind, deviceId: string | boolean): Promise {\n return new Promise((resolve, reject) => {\n getDevicePrivate(kind, deviceId, (res) => {\n if (res.error) {\n reject(res.error);\n } else {\n resolve(res.media!);\n }\n });\n });\n}\n\nexport function retainDevice(key: string) {\n const slot = globalStore.get(key);\n slot?.retain();\n}\n\nexport function releaseDevice(key: string) {\n const slot = globalStore.get(key);\n if (slot?.release() == 0) {\n globalStore.delete(key);\n }\n}\n\nexport const useDevice = (\n kind: MediaDeviceKind,\n deviceId: string | boolean,\n): [MediaStream | undefined, Error | undefined] => {\n const [res, setRes] = useState({} as Return);\n useEffect(() => {\n if (deviceId != false) {\n const [containerSlot, key] = getDevicePrivate(kind, deviceId, setRes);\n containerSlot.retain();\n return () => {\n setRes({ media: undefined, error: undefined });\n if (containerSlot?.release() == 0) {\n globalStore.delete(key);\n }\n };\n }\n }, [kind, deviceId]);\n return [res.media, res.error];\n};\n\nexport const useUserMedia = (\n constraints?: MediaStreamConstraints,\n active?: boolean,\n): [MediaStream | undefined, Error | undefined] => {\n const [res, setRes] = useState({} as Return);\n useEffect(() => {\n if (active) {\n let gotStream: MediaStream | undefined;\n navigator.mediaDevices\n .getUserMedia(constraints)\n .then((stream) => {\n gotStream = stream;\n setRes({ media: stream });\n })\n .catch((err) => {\n gotStream = undefined;\n setRes({ error: err });\n });\n return () => {\n setRes({ media: undefined, error: undefined });\n gotStream?.getTracks().forEach((track) => {\n track.stop();\n });\n };\n }\n }, [JSON.stringify(constraints), active]);\n return [res.media, res.error];\n};\n\nexport const useDisplayMedia = (\n constraints?: DisplayMediaStreamOptions,\n active?: boolean,\n): [MediaStream | undefined, Error | undefined] => {\n const [res, setRes] = useState({} as Return);\n useEffect(() => {\n if (active) {\n let gotStream: MediaStream | undefined;\n navigator.mediaDevices\n .getDisplayMedia(constraints)\n .then((stream) => {\n gotStream = stream;\n setRes({ media: stream });\n })\n .catch((err) => {\n gotStream = undefined;\n setRes({ error: err });\n });\n return () => {\n setRes({ media: undefined, error: undefined });\n gotStream?.getTracks().forEach((track) => {\n track.stop();\n });\n };\n }\n }, [JSON.stringify(constraints), active]);\n return [res.media, res.error];\n};\n","import React, { useCallback, useMemo, useState } from 'react';\nimport Atm0s, { type AnyFunction, type IPublisherCallbacks } from '@8xff/atm0s-media-js';\nimport { releaseDevice, retainDevice } from '../hooks/device';\n\nexport enum SessionState {\n New = 'new',\n Connecting = 'connecting',\n Connected = 'connected',\n Reconnecting = 'reconnecting',\n Disconnected = 'disconnected',\n Error = 'error',\n}\n\nexport class StreamPublisherWrap {\n constructor(private publisher: Atm0s.StreamPublisher) {}\n\n get state() {\n return this.publisher.state;\n }\n\n get localStream() {\n return this.publisher.localStream;\n }\n\n on(type: keyof IPublisherCallbacks, callback: AnyFunction) {\n this.publisher.on(type, callback);\n }\n\n off(type: keyof IPublisherCallbacks, callback: AnyFunction) {\n this.publisher.on(type, callback);\n }\n\n switchStream(stream: MediaStream | null) {\n if (stream) {\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n const cachedKey = stream.cachedKey;\n if (cachedKey) {\n retainDevice(cachedKey);\n }\n }\n if (this.publisher.localStream) {\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n const cacheKey = this.publisher.localStream.cachedKey;\n if (cacheKey) {\n releaseDevice(cacheKey);\n }\n }\n return this.publisher.switch(stream);\n }\n}\n\ninterface SessionContainer {\n session: Atm0s.Session;\n state: SessionState;\n myAudioStreams: Atm0s.StreamRemote[];\n myVideoStreams: Atm0s.StreamRemote[];\n audioStreams: Atm0s.StreamRemote[];\n videoStreams: Atm0s.StreamRemote[];\n publishers: Map>;\n consumers: Map>;\n consumerPairs: Map>;\n}\n\ninterface ArcContainer {\n data: T;\n owners: Map;\n}\n\ninterface SessionContextInfo {\n data?: SessionContainer;\n connect: (url: string, config: Atm0s.ISessionConfig) => void;\n disconnect: () => void;\n getPublisher(ownerId: number, cfg: Atm0s.SenderConfig): StreamPublisherWrap | undefined;\n backPublisher(ownerId: number, cfg: Atm0s.SenderConfig): void;\n getConsumer(ownerId: number, remote: Atm0s.StreamRemote): Atm0s.StreamConsumer | undefined;\n backConsumer(owner_id: number, remote: Atm0s.StreamRemote): void;\n getConsumerPair(\n ownerId: number,\n peerId: string,\n audioName: string,\n videoName: string,\n ): Atm0s.StreamConsumerPair | undefined;\n backConsumerPair(ownerId: number, peerId: string, audioName: string, videoName: string): void;\n update: (new_info: SessionContainer) => void;\n}\n\nexport const SessionContext = React.createContext({} as SessionContextInfo);\n\ninterface Props {\n children: React.ReactNode;\n // log_level?: Atm0s.LogLevel;\n url?: string;\n config?: Atm0s.ISessionConfig;\n}\n\nlet GlobalVer = 0;\n\nexport const SessionProvider = (props: Props) => {\n // if (props.log_level != undefined) {\n // Atm0s.setLogLevel(props.log_level);\n // }\n const [, setVer] = useState(0);\n const storage = useMemo<{ data: SessionContainer | undefined }>(() => {\n return { data: undefined };\n }, []);\n const update = useCallback(\n (data: SessionContainer | undefined) => {\n storage.data = data;\n setVer(GlobalVer++);\n },\n [storage, setVer],\n );\n const connect = useCallback(\n (url: string, config: Atm0s.ISessionConfig) => {\n if (storage.data?.session) {\n return () => {\n storage.data?.session.disconnect();\n };\n }\n const session = Atm0s.createSession(url, config);\n const myAudioStreams = new Map();\n const myVideoStreams = new Map();\n const audioStreams = new Map();\n const videoStreams = new Map();\n\n const publishers: Map> = new Map();\n const consumers: Map> = new Map();\n const consumerPairs: Map> = new Map();\n\n config?.senders?.map((sender) => {\n if (sender.stream) {\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n const cachedKey = sender.stream.cachedKey;\n if (cachedKey) {\n retainDevice(cachedKey);\n }\n }\n });\n\n session.on('connected', () => {\n if (storage.data?.session != session) return;\n update({\n session,\n state: SessionState.Connected,\n myAudioStreams: Array.from(myAudioStreams.values()),\n myVideoStreams: Array.from(myVideoStreams.values()),\n audioStreams: Array.from(audioStreams.values()),\n videoStreams: Array.from(videoStreams.values()),\n publishers,\n consumers,\n consumerPairs,\n });\n });\n\n session.on('mystream_added', (stream: Atm0s.StreamRemote) => {\n if (storage.data?.session != session) return;\n const key = stream.peerId + '-' + stream.name;\n if (stream.kind === Atm0s.StreamKinds.AUDIO) {\n myAudioStreams.set(key, stream);\n } else {\n myVideoStreams.set(key, stream);\n }\n update({\n session,\n state: SessionState.Connected,\n myAudioStreams: Array.from(myAudioStreams.values()),\n myVideoStreams: Array.from(myVideoStreams.values()),\n audioStreams: Array.from(audioStreams.values()),\n videoStreams: Array.from(videoStreams.values()),\n publishers,\n consumers,\n consumerPairs,\n });\n });\n\n session.on('mystream_updated', (stream: Atm0s.StreamRemote) => {\n if (storage.data?.session != session) return;\n const key = stream.peerId + '-' + stream.name;\n if (stream.kind === Atm0s.StreamKinds.AUDIO) {\n myAudioStreams.set(key, stream);\n } else {\n myVideoStreams.set(key, stream);\n }\n update({\n session,\n state: SessionState.Connected,\n myAudioStreams: Array.from(myAudioStreams.values()),\n myVideoStreams: Array.from(myVideoStreams.values()),\n audioStreams: Array.from(audioStreams.values()),\n videoStreams: Array.from(videoStreams.values()),\n publishers,\n consumers,\n consumerPairs,\n });\n });\n\n session.on('mystream_removed', (stream: Atm0s.StreamRemote) => {\n if (storage.data?.session != session) return;\n const key = stream.peerId + '-' + stream.name;\n if (stream.kind === Atm0s.StreamKinds.AUDIO) {\n myAudioStreams.delete(key);\n } else {\n myVideoStreams.delete(key);\n }\n update({\n session,\n state: SessionState.Connected,\n myAudioStreams: Array.from(myAudioStreams.values()),\n myVideoStreams: Array.from(myVideoStreams.values()),\n audioStreams: Array.from(audioStreams.values()),\n videoStreams: Array.from(videoStreams.values()),\n publishers,\n consumers,\n consumerPairs,\n });\n });\n\n session.on('stream_added', (stream: Atm0s.StreamRemote) => {\n if (storage.data?.session != session) return;\n const key = stream.peerId + '-' + stream.name;\n if (stream.kind === Atm0s.StreamKinds.AUDIO) {\n audioStreams.set(key, stream);\n } else {\n videoStreams.set(key, stream);\n }\n update({\n session,\n state: SessionState.Connected,\n myAudioStreams: Array.from(myAudioStreams.values()),\n myVideoStreams: Array.from(myVideoStreams.values()),\n audioStreams: Array.from(audioStreams.values()),\n videoStreams: Array.from(videoStreams.values()),\n publishers,\n consumers,\n consumerPairs: consumerPairs,\n });\n });\n\n session.on('stream_updated', (stream: Atm0s.StreamRemote) => {\n if (storage.data?.session != session) return;\n const key = stream.peerId + '-' + stream.name;\n if (stream.kind === Atm0s.StreamKinds.AUDIO) {\n audioStreams.set(key, stream);\n } else {\n videoStreams.set(key, stream);\n }\n update({\n session,\n state: SessionState.Connected,\n myAudioStreams: Array.from(myAudioStreams.values()),\n myVideoStreams: Array.from(myVideoStreams.values()),\n audioStreams: Array.from(audioStreams.values()),\n videoStreams: Array.from(videoStreams.values()),\n publishers,\n consumers,\n consumerPairs,\n });\n });\n\n session.on('stream_removed', (stream: Atm0s.StreamRemote) => {\n if (storage.data?.session != session) return;\n const key = stream.peerId + '-' + stream.name;\n if (stream.kind === Atm0s.StreamKinds.AUDIO) {\n audioStreams.delete(key);\n } else {\n videoStreams.delete(key);\n }\n update({\n session,\n state: SessionState.Connected,\n myAudioStreams: Array.from(myAudioStreams.values()),\n myVideoStreams: Array.from(myVideoStreams.values()),\n audioStreams: Array.from(audioStreams.values()),\n videoStreams: Array.from(videoStreams.values()),\n publishers,\n consumers,\n consumerPairs,\n });\n });\n\n session.on('disconnected', () => {\n if (storage.data?.session != session) return;\n update({\n session,\n state: SessionState.Disconnected,\n myAudioStreams: Array.from(myAudioStreams.values()),\n myVideoStreams: Array.from(myVideoStreams.values()),\n audioStreams: Array.from(audioStreams.values()),\n videoStreams: Array.from(videoStreams.values()),\n publishers,\n consumers,\n consumerPairs,\n });\n });\n session.connect().catch((err) => {\n if (storage.data?.session != session) return;\n console.error(err);\n update({\n session,\n state: SessionState.Error,\n myAudioStreams: Array.from(myAudioStreams.values()),\n myVideoStreams: Array.from(myVideoStreams.values()),\n audioStreams: Array.from(audioStreams.values()),\n videoStreams: Array.from(videoStreams.values()),\n publishers,\n consumers,\n consumerPairs,\n });\n });\n update({\n session,\n state: SessionState.Connecting,\n myAudioStreams: [],\n myVideoStreams: [],\n audioStreams: [],\n videoStreams: [],\n publishers,\n consumers,\n consumerPairs,\n });\n return;\n },\n [storage, update],\n );\n\n const disconnect = useCallback(() => {\n if (storage.data?.session) {\n storage.data.session.disconnect();\n update(undefined);\n }\n }, [storage, update]);\n\n const getPublisher = useCallback(\n (ownerId: number, cfg: Atm0s.SenderConfig) => {\n const data = storage.data;\n if (data?.session) {\n let publisher = data.publishers.get(cfg.name);\n if (!publisher) {\n publisher = {\n data: new StreamPublisherWrap(\n data.session.createPublisher({\n stream: cfg.stream,\n name: cfg.name,\n kind: cfg.kind,\n preferredCodecs: cfg.preferredCodecs,\n simulcast: cfg.simulcast,\n maxBitrate: cfg.maxBitrate,\n contentHint: cfg.contentHint,\n screen: cfg.screen,\n }),\n ),\n owners: new Map(),\n };\n data.publishers.set(cfg.name, publisher);\n }\n data.publishers.get(cfg.name)?.owners.set(ownerId, new Date().getTime());\n return publisher.data;\n }\n return undefined;\n },\n [storage],\n );\n\n const backPublisher = useCallback(\n (ownerId: number, cfg: Atm0s.SenderConfig) => {\n const data = storage.data;\n if (data?.session) {\n const publisher = data.publishers.get(cfg.name);\n if (publisher) {\n publisher.owners.delete(ownerId);\n if (publisher.owners.size == 0) {\n publisher.data.switchStream(null);\n data.publishers.delete(cfg.name);\n }\n }\n }\n return undefined;\n },\n [storage],\n );\n\n const getConsumer = useCallback(\n (ownerId: number, stream: Atm0s.StreamRemote) => {\n const data = storage.data;\n if (data?.session) {\n const key = stream.peerId + '-' + stream.name;\n let consumer = data.consumers.get(key);\n if (!consumer) {\n consumer = {\n data: data.session.createConsumer(stream),\n owners: new Map(),\n };\n data.consumers.set(key, consumer);\n }\n data.consumers.get(key)?.owners.set(ownerId, new Date().getTime());\n return consumer.data;\n }\n return undefined;\n },\n [storage],\n );\n\n const backConsumer = useCallback(\n (ownerId: number, stream: Atm0s.StreamRemote) => {\n const data = storage.data;\n if (data?.session) {\n const key = stream.peerId + '-' + stream.name;\n const consumer = data.consumers.get(key);\n if (consumer) {\n consumer.owners.delete(ownerId);\n if (consumer.owners.size == 0) {\n data.consumers.delete(key);\n }\n }\n }\n return undefined;\n },\n [storage],\n );\n\n const getConsumerPair = useCallback(\n (ownerId: number, peerId: string, audioName: string, videoName: string) => {\n const data = storage.data;\n if (data?.session) {\n const key = peerId + '-' + audioName + '-' + videoName;\n let consumer = data.consumerPairs.get(key);\n if (!consumer) {\n consumer = {\n data: data.session.createConsumerPair(peerId, audioName, videoName),\n owners: new Map(),\n };\n data.consumerPairs.set(key, consumer);\n }\n data.consumerPairs.get(key)?.owners.set(ownerId, new Date().getTime());\n return consumer.data;\n }\n return undefined;\n },\n [storage],\n );\n\n const backConsumerPair = useCallback(\n (ownerId: number, peerId: string, audioName: string, videoName: string) => {\n const data = storage.data;\n if (data?.session) {\n const key = peerId + '-' + audioName + '-' + videoName;\n const consumer = data.consumerPairs.get(key);\n if (consumer) {\n consumer.owners.delete(ownerId);\n if (consumer.owners.size == 0) {\n data.consumerPairs.delete(key);\n }\n }\n }\n return undefined;\n },\n [storage],\n );\n\n React.useEffect(() => {\n if (props.url && props.config) {\n connect(props.url, props.config);\n return () => {\n disconnect();\n };\n }\n }, [props.url, props.config, connect, disconnect]);\n\n return (\n \n {props.children}\n \n );\n};\n","import { useContext } from 'react';\nimport { SessionContext } from '../components/provider';\nimport Atm0s from '@8xff/atm0s-media-js';\n\nexport const useRemoteStreams = (kind: Atm0s.StreamKinds, isMine?: boolean): Atm0s.StreamRemote[] => {\n const { data } = useContext(SessionContext);\n if (kind == Atm0s.StreamKinds.AUDIO) {\n if (isMine === true) {\n return data?.myAudioStreams || [];\n } else {\n return data?.audioStreams || [];\n }\n } else {\n if (isMine === true) {\n return data?.myVideoStreams || [];\n } else {\n return data?.videoStreams || [];\n }\n }\n};\n\nexport const usePeerRemoteStreams = (peerId: string, kind: Atm0s.StreamKinds): Atm0s.StreamRemote[] => {\n const { data } = useContext(SessionContext);\n if (kind == Atm0s.StreamKinds.AUDIO) {\n return data?.audioStreams.filter((a) => a.peerId === peerId) || [];\n } else {\n return data?.videoStreams.filter((a) => a.peerId === peerId) || [];\n }\n};\n","import { useContext } from 'react';\nimport { SessionContext } from '../components/provider';\nimport Atm0s from '@8xff/atm0s-media-js';\n\nexport const useSession = (): Atm0s.Session | undefined => {\n const { data } = useContext(SessionContext);\n return data?.session;\n};\n","import { useContext } from 'react';\nimport { SessionContext, SessionState } from '../components/provider';\n\nexport const useSessionState = (): SessionState => {\n const { data } = useContext(SessionContext);\n return data?.state || SessionState.New;\n};\n","import { useContext } from 'react';\nimport { SessionContext } from '../components/provider';\nimport type { ISessionConfig } from '@8xff/atm0s-media-js';\n\ninterface Actions {\n connect: (url: string, config: ISessionConfig) => void;\n disconnect: () => void;\n playAudioMix: () => void;\n}\n\nexport const useActions = (): Actions => {\n const { connect, disconnect } = useContext(SessionContext);\n return {\n connect,\n disconnect,\n playAudioMix: () => {\n // data?.session.getMixMinusAudio()?.play();\n },\n };\n};\n","import { useContext, useEffect, useMemo, useState, type LegacyRef } from 'react';\nimport { SessionContext, SessionState } from '../components/provider';\nimport Atm0s from '@8xff/atm0s-media-js';\nimport { useSessionState } from './state';\n\nlet idSeed = 0;\nexport const useConsumer = (\n remote?: Atm0s.StreamRemote,\n priority?: number,\n maxSpatial?: number,\n maxTemporal?: number,\n): [LegacyRef | undefined, Atm0s.StreamReceiverState, Atm0s.StreamConsumer | undefined] => {\n const consumerId = useMemo(() => idSeed++, []);\n const sessionState = useSessionState();\n const [consumer, setConsumer] = useState();\n const [state, setState] = useState(Atm0s.StreamReceiverState.NoSource);\n const [element, setElement] = useState();\n const { data, getConsumer, backConsumer } = useContext(SessionContext);\n\n const isConnectionEstablished = [SessionState.Connected, SessionState.Reconnecting].indexOf(sessionState) >= 0;\n\n useEffect(() => {\n if (data?.session && remote) {\n const consumer = getConsumer(consumerId, remote);\n if (consumer) {\n consumer.on('state', setState);\n setState(consumer.state);\n setConsumer(consumer);\n return () => {\n consumer?.unview('use-consumer-' + consumerId);\n consumer?.off('state', setState);\n backConsumer(consumerId, remote);\n };\n }\n }\n }, [data?.session, remote]);\n\n useEffect(() => {\n if (element && consumer && isConnectionEstablished) {\n element.srcObject = consumer.view('use-consumer-' + consumerId, priority, maxSpatial, maxTemporal);\n return () => {\n element.srcObject = null;\n consumer.unview('use-consumer-' + consumerId);\n };\n }\n }, [element, consumer, isConnectionEstablished]);\n\n useEffect(() => {\n if (element && consumer && isConnectionEstablished) {\n consumer.limit('use-consumer-' + consumerId, priority, maxSpatial, maxTemporal);\n }\n }, [element, consumer, isConnectionEstablished, priority, maxSpatial, maxTemporal]);\n\n const ref = (instance: HTMLVideoElement | null) => {\n setElement(instance || undefined);\n };\n\n return [ref, state, consumer];\n};\n\nexport const useConsumerPair = (\n peerId: string,\n audioName: string,\n videoName: string,\n priority?: number,\n maxSpatial?: number,\n maxTemporal?: number,\n): [LegacyRef | undefined, Atm0s.StreamReceiverState, Atm0s.StreamConsumerPair | undefined] => {\n const consumerId = useMemo(() => idSeed++, []);\n const sessionState = useSessionState();\n const [consumer, setConsumer] = useState();\n const [state, setState] = useState(Atm0s.StreamReceiverState.NoSource);\n const [element, setElement] = useState();\n const { data, getConsumerPair: getConsumerPair, backConsumerPair: backConsumerPair } = useContext(SessionContext);\n\n const isConnectionEstablished = [SessionState.Connected, SessionState.Reconnecting].indexOf(sessionState) >= 0;\n\n useEffect(() => {\n if (data?.session) {\n const consumer = getConsumerPair(consumerId, peerId, audioName, videoName);\n if (consumer) {\n consumer.on('state', setState);\n setState(consumer.state);\n setConsumer(consumer);\n return () => {\n consumer?.off('state', setState);\n backConsumerPair(consumerId, peerId, audioName, videoName);\n };\n }\n }\n }, [data?.session, peerId, audioName, videoName]);\n\n useEffect(() => {\n if (element && consumer && isConnectionEstablished) {\n element.srcObject = consumer.view('use-consumer-' + consumerId, priority, maxSpatial, maxTemporal);\n return () => {\n element.srcObject = null;\n consumer.unview('use-consumer-' + consumerId);\n };\n }\n }, [element, consumer, isConnectionEstablished]);\n\n useEffect(() => {\n if (element && consumer && isConnectionEstablished) {\n consumer.limit('use-consumer-' + consumerId, priority, maxSpatial, maxTemporal);\n }\n }, [element, consumer, isConnectionEstablished, priority, maxSpatial, maxTemporal]);\n\n const ref = (instance: HTMLVideoElement | null) => {\n setElement(instance || undefined);\n };\n\n return [ref, state, consumer];\n};\n\nexport const useLocalConsumer = (stream?: MediaStream) => {\n const [element, setElement] = useState();\n useEffect(() => {\n if (element && stream) {\n element.srcObject = stream;\n return () => {\n element.srcObject = null;\n };\n }\n }, [element, stream]);\n\n return (instance: HTMLVideoElement | null) => {\n setElement(instance || undefined);\n };\n};\n","import { useContext, useEffect, useMemo, useState } from 'react';\nimport { SessionContext, StreamPublisherWrap } from '../components/provider';\nimport Atm0s from '@8xff/atm0s-media-js';\n\nlet idSeed = 0;\n\nexport const usePublisher = (\n cfg: Atm0s.SenderConfig,\n): [Atm0s.StreamSenderState, MediaStream | undefined | null, StreamPublisherWrap | undefined] => {\n const publisherId = useMemo(() => idSeed++, []);\n const [state, setState] = useState(Atm0s.StreamSenderState.Created);\n const [producer, setProducer] = useState();\n const { data, getPublisher: getPublisher, backPublisher: backPublisher } = useContext(SessionContext);\n useEffect(() => {\n if (data?.session) {\n const newProducer = getPublisher(publisherId, cfg);\n if (newProducer) {\n const onUpdateState = (state: Atm0s.StreamSenderState) => {\n setState(state);\n };\n newProducer.on('state', onUpdateState);\n setProducer(newProducer);\n setState(newProducer.state);\n return () => {\n newProducer?.off('state', onUpdateState);\n backPublisher(publisherId, cfg);\n };\n }\n }\n }, [data?.session, cfg.kind + cfg.name]);\n\n return [state, producer?.localStream, producer];\n};\n","import { useContext, useEffect, useState } from 'react';\nimport * as Bluesea from '@8xff/atm0s-media-js';\nimport { StreamPublisherWrap, BlueseaSessionContext } from '../components';\n\nexport const useAudioLevelConsumer = (\n consumer?: Bluesea.StreamConsumer | Bluesea.StreamConsumerPair,\n): number | undefined => {\n const [audioLevel, setAudioLevel] = useState(undefined);\n useEffect(() => {\n if (consumer) {\n const handler = (level: number) => {\n setAudioLevel(level);\n };\n consumer.on('audio_level', handler);\n\n return () => {\n consumer.off('audio_level', handler);\n };\n } else {\n setAudioLevel(undefined);\n }\n }, [consumer]);\n return audioLevel;\n};\n\nexport const useAudioLevelProducer = (producer?: StreamPublisherWrap): number | undefined => {\n const [audioLevel, setAudioLevel] = useState(undefined);\n useEffect(() => {\n if (producer) {\n const handler = (level: number) => {\n setAudioLevel(level);\n };\n producer.on('audio_level', handler);\n\n return () => {\n producer.off('audio_level', handler);\n };\n } else {\n setAudioLevel(undefined);\n }\n }, [producer]);\n return audioLevel;\n};\n\nexport interface AudioMixSlotInfo {\n peerId: string;\n streamName: string;\n audioLevel: number;\n}\n\nexport const useAudioSlotMix = (slotIndex: number) => {\n const [slot, setSlot] = useState(undefined);\n const { data } = useContext(BlueseaSessionContext);\n useEffect(() => {\n const mixMinus = data?.session.getMixMinusAudio();\n if (mixMinus) {\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n const handler = (info: any | null) => {\n if (info) {\n const sourceId = info[0].split(':');\n setSlot({\n peerId: sourceId[0],\n streamName: sourceId[1],\n audioLevel: info[1],\n });\n } else {\n setSlot(undefined);\n }\n };\n mixMinus.on(`slot_${slotIndex}`, handler);\n\n return () => {\n mixMinus?.off(`slot_${slotIndex}`, handler);\n };\n }\n }, [slotIndex, data?.session.getMixMinusAudio()]);\n return slot;\n};\n\nexport const useAudioLevelMix = (peerId: string, streamName: string) => {\n const [audioLevel, setAudioLevel] = useState(undefined);\n const { data } = useContext(BlueseaSessionContext);\n useEffect(() => {\n const mixMinus = data?.session.getMixMinusAudio();\n if (mixMinus) {\n const handler = (level: number | null) => {\n setAudioLevel(level || undefined);\n };\n mixMinus.on(`source_${peerId}:${streamName}`, handler);\n\n return () => {\n mixMinus?.off(`source_${peerId}:${streamName}`, handler);\n };\n }\n }, [peerId, streamName, data?.session.getMixMinusAudio()]);\n return audioLevel;\n};\n","import { StreamRemote } from '@8xff/atm0s-media-js';\nimport React from 'react';\nimport { useConsumer, useLocalConsumer } from '../hooks';\n\nexport const RemoteViewer = (props: { remote: StreamRemote; priority?: number }) => {\n const [ref, state] = useConsumer(props.remote, props.priority);\n return (\n
\n
{state}
\n \n
\n );\n};\n\nexport const LocalViewer = (props: { stream: MediaStream }) => {\n const ref = useLocalConsumer(props.stream);\n return ;\n};\n\nexport const VideoViewer = (props: { stream: MediaStream | StreamRemote; priority?: number }) => {\n if (props.stream instanceof StreamRemote) {\n return ;\n } else {\n return ;\n }\n};\n"],"names":["getLogger","TypedEventEmitter","useState","useEffect","SessionState","useMemo","useCallback","useContext","idSeed","BlueseaSessionContext","StreamRemote"],"mappings":"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"} \ No newline at end of file diff --git a/dist/index.umd.min.js b/dist/index.umd.min.js index e240040..cc06f3d 100644 --- a/dist/index.umd.min.js +++ b/dist/index.umd.min.js @@ -1,7 +1,7 @@ /*! - * [libraryName] v0.0.0 - * (c) [authorFullName] + * @8xff/atm0s-media-react v0.0.0 + * (c) Luong Ngoc Minh * Released under the MIT License. */ -!function(e,i){"object"==typeof exports&&"undefined"!=typeof module?i(exports):"function"==typeof define&&define.amd?define(["exports"],i):i((e="undefined"!=typeof globalThis?globalThis:e||self)["[libraryCamelCaseName]"]={})}(this,(function(e){"use strict";e.isNumberParseable=function(e){return!Number.isNaN(Number(e))}})); +!function(e,t){"object"==typeof exports&&"undefined"!=typeof module?t(exports,require("react"),require("@8xff/atm0s-media-js"),require("@8xff/atm0s-media-js/types/lib/utils/typed-event-emitter"),require("@8xff/atm0s-media-js/types/lib/utils/logger")):"function"==typeof define&&define.amd?define(["exports","react","@8xff/atm0s-media-js","@8xff/atm0s-media-js/types/lib/utils/typed-event-emitter","@8xff/atm0s-media-js/types/lib/utils/logger"],t):t((e="undefined"!=typeof globalThis?globalThis:e||self).Atm0s={},e.React,e.Atm0s,e.typedEventEmitter,e.logger$1)}(this,(function(e,t,n,r,s){"use strict";var o=function(e,t){return o=Object.setPrototypeOf||{__proto__:[]}instanceof Array&&function(e,t){e.__proto__=t}||function(e,t){for(var n in t)Object.prototype.hasOwnProperty.call(t,n)&&(e[n]=t[n])},o(e,t)};"function"==typeof SuppressedError&&SuppressedError;var a=s.getLogger("DeviceHook"),i=function(e){function t(t){var n=e.call(this)||this;return n.key=t,n.count=0,n.data={},a.log("Created container for local stream",t),n}return function(e,t){if("function"!=typeof t&&null!==t)throw new TypeError("Class extends value "+String(t)+" is not a constructor or null");function n(){this.constructor=e}o(e,t),e.prototype=null===t?Object.create(t):(n.prototype=t.prototype,new n)}(t,e),t.prototype.setData=function(e){this.data=e,this.emit("changed",e)},t.prototype.retain=function(){return this.count+=1,a.log("Retain local stream",this.key,this.count),this.count},t.prototype.release=function(){var e;return this.count-=1,a.log("Release local stream",this.key,this.count),0==this.count&&(a.log("Destroy local stream",this.key),null===(e=this.data.media)||void 0===e||e.getTracks().map((function(e){e.stop()}))),this.count},t}(r.TypedEventEmitter),u=new Map;function c(e,t,n){var r=e+"-"+t,s=u.get(r);if(s)s.on("changed",n),n(s.data);else{s=new i(r),u.set(r,s);var o={};"audioinput"==e?o={audio:"string"!=typeof t||{deviceId:t}}:"videoinput"==e&&(o={video:"string"!=typeof t||{deviceId:t}}),navigator.mediaDevices.getUserMedia(o).then((function(e){e.cachedKey=r,null==s||s.setData({media:e}),n({media:e})})).catch((function(e){null==s||s.setData({error:e}),n({error:e})}))}return[s,r]}function l(e){var t=u.get(e);null==t||t.retain()}var d;e.SessionState=void 0,(d=e.SessionState||(e.SessionState={})).New="new",d.Connecting="connecting",d.Connected="connected",d.Reconnecting="reconnecting",d.Disconnected="disconnected",d.Error="error";var f=function(){function e(e){this.publisher=e}return Object.defineProperty(e.prototype,"state",{get:function(){return this.publisher.state},enumerable:!1,configurable:!0}),Object.defineProperty(e.prototype,"localStream",{get:function(){return this.publisher.localStream},enumerable:!1,configurable:!0}),e.prototype.on=function(e,t){this.publisher.on(e,t)},e.prototype.off=function(e,t){this.publisher.on(e,t)},e.prototype.switchStream=function(e){if(e){var t=e.cachedKey;t&&l(t)}if(this.publisher.localStream){var n=this.publisher.localStream.cachedKey;n&&(r=n,0==(null==(s=u.get(r))?void 0:s.release())&&u.delete(r))}var r,s;return this.publisher.switch(e)},e}(),m=t.createContext({}),v=0,S=function(){var n=t.useContext(m).data;return(null==n?void 0:n.state)||e.SessionState.New},p=0,y=function(r,s,o,a){var i=t.useMemo((function(){return p++}),[]),u=S(),c=t.useState(),l=c[0],d=c[1],f=t.useState(n.StreamReceiverState.NoSource),v=f[0],y=f[1],h=t.useState(),g=h[0],b=h[1],A=t.useContext(m),C=A.data,w=A.getConsumer,P=A.backConsumer,E=[e.SessionState.Connected,e.SessionState.Reconnecting].indexOf(u)>=0;t.useEffect((function(){if((null==C?void 0:C.session)&&r){var e=w(i,r);if(e)return e.on("state",y),y(e.state),d(e),function(){null==e||e.unview("use-consumer-"+i),null==e||e.off("state",y),P(i,r)}}}),[null==C?void 0:C.session,r]),t.useEffect((function(){if(g&&l&&E)return g.srcObject=l.view("use-consumer-"+i,s,o,a),function(){g.srcObject=null,l.unview("use-consumer-"+i)}}),[g,l,E]),t.useEffect((function(){g&&l&&E&&l.limit("use-consumer-"+i,s,o,a)}),[g,l,E,s,o,a]);return[function(e){b(e||void 0)},v,l]},h=function(e){var n=t.useState(),r=n[0],s=n[1];return t.useEffect((function(){if(r&&e)return r.srcObject=e,function(){r.srcObject=null}}),[r,e]),function(e){s(e||void 0)}},g=0,b=function(e){var n=y(e.remote,e.priority),r=n[0],s=n[1];return t.createElement("div",{className:"w-full h-full"},t.createElement("div",null,s),t.createElement("video",{muted:!0,autoPlay:!0,className:"w-full h-full",ref:r}))},A=function(e){var n=h(e.stream);return t.createElement("video",{muted:!0,autoPlay:!0,className:"w-full h-full",ref:n})};e.BlueseaSessionContext=m,e.LocalViewer=A,e.RemoteViewer=b,e.SessionProvider=function(r){var s=t.useState(0)[1],o=t.useMemo((function(){return{data:void 0}}),[]),a=t.useCallback((function(e){o.data=e,s(v++)}),[o,s]),i=t.useCallback((function(t,r){var s,i;if(null===(s=o.data)||void 0===s?void 0:s.session)return function(){var e;null===(e=o.data)||void 0===e||e.session.disconnect()};var u=n.createSession(t,r),c=new Map,d=new Map,f=new Map,m=new Map,v=new Map,S=new Map,p=new Map;null===(i=null==r?void 0:r.senders)||void 0===i||i.map((function(e){if(e.stream){var t=e.stream.cachedKey;t&&l(t)}})),u.on("connected",(function(){var t;(null===(t=o.data)||void 0===t?void 0:t.session)==u&&a({session:u,state:e.SessionState.Connected,myAudioStreams:Array.from(c.values()),myVideoStreams:Array.from(d.values()),audioStreams:Array.from(f.values()),videoStreams:Array.from(m.values()),publishers:v,consumers:S,consumerPairs:p})})),u.on("mystream_added",(function(t){var r;if((null===(r=o.data)||void 0===r?void 0:r.session)==u){var s=t.peerId+"-"+t.name;t.kind===n.StreamKinds.AUDIO?c.set(s,t):d.set(s,t),a({session:u,state:e.SessionState.Connected,myAudioStreams:Array.from(c.values()),myVideoStreams:Array.from(d.values()),audioStreams:Array.from(f.values()),videoStreams:Array.from(m.values()),publishers:v,consumers:S,consumerPairs:p})}})),u.on("mystream_updated",(function(t){var r;if((null===(r=o.data)||void 0===r?void 0:r.session)==u){var s=t.peerId+"-"+t.name;t.kind===n.StreamKinds.AUDIO?c.set(s,t):d.set(s,t),a({session:u,state:e.SessionState.Connected,myAudioStreams:Array.from(c.values()),myVideoStreams:Array.from(d.values()),audioStreams:Array.from(f.values()),videoStreams:Array.from(m.values()),publishers:v,consumers:S,consumerPairs:p})}})),u.on("mystream_removed",(function(t){var r;if((null===(r=o.data)||void 0===r?void 0:r.session)==u){var s=t.peerId+"-"+t.name;t.kind===n.StreamKinds.AUDIO?c.delete(s):d.delete(s),a({session:u,state:e.SessionState.Connected,myAudioStreams:Array.from(c.values()),myVideoStreams:Array.from(d.values()),audioStreams:Array.from(f.values()),videoStreams:Array.from(m.values()),publishers:v,consumers:S,consumerPairs:p})}})),u.on("stream_added",(function(t){var r;if((null===(r=o.data)||void 0===r?void 0:r.session)==u){var s=t.peerId+"-"+t.name;t.kind===n.StreamKinds.AUDIO?f.set(s,t):m.set(s,t),a({session:u,state:e.SessionState.Connected,myAudioStreams:Array.from(c.values()),myVideoStreams:Array.from(d.values()),audioStreams:Array.from(f.values()),videoStreams:Array.from(m.values()),publishers:v,consumers:S,consumerPairs:p})}})),u.on("stream_updated",(function(t){var r;if((null===(r=o.data)||void 0===r?void 0:r.session)==u){var s=t.peerId+"-"+t.name;t.kind===n.StreamKinds.AUDIO?f.set(s,t):m.set(s,t),a({session:u,state:e.SessionState.Connected,myAudioStreams:Array.from(c.values()),myVideoStreams:Array.from(d.values()),audioStreams:Array.from(f.values()),videoStreams:Array.from(m.values()),publishers:v,consumers:S,consumerPairs:p})}})),u.on("stream_removed",(function(t){var r;if((null===(r=o.data)||void 0===r?void 0:r.session)==u){var s=t.peerId+"-"+t.name;t.kind===n.StreamKinds.AUDIO?f.delete(s):m.delete(s),a({session:u,state:e.SessionState.Connected,myAudioStreams:Array.from(c.values()),myVideoStreams:Array.from(d.values()),audioStreams:Array.from(f.values()),videoStreams:Array.from(m.values()),publishers:v,consumers:S,consumerPairs:p})}})),u.on("disconnected",(function(){var t;(null===(t=o.data)||void 0===t?void 0:t.session)==u&&a({session:u,state:e.SessionState.Disconnected,myAudioStreams:Array.from(c.values()),myVideoStreams:Array.from(d.values()),audioStreams:Array.from(f.values()),videoStreams:Array.from(m.values()),publishers:v,consumers:S,consumerPairs:p})})),u.connect().catch((function(t){var n;(null===(n=o.data)||void 0===n?void 0:n.session)==u&&(console.error(t),a({session:u,state:e.SessionState.Error,myAudioStreams:Array.from(c.values()),myVideoStreams:Array.from(d.values()),audioStreams:Array.from(f.values()),videoStreams:Array.from(m.values()),publishers:v,consumers:S,consumerPairs:p}))})),a({session:u,state:e.SessionState.Connecting,myAudioStreams:[],myVideoStreams:[],audioStreams:[],videoStreams:[],publishers:v,consumers:S,consumerPairs:p})}),[o,a]),u=t.useCallback((function(){var e;(null===(e=o.data)||void 0===e?void 0:e.session)&&(o.data.session.disconnect(),a(void 0))}),[o,a]),c=t.useCallback((function(e,t){var n,r=o.data;if(null==r?void 0:r.session){var s=r.publishers.get(t.name);return s||(s={data:new f(r.session.createPublisher({stream:t.stream,name:t.name,kind:t.kind,preferredCodecs:t.preferredCodecs,simulcast:t.simulcast,maxBitrate:t.maxBitrate,contentHint:t.contentHint,screen:t.screen})),owners:new Map},r.publishers.set(t.name,s)),null===(n=r.publishers.get(t.name))||void 0===n||n.owners.set(e,(new Date).getTime()),s.data}}),[o]),d=t.useCallback((function(e,t){var n=o.data;if(null==n?void 0:n.session){var r=n.publishers.get(t.name);r&&(r.owners.delete(e),0==r.owners.size&&(r.data.switchStream(null),n.publishers.delete(t.name)))}}),[o]),S=t.useCallback((function(e,t){var n,r=o.data;if(null==r?void 0:r.session){var s=t.peerId+"-"+t.name,a=r.consumers.get(s);return a||(a={data:r.session.createConsumer(t),owners:new Map},r.consumers.set(s,a)),null===(n=r.consumers.get(s))||void 0===n||n.owners.set(e,(new Date).getTime()),a.data}}),[o]),p=t.useCallback((function(e,t){var n=o.data;if(null==n?void 0:n.session){var r=t.peerId+"-"+t.name,s=n.consumers.get(r);s&&(s.owners.delete(e),0==s.owners.size&&n.consumers.delete(r))}}),[o]),y=t.useCallback((function(e,t,n,r){var s,a=o.data;if(null==a?void 0:a.session){var i=t+"-"+n+"-"+r,u=a.consumerPairs.get(i);return u||(u={data:a.session.createConsumerPair(t,n,r),owners:new Map},a.consumerPairs.set(i,u)),null===(s=a.consumerPairs.get(i))||void 0===s||s.owners.set(e,(new Date).getTime()),u.data}}),[o]),h=t.useCallback((function(e,t,n,r){var s=o.data;if(null==s?void 0:s.session){var a=t+"-"+n+"-"+r,i=s.consumerPairs.get(a);i&&(i.owners.delete(e),0==i.owners.size&&s.consumerPairs.delete(a))}}),[o]);return t.useEffect((function(){if(r.url&&r.config)return i(r.url,r.config),function(){u()}}),[r.url,r.config,i,u]),t.createElement(m.Provider,{value:{data:o.data,connect:i,disconnect:u,getPublisher:c,backPublisher:d,getConsumer:S,backConsumer:p,getConsumerPair:y,backConsumerPair:h,update:a}},r.children)},e.StreamPublisherWrap=f,e.VideoViewer=function(e){return e.stream instanceof n.StreamRemote?t.createElement(b,{remote:e.stream,priority:e.priority}):t.createElement(A,{stream:e.stream})},e.getDevice=function(e,t){return new Promise((function(n,r){c(e,t,(function(e){e.error?r(e.error):n(e.media)}))}))},e.useActions=function(){var e=t.useContext(m);return{connect:e.connect,disconnect:e.disconnect,playAudioMix:function(){}}},e.useAudioLevelConsumer=function(e){var n=t.useState(void 0),r=n[0],s=n[1];return t.useEffect((function(){if(e){var t=function(e){s(e)};return e.on("audio_level",t),function(){e.off("audio_level",t)}}s(void 0)}),[e]),r},e.useAudioLevelMix=function(e,n){var r=t.useState(void 0),s=r[0],o=r[1],a=t.useContext(m).data;return t.useEffect((function(){var t=null==a?void 0:a.session.getMixMinusAudio();if(t){var r=function(e){o(e||void 0)};return t.on("source_".concat(e,":").concat(n),r),function(){null==t||t.off("source_".concat(e,":").concat(n),r)}}}),[e,n,null==a?void 0:a.session.getMixMinusAudio()]),s},e.useAudioLevelProducer=function(e){var n=t.useState(void 0),r=n[0],s=n[1];return t.useEffect((function(){if(e){var t=function(e){s(e)};return e.on("audio_level",t),function(){e.off("audio_level",t)}}s(void 0)}),[e]),r},e.useAudioSlotMix=function(e){var n=t.useState(void 0),r=n[0],s=n[1],o=t.useContext(m).data;return t.useEffect((function(){var t=null==o?void 0:o.session.getMixMinusAudio();if(t){var n=function(e){if(e){var t=e[0].split(":");s({peerId:t[0],streamName:t[1],audioLevel:e[1]})}else s(void 0)};return t.on("slot_".concat(e),n),function(){null==t||t.off("slot_".concat(e),n)}}}),[e,null==o?void 0:o.session.getMixMinusAudio()]),r},e.useConsumer=y,e.useConsumerPair=function(r,s,o,a,i,u){var c=t.useMemo((function(){return p++}),[]),l=S(),d=t.useState(),f=d[0],v=d[1],y=t.useState(n.StreamReceiverState.NoSource),h=y[0],g=y[1],b=t.useState(),A=b[0],C=b[1],w=t.useContext(m),P=w.data,E=w.getConsumerPair,k=w.backConsumerPair,x=[e.SessionState.Connected,e.SessionState.Reconnecting].indexOf(l)>=0;t.useEffect((function(){if(null==P?void 0:P.session){var e=E(c,r,s,o);if(e)return e.on("state",g),g(e.state),v(e),function(){null==e||e.off("state",g),k(c,r,s,o)}}}),[null==P?void 0:P.session,r,s,o]),t.useEffect((function(){if(A&&f&&x)return A.srcObject=f.view("use-consumer-"+c,a,i,u),function(){A.srcObject=null,f.unview("use-consumer-"+c)}}),[A,f,x]),t.useEffect((function(){A&&f&&x&&f.limit("use-consumer-"+c,a,i,u)}),[A,f,x,a,i,u]);return[function(e){C(e||void 0)},h,f]},e.useDevice=function(e,n){var r=t.useState({}),s=r[0],o=r[1];return t.useEffect((function(){if(0!=n){var t=c(e,n,o),r=t[0],s=t[1];return r.retain(),function(){o({media:void 0,error:void 0}),0==(null==r?void 0:r.release())&&u.delete(s)}}}),[e,n]),[s.media,s.error]},e.useDevices=function(e){var n=t.useState([]),r=n[0],s=n[1],o=t.useState(null),a=o[0],i=o[1];return t.useEffect((function(){navigator.mediaDevices.enumerateDevices().then((function(t){s(t.filter((function(t){return t.kind==e})))})).catch((function(e){s([]),i(e)}))}),[e]),[r,a]},e.useDisplayMedia=function(e,n){var r=t.useState({}),s=r[0],o=r[1];return t.useEffect((function(){var t;if(n)return navigator.mediaDevices.getDisplayMedia(e).then((function(e){t=e,o({media:e})})).catch((function(e){t=void 0,o({error:e})})),function(){o({media:void 0,error:void 0}),null==t||t.getTracks().forEach((function(e){e.stop()}))}}),[JSON.stringify(e),n]),[s.media,s.error]},e.useLocalConsumer=h,e.usePublisher=function(e){var r=t.useMemo((function(){return g++}),[]),s=t.useState(n.StreamSenderState.Created),o=s[0],a=s[1],i=t.useState(),u=i[0],c=i[1],l=t.useContext(m),d=l.data,f=l.getPublisher,v=l.backPublisher;return t.useEffect((function(){if(null==d?void 0:d.session){var t=f(r,e);if(t){var n=function(e){a(e)};return t.on("state",n),c(t),a(t.state),function(){null==t||t.off("state",n),v(r,e)}}}}),[null==d?void 0:d.session,e.kind+e.name]),[o,null==u?void 0:u.localStream,u]},e.useRemoteStreams=function(e,r){var s=t.useContext(m).data;return e==n.StreamKinds.AUDIO?!0===r?(null==s?void 0:s.myAudioStreams)||[]:(null==s?void 0:s.audioStreams)||[]:!0===r?(null==s?void 0:s.myVideoStreams)||[]:(null==s?void 0:s.videoStreams)||[]},e.useSession=function(){var e=t.useContext(m).data;return null==e?void 0:e.session},e.useSessionState=S,e.useUserMedia=function(e,n){var r=t.useState({}),s=r[0],o=r[1];return t.useEffect((function(){var t;if(n)return navigator.mediaDevices.getUserMedia(e).then((function(e){t=e,o({media:e})})).catch((function(e){t=void 0,o({error:e})})),function(){o({media:void 0,error:void 0}),null==t||t.getTracks().forEach((function(e){e.stop()}))}}),[JSON.stringify(e),n]),[s.media,s.error]}})); //# sourceMappingURL=index.umd.min.js.map diff --git a/dist/index.umd.min.js.map b/dist/index.umd.min.js.map index e15182a..3c22157 100644 --- a/dist/index.umd.min.js.map +++ b/dist/index.umd.min.js.map @@ -1 +1 @@ -{"version":3,"file":"index.umd.min.js","sources":["../src/index.ts"],"sourcesContent":["/**\n * A Branded Type for values parseable to number.\n */\nexport type NumberParseable = (number | string | boolean) & {\n readonly isNumberParseble: unique symbol;\n};\n\n/**\n * Check if value is parseable to number.\n * @example\n * ```js\n * isNumberParseable('AAAA');\n * //=> false\n *\n * isNumberParseable('100');\n * //=> true\n *\n * if (!isNumberParseable(value))\n * throw new Error('Value can\\'t be parseable to `Number`.')\n * return Number(value);\n * ```\n * @param value - An `unknown` value to be checked.\n */\nexport const isNumberParseable = (value: unknown): value is NumberParseable =>\n !Number.isNaN(Number(value));\n"],"names":["value","Number","isNaN"],"mappings":";;;;;qRAuBiC,SAACA,GAChC,OAACC,OAAOC,MAAMD,OAAOD,GAArB"} \ No newline at end of file +{"version":3,"file":"index.umd.min.js","sources":["../src/hooks/device.ts","../src/components/provider.tsx","../src/hooks/state.ts","../src/hooks/consumer.ts","../src/hooks/publisher.ts","../src/components/video_viewer.tsx","../src/hooks/actions.ts","../src/hooks/audio_level.ts","../src/hooks/remote.ts","../src/hooks/session.ts"],"sourcesContent":["import { TypedEventEmitter } from '@8xff/atm0s-media-js/types/lib/utils/typed-event-emitter';\nimport { getLogger } from '@8xff/atm0s-media-js/types/lib/utils/logger';\nimport { useEffect, useState } from 'react';\n\nconst logger = getLogger('DeviceHook');\n\ninterface Return {\n media?: MediaStream;\n error?: Error;\n}\n\nclass StreamContainer extends TypedEventEmitter<{ changed: (data: Return) => void }> {\n count = 0;\n data: Return = {};\n\n constructor(private key: string) {\n super();\n logger.log('Created container for local stream', key);\n }\n\n setData(data: Return) {\n this.data = data;\n this.emit('changed', data);\n }\n\n retain() {\n this.count += 1;\n logger.log('Retain local stream', this.key, this.count);\n return this.count;\n }\n\n release() {\n this.count -= 1;\n logger.log('Release local stream', this.key, this.count);\n if (this.count == 0) {\n logger.log('Destroy local stream', this.key);\n this.data.media?.getTracks().map((track) => {\n track.stop();\n });\n }\n return this.count;\n }\n}\nconst globalStore: Map = new Map();\n\nexport const useDevices = (\n kind: MediaDeviceKind,\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n): [MediaDeviceInfo[], any | null] => {\n const [devices, setDevices] = useState([]);\n const [error, setError] = useState(null);\n useEffect(() => {\n navigator.mediaDevices\n .enumerateDevices()\n .then((devices) => {\n setDevices(devices.filter((d) => d.kind == kind));\n })\n .catch((error) => {\n setDevices([]);\n setError(error);\n });\n }, [kind]);\n\n return [devices, error];\n};\n\nfunction getDevicePrivate(\n kind: MediaDeviceKind,\n deviceId: string | boolean,\n callback: (data: Return) => void,\n): [StreamContainer, string] {\n const key = kind + '-' + deviceId;\n let containerSlot = globalStore.get(key);\n if (containerSlot) {\n containerSlot.on('changed', callback);\n callback(containerSlot.data);\n } else {\n containerSlot = new StreamContainer(key);\n globalStore.set(key, containerSlot);\n let constraints: MediaStreamConstraints = {};\n if (kind == 'audioinput') {\n constraints = {\n audio:\n typeof deviceId == 'string'\n ? {\n deviceId: deviceId,\n }\n : true,\n };\n } else if (kind == 'videoinput') {\n constraints = {\n video:\n typeof deviceId == 'string'\n ? {\n deviceId: deviceId,\n }\n : true,\n };\n }\n navigator.mediaDevices\n .getUserMedia(constraints)\n .then((stream) => {\n stream.cachedKey = key;\n containerSlot?.setData({ media: stream });\n callback({ media: stream });\n })\n .catch((err) => {\n containerSlot?.setData({ error: err });\n callback({ error: err });\n });\n }\n\n return [containerSlot, key];\n}\n\nexport function getDevice(kind: MediaDeviceKind, deviceId: string | boolean): Promise {\n return new Promise((resolve, reject) => {\n getDevicePrivate(kind, deviceId, (res) => {\n if (res.error) {\n reject(res.error);\n } else {\n resolve(res.media!);\n }\n });\n });\n}\n\nexport function retainDevice(key: string) {\n const slot = globalStore.get(key);\n slot?.retain();\n}\n\nexport function releaseDevice(key: string) {\n const slot = globalStore.get(key);\n if (slot?.release() == 0) {\n globalStore.delete(key);\n }\n}\n\nexport const useDevice = (\n kind: MediaDeviceKind,\n deviceId: string | boolean,\n): [MediaStream | undefined, Error | undefined] => {\n const [res, setRes] = useState({} as Return);\n useEffect(() => {\n if (deviceId != false) {\n const [containerSlot, key] = getDevicePrivate(kind, deviceId, setRes);\n containerSlot.retain();\n return () => {\n setRes({ media: undefined, error: undefined });\n if (containerSlot?.release() == 0) {\n globalStore.delete(key);\n }\n };\n }\n }, [kind, deviceId]);\n return [res.media, res.error];\n};\n\nexport const useUserMedia = (\n constraints?: MediaStreamConstraints,\n active?: boolean,\n): [MediaStream | undefined, Error | undefined] => {\n const [res, setRes] = useState({} as Return);\n useEffect(() => {\n if (active) {\n let gotStream: MediaStream | undefined;\n navigator.mediaDevices\n .getUserMedia(constraints)\n .then((stream) => {\n gotStream = stream;\n setRes({ media: stream });\n })\n .catch((err) => {\n gotStream = undefined;\n setRes({ error: err });\n });\n return () => {\n setRes({ media: undefined, error: undefined });\n gotStream?.getTracks().forEach((track) => {\n track.stop();\n });\n };\n }\n }, [JSON.stringify(constraints), active]);\n return [res.media, res.error];\n};\n\nexport const useDisplayMedia = (\n constraints?: DisplayMediaStreamOptions,\n active?: boolean,\n): [MediaStream | undefined, Error | undefined] => {\n const [res, setRes] = useState({} as Return);\n useEffect(() => {\n if (active) {\n let gotStream: MediaStream | undefined;\n navigator.mediaDevices\n .getDisplayMedia(constraints)\n .then((stream) => {\n gotStream = stream;\n setRes({ media: stream });\n })\n .catch((err) => {\n gotStream = undefined;\n setRes({ error: err });\n });\n return () => {\n setRes({ media: undefined, error: undefined });\n gotStream?.getTracks().forEach((track) => {\n track.stop();\n });\n };\n }\n }, [JSON.stringify(constraints), active]);\n return [res.media, res.error];\n};\n","import React, { useCallback, useMemo, useState } from 'react';\nimport Atm0s, { type AnyFunction, type IPublisherCallbacks } from '@8xff/atm0s-media-js';\nimport { releaseDevice, retainDevice } from '../hooks/device';\n\nexport enum SessionState {\n New = 'new',\n Connecting = 'connecting',\n Connected = 'connected',\n Reconnecting = 'reconnecting',\n Disconnected = 'disconnected',\n Error = 'error',\n}\n\nexport class StreamPublisherWrap {\n constructor(private publisher: Atm0s.StreamPublisher) {}\n\n get state() {\n return this.publisher.state;\n }\n\n get localStream() {\n return this.publisher.localStream;\n }\n\n on(type: keyof IPublisherCallbacks, callback: AnyFunction) {\n this.publisher.on(type, callback);\n }\n\n off(type: keyof IPublisherCallbacks, callback: AnyFunction) {\n this.publisher.on(type, callback);\n }\n\n switchStream(stream: MediaStream | null) {\n if (stream) {\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n const cachedKey = stream.cachedKey;\n if (cachedKey) {\n retainDevice(cachedKey);\n }\n }\n if (this.publisher.localStream) {\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n const cacheKey = this.publisher.localStream.cachedKey;\n if (cacheKey) {\n releaseDevice(cacheKey);\n }\n }\n return this.publisher.switch(stream);\n }\n}\n\ninterface SessionContainer {\n session: Atm0s.Session;\n state: SessionState;\n myAudioStreams: Atm0s.StreamRemote[];\n myVideoStreams: Atm0s.StreamRemote[];\n audioStreams: Atm0s.StreamRemote[];\n videoStreams: Atm0s.StreamRemote[];\n publishers: Map>;\n consumers: Map>;\n consumerPairs: Map>;\n}\n\ninterface ArcContainer {\n data: T;\n owners: Map;\n}\n\ninterface SessionContextInfo {\n data?: SessionContainer;\n connect: (url: string, config: Atm0s.ISessionConfig) => void;\n disconnect: () => void;\n getPublisher(ownerId: number, cfg: Atm0s.SenderConfig): StreamPublisherWrap | undefined;\n backPublisher(ownerId: number, cfg: Atm0s.SenderConfig): void;\n getConsumer(ownerId: number, remote: Atm0s.StreamRemote): Atm0s.StreamConsumer | undefined;\n backConsumer(owner_id: number, remote: Atm0s.StreamRemote): void;\n getConsumerPair(\n ownerId: number,\n peerId: string,\n audioName: string,\n videoName: string,\n ): Atm0s.StreamConsumerPair | undefined;\n backConsumerPair(ownerId: number, peerId: string, audioName: string, videoName: string): void;\n update: (new_info: SessionContainer) => void;\n}\n\nexport const SessionContext = React.createContext({} as SessionContextInfo);\n\ninterface Props {\n children: React.ReactNode;\n // log_level?: Atm0s.LogLevel;\n url?: string;\n config?: Atm0s.ISessionConfig;\n}\n\nlet GlobalVer = 0;\n\nexport const SessionProvider = (props: Props) => {\n // if (props.log_level != undefined) {\n // Atm0s.setLogLevel(props.log_level);\n // }\n const [, setVer] = useState(0);\n const storage = useMemo<{ data: SessionContainer | undefined }>(() => {\n return { data: undefined };\n }, []);\n const update = useCallback(\n (data: SessionContainer | undefined) => {\n storage.data = data;\n setVer(GlobalVer++);\n },\n [storage, setVer],\n );\n const connect = useCallback(\n (url: string, config: Atm0s.ISessionConfig) => {\n if (storage.data?.session) {\n return () => {\n storage.data?.session.disconnect();\n };\n }\n const session = Atm0s.createSession(url, config);\n const myAudioStreams = new Map();\n const myVideoStreams = new Map();\n const audioStreams = new Map();\n const videoStreams = new Map();\n\n const publishers: Map> = new Map();\n const consumers: Map> = new Map();\n const consumerPairs: Map> = new Map();\n\n config?.senders?.map((sender) => {\n if (sender.stream) {\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n const cachedKey = sender.stream.cachedKey;\n if (cachedKey) {\n retainDevice(cachedKey);\n }\n }\n });\n\n session.on('connected', () => {\n if (storage.data?.session != session) return;\n update({\n session,\n state: SessionState.Connected,\n myAudioStreams: Array.from(myAudioStreams.values()),\n myVideoStreams: Array.from(myVideoStreams.values()),\n audioStreams: Array.from(audioStreams.values()),\n videoStreams: Array.from(videoStreams.values()),\n publishers,\n consumers,\n consumerPairs,\n });\n });\n\n session.on('mystream_added', (stream: Atm0s.StreamRemote) => {\n if (storage.data?.session != session) return;\n const key = stream.peerId + '-' + stream.name;\n if (stream.kind === Atm0s.StreamKinds.AUDIO) {\n myAudioStreams.set(key, stream);\n } else {\n myVideoStreams.set(key, stream);\n }\n update({\n session,\n state: SessionState.Connected,\n myAudioStreams: Array.from(myAudioStreams.values()),\n myVideoStreams: Array.from(myVideoStreams.values()),\n audioStreams: Array.from(audioStreams.values()),\n videoStreams: Array.from(videoStreams.values()),\n publishers,\n consumers,\n consumerPairs,\n });\n });\n\n session.on('mystream_updated', (stream: Atm0s.StreamRemote) => {\n if (storage.data?.session != session) return;\n const key = stream.peerId + '-' + stream.name;\n if (stream.kind === Atm0s.StreamKinds.AUDIO) {\n myAudioStreams.set(key, stream);\n } else {\n myVideoStreams.set(key, stream);\n }\n update({\n session,\n state: SessionState.Connected,\n myAudioStreams: Array.from(myAudioStreams.values()),\n myVideoStreams: Array.from(myVideoStreams.values()),\n audioStreams: Array.from(audioStreams.values()),\n videoStreams: Array.from(videoStreams.values()),\n publishers,\n consumers,\n consumerPairs,\n });\n });\n\n session.on('mystream_removed', (stream: Atm0s.StreamRemote) => {\n if (storage.data?.session != session) return;\n const key = stream.peerId + '-' + stream.name;\n if (stream.kind === Atm0s.StreamKinds.AUDIO) {\n myAudioStreams.delete(key);\n } else {\n myVideoStreams.delete(key);\n }\n update({\n session,\n state: SessionState.Connected,\n myAudioStreams: Array.from(myAudioStreams.values()),\n myVideoStreams: Array.from(myVideoStreams.values()),\n audioStreams: Array.from(audioStreams.values()),\n videoStreams: Array.from(videoStreams.values()),\n publishers,\n consumers,\n consumerPairs,\n });\n });\n\n session.on('stream_added', (stream: Atm0s.StreamRemote) => {\n if (storage.data?.session != session) return;\n const key = stream.peerId + '-' + stream.name;\n if (stream.kind === Atm0s.StreamKinds.AUDIO) {\n audioStreams.set(key, stream);\n } else {\n videoStreams.set(key, stream);\n }\n update({\n session,\n state: SessionState.Connected,\n myAudioStreams: Array.from(myAudioStreams.values()),\n myVideoStreams: Array.from(myVideoStreams.values()),\n audioStreams: Array.from(audioStreams.values()),\n videoStreams: Array.from(videoStreams.values()),\n publishers,\n consumers,\n consumerPairs: consumerPairs,\n });\n });\n\n session.on('stream_updated', (stream: Atm0s.StreamRemote) => {\n if (storage.data?.session != session) return;\n const key = stream.peerId + '-' + stream.name;\n if (stream.kind === Atm0s.StreamKinds.AUDIO) {\n audioStreams.set(key, stream);\n } else {\n videoStreams.set(key, stream);\n }\n update({\n session,\n state: SessionState.Connected,\n myAudioStreams: Array.from(myAudioStreams.values()),\n myVideoStreams: Array.from(myVideoStreams.values()),\n audioStreams: Array.from(audioStreams.values()),\n videoStreams: Array.from(videoStreams.values()),\n publishers,\n consumers,\n consumerPairs,\n });\n });\n\n session.on('stream_removed', (stream: Atm0s.StreamRemote) => {\n if (storage.data?.session != session) return;\n const key = stream.peerId + '-' + stream.name;\n if (stream.kind === Atm0s.StreamKinds.AUDIO) {\n audioStreams.delete(key);\n } else {\n videoStreams.delete(key);\n }\n update({\n session,\n state: SessionState.Connected,\n myAudioStreams: Array.from(myAudioStreams.values()),\n myVideoStreams: Array.from(myVideoStreams.values()),\n audioStreams: Array.from(audioStreams.values()),\n videoStreams: Array.from(videoStreams.values()),\n publishers,\n consumers,\n consumerPairs,\n });\n });\n\n session.on('disconnected', () => {\n if (storage.data?.session != session) return;\n update({\n session,\n state: SessionState.Disconnected,\n myAudioStreams: Array.from(myAudioStreams.values()),\n myVideoStreams: Array.from(myVideoStreams.values()),\n audioStreams: Array.from(audioStreams.values()),\n videoStreams: Array.from(videoStreams.values()),\n publishers,\n consumers,\n consumerPairs,\n });\n });\n session.connect().catch((err) => {\n if (storage.data?.session != session) return;\n console.error(err);\n update({\n session,\n state: SessionState.Error,\n myAudioStreams: Array.from(myAudioStreams.values()),\n myVideoStreams: Array.from(myVideoStreams.values()),\n audioStreams: Array.from(audioStreams.values()),\n videoStreams: Array.from(videoStreams.values()),\n publishers,\n consumers,\n consumerPairs,\n });\n });\n update({\n session,\n state: SessionState.Connecting,\n myAudioStreams: [],\n myVideoStreams: [],\n audioStreams: [],\n videoStreams: [],\n publishers,\n consumers,\n consumerPairs,\n });\n return;\n },\n [storage, update],\n );\n\n const disconnect = useCallback(() => {\n if (storage.data?.session) {\n storage.data.session.disconnect();\n update(undefined);\n }\n }, [storage, update]);\n\n const getPublisher = useCallback(\n (ownerId: number, cfg: Atm0s.SenderConfig) => {\n const data = storage.data;\n if (data?.session) {\n let publisher = data.publishers.get(cfg.name);\n if (!publisher) {\n publisher = {\n data: new StreamPublisherWrap(\n data.session.createPublisher({\n stream: cfg.stream,\n name: cfg.name,\n kind: cfg.kind,\n preferredCodecs: cfg.preferredCodecs,\n simulcast: cfg.simulcast,\n maxBitrate: cfg.maxBitrate,\n contentHint: cfg.contentHint,\n screen: cfg.screen,\n }),\n ),\n owners: new Map(),\n };\n data.publishers.set(cfg.name, publisher);\n }\n data.publishers.get(cfg.name)?.owners.set(ownerId, new Date().getTime());\n return publisher.data;\n }\n return undefined;\n },\n [storage],\n );\n\n const backPublisher = useCallback(\n (ownerId: number, cfg: Atm0s.SenderConfig) => {\n const data = storage.data;\n if (data?.session) {\n const publisher = data.publishers.get(cfg.name);\n if (publisher) {\n publisher.owners.delete(ownerId);\n if (publisher.owners.size == 0) {\n publisher.data.switchStream(null);\n data.publishers.delete(cfg.name);\n }\n }\n }\n return undefined;\n },\n [storage],\n );\n\n const getConsumer = useCallback(\n (ownerId: number, stream: Atm0s.StreamRemote) => {\n const data = storage.data;\n if (data?.session) {\n const key = stream.peerId + '-' + stream.name;\n let consumer = data.consumers.get(key);\n if (!consumer) {\n consumer = {\n data: data.session.createConsumer(stream),\n owners: new Map(),\n };\n data.consumers.set(key, consumer);\n }\n data.consumers.get(key)?.owners.set(ownerId, new Date().getTime());\n return consumer.data;\n }\n return undefined;\n },\n [storage],\n );\n\n const backConsumer = useCallback(\n (ownerId: number, stream: Atm0s.StreamRemote) => {\n const data = storage.data;\n if (data?.session) {\n const key = stream.peerId + '-' + stream.name;\n const consumer = data.consumers.get(key);\n if (consumer) {\n consumer.owners.delete(ownerId);\n if (consumer.owners.size == 0) {\n data.consumers.delete(key);\n }\n }\n }\n return undefined;\n },\n [storage],\n );\n\n const getConsumerPair = useCallback(\n (ownerId: number, peerId: string, audioName: string, videoName: string) => {\n const data = storage.data;\n if (data?.session) {\n const key = peerId + '-' + audioName + '-' + videoName;\n let consumer = data.consumerPairs.get(key);\n if (!consumer) {\n consumer = {\n data: data.session.createConsumerPair(peerId, audioName, videoName),\n owners: new Map(),\n };\n data.consumerPairs.set(key, consumer);\n }\n data.consumerPairs.get(key)?.owners.set(ownerId, new Date().getTime());\n return consumer.data;\n }\n return undefined;\n },\n [storage],\n );\n\n const backConsumerPair = useCallback(\n (ownerId: number, peerId: string, audioName: string, videoName: string) => {\n const data = storage.data;\n if (data?.session) {\n const key = peerId + '-' + audioName + '-' + videoName;\n const consumer = data.consumerPairs.get(key);\n if (consumer) {\n consumer.owners.delete(ownerId);\n if (consumer.owners.size == 0) {\n data.consumerPairs.delete(key);\n }\n }\n }\n return undefined;\n },\n [storage],\n );\n\n React.useEffect(() => {\n if (props.url && props.config) {\n connect(props.url, props.config);\n return () => {\n disconnect();\n };\n }\n }, [props.url, props.config, connect, disconnect]);\n\n return (\n \n {props.children}\n \n );\n};\n","import { useContext } from 'react';\nimport { SessionContext, SessionState } from '../components/provider';\n\nexport const useSessionState = (): SessionState => {\n const { data } = useContext(SessionContext);\n return data?.state || SessionState.New;\n};\n","import { useContext, useEffect, useMemo, useState, type LegacyRef } from 'react';\nimport { SessionContext, SessionState } from '../components/provider';\nimport Atm0s from '@8xff/atm0s-media-js';\nimport { useSessionState } from './state';\n\nlet idSeed = 0;\nexport const useConsumer = (\n remote?: Atm0s.StreamRemote,\n priority?: number,\n maxSpatial?: number,\n maxTemporal?: number,\n): [LegacyRef | undefined, Atm0s.StreamReceiverState, Atm0s.StreamConsumer | undefined] => {\n const consumerId = useMemo(() => idSeed++, []);\n const sessionState = useSessionState();\n const [consumer, setConsumer] = useState();\n const [state, setState] = useState(Atm0s.StreamReceiverState.NoSource);\n const [element, setElement] = useState();\n const { data, getConsumer, backConsumer } = useContext(SessionContext);\n\n const isConnectionEstablished = [SessionState.Connected, SessionState.Reconnecting].indexOf(sessionState) >= 0;\n\n useEffect(() => {\n if (data?.session && remote) {\n const consumer = getConsumer(consumerId, remote);\n if (consumer) {\n consumer.on('state', setState);\n setState(consumer.state);\n setConsumer(consumer);\n return () => {\n consumer?.unview('use-consumer-' + consumerId);\n consumer?.off('state', setState);\n backConsumer(consumerId, remote);\n };\n }\n }\n }, [data?.session, remote]);\n\n useEffect(() => {\n if (element && consumer && isConnectionEstablished) {\n element.srcObject = consumer.view('use-consumer-' + consumerId, priority, maxSpatial, maxTemporal);\n return () => {\n element.srcObject = null;\n consumer.unview('use-consumer-' + consumerId);\n };\n }\n }, [element, consumer, isConnectionEstablished]);\n\n useEffect(() => {\n if (element && consumer && isConnectionEstablished) {\n consumer.limit('use-consumer-' + consumerId, priority, maxSpatial, maxTemporal);\n }\n }, [element, consumer, isConnectionEstablished, priority, maxSpatial, maxTemporal]);\n\n const ref = (instance: HTMLVideoElement | null) => {\n setElement(instance || undefined);\n };\n\n return [ref, state, consumer];\n};\n\nexport const useConsumerPair = (\n peerId: string,\n audioName: string,\n videoName: string,\n priority?: number,\n maxSpatial?: number,\n maxTemporal?: number,\n): [LegacyRef | undefined, Atm0s.StreamReceiverState, Atm0s.StreamConsumerPair | undefined] => {\n const consumerId = useMemo(() => idSeed++, []);\n const sessionState = useSessionState();\n const [consumer, setConsumer] = useState();\n const [state, setState] = useState(Atm0s.StreamReceiverState.NoSource);\n const [element, setElement] = useState();\n const { data, getConsumerPair: getConsumerPair, backConsumerPair: backConsumerPair } = useContext(SessionContext);\n\n const isConnectionEstablished = [SessionState.Connected, SessionState.Reconnecting].indexOf(sessionState) >= 0;\n\n useEffect(() => {\n if (data?.session) {\n const consumer = getConsumerPair(consumerId, peerId, audioName, videoName);\n if (consumer) {\n consumer.on('state', setState);\n setState(consumer.state);\n setConsumer(consumer);\n return () => {\n consumer?.off('state', setState);\n backConsumerPair(consumerId, peerId, audioName, videoName);\n };\n }\n }\n }, [data?.session, peerId, audioName, videoName]);\n\n useEffect(() => {\n if (element && consumer && isConnectionEstablished) {\n element.srcObject = consumer.view('use-consumer-' + consumerId, priority, maxSpatial, maxTemporal);\n return () => {\n element.srcObject = null;\n consumer.unview('use-consumer-' + consumerId);\n };\n }\n }, [element, consumer, isConnectionEstablished]);\n\n useEffect(() => {\n if (element && consumer && isConnectionEstablished) {\n consumer.limit('use-consumer-' + consumerId, priority, maxSpatial, maxTemporal);\n }\n }, [element, consumer, isConnectionEstablished, priority, maxSpatial, maxTemporal]);\n\n const ref = (instance: HTMLVideoElement | null) => {\n setElement(instance || undefined);\n };\n\n return [ref, state, consumer];\n};\n\nexport const useLocalConsumer = (stream?: MediaStream) => {\n const [element, setElement] = useState();\n useEffect(() => {\n if (element && stream) {\n element.srcObject = stream;\n return () => {\n element.srcObject = null;\n };\n }\n }, [element, stream]);\n\n return (instance: HTMLVideoElement | null) => {\n setElement(instance || undefined);\n };\n};\n","import { useContext, useEffect, useMemo, useState } from 'react';\nimport { SessionContext, StreamPublisherWrap } from '../components/provider';\nimport Atm0s from '@8xff/atm0s-media-js';\n\nlet idSeed = 0;\n\nexport const usePublisher = (\n cfg: Atm0s.SenderConfig,\n): [Atm0s.StreamSenderState, MediaStream | undefined | null, StreamPublisherWrap | undefined] => {\n const publisherId = useMemo(() => idSeed++, []);\n const [state, setState] = useState(Atm0s.StreamSenderState.Created);\n const [producer, setProducer] = useState();\n const { data, getPublisher: getPublisher, backPublisher: backPublisher } = useContext(SessionContext);\n useEffect(() => {\n if (data?.session) {\n const newProducer = getPublisher(publisherId, cfg);\n if (newProducer) {\n const onUpdateState = (state: Atm0s.StreamSenderState) => {\n setState(state);\n };\n newProducer.on('state', onUpdateState);\n setProducer(newProducer);\n setState(newProducer.state);\n return () => {\n newProducer?.off('state', onUpdateState);\n backPublisher(publisherId, cfg);\n };\n }\n }\n }, [data?.session, cfg.kind + cfg.name]);\n\n return [state, producer?.localStream, producer];\n};\n","import { StreamRemote } from '@8xff/atm0s-media-js';\nimport React from 'react';\nimport { useConsumer, useLocalConsumer } from '../hooks';\n\nexport const RemoteViewer = (props: { remote: StreamRemote; priority?: number }) => {\n const [ref, state] = useConsumer(props.remote, props.priority);\n return (\n
\n
{state}
\n \n
\n );\n};\n\nexport const LocalViewer = (props: { stream: MediaStream }) => {\n const ref = useLocalConsumer(props.stream);\n return ;\n};\n\nexport const VideoViewer = (props: { stream: MediaStream | StreamRemote; priority?: number }) => {\n if (props.stream instanceof StreamRemote) {\n return ;\n } else {\n return ;\n }\n};\n","import { useContext } from 'react';\nimport { SessionContext } from '../components/provider';\nimport type { ISessionConfig } from '@8xff/atm0s-media-js';\n\ninterface Actions {\n connect: (url: string, config: ISessionConfig) => void;\n disconnect: () => void;\n playAudioMix: () => void;\n}\n\nexport const useActions = (): Actions => {\n const { connect, disconnect } = useContext(SessionContext);\n return {\n connect,\n disconnect,\n playAudioMix: () => {\n // data?.session.getMixMinusAudio()?.play();\n },\n };\n};\n","import { useContext, useEffect, useState } from 'react';\nimport * as Bluesea from '@8xff/atm0s-media-js';\nimport { StreamPublisherWrap, BlueseaSessionContext } from '../components';\n\nexport const useAudioLevelConsumer = (\n consumer?: Bluesea.StreamConsumer | Bluesea.StreamConsumerPair,\n): number | undefined => {\n const [audioLevel, setAudioLevel] = useState(undefined);\n useEffect(() => {\n if (consumer) {\n const handler = (level: number) => {\n setAudioLevel(level);\n };\n consumer.on('audio_level', handler);\n\n return () => {\n consumer.off('audio_level', handler);\n };\n } else {\n setAudioLevel(undefined);\n }\n }, [consumer]);\n return audioLevel;\n};\n\nexport const useAudioLevelProducer = (producer?: StreamPublisherWrap): number | undefined => {\n const [audioLevel, setAudioLevel] = useState(undefined);\n useEffect(() => {\n if (producer) {\n const handler = (level: number) => {\n setAudioLevel(level);\n };\n producer.on('audio_level', handler);\n\n return () => {\n producer.off('audio_level', handler);\n };\n } else {\n setAudioLevel(undefined);\n }\n }, [producer]);\n return audioLevel;\n};\n\nexport interface AudioMixSlotInfo {\n peerId: string;\n streamName: string;\n audioLevel: number;\n}\n\nexport const useAudioSlotMix = (slotIndex: number) => {\n const [slot, setSlot] = useState(undefined);\n const { data } = useContext(BlueseaSessionContext);\n useEffect(() => {\n const mixMinus = data?.session.getMixMinusAudio();\n if (mixMinus) {\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n const handler = (info: any | null) => {\n if (info) {\n const sourceId = info[0].split(':');\n setSlot({\n peerId: sourceId[0],\n streamName: sourceId[1],\n audioLevel: info[1],\n });\n } else {\n setSlot(undefined);\n }\n };\n mixMinus.on(`slot_${slotIndex}`, handler);\n\n return () => {\n mixMinus?.off(`slot_${slotIndex}`, handler);\n };\n }\n }, [slotIndex, data?.session.getMixMinusAudio()]);\n return slot;\n};\n\nexport const useAudioLevelMix = (peerId: string, streamName: string) => {\n const [audioLevel, setAudioLevel] = useState(undefined);\n const { data } = useContext(BlueseaSessionContext);\n useEffect(() => {\n const mixMinus = data?.session.getMixMinusAudio();\n if (mixMinus) {\n const handler = (level: number | null) => {\n setAudioLevel(level || undefined);\n };\n mixMinus.on(`source_${peerId}:${streamName}`, handler);\n\n return () => {\n mixMinus?.off(`source_${peerId}:${streamName}`, handler);\n };\n }\n }, [peerId, streamName, data?.session.getMixMinusAudio()]);\n return audioLevel;\n};\n","import { useContext } from 'react';\nimport { SessionContext } from '../components/provider';\nimport Atm0s from '@8xff/atm0s-media-js';\n\nexport const useRemoteStreams = (kind: Atm0s.StreamKinds, isMine?: boolean): Atm0s.StreamRemote[] => {\n const { data } = useContext(SessionContext);\n if (kind == Atm0s.StreamKinds.AUDIO) {\n if (isMine === true) {\n return data?.myAudioStreams || [];\n } else {\n return data?.audioStreams || [];\n }\n } else {\n if (isMine === true) {\n return data?.myVideoStreams || [];\n } else {\n return data?.videoStreams || [];\n }\n }\n};\n\nexport const usePeerRemoteStreams = (peerId: string, kind: Atm0s.StreamKinds): Atm0s.StreamRemote[] => {\n const { data } = useContext(SessionContext);\n if (kind == Atm0s.StreamKinds.AUDIO) {\n return data?.audioStreams.filter((a) => a.peerId === peerId) || [];\n } else {\n return data?.videoStreams.filter((a) => a.peerId === peerId) || [];\n }\n};\n","import { useContext } from 'react';\nimport { SessionContext } from '../components/provider';\nimport Atm0s from '@8xff/atm0s-media-js';\n\nexport const useSession = (): Atm0s.Session | undefined => {\n const { data } = useContext(SessionContext);\n return data?.session;\n};\n"],"names":["logger","getLogger","StreamContainer","_super","key","_this","this","count","data","log","__extends","prototype","setData","emit","retain","release","_a","media","getTracks","map","track","stop","TypedEventEmitter","globalStore","Map","getDevicePrivate","kind","deviceId","callback","containerSlot","get","on","set","constraints","audio","video","navigator","mediaDevices","getUserMedia","then","stream","cachedKey","catch","err","error","retainDevice","slot","SessionState","exports","StreamPublisherWrap","publisher","Object","defineProperty","state","localStream","type","off","switchStream","cacheKey","delete","switch","SessionContext","React","createContext","GlobalVer","useSessionState","useContext","New","idSeed","useConsumer","remote","priority","maxSpatial","maxTemporal","consumerId","useMemo","sessionState","useState","consumer","setConsumer","_b","Atm0s","StreamReceiverState","NoSource","setState","_c","element","setElement","_d","getConsumer","backConsumer","isConnectionEstablished","Connected","Reconnecting","indexOf","useEffect","session","consumer_1","unview","srcObject","view","limit","instance","undefined","useLocalConsumer","RemoteViewer","props","ref","createElement","className","muted","autoPlay","LocalViewer","setVer","storage","update","useCallback","connect","url","config","disconnect","createSession","myAudioStreams","myVideoStreams","audioStreams","videoStreams","publishers","consumers","consumerPairs","senders","sender","Array","from","values","peerId","name","StreamKinds","AUDIO","Disconnected","console","Error","Connecting","getPublisher","ownerId","cfg","createPublisher","preferredCodecs","simulcast","maxBitrate","contentHint","screen","owners","Date","getTime","backPublisher","size","createConsumer","getConsumerPair","audioName","videoName","createConsumerPair","backConsumerPair","Provider","value","children","StreamRemote","Promise","resolve","reject","res","playAudioMix","audioLevel","setAudioLevel","handler_1","level","streamName","BlueseaSessionContext","mixMinus","getMixMinusAudio","handler_4","concat","producer","handler_2","slotIndex","setSlot","handler_3","info","sourceId","split","consumer_2","setRes","containerSlot_1","key_1","devices","setDevices","setError","enumerateDevices","filter","d","active","gotStream_2","getDisplayMedia","forEach","JSON","stringify","publisherId","StreamSenderState","Created","setProducer","newProducer_1","onUpdateState_1","isMine","gotStream_1"],"mappings":"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"} \ No newline at end of file diff --git a/docs/README.md b/docs/README.md index 87f80a2..8aae218 100644 --- a/docs/README.md +++ b/docs/README.md @@ -1,6 +1,6 @@ -[libraryNameWithSpacesAndUpperCases] +Atm0s React SDK -# [libraryNameWithSpacesAndUpperCases] +# Atm0s React SDK ## Table of contents diff --git a/package-lock.json b/package-lock.json index c90d0f0..122c97b 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1,13 +1,16 @@ { - "name": "[libraryName]", + "name": "@8xff/atm0s-media-react", "version": "0.0.0", "lockfileVersion": 3, "requires": true, "packages": { "": { - "name": "[libraryName]", + "name": "@8xff/atm0s-media-react", "version": "0.0.0", "license": "MIT", + "dependencies": { + "@8xff/atm0s-media-js": "0.1.1-alpha.0" + }, "devDependencies": { "@rollup/plugin-terser": "^0.4.3", "@types/eslint": "^8.44.3", @@ -29,6 +32,16 @@ "typescript": "^5.2.2" } }, + "node_modules/@8xff/atm0s-media-js": { + "version": "0.1.1-alpha.0", + "resolved": "https://registry.npmjs.org/@8xff/atm0s-media-js/-/atm0s-media-js-0.1.1-alpha.0.tgz", + "integrity": "sha512-0dhhDC7cMvbsln/+X/Y0v/YwR7uLJK5U56mhSxVOLfsgZSILqi5tTS0IN5vB8wD25xLQK83xEY21l59FSvLjew==", + "dependencies": { + "pako": "^2.1.0", + "ts-debounce": "^4.0.0", + "tslib": "^2.6.2" + } + }, "node_modules/@aashutoshrathi/word-wrap": { "version": "1.2.6", "resolved": "https://registry.npmjs.org/@aashutoshrathi/word-wrap/-/word-wrap-1.2.6.tgz", @@ -4369,6 +4382,11 @@ "node": ">=6" } }, + "node_modules/pako": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/pako/-/pako-2.1.0.tgz", + "integrity": "sha512-w+eufiZ1WuJYgPXbV/PO3NCMEc3xqylkKHzp8bxp1uW4qaSNQUkwmLLEc3kKsfz8lpV1F8Ht3U1Cm+9Srog2ug==" + }, "node_modules/parent-module": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/parent-module/-/parent-module-1.0.1.tgz", @@ -5177,6 +5195,11 @@ "typescript": ">=4.2.0" } }, + "node_modules/ts-debounce": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/ts-debounce/-/ts-debounce-4.0.0.tgz", + "integrity": "sha512-+1iDGY6NmOGidq7i7xZGA4cm8DAa6fqdYcvO5Z6yBevH++Bdo9Qt/mN0TzHUgcCcKv1gmh9+W5dHqz8pMWbCbg==" + }, "node_modules/ts-jest": { "version": "29.1.1", "resolved": "https://registry.npmjs.org/ts-jest/-/ts-jest-29.1.1.tgz", @@ -5232,8 +5255,7 @@ "node_modules/tslib": { "version": "2.6.2", "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.6.2.tgz", - "integrity": "sha512-AEYxH93jGFPn/a2iVAwW87VuUIkR1FVUKB77NwMF7nBTDkDrrT/Hpt/IrCJ0QXhW27jTBDcf5ZY7w6RiqTMw2Q==", - "dev": true + "integrity": "sha512-AEYxH93jGFPn/a2iVAwW87VuUIkR1FVUKB77NwMF7nBTDkDrrT/Hpt/IrCJ0QXhW27jTBDcf5ZY7w6RiqTMw2Q==" }, "node_modules/type-check": { "version": "0.4.0", diff --git a/package.json b/package.json index a4ea346..92afd07 100644 --- a/package.json +++ b/package.json @@ -1,5 +1,5 @@ { - "name": "[libraryName]", + "name": "@8xff/atm0s-media-react", "version": "0.0.0", "description": "", "cdn": "dist/index.umd.js", @@ -28,6 +28,7 @@ "@types/eslint": "^8.44.3", "@types/jest": "^29.5.5", "@types/prettier": "^3.0.0", + "@types/react": "^18.2.41", "@typescript-eslint/eslint-plugin": "^6.7.4", "@typescript-eslint/parser": "^6.7.4", "eslint": "^8.50.0", @@ -53,15 +54,19 @@ }, "repository": { "type": "git", - "url": "git+https://github.com/[repositoryOwner]/[repositoryName].git" + "url": "git+https://github.com/8xff/media-sdk-react.git" }, "keywords": [], "author": { - "name": "[authorFullName]" + "name": "Luong Ngoc Minh" }, "license": "MIT", "bugs": { - "url": "https://github.com/[repositoryOwner]/[repositoryName]/issues" + "url": "https://github.com/8xff/media-sdk-react/issues" }, - "homepage": "https://github.com/[repositoryOwner]/[repositoryName]#readme" + "homepage": "https://github.com/8xff/media-sdk-react#readme", + "dependencies": { + "@8xff/atm0s-media-js": "0.1.1-alpha.0", + "react": "^18.2.0" + } } diff --git a/prettier.config.js b/prettier.config.js index fb3b9e7..ad058f2 100644 --- a/prettier.config.js +++ b/prettier.config.js @@ -10,6 +10,8 @@ const options = { quoteProps: 'consistent', singleQuote: true, trailingComma: 'all', + tabWidth: 2, + printWidth: 120, }; module.exports = options; diff --git a/rollup.config.mjs b/rollup.config.mjs index 9520a45..5b30a70 100644 --- a/rollup.config.mjs +++ b/rollup.config.mjs @@ -22,7 +22,7 @@ const banner = `/*! function createOutputOptions(options) { return { banner, - name: '[libraryCamelCaseName]', + name: 'Atm0s', exports: 'named', sourcemap: true, ...options, diff --git a/setup.js b/setup.js deleted file mode 100644 index 338c35d..0000000 --- a/setup.js +++ /dev/null @@ -1,128 +0,0 @@ -/* eslint-env node */ -/* eslint-disable @typescript-eslint/no-var-requires */ - -const fs = require('fs/promises'); -const path = require('path'); -const readline = require('readline'); - -const resolveToFiles = (directory) => async (dirent) => { - if ( - dirent.name === '.git' || - dirent.name === 'setup.js' || - dirent.name === 'node_modules' - ) - return []; - if (dirent.isFile()) return [path.resolve(directory, dirent.name)]; - if (dirent.isDirectory()) - return await getFiles(path.resolve(directory, dirent.name)); - return []; -}; - -const getFiles = async (directory) => { - const filesWithTypes = await fs.readdir(directory, { - encoding: 'utf-8', - withFileTypes: true, - }); - - const resolutions = filesWithTypes.map(resolveToFiles(directory)); - - const files = await Promise.all(resolutions); - - return files.flat(1); -}; - -const gettingFiles = getFiles(path.resolve(__dirname)); - -const replaceInFile = (matcher, replacer) => async (path) => { - const contents = await fs.readFile(path, { encoding: 'utf-8' }); - await fs.writeFile(path, contents.replace(matcher, replacer)); -}; - -const rl = readline.createInterface({ - input: process.stdin, - output: process.stdout, -}); - -const replaceVariable = async (variable, value) => { - const files = await gettingFiles; - - const matcher = new RegExp(`\\[${variable}\\]`, 'g'); - - await Promise.all(files.map(replaceInFile(matcher, value))); -}; - -const fillTemplateVariable = (variable, question, defaultValue = '') => - new Promise((resolve) => { - rl.question(question, async (receivedValue) => { - const value = receivedValue?.trim() || defaultValue; - - replaceVariable(variable, value); - - rl.write(`Replaced ${variable} to "${value}".\n`); - - resolve(); - }); - }); - -replaceVariable('year', new Date().getFullYear()) - .then(() => - fillTemplateVariable( - 'libraryNameWithSpacesAndUpperCases', - ` -Library name (can have upper/lower case letters, spaces, numbers and special characters) -Ex. React.js, Vue.js, Fetch Interceptors, GraphQL Loader for Webpack etc. -> `, - ), - ) - .then(() => - fillTemplateVariable( - 'libraryName', - ` -Module name (only lower case letters, "." or "-") and optionally with scope. -Ex. react, vue, fetch-interceptors, @webpack/graphql-loader etc. -> `, - ), - ) - .then(() => - fillTemplateVariable( - 'libraryCamelCaseName', - ` -What is you library name in camel-case for UMD bundles? -Ex. React, Vue, fetchInterceptors, graphqlLoaderForWebpack etc. -> `, - ), - ) - .then(() => - fillTemplateVariable( - 'repositoryOwner', - ` -What is your nickname on GitHub? -> `, - '', - ), - ) - .then(() => - fillTemplateVariable( - 'repositoryName', - ` -What will be this repository name on GitHub? -> `, - ), - ) - .then(() => - fillTemplateVariable( - 'authorFullName', - ` -What is your full name? (used in MIT License) -> `, - '', - ), - ) - .then(() => { - rl.close(); - fs.unlink(path.resolve(__filename)); - }) - .catch((error) => { - console.error(error?.message ?? error ?? 'Unknown error.'); - rl.close(); - }); diff --git a/src/components/index.ts b/src/components/index.ts new file mode 100644 index 0000000..6db60f3 --- /dev/null +++ b/src/components/index.ts @@ -0,0 +1,7 @@ +export { + SessionProvider, + SessionContext as BlueseaSessionContext, + StreamPublisherWrap, + SessionState, +} from './provider'; +export { VideoViewer, LocalViewer, RemoteViewer } from './video_viewer'; diff --git a/src/components/provider.tsx b/src/components/provider.tsx new file mode 100644 index 0000000..e9d879f --- /dev/null +++ b/src/components/provider.tsx @@ -0,0 +1,486 @@ +import React, { useCallback, useMemo, useState } from 'react'; +import Atm0s, { type AnyFunction, type IPublisherCallbacks } from '@8xff/atm0s-media-js'; +import { releaseDevice, retainDevice } from '../hooks/device'; + +export enum SessionState { + New = 'new', + Connecting = 'connecting', + Connected = 'connected', + Reconnecting = 'reconnecting', + Disconnected = 'disconnected', + Error = 'error', +} + +export class StreamPublisherWrap { + constructor(private publisher: Atm0s.StreamPublisher) {} + + get state() { + return this.publisher.state; + } + + get localStream() { + return this.publisher.localStream; + } + + on(type: keyof IPublisherCallbacks, callback: AnyFunction) { + this.publisher.on(type, callback); + } + + off(type: keyof IPublisherCallbacks, callback: AnyFunction) { + this.publisher.on(type, callback); + } + + switchStream(stream: MediaStream | null) { + if (stream) { + // eslint-disable-next-line @typescript-eslint/no-explicit-any + const cachedKey = stream.cachedKey; + if (cachedKey) { + retainDevice(cachedKey); + } + } + if (this.publisher.localStream) { + // eslint-disable-next-line @typescript-eslint/no-explicit-any + const cacheKey = this.publisher.localStream.cachedKey; + if (cacheKey) { + releaseDevice(cacheKey); + } + } + return this.publisher.switch(stream); + } +} + +interface SessionContainer { + session: Atm0s.Session; + state: SessionState; + myAudioStreams: Atm0s.StreamRemote[]; + myVideoStreams: Atm0s.StreamRemote[]; + audioStreams: Atm0s.StreamRemote[]; + videoStreams: Atm0s.StreamRemote[]; + publishers: Map>; + consumers: Map>; + consumerPairs: Map>; +} + +interface ArcContainer { + data: T; + owners: Map; +} + +interface SessionContextInfo { + data?: SessionContainer; + connect: (url: string, config: Atm0s.ISessionConfig) => void; + disconnect: () => void; + getPublisher(ownerId: number, cfg: Atm0s.SenderConfig): StreamPublisherWrap | undefined; + backPublisher(ownerId: number, cfg: Atm0s.SenderConfig): void; + getConsumer(ownerId: number, remote: Atm0s.StreamRemote): Atm0s.StreamConsumer | undefined; + backConsumer(owner_id: number, remote: Atm0s.StreamRemote): void; + getConsumerPair( + ownerId: number, + peerId: string, + audioName: string, + videoName: string, + ): Atm0s.StreamConsumerPair | undefined; + backConsumerPair(ownerId: number, peerId: string, audioName: string, videoName: string): void; + update: (new_info: SessionContainer) => void; +} + +export const SessionContext = React.createContext({} as SessionContextInfo); + +interface Props { + children: React.ReactNode; + // log_level?: Atm0s.LogLevel; + url?: string; + config?: Atm0s.ISessionConfig; +} + +let GlobalVer = 0; + +export const SessionProvider = (props: Props) => { + // if (props.log_level != undefined) { + // Atm0s.setLogLevel(props.log_level); + // } + const [, setVer] = useState(0); + const storage = useMemo<{ data: SessionContainer | undefined }>(() => { + return { data: undefined }; + }, []); + const update = useCallback( + (data: SessionContainer | undefined) => { + storage.data = data; + setVer(GlobalVer++); + }, + [storage, setVer], + ); + const connect = useCallback( + (url: string, config: Atm0s.ISessionConfig) => { + if (storage.data?.session) { + return () => { + storage.data?.session.disconnect(); + }; + } + const session = Atm0s.createSession(url, config); + const myAudioStreams = new Map(); + const myVideoStreams = new Map(); + const audioStreams = new Map(); + const videoStreams = new Map(); + + const publishers: Map> = new Map(); + const consumers: Map> = new Map(); + const consumerPairs: Map> = new Map(); + + config?.senders?.map((sender) => { + if (sender.stream) { + // eslint-disable-next-line @typescript-eslint/no-explicit-any + const cachedKey = sender.stream.cachedKey; + if (cachedKey) { + retainDevice(cachedKey); + } + } + }); + + session.on('connected', () => { + if (storage.data?.session != session) return; + update({ + session, + state: SessionState.Connected, + myAudioStreams: Array.from(myAudioStreams.values()), + myVideoStreams: Array.from(myVideoStreams.values()), + audioStreams: Array.from(audioStreams.values()), + videoStreams: Array.from(videoStreams.values()), + publishers, + consumers, + consumerPairs, + }); + }); + + session.on('mystream_added', (stream: Atm0s.StreamRemote) => { + if (storage.data?.session != session) return; + const key = stream.peerId + '-' + stream.name; + if (stream.kind === Atm0s.StreamKinds.AUDIO) { + myAudioStreams.set(key, stream); + } else { + myVideoStreams.set(key, stream); + } + update({ + session, + state: SessionState.Connected, + myAudioStreams: Array.from(myAudioStreams.values()), + myVideoStreams: Array.from(myVideoStreams.values()), + audioStreams: Array.from(audioStreams.values()), + videoStreams: Array.from(videoStreams.values()), + publishers, + consumers, + consumerPairs, + }); + }); + + session.on('mystream_updated', (stream: Atm0s.StreamRemote) => { + if (storage.data?.session != session) return; + const key = stream.peerId + '-' + stream.name; + if (stream.kind === Atm0s.StreamKinds.AUDIO) { + myAudioStreams.set(key, stream); + } else { + myVideoStreams.set(key, stream); + } + update({ + session, + state: SessionState.Connected, + myAudioStreams: Array.from(myAudioStreams.values()), + myVideoStreams: Array.from(myVideoStreams.values()), + audioStreams: Array.from(audioStreams.values()), + videoStreams: Array.from(videoStreams.values()), + publishers, + consumers, + consumerPairs, + }); + }); + + session.on('mystream_removed', (stream: Atm0s.StreamRemote) => { + if (storage.data?.session != session) return; + const key = stream.peerId + '-' + stream.name; + if (stream.kind === Atm0s.StreamKinds.AUDIO) { + myAudioStreams.delete(key); + } else { + myVideoStreams.delete(key); + } + update({ + session, + state: SessionState.Connected, + myAudioStreams: Array.from(myAudioStreams.values()), + myVideoStreams: Array.from(myVideoStreams.values()), + audioStreams: Array.from(audioStreams.values()), + videoStreams: Array.from(videoStreams.values()), + publishers, + consumers, + consumerPairs, + }); + }); + + session.on('stream_added', (stream: Atm0s.StreamRemote) => { + if (storage.data?.session != session) return; + const key = stream.peerId + '-' + stream.name; + if (stream.kind === Atm0s.StreamKinds.AUDIO) { + audioStreams.set(key, stream); + } else { + videoStreams.set(key, stream); + } + update({ + session, + state: SessionState.Connected, + myAudioStreams: Array.from(myAudioStreams.values()), + myVideoStreams: Array.from(myVideoStreams.values()), + audioStreams: Array.from(audioStreams.values()), + videoStreams: Array.from(videoStreams.values()), + publishers, + consumers, + consumerPairs: consumerPairs, + }); + }); + + session.on('stream_updated', (stream: Atm0s.StreamRemote) => { + if (storage.data?.session != session) return; + const key = stream.peerId + '-' + stream.name; + if (stream.kind === Atm0s.StreamKinds.AUDIO) { + audioStreams.set(key, stream); + } else { + videoStreams.set(key, stream); + } + update({ + session, + state: SessionState.Connected, + myAudioStreams: Array.from(myAudioStreams.values()), + myVideoStreams: Array.from(myVideoStreams.values()), + audioStreams: Array.from(audioStreams.values()), + videoStreams: Array.from(videoStreams.values()), + publishers, + consumers, + consumerPairs, + }); + }); + + session.on('stream_removed', (stream: Atm0s.StreamRemote) => { + if (storage.data?.session != session) return; + const key = stream.peerId + '-' + stream.name; + if (stream.kind === Atm0s.StreamKinds.AUDIO) { + audioStreams.delete(key); + } else { + videoStreams.delete(key); + } + update({ + session, + state: SessionState.Connected, + myAudioStreams: Array.from(myAudioStreams.values()), + myVideoStreams: Array.from(myVideoStreams.values()), + audioStreams: Array.from(audioStreams.values()), + videoStreams: Array.from(videoStreams.values()), + publishers, + consumers, + consumerPairs, + }); + }); + + session.on('disconnected', () => { + if (storage.data?.session != session) return; + update({ + session, + state: SessionState.Disconnected, + myAudioStreams: Array.from(myAudioStreams.values()), + myVideoStreams: Array.from(myVideoStreams.values()), + audioStreams: Array.from(audioStreams.values()), + videoStreams: Array.from(videoStreams.values()), + publishers, + consumers, + consumerPairs, + }); + }); + session.connect().catch((err) => { + if (storage.data?.session != session) return; + console.error(err); + update({ + session, + state: SessionState.Error, + myAudioStreams: Array.from(myAudioStreams.values()), + myVideoStreams: Array.from(myVideoStreams.values()), + audioStreams: Array.from(audioStreams.values()), + videoStreams: Array.from(videoStreams.values()), + publishers, + consumers, + consumerPairs, + }); + }); + update({ + session, + state: SessionState.Connecting, + myAudioStreams: [], + myVideoStreams: [], + audioStreams: [], + videoStreams: [], + publishers, + consumers, + consumerPairs, + }); + return; + }, + [storage, update], + ); + + const disconnect = useCallback(() => { + if (storage.data?.session) { + storage.data.session.disconnect(); + update(undefined); + } + }, [storage, update]); + + const getPublisher = useCallback( + (ownerId: number, cfg: Atm0s.SenderConfig) => { + const data = storage.data; + if (data?.session) { + let publisher = data.publishers.get(cfg.name); + if (!publisher) { + publisher = { + data: new StreamPublisherWrap( + data.session.createPublisher({ + stream: cfg.stream, + name: cfg.name, + kind: cfg.kind, + preferredCodecs: cfg.preferredCodecs, + simulcast: cfg.simulcast, + maxBitrate: cfg.maxBitrate, + contentHint: cfg.contentHint, + screen: cfg.screen, + }), + ), + owners: new Map(), + }; + data.publishers.set(cfg.name, publisher); + } + data.publishers.get(cfg.name)?.owners.set(ownerId, new Date().getTime()); + return publisher.data; + } + return undefined; + }, + [storage], + ); + + const backPublisher = useCallback( + (ownerId: number, cfg: Atm0s.SenderConfig) => { + const data = storage.data; + if (data?.session) { + const publisher = data.publishers.get(cfg.name); + if (publisher) { + publisher.owners.delete(ownerId); + if (publisher.owners.size == 0) { + publisher.data.switchStream(null); + data.publishers.delete(cfg.name); + } + } + } + return undefined; + }, + [storage], + ); + + const getConsumer = useCallback( + (ownerId: number, stream: Atm0s.StreamRemote) => { + const data = storage.data; + if (data?.session) { + const key = stream.peerId + '-' + stream.name; + let consumer = data.consumers.get(key); + if (!consumer) { + consumer = { + data: data.session.createConsumer(stream), + owners: new Map(), + }; + data.consumers.set(key, consumer); + } + data.consumers.get(key)?.owners.set(ownerId, new Date().getTime()); + return consumer.data; + } + return undefined; + }, + [storage], + ); + + const backConsumer = useCallback( + (ownerId: number, stream: Atm0s.StreamRemote) => { + const data = storage.data; + if (data?.session) { + const key = stream.peerId + '-' + stream.name; + const consumer = data.consumers.get(key); + if (consumer) { + consumer.owners.delete(ownerId); + if (consumer.owners.size == 0) { + data.consumers.delete(key); + } + } + } + return undefined; + }, + [storage], + ); + + const getConsumerPair = useCallback( + (ownerId: number, peerId: string, audioName: string, videoName: string) => { + const data = storage.data; + if (data?.session) { + const key = peerId + '-' + audioName + '-' + videoName; + let consumer = data.consumerPairs.get(key); + if (!consumer) { + consumer = { + data: data.session.createConsumerPair(peerId, audioName, videoName), + owners: new Map(), + }; + data.consumerPairs.set(key, consumer); + } + data.consumerPairs.get(key)?.owners.set(ownerId, new Date().getTime()); + return consumer.data; + } + return undefined; + }, + [storage], + ); + + const backConsumerPair = useCallback( + (ownerId: number, peerId: string, audioName: string, videoName: string) => { + const data = storage.data; + if (data?.session) { + const key = peerId + '-' + audioName + '-' + videoName; + const consumer = data.consumerPairs.get(key); + if (consumer) { + consumer.owners.delete(ownerId); + if (consumer.owners.size == 0) { + data.consumerPairs.delete(key); + } + } + } + return undefined; + }, + [storage], + ); + + React.useEffect(() => { + if (props.url && props.config) { + connect(props.url, props.config); + return () => { + disconnect(); + }; + } + }, [props.url, props.config, connect, disconnect]); + + return ( + + {props.children} + + ); +}; diff --git a/src/components/video_viewer.tsx b/src/components/video_viewer.tsx new file mode 100644 index 0000000..23a764b --- /dev/null +++ b/src/components/video_viewer.tsx @@ -0,0 +1,26 @@ +import { StreamRemote } from '@8xff/atm0s-media-js'; +import React from 'react'; +import { useConsumer, useLocalConsumer } from '../hooks'; + +export const RemoteViewer = (props: { remote: StreamRemote; priority?: number }) => { + const [ref, state] = useConsumer(props.remote, props.priority); + return ( +
+
{state}
+ +
+ ); +}; + +export const LocalViewer = (props: { stream: MediaStream }) => { + const ref = useLocalConsumer(props.stream); + return ; +}; + +export const VideoViewer = (props: { stream: MediaStream | StreamRemote; priority?: number }) => { + if (props.stream instanceof StreamRemote) { + return ; + } else { + return ; + } +}; diff --git a/src/hooks/actions.ts b/src/hooks/actions.ts new file mode 100644 index 0000000..f8c22a6 --- /dev/null +++ b/src/hooks/actions.ts @@ -0,0 +1,20 @@ +import { useContext } from 'react'; +import { SessionContext } from '../components/provider'; +import type { ISessionConfig } from '@8xff/atm0s-media-js'; + +interface Actions { + connect: (url: string, config: ISessionConfig) => void; + disconnect: () => void; + playAudioMix: () => void; +} + +export const useActions = (): Actions => { + const { connect, disconnect } = useContext(SessionContext); + return { + connect, + disconnect, + playAudioMix: () => { + // data?.session.getMixMinusAudio()?.play(); + }, + }; +}; diff --git a/src/hooks/audio_level.ts b/src/hooks/audio_level.ts new file mode 100644 index 0000000..64513ac --- /dev/null +++ b/src/hooks/audio_level.ts @@ -0,0 +1,97 @@ +import { useContext, useEffect, useState } from 'react'; +import Atm0s from '@8xff/atm0s-media-js'; +import { StreamPublisherWrap, BlueseaSessionContext } from '../components'; + +export const useAudioLevelConsumer = ( + consumer?: Atm0s.StreamConsumer | Atm0s.StreamConsumerPair, +): number | undefined => { + const [audioLevel, setAudioLevel] = useState(undefined); + useEffect(() => { + if (consumer) { + const handler = (level: number) => { + setAudioLevel(level); + }; + consumer.on('audio_level', handler); + + return () => { + consumer.off('audio_level', handler); + }; + } else { + setAudioLevel(undefined); + } + }, [consumer]); + return audioLevel; +}; + +export const useAudioLevelProducer = (producer?: StreamPublisherWrap): number | undefined => { + const [audioLevel, setAudioLevel] = useState(undefined); + useEffect(() => { + if (producer) { + const handler = (level: number) => { + setAudioLevel(level); + }; + producer.on('audio_level', handler); + + return () => { + producer.off('audio_level', handler); + }; + } else { + setAudioLevel(undefined); + } + }, [producer]); + return audioLevel; +}; + +export interface AudioMixSlotInfo { + peerId: string; + streamName: string; + audioLevel: number; +} + +export const useAudioSlotMix = (slotIndex: number) => { + const [slot, setSlot] = useState(undefined); + const { data } = useContext(BlueseaSessionContext); + useEffect(() => { + const mixMinus = data?.session.getMixMinusAudio(); + if (mixMinus) { + // eslint-disable-next-line @typescript-eslint/no-explicit-any + const handler = (info: any | null) => { + if (info) { + const sourceId = info[0].split(':'); + setSlot({ + peerId: sourceId[0], + streamName: sourceId[1], + audioLevel: info[1], + }); + } else { + setSlot(undefined); + } + }; + mixMinus.on(`slot_${slotIndex}`, handler); + + return () => { + mixMinus?.off(`slot_${slotIndex}`, handler); + }; + } + }, [slotIndex, data?.session.getMixMinusAudio()]); + return slot; +}; + +export const useAudioLevelMix = (peerId: string, streamName: string) => { + const [audioLevel, setAudioLevel] = useState(undefined); + const { data } = useContext(BlueseaSessionContext); + useEffect(() => { + const mixMinus = data?.session.getMixMinusAudio(); + if (mixMinus) { + const handler = (level: number | null) => { + setAudioLevel(level || undefined); + }; + mixMinus.on(`source_${peerId}:${streamName}`, handler); + + return () => { + mixMinus?.off(`source_${peerId}:${streamName}`, handler); + }; + } + }, [peerId, streamName, data?.session.getMixMinusAudio()]); + return audioLevel; +}; diff --git a/src/hooks/consumer.ts b/src/hooks/consumer.ts new file mode 100644 index 0000000..e545a95 --- /dev/null +++ b/src/hooks/consumer.ts @@ -0,0 +1,130 @@ +import { useContext, useEffect, useMemo, useState, type LegacyRef } from 'react'; +import { SessionContext, SessionState } from '../components/provider'; +import Atm0s from '@8xff/atm0s-media-js'; +import { useSessionState } from './state'; + +let idSeed = 0; +export const useConsumer = ( + remote?: Atm0s.StreamRemote, + priority?: number, + maxSpatial?: number, + maxTemporal?: number, +): [LegacyRef | undefined, Atm0s.StreamReceiverState, Atm0s.StreamConsumer | undefined] => { + const consumerId = useMemo(() => idSeed++, []); + const sessionState = useSessionState(); + const [consumer, setConsumer] = useState(); + const [state, setState] = useState(Atm0s.StreamReceiverState.NoSource); + const [element, setElement] = useState(); + const { data, getConsumer, backConsumer } = useContext(SessionContext); + + const isConnectionEstablished = [SessionState.Connected, SessionState.Reconnecting].indexOf(sessionState) >= 0; + + useEffect(() => { + if (data?.session && remote) { + const consumer = getConsumer(consumerId, remote); + if (consumer) { + consumer.on('state', setState); + setState(consumer.state); + setConsumer(consumer); + return () => { + consumer?.unview('use-consumer-' + consumerId); + consumer?.off('state', setState); + backConsumer(consumerId, remote); + }; + } + } + }, [data?.session, remote]); + + useEffect(() => { + if (element && consumer && isConnectionEstablished) { + element.srcObject = consumer.view('use-consumer-' + consumerId, priority, maxSpatial, maxTemporal); + return () => { + element.srcObject = null; + consumer.unview('use-consumer-' + consumerId); + }; + } + }, [element, consumer, isConnectionEstablished]); + + useEffect(() => { + if (element && consumer && isConnectionEstablished) { + consumer.limit('use-consumer-' + consumerId, priority, maxSpatial, maxTemporal); + } + }, [element, consumer, isConnectionEstablished, priority, maxSpatial, maxTemporal]); + + const ref = (instance: HTMLVideoElement | null) => { + setElement(instance || undefined); + }; + + return [ref, state, consumer]; +}; + +export const useConsumerPair = ( + peerId: string, + audioName: string, + videoName: string, + priority?: number, + maxSpatial?: number, + maxTemporal?: number, +): [LegacyRef | undefined, Atm0s.StreamReceiverState, Atm0s.StreamConsumerPair | undefined] => { + const consumerId = useMemo(() => idSeed++, []); + const sessionState = useSessionState(); + const [consumer, setConsumer] = useState(); + const [state, setState] = useState(Atm0s.StreamReceiverState.NoSource); + const [element, setElement] = useState(); + const { data, getConsumerPair: getConsumerPair, backConsumerPair: backConsumerPair } = useContext(SessionContext); + + const isConnectionEstablished = [SessionState.Connected, SessionState.Reconnecting].indexOf(sessionState) >= 0; + + useEffect(() => { + if (data?.session) { + const consumer = getConsumerPair(consumerId, peerId, audioName, videoName); + if (consumer) { + consumer.on('state', setState); + setState(consumer.state); + setConsumer(consumer); + return () => { + consumer?.off('state', setState); + backConsumerPair(consumerId, peerId, audioName, videoName); + }; + } + } + }, [data?.session, peerId, audioName, videoName]); + + useEffect(() => { + if (element && consumer && isConnectionEstablished) { + element.srcObject = consumer.view('use-consumer-' + consumerId, priority, maxSpatial, maxTemporal); + return () => { + element.srcObject = null; + consumer.unview('use-consumer-' + consumerId); + }; + } + }, [element, consumer, isConnectionEstablished]); + + useEffect(() => { + if (element && consumer && isConnectionEstablished) { + consumer.limit('use-consumer-' + consumerId, priority, maxSpatial, maxTemporal); + } + }, [element, consumer, isConnectionEstablished, priority, maxSpatial, maxTemporal]); + + const ref = (instance: HTMLVideoElement | null) => { + setElement(instance || undefined); + }; + + return [ref, state, consumer]; +}; + +export const useLocalConsumer = (stream?: MediaStream) => { + const [element, setElement] = useState(); + useEffect(() => { + if (element && stream) { + element.srcObject = stream; + return () => { + element.srcObject = null; + }; + } + }, [element, stream]); + + return (instance: HTMLVideoElement | null) => { + setElement(instance || undefined); + }; +}; diff --git a/src/hooks/device.ts b/src/hooks/device.ts new file mode 100644 index 0000000..19c2113 --- /dev/null +++ b/src/hooks/device.ts @@ -0,0 +1,216 @@ +import { TypedEventEmitter } from '@8xff/atm0s-media-js/types/lib/utils/typed-event-emitter'; +import { getLogger } from '@8xff/atm0s-media-js/types/lib/utils/logger'; +import { useEffect, useState } from 'react'; + +const logger = getLogger('DeviceHook'); + +interface Return { + media?: MediaStream; + error?: Error; +} + +class StreamContainer extends TypedEventEmitter<{ changed: (data: Return) => void }> { + count = 0; + data: Return = {}; + + constructor(private key: string) { + super(); + logger.log('Created container for local stream', key); + } + + setData(data: Return) { + this.data = data; + this.emit('changed', data); + } + + retain() { + this.count += 1; + logger.log('Retain local stream', this.key, this.count); + return this.count; + } + + release() { + this.count -= 1; + logger.log('Release local stream', this.key, this.count); + if (this.count == 0) { + logger.log('Destroy local stream', this.key); + this.data.media?.getTracks().map((track) => { + track.stop(); + }); + } + return this.count; + } +} +const globalStore: Map = new Map(); + +export const useDevices = ( + kind: MediaDeviceKind, + // eslint-disable-next-line @typescript-eslint/no-explicit-any +): [MediaDeviceInfo[], any | null] => { + const [devices, setDevices] = useState([]); + const [error, setError] = useState(null); + useEffect(() => { + navigator.mediaDevices + .enumerateDevices() + .then((devices) => { + setDevices(devices.filter((d) => d.kind == kind)); + }) + .catch((error) => { + setDevices([]); + setError(error); + }); + }, [kind]); + + return [devices, error]; +}; + +function getDevicePrivate( + kind: MediaDeviceKind, + deviceId: string | boolean, + callback: (data: Return) => void, +): [StreamContainer, string] { + const key = kind + '-' + deviceId; + let containerSlot = globalStore.get(key); + if (containerSlot) { + containerSlot.on('changed', callback); + callback(containerSlot.data); + } else { + containerSlot = new StreamContainer(key); + globalStore.set(key, containerSlot); + let constraints: MediaStreamConstraints = {}; + if (kind == 'audioinput') { + constraints = { + audio: + typeof deviceId == 'string' + ? { + deviceId: deviceId, + } + : true, + }; + } else if (kind == 'videoinput') { + constraints = { + video: + typeof deviceId == 'string' + ? { + deviceId: deviceId, + } + : true, + }; + } + navigator.mediaDevices + .getUserMedia(constraints) + .then((stream) => { + stream.cachedKey = key; + containerSlot?.setData({ media: stream }); + callback({ media: stream }); + }) + .catch((err) => { + containerSlot?.setData({ error: err }); + callback({ error: err }); + }); + } + + return [containerSlot, key]; +} + +export function getDevice(kind: MediaDeviceKind, deviceId: string | boolean): Promise { + return new Promise((resolve, reject) => { + getDevicePrivate(kind, deviceId, (res) => { + if (res.error) { + reject(res.error); + } else { + resolve(res.media!); + } + }); + }); +} + +export function retainDevice(key: string) { + const slot = globalStore.get(key); + slot?.retain(); +} + +export function releaseDevice(key: string) { + const slot = globalStore.get(key); + if (slot?.release() == 0) { + globalStore.delete(key); + } +} + +export const useDevice = ( + kind: MediaDeviceKind, + deviceId: string | boolean, +): [MediaStream | undefined, Error | undefined] => { + const [res, setRes] = useState({} as Return); + useEffect(() => { + if (deviceId != false) { + const [containerSlot, key] = getDevicePrivate(kind, deviceId, setRes); + containerSlot.retain(); + return () => { + setRes({ media: undefined, error: undefined }); + if (containerSlot?.release() == 0) { + globalStore.delete(key); + } + }; + } + }, [kind, deviceId]); + return [res.media, res.error]; +}; + +export const useUserMedia = ( + constraints?: MediaStreamConstraints, + active?: boolean, +): [MediaStream | undefined, Error | undefined] => { + const [res, setRes] = useState({} as Return); + useEffect(() => { + if (active) { + let gotStream: MediaStream | undefined; + navigator.mediaDevices + .getUserMedia(constraints) + .then((stream) => { + gotStream = stream; + setRes({ media: stream }); + }) + .catch((err) => { + gotStream = undefined; + setRes({ error: err }); + }); + return () => { + setRes({ media: undefined, error: undefined }); + gotStream?.getTracks().forEach((track) => { + track.stop(); + }); + }; + } + }, [JSON.stringify(constraints), active]); + return [res.media, res.error]; +}; + +export const useDisplayMedia = ( + constraints?: DisplayMediaStreamOptions, + active?: boolean, +): [MediaStream | undefined, Error | undefined] => { + const [res, setRes] = useState({} as Return); + useEffect(() => { + if (active) { + let gotStream: MediaStream | undefined; + navigator.mediaDevices + .getDisplayMedia(constraints) + .then((stream) => { + gotStream = stream; + setRes({ media: stream }); + }) + .catch((err) => { + gotStream = undefined; + setRes({ error: err }); + }); + return () => { + setRes({ media: undefined, error: undefined }); + gotStream?.getTracks().forEach((track) => { + track.stop(); + }); + }; + } + }, [JSON.stringify(constraints), active]); + return [res.media, res.error]; +}; diff --git a/src/hooks/index.ts b/src/hooks/index.ts new file mode 100644 index 0000000..bbf2e3d --- /dev/null +++ b/src/hooks/index.ts @@ -0,0 +1,28 @@ +import { useUserMedia, useDisplayMedia, getDevice, useDevice, useDevices } from './device'; +import { useRemoteStreams } from './remote'; +import { useSession } from './session'; +import { useSessionState } from './state'; +import { useActions } from './actions'; +import { useConsumer, useConsumerPair, useLocalConsumer } from './consumer'; +import { usePublisher } from './publisher'; +import { useAudioLevelConsumer, useAudioLevelProducer, useAudioSlotMix, useAudioLevelMix } from './audio_level'; + +export { + useActions, + useUserMedia, + useDisplayMedia, + getDevice, + useDevice, + useDevices, + useRemoteStreams, + useSession, + useSessionState, + useConsumer, + useConsumerPair, + useLocalConsumer, + usePublisher, + useAudioLevelConsumer, + useAudioLevelProducer, + useAudioSlotMix, + useAudioLevelMix, +}; diff --git a/src/hooks/publisher.ts b/src/hooks/publisher.ts new file mode 100644 index 0000000..ba0b77c --- /dev/null +++ b/src/hooks/publisher.ts @@ -0,0 +1,33 @@ +import { useContext, useEffect, useMemo, useState } from 'react'; +import { SessionContext, StreamPublisherWrap } from '../components/provider'; +import Atm0s from '@8xff/atm0s-media-js'; + +let idSeed = 0; + +export const usePublisher = ( + cfg: Atm0s.SenderConfig, +): [Atm0s.StreamSenderState, MediaStream | undefined | null, StreamPublisherWrap | undefined] => { + const publisherId = useMemo(() => idSeed++, []); + const [state, setState] = useState(Atm0s.StreamSenderState.Created); + const [producer, setProducer] = useState(); + const { data, getPublisher: getPublisher, backPublisher: backPublisher } = useContext(SessionContext); + useEffect(() => { + if (data?.session) { + const newProducer = getPublisher(publisherId, cfg); + if (newProducer) { + const onUpdateState = (state: Atm0s.StreamSenderState) => { + setState(state); + }; + newProducer.on('state', onUpdateState); + setProducer(newProducer); + setState(newProducer.state); + return () => { + newProducer?.off('state', onUpdateState); + backPublisher(publisherId, cfg); + }; + } + } + }, [data?.session, cfg.kind + cfg.name]); + + return [state, producer?.localStream, producer]; +}; diff --git a/src/hooks/remote.ts b/src/hooks/remote.ts new file mode 100644 index 0000000..18c92fc --- /dev/null +++ b/src/hooks/remote.ts @@ -0,0 +1,29 @@ +import { useContext } from 'react'; +import { SessionContext } from '../components/provider'; +import Atm0s from '@8xff/atm0s-media-js'; + +export const useRemoteStreams = (kind: Atm0s.StreamKinds, isMine?: boolean): Atm0s.StreamRemote[] => { + const { data } = useContext(SessionContext); + if (kind == Atm0s.StreamKinds.AUDIO) { + if (isMine === true) { + return data?.myAudioStreams || []; + } else { + return data?.audioStreams || []; + } + } else { + if (isMine === true) { + return data?.myVideoStreams || []; + } else { + return data?.videoStreams || []; + } + } +}; + +export const usePeerRemoteStreams = (peerId: string, kind: Atm0s.StreamKinds): Atm0s.StreamRemote[] => { + const { data } = useContext(SessionContext); + if (kind == Atm0s.StreamKinds.AUDIO) { + return data?.audioStreams.filter((a) => a.peerId === peerId) || []; + } else { + return data?.videoStreams.filter((a) => a.peerId === peerId) || []; + } +}; diff --git a/src/hooks/session.ts b/src/hooks/session.ts new file mode 100644 index 0000000..340efe8 --- /dev/null +++ b/src/hooks/session.ts @@ -0,0 +1,8 @@ +import { useContext } from 'react'; +import { SessionContext } from '../components/provider'; +import Atm0s from '@8xff/atm0s-media-js'; + +export const useSession = (): Atm0s.Session | undefined => { + const { data } = useContext(SessionContext); + return data?.session; +}; diff --git a/src/hooks/state.ts b/src/hooks/state.ts new file mode 100644 index 0000000..cc4322b --- /dev/null +++ b/src/hooks/state.ts @@ -0,0 +1,7 @@ +import { useContext } from 'react'; +import { SessionContext, SessionState } from '../components/provider'; + +export const useSessionState = (): SessionState => { + const { data } = useContext(SessionContext); + return data?.state || SessionState.New; +}; diff --git a/src/index.test.ts b/src/index.test.ts deleted file mode 100644 index 2b06501..0000000 --- a/src/index.test.ts +++ /dev/null @@ -1,16 +0,0 @@ -import { isNumberParseable } from './'; - -describe('unit | isNumberParseable', () => { - it('returns `true` for values parseable number', () => { - expect(isNumberParseable('-7.5')).toBe(true); - expect(isNumberParseable(false)).toBe(true); - expect(isNumberParseable(1892)).toBe(true); - }); - - it('returns `false` for values non parseable to number', () => { - expect(isNumberParseable('A8sa')).toBe(false); - expect(isNumberParseable({})).toBe(false); - expect(isNumberParseable(NaN)).toBe(false); - expect(isNumberParseable('18L')).toBe(false); - }); -}); diff --git a/src/index.ts b/src/index.ts index 8f6e172..9086e82 100644 --- a/src/index.ts +++ b/src/index.ts @@ -1,25 +1,4 @@ -/** - * A Branded Type for values parseable to number. - */ -export type NumberParseable = (number | string | boolean) & { - readonly isNumberParseble: unique symbol; -}; - -/** - * Check if value is parseable to number. - * @example - * ```js - * isNumberParseable('AAAA'); - * //=> false - * - * isNumberParseable('100'); - * //=> true - * - * if (!isNumberParseable(value)) - * throw new Error('Value can\'t be parseable to `Number`.') - * return Number(value); - * ``` - * @param value - An `unknown` value to be checked. - */ -export const isNumberParseable = (value: unknown): value is NumberParseable => - !Number.isNaN(Number(value)); +import './polyfill'; +export * from './components'; +export * from './hooks'; +// export * from '@8xff/atm0s-media-js'; diff --git a/src/polyfill.ts b/src/polyfill.ts new file mode 100644 index 0000000..7e070bd --- /dev/null +++ b/src/polyfill.ts @@ -0,0 +1,8 @@ +// add property 'cachedKey' to global MediaStream type +export {}; + +declare global { + interface MediaStream { + cachedKey?: string; + } +} diff --git a/tsconfig.json b/tsconfig.json index d959b06..f6ee689 100644 --- a/tsconfig.json +++ b/tsconfig.json @@ -4,33 +4,38 @@ "jsx": "react", "jsxFactory": "React.createElement", "jsxFragmentFactory": "React.Fragment", - // Module settings. "allowSyntheticDefaultImports": true, "esModuleInterop": true, "module": "ES2022", "moduleResolution": "node", "resolveJsonModule": true, - // Strictness and quality settings. "alwaysStrict": true, - "exactOptionalPropertyTypes": true, "forceConsistentCasingInFileNames": true, "noFallthroughCasesInSwitch": true, "noImplicitOverride": true, - "noImplicitReturns": true, + "noImplicitReturns": false, "noPropertyAccessFromIndexSignature": true, "noUncheckedIndexedAccess": true, "noUnusedLocals": true, "noUnusedParameters": true, "strict": true, "verbatimModuleSyntax": true, - // Type-checking settings. - "lib": ["ES2020"], + "lib": [ + "ES2020", + "dom", + "es5" + ], "skipDefaultLibCheck": true, "skipLibCheck": true, - "types": ["jest"] + "types": [ + "jest" + ] }, - "include": ["./src/**/*.ts", "./src/**/*.tsx"] -} + "include": [ + "./src/**/*.ts", + "./src/**/*.tsx" + ] +} \ No newline at end of file diff --git a/typedoc.json b/typedoc.json index b7d7ec4..0742e8b 100644 --- a/typedoc.json +++ b/typedoc.json @@ -1,6 +1,6 @@ { "out": "./docs", - "name": "[libraryNameWithSpacesAndUpperCases]", + "name": "Atm0s React SDK", "plugin": ["typedoc-plugin-markdown"], "readme": "none", "tsconfig": "./tsconfig.bundle.json" diff --git a/types/components/index.d.ts b/types/components/index.d.ts new file mode 100644 index 0000000..ba62981 --- /dev/null +++ b/types/components/index.d.ts @@ -0,0 +1,3 @@ +export { SessionProvider, SessionContext as BlueseaSessionContext, StreamPublisherWrap, SessionState, } from './provider'; +export { VideoViewer, LocalViewer, RemoteViewer } from './video_viewer'; +//# sourceMappingURL=index.d.ts.map \ No newline at end of file diff --git a/types/components/index.d.ts.map b/types/components/index.d.ts.map new file mode 100644 index 0000000..48fabca --- /dev/null +++ b/types/components/index.d.ts.map @@ -0,0 +1 @@ +{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/components/index.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,eAAe,EACf,cAAc,IAAI,qBAAqB,EACvC,mBAAmB,EACnB,YAAY,GACb,MAAM,YAAY,CAAC;AACpB,OAAO,EAAE,WAAW,EAAE,WAAW,EAAE,YAAY,EAAE,MAAM,gBAAgB,CAAC"} \ No newline at end of file diff --git a/types/components/provider.d.ts b/types/components/provider.d.ts new file mode 100644 index 0000000..f77b6ce --- /dev/null +++ b/types/components/provider.d.ts @@ -0,0 +1,55 @@ +import React from 'react'; +import Atm0s, { type AnyFunction, type IPublisherCallbacks } from '@8xff/atm0s-media-js'; +export declare enum SessionState { + New = "new", + Connecting = "connecting", + Connected = "connected", + Reconnecting = "reconnecting", + Disconnected = "disconnected", + Error = "error" +} +export declare class StreamPublisherWrap { + private publisher; + constructor(publisher: Atm0s.StreamPublisher); + get state(): Atm0s.StreamSenderState; + get localStream(): MediaStream | null | undefined; + on(type: keyof IPublisherCallbacks, callback: AnyFunction): void; + off(type: keyof IPublisherCallbacks, callback: AnyFunction): void; + switchStream(stream: MediaStream | null): void; +} +interface SessionContainer { + session: Atm0s.Session; + state: SessionState; + myAudioStreams: Atm0s.StreamRemote[]; + myVideoStreams: Atm0s.StreamRemote[]; + audioStreams: Atm0s.StreamRemote[]; + videoStreams: Atm0s.StreamRemote[]; + publishers: Map>; + consumers: Map>; + consumerPairs: Map>; +} +interface ArcContainer { + data: T; + owners: Map; +} +interface SessionContextInfo { + data?: SessionContainer; + connect: (url: string, config: Atm0s.ISessionConfig) => void; + disconnect: () => void; + getPublisher(ownerId: number, cfg: Atm0s.SenderConfig): StreamPublisherWrap | undefined; + backPublisher(ownerId: number, cfg: Atm0s.SenderConfig): void; + getConsumer(ownerId: number, remote: Atm0s.StreamRemote): Atm0s.StreamConsumer | undefined; + backConsumer(owner_id: number, remote: Atm0s.StreamRemote): void; + getConsumerPair(ownerId: number, peerId: string, audioName: string, videoName: string): Atm0s.StreamConsumerPair | undefined; + backConsumerPair(ownerId: number, peerId: string, audioName: string, videoName: string): void; + update: (new_info: SessionContainer) => void; +} +export declare const SessionContext: React.Context; +interface Props { + children: React.ReactNode; + url?: string; + config?: Atm0s.ISessionConfig; +} +export declare const SessionProvider: (props: Props) => React.JSX.Element; +export {}; +//# sourceMappingURL=provider.d.ts.map \ No newline at end of file diff --git a/types/components/provider.d.ts.map b/types/components/provider.d.ts.map new file mode 100644 index 0000000..f656c1c --- /dev/null +++ b/types/components/provider.d.ts.map @@ -0,0 +1 @@ +{"version":3,"file":"provider.d.ts","sourceRoot":"","sources":["../../src/components/provider.tsx"],"names":[],"mappings":"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"} \ No newline at end of file diff --git a/types/components/video_viewer.d.ts b/types/components/video_viewer.d.ts new file mode 100644 index 0000000..55974a4 --- /dev/null +++ b/types/components/video_viewer.d.ts @@ -0,0 +1,14 @@ +import { StreamRemote } from '@8xff/atm0s-media-js'; +import React from 'react'; +export declare const RemoteViewer: (props: { + remote: StreamRemote; + priority?: number; +}) => React.JSX.Element; +export declare const LocalViewer: (props: { + stream: MediaStream; +}) => React.JSX.Element; +export declare const VideoViewer: (props: { + stream: MediaStream | StreamRemote; + priority?: number; +}) => React.JSX.Element; +//# sourceMappingURL=video_viewer.d.ts.map \ No newline at end of file diff --git a/types/components/video_viewer.d.ts.map b/types/components/video_viewer.d.ts.map new file mode 100644 index 0000000..7669db4 --- /dev/null +++ b/types/components/video_viewer.d.ts.map @@ -0,0 +1 @@ +{"version":3,"file":"video_viewer.d.ts","sourceRoot":"","sources":["../../src/components/video_viewer.tsx"],"names":[],"mappings":"AAAA,OAAO,EAAE,YAAY,EAAE,MAAM,sBAAsB,CAAC;AACpD,OAAO,KAAK,MAAM,OAAO,CAAC;AAG1B,eAAO,MAAM,YAAY,UAAW;IAAE,MAAM,EAAE,YAAY,CAAC;IAAC,QAAQ,CAAC,EAAE,MAAM,CAAA;CAAE,sBAQ9E,CAAC;AAEF,eAAO,MAAM,WAAW,UAAW;IAAE,MAAM,EAAE,WAAW,CAAA;CAAE,sBAGzD,CAAC;AAEF,eAAO,MAAM,WAAW,UAAW;IAAE,MAAM,EAAE,WAAW,GAAG,YAAY,CAAC;IAAC,QAAQ,CAAC,EAAE,MAAM,CAAA;CAAE,sBAM3F,CAAC"} \ No newline at end of file diff --git a/types/hooks/actions.d.ts b/types/hooks/actions.d.ts new file mode 100644 index 0000000..965f793 --- /dev/null +++ b/types/hooks/actions.d.ts @@ -0,0 +1,9 @@ +import type { ISessionConfig } from '@8xff/atm0s-media-js'; +interface Actions { + connect: (url: string, config: ISessionConfig) => void; + disconnect: () => void; + playAudioMix: () => void; +} +export declare const useActions: () => Actions; +export {}; +//# sourceMappingURL=actions.d.ts.map \ No newline at end of file diff --git a/types/hooks/actions.d.ts.map b/types/hooks/actions.d.ts.map new file mode 100644 index 0000000..c402561 --- /dev/null +++ b/types/hooks/actions.d.ts.map @@ -0,0 +1 @@ +{"version":3,"file":"actions.d.ts","sourceRoot":"","sources":["../../src/hooks/actions.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,sBAAsB,CAAC;AAE3D,UAAU,OAAO;IACf,OAAO,EAAE,CAAC,GAAG,EAAE,MAAM,EAAE,MAAM,EAAE,cAAc,KAAK,IAAI,CAAC;IACvD,UAAU,EAAE,MAAM,IAAI,CAAC;IACvB,YAAY,EAAE,MAAM,IAAI,CAAC;CAC1B;AAED,eAAO,MAAM,UAAU,QAAO,OAS7B,CAAC"} \ No newline at end of file diff --git a/types/hooks/audio_level.d.ts b/types/hooks/audio_level.d.ts new file mode 100644 index 0000000..be813a4 --- /dev/null +++ b/types/hooks/audio_level.d.ts @@ -0,0 +1,12 @@ +import * as Bluesea from '@8xff/atm0s-media-js'; +import { StreamPublisherWrap } from '../components'; +export declare const useAudioLevelConsumer: (consumer?: Bluesea.StreamConsumer | Bluesea.StreamConsumerPair) => number | undefined; +export declare const useAudioLevelProducer: (producer?: StreamPublisherWrap) => number | undefined; +export interface AudioMixSlotInfo { + peerId: string; + streamName: string; + audioLevel: number; +} +export declare const useAudioSlotMix: (slotIndex: number) => AudioMixSlotInfo | undefined; +export declare const useAudioLevelMix: (peerId: string, streamName: string) => number | undefined; +//# sourceMappingURL=audio_level.d.ts.map \ No newline at end of file diff --git a/types/hooks/audio_level.d.ts.map b/types/hooks/audio_level.d.ts.map new file mode 100644 index 0000000..06336ee --- /dev/null +++ b/types/hooks/audio_level.d.ts.map @@ -0,0 +1 @@ +{"version":3,"file":"audio_level.d.ts","sourceRoot":"","sources":["../../src/hooks/audio_level.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,OAAO,MAAM,sBAAsB,CAAC;AAChD,OAAO,EAAE,mBAAmB,EAAyB,MAAM,eAAe,CAAC;AAE3E,eAAO,MAAM,qBAAqB,cACrB,QAAQ,cAAc,GAAG,QAAQ,kBAAkB,KAC7D,MAAM,GAAG,SAiBX,CAAC;AAEF,eAAO,MAAM,qBAAqB,cAAe,mBAAmB,KAAG,MAAM,GAAG,SAiB/E,CAAC;AAEF,MAAM,WAAW,gBAAgB;IAC/B,MAAM,EAAE,MAAM,CAAC;IACf,UAAU,EAAE,MAAM,CAAC;IACnB,UAAU,EAAE,MAAM,CAAC;CACpB;AAED,eAAO,MAAM,eAAe,cAAe,MAAM,iCA2BhD,CAAC;AAEF,eAAO,MAAM,gBAAgB,WAAY,MAAM,cAAc,MAAM,uBAiBlE,CAAC"} \ No newline at end of file diff --git a/types/hooks/consumer.d.ts b/types/hooks/consumer.d.ts new file mode 100644 index 0000000..5bf2f7e --- /dev/null +++ b/types/hooks/consumer.d.ts @@ -0,0 +1,6 @@ +import { type LegacyRef } from 'react'; +import Atm0s from '@8xff/atm0s-media-js'; +export declare const useConsumer: (remote?: Atm0s.StreamRemote, priority?: number, maxSpatial?: number, maxTemporal?: number) => [LegacyRef | undefined, Atm0s.StreamReceiverState, Atm0s.StreamConsumer | undefined]; +export declare const useConsumerPair: (peerId: string, audioName: string, videoName: string, priority?: number, maxSpatial?: number, maxTemporal?: number) => [LegacyRef | undefined, Atm0s.StreamReceiverState, Atm0s.StreamConsumerPair | undefined]; +export declare const useLocalConsumer: (stream?: MediaStream) => (instance: HTMLVideoElement | null) => void; +//# sourceMappingURL=consumer.d.ts.map \ No newline at end of file diff --git a/types/hooks/consumer.d.ts.map b/types/hooks/consumer.d.ts.map new file mode 100644 index 0000000..c1e71a2 --- /dev/null +++ b/types/hooks/consumer.d.ts.map @@ -0,0 +1 @@ +{"version":3,"file":"consumer.d.ts","sourceRoot":"","sources":["../../src/hooks/consumer.ts"],"names":[],"mappings":"AAAA,OAAO,EAA4C,KAAK,SAAS,EAAE,MAAM,OAAO,CAAC;AAEjF,OAAO,KAAK,MAAM,sBAAsB,CAAC;AAIzC,eAAO,MAAM,WAAW,YACb,MAAM,YAAY,aAChB,MAAM,eACJ,MAAM,gBACL,MAAM,KACnB,CAAC,UAAU,gBAAgB,CAAC,GAAG,SAAS,EAAE,MAAM,mBAAmB,EAAE,MAAM,cAAc,GAAG,SAAS,CA+CvG,CAAC;AAEF,eAAO,MAAM,eAAe,WAClB,MAAM,aACH,MAAM,aACN,MAAM,aACN,MAAM,eACJ,MAAM,gBACL,MAAM,KACnB,CAAC,UAAU,gBAAgB,CAAC,GAAG,SAAS,EAAE,MAAM,mBAAmB,EAAE,MAAM,kBAAkB,GAAG,SAAS,CA8C3G,CAAC;AAEF,eAAO,MAAM,gBAAgB,YAAa,WAAW,gBAWjC,gBAAgB,GAAG,IAAI,SAG1C,CAAC"} \ No newline at end of file diff --git a/types/hooks/device.d.ts b/types/hooks/device.d.ts new file mode 100644 index 0000000..dadc945 --- /dev/null +++ b/types/hooks/device.d.ts @@ -0,0 +1,8 @@ +export declare const useDevices: (kind: MediaDeviceKind) => [MediaDeviceInfo[], any | null]; +export declare function getDevice(kind: MediaDeviceKind, deviceId: string | boolean): Promise; +export declare function retainDevice(key: string): void; +export declare function releaseDevice(key: string): void; +export declare const useDevice: (kind: MediaDeviceKind, deviceId: string | boolean) => [MediaStream | undefined, Error | undefined]; +export declare const useUserMedia: (constraints?: MediaStreamConstraints, active?: boolean) => [MediaStream | undefined, Error | undefined]; +export declare const useDisplayMedia: (constraints?: DisplayMediaStreamOptions, active?: boolean) => [MediaStream | undefined, Error | undefined]; +//# sourceMappingURL=device.d.ts.map \ No newline at end of file diff --git a/types/hooks/device.d.ts.map b/types/hooks/device.d.ts.map new file mode 100644 index 0000000..610d3d3 --- /dev/null +++ b/types/hooks/device.d.ts.map @@ -0,0 +1 @@ +{"version":3,"file":"device.d.ts","sourceRoot":"","sources":["../../src/hooks/device.ts"],"names":[],"mappings":"AA6CA,eAAO,MAAM,UAAU,SACf,eAAe,KAEpB,CAAC,eAAe,EAAE,EAAE,GAAG,GAAG,IAAI,CAgBhC,CAAC;AAmDF,wBAAgB,SAAS,CAAC,IAAI,EAAE,eAAe,EAAE,QAAQ,EAAE,MAAM,GAAG,OAAO,GAAG,OAAO,CAAC,WAAW,CAAC,CAUjG;AAED,wBAAgB,YAAY,CAAC,GAAG,EAAE,MAAM,QAGvC;AAED,wBAAgB,aAAa,CAAC,GAAG,EAAE,MAAM,QAKxC;AAED,eAAO,MAAM,SAAS,SACd,eAAe,YACX,MAAM,GAAG,OAAO,KACzB,CAAC,WAAW,GAAG,SAAS,EAAE,KAAK,GAAG,SAAS,CAe7C,CAAC;AAEF,eAAO,MAAM,YAAY,iBACT,sBAAsB,WAC3B,OAAO,KACf,CAAC,WAAW,GAAG,SAAS,EAAE,KAAK,GAAG,SAAS,CAwB7C,CAAC;AAEF,eAAO,MAAM,eAAe,iBACZ,yBAAyB,WAC9B,OAAO,KACf,CAAC,WAAW,GAAG,SAAS,EAAE,KAAK,GAAG,SAAS,CAwB7C,CAAC"} \ No newline at end of file diff --git a/types/hooks/index.d.ts b/types/hooks/index.d.ts new file mode 100644 index 0000000..9d73c48 --- /dev/null +++ b/types/hooks/index.d.ts @@ -0,0 +1,10 @@ +import { useUserMedia, useDisplayMedia, getDevice, useDevice, useDevices } from './device'; +import { useRemoteStreams } from './remote'; +import { useSession } from './session'; +import { useSessionState } from './state'; +import { useActions } from './actions'; +import { useConsumer, useConsumerPair, useLocalConsumer } from './consumer'; +import { usePublisher } from './publisher'; +import { useAudioLevelConsumer, useAudioLevelProducer, useAudioSlotMix, useAudioLevelMix } from './audio_level'; +export { useActions, useUserMedia, useDisplayMedia, getDevice, useDevice, useDevices, useRemoteStreams, useSession, useSessionState, useConsumer, useConsumerPair, useLocalConsumer, usePublisher, useAudioLevelConsumer, useAudioLevelProducer, useAudioSlotMix, useAudioLevelMix, }; +//# sourceMappingURL=index.d.ts.map \ No newline at end of file diff --git a/types/hooks/index.d.ts.map b/types/hooks/index.d.ts.map new file mode 100644 index 0000000..4eb9e71 --- /dev/null +++ b/types/hooks/index.d.ts.map @@ -0,0 +1 @@ +{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/hooks/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,YAAY,EAAE,eAAe,EAAE,SAAS,EAAE,SAAS,EAAE,UAAU,EAAE,MAAM,UAAU,CAAC;AAC3F,OAAO,EAAE,gBAAgB,EAAE,MAAM,UAAU,CAAC;AAC5C,OAAO,EAAE,UAAU,EAAE,MAAM,WAAW,CAAC;AACvC,OAAO,EAAE,eAAe,EAAE,MAAM,SAAS,CAAC;AAC1C,OAAO,EAAE,UAAU,EAAE,MAAM,WAAW,CAAC;AACvC,OAAO,EAAE,WAAW,EAAE,eAAe,EAAE,gBAAgB,EAAE,MAAM,YAAY,CAAC;AAC5E,OAAO,EAAE,YAAY,EAAE,MAAM,aAAa,CAAC;AAC3C,OAAO,EAAE,qBAAqB,EAAE,qBAAqB,EAAE,eAAe,EAAE,gBAAgB,EAAE,MAAM,eAAe,CAAC;AAEhH,OAAO,EACL,UAAU,EACV,YAAY,EACZ,eAAe,EACf,SAAS,EACT,SAAS,EACT,UAAU,EACV,gBAAgB,EAChB,UAAU,EACV,eAAe,EACf,WAAW,EACX,eAAe,EACf,gBAAgB,EAChB,YAAY,EACZ,qBAAqB,EACrB,qBAAqB,EACrB,eAAe,EACf,gBAAgB,GACjB,CAAC"} \ No newline at end of file diff --git a/types/hooks/publisher.d.ts b/types/hooks/publisher.d.ts new file mode 100644 index 0000000..fccc6f0 --- /dev/null +++ b/types/hooks/publisher.d.ts @@ -0,0 +1,4 @@ +import { StreamPublisherWrap } from '../components/provider'; +import Atm0s from '@8xff/atm0s-media-js'; +export declare const usePublisher: (cfg: Atm0s.SenderConfig) => [Atm0s.StreamSenderState, MediaStream | undefined | null, StreamPublisherWrap | undefined]; +//# sourceMappingURL=publisher.d.ts.map \ No newline at end of file diff --git a/types/hooks/publisher.d.ts.map b/types/hooks/publisher.d.ts.map new file mode 100644 index 0000000..650d148 --- /dev/null +++ b/types/hooks/publisher.d.ts.map @@ -0,0 +1 @@ +{"version":3,"file":"publisher.d.ts","sourceRoot":"","sources":["../../src/hooks/publisher.ts"],"names":[],"mappings":"AACA,OAAO,EAAkB,mBAAmB,EAAE,MAAM,wBAAwB,CAAC;AAC7E,OAAO,KAAK,MAAM,sBAAsB,CAAC;AAIzC,eAAO,MAAM,YAAY,QAClB,MAAM,YAAY,KACtB,CAAC,MAAM,iBAAiB,EAAE,WAAW,GAAG,SAAS,GAAG,IAAI,EAAE,mBAAmB,GAAG,SAAS,CAwB3F,CAAC"} \ No newline at end of file diff --git a/types/hooks/remote.d.ts b/types/hooks/remote.d.ts new file mode 100644 index 0000000..631a7a3 --- /dev/null +++ b/types/hooks/remote.d.ts @@ -0,0 +1,4 @@ +import Atm0s from '@8xff/atm0s-media-js'; +export declare const useRemoteStreams: (kind: Atm0s.StreamKinds, isMine?: boolean) => Atm0s.StreamRemote[]; +export declare const usePeerRemoteStreams: (peerId: string, kind: Atm0s.StreamKinds) => Atm0s.StreamRemote[]; +//# sourceMappingURL=remote.d.ts.map \ No newline at end of file diff --git a/types/hooks/remote.d.ts.map b/types/hooks/remote.d.ts.map new file mode 100644 index 0000000..defb51c --- /dev/null +++ b/types/hooks/remote.d.ts.map @@ -0,0 +1 @@ +{"version":3,"file":"remote.d.ts","sourceRoot":"","sources":["../../src/hooks/remote.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,MAAM,sBAAsB,CAAC;AAEzC,eAAO,MAAM,gBAAgB,SAAU,MAAM,WAAW,WAAW,OAAO,KAAG,MAAM,YAAY,EAe9F,CAAC;AAEF,eAAO,MAAM,oBAAoB,WAAY,MAAM,QAAQ,MAAM,WAAW,KAAG,MAAM,YAAY,EAOhG,CAAC"} \ No newline at end of file diff --git a/types/hooks/session.d.ts b/types/hooks/session.d.ts new file mode 100644 index 0000000..7744adc --- /dev/null +++ b/types/hooks/session.d.ts @@ -0,0 +1,3 @@ +import Atm0s from '@8xff/atm0s-media-js'; +export declare const useSession: () => Atm0s.Session | undefined; +//# sourceMappingURL=session.d.ts.map \ No newline at end of file diff --git a/types/hooks/session.d.ts.map b/types/hooks/session.d.ts.map new file mode 100644 index 0000000..96850c2 --- /dev/null +++ b/types/hooks/session.d.ts.map @@ -0,0 +1 @@ +{"version":3,"file":"session.d.ts","sourceRoot":"","sources":["../../src/hooks/session.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,MAAM,sBAAsB,CAAC;AAEzC,eAAO,MAAM,UAAU,QAAO,MAAM,OAAO,GAAG,SAG7C,CAAC"} \ No newline at end of file diff --git a/types/hooks/state.d.ts b/types/hooks/state.d.ts new file mode 100644 index 0000000..ba56a6a --- /dev/null +++ b/types/hooks/state.d.ts @@ -0,0 +1,3 @@ +import { SessionState } from '../components/provider'; +export declare const useSessionState: () => SessionState; +//# sourceMappingURL=state.d.ts.map \ No newline at end of file diff --git a/types/hooks/state.d.ts.map b/types/hooks/state.d.ts.map new file mode 100644 index 0000000..96c07bb --- /dev/null +++ b/types/hooks/state.d.ts.map @@ -0,0 +1 @@ +{"version":3,"file":"state.d.ts","sourceRoot":"","sources":["../../src/hooks/state.ts"],"names":[],"mappings":"AACA,OAAO,EAAkB,YAAY,EAAE,MAAM,wBAAwB,CAAC;AAEtE,eAAO,MAAM,eAAe,QAAO,YAGlC,CAAC"} \ No newline at end of file diff --git a/types/index.d.ts b/types/index.d.ts index e1925ba..e743bda 100644 --- a/types/index.d.ts +++ b/types/index.d.ts @@ -1,24 +1,4 @@ -/** - * A Branded Type for values parseable to number. - */ -export type NumberParseable = (number | string | boolean) & { - readonly isNumberParseble: unique symbol; -}; -/** - * Check if value is parseable to number. - * @example - * ```js - * isNumberParseable('AAAA'); - * //=> false - * - * isNumberParseable('100'); - * //=> true - * - * if (!isNumberParseable(value)) - * throw new Error('Value can\'t be parseable to `Number`.') - * return Number(value); - * ``` - * @param value - An `unknown` value to be checked. - */ -export declare const isNumberParseable: (value: unknown) => value is NumberParseable; +import './polyfill'; +export * from './components'; +export * from './hooks'; //# sourceMappingURL=index.d.ts.map \ No newline at end of file diff --git a/types/index.d.ts.map b/types/index.d.ts.map index 3998a20..a969782 100644 --- a/types/index.d.ts.map +++ b/types/index.d.ts.map @@ -1 +1 @@ -{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA;;GAEG;AACH,MAAM,MAAM,eAAe,GAAG,CAAC,MAAM,GAAG,MAAM,GAAG,OAAO,CAAC,GAAG;IAC1D,QAAQ,CAAC,gBAAgB,EAAE,OAAO,MAAM,CAAC;CAC1C,CAAC;AAEF;;;;;;;;;;;;;;;GAeG;AACH,eAAO,MAAM,iBAAiB,UAAW,OAAO,6BAClB,CAAC"} \ No newline at end of file +{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,YAAY,CAAC;AACpB,cAAc,cAAc,CAAC;AAC7B,cAAc,SAAS,CAAC"} \ No newline at end of file diff --git a/types/polyfill.d.ts b/types/polyfill.d.ts new file mode 100644 index 0000000..39350f2 --- /dev/null +++ b/types/polyfill.d.ts @@ -0,0 +1,7 @@ +export {}; +declare global { + interface MediaStream { + cachedKey?: string; + } +} +//# sourceMappingURL=polyfill.d.ts.map \ No newline at end of file diff --git a/types/polyfill.d.ts.map b/types/polyfill.d.ts.map new file mode 100644 index 0000000..b19325c --- /dev/null +++ b/types/polyfill.d.ts.map @@ -0,0 +1 @@ +{"version":3,"file":"polyfill.d.ts","sourceRoot":"","sources":["../src/polyfill.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,CAAC;AAEV,OAAO,CAAC,MAAM,CAAC;IACb,UAAU,WAAW;QACnB,SAAS,CAAC,EAAE,MAAM,CAAC;KACpB;CACF"} \ No newline at end of file