@gjsify/webrtc 0.1.15

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (117) hide show
  1. package/lib/esm/get-user-media.js +93 -0
  2. package/lib/esm/gst-enum-maps.js +88 -0
  3. package/lib/esm/gst-init.js +34 -0
  4. package/lib/esm/gst-stats-parser.js +79 -0
  5. package/lib/esm/gst-utils.js +16 -0
  6. package/lib/esm/index.js +53 -0
  7. package/lib/esm/media-device-info.js +23 -0
  8. package/lib/esm/media-devices.js +147 -0
  9. package/lib/esm/media-stream-track.js +142 -0
  10. package/lib/esm/media-stream.js +78 -0
  11. package/lib/esm/register/data-channel.js +8 -0
  12. package/lib/esm/register/error.js +8 -0
  13. package/lib/esm/register/media-devices.js +7 -0
  14. package/lib/esm/register/media.js +12 -0
  15. package/lib/esm/register/peer-connection.js +16 -0
  16. package/lib/esm/register.js +5 -0
  17. package/lib/esm/rtc-certificate.js +70 -0
  18. package/lib/esm/rtc-data-channel.js +266 -0
  19. package/lib/esm/rtc-dtls-transport.js +41 -0
  20. package/lib/esm/rtc-dtmf-sender.js +109 -0
  21. package/lib/esm/rtc-error.js +24 -0
  22. package/lib/esm/rtc-events.js +35 -0
  23. package/lib/esm/rtc-ice-candidate.js +75 -0
  24. package/lib/esm/rtc-ice-transport.js +96 -0
  25. package/lib/esm/rtc-peer-connection.js +855 -0
  26. package/lib/esm/rtc-rtp-receiver.js +91 -0
  27. package/lib/esm/rtc-rtp-sender.js +298 -0
  28. package/lib/esm/rtc-rtp-transceiver.js +97 -0
  29. package/lib/esm/rtc-sctp-transport.js +40 -0
  30. package/lib/esm/rtc-session-description.js +57 -0
  31. package/lib/esm/rtc-stats-report.js +35 -0
  32. package/lib/esm/rtc-track-event.js +29 -0
  33. package/lib/esm/rtp-capabilities.js +41 -0
  34. package/lib/esm/tee-multiplexer.js +62 -0
  35. package/lib/esm/wpt-helpers.js +122 -0
  36. package/lib/types/get-user-media.d.ts +14 -0
  37. package/lib/types/gst-enum-maps.d.ts +10 -0
  38. package/lib/types/gst-init.d.ts +5 -0
  39. package/lib/types/gst-stats-parser.d.ts +16 -0
  40. package/lib/types/gst-utils.d.ts +11 -0
  41. package/lib/types/index.d.ts +41 -0
  42. package/lib/types/media-device-info.d.ts +14 -0
  43. package/lib/types/media-devices.d.ts +12 -0
  44. package/lib/types/media-stream-track.d.ts +59 -0
  45. package/lib/types/media-stream.d.ts +28 -0
  46. package/lib/types/register/data-channel.d.ts +1 -0
  47. package/lib/types/register/error.d.ts +1 -0
  48. package/lib/types/register/media-devices.d.ts +1 -0
  49. package/lib/types/register/media.d.ts +1 -0
  50. package/lib/types/register/peer-connection.d.ts +1 -0
  51. package/lib/types/register.d.ts +5 -0
  52. package/lib/types/register.spec.d.ts +3 -0
  53. package/lib/types/rtc-certificate.d.ts +23 -0
  54. package/lib/types/rtc-data-channel.d.ts +64 -0
  55. package/lib/types/rtc-dtls-transport.d.ts +20 -0
  56. package/lib/types/rtc-dtmf-sender.d.ts +31 -0
  57. package/lib/types/rtc-error.d.ts +19 -0
  58. package/lib/types/rtc-events.d.ts +27 -0
  59. package/lib/types/rtc-ice-candidate.d.ts +28 -0
  60. package/lib/types/rtc-ice-transport.d.ts +56 -0
  61. package/lib/types/rtc-peer-connection.d.ts +165 -0
  62. package/lib/types/rtc-rtp-receiver.d.ts +45 -0
  63. package/lib/types/rtc-rtp-sender.d.ts +98 -0
  64. package/lib/types/rtc-rtp-transceiver.d.ts +20 -0
  65. package/lib/types/rtc-sctp-transport.d.ts +20 -0
  66. package/lib/types/rtc-session-description.d.ts +18 -0
  67. package/lib/types/rtc-stats-report.d.ts +22 -0
  68. package/lib/types/rtc-track-event.d.ts +18 -0
  69. package/lib/types/rtp-capabilities.d.ts +3 -0
  70. package/lib/types/tee-multiplexer.d.ts +25 -0
  71. package/lib/types/webrtc.spec.d.ts +2 -0
  72. package/lib/types/wpt-helpers.d.ts +30 -0
  73. package/lib/types/wpt-media.spec.d.ts +2 -0
  74. package/lib/types/wpt.spec.d.ts +2 -0
  75. package/package.json +74 -0
  76. package/src/get-user-media.ts +131 -0
  77. package/src/gst-enum-maps.ts +125 -0
  78. package/src/gst-init.ts +52 -0
  79. package/src/gst-stats-parser.ts +137 -0
  80. package/src/gst-utils.ts +41 -0
  81. package/src/index.ts +104 -0
  82. package/src/media-device-info.ts +33 -0
  83. package/src/media-devices.ts +191 -0
  84. package/src/media-stream-track.ts +159 -0
  85. package/src/media-stream.ts +96 -0
  86. package/src/register/data-channel.ts +11 -0
  87. package/src/register/error.ts +11 -0
  88. package/src/register/media-devices.ts +10 -0
  89. package/src/register/media.ts +15 -0
  90. package/src/register/peer-connection.ts +20 -0
  91. package/src/register.spec.ts +55 -0
  92. package/src/register.ts +10 -0
  93. package/src/rtc-certificate.ts +110 -0
  94. package/src/rtc-data-channel.ts +284 -0
  95. package/src/rtc-dtls-transport.ts +48 -0
  96. package/src/rtc-dtmf-sender.ts +146 -0
  97. package/src/rtc-error.ts +49 -0
  98. package/src/rtc-events.ts +64 -0
  99. package/src/rtc-ice-candidate.ts +115 -0
  100. package/src/rtc-ice-transport.ts +104 -0
  101. package/src/rtc-peer-connection.ts +1017 -0
  102. package/src/rtc-rtp-receiver.ts +122 -0
  103. package/src/rtc-rtp-sender.ts +444 -0
  104. package/src/rtc-rtp-transceiver.ts +127 -0
  105. package/src/rtc-sctp-transport.ts +48 -0
  106. package/src/rtc-session-description.ts +64 -0
  107. package/src/rtc-stats-report.ts +39 -0
  108. package/src/rtc-track-event.ts +45 -0
  109. package/src/rtp-capabilities.ts +48 -0
  110. package/src/tee-multiplexer.ts +75 -0
  111. package/src/test.mts +11 -0
  112. package/src/webrtc.spec.ts +1186 -0
  113. package/src/wpt-helpers.ts +156 -0
  114. package/src/wpt-media.spec.ts +1154 -0
  115. package/src/wpt.spec.ts +1136 -0
  116. package/tsconfig.json +36 -0
  117. package/tsconfig.tsbuildinfo +1 -0
@@ -0,0 +1,62 @@
1
+ import { Gst } from "./gst-init.js";
2
+ class TeeMultiplexer {
3
+ _tee;
4
+ // Gst.Element
5
+ _pipeline;
6
+ // Gst.Pipeline
7
+ _branchCount = 0;
8
+ /**
9
+ * Create a tee in the given pipeline and link it to the source's output.
10
+ * The source must already be in the pipeline.
11
+ */
12
+ constructor(pipeline, source) {
13
+ this._pipeline = pipeline;
14
+ this._tee = Gst.ElementFactory.make("tee", null);
15
+ this._tee.allow_not_linked = true;
16
+ pipeline.add(this._tee);
17
+ this._tee.sync_state_with_parent();
18
+ source.link(this._tee);
19
+ }
20
+ /** Request a new src pad from the tee for a consumer branch. */
21
+ requestSrcPad() {
22
+ const padName = "src_%u";
23
+ const srcPad = this._tee.request_pad_simple ? this._tee.request_pad_simple(padName) : this._tee.get_request_pad(padName);
24
+ if (srcPad) this._branchCount++;
25
+ return srcPad;
26
+ }
27
+ /**
28
+ * Release a branch's src pad from the tee.
29
+ * Adds a DROP probe before unlinking to prevent errors.
30
+ */
31
+ releaseSrcPad(srcPad) {
32
+ if (!srcPad) return;
33
+ try {
34
+ srcPad.add_probe(
35
+ Gst.PadProbeType.BLOCK_DOWNSTREAM,
36
+ () => Gst.PadProbeReturn.DROP
37
+ );
38
+ } catch {
39
+ }
40
+ try {
41
+ const peer = srcPad.get_peer();
42
+ if (peer) srcPad.unlink(peer);
43
+ } catch {
44
+ }
45
+ try {
46
+ this._tee.release_request_pad(srcPad);
47
+ } catch {
48
+ }
49
+ this._branchCount--;
50
+ }
51
+ /** Number of active branches. */
52
+ get branchCount() {
53
+ return this._branchCount;
54
+ }
55
+ /** The tee element (for pipeline queries). */
56
+ get element() {
57
+ return this._tee;
58
+ }
59
+ }
60
+ export {
61
+ TeeMultiplexer
62
+ };
@@ -0,0 +1,122 @@
1
+ import {
2
+ RTCPeerConnection
3
+ } from "./index.js";
4
+ function createPeerConnection() {
5
+ return new RTCPeerConnection();
6
+ }
7
+ async function exchangeOfferAnswer(pc1, pc2) {
8
+ pc1.onicecandidate = (ev) => {
9
+ if (ev.candidate) pc2.addIceCandidate(ev.candidate.toJSON()).catch(() => {
10
+ });
11
+ };
12
+ pc2.onicecandidate = (ev) => {
13
+ if (ev.candidate) pc1.addIceCandidate(ev.candidate.toJSON()).catch(() => {
14
+ });
15
+ };
16
+ const offer = await pc1.createOffer();
17
+ await pc1.setLocalDescription(offer);
18
+ await pc2.setRemoteDescription(offer);
19
+ const answer = await pc2.createAnswer();
20
+ await pc2.setLocalDescription(answer);
21
+ await pc1.setRemoteDescription(answer);
22
+ }
23
+ async function createDataChannelPair(options = {}, pc1 = createPeerConnection(), pc2 = createPeerConnection(), label = "wpt") {
24
+ let pair;
25
+ let bothOpen;
26
+ if (options.negotiated) {
27
+ const dc1 = pc1.createDataChannel(label, options);
28
+ const dc2 = pc2.createDataChannel(label, options);
29
+ pair = [dc1, dc2];
30
+ bothOpen = Promise.all(pair.map((dc) => new Promise((res, rej) => {
31
+ if (dc.readyState === "open") return res();
32
+ dc.onopen = () => res();
33
+ dc.onerror = (ev) => rej(ev?.error ?? new Error("onerror"));
34
+ })));
35
+ } else {
36
+ const dc1 = pc1.createDataChannel(label, options);
37
+ bothOpen = Promise.all([
38
+ new Promise((res, rej) => {
39
+ if (dc1.readyState === "open") return res();
40
+ dc1.onopen = () => res();
41
+ dc1.onerror = (ev) => rej(ev?.error ?? new Error("onerror"));
42
+ }),
43
+ new Promise((res, rej) => {
44
+ pc2.ondatachannel = (ev) => {
45
+ const dc2 = ev.channel;
46
+ if (dc2.readyState === "open") return res(dc2);
47
+ dc2.onopen = () => res(dc2);
48
+ dc2.onerror = (e) => rej(e?.error ?? new Error("onerror"));
49
+ };
50
+ }).then((dc2) => {
51
+ pair[1] = dc2;
52
+ })
53
+ ]);
54
+ pair = [dc1, void 0];
55
+ }
56
+ await exchangeOfferAnswer(pc1, pc2);
57
+ await bothOpen;
58
+ return [pair[0], pair[1], pc1, pc2];
59
+ }
60
+ function awaitMessage(channel) {
61
+ return new Promise((resolve, reject) => {
62
+ const messageHandler = (ev) => {
63
+ channel.removeEventListener("message", messageHandler);
64
+ channel.removeEventListener("error", errorHandler);
65
+ resolve(ev.data);
66
+ };
67
+ const errorHandler = (ev) => {
68
+ channel.removeEventListener("message", messageHandler);
69
+ channel.removeEventListener("error", errorHandler);
70
+ reject(ev?.error ?? new Error("channel error"));
71
+ };
72
+ channel.addEventListener("message", messageHandler);
73
+ channel.addEventListener("error", errorHandler);
74
+ });
75
+ }
76
+ class EventWatcher {
77
+ _events = [];
78
+ _waiters = [];
79
+ constructor(target, eventTypes) {
80
+ for (const type of eventTypes) {
81
+ target.addEventListener(type, () => {
82
+ this._events.push(type);
83
+ this._tryResolve();
84
+ });
85
+ }
86
+ }
87
+ wait_for(expected) {
88
+ const types = Array.isArray(expected) ? expected : [expected];
89
+ return new Promise((resolve, reject) => {
90
+ this._waiters.push({ types, resolve, reject });
91
+ this._tryResolve();
92
+ });
93
+ }
94
+ _tryResolve() {
95
+ while (this._waiters.length > 0 && this._events.length >= this._waiters[0].types.length) {
96
+ const waiter = this._waiters.shift();
97
+ const got = this._events.splice(0, waiter.types.length);
98
+ const matches = waiter.types.every((t, i) => got[i] === t);
99
+ if (matches) {
100
+ waiter.resolve();
101
+ } else {
102
+ waiter.reject(new Error(`EventWatcher: expected ${JSON.stringify(waiter.types)}, got ${JSON.stringify(got)}`));
103
+ }
104
+ }
105
+ }
106
+ }
107
+ function closePeerConnections(...pcs) {
108
+ for (const pc of pcs) {
109
+ try {
110
+ pc?.close();
111
+ } catch {
112
+ }
113
+ }
114
+ }
115
+ export {
116
+ EventWatcher,
117
+ awaitMessage,
118
+ closePeerConnections,
119
+ createDataChannelPair,
120
+ createPeerConnection,
121
+ exchangeOfferAnswer
122
+ };
@@ -0,0 +1,14 @@
1
+ import { MediaStream } from './media-stream.js';
2
+ export interface MediaTrackConstraints {
3
+ deviceId?: string;
4
+ sampleRate?: number;
5
+ channelCount?: number;
6
+ width?: number;
7
+ height?: number;
8
+ frameRate?: number;
9
+ }
10
+ export interface MediaStreamConstraints {
11
+ audio?: boolean | MediaTrackConstraints;
12
+ video?: boolean | MediaTrackConstraints;
13
+ }
14
+ export declare function getUserMedia(constraints: MediaStreamConstraints): Promise<MediaStream>;
@@ -0,0 +1,10 @@
1
+ import type { RTCSignalingState, RTCPeerConnectionState, RTCIceConnectionState, RTCIceGatheringState } from './rtc-peer-connection.js';
2
+ import type { RTCRtpTransceiverDirection } from './rtc-rtp-sender.js';
3
+ export declare function gstToSignalingState(v: number): RTCSignalingState;
4
+ export declare function gstToConnectionState(v: number): RTCPeerConnectionState;
5
+ export declare function gstToIceConnectionState(v: number): RTCIceConnectionState;
6
+ export declare function gstToIceGatheringState(v: number): RTCIceGatheringState;
7
+ export declare function gstDirectionToW3C(v: number): RTCRtpTransceiverDirection;
8
+ export declare function w3cDirectionToGst(d: RTCRtpTransceiverDirection): number;
9
+ export type RTCStatsType = 'codec' | 'inbound-rtp' | 'outbound-rtp' | 'remote-inbound-rtp' | 'remote-outbound-rtp' | 'csrc' | 'peer-connection' | 'data-channel' | 'stream' | 'transport' | 'candidate-pair' | 'local-candidate' | 'remote-candidate' | 'certificate';
10
+ export declare function gstToStatsType(v: number): RTCStatsType | undefined;
@@ -0,0 +1,5 @@
1
+ import Gst from 'gi://Gst?version=1.0';
2
+ export declare function ensureGstInit(): void;
3
+ /** Throws if the `webrtcbin` element is not registered (gst-plugins-bad missing). */
4
+ export declare function ensureWebrtcbinAvailable(): void;
5
+ export { Gst };
@@ -0,0 +1,16 @@
1
+ import type Gst from 'gi://Gst?version=1.0';
2
+ import { RTCStatsReport } from './rtc-stats-report.js';
3
+ /**
4
+ * Parse the top-level GstStructure returned by webrtcbin's `get-stats`
5
+ * signal into a W3C RTCStatsReport.
6
+ *
7
+ * The top-level structure has one field per stats entry. Each field's value
8
+ * is a nested GstStructure (GJS unboxes boxed types automatically).
9
+ */
10
+ export declare function parseGstStats(reply: Gst.Structure | null): RTCStatsReport;
11
+ /**
12
+ * Filter an RTCStatsReport to entries relevant to a specific track identifier.
13
+ * Used by RTCRtpSender.getStats() and RTCRtpReceiver.getStats() to return
14
+ * only the stats associated with their track.
15
+ */
16
+ export declare function filterStatsByTrackId(report: RTCStatsReport, trackId: string): RTCStatsReport;
@@ -0,0 +1,11 @@
1
+ import type Gst from 'gi://Gst?version=1.0';
2
+ /**
3
+ * Wrap a GstPromise-consuming emit into a JS Promise that resolves on the
4
+ * main thread.
5
+ *
6
+ * Usage:
7
+ * const reply = await withGstPromise((promise) => {
8
+ * webrtcbin.emit('create-offer', options, promise);
9
+ * });
10
+ */
11
+ export declare function withGstPromise(emit: (promise: Gst.Promise) => void): Promise<Gst.Structure | null>;
@@ -0,0 +1,41 @@
1
+ export { RTCPeerConnection } from './rtc-peer-connection.js';
2
+ export type { RTCConfiguration, RTCIceServer, RTCOfferOptions, RTCAnswerOptions, RTCDataChannelInit, RTCSignalingState, RTCPeerConnectionState, RTCIceConnectionState, RTCIceGatheringState, RTCIceTransportPolicy, RTCBundlePolicy, RTCRtcpMuxPolicy, } from './rtc-peer-connection.js';
3
+ export { RTCDataChannel } from './rtc-data-channel.js';
4
+ export type { RTCDataChannelState, BinaryType } from './rtc-data-channel.js';
5
+ export { RTCSessionDescription } from './rtc-session-description.js';
6
+ export type { RTCSessionDescriptionInit, RTCSdpType } from './rtc-session-description.js';
7
+ export { RTCIceCandidate } from './rtc-ice-candidate.js';
8
+ export type { RTCIceCandidateInit, RTCIceComponent, RTCIceProtocol, RTCIceCandidateType, RTCIceTcpCandidateType, } from './rtc-ice-candidate.js';
9
+ export { RTCError } from './rtc-error.js';
10
+ export type { RTCErrorInit, RTCErrorDetailType } from './rtc-error.js';
11
+ export { RTCPeerConnectionIceEvent, RTCDataChannelEvent, RTCErrorEvent, } from './rtc-events.js';
12
+ export type { RTCPeerConnectionIceEventInit, RTCDataChannelEventInit, RTCErrorEventInit, } from './rtc-events.js';
13
+ export { RTCRtpSender } from './rtc-rtp-sender.js';
14
+ export type { RTCRtpTransceiverDirection, RTCRtpCapabilities, RTCRtpCodecCapability, RTCRtpHeaderExtensionCapability, RTCRtpSendParameters, RTCRtpEncodingParameters, RTCRtpCodecParameters, RTCRtpHeaderExtensionParameters, RTCRtcpParameters, } from './rtc-rtp-sender.js';
15
+ export { RTCRtpReceiver } from './rtc-rtp-receiver.js';
16
+ export type { RTCRtpReceiveParameters } from './rtc-rtp-receiver.js';
17
+ export { RTCRtpTransceiver } from './rtc-rtp-transceiver.js';
18
+ export { MediaStream } from './media-stream.js';
19
+ export { MediaStreamTrackEvent } from './media-stream.js';
20
+ export { MediaStreamTrack } from './media-stream-track.js';
21
+ export type { MediaStreamTrackInit } from './media-stream-track.js';
22
+ export { RTCTrackEvent } from './rtc-track-event.js';
23
+ export type { RTCTrackEventInit } from './rtc-track-event.js';
24
+ export type { RTCRtpTransceiverInit } from './rtc-peer-connection.js';
25
+ export { getUserMedia } from './get-user-media.js';
26
+ export type { MediaStreamConstraints, MediaTrackConstraints } from './get-user-media.js';
27
+ export { MediaDevices } from './media-devices.js';
28
+ export { MediaDeviceInfo } from './media-device-info.js';
29
+ export type { MediaDeviceKind } from './media-device-info.js';
30
+ export { RTCStatsReport } from './rtc-stats-report.js';
31
+ export type { RTCStats } from './rtc-stats-report.js';
32
+ export { RTCDtlsTransport } from './rtc-dtls-transport.js';
33
+ export type { RTCDtlsTransportState } from './rtc-dtls-transport.js';
34
+ export { RTCIceTransport } from './rtc-ice-transport.js';
35
+ export type { RTCIceTransportState, RTCIceRole, RTCIceParameters, RTCIceCandidatePair } from './rtc-ice-transport.js';
36
+ export { RTCSctpTransport } from './rtc-sctp-transport.js';
37
+ export type { RTCSctpTransportState } from './rtc-sctp-transport.js';
38
+ export { RTCDTMFSender, RTCDTMFToneChangeEvent } from './rtc-dtmf-sender.js';
39
+ export type { RTCDTMFToneChangeEventInit } from './rtc-dtmf-sender.js';
40
+ export { RTCCertificate } from './rtc-certificate.js';
41
+ export type { RTCDtlsFingerprint, AlgorithmIdentifier } from './rtc-certificate.js';
@@ -0,0 +1,14 @@
1
+ export type MediaDeviceKind = 'audioinput' | 'audiooutput' | 'videoinput';
2
+ export declare class MediaDeviceInfo {
3
+ readonly deviceId: string;
4
+ readonly kind: MediaDeviceKind;
5
+ readonly label: string;
6
+ readonly groupId: string;
7
+ constructor(init: {
8
+ deviceId: string;
9
+ kind: MediaDeviceKind;
10
+ label: string;
11
+ groupId?: string;
12
+ });
13
+ toJSON(): object;
14
+ }
@@ -0,0 +1,12 @@
1
+ import '@gjsify/dom-events/register/event-target';
2
+ import { type MediaStreamConstraints } from './get-user-media.js';
3
+ import { MediaDeviceInfo } from './media-device-info.js';
4
+ import type { MediaStream } from './media-stream.js';
5
+ export declare class MediaDevices extends EventTarget {
6
+ private _ondevicechange;
7
+ get ondevicechange(): ((ev: Event) => void) | null;
8
+ set ondevicechange(v: ((ev: Event) => void) | null);
9
+ getUserMedia(constraints?: MediaStreamConstraints): Promise<MediaStream>;
10
+ enumerateDevices(): Promise<MediaDeviceInfo[]>;
11
+ getSupportedConstraints(): Record<string, boolean>;
12
+ }
@@ -0,0 +1,59 @@
1
+ import '@gjsify/dom-events/register/event-target';
2
+ /** @internal GStreamer backing for tracks created by getUserMedia */
3
+ export interface MediaStreamTrackGstInit {
4
+ source: any;
5
+ pipeline: any;
6
+ }
7
+ export interface MediaStreamTrackInit {
8
+ kind: 'audio' | 'video';
9
+ label?: string;
10
+ id?: string;
11
+ muted?: boolean;
12
+ /** @internal */
13
+ _gst?: MediaStreamTrackGstInit;
14
+ }
15
+ export declare class MediaStreamTrack extends EventTarget {
16
+ readonly id: string;
17
+ readonly kind: 'audio' | 'video';
18
+ readonly label: string;
19
+ private _enabled;
20
+ private _muted;
21
+ private _ended;
22
+ private _contentHint;
23
+ private _onended;
24
+ private _onmute;
25
+ private _onunmute;
26
+ /** @internal GStreamer source element (e.g. pulsesrc, audiotestsrc) */
27
+ _gstSource: any;
28
+ /** @internal Pipeline the source currently lives in (updated by VideoBridge) */
29
+ _gstPipeline: any;
30
+ /** @internal Tee element inserted by VideoBridge for preview fan-out */
31
+ _gstTee: any;
32
+ /** @internal TeeMultiplexer for multi-PC fan-out (created on second addTrack) */
33
+ _teeMultiplexer: any;
34
+ /** @internal Callback set by RTCRtpSender to control valve drop property */
35
+ private _enableCallback;
36
+ constructor(init: MediaStreamTrackInit);
37
+ get enabled(): boolean;
38
+ set enabled(v: boolean);
39
+ get muted(): boolean;
40
+ get readyState(): 'live' | 'ended';
41
+ get contentHint(): string;
42
+ set contentHint(v: string);
43
+ get onended(): ((ev: Event) => void) | null;
44
+ set onended(v: ((ev: Event) => void) | null);
45
+ get onmute(): ((ev: Event) => void) | null;
46
+ set onmute(v: ((ev: Event) => void) | null);
47
+ get onunmute(): ((ev: Event) => void) | null;
48
+ set onunmute(v: ((ev: Event) => void) | null);
49
+ clone(): MediaStreamTrack;
50
+ stop(): void;
51
+ getCapabilities(): Record<string, unknown>;
52
+ getConstraints(): Record<string, unknown>;
53
+ getSettings(): Record<string, unknown>;
54
+ applyConstraints(_constraints?: unknown): Promise<void>;
55
+ /** @internal — used by RTCRtpReceiver to toggle mute state */
56
+ _setMuted(muted: boolean): void;
57
+ /** @internal — called by RTCRtpSender to wire valve control */
58
+ _setEnableCallback(cb: ((enabled: boolean) => void) | null): void;
59
+ }
@@ -0,0 +1,28 @@
1
+ import '@gjsify/dom-events/register/event-target';
2
+ import { MediaStreamTrack } from './media-stream-track.js';
3
+ export declare class MediaStream extends EventTarget {
4
+ readonly id: string;
5
+ private _tracks;
6
+ private _onaddtrack;
7
+ private _onremovetrack;
8
+ constructor(streamOrTracks?: MediaStream | MediaStreamTrack[]);
9
+ get active(): boolean;
10
+ get onaddtrack(): ((ev: Event) => void) | null;
11
+ set onaddtrack(v: ((ev: Event) => void) | null);
12
+ get onremovetrack(): ((ev: Event) => void) | null;
13
+ set onremovetrack(v: ((ev: Event) => void) | null);
14
+ getTracks(): MediaStreamTrack[];
15
+ getAudioTracks(): MediaStreamTrack[];
16
+ getVideoTracks(): MediaStreamTrack[];
17
+ getTrackById(id: string): MediaStreamTrack | null;
18
+ addTrack(track: MediaStreamTrack): void;
19
+ removeTrack(track: MediaStreamTrack): void;
20
+ clone(): MediaStream;
21
+ }
22
+ export interface MediaStreamTrackEventInit extends EventInit {
23
+ track: MediaStreamTrack;
24
+ }
25
+ export declare class MediaStreamTrackEvent extends Event {
26
+ readonly track: MediaStreamTrack;
27
+ constructor(type: string, init: MediaStreamTrackEventInit);
28
+ }
@@ -0,0 +1 @@
1
+ export {};
@@ -0,0 +1 @@
1
+ export {};
@@ -0,0 +1 @@
1
+ export {};
@@ -0,0 +1 @@
1
+ export {};
@@ -0,0 +1 @@
1
+ export {};
@@ -0,0 +1,5 @@
1
+ import './register/peer-connection.js';
2
+ import './register/data-channel.js';
3
+ import './register/error.js';
4
+ import './register/media.js';
5
+ import './register/media-devices.js';
@@ -0,0 +1,3 @@
1
+ import '@gjsify/webrtc/register';
2
+ declare const _default: () => Promise<void>;
3
+ export default _default;
@@ -0,0 +1,23 @@
1
+ export interface RTCDtlsFingerprint {
2
+ algorithm?: string;
3
+ value?: string;
4
+ }
5
+ export declare class RTCCertificate {
6
+ readonly expires: number;
7
+ private _fingerprints;
8
+ private _algorithm;
9
+ /** @internal — use RTCPeerConnection.generateCertificate() */
10
+ constructor(algorithm: string, expires: number, fingerprints: RTCDtlsFingerprint[]);
11
+ getFingerprints(): RTCDtlsFingerprint[];
12
+ /** @internal — the algorithm name for debugging/inspection */
13
+ get _algorithmName(): string;
14
+ }
15
+ export type AlgorithmIdentifier = string | Record<string, unknown>;
16
+ /**
17
+ * Generate a self-signed certificate for use with RTCPeerConnection.
18
+ * Supports ECDSA P-256 and RSASSA-PKCS1-v1_5 with SHA-256.
19
+ *
20
+ * The actual DTLS certificate used by webrtcbin is generated internally
21
+ * by GStreamer — this provides the spec-compliant JS API surface.
22
+ */
23
+ export declare function generateCertificate(keygenAlgorithm: AlgorithmIdentifier): Promise<RTCCertificate>;
@@ -0,0 +1,64 @@
1
+ import type GstWebRTC from 'gi://GstWebRTC?version=1.0';
2
+ import { type DataChannelBridge as DataChannelBridgeType } from '@gjsify/webrtc-native';
3
+ import { RTCErrorEvent } from './rtc-events.js';
4
+ export type RTCDataChannelState = 'connecting' | 'open' | 'closing' | 'closed';
5
+ export type BinaryType = 'blob' | 'arraybuffer';
6
+ type EventHandler<E extends Event = Event> = ((this: RTCDataChannel, ev: E) => any) | null;
7
+ export declare class RTCDataChannel extends EventTarget {
8
+ private readonly _native;
9
+ private readonly _bridge;
10
+ private _binaryType;
11
+ private _bufferedAmount;
12
+ private _closed;
13
+ private _onopen;
14
+ private _onclose;
15
+ private _onerror;
16
+ private _onmessage;
17
+ private _onbufferedamountlow;
18
+ private _onclosing;
19
+ /**
20
+ * @internal
21
+ * Accepts either a raw GstWebRTCDataChannel (for locally-created channels)
22
+ * or a pre-made DataChannelBridge (for remotely-originated channels that
23
+ * the WebrtcbinBridge already wrapped on the streaming thread to avoid
24
+ * missing early messages).
25
+ */
26
+ constructor(source: GstWebRTC.WebRTCDataChannel | DataChannelBridgeType);
27
+ get label(): string;
28
+ get ordered(): boolean;
29
+ get protocol(): string;
30
+ get negotiated(): boolean;
31
+ get id(): number | null;
32
+ get maxPacketLifeTime(): number | null;
33
+ get maxRetransmits(): number | null;
34
+ get readyState(): RTCDataChannelState;
35
+ get bufferedAmount(): number;
36
+ get bufferedAmountLowThreshold(): number;
37
+ set bufferedAmountLowThreshold(v: number);
38
+ get binaryType(): BinaryType;
39
+ set binaryType(v: BinaryType);
40
+ get onopen(): EventHandler;
41
+ set onopen(h: EventHandler);
42
+ get onclose(): EventHandler;
43
+ set onclose(h: EventHandler);
44
+ get onclosing(): EventHandler;
45
+ set onclosing(h: EventHandler);
46
+ get onerror(): EventHandler<RTCErrorEvent>;
47
+ set onerror(h: EventHandler<RTCErrorEvent>);
48
+ get onmessage(): EventHandler<MessageEvent>;
49
+ set onmessage(h: EventHandler<MessageEvent>);
50
+ get onbufferedamountlow(): EventHandler;
51
+ set onbufferedamountlow(h: EventHandler);
52
+ send(data: string | ArrayBuffer | ArrayBufferView | Blob): void;
53
+ close(): void;
54
+ /** @internal */
55
+ _disconnectSignals(): void;
56
+ private _handleOpen;
57
+ private _handleClose;
58
+ private _handleError;
59
+ private _handleString;
60
+ private _handleData;
61
+ private _handleBufferedAmountLow;
62
+ private _handleReadyStateChange;
63
+ }
64
+ export {};
@@ -0,0 +1,20 @@
1
+ import '@gjsify/dom-events/register/event-target';
2
+ import { RTCIceTransport } from './rtc-ice-transport.js';
3
+ export type RTCDtlsTransportState = 'new' | 'connecting' | 'connected' | 'closed' | 'failed';
4
+ type EventHandler = ((ev: Event) => void) | null;
5
+ export declare class RTCDtlsTransport extends EventTarget {
6
+ readonly iceTransport: RTCIceTransport;
7
+ private _state;
8
+ private _onstatechange;
9
+ private _onerror;
10
+ constructor(iceTransport: RTCIceTransport);
11
+ get state(): RTCDtlsTransportState;
12
+ get onstatechange(): EventHandler;
13
+ set onstatechange(v: EventHandler);
14
+ get onerror(): EventHandler;
15
+ set onerror(v: EventHandler);
16
+ getRemoteCertificates(): ArrayBuffer[];
17
+ /** @internal */
18
+ _setState(state: RTCDtlsTransportState): void;
19
+ }
20
+ export {};
@@ -0,0 +1,31 @@
1
+ import '@gjsify/dom-events/register/event-target';
2
+ type EventHandler = ((ev: Event) => void) | null;
3
+ export interface RTCDTMFToneChangeEventInit extends EventInit {
4
+ tone?: string;
5
+ }
6
+ export declare class RTCDTMFToneChangeEvent extends Event {
7
+ readonly tone: string;
8
+ constructor(type: string, init?: RTCDTMFToneChangeEventInit);
9
+ }
10
+ export declare class RTCDTMFSender extends EventTarget {
11
+ private _toneBuffer;
12
+ private _duration;
13
+ private _interToneGap;
14
+ private _timerId;
15
+ private _canInsert;
16
+ private _ontonechange;
17
+ /** @internal — back-references set by RTCRtpSender */
18
+ _isStopped: () => boolean;
19
+ _getCurrentDirection: () => string | null;
20
+ get toneBuffer(): string;
21
+ get canInsertDTMF(): boolean;
22
+ get ontonechange(): EventHandler;
23
+ set ontonechange(v: EventHandler);
24
+ insertDTMF(tones: string, duration?: number, interToneGap?: number): void;
25
+ private _scheduleNextTone;
26
+ private _playNextTone;
27
+ private _fireToneChange;
28
+ /** @internal — called by RTCRtpSender on cleanup */
29
+ _stop(): void;
30
+ }
31
+ export {};
@@ -0,0 +1,19 @@
1
+ import '@gjsify/dom-exception/register';
2
+ export type RTCErrorDetailType = 'data-channel-failure' | 'dtls-failure' | 'fingerprint-failure' | 'sctp-failure' | 'sdp-syntax-error' | 'hardware-encoder-not-available' | 'hardware-encoder-error';
3
+ export interface RTCErrorInit {
4
+ errorDetail: RTCErrorDetailType;
5
+ sdpLineNumber?: number | null;
6
+ sctpCauseCode?: number | null;
7
+ receivedAlert?: number | null;
8
+ sentAlert?: number | null;
9
+ httpRequestStatusCode?: number | null;
10
+ }
11
+ export declare class RTCError extends DOMException {
12
+ readonly errorDetail: RTCErrorDetailType;
13
+ readonly sdpLineNumber: number | null;
14
+ readonly sctpCauseCode: number | null;
15
+ readonly receivedAlert: number | null;
16
+ readonly sentAlert: number | null;
17
+ readonly httpRequestStatusCode: number | null;
18
+ constructor(init: RTCErrorInit, message?: string);
19
+ }
@@ -0,0 +1,27 @@
1
+ import '@gjsify/dom-events/register/event-target';
2
+ import type { RTCIceCandidate } from './rtc-ice-candidate.js';
3
+ import type { RTCDataChannel } from './rtc-data-channel.js';
4
+ import type { RTCError } from './rtc-error.js';
5
+ export interface RTCPeerConnectionIceEventInit extends EventInit {
6
+ candidate?: RTCIceCandidate | null;
7
+ url?: string | null;
8
+ }
9
+ export declare class RTCPeerConnectionIceEvent extends Event {
10
+ readonly candidate: RTCIceCandidate | null;
11
+ readonly url: string | null;
12
+ constructor(type: string, init?: RTCPeerConnectionIceEventInit);
13
+ }
14
+ export interface RTCDataChannelEventInit extends EventInit {
15
+ channel: RTCDataChannel;
16
+ }
17
+ export declare class RTCDataChannelEvent extends Event {
18
+ readonly channel: RTCDataChannel;
19
+ constructor(type: string, init: RTCDataChannelEventInit);
20
+ }
21
+ export interface RTCErrorEventInit extends EventInit {
22
+ error: RTCError;
23
+ }
24
+ export declare class RTCErrorEvent extends Event {
25
+ readonly error: RTCError;
26
+ constructor(type: string, init: RTCErrorEventInit);
27
+ }
@@ -0,0 +1,28 @@
1
+ export interface RTCIceCandidateInit {
2
+ candidate?: string;
3
+ sdpMid?: string | null;
4
+ sdpMLineIndex?: number | null;
5
+ usernameFragment?: string | null;
6
+ }
7
+ export type RTCIceComponent = 'rtp' | 'rtcp';
8
+ export type RTCIceProtocol = 'udp' | 'tcp';
9
+ export type RTCIceCandidateType = 'host' | 'srflx' | 'prflx' | 'relay';
10
+ export type RTCIceTcpCandidateType = 'active' | 'passive' | 'so';
11
+ export declare class RTCIceCandidate {
12
+ readonly candidate: string;
13
+ readonly sdpMid: string | null;
14
+ readonly sdpMLineIndex: number | null;
15
+ readonly usernameFragment: string | null;
16
+ readonly foundation: string | null;
17
+ readonly component: RTCIceComponent | null;
18
+ readonly priority: number | null;
19
+ readonly protocol: RTCIceProtocol | null;
20
+ readonly address: string | null;
21
+ readonly port: number | null;
22
+ readonly type: RTCIceCandidateType | null;
23
+ readonly tcpType: RTCIceTcpCandidateType | null;
24
+ readonly relatedAddress: string | null;
25
+ readonly relatedPort: number | null;
26
+ constructor(init?: RTCIceCandidateInit);
27
+ toJSON(): RTCIceCandidateInit;
28
+ }