Skip to content

Navigation Menu

Sign in
Appearance settings

Search code, repositories, users, issues, pull requests...

Provide feedback

We read every piece of feedback, and take your input very seriously.

Saved searches

Use saved searches to filter your results more quickly

Sign up
Appearance settings

Commit eb35b9a

Browse files
fix.
1 parent 92157ce commit eb35b9a

File tree

2 files changed

+56
-45
lines changed

2 files changed

+56
-45
lines changed

‎example/lib/pages/settings.dart‎

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1 @@
1+

‎lib/src/whip.dart‎

Lines changed: 55 additions & 45 deletions
Original file line numberDiff line numberDiff line change
@@ -3,10 +3,7 @@ import 'logger.dart';
33
import 'transports/http.dart' if (dart.library.html) 'transports/http_web.dart';
44
import 'utils.dart';
55

6-
enum WhipMode {
7-
kSend,
8-
kReceive,
9-
}
6+
enum WhipMode { kSend, kReceive }
107

118
enum WhipState {
129
kNew,
@@ -25,14 +22,17 @@ class WHIP {
2522
RTCPeerConnection? pc;
2623
late WhipMode mode;
2724
final String url;
28-
String? _sessionUrl;
25+
String? _resourceUrl;
2926
String? _eTag;
3027
Map<String, String>? headers = {};
3128
String? videoCodec;
3229
WHIP({required this.url, this.headers});
3330

34-
Future<void> initlize(
35-
{required WhipMode mode, MediaStream? stream, String? videoCodec}) async {
31+
Future<void> initlize({
32+
required WhipMode mode,
33+
MediaStream? stream,
34+
String? videoCodec,
35+
}) async {
3636
initHttpClient();
3737
if (pc != null) {
3838
return;
@@ -56,23 +56,26 @@ class WHIP {
5656
case WhipMode.kSend:
5757
stream?.getTracks().forEach((track) async {
5858
await pc!.addTransceiver(
59-
track: track,
60-
kind: track.kind == 'audio'
61-
? RTCRtpMediaType.RTCRtpMediaTypeAudio
62-
: RTCRtpMediaType.RTCRtpMediaTypeVideo,
63-
init: RTCRtpTransceiverInit(
64-
direction: TransceiverDirection.SendOnly, streams: [stream]));
59+
track: track,
60+
kind: track.kind == 'audio'
61+
? RTCRtpMediaType.RTCRtpMediaTypeAudio
62+
: RTCRtpMediaType.RTCRtpMediaTypeVideo,
63+
init: RTCRtpTransceiverInit(
64+
direction: TransceiverDirection.SendOnly,
65+
streams: [stream],
66+
),
67+
);
6568
});
6669
break;
6770
case WhipMode.kReceive:
6871
await pc!.addTransceiver(
69-
kind: RTCRtpMediaType.RTCRtpMediaTypeAudio,
70-
init: RTCRtpTransceiverInit(
71-
direction:TransceiverDirection.RecvOnly));
72+
kind: RTCRtpMediaType.RTCRtpMediaTypeAudio,
73+
init: RTCRtpTransceiverInit(direction:TransceiverDirection.RecvOnly),
74+
);
7275
await pc!.addTransceiver(
73-
kind: RTCRtpMediaType.RTCRtpMediaTypeVideo,
74-
init: RTCRtpTransceiverInit(
75-
direction:TransceiverDirection.RecvOnly));
76+
kind: RTCRtpMediaType.RTCRtpMediaTypeVideo,
77+
init: RTCRtpTransceiverInit(direction:TransceiverDirection.RecvOnly),
78+
);
7679
break;
7780
}
7881
log.debug('Initlize whip connection: mode = $mode, stream = ${stream?.id}');
@@ -93,34 +96,36 @@ class WHIP {
9396
var offer = await pc!.getLocalDescription();
9497
final sdp = offer!.sdp;
9598
log.debug('Sending offer: $sdp');
96-
var respose = await httpPost(Uri.parse(url),
97-
headers: {
98-
'Content-Type': 'application/sdp',
99-
if (headers != null) ...headers!
100-
},
101-
body: sdp);
99+
var respose = await httpPost(
100+
Uri.parse(url),
101+
headers: {
102+
'Content-Type': 'application/sdp',
103+
if (headers != null) ...headers!,
104+
},
105+
body: sdp,
106+
);
102107

103108
if (respose.statusCode != 200 && respose.statusCode != 201) {
104109
throw Exception(
105-
'Failed to send offer: ${respose.statusCode}, body ${respose.body}');
110+
'Failed to send offer: ${respose.statusCode}, body ${respose.body}',
111+
);
106112
}
107-
108-
log.debug('Resource URL: $_sessionUrl');
113+
_resourceUrl = respose.headers['location'];
114+
log.debug('Resource URL: $_resourceUrl');
109115
final answer = RTCSessionDescription(respose.body, 'answer');
110116
log.debug('Received answer: ${answer.sdp}');
111117
await pc!.setRemoteDescription(answer);
112118
setState(WhipState.kConnected);
113119

114120
_eTag = respose.headers['etag'];
115121

116-
_sessionUrl = respose.headers['location'];
117-
if (_sessionUrl == null) {
118-
_sessionUrl = url;
122+
if (_resourceUrl == null) {
123+
_resourceUrl = url;
119124
log.warn('Resource url not found, use $url as resource url!');
120125
} else {
121-
if (_sessionUrl!.startsWith('/')) {
126+
if (_resourceUrl!.startsWith('/')) {
122127
var uri = Uri.parse(url);
123-
_sessionUrl = '${uri.origin}$_sessionUrl';
128+
_resourceUrl = '${uri.origin}$_resourceUrl';
124129
}
125130
}
126131
} catch (e) {
@@ -137,10 +142,10 @@ class WHIP {
137142
log.debug('Closing whip connection');
138143
await pc?.close();
139144
try {
140-
if (_sessionUrl == null) {
141-
throw 'Resource url not found!';
145+
if (_resourceUrl == null) {
146+
throw Exception('Resource url not found!');
142147
}
143-
await httpDelete(Uri.parse(_sessionUrl ?? url));
148+
await httpDelete(Uri.parse(_resourceUrl ?? url));
144149
} catch (e) {
145150
log.error('connect error: $e');
146151
setState(WhipState.kFailure);
@@ -155,17 +160,19 @@ class WHIP {
155160
}
156161

157162
void onicecandidate(RTCIceCandidate? candidate) async {
158-
if (candidate == null || _sessionUrl == null) {
163+
if (candidate == null || _resourceUrl == null) {
159164
return;
160165
}
161166
log.debug('Sending candidate: ${candidate.toMap().toString()}');
162167
try {
163-
var respose = await httpPatch(Uri.parse(_sessionUrl!),
164-
headers: {
165-
'Content-Type': 'application/trickle-ice-sdpfrag',
166-
if (headers != null) ...headers!
167-
},
168-
body: candidate.candidate);
168+
var respose = await httpPatch(
169+
Uri.parse(_resourceUrl!),
170+
headers: {
171+
'Content-Type': 'application/trickle-ice-sdpfrag',
172+
if (headers != null) ...headers!,
173+
},
174+
body: candidate.candidate,
175+
);
169176
if (respose.statusCode == 204) {
170177
log.debug('Candidate sent successfully');
171178
return;
@@ -184,8 +191,11 @@ class WHIP {
184191
state = newState;
185192
}
186193

187-
void setPreferredCodec(RTCSessionDescription description,
188-
{String audioCodec = 'opus', String videoCodec = 'vp8'}) {
194+
void setPreferredCodec(
195+
RTCSessionDescription description, {
196+
String audioCodec = 'opus',
197+
String videoCodec = 'vp8',
198+
}) {
189199
var capSel = CodecCapabilitySelector(description.sdp!);
190200
var acaps = capSel.getCapabilities('audio');
191201
if (acaps != null) {

0 commit comments

Comments
(0)

AltStyle によって変換されたページ (->オリジナル) /