videomail-client 16.4.0 → 16.5.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.
- package/README.md +72 -36
- package/dist/cjs/index.cjs +60 -63
- package/dist/esm/index.js +49 -52
- package/dist/esm/util/isVirtualCamera.d.ts +1 -1
- package/dist/umd/index.js +60 -63
- package/package.json +5 -5
package/README.md
CHANGED
|
@@ -13,9 +13,15 @@
|
|
|
13
13
|
[netlify-image]: https://api.netlify.com/api/v1/badges/3c9df5b4-8b85-4081-950a-d5df2dbd9926/deploy-status
|
|
14
14
|
[netlify-url]: https://app.netlify.com/sites/videomail-client/deploys
|
|
15
15
|
|
|
16
|
-
|
|
16
|
+
Bring Sign Language to your contact forms. ✉
|
|
17
17
|
|
|
18
|
-
|
|
18
|
+
Record webcam videos without browser plugins:
|
|
19
|
+
|
|
20
|
+
- Capture frames with `navigator.mediaDevices.getUserMedia()`.
|
|
21
|
+
- Stream them to Videomail over WebSocket.
|
|
22
|
+
- Get an encoded video back.
|
|
23
|
+
|
|
24
|
+
Made for Deaf users, and for hearing users learning Sign Language. The package includes ESM, CommonJS, UMD, and TypeScript declaration builds.
|
|
19
25
|
|
|
20
26
|
- [Live demo](#live-demo)
|
|
21
27
|
- [Storybook examples](#storybook-examples)
|
|
@@ -36,9 +42,9 @@ Try it at [videomail-client.netlify.app](https://videomail-client.netlify.app).
|
|
|
36
42
|
|
|
37
43
|
### Real-world usage
|
|
38
44
|
|
|
39
|
-
|
|
45
|
+
Try the full experience at [videomail.io](https://videomail.io).
|
|
40
46
|
|
|
41
|
-
|
|
47
|
+
You can also find it on:
|
|
42
48
|
|
|
43
49
|
- [https://wfdeaf.org/contact](https://wfdeaf.org/contact)
|
|
44
50
|
- [https://www.deaf.org.nz/contact](https://www.deaf.org.nz/contact)
|
|
@@ -46,7 +52,7 @@ And there is more:
|
|
|
46
52
|
|
|
47
53
|
## Storybook examples
|
|
48
54
|
|
|
49
|
-
To
|
|
55
|
+
To try the examples locally:
|
|
50
56
|
|
|
51
57
|
1. `npm install`
|
|
52
58
|
2. `npm run storybook`
|
|
@@ -114,7 +120,7 @@ const videomailClient = new VideomailClient({
|
|
|
114
120
|
|
|
115
121
|
### videomailClient.on()
|
|
116
122
|
|
|
117
|
-
`
|
|
123
|
+
Use `on()` to listen for events. It returns an unsubscribe function:
|
|
118
124
|
|
|
119
125
|
```ts
|
|
120
126
|
videomailClient.on("FORM_READY", () => {
|
|
@@ -122,7 +128,7 @@ videomailClient.on("FORM_READY", () => {
|
|
|
122
128
|
});
|
|
123
129
|
|
|
124
130
|
videomailClient.on("SUBMITTED", ({ videomail, response }) => {
|
|
125
|
-
//
|
|
131
|
+
// Handle the submitted video in your app.
|
|
126
132
|
});
|
|
127
133
|
```
|
|
128
134
|
|
|
@@ -132,13 +138,13 @@ Check them out at [src/types/events/index.ts](https://github.com/binarykitchen/v
|
|
|
132
138
|
|
|
133
139
|
Some events include typed parameters exported by the package.
|
|
134
140
|
|
|
135
|
-
The client
|
|
141
|
+
The client shows errors by default. Listen for `ERROR` to add your own logging or recovery.
|
|
136
142
|
|
|
137
|
-
Videomail errors extend the native `Error` class
|
|
143
|
+
Videomail errors extend the native `Error` class with details for troubleshooting.
|
|
138
144
|
|
|
139
145
|
### videomailClient.show()
|
|
140
146
|
|
|
141
|
-
|
|
147
|
+
Adds the recording form to the page. By default, it uses the element with ID `videomail`. You can change this in the [options](#options).
|
|
142
148
|
|
|
143
149
|
### videomailClient.record()
|
|
144
150
|
|
|
@@ -146,19 +152,32 @@ Starts recording without requiring the user to press the record button.
|
|
|
146
152
|
|
|
147
153
|
### videomailClient.pause()
|
|
148
154
|
|
|
149
|
-
Pauses
|
|
155
|
+
Pauses a recording or countdown without losing it. Leaves idle cameras and unsent previews alone.
|
|
156
|
+
|
|
157
|
+
For native apps, pair this with `videomailClient.recoverCamera()` when the app returns to the foreground.
|
|
150
158
|
|
|
151
159
|
### videomailClient.recoverCamera()
|
|
152
160
|
|
|
153
|
-
Returns a `Promise<boolean
|
|
161
|
+
Returns a `Promise<boolean>`: `true` if camera recovery succeeds.
|
|
162
|
+
|
|
163
|
+
- Restarts playback for live tracks.
|
|
164
|
+
- Requests a new stream if camera or microphone tracks have ended.
|
|
165
|
+
- Shares pending recovery across duplicate calls.
|
|
166
|
+
- Returns `false` without changes if the client is unbuilt, has an unsent preview, is encoding, or is submitting.
|
|
167
|
+
|
|
168
|
+
Recovery keeps frame dimensions, frame/sample counts, and the audio sample rate. It does **not** resume recording or a countdown on its own. The user chooses Resume, which waits for recovery before sending more frames.
|
|
169
|
+
|
|
170
|
+
With automatic pause enabled, hiding the page pauses recording. Returning to it recovers the camera. Native apps should call `pause()` when backgrounded and `recoverCamera()` when foregrounded. Wire these into your app's lifecycle; no Capacitor dependency is needed. Use recovery, not `startOver()`, to keep a paused take.
|
|
154
171
|
|
|
155
|
-
Recovery
|
|
172
|
+
Recovery events:
|
|
156
173
|
|
|
157
|
-
|
|
174
|
+
- `CAMERA_RECOVERING`: recovery has started.
|
|
175
|
+
- `USER_MEDIA_READY` with `recovering: true`: the replacement stream is ready.
|
|
176
|
+
- `CAMERA_RECOVERY_FAILED` with an `err`: access, playback, audio setup, or the recovery deadline failed.
|
|
158
177
|
|
|
159
|
-
|
|
178
|
+
The default failure notice keeps the take. Users can retry Resume or stop to keep what they recorded. Stop, reset, unload, and submission cancel pending recovery. Streams that arrive after cancellation are stopped.
|
|
160
179
|
|
|
161
|
-
|
|
180
|
+
Recovery cannot reconnect a lost recording WebSocket or keep a take after the app process ends. Test the camera and microphone on physical devices, too.
|
|
162
181
|
|
|
163
182
|
### videomailClient.replay(videomail[, parentElementId])
|
|
164
183
|
|
|
@@ -166,13 +185,13 @@ Adds a video player for the supplied videomail.
|
|
|
166
185
|
|
|
167
186
|
If `replayParentElementId` is supplied, the player is inserted into that element. Otherwise, the client uses or creates a replay container within the configured container.
|
|
168
187
|
|
|
169
|
-
|
|
188
|
+
If the parent already has a video element like this:
|
|
170
189
|
|
|
171
190
|
```html
|
|
172
191
|
<video class="replay"></video>
|
|
173
192
|
```
|
|
174
193
|
|
|
175
|
-
|
|
194
|
+
The client reuses it. No extra element needed.
|
|
176
195
|
|
|
177
196
|
### videomailClient.startOver()
|
|
178
197
|
|
|
@@ -180,10 +199,10 @@ Resets the client and returns it to the ready state so the same instance can rec
|
|
|
180
199
|
|
|
181
200
|
### videomailClient.getByAlias(alias)
|
|
182
201
|
|
|
183
|
-
Returns a videomail asynchronously for the given alias.
|
|
202
|
+
Returns a videomail asynchronously for the given alias. Find the alias in:
|
|
184
203
|
|
|
185
|
-
1. The
|
|
186
|
-
2. The `SUBMITTED` event
|
|
204
|
+
1. The `videomail_alias` field sent to your server.
|
|
205
|
+
2. The `SUBMITTED` event data.
|
|
187
206
|
|
|
188
207
|
### videomailClient.getByKey(key)
|
|
189
208
|
|
|
@@ -199,15 +218,15 @@ Returns the videomail thread containing the given key.
|
|
|
199
218
|
|
|
200
219
|
### videomailClient.unload()
|
|
201
220
|
|
|
202
|
-
|
|
221
|
+
Stops the webcam, closes the active WebSocket connection, and removes all internal event listeners.
|
|
203
222
|
|
|
204
223
|
### videomailClient.hide()
|
|
205
224
|
|
|
206
|
-
Hides
|
|
225
|
+
Hides the UI without unloading it.
|
|
207
226
|
|
|
208
227
|
### videomailClient.isDirty()
|
|
209
228
|
|
|
210
|
-
Returns `true` when a video has been
|
|
229
|
+
Returns `true` when a recorded video has not been submitted. Use it to warn users before they leave an unsent recording.
|
|
211
230
|
|
|
212
231
|
### videomailClient.isRecording()
|
|
213
232
|
|
|
@@ -219,21 +238,25 @@ Returns `true` after the client UI has been built and before it is unloaded.
|
|
|
219
238
|
|
|
220
239
|
### videomailClient.submit()
|
|
221
240
|
|
|
222
|
-
|
|
241
|
+
Submits the form after client validation succeeds.
|
|
242
|
+
|
|
243
|
+
With `enableAutoValidation: false`, no client validation event is needed. Your app must validate the form first. This helps when your app provides its own submit button.
|
|
223
244
|
|
|
224
245
|
### videomailClient.getLogLines()
|
|
225
246
|
|
|
226
|
-
Returns
|
|
247
|
+
Returns recent log lines if your logger collects them.
|
|
227
248
|
|
|
228
249
|
### videomailClient.setLimitSeconds(limitSeconds)
|
|
229
250
|
|
|
230
|
-
|
|
251
|
+
Changes the time limit for further recording.
|
|
231
252
|
|
|
232
253
|
## Stored videomail data
|
|
233
254
|
|
|
234
|
-
The `SUBMITTED` event includes a `videomail` object.
|
|
255
|
+
The `SUBMITTED` event includes a `videomail` object. Its fields may evolve; check the exported `Videomail` type for the current shape.
|
|
256
|
+
|
|
257
|
+
For new recordings, `width` and `height` describe the captured canvas frames. They are not the viewport or resized preview dimensions. They stay available after the camera stops and are replaced when you record again.
|
|
235
258
|
|
|
236
|
-
|
|
259
|
+
Here's a shortened example:
|
|
237
260
|
|
|
238
261
|
```json
|
|
239
262
|
{
|
|
@@ -276,7 +299,7 @@ You can also retrieve this data with `videomailClient.getByKey()`.
|
|
|
276
299
|
|
|
277
300
|
## Form Submissions
|
|
278
301
|
|
|
279
|
-
|
|
302
|
+
See [Form Submissions ✏️](./docs/FORM_SUBMISSIONS.md) to set up submissions, include metadata, and test your integration.
|
|
280
303
|
|
|
281
304
|
## Privacy and error reporting
|
|
282
305
|
|
|
@@ -284,13 +307,26 @@ Read about our privacy and error reporting practices in [Privacy and error repor
|
|
|
284
307
|
|
|
285
308
|
## Whitelist
|
|
286
309
|
|
|
287
|
-
|
|
310
|
+
The examples work locally without extra setup. Videomail allows these development origins:
|
|
311
|
+
|
|
312
|
+
- [https://localhost:8443](https://localhost:8443)
|
|
313
|
+
- `https://localhost`
|
|
314
|
+
- `https://localhost:443`
|
|
315
|
+
|
|
316
|
+
Other origins need their own whitelist entry.
|
|
288
317
|
|
|
289
318
|
For a deployed domain, request access at [videomail.io/whitelist](https://videomail.io/whitelist). You will receive a whitelist key for the approved origins.
|
|
290
319
|
|
|
291
320
|
## Browser compatibility
|
|
292
321
|
|
|
293
|
-
Recording
|
|
322
|
+
Recording needs a secure context (`https://` or localhost), plus:
|
|
323
|
+
|
|
324
|
+
- `navigator.mediaDevices.getUserMedia()`
|
|
325
|
+
- WebSocket
|
|
326
|
+
- Canvas
|
|
327
|
+
- AudioWorklet, if audio is enabled
|
|
328
|
+
|
|
329
|
+
Current evergreen desktop and mobile browsers are supported. Internet Explorer is not.
|
|
294
330
|
|
|
295
331
|
See [Can I Use: Media Capture from DOM Elements](https://caniuse.com/stream) and test the [live demo](#live-demo) in the browsers required by your integration.
|
|
296
332
|
|
|
@@ -304,7 +340,7 @@ It extends the Ninja Forms form builder with a webcam input and submission integ
|
|
|
304
340
|
|
|
305
341
|
### Changelog
|
|
306
342
|
|
|
307
|
-
|
|
343
|
+
No separate changelog. Check `git log` or the [commit history](https://github.com/binarykitchen/videomail-client/commits/master).
|
|
308
344
|
|
|
309
345
|
### Noise
|
|
310
346
|
|
|
@@ -316,7 +352,7 @@ Videomail in the wild:
|
|
|
316
352
|
|
|
317
353
|
This is just the beginning. I will add a lot more over time.
|
|
318
354
|
|
|
319
|
-
|
|
355
|
+
There's still work to do on performance, audio, and test coverage. We improve things piece by piece, rather than chase perfection in one big rewrite.
|
|
320
356
|
|
|
321
357
|
### Credits
|
|
322
358
|
|
|
@@ -336,8 +372,8 @@ They all deserve lots of love in return. Thank you so much.
|
|
|
336
372
|
|
|
337
373
|
### Code quality
|
|
338
374
|
|
|
339
|
-
|
|
375
|
+
Stability and bug fixes come before big rewrites. The code keeps evolving with browser media APIs and the apps that use it.
|
|
340
376
|
|
|
341
377
|
### Final philosophy
|
|
342
378
|
|
|
343
|
-
|
|
379
|
+
Make Sign Language at home in email and web forms. That's what we're here for.
|
package/dist/cjs/index.cjs
CHANGED
|
@@ -1,11 +1,11 @@
|
|
|
1
1
|
var __webpack_modules__ = {
|
|
2
|
-
|
|
2
|
+
eq (module, __webpack_exports__, __webpack_require__) {
|
|
3
3
|
"use strict";
|
|
4
|
-
var
|
|
5
|
-
var
|
|
6
|
-
var
|
|
7
|
-
var
|
|
8
|
-
var ___CSS_LOADER_EXPORT___ =
|
|
4
|
+
var _node_modules_rsbuild_core_compiled_css_loader_noSourceMaps_js__rspack_import_1 = __webpack_require__("erX");
|
|
5
|
+
var _node_modules_rsbuild_core_compiled_css_loader_noSourceMaps_js__rspack_import_1_default = /*#__PURE__*/ __webpack_require__.n(_node_modules_rsbuild_core_compiled_css_loader_noSourceMaps_js__rspack_import_1);
|
|
6
|
+
var _node_modules_rsbuild_core_compiled_css_loader_api_js__rspack_import_0 = __webpack_require__("zm");
|
|
7
|
+
var _node_modules_rsbuild_core_compiled_css_loader_api_js__rspack_import_0_default = /*#__PURE__*/ __webpack_require__.n(_node_modules_rsbuild_core_compiled_css_loader_api_js__rspack_import_0);
|
|
8
|
+
var ___CSS_LOADER_EXPORT___ = _node_modules_rsbuild_core_compiled_css_loader_api_js__rspack_import_0_default()(_node_modules_rsbuild_core_compiled_css_loader_noSourceMaps_js__rspack_import_1_default());
|
|
9
9
|
___CSS_LOADER_EXPORT___.push([
|
|
10
10
|
module.id,
|
|
11
11
|
`@keyframes blink {
|
|
@@ -153,7 +153,7 @@ var __webpack_modules__ = {
|
|
|
153
153
|
});
|
|
154
154
|
},
|
|
155
155
|
b6 (module, exports1, __webpack_require__) {
|
|
156
|
-
var EventEmitter = __webpack_require__("
|
|
156
|
+
var EventEmitter = __webpack_require__("q").EventEmitter, inherits = __webpack_require__("c5"), raf = __webpack_require__("jY"), methods;
|
|
157
157
|
var defaultRAFObject = {
|
|
158
158
|
requestAnimationFrame: raf,
|
|
159
159
|
cancelAnimationFrame: raf.cancel
|
|
@@ -1831,7 +1831,7 @@ var __webpack_modules__ = {
|
|
|
1831
1831
|
},
|
|
1832
1832
|
xF (module, __unused_rspack_exports, __webpack_require__) {
|
|
1833
1833
|
"use strict";
|
|
1834
|
-
var document1 = __webpack_require__("
|
|
1834
|
+
var document1 = __webpack_require__("g");
|
|
1835
1835
|
var Event1 = __webpack_require__("cE");
|
|
1836
1836
|
var Keys = __webpack_require__("Dy");
|
|
1837
1837
|
module.exports = Visibility;
|
|
@@ -2186,7 +2186,7 @@ var __webpack_modules__ = {
|
|
|
2186
2186
|
var isArray = __webpack_require__("ab");
|
|
2187
2187
|
var Duplex;
|
|
2188
2188
|
Readable.ReadableState = ReadableState;
|
|
2189
|
-
__webpack_require__("
|
|
2189
|
+
__webpack_require__("q").EventEmitter;
|
|
2190
2190
|
var EElistenerCount = function(emitter, type) {
|
|
2191
2191
|
return emitter.listeners(type).length;
|
|
2192
2192
|
};
|
|
@@ -3450,7 +3450,7 @@ var __webpack_modules__ = {
|
|
|
3450
3450
|
};
|
|
3451
3451
|
},
|
|
3452
3452
|
tb (module, __unused_rspack_exports, __webpack_require__) {
|
|
3453
|
-
module.exports = __webpack_require__("
|
|
3453
|
+
module.exports = __webpack_require__("q").EventEmitter;
|
|
3454
3454
|
},
|
|
3455
3455
|
GB (module, exports1, __webpack_require__) {
|
|
3456
3456
|
exports1 = module.exports = __webpack_require__("rp");
|
|
@@ -3847,7 +3847,7 @@ var __webpack_modules__ = {
|
|
|
3847
3847
|
"use strict";
|
|
3848
3848
|
module.exports = Object;
|
|
3849
3849
|
},
|
|
3850
|
-
|
|
3850
|
+
q (module) {
|
|
3851
3851
|
"use strict";
|
|
3852
3852
|
var R = 'object' == typeof Reflect ? Reflect : null;
|
|
3853
3853
|
var ReflectApply = R && 'function' == typeof R.apply ? R.apply : function(target, receiver, args) {
|
|
@@ -4897,7 +4897,7 @@ var __webpack_modules__ = {
|
|
|
4897
4897
|
return tuple.listen;
|
|
4898
4898
|
}
|
|
4899
4899
|
},
|
|
4900
|
-
|
|
4900
|
+
g (module, __unused_rspack_exports, __webpack_require__) {
|
|
4901
4901
|
var topLevel = void 0 !== __webpack_require__.g ? __webpack_require__.g : "u" > typeof window ? window : {};
|
|
4902
4902
|
var minDoc = __webpack_require__("MM");
|
|
4903
4903
|
var doccy;
|
|
@@ -8811,7 +8811,7 @@ var __webpack_modules__ = {
|
|
|
8811
8811
|
var isArray = __webpack_require__("N3");
|
|
8812
8812
|
var Duplex;
|
|
8813
8813
|
Readable.ReadableState = ReadableState;
|
|
8814
|
-
__webpack_require__("
|
|
8814
|
+
__webpack_require__("q").EventEmitter;
|
|
8815
8815
|
var EElistenerCount = function(emitter, type) {
|
|
8816
8816
|
return emitter.listeners(type).length;
|
|
8817
8817
|
};
|
|
@@ -8830,7 +8830,7 @@ var __webpack_modules__ = {
|
|
|
8830
8830
|
var debug = void 0;
|
|
8831
8831
|
debug = debugUtil && debugUtil.debuglog ? debugUtil.debuglog('stream') : function() {};
|
|
8832
8832
|
var BufferList = __webpack_require__("aI");
|
|
8833
|
-
var destroyImpl = __webpack_require__("
|
|
8833
|
+
var destroyImpl = __webpack_require__("R5");
|
|
8834
8834
|
var StringDecoder;
|
|
8835
8835
|
util.inherits(Readable, Stream);
|
|
8836
8836
|
var kProxyEvents = [
|
|
@@ -9565,7 +9565,7 @@ var __webpack_modules__ = {
|
|
|
9565
9565
|
function _isUint8Array(obj) {
|
|
9566
9566
|
return Buffer.isBuffer(obj) || obj instanceof OurUint8Array;
|
|
9567
9567
|
}
|
|
9568
|
-
var destroyImpl = __webpack_require__("
|
|
9568
|
+
var destroyImpl = __webpack_require__("R5");
|
|
9569
9569
|
util.inherits(Writable, Stream);
|
|
9570
9570
|
function nop() {}
|
|
9571
9571
|
function WritableState(options, stream) {
|
|
@@ -10019,7 +10019,7 @@ var __webpack_modules__ = {
|
|
|
10019
10019
|
return this.constructor.name + ' ' + obj;
|
|
10020
10020
|
};
|
|
10021
10021
|
},
|
|
10022
|
-
|
|
10022
|
+
R5 (module, __unused_rspack_exports, __webpack_require__) {
|
|
10023
10023
|
"use strict";
|
|
10024
10024
|
var pna = __webpack_require__("sj");
|
|
10025
10025
|
function destroy(err, cb) {
|
|
@@ -10075,7 +10075,7 @@ var __webpack_modules__ = {
|
|
|
10075
10075
|
};
|
|
10076
10076
|
},
|
|
10077
10077
|
O (module, __unused_rspack_exports, __webpack_require__) {
|
|
10078
|
-
module.exports = __webpack_require__("
|
|
10078
|
+
module.exports = __webpack_require__("q").EventEmitter;
|
|
10079
10079
|
},
|
|
10080
10080
|
Fo (module, exports1, __webpack_require__) {
|
|
10081
10081
|
exports1 = module.exports = __webpack_require__("w");
|
|
@@ -10565,7 +10565,7 @@ var __webpack_modules__ = {
|
|
|
10565
10565
|
a () {},
|
|
10566
10566
|
Av () {},
|
|
10567
10567
|
eD () {},
|
|
10568
|
-
|
|
10568
|
+
zm (module) {
|
|
10569
10569
|
"use strict";
|
|
10570
10570
|
module.exports = function(cssWithMappingToString) {
|
|
10571
10571
|
var list = [];
|
|
@@ -10619,13 +10619,13 @@ var __webpack_modules__ = {
|
|
|
10619
10619
|
return list;
|
|
10620
10620
|
};
|
|
10621
10621
|
},
|
|
10622
|
-
|
|
10622
|
+
erX (module) {
|
|
10623
10623
|
"use strict";
|
|
10624
10624
|
module.exports = function(i) {
|
|
10625
10625
|
return i[1];
|
|
10626
10626
|
};
|
|
10627
10627
|
},
|
|
10628
|
-
|
|
10628
|
+
R (module) {
|
|
10629
10629
|
"use strict";
|
|
10630
10630
|
var stylesInDOM = [];
|
|
10631
10631
|
function getIndexByIdentifier(identifier) {
|
|
@@ -10704,7 +10704,7 @@ var __webpack_modules__ = {
|
|
|
10704
10704
|
};
|
|
10705
10705
|
};
|
|
10706
10706
|
},
|
|
10707
|
-
|
|
10707
|
+
uZ (module) {
|
|
10708
10708
|
"use strict";
|
|
10709
10709
|
var memo = {};
|
|
10710
10710
|
function getTarget(target) {
|
|
@@ -10726,7 +10726,7 @@ var __webpack_modules__ = {
|
|
|
10726
10726
|
}
|
|
10727
10727
|
module.exports = insertBySelector;
|
|
10728
10728
|
},
|
|
10729
|
-
|
|
10729
|
+
mK (module) {
|
|
10730
10730
|
"use strict";
|
|
10731
10731
|
function insertStyleElement(options) {
|
|
10732
10732
|
var element = document.createElement("style");
|
|
@@ -10736,7 +10736,7 @@ var __webpack_modules__ = {
|
|
|
10736
10736
|
}
|
|
10737
10737
|
module.exports = insertStyleElement;
|
|
10738
10738
|
},
|
|
10739
|
-
|
|
10739
|
+
kU (module, __unused_rspack_exports, __webpack_require__) {
|
|
10740
10740
|
"use strict";
|
|
10741
10741
|
function setAttributesWithoutAttributes(styleElement) {
|
|
10742
10742
|
var nonce = __webpack_require__.nc;
|
|
@@ -10744,7 +10744,7 @@ var __webpack_modules__ = {
|
|
|
10744
10744
|
}
|
|
10745
10745
|
module.exports = setAttributesWithoutAttributes;
|
|
10746
10746
|
},
|
|
10747
|
-
|
|
10747
|
+
Bd (module) {
|
|
10748
10748
|
"use strict";
|
|
10749
10749
|
function apply(styleElement, options, obj) {
|
|
10750
10750
|
var css = "";
|
|
@@ -10781,7 +10781,7 @@ var __webpack_modules__ = {
|
|
|
10781
10781
|
}
|
|
10782
10782
|
module.exports = domAPI;
|
|
10783
10783
|
},
|
|
10784
|
-
|
|
10784
|
+
snK (module) {
|
|
10785
10785
|
"use strict";
|
|
10786
10786
|
function styleTagTransform(css, styleElement) {
|
|
10787
10787
|
if (styleElement.styleSheet) styleElement.styleSheet.cssText = css;
|
|
@@ -11126,7 +11126,7 @@ var __webpack_exports__ = {};
|
|
|
11126
11126
|
var client = __webpack_require__("Q");
|
|
11127
11127
|
var client_default = /*#__PURE__*/ __webpack_require__.n(client);
|
|
11128
11128
|
var package_namespaceObject = {
|
|
11129
|
-
rE: "16.
|
|
11129
|
+
rE: "16.5.0"
|
|
11130
11130
|
};
|
|
11131
11131
|
function isAudioEnabled(options) {
|
|
11132
11132
|
return Boolean(options.audio.enabled);
|
|
@@ -14656,12 +14656,12 @@ var __webpack_exports__ = {};
|
|
|
14656
14656
|
const errName = null != (_ref = null == err ? void 0 : err.name) ? _ref : null == err ? void 0 : err.constructor.name;
|
|
14657
14657
|
switch(errName){
|
|
14658
14658
|
case error_VideomailError.SECURITY_ERROR:
|
|
14659
|
-
message = "
|
|
14660
|
-
explanation = "
|
|
14659
|
+
message = "Your browser blocked this action";
|
|
14660
|
+
explanation = "Check this page's camera permissions and security settings.";
|
|
14661
14661
|
classList.push(error_VideomailError.BROWSER_PROBLEM);
|
|
14662
14662
|
break;
|
|
14663
14663
|
case error_VideomailError.OVERCONSTRAINED:
|
|
14664
|
-
message = "
|
|
14664
|
+
message = "Your webcam cannot use these settings";
|
|
14665
14665
|
if (err && "constraint" in err) {
|
|
14666
14666
|
const overconstrainedError = err;
|
|
14667
14667
|
const constraint = overconstrainedError.constraint;
|
|
@@ -14672,64 +14672,64 @@ var __webpack_exports__ = {};
|
|
|
14672
14672
|
break;
|
|
14673
14673
|
case "MediaDeviceFailedDueToShutdown":
|
|
14674
14674
|
message = "Webcam is shutting down";
|
|
14675
|
-
explanation = "
|
|
14675
|
+
explanation = "Wait for your webcam to finish switching off, then try again.";
|
|
14676
14676
|
break;
|
|
14677
14677
|
case "SourceUnavailableError":
|
|
14678
|
-
message = "
|
|
14679
|
-
explanation = "
|
|
14678
|
+
message = "Cannot access your webcam";
|
|
14679
|
+
explanation = "Another app may be using it, or there may be a hardware problem.";
|
|
14680
14680
|
break;
|
|
14681
14681
|
case "NO_DEVICES_FOUND":
|
|
14682
14682
|
if (audioEnabled) {
|
|
14683
|
-
message = "No webcam
|
|
14684
|
-
explanation = "
|
|
14683
|
+
message = "No webcam or microphone found";
|
|
14684
|
+
explanation = "Check that your webcam and microphone are connected.";
|
|
14685
14685
|
} else {
|
|
14686
14686
|
message = "No webcam found";
|
|
14687
|
-
explanation = "
|
|
14687
|
+
explanation = "Check that your webcam is connected.";
|
|
14688
14688
|
}
|
|
14689
14689
|
classList.push(error_VideomailError.WEBCAM_PROBLEM);
|
|
14690
14690
|
break;
|
|
14691
14691
|
case "PermissionDismissedError":
|
|
14692
|
-
message = "
|
|
14693
|
-
explanation = "
|
|
14692
|
+
message = "Camera permission is needed";
|
|
14693
|
+
explanation = "The camera permission prompt was closed.<br/>Please allow access when it appears again.";
|
|
14694
14694
|
classList.push(error_VideomailError.WEBCAM_PROBLEM);
|
|
14695
14695
|
break;
|
|
14696
14696
|
case error_VideomailError.NOT_ALLOWED_ERROR:
|
|
14697
14697
|
case error_VideomailError.PERMISSION_DENIED:
|
|
14698
14698
|
case "PermissionDeniedError":
|
|
14699
14699
|
message = "Permission denied";
|
|
14700
|
-
explanation = "
|
|
14700
|
+
explanation = "We cannot access your webcam. Check these possibilities:<ul><li>Camera access is blocked in your browser settings.</li><li>Another app is using your webcam.</li></ul>";
|
|
14701
14701
|
classList.push(error_VideomailError.WEBCAM_PROBLEM);
|
|
14702
14702
|
break;
|
|
14703
14703
|
case "HARDWARE_UNAVAILABLE":
|
|
14704
14704
|
case "AbortError":
|
|
14705
14705
|
message = "Webcam is unavailable";
|
|
14706
|
-
explanation = "
|
|
14706
|
+
explanation = "Another window may be using it. Close it and try again.";
|
|
14707
14707
|
classList.push(error_VideomailError.WEBCAM_PROBLEM);
|
|
14708
14708
|
break;
|
|
14709
14709
|
case "NO_VIDEO_FEED":
|
|
14710
|
-
message = "No video feed found
|
|
14711
|
-
explanation = "
|
|
14710
|
+
message = "No video feed found";
|
|
14711
|
+
explanation = "Another browser may be using your webcam.";
|
|
14712
14712
|
classList.push(error_VideomailError.WEBCAM_PROBLEM);
|
|
14713
14713
|
break;
|
|
14714
14714
|
case error_VideomailError.STARTING_FAILED:
|
|
14715
|
-
message = "
|
|
14716
|
-
explanation = "
|
|
14715
|
+
message = "Could not start recording";
|
|
14716
|
+
explanation = "Another browser may be using your webcam.";
|
|
14717
14717
|
classList.push(error_VideomailError.WEBCAM_PROBLEM);
|
|
14718
14718
|
break;
|
|
14719
14719
|
case "DevicesNotFoundError":
|
|
14720
|
-
message = "No available webcam
|
|
14721
|
-
explanation = "
|
|
14720
|
+
message = "No available webcam found";
|
|
14721
|
+
explanation = "Check that your webcam is connected and not being used by another app.";
|
|
14722
14722
|
classList.push(error_VideomailError.WEBCAM_PROBLEM);
|
|
14723
14723
|
break;
|
|
14724
14724
|
case error_VideomailError.NOT_READABLE_ERROR:
|
|
14725
14725
|
case error_VideomailError.TRACK_START_ERROR:
|
|
14726
|
-
message = "
|
|
14727
|
-
explanation = "
|
|
14726
|
+
message = "Cannot access your webcam";
|
|
14727
|
+
explanation = "Another browser may be using it. Close it and try again.";
|
|
14728
14728
|
classList.push(error_VideomailError.WEBCAM_PROBLEM);
|
|
14729
14729
|
break;
|
|
14730
14730
|
case error_VideomailError.INVALID_STATE_ERROR:
|
|
14731
|
-
message = "
|
|
14732
|
-
explanation = "
|
|
14731
|
+
message = "Your camera stream has ended";
|
|
14732
|
+
explanation = "The webcam stream is no longer active.";
|
|
14733
14733
|
classList.push(error_VideomailError.WEBCAM_PROBLEM);
|
|
14734
14734
|
break;
|
|
14735
14735
|
case error_VideomailError.DOM_EXCEPTION:
|
|
@@ -15832,19 +15832,19 @@ var __webpack_exports__ = {};
|
|
|
15832
15832
|
return newOptions;
|
|
15833
15833
|
}
|
|
15834
15834
|
const options_mergeWithDefaultOptions = mergeWithDefaultOptions;
|
|
15835
|
-
var injectStylesIntoStyleTag = __webpack_require__("
|
|
15835
|
+
var injectStylesIntoStyleTag = __webpack_require__("R");
|
|
15836
15836
|
var injectStylesIntoStyleTag_default = /*#__PURE__*/ __webpack_require__.n(injectStylesIntoStyleTag);
|
|
15837
|
-
var styleDomAPI = __webpack_require__("
|
|
15837
|
+
var styleDomAPI = __webpack_require__("Bd");
|
|
15838
15838
|
var styleDomAPI_default = /*#__PURE__*/ __webpack_require__.n(styleDomAPI);
|
|
15839
|
-
var insertBySelector = __webpack_require__("
|
|
15839
|
+
var insertBySelector = __webpack_require__("uZ");
|
|
15840
15840
|
var insertBySelector_default = /*#__PURE__*/ __webpack_require__.n(insertBySelector);
|
|
15841
|
-
var setAttributesWithoutAttributes = __webpack_require__("
|
|
15841
|
+
var setAttributesWithoutAttributes = __webpack_require__("kU");
|
|
15842
15842
|
var setAttributesWithoutAttributes_default = /*#__PURE__*/ __webpack_require__.n(setAttributesWithoutAttributes);
|
|
15843
|
-
var insertStyleElement = __webpack_require__("
|
|
15843
|
+
var insertStyleElement = __webpack_require__("mK");
|
|
15844
15844
|
var insertStyleElement_default = /*#__PURE__*/ __webpack_require__.n(insertStyleElement);
|
|
15845
|
-
var styleTagTransform = __webpack_require__("
|
|
15845
|
+
var styleTagTransform = __webpack_require__("snK");
|
|
15846
15846
|
var styleTagTransform_default = /*#__PURE__*/ __webpack_require__.n(styleTagTransform);
|
|
15847
|
-
var main = __webpack_require__("
|
|
15847
|
+
var main = __webpack_require__("eq");
|
|
15848
15848
|
var main_options = {};
|
|
15849
15849
|
main_options.styleTagTransform = styleTagTransform_default();
|
|
15850
15850
|
main_options.setAttributes = setAttributesWithoutAttributes_default();
|
|
@@ -19970,11 +19970,11 @@ var __webpack_exports__ = {};
|
|
|
19970
19970
|
const connection = RecorderConnection;
|
|
19971
19971
|
function createUserMediaConstraints({ options, facingMode, limitedWidth, userMediaParams }) {
|
|
19972
19972
|
const video = {
|
|
19973
|
+
facingMode: (null == userMediaParams ? void 0 : userMediaParams.switchingFacingMode) || facingMode,
|
|
19973
19974
|
frameRate: {
|
|
19974
19975
|
ideal: options.video.fps
|
|
19975
19976
|
}
|
|
19976
19977
|
};
|
|
19977
|
-
if ((null == userMediaParams ? void 0 : userMediaParams.switchingFacingMode) || (null == userMediaParams ? void 0 : userMediaParams.recovering)) video.facingMode = userMediaParams.switchingFacingMode || facingMode;
|
|
19978
19978
|
if (options.video.width) video.width = {
|
|
19979
19979
|
ideal: options.video.width
|
|
19980
19980
|
};
|
|
@@ -21274,10 +21274,7 @@ var __webpack_exports__ = {};
|
|
|
21274
21274
|
"droidcam"
|
|
21275
21275
|
];
|
|
21276
21276
|
function isVirtualCamera(videoTrack) {
|
|
21277
|
-
|
|
21278
|
-
if (!capabilities.frameRate) return true;
|
|
21279
|
-
const isVirtual = VIRTUAL_KEYWORDS.some((keyword)=>videoTrack.label.toLowerCase().includes(keyword));
|
|
21280
|
-
return isVirtual;
|
|
21277
|
+
return VIRTUAL_KEYWORDS.some((keyword)=>videoTrack.label.toLowerCase().includes(keyword));
|
|
21281
21278
|
}
|
|
21282
21279
|
const util_isVirtualCamera = isVirtualCamera;
|
|
21283
21280
|
function userMedia_asyncGeneratorStep(gen, resolve, reject, _next, _throw, key, arg) {
|
|
@@ -21721,7 +21718,7 @@ var __webpack_exports__ = {};
|
|
|
21721
21718
|
let explanation = "(No explanation given)";
|
|
21722
21719
|
if (null == (_command_args = command.args) ? void 0 : null == (_command_args_err = _command_args.err) ? void 0 : _command_args_err.message) explanation = command.args.err.message;
|
|
21723
21720
|
const err = error_createError({
|
|
21724
|
-
message: "
|
|
21721
|
+
message: "WebSocket error from the Videomail server",
|
|
21725
21722
|
explanation,
|
|
21726
21723
|
err: deserializeError(null == (_command_args1 = command.args) ? void 0 : _command_args1.err),
|
|
21727
21724
|
options: this.options
|
|
@@ -23031,7 +23028,7 @@ var __webpack_exports__ = {};
|
|
|
23031
23028
|
submit() {
|
|
23032
23029
|
return container_async_to_generator(function*() {
|
|
23033
23030
|
this.options.logger.debug("Container: submit()");
|
|
23034
|
-
if (this.lastValidation) {
|
|
23031
|
+
if (!this.options.enableAutoValidation || this.lastValidation) {
|
|
23035
23032
|
var _this_form;
|
|
23036
23033
|
return yield null == (_this_form = this.form) ? void 0 : _this_form.doTheSubmit();
|
|
23037
23034
|
}
|