diff --git a/package-lock.json b/package-lock.json index ff1a583f6..6cfdfe48f 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1421,6 +1421,14 @@ "read-yaml-file": "^1.1.0" } }, + "node_modules/@msgpack/msgpack": { + "version": "2.7.2", + "resolved": "https://registry.npmjs.org/@msgpack/msgpack/-/msgpack-2.7.2.tgz", + "integrity": "sha512-rYEi46+gIzufyYUAoHDnRzkWGxajpD9vVXFQ3g1vbjrBm6P7MBmm+s/fqPa46sxa+8FOUdEuRQKaugo5a4JWpw==", + "engines": { + "node": ">= 10" + } + }, "node_modules/@nodelib/fs.scandir": { "version": "2.1.5", "resolved": "https://registry.npmjs.org/@nodelib/fs.scandir/-/fs.scandir-2.1.5.tgz", @@ -9348,14 +9356,20 @@ "link": true }, "node_modules/obs-websocket-js": { - "version": "4.0.3", - "resolved": "https://registry.npmjs.org/obs-websocket-js/-/obs-websocket-js-4.0.3.tgz", - "integrity": "sha512-28L5VHlrn9gT9uMeasR5VJkVTc+Xj6eWqZxSQWVsnzznRNJWrHJK5ldK6DMtnWOMTZarPznq8dp0ko4R+svqdg==", + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/obs-websocket-js/-/obs-websocket-js-5.0.0.tgz", + "integrity": "sha512-VIveZrKkP7eUlrNQ0w0Lc70CzieGUMmoIn4Jz5T4jLMaSUhofyOL+t055eTwwV1oVxmH2dO4IuSfM97LVbyENQ==", "dependencies": { - "debug": "^4.1.0", + "@msgpack/msgpack": "^2.7.1", + "crypto-js": "^4.1.1", + "debug": "^4.3.2", + "eventemitter3": "^4.0.7", "isomorphic-ws": "^4.0.1", - "sha.js": "^2.4.9", - "ws": "^7.2.0" + "type-fest": "^2.3.2", + "ws": "^8.2.2" + }, + "engines": { + "node": ">12.0" } }, "node_modules/obs-websocket-js/node_modules/debug": { @@ -9374,6 +9388,37 @@ } } }, + "node_modules/obs-websocket-js/node_modules/type-fest": { + "version": "2.16.0", + "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-2.16.0.tgz", + "integrity": "sha512-qpaThT2HQkFb83gMOrdKVsfCN7LKxP26Yq+smPzY1FqoHRjqmjqHXA7n5Gkxi8efirtbeEUxzfEdePthQWCuHw==", + "engines": { + "node": ">=12.20" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/obs-websocket-js/node_modules/ws": { + "version": "8.8.0", + "resolved": "https://registry.npmjs.org/ws/-/ws-8.8.0.tgz", + "integrity": "sha512-JDAgSYQ1ksuwqfChJusw1LSJ8BizJ2e/vVu5Lxjq3YvNJNlROv1ui4i+c/kUUrPheBvQl4c5UbERhTwKa6QBJQ==", + "engines": { + "node": ">=10.0.0" + }, + "peerDependencies": { + "bufferutil": "^4.0.1", + "utf-8-validate": "^5.0.2" + }, + "peerDependenciesMeta": { + "bufferutil": { + "optional": true + }, + "utf-8-validate": { + "optional": true + } + } + }, "node_modules/once": { "version": "1.4.0", "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz", @@ -10576,18 +10621,6 @@ "integrity": "sha1-KQy7Iy4waULX1+qbg3Mqt4VvgoU=", "peer": true }, - "node_modules/sha.js": { - "version": "2.4.11", - "resolved": "https://registry.npmjs.org/sha.js/-/sha.js-2.4.11.tgz", - "integrity": "sha512-QMEp5B7cftE7APOjk5Y6xgrbWu+WkLVQwk8JNjZ8nKRciZaByEW6MubieAiToS7+dwvrjGhH8jRXz3MVd0AYqQ==", - "dependencies": { - "inherits": "^2.0.1", - "safe-buffer": "^5.0.1" - }, - "bin": { - "sha.js": "bin.js" - } - }, "node_modules/shebang-command": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-2.0.0.tgz", @@ -13050,7 +13083,7 @@ "license": "MIT", "dependencies": { "nodecg-io-core": "^0.3.0", - "obs-websocket-js": "^4.0.3" + "obs-websocket-js": "^5.0.0" }, "devDependencies": { "@types/node": "^18.0.3", @@ -14568,6 +14601,11 @@ "read-yaml-file": "^1.1.0" } }, + "@msgpack/msgpack": { + "version": "2.7.2", + "resolved": "https://registry.npmjs.org/@msgpack/msgpack/-/msgpack-2.7.2.tgz", + "integrity": "sha512-rYEi46+gIzufyYUAoHDnRzkWGxajpD9vVXFQ3g1vbjrBm6P7MBmm+s/fqPa46sxa+8FOUdEuRQKaugo5a4JWpw==" + }, "@nodelib/fs.scandir": { "version": "2.1.5", "resolved": "https://registry.npmjs.org/@nodelib/fs.scandir/-/fs.scandir-2.1.5.tgz", @@ -20650,7 +20688,7 @@ "nodecg-io-core": "^0.3.0", "nodecg-io-tsconfig": "^1.0.0", "nodecg-types": "^1.8.3", - "obs-websocket-js": "^4.0.3", + "obs-websocket-js": "^5.0.0", "typescript": "^4.7.4" } }, @@ -21132,14 +21170,17 @@ } }, "obs-websocket-js": { - "version": "4.0.3", - "resolved": "https://registry.npmjs.org/obs-websocket-js/-/obs-websocket-js-4.0.3.tgz", - "integrity": "sha512-28L5VHlrn9gT9uMeasR5VJkVTc+Xj6eWqZxSQWVsnzznRNJWrHJK5ldK6DMtnWOMTZarPznq8dp0ko4R+svqdg==", + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/obs-websocket-js/-/obs-websocket-js-5.0.0.tgz", + "integrity": "sha512-VIveZrKkP7eUlrNQ0w0Lc70CzieGUMmoIn4Jz5T4jLMaSUhofyOL+t055eTwwV1oVxmH2dO4IuSfM97LVbyENQ==", "requires": { - "debug": "^4.1.0", + "@msgpack/msgpack": "^2.7.1", + "crypto-js": "^4.1.1", + "debug": "^4.3.2", + "eventemitter3": "^4.0.7", "isomorphic-ws": "^4.0.1", - "sha.js": "^2.4.9", - "ws": "^7.2.0" + "type-fest": "^2.3.2", + "ws": "^8.2.2" }, "dependencies": { "debug": { @@ -21149,6 +21190,17 @@ "requires": { "ms": "2.1.2" } + }, + "type-fest": { + "version": "2.16.0", + "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-2.16.0.tgz", + "integrity": "sha512-qpaThT2HQkFb83gMOrdKVsfCN7LKxP26Yq+smPzY1FqoHRjqmjqHXA7n5Gkxi8efirtbeEUxzfEdePthQWCuHw==" + }, + "ws": { + "version": "8.8.0", + "resolved": "https://registry.npmjs.org/ws/-/ws-8.8.0.tgz", + "integrity": "sha512-JDAgSYQ1ksuwqfChJusw1LSJ8BizJ2e/vVu5Lxjq3YvNJNlROv1ui4i+c/kUUrPheBvQl4c5UbERhTwKa6QBJQ==", + "requires": {} } } }, @@ -22101,15 +22153,6 @@ "integrity": "sha1-KQy7Iy4waULX1+qbg3Mqt4VvgoU=", "peer": true }, - "sha.js": { - "version": "2.4.11", - "resolved": "https://registry.npmjs.org/sha.js/-/sha.js-2.4.11.tgz", - "integrity": "sha512-QMEp5B7cftE7APOjk5Y6xgrbWu+WkLVQwk8JNjZ8nKRciZaByEW6MubieAiToS7+dwvrjGhH8jRXz3MVd0AYqQ==", - "requires": { - "inherits": "^2.0.1", - "safe-buffer": "^5.0.1" - } - }, "shebang-command": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-2.0.0.tgz", diff --git a/samples/obs-scenelist/extension/index.ts b/samples/obs-scenelist/extension/index.ts index 0daa9f8bb..a88e95ae1 100644 --- a/samples/obs-scenelist/extension/index.ts +++ b/samples/obs-scenelist/extension/index.ts @@ -8,12 +8,12 @@ module.exports = function (nodecg: NodeCG) { const obs = requireService(nodecg, "obs"); obs?.onAvailable((client) => { - nodecg.log.info("OBS client has been updated, counting scenes and switching to another one."); - client.send("GetSceneList").then((data) => { + nodecg.log.info("OBS client has been updated, counting scenes and detecting when switching to another one."); + client.call("GetSceneList").then((data) => { nodecg.log.info(`There are ${data.scenes.length} scenes!`); }); - client.on("SwitchScenes", (data) => { - nodecg.log.info(`Scene changed to ${data["scene-name"]}.`); + client.on("CurrentProgramSceneChanged", (data) => { + nodecg.log.info(`Scene changed to ${data.sceneName}.`); }); }); diff --git a/services/nodecg-io-obs/extension/index.ts b/services/nodecg-io-obs/extension/index.ts index 8077fedfc..370dbeea5 100644 --- a/services/nodecg-io-obs/extension/index.ts +++ b/services/nodecg-io-obs/extension/index.ts @@ -5,6 +5,7 @@ import OBSWebSocket from "obs-websocket-js"; interface OBSServiceConfig { host: string; port: number; + isSecure?: boolean; password?: string; } @@ -18,7 +19,7 @@ class OBSService extends ServiceBundle { async validateConfig(config: OBSServiceConfig): Promise> { const client = new OBSWebSocket(); try { - await client.connect({ address: `${config.host}:${config.port}`, password: config.password }); + await this.connectClient(client, config); client.disconnect(); } catch (e) { @@ -30,7 +31,7 @@ class OBSService extends ServiceBundle { async createClient(config: OBSServiceConfig, logger: Logger): Promise> { const client = new OBSWebSocket(); try { - await client.connect({ address: `${config.host}:${config.port}`, password: config.password }); + await this.connectClient(client, config); logger.info("Connected to OBS successfully."); } catch (e) { return error(e.error); @@ -39,6 +40,11 @@ class OBSService extends ServiceBundle { return success(client); } + private async connectClient(client: OBSWebSocket, config: OBSServiceConfig): Promise { + const protocol = config.isSecure ? "wss" : "ws"; + await client.connect(`${protocol}://${config.host}:${config.port}`, config.password); + } + stopClient(client: OBSServiceClient) { client.disconnect(); } diff --git a/services/nodecg-io-obs/obs-schema.json b/services/nodecg-io-obs/obs-schema.json index b8bcf6dcd..5834e8481 100644 --- a/services/nodecg-io-obs/obs-schema.json +++ b/services/nodecg-io-obs/obs-schema.json @@ -7,6 +7,11 @@ "type": "string", "description": "An IP address to the obs websocket server" }, + "isSecure": { + "type": "boolean", + "description": "Whether the websocket connection is using encryption (wss) or not (ws)", + "default": false + }, "port": { "type": "number", "description": "The port of the obs websocket server" diff --git a/services/nodecg-io-obs/package.json b/services/nodecg-io-obs/package.json index 00d23c872..c61266a5b 100644 --- a/services/nodecg-io-obs/package.json +++ b/services/nodecg-io-obs/package.json @@ -38,6 +38,6 @@ }, "dependencies": { "nodecg-io-core": "^0.3.0", - "obs-websocket-js": "^4.0.3" + "obs-websocket-js": "^5.0.0" } }