@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,56 @@
1
+ import '@gjsify/dom-events/register/event-target';
2
+ import { RTCIceCandidate, type RTCIceCandidateInit } from './rtc-ice-candidate.js';
3
+ export type RTCIceRole = 'unknown' | 'controlling' | 'controlled';
4
+ export type RTCIceComponent = 'rtp' | 'rtcp';
5
+ export type RTCIceTransportState = 'new' | 'checking' | 'connected' | 'completed' | 'disconnected' | 'failed' | 'closed';
6
+ export interface RTCIceParameters {
7
+ usernameFragment?: string;
8
+ password?: string;
9
+ }
10
+ export interface RTCIceCandidatePair {
11
+ local: RTCIceCandidate;
12
+ remote: RTCIceCandidate;
13
+ }
14
+ type EventHandler = ((ev: Event) => void) | null;
15
+ export declare class RTCIceTransport extends EventTarget {
16
+ private _state;
17
+ private _gatheringState;
18
+ private _role;
19
+ private _component;
20
+ private _localCandidates;
21
+ private _remoteCandidates;
22
+ private _localParams;
23
+ private _remoteParams;
24
+ private _onstatechange;
25
+ private _ongatheringstatechange;
26
+ private _onselectedcandidatepairchange;
27
+ get state(): RTCIceTransportState;
28
+ get gatheringState(): RTCIceGatheringState;
29
+ get role(): RTCIceRole;
30
+ get component(): RTCIceComponent;
31
+ get onstatechange(): EventHandler;
32
+ set onstatechange(v: EventHandler);
33
+ get ongatheringstatechange(): EventHandler;
34
+ set ongatheringstatechange(v: EventHandler);
35
+ get onselectedcandidatepairchange(): EventHandler;
36
+ set onselectedcandidatepairchange(v: EventHandler);
37
+ getLocalCandidates(): RTCIceCandidate[];
38
+ getRemoteCandidates(): RTCIceCandidate[];
39
+ getSelectedCandidatePair(): RTCIceCandidatePair | null;
40
+ getLocalParameters(): RTCIceParameters | null;
41
+ getRemoteParameters(): RTCIceParameters | null;
42
+ /** @internal */
43
+ _setState(state: RTCIceTransportState): void;
44
+ /** @internal */
45
+ _setGatheringState(state: RTCIceGatheringState): void;
46
+ /** @internal */
47
+ _addLocalCandidate(init: RTCIceCandidateInit): void;
48
+ /** @internal */
49
+ _addRemoteCandidate(init: RTCIceCandidateInit): void;
50
+ /** @internal */
51
+ _setLocalParameters(params: RTCIceParameters): void;
52
+ /** @internal */
53
+ _setRemoteParameters(params: RTCIceParameters): void;
54
+ }
55
+ type RTCIceGatheringState = 'new' | 'gathering' | 'complete';
56
+ export {};
@@ -0,0 +1,165 @@
1
+ import { RTCSessionDescription, type RTCSessionDescriptionInit } from './rtc-session-description.js';
2
+ import { RTCIceCandidate, type RTCIceCandidateInit } from './rtc-ice-candidate.js';
3
+ import { RTCDataChannel } from './rtc-data-channel.js';
4
+ import { RTCPeerConnectionIceEvent, RTCDataChannelEvent } from './rtc-events.js';
5
+ import { RTCRtpSender, type RTCRtpTransceiverDirection } from './rtc-rtp-sender.js';
6
+ import { RTCRtpReceiver } from './rtc-rtp-receiver.js';
7
+ import { RTCRtpTransceiver } from './rtc-rtp-transceiver.js';
8
+ import { MediaStream } from './media-stream.js';
9
+ import { MediaStreamTrack } from './media-stream-track.js';
10
+ import { RTCTrackEvent } from './rtc-track-event.js';
11
+ import type { RTCStatsReport } from './rtc-stats-report.js';
12
+ import { RTCSctpTransport } from './rtc-sctp-transport.js';
13
+ import { RTCCertificate, type AlgorithmIdentifier } from './rtc-certificate.js';
14
+ export type RTCSignalingState = 'stable' | 'closed' | 'have-local-offer' | 'have-remote-offer' | 'have-local-pranswer' | 'have-remote-pranswer';
15
+ export type RTCPeerConnectionState = 'new' | 'connecting' | 'connected' | 'disconnected' | 'failed' | 'closed';
16
+ export type RTCIceConnectionState = 'new' | 'checking' | 'connected' | 'completed' | 'failed' | 'disconnected' | 'closed';
17
+ export type RTCIceGatheringState = 'new' | 'gathering' | 'complete';
18
+ export type RTCIceTransportPolicy = 'all' | 'relay';
19
+ export type RTCBundlePolicy = 'balanced' | 'max-compat' | 'max-bundle';
20
+ export type RTCRtcpMuxPolicy = 'require';
21
+ export interface RTCIceServer {
22
+ urls: string | string[];
23
+ username?: string;
24
+ credential?: string;
25
+ credentialType?: 'password';
26
+ }
27
+ export interface RTCConfiguration {
28
+ iceServers?: RTCIceServer[];
29
+ iceTransportPolicy?: RTCIceTransportPolicy;
30
+ bundlePolicy?: RTCBundlePolicy;
31
+ rtcpMuxPolicy?: RTCRtcpMuxPolicy;
32
+ peerIdentity?: string;
33
+ certificates?: unknown[];
34
+ iceCandidatePoolSize?: number;
35
+ }
36
+ export interface RTCOfferOptions {
37
+ offerToReceiveAudio?: boolean;
38
+ offerToReceiveVideo?: boolean;
39
+ iceRestart?: boolean;
40
+ }
41
+ export interface RTCAnswerOptions {
42
+ }
43
+ export interface RTCDataChannelInit {
44
+ ordered?: boolean;
45
+ maxPacketLifeTime?: number;
46
+ maxRetransmits?: number;
47
+ protocol?: string;
48
+ negotiated?: boolean;
49
+ id?: number;
50
+ priority?: 'very-low' | 'low' | 'medium' | 'high';
51
+ }
52
+ type EventHandler<E extends Event = Event> = ((this: RTCPeerConnection, ev: E) => any) | null;
53
+ export interface RTCRtpTransceiverInit {
54
+ direction?: RTCRtpTransceiverDirection;
55
+ streams?: MediaStream[];
56
+ sendEncodings?: Array<{
57
+ rid?: string;
58
+ active?: boolean;
59
+ maxBitrate?: number;
60
+ scaleResolutionDownBy?: number;
61
+ }>;
62
+ }
63
+ export declare class RTCPeerConnection extends EventTarget {
64
+ private _pipeline;
65
+ private _webrtcbin;
66
+ private _bridge;
67
+ private _conf;
68
+ private _closed;
69
+ private _iceRestartNeeded;
70
+ private _hasNegotiated;
71
+ private _dataChannels;
72
+ private _transceivers;
73
+ private _senders;
74
+ private _receivers;
75
+ private _iceTransport;
76
+ private _dtlsTransport;
77
+ private _sctpTransport;
78
+ readonly canTrickleIceCandidates: boolean;
79
+ constructor(configuration?: RTCConfiguration);
80
+ private _applyIceServers;
81
+ private _applyIceTransportPolicy;
82
+ private _applyBundlePolicy;
83
+ get signalingState(): RTCSignalingState;
84
+ get connectionState(): RTCPeerConnectionState;
85
+ get iceConnectionState(): RTCIceConnectionState;
86
+ get iceGatheringState(): RTCIceGatheringState;
87
+ private _descProp;
88
+ get localDescription(): RTCSessionDescription | null;
89
+ get remoteDescription(): RTCSessionDescription | null;
90
+ get currentLocalDescription(): RTCSessionDescription | null;
91
+ get currentRemoteDescription(): RTCSessionDescription | null;
92
+ get pendingLocalDescription(): RTCSessionDescription | null;
93
+ get pendingRemoteDescription(): RTCSessionDescription | null;
94
+ get sctp(): RTCSctpTransport | null;
95
+ get peerIdentity(): Promise<never>;
96
+ get idpErrorInfo(): null;
97
+ get idpLoginUrl(): null;
98
+ private _rejectIfClosed;
99
+ createOffer(_options?: RTCOfferOptions): Promise<RTCSessionDescriptionInit>;
100
+ createAnswer(_options?: RTCAnswerOptions): Promise<RTCSessionDescriptionInit>;
101
+ setLocalDescription(description?: RTCSessionDescriptionInit): Promise<void>;
102
+ setRemoteDescription(description: RTCSessionDescriptionInit): Promise<void>;
103
+ addIceCandidate(candidate: RTCIceCandidateInit | RTCIceCandidate | null): Promise<void>;
104
+ createDataChannel(label: string, options?: RTCDataChannelInit): RTCDataChannel;
105
+ private _setStructureField;
106
+ getConfiguration(): RTCConfiguration;
107
+ close(): void;
108
+ addTransceiver(trackOrKind: MediaStreamTrack | string, init?: RTCRtpTransceiverInit): RTCRtpTransceiver;
109
+ addTrack(track: MediaStreamTrack, ..._streams: MediaStream[]): RTCRtpSender;
110
+ removeTrack(sender: RTCRtpSender): void;
111
+ getSenders(): RTCRtpSender[];
112
+ getReceivers(): RTCRtpReceiver[];
113
+ getTransceivers(): RTCRtpTransceiver[];
114
+ getStats(selector?: MediaStreamTrack | null): Promise<RTCStatsReport>;
115
+ restartIce(): void;
116
+ setConfiguration(configuration: RTCConfiguration): void;
117
+ getIdentityAssertion(): Promise<never>;
118
+ /** Find a GstWebRTCRTPTransceiver not yet in our map (created by request_pad_simple). */
119
+ private _findNewGstTransceiver;
120
+ /** Lazily create the shared DTLS and ICE transport instances (max-bundle → one pair). */
121
+ private _ensureTransports;
122
+ /** Create the SCTP transport when a data channel is first negotiated. */
123
+ private _ensureSctpTransport;
124
+ private _createTransceiverWrapper;
125
+ private _handleNegotiationNeeded;
126
+ private _handleIceCandidate;
127
+ private _handleNewTransceiver;
128
+ private _handlePadAdded;
129
+ private _handleDataChannel;
130
+ private _dispatchStateChange;
131
+ /** Map PC connection state → DTLS transport state. */
132
+ private _syncDtlsState;
133
+ /** Map PC ICE connection state → ICE transport state. */
134
+ private _syncIceState;
135
+ /** Map PC ICE gathering state → ICE transport gathering state. */
136
+ private _syncIceGatheringState;
137
+ private _onconnectionstatechange;
138
+ private _ondatachannel;
139
+ private _onicecandidate;
140
+ private _oniceconnectionstatechange;
141
+ private _onicegatheringstatechange;
142
+ private _onnegotiationneeded;
143
+ private _onsignalingstatechange;
144
+ get onconnectionstatechange(): EventHandler;
145
+ set onconnectionstatechange(v: EventHandler);
146
+ get ondatachannel(): EventHandler<RTCDataChannelEvent>;
147
+ set ondatachannel(v: EventHandler<RTCDataChannelEvent>);
148
+ get onicecandidate(): EventHandler<RTCPeerConnectionIceEvent>;
149
+ set onicecandidate(v: EventHandler<RTCPeerConnectionIceEvent>);
150
+ get oniceconnectionstatechange(): EventHandler;
151
+ set oniceconnectionstatechange(v: EventHandler);
152
+ get onicegatheringstatechange(): EventHandler;
153
+ set onicegatheringstatechange(v: EventHandler);
154
+ get onnegotiationneeded(): EventHandler;
155
+ set onnegotiationneeded(v: EventHandler);
156
+ get onsignalingstatechange(): EventHandler;
157
+ set onsignalingstatechange(v: EventHandler);
158
+ private _ontrack;
159
+ get ontrack(): EventHandler<RTCTrackEvent>;
160
+ set ontrack(v: EventHandler<RTCTrackEvent>);
161
+ get onicecandidateerror(): EventHandler;
162
+ set onicecandidateerror(_v: EventHandler);
163
+ static generateCertificate(keygenAlgorithm: AlgorithmIdentifier): Promise<RTCCertificate>;
164
+ }
165
+ export {};
@@ -0,0 +1,45 @@
1
+ import type GstWebRTC from 'gi://GstWebRTC?version=1.0';
2
+ import type Gst from 'gi://Gst?version=1.0';
3
+ import { MediaStreamTrack } from './media-stream-track.js';
4
+ import type { RTCStatsReport } from './rtc-stats-report.js';
5
+ import type { RTCDtlsTransport } from './rtc-dtls-transport.js';
6
+ import type { RTCRtpCapabilities, RTCRtpCodecParameters, RTCRtpHeaderExtensionParameters, RTCRtcpParameters } from './rtc-rtp-sender.js';
7
+ export interface RTCRtpReceiveParameters {
8
+ codecs: RTCRtpCodecParameters[];
9
+ headerExtensions: RTCRtpHeaderExtensionParameters[];
10
+ rtcp: RTCRtcpParameters;
11
+ }
12
+ export interface RTCRtpContributingSource {
13
+ timestamp: number;
14
+ source: number;
15
+ audioLevel?: number;
16
+ rtpTimestamp: number;
17
+ }
18
+ export interface RTCRtpSynchronizationSource extends RTCRtpContributingSource {
19
+ voiceActivityFlag?: boolean;
20
+ }
21
+ export declare class RTCRtpReceiver {
22
+ private _gstReceiver;
23
+ private _track;
24
+ private _jitterBufferTarget;
25
+ private _pipeline;
26
+ private _receiverBridge;
27
+ /** @internal — stats callback set by RTCPeerConnection */
28
+ _getStatsForTrack: ((track: MediaStreamTrack) => Promise<RTCStatsReport>) | null;
29
+ constructor(kind: 'audio' | 'video', gstReceiver: GstWebRTC.WebRTCRTPReceiver | null, pipeline?: any);
30
+ /** @internal — called from RTCPeerConnection._handlePadAdded */
31
+ _connectToPad(pad: Gst.Pad): void;
32
+ /** @internal — called from RTCPeerConnection.close() */
33
+ _dispose(): void;
34
+ /** @internal — set by RTCPeerConnection */
35
+ _transport: RTCDtlsTransport | null;
36
+ get track(): MediaStreamTrack;
37
+ get transport(): RTCDtlsTransport | null;
38
+ get jitterBufferTarget(): number | null;
39
+ set jitterBufferTarget(v: number | null);
40
+ getParameters(): RTCRtpReceiveParameters;
41
+ getContributingSources(): RTCRtpContributingSource[];
42
+ getSynchronizationSources(): RTCRtpSynchronizationSource[];
43
+ getStats(): Promise<RTCStatsReport>;
44
+ static getCapabilities(kind: string): RTCRtpCapabilities | null;
45
+ }
@@ -0,0 +1,98 @@
1
+ import type GstWebRTC from 'gi://GstWebRTC?version=1.0';
2
+ import { RTCDTMFSender } from './rtc-dtmf-sender.js';
3
+ import type { RTCStatsReport } from './rtc-stats-report.js';
4
+ import type { RTCDtlsTransport } from './rtc-dtls-transport.js';
5
+ import type { MediaStreamTrack } from './media-stream-track.js';
6
+ import type { MediaStream } from './media-stream.js';
7
+ export type RTCRtpTransceiverDirection = 'sendrecv' | 'sendonly' | 'recvonly' | 'inactive' | 'stopped';
8
+ export interface RTCRtpCodecCapability {
9
+ mimeType: string;
10
+ clockRate: number;
11
+ channels?: number;
12
+ sdpFmtpLine?: string;
13
+ }
14
+ export interface RTCRtpHeaderExtensionCapability {
15
+ uri: string;
16
+ }
17
+ export interface RTCRtpCapabilities {
18
+ codecs: RTCRtpCodecCapability[];
19
+ headerExtensions: RTCRtpHeaderExtensionCapability[];
20
+ }
21
+ export interface RTCRtpEncodingParameters {
22
+ rid?: string;
23
+ active?: boolean;
24
+ maxBitrate?: number;
25
+ maxFramerate?: number;
26
+ scaleResolutionDownBy?: number;
27
+ }
28
+ export interface RTCRtpCodecParameters {
29
+ payloadType: number;
30
+ mimeType: string;
31
+ clockRate: number;
32
+ channels?: number;
33
+ sdpFmtpLine?: string;
34
+ }
35
+ export interface RTCRtpHeaderExtensionParameters {
36
+ uri: string;
37
+ id: number;
38
+ encrypted?: boolean;
39
+ }
40
+ export interface RTCRtcpParameters {
41
+ cname?: string;
42
+ reducedSize?: boolean;
43
+ }
44
+ export interface RTCRtpSendParameters {
45
+ transactionId: string;
46
+ encodings: RTCRtpEncodingParameters[];
47
+ codecs: RTCRtpCodecParameters[];
48
+ headerExtensions: RTCRtpHeaderExtensionParameters[];
49
+ rtcp: RTCRtcpParameters;
50
+ }
51
+ export declare class RTCRtpSender {
52
+ private _gstSender;
53
+ private _track;
54
+ private _lastParams;
55
+ /** @internal GStreamer pipeline references (set by RTCPeerConnection) */
56
+ private _pipeline;
57
+ private _webrtcbin;
58
+ private _mlineIndex;
59
+ private _elements;
60
+ private _valve;
61
+ _linked: boolean;
62
+ /** @internal — tee src pad if this sender uses a shared source */
63
+ private _teeSrcPad;
64
+ /** @internal — stats callback set by RTCPeerConnection */
65
+ _getStatsForTrack: ((track: MediaStreamTrack) => Promise<RTCStatsReport>) | null;
66
+ /** @internal — set by RTCPeerConnection */
67
+ _transport: RTCDtlsTransport | null;
68
+ /** @internal — DTMF sender, created lazily for audio senders */
69
+ private _dtmf;
70
+ /** @internal — the kind of media this sender handles */
71
+ _kind: 'audio' | 'video' | null;
72
+ /** @internal — back-reference for DTMF stopped/direction checks */
73
+ _transceiver: {
74
+ stopped: boolean;
75
+ currentDirection: string | null;
76
+ } | null;
77
+ /** @internal — callback to notify RTCPeerConnection when pipeline changes (cross-pipeline fix) */
78
+ _onPipelineChanged: ((newPipeline: any) => void) | null;
79
+ constructor(gstSender: GstWebRTC.WebRTCRTPSender | null, pipeline?: any, webrtcbin?: any);
80
+ get track(): MediaStreamTrack | null;
81
+ /** Returns the DTMF sender for audio senders, null for video. */
82
+ get dtmf(): RTCDTMFSender | null;
83
+ get transport(): RTCDtlsTransport | null;
84
+ /** @internal */
85
+ _setTrack(track: MediaStreamTrack | null): void;
86
+ /** @internal — called by RTCPeerConnection._createTransceiverWrapper */
87
+ _setMlineIndex(index: number): void;
88
+ /** @internal — build the outgoing encoder chain and link to webrtcbin */
89
+ _wirePipeline(track: MediaStreamTrack): void;
90
+ /** @internal — tear down the encoder chain on close/removeTrack */
91
+ _teardownPipeline(): void;
92
+ getParameters(): RTCRtpSendParameters;
93
+ setParameters(params: RTCRtpSendParameters): Promise<void>;
94
+ replaceTrack(track: MediaStreamTrack | null): Promise<void>;
95
+ getStats(): Promise<RTCStatsReport>;
96
+ setStreams(..._streams: MediaStream[]): void;
97
+ static getCapabilities(kind: string): RTCRtpCapabilities | null;
98
+ }
@@ -0,0 +1,20 @@
1
+ import type GstWebRTC from 'gi://GstWebRTC?version=1.0';
2
+ import { RTCRtpSender, type RTCRtpTransceiverDirection, type RTCRtpCodecCapability } from './rtc-rtp-sender.js';
3
+ import { RTCRtpReceiver } from './rtc-rtp-receiver.js';
4
+ export declare class RTCRtpTransceiver {
5
+ private _gstTrans;
6
+ readonly sender: RTCRtpSender;
7
+ readonly receiver: RTCRtpReceiver;
8
+ private _stopped;
9
+ private _codecPreferences;
10
+ constructor(gstTrans: GstWebRTC.WebRTCRTPTransceiver, sender: RTCRtpSender, receiver: RTCRtpReceiver);
11
+ get mid(): string | null;
12
+ get direction(): RTCRtpTransceiverDirection;
13
+ set direction(d: RTCRtpTransceiverDirection);
14
+ get currentDirection(): RTCRtpTransceiverDirection | null;
15
+ get stopped(): boolean;
16
+ stop(): void;
17
+ setCodecPreferences(codecs: RTCRtpCodecCapability[]): void;
18
+ /** @internal */
19
+ get _nativeTransceiver(): GstWebRTC.WebRTCRTPTransceiver;
20
+ }
@@ -0,0 +1,20 @@
1
+ import '@gjsify/dom-events/register/event-target';
2
+ import { RTCDtlsTransport } from './rtc-dtls-transport.js';
3
+ export type RTCSctpTransportState = 'connecting' | 'connected' | 'closed';
4
+ type EventHandler = ((ev: Event) => void) | null;
5
+ export declare class RTCSctpTransport extends EventTarget {
6
+ readonly transport: RTCDtlsTransport;
7
+ private _state;
8
+ private _maxMessageSize;
9
+ private _maxChannels;
10
+ private _onstatechange;
11
+ constructor(dtlsTransport: RTCDtlsTransport);
12
+ get state(): RTCSctpTransportState;
13
+ get maxMessageSize(): number;
14
+ get maxChannels(): number | null;
15
+ get onstatechange(): EventHandler;
16
+ set onstatechange(v: EventHandler);
17
+ /** @internal */
18
+ _setState(state: RTCSctpTransportState): void;
19
+ }
20
+ export {};
@@ -0,0 +1,18 @@
1
+ import GstWebRTC from 'gi://GstWebRTC?version=1.0';
2
+ export type RTCSdpType = 'offer' | 'pranswer' | 'answer' | 'rollback';
3
+ export interface RTCSessionDescriptionInit {
4
+ type?: RTCSdpType;
5
+ sdp?: string;
6
+ }
7
+ export declare class RTCSessionDescription {
8
+ readonly type: RTCSdpType;
9
+ readonly sdp: string;
10
+ constructor(init?: RTCSessionDescriptionInit);
11
+ toJSON(): {
12
+ type: RTCSdpType;
13
+ sdp: string;
14
+ };
15
+ /** Build a GstWebRTC.WebRTCSessionDescription for use with webrtcbin signals. */
16
+ toGstDesc(): GstWebRTC.WebRTCSessionDescription;
17
+ static fromGstDesc(desc: GstWebRTC.WebRTCSessionDescription): RTCSessionDescription;
18
+ }
@@ -0,0 +1,22 @@
1
+ export interface RTCStats {
2
+ timestamp: number;
3
+ type: string;
4
+ id: string;
5
+ [key: string]: unknown;
6
+ }
7
+ /**
8
+ * Read-only Map-like collection of stats entries keyed by id.
9
+ * W3C requires iteration support but not mutation.
10
+ */
11
+ export declare class RTCStatsReport {
12
+ private readonly _map;
13
+ constructor(entries?: Iterable<[string, RTCStats]>);
14
+ get size(): number;
15
+ get(key: string): RTCStats | undefined;
16
+ has(key: string): boolean;
17
+ forEach(callbackfn: (value: RTCStats, key: string, map: RTCStatsReport) => void, thisArg?: unknown): void;
18
+ entries(): IterableIterator<[string, RTCStats]>;
19
+ keys(): IterableIterator<string>;
20
+ values(): IterableIterator<RTCStats>;
21
+ [Symbol.iterator](): IterableIterator<[string, RTCStats]>;
22
+ }
@@ -0,0 +1,18 @@
1
+ import '@gjsify/dom-events/register/event-target';
2
+ import type { RTCRtpReceiver } from './rtc-rtp-receiver.js';
3
+ import type { RTCRtpTransceiver } from './rtc-rtp-transceiver.js';
4
+ import type { MediaStreamTrack } from './media-stream-track.js';
5
+ import type { MediaStream } from './media-stream.js';
6
+ export interface RTCTrackEventInit extends EventInit {
7
+ receiver: RTCRtpReceiver;
8
+ track: MediaStreamTrack;
9
+ streams?: MediaStream[];
10
+ transceiver: RTCRtpTransceiver;
11
+ }
12
+ export declare class RTCTrackEvent extends Event {
13
+ readonly receiver: RTCRtpReceiver;
14
+ readonly track: MediaStreamTrack;
15
+ readonly streams: ReadonlyArray<MediaStream>;
16
+ readonly transceiver: RTCRtpTransceiver;
17
+ constructor(type: string, init: RTCTrackEventInit);
18
+ }
@@ -0,0 +1,3 @@
1
+ import type { RTCRtpCapabilities } from './rtc-rtp-sender.js';
2
+ /** Shared implementation for RTCRtpSender.getCapabilities / RTCRtpReceiver.getCapabilities. */
3
+ export declare function getRtpCapabilities(kind: string): RTCRtpCapabilities | null;
@@ -0,0 +1,25 @@
1
+ /**
2
+ * Manages a GStreamer `tee` element that fans out one source to multiple
3
+ * consumer branches. Each branch gets its own src pad from the tee.
4
+ */
5
+ export declare class TeeMultiplexer {
6
+ private _tee;
7
+ private _pipeline;
8
+ private _branchCount;
9
+ /**
10
+ * Create a tee in the given pipeline and link it to the source's output.
11
+ * The source must already be in the pipeline.
12
+ */
13
+ constructor(pipeline: any, source: any);
14
+ /** Request a new src pad from the tee for a consumer branch. */
15
+ requestSrcPad(): any;
16
+ /**
17
+ * Release a branch's src pad from the tee.
18
+ * Adds a DROP probe before unlinking to prevent errors.
19
+ */
20
+ releaseSrcPad(srcPad: any): void;
21
+ /** Number of active branches. */
22
+ get branchCount(): number;
23
+ /** The tee element (for pipeline queries). */
24
+ get element(): any;
25
+ }
@@ -0,0 +1,2 @@
1
+ declare const _default: () => Promise<void>;
2
+ export default _default;
@@ -0,0 +1,30 @@
1
+ import { RTCPeerConnection, type RTCDataChannel, type RTCDataChannelInit } from './index.js';
2
+ /** Mirror WPT's `createPeerConnectionWithCleanup` — returns a fresh pc. */
3
+ export declare function createPeerConnection(): RTCPeerConnection;
4
+ /**
5
+ * Mirror WPT's `exchangeOfferAnswer(pc1, pc2)` + `exchangeIceCandidates`.
6
+ * Runs the full handshake to completion.
7
+ */
8
+ export declare function exchangeOfferAnswer(pc1: RTCPeerConnection, pc2: RTCPeerConnection): Promise<void>;
9
+ /**
10
+ * Port of WPT `createDataChannelPair(t, options, pc1, pc2)` — returns
11
+ * `[dc1, dc2]` both in `'open'` state, handshake complete. If `options.negotiated`
12
+ * both sides pre-create the channel with matching id; otherwise pc1 creates
13
+ * and pc2 receives via `ondatachannel`.
14
+ */
15
+ export declare function createDataChannelPair(options?: RTCDataChannelInit, pc1?: RTCPeerConnection, pc2?: RTCPeerConnection, label?: string): Promise<[RTCDataChannel, RTCDataChannel, RTCPeerConnection, RTCPeerConnection]>;
16
+ /** Port of WPT `awaitMessage(channel)` — resolves with the next incoming data. */
17
+ export declare function awaitMessage<T = unknown>(channel: RTCDataChannel): Promise<T>;
18
+ /**
19
+ * Mirror WPT's `EventWatcher(t, target, events)` — accumulates events in
20
+ * order and returns `wait_for(types)` that matches the expected sequence.
21
+ */
22
+ export declare class EventWatcher {
23
+ private _events;
24
+ private _waiters;
25
+ constructor(target: EventTarget, eventTypes: string[]);
26
+ wait_for(expected: string | string[]): Promise<void>;
27
+ private _tryResolve;
28
+ }
29
+ /** Close an array of RTCPeerConnection instances, ignoring errors. */
30
+ export declare function closePeerConnections(...pcs: (RTCPeerConnection | undefined)[]): void;
@@ -0,0 +1,2 @@
1
+ declare const _default: () => Promise<void>;
2
+ export default _default;
@@ -0,0 +1,2 @@
1
+ declare const _default: () => Promise<void>;
2
+ export default _default;
package/package.json ADDED
@@ -0,0 +1,74 @@
1
+ {
2
+ "name": "@gjsify/webrtc",
3
+ "version": "0.1.15",
4
+ "description": "W3C WebRTC API for GJS using GStreamer webrtcbin as the peer-connection backend",
5
+ "type": "module",
6
+ "module": "lib/esm/index.js",
7
+ "types": "lib/types/index.d.ts",
8
+ "exports": {
9
+ ".": {
10
+ "types": "./lib/types/index.d.ts",
11
+ "default": "./lib/esm/index.js"
12
+ },
13
+ "./register": {
14
+ "types": "./lib/types/register.d.ts",
15
+ "default": "./lib/esm/register.js"
16
+ },
17
+ "./register/peer-connection": {
18
+ "default": "./lib/esm/register/peer-connection.js"
19
+ },
20
+ "./register/data-channel": {
21
+ "default": "./lib/esm/register/data-channel.js"
22
+ },
23
+ "./register/error": {
24
+ "default": "./lib/esm/register/error.js"
25
+ },
26
+ "./register/media": {
27
+ "default": "./lib/esm/register/media.js"
28
+ },
29
+ "./register/media-devices": {
30
+ "default": "./lib/esm/register/media-devices.js"
31
+ }
32
+ },
33
+ "sideEffects": [
34
+ "./lib/esm/register.js",
35
+ "./lib/esm/register/*.js"
36
+ ],
37
+ "scripts": {
38
+ "clear": "rm -rf lib tsconfig.tsbuildinfo tsconfig.types.tsbuildinfo test.gjs.mjs || exit 0",
39
+ "check": "tsc --noEmit",
40
+ "build": "yarn build:gjsify && yarn build:types",
41
+ "build:gjsify": "gjsify build --library 'src/**/*.{ts,js}' --exclude 'src/**/*.spec.{mts,ts}' 'src/test.{mts,ts}'",
42
+ "build:types": "tsc",
43
+ "build:test": "yarn build:test:gjs",
44
+ "build:test:gjs": "gjsify build src/test.mts --app gjs --outfile test.gjs.mjs",
45
+ "test": "yarn build:gjsify && yarn build:test && yarn test:gjs",
46
+ "test:gjs": "gjsify run test.gjs.mjs"
47
+ },
48
+ "keywords": [
49
+ "gjs",
50
+ "webrtc",
51
+ "gstreamer",
52
+ "webrtcbin",
53
+ "rtc",
54
+ "data-channel",
55
+ "peer-connection"
56
+ ],
57
+ "dependencies": {
58
+ "@gjsify/dom-events": "^0.1.15",
59
+ "@gjsify/dom-exception": "^0.1.15",
60
+ "@gjsify/webrtc-native": "^0.1.15"
61
+ },
62
+ "devDependencies": {
63
+ "@girs/gjs": "^4.0.0-rc.3",
64
+ "@girs/glib-2.0": "^2.88.0-4.0.0-rc.3",
65
+ "@girs/gobject-2.0": "^2.88.0-4.0.0-rc.3",
66
+ "@girs/gst-1.0": "^1.28.1-4.0.0-rc.3",
67
+ "@girs/gstsdp-1.0": "^1.0.0-4.0.0-rc.3",
68
+ "@girs/gstwebrtc-1.0": "^1.0.0-4.0.0-rc.3",
69
+ "@gjsify/cli": "^0.1.15",
70
+ "@gjsify/unit": "^0.1.15",
71
+ "@types/node": "^25.6.0",
72
+ "typescript": "^6.0.2"
73
+ }
74
+ }