flet-web 0.25.0.dev3487__py3-none-any.whl

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.

Potentially problematic release.


This version of flet-web might be problematic. Click here for more details.

Files changed (52) hide show
  1. flet_web/__init__.py +9 -0
  2. flet_web/fastapi/README.md +146 -0
  3. flet_web/fastapi/__init__.py +6 -0
  4. flet_web/fastapi/app.py +120 -0
  5. flet_web/fastapi/flet_app.py +431 -0
  6. flet_web/fastapi/flet_app_manager.py +166 -0
  7. flet_web/fastapi/flet_fastapi.py +128 -0
  8. flet_web/fastapi/flet_oauth.py +66 -0
  9. flet_web/fastapi/flet_static_files.py +188 -0
  10. flet_web/fastapi/flet_upload.py +95 -0
  11. flet_web/fastapi/oauth_state.py +11 -0
  12. flet_web/fastapi/serve_fastapi_web_app.py +93 -0
  13. flet_web/patch_index.py +104 -0
  14. flet_web/uploads.py +54 -0
  15. flet_web/version.py +5 -0
  16. flet_web/web/.last_build_id +1 -0
  17. flet_web/web/assets/AssetManifest.bin +2 -0
  18. flet_web/web/assets/AssetManifest.bin.json +1 -0
  19. flet_web/web/assets/AssetManifest.json +1 -0
  20. flet_web/web/assets/FontManifest.json +1 -0
  21. flet_web/web/assets/NOTICES +37060 -0
  22. flet_web/web/assets/fonts/MaterialIcons-Regular.otf +0 -0
  23. flet_web/web/assets/packages/cupertino_icons/assets/CupertinoIcons.ttf +0 -0
  24. flet_web/web/assets/packages/flutter_map/lib/assets/flutter_map_logo.png +0 -0
  25. flet_web/web/assets/packages/media_kit/assets/web/hls1.4.10.js +2 -0
  26. flet_web/web/assets/packages/record_web/assets/js/record.fixwebmduration.js +507 -0
  27. flet_web/web/assets/packages/record_web/assets/js/record.worklet.js +400 -0
  28. flet_web/web/assets/packages/wakelock_plus/assets/no_sleep.js +230 -0
  29. flet_web/web/assets/packages/window_manager/images/ic_chrome_close.png +0 -0
  30. flet_web/web/assets/packages/window_manager/images/ic_chrome_maximize.png +0 -0
  31. flet_web/web/assets/packages/window_manager/images/ic_chrome_minimize.png +0 -0
  32. flet_web/web/assets/packages/window_manager/images/ic_chrome_unmaximize.png +0 -0
  33. flet_web/web/assets/shaders/ink_sparkle.frag +126 -0
  34. flet_web/web/favicon.png +0 -0
  35. flet_web/web/flutter.js +4 -0
  36. flet_web/web/flutter_bootstrap.js +28 -0
  37. flet_web/web/flutter_service_worker.js +218 -0
  38. flet_web/web/icons/apple-touch-icon-192.png +0 -0
  39. flet_web/web/icons/icon-192.png +0 -0
  40. flet_web/web/icons/icon-512.png +0 -0
  41. flet_web/web/icons/icon-maskable-192.png +0 -0
  42. flet_web/web/icons/icon-maskable-512.png +0 -0
  43. flet_web/web/icons/loading-animation.png +0 -0
  44. flet_web/web/index.html +99 -0
  45. flet_web/web/main.dart.js +225762 -0
  46. flet_web/web/manifest.json +35 -0
  47. flet_web/web/python-worker.js +47 -0
  48. flet_web/web/python.js +28 -0
  49. flet_web/web/version.json +1 -0
  50. flet_web-0.25.0.dev3487.dist-info/METADATA +25 -0
  51. flet_web-0.25.0.dev3487.dist-info/RECORD +52 -0
  52. flet_web-0.25.0.dev3487.dist-info/WHEEL +4 -0
@@ -0,0 +1,400 @@
1
+ class RecorderProcessor extends AudioWorkletProcessor {
2
+ static get parameterDescriptors() {
3
+ return [
4
+ {
5
+ name: 'numChannels',
6
+ defaultValue: 1,
7
+ minValue: 1,
8
+ maxValue: 16
9
+ },
10
+ {
11
+ name: 'sampleRate',
12
+ defaultValue: 48000,
13
+ minValue: 8000,
14
+ maxValue: 96000
15
+ }
16
+ ];
17
+ }
18
+
19
+ // Buffer size compromise between size and process call frequency
20
+ _bufferSize = 4096
21
+ // The current buffer fill level
22
+ _bytesWritten = 0
23
+ // Buffer per channel
24
+ _buffers = []
25
+ // Resampler (passthrough, down or up)
26
+ _resampler = null
27
+ // Config
28
+ _numChannels = 1
29
+ _sampleRate = 48000
30
+
31
+ constructor(options) {
32
+ super(options)
33
+
34
+ this._numChannels = options.parameterData.numChannels
35
+ this._sampleRate = options.parameterData.sampleRate
36
+
37
+ // Resampler(current context sample rate, desired sample rate, num channels, buffer size)
38
+ // num channels is always 1 since we resample after interleaving channels
39
+ this._resampler = new Resampler(sampleRate, this._sampleRate, 1, this._bufferSize * this._numChannels)
40
+
41
+ this.initBuffers()
42
+ }
43
+
44
+ initBuffers() {
45
+ this._bytesWritten = 0
46
+ this._buffers = []
47
+
48
+ for (let channel = 0; channel < this._numChannels; channel++) {
49
+ this._buffers[channel] = []
50
+ }
51
+ }
52
+
53
+ /**
54
+ * @returns {boolean}
55
+ */
56
+ isBufferEmpty() {
57
+ return this._bytesWritten === 0
58
+ }
59
+
60
+ /**
61
+ * @returns {boolean}
62
+ */
63
+ isBufferFull() {
64
+ return this._bytesWritten >= this._bufferSize
65
+ }
66
+
67
+ /**
68
+ * @param {Float32Array[][]} inputs
69
+ * @returns {boolean}
70
+ */
71
+ process(inputs) {
72
+ if (this.isBufferFull()) {
73
+ this.flush()
74
+ }
75
+
76
+ const input = inputs[0]
77
+
78
+ if (input.length == 0) {
79
+ // Sometimes, Firefox doesn't give any input. Skip this frame to not fail.
80
+ return true
81
+ }
82
+
83
+ for (let channel = 0; channel < this._numChannels; channel++) {
84
+ // Push a copy of the array.
85
+ // The underlying implementation may reuse it which will break the recording.
86
+ this._buffers[channel].push([...input[channel]])
87
+ }
88
+
89
+ this._bytesWritten += input[0].length
90
+
91
+ return true
92
+ }
93
+
94
+ flush() {
95
+ let channels = []
96
+ for (let channel = 0; channel < this._numChannels; channel++) {
97
+ channels.push(this.mergeFloat32Arrays(this._buffers[channel], this._bytesWritten))
98
+ }
99
+
100
+ let interleaved = this.interleave(channels)
101
+
102
+ let resampled = this._resampler.resample(interleaved)
103
+
104
+ this.port.postMessage(this.floatTo16BitPCM(resampled))
105
+
106
+ this.initBuffers()
107
+ }
108
+
109
+ mergeFloat32Arrays(arrays, bytesWritten) {
110
+ let result = new Float32Array(bytesWritten)
111
+ var offset = 0
112
+
113
+ for (let i = 0; i < arrays.length; i++) {
114
+ result.set(arrays[i], offset)
115
+ offset += arrays[i].length
116
+ }
117
+
118
+ return result
119
+ }
120
+
121
+ // Interleave data from channels from LLLLRRRR to LRLRLRLR
122
+ interleave(channels) {
123
+ if (channels === 1) {
124
+ return channels[0]
125
+ }
126
+
127
+ var length = 0
128
+ for (let i = 0; i < channels.length; i++) {
129
+ length += channels[i].length
130
+ }
131
+
132
+ let result = new Float32Array(length)
133
+
134
+ var index = 0
135
+ var inputIndex = 0
136
+
137
+ while (index < length) {
138
+ for (let i = 0; i < channels.length; i++) {
139
+ result[index] = channels[i][inputIndex]
140
+ index++
141
+ }
142
+
143
+ inputIndex++
144
+ }
145
+
146
+ return result
147
+ }
148
+
149
+ floatTo16BitPCM(input) {
150
+ let output = new DataView(new ArrayBuffer(input.length * 2))
151
+
152
+ for (let i = 0; i < input.length; i++) {
153
+ let s = Math.max(-1, Math.min(1, input[i]))
154
+ let s16 = s < 0 ? s * 0x8000 : s * 0x7FFF
155
+ output.setInt16(i * 2, s16, true)
156
+ }
157
+
158
+ return new Int16Array(output.buffer)
159
+ }
160
+ }
161
+
162
+ class Resampler {
163
+ constructor(fromSampleRate, toSampleRate, channels, inputBufferSize) {
164
+
165
+ if (!fromSampleRate || !toSampleRate || !channels) {
166
+ throw (new Error("Invalid settings specified for the resampler."));
167
+ }
168
+ this.resampler = null;
169
+ this.fromSampleRate = fromSampleRate;
170
+ this.toSampleRate = toSampleRate;
171
+ this.channels = channels || 0;
172
+ this.inputBufferSize = inputBufferSize;
173
+ this.initialize()
174
+ }
175
+
176
+ initialize() {
177
+ if (this.fromSampleRate == this.toSampleRate) {
178
+
179
+ // Setup resampler bypass - Resampler just returns what was passed through
180
+ this.resampler = (buffer) => {
181
+ return buffer
182
+ };
183
+ this.ratioWeight = 1;
184
+
185
+ } else {
186
+ if (this.fromSampleRate < this.toSampleRate) {
187
+
188
+ // Use generic linear interpolation if upsampling,
189
+ // as linear interpolation produces a gradient that we want
190
+ // and works fine with two input sample points per output in this case.
191
+ this.linearInterpolation();
192
+ this.lastWeight = 1;
193
+
194
+ } else {
195
+
196
+ // Custom resampler I wrote that doesn't skip samples
197
+ // like standard linear interpolation in high downsampling.
198
+ // This is more accurate than linear interpolation on downsampling.
199
+ this.multiTap();
200
+ this.tailExists = false;
201
+ this.lastWeight = 0;
202
+ }
203
+
204
+ // Initialize the internal buffer:
205
+ this.initializeBuffers();
206
+ this.ratioWeight = this.fromSampleRate / this.toSampleRate;
207
+ }
208
+ }
209
+
210
+ bufferSlice(sliceAmount) {
211
+
212
+ //Typed array and normal array buffer section referencing:
213
+ try {
214
+ return this.outputBuffer.subarray(0, sliceAmount);
215
+ }
216
+ catch (error) {
217
+ try {
218
+ //Regular array pass:
219
+ this.outputBuffer.length = sliceAmount;
220
+ return this.outputBuffer;
221
+ }
222
+ catch (error) {
223
+ //Nightly Firefox 4 used to have the subarray function named as slice:
224
+ return this.outputBuffer.slice(0, sliceAmount);
225
+ }
226
+ }
227
+ }
228
+
229
+ initializeBuffers() {
230
+ this.outputBufferSize = (Math.ceil(this.inputBufferSize * this.toSampleRate / this.fromSampleRate / this.channels * 1.000000476837158203125) + this.channels) + this.channels;
231
+ try {
232
+ this.outputBuffer = new Float32Array(this.outputBufferSize);
233
+ this.lastOutput = new Float32Array(this.channels);
234
+ }
235
+ catch (error) {
236
+ this.outputBuffer = [];
237
+ this.lastOutput = [];
238
+ }
239
+ }
240
+
241
+ linearInterpolation() {
242
+ this.resampler = (buffer) => {
243
+ let bufferLength = buffer.length,
244
+ channels = this.channels,
245
+ outLength,
246
+ ratioWeight,
247
+ weight,
248
+ firstWeight,
249
+ secondWeight,
250
+ sourceOffset,
251
+ outputOffset,
252
+ outputBuffer,
253
+ channel;
254
+
255
+ if ((bufferLength % channels) !== 0) {
256
+ throw (new Error("Buffer was of incorrect sample length."));
257
+ }
258
+ if (bufferLength <= 0) {
259
+ return [];
260
+ }
261
+
262
+ outLength = this.outputBufferSize;
263
+ ratioWeight = this.ratioWeight;
264
+ weight = this.lastWeight;
265
+ firstWeight = 0;
266
+ secondWeight = 0;
267
+ sourceOffset = 0;
268
+ outputOffset = 0;
269
+ outputBuffer = this.outputBuffer;
270
+
271
+ for (; weight < 1; weight += ratioWeight) {
272
+ secondWeight = weight % 1;
273
+ firstWeight = 1 - secondWeight;
274
+ this.lastWeight = weight % 1;
275
+ for (channel = 0; channel < this.channels; ++channel) {
276
+ outputBuffer[outputOffset++] = (this.lastOutput[channel] * firstWeight) + (buffer[channel] * secondWeight);
277
+ }
278
+ }
279
+ weight -= 1;
280
+ for (bufferLength -= channels, sourceOffset = Math.floor(weight) * channels; outputOffset < outLength && sourceOffset < bufferLength;) {
281
+ secondWeight = weight % 1;
282
+ firstWeight = 1 - secondWeight;
283
+ for (channel = 0; channel < this.channels; ++channel) {
284
+ outputBuffer[outputOffset++] = (buffer[sourceOffset + ((channel > 0) ? (channel) : 0)] * firstWeight) + (buffer[sourceOffset + (channels + channel)] * secondWeight);
285
+ }
286
+ weight += ratioWeight;
287
+ sourceOffset = Math.floor(weight) * channels;
288
+ }
289
+ for (channel = 0; channel < channels; ++channel) {
290
+ this.lastOutput[channel] = buffer[sourceOffset++];
291
+ }
292
+ return this.bufferSlice(outputOffset);
293
+ };
294
+ }
295
+
296
+ multiTap() {
297
+ this.resampler = (buffer) => {
298
+ let bufferLength = buffer.length,
299
+ outLength,
300
+ output_variable_list,
301
+ channels = this.channels,
302
+ ratioWeight,
303
+ weight,
304
+ channel,
305
+ actualPosition,
306
+ amountToNext,
307
+ alreadyProcessedTail,
308
+ outputBuffer,
309
+ outputOffset,
310
+ currentPosition;
311
+
312
+ if ((bufferLength % channels) !== 0) {
313
+ throw (new Error("Buffer was of incorrect sample length."));
314
+ }
315
+ if (bufferLength <= 0) {
316
+ return [];
317
+ }
318
+
319
+ outLength = this.outputBufferSize;
320
+ output_variable_list = [];
321
+ ratioWeight = this.ratioWeight;
322
+ weight = 0;
323
+ actualPosition = 0;
324
+ amountToNext = 0;
325
+ alreadyProcessedTail = !this.tailExists;
326
+ this.tailExists = false;
327
+ outputBuffer = this.outputBuffer;
328
+ outputOffset = 0;
329
+ currentPosition = 0;
330
+
331
+ for (channel = 0; channel < channels; ++channel) {
332
+ output_variable_list[channel] = 0;
333
+ }
334
+
335
+ do {
336
+ if (alreadyProcessedTail) {
337
+ weight = ratioWeight;
338
+ for (channel = 0; channel < channels; ++channel) {
339
+ output_variable_list[channel] = 0;
340
+ }
341
+ } else {
342
+ weight = this.lastWeight;
343
+ for (channel = 0; channel < channels; ++channel) {
344
+ output_variable_list[channel] = this.lastOutput[channel];
345
+ }
346
+ alreadyProcessedTail = true;
347
+ }
348
+ while (weight > 0 && actualPosition < bufferLength) {
349
+ amountToNext = 1 + actualPosition - currentPosition;
350
+ if (weight >= amountToNext) {
351
+ for (channel = 0; channel < channels; ++channel) {
352
+ output_variable_list[channel] += buffer[actualPosition++] * amountToNext;
353
+ }
354
+ currentPosition = actualPosition;
355
+ weight -= amountToNext;
356
+ } else {
357
+ for (channel = 0; channel < channels; ++channel) {
358
+ output_variable_list[channel] += buffer[actualPosition + ((channel > 0) ? channel : 0)] * weight;
359
+ }
360
+ currentPosition += weight;
361
+ weight = 0;
362
+ break;
363
+ }
364
+ }
365
+
366
+ if (weight === 0) {
367
+ for (channel = 0; channel < channels; ++channel) {
368
+ outputBuffer[outputOffset++] = output_variable_list[channel] / ratioWeight;
369
+ }
370
+ } else {
371
+ this.lastWeight = weight;
372
+ for (channel = 0; channel < channels; ++channel) {
373
+ this.lastOutput[channel] = output_variable_list[channel];
374
+ }
375
+ this.tailExists = true;
376
+ break;
377
+ }
378
+ } while (actualPosition < bufferLength && outputOffset < outLength);
379
+ return this.bufferSlice(outputOffset);
380
+ };
381
+ }
382
+
383
+ resample(buffer) {
384
+ if (this.fromSampleRate == this.toSampleRate) {
385
+ this.ratioWeight = 1;
386
+ } else {
387
+ if (this.fromSampleRate < this.toSampleRate) {
388
+ this.lastWeight = 1;
389
+ } else {
390
+ this.tailExists = false;
391
+ this.lastWeight = 0;
392
+ }
393
+ this.initializeBuffers();
394
+ this.ratioWeight = this.fromSampleRate / this.toSampleRate;
395
+ }
396
+ return this.resampler(buffer)
397
+ }
398
+ }
399
+
400
+ registerProcessor("recorder.worklet", RecorderProcessor)
@@ -0,0 +1,230 @@
1
+ var webm =
2
+ 'data:video/webm;base64,GkXfo0AgQoaBAUL3gQFC8oEEQvOBCEKCQAR3ZWJtQoeBAkKFgQIYU4BnQI0VSalmQCgq17FAAw9CQE2AQAZ3aGFtbXlXQUAGd2hhbW15RIlACECPQAAAAAAAFlSua0AxrkAu14EBY8WBAZyBACK1nEADdW5khkAFVl9WUDglhohAA1ZQOIOBAeBABrCBCLqBCB9DtnVAIueBAKNAHIEAAIAwAQCdASoIAAgAAUAmJaQAA3AA/vz0AAA='
3
+ var mp4 =
4
+ 'data:video/mp4;base64,AAAAIGZ0eXBtcDQyAAACAGlzb21pc28yYXZjMW1wNDEAAAAIZnJlZQAACKBtZGF0AAAC8wYF///v3EXpvebZSLeWLNgg2SPu73gyNjQgLSBjb3JlIDE0MiByMjQ3OSBkZDc5YTYxIC0gSC4yNjQvTVBFRy00IEFWQyBjb2RlYyAtIENvcHlsZWZ0IDIwMDMtMjAxNCAtIGh0dHA6Ly93d3cudmlkZW9sYW4ub3JnL3gyNjQuaHRtbCAtIG9wdGlvbnM6IGNhYmFjPTEgcmVmPTEgZGVibG9jaz0xOjA6MCBhbmFseXNlPTB4MToweDExMSBtZT1oZXggc3VibWU9MiBwc3k9MSBwc3lfcmQ9MS4wMDowLjAwIG1peGVkX3JlZj0wIG1lX3JhbmdlPTE2IGNocm9tYV9tZT0xIHRyZWxsaXM9MCA4eDhkY3Q9MCBjcW09MCBkZWFkem9uZT0yMSwxMSBmYXN0X3Bza2lwPTEgY2hyb21hX3FwX29mZnNldD0wIHRocmVhZHM9NiBsb29rYWhlYWRfdGhyZWFkcz0xIHNsaWNlZF90aHJlYWRzPTAgbnI9MCBkZWNpbWF0ZT0xIGludGVybGFjZWQ9MCBibHVyYXlfY29tcGF0PTAgY29uc3RyYWluZWRfaW50cmE9MCBiZnJhbWVzPTMgYl9weXJhbWlkPTIgYl9hZGFwdD0xIGJfYmlhcz0wIGRpcmVjdD0xIHdlaWdodGI9MSBvcGVuX2dvcD0wIHdlaWdodHA9MSBrZXlpbnQ9MzAwIGtleWludF9taW49MzAgc2NlbmVjdXQ9NDAgaW50cmFfcmVmcmVzaD0wIHJjX2xvb2thaGVhZD0xMCByYz1jcmYgbWJ0cmVlPTEgY3JmPTIwLjAgcWNvbXA9MC42MCBxcG1pbj0wIHFwbWF4PTY5IHFwc3RlcD00IHZidl9tYXhyYXRlPTIwMDAwIHZidl9idWZzaXplPTI1MDAwIGNyZl9tYXg9MC4wIG5hbF9ocmQ9bm9uZSBmaWxsZXI9MCBpcF9yYXRpbz0xLjQwIGFxPTE6MS4wMACAAAAAOWWIhAA3//p+C7v8tDDSTjf97w55i3SbRPO4ZY+hkjD5hbkAkL3zpJ6h/LR1CAABzgB1kqqzUorlhQAAAAxBmiQYhn/+qZYADLgAAAAJQZ5CQhX/AAj5IQAD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'
5
+
6
+ var _createClass = (function () {
7
+ function defineProperties(target, props) {
8
+ for (var i = 0; i < props.length; i++) {
9
+ var descriptor = props[i]
10
+ descriptor.enumerable = descriptor.enumerable || false
11
+ descriptor.configurable = true
12
+ if ('value' in descriptor) descriptor.writable = true
13
+ Object.defineProperty(target, descriptor.key, descriptor)
14
+ }
15
+ }
16
+ return function (Constructor, protoProps, staticProps) {
17
+ if (protoProps) defineProperties(Constructor.prototype, protoProps)
18
+ if (staticProps) defineProperties(Constructor, staticProps)
19
+ return Constructor
20
+ }
21
+ })()
22
+
23
+ function _classCallCheck(instance, Constructor) {
24
+ if (!(instance instanceof Constructor)) {
25
+ throw new TypeError('Cannot call a class as a function')
26
+ }
27
+ }
28
+
29
+ // Detect iOS browsers < version 10
30
+ var oldIOS =
31
+ typeof navigator !== 'undefined' &&
32
+ parseFloat(
33
+ (
34
+ '' +
35
+ (/CPU.*OS ([0-9_]{3,4})[0-9_]{0,1}|(CPU like).*AppleWebKit.*Mobile/i.exec(
36
+ navigator.userAgent
37
+ ) || [0, ''])[1]
38
+ )
39
+ .replace('undefined', '3_2')
40
+ .replace('_', '.')
41
+ .replace('_', '')
42
+ ) < 10 &&
43
+ !window.MSStream
44
+
45
+ // Detect native Wake Lock API support
46
+ var nativeWakeLock = 'wakeLock' in navigator
47
+
48
+ var NoSleep = (function () {
49
+ var _releasedNative = true
50
+ var _nativeRequestInProgress = false
51
+
52
+ function NoSleep() {
53
+ var _this = this
54
+
55
+ _classCallCheck(this, NoSleep)
56
+
57
+ if (nativeWakeLock) {
58
+ this._wakeLock = null
59
+ var handleVisibilityChange = function handleVisibilityChange() {
60
+ if (
61
+ _this._wakeLock !== null &&
62
+ document.visibilityState === 'visible'
63
+ ) {
64
+ _this.enable()
65
+ }
66
+ }
67
+ document.addEventListener('visibilitychange', handleVisibilityChange)
68
+ document.addEventListener('fullscreenchange', handleVisibilityChange)
69
+ } else if (oldIOS) {
70
+ this.noSleepTimer = null
71
+ } else {
72
+ // Set up no sleep video element
73
+ this.noSleepVideo = document.createElement('video')
74
+
75
+ this.noSleepVideo.setAttribute('title', 'No Sleep')
76
+ this.noSleepVideo.setAttribute('playsinline', '')
77
+
78
+ this._addSourceToVideo(this.noSleepVideo, 'webm', webm)
79
+ this._addSourceToVideo(this.noSleepVideo, 'mp4', mp4)
80
+
81
+ this.noSleepVideo.addEventListener('loadedmetadata', function () {
82
+ if (_this.noSleepVideo.duration <= 1) {
83
+ // webm source
84
+ _this.noSleepVideo.setAttribute('loop', '')
85
+ } else {
86
+ // mp4 source
87
+ _this.noSleepVideo.addEventListener('timeupdate', function () {
88
+ if (_this.noSleepVideo.currentTime > 0.5) {
89
+ _this.noSleepVideo.currentTime = Math.random()
90
+ }
91
+ })
92
+ }
93
+ })
94
+ }
95
+ }
96
+
97
+ _createClass(NoSleep, [
98
+ {
99
+ key: '_addSourceToVideo',
100
+ value: function _addSourceToVideo(element, type, dataURI) {
101
+ var source = document.createElement('source')
102
+ source.src = dataURI
103
+ source.type = 'video/' + type
104
+ element.appendChild(source)
105
+ },
106
+ },
107
+ {
108
+ key: 'enable',
109
+ value: function enable() {
110
+ var _this2 = this
111
+
112
+ if (nativeWakeLock) {
113
+ _nativeRequestInProgress = true
114
+ navigator.wakeLock
115
+ .request('screen')
116
+ .then(function (wakeLock) {
117
+ _releasedNative = false
118
+ _nativeRequestInProgress = false
119
+
120
+ _this2._wakeLock = wakeLock
121
+ _this2._wakeLock.addEventListener('release', function () {
122
+ _releasedNative = true
123
+ _this2._wakeLock = null
124
+ })
125
+ })
126
+ .catch(function (err) {
127
+ _nativeRequestInProgress = false
128
+ console.error(err.name + ', ' + err.message)
129
+ })
130
+ } else if (oldIOS) {
131
+ this.disable()
132
+ console.warn(
133
+ '\n NoSleep enabled for older iOS devices. This can interrupt\n active or long-running network requests from completing successfully.\n See https://github.com/richtr/NoSleep.js/issues/15 for more details.\n '
134
+ )
135
+ this.noSleepTimer = window.setInterval(function () {
136
+ if (!document.hidden) {
137
+ window.location.href = window.location.href.split('#')[0]
138
+ window.setTimeout(window.stop, 0)
139
+ }
140
+ }, 15000)
141
+ } else {
142
+ this.noSleepVideo.play()
143
+ }
144
+ },
145
+ },
146
+ {
147
+ key: 'disable',
148
+ value: function disable() {
149
+ if (nativeWakeLock) {
150
+ if (this._wakeLock != null) {
151
+ _releasedNative = true
152
+ this._wakeLock.release()
153
+ }
154
+
155
+ this._wakeLock = null
156
+ } else if (oldIOS) {
157
+ if (this.noSleepTimer) {
158
+ console.warn(
159
+ '\n NoSleep now disabled for older iOS devices.\n '
160
+ )
161
+ window.clearInterval(this.noSleepTimer)
162
+ this.noSleepTimer = null
163
+ }
164
+ } else {
165
+ this.noSleepVideo.pause()
166
+ }
167
+ },
168
+ },
169
+ {
170
+ key: 'enabled',
171
+ value: async function enabled() {
172
+ if (nativeWakeLock) {
173
+ if (_nativeRequestInProgress == true) {
174
+ // Wait until the request is done.
175
+ while (true) {
176
+ // Wait for 42 milliseconds.
177
+ await new Promise((resolve, reject) => setTimeout(resolve, 42))
178
+ if (_nativeRequestInProgress == false) {
179
+ break
180
+ }
181
+ }
182
+ }
183
+
184
+ // todo: use WakeLockSentinel.released when that is available (https://developer.mozilla.org/en-US/docs/Web/API/WakeLockSentinel/released)
185
+ if (_releasedNative != false) {
186
+ return false
187
+ }
188
+
189
+ return true
190
+ } else if (oldIOS) {
191
+ return this.noSleepTimer != null
192
+ } else {
193
+ if (this.noSleepVideo == undefined) {
194
+ return false
195
+ }
196
+
197
+ return !this.noSleepVideo.paused
198
+ }
199
+ },
200
+ },
201
+ ])
202
+
203
+ return NoSleep
204
+ })()
205
+
206
+ var noSleep = new NoSleep()
207
+
208
+ var Wakelock = {
209
+ enabled: async function () {
210
+ try {
211
+ return noSleep.enabled()
212
+ } catch (e) {
213
+ return false
214
+ }
215
+ },
216
+ toggle: async function (enable) {
217
+ if (enable) {
218
+ noSleep.enable()
219
+ } else {
220
+ noSleep.disable()
221
+ }
222
+ },
223
+ }
224
+
225
+ if (nativeWakeLock != true) {
226
+ // The first non-native call sometimes throws an error, however,
227
+ // the error does not leak the try-catch above. Therefore, this
228
+ // is an easy fix that realiably works.
229
+ Wakelock.enabled()
230
+ }