Skip to content

Commit 666c1cd

Browse files
LostBeardclaude
andcommitted
Version 1.0.0: NuGet package ready, CHANGELOG, enhanced metadata
- Version bumped to 1.0.0 (feature-complete, 204 tests, zero failures) - Enhanced NuGet description with full feature list - Added package tags: DataChannel, Video, Audio, MediaStream, ICE, DTLS, SCTP, SipSorcery, WebTorrent, P2P, RealTime - Added PackageReleaseNotes - CHANGELOG.md with complete feature list, demo list, test summary Co-Authored-By: Todd Tanner <lostit1278@gmail.com> Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
1 parent ed91140 commit 666c1cd

4 files changed

Lines changed: 521 additions & 481 deletions

File tree

CHANGELOG.md

Lines changed: 39 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,39 @@
1+
# Changelog
2+
3+
## 1.0.0 (2026-04-15)
4+
5+
Initial release. Built from scratch in a single day.
6+
7+
### Features
8+
- Full W3C WebRTC API on browser (Blazor WASM) and desktop (.NET)
9+
- Data channels: string, binary, zero-copy JS types (ArrayBuffer, TypedArray, Blob, DataView)
10+
- Media streams: getUserMedia, getDisplayMedia, tracks, enable/disable, clone
11+
- Transceivers: addTransceiver, direction control, getTransceivers
12+
- ICE: trickle, restart, candidate gathering, STUN/TURN configuration
13+
- SDP: offer/answer, implicit SetLocalDescription (perfect negotiation)
14+
- Stats: GetStats with candidate-pair, transport stats
15+
- DTMF: InsertDTMF, ToneBuffer
16+
- Transport abstractions: DTLS, ICE, SCTP
17+
- Configuration: BundlePolicy, IceTransportPolicy, IceCandidatePoolSize
18+
- RTCTrackerClient: serverless signaling via WebTorrent tracker protocol
19+
- RTCSignalClient: custom WebSocket signal server client
20+
- Signal server: standalone + embedded in test infrastructure
21+
22+
### Demos
23+
- Browser ChatRoom: video/audio/text conference with swarm signaling
24+
- WPF desktop ChatRoom: text chat with peer list
25+
- Console chat: text-only via tracker
26+
- All demos serverless (openwebtorrent tracker, no server deployment)
27+
28+
### Testing
29+
- 204 tests, 0 failures
30+
- Pixel-level video verification (red, blue, split-screen spatial)
31+
- SHA-256 data integrity verification
32+
- Cross-platform desktop-to-browser via embedded signal server AND tracker
33+
- Live openwebtorrent tracker integration test
34+
- 5 simultaneous peer pairs stress test
35+
- 256KB max payload, 100-message burst, 20 channel lifecycle
36+
37+
### SipSorcery Fork
38+
- SRTP profiles restricted to 3 browser-compatible (AES-128-GCM, AES-256-GCM, AES128-CM-SHA1-80)
39+
- TFMs trimmed to net48/net8.0/net9.0/net10.0
Lines changed: 70 additions & 70 deletions
Original file line numberDiff line numberDiff line change
@@ -1,70 +1,70 @@
1-
[21:21:45.685] [T4] Init() started
2-
[21:21:45.688] [T4] Discovering projects...
3-
[21:21:45.737] [T4] Found 3 projects
4-
[21:21:45.739] [T4] Publishing SpawnDev.RTC.Demo...
5-
[21:21:45.740] [T4] RunDotnetAsync: dotnet publish (timeout=300s)
6-
[21:21:45.744] [T4] RunDotnetAsync: started PID=18524
7-
[21:22:01.752] [T10,pool] RunDotnetAsync: done PID=18524 exit=0
8-
[21:22:01.753] [T10,pool] Publish SpawnDev.RTC.Demo: exit=0
9-
[21:22:01.753] [T10,pool] Installing Playwright browsers...
10-
[21:22:02.217] [T10,pool] Creating Playwright instance...
11-
[21:22:02.585] [T16,pool] Launching Chromium (persistent profile: C:\Users\TJ\AppData\Local\Temp\SpawnDev.RTC.PlaywrightProfile)...
12-
[21:22:03.002] [T16,pool] Navigating to https://localhost:5570/tests...
13-
[21:22:03.431] [T16,pool] Page loaded, waiting for test table...
14-
[21:22:04.001] [T13,pool] Test table ready
15-
[21:22:04.400] [T21,pool] Browser tests enumerated: 100 tests
16-
[21:22:04.401] [T21,pool] Publishing SpawnDev.RTC.DemoConsole...
17-
[21:22:04.402] [T21,pool] RunDotnetAsync: dotnet publish (timeout=300s)
18-
[21:22:04.405] [T21,pool] RunDotnetAsync: started PID=24264
19-
[21:22:06.619] [T21,pool] RunDotnetAsync: done PID=24264 exit=0
20-
[21:22:06.620] [T21,pool] Publish SpawnDev.RTC.DemoConsole: exit=0
21-
[21:22:06.621] [T21,pool] Enumerating tests from SpawnDev.RTC.DemoConsole.exe...
22-
[21:22:06.733] [T15,pool] Enumeration done: exit=0, lines=99
23-
[21:22:06.734] [T15,pool] Init() complete. Total projects=2, total tests=200
24-
[21:24:04.310] [T25] [CrossPlatform] Signal room: wss://localhost:5570/signal/crossplatform-test-4da3b8
25-
[21:24:06.834] [T28,pool] [CrossPlatform] Browser result: {browserResult}
26-
[21:24:06.840] [T30] [CrossPlatform] Desktop result: {desktopResultStr}
27-
[21:24:06.841] [T30] [CrossPlatform] SUCCESS - Desktop and browser exchanged data channel messages!
28-
[21:24:06.880] [T25] [Tracker Embedded] URL: wss://localhost:5570/announce, Room: embedded-test-c607ab
29-
[21:24:08.927] [T21,pool] [Tracker Embedded] A connected
30-
[21:24:12.251] [T21,pool] [Tracker Embedded] B connected
31-
[21:24:12.605] [T13,pool] [Tracker Embedded] B peer: -SR0100-
32-
[21:24:12.608] [T21,pool] [Tracker Embedded] A peer: -SR0100-
33-
[21:24:12.609] [T21,pool] [Tracker Embedded] A peer: -SR0100-
34-
[21:24:12.609] [T18,pool] [Tracker Embedded] B peer: -SR0100-
35-
[21:24:12.610] [T21,pool] [Tracker Embedded] A got dc 'data' state=connecting
36-
[21:24:12.610] [T18,pool] [Tracker Embedded] B got dc 'data' state=connecting
37-
[21:24:12.847] [T35] [Tracker Embedded] A got dc 'data' state=open
38-
[21:24:12.880] [T30] [Tracker Embedded] B dc open
39-
[21:24:12.911] [T37] [Tracker Embedded] B got dc 'data' state=open
40-
[21:24:12.942] [T36] [Tracker Embedded] A dc open
41-
[21:24:13.116] [T21,pool] [Tracker Embedded] B sent
42-
[21:24:13.116] [T32,pool] [Tracker Embedded] A sent
43-
[21:24:13.131] [T35] [Tracker Embedded] A got: from B
44-
[21:24:13.131] [T37] [Tracker Embedded] B got: from A
45-
[21:24:13.132] [T37] [Tracker Embedded] A got: from B, B got: from A
46-
[21:24:13.175] [T25] [Tracker Live] Room: live-test-15cb816e
47-
[21:24:13.353] [T18,pool] [Tracker Embedded] A sent
48-
[21:24:13.417] [T18,pool] [Tracker Embedded] B sent
49-
[21:24:13.447] [T21,pool] [Tracker Live] A connected to openwebtorrent
50-
[21:24:15.960] [T27,pool] [Tracker Live] B connected to openwebtorrent
51-
[21:24:16.387] [T27,pool] [Tracker Live] A peer: -SR0100-
52-
[21:24:16.495] [T21,pool] [Tracker Live] B peer: -SR0100-
53-
[21:24:16.496] [T21,pool] [Tracker Live] B got dc 'data' state=connecting
54-
[21:24:16.771] [T36] [Tracker Live] A got dc 'data' state=open
55-
[21:24:16.803] [T39] [Tracker Live] B dc open
56-
[21:24:17.010] [T28,pool] [Tracker Live] B sent
57-
[21:24:17.025] [T36] [Tracker Live] A got: live B
58-
[21:24:17.279] [T28,pool] [Tracker Live] A sent
59-
[21:24:17.311] [T39] [Tracker Live] B got: live A
60-
[21:24:17.312] [T39] [Tracker Live] SUCCESS - A got: live B, B got: live A
61-
[21:24:17.355] [T25] [Tracker XPlat] URL: wss://localhost:5570/announce, Room: xplat-tracker-bda25d
62-
[21:24:19.390] [T28,pool] [Tracker XPlat] Desktop connected
63-
[21:24:20.710] [T32,pool] [Tracker XPlat] Desktop peer: -BR0100-
64-
[21:24:20.711] [T32,pool] [Tracker XPlat] Desktop peer: -BR0100-
65-
[21:24:20.797] [T30] [Tracker XPlat] Desktop got: from browser
66-
[21:24:21.223] [T18,pool] [Tracker XPlat] Desktop sent
67-
[21:24:21.301] [T13,pool] [Tracker XPlat] Desktop sent
68-
[21:24:21.303] [T32,pool] [Tracker XPlat] Browser result: OK:from desktop
69-
[21:24:21.303] [T32,pool] [Tracker XPlat] Desktop result: OK:from browser
70-
[21:24:21.304] [T32,pool] [Tracker XPlat] SUCCESS - Browser and desktop exchanged messages via WebTorrent tracker!
1+
[21:30:25.394] [T4] Init() started
2+
[21:30:25.397] [T4] Discovering projects...
3+
[21:30:25.512] [T4] Found 3 projects
4+
[21:30:25.513] [T4] Publishing SpawnDev.RTC.Demo...
5+
[21:30:25.515] [T4] RunDotnetAsync: dotnet publish (timeout=300s)
6+
[21:30:25.519] [T4] RunDotnetAsync: started PID=23892
7+
[21:30:42.645] [T13,pool] RunDotnetAsync: done PID=23892 exit=0
8+
[21:30:42.646] [T13,pool] Publish SpawnDev.RTC.Demo: exit=0
9+
[21:30:42.646] [T13,pool] Installing Playwright browsers...
10+
[21:30:43.708] [T13,pool] Creating Playwright instance...
11+
[21:30:44.125] [T17,pool] Launching Chromium (persistent profile: C:\Users\TJ\AppData\Local\Temp\SpawnDev.RTC.PlaywrightProfile)...
12+
[21:30:44.854] [T17,pool] Navigating to https://localhost:5570/tests...
13+
[21:30:45.312] [T19,pool] Page loaded, waiting for test table...
14+
[21:30:45.967] [T7,pool] Test table ready
15+
[21:30:46.354] [T7,pool] Browser tests enumerated: 100 tests
16+
[21:30:46.355] [T7,pool] Publishing SpawnDev.RTC.DemoConsole...
17+
[21:30:46.355] [T7,pool] RunDotnetAsync: dotnet publish (timeout=300s)
18+
[21:30:46.359] [T7,pool] RunDotnetAsync: started PID=35300
19+
[21:30:48.777] [T14,pool] RunDotnetAsync: done PID=35300 exit=0
20+
[21:30:48.778] [T14,pool] Publish SpawnDev.RTC.DemoConsole: exit=0
21+
[21:30:48.779] [T14,pool] Enumerating tests from SpawnDev.RTC.DemoConsole.exe...
22+
[21:30:48.970] [T20,pool] Enumeration done: exit=0, lines=99
23+
[21:30:48.971] [T20,pool] Init() complete. Total projects=2, total tests=200
24+
[21:32:46.151] [T23] [CrossPlatform] Signal room: wss://localhost:5570/signal/crossplatform-test-fabc47
25+
[21:32:48.715] [T13,pool] [CrossPlatform] Browser result: {browserResult}
26+
[21:32:48.721] [T29] [CrossPlatform] Desktop result: {desktopResultStr}
27+
[21:32:48.722] [T29] [CrossPlatform] SUCCESS - Desktop and browser exchanged data channel messages!
28+
[21:32:48.763] [T23] [Tracker Embedded] URL: wss://localhost:5570/announce, Room: embedded-test-c1b05d
29+
[21:32:50.812] [T7,pool] [Tracker Embedded] A connected
30+
[21:32:54.123] [T26,pool] [Tracker Embedded] B connected
31+
[21:32:54.418] [T28,pool] [Tracker Embedded] A peer: -SR0100-
32+
[21:32:54.419] [T17,pool] [Tracker Embedded] B peer: -SR0100-
33+
[21:32:54.420] [T17,pool] [Tracker Embedded] B peer: -SR0100-
34+
[21:32:54.420] [T29,pool] [Tracker Embedded] A peer: -SR0100-
35+
[21:32:54.420] [T17,pool] [Tracker Embedded] B got dc 'data' state=connecting
36+
[21:32:54.421] [T29,pool] [Tracker Embedded] A got dc 'data' state=connecting
37+
[21:32:54.582] [T33] [Tracker Embedded] A got dc 'data' state=open
38+
[21:32:54.582] [T34] [Tracker Embedded] B got dc 'data' state=open
39+
[21:32:54.597] [T21] [Tracker Embedded] B dc open
40+
[21:32:54.597] [T18] [Tracker Embedded] A dc open
41+
[21:32:54.931] [T17,pool] [Tracker Embedded] A sent
42+
[21:32:54.931] [T28,pool] [Tracker Embedded] B sent
43+
[21:32:54.963] [T33] [Tracker Embedded] A got: from B
44+
[21:32:54.963] [T34] [Tracker Embedded] B got: from A
45+
[21:32:54.964] [T34] [Tracker Embedded] A got: from B, B got: from A
46+
[21:32:55.008] [T23] [Tracker Live] Room: live-test-70734993
47+
[21:32:55.089] [T28,pool] [Tracker Embedded] A sent
48+
[21:32:55.089] [T7,pool] [Tracker Embedded] B sent
49+
[21:32:55.278] [T7,pool] [Tracker Live] A connected to openwebtorrent
50+
[21:32:57.762] [T28,pool] [Tracker Live] B connected to openwebtorrent
51+
[21:32:58.151] [T31,pool] [Tracker Live] A peer: -SR0100-
52+
[21:32:58.259] [T28,pool] [Tracker Live] B peer: -SR0100-
53+
[21:32:58.260] [T28,pool] [Tracker Live] B got dc 'data' state=connecting
54+
[21:32:58.525] [T35] [Tracker Live] A got dc 'data' state=open
55+
[21:32:58.557] [T36] [Tracker Live] B dc open
56+
[21:32:58.764] [T31,pool] [Tracker Live] B sent
57+
[21:32:58.779] [T35] [Tracker Live] A got: live B
58+
[21:32:59.033] [T7,pool] [Tracker Live] A sent
59+
[21:32:59.065] [T36] [Tracker Live] B got: live A
60+
[21:32:59.066] [T36] [Tracker Live] SUCCESS - A got: live B, B got: live A
61+
[21:32:59.111] [T23] [Tracker XPlat] URL: wss://localhost:5570/announce, Room: xplat-tracker-7901a6
62+
[21:33:01.145] [T7,pool] [Tracker XPlat] Desktop connected
63+
[21:33:02.431] [T13,pool] [Tracker XPlat] Desktop peer: -BR0100-
64+
[21:33:02.432] [T13,pool] [Tracker XPlat] Desktop peer: -BR0100-
65+
[21:33:02.523] [T38] [Tracker XPlat] Desktop got: from browser
66+
[21:33:02.934] [T13,pool] [Tracker XPlat] Desktop sent
67+
[21:33:03.029] [T13,pool] [Tracker XPlat] Desktop sent
68+
[21:33:03.031] [T31,pool] [Tracker XPlat] Browser result: OK:from desktop
69+
[21:33:03.031] [T31,pool] [Tracker XPlat] Desktop result: OK:from browser
70+
[21:33:03.031] [T31,pool] [Tracker XPlat] SUCCESS - Browser and desktop exchanged messages via WebTorrent tracker!

SpawnDev.RTC/SpawnDev.RTC.csproj

Lines changed: 4 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -4,21 +4,22 @@
44
<TargetFramework>net10.0</TargetFramework>
55
<ImplicitUsings>enable</ImplicitUsings>
66
<Nullable>enable</Nullable>
7-
<Version>0.1.0</Version>
7+
<Version>1.0.0</Version>
88
<GeneratePackageOnBuild>True</GeneratePackageOnBuild>
99
<GenerateDocumentationFile>true</GenerateDocumentationFile>
1010
<EmbedAllSources>true</EmbedAllSources>
1111
<DebugType>Embedded</DebugType>
1212
<Title>SpawnDev.RTC</Title>
1313
<Authors>LostBeard</Authors>
14-
<Description>.Net cross platform WebRTC for browser and desktop.</Description>
14+
<Description>Cross-platform WebRTC for .NET. Browser (Blazor WASM) and desktop from a single API. Data channels, audio, video, media streams, tracks, transceivers, ICE, DTLS, SCTP. Zero-copy JS types in WASM. Serverless signaling via WebTorrent tracker protocol. Powered by SpawnDev.BlazorJS (browser) and SipSorcery (desktop).</Description>
1515
<PackageProjectUrl>https://github.com/LostBeard/SpawnDev.RTC</PackageProjectUrl>
1616
<PackageReadmeFile>README.md</PackageReadmeFile>
1717
<PackageLicenseFile>LICENSE.txt</PackageLicenseFile>
1818
<PackageIcon>icon-128.png</PackageIcon>
1919
<RepositoryUrl>https://github.com/LostBeard/SpawnDev.RTC.git</RepositoryUrl>
2020
<RepositoryType>git</RepositoryType>
21-
<PackageTags>Blazor;BlazorWebAssembly;WebRTC;CrossPlatform</PackageTags>
21+
<PackageTags>Blazor;BlazorWebAssembly;WebRTC;CrossPlatform;DataChannel;Video;Audio;MediaStream;ICE;DTLS;SCTP;SipSorcery;WebTorrent;P2P;RealTime</PackageTags>
22+
<PackageReleaseNotes>v1.0.0: Initial release. Full W3C WebRTC API, 204 tests, cross-platform verified (desktop-to-browser), pixel-level video verification, serverless tracker signaling.</PackageReleaseNotes>
2223
<NoPackageAnalysis>true</NoPackageAnalysis>
2324
<EnableDefaultCompileItems>true</EnableDefaultCompileItems>
2425
<IsPackable>true</IsPackable>

0 commit comments

Comments
 (0)