├── .npmignore ├── .gitignore ├── examples ├── furioos-sdk-js-cdn-example │ ├── .gitignore │ ├── README.md │ ├── package.json │ ├── server.js │ ├── index.html │ ├── index.js │ └── package-lock.json └── furioos-sdk-js-npm-example │ ├── .gitignore │ ├── README.md │ ├── package.json │ ├── index.html │ ├── server.js │ ├── index.js │ └── package-lock.json ├── .DS_Store ├── .docs ├── .DS_Store └── assets │ ├── .DS_Store │ ├── debug-mode.png │ ├── SDK Example 1.jpg │ ├── sdk-ui-example.png │ └── SDKs_Communication.jpg ├── index.js ├── index.webpack.js ├── package.json ├── classes ├── SDKDebug.js └── Player.js ├── dist └── furioos.bundle.js ├── READMEV1.md └── README.md /.npmignore: -------------------------------------------------------------------------------- 1 | examples/* -------------------------------------------------------------------------------- /.gitignore: -------------------------------------------------------------------------------- 1 | node_modules 2 | -------------------------------------------------------------------------------- /examples/furioos-sdk-js-cdn-example/.gitignore: -------------------------------------------------------------------------------- 1 | node_modules 2 | -------------------------------------------------------------------------------- /.DS_Store: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Unity-Technologies/furioos-sdk-js/HEAD/.DS_Store -------------------------------------------------------------------------------- /examples/furioos-sdk-js-npm-example/.gitignore: -------------------------------------------------------------------------------- 1 | node_modules 2 | indexBrowserified.js 3 | -------------------------------------------------------------------------------- /.docs/.DS_Store: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Unity-Technologies/furioos-sdk-js/HEAD/.docs/.DS_Store -------------------------------------------------------------------------------- /.docs/assets/.DS_Store: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Unity-Technologies/furioos-sdk-js/HEAD/.docs/assets/.DS_Store -------------------------------------------------------------------------------- /.docs/assets/debug-mode.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Unity-Technologies/furioos-sdk-js/HEAD/.docs/assets/debug-mode.png -------------------------------------------------------------------------------- /.docs/assets/SDK Example 1.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Unity-Technologies/furioos-sdk-js/HEAD/.docs/assets/SDK Example 1.jpg -------------------------------------------------------------------------------- /.docs/assets/sdk-ui-example.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Unity-Technologies/furioos-sdk-js/HEAD/.docs/assets/sdk-ui-example.png -------------------------------------------------------------------------------- /.docs/assets/SDKs_Communication.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Unity-Technologies/furioos-sdk-js/HEAD/.docs/assets/SDKs_Communication.jpg -------------------------------------------------------------------------------- /index.js: -------------------------------------------------------------------------------- 1 | const { Player, FS_QUALITY_VALUES, FS_SDK_EVENTS_NAME, FS_REGIONS, QUALITY_VALUES } = require("./classes/Player.js"); 2 | 3 | module.exports = { 4 | Player, 5 | FS_SDK_EVENTS_NAME, 6 | FS_QUALITY_VALUES, 7 | FS_REGIONS, 8 | QUALITY_VALUES, 9 | } 10 | -------------------------------------------------------------------------------- /index.webpack.js: -------------------------------------------------------------------------------- 1 | const { Player, FS_QUALITY_VALUES, FS_SDK_EVENTS_NAME, FS_REGIONS, QUALITY_VALUES } = require("./classes/Player.js"); 2 | 3 | module.exports = { 4 | Player, 5 | FS_SDK_EVENTS_NAME, 6 | FS_QUALITY_VALUES, 7 | FS_REGIONS, 8 | QUALITY_VALUES, 9 | } 10 | 11 | window.furioos = { 12 | Player, 13 | FS_SDK_EVENTS_NAME, 14 | FS_QUALITY_VALUES, 15 | FS_REGIONS, 16 | QUALITY_VALUES, 17 | } -------------------------------------------------------------------------------- /examples/furioos-sdk-js-npm-example/README.md: -------------------------------------------------------------------------------- 1 | # Furioos SDK JS example 2 | This project is a simple nodeJS server that render a single HTML page. 3 | It is a first step to try Furioos SDK with your links on Furioos. 4 | It also a way to debug localy your application. 5 | 6 | # Requirements 7 | [Node.JS](http://nodejs.org/) -- v12.x or newer 8 | 9 | # Installation 10 | ```bash 11 | npm install 12 | ``` 13 | or 14 | ```bash 15 | yarn 16 | ``` 17 | 18 | # Run 19 | 20 | ```bash 21 | npm run start 22 | ``` 23 | or 24 | ```bash 25 | yarn start 26 | ``` 27 | 28 | A nodeJS server running on port 8080 29 | -------------------------------------------------------------------------------- /examples/furioos-sdk-js-cdn-example/README.md: -------------------------------------------------------------------------------- 1 | # Furioos SDK JS CDN example 2 | This project is a simple nodeJS server that render a single HTML page. 3 | It is a first step to try Furioos SDK with your links on Furioos. 4 | It also a way to debug localy your application. 5 | 6 | # Requirements 7 | [Node.JS](http://nodejs.org/) -- v12.x or newer 8 | 9 | # Installation 10 | ```bash 11 | npm install 12 | ``` 13 | or 14 | ```bash 15 | yarn 16 | ``` 17 | 18 | # Run 19 | 20 | ```bash 21 | npm run start 22 | ``` 23 | or 24 | ```bash 25 | yarn start 26 | ``` 27 | 28 | A nodeJS server running on port 8080 29 | -------------------------------------------------------------------------------- /examples/furioos-sdk-js-cdn-example/package.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "furioos-sdk-js-cdn-example", 3 | "version": "1.0.0", 4 | "description": "This project is a simple nodeJS server that render a single HTML page. It is a first step to try Furioos SDK with your links on Furioos. It also a way to debug localy your application.", 5 | "main": "index.js", 6 | "scripts": { 7 | "test": "echo \"Error: no test specified\" && exit 1", 8 | "start": "node server.js" 9 | }, 10 | "author": "", 11 | "license": "ISC", 12 | "dependencies": { 13 | "express": "^4.18.1", 14 | "ws": "^8.8.0" 15 | } 16 | } 17 | -------------------------------------------------------------------------------- /examples/furioos-sdk-js-npm-example/package.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "furioos-sdk-js-example", 3 | "version": "1.0.0", 4 | "description": "This project is a simple nodeJS server that render a single HTML page. It is a first step to try Furioos SDK with your links on Furioos. It also a way to debug localy your application.", 5 | "main": "index.js", 6 | "scripts": { 7 | "test": "echo \"Error: no test specified\" && exit 1", 8 | "start": "browserify index.js > indexBrowserified.js && node server.js" 9 | }, 10 | "author": "", 11 | "license": "ISC", 12 | "dependencies": { 13 | "express": "^4.18.1", 14 | "furioos-sdk": "git+https://github.com/Unity-Technologies/furioos-sdk-js.git#feature/bundle-sdk", 15 | "ws": "^8.8.0" 16 | }, 17 | "devDependencies": { 18 | "browserify": "^17.0.0" 19 | } 20 | } 21 | -------------------------------------------------------------------------------- /package.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "furioos-sdk", 3 | "version": "2.0.3", 4 | "description": "Furioos SDK: create your own furioos UI communicating with your application", 5 | "main": "index.js", 6 | "scripts": { 7 | "test": "echo \"Error: no test specified\" && exit 1", 8 | "build": "webpack ./index.webpack.js --output-filename=furioos.bundle.js --mode=production" 9 | }, 10 | "repository": { 11 | "type": "git", 12 | "url": "git+https://github.com/Unity-Technologies/furioos-sdk-js" 13 | }, 14 | "author": "Furioos LTD", 15 | "license": "MIT", 16 | "bugs": { 17 | "url": "https://github.com/Unity-Technologies/furioos-sdk-js/issues" 18 | }, 19 | "homepage": "https://github.com/Unity-Technologies/furioos-sdk-js#readme", 20 | "devDependencies": {}, 21 | "dependencies": { 22 | "webpack": "^5.74.0", 23 | "webpack-cli": "^4.10.0" 24 | } 25 | } 26 | -------------------------------------------------------------------------------- /examples/furioos-sdk-js-npm-example/index.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 15 | 16 |
17 |
18 | 19 | 20 | 21 | 22 | 23 | 24 | 25 | 26 | 27 | 28 | 29 | 30 | 31 | 32 |
33 | 34 |
35 |
36 | 37 | 40 | -------------------------------------------------------------------------------- /examples/furioos-sdk-js-cdn-example/server.js: -------------------------------------------------------------------------------- 1 | const express=require('express'); 2 | const path = require('path'); 3 | const WebSocket = require('ws'); 4 | const app=express(); 5 | app.use(express.static(__dirname + '/')); 6 | 7 | app.get('/', (req, res) => { 8 | res.sendFile(path.join(__dirname, './index.html')); 9 | }) 10 | 11 | const port =8080; 12 | app.listen(port,()=>{ 13 | console.log(`App running on ${port}`); 14 | }); 15 | 16 | // const wss = new WebSocket.Server({ 17 | // port: 8081, 18 | // perMessageDeflate: { 19 | // zlibDeflateOptions: { 20 | // // See zlib defaults. 21 | // chunkSize: 1024, 22 | // memLevel: 7, 23 | // level: 3 24 | // }, 25 | // zlibInflateOptions: { 26 | // chunkSize: 10 * 1024 27 | // }, 28 | // // Other options settable: 29 | // clientNoContextTakeover: true, // Defaults to negotiated value. 30 | // serverNoContextTakeover: true, // Defaults to negotiated value. 31 | // serverMaxWindowBits: 10, // Defaults to negotiated value. 32 | // // Below options specified as default values. 33 | // concurrencyLimit: 10, // Limits zlib concurrency for perf. 34 | // threshold: 1024 // Size (in bytes) below which messages 35 | // // should not be compressed. 36 | // } 37 | // }); 38 | 39 | // wss.on('connection', function connection(ws) { 40 | // console.log("Server WS connected") 41 | // ws.on('message', function incoming(message) { 42 | // console.log('received: %s', message); 43 | 44 | 45 | 46 | // wss.clients.forEach(function each(client) { 47 | // if (client !== ws && client.readyState === WebSocket.OPEN) { 48 | // client.send(message); 49 | // } 50 | // }); 51 | // }); 52 | // }); -------------------------------------------------------------------------------- /examples/furioos-sdk-js-npm-example/server.js: -------------------------------------------------------------------------------- 1 | const express=require('express'); 2 | const path = require('path'); 3 | const WebSocket = require('ws'); 4 | const app=express(); 5 | app.use(express.static(__dirname + '/')); 6 | 7 | app.get('/', (req, res) => { 8 | res.sendFile(path.join(__dirname, './index.html')); 9 | }) 10 | 11 | const port =8080; 12 | app.listen(port,()=>{ 13 | console.log(`App running on ${port}`); 14 | }); 15 | 16 | // const wss = new WebSocket.Server({ 17 | // port: 8081, 18 | // perMessageDeflate: { 19 | // zlibDeflateOptions: { 20 | // // See zlib defaults. 21 | // chunkSize: 1024, 22 | // memLevel: 7, 23 | // level: 3 24 | // }, 25 | // zlibInflateOptions: { 26 | // chunkSize: 10 * 1024 27 | // }, 28 | // // Other options settable: 29 | // clientNoContextTakeover: true, // Defaults to negotiated value. 30 | // serverNoContextTakeover: true, // Defaults to negotiated value. 31 | // serverMaxWindowBits: 10, // Defaults to negotiated value. 32 | // // Below options specified as default values. 33 | // concurrencyLimit: 10, // Limits zlib concurrency for perf. 34 | // threshold: 1024 // Size (in bytes) below which messages 35 | // // should not be compressed. 36 | // } 37 | // }); 38 | 39 | // wss.on('connection', function connection(ws) { 40 | // console.log("Server WS connected") 41 | // ws.on('message', function incoming(message) { 42 | // console.log('received: %s', message); 43 | 44 | 45 | 46 | // wss.clients.forEach(function each(client) { 47 | // if (client !== ws && client.readyState === WebSocket.OPEN) { 48 | // client.send(message); 49 | // } 50 | // }); 51 | // }); 52 | // }); -------------------------------------------------------------------------------- /examples/furioos-sdk-js-cdn-example/index.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 18 | 19 |
20 |
21 | 22 | 23 | 24 | 25 | 26 | 27 | 28 | 29 | 30 | 31 | 32 | 33 | 34 | 35 |
36 | 37 |
38 |
39 | 40 | 41 | 42 | 43 | 46 | -------------------------------------------------------------------------------- /classes/SDKDebug.js: -------------------------------------------------------------------------------- 1 | module.exports = class SDKDebug { 2 | constructor(localServerAddress) { 3 | if (!localServerAddress) { 4 | throw "Bad parameters"; 5 | } 6 | 7 | // Init WS connection. 8 | this.ws = new WebSocket("ws://" + localServerAddress); 9 | this.ws.binaryType = 'arraybuffer'; 10 | this.ws.onerror = (event) => { this._wsOnError(event) }; 11 | this.ws.onclose = (event) => { this._wsOnClose(event); } 12 | this.ws.onmessage = (event) => { this._wsOnMessage(event); } 13 | this.ws.onopen = () => { 14 | console.log("WS connected to: ", localServerAddress); 15 | if (this.onReady) { 16 | this.onReady() 17 | } 18 | }; 19 | } 20 | 21 | /////////////////////// 22 | /// PRIVATE METHODS /// 23 | /////////////////////// 24 | _wsOnError(event) { 25 | console.error("WS Error", event); 26 | } 27 | 28 | _wsOnClose(event) { 29 | console.error("WS Close", event); 30 | } 31 | 32 | _wsOnMessage(event) { 33 | const msg = JSON.parse(event.data); 34 | if (msg.type == "furioos" && msg.task == "sdk") { 35 | const dataFromApp = typeof msg.data === 'string' ? msg.data : JSON.parse(msg.data); 36 | this._onSDKMessageCallback(dataFromApp); 37 | } 38 | } 39 | 40 | _wsOnSendError(event) { 41 | console.error("WS send error", event); 42 | } 43 | 44 | //////////////////////// 45 | //// PUBLIC METHODS //// 46 | //////////////////////// 47 | 48 | // Binding onload callback. 49 | // SDK 50 | onSDKMessage(onSDKMessageCallback) { 51 | this._onSDKMessageCallback = onSDKMessageCallback; 52 | } 53 | 54 | sendSDKMessage(data) { 55 | if (!this.ws || this.ws.readyState != WebSocket.OPEN) { 56 | console.log("Cannot send message, ws connection not open"); 57 | return; // Not loaded. 58 | } 59 | 60 | const parsedData = { 61 | type: "furioos", 62 | task: "sdk", 63 | data: data 64 | } 65 | 66 | this.ws.send(JSON.stringify(parsedData), this._wsOnSendError); 67 | } 68 | } -------------------------------------------------------------------------------- /examples/furioos-sdk-js-cdn-example/index.js: -------------------------------------------------------------------------------- 1 | 2 | const { Player, FS_SDK_EVENTS_NAME, FS_QUALITY_VALUES } = window.furioos; 3 | 4 | const SHARED_LINK = 'YOUR_SDK_LINK_ID'; // Set your shared link here 5 | 6 | // CONF 7 | const player = new Player(SHARED_LINK, 'furioos_container', { 8 | whiteLabel: true, 9 | hideTitle: true, 10 | hideToolbar: false, 11 | hidePlayButton: false, 12 | debugAppMode: false, 13 | }); 14 | 15 | document.getElementById('button_setUserActive').addEventListener("click", () => { 16 | console.log("Call setUserActive"); 17 | player.setUserActive(); 18 | }); 19 | 20 | document.getElementById('button_maximize').addEventListener("click", () => { 21 | console.log("Call maximize"); 22 | player.maximize(); 23 | }); 24 | 25 | document.getElementById('button_minimize').addEventListener("click", () => { 26 | console.log("Call minimize"); 27 | player.minimize(); 28 | }); 29 | 30 | let value = 1; 31 | document.getElementById('button_sendSDKMessage').addEventListener("click", () => { 32 | console.log("SDK Example: Call sendSDKMessage", new Date()); 33 | player.sendSDKMessage({ 34 | uniqueName: "Test", 35 | value: ++value 36 | }); 37 | }); 38 | 39 | document.getElementById('button_getServerAvailability').addEventListener("click", () => { 40 | console.log("Call getServerAvailability"); 41 | player.getServerAvailability((data) => { 42 | console.log("Response getServerAvailability", data); 43 | }, (error) => { 44 | console.log("ERROR getServerAvailability", error); 45 | }); 46 | }); 47 | 48 | document.getElementById('button_start').addEventListener("click", () => { 49 | console.log("Call start"); 50 | player.start() 51 | }); 52 | 53 | document.getElementById('button_stop').addEventListener("click", () => { 54 | console.log("Call stop"); 55 | player.stop() 56 | }); 57 | 58 | document.getElementById('button_restartStream').addEventListener("click", () => { 59 | console.log("Call restart stream"); 60 | player.restartStream() 61 | }); 62 | 63 | document.getElementById('button_setThumb').addEventListener("click", () => { 64 | console.log("Call setThumb"); 65 | player.setThumbnailUrl("https://images.unsplash.com/photo-1599499462686-3ed0badee8c3?ixlib=rb-1.2.1&ixid=eyJhcHBfaWQiOjEyMDd9&auto=format&fit=crop&w=3302&q=80"); 66 | }); 67 | 68 | document.getElementById('button_getServerMetadata').addEventListener("click", () => { 69 | console.log("Call getServerMetadata"); 70 | player.getServerMetadata((data) => { 71 | console.log("Response getServerMetadata", data); 72 | }, (error) => { 73 | console.log("ERROR getServerMetadata", error); 74 | }); 75 | }); 76 | 77 | document.getElementById('button_quality_auto').addEventListener("click", () => { 78 | player.setQuality(FS_QUALITY_VALUES.AUTO); 79 | }); 80 | document.getElementById('button_quality_low').addEventListener("click", () => { 81 | player.setQuality(FS_QUALITY_VALUES.LOW); 82 | }); 83 | document.getElementById('button_quality_medium').addEventListener("click", () => { 84 | player.setQuality(FS_QUALITY_VALUES.MEDIUM); 85 | }); 86 | document.getElementById('button_quality_high').addEventListener("click", () => { 87 | player.setQuality(FS_QUALITY_VALUES.HIGH); 88 | }); 89 | 90 | var slider = document.getElementById('volume_range'); 91 | slider.oninput = function() { 92 | console.log('volume', this.value/100); 93 | player.setVolume(this.value/100); 94 | } 95 | 96 | // EVENTS 97 | player.on(FS_SDK_EVENTS_NAME.LOAD, () => { 98 | console.info("Do something on load"); 99 | }); 100 | 101 | player.on(FS_SDK_EVENTS_NAME.ON_STATS, (stats) => { 102 | //console.log("SDK client FIRED: Stats received", stats); 103 | }); 104 | 105 | // Bind SDK messages 106 | player.on(FS_SDK_EVENTS_NAME.ON_SDK_MESSAGE, function (data) { 107 | console.log("SDK Message Received:", data); 108 | }); 109 | 110 | // Bind application install progress 111 | player.on(FS_SDK_EVENTS_NAME.ON_APP_INSTALL_PROGRESS, function (value) { 112 | console.log("SDK client FIRED: App install progress", value); 113 | }); 114 | 115 | // Bind application install success 116 | player.on(FS_SDK_EVENTS_NAME.ON_APP_INSTALL_SUCCESS, function () { 117 | console.log("SDK client FIRED: App install success"); 118 | }); 119 | 120 | // Bind application install fail 121 | player.on(FS_SDK_EVENTS_NAME.ON_APP_INSTALL_FAIL, function () { 122 | console.log("SDK client FIRED: App install fail"); 123 | }); 124 | 125 | // Bind application start 126 | player.on(FS_SDK_EVENTS_NAME.ON_APP_START, function () { 127 | console.log("SDK client FIRED: App start"); 128 | }); 129 | 130 | // Bind stream start 131 | player.on(FS_SDK_EVENTS_NAME.ON_STREAM_START, function () { 132 | console.log("SDK client FIRED: Stream start"); 133 | }); 134 | 135 | // Bind user active 136 | player.on(FS_SDK_EVENTS_NAME.ON_USER_ACTIVE, function () { 137 | console.log("SDK client FIRED: User Active"); 138 | }); 139 | 140 | // Bind user inactive 141 | player.on(FS_SDK_EVENTS_NAME.ON_USER_INACTIVE, function () { 142 | console.log("SDK client FIRED: User Inactive"); 143 | }); 144 | 145 | // Bind session stoppeds 146 | player.on(FS_SDK_EVENTS_NAME.ON_SESSION_STOPPED, function () { 147 | console.log("SDK client FIRED: Session Stopped"); 148 | }); 149 | 150 | player.on(FS_SDK_EVENTS_NAME.ON_CRASH_APP, (data) => { 151 | console.warn("SDK client FIRED: crash app", data); 152 | }); 153 | 154 | player.on(FS_SDK_EVENTS_NAME.ON_RESUME_SESSION, (data) => { 155 | console.warn("SDK client FIRED: session can be resumed", data); 156 | }); 157 | -------------------------------------------------------------------------------- /examples/furioos-sdk-js-npm-example/index.js: -------------------------------------------------------------------------------- 1 | 2 | const { Player, FS_SDK_EVENTS_NAME, FS_QUALITY_VALUES } = require("furioos-sdk"); 3 | 4 | const SHARED_LINK = 'YOUR_SDK_LINK_ID'; // Set your shared link here 5 | 6 | // CONF 7 | const player = new Player(SHARED_LINK, 'furioos_container', { 8 | whiteLabel: true, 9 | hideTitle: true, 10 | hideToolbar: false, 11 | hidePlayButton: false, 12 | debugAppMode: false, 13 | }); 14 | 15 | document.getElementById('button_setUserActive').addEventListener("click", () => { 16 | console.log("Call setUserActive"); 17 | player.setUserActive(); 18 | }); 19 | 20 | document.getElementById('button_maximize').addEventListener("click", () => { 21 | console.log("Call maximize"); 22 | player.maximize(); 23 | }); 24 | 25 | document.getElementById('button_minimize').addEventListener("click", () => { 26 | console.log("Call minimize"); 27 | player.minimize(); 28 | }); 29 | 30 | let value = 1; 31 | document.getElementById('button_sendSDKMessage').addEventListener("click", () => { 32 | console.log("SDK Example: Call sendSDKMessage", new Date()); 33 | player.sendSDKMessage({ 34 | uniqueName: "Test", 35 | value: ++value 36 | }); 37 | }); 38 | 39 | document.getElementById('button_getServerAvailability').addEventListener("click", () => { 40 | console.log("Call getServerAvailability"); 41 | player.getServerAvailability((data) => { 42 | console.log("Response getServerAvailability", data); 43 | }, (error) => { 44 | console.log("ERROR getServerAvailability", error); 45 | }); 46 | }); 47 | 48 | document.getElementById('button_start').addEventListener("click", () => { 49 | console.log("Call start"); 50 | player.start() 51 | }); 52 | 53 | document.getElementById('button_stop').addEventListener("click", () => { 54 | console.log("Call stop"); 55 | player.stop() 56 | }); 57 | 58 | document.getElementById('button_restartStream').addEventListener("click", () => { 59 | console.log("Call restart stream"); 60 | player.restartStream() 61 | }); 62 | 63 | document.getElementById('button_setThumb').addEventListener("click", () => { 64 | console.log("Call setThumb"); 65 | player.setThumbnailUrl("https://images.unsplash.com/photo-1599499462686-3ed0badee8c3?ixlib=rb-1.2.1&ixid=eyJhcHBfaWQiOjEyMDd9&auto=format&fit=crop&w=3302&q=80"); 66 | }); 67 | 68 | document.getElementById('button_getServerMetadata').addEventListener("click", () => { 69 | console.log("Call getServerMetadata"); 70 | player.getServerMetadata((data) => { 71 | console.log("Response getServerMetadata", data); 72 | }, (error) => { 73 | console.log("ERROR getServerMetadata", error); 74 | }); 75 | }); 76 | 77 | document.getElementById('button_quality_auto').addEventListener("click", () => { 78 | player.setQuality(FS_QUALITY_VALUES.AUTO); 79 | }); 80 | document.getElementById('button_quality_low').addEventListener("click", () => { 81 | player.setQuality(FS_QUALITY_VALUES.LOW); 82 | }); 83 | document.getElementById('button_quality_medium').addEventListener("click", () => { 84 | player.setQuality(FS_QUALITY_VALUES.MEDIUM); 85 | }); 86 | document.getElementById('button_quality_high').addEventListener("click", () => { 87 | player.setQuality(FS_QUALITY_VALUES.HIGH); 88 | }); 89 | 90 | var slider = document.getElementById('volume_range'); 91 | slider.oninput = function() { 92 | console.log('volume', this.value/100); 93 | player.setVolume(this.value/100); 94 | } 95 | 96 | // EVENTS 97 | player.on(FS_SDK_EVENTS_NAME.LOAD, () => { 98 | console.info("Do something on load"); 99 | }); 100 | 101 | player.on(FS_SDK_EVENTS_NAME.ON_STATS, (stats) => { 102 | //console.log("SDK client FIRED: Stats received", stats); 103 | }); 104 | 105 | // Bind SDK messages 106 | player.on(FS_SDK_EVENTS_NAME.ON_SDK_MESSAGE, function (data) { 107 | console.log("SDK Message Received:", data); 108 | }); 109 | 110 | // Bind application install progress 111 | player.on(FS_SDK_EVENTS_NAME.ON_APP_INSTALL_PROGRESS, function (value) { 112 | console.log("SDK client FIRED: App install progress", value); 113 | }); 114 | 115 | // Bind application install success 116 | player.on(FS_SDK_EVENTS_NAME.ON_APP_INSTALL_SUCCESS, function () { 117 | console.log("SDK client FIRED: App install success"); 118 | }); 119 | 120 | // Bind application install fail 121 | player.on(FS_SDK_EVENTS_NAME.ON_APP_INSTALL_FAIL, function () { 122 | console.log("SDK client FIRED: App install fail"); 123 | }); 124 | 125 | // Bind application start 126 | player.on(FS_SDK_EVENTS_NAME.ON_APP_START, function () { 127 | console.log("SDK client FIRED: App start"); 128 | }); 129 | 130 | // Bind stream start 131 | player.on(FS_SDK_EVENTS_NAME.ON_STREAM_START, function () { 132 | console.log("SDK client FIRED: Stream start"); 133 | }); 134 | 135 | // Bind user active 136 | player.on(FS_SDK_EVENTS_NAME.ON_USER_ACTIVE, function () { 137 | console.log("SDK client FIRED: User Active"); 138 | }); 139 | 140 | // Bind user inactive 141 | player.on(FS_SDK_EVENTS_NAME.ON_USER_INACTIVE, function () { 142 | console.log("SDK client FIRED: User Inactive"); 143 | }); 144 | 145 | // Bind session stoppeds 146 | player.on(FS_SDK_EVENTS_NAME.ON_SESSION_STOPPED, function () { 147 | console.log("SDK client FIRED: Session Stopped"); 148 | }); 149 | 150 | player.on(FS_SDK_EVENTS_NAME.ON_CRASH_APP, (data) => { 151 | console.warn("SDK client FIRED: crash app", data); 152 | }); 153 | 154 | player.on(FS_SDK_EVENTS_NAME.ON_RESUME_SESSION, (data) => { 155 | console.warn("SDK client FIRED: session can be resumed", data); 156 | }); 157 | -------------------------------------------------------------------------------- /dist/furioos.bundle.js: -------------------------------------------------------------------------------- 1 | (()=>{var e={404:(e,t,s)=>{var o=s(179);const{version:a}=s(147),n={LOAD:"load",ERROR:"error",START:"start",STOP:"stop",MAXIMIZE:"maximize",MINIMIZE:"minimize",QUALITY:"quality",RESTART_STREAM:"restartStream",RESUME_SESSION:"resumeSession",ON_RESUME_SESSION:"onResumeSession",ON_SDK_MESSAGE:"onSDKMessage",SEND_SDK_MESSAGE:"sendSDKMessage",SET_LOCATION:"setLocation",ON_USER_ACTIVE:"onUserActive",ON_USER_INACTIVE:"onUserInactive",ON_SESSION_STOPPED:"onSessionStopped",ON_STATS:"onStats",GET_SERVER_AVAILABILITY:"getServerAvailability",GET_SERVER_METADATA:"getServerMetadata",SET_THUMBNAIL_URL:"setThumbnailUrl",ON_APP_INSTALL_PROGRESS:"onAppInstallProgress",ON_APP_INSTALL_SUCCESS:"onAppInstallSuccess",ON_APP_INSTALL_FAIL:"onAppInstallFail",ON_APP_START:"onAppStart",ON_STREAM_START:"onStreamStart",SET_VOLUME:"setVolume",ON_CRASH_APP:"appStop",TOGGLE_VOLUME_MUTED:"toggleVolumeMuted",ON_SDK_START:"onSDKStart"},i=864e5,r={AUTO:0,LOW:1,MEDIUM:2,HIGH:3,ULTRA:4},l={AUTO:0,LOW:360,MEDIUM:720,HIGH:1080},d={EUW:[52.1326,5.2913],USW:[47.751076,-120.740135],USE:[37.926868,-78.024902],AUE:[-33.865143,151.2099]};let S="https://portal.furioos.com";const c=a;e.exports={Player:class{static get qualityValues(){return r}static get fsQualityValues(){return l}static get regions(){return d}constructor(e,t,s){if(!function(e,t,s){return!(!e||"string"!=typeof e||!t||"string"!=typeof t)}(e,t))throw"Bad parameters";this.isRestartStream=!1,this.canResumeSession=!1,this.canSendSDKMessage=!1,e.indexOf("?")>0&&(e=e.split("?")[0]),s.overridedURL&&(S=s.overridedURL),this._quality=l.HIGH,this._volume=1,e=S+"/embed/"+e;let a=!1;if(s){let n="?";if(s.whiteLabel&&(e+=n+"whiteLabel=true",n="&"),s.hideToolbar&&(e+=n+"hideToolbar=true",n="&"),s.hideTitle&&(e+=n+"hideTitle=true",n="&"),s.hidePlayButton&&(e+=n+"hidePlayButton=true",n="&"),s.inactiveTimeout){let t=s.inactiveTimeout;s.inactiveTimeout<1e4&&(t=1e4),s.inactiveTimeout>i&&(t=i),e+=n+"inactiveTimeout="+t/1e3,n="&"}if(s.debugAppMode){a=!0,document.getElementById(t).innerText="You are currently debugging locally your app. There is not stream here. Open console to see logs";const e=s.wsServerAddress?s.wsServerAddress+":8081":"127.0.0.1:8081";this.sdkDebug=new o(e),this.sdkDebug.onReady=()=>{this.loaded=!0,this._onLoadCallback&&this._onLoadCallback()},this.sdkDebug.onSDKMessage((e=>{this._onSDKMessageCallback&&this._onSDKMessageCallback(e)}))}}this.loaded=!1,this.debugAppMode=a,this.sharedLink=e,this.containerId=t,this.options=s,a||(this.embed=this._createIframe())}_createIframe(){const e=document.getElementById(this.containerId);if(!e)throw"Cannot find the container";const t=document.createElement("iframe");return t.setAttribute("src",this.sharedLink),t.setAttribute("id","furioos-sdk-iframe"),t.setAttribute("allow","autoplay; fullscreen"),t.style.width="100%",t.style.height="100%",t.style.border="none",e.appendChild(t),t.onload=this._onLoad.bind(this),t}_displayErrorMessage(e){const t=document.getElementById(this.containerId),s=document.createElement("div");s.innerText=e,t.innerHTML="",t.appendChild(s)}_onLoad(){window.addEventListener("message",(e=>{switch(e.data.type){case n.LOAD:return this.location&&(this.embed.contentWindow?this.embed.contentWindow.postMessage({type:n.SET_LOCATION,value:this.location},S):setTimeout((()=>{this.embed.contentWindow.postMessage({type:n.SET_LOCATION,value:this.location},S)}),100)),this.loaded=!0,this.embed.contentWindow.postMessage({type:"SET_VERSION",value:c},S),void(this._onLoadCallback&&this._onLoadCallback());case n.ON_SDK_MESSAGE:return void(this._onSDKMessageCallback&&this._onSDKMessageCallback(e.data.value));case n.ON_USER_ACTIVE:return void(this._onUserActiveCallback&&this._onUserActiveCallback());case n.ON_USER_INACTIVE:return void(this._onUserInactiveCallback&&this._onUserInactiveCallback());case n.ON_APP_INSTALL_PROGRESS:return void(this._onAppInstallProgress&&this._onAppInstallProgress(e.data.value));case n.ON_APP_INSTALL_SUCCESS:return void(this._onAppInstallSuccess&&this._onAppInstallSuccess());case n.ON_APP_INSTALL_FAIL:return void(this._onAppInstallFail&&this._onAppInstallFail());case n.ON_APP_START:return void(this._onAppStart&&this._onAppStart());case n.ON_SDK_START:return this.canSendSDKMessage=!0,void(this._onSDKStart&&this._onSDKStart());case n.ON_STREAM_START:return void(this._onStreamStart&&(this.isRestartStream=!1,this._onStreamStart()));case n.ON_SESSION_STOPPED:return this.canSendSDKMessage=!1,void(this._onSessionStoppedCallback&&this._onSessionStoppedCallback());case n.ON_STATS:return void(this._onStatsCallback&&this._onStatsCallback(JSON.parse(e.data.value)));case n.GET_SERVER_AVAILABILITY:const t=e.data.value;return t.error?(console.log("Error getting server availability",t.error),void(this._getServerAvailabilityErrorCallback&&this._getServerAvailabilityErrorCallback(t.error))):this._getServerAvailabilityCallback?void this._getServerAvailabilityCallback(t.stats):void console.log("No success callback binded !");case n.GET_SERVER_METADATA:const s=e.data.value;return s.error?(console.log("Error getting server metadata",s.error),void(this._getServerMetadataErrorCallback&&this._getServerMetadataErrorCallback(s.error))):this._getServerMetadataCallback?void this._getServerMetadataCallback(s.metadata):void console.log("No success callback binded !");case n.ERROR:return void this._displayErrorMessage(e.data.value);case n.ON_CRASH_APP:return void(this._onAppStop&&this._onAppStop(e.data.value));case n.ON_RESUME_SESSION:return void(this._onResumeSession&&(this.canResumeSession=e.data.value,this._onResumeSession({canResumeSession:e.data.value})))}}))}on(e,t){switch(e){case n.LOAD:return void(this._onLoadCallback=t);case n.ON_APP_INSTALL_PROGRESS:return void(this._onAppInstallProgress=t);case n.ON_APP_INSTALL_SUCCESS:return void(this._onAppInstallSuccess=t);case n.ON_APP_INSTALL_FAIL:return void(this._onAppInstallFail=t);case n.ON_APP_START:return void(this._onAppStart=t);case n.ON_SDK_START:return void(this._onSDKStart=t);case n.ON_STREAM_START:return void(this._onStreamStart=t);case n.ON_SESSION_STOPPED:return void(this._onSessionStoppedCallback=t);case n.ON_STATS:return void(this._onStatsCallback=t);case n.ON_USER_INACTIVE:return void(this._onUserInactiveCallback=t);case n.ON_USER_ACTIVE:return void(this._onUserActiveCallback=t);case n.ON_SDK_MESSAGE:return void(this._onSDKMessageCallback=t);case n.ON_CRASH_APP:return void(this._onAppStop=t);case n.ON_RESUME_SESSION:return void(this._onResumeSession=t)}}setDefaultLocation(e){this.location=e,this.loaded&&(this.debugAppMode?console.log("No setDefaultLocation in debug mode"):this.embed.contentWindow.postMessage({type:n.SET_LOCATION,value:this.location},S))}start(e){e||(e=this.location),this.loaded&&(this.debugAppMode?console.log("No start in debug mode"):this.embed.contentWindow.postMessage({type:n.START,value:e},S))}stop(){this.loaded&&(this.debugAppMode?console.log("No stop in debug mode"):this.embed.contentWindow.postMessage({type:n.STOP},S))}maximize(){this.loaded&&(this.debugAppMode?console.log("No maximize in debug mode"):this.embed.contentWindow.postMessage({type:n.MAXIMIZE},S))}minimize(){this.loaded&&(this.debugAppMode?console.log("No minimize in debug mode"):this.embed.contentWindow.postMessage({type:n.MINIMIZE},S))}get quality(){switch(this._quality){case r.AUTO:case l.AUTO:return"AUTO";case r.LOW:case l.LOW:return"LOW";case r.MEDIUM:case l.MEDIUM:return"MEDIUM";case r.HIGH:case l.HIGH:case r.ULTRA:return"HIGH"}}get volume(){return this._volume}setQuality(e){if(e!==r.LOW&&e!==r.MEDIUM&&e!==r.HIGH&&e!==r.ULTRA&&e!==r.AUTO&&e!==l.AUTO&&e!==l.LOW&&e!==l.MEDIUM&&e!==l.HIGH)throw"Bad parameter: The quality should be one of the given value in Player.qualityValues";if(!this.loaded)return;if(this.debugAppMode)return void console.log("No setQuality in debug mode");let t=e;t===r.LOW&&(console.warn("DEPRECATED: This quality constants is depreciated and will not be maintained for long. Update your sdk and use the new quality values: FS_QUALITY_VALUES"),t=l.LOW),t===r.MEDIUM&&(console.warn("DEPRECATED: This quality constants is depreciated and will not be maintained for long. Update your sdk and use the new quality values: FS_QUALITY_VALUES"),t=l.MEDIUM),t!==r.HIGH&&t!==r.ULTRA||(console.warn("DEPRECATED: This quality constants is depreciated and will not be maintained for long. Update your sdk and use the new quality values: FS_QUALITY_VALUES"),t=l.HIGH),this._quality=t,this.embed.contentWindow.postMessage({type:n.QUALITY,value:t},S)}restartStream(){this.loaded&&(this.debugAppMode?console.log("No restartStream in debug mode"):this.isRestartStream?console.warn("Stream is already restarting"):(this.embed.contentWindow.postMessage({type:n.RESTART_STREAM},S),this.isRestartStream=!0))}resumeSession(){this.debugAppMode?console.log("No resumeSession in debug mode"):this.canResumeSession?(this.embed.contentWindow.postMessage({type:n.RESUME_SESSION},S),this.canResumeSession=!1):console.warn("No active session")}sendSDKMessage(e){this.loaded&&("object"==typeof e&&(e=JSON.stringify(e)),this.debugAppMode?this.sdkDebug.sendSDKMessage(e):this.canSendSDKMessage?this.embed.contentWindow.postMessage({type:n.SEND_SDK_MESSAGE,value:e},S):console.warn("The sdk has not been started yet. Please wait for the ON_SDK_START event before sending a message"))}setUserActive(){this.sendSDKMessage({userActive:!0})}setThumbnailUrl(e){this.loaded&&(this.debugAppMode?console.log("No setThumbnailUrl in debug mode"):this.embed.contentWindow.postMessage({type:n.SET_THUMBNAIL_URL,value:e},S))}getServerAvailability(e,t){this.loaded&&(this.debugAppMode?console.log("No getServerAvailability in debug mode"):(this._getServerAvailabilityCallback=e,this._getServerAvailabilityErrorCallback=t,this.embed.contentWindow.postMessage({type:n.GET_SERVER_AVAILABILITY},S)))}getServerMetadata(e,t){this.loaded&&(this.debugAppMode?console.log("No getServerMetadata in debug mode"):(this._getServerMetadataCallback=e,this._getServerMetadataErrorCallback=t,this.embed.contentWindow.postMessage({type:n.GET_SERVER_METADATA},S)))}setVolume(e,t){this.loaded&&(this.debugAppMode?console.log("No setVolume in debug mode"):(this._setVolume=t,this._volume=e,this.embed.contentWindow.postMessage({type:n.SET_VOLUME,value:e},S)))}toggleMuted(){this.loaded&&(this.debugAppMode?console.log("No toggleMuted in debug mode"):(this._volume=0,this.embed.contentWindow.postMessage({type:n.TOGGLE_VOLUME_MUTED},S)))}onLoad(e){this._onLoadCallback=e,console.warn("DEPRECATED: OnLoad is deprecated and will not be maintained for long. Use the new .on() method to subscribe to events")}onUserInactive(e){this._onUserInactiveCallback=e,console.warn("DEPRECATED: onUserInactive is deprecated and will not be maintained for long. Use the new .on() method to subscribe to events")}onAppInstallProgress(e){this._onAppInstallProgress=e,console.warn("DEPRECATED: onAppInstallProgress is deprecated and will not be maintained for long. Use the new .on() method to subscribe to events")}onAppInstallSuccess(e){this._onAppInstallSuccess=e,console.warn("DEPRECATED: onAppInstallSuccess is deprecated and will not be maintained for long. Use the new .on() method to subscribe to events")}onAppInstallFail(e){this._onAppInstallFail=e,console.warn("DEPRECATED: onAppInstallFail is deprecated and will not be maintained for long. Use the new .on() method to subscribe to events")}onAppStart(e){this._onAppStart=e,console.warn("DEPRECATED: onAppStart is deprecated and will not be maintained for long. Use the new .on() method to subscribe to events")}onStreamStart(e){this._onStreamStart=e,console.warn("DEPRECATED: onStreamStart is deprecated and will not be maintained for long. Use the new .on() method to subscribe to events")}onSessionStopped(e){this._onSessionStoppedCallback=e,console.warn("DEPRECATED: onSessionStopped is deprecated and will not be maintained for long. Use the new .on() method to subscribe to events")}onStats(e){this._onStatsCallback=e,console.warn("DEPRECATED: onStats is deprecated and will not be maintained for long. Use the new .on() method to subscribe to events")}onSDKMessage(e){this._onSDKMessageCallback=e,console.warn("DEPRECATED: onSDKMessage is deprecated and will not be maintained for long. Use the new .on() method to subscribe to events")}onUserActive(e){this._onUserActiveCallback=e,console.warn("DEPRECATED: onUserActive is deprecated and will not be maintained for long. Use the new .on() method to subscribe to events")}},FS_SDK_EVENTS_NAME:n,FS_QUALITY_VALUES:l,FS_REGIONS:d,QUALITY_VALUES:r}},179:e=>{e.exports=class{constructor(e){if(!e)throw"Bad parameters";this.ws=new WebSocket("ws://"+e),this.ws.binaryType="arraybuffer",this.ws.onerror=e=>{this._wsOnError(e)},this.ws.onclose=e=>{this._wsOnClose(e)},this.ws.onmessage=e=>{this._wsOnMessage(e)},this.ws.onopen=()=>{console.log("WS connected to: ",e),this.onReady&&this.onReady()}}_wsOnError(e){console.error("WS Error",e)}_wsOnClose(e){console.error("WS Close",e)}_wsOnMessage(e){const t=JSON.parse(e.data);if("furioos"==t.type&&"sdk"==t.task){const e="string"==typeof t.data?t.data:JSON.parse(t.data);this._onSDKMessageCallback(e)}}_wsOnSendError(e){console.error("WS send error",e)}onSDKMessage(e){this._onSDKMessageCallback=e}sendSDKMessage(e){if(!this.ws||this.ws.readyState!=WebSocket.OPEN)return void console.log("Cannot send message, ws connection not open");const t={type:"furioos",task:"sdk",data:e};this.ws.send(JSON.stringify(t),this._wsOnSendError)}}},457:(e,t,s)=>{const{Player:o,FS_QUALITY_VALUES:a,FS_SDK_EVENTS_NAME:n,FS_REGIONS:i,QUALITY_VALUES:r}=s(404);e.exports={Player:o,FS_SDK_EVENTS_NAME:n,FS_QUALITY_VALUES:a,FS_REGIONS:i,QUALITY_VALUES:r},window.furioos={Player:o,FS_SDK_EVENTS_NAME:n,FS_QUALITY_VALUES:a,FS_REGIONS:i,QUALITY_VALUES:r}},147:e=>{"use strict";e.exports=JSON.parse('{"name":"furioos-sdk","version":"2.0.2","description":"Furioos SDK: create your own furioos UI communicating with your application","main":"index.js","scripts":{"test":"echo \\"Error: no test specified\\" && exit 1","build":"webpack ./index.webpack.js --output-filename=furioos.bundle.js --mode=production"},"repository":{"type":"git","url":"git+https://github.com/Unity-Technologies/furioos-sdk-js"},"author":"Furioos LTD","license":"MIT","bugs":{"url":"https://github.com/Unity-Technologies/furioos-sdk-js/issues"},"homepage":"https://github.com/Unity-Technologies/furioos-sdk-js#readme","devDependencies":{},"dependencies":{"webpack":"^5.74.0","webpack-cli":"^4.10.0"}}')}},t={};!function s(o){var a=t[o];if(void 0!==a)return a.exports;var n=t[o]={exports:{}};return e[o](n,n.exports,s),n.exports}(457)})(); -------------------------------------------------------------------------------- /READMEV1.md: -------------------------------------------------------------------------------- 1 | # Furioos SDK V1 2 | :warning: This version is deprecated and no longer available, please update it as soon as possible. 3 | 4 | ## Requirements 5 | - A Furioos Account on www.furioos.com. 6 | - Then choose the application you want to use with the SDK and create a SDK link. 7 | 8 | 9 | ## Table of contents 10 | * [Installation](#installation) 11 | * [API](#api) 12 | * [Properties](#properties) 13 | * [Methods](#methods) 14 | * [Events](#events) 15 | * [Communicate with your application](#communicate-with-your-application) 16 | * [Debug localy the SDK communication tunnel](#debug-localy-the-sdk-communication-tunnel) 17 | 18 | ## Installation 19 | ```npm install --save furioos-sdk``` 20 | 21 | ## API 22 | #### constructor(sdkShareLinkID, containerDivId, options) 23 | Instanciate the player for a given application. 24 | | Property | Type | Description | optional | DefaultValue | 25 | | --- | --- | --- | --- | --- | 26 | | **`sdkShareLinkID`** | String | Furioos SDK Link ID of the application you want to share. | false | null | 27 | | **`containerDivId`** | String | The ID of the HTML container div that will host the render. | false | null | 28 | | **`options`** | Object | The options to setup the player are these following : | true | {} | 29 | 30 | ##### options: 31 | | Property | Type | Description | optional | DefaultValue | 32 | | --- | --- | --- | --- | --- | 33 | | **`whiteLabel`** | Boolean | Remove all Furioos' Logo | true | false | 34 | | **`hideToolbar`** | Boolean | Hide the toolbar to create your own | true | false | 35 | | **`hideTitle`** | Boolean | Hide the title bar to create your own | true | false | 36 | | **`hidePlayButton`** | Boolean | Hide the play button | true | false | 37 | | **`debugAppMode`** | Boolean | Active local debug of your application. See [Debug localy the SDK communication tunnel](#debug-localy-the-sdk-communication-tunnel) for more detail | true | false | 38 | 39 | #### Example 40 | ```javascript 41 | import { Player } from 'furioos-sdk'; 42 | 43 | const options = { 44 | whiteLabel: true, 45 | hideToolbar: false, 46 | hideTitle: true, 47 | hidePlayButton: false, 48 | }; 49 | 50 | const player = new Player("123.456", "containerDivId", options); 51 | 52 | // Bind player loaded 53 | player.onLoad(() => { 54 | console.log("SDK client FIRED: Player loaded"); 55 | }); 56 | 57 | // Bind application install progress 58 | player.onAppInstallProgress(function(value) { 59 | console.log("SDK client FIRED: App install progress", value); 60 | }); 61 | 62 | // Bind application install success 63 | player.onAppInstallSuccess(function() { 64 | console.log("SDK client FIRED: App install success"); 65 | }); 66 | 67 | // Bind application start 68 | player.onAppStart(function() { 69 | console.log("SDK client FIRED: App start"); 70 | }); 71 | 72 | // Bind stream start 73 | player.onStreamStart(function() { 74 | console.log("SDK client FIRED: Stream start"); 75 | }); 76 | 77 | // Bind SDK messages 78 | player.onSDKMessage(function(data) { 79 | console.log("SDK Message Received:", data); 80 | }); 81 | 82 | // Bind session stoppeds 83 | player.onSessionStopped(function() { 84 | console.log("SDK client FIRED: Session Stopped"); 85 | }); 86 | ``` 87 | 88 | ### Properties 89 | #### quality: String 90 | Get the current setted quality. Possible values : AUTO / LOW / MEDIUM / HIGH / ULTRA 91 | 92 | 93 | ## Methods 94 | ### setUserActive() 95 | This function help you to keep the session open if your user does not interact with the interface. 96 | Calling this function will fire onUserActive. 97 | :warning: If you always call it without checking if the user is really here the session will never ended untill the user close his window. 98 | 99 |
100 | 101 | setThumbnailUrl(url) 102 |

Change the thumbnail of your app.

103 |
104 | 105 | | Property | Type | Description | DefaultValue | 106 | | --- | --- | --- | --- | 107 | | **`url`** | String | A public url of the thumbnail you want to set | null | 108 |
109 | 110 |
111 | 112 | getServerAvailability(function(data) {}, function(error) {}) 113 |

Call this function to get an estimated time to get a session on Furioos.

114 |
115 | 116 | data: 117 | | Property | Type | Description | DefaultValue | 118 | | --- | --- | --- | --- | 119 | | **`assignTime`** | Number | Estimated time (minutes) to be assigned to a server | 0 | 120 | | **`launchTime`** | Number | Estimated time (minutes) for your app to be ready (copied, extracted and launched) | 0 | 121 | | **`availableMachines`** | Number | Number of ready VM waiting for a session | 0 | 122 | | ***`maximumMachines`** | Number | Maximum machines setted on your campaign | 0 | 123 | | ***`usedMachines`** | Number | Number of current used machines in your pool | 0 | 124 | | ***`creatingMachines`** | Number | Number of creating machines (creating machine in the cloud) | 0 | 125 | | ***`installingMachines`** | Number | Number of installing machine (installing your application on it) | 0 | 126 | 127 | * *Those values are only available for an application running on a pre-allocated campaign.* 128 | 129 | Example: 130 | ```javascript 131 | player.getServerAvailability(function(data) { 132 | console.log("Time to assign a server: ", data.assignTime); 133 | console.log("Time to copy, extract and launch your application: ", data.launchTime); 134 | console.log("Number of machines ready for a session: ", data.availableMachines); 135 | console.log("Total time to get session ready: ", data.assignTime + data.launchTime); 136 | }, function(error) { 137 | // Treat the error. 138 | }); 139 | ``` 140 |
141 | 142 |
143 | 144 | getServerMetadata(function(metadata) {}, function(error) {}) 145 |

146 | Call this function to get unique VM informations. 147 | This function return metadata only when a session is running. 148 |

149 |
150 | 151 | metadata: 152 | | Property | Type | Description | DefaultValue | 153 | | --- | --- | --- | --- | 154 | | **`publicIP`** | String | The VM public IP. | "" | 155 | | **`name`** | String | A unique name to identify a VM. | "" | 156 | 157 | Example: 158 | ```javascript 159 | player.getServerMetadata(function(metadata) { 160 | console.log("Public VM IP: ", metadata.publicIP); 161 | console.log("VM unique name: ", metadata.name); 162 | }, function(error) { 163 | // Treat the error. 164 | }); 165 | ``` 166 |
167 | 168 |
169 | 170 | start(location) 171 |

172 | Start a new session. 173 |

174 |
175 | 176 | | Property | Type | Description | DefaultValue | Optional | 177 | | --- | --- | --- | --- | --- | 178 | | **`location`** | String | The VM public IP. | "" | true | 179 | 180 | Example: 181 | ```javascript 182 | player.start(Player.regions.EUW); 183 | ``` 184 |
185 | 186 | ### stop() 187 | Stop the session. 188 | 189 | ### maximize() 190 | Enable Full screen mode. 191 | 192 | ### minimize() 193 | Disable Full screen mode. 194 | 195 |
196 | 197 | setQuality(quality) 198 |

199 | Set the quality of the stream.
200 |

201 |
202 | 203 | | Property | Type | Description | DefaultValue | Optional | 204 | | --- | --- | --- | --- | --- | 205 | | **`quality`** | QualityValue | Use one of the static value Player.qualityValues.AUTO / Player.qualityValues.LOW / Player.qualityValues.MEDIUM / Player.qualityValues.HIGH / Player.qualityValues.ULTRA | Furioos App Quality | false | 206 | 207 | Example: 208 | ```javascript 209 | player.setQuality(Player.qualityValues.ULTRA); 210 | ``` 211 |
212 | 213 | ### restartStream() 214 | Restart the streaming. 215 | 216 | ### Events 217 | :warning: These events are no longer available. Please use the new .on() method. 218 |
219 | 220 | onLoad(function() {}) 221 |

Bind a callback that will be called when the player is ready.

222 |
223 | 224 | Example 225 | ```javascript 226 | player.onLoad(function() { 227 | // Here you know when the player is ready. 228 | player.start(); 229 | }) 230 | ``` 231 |
232 | 233 |
234 | 235 | onAppInstallProgress(function(data) {}) 236 |

237 | Bind a callback that will be called during your application installation. 238 | You'll receive the progress of the installation. 239 |

240 |
241 | 242 | data: 243 | | Property | Type | Description | Value | 244 | | --- | --- | --- | --- | 245 | | **`status`** | String | The current installation step | "COPYING" or "DECOMPRESSING" | 246 | | **`progress`** | Number | The progress value | between 0 and 1 | 247 | 248 | Example 249 | ```javascript 250 | player.onAppInstallProgress(function(data) { 251 | // Implement your own code. 252 | console.log(data.status + " the application : " + Math.round(data.progress*100) + "%"); 253 | }) 254 | ``` 255 |
256 | 257 |
258 | 259 | onAppInstallSuccess(function() {}) 260 |

261 | Bind a callback that will be called when your application installation has succeed. 262 |

263 |
264 | 265 | Example 266 | ```javascript 267 | player.onAppInstallSuccess(function() { 268 | // Implement your own code. 269 | console.log("My application is fully installed"); 270 | }) 271 | ``` 272 |
273 | 274 |
275 | 276 | onAppInstallFail(function() {}) 277 |

278 | Bind a callback that will be called when your application installation has failed. 279 |

280 |
281 | 282 | Example 283 | ```javascript 284 | player.onAppInstallFail(function() { 285 | // Implement your own code. 286 | console.log("Installation has failed"); 287 | }) 288 | ``` 289 |
290 | 291 |
292 | 293 | onAppStart(function() {}) 294 |

295 | Bind a callback that will be called when your application starts. 296 |

297 |
298 | 299 | Example 300 | ```javascript 301 | player.onAppStart(function() { 302 | // Implement your own code. 303 | console.log("Application started"); 304 | }) 305 | ``` 306 |
307 | 308 |
309 | 310 | onStreamStart(function() {}) 311 |

312 | Bind a callback that will be called when the stream starts. 313 |

314 |
315 | 316 | Example 317 | ```javascript 318 | player.onStreamStart(function() { 319 | // Implement your own code. 320 | console.log("Stream started"); 321 | }) 322 | ``` 323 |
324 | 325 |
326 | 327 | onUserActive(function() {}) 328 |

Bind a callback that will be called when the user is **active** on your session (only fired when a session is running).

329 |
330 | 331 | Example 332 | ```javascript 333 | player.onUserActive(function() { 334 | // Implement your own code. 335 | console.log("My user is active"); 336 | }) 337 | ``` 338 |
339 | 340 |
341 | 342 | onUserInactive(function() {}) 343 |

Bind a callback that will be called when the user is **inactive** on your session (only fired when a session is running).

344 |
345 | 346 | Example 347 | ```javascript 348 | player.onUserInactive(function() { 349 | // Implement your own code. 350 | console.log("My user is inactive"); 351 | }) 352 | ``` 353 |
354 | 355 |
356 | 357 | onSessionStopped(function() {}) 358 |

Bind a callback that will be called when the session is stopped (ex: stopped for inactivity).

359 |
360 | 361 | Example 362 | ```javascript 363 | player.onSessionStopped(function() { 364 | // Implement your own code. 365 | console.log("The session has been stopped"); 366 | }) 367 | ``` 368 |
369 | 370 |
371 | 372 | onStats(function(stats) {}) 373 |

Bind a callback that will be called frequently during a running session with all stats.

374 |
375 | 376 | stats: 377 | | Property | Type | Description | DefaultValue | 378 | | --- | --- | --- | --- | 379 | | **`appHeight`** | Number | Height of the application screen on VM | 0 | 380 | | **`appWidth`** | Number | Width of the application screen on VM | 0 | 381 | | **`dataLatency`** | Number | Round trip network latency | 0 | 382 | | **`dataMethod`** | String | events/data transmission method (value: "datachannel" or "ws") | "datachannel" | 383 | | **`packetsLost`** | Number | Percent of lost packets (value: 0 to 1) | 0 | 384 | | **`serverCpuUsage`** | Number | Server CPU usage | 0 | 385 | | **`serverEncodingMs`** | Number | Server encoding time (milliseconds) | 0 | 386 | | **`serverFramerate`** | Number | Server framerate | 0 | 387 | | **`serverGpuMemTotal`** | Number | Total GPU RAM available on server (byte) | 0 | 388 | | **`serverGpuMemUsed`** | Number | Current GPU RAM used on server (byte) | 0 | 389 | | **`serverGpuUsage`** | Number | Server GPU usage percent | 0 | 390 | | **`serverGrabbingMs`** | Number | Server grabbing time (milliseconds) | 0 | 391 | | **`serverRamTotal`** | Number | Total RAM available on serve (byte) | 0 | 392 | | **`serverRamUsed`** | Number | Current RAM used on server (byte) | 0 | 393 | | **`streamingEngine`** | String | Current streaming engine used (value: "Furioos" or "RenderStreaming") | "Furioos" | 394 | | **`userActive`** | Boolean | Define if the user is consider as active by the Furioos player | 0 | 395 | | **`videoBitrate`** | Number | Received video bitrate (kbps) | 0 | 396 | | **`videoFramerate`** | Number | Received video framerate | 0 | 397 | | **`videoHeight`** | Number | Heigh of the received video | 0 | 398 | | **`videoWidth`** | Number | Width of the received video | 0 | 399 | | **`videoLatency`** | Number | Total video latency (round trip network latency + decoding time) | 0 | 400 | 401 | 402 | Example 403 | ```javascript 404 | player.onStats(function(stats) { 405 | // Implement your own code. 406 | console.log("Stats received: ", stats); 407 | }) 408 | ``` 409 |
410 | 411 | ## Communicate with your application 412 | Go deeper with your UI by creating your own data interpretation. 413 | Those methods let you send/receive JSON data between your application and the HTML page where you have implemented the JS SDK. 414 | 415 | #### Requirements 416 | - The Furioos SDK implemented in your application. 417 | - Furioos SDK for Unity : https://github.cds.internal.unity3d.com/unity/furioos-unity-packages 418 | - Furioos SDK for Unreal : https://github.com/Unity-Technologies/furioos-sdk-unreal-engine 419 | 420 |
421 | 422 | onSDKMessage(function(data) {}) 423 |

424 | Bind a callback to receive messages from your application. 425 |

426 |
427 | 428 | | Property | Type | Description | DefaultValue | Optional | 429 | | --- | --- | --- | --- | --- | 430 | | **`data`** | Object | The JSON that you send from your application. | null | false | 431 | 432 | Example: 433 | ```javascript 434 | player.onSDKMessage(function(data) { 435 | console.log("Message received from my application: ", data); 436 | }); 437 | ``` 438 |
439 | 440 |
441 | 442 | sendSDKMessage(data) 443 |

444 | Send data to your own application by using the Furioos SDK. 445 |

446 |
447 | 448 | | Property | Type | Description | DefaultValue | Optional | 449 | | --- | --- | --- | --- | --- | 450 | | **`data`** | Object | The data you want to send to your app formated in JSON. | null | false | 451 | 452 | Example: 453 | ```javascript 454 | player.sendSDKMessage({ "test": "test" }); 455 | ``` 456 |
457 | 458 | ## Debug localy the SDK communication tunnel 459 | :warning: This feature cannot work without **running the following example**: `furioos-sdk-js-example` 460 | 461 | With this project, you'll be able to communicate localy with your application through port 8081. 462 | 463 | :warning: There will be no stream. 464 |

465 | This feature open a direct tunnel between your js and your application running localy.
466 | Only sendSDKMessage and onSDKMessage can be used here to test the communication. 467 |

468 | 469 | #### How does it work ? 470 | You just need to enable the **debugAppMode**. 471 | 472 | ```javascript 473 | import { Player } from 'furioos-sdk'; 474 | 475 | const options = { 476 | whiteLabel: true, 477 | hideToolbar: false, 478 | hideTitle: true, 479 | hidePlayButton: false, 480 | debugAppMode: true, // This enable the local debug mode. 481 | }; 482 | 483 | const player = new Player("123.456", "containerDivId", options); 484 | ``` 485 | ## :warning: Common Errors 486 | - *Failed to execute 'postMessage' on 'DOMWindow': The target origin (http://....) provided does not match the recipient window's origin ('http://...')* 487 | 488 | This error means that you do not have the correct website URL setted on your SDK link on Furioos. 489 | If the url your are testing the player implementation is `http://localhost:8080`, you must have this url as website url of your SDK link on Furioos (by creating or editing one). 490 | -------------------------------------------------------------------------------- /examples/furioos-sdk-js-cdn-example/package-lock.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "furioos-sdk-js-cdn-example", 3 | "version": "1.0.0", 4 | "lockfileVersion": 1, 5 | "requires": true, 6 | "dependencies": { 7 | "accepts": { 8 | "version": "1.3.8", 9 | "resolved": "https://registry.npmjs.org/accepts/-/accepts-1.3.8.tgz", 10 | "integrity": "sha512-PYAthTa2m2VKxuvSD3DPC/Gy+U+sOA1LAuT8mkmRuvw+NACSaeXEQ+NHcVF7rONl6qcaxV3Uuemwawk+7+SJLw==", 11 | "requires": { 12 | "mime-types": "~2.1.34", 13 | "negotiator": "0.6.3" 14 | } 15 | }, 16 | "array-flatten": { 17 | "version": "1.1.1", 18 | "resolved": "https://registry.npmjs.org/array-flatten/-/array-flatten-1.1.1.tgz", 19 | "integrity": "sha512-PCVAQswWemu6UdxsDFFX/+gVeYqKAod3D3UVm91jHwynguOwAvYPhx8nNlM++NqRcK6CxxpUafjmhIdKiHibqg==" 20 | }, 21 | "body-parser": { 22 | "version": "1.20.0", 23 | "resolved": "https://registry.npmjs.org/body-parser/-/body-parser-1.20.0.tgz", 24 | "integrity": "sha512-DfJ+q6EPcGKZD1QWUjSpqp+Q7bDQTsQIF4zfUAtZ6qk+H/3/QRhg9CEp39ss+/T2vw0+HaidC0ecJj/DRLIaKg==", 25 | "requires": { 26 | "bytes": "3.1.2", 27 | "content-type": "~1.0.4", 28 | "debug": "2.6.9", 29 | "depd": "2.0.0", 30 | "destroy": "1.2.0", 31 | "http-errors": "2.0.0", 32 | "iconv-lite": "0.4.24", 33 | "on-finished": "2.4.1", 34 | "qs": "6.10.3", 35 | "raw-body": "2.5.1", 36 | "type-is": "~1.6.18", 37 | "unpipe": "1.0.0" 38 | } 39 | }, 40 | "bytes": { 41 | "version": "3.1.2", 42 | "resolved": "https://registry.npmjs.org/bytes/-/bytes-3.1.2.tgz", 43 | "integrity": "sha512-/Nf7TyzTx6S3yRJObOAV7956r8cr2+Oj8AC5dt8wSP3BQAoeX58NoHyCU8P8zGkNXStjTSi6fzO6F0pBdcYbEg==" 44 | }, 45 | "call-bind": { 46 | "version": "1.0.2", 47 | "resolved": "https://registry.npmjs.org/call-bind/-/call-bind-1.0.2.tgz", 48 | "integrity": "sha512-7O+FbCihrB5WGbFYesctwmTKae6rOiIzmz1icreWJ+0aA7LJfuqhEso2T9ncpcFtzMQtzXf2QGGueWJGTYsqrA==", 49 | "requires": { 50 | "function-bind": "^1.1.1", 51 | "get-intrinsic": "^1.0.2" 52 | } 53 | }, 54 | "content-disposition": { 55 | "version": "0.5.4", 56 | "resolved": "https://registry.npmjs.org/content-disposition/-/content-disposition-0.5.4.tgz", 57 | "integrity": "sha512-FveZTNuGw04cxlAiWbzi6zTAL/lhehaWbTtgluJh4/E95DqMwTmha3KZN1aAWA8cFIhHzMZUvLevkw5Rqk+tSQ==", 58 | "requires": { 59 | "safe-buffer": "5.2.1" 60 | } 61 | }, 62 | "content-type": { 63 | "version": "1.0.4", 64 | "resolved": "https://registry.npmjs.org/content-type/-/content-type-1.0.4.tgz", 65 | "integrity": "sha512-hIP3EEPs8tB9AT1L+NUqtwOAps4mk2Zob89MWXMHjHWg9milF/j4osnnQLXBCBFBk/tvIG/tUc9mOUJiPBhPXA==" 66 | }, 67 | "cookie": { 68 | "version": "0.5.0", 69 | "resolved": "https://registry.npmjs.org/cookie/-/cookie-0.5.0.tgz", 70 | "integrity": "sha512-YZ3GUyn/o8gfKJlnlX7g7xq4gyO6OSuhGPKaaGssGB2qgDUS0gPgtTvoyZLTt9Ab6dC4hfc9dV5arkvc/OCmrw==" 71 | }, 72 | "cookie-signature": { 73 | "version": "1.0.6", 74 | "resolved": "https://registry.npmjs.org/cookie-signature/-/cookie-signature-1.0.6.tgz", 75 | "integrity": "sha512-QADzlaHc8icV8I7vbaJXJwod9HWYp8uCqf1xa4OfNu1T7JVxQIrUgOWtHdNDtPiywmFbiS12VjotIXLrKM3orQ==" 76 | }, 77 | "debug": { 78 | "version": "2.6.9", 79 | "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", 80 | "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", 81 | "requires": { 82 | "ms": "2.0.0" 83 | } 84 | }, 85 | "depd": { 86 | "version": "2.0.0", 87 | "resolved": "https://registry.npmjs.org/depd/-/depd-2.0.0.tgz", 88 | "integrity": "sha512-g7nH6P6dyDioJogAAGprGpCtVImJhpPk/roCzdb3fIh61/s/nPsfR6onyMwkCAR/OlC3yBC0lESvUoQEAssIrw==" 89 | }, 90 | "destroy": { 91 | "version": "1.2.0", 92 | "resolved": "https://registry.npmjs.org/destroy/-/destroy-1.2.0.tgz", 93 | "integrity": "sha512-2sJGJTaXIIaR1w4iJSNoN0hnMY7Gpc/n8D4qSCJw8QqFWXf7cuAgnEHxBpweaVcPevC2l3KpjYCx3NypQQgaJg==" 94 | }, 95 | "ee-first": { 96 | "version": "1.1.1", 97 | "resolved": "https://registry.npmjs.org/ee-first/-/ee-first-1.1.1.tgz", 98 | "integrity": "sha512-WMwm9LhRUo+WUaRN+vRuETqG89IgZphVSNkdFgeb6sS/E4OrDIN7t48CAewSHXc6C8lefD8KKfr5vY61brQlow==" 99 | }, 100 | "encodeurl": { 101 | "version": "1.0.2", 102 | "resolved": "https://registry.npmjs.org/encodeurl/-/encodeurl-1.0.2.tgz", 103 | "integrity": "sha512-TPJXq8JqFaVYm2CWmPvnP2Iyo4ZSM7/QKcSmuMLDObfpH5fi7RUGmd/rTDf+rut/saiDiQEeVTNgAmJEdAOx0w==" 104 | }, 105 | "escape-html": { 106 | "version": "1.0.3", 107 | "resolved": "https://registry.npmjs.org/escape-html/-/escape-html-1.0.3.tgz", 108 | "integrity": "sha512-NiSupZ4OeuGwr68lGIeym/ksIZMJodUGOSCZ/FSnTxcrekbvqrgdUxlJOMpijaKZVjAJrWrGs/6Jy8OMuyj9ow==" 109 | }, 110 | "etag": { 111 | "version": "1.8.1", 112 | "resolved": "https://registry.npmjs.org/etag/-/etag-1.8.1.tgz", 113 | "integrity": "sha512-aIL5Fx7mawVa300al2BnEE4iNvo1qETxLrPI/o05L7z6go7fCw1J6EQmbK4FmJ2AS7kgVF/KEZWufBfdClMcPg==" 114 | }, 115 | "express": { 116 | "version": "4.18.1", 117 | "resolved": "https://registry.npmjs.org/express/-/express-4.18.1.tgz", 118 | "integrity": "sha512-zZBcOX9TfehHQhtupq57OF8lFZ3UZi08Y97dwFCkD8p9d/d2Y3M+ykKcwaMDEL+4qyUolgBDX6AblpR3fL212Q==", 119 | "requires": { 120 | "accepts": "~1.3.8", 121 | "array-flatten": "1.1.1", 122 | "body-parser": "1.20.0", 123 | "content-disposition": "0.5.4", 124 | "content-type": "~1.0.4", 125 | "cookie": "0.5.0", 126 | "cookie-signature": "1.0.6", 127 | "debug": "2.6.9", 128 | "depd": "2.0.0", 129 | "encodeurl": "~1.0.2", 130 | "escape-html": "~1.0.3", 131 | "etag": "~1.8.1", 132 | "finalhandler": "1.2.0", 133 | "fresh": "0.5.2", 134 | "http-errors": "2.0.0", 135 | "merge-descriptors": "1.0.1", 136 | "methods": "~1.1.2", 137 | "on-finished": "2.4.1", 138 | "parseurl": "~1.3.3", 139 | "path-to-regexp": "0.1.7", 140 | "proxy-addr": "~2.0.7", 141 | "qs": "6.10.3", 142 | "range-parser": "~1.2.1", 143 | "safe-buffer": "5.2.1", 144 | "send": "0.18.0", 145 | "serve-static": "1.15.0", 146 | "setprototypeof": "1.2.0", 147 | "statuses": "2.0.1", 148 | "type-is": "~1.6.18", 149 | "utils-merge": "1.0.1", 150 | "vary": "~1.1.2" 151 | } 152 | }, 153 | "finalhandler": { 154 | "version": "1.2.0", 155 | "resolved": "https://registry.npmjs.org/finalhandler/-/finalhandler-1.2.0.tgz", 156 | "integrity": "sha512-5uXcUVftlQMFnWC9qu/svkWv3GTd2PfUhK/3PLkYNAe7FbqJMt3515HaxE6eRL74GdsriiwujiawdaB1BpEISg==", 157 | "requires": { 158 | "debug": "2.6.9", 159 | "encodeurl": "~1.0.2", 160 | "escape-html": "~1.0.3", 161 | "on-finished": "2.4.1", 162 | "parseurl": "~1.3.3", 163 | "statuses": "2.0.1", 164 | "unpipe": "~1.0.0" 165 | } 166 | }, 167 | "forwarded": { 168 | "version": "0.2.0", 169 | "resolved": "https://registry.npmjs.org/forwarded/-/forwarded-0.2.0.tgz", 170 | "integrity": "sha512-buRG0fpBtRHSTCOASe6hD258tEubFoRLb4ZNA6NxMVHNw2gOcwHo9wyablzMzOA5z9xA9L1KNjk/Nt6MT9aYow==" 171 | }, 172 | "fresh": { 173 | "version": "0.5.2", 174 | "resolved": "https://registry.npmjs.org/fresh/-/fresh-0.5.2.tgz", 175 | "integrity": "sha512-zJ2mQYM18rEFOudeV4GShTGIQ7RbzA7ozbU9I/XBpm7kqgMywgmylMwXHxZJmkVoYkna9d2pVXVXPdYTP9ej8Q==" 176 | }, 177 | "function-bind": { 178 | "version": "1.1.1", 179 | "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.1.tgz", 180 | "integrity": "sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A==" 181 | }, 182 | "get-intrinsic": { 183 | "version": "1.1.2", 184 | "resolved": "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.1.2.tgz", 185 | "integrity": "sha512-Jfm3OyCxHh9DJyc28qGk+JmfkpO41A4XkneDSujN9MDXrm4oDKdHvndhZ2dN94+ERNfkYJWDclW6k2L/ZGHjXA==", 186 | "requires": { 187 | "function-bind": "^1.1.1", 188 | "has": "^1.0.3", 189 | "has-symbols": "^1.0.3" 190 | } 191 | }, 192 | "has": { 193 | "version": "1.0.3", 194 | "resolved": "https://registry.npmjs.org/has/-/has-1.0.3.tgz", 195 | "integrity": "sha512-f2dvO0VU6Oej7RkWJGrehjbzMAjFp5/VKPp5tTpWIV4JHHZK1/BxbFRtf/siA2SWTe09caDmVtYYzWEIbBS4zw==", 196 | "requires": { 197 | "function-bind": "^1.1.1" 198 | } 199 | }, 200 | "has-symbols": { 201 | "version": "1.0.3", 202 | "resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.0.3.tgz", 203 | "integrity": "sha512-l3LCuF6MgDNwTDKkdYGEihYjt5pRPbEg46rtlmnSPlUbgmB8LOIrKJbYYFBSbnPaJexMKtiPO8hmeRjRz2Td+A==" 204 | }, 205 | "http-errors": { 206 | "version": "2.0.0", 207 | "resolved": "https://registry.npmjs.org/http-errors/-/http-errors-2.0.0.tgz", 208 | "integrity": "sha512-FtwrG/euBzaEjYeRqOgly7G0qviiXoJWnvEH2Z1plBdXgbyjv34pHTSb9zoeHMyDy33+DWy5Wt9Wo+TURtOYSQ==", 209 | "requires": { 210 | "depd": "2.0.0", 211 | "inherits": "2.0.4", 212 | "setprototypeof": "1.2.0", 213 | "statuses": "2.0.1", 214 | "toidentifier": "1.0.1" 215 | } 216 | }, 217 | "iconv-lite": { 218 | "version": "0.4.24", 219 | "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.4.24.tgz", 220 | "integrity": "sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA==", 221 | "requires": { 222 | "safer-buffer": ">= 2.1.2 < 3" 223 | } 224 | }, 225 | "inherits": { 226 | "version": "2.0.4", 227 | "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz", 228 | "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==" 229 | }, 230 | "ipaddr.js": { 231 | "version": "1.9.1", 232 | "resolved": "https://registry.npmjs.org/ipaddr.js/-/ipaddr.js-1.9.1.tgz", 233 | "integrity": "sha512-0KI/607xoxSToH7GjN1FfSbLoU0+btTicjsQSWQlh/hZykN8KpmMf7uYwPW3R+akZ6R/w18ZlXSHBYXiYUPO3g==" 234 | }, 235 | "media-typer": { 236 | "version": "0.3.0", 237 | "resolved": "https://registry.npmjs.org/media-typer/-/media-typer-0.3.0.tgz", 238 | "integrity": "sha512-dq+qelQ9akHpcOl/gUVRTxVIOkAJ1wR3QAvb4RsVjS8oVoFjDGTc679wJYmUmknUF5HwMLOgb5O+a3KxfWapPQ==" 239 | }, 240 | "merge-descriptors": { 241 | "version": "1.0.1", 242 | "resolved": "https://registry.npmjs.org/merge-descriptors/-/merge-descriptors-1.0.1.tgz", 243 | "integrity": "sha512-cCi6g3/Zr1iqQi6ySbseM1Xvooa98N0w31jzUYrXPX2xqObmFGHJ0tQ5u74H3mVh7wLouTseZyYIq39g8cNp1w==" 244 | }, 245 | "methods": { 246 | "version": "1.1.2", 247 | "resolved": "https://registry.npmjs.org/methods/-/methods-1.1.2.tgz", 248 | "integrity": "sha512-iclAHeNqNm68zFtnZ0e+1L2yUIdvzNoauKU4WBA3VvH/vPFieF7qfRlwUZU+DA9P9bPXIS90ulxoUoCH23sV2w==" 249 | }, 250 | "mime": { 251 | "version": "1.6.0", 252 | "resolved": "https://registry.npmjs.org/mime/-/mime-1.6.0.tgz", 253 | "integrity": "sha512-x0Vn8spI+wuJ1O6S7gnbaQg8Pxh4NNHb7KSINmEWKiPE4RKOplvijn+NkmYmmRgP68mc70j2EbeTFRsrswaQeg==" 254 | }, 255 | "mime-db": { 256 | "version": "1.52.0", 257 | "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.52.0.tgz", 258 | "integrity": "sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg==" 259 | }, 260 | "mime-types": { 261 | "version": "2.1.35", 262 | "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.35.tgz", 263 | "integrity": "sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw==", 264 | "requires": { 265 | "mime-db": "1.52.0" 266 | } 267 | }, 268 | "ms": { 269 | "version": "2.0.0", 270 | "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", 271 | "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==" 272 | }, 273 | "negotiator": { 274 | "version": "0.6.3", 275 | "resolved": "https://registry.npmjs.org/negotiator/-/negotiator-0.6.3.tgz", 276 | "integrity": "sha512-+EUsqGPLsM+j/zdChZjsnX51g4XrHFOIXwfnCVPGlQk/k5giakcKsuxCObBRu6DSm9opw/O6slWbJdghQM4bBg==" 277 | }, 278 | "object-inspect": { 279 | "version": "1.12.2", 280 | "resolved": "https://registry.npmjs.org/object-inspect/-/object-inspect-1.12.2.tgz", 281 | "integrity": "sha512-z+cPxW0QGUp0mcqcsgQyLVRDoXFQbXOwBaqyF7VIgI4TWNQsDHrBpUQslRmIfAoYWdYzs6UlKJtB2XJpTaNSpQ==" 282 | }, 283 | "on-finished": { 284 | "version": "2.4.1", 285 | "resolved": "https://registry.npmjs.org/on-finished/-/on-finished-2.4.1.tgz", 286 | "integrity": "sha512-oVlzkg3ENAhCk2zdv7IJwd/QUD4z2RxRwpkcGY8psCVcCYZNq4wYnVWALHM+brtuJjePWiYF/ClmuDr8Ch5+kg==", 287 | "requires": { 288 | "ee-first": "1.1.1" 289 | } 290 | }, 291 | "parseurl": { 292 | "version": "1.3.3", 293 | "resolved": "https://registry.npmjs.org/parseurl/-/parseurl-1.3.3.tgz", 294 | "integrity": "sha512-CiyeOxFT/JZyN5m0z9PfXw4SCBJ6Sygz1Dpl0wqjlhDEGGBP1GnsUVEL0p63hoG1fcj3fHynXi9NYO4nWOL+qQ==" 295 | }, 296 | "path-to-regexp": { 297 | "version": "0.1.7", 298 | "resolved": "https://registry.npmjs.org/path-to-regexp/-/path-to-regexp-0.1.7.tgz", 299 | "integrity": "sha512-5DFkuoqlv1uYQKxy8omFBeJPQcdoE07Kv2sferDCrAq1ohOU+MSDswDIbnx3YAM60qIOnYa53wBhXW0EbMonrQ==" 300 | }, 301 | "proxy-addr": { 302 | "version": "2.0.7", 303 | "resolved": "https://registry.npmjs.org/proxy-addr/-/proxy-addr-2.0.7.tgz", 304 | "integrity": "sha512-llQsMLSUDUPT44jdrU/O37qlnifitDP+ZwrmmZcoSKyLKvtZxpyV0n2/bD/N4tBAAZ/gJEdZU7KMraoK1+XYAg==", 305 | "requires": { 306 | "forwarded": "0.2.0", 307 | "ipaddr.js": "1.9.1" 308 | } 309 | }, 310 | "qs": { 311 | "version": "6.10.3", 312 | "resolved": "https://registry.npmjs.org/qs/-/qs-6.10.3.tgz", 313 | "integrity": "sha512-wr7M2E0OFRfIfJZjKGieI8lBKb7fRCH4Fv5KNPEs7gJ8jadvotdsS08PzOKR7opXhZ/Xkjtt3WF9g38drmyRqQ==", 314 | "requires": { 315 | "side-channel": "^1.0.4" 316 | } 317 | }, 318 | "range-parser": { 319 | "version": "1.2.1", 320 | "resolved": "https://registry.npmjs.org/range-parser/-/range-parser-1.2.1.tgz", 321 | "integrity": "sha512-Hrgsx+orqoygnmhFbKaHE6c296J+HTAQXoxEF6gNupROmmGJRoyzfG3ccAveqCBrwr/2yxQ5BVd/GTl5agOwSg==" 322 | }, 323 | "raw-body": { 324 | "version": "2.5.1", 325 | "resolved": "https://registry.npmjs.org/raw-body/-/raw-body-2.5.1.tgz", 326 | "integrity": "sha512-qqJBtEyVgS0ZmPGdCFPWJ3FreoqvG4MVQln/kCgF7Olq95IbOp0/BWyMwbdtn4VTvkM8Y7khCQ2Xgk/tcrCXig==", 327 | "requires": { 328 | "bytes": "3.1.2", 329 | "http-errors": "2.0.0", 330 | "iconv-lite": "0.4.24", 331 | "unpipe": "1.0.0" 332 | } 333 | }, 334 | "safe-buffer": { 335 | "version": "5.2.1", 336 | "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.1.tgz", 337 | "integrity": "sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==" 338 | }, 339 | "safer-buffer": { 340 | "version": "2.1.2", 341 | "resolved": "https://registry.npmjs.org/safer-buffer/-/safer-buffer-2.1.2.tgz", 342 | "integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==" 343 | }, 344 | "send": { 345 | "version": "0.18.0", 346 | "resolved": "https://registry.npmjs.org/send/-/send-0.18.0.tgz", 347 | "integrity": "sha512-qqWzuOjSFOuqPjFe4NOsMLafToQQwBSOEpS+FwEt3A2V3vKubTquT3vmLTQpFgMXp8AlFWFuP1qKaJZOtPpVXg==", 348 | "requires": { 349 | "debug": "2.6.9", 350 | "depd": "2.0.0", 351 | "destroy": "1.2.0", 352 | "encodeurl": "~1.0.2", 353 | "escape-html": "~1.0.3", 354 | "etag": "~1.8.1", 355 | "fresh": "0.5.2", 356 | "http-errors": "2.0.0", 357 | "mime": "1.6.0", 358 | "ms": "2.1.3", 359 | "on-finished": "2.4.1", 360 | "range-parser": "~1.2.1", 361 | "statuses": "2.0.1" 362 | }, 363 | "dependencies": { 364 | "ms": { 365 | "version": "2.1.3", 366 | "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz", 367 | "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==" 368 | } 369 | } 370 | }, 371 | "serve-static": { 372 | "version": "1.15.0", 373 | "resolved": "https://registry.npmjs.org/serve-static/-/serve-static-1.15.0.tgz", 374 | "integrity": "sha512-XGuRDNjXUijsUL0vl6nSD7cwURuzEgglbOaFuZM9g3kwDXOWVTck0jLzjPzGD+TazWbboZYu52/9/XPdUgne9g==", 375 | "requires": { 376 | "encodeurl": "~1.0.2", 377 | "escape-html": "~1.0.3", 378 | "parseurl": "~1.3.3", 379 | "send": "0.18.0" 380 | } 381 | }, 382 | "setprototypeof": { 383 | "version": "1.2.0", 384 | "resolved": "https://registry.npmjs.org/setprototypeof/-/setprototypeof-1.2.0.tgz", 385 | "integrity": "sha512-E5LDX7Wrp85Kil5bhZv46j8jOeboKq5JMmYM3gVGdGH8xFpPWXUMsNrlODCrkoxMEeNi/XZIwuRvY4XNwYMJpw==" 386 | }, 387 | "side-channel": { 388 | "version": "1.0.4", 389 | "resolved": "https://registry.npmjs.org/side-channel/-/side-channel-1.0.4.tgz", 390 | "integrity": "sha512-q5XPytqFEIKHkGdiMIrY10mvLRvnQh42/+GoBlFW3b2LXLE2xxJpZFdm94we0BaoV3RwJyGqg5wS7epxTv0Zvw==", 391 | "requires": { 392 | "call-bind": "^1.0.0", 393 | "get-intrinsic": "^1.0.2", 394 | "object-inspect": "^1.9.0" 395 | } 396 | }, 397 | "statuses": { 398 | "version": "2.0.1", 399 | "resolved": "https://registry.npmjs.org/statuses/-/statuses-2.0.1.tgz", 400 | "integrity": "sha512-RwNA9Z/7PrK06rYLIzFMlaF+l73iwpzsqRIFgbMLbTcLD6cOao82TaWefPXQvB2fOC4AjuYSEndS7N/mTCbkdQ==" 401 | }, 402 | "toidentifier": { 403 | "version": "1.0.1", 404 | "resolved": "https://registry.npmjs.org/toidentifier/-/toidentifier-1.0.1.tgz", 405 | "integrity": "sha512-o5sSPKEkg/DIQNmH43V0/uerLrpzVedkUh8tGNvaeXpfpuwjKenlSox/2O/BTlZUtEe+JG7s5YhEz608PlAHRA==" 406 | }, 407 | "type-is": { 408 | "version": "1.6.18", 409 | "resolved": "https://registry.npmjs.org/type-is/-/type-is-1.6.18.tgz", 410 | "integrity": "sha512-TkRKr9sUTxEH8MdfuCSP7VizJyzRNMjj2J2do2Jr3Kym598JVdEksuzPQCnlFPW4ky9Q+iA+ma9BGm06XQBy8g==", 411 | "requires": { 412 | "media-typer": "0.3.0", 413 | "mime-types": "~2.1.24" 414 | } 415 | }, 416 | "unpipe": { 417 | "version": "1.0.0", 418 | "resolved": "https://registry.npmjs.org/unpipe/-/unpipe-1.0.0.tgz", 419 | "integrity": "sha512-pjy2bYhSsufwWlKwPc+l3cN7+wuJlK6uz0YdJEOlQDbl6jo/YlPi4mb8agUkVC8BF7V8NuzeyPNqRksA3hztKQ==" 420 | }, 421 | "utils-merge": { 422 | "version": "1.0.1", 423 | "resolved": "https://registry.npmjs.org/utils-merge/-/utils-merge-1.0.1.tgz", 424 | "integrity": "sha512-pMZTvIkT1d+TFGvDOqodOclx0QWkkgi6Tdoa8gC8ffGAAqz9pzPTZWAybbsHHoED/ztMtkv/VoYTYyShUn81hA==" 425 | }, 426 | "vary": { 427 | "version": "1.1.2", 428 | "resolved": "https://registry.npmjs.org/vary/-/vary-1.1.2.tgz", 429 | "integrity": "sha512-BNGbWLfd0eUPabhkXUVm0j8uuvREyTh5ovRa/dyow/BqAbZJyC+5fU+IzQOzmAKzYqYRAISoRhdQr3eIZ/PXqg==" 430 | }, 431 | "ws": { 432 | "version": "8.8.0", 433 | "resolved": "https://registry.npmjs.org/ws/-/ws-8.8.0.tgz", 434 | "integrity": "sha512-JDAgSYQ1ksuwqfChJusw1LSJ8BizJ2e/vVu5Lxjq3YvNJNlROv1ui4i+c/kUUrPheBvQl4c5UbERhTwKa6QBJQ==" 435 | } 436 | } 437 | } 438 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | # Furioos SDK JS 2 | > :warning: if you are using the first version of the SDK, please refer to this documentation: [Furioos SDK V1](/READMEV1.md)
3 | ## Requirements 4 | - A Furioos Account on www.furioos.com. 5 | - Then choose the application you want to use with the SDK and create a SDK link. 6 | 7 | ## Table of contents 8 | * [About Furioos SDK](#about-furioos-sdk) 9 | * [Why cutomize my furioos player](#why-cutomize-your-furioos-player) 10 | * [Communicate between my website and my application](#communicate-between-my-website-and-my-application) 11 | * [Example of application](#example-of-application) 12 | * [Installation](#installation) 13 | * [Via NPM](#Via-NPM) 14 | * [Via CDN](#Via-CDN) 15 | * [API](#api) 16 | * [Properties](#properties) 17 | * [Methods](#methods) 18 | * [Events](#events) 19 | * [Communicate with your application](#communicate-with-your-application) 20 | * [Debug localy the SDK communication tunnel](#debug-localy-the-sdk-communication-tunnel) 21 | * [Furioos SDK V1](/READMEV1.md) 22 | 23 | ## About Furioos SDK 24 | The Furioos SDK is composed of 2 parts: 25 | - one is on the website side 26 | - and the other one is on the application side 27 | 28 | On the website side you have to use the Furioos SDK JS. 29 | It allows you to : 30 | - embed the Furioos player into your website and customize it 31 | - communicate with your Unity or Unreal application 32 | 33 | ### Why cutomize your Furioos player 34 | Here are some possible use cases for player customization (it's not an exhaustive list): 35 | - remove all Furioos branding 36 | - hide the play button 37 | - hide the player toolbar and build a new one from your website 38 | - create your own installation progress bar 39 | - trigger your own features once the stream has been started 40 | - ... 41 | 42 | > ***Note**: For these examples you just need to have the Furioos SDK JS in your website.* 43 | 44 | 45 | ### Communication inbetween my website and my application 46 | However, if you need to communication inbetween your website and your Unity or Unreal application, you will need to add the Furioos SDK (Unity or Unreal) into your application. 47 | This allows you to send and receive bidirectional messages. 48 | 49 | 50 | 51 | > ***Important**: Before sending or receiving messages, the session must be launched. You can check it with ON_APP_START event* 52 | 53 | Here are some examples: 54 | - If you want to change the color of an object from your website, you can: 55 | - Send a message with the final color from your website 56 | - From your application, get the color in the message and assign the material with the new color 57 | - If you want to get the position of the player to display it on your website 58 | - Send a message with player coord from the application 59 | - From your website, get the coordinates and show it on your website 60 | 61 | To implement a bidirectionnal communication you can find details below: 62 | - About [Furioos SDK for Unity](https://github.com/Unity-Technologies/furioos-sdk-unity) 63 | - About [Furioos SDK for Unreal](https://github.com/Unity-Technologies/furioos-sdk-unreal-engine) 64 | 65 | ### Example of application 66 | Here is an example of an application that customizes the Furioos player and uses the message system for a complete integration with the website.\ 67 | On the left, the menu is on the website side (html).\ 68 | On the right, the house dispay is on the application side (Furious player). 69 | 70 | 71 | 72 | ## Installation 73 | ### Via NPM 74 | ```bash 75 | npm install --save furioos-sdk 76 | ``` 77 | or 78 | ```bash 79 | yarn add furioos-sdk 80 | ``` 81 | 82 | You can find a full example [HERE](/examples/furioos-sdk-js-npm-example) 83 | 84 | ### Via CDN 85 | ```bash 86 | 87 | ``` 88 | 89 | You can find a full example [HERE](/examples/furioos-sdk-js-cdn-example) 90 | 91 | ## API 92 | #### constructor(sdkShareLinkID, containerDivId, options) 93 | Instanciate the player for a given application. 94 | | Property | Type | Description | optional | DefaultValue | 95 | | --- | --- | --- | --- | --- | 96 | | **`sdkShareLinkID`** | String | Furioos SDK Link ID of the application you want to share. | false | null | 97 | | **`containerDivId`** | String | The ID of the HTML container div that will host the render. | false | null | 98 | | **`options`** | Object | The options to setup the player are these following : | true | {} | 99 | 100 | ##### options: 101 | | Property | Type | Description | optional | DefaultValue | 102 | | --- | --- | --- | --- | --- | 103 | | **`whiteLabel`** | Boolean | Remove all Furioos' Logo | true | false | 104 | | **`hideToolbar`** | Boolean | Hide the toolbar to create your own | true | false | 105 | | **`hideTitle`** | Boolean | Hide the title bar to create your own | true | false | 106 | | **`hidePlayButton`** | Boolean | Hide the play button | true | false | 107 | | **`debugAppMode`** | Boolean | Active local debug of your application. See [Debug localy the SDK communication tunnel](#debug-localy-the-sdk-communication-tunnel) for more detail | true | false | 108 | | **`inactiveTimeout`** | Number | Defines the inactivity time in a session before it closes (in ms) Min: 10s / Max: 24h | true | 60000 (ms) | 109 | 110 | 111 | ### Basic Example 112 | 113 | ```javascript 114 | import { Player, FS_SDK_EVENTS_NAME } from 'furioos-sdk'; 115 | 116 | const options = { 117 | whiteLabel: true, 118 | hideToolbar: false, 119 | hideTitle: true, 120 | hidePlayButton: false, 121 | inactiveTimeout: 60000, 122 | }; 123 | 124 | const player = new Player("YOUR_SDK_LINK_ID" ,"containerDivId", options); 125 | 126 | // Bind player loaded 127 | player.on(FS_SDK_EVENTS_NAME.LOAD, function() { 128 | console.log("SDK client FIRED: Player loaded"); 129 | }); 130 | 131 | // Bind application install progress 132 | player.on(FS_SDK_EVENTS_NAME.ON_APP_INSTALL_PROGRESS, function(data) { 133 | console.log("SDK client FIRED: App install progress", data); 134 | }); 135 | 136 | // Bind application start 137 | player.on(FS_SDK_EVENTS_NAME.ON_APP_START, function() { 138 | console.log("SDK client FIRED: App start"); 139 | }); 140 | 141 | // Bind stream start 142 | player.on(FS_SDK_EVENTS_NAME.ON_STREAM_START, function() { 143 | console.log("SDK client FIRED: Stream start"); 144 | }); 145 | 146 | // Bind stream start 147 | player.on(FS_SDK_EVENTS_NAME.ON_SDK_START, function() { 148 | console.log("SDK client FIRED: SDK start"); 149 | }); 150 | 151 | // Bind SDK messages 152 | player.on(FS_SDK_EVENTS_NAME.ON_SDK_MESSAGE, function(data) { 153 | console.log("SDK Message Received:", data); 154 | }); 155 | 156 | // Bind an event that lets you know if you can resume session 157 | player.on(FS_SDK_EVENTS_NAME.ON_RESUME_SESSION, function({ canResumeSession }) { 158 | if(canResumeSession) { 159 | player.resumeSession(); 160 | } 161 | }); 162 | 163 | // Bind session stoppeds 164 | player.on(FS_SDK_EVENTS_NAME.ON_SESSION_STOPPED, function() { 165 | console.log("SDK client FIRED: Session Stopped"); 166 | }); 167 | 168 | ``` 169 | 170 | ## Properties 171 | >***important** These properties are only getters* 172 | #### quality: String 173 | Get the current setted quality. Possible values : AUTO / LOW / MEDIUM / HIGH 174 | 175 | #### volume: Number 176 | Get the current setted volume. Value between 0 - 1 177 | 178 | ## Methods 179 |
180 | 181 | setThumbnailUrl(url) 182 |

Change the thumbnail of your app.

183 |
184 | 185 | | Property | Type | Description | DefaultValue | 186 | | --- | --- | --- | --- | 187 | | **`url`** | String | A public url of the thumbnail you want to set | null | 188 |
189 | 190 |
191 | 192 | getServerAvailability(function(data) {}, function(error) {}) 193 |

Call this function to get an estimated time to get a session on Furioos.

194 |
195 | 196 | data: 197 | | Property | Type | Description | DefaultValue | 198 | | --- | --- | --- | --- | 199 | | **`assignTime`** | Number | Estimated time (minutes) to be assigned to a server | 0 | 200 | | **`launchTime`** | Number | Estimated time (minutes) for your app to be ready (copied, extracted and launched) | 0 | 201 | | **`availableMachines`** | Number | Number of ready VM waiting for a session | 0 | 202 | | ***`maximumMachines`** | Number | Maximum machines setted on your campaign | 0 | 203 | | ***`usedMachines`** | Number | Number of current used machines in your pool | 0 | 204 | | ***`creatingMachines`** | Number | Number of creating machines (creating machine in the cloud) | 0 | 205 | | ***`installingMachines`** | Number | Number of installing machine (installing your application on it) | 0 | 206 | 207 | * *Those values are only available for an application running on a pre-allocated campaign.* 208 | 209 | Example: 210 | 211 | ```javascript 212 | player.getServerAvailability(function(data) { 213 | console.log("Time to assign a server: ", data.assignTime); 214 | console.log("Time to copy, extract and launch your application: ", data.launchTime); 215 | console.log("Number of machines ready for a session: ", data.availableMachines); 216 | console.log("Total time to get session ready: ", data.assignTime + data.launchTime); 217 | }, function(error) { 218 | // Treat the error. 219 | }); 220 | ``` 221 |
222 | 223 |
224 | 225 | getServerMetadata(function(metadata) {}, function(error) {}) 226 |

227 | Call this function to get unique VM informations. 228 | This function returns metadata only if a session is running. 229 |

230 |
231 | 232 | metadata: 233 | | Property | Type | Description | DefaultValue | 234 | | --- | --- | --- | --- | 235 | | **`publicIP`** | String | The VM public IP. | "" | 236 | | **`name`** | String | A unique name to identify a VM. | "" | 237 | 238 | Example: 239 | ```javascript 240 | player.getServerMetadata(function(metadata) { 241 | console.log("Public VM IP: ", metadata.publicIP); 242 | console.log("VM unique name: ", metadata.name); 243 | }, function(error) { 244 | // Treat the error. 245 | }); 246 | ``` 247 |
248 | 249 |
250 | 251 | start(location) 252 |

253 | Start a new session. 254 |

255 |
256 | 257 | | Property | Type | Description | DefaultValue | Optional | 258 | | --- | --- | --- | --- | --- | 259 | | **`location`** | String | The VM public IP. | "" | true | 260 | 261 | Example: 262 | ```javascript 263 | player.start(Player.regions.EUW); 264 | ``` 265 |
266 | 267 | #### **stop()** 268 | Stop the session. 269 | 270 | #### **maximize()** 271 | Enable Full screen mode. 272 | 273 | ##### **minimize()** 274 | Disable Full screen mode. 275 | 276 |
277 | 278 | setQuality(quality) 279 |

280 | Set the quality of the stream.
281 | Use the new quality values by importing FS_QUALITY_VALUES
282 | :warning: You can access deprecated quality values by importing QUALITY_VALUES. However these value are no longer available. 283 |

284 |
285 | 286 | | Property | Type | Description | DefaultValue | Optional | 287 | | --- | --- | --- | --- | --- | 288 | | **`quality`** | QualityValue | Use one of the static value FS_QUALITY_VALUES.AUTO / FS_QUALITY_VALUES.LOW / FS_QUALITY_VALUES.MEDIUM / FS_QUALITY_VALUES.HIGH | Furioos App Quality | false | 289 | 290 | Example: 291 | ```javascript 292 | player.setQuality(FS_QUALITY_VALUES.HIGH); 293 | ``` 294 |
295 | 296 | #### **restartStream()** 297 | Restart the streaming. 298 | 299 | #### **resumeSession()** 300 | Resume active session. You can only call this method after check the response value of ON_RESUME_SESSION event 301 | 302 |
303 | 304 | setVolume(volume) 305 |

306 | Set the volume of the stream. 307 |

308 |
309 | 310 | | Property | Type | Description | DefaultValue | Optional | 311 | | --- | --- | --- | --- | --- | 312 | | **`volume`** | Number | Volume intensity between 0 - 1 | 1 | false | 313 | 314 | Example: 315 | ```javascript 316 | player.setVolume(0.5); 317 | ``` 318 |
319 | 320 | #### **toggleMuted()** 321 | Mute the stream. You can call this method before the application is launched with the ON_APP_INSTALL_SUCCESS event. 322 | 323 | 324 | #### **setUserActive()** 325 | This function helps you to keep the session opened if your user does not interact with the interface. 326 | Calling this function will fire onUserActive. 327 | > :warning: ***important**: We recommended to use inactiveTimeout in Player constructor instead of calling this function. If you always call it without checking if the user is really here the session will never end untill the user close their window.* 328 | 329 | ## Events 330 | #### **.on(FS_SDK_EVENTS_NAME, callback)** 331 | To be able to bind player events, you just need to call the .on function and give it an SDK events parameter and a callback to get the infos. All FS_SDK_EVENTS_NAME constants are accessible from the furioos-sdk package. 332 | 333 |
334 | 335 | LOAD 336 |

337 | Bind a callback that will be called when the player is ready. 338 |

339 |
340 | 341 | Example 342 | ```javascript 343 | player.on(FS_SDK_EVENTS_NAME.LOAD, function(data) { 344 | // Here you know when the player is ready. 345 | console.log("SDK client FIRED: Player loaded"); 346 | }) 347 | ``` 348 |
349 | 350 |
351 | 352 | ON_APP_INSTALL_PROGRESS 353 |

354 | Bind a callback that will be called during your application installation. 355 | You'll receive the progress of the installation. 356 |

357 |
358 | 359 | data: 360 | | Property | Type | Description | Value | 361 | | --- | --- | --- | --- | 362 | | **`status`** | String | The current installation step | "COPY" or "UNARCHIVE" | 363 | | **`progress`** | Number | The progress value | between 0 and 1 | 364 | 365 | Example 366 | ```javascript 367 | player.on(FS_SDK_EVENTS_NAME.ON_APP_INSTALL_PROGRESS, function(data) { 368 | // Implement your own code. 369 | console.log(data.status + " the application : " + Math.round(data.progress*100) + "%"); 370 | }) 371 | ``` 372 |
373 | 374 |
375 | 376 | ON_APP_INSTALL_SUCCESS 377 |

378 | Bind a callback that will be called when your application installation has succeed. 379 |

380 |
381 | 382 | Example 383 | ```javascript 384 | player.on(FS_SDK_EVENTS_NAME.ON_APP_INSTALL_SUCCESS, function() { 385 | // Implement your own code. 386 | console.log("My application is fully installed"); 387 | }) 388 | ``` 389 |
390 | 391 |
392 | 393 | ON_APP_INSTALL_FAIL 394 |

395 | Bind a callback that will be called when your application installation has failed. 396 |

397 |
398 | 399 | Example 400 | ```javascript 401 | player.on(FS_SDK_EVENTS_NAME.ON_APP_INSTALL_FAIL, function() { 402 | // Implement your own code. 403 | console.log("Installation has failed"); 404 | }) 405 | ``` 406 |
407 | 408 |
409 | 410 | ON_APP_START 411 |

412 | Bind a callback that will be called when your application starts. 413 |

414 |
415 | 416 | Example 417 | ```javascript 418 | player.on(FS_SDK_EVENTS_NAME.ON_APP_START, function() { 419 | // Implement your own code. 420 | console.log("Application started"); 421 | }) 422 | ``` 423 |
424 | 425 |
426 | 427 | ON_STREAM_START 428 |

429 | Bind a callback that will be called when the stream starts. 430 |

431 |
432 | 433 | Example 434 | ```javascript 435 | player.on(FS_SDK_EVENTS_NAME.ON_STREAM_START, function() { 436 | // Implement your own code. 437 | console.log("Stream started"); 438 | }) 439 | ``` 440 |
441 | 442 |
443 | 444 | ON_SDK_START 445 |

446 | Bind a callback that will be called when the SDK start. 447 |

448 |
449 | 450 | Example 451 | ```javascript 452 | player.on(FS_SDK_EVENTS_NAME.ON_SDK_START, function() { 453 | // Implement your own code. 454 | console.log("SDK started"); 455 | }) 456 | ``` 457 |
458 | 459 |
460 | 461 | ON_USER_ACTIVE 462 |

Bind a callback that will be called when the user is **active** on your session (only fired when a session is running).

463 |
464 | 465 | Example 466 | ```javascript 467 | player.on(FS_SDK_EVENTS_NAME.ON_USER_ACTIVE, function() { 468 | // Implement your own code. 469 | console.log("My user is active"); 470 | }) 471 | ``` 472 |
473 | 474 |
475 | 476 | ON_USER_INACTIVE 477 |

Bind a callback that will be called when the user is **inactive** on your session (only fired when a session is running).

478 |
479 | 480 | Example 481 | ```javascript 482 | player.on(FS_SDK_EVENTS_NAME.ON_USER_INACTIVE, function() { 483 | // Implement your own code. 484 | console.log("My user is inactive"); 485 | }) 486 | ``` 487 |
488 | 489 |
490 | 491 | ON_SESSION_STOPPED 492 |

Bind a callback that will be called when the session is stopped (ex: stopped for inactivity).

493 |
494 | 495 | Example 496 | ```javascript 497 | player.on(FS_SDK_EVENTS_NAME.ON_SESSION_STOPPED, function() { 498 | // Implement your own code. 499 | console.log("The session has been stopped"); 500 | }) 501 | ``` 502 |
503 | 504 |
505 | 506 | ON_STATS 507 |

Bind a callback that will be called frequently during a running session with all stats.

508 |
509 | 510 | stats: 511 | | Property | Type | Description | DefaultValue | 512 | | --- | --- | --- | --- | 513 | | **`appHeight`** | Number | Height of the application screen on VM | 0 | 514 | | **`appWidth`** | Number | Width of the application screen on VM | 0 | 515 | | **`dataLatency`** | Number | Round trip network latency | 0 | 516 | | **`dataMethod`** | String | events/data transmission method (value: "datachannel" or "ws") | "datachannel" | 517 | | **`packetsLost`** | Number | Percent of lost packets (value: 0 to 1) | 0 | 518 | | **`serverCpuUsage`** | Number | Server CPU usage | 0 | 519 | | **`serverEncodingMs`** | Number | Server encoding time (milliseconds) | 0 | 520 | | **`serverFramerate`** | Number | Server framerate | 0 | 521 | | **`serverGpuMemTotal`** | Number | Total GPU RAM available on server (byte) | 0 | 522 | | **`serverGpuMemUsed`** | Number | Current GPU RAM used on server (byte) | 0 | 523 | | **`serverGpuUsage`** | Number | Server GPU usage percent | 0 | 524 | | **`serverGrabbingMs`** | Number | Server grabbing time (milliseconds) | 0 | 525 | | **`serverRamTotal`** | Number | Total RAM available on serve (byte) | 0 | 526 | | **`serverRamUsed`** | Number | Current RAM used on server (byte) | 0 | 527 | | **`streamingEngine`** | String | Current streaming engine used (value: "Furioos" or "RenderStreaming") | "Furioos" | 528 | | **`userActive`** | Boolean | Define if the user is consider as active by the Furioos player | 0 | 529 | | **`videoBitrate`** | Number | Received video bitrate (kbps) | 0 | 530 | | **`videoFramerate`** | Number | Received video framerate | 0 | 531 | | **`videoHeight`** | Number | Heigh of the received video | 0 | 532 | | **`videoWidth`** | Number | Width of the received video | 0 | 533 | | **`videoLatency`** | Number | Total video latency (round trip network latency + decoding time) | 0 | 534 | 535 | 536 | Example 537 | ```javascript 538 | player.on(FS_SDK_EVENTS_NAME.ON_STATS, function(stats) { 539 | // Implement your own code. 540 | console.log("Stats received: ", stats); 541 | }) 542 | ``` 543 |
544 | 545 |
546 | 547 | ON_SDK_MESSAGE 548 |

549 | Bind a callback that will be called while your application is sending you data. 550 | Data can be a String or an Object. 551 |

552 |
553 | 554 | Example 555 | ```javascript 556 | player.on(FS_SDK_EVENTS_NAME.ON_SDK_MESSAGE, function(data) { 557 | // Implement your own code. 558 | console.log("The application sent: " + data); 559 | }) 560 | ``` 561 |
562 | 563 |
564 | 565 | ON_CRASH_APP 566 |

567 | Bind a callback that will be called when your application crashes. 568 |

569 |
570 | 571 | Example 572 | ```javascript 573 | player.on(FS_SDK_EVENTS_NAME.ON_CRASH_APP, function() { 574 | // Implement your own code. 575 | console.log("The application crashed"); 576 | }) 577 | ``` 578 |
579 | 580 |
581 | 582 | ON_RESUME_SESSION 583 |

584 | Bind a callback that will be called when the player is initialized. 585 | It Lets you know if you can restart a session in progress. 586 |

587 |
588 | 589 | data: 590 | | Property | Type | Description | Value | 591 | | --- | --- | --- | --- | 592 | | **`canResumeSession`** | Boolean | Define if you can resume a session or not | | 593 | 594 | Example 595 | ```javascript 596 | player.on(FS_SDK_EVENTS_NAME.ON_RESUME_SESSION, function(data) { 597 | // Implement your own code. 598 | if(data.canResumeSession) { 599 | player.resumeSession(); 600 | } 601 | console.log("Can resume sesssion: " + data.canResumeSession); 602 | }) 603 | ``` 604 |
605 | 606 | ## Communicate with your application 607 | Go deeper with your UI by creating your own data interpretation. 608 | Those methods let you send/receive JSON data inbetween your application and the HTML page where you have implemented the JS SDK. 609 | 610 | #### Requirements 611 | - The Furioos SDK implemented in your application. 612 | - Furioos SDK for Unity : https://github.com/Unity-Technologies/furioos-sdk-unity 613 | - Furioos SDK for Unreal : https://github.com/Unity-Technologies/furioos-sdk-unreal-engine 614 | 615 |
616 | 617 | .on(FS_SDK_EVENTS_NAME.ON_SDK_MESSAGE, function(data) {}) 618 |

619 | Bind a callback to receive messages from your application. 620 |

621 |
622 | 623 | | Property | Type | Description | DefaultValue | Optional | 624 | | --- | --- | --- | --- | --- | 625 | | **`data`** | Object | The JSON that you send from your application. | null | false | 626 | 627 | Example: 628 | ```javascript 629 | player.on(FS_SDK_EVENTS_NAME.ON_SDK_MESSAGE, function(data) { 630 | console.log("Message received from my application: ", data); 631 | }); 632 | ``` 633 |
634 | 635 |
636 | 637 | sendSDKMessage(data) 638 |

639 | Send data to your own application by using the Furioos SDK. 640 |

641 |
642 | 643 | | Property | Type | Description | DefaultValue | Optional | 644 | | --- | --- | --- | --- | --- | 645 | | **`data`** | Object | The data you want to send to your app formated in JSON. | null | false | 646 | 647 | Example: 648 | ```javascript 649 | player.sendSDKMessage({ "test": "test" }); 650 | ``` 651 |
652 | 653 | ## Examples of implementation 654 | 655 | 656 | 657 | ## Debug localy the SDK communication tunnel 658 | The Furioos SDK Unity provides a local debug mode, to facilitate the debugging of sending and receiving messages. 659 | 660 | > ***Note**: There will be no stream.* 661 | 662 | > This feature opens a direct tunnel inbetween your website and your application running locally.\ 663 | Only sendSDKMessage and onSDKMessage can be used here to test the communication. 664 | 665 | 666 | ### How does it work ? 667 | #### Webclient Side 668 | 669 | To enable debugging mode you have to set the **debugAppMode** property to true. 670 | 671 | ```javascript 672 | import { Player } from 'furioos-sdk'; 673 | 674 | const options = { 675 | whiteLabel: true, 676 | hideToolbar: false, 677 | hideTitle: true, 678 | hidePlayButton: false, 679 | debugAppMode: true, // This enable the local debug mode. 680 | }; 681 | 682 | const player = new Player("YOUR_SDK_LINK_ID", "containerDivId", options); 683 | ``` 684 | When you launch your site in debug mode, the stream is not displayed, the following message will appear on your player. 685 | 686 | 687 | 688 | 689 | #### Unity Side 690 | 691 | Nothing to configure. When you start your application(With last version of the Furioos SDK Unity) with the play button in the Unity Editor, the local debug mode is automatically enabled. 692 | 693 | #### Unreal Engine Side 694 | 695 | For the moment, it is not possible activate the debug mode. The new version of the Furioos SDK for Unreal is coming soon. 696 | 697 | ## :warning: Common Errors 698 | 699 | - *Failed to execute 'postMessage' on 'DOMWindow': The target origin (http://....) provided does not match the recipient window's origin ('http://...')* 700 | 701 | This error means that you do not have the correct website URL set on your SDK link, on Furioos side. 702 | Your player’s implementation url must match the website URL entered when creating your SDK link on the Furioos side. 703 | If you’re working locally, remind that you might need to change the URL on the SDK Link, example: http://localhost:8080. -------------------------------------------------------------------------------- /classes/Player.js: -------------------------------------------------------------------------------- 1 | var SDKDebug = require("./SDKDebug.js"); 2 | const { version } = require('../package.json'); 3 | 4 | const _constructorParams = function (shareId, containerId, options) { 5 | // Share Id. 6 | if (!shareId || typeof shareId != "string") { 7 | return false; 8 | } 9 | 10 | // Container 11 | if (!containerId || typeof containerId != "string") { 12 | return false; 13 | } 14 | 15 | return true; 16 | } 17 | 18 | const _fsSdkEventsName = { 19 | SET_VERSION: "SET_VERSION", 20 | } 21 | 22 | const FS_SDK_EVENTS_NAME = { 23 | LOAD: "load", 24 | ERROR: "error", 25 | START: "start", 26 | STOP: "stop", 27 | MAXIMIZE: "maximize", 28 | MINIMIZE: "minimize", 29 | QUALITY: "quality", 30 | RESTART_STREAM: "restartStream", 31 | RESUME_SESSION: "resumeSession", 32 | ON_RESUME_SESSION: "onResumeSession", 33 | ON_SDK_MESSAGE: "onSDKMessage", 34 | SEND_SDK_MESSAGE: "sendSDKMessage", 35 | SET_LOCATION: "setLocation", 36 | ON_USER_ACTIVE: "onUserActive", 37 | ON_USER_INACTIVE: "onUserInactive", 38 | ON_SESSION_STOPPED: "onSessionStopped", 39 | ON_STATS: "onStats", 40 | GET_SERVER_AVAILABILITY: "getServerAvailability", 41 | GET_SERVER_METADATA: "getServerMetadata", 42 | SET_THUMBNAIL_URL: "setThumbnailUrl", 43 | ON_APP_INSTALL_PROGRESS: "onAppInstallProgress", 44 | ON_APP_INSTALL_SUCCESS: "onAppInstallSuccess", 45 | ON_APP_INSTALL_FAIL: "onAppInstallFail", 46 | ON_APP_START: "onAppStart", 47 | ON_STREAM_START: "onStreamStart", 48 | SET_VOLUME: "setVolume", 49 | ON_CRASH_APP: "appStop", 50 | TOGGLE_VOLUME_MUTED: "toggleVolumeMuted", 51 | ON_SDK_START: "onSDKStart" 52 | // ON_VIDEO_SIZE_CHANGED: "videoSizeChanged", 53 | }; 54 | 55 | const TIMEOUT = { 56 | MIN: 10000, 57 | MAX: 86400000, 58 | } 59 | 60 | const QUALITY_VALUES = { 61 | AUTO: 0, 62 | LOW: 1, 63 | MEDIUM: 2, 64 | HIGH: 3, 65 | ULTRA: 4, 66 | } 67 | 68 | const FS_QUALITY_VALUES = { 69 | AUTO: 0, 70 | LOW: 360, 71 | MEDIUM: 720, 72 | HIGH: 1080, 73 | } 74 | 75 | const FS_REGIONS = { 76 | EUW: [52.1326, 5.2913], 77 | USW: [47.751076, -120.740135], 78 | USE: [37.926868, -78.024902], 79 | AUE: [-33.865143, 151.2099] 80 | } 81 | 82 | let _furioosServerUrl = "https://portal.furioos.com"; 83 | const FS_SDK_VERSION = version; 84 | 85 | class Player { 86 | static get qualityValues() { return QUALITY_VALUES }; 87 | static get fsQualityValues() { return FS_QUALITY_VALUES }; 88 | static get regions() { return FS_REGIONS }; 89 | 90 | constructor(sharedLinkID, containerId, options) { 91 | if (!_constructorParams(sharedLinkID, containerId, options)) { 92 | throw "Bad parameters"; 93 | } 94 | 95 | this.isRestartStream = false; 96 | this.canResumeSession = false; 97 | this.canSendSDKMessage = false; 98 | 99 | if (sharedLinkID.indexOf("?") > 0) { 100 | // Remove URL parameters, should use the options for parameters. 101 | sharedLinkID = sharedLinkID.split("?")[0]; 102 | } 103 | 104 | if (options.overridedURL) { 105 | _furioosServerUrl = options.overridedURL; 106 | } 107 | 108 | this._quality = FS_QUALITY_VALUES.HIGH; 109 | this._volume = 1; 110 | 111 | sharedLinkID = _furioosServerUrl + "/embed/" + sharedLinkID; 112 | 113 | // If there are options, treat those who change the url. 114 | let debugAppMode = false; 115 | if (options) { 116 | let prefix = "?"; 117 | if (options.whiteLabel) { 118 | sharedLinkID += prefix + "whiteLabel=true"; 119 | prefix = "&"; 120 | } 121 | 122 | if (options.hideToolbar) { 123 | sharedLinkID += prefix + "hideToolbar=true"; 124 | prefix = "&"; 125 | } 126 | 127 | if (options.hideTitle) { 128 | sharedLinkID += prefix + "hideTitle=true"; 129 | prefix = "&"; 130 | } 131 | 132 | if (options.hidePlayButton) { 133 | sharedLinkID += prefix + "hidePlayButton=true"; 134 | prefix = "&"; 135 | } 136 | 137 | if (options.inactiveTimeout) { 138 | let inactiveTimeoutClamp = options.inactiveTimeout; 139 | if (options.inactiveTimeout < TIMEOUT.MIN) { 140 | inactiveTimeoutClamp = TIMEOUT.MIN; 141 | } 142 | 143 | if (options.inactiveTimeout > TIMEOUT.MAX) { 144 | inactiveTimeoutClamp = TIMEOUT.MAX; 145 | } 146 | 147 | sharedLinkID += prefix + "inactiveTimeout=" + inactiveTimeoutClamp / 1000; 148 | prefix = "&"; 149 | } 150 | 151 | if (options.debugAppMode) { 152 | // Local debug the SDK communication with your app. 153 | debugAppMode = true; 154 | 155 | const container = document.getElementById(containerId); 156 | container.innerText = "You are currently debugging locally your app. There is not stream here. Open console to see logs"; 157 | 158 | const serverAddress = options.wsServerAddress ? options.wsServerAddress + ":8081" : "127.0.0.1:8081" 159 | this.sdkDebug = new SDKDebug(serverAddress); 160 | 161 | this.sdkDebug.onReady = () => { 162 | // Here you know when the WS connection with your application is ready. 163 | this.loaded = true; 164 | if (this._onLoadCallback) { 165 | this._onLoadCallback(); 166 | } 167 | }; 168 | 169 | this.sdkDebug.onSDKMessage((data) => { 170 | // Here you can manage the received data. 171 | if (this._onSDKMessageCallback) { 172 | this._onSDKMessageCallback(data); 173 | } 174 | }); 175 | } 176 | } 177 | 178 | // Create the iframe into the given container. 179 | this.loaded = false; 180 | this.debugAppMode = debugAppMode; 181 | this.sharedLink = sharedLinkID; 182 | this.containerId = containerId; 183 | this.options = options; 184 | 185 | if (!debugAppMode) { 186 | this.embed = this._createIframe(); 187 | } 188 | } 189 | 190 | /////////////////////// 191 | /// PRIVATE METHODS /// 192 | /////////////////////// 193 | 194 | _createIframe() { 195 | const container = document.getElementById(this.containerId); 196 | 197 | if (!container) { 198 | throw "Cannot find the container"; 199 | } 200 | 201 | // Create the iframe element. 202 | const iframe = document.createElement("iframe"); 203 | iframe.setAttribute("src", this.sharedLink); 204 | iframe.setAttribute("id", "furioos-sdk-iframe"); 205 | iframe.setAttribute("allow", "autoplay; fullscreen"); 206 | 207 | iframe.style.width = "100%"; 208 | iframe.style.height = "100%"; 209 | iframe.style.border = "none"; 210 | 211 | container.appendChild(iframe); 212 | 213 | iframe.onload = this._onLoad.bind(this); 214 | // this._bindEvents(); 215 | 216 | return iframe; 217 | } 218 | 219 | _displayErrorMessage(message) { 220 | const container = document.getElementById(this.containerId); 221 | 222 | const div = document.createElement("div"); 223 | div.innerText = message; 224 | 225 | container.innerHTML = ""; 226 | container.appendChild(div); 227 | } 228 | 229 | _onLoad() { 230 | // Bind listener for the messages. 231 | window.addEventListener("message", (e) => { 232 | switch (e.data.type) { 233 | case FS_SDK_EVENTS_NAME.LOAD: 234 | // When the player is loaded: Set the default setted location (if setted). 235 | if (this.location) { 236 | if (!this.embed.contentWindow) { 237 | // Wait the window is reachable. 238 | setTimeout(() => { 239 | this.embed.contentWindow.postMessage({ type: FS_SDK_EVENTS_NAME.SET_LOCATION, value: this.location }, _furioosServerUrl); 240 | }, 100); 241 | } 242 | else { 243 | this.embed.contentWindow.postMessage({ type: FS_SDK_EVENTS_NAME.SET_LOCATION, value: this.location }, _furioosServerUrl); 244 | } 245 | } 246 | 247 | this.loaded = true; 248 | this.embed.contentWindow.postMessage({ type: _fsSdkEventsName.SET_VERSION, value: FS_SDK_VERSION }, _furioosServerUrl); 249 | 250 | if (this._onLoadCallback) { 251 | this._onLoadCallback(); 252 | } 253 | return; 254 | case FS_SDK_EVENTS_NAME.ON_SDK_MESSAGE: 255 | if (this._onSDKMessageCallback) { 256 | this._onSDKMessageCallback(e.data.value); 257 | } 258 | return; 259 | case FS_SDK_EVENTS_NAME.ON_USER_ACTIVE: 260 | if (this._onUserActiveCallback) { 261 | this._onUserActiveCallback(); 262 | } 263 | return; 264 | case FS_SDK_EVENTS_NAME.ON_USER_INACTIVE: 265 | if (this._onUserInactiveCallback) { 266 | this._onUserInactiveCallback(); 267 | } 268 | return; 269 | case FS_SDK_EVENTS_NAME.ON_APP_INSTALL_PROGRESS: 270 | if (this._onAppInstallProgress) { 271 | this._onAppInstallProgress(e.data.value); 272 | } 273 | return; 274 | case FS_SDK_EVENTS_NAME.ON_APP_INSTALL_SUCCESS: 275 | if (this._onAppInstallSuccess) { 276 | this._onAppInstallSuccess(); 277 | } 278 | return; 279 | case FS_SDK_EVENTS_NAME.ON_APP_INSTALL_FAIL: 280 | if (this._onAppInstallFail) { 281 | this._onAppInstallFail(); 282 | } 283 | return; 284 | case FS_SDK_EVENTS_NAME.ON_APP_START: 285 | if (this._onAppStart) { 286 | this._onAppStart(); 287 | } 288 | return; 289 | case FS_SDK_EVENTS_NAME.ON_SDK_START: 290 | this.canSendSDKMessage = true; 291 | if (this._onSDKStart) { 292 | this._onSDKStart(); 293 | } 294 | return; 295 | case FS_SDK_EVENTS_NAME.ON_STREAM_START: 296 | if (this._onStreamStart) { 297 | this.isRestartStream = false; 298 | this._onStreamStart(); 299 | } 300 | return; 301 | case FS_SDK_EVENTS_NAME.ON_SESSION_STOPPED: 302 | this.canSendSDKMessage = false; 303 | if (this._onSessionStoppedCallback) { 304 | this._onSessionStoppedCallback(); 305 | } 306 | return; 307 | case FS_SDK_EVENTS_NAME.ON_STATS: 308 | if (this._onStatsCallback) { 309 | this._onStatsCallback(JSON.parse(e.data.value)); 310 | } 311 | return; 312 | case FS_SDK_EVENTS_NAME.GET_SERVER_AVAILABILITY: 313 | const response = e.data.value; 314 | 315 | if (response.error) { 316 | console.log("Error getting server availability", response.error); 317 | if (this._getServerAvailabilityErrorCallback) { 318 | this._getServerAvailabilityErrorCallback(response.error); 319 | } 320 | 321 | return; 322 | } 323 | 324 | if (!this._getServerAvailabilityCallback) { 325 | console.log("No success callback binded !"); 326 | return; 327 | } 328 | 329 | this._getServerAvailabilityCallback(response.stats); 330 | return; 331 | case FS_SDK_EVENTS_NAME.GET_SERVER_METADATA: 332 | const res = e.data.value; 333 | 334 | if (res.error) { 335 | console.log("Error getting server metadata", res.error); 336 | if (this._getServerMetadataErrorCallback) { 337 | this._getServerMetadataErrorCallback(res.error); 338 | } 339 | 340 | return; 341 | } 342 | 343 | if (!this._getServerMetadataCallback) { 344 | console.log("No success callback binded !"); 345 | return; 346 | } 347 | 348 | this._getServerMetadataCallback(res.metadata); 349 | return; 350 | case FS_SDK_EVENTS_NAME.ERROR: 351 | this._displayErrorMessage(e.data.value); 352 | return; 353 | 354 | case FS_SDK_EVENTS_NAME.ON_CRASH_APP: 355 | if (this._onAppStop) { 356 | this._onAppStop(e.data.value); 357 | } 358 | return; 359 | 360 | case FS_SDK_EVENTS_NAME.ON_RESUME_SESSION: 361 | if (this._onResumeSession) { 362 | this.canResumeSession = e.data.value; 363 | this._onResumeSession({ canResumeSession: e.data.value }); 364 | } 365 | return; 366 | 367 | // case FS_SDK_EVENTS_NAME.ON_VIDEO_SIZE_CHANGED: 368 | // if (this._onVideoSizeChanged) { 369 | // this._onVideoSizeChanged(e.data.value); 370 | // } 371 | // return; 372 | } 373 | }); 374 | } 375 | 376 | //////////////////////// 377 | //// BIND EVENTS //// 378 | //////////////////////// 379 | on(event, callback) { 380 | switch (event) { 381 | case FS_SDK_EVENTS_NAME.LOAD: 382 | this._onLoadCallback = callback; 383 | return; 384 | 385 | case FS_SDK_EVENTS_NAME.ON_APP_INSTALL_PROGRESS: 386 | this._onAppInstallProgress = callback; 387 | return; 388 | 389 | case FS_SDK_EVENTS_NAME.ON_APP_INSTALL_SUCCESS: 390 | this._onAppInstallSuccess = callback; 391 | return; 392 | 393 | case FS_SDK_EVENTS_NAME.ON_APP_INSTALL_FAIL: 394 | this._onAppInstallFail = callback; 395 | return; 396 | 397 | case FS_SDK_EVENTS_NAME.ON_APP_START: 398 | this._onAppStart = callback; 399 | return; 400 | 401 | case FS_SDK_EVENTS_NAME.ON_SDK_START: 402 | this._onSDKStart = callback; 403 | return; 404 | 405 | case FS_SDK_EVENTS_NAME.ON_STREAM_START: 406 | this._onStreamStart = callback; 407 | return; 408 | 409 | case FS_SDK_EVENTS_NAME.ON_SESSION_STOPPED: 410 | this._onSessionStoppedCallback = callback; 411 | return; 412 | 413 | case FS_SDK_EVENTS_NAME.ON_STATS: 414 | this._onStatsCallback = callback; 415 | return; 416 | 417 | case FS_SDK_EVENTS_NAME.ON_USER_INACTIVE: 418 | this._onUserInactiveCallback = callback; 419 | return; 420 | 421 | case FS_SDK_EVENTS_NAME.ON_USER_ACTIVE: 422 | this._onUserActiveCallback = callback; 423 | return; 424 | 425 | case FS_SDK_EVENTS_NAME.ON_SDK_MESSAGE: 426 | this._onSDKMessageCallback = callback; 427 | return; 428 | 429 | case FS_SDK_EVENTS_NAME.ON_CRASH_APP: 430 | this._onAppStop = callback; 431 | return; 432 | 433 | case FS_SDK_EVENTS_NAME.ON_RESUME_SESSION: 434 | this._onResumeSession = callback; 435 | return; 436 | 437 | // case FS_SDK_EVENTS_NAME.ON_VIDEO_SIZE_CHANGED: 438 | // this._onVideoSizeChanged = callback; 439 | // return; 440 | } 441 | } 442 | 443 | //////////////////////// 444 | //// PUBLIC METHODS //// 445 | //////////////////////// 446 | 447 | setDefaultLocation(location) { 448 | this.location = location; 449 | 450 | if (!this.loaded) { 451 | return; // Not loaded. 452 | } 453 | 454 | if (this.debugAppMode) { 455 | console.log("No setDefaultLocation in debug mode") 456 | return; // Not loaded. 457 | } 458 | 459 | this.embed.contentWindow.postMessage({ type: FS_SDK_EVENTS_NAME.SET_LOCATION, value: this.location }, _furioosServerUrl); 460 | } 461 | 462 | start(location) { 463 | if (!location) { 464 | location = this.location; 465 | } 466 | 467 | if (!this.loaded) { 468 | return; // Not loaded. 469 | } 470 | 471 | if (this.debugAppMode) { 472 | console.log("No start in debug mode") 473 | return; // Not loaded. 474 | } 475 | 476 | this.embed.contentWindow.postMessage({ type: FS_SDK_EVENTS_NAME.START, value: location }, _furioosServerUrl); 477 | } 478 | 479 | stop() { 480 | if (!this.loaded) { 481 | return; // Not loaded. 482 | } 483 | 484 | if (this.debugAppMode) { 485 | console.log("No stop in debug mode") 486 | return; // Not loaded. 487 | } 488 | 489 | this.embed.contentWindow.postMessage({ type: FS_SDK_EVENTS_NAME.STOP }, _furioosServerUrl); 490 | } 491 | 492 | maximize() { 493 | if (!this.loaded) { 494 | return; // Not loaded. 495 | } 496 | 497 | if (this.debugAppMode) { 498 | console.log("No maximize in debug mode") 499 | return; // Not loaded. 500 | } 501 | 502 | this.embed.contentWindow.postMessage({ type: FS_SDK_EVENTS_NAME.MAXIMIZE }, _furioosServerUrl); 503 | } 504 | 505 | minimize() { 506 | if (!this.loaded) { 507 | return; // Not loaded. 508 | } 509 | 510 | if (this.debugAppMode) { 511 | console.log("No minimize in debug mode") 512 | return; // Not loaded. 513 | } 514 | 515 | this.embed.contentWindow.postMessage({ type: FS_SDK_EVENTS_NAME.MINIMIZE }, _furioosServerUrl); 516 | } 517 | 518 | //////////////////////// 519 | /////// GETTERS //////// 520 | //////////////////////// 521 | get quality() { 522 | switch (this._quality) { 523 | case QUALITY_VALUES.AUTO: 524 | case FS_QUALITY_VALUES.AUTO: 525 | return "AUTO"; 526 | 527 | case QUALITY_VALUES.LOW: 528 | case FS_QUALITY_VALUES.LOW: 529 | return "LOW"; 530 | 531 | case QUALITY_VALUES.MEDIUM: 532 | case FS_QUALITY_VALUES.MEDIUM: 533 | return "MEDIUM"; 534 | 535 | case QUALITY_VALUES.HIGH: 536 | case FS_QUALITY_VALUES.HIGH: 537 | return "HIGH"; 538 | 539 | case QUALITY_VALUES.ULTRA: 540 | return "HIGH"; 541 | } 542 | } 543 | 544 | get volume() { 545 | return this._volume; 546 | } 547 | 548 | setQuality(value) { 549 | // Test if the value is correct. 550 | if (value !== QUALITY_VALUES.LOW 551 | && value !== QUALITY_VALUES.MEDIUM 552 | && value !== QUALITY_VALUES.HIGH 553 | && value !== QUALITY_VALUES.ULTRA 554 | && value !== QUALITY_VALUES.AUTO 555 | && value !== FS_QUALITY_VALUES.AUTO 556 | && value !== FS_QUALITY_VALUES.LOW 557 | && value !== FS_QUALITY_VALUES.MEDIUM 558 | && value !== FS_QUALITY_VALUES.HIGH) { 559 | throw "Bad parameter: The quality should be one of the given value in Player.qualityValues"; 560 | } 561 | 562 | if (!this.loaded) { 563 | return; // Not loaded. 564 | } 565 | 566 | if (this.debugAppMode) { 567 | console.log("No setQuality in debug mode") 568 | return; // Not loaded. 569 | } 570 | 571 | // DEPRECATED 572 | let quality = value; 573 | if (quality === QUALITY_VALUES.LOW) { 574 | console.warn("DEPRECATED: This quality constants is depreciated and will not be maintained for long. Update your sdk and use the new quality values: FS_QUALITY_VALUES"); 575 | quality = FS_QUALITY_VALUES.LOW; 576 | } 577 | 578 | if (quality === QUALITY_VALUES.MEDIUM) { 579 | console.warn("DEPRECATED: This quality constants is depreciated and will not be maintained for long. Update your sdk and use the new quality values: FS_QUALITY_VALUES"); 580 | quality = FS_QUALITY_VALUES.MEDIUM; 581 | } 582 | 583 | if (quality === QUALITY_VALUES.HIGH || quality === QUALITY_VALUES.ULTRA) { 584 | console.warn("DEPRECATED: This quality constants is depreciated and will not be maintained for long. Update your sdk and use the new quality values: FS_QUALITY_VALUES"); 585 | quality = FS_QUALITY_VALUES.HIGH; 586 | } 587 | 588 | this._quality = quality; 589 | 590 | this.embed.contentWindow.postMessage({ 591 | type: FS_SDK_EVENTS_NAME.QUALITY, 592 | value: quality 593 | }, _furioosServerUrl); 594 | } 595 | 596 | restartStream() { 597 | if (!this.loaded) { 598 | return; // Not loaded. 599 | } 600 | 601 | if (this.debugAppMode) { 602 | console.log("No restartStream in debug mode"); 603 | return; // Not loaded. 604 | } 605 | if (this.isRestartStream) { 606 | console.warn("Stream is already restarting"); 607 | return; 608 | } 609 | 610 | this.embed.contentWindow.postMessage({ type: FS_SDK_EVENTS_NAME.RESTART_STREAM }, _furioosServerUrl); 611 | this.isRestartStream = true; 612 | } 613 | 614 | resumeSession() { 615 | if (this.debugAppMode) { 616 | console.log("No resumeSession in debug mode") 617 | return; // Not loaded. 618 | } 619 | 620 | if (!this.canResumeSession) { 621 | console.warn("No active session") 622 | return; 623 | } 624 | 625 | this.embed.contentWindow.postMessage({ type: FS_SDK_EVENTS_NAME.RESUME_SESSION }, _furioosServerUrl); 626 | 627 | this.canResumeSession = false; 628 | } 629 | 630 | // SDK 631 | sendSDKMessage(data) { 632 | if (!this.loaded) { 633 | return; // Not loaded. 634 | } 635 | 636 | if (typeof data == "object") { 637 | data = JSON.stringify(data); 638 | } 639 | 640 | if (this.debugAppMode) { 641 | this.sdkDebug.sendSDKMessage(data); 642 | return; 643 | } 644 | 645 | if (!this.canSendSDKMessage) { 646 | console.warn("The sdk has not been started yet. Please wait for the ON_SDK_START event before sending a message"); 647 | return; 648 | } 649 | 650 | this.embed.contentWindow.postMessage({ 651 | type: FS_SDK_EVENTS_NAME.SEND_SDK_MESSAGE, 652 | value: data, 653 | }, _furioosServerUrl); 654 | } 655 | 656 | setUserActive() { 657 | this.sendSDKMessage({ "userActive": true }); 658 | } 659 | 660 | setThumbnailUrl(thumbnailUrl) { 661 | if (!this.loaded) { 662 | return; // Not loaded. 663 | } 664 | 665 | if (this.debugAppMode) { 666 | console.log("No setThumbnailUrl in debug mode") 667 | return; // Not loaded. 668 | } 669 | 670 | this.embed.contentWindow.postMessage({ type: FS_SDK_EVENTS_NAME.SET_THUMBNAIL_URL, value: thumbnailUrl }, _furioosServerUrl); 671 | } 672 | 673 | getServerAvailability(getServerAvailabilityCallback, getServerAvailabilityErrorCallback) { 674 | if (!this.loaded) { 675 | return; // Not loaded. 676 | } 677 | 678 | if (this.debugAppMode) { 679 | console.log("No getServerAvailability in debug mode") 680 | return; // Not loaded. 681 | } 682 | 683 | this._getServerAvailabilityCallback = getServerAvailabilityCallback; 684 | this._getServerAvailabilityErrorCallback = getServerAvailabilityErrorCallback; 685 | 686 | // Call the get. 687 | this.embed.contentWindow.postMessage({ type: FS_SDK_EVENTS_NAME.GET_SERVER_AVAILABILITY }, _furioosServerUrl); 688 | // The response will be treat in the listener below. 689 | } 690 | 691 | getServerMetadata(getServerMetadataCallback, getServerMetadataErrorCallback) { 692 | if (!this.loaded) { 693 | return; // Not loaded. 694 | } 695 | 696 | if (this.debugAppMode) { 697 | console.log("No getServerMetadata in debug mode") 698 | return; // Not loaded. 699 | } 700 | 701 | this._getServerMetadataCallback = getServerMetadataCallback; 702 | this._getServerMetadataErrorCallback = getServerMetadataErrorCallback; 703 | 704 | // Call the get. 705 | this.embed.contentWindow.postMessage({ type: FS_SDK_EVENTS_NAME.GET_SERVER_METADATA }, _furioosServerUrl); 706 | // The response will be treat in the listener below. 707 | } 708 | 709 | setVolume(volume, setVolumeCallback) { 710 | if (!this.loaded) { 711 | return; // Not loaded. 712 | } 713 | 714 | if (this.debugAppMode) { 715 | console.log("No setVolume in debug mode") 716 | return; // Not loaded. 717 | } 718 | 719 | this._setVolume = setVolumeCallback; 720 | this._volume = volume; 721 | 722 | this.embed.contentWindow.postMessage({ type: FS_SDK_EVENTS_NAME.SET_VOLUME, value: volume }, _furioosServerUrl); 723 | } 724 | 725 | toggleMuted() { 726 | if (!this.loaded) { 727 | return; // Not loaded. 728 | } 729 | 730 | if (this.debugAppMode) { 731 | console.log("No toggleMuted in debug mode") 732 | return; // Not loaded. 733 | } 734 | 735 | this._volume = 0; 736 | 737 | this.embed.contentWindow.postMessage({ type: FS_SDK_EVENTS_NAME.TOGGLE_VOLUME_MUTED }, _furioosServerUrl); 738 | } 739 | 740 | //////////////////////// 741 | //// DEPRECATED //// 742 | //////////////////////// 743 | // Binding onload callback. 744 | onLoad(onLoadCallback) { 745 | this._onLoadCallback = onLoadCallback; 746 | console.warn("DEPRECATED: OnLoad is deprecated and will not be maintained for long. Use the new .on() method to subscribe to events"); 747 | } 748 | 749 | onUserInactive(onUserInactiveCallback) { 750 | this._onUserInactiveCallback = onUserInactiveCallback; 751 | console.warn("DEPRECATED: onUserInactive is deprecated and will not be maintained for long. Use the new .on() method to subscribe to events"); 752 | } 753 | 754 | onAppInstallProgress(onAppInstallProgress) { 755 | this._onAppInstallProgress = onAppInstallProgress; 756 | console.warn("DEPRECATED: onAppInstallProgress is deprecated and will not be maintained for long. Use the new .on() method to subscribe to events"); 757 | } 758 | 759 | onAppInstallSuccess(onAppInstallSuccess) { 760 | this._onAppInstallSuccess = onAppInstallSuccess; 761 | console.warn("DEPRECATED: onAppInstallSuccess is deprecated and will not be maintained for long. Use the new .on() method to subscribe to events"); 762 | } 763 | 764 | onAppInstallFail(onAppInstallFail) { 765 | this._onAppInstallFail = onAppInstallFail; 766 | console.warn("DEPRECATED: onAppInstallFail is deprecated and will not be maintained for long. Use the new .on() method to subscribe to events"); 767 | } 768 | 769 | onAppStart(onAppStart) { 770 | this._onAppStart = onAppStart; 771 | console.warn("DEPRECATED: onAppStart is deprecated and will not be maintained for long. Use the new .on() method to subscribe to events"); 772 | } 773 | 774 | onStreamStart(onStreamStart) { 775 | this._onStreamStart = onStreamStart; 776 | console.warn("DEPRECATED: onStreamStart is deprecated and will not be maintained for long. Use the new .on() method to subscribe to events"); 777 | } 778 | 779 | onSessionStopped(onSessionStoppedCallback) { 780 | this._onSessionStoppedCallback = onSessionStoppedCallback; 781 | console.warn("DEPRECATED: onSessionStopped is deprecated and will not be maintained for long. Use the new .on() method to subscribe to events"); 782 | } 783 | 784 | onStats(callback) { 785 | this._onStatsCallback = callback; 786 | console.warn("DEPRECATED: onStats is deprecated and will not be maintained for long. Use the new .on() method to subscribe to events"); 787 | } 788 | 789 | onSDKMessage(onSDKMessageCallback) { 790 | this._onSDKMessageCallback = onSDKMessageCallback; 791 | console.warn("DEPRECATED: onSDKMessage is deprecated and will not be maintained for long. Use the new .on() method to subscribe to events"); 792 | } 793 | 794 | onUserActive(onUserActiveCallback) { 795 | this._onUserActiveCallback = onUserActiveCallback; 796 | console.warn("DEPRECATED: onUserActive is deprecated and will not be maintained for long. Use the new .on() method to subscribe to events"); 797 | } 798 | } 799 | 800 | module.exports = { 801 | Player, 802 | FS_SDK_EVENTS_NAME, 803 | FS_QUALITY_VALUES, 804 | FS_REGIONS, 805 | QUALITY_VALUES, 806 | } 807 | -------------------------------------------------------------------------------- /examples/furioos-sdk-js-npm-example/package-lock.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "furioos-sdk-js-example", 3 | "version": "1.0.0", 4 | "lockfileVersion": 1, 5 | "requires": true, 6 | "dependencies": { 7 | "JSONStream": { 8 | "version": "1.3.5", 9 | "resolved": "https://registry.npmjs.org/JSONStream/-/JSONStream-1.3.5.tgz", 10 | "integrity": "sha512-E+iruNOY8VV9s4JEbe1aNEm6MiszPRr/UfcHMz0TQh1BXSxHK+ASV1R6W4HpjBhSeS+54PIsAMCBmwD06LLsqQ==", 11 | "dev": true, 12 | "requires": { 13 | "jsonparse": "^1.2.0", 14 | "through": ">=2.2.7 <3" 15 | } 16 | }, 17 | "accepts": { 18 | "version": "1.3.8", 19 | "resolved": "https://registry.npmjs.org/accepts/-/accepts-1.3.8.tgz", 20 | "integrity": "sha512-PYAthTa2m2VKxuvSD3DPC/Gy+U+sOA1LAuT8mkmRuvw+NACSaeXEQ+NHcVF7rONl6qcaxV3Uuemwawk+7+SJLw==", 21 | "requires": { 22 | "mime-types": "~2.1.34", 23 | "negotiator": "0.6.3" 24 | } 25 | }, 26 | "acorn": { 27 | "version": "7.4.1", 28 | "resolved": "https://registry.npmjs.org/acorn/-/acorn-7.4.1.tgz", 29 | "integrity": "sha512-nQyp0o1/mNdbTO1PO6kHkwSrmgZ0MT/jCCpNiwbUjGoRN4dlBhqJtoQuCnEOKzgTVwg0ZWiCoQy6SxMebQVh8A==", 30 | "dev": true 31 | }, 32 | "acorn-node": { 33 | "version": "1.8.2", 34 | "resolved": "https://registry.npmjs.org/acorn-node/-/acorn-node-1.8.2.tgz", 35 | "integrity": "sha512-8mt+fslDufLYntIoPAaIMUe/lrbrehIiwmR3t2k9LljIzoigEPF27eLk2hy8zSGzmR/ogr7zbRKINMo1u0yh5A==", 36 | "dev": true, 37 | "requires": { 38 | "acorn": "^7.0.0", 39 | "acorn-walk": "^7.0.0", 40 | "xtend": "^4.0.2" 41 | } 42 | }, 43 | "acorn-walk": { 44 | "version": "7.2.0", 45 | "resolved": "https://registry.npmjs.org/acorn-walk/-/acorn-walk-7.2.0.tgz", 46 | "integrity": "sha512-OPdCF6GsMIP+Az+aWfAAOEt2/+iVDKE7oy6lJ098aoe59oAmK76qV6Gw60SbZ8jHuG2wH058GF4pLFbYamYrVA==", 47 | "dev": true 48 | }, 49 | "array-flatten": { 50 | "version": "1.1.1", 51 | "resolved": "https://registry.npmjs.org/array-flatten/-/array-flatten-1.1.1.tgz", 52 | "integrity": "sha512-PCVAQswWemu6UdxsDFFX/+gVeYqKAod3D3UVm91jHwynguOwAvYPhx8nNlM++NqRcK6CxxpUafjmhIdKiHibqg==" 53 | }, 54 | "asn1.js": { 55 | "version": "5.4.1", 56 | "resolved": "https://registry.npmjs.org/asn1.js/-/asn1.js-5.4.1.tgz", 57 | "integrity": "sha512-+I//4cYPccV8LdmBLiX8CYvf9Sp3vQsrqu2QNXRcrbiWvcx/UdlFiqUJJzxRQxgsZmvhXhn4cSKeSmoFjVdupA==", 58 | "dev": true, 59 | "requires": { 60 | "bn.js": "^4.0.0", 61 | "inherits": "^2.0.1", 62 | "minimalistic-assert": "^1.0.0", 63 | "safer-buffer": "^2.1.0" 64 | }, 65 | "dependencies": { 66 | "bn.js": { 67 | "version": "4.12.0", 68 | "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-4.12.0.tgz", 69 | "integrity": "sha512-c98Bf3tPniI+scsdk237ku1Dc3ujXQTSgyiPUDEOe7tRkhrqridvh8klBv0HCEso1OLOYcHuCv/cS6DNxKH+ZA==", 70 | "dev": true 71 | } 72 | } 73 | }, 74 | "assert": { 75 | "version": "1.5.0", 76 | "resolved": "https://registry.npmjs.org/assert/-/assert-1.5.0.tgz", 77 | "integrity": "sha512-EDsgawzwoun2CZkCgtxJbv392v4nbk9XDD06zI+kQYoBM/3RBWLlEyJARDOmhAAosBjWACEkKL6S+lIZtcAubA==", 78 | "dev": true, 79 | "requires": { 80 | "object-assign": "^4.1.1", 81 | "util": "0.10.3" 82 | }, 83 | "dependencies": { 84 | "inherits": { 85 | "version": "2.0.1", 86 | "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.1.tgz", 87 | "integrity": "sha512-8nWq2nLTAwd02jTqJExUYFSD/fKq6VH9Y/oG2accc/kdI0V98Bag8d5a4gi3XHz73rDWa2PvTtvcWYquKqSENA==", 88 | "dev": true 89 | }, 90 | "util": { 91 | "version": "0.10.3", 92 | "resolved": "https://registry.npmjs.org/util/-/util-0.10.3.tgz", 93 | "integrity": "sha512-5KiHfsmkqacuKjkRkdV7SsfDJ2EGiPsK92s2MhNSY0craxjTdKTtqKsJaCWp4LW33ZZ0OPUv1WO/TFvNQRiQxQ==", 94 | "dev": true, 95 | "requires": { 96 | "inherits": "2.0.1" 97 | } 98 | } 99 | } 100 | }, 101 | "available-typed-arrays": { 102 | "version": "1.0.5", 103 | "resolved": "https://registry.npmjs.org/available-typed-arrays/-/available-typed-arrays-1.0.5.tgz", 104 | "integrity": "sha512-DMD0KiN46eipeziST1LPP/STfDU0sufISXmjSgvVsoU2tqxctQeASejWcfNtxYKqETM1UxQ8sp2OrSBWpHY6sw==", 105 | "dev": true 106 | }, 107 | "balanced-match": { 108 | "version": "1.0.2", 109 | "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz", 110 | "integrity": "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==", 111 | "dev": true 112 | }, 113 | "base64-js": { 114 | "version": "1.5.1", 115 | "resolved": "https://registry.npmjs.org/base64-js/-/base64-js-1.5.1.tgz", 116 | "integrity": "sha512-AKpaYlHn8t4SVbOHCy+b5+KKgvR4vrsD8vbvrbiQJps7fKDTkjkDry6ji0rUJjC0kzbNePLwzxq8iypo41qeWA==", 117 | "dev": true 118 | }, 119 | "bn.js": { 120 | "version": "5.2.1", 121 | "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-5.2.1.tgz", 122 | "integrity": "sha512-eXRvHzWyYPBuB4NBy0cmYQjGitUrtqwbvlzP3G6VFnNRbsZQIxQ10PbKKHt8gZ/HW/D/747aDl+QkDqg3KQLMQ==", 123 | "dev": true 124 | }, 125 | "body-parser": { 126 | "version": "1.20.0", 127 | "resolved": "https://registry.npmjs.org/body-parser/-/body-parser-1.20.0.tgz", 128 | "integrity": "sha512-DfJ+q6EPcGKZD1QWUjSpqp+Q7bDQTsQIF4zfUAtZ6qk+H/3/QRhg9CEp39ss+/T2vw0+HaidC0ecJj/DRLIaKg==", 129 | "requires": { 130 | "bytes": "3.1.2", 131 | "content-type": "~1.0.4", 132 | "debug": "2.6.9", 133 | "depd": "2.0.0", 134 | "destroy": "1.2.0", 135 | "http-errors": "2.0.0", 136 | "iconv-lite": "0.4.24", 137 | "on-finished": "2.4.1", 138 | "qs": "6.10.3", 139 | "raw-body": "2.5.1", 140 | "type-is": "~1.6.18", 141 | "unpipe": "1.0.0" 142 | } 143 | }, 144 | "brace-expansion": { 145 | "version": "1.1.11", 146 | "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", 147 | "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", 148 | "dev": true, 149 | "requires": { 150 | "balanced-match": "^1.0.0", 151 | "concat-map": "0.0.1" 152 | } 153 | }, 154 | "brorand": { 155 | "version": "1.1.0", 156 | "resolved": "https://registry.npmjs.org/brorand/-/brorand-1.1.0.tgz", 157 | "integrity": "sha512-cKV8tMCEpQs4hK/ik71d6LrPOnpkpGBR0wzxqr68g2m/LB2GxVYQroAjMJZRVM1Y4BCjCKc3vAamxSzOY2RP+w==", 158 | "dev": true 159 | }, 160 | "browser-pack": { 161 | "version": "6.1.0", 162 | "resolved": "https://registry.npmjs.org/browser-pack/-/browser-pack-6.1.0.tgz", 163 | "integrity": "sha512-erYug8XoqzU3IfcU8fUgyHqyOXqIE4tUTTQ+7mqUjQlvnXkOO6OlT9c/ZoJVHYoAaqGxr09CN53G7XIsO4KtWA==", 164 | "dev": true, 165 | "requires": { 166 | "JSONStream": "^1.0.3", 167 | "combine-source-map": "~0.8.0", 168 | "defined": "^1.0.0", 169 | "safe-buffer": "^5.1.1", 170 | "through2": "^2.0.0", 171 | "umd": "^3.0.0" 172 | } 173 | }, 174 | "browser-resolve": { 175 | "version": "2.0.0", 176 | "resolved": "https://registry.npmjs.org/browser-resolve/-/browser-resolve-2.0.0.tgz", 177 | "integrity": "sha512-7sWsQlYL2rGLy2IWm8WL8DCTJvYLc/qlOnsakDac87SOoCd16WLsaAMdCiAqsTNHIe+SXfaqyxyo6THoWqs8WQ==", 178 | "dev": true, 179 | "requires": { 180 | "resolve": "^1.17.0" 181 | } 182 | }, 183 | "browserify": { 184 | "version": "17.0.0", 185 | "resolved": "https://registry.npmjs.org/browserify/-/browserify-17.0.0.tgz", 186 | "integrity": "sha512-SaHqzhku9v/j6XsQMRxPyBrSP3gnwmE27gLJYZgMT2GeK3J0+0toN+MnuNYDfHwVGQfLiMZ7KSNSIXHemy905w==", 187 | "dev": true, 188 | "requires": { 189 | "JSONStream": "^1.0.3", 190 | "assert": "^1.4.0", 191 | "browser-pack": "^6.0.1", 192 | "browser-resolve": "^2.0.0", 193 | "browserify-zlib": "~0.2.0", 194 | "buffer": "~5.2.1", 195 | "cached-path-relative": "^1.0.0", 196 | "concat-stream": "^1.6.0", 197 | "console-browserify": "^1.1.0", 198 | "constants-browserify": "~1.0.0", 199 | "crypto-browserify": "^3.0.0", 200 | "defined": "^1.0.0", 201 | "deps-sort": "^2.0.1", 202 | "domain-browser": "^1.2.0", 203 | "duplexer2": "~0.1.2", 204 | "events": "^3.0.0", 205 | "glob": "^7.1.0", 206 | "has": "^1.0.0", 207 | "htmlescape": "^1.1.0", 208 | "https-browserify": "^1.0.0", 209 | "inherits": "~2.0.1", 210 | "insert-module-globals": "^7.2.1", 211 | "labeled-stream-splicer": "^2.0.0", 212 | "mkdirp-classic": "^0.5.2", 213 | "module-deps": "^6.2.3", 214 | "os-browserify": "~0.3.0", 215 | "parents": "^1.0.1", 216 | "path-browserify": "^1.0.0", 217 | "process": "~0.11.0", 218 | "punycode": "^1.3.2", 219 | "querystring-es3": "~0.2.0", 220 | "read-only-stream": "^2.0.0", 221 | "readable-stream": "^2.0.2", 222 | "resolve": "^1.1.4", 223 | "shasum-object": "^1.0.0", 224 | "shell-quote": "^1.6.1", 225 | "stream-browserify": "^3.0.0", 226 | "stream-http": "^3.0.0", 227 | "string_decoder": "^1.1.1", 228 | "subarg": "^1.0.0", 229 | "syntax-error": "^1.1.1", 230 | "through2": "^2.0.0", 231 | "timers-browserify": "^1.0.1", 232 | "tty-browserify": "0.0.1", 233 | "url": "~0.11.0", 234 | "util": "~0.12.0", 235 | "vm-browserify": "^1.0.0", 236 | "xtend": "^4.0.0" 237 | } 238 | }, 239 | "browserify-aes": { 240 | "version": "1.2.0", 241 | "resolved": "https://registry.npmjs.org/browserify-aes/-/browserify-aes-1.2.0.tgz", 242 | "integrity": "sha512-+7CHXqGuspUn/Sl5aO7Ea0xWGAtETPXNSAjHo48JfLdPWcMng33Xe4znFvQweqc/uzk5zSOI3H52CYnjCfb5hA==", 243 | "dev": true, 244 | "requires": { 245 | "buffer-xor": "^1.0.3", 246 | "cipher-base": "^1.0.0", 247 | "create-hash": "^1.1.0", 248 | "evp_bytestokey": "^1.0.3", 249 | "inherits": "^2.0.1", 250 | "safe-buffer": "^5.0.1" 251 | } 252 | }, 253 | "browserify-cipher": { 254 | "version": "1.0.1", 255 | "resolved": "https://registry.npmjs.org/browserify-cipher/-/browserify-cipher-1.0.1.tgz", 256 | "integrity": "sha512-sPhkz0ARKbf4rRQt2hTpAHqn47X3llLkUGn+xEJzLjwY8LRs2p0v7ljvI5EyoRO/mexrNunNECisZs+gw2zz1w==", 257 | "dev": true, 258 | "requires": { 259 | "browserify-aes": "^1.0.4", 260 | "browserify-des": "^1.0.0", 261 | "evp_bytestokey": "^1.0.0" 262 | } 263 | }, 264 | "browserify-des": { 265 | "version": "1.0.2", 266 | "resolved": "https://registry.npmjs.org/browserify-des/-/browserify-des-1.0.2.tgz", 267 | "integrity": "sha512-BioO1xf3hFwz4kc6iBhI3ieDFompMhrMlnDFC4/0/vd5MokpuAc3R+LYbwTA9A5Yc9pq9UYPqffKpW2ObuwX5A==", 268 | "dev": true, 269 | "requires": { 270 | "cipher-base": "^1.0.1", 271 | "des.js": "^1.0.0", 272 | "inherits": "^2.0.1", 273 | "safe-buffer": "^5.1.2" 274 | } 275 | }, 276 | "browserify-rsa": { 277 | "version": "4.1.0", 278 | "resolved": "https://registry.npmjs.org/browserify-rsa/-/browserify-rsa-4.1.0.tgz", 279 | "integrity": "sha512-AdEER0Hkspgno2aR97SAf6vi0y0k8NuOpGnVH3O99rcA5Q6sh8QxcngtHuJ6uXwnfAXNM4Gn1Gb7/MV1+Ymbog==", 280 | "dev": true, 281 | "requires": { 282 | "bn.js": "^5.0.0", 283 | "randombytes": "^2.0.1" 284 | } 285 | }, 286 | "browserify-sign": { 287 | "version": "4.2.1", 288 | "resolved": "https://registry.npmjs.org/browserify-sign/-/browserify-sign-4.2.1.tgz", 289 | "integrity": "sha512-/vrA5fguVAKKAVTNJjgSm1tRQDHUU6DbwO9IROu/0WAzC8PKhucDSh18J0RMvVeHAn5puMd+QHC2erPRNf8lmg==", 290 | "dev": true, 291 | "requires": { 292 | "bn.js": "^5.1.1", 293 | "browserify-rsa": "^4.0.1", 294 | "create-hash": "^1.2.0", 295 | "create-hmac": "^1.1.7", 296 | "elliptic": "^6.5.3", 297 | "inherits": "^2.0.4", 298 | "parse-asn1": "^5.1.5", 299 | "readable-stream": "^3.6.0", 300 | "safe-buffer": "^5.2.0" 301 | }, 302 | "dependencies": { 303 | "readable-stream": { 304 | "version": "3.6.0", 305 | "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.0.tgz", 306 | "integrity": "sha512-BViHy7LKeTz4oNnkcLJ+lVSL6vpiFeX6/d3oSH8zCW7UxP2onchk+vTGB143xuFjHS3deTgkKoXXymXqymiIdA==", 307 | "dev": true, 308 | "requires": { 309 | "inherits": "^2.0.3", 310 | "string_decoder": "^1.1.1", 311 | "util-deprecate": "^1.0.1" 312 | } 313 | } 314 | } 315 | }, 316 | "browserify-zlib": { 317 | "version": "0.2.0", 318 | "resolved": "https://registry.npmjs.org/browserify-zlib/-/browserify-zlib-0.2.0.tgz", 319 | "integrity": "sha512-Z942RysHXmJrhqk88FmKBVq/v5tqmSkDz7p54G/MGyjMnCFFnC79XWNbg+Vta8W6Wb2qtSZTSxIGkJrRpCFEiA==", 320 | "dev": true, 321 | "requires": { 322 | "pako": "~1.0.5" 323 | } 324 | }, 325 | "buffer": { 326 | "version": "5.2.1", 327 | "resolved": "https://registry.npmjs.org/buffer/-/buffer-5.2.1.tgz", 328 | "integrity": "sha512-c+Ko0loDaFfuPWiL02ls9Xd3GO3cPVmUobQ6t3rXNUk304u6hGq+8N/kFi+QEIKhzK3uwolVhLzszmfLmMLnqg==", 329 | "dev": true, 330 | "requires": { 331 | "base64-js": "^1.0.2", 332 | "ieee754": "^1.1.4" 333 | } 334 | }, 335 | "buffer-from": { 336 | "version": "1.1.2", 337 | "resolved": "https://registry.npmjs.org/buffer-from/-/buffer-from-1.1.2.tgz", 338 | "integrity": "sha512-E+XQCRwSbaaiChtv6k6Dwgc+bx+Bs6vuKJHHl5kox/BaKbhiXzqQOwK4cO22yElGp2OCmjwVhT3HmxgyPGnJfQ==", 339 | "dev": true 340 | }, 341 | "buffer-xor": { 342 | "version": "1.0.3", 343 | "resolved": "https://registry.npmjs.org/buffer-xor/-/buffer-xor-1.0.3.tgz", 344 | "integrity": "sha512-571s0T7nZWK6vB67HI5dyUF7wXiNcfaPPPTl6zYCNApANjIvYJTg7hlud/+cJpdAhS7dVzqMLmfhfHR3rAcOjQ==", 345 | "dev": true 346 | }, 347 | "builtin-status-codes": { 348 | "version": "3.0.0", 349 | "resolved": "https://registry.npmjs.org/builtin-status-codes/-/builtin-status-codes-3.0.0.tgz", 350 | "integrity": "sha512-HpGFw18DgFWlncDfjTa2rcQ4W88O1mC8e8yZ2AvQY5KDaktSTwo+KRf6nHK6FRI5FyRyb/5T6+TSxfP7QyGsmQ==", 351 | "dev": true 352 | }, 353 | "bytes": { 354 | "version": "3.1.2", 355 | "resolved": "https://registry.npmjs.org/bytes/-/bytes-3.1.2.tgz", 356 | "integrity": "sha512-/Nf7TyzTx6S3yRJObOAV7956r8cr2+Oj8AC5dt8wSP3BQAoeX58NoHyCU8P8zGkNXStjTSi6fzO6F0pBdcYbEg==" 357 | }, 358 | "cached-path-relative": { 359 | "version": "1.1.0", 360 | "resolved": "https://registry.npmjs.org/cached-path-relative/-/cached-path-relative-1.1.0.tgz", 361 | "integrity": "sha512-WF0LihfemtesFcJgO7xfOoOcnWzY/QHR4qeDqV44jPU3HTI54+LnfXK3SA27AVVGCdZFgjjFFaqUA9Jx7dMJZA==", 362 | "dev": true 363 | }, 364 | "call-bind": { 365 | "version": "1.0.2", 366 | "resolved": "https://registry.npmjs.org/call-bind/-/call-bind-1.0.2.tgz", 367 | "integrity": "sha512-7O+FbCihrB5WGbFYesctwmTKae6rOiIzmz1icreWJ+0aA7LJfuqhEso2T9ncpcFtzMQtzXf2QGGueWJGTYsqrA==", 368 | "requires": { 369 | "function-bind": "^1.1.1", 370 | "get-intrinsic": "^1.0.2" 371 | } 372 | }, 373 | "cipher-base": { 374 | "version": "1.0.4", 375 | "resolved": "https://registry.npmjs.org/cipher-base/-/cipher-base-1.0.4.tgz", 376 | "integrity": "sha512-Kkht5ye6ZGmwv40uUDZztayT2ThLQGfnj/T71N/XzeZeo3nf8foyW7zGTsPYkEya3m5f3cAypH+qe7YOrM1U2Q==", 377 | "dev": true, 378 | "requires": { 379 | "inherits": "^2.0.1", 380 | "safe-buffer": "^5.0.1" 381 | } 382 | }, 383 | "combine-source-map": { 384 | "version": "0.8.0", 385 | "resolved": "https://registry.npmjs.org/combine-source-map/-/combine-source-map-0.8.0.tgz", 386 | "integrity": "sha512-UlxQ9Vw0b/Bt/KYwCFqdEwsQ1eL8d1gibiFb7lxQJFdvTgc2hIZi6ugsg+kyhzhPV+QEpUiEIwInIAIrgoEkrg==", 387 | "dev": true, 388 | "requires": { 389 | "convert-source-map": "~1.1.0", 390 | "inline-source-map": "~0.6.0", 391 | "lodash.memoize": "~3.0.3", 392 | "source-map": "~0.5.3" 393 | } 394 | }, 395 | "concat-map": { 396 | "version": "0.0.1", 397 | "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", 398 | "integrity": "sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==", 399 | "dev": true 400 | }, 401 | "concat-stream": { 402 | "version": "1.6.2", 403 | "resolved": "https://registry.npmjs.org/concat-stream/-/concat-stream-1.6.2.tgz", 404 | "integrity": "sha512-27HBghJxjiZtIk3Ycvn/4kbJk/1uZuJFfuPEns6LaEvpvG1f0hTea8lilrouyo9mVc2GWdcEZ8OLoGmSADlrCw==", 405 | "dev": true, 406 | "requires": { 407 | "buffer-from": "^1.0.0", 408 | "inherits": "^2.0.3", 409 | "readable-stream": "^2.2.2", 410 | "typedarray": "^0.0.6" 411 | } 412 | }, 413 | "console-browserify": { 414 | "version": "1.2.0", 415 | "resolved": "https://registry.npmjs.org/console-browserify/-/console-browserify-1.2.0.tgz", 416 | "integrity": "sha512-ZMkYO/LkF17QvCPqM0gxw8yUzigAOZOSWSHg91FH6orS7vcEj5dVZTidN2fQ14yBSdg97RqhSNwLUXInd52OTA==", 417 | "dev": true 418 | }, 419 | "constants-browserify": { 420 | "version": "1.0.0", 421 | "resolved": "https://registry.npmjs.org/constants-browserify/-/constants-browserify-1.0.0.tgz", 422 | "integrity": "sha512-xFxOwqIzR/e1k1gLiWEophSCMqXcwVHIH7akf7b/vxcUeGunlj3hvZaaqxwHsTgn+IndtkQJgSztIDWeumWJDQ==", 423 | "dev": true 424 | }, 425 | "content-disposition": { 426 | "version": "0.5.4", 427 | "resolved": "https://registry.npmjs.org/content-disposition/-/content-disposition-0.5.4.tgz", 428 | "integrity": "sha512-FveZTNuGw04cxlAiWbzi6zTAL/lhehaWbTtgluJh4/E95DqMwTmha3KZN1aAWA8cFIhHzMZUvLevkw5Rqk+tSQ==", 429 | "requires": { 430 | "safe-buffer": "5.2.1" 431 | } 432 | }, 433 | "content-type": { 434 | "version": "1.0.4", 435 | "resolved": "https://registry.npmjs.org/content-type/-/content-type-1.0.4.tgz", 436 | "integrity": "sha512-hIP3EEPs8tB9AT1L+NUqtwOAps4mk2Zob89MWXMHjHWg9milF/j4osnnQLXBCBFBk/tvIG/tUc9mOUJiPBhPXA==" 437 | }, 438 | "convert-source-map": { 439 | "version": "1.1.3", 440 | "resolved": "https://registry.npmjs.org/convert-source-map/-/convert-source-map-1.1.3.tgz", 441 | "integrity": "sha512-Y8L5rp6jo+g9VEPgvqNfEopjTR4OTYct8lXlS8iVQdmnjDvbdbzYe9rjtFCB9egC86JoNCU61WRY+ScjkZpnIg==", 442 | "dev": true 443 | }, 444 | "cookie": { 445 | "version": "0.5.0", 446 | "resolved": "https://registry.npmjs.org/cookie/-/cookie-0.5.0.tgz", 447 | "integrity": "sha512-YZ3GUyn/o8gfKJlnlX7g7xq4gyO6OSuhGPKaaGssGB2qgDUS0gPgtTvoyZLTt9Ab6dC4hfc9dV5arkvc/OCmrw==" 448 | }, 449 | "cookie-signature": { 450 | "version": "1.0.6", 451 | "resolved": "https://registry.npmjs.org/cookie-signature/-/cookie-signature-1.0.6.tgz", 452 | "integrity": "sha512-QADzlaHc8icV8I7vbaJXJwod9HWYp8uCqf1xa4OfNu1T7JVxQIrUgOWtHdNDtPiywmFbiS12VjotIXLrKM3orQ==" 453 | }, 454 | "core-util-is": { 455 | "version": "1.0.3", 456 | "resolved": "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.3.tgz", 457 | "integrity": "sha512-ZQBvi1DcpJ4GDqanjucZ2Hj3wEO5pZDS89BWbkcrvdxksJorwUDDZamX9ldFkp9aw2lmBDLgkObEA4DWNJ9FYQ==", 458 | "dev": true 459 | }, 460 | "create-ecdh": { 461 | "version": "4.0.4", 462 | "resolved": "https://registry.npmjs.org/create-ecdh/-/create-ecdh-4.0.4.tgz", 463 | "integrity": "sha512-mf+TCx8wWc9VpuxfP2ht0iSISLZnt0JgWlrOKZiNqyUZWnjIaCIVNQArMHnCZKfEYRg6IM7A+NeJoN8gf/Ws0A==", 464 | "dev": true, 465 | "requires": { 466 | "bn.js": "^4.1.0", 467 | "elliptic": "^6.5.3" 468 | }, 469 | "dependencies": { 470 | "bn.js": { 471 | "version": "4.12.0", 472 | "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-4.12.0.tgz", 473 | "integrity": "sha512-c98Bf3tPniI+scsdk237ku1Dc3ujXQTSgyiPUDEOe7tRkhrqridvh8klBv0HCEso1OLOYcHuCv/cS6DNxKH+ZA==", 474 | "dev": true 475 | } 476 | } 477 | }, 478 | "create-hash": { 479 | "version": "1.2.0", 480 | "resolved": "https://registry.npmjs.org/create-hash/-/create-hash-1.2.0.tgz", 481 | "integrity": "sha512-z00bCGNHDG8mHAkP7CtT1qVu+bFQUPjYq/4Iv3C3kWjTFV10zIjfSoeqXo9Asws8gwSHDGj/hl2u4OGIjapeCg==", 482 | "dev": true, 483 | "requires": { 484 | "cipher-base": "^1.0.1", 485 | "inherits": "^2.0.1", 486 | "md5.js": "^1.3.4", 487 | "ripemd160": "^2.0.1", 488 | "sha.js": "^2.4.0" 489 | } 490 | }, 491 | "create-hmac": { 492 | "version": "1.1.7", 493 | "resolved": "https://registry.npmjs.org/create-hmac/-/create-hmac-1.1.7.tgz", 494 | "integrity": "sha512-MJG9liiZ+ogc4TzUwuvbER1JRdgvUFSB5+VR/g5h82fGaIRWMWddtKBHi7/sVhfjQZ6SehlyhvQYrcYkaUIpLg==", 495 | "dev": true, 496 | "requires": { 497 | "cipher-base": "^1.0.3", 498 | "create-hash": "^1.1.0", 499 | "inherits": "^2.0.1", 500 | "ripemd160": "^2.0.0", 501 | "safe-buffer": "^5.0.1", 502 | "sha.js": "^2.4.8" 503 | } 504 | }, 505 | "crypto-browserify": { 506 | "version": "3.12.0", 507 | "resolved": "https://registry.npmjs.org/crypto-browserify/-/crypto-browserify-3.12.0.tgz", 508 | "integrity": "sha512-fz4spIh+znjO2VjL+IdhEpRJ3YN6sMzITSBijk6FK2UvTqruSQW+/cCZTSNsMiZNvUeq0CqurF+dAbyiGOY6Wg==", 509 | "dev": true, 510 | "requires": { 511 | "browserify-cipher": "^1.0.0", 512 | "browserify-sign": "^4.0.0", 513 | "create-ecdh": "^4.0.0", 514 | "create-hash": "^1.1.0", 515 | "create-hmac": "^1.1.0", 516 | "diffie-hellman": "^5.0.0", 517 | "inherits": "^2.0.1", 518 | "pbkdf2": "^3.0.3", 519 | "public-encrypt": "^4.0.0", 520 | "randombytes": "^2.0.0", 521 | "randomfill": "^1.0.3" 522 | } 523 | }, 524 | "dash-ast": { 525 | "version": "1.0.0", 526 | "resolved": "https://registry.npmjs.org/dash-ast/-/dash-ast-1.0.0.tgz", 527 | "integrity": "sha512-Vy4dx7gquTeMcQR/hDkYLGUnwVil6vk4FOOct+djUnHOUWt+zJPJAaRIXaAFkPXtJjvlY7o3rfRu0/3hpnwoUA==", 528 | "dev": true 529 | }, 530 | "debug": { 531 | "version": "2.6.9", 532 | "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", 533 | "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", 534 | "requires": { 535 | "ms": "2.0.0" 536 | } 537 | }, 538 | "define-properties": { 539 | "version": "1.1.4", 540 | "resolved": "https://registry.npmjs.org/define-properties/-/define-properties-1.1.4.tgz", 541 | "integrity": "sha512-uckOqKcfaVvtBdsVkdPv3XjveQJsNQqmhXgRi8uhvWWuPYZCNlzT8qAyblUgNoXdHdjMTzAqeGjAoli8f+bzPA==", 542 | "dev": true, 543 | "requires": { 544 | "has-property-descriptors": "^1.0.0", 545 | "object-keys": "^1.1.1" 546 | } 547 | }, 548 | "defined": { 549 | "version": "1.0.0", 550 | "resolved": "https://registry.npmjs.org/defined/-/defined-1.0.0.tgz", 551 | "integrity": "sha512-Y2caI5+ZwS5c3RiNDJ6u53VhQHv+hHKwhkI1iHvceKUHw9Df6EK2zRLfjejRgMuCuxK7PfSWIMwWecceVvThjQ==", 552 | "dev": true 553 | }, 554 | "depd": { 555 | "version": "2.0.0", 556 | "resolved": "https://registry.npmjs.org/depd/-/depd-2.0.0.tgz", 557 | "integrity": "sha512-g7nH6P6dyDioJogAAGprGpCtVImJhpPk/roCzdb3fIh61/s/nPsfR6onyMwkCAR/OlC3yBC0lESvUoQEAssIrw==" 558 | }, 559 | "deps-sort": { 560 | "version": "2.0.1", 561 | "resolved": "https://registry.npmjs.org/deps-sort/-/deps-sort-2.0.1.tgz", 562 | "integrity": "sha512-1orqXQr5po+3KI6kQb9A4jnXT1PBwggGl2d7Sq2xsnOeI9GPcE/tGcF9UiSZtZBM7MukY4cAh7MemS6tZYipfw==", 563 | "dev": true, 564 | "requires": { 565 | "JSONStream": "^1.0.3", 566 | "shasum-object": "^1.0.0", 567 | "subarg": "^1.0.0", 568 | "through2": "^2.0.0" 569 | } 570 | }, 571 | "des.js": { 572 | "version": "1.0.1", 573 | "resolved": "https://registry.npmjs.org/des.js/-/des.js-1.0.1.tgz", 574 | "integrity": "sha512-Q0I4pfFrv2VPd34/vfLrFOoRmlYj3OV50i7fskps1jZWK1kApMWWT9G6RRUeYedLcBDIhnSDaUvJMb3AhUlaEA==", 575 | "dev": true, 576 | "requires": { 577 | "inherits": "^2.0.1", 578 | "minimalistic-assert": "^1.0.0" 579 | } 580 | }, 581 | "destroy": { 582 | "version": "1.2.0", 583 | "resolved": "https://registry.npmjs.org/destroy/-/destroy-1.2.0.tgz", 584 | "integrity": "sha512-2sJGJTaXIIaR1w4iJSNoN0hnMY7Gpc/n8D4qSCJw8QqFWXf7cuAgnEHxBpweaVcPevC2l3KpjYCx3NypQQgaJg==" 585 | }, 586 | "detective": { 587 | "version": "5.2.1", 588 | "resolved": "https://registry.npmjs.org/detective/-/detective-5.2.1.tgz", 589 | "integrity": "sha512-v9XE1zRnz1wRtgurGu0Bs8uHKFSTdteYZNbIPFVhUZ39L/S79ppMpdmVOZAnoz1jfEFodc48n6MX483Xo3t1yw==", 590 | "dev": true, 591 | "requires": { 592 | "acorn-node": "^1.8.2", 593 | "defined": "^1.0.0", 594 | "minimist": "^1.2.6" 595 | } 596 | }, 597 | "diffie-hellman": { 598 | "version": "5.0.3", 599 | "resolved": "https://registry.npmjs.org/diffie-hellman/-/diffie-hellman-5.0.3.tgz", 600 | "integrity": "sha512-kqag/Nl+f3GwyK25fhUMYj81BUOrZ9IuJsjIcDE5icNM9FJHAVm3VcUDxdLPoQtTuUylWm6ZIknYJwwaPxsUzg==", 601 | "dev": true, 602 | "requires": { 603 | "bn.js": "^4.1.0", 604 | "miller-rabin": "^4.0.0", 605 | "randombytes": "^2.0.0" 606 | }, 607 | "dependencies": { 608 | "bn.js": { 609 | "version": "4.12.0", 610 | "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-4.12.0.tgz", 611 | "integrity": "sha512-c98Bf3tPniI+scsdk237ku1Dc3ujXQTSgyiPUDEOe7tRkhrqridvh8klBv0HCEso1OLOYcHuCv/cS6DNxKH+ZA==", 612 | "dev": true 613 | } 614 | } 615 | }, 616 | "domain-browser": { 617 | "version": "1.2.0", 618 | "resolved": "https://registry.npmjs.org/domain-browser/-/domain-browser-1.2.0.tgz", 619 | "integrity": "sha512-jnjyiM6eRyZl2H+W8Q/zLMA481hzi0eszAaBUzIVnmYVDBbnLxVNnfu1HgEBvCbL+71FrxMl3E6lpKH7Ge3OXA==", 620 | "dev": true 621 | }, 622 | "duplexer2": { 623 | "version": "0.1.4", 624 | "resolved": "https://registry.npmjs.org/duplexer2/-/duplexer2-0.1.4.tgz", 625 | "integrity": "sha512-asLFVfWWtJ90ZyOUHMqk7/S2w2guQKxUI2itj3d92ADHhxUSbCMGi1f1cBcJ7xM1To+pE/Khbwo1yuNbMEPKeA==", 626 | "dev": true, 627 | "requires": { 628 | "readable-stream": "^2.0.2" 629 | } 630 | }, 631 | "ee-first": { 632 | "version": "1.1.1", 633 | "resolved": "https://registry.npmjs.org/ee-first/-/ee-first-1.1.1.tgz", 634 | "integrity": "sha512-WMwm9LhRUo+WUaRN+vRuETqG89IgZphVSNkdFgeb6sS/E4OrDIN7t48CAewSHXc6C8lefD8KKfr5vY61brQlow==" 635 | }, 636 | "elliptic": { 637 | "version": "6.5.4", 638 | "resolved": "https://registry.npmjs.org/elliptic/-/elliptic-6.5.4.tgz", 639 | "integrity": "sha512-iLhC6ULemrljPZb+QutR5TQGB+pdW6KGD5RSegS+8sorOZT+rdQFbsQFJgvN3eRqNALqJer4oQ16YvJHlU8hzQ==", 640 | "dev": true, 641 | "requires": { 642 | "bn.js": "^4.11.9", 643 | "brorand": "^1.1.0", 644 | "hash.js": "^1.0.0", 645 | "hmac-drbg": "^1.0.1", 646 | "inherits": "^2.0.4", 647 | "minimalistic-assert": "^1.0.1", 648 | "minimalistic-crypto-utils": "^1.0.1" 649 | }, 650 | "dependencies": { 651 | "bn.js": { 652 | "version": "4.12.0", 653 | "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-4.12.0.tgz", 654 | "integrity": "sha512-c98Bf3tPniI+scsdk237ku1Dc3ujXQTSgyiPUDEOe7tRkhrqridvh8klBv0HCEso1OLOYcHuCv/cS6DNxKH+ZA==", 655 | "dev": true 656 | } 657 | } 658 | }, 659 | "encodeurl": { 660 | "version": "1.0.2", 661 | "resolved": "https://registry.npmjs.org/encodeurl/-/encodeurl-1.0.2.tgz", 662 | "integrity": "sha512-TPJXq8JqFaVYm2CWmPvnP2Iyo4ZSM7/QKcSmuMLDObfpH5fi7RUGmd/rTDf+rut/saiDiQEeVTNgAmJEdAOx0w==" 663 | }, 664 | "es-abstract": { 665 | "version": "1.20.1", 666 | "resolved": "https://registry.npmjs.org/es-abstract/-/es-abstract-1.20.1.tgz", 667 | "integrity": "sha512-WEm2oBhfoI2sImeM4OF2zE2V3BYdSF+KnSi9Sidz51fQHd7+JuF8Xgcj9/0o+OWeIeIS/MiuNnlruQrJf16GQA==", 668 | "dev": true, 669 | "requires": { 670 | "call-bind": "^1.0.2", 671 | "es-to-primitive": "^1.2.1", 672 | "function-bind": "^1.1.1", 673 | "function.prototype.name": "^1.1.5", 674 | "get-intrinsic": "^1.1.1", 675 | "get-symbol-description": "^1.0.0", 676 | "has": "^1.0.3", 677 | "has-property-descriptors": "^1.0.0", 678 | "has-symbols": "^1.0.3", 679 | "internal-slot": "^1.0.3", 680 | "is-callable": "^1.2.4", 681 | "is-negative-zero": "^2.0.2", 682 | "is-regex": "^1.1.4", 683 | "is-shared-array-buffer": "^1.0.2", 684 | "is-string": "^1.0.7", 685 | "is-weakref": "^1.0.2", 686 | "object-inspect": "^1.12.0", 687 | "object-keys": "^1.1.1", 688 | "object.assign": "^4.1.2", 689 | "regexp.prototype.flags": "^1.4.3", 690 | "string.prototype.trimend": "^1.0.5", 691 | "string.prototype.trimstart": "^1.0.5", 692 | "unbox-primitive": "^1.0.2" 693 | } 694 | }, 695 | "es-to-primitive": { 696 | "version": "1.2.1", 697 | "resolved": "https://registry.npmjs.org/es-to-primitive/-/es-to-primitive-1.2.1.tgz", 698 | "integrity": "sha512-QCOllgZJtaUo9miYBcLChTUaHNjJF3PYs1VidD7AwiEj1kYxKeQTctLAezAOH5ZKRH0g2IgPn6KwB4IT8iRpvA==", 699 | "dev": true, 700 | "requires": { 701 | "is-callable": "^1.1.4", 702 | "is-date-object": "^1.0.1", 703 | "is-symbol": "^1.0.2" 704 | } 705 | }, 706 | "escape-html": { 707 | "version": "1.0.3", 708 | "resolved": "https://registry.npmjs.org/escape-html/-/escape-html-1.0.3.tgz", 709 | "integrity": "sha512-NiSupZ4OeuGwr68lGIeym/ksIZMJodUGOSCZ/FSnTxcrekbvqrgdUxlJOMpijaKZVjAJrWrGs/6Jy8OMuyj9ow==" 710 | }, 711 | "etag": { 712 | "version": "1.8.1", 713 | "resolved": "https://registry.npmjs.org/etag/-/etag-1.8.1.tgz", 714 | "integrity": "sha512-aIL5Fx7mawVa300al2BnEE4iNvo1qETxLrPI/o05L7z6go7fCw1J6EQmbK4FmJ2AS7kgVF/KEZWufBfdClMcPg==" 715 | }, 716 | "events": { 717 | "version": "3.3.0", 718 | "resolved": "https://registry.npmjs.org/events/-/events-3.3.0.tgz", 719 | "integrity": "sha512-mQw+2fkQbALzQ7V0MY0IqdnXNOeTtP4r0lN9z7AAawCXgqea7bDii20AYrIBrFd/Hx0M2Ocz6S111CaFkUcb0Q==", 720 | "dev": true 721 | }, 722 | "evp_bytestokey": { 723 | "version": "1.0.3", 724 | "resolved": "https://registry.npmjs.org/evp_bytestokey/-/evp_bytestokey-1.0.3.tgz", 725 | "integrity": "sha512-/f2Go4TognH/KvCISP7OUsHn85hT9nUkxxA9BEWxFn+Oj9o8ZNLm/40hdlgSLyuOimsrTKLUMEorQexp/aPQeA==", 726 | "dev": true, 727 | "requires": { 728 | "md5.js": "^1.3.4", 729 | "safe-buffer": "^5.1.1" 730 | } 731 | }, 732 | "express": { 733 | "version": "4.18.1", 734 | "resolved": "https://registry.npmjs.org/express/-/express-4.18.1.tgz", 735 | "integrity": "sha512-zZBcOX9TfehHQhtupq57OF8lFZ3UZi08Y97dwFCkD8p9d/d2Y3M+ykKcwaMDEL+4qyUolgBDX6AblpR3fL212Q==", 736 | "requires": { 737 | "accepts": "~1.3.8", 738 | "array-flatten": "1.1.1", 739 | "body-parser": "1.20.0", 740 | "content-disposition": "0.5.4", 741 | "content-type": "~1.0.4", 742 | "cookie": "0.5.0", 743 | "cookie-signature": "1.0.6", 744 | "debug": "2.6.9", 745 | "depd": "2.0.0", 746 | "encodeurl": "~1.0.2", 747 | "escape-html": "~1.0.3", 748 | "etag": "~1.8.1", 749 | "finalhandler": "1.2.0", 750 | "fresh": "0.5.2", 751 | "http-errors": "2.0.0", 752 | "merge-descriptors": "1.0.1", 753 | "methods": "~1.1.2", 754 | "on-finished": "2.4.1", 755 | "parseurl": "~1.3.3", 756 | "path-to-regexp": "0.1.7", 757 | "proxy-addr": "~2.0.7", 758 | "qs": "6.10.3", 759 | "range-parser": "~1.2.1", 760 | "safe-buffer": "5.2.1", 761 | "send": "0.18.0", 762 | "serve-static": "1.15.0", 763 | "setprototypeof": "1.2.0", 764 | "statuses": "2.0.1", 765 | "type-is": "~1.6.18", 766 | "utils-merge": "1.0.1", 767 | "vary": "~1.1.2" 768 | } 769 | }, 770 | "fast-safe-stringify": { 771 | "version": "2.1.1", 772 | "resolved": "https://registry.npmjs.org/fast-safe-stringify/-/fast-safe-stringify-2.1.1.tgz", 773 | "integrity": "sha512-W+KJc2dmILlPplD/H4K9l9LcAHAfPtP6BY84uVLXQ6Evcz9Lcg33Y2z1IVblT6xdY54PXYVHEv+0Wpq8Io6zkA==", 774 | "dev": true 775 | }, 776 | "finalhandler": { 777 | "version": "1.2.0", 778 | "resolved": "https://registry.npmjs.org/finalhandler/-/finalhandler-1.2.0.tgz", 779 | "integrity": "sha512-5uXcUVftlQMFnWC9qu/svkWv3GTd2PfUhK/3PLkYNAe7FbqJMt3515HaxE6eRL74GdsriiwujiawdaB1BpEISg==", 780 | "requires": { 781 | "debug": "2.6.9", 782 | "encodeurl": "~1.0.2", 783 | "escape-html": "~1.0.3", 784 | "on-finished": "2.4.1", 785 | "parseurl": "~1.3.3", 786 | "statuses": "2.0.1", 787 | "unpipe": "~1.0.0" 788 | } 789 | }, 790 | "for-each": { 791 | "version": "0.3.3", 792 | "resolved": "https://registry.npmjs.org/for-each/-/for-each-0.3.3.tgz", 793 | "integrity": "sha512-jqYfLp7mo9vIyQf8ykW2v7A+2N4QjeCeI5+Dz9XraiO1ign81wjiH7Fb9vSOWvQfNtmSa4H2RoQTrrXivdUZmw==", 794 | "dev": true, 795 | "requires": { 796 | "is-callable": "^1.1.3" 797 | } 798 | }, 799 | "forwarded": { 800 | "version": "0.2.0", 801 | "resolved": "https://registry.npmjs.org/forwarded/-/forwarded-0.2.0.tgz", 802 | "integrity": "sha512-buRG0fpBtRHSTCOASe6hD258tEubFoRLb4ZNA6NxMVHNw2gOcwHo9wyablzMzOA5z9xA9L1KNjk/Nt6MT9aYow==" 803 | }, 804 | "fresh": { 805 | "version": "0.5.2", 806 | "resolved": "https://registry.npmjs.org/fresh/-/fresh-0.5.2.tgz", 807 | "integrity": "sha512-zJ2mQYM18rEFOudeV4GShTGIQ7RbzA7ozbU9I/XBpm7kqgMywgmylMwXHxZJmkVoYkna9d2pVXVXPdYTP9ej8Q==" 808 | }, 809 | "fs.realpath": { 810 | "version": "1.0.0", 811 | "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz", 812 | "integrity": "sha512-OO0pH2lK6a0hZnAdau5ItzHPI6pUlvI7jMVnxUQRtw4owF2wk8lOSabtGDCTP4Ggrg2MbGnWO9X8K1t4+fGMDw==", 813 | "dev": true 814 | }, 815 | "function-bind": { 816 | "version": "1.1.1", 817 | "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.1.tgz", 818 | "integrity": "sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A==" 819 | }, 820 | "function.prototype.name": { 821 | "version": "1.1.5", 822 | "resolved": "https://registry.npmjs.org/function.prototype.name/-/function.prototype.name-1.1.5.tgz", 823 | "integrity": "sha512-uN7m/BzVKQnCUF/iW8jYea67v++2u7m5UgENbHRtdDVclOUP+FMPlCNdmk0h/ysGyo2tavMJEDqJAkJdRa1vMA==", 824 | "dev": true, 825 | "requires": { 826 | "call-bind": "^1.0.2", 827 | "define-properties": "^1.1.3", 828 | "es-abstract": "^1.19.0", 829 | "functions-have-names": "^1.2.2" 830 | } 831 | }, 832 | "functions-have-names": { 833 | "version": "1.2.3", 834 | "resolved": "https://registry.npmjs.org/functions-have-names/-/functions-have-names-1.2.3.tgz", 835 | "integrity": "sha512-xckBUXyTIqT97tq2x2AMb+g163b5JFysYk0x4qxNFwbfQkmNZoiRHb6sPzI9/QV33WeuvVYBUIiD4NzNIyqaRQ==", 836 | "dev": true 837 | }, 838 | "furioos-sdk": { 839 | "version": "git+https://github.com/Unity-Technologies/furioos-sdk-js.git#1beb50f6d6f8363f4e7fe2b47b72c85f86a53258", 840 | "from": "git+https://github.com/Unity-Technologies/furioos-sdk-js.git#feature/bundle-sdk" 841 | }, 842 | "get-assigned-identifiers": { 843 | "version": "1.2.0", 844 | "resolved": "https://registry.npmjs.org/get-assigned-identifiers/-/get-assigned-identifiers-1.2.0.tgz", 845 | "integrity": "sha512-mBBwmeGTrxEMO4pMaaf/uUEFHnYtwr8FTe8Y/mer4rcV/bye0qGm6pw1bGZFGStxC5O76c5ZAVBGnqHmOaJpdQ==", 846 | "dev": true 847 | }, 848 | "get-intrinsic": { 849 | "version": "1.1.2", 850 | "resolved": "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.1.2.tgz", 851 | "integrity": "sha512-Jfm3OyCxHh9DJyc28qGk+JmfkpO41A4XkneDSujN9MDXrm4oDKdHvndhZ2dN94+ERNfkYJWDclW6k2L/ZGHjXA==", 852 | "requires": { 853 | "function-bind": "^1.1.1", 854 | "has": "^1.0.3", 855 | "has-symbols": "^1.0.3" 856 | } 857 | }, 858 | "get-symbol-description": { 859 | "version": "1.0.0", 860 | "resolved": "https://registry.npmjs.org/get-symbol-description/-/get-symbol-description-1.0.0.tgz", 861 | "integrity": "sha512-2EmdH1YvIQiZpltCNgkuiUnyukzxM/R6NDJX31Ke3BG1Nq5b0S2PhX59UKi9vZpPDQVdqn+1IcaAwnzTT5vCjw==", 862 | "dev": true, 863 | "requires": { 864 | "call-bind": "^1.0.2", 865 | "get-intrinsic": "^1.1.1" 866 | } 867 | }, 868 | "glob": { 869 | "version": "7.2.3", 870 | "resolved": "https://registry.npmjs.org/glob/-/glob-7.2.3.tgz", 871 | "integrity": "sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==", 872 | "dev": true, 873 | "requires": { 874 | "fs.realpath": "^1.0.0", 875 | "inflight": "^1.0.4", 876 | "inherits": "2", 877 | "minimatch": "^3.1.1", 878 | "once": "^1.3.0", 879 | "path-is-absolute": "^1.0.0" 880 | } 881 | }, 882 | "has": { 883 | "version": "1.0.3", 884 | "resolved": "https://registry.npmjs.org/has/-/has-1.0.3.tgz", 885 | "integrity": "sha512-f2dvO0VU6Oej7RkWJGrehjbzMAjFp5/VKPp5tTpWIV4JHHZK1/BxbFRtf/siA2SWTe09caDmVtYYzWEIbBS4zw==", 886 | "requires": { 887 | "function-bind": "^1.1.1" 888 | } 889 | }, 890 | "has-bigints": { 891 | "version": "1.0.2", 892 | "resolved": "https://registry.npmjs.org/has-bigints/-/has-bigints-1.0.2.tgz", 893 | "integrity": "sha512-tSvCKtBr9lkF0Ex0aQiP9N+OpV4zi2r/Nee5VkRDbaqv35RLYMzbwQfFSZZH0kR+Rd6302UJZ2p/bJCEoR3VoQ==", 894 | "dev": true 895 | }, 896 | "has-property-descriptors": { 897 | "version": "1.0.0", 898 | "resolved": "https://registry.npmjs.org/has-property-descriptors/-/has-property-descriptors-1.0.0.tgz", 899 | "integrity": "sha512-62DVLZGoiEBDHQyqG4w9xCuZ7eJEwNmJRWw2VY84Oedb7WFcA27fiEVe8oUQx9hAUJ4ekurquucTGwsyO1XGdQ==", 900 | "dev": true, 901 | "requires": { 902 | "get-intrinsic": "^1.1.1" 903 | } 904 | }, 905 | "has-symbols": { 906 | "version": "1.0.3", 907 | "resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.0.3.tgz", 908 | "integrity": "sha512-l3LCuF6MgDNwTDKkdYGEihYjt5pRPbEg46rtlmnSPlUbgmB8LOIrKJbYYFBSbnPaJexMKtiPO8hmeRjRz2Td+A==" 909 | }, 910 | "has-tostringtag": { 911 | "version": "1.0.0", 912 | "resolved": "https://registry.npmjs.org/has-tostringtag/-/has-tostringtag-1.0.0.tgz", 913 | "integrity": "sha512-kFjcSNhnlGV1kyoGk7OXKSawH5JOb/LzUc5w9B02hOTO0dfFRjbHQKvg1d6cf3HbeUmtU9VbbV3qzZ2Teh97WQ==", 914 | "dev": true, 915 | "requires": { 916 | "has-symbols": "^1.0.2" 917 | } 918 | }, 919 | "hash-base": { 920 | "version": "3.1.0", 921 | "resolved": "https://registry.npmjs.org/hash-base/-/hash-base-3.1.0.tgz", 922 | "integrity": "sha512-1nmYp/rhMDiE7AYkDw+lLwlAzz0AntGIe51F3RfFfEqyQ3feY2eI/NcwC6umIQVOASPMsWJLJScWKSSvzL9IVA==", 923 | "dev": true, 924 | "requires": { 925 | "inherits": "^2.0.4", 926 | "readable-stream": "^3.6.0", 927 | "safe-buffer": "^5.2.0" 928 | }, 929 | "dependencies": { 930 | "readable-stream": { 931 | "version": "3.6.0", 932 | "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.0.tgz", 933 | "integrity": "sha512-BViHy7LKeTz4oNnkcLJ+lVSL6vpiFeX6/d3oSH8zCW7UxP2onchk+vTGB143xuFjHS3deTgkKoXXymXqymiIdA==", 934 | "dev": true, 935 | "requires": { 936 | "inherits": "^2.0.3", 937 | "string_decoder": "^1.1.1", 938 | "util-deprecate": "^1.0.1" 939 | } 940 | } 941 | } 942 | }, 943 | "hash.js": { 944 | "version": "1.1.7", 945 | "resolved": "https://registry.npmjs.org/hash.js/-/hash.js-1.1.7.tgz", 946 | "integrity": "sha512-taOaskGt4z4SOANNseOviYDvjEJinIkRgmp7LbKP2YTTmVxWBl87s/uzK9r+44BclBSp2X7K1hqeNfz9JbBeXA==", 947 | "dev": true, 948 | "requires": { 949 | "inherits": "^2.0.3", 950 | "minimalistic-assert": "^1.0.1" 951 | } 952 | }, 953 | "hmac-drbg": { 954 | "version": "1.0.1", 955 | "resolved": "https://registry.npmjs.org/hmac-drbg/-/hmac-drbg-1.0.1.tgz", 956 | "integrity": "sha512-Tti3gMqLdZfhOQY1Mzf/AanLiqh1WTiJgEj26ZuYQ9fbkLomzGchCws4FyrSd4VkpBfiNhaE1On+lOz894jvXg==", 957 | "dev": true, 958 | "requires": { 959 | "hash.js": "^1.0.3", 960 | "minimalistic-assert": "^1.0.0", 961 | "minimalistic-crypto-utils": "^1.0.1" 962 | } 963 | }, 964 | "htmlescape": { 965 | "version": "1.1.1", 966 | "resolved": "https://registry.npmjs.org/htmlescape/-/htmlescape-1.1.1.tgz", 967 | "integrity": "sha512-eVcrzgbR4tim7c7soKQKtxa/kQM4TzjnlU83rcZ9bHU6t31ehfV7SktN6McWgwPWg+JYMA/O3qpGxBvFq1z2Jg==", 968 | "dev": true 969 | }, 970 | "http-errors": { 971 | "version": "2.0.0", 972 | "resolved": "https://registry.npmjs.org/http-errors/-/http-errors-2.0.0.tgz", 973 | "integrity": "sha512-FtwrG/euBzaEjYeRqOgly7G0qviiXoJWnvEH2Z1plBdXgbyjv34pHTSb9zoeHMyDy33+DWy5Wt9Wo+TURtOYSQ==", 974 | "requires": { 975 | "depd": "2.0.0", 976 | "inherits": "2.0.4", 977 | "setprototypeof": "1.2.0", 978 | "statuses": "2.0.1", 979 | "toidentifier": "1.0.1" 980 | } 981 | }, 982 | "https-browserify": { 983 | "version": "1.0.0", 984 | "resolved": "https://registry.npmjs.org/https-browserify/-/https-browserify-1.0.0.tgz", 985 | "integrity": "sha512-J+FkSdyD+0mA0N+81tMotaRMfSL9SGi+xpD3T6YApKsc3bGSXJlfXri3VyFOeYkfLRQisDk1W+jIFFKBeUBbBg==", 986 | "dev": true 987 | }, 988 | "iconv-lite": { 989 | "version": "0.4.24", 990 | "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.4.24.tgz", 991 | "integrity": "sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA==", 992 | "requires": { 993 | "safer-buffer": ">= 2.1.2 < 3" 994 | } 995 | }, 996 | "ieee754": { 997 | "version": "1.2.1", 998 | "resolved": "https://registry.npmjs.org/ieee754/-/ieee754-1.2.1.tgz", 999 | "integrity": "sha512-dcyqhDvX1C46lXZcVqCpK+FtMRQVdIMN6/Df5js2zouUsqG7I6sFxitIC+7KYK29KdXOLHdu9zL4sFnoVQnqaA==", 1000 | "dev": true 1001 | }, 1002 | "inflight": { 1003 | "version": "1.0.6", 1004 | "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz", 1005 | "integrity": "sha512-k92I/b08q4wvFscXCLvqfsHCrjrF7yiXsQuIVvVE7N82W3+aqpzuUdBbfhWcy/FZR3/4IgflMgKLOsvPDrGCJA==", 1006 | "dev": true, 1007 | "requires": { 1008 | "once": "^1.3.0", 1009 | "wrappy": "1" 1010 | } 1011 | }, 1012 | "inherits": { 1013 | "version": "2.0.4", 1014 | "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz", 1015 | "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==" 1016 | }, 1017 | "inline-source-map": { 1018 | "version": "0.6.2", 1019 | "resolved": "https://registry.npmjs.org/inline-source-map/-/inline-source-map-0.6.2.tgz", 1020 | "integrity": "sha512-0mVWSSbNDvedDWIN4wxLsdPM4a7cIPcpyMxj3QZ406QRwQ6ePGB1YIHxVPjqpcUGbWQ5C+nHTwGNWAGvt7ggVA==", 1021 | "dev": true, 1022 | "requires": { 1023 | "source-map": "~0.5.3" 1024 | } 1025 | }, 1026 | "insert-module-globals": { 1027 | "version": "7.2.1", 1028 | "resolved": "https://registry.npmjs.org/insert-module-globals/-/insert-module-globals-7.2.1.tgz", 1029 | "integrity": "sha512-ufS5Qq9RZN+Bu899eA9QCAYThY+gGW7oRkmb0vC93Vlyu/CFGcH0OYPEjVkDXA5FEbTt1+VWzdoOD3Ny9N+8tg==", 1030 | "dev": true, 1031 | "requires": { 1032 | "JSONStream": "^1.0.3", 1033 | "acorn-node": "^1.5.2", 1034 | "combine-source-map": "^0.8.0", 1035 | "concat-stream": "^1.6.1", 1036 | "is-buffer": "^1.1.0", 1037 | "path-is-absolute": "^1.0.1", 1038 | "process": "~0.11.0", 1039 | "through2": "^2.0.0", 1040 | "undeclared-identifiers": "^1.1.2", 1041 | "xtend": "^4.0.0" 1042 | } 1043 | }, 1044 | "internal-slot": { 1045 | "version": "1.0.3", 1046 | "resolved": "https://registry.npmjs.org/internal-slot/-/internal-slot-1.0.3.tgz", 1047 | "integrity": "sha512-O0DB1JC/sPyZl7cIo78n5dR7eUSwwpYPiXRhTzNxZVAMUuB8vlnRFyLxdrVToks6XPLVnFfbzaVd5WLjhgg+vA==", 1048 | "dev": true, 1049 | "requires": { 1050 | "get-intrinsic": "^1.1.0", 1051 | "has": "^1.0.3", 1052 | "side-channel": "^1.0.4" 1053 | } 1054 | }, 1055 | "ipaddr.js": { 1056 | "version": "1.9.1", 1057 | "resolved": "https://registry.npmjs.org/ipaddr.js/-/ipaddr.js-1.9.1.tgz", 1058 | "integrity": "sha512-0KI/607xoxSToH7GjN1FfSbLoU0+btTicjsQSWQlh/hZykN8KpmMf7uYwPW3R+akZ6R/w18ZlXSHBYXiYUPO3g==" 1059 | }, 1060 | "is-arguments": { 1061 | "version": "1.1.1", 1062 | "resolved": "https://registry.npmjs.org/is-arguments/-/is-arguments-1.1.1.tgz", 1063 | "integrity": "sha512-8Q7EARjzEnKpt/PCD7e1cgUS0a6X8u5tdSiMqXhojOdoV9TsMsiO+9VLC5vAmO8N7/GmXn7yjR8qnA6bVAEzfA==", 1064 | "dev": true, 1065 | "requires": { 1066 | "call-bind": "^1.0.2", 1067 | "has-tostringtag": "^1.0.0" 1068 | } 1069 | }, 1070 | "is-bigint": { 1071 | "version": "1.0.4", 1072 | "resolved": "https://registry.npmjs.org/is-bigint/-/is-bigint-1.0.4.tgz", 1073 | "integrity": "sha512-zB9CruMamjym81i2JZ3UMn54PKGsQzsJeo6xvN3HJJ4CAsQNB6iRutp2To77OfCNuoxspsIhzaPoO1zyCEhFOg==", 1074 | "dev": true, 1075 | "requires": { 1076 | "has-bigints": "^1.0.1" 1077 | } 1078 | }, 1079 | "is-boolean-object": { 1080 | "version": "1.1.2", 1081 | "resolved": "https://registry.npmjs.org/is-boolean-object/-/is-boolean-object-1.1.2.tgz", 1082 | "integrity": "sha512-gDYaKHJmnj4aWxyj6YHyXVpdQawtVLHU5cb+eztPGczf6cjuTdwve5ZIEfgXqH4e57An1D1AKf8CZ3kYrQRqYA==", 1083 | "dev": true, 1084 | "requires": { 1085 | "call-bind": "^1.0.2", 1086 | "has-tostringtag": "^1.0.0" 1087 | } 1088 | }, 1089 | "is-buffer": { 1090 | "version": "1.1.6", 1091 | "resolved": "https://registry.npmjs.org/is-buffer/-/is-buffer-1.1.6.tgz", 1092 | "integrity": "sha512-NcdALwpXkTm5Zvvbk7owOUSvVvBKDgKP5/ewfXEznmQFfs4ZRmanOeKBTjRVjka3QFoN6XJ+9F3USqfHqTaU5w==", 1093 | "dev": true 1094 | }, 1095 | "is-callable": { 1096 | "version": "1.2.4", 1097 | "resolved": "https://registry.npmjs.org/is-callable/-/is-callable-1.2.4.tgz", 1098 | "integrity": "sha512-nsuwtxZfMX67Oryl9LCQ+upnC0Z0BgpwntpS89m1H/TLF0zNfzfLMV/9Wa/6MZsj0acpEjAO0KF1xT6ZdLl95w==", 1099 | "dev": true 1100 | }, 1101 | "is-core-module": { 1102 | "version": "2.9.0", 1103 | "resolved": "https://registry.npmjs.org/is-core-module/-/is-core-module-2.9.0.tgz", 1104 | "integrity": "sha512-+5FPy5PnwmO3lvfMb0AsoPaBG+5KHUI0wYFXOtYPnVVVspTFUuMZNfNaNVRt3FZadstu2c8x23vykRW/NBoU6A==", 1105 | "dev": true, 1106 | "requires": { 1107 | "has": "^1.0.3" 1108 | } 1109 | }, 1110 | "is-date-object": { 1111 | "version": "1.0.5", 1112 | "resolved": "https://registry.npmjs.org/is-date-object/-/is-date-object-1.0.5.tgz", 1113 | "integrity": "sha512-9YQaSxsAiSwcvS33MBk3wTCVnWK+HhF8VZR2jRxehM16QcVOdHqPn4VPHmRK4lSr38n9JriurInLcP90xsYNfQ==", 1114 | "dev": true, 1115 | "requires": { 1116 | "has-tostringtag": "^1.0.0" 1117 | } 1118 | }, 1119 | "is-generator-function": { 1120 | "version": "1.0.10", 1121 | "resolved": "https://registry.npmjs.org/is-generator-function/-/is-generator-function-1.0.10.tgz", 1122 | "integrity": "sha512-jsEjy9l3yiXEQ+PsXdmBwEPcOxaXWLspKdplFUVI9vq1iZgIekeC0L167qeu86czQaxed3q/Uzuw0swL0irL8A==", 1123 | "dev": true, 1124 | "requires": { 1125 | "has-tostringtag": "^1.0.0" 1126 | } 1127 | }, 1128 | "is-negative-zero": { 1129 | "version": "2.0.2", 1130 | "resolved": "https://registry.npmjs.org/is-negative-zero/-/is-negative-zero-2.0.2.tgz", 1131 | "integrity": "sha512-dqJvarLawXsFbNDeJW7zAz8ItJ9cd28YufuuFzh0G8pNHjJMnY08Dv7sYX2uF5UpQOwieAeOExEYAWWfu7ZZUA==", 1132 | "dev": true 1133 | }, 1134 | "is-number-object": { 1135 | "version": "1.0.7", 1136 | "resolved": "https://registry.npmjs.org/is-number-object/-/is-number-object-1.0.7.tgz", 1137 | "integrity": "sha512-k1U0IRzLMo7ZlYIfzRu23Oh6MiIFasgpb9X76eqfFZAqwH44UI4KTBvBYIZ1dSL9ZzChTB9ShHfLkR4pdW5krQ==", 1138 | "dev": true, 1139 | "requires": { 1140 | "has-tostringtag": "^1.0.0" 1141 | } 1142 | }, 1143 | "is-regex": { 1144 | "version": "1.1.4", 1145 | "resolved": "https://registry.npmjs.org/is-regex/-/is-regex-1.1.4.tgz", 1146 | "integrity": "sha512-kvRdxDsxZjhzUX07ZnLydzS1TU/TJlTUHHY4YLL87e37oUA49DfkLqgy+VjFocowy29cKvcSiu+kIv728jTTVg==", 1147 | "dev": true, 1148 | "requires": { 1149 | "call-bind": "^1.0.2", 1150 | "has-tostringtag": "^1.0.0" 1151 | } 1152 | }, 1153 | "is-shared-array-buffer": { 1154 | "version": "1.0.2", 1155 | "resolved": "https://registry.npmjs.org/is-shared-array-buffer/-/is-shared-array-buffer-1.0.2.tgz", 1156 | "integrity": "sha512-sqN2UDu1/0y6uvXyStCOzyhAjCSlHceFoMKJW8W9EU9cvic/QdsZ0kEU93HEy3IUEFZIiH/3w+AH/UQbPHNdhA==", 1157 | "dev": true, 1158 | "requires": { 1159 | "call-bind": "^1.0.2" 1160 | } 1161 | }, 1162 | "is-string": { 1163 | "version": "1.0.7", 1164 | "resolved": "https://registry.npmjs.org/is-string/-/is-string-1.0.7.tgz", 1165 | "integrity": "sha512-tE2UXzivje6ofPW7l23cjDOMa09gb7xlAqG6jG5ej6uPV32TlWP3NKPigtaGeHNu9fohccRYvIiZMfOOnOYUtg==", 1166 | "dev": true, 1167 | "requires": { 1168 | "has-tostringtag": "^1.0.0" 1169 | } 1170 | }, 1171 | "is-symbol": { 1172 | "version": "1.0.4", 1173 | "resolved": "https://registry.npmjs.org/is-symbol/-/is-symbol-1.0.4.tgz", 1174 | "integrity": "sha512-C/CPBqKWnvdcxqIARxyOh4v1UUEOCHpgDa0WYgpKDFMszcrPcffg5uhwSgPCLD2WWxmq6isisz87tzT01tuGhg==", 1175 | "dev": true, 1176 | "requires": { 1177 | "has-symbols": "^1.0.2" 1178 | } 1179 | }, 1180 | "is-typed-array": { 1181 | "version": "1.1.9", 1182 | "resolved": "https://registry.npmjs.org/is-typed-array/-/is-typed-array-1.1.9.tgz", 1183 | "integrity": "sha512-kfrlnTTn8pZkfpJMUgYD7YZ3qzeJgWUn8XfVYBARc4wnmNOmLbmuuaAs3q5fvB0UJOn6yHAKaGTPM7d6ezoD/A==", 1184 | "dev": true, 1185 | "requires": { 1186 | "available-typed-arrays": "^1.0.5", 1187 | "call-bind": "^1.0.2", 1188 | "es-abstract": "^1.20.0", 1189 | "for-each": "^0.3.3", 1190 | "has-tostringtag": "^1.0.0" 1191 | } 1192 | }, 1193 | "is-weakref": { 1194 | "version": "1.0.2", 1195 | "resolved": "https://registry.npmjs.org/is-weakref/-/is-weakref-1.0.2.tgz", 1196 | "integrity": "sha512-qctsuLZmIQ0+vSSMfoVvyFe2+GSEvnmZ2ezTup1SBse9+twCCeial6EEi3Nc2KFcf6+qz2FBPnjXsk8xhKSaPQ==", 1197 | "dev": true, 1198 | "requires": { 1199 | "call-bind": "^1.0.2" 1200 | } 1201 | }, 1202 | "isarray": { 1203 | "version": "1.0.0", 1204 | "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", 1205 | "integrity": "sha512-VLghIWNM6ELQzo7zwmcg0NmTVyWKYjvIeM83yjp0wRDTmUnrM678fQbcKBo6n2CJEF0szoG//ytg+TKla89ALQ==", 1206 | "dev": true 1207 | }, 1208 | "jsonparse": { 1209 | "version": "1.3.1", 1210 | "resolved": "https://registry.npmjs.org/jsonparse/-/jsonparse-1.3.1.tgz", 1211 | "integrity": "sha512-POQXvpdL69+CluYsillJ7SUhKvytYjW9vG/GKpnf+xP8UWgYEM/RaMzHHofbALDiKbbP1W8UEYmgGl39WkPZsg==", 1212 | "dev": true 1213 | }, 1214 | "labeled-stream-splicer": { 1215 | "version": "2.0.2", 1216 | "resolved": "https://registry.npmjs.org/labeled-stream-splicer/-/labeled-stream-splicer-2.0.2.tgz", 1217 | "integrity": "sha512-Ca4LSXFFZUjPScRaqOcFxneA0VpKZr4MMYCljyQr4LIewTLb3Y0IUTIsnBBsVubIeEfxeSZpSjSsRM8APEQaAw==", 1218 | "dev": true, 1219 | "requires": { 1220 | "inherits": "^2.0.1", 1221 | "stream-splicer": "^2.0.0" 1222 | } 1223 | }, 1224 | "lodash.memoize": { 1225 | "version": "3.0.4", 1226 | "resolved": "https://registry.npmjs.org/lodash.memoize/-/lodash.memoize-3.0.4.tgz", 1227 | "integrity": "sha512-eDn9kqrAmVUC1wmZvlQ6Uhde44n+tXpqPrN8olQJbttgh0oKclk+SF54P47VEGE9CEiMeRwAP8BaM7UHvBkz2A==", 1228 | "dev": true 1229 | }, 1230 | "md5.js": { 1231 | "version": "1.3.5", 1232 | "resolved": "https://registry.npmjs.org/md5.js/-/md5.js-1.3.5.tgz", 1233 | "integrity": "sha512-xitP+WxNPcTTOgnTJcrhM0xvdPepipPSf3I8EIpGKeFLjt3PlJLIDG3u8EX53ZIubkb+5U2+3rELYpEhHhzdkg==", 1234 | "dev": true, 1235 | "requires": { 1236 | "hash-base": "^3.0.0", 1237 | "inherits": "^2.0.1", 1238 | "safe-buffer": "^5.1.2" 1239 | } 1240 | }, 1241 | "media-typer": { 1242 | "version": "0.3.0", 1243 | "resolved": "https://registry.npmjs.org/media-typer/-/media-typer-0.3.0.tgz", 1244 | "integrity": "sha512-dq+qelQ9akHpcOl/gUVRTxVIOkAJ1wR3QAvb4RsVjS8oVoFjDGTc679wJYmUmknUF5HwMLOgb5O+a3KxfWapPQ==" 1245 | }, 1246 | "merge-descriptors": { 1247 | "version": "1.0.1", 1248 | "resolved": "https://registry.npmjs.org/merge-descriptors/-/merge-descriptors-1.0.1.tgz", 1249 | "integrity": "sha512-cCi6g3/Zr1iqQi6ySbseM1Xvooa98N0w31jzUYrXPX2xqObmFGHJ0tQ5u74H3mVh7wLouTseZyYIq39g8cNp1w==" 1250 | }, 1251 | "methods": { 1252 | "version": "1.1.2", 1253 | "resolved": "https://registry.npmjs.org/methods/-/methods-1.1.2.tgz", 1254 | "integrity": "sha512-iclAHeNqNm68zFtnZ0e+1L2yUIdvzNoauKU4WBA3VvH/vPFieF7qfRlwUZU+DA9P9bPXIS90ulxoUoCH23sV2w==" 1255 | }, 1256 | "miller-rabin": { 1257 | "version": "4.0.1", 1258 | "resolved": "https://registry.npmjs.org/miller-rabin/-/miller-rabin-4.0.1.tgz", 1259 | "integrity": "sha512-115fLhvZVqWwHPbClyntxEVfVDfl9DLLTuJvq3g2O/Oxi8AiNouAHvDSzHS0viUJc+V5vm3eq91Xwqn9dp4jRA==", 1260 | "dev": true, 1261 | "requires": { 1262 | "bn.js": "^4.0.0", 1263 | "brorand": "^1.0.1" 1264 | }, 1265 | "dependencies": { 1266 | "bn.js": { 1267 | "version": "4.12.0", 1268 | "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-4.12.0.tgz", 1269 | "integrity": "sha512-c98Bf3tPniI+scsdk237ku1Dc3ujXQTSgyiPUDEOe7tRkhrqridvh8klBv0HCEso1OLOYcHuCv/cS6DNxKH+ZA==", 1270 | "dev": true 1271 | } 1272 | } 1273 | }, 1274 | "mime": { 1275 | "version": "1.6.0", 1276 | "resolved": "https://registry.npmjs.org/mime/-/mime-1.6.0.tgz", 1277 | "integrity": "sha512-x0Vn8spI+wuJ1O6S7gnbaQg8Pxh4NNHb7KSINmEWKiPE4RKOplvijn+NkmYmmRgP68mc70j2EbeTFRsrswaQeg==" 1278 | }, 1279 | "mime-db": { 1280 | "version": "1.52.0", 1281 | "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.52.0.tgz", 1282 | "integrity": "sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg==" 1283 | }, 1284 | "mime-types": { 1285 | "version": "2.1.35", 1286 | "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.35.tgz", 1287 | "integrity": "sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw==", 1288 | "requires": { 1289 | "mime-db": "1.52.0" 1290 | } 1291 | }, 1292 | "minimalistic-assert": { 1293 | "version": "1.0.1", 1294 | "resolved": "https://registry.npmjs.org/minimalistic-assert/-/minimalistic-assert-1.0.1.tgz", 1295 | "integrity": "sha512-UtJcAD4yEaGtjPezWuO9wC4nwUnVH/8/Im3yEHQP4b67cXlD/Qr9hdITCU1xDbSEXg2XKNaP8jsReV7vQd00/A==", 1296 | "dev": true 1297 | }, 1298 | "minimalistic-crypto-utils": { 1299 | "version": "1.0.1", 1300 | "resolved": "https://registry.npmjs.org/minimalistic-crypto-utils/-/minimalistic-crypto-utils-1.0.1.tgz", 1301 | "integrity": "sha512-JIYlbt6g8i5jKfJ3xz7rF0LXmv2TkDxBLUkiBeZ7bAx4GnnNMr8xFpGnOxn6GhTEHx3SjRrZEoU+j04prX1ktg==", 1302 | "dev": true 1303 | }, 1304 | "minimatch": { 1305 | "version": "3.1.2", 1306 | "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", 1307 | "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", 1308 | "dev": true, 1309 | "requires": { 1310 | "brace-expansion": "^1.1.7" 1311 | } 1312 | }, 1313 | "minimist": { 1314 | "version": "1.2.6", 1315 | "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.6.tgz", 1316 | "integrity": "sha512-Jsjnk4bw3YJqYzbdyBiNsPWHPfO++UGG749Cxs6peCu5Xg4nrena6OVxOYxrQTqww0Jmwt+Ref8rggumkTLz9Q==", 1317 | "dev": true 1318 | }, 1319 | "mkdirp-classic": { 1320 | "version": "0.5.3", 1321 | "resolved": "https://registry.npmjs.org/mkdirp-classic/-/mkdirp-classic-0.5.3.tgz", 1322 | "integrity": "sha512-gKLcREMhtuZRwRAfqP3RFW+TK4JqApVBtOIftVgjuABpAtpxhPGaDcfvbhNvD0B8iD1oUr/txX35NjcaY6Ns/A==", 1323 | "dev": true 1324 | }, 1325 | "module-deps": { 1326 | "version": "6.2.3", 1327 | "resolved": "https://registry.npmjs.org/module-deps/-/module-deps-6.2.3.tgz", 1328 | "integrity": "sha512-fg7OZaQBcL4/L+AK5f4iVqf9OMbCclXfy/znXRxTVhJSeW5AIlS9AwheYwDaXM3lVW7OBeaeUEY3gbaC6cLlSA==", 1329 | "dev": true, 1330 | "requires": { 1331 | "JSONStream": "^1.0.3", 1332 | "browser-resolve": "^2.0.0", 1333 | "cached-path-relative": "^1.0.2", 1334 | "concat-stream": "~1.6.0", 1335 | "defined": "^1.0.0", 1336 | "detective": "^5.2.0", 1337 | "duplexer2": "^0.1.2", 1338 | "inherits": "^2.0.1", 1339 | "parents": "^1.0.0", 1340 | "readable-stream": "^2.0.2", 1341 | "resolve": "^1.4.0", 1342 | "stream-combiner2": "^1.1.1", 1343 | "subarg": "^1.0.0", 1344 | "through2": "^2.0.0", 1345 | "xtend": "^4.0.0" 1346 | } 1347 | }, 1348 | "ms": { 1349 | "version": "2.0.0", 1350 | "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", 1351 | "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==" 1352 | }, 1353 | "negotiator": { 1354 | "version": "0.6.3", 1355 | "resolved": "https://registry.npmjs.org/negotiator/-/negotiator-0.6.3.tgz", 1356 | "integrity": "sha512-+EUsqGPLsM+j/zdChZjsnX51g4XrHFOIXwfnCVPGlQk/k5giakcKsuxCObBRu6DSm9opw/O6slWbJdghQM4bBg==" 1357 | }, 1358 | "object-assign": { 1359 | "version": "4.1.1", 1360 | "resolved": "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz", 1361 | "integrity": "sha512-rJgTQnkUnH1sFw8yT6VSU3zD3sWmu6sZhIseY8VX+GRu3P6F7Fu+JNDoXfklElbLJSnc3FUQHVe4cU5hj+BcUg==", 1362 | "dev": true 1363 | }, 1364 | "object-inspect": { 1365 | "version": "1.12.2", 1366 | "resolved": "https://registry.npmjs.org/object-inspect/-/object-inspect-1.12.2.tgz", 1367 | "integrity": "sha512-z+cPxW0QGUp0mcqcsgQyLVRDoXFQbXOwBaqyF7VIgI4TWNQsDHrBpUQslRmIfAoYWdYzs6UlKJtB2XJpTaNSpQ==" 1368 | }, 1369 | "object-keys": { 1370 | "version": "1.1.1", 1371 | "resolved": "https://registry.npmjs.org/object-keys/-/object-keys-1.1.1.tgz", 1372 | "integrity": "sha512-NuAESUOUMrlIXOfHKzD6bpPu3tYt3xvjNdRIQ+FeT0lNb4K8WR70CaDxhuNguS2XG+GjkyMwOzsN5ZktImfhLA==", 1373 | "dev": true 1374 | }, 1375 | "object.assign": { 1376 | "version": "4.1.2", 1377 | "resolved": "https://registry.npmjs.org/object.assign/-/object.assign-4.1.2.tgz", 1378 | "integrity": "sha512-ixT2L5THXsApyiUPYKmW+2EHpXXe5Ii3M+f4e+aJFAHao5amFRW6J0OO6c/LU8Be47utCx2GL89hxGB6XSmKuQ==", 1379 | "dev": true, 1380 | "requires": { 1381 | "call-bind": "^1.0.0", 1382 | "define-properties": "^1.1.3", 1383 | "has-symbols": "^1.0.1", 1384 | "object-keys": "^1.1.1" 1385 | } 1386 | }, 1387 | "on-finished": { 1388 | "version": "2.4.1", 1389 | "resolved": "https://registry.npmjs.org/on-finished/-/on-finished-2.4.1.tgz", 1390 | "integrity": "sha512-oVlzkg3ENAhCk2zdv7IJwd/QUD4z2RxRwpkcGY8psCVcCYZNq4wYnVWALHM+brtuJjePWiYF/ClmuDr8Ch5+kg==", 1391 | "requires": { 1392 | "ee-first": "1.1.1" 1393 | } 1394 | }, 1395 | "once": { 1396 | "version": "1.4.0", 1397 | "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz", 1398 | "integrity": "sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w==", 1399 | "dev": true, 1400 | "requires": { 1401 | "wrappy": "1" 1402 | } 1403 | }, 1404 | "os-browserify": { 1405 | "version": "0.3.0", 1406 | "resolved": "https://registry.npmjs.org/os-browserify/-/os-browserify-0.3.0.tgz", 1407 | "integrity": "sha512-gjcpUc3clBf9+210TRaDWbf+rZZZEshZ+DlXMRCeAjp0xhTrnQsKHypIy1J3d5hKdUzj69t708EHtU8P6bUn0A==", 1408 | "dev": true 1409 | }, 1410 | "pako": { 1411 | "version": "1.0.11", 1412 | "resolved": "https://registry.npmjs.org/pako/-/pako-1.0.11.tgz", 1413 | "integrity": "sha512-4hLB8Py4zZce5s4yd9XzopqwVv/yGNhV1Bl8NTmCq1763HeK2+EwVTv+leGeL13Dnh2wfbqowVPXCIO0z4taYw==", 1414 | "dev": true 1415 | }, 1416 | "parents": { 1417 | "version": "1.0.1", 1418 | "resolved": "https://registry.npmjs.org/parents/-/parents-1.0.1.tgz", 1419 | "integrity": "sha512-mXKF3xkoUt5td2DoxpLmtOmZvko9VfFpwRwkKDHSNvgmpLAeBo18YDhcPbBzJq+QLCHMbGOfzia2cX4U+0v9Mg==", 1420 | "dev": true, 1421 | "requires": { 1422 | "path-platform": "~0.11.15" 1423 | } 1424 | }, 1425 | "parse-asn1": { 1426 | "version": "5.1.6", 1427 | "resolved": "https://registry.npmjs.org/parse-asn1/-/parse-asn1-5.1.6.tgz", 1428 | "integrity": "sha512-RnZRo1EPU6JBnra2vGHj0yhp6ebyjBZpmUCLHWiFhxlzvBCCpAuZ7elsBp1PVAbQN0/04VD/19rfzlBSwLstMw==", 1429 | "dev": true, 1430 | "requires": { 1431 | "asn1.js": "^5.2.0", 1432 | "browserify-aes": "^1.0.0", 1433 | "evp_bytestokey": "^1.0.0", 1434 | "pbkdf2": "^3.0.3", 1435 | "safe-buffer": "^5.1.1" 1436 | } 1437 | }, 1438 | "parseurl": { 1439 | "version": "1.3.3", 1440 | "resolved": "https://registry.npmjs.org/parseurl/-/parseurl-1.3.3.tgz", 1441 | "integrity": "sha512-CiyeOxFT/JZyN5m0z9PfXw4SCBJ6Sygz1Dpl0wqjlhDEGGBP1GnsUVEL0p63hoG1fcj3fHynXi9NYO4nWOL+qQ==" 1442 | }, 1443 | "path-browserify": { 1444 | "version": "1.0.1", 1445 | "resolved": "https://registry.npmjs.org/path-browserify/-/path-browserify-1.0.1.tgz", 1446 | "integrity": "sha512-b7uo2UCUOYZcnF/3ID0lulOJi/bafxa1xPe7ZPsammBSpjSWQkjNxlt635YGS2MiR9GjvuXCtz2emr3jbsz98g==", 1447 | "dev": true 1448 | }, 1449 | "path-is-absolute": { 1450 | "version": "1.0.1", 1451 | "resolved": "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz", 1452 | "integrity": "sha512-AVbw3UJ2e9bq64vSaS9Am0fje1Pa8pbGqTTsmXfaIiMpnr5DlDhfJOuLj9Sf95ZPVDAUerDfEk88MPmPe7UCQg==", 1453 | "dev": true 1454 | }, 1455 | "path-parse": { 1456 | "version": "1.0.7", 1457 | "resolved": "https://registry.npmjs.org/path-parse/-/path-parse-1.0.7.tgz", 1458 | "integrity": "sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw==", 1459 | "dev": true 1460 | }, 1461 | "path-platform": { 1462 | "version": "0.11.15", 1463 | "resolved": "https://registry.npmjs.org/path-platform/-/path-platform-0.11.15.tgz", 1464 | "integrity": "sha512-Y30dB6rab1A/nfEKsZxmr01nUotHX0c/ZiIAsCTatEe1CmS5Pm5He7fZ195bPT7RdquoaL8lLxFCMQi/bS7IJg==", 1465 | "dev": true 1466 | }, 1467 | "path-to-regexp": { 1468 | "version": "0.1.7", 1469 | "resolved": "https://registry.npmjs.org/path-to-regexp/-/path-to-regexp-0.1.7.tgz", 1470 | "integrity": "sha512-5DFkuoqlv1uYQKxy8omFBeJPQcdoE07Kv2sferDCrAq1ohOU+MSDswDIbnx3YAM60qIOnYa53wBhXW0EbMonrQ==" 1471 | }, 1472 | "pbkdf2": { 1473 | "version": "3.1.2", 1474 | "resolved": "https://registry.npmjs.org/pbkdf2/-/pbkdf2-3.1.2.tgz", 1475 | "integrity": "sha512-iuh7L6jA7JEGu2WxDwtQP1ddOpaJNC4KlDEFfdQajSGgGPNi4OyDc2R7QnbY2bR9QjBVGwgvTdNJZoE7RaxUMA==", 1476 | "dev": true, 1477 | "requires": { 1478 | "create-hash": "^1.1.2", 1479 | "create-hmac": "^1.1.4", 1480 | "ripemd160": "^2.0.1", 1481 | "safe-buffer": "^5.0.1", 1482 | "sha.js": "^2.4.8" 1483 | } 1484 | }, 1485 | "process": { 1486 | "version": "0.11.10", 1487 | "resolved": "https://registry.npmjs.org/process/-/process-0.11.10.tgz", 1488 | "integrity": "sha512-cdGef/drWFoydD1JsMzuFf8100nZl+GT+yacc2bEced5f9Rjk4z+WtFUTBu9PhOi9j/jfmBPu0mMEY4wIdAF8A==", 1489 | "dev": true 1490 | }, 1491 | "process-nextick-args": { 1492 | "version": "2.0.1", 1493 | "resolved": "https://registry.npmjs.org/process-nextick-args/-/process-nextick-args-2.0.1.tgz", 1494 | "integrity": "sha512-3ouUOpQhtgrbOa17J7+uxOTpITYWaGP7/AhoR3+A+/1e9skrzelGi/dXzEYyvbxubEF6Wn2ypscTKiKJFFn1ag==", 1495 | "dev": true 1496 | }, 1497 | "proxy-addr": { 1498 | "version": "2.0.7", 1499 | "resolved": "https://registry.npmjs.org/proxy-addr/-/proxy-addr-2.0.7.tgz", 1500 | "integrity": "sha512-llQsMLSUDUPT44jdrU/O37qlnifitDP+ZwrmmZcoSKyLKvtZxpyV0n2/bD/N4tBAAZ/gJEdZU7KMraoK1+XYAg==", 1501 | "requires": { 1502 | "forwarded": "0.2.0", 1503 | "ipaddr.js": "1.9.1" 1504 | } 1505 | }, 1506 | "public-encrypt": { 1507 | "version": "4.0.3", 1508 | "resolved": "https://registry.npmjs.org/public-encrypt/-/public-encrypt-4.0.3.tgz", 1509 | "integrity": "sha512-zVpa8oKZSz5bTMTFClc1fQOnyyEzpl5ozpi1B5YcvBrdohMjH2rfsBtyXcuNuwjsDIXmBYlF2N5FlJYhR29t8Q==", 1510 | "dev": true, 1511 | "requires": { 1512 | "bn.js": "^4.1.0", 1513 | "browserify-rsa": "^4.0.0", 1514 | "create-hash": "^1.1.0", 1515 | "parse-asn1": "^5.0.0", 1516 | "randombytes": "^2.0.1", 1517 | "safe-buffer": "^5.1.2" 1518 | }, 1519 | "dependencies": { 1520 | "bn.js": { 1521 | "version": "4.12.0", 1522 | "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-4.12.0.tgz", 1523 | "integrity": "sha512-c98Bf3tPniI+scsdk237ku1Dc3ujXQTSgyiPUDEOe7tRkhrqridvh8klBv0HCEso1OLOYcHuCv/cS6DNxKH+ZA==", 1524 | "dev": true 1525 | } 1526 | } 1527 | }, 1528 | "punycode": { 1529 | "version": "1.4.1", 1530 | "resolved": "https://registry.npmjs.org/punycode/-/punycode-1.4.1.tgz", 1531 | "integrity": "sha512-jmYNElW7yvO7TV33CjSmvSiE2yco3bV2czu/OzDKdMNVZQWfxCblURLhf+47syQRBntjfLdd/H0egrzIG+oaFQ==", 1532 | "dev": true 1533 | }, 1534 | "qs": { 1535 | "version": "6.10.3", 1536 | "resolved": "https://registry.npmjs.org/qs/-/qs-6.10.3.tgz", 1537 | "integrity": "sha512-wr7M2E0OFRfIfJZjKGieI8lBKb7fRCH4Fv5KNPEs7gJ8jadvotdsS08PzOKR7opXhZ/Xkjtt3WF9g38drmyRqQ==", 1538 | "requires": { 1539 | "side-channel": "^1.0.4" 1540 | } 1541 | }, 1542 | "querystring": { 1543 | "version": "0.2.0", 1544 | "resolved": "https://registry.npmjs.org/querystring/-/querystring-0.2.0.tgz", 1545 | "integrity": "sha512-X/xY82scca2tau62i9mDyU9K+I+djTMUsvwf7xnUX5GLvVzgJybOJf4Y6o9Zx3oJK/LSXg5tTZBjwzqVPaPO2g==", 1546 | "dev": true 1547 | }, 1548 | "querystring-es3": { 1549 | "version": "0.2.1", 1550 | "resolved": "https://registry.npmjs.org/querystring-es3/-/querystring-es3-0.2.1.tgz", 1551 | "integrity": "sha512-773xhDQnZBMFobEiztv8LIl70ch5MSF/jUQVlhwFyBILqq96anmoctVIYz+ZRp0qbCKATTn6ev02M3r7Ga5vqA==", 1552 | "dev": true 1553 | }, 1554 | "randombytes": { 1555 | "version": "2.1.0", 1556 | "resolved": "https://registry.npmjs.org/randombytes/-/randombytes-2.1.0.tgz", 1557 | "integrity": "sha512-vYl3iOX+4CKUWuxGi9Ukhie6fsqXqS9FE2Zaic4tNFD2N2QQaXOMFbuKK4QmDHC0JO6B1Zp41J0LpT0oR68amQ==", 1558 | "dev": true, 1559 | "requires": { 1560 | "safe-buffer": "^5.1.0" 1561 | } 1562 | }, 1563 | "randomfill": { 1564 | "version": "1.0.4", 1565 | "resolved": "https://registry.npmjs.org/randomfill/-/randomfill-1.0.4.tgz", 1566 | "integrity": "sha512-87lcbR8+MhcWcUiQ+9e+Rwx8MyR2P7qnt15ynUlbm3TU/fjbgz4GsvfSUDTemtCCtVCqb4ZcEFlyPNTh9bBTLw==", 1567 | "dev": true, 1568 | "requires": { 1569 | "randombytes": "^2.0.5", 1570 | "safe-buffer": "^5.1.0" 1571 | } 1572 | }, 1573 | "range-parser": { 1574 | "version": "1.2.1", 1575 | "resolved": "https://registry.npmjs.org/range-parser/-/range-parser-1.2.1.tgz", 1576 | "integrity": "sha512-Hrgsx+orqoygnmhFbKaHE6c296J+HTAQXoxEF6gNupROmmGJRoyzfG3ccAveqCBrwr/2yxQ5BVd/GTl5agOwSg==" 1577 | }, 1578 | "raw-body": { 1579 | "version": "2.5.1", 1580 | "resolved": "https://registry.npmjs.org/raw-body/-/raw-body-2.5.1.tgz", 1581 | "integrity": "sha512-qqJBtEyVgS0ZmPGdCFPWJ3FreoqvG4MVQln/kCgF7Olq95IbOp0/BWyMwbdtn4VTvkM8Y7khCQ2Xgk/tcrCXig==", 1582 | "requires": { 1583 | "bytes": "3.1.2", 1584 | "http-errors": "2.0.0", 1585 | "iconv-lite": "0.4.24", 1586 | "unpipe": "1.0.0" 1587 | } 1588 | }, 1589 | "read-only-stream": { 1590 | "version": "2.0.0", 1591 | "resolved": "https://registry.npmjs.org/read-only-stream/-/read-only-stream-2.0.0.tgz", 1592 | "integrity": "sha512-3ALe0bjBVZtkdWKIcThYpQCLbBMd/+Tbh2CDSrAIDO3UsZ4Xs+tnyjv2MjCOMMgBG+AsUOeuP1cgtY1INISc8w==", 1593 | "dev": true, 1594 | "requires": { 1595 | "readable-stream": "^2.0.2" 1596 | } 1597 | }, 1598 | "readable-stream": { 1599 | "version": "2.3.7", 1600 | "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.7.tgz", 1601 | "integrity": "sha512-Ebho8K4jIbHAxnuxi7o42OrZgF/ZTNcsZj6nRKyUmkhLFq8CHItp/fy6hQZuZmP/n3yZ9VBUbp4zz/mX8hmYPw==", 1602 | "dev": true, 1603 | "requires": { 1604 | "core-util-is": "~1.0.0", 1605 | "inherits": "~2.0.3", 1606 | "isarray": "~1.0.0", 1607 | "process-nextick-args": "~2.0.0", 1608 | "safe-buffer": "~5.1.1", 1609 | "string_decoder": "~1.1.1", 1610 | "util-deprecate": "~1.0.1" 1611 | }, 1612 | "dependencies": { 1613 | "safe-buffer": { 1614 | "version": "5.1.2", 1615 | "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", 1616 | "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==", 1617 | "dev": true 1618 | }, 1619 | "string_decoder": { 1620 | "version": "1.1.1", 1621 | "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", 1622 | "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", 1623 | "dev": true, 1624 | "requires": { 1625 | "safe-buffer": "~5.1.0" 1626 | } 1627 | } 1628 | } 1629 | }, 1630 | "regexp.prototype.flags": { 1631 | "version": "1.4.3", 1632 | "resolved": "https://registry.npmjs.org/regexp.prototype.flags/-/regexp.prototype.flags-1.4.3.tgz", 1633 | "integrity": "sha512-fjggEOO3slI6Wvgjwflkc4NFRCTZAu5CnNfBd5qOMYhWdn67nJBBu34/TkD++eeFmd8C9r9jfXJ27+nSiRkSUA==", 1634 | "dev": true, 1635 | "requires": { 1636 | "call-bind": "^1.0.2", 1637 | "define-properties": "^1.1.3", 1638 | "functions-have-names": "^1.2.2" 1639 | } 1640 | }, 1641 | "resolve": { 1642 | "version": "1.22.1", 1643 | "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.22.1.tgz", 1644 | "integrity": "sha512-nBpuuYuY5jFsli/JIs1oldw6fOQCBioohqWZg/2hiaOybXOft4lonv85uDOKXdf8rhyK159cxU5cDcK/NKk8zw==", 1645 | "dev": true, 1646 | "requires": { 1647 | "is-core-module": "^2.9.0", 1648 | "path-parse": "^1.0.7", 1649 | "supports-preserve-symlinks-flag": "^1.0.0" 1650 | } 1651 | }, 1652 | "ripemd160": { 1653 | "version": "2.0.2", 1654 | "resolved": "https://registry.npmjs.org/ripemd160/-/ripemd160-2.0.2.tgz", 1655 | "integrity": "sha512-ii4iagi25WusVoiC4B4lq7pbXfAp3D9v5CwfkY33vffw2+pkDjY1D8GaN7spsxvCSx8dkPqOZCEZyfxcmJG2IA==", 1656 | "dev": true, 1657 | "requires": { 1658 | "hash-base": "^3.0.0", 1659 | "inherits": "^2.0.1" 1660 | } 1661 | }, 1662 | "safe-buffer": { 1663 | "version": "5.2.1", 1664 | "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.1.tgz", 1665 | "integrity": "sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==" 1666 | }, 1667 | "safer-buffer": { 1668 | "version": "2.1.2", 1669 | "resolved": "https://registry.npmjs.org/safer-buffer/-/safer-buffer-2.1.2.tgz", 1670 | "integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==" 1671 | }, 1672 | "send": { 1673 | "version": "0.18.0", 1674 | "resolved": "https://registry.npmjs.org/send/-/send-0.18.0.tgz", 1675 | "integrity": "sha512-qqWzuOjSFOuqPjFe4NOsMLafToQQwBSOEpS+FwEt3A2V3vKubTquT3vmLTQpFgMXp8AlFWFuP1qKaJZOtPpVXg==", 1676 | "requires": { 1677 | "debug": "2.6.9", 1678 | "depd": "2.0.0", 1679 | "destroy": "1.2.0", 1680 | "encodeurl": "~1.0.2", 1681 | "escape-html": "~1.0.3", 1682 | "etag": "~1.8.1", 1683 | "fresh": "0.5.2", 1684 | "http-errors": "2.0.0", 1685 | "mime": "1.6.0", 1686 | "ms": "2.1.3", 1687 | "on-finished": "2.4.1", 1688 | "range-parser": "~1.2.1", 1689 | "statuses": "2.0.1" 1690 | }, 1691 | "dependencies": { 1692 | "ms": { 1693 | "version": "2.1.3", 1694 | "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz", 1695 | "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==" 1696 | } 1697 | } 1698 | }, 1699 | "serve-static": { 1700 | "version": "1.15.0", 1701 | "resolved": "https://registry.npmjs.org/serve-static/-/serve-static-1.15.0.tgz", 1702 | "integrity": "sha512-XGuRDNjXUijsUL0vl6nSD7cwURuzEgglbOaFuZM9g3kwDXOWVTck0jLzjPzGD+TazWbboZYu52/9/XPdUgne9g==", 1703 | "requires": { 1704 | "encodeurl": "~1.0.2", 1705 | "escape-html": "~1.0.3", 1706 | "parseurl": "~1.3.3", 1707 | "send": "0.18.0" 1708 | } 1709 | }, 1710 | "setprototypeof": { 1711 | "version": "1.2.0", 1712 | "resolved": "https://registry.npmjs.org/setprototypeof/-/setprototypeof-1.2.0.tgz", 1713 | "integrity": "sha512-E5LDX7Wrp85Kil5bhZv46j8jOeboKq5JMmYM3gVGdGH8xFpPWXUMsNrlODCrkoxMEeNi/XZIwuRvY4XNwYMJpw==" 1714 | }, 1715 | "sha.js": { 1716 | "version": "2.4.11", 1717 | "resolved": "https://registry.npmjs.org/sha.js/-/sha.js-2.4.11.tgz", 1718 | "integrity": "sha512-QMEp5B7cftE7APOjk5Y6xgrbWu+WkLVQwk8JNjZ8nKRciZaByEW6MubieAiToS7+dwvrjGhH8jRXz3MVd0AYqQ==", 1719 | "dev": true, 1720 | "requires": { 1721 | "inherits": "^2.0.1", 1722 | "safe-buffer": "^5.0.1" 1723 | } 1724 | }, 1725 | "shasum-object": { 1726 | "version": "1.0.0", 1727 | "resolved": "https://registry.npmjs.org/shasum-object/-/shasum-object-1.0.0.tgz", 1728 | "integrity": "sha512-Iqo5rp/3xVi6M4YheapzZhhGPVs0yZwHj7wvwQ1B9z8H6zk+FEnI7y3Teq7qwnekfEhu8WmG2z0z4iWZaxLWVg==", 1729 | "dev": true, 1730 | "requires": { 1731 | "fast-safe-stringify": "^2.0.7" 1732 | } 1733 | }, 1734 | "shell-quote": { 1735 | "version": "1.7.3", 1736 | "resolved": "https://registry.npmjs.org/shell-quote/-/shell-quote-1.7.3.tgz", 1737 | "integrity": "sha512-Vpfqwm4EnqGdlsBFNmHhxhElJYrdfcxPThu+ryKS5J8L/fhAwLazFZtq+S+TWZ9ANj2piSQLGj6NQg+lKPmxrw==", 1738 | "dev": true 1739 | }, 1740 | "side-channel": { 1741 | "version": "1.0.4", 1742 | "resolved": "https://registry.npmjs.org/side-channel/-/side-channel-1.0.4.tgz", 1743 | "integrity": "sha512-q5XPytqFEIKHkGdiMIrY10mvLRvnQh42/+GoBlFW3b2LXLE2xxJpZFdm94we0BaoV3RwJyGqg5wS7epxTv0Zvw==", 1744 | "requires": { 1745 | "call-bind": "^1.0.0", 1746 | "get-intrinsic": "^1.0.2", 1747 | "object-inspect": "^1.9.0" 1748 | } 1749 | }, 1750 | "simple-concat": { 1751 | "version": "1.0.1", 1752 | "resolved": "https://registry.npmjs.org/simple-concat/-/simple-concat-1.0.1.tgz", 1753 | "integrity": "sha512-cSFtAPtRhljv69IK0hTVZQ+OfE9nePi/rtJmw5UjHeVyVroEqJXP1sFztKUy1qU+xvz3u/sfYJLa947b7nAN2Q==", 1754 | "dev": true 1755 | }, 1756 | "source-map": { 1757 | "version": "0.5.7", 1758 | "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz", 1759 | "integrity": "sha512-LbrmJOMUSdEVxIKvdcJzQC+nQhe8FUZQTXQy6+I75skNgn3OoQ0DZA8YnFa7gp8tqtL3KPf1kmo0R5DoApeSGQ==", 1760 | "dev": true 1761 | }, 1762 | "statuses": { 1763 | "version": "2.0.1", 1764 | "resolved": "https://registry.npmjs.org/statuses/-/statuses-2.0.1.tgz", 1765 | "integrity": "sha512-RwNA9Z/7PrK06rYLIzFMlaF+l73iwpzsqRIFgbMLbTcLD6cOao82TaWefPXQvB2fOC4AjuYSEndS7N/mTCbkdQ==" 1766 | }, 1767 | "stream-browserify": { 1768 | "version": "3.0.0", 1769 | "resolved": "https://registry.npmjs.org/stream-browserify/-/stream-browserify-3.0.0.tgz", 1770 | "integrity": "sha512-H73RAHsVBapbim0tU2JwwOiXUj+fikfiaoYAKHF3VJfA0pe2BCzkhAHBlLG6REzE+2WNZcxOXjK7lkso+9euLA==", 1771 | "dev": true, 1772 | "requires": { 1773 | "inherits": "~2.0.4", 1774 | "readable-stream": "^3.5.0" 1775 | }, 1776 | "dependencies": { 1777 | "readable-stream": { 1778 | "version": "3.6.0", 1779 | "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.0.tgz", 1780 | "integrity": "sha512-BViHy7LKeTz4oNnkcLJ+lVSL6vpiFeX6/d3oSH8zCW7UxP2onchk+vTGB143xuFjHS3deTgkKoXXymXqymiIdA==", 1781 | "dev": true, 1782 | "requires": { 1783 | "inherits": "^2.0.3", 1784 | "string_decoder": "^1.1.1", 1785 | "util-deprecate": "^1.0.1" 1786 | } 1787 | } 1788 | } 1789 | }, 1790 | "stream-combiner2": { 1791 | "version": "1.1.1", 1792 | "resolved": "https://registry.npmjs.org/stream-combiner2/-/stream-combiner2-1.1.1.tgz", 1793 | "integrity": "sha512-3PnJbYgS56AeWgtKF5jtJRT6uFJe56Z0Hc5Ngg/6sI6rIt8iiMBTa9cvdyFfpMQjaVHr8dusbNeFGIIonxOvKw==", 1794 | "dev": true, 1795 | "requires": { 1796 | "duplexer2": "~0.1.0", 1797 | "readable-stream": "^2.0.2" 1798 | } 1799 | }, 1800 | "stream-http": { 1801 | "version": "3.2.0", 1802 | "resolved": "https://registry.npmjs.org/stream-http/-/stream-http-3.2.0.tgz", 1803 | "integrity": "sha512-Oq1bLqisTyK3TSCXpPbT4sdeYNdmyZJv1LxpEm2vu1ZhK89kSE5YXwZc3cWk0MagGaKriBh9mCFbVGtO+vY29A==", 1804 | "dev": true, 1805 | "requires": { 1806 | "builtin-status-codes": "^3.0.0", 1807 | "inherits": "^2.0.4", 1808 | "readable-stream": "^3.6.0", 1809 | "xtend": "^4.0.2" 1810 | }, 1811 | "dependencies": { 1812 | "readable-stream": { 1813 | "version": "3.6.0", 1814 | "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.0.tgz", 1815 | "integrity": "sha512-BViHy7LKeTz4oNnkcLJ+lVSL6vpiFeX6/d3oSH8zCW7UxP2onchk+vTGB143xuFjHS3deTgkKoXXymXqymiIdA==", 1816 | "dev": true, 1817 | "requires": { 1818 | "inherits": "^2.0.3", 1819 | "string_decoder": "^1.1.1", 1820 | "util-deprecate": "^1.0.1" 1821 | } 1822 | } 1823 | } 1824 | }, 1825 | "stream-splicer": { 1826 | "version": "2.0.1", 1827 | "resolved": "https://registry.npmjs.org/stream-splicer/-/stream-splicer-2.0.1.tgz", 1828 | "integrity": "sha512-Xizh4/NPuYSyAXyT7g8IvdJ9HJpxIGL9PjyhtywCZvvP0OPIdqyrr4dMikeuvY8xahpdKEBlBTySe583totajg==", 1829 | "dev": true, 1830 | "requires": { 1831 | "inherits": "^2.0.1", 1832 | "readable-stream": "^2.0.2" 1833 | } 1834 | }, 1835 | "string.prototype.trimend": { 1836 | "version": "1.0.5", 1837 | "resolved": "https://registry.npmjs.org/string.prototype.trimend/-/string.prototype.trimend-1.0.5.tgz", 1838 | "integrity": "sha512-I7RGvmjV4pJ7O3kdf+LXFpVfdNOxtCW/2C8f6jNiW4+PQchwxkCDzlk1/7p+Wl4bqFIZeF47qAHXLuHHWKAxog==", 1839 | "dev": true, 1840 | "requires": { 1841 | "call-bind": "^1.0.2", 1842 | "define-properties": "^1.1.4", 1843 | "es-abstract": "^1.19.5" 1844 | } 1845 | }, 1846 | "string.prototype.trimstart": { 1847 | "version": "1.0.5", 1848 | "resolved": "https://registry.npmjs.org/string.prototype.trimstart/-/string.prototype.trimstart-1.0.5.tgz", 1849 | "integrity": "sha512-THx16TJCGlsN0o6dl2o6ncWUsdgnLRSA23rRE5pyGBw/mLr3Ej/R2LaqCtgP8VNMGZsvMWnf9ooZPyY2bHvUFg==", 1850 | "dev": true, 1851 | "requires": { 1852 | "call-bind": "^1.0.2", 1853 | "define-properties": "^1.1.4", 1854 | "es-abstract": "^1.19.5" 1855 | } 1856 | }, 1857 | "string_decoder": { 1858 | "version": "1.3.0", 1859 | "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.3.0.tgz", 1860 | "integrity": "sha512-hkRX8U1WjJFd8LsDJ2yQ/wWWxaopEsABU1XfkM8A+j0+85JAGppt16cr1Whg6KIbb4okU6Mql6BOj+uup/wKeA==", 1861 | "dev": true, 1862 | "requires": { 1863 | "safe-buffer": "~5.2.0" 1864 | } 1865 | }, 1866 | "subarg": { 1867 | "version": "1.0.0", 1868 | "resolved": "https://registry.npmjs.org/subarg/-/subarg-1.0.0.tgz", 1869 | "integrity": "sha512-RIrIdRY0X1xojthNcVtgT9sjpOGagEUKpZdgBUi054OEPFo282yg+zE+t1Rj3+RqKq2xStL7uUHhY+AjbC4BXg==", 1870 | "dev": true, 1871 | "requires": { 1872 | "minimist": "^1.1.0" 1873 | } 1874 | }, 1875 | "supports-preserve-symlinks-flag": { 1876 | "version": "1.0.0", 1877 | "resolved": "https://registry.npmjs.org/supports-preserve-symlinks-flag/-/supports-preserve-symlinks-flag-1.0.0.tgz", 1878 | "integrity": "sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w==", 1879 | "dev": true 1880 | }, 1881 | "syntax-error": { 1882 | "version": "1.4.0", 1883 | "resolved": "https://registry.npmjs.org/syntax-error/-/syntax-error-1.4.0.tgz", 1884 | "integrity": "sha512-YPPlu67mdnHGTup2A8ff7BC2Pjq0e0Yp/IyTFN03zWO0RcK07uLcbi7C2KpGR2FvWbaB0+bfE27a+sBKebSo7w==", 1885 | "dev": true, 1886 | "requires": { 1887 | "acorn-node": "^1.2.0" 1888 | } 1889 | }, 1890 | "through": { 1891 | "version": "2.3.8", 1892 | "resolved": "https://registry.npmjs.org/through/-/through-2.3.8.tgz", 1893 | "integrity": "sha512-w89qg7PI8wAdvX60bMDP+bFoD5Dvhm9oLheFp5O4a2QF0cSBGsBX4qZmadPMvVqlLJBBci+WqGGOAPvcDeNSVg==", 1894 | "dev": true 1895 | }, 1896 | "through2": { 1897 | "version": "2.0.5", 1898 | "resolved": "https://registry.npmjs.org/through2/-/through2-2.0.5.tgz", 1899 | "integrity": "sha512-/mrRod8xqpA+IHSLyGCQ2s8SPHiCDEeQJSep1jqLYeEUClOFG2Qsh+4FU6G9VeqpZnGW/Su8LQGc4YKni5rYSQ==", 1900 | "dev": true, 1901 | "requires": { 1902 | "readable-stream": "~2.3.6", 1903 | "xtend": "~4.0.1" 1904 | } 1905 | }, 1906 | "timers-browserify": { 1907 | "version": "1.4.2", 1908 | "resolved": "https://registry.npmjs.org/timers-browserify/-/timers-browserify-1.4.2.tgz", 1909 | "integrity": "sha512-PIxwAupJZiYU4JmVZYwXp9FKsHMXb5h0ZEFyuXTAn8WLHOlcij+FEcbrvDsom1o5dr1YggEtFbECvGCW2sT53Q==", 1910 | "dev": true, 1911 | "requires": { 1912 | "process": "~0.11.0" 1913 | } 1914 | }, 1915 | "toidentifier": { 1916 | "version": "1.0.1", 1917 | "resolved": "https://registry.npmjs.org/toidentifier/-/toidentifier-1.0.1.tgz", 1918 | "integrity": "sha512-o5sSPKEkg/DIQNmH43V0/uerLrpzVedkUh8tGNvaeXpfpuwjKenlSox/2O/BTlZUtEe+JG7s5YhEz608PlAHRA==" 1919 | }, 1920 | "tty-browserify": { 1921 | "version": "0.0.1", 1922 | "resolved": "https://registry.npmjs.org/tty-browserify/-/tty-browserify-0.0.1.tgz", 1923 | "integrity": "sha512-C3TaO7K81YvjCgQH9Q1S3R3P3BtN3RIM8n+OvX4il1K1zgE8ZhI0op7kClgkxtutIE8hQrcrHBXvIheqKUUCxw==", 1924 | "dev": true 1925 | }, 1926 | "type-is": { 1927 | "version": "1.6.18", 1928 | "resolved": "https://registry.npmjs.org/type-is/-/type-is-1.6.18.tgz", 1929 | "integrity": "sha512-TkRKr9sUTxEH8MdfuCSP7VizJyzRNMjj2J2do2Jr3Kym598JVdEksuzPQCnlFPW4ky9Q+iA+ma9BGm06XQBy8g==", 1930 | "requires": { 1931 | "media-typer": "0.3.0", 1932 | "mime-types": "~2.1.24" 1933 | } 1934 | }, 1935 | "typedarray": { 1936 | "version": "0.0.6", 1937 | "resolved": "https://registry.npmjs.org/typedarray/-/typedarray-0.0.6.tgz", 1938 | "integrity": "sha512-/aCDEGatGvZ2BIk+HmLf4ifCJFwvKFNb9/JeZPMulfgFracn9QFcAf5GO8B/mweUjSoblS5In0cWhqpfs/5PQA==", 1939 | "dev": true 1940 | }, 1941 | "umd": { 1942 | "version": "3.0.3", 1943 | "resolved": "https://registry.npmjs.org/umd/-/umd-3.0.3.tgz", 1944 | "integrity": "sha512-4IcGSufhFshvLNcMCV80UnQVlZ5pMOC8mvNPForqwA4+lzYQuetTESLDQkeLmihq8bRcnpbQa48Wb8Lh16/xow==", 1945 | "dev": true 1946 | }, 1947 | "unbox-primitive": { 1948 | "version": "1.0.2", 1949 | "resolved": "https://registry.npmjs.org/unbox-primitive/-/unbox-primitive-1.0.2.tgz", 1950 | "integrity": "sha512-61pPlCD9h51VoreyJ0BReideM3MDKMKnh6+V9L08331ipq6Q8OFXZYiqP6n/tbHx4s5I9uRhcye6BrbkizkBDw==", 1951 | "dev": true, 1952 | "requires": { 1953 | "call-bind": "^1.0.2", 1954 | "has-bigints": "^1.0.2", 1955 | "has-symbols": "^1.0.3", 1956 | "which-boxed-primitive": "^1.0.2" 1957 | } 1958 | }, 1959 | "undeclared-identifiers": { 1960 | "version": "1.1.3", 1961 | "resolved": "https://registry.npmjs.org/undeclared-identifiers/-/undeclared-identifiers-1.1.3.tgz", 1962 | "integrity": "sha512-pJOW4nxjlmfwKApE4zvxLScM/njmwj/DiUBv7EabwE4O8kRUy+HIwxQtZLBPll/jx1LJyBcqNfB3/cpv9EZwOw==", 1963 | "dev": true, 1964 | "requires": { 1965 | "acorn-node": "^1.3.0", 1966 | "dash-ast": "^1.0.0", 1967 | "get-assigned-identifiers": "^1.2.0", 1968 | "simple-concat": "^1.0.0", 1969 | "xtend": "^4.0.1" 1970 | } 1971 | }, 1972 | "unpipe": { 1973 | "version": "1.0.0", 1974 | "resolved": "https://registry.npmjs.org/unpipe/-/unpipe-1.0.0.tgz", 1975 | "integrity": "sha512-pjy2bYhSsufwWlKwPc+l3cN7+wuJlK6uz0YdJEOlQDbl6jo/YlPi4mb8agUkVC8BF7V8NuzeyPNqRksA3hztKQ==" 1976 | }, 1977 | "url": { 1978 | "version": "0.11.0", 1979 | "resolved": "https://registry.npmjs.org/url/-/url-0.11.0.tgz", 1980 | "integrity": "sha512-kbailJa29QrtXnxgq+DdCEGlbTeYM2eJUxsz6vjZavrCYPMIFHMKQmSKYAIuUK2i7hgPm28a8piX5NTUtM/LKQ==", 1981 | "dev": true, 1982 | "requires": { 1983 | "punycode": "1.3.2", 1984 | "querystring": "0.2.0" 1985 | }, 1986 | "dependencies": { 1987 | "punycode": { 1988 | "version": "1.3.2", 1989 | "resolved": "https://registry.npmjs.org/punycode/-/punycode-1.3.2.tgz", 1990 | "integrity": "sha512-RofWgt/7fL5wP1Y7fxE7/EmTLzQVnB0ycyibJ0OOHIlJqTNzglYFxVwETOcIoJqJmpDXJ9xImDv+Fq34F/d4Dw==", 1991 | "dev": true 1992 | } 1993 | } 1994 | }, 1995 | "util": { 1996 | "version": "0.12.4", 1997 | "resolved": "https://registry.npmjs.org/util/-/util-0.12.4.tgz", 1998 | "integrity": "sha512-bxZ9qtSlGUWSOy9Qa9Xgk11kSslpuZwaxCg4sNIDj6FLucDab2JxnHwyNTCpHMtK1MjoQiWQ6DiUMZYbSrO+Sw==", 1999 | "dev": true, 2000 | "requires": { 2001 | "inherits": "^2.0.3", 2002 | "is-arguments": "^1.0.4", 2003 | "is-generator-function": "^1.0.7", 2004 | "is-typed-array": "^1.1.3", 2005 | "safe-buffer": "^5.1.2", 2006 | "which-typed-array": "^1.1.2" 2007 | } 2008 | }, 2009 | "util-deprecate": { 2010 | "version": "1.0.2", 2011 | "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz", 2012 | "integrity": "sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw==", 2013 | "dev": true 2014 | }, 2015 | "utils-merge": { 2016 | "version": "1.0.1", 2017 | "resolved": "https://registry.npmjs.org/utils-merge/-/utils-merge-1.0.1.tgz", 2018 | "integrity": "sha512-pMZTvIkT1d+TFGvDOqodOclx0QWkkgi6Tdoa8gC8ffGAAqz9pzPTZWAybbsHHoED/ztMtkv/VoYTYyShUn81hA==" 2019 | }, 2020 | "vary": { 2021 | "version": "1.1.2", 2022 | "resolved": "https://registry.npmjs.org/vary/-/vary-1.1.2.tgz", 2023 | "integrity": "sha512-BNGbWLfd0eUPabhkXUVm0j8uuvREyTh5ovRa/dyow/BqAbZJyC+5fU+IzQOzmAKzYqYRAISoRhdQr3eIZ/PXqg==" 2024 | }, 2025 | "vm-browserify": { 2026 | "version": "1.1.2", 2027 | "resolved": "https://registry.npmjs.org/vm-browserify/-/vm-browserify-1.1.2.tgz", 2028 | "integrity": "sha512-2ham8XPWTONajOR0ohOKOHXkm3+gaBmGut3SRuu75xLd/RRaY6vqgh8NBYYk7+RW3u5AtzPQZG8F10LHkl0lAQ==", 2029 | "dev": true 2030 | }, 2031 | "which-boxed-primitive": { 2032 | "version": "1.0.2", 2033 | "resolved": "https://registry.npmjs.org/which-boxed-primitive/-/which-boxed-primitive-1.0.2.tgz", 2034 | "integrity": "sha512-bwZdv0AKLpplFY2KZRX6TvyuN7ojjr7lwkg6ml0roIy9YeuSr7JS372qlNW18UQYzgYK9ziGcerWqZOmEn9VNg==", 2035 | "dev": true, 2036 | "requires": { 2037 | "is-bigint": "^1.0.1", 2038 | "is-boolean-object": "^1.1.0", 2039 | "is-number-object": "^1.0.4", 2040 | "is-string": "^1.0.5", 2041 | "is-symbol": "^1.0.3" 2042 | } 2043 | }, 2044 | "which-typed-array": { 2045 | "version": "1.1.8", 2046 | "resolved": "https://registry.npmjs.org/which-typed-array/-/which-typed-array-1.1.8.tgz", 2047 | "integrity": "sha512-Jn4e5PItbcAHyLoRDwvPj1ypu27DJbtdYXUa5zsinrUx77Uvfb0cXwwnGMTn7cjUfhhqgVQnVJCwF+7cgU7tpw==", 2048 | "dev": true, 2049 | "requires": { 2050 | "available-typed-arrays": "^1.0.5", 2051 | "call-bind": "^1.0.2", 2052 | "es-abstract": "^1.20.0", 2053 | "for-each": "^0.3.3", 2054 | "has-tostringtag": "^1.0.0", 2055 | "is-typed-array": "^1.1.9" 2056 | } 2057 | }, 2058 | "wrappy": { 2059 | "version": "1.0.2", 2060 | "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz", 2061 | "integrity": "sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ==", 2062 | "dev": true 2063 | }, 2064 | "ws": { 2065 | "version": "8.8.0", 2066 | "resolved": "https://registry.npmjs.org/ws/-/ws-8.8.0.tgz", 2067 | "integrity": "sha512-JDAgSYQ1ksuwqfChJusw1LSJ8BizJ2e/vVu5Lxjq3YvNJNlROv1ui4i+c/kUUrPheBvQl4c5UbERhTwKa6QBJQ==" 2068 | }, 2069 | "xtend": { 2070 | "version": "4.0.2", 2071 | "resolved": "https://registry.npmjs.org/xtend/-/xtend-4.0.2.tgz", 2072 | "integrity": "sha512-LKYU1iAXJXUgAXn9URjiu+MWhyUXHsvfp7mcuYm9dSUKK0/CjtrUwFAxD82/mCWbtLsGjFIad0wIsod4zrTAEQ==", 2073 | "dev": true 2074 | } 2075 | } 2076 | } 2077 | --------------------------------------------------------------------------------