Skip to content

Commit 027ede3

Browse files
authored
Send network parameter with current network type (#396)
* Send network parameter with current network type This is only supported on Chrome-like browsers at the moment. * changeset
1 parent 0f6b399 commit 027ede3

File tree

6 files changed

+76
-22
lines changed

6 files changed

+76
-22
lines changed

.changeset/lemon-sloths-jog.md

+5
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,5 @@
1+
---
2+
'livekit-client': patch
3+
---
4+
5+
Send current network type to server

src/api/SignalClient.ts

+4
Original file line numberDiff line numberDiff line change
@@ -640,5 +640,9 @@ function createConnectionParams(token: string, info: ClientInfo, opts?: ConnectO
640640
params.set('adaptive_stream', '1');
641641
}
642642

643+
if (navigator.connection?.type) {
644+
params.set('network', navigator.connection.type);
645+
}
646+
643647
return `?${params.toString()}`;
644648
}

src/proto/google/protobuf/timestamp.ts

+1-1
Original file line numberDiff line numberDiff line change
@@ -199,7 +199,7 @@ export type DeepPartial<T> = T extends Builtin
199199
type KeysOfUnion<T> = T extends T ? keyof T : never;
200200
export type Exact<P, I extends P> = P extends Builtin
201201
? P
202-
: P & { [K in keyof P]: Exact<P[K], I[K]> } & { [K in Exclude<keyof I, KeysOfUnion<P>>]: never };
202+
: P & { [K in keyof P]: Exact<P[K], I[K]> } & Record<Exclude<keyof I, KeysOfUnion<P>>, never>;
203203

204204
function longToNumber(long: Long): number {
205205
if (long.gt(Number.MAX_SAFE_INTEGER)) {

src/proto/livekit_models.ts

+64-19
Original file line numberDiff line numberDiff line change
@@ -550,6 +550,8 @@ export interface ClientInfo {
550550
browser: string;
551551
browserVersion: string;
552552
address: string;
553+
/** wifi, wired, cellular, vpn, empty if not known */
554+
network: string;
553555
}
554556

555557
export enum ClientInfo_SDK {
@@ -638,17 +640,20 @@ export interface RTPStats {
638640
packets: number;
639641
packetRate: number;
640642
bytes: number;
643+
headerBytes: number;
641644
bitrate: number;
642645
packetsLost: number;
643646
packetLossRate: number;
644647
packetLossPercentage: number;
645648
packetsDuplicate: number;
646649
packetDuplicateRate: number;
647650
bytesDuplicate: number;
651+
headerBytesDuplicate: number;
648652
bitrateDuplicate: number;
649653
packetsPadding: number;
650654
packetPaddingRate: number;
651655
bytesPadding: number;
656+
headerBytesPadding: number;
652657
bitratePadding: number;
653658
packetsOutOfOrder: number;
654659
frames: number;
@@ -1958,6 +1963,7 @@ function createBaseClientInfo(): ClientInfo {
19581963
browser: '',
19591964
browserVersion: '',
19601965
address: '',
1966+
network: '',
19611967
};
19621968
}
19631969

@@ -1990,6 +1996,9 @@ export const ClientInfo = {
19901996
if (message.address !== '') {
19911997
writer.uint32(74).string(message.address);
19921998
}
1999+
if (message.network !== '') {
2000+
writer.uint32(82).string(message.network);
2001+
}
19932002
return writer;
19942003
},
19952004

@@ -2027,6 +2036,9 @@ export const ClientInfo = {
20272036
case 9:
20282037
message.address = reader.string();
20292038
break;
2039+
case 10:
2040+
message.network = reader.string();
2041+
break;
20302042
default:
20312043
reader.skipType(tag & 7);
20322044
break;
@@ -2046,6 +2058,7 @@ export const ClientInfo = {
20462058
browser: isSet(object.browser) ? String(object.browser) : '',
20472059
browserVersion: isSet(object.browserVersion) ? String(object.browserVersion) : '',
20482060
address: isSet(object.address) ? String(object.address) : '',
2061+
network: isSet(object.network) ? String(object.network) : '',
20492062
};
20502063
},
20512064

@@ -2060,6 +2073,7 @@ export const ClientInfo = {
20602073
message.browser !== undefined && (obj.browser = message.browser);
20612074
message.browserVersion !== undefined && (obj.browserVersion = message.browserVersion);
20622075
message.address !== undefined && (obj.address = message.address);
2076+
message.network !== undefined && (obj.network = message.network);
20632077
return obj;
20642078
},
20652079

@@ -2074,6 +2088,7 @@ export const ClientInfo = {
20742088
message.browser = object.browser ?? '';
20752089
message.browserVersion = object.browserVersion ?? '';
20762090
message.address = object.address ?? '';
2091+
message.network = object.network ?? '';
20772092
return message;
20782093
},
20792094
};
@@ -2288,17 +2303,20 @@ function createBaseRTPStats(): RTPStats {
22882303
packets: 0,
22892304
packetRate: 0,
22902305
bytes: 0,
2306+
headerBytes: 0,
22912307
bitrate: 0,
22922308
packetsLost: 0,
22932309
packetLossRate: 0,
22942310
packetLossPercentage: 0,
22952311
packetsDuplicate: 0,
22962312
packetDuplicateRate: 0,
22972313
bytesDuplicate: 0,
2314+
headerBytesDuplicate: 0,
22982315
bitrateDuplicate: 0,
22992316
packetsPadding: 0,
23002317
packetPaddingRate: 0,
23012318
bytesPadding: 0,
2319+
headerBytesPadding: 0,
23022320
bitratePadding: 0,
23032321
packetsOutOfOrder: 0,
23042322
frames: 0,
@@ -2343,6 +2361,9 @@ export const RTPStats = {
23432361
if (message.bytes !== 0) {
23442362
writer.uint32(48).uint64(message.bytes);
23452363
}
2364+
if (message.headerBytes !== 0) {
2365+
writer.uint32(312).uint64(message.headerBytes);
2366+
}
23462367
if (message.bitrate !== 0) {
23472368
writer.uint32(57).double(message.bitrate);
23482369
}
@@ -2364,6 +2385,9 @@ export const RTPStats = {
23642385
if (message.bytesDuplicate !== 0) {
23652386
writer.uint32(104).uint64(message.bytesDuplicate);
23662387
}
2388+
if (message.headerBytesDuplicate !== 0) {
2389+
writer.uint32(320).uint64(message.headerBytesDuplicate);
2390+
}
23672391
if (message.bitrateDuplicate !== 0) {
23682392
writer.uint32(113).double(message.bitrateDuplicate);
23692393
}
@@ -2376,6 +2400,9 @@ export const RTPStats = {
23762400
if (message.bytesPadding !== 0) {
23772401
writer.uint32(136).uint64(message.bytesPadding);
23782402
}
2403+
if (message.headerBytesPadding !== 0) {
2404+
writer.uint32(328).uint64(message.headerBytesPadding);
2405+
}
23792406
if (message.bitratePadding !== 0) {
23802407
writer.uint32(145).double(message.bitratePadding);
23812408
}
@@ -2470,6 +2497,9 @@ export const RTPStats = {
24702497
case 6:
24712498
message.bytes = longToNumber(reader.uint64() as Long);
24722499
break;
2500+
case 39:
2501+
message.headerBytes = longToNumber(reader.uint64() as Long);
2502+
break;
24732503
case 7:
24742504
message.bitrate = reader.double();
24752505
break;
@@ -2491,6 +2521,9 @@ export const RTPStats = {
24912521
case 13:
24922522
message.bytesDuplicate = longToNumber(reader.uint64() as Long);
24932523
break;
2524+
case 40:
2525+
message.headerBytesDuplicate = longToNumber(reader.uint64() as Long);
2526+
break;
24942527
case 14:
24952528
message.bitrateDuplicate = reader.double();
24962529
break;
@@ -2503,6 +2536,9 @@ export const RTPStats = {
25032536
case 17:
25042537
message.bytesPadding = longToNumber(reader.uint64() as Long);
25052538
break;
2539+
case 41:
2540+
message.headerBytesPadding = longToNumber(reader.uint64() as Long);
2541+
break;
25062542
case 18:
25072543
message.bitratePadding = reader.double();
25082544
break;
@@ -2585,6 +2621,7 @@ export const RTPStats = {
25852621
packets: isSet(object.packets) ? Number(object.packets) : 0,
25862622
packetRate: isSet(object.packetRate) ? Number(object.packetRate) : 0,
25872623
bytes: isSet(object.bytes) ? Number(object.bytes) : 0,
2624+
headerBytes: isSet(object.headerBytes) ? Number(object.headerBytes) : 0,
25882625
bitrate: isSet(object.bitrate) ? Number(object.bitrate) : 0,
25892626
packetsLost: isSet(object.packetsLost) ? Number(object.packetsLost) : 0,
25902627
packetLossRate: isSet(object.packetLossRate) ? Number(object.packetLossRate) : 0,
@@ -2596,10 +2633,14 @@ export const RTPStats = {
25962633
? Number(object.packetDuplicateRate)
25972634
: 0,
25982635
bytesDuplicate: isSet(object.bytesDuplicate) ? Number(object.bytesDuplicate) : 0,
2636+
headerBytesDuplicate: isSet(object.headerBytesDuplicate)
2637+
? Number(object.headerBytesDuplicate)
2638+
: 0,
25992639
bitrateDuplicate: isSet(object.bitrateDuplicate) ? Number(object.bitrateDuplicate) : 0,
26002640
packetsPadding: isSet(object.packetsPadding) ? Number(object.packetsPadding) : 0,
26012641
packetPaddingRate: isSet(object.packetPaddingRate) ? Number(object.packetPaddingRate) : 0,
26022642
bytesPadding: isSet(object.bytesPadding) ? Number(object.bytesPadding) : 0,
2643+
headerBytesPadding: isSet(object.headerBytesPadding) ? Number(object.headerBytesPadding) : 0,
26032644
bitratePadding: isSet(object.bitratePadding) ? Number(object.bitratePadding) : 0,
26042645
packetsOutOfOrder: isSet(object.packetsOutOfOrder) ? Number(object.packetsOutOfOrder) : 0,
26052646
frames: isSet(object.frames) ? Number(object.frames) : 0,
@@ -2642,6 +2683,7 @@ export const RTPStats = {
26422683
message.packets !== undefined && (obj.packets = Math.round(message.packets));
26432684
message.packetRate !== undefined && (obj.packetRate = message.packetRate);
26442685
message.bytes !== undefined && (obj.bytes = Math.round(message.bytes));
2686+
message.headerBytes !== undefined && (obj.headerBytes = Math.round(message.headerBytes));
26452687
message.bitrate !== undefined && (obj.bitrate = message.bitrate);
26462688
message.packetsLost !== undefined && (obj.packetsLost = Math.round(message.packetsLost));
26472689
message.packetLossRate !== undefined && (obj.packetLossRate = message.packetLossRate);
@@ -2653,11 +2695,15 @@ export const RTPStats = {
26532695
(obj.packetDuplicateRate = message.packetDuplicateRate);
26542696
message.bytesDuplicate !== undefined &&
26552697
(obj.bytesDuplicate = Math.round(message.bytesDuplicate));
2698+
message.headerBytesDuplicate !== undefined &&
2699+
(obj.headerBytesDuplicate = Math.round(message.headerBytesDuplicate));
26562700
message.bitrateDuplicate !== undefined && (obj.bitrateDuplicate = message.bitrateDuplicate);
26572701
message.packetsPadding !== undefined &&
26582702
(obj.packetsPadding = Math.round(message.packetsPadding));
26592703
message.packetPaddingRate !== undefined && (obj.packetPaddingRate = message.packetPaddingRate);
26602704
message.bytesPadding !== undefined && (obj.bytesPadding = Math.round(message.bytesPadding));
2705+
message.headerBytesPadding !== undefined &&
2706+
(obj.headerBytesPadding = Math.round(message.headerBytesPadding));
26612707
message.bitratePadding !== undefined && (obj.bitratePadding = message.bitratePadding);
26622708
message.packetsOutOfOrder !== undefined &&
26632709
(obj.packetsOutOfOrder = Math.round(message.packetsOutOfOrder));
@@ -2697,17 +2743,20 @@ export const RTPStats = {
26972743
message.packets = object.packets ?? 0;
26982744
message.packetRate = object.packetRate ?? 0;
26992745
message.bytes = object.bytes ?? 0;
2746+
message.headerBytes = object.headerBytes ?? 0;
27002747
message.bitrate = object.bitrate ?? 0;
27012748
message.packetsLost = object.packetsLost ?? 0;
27022749
message.packetLossRate = object.packetLossRate ?? 0;
27032750
message.packetLossPercentage = object.packetLossPercentage ?? 0;
27042751
message.packetsDuplicate = object.packetsDuplicate ?? 0;
27052752
message.packetDuplicateRate = object.packetDuplicateRate ?? 0;
27062753
message.bytesDuplicate = object.bytesDuplicate ?? 0;
2754+
message.headerBytesDuplicate = object.headerBytesDuplicate ?? 0;
27072755
message.bitrateDuplicate = object.bitrateDuplicate ?? 0;
27082756
message.packetsPadding = object.packetsPadding ?? 0;
27092757
message.packetPaddingRate = object.packetPaddingRate ?? 0;
27102758
message.bytesPadding = object.bytesPadding ?? 0;
2759+
message.headerBytesPadding = object.headerBytesPadding ?? 0;
27112760
message.bitratePadding = object.bitratePadding ?? 0;
27122761
message.packetsOutOfOrder = object.packetsOutOfOrder ?? 0;
27132762
message.frames = object.frames ?? 0;
@@ -2872,29 +2921,25 @@ var globalThis: any = (() => {
28722921
throw 'Unable to locate global object';
28732922
})();
28742923

2924+
const atob: (b64: string) => string =
2925+
globalThis.atob || ((b64) => globalThis.Buffer.from(b64, 'base64').toString('binary'));
28752926
function bytesFromBase64(b64: string): Uint8Array {
2876-
if (globalThis.Buffer) {
2877-
return Uint8Array.from(globalThis.Buffer.from(b64, 'base64'));
2878-
} else {
2879-
const bin = globalThis.atob(b64);
2880-
const arr = new Uint8Array(bin.length);
2881-
for (let i = 0; i < bin.length; ++i) {
2882-
arr[i] = bin.charCodeAt(i);
2883-
}
2884-
return arr;
2927+
const bin = atob(b64);
2928+
const arr = new Uint8Array(bin.length);
2929+
for (let i = 0; i < bin.length; ++i) {
2930+
arr[i] = bin.charCodeAt(i);
28852931
}
2932+
return arr;
28862933
}
28872934

2935+
const btoa: (bin: string) => string =
2936+
globalThis.btoa || ((bin) => globalThis.Buffer.from(bin, 'binary').toString('base64'));
28882937
function base64FromBytes(arr: Uint8Array): string {
2889-
if (globalThis.Buffer) {
2890-
return globalThis.Buffer.from(arr).toString('base64');
2891-
} else {
2892-
const bin: string[] = [];
2893-
arr.forEach((byte) => {
2894-
bin.push(String.fromCharCode(byte));
2895-
});
2896-
return globalThis.btoa(bin.join(''));
2897-
}
2938+
const bin: string[] = [];
2939+
arr.forEach((byte) => {
2940+
bin.push(String.fromCharCode(byte));
2941+
});
2942+
return btoa(bin.join(''));
28982943
}
28992944

29002945
type Builtin = Date | Function | Uint8Array | string | number | boolean | undefined;
@@ -2914,7 +2959,7 @@ export type DeepPartial<T> = T extends Builtin
29142959
type KeysOfUnion<T> = T extends T ? keyof T : never;
29152960
export type Exact<P, I extends P> = P extends Builtin
29162961
? P
2917-
: P & { [K in keyof P]: Exact<P[K], I[K]> } & { [K in Exclude<keyof I, KeysOfUnion<P>>]: never };
2962+
: P & { [K in keyof P]: Exact<P[K], I[K]> } & Record<Exclude<keyof I, KeysOfUnion<P>>, never>;
29182963

29192964
function toTimestamp(date: Date): Timestamp {
29202965
const seconds = date.getTime() / 1_000;

src/proto/livekit_rtc.ts

+1-1
Original file line numberDiff line numberDiff line change
@@ -3480,7 +3480,7 @@ export type DeepPartial<T> = T extends Builtin
34803480
type KeysOfUnion<T> = T extends T ? keyof T : never;
34813481
export type Exact<P, I extends P> = P extends Builtin
34823482
? P
3483-
: P & { [K in keyof P]: Exact<P[K], I[K]> } & { [K in Exclude<keyof I, KeysOfUnion<P>>]: never };
3483+
: P & { [K in keyof P]: Exact<P[K], I[K]> } & Record<Exclude<keyof I, KeysOfUnion<P>>, never>;
34843484

34853485
function longToNumber(long: Long): number {
34863486
if (long.gt(Number.MAX_SAFE_INTEGER)) {

0 commit comments

Comments
 (0)