diff --git a/CMakeLists.txt b/CMakeLists.txt index c2e5af9..c030ec8 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -20,6 +20,11 @@ if(CMAKE_HOST_SYSTEM_NAME STREQUAL "Android") set(CMAKE_C_FLAGS "-Wno-error=unused-but-set-variable -Wno-error=strict-prototypes") endif() +# Add -frtti only for Linux and macOS +if (NOT CMAKE_SYSTEM_NAME STREQUAL "Windows") + set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -frtti") +endif() + set(OPENSSL_USE_STATIC_LIBS TRUE) find_package(OpenSSL REQUIRED) @@ -35,6 +40,7 @@ FetchContent_Declare( option(NO_MEDIA "Disable media transport support in libdatachannel" OFF) option(NO_WEBSOCKET "Disable WebSocket support in libdatachannel" OFF) +set(FETCHCONTENT_QUIET OFF) FetchContent_GetProperties(libdatachannel) if(NOT libdatachannel) @@ -42,22 +48,35 @@ if(NOT libdatachannel) add_subdirectory(${libdatachannel_SOURCE_DIR} ${libdatachannel_BINARY_DIR} EXCLUDE_FROM_ALL) endif() -add_library(${PROJECT_NAME} SHARED - src/cpp/rtc-wrapper.cpp - src/cpp/media-direction.cpp - src/cpp/media-rtcpreceivingsession-wrapper.cpp - src/cpp/media-track-wrapper.cpp - src/cpp/media-audio-wrapper.cpp - src/cpp/media-video-wrapper.cpp +# Create Source File List +set(SRC_FILES + src/cpp/rtc-wrapper.cpp src/cpp/data-channel-wrapper.cpp src/cpp/peer-connection-wrapper.cpp src/cpp/thread-safe-callback.cpp - src/cpp/web-socket-wrapper.cpp - src/cpp/web-socket-server-wrapper.cpp src/cpp/main.cpp ${CMAKE_JS_SRC} ) +if(NOT NO_MEDIA) + list(APPEND SRC_FILES + src/cpp/media-direction.cpp + src/cpp/media-rtcpreceivingsession-wrapper.cpp + src/cpp/media-track-wrapper.cpp + src/cpp/media-audio-wrapper.cpp + src/cpp/media-video-wrapper.cpp + ) +endif() + +if(NOT NO_WEBSOCKET) + list(APPEND SRC_FILES + src/cpp/web-socket-wrapper.cpp + src/cpp/web-socket-server-wrapper.cpp + ) +endif() + +add_library(${PROJECT_NAME} SHARED ${SRC_FILES}) + set_target_properties(${PROJECT_NAME} PROPERTIES CXX_STANDARD 17) set_target_properties(${PROJECT_NAME} PROPERTIES PREFIX "" SUFFIX ".node") diff --git a/package.json b/package.json index 5af8d8f..e2a5c57 100644 --- a/package.json +++ b/package.json @@ -1,117 +1,117 @@ { - "name": "node-datachannel", - "version": "0.26.0", - "description": "WebRTC For Node.js and Electron. libdatachannel node bindings.", - "main": "./dist/cjs/lib/index.cjs", - "module": "./dist/esm/lib/index.mjs", - "types": "./dist/types/lib/index.d.ts", - "typesVersions": { - "*": { - "*": [ - "dist/types/lib/index.d.ts" - ], - "polyfill": [ - "dist/types/polyfill/index.d.ts" - ] - } - }, - "exports": { - ".": { - "types": "./dist/types/lib/index.d.ts", - "require": "./dist/cjs/lib/index.cjs", - "import": "./dist/esm/lib/index.mjs", - "default": "./dist/lib/esm/index.mjs" - }, - "./polyfill": { - "types": "./dist/types/polyfill/index.d.ts", - "require": "./dist/cjs/polyfill/index.cjs", - "import": "./dist/esm/polyfill/index.mjs", - "default": "./dist/polyfill/esm/index.mjs" - } - }, - "engines": { - "node": ">=18.20.0" - }, - "scripts": { - "install": "prebuild-install -r napi || (npm install --ignore-scripts --production=false && npm run _prebuild)", - "install:nice": "npm run clean && npm install --ignore-scripts --production=false && cmake-js build --CDUSE_NICE=1", - "install:gnu": "npm run clean && npm install --ignore-scripts --production=false && cmake-js build --CDUSE_GNUTLS=1", - "build": "npm run compile && npm run build:tsc", - "compile": "cmake-js build", - "compile:debug": "cmake-js build -D", - "build:tsc": "rimraf dist && rollup -c", - "build:tsc:watch": "rollup -c -w", - "clean": "rimraf dist build", - "lint": "eslint . --ext .ts --ext .mts", - "test": "NODE_OPTIONS=--experimental-vm-modules jest", - "test:watch": "NODE_OPTIONS=--experimental-vm-modules jest --watch", - "test:wpt": "npm run run:wpt:server & (sleep 8 && (npm run run:wpt:test | tee test/wpt-tests/last-test-results.md) )", - "wpt:server": "cd test/wpt-tests/wpt && ./wpt serve", - "wpt:test": "ts-node test/wpt-tests/index.ts", - "_prebuild": "prebuild -r napi --backend cmake-js", - "prepack": "npm run build:tsc" - }, - "binary": { - "napi_versions": [ - 8 - ] - }, - "repository": { - "type": "git", - "url": "git+https://github.com/murat-dogan/node-datachannel.git" - }, - "keywords": [ - "libdatachannel", - "webrtc", - "p2p", - "peer-to-peer", - "datachannel", - "data channel", - "websocket" - ], - "contributors": [ - { - "name": "Murat Doğan", - "url": "https://github.com/murat-dogan" - }, - { - "name": "Paul-Louis Ageneau", - "url": "https://github.com/paullouisageneau" - } - ], - "license": "MPL 2.0", - "bugs": { - "url": "https://github.com/murat-dogan/node-datachannel/issues" + "name": "node-datachannel", + "version": "0.26.0", + "description": "WebRTC For Node.js and Electron. libdatachannel node bindings.", + "main": "./dist/cjs/lib/index.cjs", + "module": "./dist/esm/lib/index.mjs", + "types": "./dist/types/lib/index.d.ts", + "typesVersions": { + "*": { + "*": [ + "dist/types/lib/index.d.ts" + ], + "polyfill": [ + "dist/types/polyfill/index.d.ts" + ] + } + }, + "exports": { + ".": { + "types": "./dist/types/lib/index.d.ts", + "require": "./dist/cjs/lib/index.cjs", + "import": "./dist/esm/lib/index.mjs", + "default": "./dist/lib/esm/index.mjs" }, - "homepage": "https://github.com/murat-dogan/node-datachannel#readme", - "devDependencies": { - "@rollup/plugin-esm-shim": "^0.1.7", - "@rollup/plugin-replace": "^6.0.1", - "@types/jest": "^29.5.12", - "@types/node": "^20.6.1", - "@typescript-eslint/eslint-plugin": "^7.17.0", - "@typescript-eslint/parser": "^7.17.0", - "cmake-js": "^7.3.0", - "eslint": "^8.57.0", - "eslint-config-prettier": "^9.1.0", - "eslint-plugin-jest": "^28.6.0", - "eslint-plugin-prettier": "^5.2.1", - "jest": "^29.7.0", - "jsdom": "^24.1.1", - "node-addon-api": "^7.0.0", - "prebuild": "^13.0.1", - "prettier": "^3.3.3", - "puppeteer": "^22.14.0", - "rimraf": "^5.0.9", - "rollup": "^4.22.5", - "rollup-plugin-dts": "^6.1.1", - "rollup-plugin-esbuild": "^6.1.1", - "ts-api-utils": "^1.3.0", - "ts-jest": "^29.2.3", - "ts-node": "^10.9.2", - "typescript": "5.4" + "./polyfill": { + "types": "./dist/types/polyfill/index.d.ts", + "require": "./dist/cjs/polyfill/index.cjs", + "import": "./dist/esm/polyfill/index.mjs", + "default": "./dist/polyfill/esm/index.mjs" + } + }, + "engines": { + "node": ">=18.20.0" + }, + "scripts": { + "install": "prebuild-install -r napi || (npm install --ignore-scripts --production=false && npm run _prebuild)", + "install:nice": "npm run clean && npm install --ignore-scripts --production=false && cmake-js configure --CDUSE_NICE=1 && cmake-js build", + "install:gnu": "npm run clean && npm install --ignore-scripts --production=false && cmake-js configure --CDUSE_GNUTLS=1 && cmake-js build", + "build": "npm run compile && npm run build:tsc", + "compile": "cmake-js build", + "compile:debug": "cmake-js build -D", + "build:tsc": "rimraf dist && rollup -c", + "build:tsc:watch": "rollup -c -w", + "clean": "rimraf dist build", + "lint": "eslint . --ext .ts --ext .mts", + "test": "NODE_OPTIONS=--experimental-vm-modules jest", + "test:watch": "NODE_OPTIONS=--experimental-vm-modules jest --watch", + "test:wpt": "npm run run:wpt:server & (sleep 8 && (npm run run:wpt:test | tee test/wpt-tests/last-test-results.md) )", + "wpt:server": "cd test/wpt-tests/wpt && ./wpt serve", + "wpt:test": "ts-node test/wpt-tests/index.ts", + "_prebuild": "prebuild -r napi --backend cmake-js", + "prepack": "npm run build:tsc" + }, + "binary": { + "napi_versions": [ + 8 + ] + }, + "repository": { + "type": "git", + "url": "git+https://github.com/murat-dogan/node-datachannel.git" + }, + "keywords": [ + "libdatachannel", + "webrtc", + "p2p", + "peer-to-peer", + "datachannel", + "data channel", + "websocket" + ], + "contributors": [ + { + "name": "Murat Doğan", + "url": "https://github.com/murat-dogan" }, - "dependencies": { - "prebuild-install": "^7.1.3" + { + "name": "Paul-Louis Ageneau", + "url": "https://github.com/paullouisageneau" } -} + ], + "license": "MPL 2.0", + "bugs": { + "url": "https://github.com/murat-dogan/node-datachannel/issues" + }, + "homepage": "https://github.com/murat-dogan/node-datachannel#readme", + "devDependencies": { + "@rollup/plugin-esm-shim": "^0.1.7", + "@rollup/plugin-replace": "^6.0.1", + "@types/jest": "^29.5.12", + "@types/node": "^20.6.1", + "@typescript-eslint/eslint-plugin": "^7.17.0", + "@typescript-eslint/parser": "^7.17.0", + "cmake-js": "^7.3.0", + "eslint": "^8.57.0", + "eslint-config-prettier": "^9.1.0", + "eslint-plugin-jest": "^28.6.0", + "eslint-plugin-prettier": "^5.2.1", + "jest": "^29.7.0", + "jsdom": "^24.1.1", + "node-addon-api": "^7.0.0", + "prebuild": "^13.0.1", + "prettier": "^3.3.3", + "puppeteer": "^22.14.0", + "rimraf": "^5.0.9", + "rollup": "^4.22.5", + "rollup-plugin-dts": "^6.1.1", + "rollup-plugin-esbuild": "^6.1.1", + "ts-api-utils": "^1.3.0", + "ts-jest": "^29.2.3", + "ts-node": "^10.9.2", + "typescript": "5.4" + }, + "dependencies": { + "prebuild-install": "^7.1.3" + } +} \ No newline at end of file diff --git a/src/cpp/main.cpp b/src/cpp/main.cpp index 0f56674..ba33adb 100644 --- a/src/cpp/main.cpp +++ b/src/cpp/main.cpp @@ -2,24 +2,38 @@ #include "rtc-wrapper.h" #include "peer-connection-wrapper.h" #include "data-channel-wrapper.h" + +#if RTC_ENABLE_MEDIA == 1 #include "media-rtcpreceivingsession-wrapper.h" #include "media-track-wrapper.h" #include "media-video-wrapper.h" #include "media-audio-wrapper.h" +#endif + +#if RTC_ENABLE_WEBSOCKET == 1 #include "web-socket-wrapper.h" #include "web-socket-server-wrapper.h" +#endif Napi::Object InitAll(Napi::Env env, Napi::Object exports) { RtcWrapper::Init(env, exports); + +#if RTC_ENABLE_MEDIA == 1 RtcpReceivingSessionWrapper::Init(env, exports); TrackWrapper::Init(env, exports); VideoWrapper::Init(env, exports); AudioWrapper::Init(env, exports); +#endif + DataChannelWrapper::Init(env, exports); PeerConnectionWrapper::Init(env, exports); + +#if RTC_ENABLE_WEBSOCKET == 1 WebSocketWrapper::Init(env, exports); WebSocketServerWrapper::Init(env, exports); +#endif + return exports; } diff --git a/src/cpp/peer-connection-wrapper.cpp b/src/cpp/peer-connection-wrapper.cpp index 4e3d9e7..58b49fa 100644 --- a/src/cpp/peer-connection-wrapper.cpp +++ b/src/cpp/peer-connection-wrapper.cpp @@ -1,8 +1,11 @@ #include "peer-connection-wrapper.h" #include "data-channel-wrapper.h" + +#if RTC_ENABLE_MEDIA == 1 #include "media-track-wrapper.h" #include "media-video-wrapper.h" #include "media-audio-wrapper.h" +#endif #include "plog/Log.h" @@ -43,7 +46,11 @@ Napi::Object PeerConnectionWrapper::Init(Napi::Env env, Napi::Object exports) InstanceMethod("remoteDescription", &PeerConnectionWrapper::remoteDescription), InstanceMethod("addRemoteCandidate", &PeerConnectionWrapper::addRemoteCandidate), InstanceMethod("createDataChannel", &PeerConnectionWrapper::createDataChannel), + +#if RTC_ENABLE_MEDIA == 1 InstanceMethod("addTrack", &PeerConnectionWrapper::addTrack), + InstanceMethod("onTrack", &PeerConnectionWrapper::onTrack), +#endif InstanceMethod("hasMedia", &PeerConnectionWrapper::hasMedia), InstanceMethod("state", &PeerConnectionWrapper::state), InstanceMethod("iceState", &PeerConnectionWrapper::iceState), @@ -56,7 +63,6 @@ Napi::Object PeerConnectionWrapper::Init(Napi::Env env, Napi::Object exports) InstanceMethod("onSignalingStateChange", &PeerConnectionWrapper::onSignalingStateChange), InstanceMethod("onGatheringStateChange", &PeerConnectionWrapper::onGatheringStateChange), InstanceMethod("onDataChannel", &PeerConnectionWrapper::onDataChannel), - InstanceMethod("onTrack", &PeerConnectionWrapper::onTrack), InstanceMethod("bytesSent", &PeerConnectionWrapper::bytesSent), InstanceMethod("bytesReceived", &PeerConnectionWrapper::bytesReceived), InstanceMethod("rtt", &PeerConnectionWrapper::rtt), @@ -1049,6 +1055,7 @@ std::string PeerConnectionWrapper::candidateTransportTypeToString(const rtc::Can } } +#if RTC_ENABLE_MEDIA == 1 Napi::Value PeerConnectionWrapper::addTrack(const Napi::CallbackInfo &info) { PLOG_DEBUG << "addTrack() called"; @@ -1132,6 +1139,7 @@ void PeerConnectionWrapper::onTrack(const Napi::CallbackInfo &info) args = {instance}; }); }); } +#endif Napi::Value PeerConnectionWrapper::hasMedia(const Napi::CallbackInfo &info) { diff --git a/src/cpp/peer-connection-wrapper.h b/src/cpp/peer-connection-wrapper.h index 5896e30..2535053 100644 --- a/src/cpp/peer-connection-wrapper.h +++ b/src/cpp/peer-connection-wrapper.h @@ -27,7 +27,12 @@ class PeerConnectionWrapper : public Napi::ObjectWrap Napi::Value remoteDescription(const Napi::CallbackInfo &info); void addRemoteCandidate(const Napi::CallbackInfo &info); Napi::Value createDataChannel(const Napi::CallbackInfo &info); + +#if RTC_ENABLE_MEDIA == 1 Napi::Value addTrack(const Napi::CallbackInfo &info); + void onTrack(const Napi::CallbackInfo &info); +#endif + Napi::Value hasMedia(const Napi::CallbackInfo &info); Napi::Value state(const Napi::CallbackInfo &info); Napi::Value iceState(const Napi::CallbackInfo &info); @@ -42,7 +47,6 @@ class PeerConnectionWrapper : public Napi::ObjectWrap void onSignalingStateChange(const Napi::CallbackInfo &info); void onGatheringStateChange(const Napi::CallbackInfo &info); void onDataChannel(const Napi::CallbackInfo &info); - void onTrack(const Napi::CallbackInfo &info); // Stats Napi::Value bytesSent(const Napi::CallbackInfo &info); diff --git a/src/cpp/rtc-wrapper.cpp b/src/cpp/rtc-wrapper.cpp index e59f391..341b56e 100644 --- a/src/cpp/rtc-wrapper.cpp +++ b/src/cpp/rtc-wrapper.cpp @@ -1,9 +1,15 @@ #include "rtc-wrapper.h" #include "peer-connection-wrapper.h" #include "data-channel-wrapper.h" + +#if RTC_ENABLE_MEDIA == 1 #include "media-track-wrapper.h" +#endif + +#if RTC_ENABLE_WEBSOCKET == 1 #include "web-socket-wrapper.h" #include "web-socket-server-wrapper.h" +#endif #include "plog/Log.h" @@ -118,9 +124,15 @@ void RtcWrapper::cleanup(const Napi::CallbackInfo &info) { PeerConnectionWrapper::CloseAll(); DataChannelWrapper::CloseAll(); + +#if RTC_ENABLE_MEDIA == 1 TrackWrapper::CloseAll(); +#endif + +#if RTC_ENABLE_WEBSOCKET == 1 WebSocketWrapper::CloseAll(); WebSocketServerWrapper::StopAll(); +#endif const auto timeout = std::chrono::seconds(10); if (rtc::Cleanup().wait_for(std::chrono::seconds(timeout)) == std::future_status::timeout) @@ -129,8 +141,14 @@ void RtcWrapper::cleanup(const Napi::CallbackInfo &info) // Cleanup the instances PeerConnectionWrapper::CleanupAll(); DataChannelWrapper::CleanupAll(); + +#if RTC_ENABLE_MEDIA == 1 TrackWrapper::CleanupAll(); +#endif + +#if RTC_ENABLE_WEBSOCKET == 1 WebSocketWrapper::CleanupAll(); +#endif if (logCallback) logCallback.reset();