flet-web 0.25.0__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.
- flet_web/__init__.py +9 -0
- flet_web/fastapi/README.md +146 -0
- flet_web/fastapi/__init__.py +6 -0
- flet_web/fastapi/app.py +121 -0
- flet_web/fastapi/flet_app.py +430 -0
- flet_web/fastapi/flet_app_manager.py +167 -0
- flet_web/fastapi/flet_fastapi.py +128 -0
- flet_web/fastapi/flet_oauth.py +66 -0
- flet_web/fastapi/flet_static_files.py +188 -0
- flet_web/fastapi/flet_upload.py +95 -0
- flet_web/fastapi/oauth_state.py +11 -0
- flet_web/fastapi/serve_fastapi_web_app.py +94 -0
- flet_web/patch_index.py +112 -0
- flet_web/uploads.py +54 -0
- flet_web/version.py +1 -0
- flet_web/web/.last_build_id +1 -0
- flet_web/web/assets/AssetManifest.bin +1 -0
- flet_web/web/assets/AssetManifest.bin.json +1 -0
- flet_web/web/assets/AssetManifest.json +1 -0
- flet_web/web/assets/FontManifest.json +1 -0
- flet_web/web/assets/NOTICES +37378 -0
- flet_web/web/assets/fonts/MaterialIcons-Regular.otf +0 -0
- flet_web/web/assets/packages/cupertino_icons/assets/CupertinoIcons.ttf +0 -0
- flet_web/web/assets/packages/flutter_map/lib/assets/flutter_map_logo.png +0 -0
- flet_web/web/assets/packages/media_kit/assets/web/hls1.4.10.js +2 -0
- flet_web/web/assets/packages/record_web/assets/js/record.fixwebmduration.js +507 -0
- flet_web/web/assets/packages/record_web/assets/js/record.worklet.js +400 -0
- flet_web/web/assets/packages/wakelock_plus/assets/no_sleep.js +230 -0
- flet_web/web/assets/shaders/ink_sparkle.frag +126 -0
- flet_web/web/favicon.png +0 -0
- flet_web/web/flutter.js +4 -0
- flet_web/web/flutter_bootstrap.js +31 -0
- flet_web/web/flutter_service_worker.js +214 -0
- flet_web/web/icons/apple-touch-icon-192.png +0 -0
- flet_web/web/icons/icon-192.png +0 -0
- flet_web/web/icons/icon-512.png +0 -0
- flet_web/web/icons/icon-maskable-192.png +0 -0
- flet_web/web/icons/icon-maskable-512.png +0 -0
- flet_web/web/icons/loading-animation.png +0 -0
- flet_web/web/index.html +99 -0
- flet_web/web/main.dart.js +233348 -0
- flet_web/web/manifest.json +35 -0
- flet_web/web/python-worker.js +47 -0
- flet_web/web/python.js +28 -0
- flet_web/web/version.json +1 -0
- flet_web-0.25.0.dist-info/METADATA +27 -0
- flet_web-0.25.0.dist-info/RECORD +48 -0
- flet_web-0.25.0.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
|
+
}
|