werift 0.24.3 → 0.25.0-alpha.0

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 (168) hide show
  1. package/README.md +116 -113
  2. package/lib/common/src/event.js +2 -1
  3. package/lib/common/src/event.js.map +1 -1
  4. package/lib/common/src/transport.d.ts +22 -2
  5. package/lib/common/src/transport.js +84 -26
  6. package/lib/common/src/transport.js.map +1 -1
  7. package/lib/ice/src/exceptions.d.ts +9 -0
  8. package/lib/ice/src/exceptions.js +23 -1
  9. package/lib/ice/src/exceptions.js.map +1 -1
  10. package/lib/ice/src/ice.d.ts +40 -0
  11. package/lib/ice/src/ice.js +194 -28
  12. package/lib/ice/src/ice.js.map +1 -1
  13. package/lib/ice/src/iceBase.d.ts +26 -0
  14. package/lib/ice/src/iceBase.js.map +1 -1
  15. package/lib/ice/src/stun/const.d.ts +7 -0
  16. package/lib/ice/src/stun/const.js +8 -0
  17. package/lib/ice/src/stun/const.js.map +1 -1
  18. package/lib/ice/src/stun/protocol.js +1 -4
  19. package/lib/ice/src/stun/protocol.js.map +1 -1
  20. package/lib/ice/src/stun/tcpProtocol.d.ts +7 -1
  21. package/lib/ice/src/stun/tcpProtocol.js +65 -14
  22. package/lib/ice/src/stun/tcpProtocol.js.map +1 -1
  23. package/lib/ice/src/stun/transaction.d.ts +12 -1
  24. package/lib/ice/src/stun/transaction.js +37 -4
  25. package/lib/ice/src/stun/transaction.js.map +1 -1
  26. package/lib/ice/src/turn/protocol.d.ts +79 -22
  27. package/lib/ice/src/turn/protocol.js +282 -78
  28. package/lib/ice/src/turn/protocol.js.map +1 -1
  29. package/lib/ice/src/types/model.d.ts +8 -0
  30. package/lib/ice/src/types/model.js.map +1 -1
  31. package/lib/index.mjs +5646 -3451
  32. package/lib/nonstandard/index.mjs +287 -1004
  33. package/lib/polyfill/dom.mjs +23794 -0
  34. package/lib/polyfill/index.mjs +23794 -0
  35. package/lib/rtp/src/extra/container/mp4/container.js +12 -4
  36. package/lib/rtp/src/extra/container/mp4/container.js.map +1 -1
  37. package/lib/rtp/src/extra/processor/mp4.js +8 -3
  38. package/lib/rtp/src/extra/processor/mp4.js.map +1 -1
  39. package/lib/rtp/src/extra/processor/mp4Callback.js +3 -1
  40. package/lib/rtp/src/extra/processor/mp4Callback.js.map +1 -1
  41. package/lib/sctp/src/chunk.d.ts +5 -0
  42. package/lib/sctp/src/chunk.js +16 -11
  43. package/lib/sctp/src/chunk.js.map +1 -1
  44. package/lib/sctp/src/index.d.ts +3 -1
  45. package/lib/sctp/src/index.js +10 -1
  46. package/lib/sctp/src/index.js.map +1 -1
  47. package/lib/sctp/src/sctp.d.ts +12 -3
  48. package/lib/sctp/src/sctp.js +51 -18
  49. package/lib/sctp/src/sctp.js.map +1 -1
  50. package/lib/webrtc/src/const.js +2 -0
  51. package/lib/webrtc/src/const.js.map +1 -1
  52. package/lib/webrtc/src/errors.d.ts +9 -1
  53. package/lib/webrtc/src/errors.js +19 -0
  54. package/lib/webrtc/src/errors.js.map +1 -1
  55. package/lib/webrtc/src/media/codec.d.ts +5 -0
  56. package/lib/webrtc/src/media/codec.js +21 -0
  57. package/lib/webrtc/src/media/codec.js.map +1 -1
  58. package/lib/webrtc/src/media/codecCompatibility.d.ts +23 -0
  59. package/lib/webrtc/src/media/codecCompatibility.js +138 -0
  60. package/lib/webrtc/src/media/codecCompatibility.js.map +1 -0
  61. package/lib/webrtc/src/media/index.d.ts +1 -0
  62. package/lib/webrtc/src/media/index.js +1 -0
  63. package/lib/webrtc/src/media/index.js.map +1 -1
  64. package/lib/webrtc/src/media/router.d.ts +2 -0
  65. package/lib/webrtc/src/media/router.js +23 -3
  66. package/lib/webrtc/src/media/router.js.map +1 -1
  67. package/lib/webrtc/src/media/rtpReceiver.d.ts +12 -0
  68. package/lib/webrtc/src/media/rtpReceiver.js +35 -0
  69. package/lib/webrtc/src/media/rtpReceiver.js.map +1 -1
  70. package/lib/webrtc/src/media/rtpSender.d.ts +65 -4
  71. package/lib/webrtc/src/media/rtpSender.js +264 -35
  72. package/lib/webrtc/src/media/rtpSender.js.map +1 -1
  73. package/lib/webrtc/src/media/rtpTransceiver.d.ts +42 -0
  74. package/lib/webrtc/src/media/rtpTransceiver.js +157 -4
  75. package/lib/webrtc/src/media/rtpTransceiver.js.map +1 -1
  76. package/lib/webrtc/src/media/track.d.ts +29 -1
  77. package/lib/webrtc/src/media/track.js +164 -5
  78. package/lib/webrtc/src/media/track.js.map +1 -1
  79. package/lib/webrtc/src/nonstandard/index.d.ts +0 -1
  80. package/lib/webrtc/src/nonstandard/index.js +0 -1
  81. package/lib/webrtc/src/nonstandard/index.js.map +1 -1
  82. package/lib/webrtc/src/nonstandard/recorder/writer/webm.js +2 -1
  83. package/lib/webrtc/src/nonstandard/recorder/writer/webm.js.map +1 -1
  84. package/lib/webrtc/src/nonstandard/userMedia.d.ts +1 -2
  85. package/lib/webrtc/src/nonstandard/userMedia.js +30 -14
  86. package/lib/webrtc/src/nonstandard/userMedia.js.map +1 -1
  87. package/lib/webrtc/src/peerConnection.d.ts +127 -5
  88. package/lib/webrtc/src/peerConnection.js +629 -143
  89. package/lib/webrtc/src/peerConnection.js.map +1 -1
  90. package/lib/webrtc/src/polyfill/api.d.ts +14 -0
  91. package/lib/webrtc/src/polyfill/api.js +23 -0
  92. package/lib/webrtc/src/polyfill/api.js.map +1 -0
  93. package/lib/webrtc/src/polyfill/browserIdentity.d.ts +11 -0
  94. package/lib/webrtc/src/polyfill/browserIdentity.js +59 -0
  95. package/lib/webrtc/src/polyfill/browserIdentity.js.map +1 -0
  96. package/lib/webrtc/src/polyfill/dom.d.ts +11 -0
  97. package/lib/webrtc/src/polyfill/dom.js +18 -0
  98. package/lib/webrtc/src/polyfill/dom.js.map +1 -0
  99. package/lib/webrtc/src/polyfill/existingMediaDevices.d.ts +2 -0
  100. package/lib/webrtc/src/polyfill/existingMediaDevices.js +22 -0
  101. package/lib/webrtc/src/polyfill/existingMediaDevices.js.map +1 -0
  102. package/lib/webrtc/src/polyfill/globals.d.ts +28 -0
  103. package/lib/webrtc/src/polyfill/globals.js +3 -0
  104. package/lib/webrtc/src/polyfill/globals.js.map +1 -0
  105. package/lib/webrtc/src/polyfill/index.d.ts +2 -0
  106. package/lib/webrtc/src/polyfill/index.js +19 -0
  107. package/lib/webrtc/src/polyfill/index.js.map +1 -0
  108. package/lib/webrtc/src/polyfill/install.d.ts +13 -0
  109. package/lib/webrtc/src/polyfill/install.js +266 -0
  110. package/lib/webrtc/src/polyfill/install.js.map +1 -0
  111. package/lib/webrtc/src/polyfill/mediaDevices.d.ts +38 -0
  112. package/lib/webrtc/src/polyfill/mediaDevices.js +228 -0
  113. package/lib/webrtc/src/polyfill/mediaDevices.js.map +1 -0
  114. package/lib/webrtc/src/polyfill/mediaRegister.d.ts +51 -0
  115. package/lib/webrtc/src/polyfill/mediaRegister.js +14 -0
  116. package/lib/webrtc/src/polyfill/mediaRegister.js.map +1 -0
  117. package/lib/webrtc/src/polyfill/peerConnectionConfig.d.ts +3 -0
  118. package/lib/webrtc/src/polyfill/peerConnectionConfig.js +52 -0
  119. package/lib/webrtc/src/polyfill/peerConnectionConfig.js.map +1 -0
  120. package/lib/webrtc/src/polyfill/registers/callback.d.ts +16 -0
  121. package/lib/webrtc/src/polyfill/registers/callback.js +57 -0
  122. package/lib/webrtc/src/polyfill/registers/callback.js.map +1 -0
  123. package/lib/webrtc/src/polyfill/registers/empty.d.ts +2 -0
  124. package/lib/webrtc/src/polyfill/registers/empty.js +28 -0
  125. package/lib/webrtc/src/polyfill/registers/empty.js.map +1 -0
  126. package/lib/webrtc/src/polyfill/registers/mp4Webm.d.ts +36 -0
  127. package/lib/webrtc/src/polyfill/registers/mp4Webm.js +242 -0
  128. package/lib/webrtc/src/polyfill/registers/mp4Webm.js.map +1 -0
  129. package/lib/webrtc/src/polyfill/registers/rtpRtcp.d.ts +17 -0
  130. package/lib/webrtc/src/polyfill/registers/rtpRtcp.js +143 -0
  131. package/lib/webrtc/src/polyfill/registers/rtpRtcp.js.map +1 -0
  132. package/lib/webrtc/src/polyfill/rtcSessionDescription.d.ts +18 -0
  133. package/lib/webrtc/src/polyfill/rtcSessionDescription.js +36 -0
  134. package/lib/webrtc/src/polyfill/rtcSessionDescription.js.map +1 -0
  135. package/lib/webrtc/src/polyfill/rtpCodec.d.ts +17 -0
  136. package/lib/webrtc/src/polyfill/rtpCodec.js +93 -0
  137. package/lib/webrtc/src/polyfill/rtpCodec.js.map +1 -0
  138. package/lib/webrtc/src/polyfill/selectSettings.d.ts +31 -0
  139. package/lib/webrtc/src/polyfill/selectSettings.js +156 -0
  140. package/lib/webrtc/src/polyfill/selectSettings.js.map +1 -0
  141. package/lib/webrtc/src/polyfill/sourceIo.d.ts +21 -0
  142. package/lib/webrtc/src/polyfill/sourceIo.js +298 -0
  143. package/lib/webrtc/src/polyfill/sourceIo.js.map +1 -0
  144. package/lib/webrtc/src/polyfill/trackStop.d.ts +4 -0
  145. package/lib/webrtc/src/polyfill/trackStop.js +16 -0
  146. package/lib/webrtc/src/polyfill/trackStop.js.map +1 -0
  147. package/lib/webrtc/src/sctpManager.d.ts +2 -1
  148. package/lib/webrtc/src/sctpManager.js +5 -2
  149. package/lib/webrtc/src/sctpManager.js.map +1 -1
  150. package/lib/webrtc/src/sdp.d.ts +1 -1
  151. package/lib/webrtc/src/sdp.js +5 -6
  152. package/lib/webrtc/src/sdp.js.map +1 -1
  153. package/lib/webrtc/src/sdpManager.d.ts +38 -1
  154. package/lib/webrtc/src/sdpManager.js +236 -30
  155. package/lib/webrtc/src/sdpManager.js.map +1 -1
  156. package/lib/webrtc/src/secureTransportManager.d.ts +43 -12
  157. package/lib/webrtc/src/secureTransportManager.js +123 -47
  158. package/lib/webrtc/src/secureTransportManager.js.map +1 -1
  159. package/lib/webrtc/src/transceiverManager.d.ts +91 -6
  160. package/lib/webrtc/src/transceiverManager.js +477 -62
  161. package/lib/webrtc/src/transceiverManager.js.map +1 -1
  162. package/lib/webrtc/src/transport/ice.d.ts +8 -0
  163. package/lib/webrtc/src/transport/ice.js +17 -1
  164. package/lib/webrtc/src/transport/ice.js.map +1 -1
  165. package/lib/webrtc/src/transport/sctp.d.ts +3 -2
  166. package/lib/webrtc/src/transport/sctp.js +8 -2
  167. package/lib/webrtc/src/transport/sctp.js.map +1 -1
  168. package/package.json +14 -3
@@ -0,0 +1,228 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.MediaDevices = void 0;
4
+ const errors_1 = require("../errors");
5
+ const helper_1 = require("../helper");
6
+ const track_1 = require("../media/track");
7
+ const mediaRegister_1 = require("./mediaRegister");
8
+ const selectSettings_1 = require("./selectSettings");
9
+ class MediaDevices extends helper_1.EventTarget {
10
+ constructor(registers) {
11
+ super();
12
+ Object.defineProperty(this, "registers", {
13
+ enumerable: true,
14
+ configurable: true,
15
+ writable: true,
16
+ value: registers
17
+ });
18
+ Object.defineProperty(this, "ondevicechange", {
19
+ enumerable: true,
20
+ configurable: true,
21
+ writable: true,
22
+ value: null
23
+ });
24
+ Object.defineProperty(this, "activeStops", {
25
+ enumerable: true,
26
+ configurable: true,
27
+ writable: true,
28
+ value: new Map()
29
+ });
30
+ Object.defineProperty(this, "failedRegisters", {
31
+ enumerable: true,
32
+ configurable: true,
33
+ writable: true,
34
+ value: new Set()
35
+ });
36
+ Object.defineProperty(this, "disposeAbort", {
37
+ enumerable: true,
38
+ configurable: true,
39
+ writable: true,
40
+ value: new AbortController()
41
+ });
42
+ Object.defineProperty(this, "disposed", {
43
+ enumerable: true,
44
+ configurable: true,
45
+ writable: true,
46
+ value: false
47
+ });
48
+ Object.defineProperty(this, "getUserMedia", {
49
+ enumerable: true,
50
+ configurable: true,
51
+ writable: true,
52
+ value: async (constraints = {}) => {
53
+ this.throwIfDisposed();
54
+ (0, selectSettings_1.assertRequestedMediaTypes)(constraints);
55
+ await this.prepareRegisters();
56
+ this.throwIfDisposed();
57
+ const tracks = [];
58
+ try {
59
+ if (constraints.audio) {
60
+ tracks.push(...(await this.createKindTracks("audio", constraints.audio)));
61
+ }
62
+ this.throwIfDisposed();
63
+ if (constraints.video) {
64
+ tracks.push(...(await this.createKindTracks("video", constraints.video)));
65
+ }
66
+ this.throwIfDisposed();
67
+ for (const track of tracks) {
68
+ this.watchTrack(track);
69
+ }
70
+ return new track_1.MediaStream(tracks);
71
+ }
72
+ catch (error) {
73
+ for (const track of tracks) {
74
+ track.stop();
75
+ }
76
+ if (this.disposed) {
77
+ throw abortedException();
78
+ }
79
+ throw error;
80
+ }
81
+ }
82
+ });
83
+ Object.defineProperty(this, "getDisplayMedia", {
84
+ enumerable: true,
85
+ configurable: true,
86
+ writable: true,
87
+ value: this.getUserMedia
88
+ });
89
+ }
90
+ getSupportedConstraints() {
91
+ return { ...selectSettings_1.polyfillSupportedConstraints };
92
+ }
93
+ async enumerateDevices() {
94
+ this.throwIfDisposed();
95
+ await this.prepareRegisters();
96
+ this.throwIfDisposed();
97
+ const devices = [];
98
+ for (const register of this.registers) {
99
+ for (const kind of register.kinds) {
100
+ devices.push({
101
+ deviceId: register.deviceId,
102
+ groupId: register.groupId ?? "",
103
+ kind: kind === "audio" ? "audioinput" : "videoinput",
104
+ label: register.label ?? "",
105
+ toJSON() {
106
+ return {
107
+ deviceId: this.deviceId,
108
+ groupId: this.groupId,
109
+ kind: this.kind,
110
+ label: this.label,
111
+ };
112
+ },
113
+ });
114
+ }
115
+ }
116
+ return devices;
117
+ }
118
+ cleanup() {
119
+ this.disposed = true;
120
+ this.disposeAbort.abort();
121
+ for (const stop of this.activeStops.values()) {
122
+ stop();
123
+ }
124
+ this.activeStops.clear();
125
+ for (const register of this.registers) {
126
+ register.stop?.();
127
+ }
128
+ }
129
+ async prepareRegisters() {
130
+ this.throwIfDisposed();
131
+ await Promise.all(this.registers.map(async (register) => {
132
+ try {
133
+ this.throwIfDisposed();
134
+ await register.prepare?.();
135
+ this.throwIfDisposed();
136
+ }
137
+ catch (error) {
138
+ if (this.disposed || isAbortError(error)) {
139
+ throw abortedException();
140
+ }
141
+ this.failedRegisters.add(register);
142
+ }
143
+ }));
144
+ }
145
+ async createKindTracks(kind, constraints) {
146
+ this.throwIfDisposed();
147
+ const available = this.registers.filter((register) => !this.failedRegisters.has(register));
148
+ try {
149
+ const selected = (0, selectSettings_1.selectRegisterForKind)(kind, constraints, available.map((register) => ({
150
+ deviceId: register.deviceId,
151
+ groupId: register.groupId,
152
+ kinds: register.kinds,
153
+ mimeType: (0, mediaRegister_1.mimeTypeForKind)(register, kind),
154
+ })));
155
+ const register = this.registers.find((candidate) => candidate.deviceId === selected.deviceId);
156
+ if (!register) {
157
+ throw new Error(`Selected ${kind} register was not found`);
158
+ }
159
+ const normalized = (0, mediaRegister_1.normalizeTrackConstraints)(constraints);
160
+ const tracks = await register.createTracks({
161
+ kind,
162
+ deviceId: register.deviceId,
163
+ constraints: normalized,
164
+ signal: this.disposeAbort.signal,
165
+ });
166
+ if (this.disposed) {
167
+ for (const track of tracks) {
168
+ track.stop();
169
+ }
170
+ throw abortedException();
171
+ }
172
+ return tracks;
173
+ }
174
+ catch (error) {
175
+ if (this.disposed || isAbortError(error)) {
176
+ throw abortedException();
177
+ }
178
+ if (this.shouldSurfacePrepareFailure(kind, available)) {
179
+ if (error instanceof DOMException &&
180
+ error.name === "NotReadableError") {
181
+ throw error;
182
+ }
183
+ throw (0, errors_1.createWebRtcDomException)("NotReadableError", error instanceof Error
184
+ ? error.message
185
+ : "Failed to read media source");
186
+ }
187
+ throw mapGetUserMediaError(error);
188
+ }
189
+ }
190
+ shouldSurfacePrepareFailure(kind, available) {
191
+ const availableForKind = available.some((register) => register.kinds.includes(kind));
192
+ if (availableForKind) {
193
+ return false;
194
+ }
195
+ return this.registers.some((register) => this.failedRegisters.has(register) && register.kinds.includes(kind));
196
+ }
197
+ watchTrack(track) {
198
+ const originalStop = track.stop;
199
+ track.stop = () => {
200
+ this.activeStops.delete(track);
201
+ originalStop.call(track);
202
+ };
203
+ this.activeStops.set(track, () => track.stop());
204
+ }
205
+ throwIfDisposed() {
206
+ if (this.disposed) {
207
+ throw abortedException();
208
+ }
209
+ }
210
+ }
211
+ exports.MediaDevices = MediaDevices;
212
+ function abortedException() {
213
+ return (0, errors_1.createWebRtcDomException)("AbortError", "The operation was aborted");
214
+ }
215
+ function isAbortError(error) {
216
+ return ((error instanceof DOMException && error.name === "AbortError") ||
217
+ (error instanceof Error && error.name === "AbortError"));
218
+ }
219
+ function mapGetUserMediaError(error) {
220
+ if (error instanceof errors_1.OverconstrainedError || error instanceof TypeError) {
221
+ throw error;
222
+ }
223
+ if (error instanceof DOMException) {
224
+ throw error;
225
+ }
226
+ throw (0, errors_1.createWebRtcDomException)("AbortError", error instanceof Error ? error.message : "The operation was aborted");
227
+ }
228
+ //# sourceMappingURL=mediaDevices.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"mediaDevices.js","sourceRoot":"","sources":["../../../../src/polyfill/mediaDevices.ts"],"names":[],"mappings":"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","sourcesContent":["import { OverconstrainedError, createWebRtcDomException } from \"../errors\";\nimport { EventTarget } from \"../helper\";\nimport { MediaStream, type MediaStreamTrack } from \"../media/track\";\nimport type {\n BoundMediaRegister,\n MediaStreamConstraints,\n MediaTrackConstraints,\n} from \"./mediaRegister\";\nimport { mimeTypeForKind, normalizeTrackConstraints } from \"./mediaRegister\";\nimport {\n type MediaKind,\n type PolyfillTrackConstraints,\n assertRequestedMediaTypes,\n polyfillSupportedConstraints,\n selectRegisterForKind,\n} from \"./selectSettings\";\n\nexport class MediaDevices extends EventTarget {\n ondevicechange: ((this: MediaDevices, ev: Event) => unknown) | null = null;\n private readonly activeStops = new Map<MediaStreamTrack, () => void>();\n private readonly failedRegisters = new Set<BoundMediaRegister>();\n private readonly disposeAbort = new AbortController();\n private disposed = false;\n\n constructor(private readonly registers: BoundMediaRegister[]) {\n super();\n }\n\n getSupportedConstraints() {\n return { ...polyfillSupportedConstraints };\n }\n\n async enumerateDevices(): Promise<MediaDeviceInfoLike[]> {\n this.throwIfDisposed();\n await this.prepareRegisters();\n this.throwIfDisposed();\n const devices: MediaDeviceInfoLike[] = [];\n for (const register of this.registers) {\n for (const kind of register.kinds) {\n devices.push({\n deviceId: register.deviceId,\n groupId: register.groupId ?? \"\",\n kind: kind === \"audio\" ? \"audioinput\" : \"videoinput\",\n label: register.label ?? \"\",\n toJSON() {\n return {\n deviceId: this.deviceId,\n groupId: this.groupId,\n kind: this.kind,\n label: this.label,\n };\n },\n });\n }\n }\n return devices;\n }\n\n getUserMedia = async (\n constraints: MediaStreamConstraints = {},\n ): Promise<MediaStream> => {\n this.throwIfDisposed();\n assertRequestedMediaTypes(constraints);\n await this.prepareRegisters();\n this.throwIfDisposed();\n const tracks: MediaStreamTrack[] = [];\n try {\n if (constraints.audio) {\n tracks.push(\n ...(await this.createKindTracks(\"audio\", constraints.audio)),\n );\n }\n this.throwIfDisposed();\n if (constraints.video) {\n tracks.push(\n ...(await this.createKindTracks(\"video\", constraints.video)),\n );\n }\n this.throwIfDisposed();\n for (const track of tracks) {\n this.watchTrack(track);\n }\n return new MediaStream(tracks);\n } catch (error) {\n for (const track of tracks) {\n track.stop();\n }\n if (this.disposed) {\n throw abortedException();\n }\n throw error;\n }\n };\n\n getDisplayMedia = this.getUserMedia;\n\n cleanup() {\n this.disposed = true;\n this.disposeAbort.abort();\n for (const stop of this.activeStops.values()) {\n stop();\n }\n this.activeStops.clear();\n for (const register of this.registers) {\n register.stop?.();\n }\n }\n\n private async prepareRegisters() {\n this.throwIfDisposed();\n await Promise.all(\n this.registers.map(async (register) => {\n try {\n this.throwIfDisposed();\n await register.prepare?.();\n this.throwIfDisposed();\n } catch (error) {\n if (this.disposed || isAbortError(error)) {\n throw abortedException();\n }\n this.failedRegisters.add(register);\n }\n }),\n );\n }\n\n private async createKindTracks(\n kind: MediaKind,\n constraints: boolean | MediaTrackConstraints,\n ) {\n this.throwIfDisposed();\n const available = this.registers.filter(\n (register) => !this.failedRegisters.has(register),\n );\n try {\n const selected = selectRegisterForKind(\n kind,\n constraints as boolean | PolyfillTrackConstraints,\n available.map((register) => ({\n deviceId: register.deviceId,\n groupId: register.groupId,\n kinds: register.kinds,\n mimeType: mimeTypeForKind(register, kind),\n })),\n );\n const register = this.registers.find(\n (candidate) => candidate.deviceId === selected.deviceId,\n );\n if (!register) {\n throw new Error(`Selected ${kind} register was not found`);\n }\n const normalized = normalizeTrackConstraints(constraints);\n const tracks = await register.createTracks({\n kind,\n deviceId: register.deviceId,\n constraints: normalized,\n signal: this.disposeAbort.signal,\n });\n if (this.disposed) {\n for (const track of tracks) {\n track.stop();\n }\n throw abortedException();\n }\n return tracks;\n } catch (error) {\n if (this.disposed || isAbortError(error)) {\n throw abortedException();\n }\n if (this.shouldSurfacePrepareFailure(kind, available)) {\n if (\n error instanceof DOMException &&\n error.name === \"NotReadableError\"\n ) {\n throw error;\n }\n throw createWebRtcDomException(\n \"NotReadableError\",\n error instanceof Error\n ? error.message\n : \"Failed to read media source\",\n );\n }\n throw mapGetUserMediaError(error);\n }\n }\n\n private shouldSurfacePrepareFailure(\n kind: MediaKind,\n available: BoundMediaRegister[],\n ) {\n const availableForKind = available.some((register) =>\n register.kinds.includes(kind),\n );\n if (availableForKind) {\n return false;\n }\n return this.registers.some(\n (register) =>\n this.failedRegisters.has(register) && register.kinds.includes(kind),\n );\n }\n\n private watchTrack(track: MediaStreamTrack) {\n const originalStop = track.stop;\n track.stop = () => {\n this.activeStops.delete(track);\n originalStop.call(track);\n };\n this.activeStops.set(track, () => track.stop());\n }\n\n private throwIfDisposed() {\n if (this.disposed) {\n throw abortedException();\n }\n }\n}\n\nexport interface MediaDeviceInfoLike {\n deviceId: string;\n groupId: string;\n kind: \"audioinput\" | \"videoinput\" | \"audiooutput\";\n label: string;\n toJSON(): {\n deviceId: string;\n groupId: string;\n kind: string;\n label: string;\n };\n}\n\nfunction abortedException() {\n return createWebRtcDomException(\"AbortError\", \"The operation was aborted\");\n}\n\nfunction isAbortError(error: unknown) {\n return (\n (error instanceof DOMException && error.name === \"AbortError\") ||\n (error instanceof Error && error.name === \"AbortError\")\n );\n}\n\nfunction mapGetUserMediaError(error: unknown): never {\n if (error instanceof OverconstrainedError || error instanceof TypeError) {\n throw error;\n }\n if (error instanceof DOMException) {\n throw error;\n }\n throw createWebRtcDomException(\n \"AbortError\",\n error instanceof Error ? error.message : \"The operation was aborted\",\n );\n}\n"]}
@@ -0,0 +1,51 @@
1
+ import type { MediaStreamTrack } from "../media/track";
2
+ import type { MediaKind } from "./selectSettings";
3
+ export type { MediaKind };
4
+ export interface MediaTrackConstraints {
5
+ deviceId?: unknown;
6
+ groupId?: unknown;
7
+ mimeType?: unknown;
8
+ width?: unknown;
9
+ height?: unknown;
10
+ frameRate?: unknown;
11
+ facingMode?: unknown;
12
+ advanced?: MediaTrackConstraints[];
13
+ [key: string]: unknown;
14
+ }
15
+ export interface MediaStreamConstraints {
16
+ audio?: boolean | MediaTrackConstraints;
17
+ video?: boolean | MediaTrackConstraints;
18
+ }
19
+ export interface MediaGetUserMediaRequest {
20
+ kind: MediaKind;
21
+ deviceId: string;
22
+ constraints: MediaTrackConstraints;
23
+ /** Uninstall / abort of the owning MediaDevices. Registers should stop in-flight I/O. */
24
+ signal?: AbortSignal;
25
+ }
26
+ export interface MediaRegister {
27
+ readonly mimeType: string;
28
+ /**
29
+ * Per-kind selection placeholders when one register serves multiple kinds.
30
+ * `getUserMedia` matching uses this for the requested kind; it is not copied
31
+ * onto `track.codec`.
32
+ */
33
+ readonly mimeTypeByKind?: Partial<Readonly<Record<MediaKind, string>>>;
34
+ readonly kinds: readonly MediaKind[];
35
+ readonly deviceId?: string;
36
+ readonly groupId?: string;
37
+ readonly label?: string;
38
+ createTracks(request: MediaGetUserMediaRequest): Promise<MediaStreamTrack[]>;
39
+ prepare?(): Promise<void>;
40
+ stop?(): void;
41
+ }
42
+ export interface BoundMediaRegister extends MediaRegister {
43
+ readonly deviceId: string;
44
+ }
45
+ export interface MediaRegisterCommonOptions {
46
+ deviceId?: string;
47
+ groupId?: string;
48
+ label?: string;
49
+ }
50
+ export declare function mimeTypeForKind(register: Pick<MediaRegister, "mimeType" | "mimeTypeByKind">, kind: MediaKind): string;
51
+ export declare function normalizeTrackConstraints(constraints: boolean | MediaTrackConstraints): MediaTrackConstraints;
@@ -0,0 +1,14 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.mimeTypeForKind = mimeTypeForKind;
4
+ exports.normalizeTrackConstraints = normalizeTrackConstraints;
5
+ function mimeTypeForKind(register, kind) {
6
+ return register.mimeTypeByKind?.[kind] ?? register.mimeType;
7
+ }
8
+ function normalizeTrackConstraints(constraints) {
9
+ if (constraints === true) {
10
+ return {};
11
+ }
12
+ return { ...constraints };
13
+ }
14
+ //# sourceMappingURL=mediaRegister.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"mediaRegister.js","sourceRoot":"","sources":["../../../../src/polyfill/mediaRegister.ts"],"names":[],"mappings":";;AAyDA,0CAKC;AAED,8DAOC;AAdD,SAAgB,eAAe,CAC7B,QAA4D,EAC5D,IAAe;IAEf,OAAO,QAAQ,CAAC,cAAc,EAAE,CAAC,IAAI,CAAC,IAAI,QAAQ,CAAC,QAAQ,CAAC;AAC9D,CAAC;AAED,SAAgB,yBAAyB,CACvC,WAA4C;IAE5C,IAAI,WAAW,KAAK,IAAI,EAAE,CAAC;QACzB,OAAO,EAAE,CAAC;IACZ,CAAC;IACD,OAAO,EAAE,GAAG,WAAW,EAAE,CAAC;AAC5B,CAAC","sourcesContent":["import type { MediaStreamTrack } from \"../media/track\";\nimport type { MediaKind } from \"./selectSettings\";\n\nexport type { MediaKind };\n\nexport interface MediaTrackConstraints {\n deviceId?: unknown;\n groupId?: unknown;\n mimeType?: unknown;\n width?: unknown;\n height?: unknown;\n frameRate?: unknown;\n facingMode?: unknown;\n advanced?: MediaTrackConstraints[];\n [key: string]: unknown;\n}\n\nexport interface MediaStreamConstraints {\n audio?: boolean | MediaTrackConstraints;\n video?: boolean | MediaTrackConstraints;\n}\n\nexport interface MediaGetUserMediaRequest {\n kind: MediaKind;\n deviceId: string;\n constraints: MediaTrackConstraints;\n /** Uninstall / abort of the owning MediaDevices. Registers should stop in-flight I/O. */\n signal?: AbortSignal;\n}\n\nexport interface MediaRegister {\n readonly mimeType: string;\n /**\n * Per-kind selection placeholders when one register serves multiple kinds.\n * `getUserMedia` matching uses this for the requested kind; it is not copied\n * onto `track.codec`.\n */\n readonly mimeTypeByKind?: Partial<Readonly<Record<MediaKind, string>>>;\n readonly kinds: readonly MediaKind[];\n readonly deviceId?: string;\n readonly groupId?: string;\n readonly label?: string;\n createTracks(request: MediaGetUserMediaRequest): Promise<MediaStreamTrack[]>;\n prepare?(): Promise<void>;\n stop?(): void;\n}\n\nexport interface BoundMediaRegister extends MediaRegister {\n readonly deviceId: string;\n}\n\nexport interface MediaRegisterCommonOptions {\n deviceId?: string;\n groupId?: string;\n label?: string;\n}\n\nexport function mimeTypeForKind(\n register: Pick<MediaRegister, \"mimeType\" | \"mimeTypeByKind\">,\n kind: MediaKind,\n): string {\n return register.mimeTypeByKind?.[kind] ?? register.mimeType;\n}\n\nexport function normalizeTrackConstraints(\n constraints: boolean | MediaTrackConstraints,\n): MediaTrackConstraints {\n if (constraints === true) {\n return {};\n }\n return { ...constraints };\n}\n"]}
@@ -0,0 +1,3 @@
1
+ import { RTCPeerConnection, type RTCPeerConnectionConfig } from "../peerConnection";
2
+ export declare function mergePeerConnectionConfig(installConfig: RTCPeerConnectionConfig, config: RTCPeerConnectionConfig): RTCPeerConnectionConfig;
3
+ export declare function createPolyfillRTCPeerConnection(installConfig?: RTCPeerConnectionConfig): typeof RTCPeerConnection;
@@ -0,0 +1,52 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.mergePeerConnectionConfig = mergePeerConnectionConfig;
4
+ exports.createPolyfillRTCPeerConnection = createPolyfillRTCPeerConnection;
5
+ const codec_1 = require("../media/codec");
6
+ const parameters_1 = require("../media/parameters");
7
+ const peerConnection_1 = require("../peerConnection");
8
+ function hasKinds(value) {
9
+ return value != undefined;
10
+ }
11
+ function mergePeerConnectionConfig(installConfig, config) {
12
+ const merged = { ...installConfig };
13
+ for (const [key, value] of Object.entries(config)) {
14
+ if (value !== undefined) {
15
+ merged[key] = value;
16
+ }
17
+ }
18
+ if (hasKinds(installConfig.codecs) || hasKinds(config.codecs)) {
19
+ const builtin = (0, codec_1.defaultCodecs)();
20
+ merged.codecs = {
21
+ audio: (config.codecs?.audio ??
22
+ installConfig.codecs?.audio ??
23
+ builtin.audio).map(codec_1.cloneCodecParameters),
24
+ video: (config.codecs?.video ??
25
+ installConfig.codecs?.video ??
26
+ builtin.video).map(codec_1.cloneCodecParameters),
27
+ };
28
+ }
29
+ if (hasKinds(installConfig.headerExtensions) ||
30
+ hasKinds(config.headerExtensions)) {
31
+ merged.headerExtensions = {
32
+ audio: (config.headerExtensions?.audio ??
33
+ installConfig.headerExtensions?.audio ??
34
+ []).map((extension) => new parameters_1.RTCRtpHeaderExtensionParameters(extension)),
35
+ video: (config.headerExtensions?.video ??
36
+ installConfig.headerExtensions?.video ??
37
+ []).map((extension) => new parameters_1.RTCRtpHeaderExtensionParameters(extension)),
38
+ };
39
+ }
40
+ return merged;
41
+ }
42
+ function createPolyfillRTCPeerConnection(installConfig) {
43
+ if (installConfig == undefined)
44
+ return peerConnection_1.RTCPeerConnection;
45
+ const defaults = installConfig;
46
+ return class PolyfillRTCPeerConnection extends peerConnection_1.RTCPeerConnection {
47
+ constructor(config = {}) {
48
+ super(mergePeerConnectionConfig(defaults, config));
49
+ }
50
+ };
51
+ }
52
+ //# sourceMappingURL=peerConnectionConfig.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"peerConnectionConfig.js","sourceRoot":"","sources":["../../../../src/polyfill/peerConnectionConfig.ts"],"names":[],"mappings":";;AAWA,8DA6CC;AAED,0EAUC;AApED,0CAAqE;AACrE,oDAAsE;AACtE,sDAG2B;AAE3B,SAAS,QAAQ,CAAC,KAAc;IAC9B,OAAO,KAAK,IAAI,SAAS,CAAC;AAC5B,CAAC;AAED,SAAgB,yBAAyB,CACvC,aAAsC,EACtC,MAA+B;IAE/B,MAAM,MAAM,GAAG,EAAE,GAAG,aAAa,EAA6B,CAAC;IAC/D,KAAK,MAAM,CAAC,GAAG,EAAE,KAAK,CAAC,IAAI,MAAM,CAAC,OAAO,CAAC,MAAM,CAAC,EAAE,CAAC;QAClD,IAAI,KAAK,KAAK,SAAS,EAAE,CAAC;YACvB,MAAkC,CAAC,GAAG,CAAC,GAAG,KAAK,CAAC;QACnD,CAAC;IACH,CAAC;IAED,IAAI,QAAQ,CAAC,aAAa,CAAC,MAAM,CAAC,IAAI,QAAQ,CAAC,MAAM,CAAC,MAAM,CAAC,EAAE,CAAC;QAC9D,MAAM,OAAO,GAAG,IAAA,qBAAa,GAAE,CAAC;QAChC,MAAM,CAAC,MAAM,GAAG;YACd,KAAK,EAAE,CACL,MAAM,CAAC,MAAM,EAAE,KAAK;gBACpB,aAAa,CAAC,MAAM,EAAE,KAAK;gBAC3B,OAAO,CAAC,KAAK,CACd,CAAC,GAAG,CAAC,4BAAoB,CAAC;YAC3B,KAAK,EAAE,CACL,MAAM,CAAC,MAAM,EAAE,KAAK;gBACpB,aAAa,CAAC,MAAM,EAAE,KAAK;gBAC3B,OAAO,CAAC,KAAK,CACd,CAAC,GAAG,CAAC,4BAAoB,CAAC;SAC5B,CAAC;IACJ,CAAC;IAED,IACE,QAAQ,CAAC,aAAa,CAAC,gBAAgB,CAAC;QACxC,QAAQ,CAAC,MAAM,CAAC,gBAAgB,CAAC,EACjC,CAAC;QACD,MAAM,CAAC,gBAAgB,GAAG;YACxB,KAAK,EAAE,CACL,MAAM,CAAC,gBAAgB,EAAE,KAAK;gBAC9B,aAAa,CAAC,gBAAgB,EAAE,KAAK;gBACrC,EAAE,CACH,CAAC,GAAG,CAAC,CAAC,SAAS,EAAE,EAAE,CAAC,IAAI,4CAA+B,CAAC,SAAS,CAAC,CAAC;YACpE,KAAK,EAAE,CACL,MAAM,CAAC,gBAAgB,EAAE,KAAK;gBAC9B,aAAa,CAAC,gBAAgB,EAAE,KAAK;gBACrC,EAAE,CACH,CAAC,GAAG,CAAC,CAAC,SAAS,EAAE,EAAE,CAAC,IAAI,4CAA+B,CAAC,SAAS,CAAC,CAAC;SACrE,CAAC;IACJ,CAAC;IACD,OAAO,MAAM,CAAC;AAChB,CAAC;AAED,SAAgB,+BAA+B,CAC7C,aAAuC;IAEvC,IAAI,aAAa,IAAI,SAAS;QAAE,OAAO,kCAAiB,CAAC;IACzD,MAAM,QAAQ,GAAG,aAAa,CAAC;IAC/B,OAAO,MAAM,yBAA0B,SAAQ,kCAAiB;QAC9D,YAAY,SAAkC,EAAE;YAC9C,KAAK,CAAC,yBAAyB,CAAC,QAAQ,EAAE,MAAM,CAAC,CAAC,CAAC;QACrD,CAAC;KACF,CAAC;AACJ,CAAC","sourcesContent":["import { cloneCodecParameters, defaultCodecs } from \"../media/codec\";\nimport { RTCRtpHeaderExtensionParameters } from \"../media/parameters\";\nimport {\n RTCPeerConnection,\n type RTCPeerConnectionConfig,\n} from \"../peerConnection\";\n\nfunction hasKinds(value: unknown) {\n return value != undefined;\n}\n\nexport function mergePeerConnectionConfig(\n installConfig: RTCPeerConnectionConfig,\n config: RTCPeerConnectionConfig,\n): RTCPeerConnectionConfig {\n const merged = { ...installConfig } as RTCPeerConnectionConfig;\n for (const [key, value] of Object.entries(config)) {\n if (value !== undefined) {\n (merged as Record<string, unknown>)[key] = value;\n }\n }\n\n if (hasKinds(installConfig.codecs) || hasKinds(config.codecs)) {\n const builtin = defaultCodecs();\n merged.codecs = {\n audio: (\n config.codecs?.audio ??\n installConfig.codecs?.audio ??\n builtin.audio\n ).map(cloneCodecParameters),\n video: (\n config.codecs?.video ??\n installConfig.codecs?.video ??\n builtin.video\n ).map(cloneCodecParameters),\n };\n }\n\n if (\n hasKinds(installConfig.headerExtensions) ||\n hasKinds(config.headerExtensions)\n ) {\n merged.headerExtensions = {\n audio: (\n config.headerExtensions?.audio ??\n installConfig.headerExtensions?.audio ??\n []\n ).map((extension) => new RTCRtpHeaderExtensionParameters(extension)),\n video: (\n config.headerExtensions?.video ??\n installConfig.headerExtensions?.video ??\n []\n ).map((extension) => new RTCRtpHeaderExtensionParameters(extension)),\n };\n }\n return merged;\n}\n\nexport function createPolyfillRTCPeerConnection(\n installConfig?: RTCPeerConnectionConfig,\n): typeof RTCPeerConnection {\n if (installConfig == undefined) return RTCPeerConnection;\n const defaults = installConfig;\n return class PolyfillRTCPeerConnection extends RTCPeerConnection {\n constructor(config: RTCPeerConnectionConfig = {}) {\n super(mergePeerConnectionConfig(defaults, config));\n }\n };\n}\n"]}
@@ -0,0 +1,16 @@
1
+ import type { RTCRtpCodecParameters } from "../../media/parameters";
2
+ import type { MediaStreamTrack } from "../../media/track";
3
+ import type { MediaGetUserMediaRequest, MediaKind, MediaRegister, MediaRegisterCommonOptions } from "../mediaRegister";
4
+ export type CreateCallbackRegisterOptions = MediaRegisterCommonOptions & {
5
+ mimeType: string;
6
+ kinds: readonly MediaKind[];
7
+ clockRate?: number;
8
+ channels?: number;
9
+ payloadType?: number;
10
+ parameters?: string;
11
+ rtcpFeedback?: RTCRtpCodecParameters["rtcpFeedback"];
12
+ createTracks: (request: MediaGetUserMediaRequest) => Promise<MediaStreamTrack[]>;
13
+ stop?: () => void;
14
+ };
15
+ export declare function createCallbackRegister(options: CreateCallbackRegisterOptions): MediaRegister;
16
+ export declare function createDummyRegister(options?: MediaRegisterCommonOptions): MediaRegister;
@@ -0,0 +1,57 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.createCallbackRegister = createCallbackRegister;
4
+ exports.createDummyRegister = createDummyRegister;
5
+ const dummyMedia_1 = require("../../nonstandard/dummyMedia");
6
+ const rtpCodec_1 = require("../rtpCodec");
7
+ const trackStop_1 = require("../trackStop");
8
+ function createCallbackRegister(options) {
9
+ const registerKind = (0, rtpCodec_1.kindFromMimeType)(options.mimeType);
10
+ const codec = (0, rtpCodec_1.rtpCodecFromMimeType)(options);
11
+ return {
12
+ mimeType: options.mimeType,
13
+ kinds: options.kinds,
14
+ deviceId: options.deviceId,
15
+ groupId: options.groupId,
16
+ label: options.label,
17
+ async createTracks(request) {
18
+ const tracks = await options.createTracks(request);
19
+ for (const track of tracks) {
20
+ if (track.codec == undefined && track.kind === registerKind) {
21
+ track.codec = codec;
22
+ }
23
+ }
24
+ return tracks;
25
+ },
26
+ stop: options.stop,
27
+ };
28
+ }
29
+ function createDummyRegister(options = {}) {
30
+ const stops = [];
31
+ return createCallbackRegister({
32
+ mimeType: "video/VP8",
33
+ kinds: ["audio", "video"],
34
+ deviceId: options.deviceId,
35
+ groupId: options.groupId,
36
+ label: options.label ?? "werift dummy media",
37
+ async createTracks(request) {
38
+ if (request.kind === "audio") {
39
+ const dummy = (0, dummyMedia_1.createDummyAudioTrack)();
40
+ stops.push(() => dummy.source.stop());
41
+ (0, trackStop_1.bindTrackStop)(dummy.track, () => dummy.source.stop());
42
+ return [dummy.track];
43
+ }
44
+ const dummy = (0, dummyMedia_1.createDummyVideoTrack)();
45
+ stops.push(() => dummy.source.stop());
46
+ (0, trackStop_1.bindTrackStop)(dummy.track, () => dummy.source.stop());
47
+ return [dummy.track];
48
+ },
49
+ stop() {
50
+ for (const stop of stops) {
51
+ stop();
52
+ }
53
+ stops.length = 0;
54
+ },
55
+ });
56
+ }
57
+ //# sourceMappingURL=callback.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"callback.js","sourceRoot":"","sources":["../../../../../src/polyfill/registers/callback.ts"],"names":[],"mappings":";;AA6BA,wDAsBC;AAED,kDA6BC;AAhFD,6DAGsC;AAOtC,0CAAqE;AACrE,4CAA6C;AAgB7C,SAAgB,sBAAsB,CACpC,OAAsC;IAEtC,MAAM,YAAY,GAAG,IAAA,2BAAgB,EAAC,OAAO,CAAC,QAAQ,CAAC,CAAC;IACxD,MAAM,KAAK,GAAG,IAAA,+BAAoB,EAAC,OAAO,CAAC,CAAC;IAC5C,OAAO;QACL,QAAQ,EAAE,OAAO,CAAC,QAAQ;QAC1B,KAAK,EAAE,OAAO,CAAC,KAAK;QACpB,QAAQ,EAAE,OAAO,CAAC,QAAQ;QAC1B,OAAO,EAAE,OAAO,CAAC,OAAO;QACxB,KAAK,EAAE,OAAO,CAAC,KAAK;QACpB,KAAK,CAAC,YAAY,CAAC,OAAO;YACxB,MAAM,MAAM,GAAG,MAAM,OAAO,CAAC,YAAY,CAAC,OAAO,CAAC,CAAC;YACnD,KAAK,MAAM,KAAK,IAAI,MAAM,EAAE,CAAC;gBAC3B,IAAI,KAAK,CAAC,KAAK,IAAI,SAAS,IAAI,KAAK,CAAC,IAAI,KAAK,YAAY,EAAE,CAAC;oBAC5D,KAAK,CAAC,KAAK,GAAG,KAAK,CAAC;gBACtB,CAAC;YACH,CAAC;YACD,OAAO,MAAM,CAAC;QAChB,CAAC;QACD,IAAI,EAAE,OAAO,CAAC,IAAI;KACnB,CAAC;AACJ,CAAC;AAED,SAAgB,mBAAmB,CACjC,UAAsC,EAAE;IAExC,MAAM,KAAK,GAAsB,EAAE,CAAC;IACpC,OAAO,sBAAsB,CAAC;QAC5B,QAAQ,EAAE,WAAW;QACrB,KAAK,EAAE,CAAC,OAAO,EAAE,OAAO,CAAC;QACzB,QAAQ,EAAE,OAAO,CAAC,QAAQ;QAC1B,OAAO,EAAE,OAAO,CAAC,OAAO;QACxB,KAAK,EAAE,OAAO,CAAC,KAAK,IAAI,oBAAoB;QAC5C,KAAK,CAAC,YAAY,CAAC,OAAO;YACxB,IAAI,OAAO,CAAC,IAAI,KAAK,OAAO,EAAE,CAAC;gBAC7B,MAAM,KAAK,GAAG,IAAA,kCAAqB,GAAE,CAAC;gBACtC,KAAK,CAAC,IAAI,CAAC,GAAG,EAAE,CAAC,KAAK,CAAC,MAAM,CAAC,IAAI,EAAE,CAAC,CAAC;gBACtC,IAAA,yBAAa,EAAC,KAAK,CAAC,KAAK,EAAE,GAAG,EAAE,CAAC,KAAK,CAAC,MAAM,CAAC,IAAI,EAAE,CAAC,CAAC;gBACtD,OAAO,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC;YACvB,CAAC;YACD,MAAM,KAAK,GAAG,IAAA,kCAAqB,GAAE,CAAC;YACtC,KAAK,CAAC,IAAI,CAAC,GAAG,EAAE,CAAC,KAAK,CAAC,MAAM,CAAC,IAAI,EAAE,CAAC,CAAC;YACtC,IAAA,yBAAa,EAAC,KAAK,CAAC,KAAK,EAAE,GAAG,EAAE,CAAC,KAAK,CAAC,MAAM,CAAC,IAAI,EAAE,CAAC,CAAC;YACtD,OAAO,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC;QACvB,CAAC;QACD,IAAI;YACF,KAAK,MAAM,IAAI,IAAI,KAAK,EAAE,CAAC;gBACzB,IAAI,EAAE,CAAC;YACT,CAAC;YACD,KAAK,CAAC,MAAM,GAAG,CAAC,CAAC;QACnB,CAAC;KACF,CAAC,CAAC;AACL,CAAC","sourcesContent":["import type { RTCRtpCodecParameters } from \"../../media/parameters\";\nimport type { MediaStreamTrack } from \"../../media/track\";\nimport {\n createDummyAudioTrack,\n createDummyVideoTrack,\n} from \"../../nonstandard/dummyMedia\";\nimport type {\n MediaGetUserMediaRequest,\n MediaKind,\n MediaRegister,\n MediaRegisterCommonOptions,\n} from \"../mediaRegister\";\nimport { kindFromMimeType, rtpCodecFromMimeType } from \"../rtpCodec\";\nimport { bindTrackStop } from \"../trackStop\";\n\nexport type CreateCallbackRegisterOptions = MediaRegisterCommonOptions & {\n mimeType: string;\n kinds: readonly MediaKind[];\n clockRate?: number;\n channels?: number;\n payloadType?: number;\n parameters?: string;\n rtcpFeedback?: RTCRtpCodecParameters[\"rtcpFeedback\"];\n createTracks: (\n request: MediaGetUserMediaRequest,\n ) => Promise<MediaStreamTrack[]>;\n stop?: () => void;\n};\n\nexport function createCallbackRegister(\n options: CreateCallbackRegisterOptions,\n): MediaRegister {\n const registerKind = kindFromMimeType(options.mimeType);\n const codec = rtpCodecFromMimeType(options);\n return {\n mimeType: options.mimeType,\n kinds: options.kinds,\n deviceId: options.deviceId,\n groupId: options.groupId,\n label: options.label,\n async createTracks(request) {\n const tracks = await options.createTracks(request);\n for (const track of tracks) {\n if (track.codec == undefined && track.kind === registerKind) {\n track.codec = codec;\n }\n }\n return tracks;\n },\n stop: options.stop,\n };\n}\n\nexport function createDummyRegister(\n options: MediaRegisterCommonOptions = {},\n): MediaRegister {\n const stops: Array<() => void> = [];\n return createCallbackRegister({\n mimeType: \"video/VP8\",\n kinds: [\"audio\", \"video\"],\n deviceId: options.deviceId,\n groupId: options.groupId,\n label: options.label ?? \"werift dummy media\",\n async createTracks(request) {\n if (request.kind === \"audio\") {\n const dummy = createDummyAudioTrack();\n stops.push(() => dummy.source.stop());\n bindTrackStop(dummy.track, () => dummy.source.stop());\n return [dummy.track];\n }\n const dummy = createDummyVideoTrack();\n stops.push(() => dummy.source.stop());\n bindTrackStop(dummy.track, () => dummy.source.stop());\n return [dummy.track];\n },\n stop() {\n for (const stop of stops) {\n stop();\n }\n stops.length = 0;\n },\n });\n}\n"]}
@@ -0,0 +1,2 @@
1
+ import type { MediaRegister, MediaRegisterCommonOptions } from "../mediaRegister";
2
+ export declare function createEmptyRegister(options?: MediaRegisterCommonOptions): MediaRegister;
@@ -0,0 +1,28 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.createEmptyRegister = createEmptyRegister;
4
+ const track_1 = require("../../media/track");
5
+ const EMPTY_MIME_TYPE_BY_KIND = Object.freeze({
6
+ audio: "audio/opus",
7
+ video: "video/VP8",
8
+ });
9
+ function createEmptyRegister(options = {}) {
10
+ const kinds = ["audio", "video"];
11
+ return {
12
+ mimeType: defaultMimeTypeForKinds(kinds),
13
+ mimeTypeByKind: EMPTY_MIME_TYPE_BY_KIND,
14
+ kinds,
15
+ deviceId: options.deviceId,
16
+ groupId: options.groupId,
17
+ label: options.label ?? "werift empty media",
18
+ async createTracks(request) {
19
+ return [new track_1.MediaStreamTrack({ kind: request.kind })];
20
+ },
21
+ };
22
+ }
23
+ function defaultMimeTypeForKinds(kinds) {
24
+ return kinds.includes("video")
25
+ ? EMPTY_MIME_TYPE_BY_KIND.video
26
+ : EMPTY_MIME_TYPE_BY_KIND.audio;
27
+ }
28
+ //# sourceMappingURL=empty.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"empty.js","sourceRoot":"","sources":["../../../../../src/polyfill/registers/empty.ts"],"names":[],"mappings":";;AAaA,kDAeC;AA5BD,6CAAqD;AAOrD,MAAM,uBAAuB,GAC3B,MAAM,CAAC,MAAM,CAAC;IACZ,KAAK,EAAE,YAAY;IACnB,KAAK,EAAE,WAAW;CACnB,CAAC,CAAC;AAEL,SAAgB,mBAAmB,CACjC,UAAsC,EAAE;IAExC,MAAM,KAAK,GAAG,CAAC,OAAO,EAAE,OAAO,CAAyC,CAAC;IACzE,OAAO;QACL,QAAQ,EAAE,uBAAuB,CAAC,KAAK,CAAC;QACxC,cAAc,EAAE,uBAAuB;QACvC,KAAK;QACL,QAAQ,EAAE,OAAO,CAAC,QAAQ;QAC1B,OAAO,EAAE,OAAO,CAAC,OAAO;QACxB,KAAK,EAAE,OAAO,CAAC,KAAK,IAAI,oBAAoB;QAC5C,KAAK,CAAC,YAAY,CAAC,OAAO;YACxB,OAAO,CAAC,IAAI,wBAAgB,CAAC,EAAE,IAAI,EAAE,OAAO,CAAC,IAAI,EAAE,CAAC,CAAC,CAAC;QACxD,CAAC;KACF,CAAC;AACJ,CAAC;AAED,SAAS,uBAAuB,CAAC,KAA2B;IAC1D,OAAO,KAAK,CAAC,QAAQ,CAAC,OAAO,CAAC;QAC5B,CAAC,CAAC,uBAAuB,CAAC,KAAK;QAC/B,CAAC,CAAC,uBAAuB,CAAC,KAAK,CAAC;AACpC,CAAC","sourcesContent":["import { MediaStreamTrack } from \"../../media/track\";\nimport type {\n MediaKind,\n MediaRegister,\n MediaRegisterCommonOptions,\n} from \"../mediaRegister\";\n\nconst EMPTY_MIME_TYPE_BY_KIND: Readonly<Record<MediaKind, string>> =\n Object.freeze({\n audio: \"audio/opus\",\n video: \"video/VP8\",\n });\n\nexport function createEmptyRegister(\n options: MediaRegisterCommonOptions = {},\n): MediaRegister {\n const kinds = [\"audio\", \"video\"] as const satisfies readonly MediaKind[];\n return {\n mimeType: defaultMimeTypeForKinds(kinds),\n mimeTypeByKind: EMPTY_MIME_TYPE_BY_KIND,\n kinds,\n deviceId: options.deviceId,\n groupId: options.groupId,\n label: options.label ?? \"werift empty media\",\n async createTracks(request) {\n return [new MediaStreamTrack({ kind: request.kind })];\n },\n };\n}\n\nfunction defaultMimeTypeForKinds(kinds: readonly MediaKind[]): string {\n return kinds.includes(\"video\")\n ? EMPTY_MIME_TYPE_BY_KIND.video\n : EMPTY_MIME_TYPE_BY_KIND.audio;\n}\n"]}
@@ -0,0 +1,36 @@
1
+ import type { Readable } from "stream";
2
+ import { RTCRtpCodecParameters } from "../../media/parameters";
3
+ import type { MediaRegister, MediaRegisterCommonOptions } from "../mediaRegister";
4
+ import { type RtpCodecFromMimeTypeOptions } from "../rtpCodec";
5
+ import { type BinaryLike } from "../sourceIo";
6
+ type Mp4WebmSource = {
7
+ path: string;
8
+ binary?: never;
9
+ stream?: never;
10
+ } | {
11
+ path?: never;
12
+ binary: BinaryLike;
13
+ stream?: never;
14
+ } | {
15
+ path?: never;
16
+ binary?: never;
17
+ stream: Readable | ReadableStream<Uint8Array>;
18
+ };
19
+ export type Mp4WebmCodecHint = string | RtpCodecFromMimeTypeOptions | RTCRtpCodecParameters;
20
+ export type CreateMp4WebmRegisterOptions = Mp4WebmSource & MediaRegisterCommonOptions & {
21
+ loop?: boolean;
22
+ /**
23
+ * RTP codecs advertised on acquired tracks.
24
+ * Omitted kinds are filled from the container via mediabunny.
25
+ */
26
+ codecs?: {
27
+ audio?: Mp4WebmCodecHint;
28
+ video?: Mp4WebmCodecHint;
29
+ };
30
+ };
31
+ /**
32
+ * Synchronous factory. Container I/O and player setup run in `prepare` /
33
+ * `createTracks`, so install does not open files or consume live streams.
34
+ */
35
+ export declare function createMp4WebmRegister(options: CreateMp4WebmRegisterOptions): MediaRegister;
36
+ export {};