speechrecorderng 3.6.0 → 3.8.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/esm2022/lib/action/action.mjs +73 -0
- package/{esm2020 → esm2022}/lib/audio/array_audio_buffer.mjs +163 -163
- package/{esm2020 → esm2022}/lib/audio/array_audio_buffer_input_stream.mjs +85 -85
- package/{esm2020 → esm2022}/lib/audio/array_audio_buffer_random_access_stream.mjs +15 -15
- package/esm2022/lib/audio/audio_data_holder.mjs +264 -0
- package/{esm2020 → esm2022}/lib/audio/audio_display.mjs +93 -93
- package/{esm2020 → esm2022}/lib/audio/audio_player.mjs +213 -213
- package/esm2022/lib/audio/capture/capture.mjs +855 -0
- package/esm2022/lib/audio/context.mjs +79 -0
- package/{esm2020 → esm2022}/lib/audio/dsp/level_measure.mjs +515 -515
- package/{esm2020 → esm2022}/lib/audio/format.mjs +16 -16
- package/esm2022/lib/audio/impl/wavformat.mjs +6 -0
- package/{esm2020 → esm2022}/lib/audio/impl/wavreader.mjs +133 -133
- package/esm2022/lib/audio/impl/wavwriter.mjs +105 -0
- package/esm2022/lib/audio/inddb_audio_buffer.mjs +508 -0
- package/{esm2020 → esm2022}/lib/audio/io/stream.mjs +58 -58
- package/esm2022/lib/audio/net_audio_buffer.mjs +293 -0
- package/{esm2020 → esm2022}/lib/audio/persistor.mjs +80 -80
- package/{esm2020 → esm2022}/lib/audio/playback/array_audio_buffer_source_node.mjs +125 -125
- package/esm2022/lib/audio/playback/audio_source_node.mjs +18 -0
- package/esm2022/lib/audio/playback/audio_source_worklet_module_loader.mjs +167 -0
- package/{esm2020 → esm2022}/lib/audio/playback/inddb_audio_buffer_source_node.mjs +166 -166
- package/{esm2020 → esm2022}/lib/audio/playback/net_audio_buffer_source_node.mjs +217 -217
- package/esm2022/lib/audio/playback/player.mjs +402 -0
- package/esm2022/lib/audio/ui/audio_canvas_layer_comp.mjs +347 -0
- package/{esm2020 → esm2022}/lib/audio/ui/audio_display_control.mjs +65 -65
- package/{esm2020 → esm2022}/lib/audio/ui/audio_display_scroll_pane.mjs +139 -139
- package/{esm2020 → esm2022}/lib/audio/ui/audiosignal.mjs +524 -524
- package/{esm2020 → esm2022}/lib/audio/ui/common.mjs +18 -18
- package/esm2022/lib/audio/ui/container.mjs +414 -0
- package/{esm2020 → esm2022}/lib/audio/ui/livelevel.mjs +352 -352
- package/esm2022/lib/audio/ui/scroll_pane_horizontal.mjs +11 -0
- package/esm2022/lib/audio/ui/sonagram.mjs +900 -0
- package/esm2022/lib/db/inddb.mjs +120 -0
- package/esm2022/lib/dsp/utils.mjs +48 -0
- package/{esm2020 → esm2022}/lib/io/BinaryReader.mjs +84 -84
- package/esm2022/lib/io/BinaryWriter.mjs +74 -0
- package/{esm2020 → esm2022}/lib/io/stream.mjs +258 -258
- package/{esm2020 → esm2022}/lib/math/2d/geometry.mjs +27 -27
- package/esm2022/lib/math/complex.mjs +58 -0
- package/{esm2020 → esm2022}/lib/math/dft.mjs +195 -195
- package/{esm2020 → esm2022}/lib/media/utils.mjs +13 -13
- package/esm2022/lib/net/uploader.mjs +367 -0
- package/{esm2020 → esm2022}/lib/recorder_component.mjs +64 -64
- package/esm2022/lib/speechrecorder/project/project.mjs +49 -0
- package/esm2022/lib/speechrecorder/project/project.service.mjs +64 -0
- package/{esm2020 → esm2022}/lib/speechrecorder/recording.mjs +123 -123
- package/esm2022/lib/speechrecorder/recordings/basic_recording.service.mjs +218 -0
- package/esm2022/lib/speechrecorder/recordings/recordings.service.mjs +1014 -0
- package/{esm2020 → esm2022}/lib/speechrecorder/script/script.mjs +114 -114
- package/{esm2020 → esm2022}/lib/speechrecorder/script/script.service.mjs +47 -47
- package/esm2022/lib/speechrecorder/session/audiorecorder.mjs +1179 -0
- package/esm2022/lib/speechrecorder/session/basicrecorder.mjs +668 -0
- package/esm2022/lib/speechrecorder/session/controlpanel.mjs +416 -0
- package/{esm2020 → esm2022}/lib/speechrecorder/session/item.mjs +29 -29
- package/{esm2020 → esm2022}/lib/speechrecorder/session/progress.mjs +69 -69
- package/{esm2020 → esm2022}/lib/speechrecorder/session/prompting.mjs +571 -571
- package/{esm2020 → esm2022}/lib/speechrecorder/session/recorder_combi_pane.mjs +65 -65
- package/esm2022/lib/speechrecorder/session/recording_file_cache.mjs +195 -0
- package/{esm2020 → esm2022}/lib/speechrecorder/session/recording_list.mjs +103 -103
- package/{esm2020 → esm2022}/lib/speechrecorder/session/recordingfile/recording-file-meta.component.mjs +63 -63
- package/{esm2020 → esm2022}/lib/speechrecorder/session/recordingfile/recording-file-navi.component.mjs +51 -51
- package/{esm2020 → esm2022}/lib/speechrecorder/session/recordingfile/recording-file-u-i.component.mjs +104 -104
- package/{esm2020 → esm2022}/lib/speechrecorder/session/recordingfile/recording-file-view.component.mjs +381 -381
- package/{esm2020 → esm2022}/lib/speechrecorder/session/recordingfile/recording-file.mjs +67 -67
- package/esm2022/lib/speechrecorder/session/recordingfile/recordingfile-service.mjs +288 -0
- package/{esm2020 → esm2022}/lib/speechrecorder/session/session.mjs +1 -1
- package/esm2022/lib/speechrecorder/session/session.service.mjs +69 -0
- package/{esm2020 → esm2022}/lib/speechrecorder/session/session_finished_dialog.mjs +29 -29
- package/esm2022/lib/speechrecorder/session/sessionmanager.mjs +1386 -0
- package/{esm2020 → esm2022}/lib/speechrecorder/session/warning_bar.mjs +28 -28
- package/{esm2020 → esm2022}/lib/speechrecorder/spruploader.mjs +22 -22
- package/{esm2020 → esm2022}/lib/speechrecorder/startstopsignal/startstopsignal.mjs +1 -1
- package/esm2022/lib/speechrecorder/startstopsignal/ui/simpletrafficlight.mjs +57 -0
- package/{esm2020 → esm2022}/lib/speechrecorderng.component.mjs +388 -388
- package/{esm2020 → esm2022}/lib/speechrecorderng.module.mjs +100 -100
- package/{esm2020 → esm2022}/lib/spr.config.mjs +26 -26
- package/{esm2020 → esm2022}/lib/spr.module.version.mjs +2 -2
- package/{esm2020 → esm2022}/lib/ui/canvas_layer_comp.mjs +38 -38
- package/{esm2020 → esm2022}/lib/ui/message_dialog.mjs +30 -30
- package/esm2022/lib/ui/recordingitem_display.mjs +253 -0
- package/{esm2020 → esm2022}/lib/ui/responsive_component.mjs +24 -24
- package/{esm2020 → esm2022}/lib/utils/scrollIntoViewToBottom.mjs +23 -23
- package/esm2022/lib/utils/ua-parser.mjs +190 -0
- package/esm2022/lib/utils/utils.mjs +105 -0
- package/esm2022/lib/utils/wake_lock.mjs +114 -0
- package/{esm2020 → esm2022}/lib/utils/wake_lock_media.mjs +1 -1
- package/{esm2020 → esm2022}/public-api.mjs +33 -33
- package/{esm2020 → esm2022}/speechrecorderng.mjs +4 -4
- package/{fesm2020 → fesm2022}/speechrecorderng.mjs +16518 -16454
- package/fesm2022/speechrecorderng.mjs.map +1 -0
- package/index.d.ts +5 -5
- package/lib/action/action.d.ts +27 -27
- package/lib/audio/array_audio_buffer.d.ts +31 -31
- package/lib/audio/array_audio_buffer_input_stream.d.ts +14 -14
- package/lib/audio/array_audio_buffer_random_access_stream.d.ts +9 -9
- package/lib/audio/audio_data_holder.d.ts +84 -84
- package/lib/audio/audio_display.d.ts +36 -36
- package/lib/audio/audio_player.d.ts +47 -47
- package/lib/audio/capture/capture.d.ts +67 -67
- package/lib/audio/context.d.ts +6 -6
- package/lib/audio/dsp/level_measure.d.ts +60 -60
- package/lib/audio/format.d.ts +11 -11
- package/lib/audio/impl/wavformat.d.ts +5 -5
- package/lib/audio/impl/wavreader.d.ts +16 -16
- package/lib/audio/impl/wavwriter.d.ts +13 -13
- package/lib/audio/inddb_audio_buffer.d.ts +68 -68
- package/lib/audio/io/stream.d.ts +28 -28
- package/lib/audio/net_audio_buffer.d.ts +57 -57
- package/lib/audio/persistor.d.ts +29 -29
- package/lib/audio/playback/array_audio_buffer_source_node.d.ts +18 -18
- package/lib/audio/playback/audio_source_node.d.ts +10 -10
- package/lib/audio/playback/audio_source_worklet_module_loader.d.ts +4 -4
- package/lib/audio/playback/inddb_audio_buffer_source_node.d.ts +21 -21
- package/lib/audio/playback/net_audio_buffer_source_node.d.ts +27 -27
- package/lib/audio/playback/player.d.ts +65 -65
- package/lib/audio/ui/audio_canvas_layer_comp.d.ts +68 -68
- package/lib/audio/ui/audio_display_control.d.ts +25 -25
- package/lib/audio/ui/audio_display_scroll_pane.d.ts +26 -26
- package/lib/audio/ui/audiosignal.d.ts +30 -30
- package/lib/audio/ui/common.d.ts +11 -11
- package/lib/audio/ui/container.d.ts +63 -63
- package/lib/audio/ui/livelevel.d.ts +60 -60
- package/lib/audio/ui/scroll_pane_horizontal.d.ts +5 -5
- package/lib/audio/ui/sonagram.d.ts +37 -37
- package/lib/db/inddb.d.ts +21 -21
- package/lib/dsp/utils.d.ts +19 -19
- package/lib/io/BinaryReader.d.ts +18 -18
- package/lib/io/BinaryWriter.d.ts +15 -15
- package/lib/io/stream.d.ts +59 -59
- package/lib/math/2d/geometry.d.ts +18 -18
- package/lib/math/complex.d.ts +17 -17
- package/lib/math/dft.d.ts +22 -22
- package/lib/media/utils.d.ts +3 -3
- package/lib/net/uploader.d.ts +81 -81
- package/lib/recorder_component.d.ts +16 -16
- package/lib/speechrecorder/project/project.d.ts +59 -59
- package/lib/speechrecorder/project/project.service.d.ts +21 -21
- package/lib/speechrecorder/recording.d.ts +51 -51
- package/lib/speechrecorder/recordings/basic_recording.service.d.ts +27 -27
- package/lib/speechrecorder/recordings/recordings.service.d.ts +48 -48
- package/lib/speechrecorder/script/script.d.ts +80 -79
- package/lib/speechrecorder/script/script.service.d.ts +16 -16
- package/lib/speechrecorder/session/audiorecorder.d.ts +122 -122
- package/lib/speechrecorder/session/basicrecorder.d.ts +139 -139
- package/lib/speechrecorder/session/controlpanel.d.ts +109 -107
- package/lib/speechrecorder/session/item.d.ts +12 -12
- package/lib/speechrecorder/session/progress.d.ts +17 -17
- package/lib/speechrecorder/session/prompting.d.ts +121 -121
- package/lib/speechrecorder/session/recorder_combi_pane.d.ts +32 -32
- package/lib/speechrecorder/session/recording_file_cache.d.ts +33 -33
- package/lib/speechrecorder/session/recording_list.d.ts +24 -24
- package/lib/speechrecorder/session/recordingfile/recording-file-meta.component.d.ts +15 -15
- package/lib/speechrecorder/session/recordingfile/recording-file-navi.component.d.ts +20 -20
- package/lib/speechrecorder/session/recordingfile/recording-file-u-i.component.d.ts +31 -31
- package/lib/speechrecorder/session/recordingfile/recording-file-view.component.d.ts +55 -55
- package/lib/speechrecorder/session/recordingfile/recording-file.d.ts +7 -7
- package/lib/speechrecorder/session/recordingfile/recordingfile-service.d.ts +24 -24
- package/lib/speechrecorder/session/session.d.ts +15 -15
- package/lib/speechrecorder/session/session.service.d.ts +20 -20
- package/lib/speechrecorder/session/session_finished_dialog.d.ts +10 -10
- package/lib/speechrecorder/session/sessionmanager.d.ts +129 -123
- package/lib/speechrecorder/session/warning_bar.d.ts +8 -8
- package/lib/speechrecorder/spruploader.d.ts +11 -11
- package/lib/speechrecorder/startstopsignal/startstopsignal.d.ts +10 -10
- package/lib/speechrecorder/startstopsignal/ui/simpletrafficlight.d.ts +11 -11
- package/lib/speechrecorderng.component.d.ts +61 -61
- package/lib/speechrecorderng.module.d.ts +56 -56
- package/lib/spr.config.d.ts +17 -17
- package/lib/spr.module.version.d.ts +1 -1
- package/lib/ui/canvas_layer_comp.d.ts +13 -13
- package/lib/ui/message_dialog.d.ts +10 -10
- package/lib/ui/recordingitem_display.d.ts +84 -84
- package/lib/ui/responsive_component.d.ts +9 -9
- package/lib/utils/scrollIntoViewToBottom.d.ts +9 -9
- package/lib/utils/ua-parser.d.ts +43 -43
- package/lib/utils/utils.d.ts +19 -19
- package/lib/utils/wake_lock.d.ts +23 -23
- package/lib/utils/wake_lock_media.d.ts +1 -1
- package/package.json +17 -23
- package/public-api.d.ts +33 -33
- package/esm2020/lib/action/action.mjs +0 -73
- package/esm2020/lib/audio/audio_data_holder.mjs +0 -264
- package/esm2020/lib/audio/capture/capture.mjs +0 -855
- package/esm2020/lib/audio/context.mjs +0 -79
- package/esm2020/lib/audio/impl/wavformat.mjs +0 -6
- package/esm2020/lib/audio/impl/wavwriter.mjs +0 -105
- package/esm2020/lib/audio/inddb_audio_buffer.mjs +0 -508
- package/esm2020/lib/audio/net_audio_buffer.mjs +0 -293
- package/esm2020/lib/audio/playback/audio_source_node.mjs +0 -18
- package/esm2020/lib/audio/playback/audio_source_worklet_module_loader.mjs +0 -167
- package/esm2020/lib/audio/playback/player.mjs +0 -402
- package/esm2020/lib/audio/ui/audio_canvas_layer_comp.mjs +0 -347
- package/esm2020/lib/audio/ui/container.mjs +0 -414
- package/esm2020/lib/audio/ui/scroll_pane_horizontal.mjs +0 -11
- package/esm2020/lib/audio/ui/sonagram.mjs +0 -900
- package/esm2020/lib/db/inddb.mjs +0 -120
- package/esm2020/lib/dsp/utils.mjs +0 -48
- package/esm2020/lib/io/BinaryWriter.mjs +0 -74
- package/esm2020/lib/math/complex.mjs +0 -58
- package/esm2020/lib/net/uploader.mjs +0 -367
- package/esm2020/lib/speechrecorder/project/project.mjs +0 -49
- package/esm2020/lib/speechrecorder/project/project.service.mjs +0 -64
- package/esm2020/lib/speechrecorder/recordings/basic_recording.service.mjs +0 -216
- package/esm2020/lib/speechrecorder/recordings/recordings.service.mjs +0 -1014
- package/esm2020/lib/speechrecorder/session/audiorecorder.mjs +0 -1179
- package/esm2020/lib/speechrecorder/session/basicrecorder.mjs +0 -666
- package/esm2020/lib/speechrecorder/session/controlpanel.mjs +0 -409
- package/esm2020/lib/speechrecorder/session/recording_file_cache.mjs +0 -195
- package/esm2020/lib/speechrecorder/session/recordingfile/recordingfile-service.mjs +0 -288
- package/esm2020/lib/speechrecorder/session/session.service.mjs +0 -69
- package/esm2020/lib/speechrecorder/session/sessionmanager.mjs +0 -1333
- package/esm2020/lib/speechrecorder/startstopsignal/ui/simpletrafficlight.mjs +0 -57
- package/esm2020/lib/ui/recordingitem_display.mjs +0 -253
- package/esm2020/lib/utils/ua-parser.mjs +0 -190
- package/esm2020/lib/utils/utils.mjs +0 -105
- package/esm2020/lib/utils/wake_lock.mjs +0 -114
- package/fesm2015/speechrecorderng.mjs +0 -17708
- package/fesm2015/speechrecorderng.mjs.map +0 -1
- package/fesm2020/speechrecorderng.mjs.map +0 -1
|
@@ -0,0 +1,367 @@
|
|
|
1
|
+
import { timeout } from 'rxjs/operators';
|
|
2
|
+
// state of an upload
|
|
3
|
+
export var UploadStatus;
|
|
4
|
+
(function (UploadStatus) {
|
|
5
|
+
UploadStatus[UploadStatus["IDLE"] = 1] = "IDLE";
|
|
6
|
+
UploadStatus[UploadStatus["UPLOADING"] = 2] = "UPLOADING";
|
|
7
|
+
UploadStatus[UploadStatus["ABORT"] = 3] = "ABORT";
|
|
8
|
+
UploadStatus[UploadStatus["DONE"] = 0] = "DONE";
|
|
9
|
+
UploadStatus[UploadStatus["ERR"] = -1] = "ERR";
|
|
10
|
+
})(UploadStatus || (UploadStatus = {}));
|
|
11
|
+
// state of the uploader
|
|
12
|
+
// TRY_UPLOADING is uploading state after an error (for example if disconnected from server)
|
|
13
|
+
export var UploaderStatus;
|
|
14
|
+
(function (UploaderStatus) {
|
|
15
|
+
UploaderStatus[UploaderStatus["DONE"] = 0] = "DONE";
|
|
16
|
+
UploaderStatus[UploaderStatus["UPLOADING"] = 1] = "UPLOADING";
|
|
17
|
+
UploaderStatus[UploaderStatus["TRY_UPLOADING"] = 2] = "TRY_UPLOADING";
|
|
18
|
+
UploaderStatus[UploaderStatus["NEXT"] = 3] = "NEXT";
|
|
19
|
+
UploaderStatus[UploaderStatus["ERR"] = -1] = "ERR";
|
|
20
|
+
})(UploaderStatus || (UploaderStatus = {}));
|
|
21
|
+
export class UploaderStatusChangeEvent {
|
|
22
|
+
constructor(sizeQueued, sizeDone, status) {
|
|
23
|
+
this._sizeQueued = sizeQueued;
|
|
24
|
+
this._sizeDone = sizeDone;
|
|
25
|
+
this._status = status;
|
|
26
|
+
}
|
|
27
|
+
get sizeQueued() {
|
|
28
|
+
return this._sizeQueued;
|
|
29
|
+
}
|
|
30
|
+
get sizeDone() {
|
|
31
|
+
return this._sizeDone;
|
|
32
|
+
}
|
|
33
|
+
sizeInQueue() {
|
|
34
|
+
return this._sizeQueued - this._sizeDone;
|
|
35
|
+
}
|
|
36
|
+
get status() {
|
|
37
|
+
return this._status;
|
|
38
|
+
}
|
|
39
|
+
uploadDone() {
|
|
40
|
+
return (this._sizeDone >= this._sizeQueued);
|
|
41
|
+
}
|
|
42
|
+
percentDone() {
|
|
43
|
+
if (this._sizeQueued == 0) {
|
|
44
|
+
// no data queued, we are "done"
|
|
45
|
+
return 100;
|
|
46
|
+
}
|
|
47
|
+
let percent = Math.floor(this._sizeDone * 100 / this._sizeQueued);
|
|
48
|
+
//console.log("Upload status: queued: "+this._sizeQueued+", done: "+this._sizeDone+", "+percent+"%")
|
|
49
|
+
return percent;
|
|
50
|
+
}
|
|
51
|
+
}
|
|
52
|
+
export class Upload {
|
|
53
|
+
get serverPersistable() {
|
|
54
|
+
return this._serverPersistable;
|
|
55
|
+
}
|
|
56
|
+
constructor(blob, url, _serverPersistable = null) {
|
|
57
|
+
this._serverPersistable = _serverPersistable;
|
|
58
|
+
this.onDone = null;
|
|
59
|
+
this.toString = () => {
|
|
60
|
+
let s = `Upload: Status: ${this.status}, URL: ${this._url}`;
|
|
61
|
+
if (this._data instanceof Blob) {
|
|
62
|
+
s = s + `, Size: ${this._data.size}`;
|
|
63
|
+
}
|
|
64
|
+
else if (this._data instanceof FormData) {
|
|
65
|
+
// TODO (iterate through parts ??)
|
|
66
|
+
}
|
|
67
|
+
return s;
|
|
68
|
+
};
|
|
69
|
+
this._data = blob;
|
|
70
|
+
this._url = url;
|
|
71
|
+
this.status = UploadStatus.IDLE;
|
|
72
|
+
}
|
|
73
|
+
get url() {
|
|
74
|
+
return this._url;
|
|
75
|
+
}
|
|
76
|
+
get data() {
|
|
77
|
+
return this._data;
|
|
78
|
+
}
|
|
79
|
+
done() {
|
|
80
|
+
this.status = UploadStatus.DONE;
|
|
81
|
+
//console.debug("Single upload done.");
|
|
82
|
+
if (this._serverPersistable) {
|
|
83
|
+
this._serverPersistable.serverPersisted = true;
|
|
84
|
+
//console.debug("Single upload set server persisted: "+this.serverPersistable);
|
|
85
|
+
}
|
|
86
|
+
else {
|
|
87
|
+
//console.debug("Server persistable not set.");
|
|
88
|
+
}
|
|
89
|
+
if (this.onDone) {
|
|
90
|
+
this.onDone(this);
|
|
91
|
+
}
|
|
92
|
+
}
|
|
93
|
+
}
|
|
94
|
+
export class UploadHolder {
|
|
95
|
+
constructor() {
|
|
96
|
+
this.onUploadSet = null;
|
|
97
|
+
this._upload = null;
|
|
98
|
+
}
|
|
99
|
+
get upload() {
|
|
100
|
+
return this._upload;
|
|
101
|
+
}
|
|
102
|
+
set upload(value) {
|
|
103
|
+
this._upload = value;
|
|
104
|
+
if (this._upload && this.onUploadSet) {
|
|
105
|
+
this.onUploadSet(this._upload);
|
|
106
|
+
}
|
|
107
|
+
}
|
|
108
|
+
}
|
|
109
|
+
export class UploadSet {
|
|
110
|
+
constructor() {
|
|
111
|
+
this.uploads = new Array();
|
|
112
|
+
this._complete = false;
|
|
113
|
+
this._onDone = null;
|
|
114
|
+
}
|
|
115
|
+
add(upload) {
|
|
116
|
+
if (this._complete) {
|
|
117
|
+
throw new Error('Cannot add upload to upload set. Upload set already complete.');
|
|
118
|
+
}
|
|
119
|
+
if (upload instanceof UploadHolder) {
|
|
120
|
+
upload.onUploadSet = (upl) => {
|
|
121
|
+
upl.onDone = () => {
|
|
122
|
+
this.checkUploadStates();
|
|
123
|
+
};
|
|
124
|
+
this.checkUploadStates();
|
|
125
|
+
};
|
|
126
|
+
}
|
|
127
|
+
this.uploads.push(upload);
|
|
128
|
+
}
|
|
129
|
+
complete() {
|
|
130
|
+
// Mark set as complete
|
|
131
|
+
this._complete = true;
|
|
132
|
+
// add listeners to each upload
|
|
133
|
+
for (let upl of this.uploads) {
|
|
134
|
+
if (upl instanceof Upload) {
|
|
135
|
+
upl.onDone = (upl) => {
|
|
136
|
+
this.checkUploadStates();
|
|
137
|
+
};
|
|
138
|
+
}
|
|
139
|
+
else if (upl instanceof UploadHolder) {
|
|
140
|
+
if (upl.upload) {
|
|
141
|
+
upl.upload.onDone = (upl) => {
|
|
142
|
+
this.checkUploadStates();
|
|
143
|
+
};
|
|
144
|
+
}
|
|
145
|
+
}
|
|
146
|
+
}
|
|
147
|
+
// check immediately if already done
|
|
148
|
+
this.checkUploadStates();
|
|
149
|
+
}
|
|
150
|
+
set onDone(value) {
|
|
151
|
+
this._onDone = value;
|
|
152
|
+
this.checkUploadStates();
|
|
153
|
+
}
|
|
154
|
+
checkUploadStates() {
|
|
155
|
+
//console.debug("Check upload state...")
|
|
156
|
+
if (this._complete) {
|
|
157
|
+
if (this._onDone) {
|
|
158
|
+
for (let upl of this.uploads) {
|
|
159
|
+
if (upl instanceof Upload) {
|
|
160
|
+
if (UploadStatus.DONE !== upl.status) {
|
|
161
|
+
// At least this upload is not yet done
|
|
162
|
+
// Do nothing
|
|
163
|
+
//console.debug("Check upload state: Upload not done.")
|
|
164
|
+
return;
|
|
165
|
+
}
|
|
166
|
+
}
|
|
167
|
+
else if (upl instanceof UploadHolder) {
|
|
168
|
+
if (upl.upload) {
|
|
169
|
+
if (UploadStatus.DONE !== upl.upload.status) {
|
|
170
|
+
// At least this upload is not yet done
|
|
171
|
+
// Do nothing
|
|
172
|
+
//console.debug("Check upload state: Upload (holder) not done.")
|
|
173
|
+
return;
|
|
174
|
+
}
|
|
175
|
+
}
|
|
176
|
+
else {
|
|
177
|
+
// The actual upload is not yet set
|
|
178
|
+
//console.debug("Check upload state: Upload (holder): upload not yet set.")
|
|
179
|
+
return;
|
|
180
|
+
}
|
|
181
|
+
}
|
|
182
|
+
}
|
|
183
|
+
// set is complete and all upload parts are done, call done callback
|
|
184
|
+
//console.debug("Check upload state: All done.")
|
|
185
|
+
this._onDone(this);
|
|
186
|
+
}
|
|
187
|
+
}
|
|
188
|
+
}
|
|
189
|
+
}
|
|
190
|
+
export class Uploader {
|
|
191
|
+
constructor(http, withCredentials = false) {
|
|
192
|
+
this.http = http;
|
|
193
|
+
this.withCredentials = withCredentials;
|
|
194
|
+
this.POST_MIN_TIMEOUT = 120000; // 2min plus ...
|
|
195
|
+
this.POST_TIMEOUT_PER_KB = 1000; // ... 1s per kB
|
|
196
|
+
this.RETRY_DELAY = 30000; // retry every 30s
|
|
197
|
+
this.DEBUG_DELAY = 0;
|
|
198
|
+
//DEBUG_DELAY:number=0;
|
|
199
|
+
this.status = UploaderStatus.DONE;
|
|
200
|
+
this.listener = null;
|
|
201
|
+
this._sizeQueued = 0;
|
|
202
|
+
this._sizeDone = 0;
|
|
203
|
+
this.retryTimerRunning = false;
|
|
204
|
+
this.retryTimerId = null;
|
|
205
|
+
this.te = new TextEncoder();
|
|
206
|
+
this.que = new Array();
|
|
207
|
+
}
|
|
208
|
+
dataSize(dt) {
|
|
209
|
+
let si = 0;
|
|
210
|
+
if (dt instanceof Blob) {
|
|
211
|
+
si = dt.size;
|
|
212
|
+
}
|
|
213
|
+
else if (dt instanceof FormData) {
|
|
214
|
+
dt.forEach((v, k) => {
|
|
215
|
+
if (v instanceof File) {
|
|
216
|
+
si += v.size;
|
|
217
|
+
}
|
|
218
|
+
else if (typeof v === 'string') {
|
|
219
|
+
// encode to UTF-8 to get upload size
|
|
220
|
+
si += this.te.encode().length;
|
|
221
|
+
}
|
|
222
|
+
});
|
|
223
|
+
}
|
|
224
|
+
return si;
|
|
225
|
+
}
|
|
226
|
+
uploadDone(ul) {
|
|
227
|
+
ul.done();
|
|
228
|
+
// remove upload from queue
|
|
229
|
+
for (let i = 0; i < this.que.length; i++) {
|
|
230
|
+
if (this.que[i] === ul) {
|
|
231
|
+
// found, remove
|
|
232
|
+
this.que.splice(i, 1);
|
|
233
|
+
let ulSize = this.dataSize(ul.data);
|
|
234
|
+
this._sizeDone += ulSize;
|
|
235
|
+
break;
|
|
236
|
+
}
|
|
237
|
+
}
|
|
238
|
+
// set to done for now...
|
|
239
|
+
this.status = UploaderStatus.NEXT;
|
|
240
|
+
// continue
|
|
241
|
+
this.process();
|
|
242
|
+
}
|
|
243
|
+
startUpload(ul) {
|
|
244
|
+
ul.status = UploadStatus.UPLOADING;
|
|
245
|
+
if (UploaderStatus.ERR === this.status) {
|
|
246
|
+
this.status = UploaderStatus.TRY_UPLOADING;
|
|
247
|
+
}
|
|
248
|
+
else {
|
|
249
|
+
this.status = UploaderStatus.UPLOADING;
|
|
250
|
+
}
|
|
251
|
+
let dSize = this.dataSize(ul.data);
|
|
252
|
+
let timeoutForDataSize = dSize * this.POST_TIMEOUT_PER_KB / 1000;
|
|
253
|
+
let timeoVal = Math.round(this.POST_MIN_TIMEOUT + timeoutForDataSize);
|
|
254
|
+
// pipe(timeout()) is not the same as xhr.timeout
|
|
255
|
+
let uploadedUpload = null;
|
|
256
|
+
//console.debug("Post upload: "+ul)
|
|
257
|
+
this.http.post(ul.url, ul.data, { withCredentials: this.withCredentials }).pipe(timeout(timeoVal)).subscribe({
|
|
258
|
+
next: (data) => {
|
|
259
|
+
uploadedUpload = ul;
|
|
260
|
+
//console.debug('Next method called for upload: '+uploadedUpload)
|
|
261
|
+
},
|
|
262
|
+
error: (err) => {
|
|
263
|
+
if (err.error instanceof Error) {
|
|
264
|
+
// A client-side or network error occurred. Handle it accordingly.
|
|
265
|
+
console.error('Upload error occurred:', err.error.message);
|
|
266
|
+
}
|
|
267
|
+
else {
|
|
268
|
+
// The backend returned an unsuccessful response code.
|
|
269
|
+
// The response body may contain clues as to what went wrong,
|
|
270
|
+
console.error(`Upload error: Server returned code ${err.status}`);
|
|
271
|
+
}
|
|
272
|
+
this.processError(ul);
|
|
273
|
+
}, complete: () => {
|
|
274
|
+
//console.debug('Upload complete method called')
|
|
275
|
+
if (uploadedUpload) {
|
|
276
|
+
if (this.DEBUG_DELAY > 0) {
|
|
277
|
+
window.setTimeout(() => {
|
|
278
|
+
this.uploadDone(ul);
|
|
279
|
+
}, this.DEBUG_DELAY);
|
|
280
|
+
}
|
|
281
|
+
else {
|
|
282
|
+
this.uploadDone(uploadedUpload);
|
|
283
|
+
}
|
|
284
|
+
}
|
|
285
|
+
else {
|
|
286
|
+
console.error('Upload post complete, but upload not set in next method!');
|
|
287
|
+
}
|
|
288
|
+
}
|
|
289
|
+
});
|
|
290
|
+
}
|
|
291
|
+
processError(ul) {
|
|
292
|
+
//console.debug("Process upload error...")
|
|
293
|
+
ul.status = UploadStatus.ERR;
|
|
294
|
+
this.status = UploaderStatus.ERR;
|
|
295
|
+
let ue = new UploaderStatusChangeEvent(this._sizeQueued, this._sizeDone, this.status);
|
|
296
|
+
if (this.listener) {
|
|
297
|
+
this.listener(ue);
|
|
298
|
+
}
|
|
299
|
+
// set retry timer
|
|
300
|
+
this.retryTimerId = window.setTimeout(() => {
|
|
301
|
+
this.retryTimerRunning = false;
|
|
302
|
+
//console.debug("Upload retry timer expired. Continue processing...")
|
|
303
|
+
this.process();
|
|
304
|
+
}, this.RETRY_DELAY);
|
|
305
|
+
this.retryTimerRunning = true;
|
|
306
|
+
//console.debug("Started upload retry timer "+this.RETRY_DELAY+"ms ...")
|
|
307
|
+
}
|
|
308
|
+
process() {
|
|
309
|
+
// clear retry timer if set
|
|
310
|
+
if (this.retryTimerRunning) {
|
|
311
|
+
if (this.retryTimerId) {
|
|
312
|
+
window.clearTimeout(this.retryTimerId);
|
|
313
|
+
}
|
|
314
|
+
this.retryTimerRunning = false;
|
|
315
|
+
//console.debug("Cleared retry timer.")
|
|
316
|
+
}
|
|
317
|
+
let pul = null;
|
|
318
|
+
//console.debug("Uploader status: "+this.status)
|
|
319
|
+
let s = this.que.length;
|
|
320
|
+
//console.debug(s+" uploads are in the queue.")
|
|
321
|
+
if (s > 0 && UploaderStatus.UPLOADING != this.status && UploaderStatus.TRY_UPLOADING != this.status) {
|
|
322
|
+
for (let i = 0; i < s; i++) {
|
|
323
|
+
let ul = this.que[i];
|
|
324
|
+
//console.log("Upload "+ul+" status:"+ul.status)
|
|
325
|
+
if (ul.status === UploadStatus.IDLE) {
|
|
326
|
+
//console.log("Upload "+ul+" startUpload")
|
|
327
|
+
this.startUpload(ul);
|
|
328
|
+
pul = ul;
|
|
329
|
+
break;
|
|
330
|
+
}
|
|
331
|
+
}
|
|
332
|
+
if (!pul) {
|
|
333
|
+
//console.log("Check ERR uploads...")
|
|
334
|
+
// now failed uploads
|
|
335
|
+
//console.debug("No regular upload found. Looking for error state uploads.")
|
|
336
|
+
for (let i = 0; i < s; i++) {
|
|
337
|
+
let ul = this.que[i];
|
|
338
|
+
//console.log("Upload "+ul+" status:"+ul.status)
|
|
339
|
+
if (ul.status === UploadStatus.ERR) {
|
|
340
|
+
//console.log("Upload (ERR) "+ul+" startUpload")
|
|
341
|
+
//console.debug("Start error state upload "+ul)
|
|
342
|
+
this.startUpload(ul);
|
|
343
|
+
pul = ul;
|
|
344
|
+
break;
|
|
345
|
+
}
|
|
346
|
+
}
|
|
347
|
+
}
|
|
348
|
+
}
|
|
349
|
+
if (s == 0) {
|
|
350
|
+
//console.debug("Upload done.")
|
|
351
|
+
this.status = UploaderStatus.DONE;
|
|
352
|
+
}
|
|
353
|
+
let ue = new UploaderStatusChangeEvent(this._sizeQueued, this._sizeDone, this.status);
|
|
354
|
+
if (this.listener) {
|
|
355
|
+
this.listener(ue);
|
|
356
|
+
}
|
|
357
|
+
}
|
|
358
|
+
queueUpload(ul) {
|
|
359
|
+
if (ul) {
|
|
360
|
+
let ulSize = this.dataSize(ul.data);
|
|
361
|
+
this.que.push(ul);
|
|
362
|
+
this._sizeQueued += ulSize;
|
|
363
|
+
this.process();
|
|
364
|
+
}
|
|
365
|
+
}
|
|
366
|
+
}
|
|
367
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidXBsb2FkZXIuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy9zcGVlY2hyZWNvcmRlcm5nL3NyYy9saWIvbmV0L3VwbG9hZGVyLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUVJLE9BQU8sRUFBRSxPQUFPLEVBQUUsTUFBTSxnQkFBZ0IsQ0FBQTtBQUV4QyxxQkFBcUI7QUFDckIsTUFBTSxDQUFOLElBQVksWUFBc0U7QUFBbEYsV0FBWSxZQUFZO0lBQUUsK0NBQVEsQ0FBQTtJQUFFLHlEQUFhLENBQUE7SUFBRyxpREFBUyxDQUFBO0lBQUUsK0NBQVEsQ0FBQTtJQUFFLDhDQUFRLENBQUE7QUFBQSxDQUFDLEVBQXRFLFlBQVksS0FBWixZQUFZLFFBQTBEO0FBRWxGLHdCQUF3QjtBQUN4Qiw0RkFBNEY7QUFDNUYsTUFBTSxDQUFOLElBQVksY0FBK0U7QUFBM0YsV0FBWSxjQUFjO0lBQUcsbURBQVEsQ0FBQTtJQUFFLDZEQUFhLENBQUE7SUFBRSxxRUFBaUIsQ0FBQTtJQUFDLG1EQUFRLENBQUE7SUFBRSxrREFBUSxDQUFBO0FBQUEsQ0FBQyxFQUEvRSxjQUFjLEtBQWQsY0FBYyxRQUFpRTtBQUUzRixNQUFNLE9BQU8seUJBQXlCO0lBTWxDLFlBQVksVUFBa0IsRUFBRSxRQUFnQixFQUFFLE1BQXNCO1FBQ3BFLElBQUksQ0FBQyxXQUFXLEdBQUcsVUFBVSxDQUFDO1FBQzlCLElBQUksQ0FBQyxTQUFTLEdBQUcsUUFBUSxDQUFDO1FBQzFCLElBQUksQ0FBQyxPQUFPLEdBQUcsTUFBTSxDQUFDO0lBQzFCLENBQUM7SUFFRCxJQUFJLFVBQVU7UUFDVixPQUFPLElBQUksQ0FBQyxXQUFXLENBQUM7SUFDNUIsQ0FBQztJQUVELElBQUksUUFBUTtRQUNSLE9BQU8sSUFBSSxDQUFDLFNBQVMsQ0FBQztJQUMxQixDQUFDO0lBRUQsV0FBVztRQUNULE9BQU8sSUFBSSxDQUFDLFdBQVcsR0FBQyxJQUFJLENBQUMsU0FB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QUNGO1NBQ0Y7UUFDRCxJQUFHLENBQUMsSUFBRSxDQUFDLEVBQUM7WUFDTiwrQkFBK0I7WUFDL0IsSUFBSSxDQUFDLE1BQU0sR0FBQyxjQUFjLENBQUMsSUFBSSxDQUFBO1NBQ2hDO1FBQ0QsSUFBSSxFQUFFLEdBQUcsSUFBSSx5QkFBeUIsQ0FBQyxJQUFJLENBQUMsV0FBVyxFQUFFLElBQUksQ0FBQyxTQUFTLEVBQUUsSUFBSSxDQUFDLE1BQU0sQ0FBQyxDQUFDO1FBQ3RGLElBQUksSUFBSSxDQUFDLFFBQVEsRUFBRTtZQUNqQixJQUFJLENBQUMsUUFBUSxDQUFDLEVBQUUsQ0FBQyxDQUFDO1NBQ25CO0lBQ0gsQ0FBQztJQUVDLFdBQVcsQ0FBQyxFQUFVO1FBQ2xCLElBQUksRUFBRSxFQUFFO1lBQ0osSUFBSSxNQUFNLEdBQUcsSUFBSSxDQUFDLFFBQVEsQ0FBQyxFQUFFLENBQUMsSUFBSSxDQUFDLENBQUM7WUFDcEMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxJQUFJLENBQUMsRUFBRSxDQUFDLENBQUM7WUFDbEIsSUFBSSxDQUFDLFdBQVcsSUFBSSxNQUFNLENBQUM7WUFDM0IsSUFBSSxDQUFDLE9BQU8sRUFBRSxDQUFDO1NBQ2xCO0lBQ0wsQ0FBQztDQUNKIiwic291cmNlc0NvbnRlbnQiOlsiXHJcbiAgICBpbXBvcnQge0h0dHBDbGllbnQsIEh0dHBFcnJvclJlc3BvbnNlfSBmcm9tIFwiQGFuZ3VsYXIvY29tbW9uL2h0dHBcIjtcclxuICAgIGltcG9ydCB7IHRpbWVvdXQgfSBmcm9tICdyeGpzL29wZXJhdG9ycydcclxuXHJcbiAgICAvLyBzdGF0ZSBvZiBhbiB1cGxvYWRcclxuICAgIGV4cG9ydCBlbnVtIFVwbG9hZFN0YXR1cyB7SURMRSA9IDEsIFVQTE9BRElORyA9IDIsICBBQk9SVCA9IDMsIERPTkUgPSAwLCBFUlIgPSAtMX1cclxuXHJcbiAgICAvLyBzdGF0ZSBvZiB0aGUgdXBsb2FkZXJcclxuICAgIC8vIFRSWV9VUExPQURJTkcgaXMgdXBsb2FkaW5nIHN0YXRlIGFmdGVyIGFuIGVycm9yIChmb3IgZXhhbXBsZSBpZiBkaXNjb25uZWN0ZWQgZnJvbSBzZXJ2ZXIpXHJcbiAgICBleHBvcnQgZW51bSBVcGxvYWRlclN0YXR1cyB7IERPTkUgPSAwLCBVUExPQURJTkcgPSAxLCBUUllfVVBMT0FESU5HID0gMixORVhUID0gMywgRVJSID0gLTF9XHJcblxyXG4gICAgZXhwb3J0IGNsYXNzIFVwbG9hZGVyU3RhdHVzQ2hhbmdlRXZlbnQge1xyXG4gICAgICAgIHByaXZhdGUgcmVhZG9ubHkgX3NpemVRdWV1ZWQ6bnVtYmVyO1xyXG4gICAgICAgIHByaXZhdGUgcmVhZG9ubHkgX3NpemVEb25lOm51bWJlcjtcclxuICAgICAgICBwcml2YXRlIHJlYWRvbmx5IF9zdGF0dXM6IFVwbG9hZGVyU3RhdHVzO1xyXG5cclxuXHJcbiAgICAgICAgY29uc3RydWN0b3Ioc2l6ZVF1ZXVlZDogbnVtYmVyLCBzaXplRG9uZTogbnVtYmVyLCBzdGF0dXM6IFVwbG9hZGVyU3RhdHVzKSB7XHJcbiAgICAgICAgICAgIHRoaXMuX3NpemVRdWV1ZWQgPSBzaXplUXVldWVkO1xyXG4gICAgICAgICAgICB0aGlzLl9zaXplRG9uZSA9IHNpemVEb25lO1xyXG4gICAgICAgICAgICB0aGlzLl9zdGF0dXMgPSBzdGF0dXM7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICBnZXQgc2l6ZVF1ZXVlZCgpOm51bWJlciB7XHJcbiAgICAgICAgICAgIHJldHVybiB0aGlzLl9zaXplUXVldWVkO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgZ2V0IHNpemVEb25lKCk6bnVtYmVyIHtcclxuICAgICAgICAgICAgcmV0dXJuIHRoaXMuX3NpemVEb25lO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgc2l6ZUluUXVldWUoKXtcclxuICAgICAgICAgIHJldHVybiB0aGlzLl9zaXplUXVldWVkLXRoaXMuX3NpemVEb25lO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgZ2V0IHN0YXR1cygpOiBVcGxvYWRlclN0YXR1cyB7XHJcbiAgICAgICAgICAgIHJldHVybiB0aGlzLl9zdGF0dXM7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICB1cGxvYWREb25lKCk6IGJvb2xlYW4ge1xyXG4gICAgICAgICAgICByZXR1cm4gKHRoaXMuX3NpemVEb25lID49IHRoaXMuX3NpemVRdWV1ZWQpO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgcGVyY2VudERvbmUoKTogbnVtYmVyIHtcclxuICAgICAgICAgICAgaWYgKHRoaXMuX3NpemVRdWV1ZWQgPT0gMCkge1xyXG4gICAgICAgICAgICAgICAgLy8gbm8gZGF0YSBxdWV1ZWQsIHdlIGFyZSBcImRvbmVcIlxyXG4gICAgICAgICAgICAgICAgcmV0dXJuIDEwMDtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICBsZXQgcGVyY2VudCA9IE1hdGguZmxvb3IodGhpcy5fc2l6ZURvbmUgKiAxMDAgLyB0aGlzLl9zaXplUXVldWVkKTtcclxuICAgICAgICAgICAgLy9jb25zb2xlLmxvZyhcIlVwbG9hZCBzdGF0dXM6IHF1ZXVlZDogXCIrdGhpcy5fc2l6ZVF1ZXVlZCtcIiwgZG9uZTogXCIrdGhpcy5fc2l6ZURvbmUrXCIsIFwiK3BlcmNlbnQrXCIlXCIpXHJcbiAgICAgICAgICAgIHJldHVybiBwZXJjZW50O1xyXG4gICAgICAgIH1cclxuXHJcbiAgICB9XHJcblxyXG4gICAgZXhwb3J0IGNsYXNzIFVwbG9hZCB7XHJcblxyXG4gICAgICBnZXQgc2VydmVyUGVyc2lzdGFibGUoKTogU2VydmVyUGVyc2lzdGFibGUgfCBudWxsIHtcclxuICAgICAgICByZXR1cm4gdGhpcy5fc2VydmVyUGVyc2lzdGFibGU7XHJcbiAgICAgIH1cclxuXHJcbiAgICAgICAgcHJpdmF0ZSByZWFkb25seSBfZGF0YTpCbG9ifEZvcm1EYXRhO1xyXG4gICAgICAgIHByaXZhdGUgcmVhZG9ubHkgX3VybDpzdHJpbmc7XHJcblxyXG4gICAgICAgIHN0YXR1czogVXBsb2FkU3RhdHVzO1xyXG4gICAgICAgIG9uRG9uZTooKHVwbG9hZDpVcGxvYWQpPT52b2lkKSB8IG51bGw9bnVsbDtcclxuXHJcbiAgICAgICAgY29uc3RydWN0b3IoYmxvYjpCbG9ifEZvcm1EYXRhLCB1cmw6c3RyaW5nLHByaXZhdGUgX3NlcnZlclBlcnNpc3RhYmxlOlNlcnZlclBlcnNpc3RhYmxlfG51bGw9bnVsbCkge1xyXG4gICAgICAgICAgICB0aGlzLl9kYXRhID0gYmxvYjtcclxuICAgICAgICAgICAgdGhpcy5fdXJsID0gdXJsO1xyXG4gICAgICAgICAgICB0aGlzLnN0YXR1cyA9IFVwbG9hZFN0YXR1cy5JRExFO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgZ2V0IHVybCgpOnN0cmluZyB7XHJcbiAgICAgICAgICAgIHJldHVybiB0aGlzLl91cmw7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICBnZXQgZGF0YSgpOkJsb2J8Rm9ybURhdGEge1xyXG4gICAgICAgICAgICByZXR1cm4gdGhpcy5fZGF0YTtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIGRvbmUoKXtcclxuICAgICAgICAgICAgdGhpcy5zdGF0dXM9VXBsb2FkU3RhdHVzLkRPTkU7XHJcbiAgICAgICAgICAgIC8vY29uc29sZS5kZWJ1ZyhcIlNpbmdsZSB1cGxvYWQgZG9uZS5cIik7XHJcbiAgICAgICAgICAgIGlmKHRoaXMuX3NlcnZlclBlcnNpc3RhYmxlKSB7XHJcbiAgICAgICAgICAgICAgdGhpcy5fc2VydmVyUGVyc2lzdGFibGUuc2VydmVyUGVyc2lzdGVkID0gdHJ1ZTtcclxuICAgICAgICAgICAgICAvL2NvbnNvbGUuZGVidWcoXCJTaW5nbGUgdXBsb2FkIHNldCBzZXJ2ZXIgcGVyc2lzdGVkOiBcIit0aGlzLnNlcnZlclBlcnNpc3RhYmxlKTtcclxuICAgICAgICAgICAgfWVsc2V7XHJcbiAgICAgICAgICAgICAgLy9jb25zb2xlLmRlYnVnKFwiU2VydmVyIHBlcnNpc3RhYmxlIG5vdCBzZXQuXCIpO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIGlmKHRoaXMub25Eb25lKXtcclxuICAgICAgICAgICAgICB0aGlzLm9uRG9uZSh0aGlzKTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuXHJcblxyXG5cclxuICAgICAgcHVibGljIHRvU3RyaW5nID0gKCkgOiBzdHJpbmcgPT4ge1xyXG4gICAgICAgIGxldCBzPWBVcGxvYWQ6IFN0YXR1czogJHt0aGlzLnN0YXR1c30sIFVSTDogJHt0aGlzLl91cmx9YDtcclxuICAgICAgICBpZih0aGlzLl9kYXRhIGluc3RhbmNlb2YgQmxvYil7XHJcbiAgICAgICAgICAgIHM9cytgLCBTaXplOiAke3RoaXMuX2RhdGEuc2l6ZX1gO1xyXG4gICAgICAgIH1lbHNlIGlmKHRoaXMuX2RhdGEgaW5zdGFuY2VvZiAgRm9ybURhdGEpe1xyXG4gICAgICAgICAgIC8vIFRPRE8gKGl0ZXJhdGUgdGhyb3VnaCBwYXJ0cyA/PylcclxuICAgICAgICB9XHJcbiAgICAgICAgcmV0dXJuIHM7XHJcbiAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICBleHBvcnQgY2xhc3MgVXBsb2FkSG9sZGVye1xyXG5cclxuICAgICAgb25VcGxvYWRTZXQ6KCh1cGxvYWQ6VXBsb2FkKT0+dm9pZCl8bnVsbD1udWxsO1xyXG5cclxuICAgICAgZ2V0IHVwbG9hZCgpOiBVcGxvYWQgfCBudWxsIHtcclxuICAgICAgICByZXR1cm4gdGhpcy5fdXBsb2FkO1xyXG4gICAgICB9XHJcblxyXG4gICAgICBzZXQgdXBsb2FkKHZhbHVlOiBVcGxvYWQgfCBudWxsKSB7XHJcbiAgICAgICAgdGhpcy5fdXBsb2FkID0gdmFsdWU7XHJcbiAgICAgICAgaWYodGhpcy5fdXBsb2FkICYmIHRoaXMub25VcGxvYWRTZXQpe1xyXG4gICAgICAgICAgdGhpcy5vblVwbG9hZFNldCh0aGlzLl91cGxvYWQpO1xyXG4gICAgICAgIH1cclxuICAgICAgfVxyXG4gICAgICBwcml2YXRlIF91cGxvYWQ6VXBsb2FkfG51bGw9bnVsbDtcclxuICAgIH1cclxuXHJcbiAgICBleHBvcnQgY2xhc3MgVXBsb2FkU2V0e1xyXG5cclxuICAgICAgcHJpdmF0ZSB1cGxvYWRzOiBBcnJheTxVcGxvYWR8VXBsb2FkSG9sZGVyPj1uZXcgQXJyYXk8VXBsb2FkfFVwbG9hZEhvbGRlcj4oKTtcclxuICAgICAgcHJpdmF0ZSBfY29tcGxldGU9ZmFsc2U7XHJcblxyXG4gICAgICBwcml2YXRlIF9vbkRvbmU6KCh1cGxvYWRTZXQ6VXBsb2FkU2V0KT0+dm9pZCl8bnVsbD1udWxsO1xyXG5cclxuICAgICAgYWRkKHVwbG9hZDpVcGxvYWR8VXBsb2FkSG9sZGVyKXtcclxuICAgICAgICBpZih0aGlzLl9jb21wbGV0ZSkge1xyXG4gICAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdDYW5ub3QgYWRkIHVwbG9hZCB0byB1cGxvYWQgc2V0LiBVcGxvYWQgc2V0IGFscmVhZHkgY29tcGxldGUuJylcclxuICAgICAgICB9XHJcbiAgICAgICAgaWYodXBsb2FkIGluc3RhbmNlb2YgVXBsb2FkSG9sZGVyKXtcclxuICAgICAgICAgIHVwbG9hZC5vblVwbG9hZFNldD0odXBsKT0+e1xyXG4gICAgICAgICAgICB1cGwub25Eb25lPSgpPT57XHJcbiAgICAgICAgICAgICAgdGhpcy5jaGVja1VwbG9hZFN0YXRlcygpO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIHRoaXMuY2hlY2tVcGxvYWRTdGF0ZXMoKTtcclxuICAgICAgICAgIH1cclxuICAgICAgICB9XHJcbiAgICAgICAgdGhpcy51cGxvYWRzLnB1c2godXBsb2FkKTtcclxuXHJcbiAgICAgIH1cclxuXHJcbiAgICAgIGNvbXBsZXRlKCl7XHJcbiAgICAgICAgLy8gTWFyayBzZXQgYXMgY29tcGxldGVcclxuICAgICAgICB0aGlzLl9jb21wbGV0ZT10cnVlO1xyXG5cclxuICAgICAgICAvLyBhZGQgbGlzdGVuZXJzIHRvIGVhY2ggdXBsb2FkXHJcbiAgICAgICAgZm9yKGxldCB1cGwgb2YgdGhpcy51cGxvYWRzKXtcclxuICAgICAgICAgIGlmKHVwbCBpbnN0YW5jZW9mIFVwbG9hZCkge1xyXG4gICAgICAgICAgICB1cGwub25Eb25lID0gKHVwbDogVXBsb2FkKSA9PiB7XHJcbiAgICAgICAgICAgICAgdGhpcy5jaGVja1VwbG9hZFN0YXRlcygpO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICB9ZWxzZSBpZih1cGwgaW5zdGFuY2VvZiBVcGxvYWRIb2xkZXIpe1xyXG4gICAgICAgICAgICBpZih1cGwudXBsb2FkKXtcclxuICAgICAgICAgICAgICB1cGwudXBsb2FkLm9uRG9uZSA9ICh1cGw6IFVwbG9hZCkgPT4ge1xyXG4gICAgICAgICAgICAgICAgdGhpcy5jaGVja1VwbG9hZFN0YXRlcygpO1xyXG4gICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgLy8gY2hlY2sgaW1tZWRpYXRlbHkgaWYgYWxyZWFkeSBkb25lXHJcbiAgICAgICAgdGhpcy5jaGVja1VwbG9hZFN0YXRlcygpO1xyXG4gICAgICB9XHJcblxyXG4gICAgICBzZXQgb25Eb25lKHZhbHVlOiAoKHVwbG9hZFNldDogVXBsb2FkU2V0KSA9PiB2b2lkKSB8IG51bGwpIHtcclxuICAgICAgICB0aGlzLl9vbkRvbmUgPSB2YWx1ZTtcclxuICAgICAgICB0aGlzLmNoZWNrVXBsb2FkU3RhdGVzKCk7XHJcbiAgICAgIH1cclxuXHJcbiAgICAgIHByaXZhdGUgY2hlY2tVcGxvYWRTdGF0ZXMoKXtcclxuICAgICAgICAvL2NvbnNvbGUuZGVidWcoXCJDaGVjayB1cGxvYWQgc3RhdGUuLi5cIilcclxuICAgICAgICBpZih0aGlzLl9jb21wbGV0ZSl7XHJcblxyXG4gICAgICAgICAgaWYodGhpcy5fb25Eb25lKSB7XHJcbiAgICAgICAgICAgIGZvcihsZXQgdXBsIG9mIHRoaXMudXBsb2Fkcyl7XHJcbiAgICAgICAgICAgICAgaWYodXBsIGluc3RhbmNlb2YgVXBsb2FkKSB7XHJcbiAgICAgICAgICAgICAgICBpZiAoVXBsb2FkU3RhdHVzLkRPTkUgIT09IHVwbC5zdGF0dXMpIHtcclxuICAgICAgICAgICAgICAgICAgLy8gQXQgbGVhc3QgdGhpcyB1cGxvYWQgaXMgbm90IHlldCBkb25lXHJcbiAgICAgICAgICAgICAgICAgIC8vIERvIG5vdGhpbmdcclxuICAgICAgICAgICAgICAgICAgLy9jb25zb2xlLmRlYnVnKFwiQ2hlY2sgdXBsb2FkIHN0YXRlOiBVcGxvYWQgbm90IGRvbmUuXCIpXHJcbiAgICAgICAgICAgICAgICAgIHJldHVybjtcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICB9ZWxzZSBpZih1cGwgaW5zdGFuY2VvZiBVcGxvYWRIb2xkZXIpe1xyXG4gICAgICAgICAgICAgICAgaWYodXBsLnVwbG9hZCl7XHJcbiAgICAgICAgICAgICAgICAgIGlmIChVcGxvYWRTdGF0dXMuRE9ORSAhPT0gdXBsLnVwbG9hZC5zdGF0dXMpIHtcclxuICAgICAgICAgICAgICAgICAgICAvLyBBdCBsZWFzdCB0aGlzIHVwbG9hZCBpcyBub3QgeWV0IGRvbmVcclxuICAgICAgICAgICAgICAgICAgICAvLyBEbyBub3RoaW5nXHJcbiAgICAgICAgICAgICAgICAgICAgLy9jb25zb2xlLmRlYnVnKFwiQ2hlY2sgdXBsb2FkIHN0YXRlOiBVcGxvYWQgKGhvbGRlcikgbm90IGRvbmUuXCIpXHJcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuO1xyXG4gICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICB9ZWxzZXtcclxuICAgICAgICAgICAgICAgICAgLy8gVGhlIGFjdHVhbCB1cGxvYWQgaXMgbm90IHlldCBzZXRcclxuICAgICAgICAgICAgICAgICAgLy9jb25zb2xlLmRlYnVnKFwiQ2hlY2sgdXBsb2FkIHN0YXRlOiBVcGxvYWQgKGhvbGRlcik6IHVwbG9hZCBub3QgeWV0IHNldC5cIilcclxuICAgICAgICAgICAgICAgICAgcmV0dXJuO1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAvLyBzZXQgaXMgY29tcGxldGUgYW5kIGFsbCB1cGxvYWQgcGFydHMgYXJlIGRvbmUsIGNhbGwgZG9uZSBjYWxsYmFja1xyXG4gICAgICAgICAgICAvL2NvbnNvbGUuZGVidWcoXCJDaGVjayB1cGxvYWQgc3RhdGU6IEFsbCBkb25lLlwiKVxyXG4gICAgICAgICAgICB0aGlzLl9vbkRvbmUodGhpcyk7XHJcbiAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG4gICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgZXhwb3J0IGludGVyZmFjZSBTZXJ2ZXJQZXJzaXN0YWJsZXtcclxuICAgICAgICBzZXJ2ZXJQZXJzaXN0ZWQ6Ym9vbGVhbjtcclxuICAgIH1cclxuXHJcbiAgICBleHBvcnQgY2xhc3MgVXBsb2FkZXIge1xyXG4gICAgICAgIFBPU1RfTUlOX1RJTUVPVVQgPSAxMjAwMDA7IC8vIDJtaW4gcGx1cyAuLi5cclxuICAgICAgICBQT1NUX1RJTUVPVVRfUEVSX0tCID0gMTAwMDsgIC8vIC4uLiAxcyBwZXIga0JcclxuXHJcbiAgICAgICAgUkVUUllfREVMQVk6IG51bWJlciA9IDMwMDAwOyAvLyByZXRyeSBldmVyeSAzMHNcclxuICAgICAgICBERUJVR19ERUxBWTogbnVtYmVyID0gMDtcclxuICAgICAgICAvL0RFQlVHX0RFTEFZOm51bWJlcj0wO1xyXG4gICAgICAgIHByaXZhdGUgc3RhdHVzOiBVcGxvYWRlclN0YXR1cyA9IFVwbG9hZGVyU3RhdHVzLkRPTkU7XHJcbiAgICAgICAgcHJpdmF0ZSByZWFkb25seSBxdWU6IEFycmF5PFVwbG9hZD47XHJcbiAgICAgICAgbGlzdGVuZXI6ICgodWU6IFVwbG9hZGVyU3RhdHVzQ2hhbmdlRXZlbnQpID0+IHZvaWQpIHwgbnVsbCA9IG51bGw7XHJcbiAgICAgICAgcHJpdmF0ZSBfc2l6ZVF1ZXVlZDogbnVtYmVyID0gMDtcclxuICAgICAgICBwcml2YXRlIF9zaXplRG9uZTogbnVtYmVyID0gMDtcclxuXHJcbiAgICAgICAgcHJpdmF0ZSByZXRyeVRpbWVyUnVubmluZyA9IGZhbHNlO1xyXG4gICAgICAgIHByaXZhdGUgcmV0cnlUaW1lcklkOiBudW1iZXIgfCBudWxsID0gbnVsbDtcclxuXHJcbiAgICAgICAgcHJpdmF0ZSB0ZTpUZXh0RW5jb2Rlcj1uZXcgVGV4dEVuY29kZXIoKTtcclxuXHJcbiAgICAgICAgY29uc3RydWN0b3IocHJpdmF0ZSBodHRwOiBIdHRwQ2xpZW50LCBwcml2YXRlIHdpdGhDcmVkZW50aWFsczogYm9vbGVhbiA9IGZhbHNlKSB7XHJcbiAgICAgICAgICAgIHRoaXMucXVlID0gbmV3IEFycmF5PFVwbG9hZD4oKTtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIHByaXZhdGUgZGF0YVNpemUoZHQ6QmxvYnxGb3JtRGF0YSl7XHJcbiAgICAgICAgICAgIGxldCBzaT0wO1xyXG4gICAgICAgICAgICBpZihkdCBpbnN0YW5jZW9mIEJsb2Ipe1xyXG4gICAgICAgICAgICAgICAgc2k9ZHQuc2l6ZTtcclxuICAgICAgICAgICAgfWVsc2UgaWYoZHQgaW5zdGFuY2VvZiAgRm9ybURhdGEpe1xyXG4gICAgICAgICAgICAgICAgZHQuZm9yRWFjaCgodixrKT0+e1xyXG4gICAgICAgICAgICAgICAgICAgIGlmKHYgaW5zdGFuY2VvZiBGaWxlKXtcclxuICAgICAgICAgICAgICAgICAgICAgICAgc2krPXYuc2l6ZTtcclxuICAgICAgICAgICAgICAgICAgICB9ZWxzZSBpZih0eXBlb2YgdiA9PT0nc3RyaW5nJyl7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIGVuY29kZSB0byBVVEYtOCB0byBnZXQgdXBsb2FkIHNpemVcclxuICAgICAgICAgICAgICAgICAgICAgICAgc2krPSB0aGlzLnRlLmVuY29kZSgpLmxlbmd0aDtcclxuICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICB9KVxyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIHJldHVybiBzaTtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIHByaXZhdGUgIHVwbG9hZERvbmUodWw6VXBsb2FkKSB7XHJcblxyXG4gICAgICAgICAgICB1bC5kb25lKCk7XHJcblxyXG4gICAgICAgICAgICAvLyByZW1vdmUgdXBsb2FkIGZyb20gcXVldWVcclxuICAgICAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCB0aGlzLnF1ZS5sZW5ndGg7IGkrKykge1xyXG4gICAgICAgICAgICAgICAgaWYgKHRoaXMucXVlW2ldID09PSB1bCkge1xyXG4gICAgICAgICAgICAgICAgICAgIC8vIGZvdW5kLCByZW1vdmVcclxuICAgICAgICAgICAgICAgICAgICB0aGlzLnF1ZS5zcGxpY2UoaSwgMSk7XHJcbiAgICAgICAgICAgICAgICAgICAgbGV0IHVsU2l6ZSA9IHRoaXMuZGF0YVNpemUodWwuZGF0YSk7XHJcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5fc2l6ZURvbmUgKz0gdWxTaXplO1xyXG4gICAgICAgICAgICAgICAgICAgIGJyZWFrO1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIC8vIHNldCB0byBkb25lIGZvciBub3cuLi5cclxuICAgICAgICAgICAgdGhpcy5zdGF0dXMgPSBVcGxvYWRlclN0YXR1cy5ORVhUO1xyXG4gICAgICAgICAgICAvLyBjb250aW51ZVxyXG4gICAgICAgICAgICB0aGlzLnByb2Nlc3MoKTtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIHByaXZhdGUgc3RhcnRVcGxvYWQodWw6VXBsb2FkKSB7XHJcblxyXG4gICAgICAgICAgICB1bC5zdGF0dXMgPSBVcGxvYWRTdGF0dXMuVVBMT0FESU5HO1xyXG4gICAgICAgICAgICBpZiAoVXBsb2FkZXJTdGF0dXMuRVJSID09PSB0aGlzLnN0YXR1cykge1xyXG4gICAgICAgICAgICAgICAgdGhpcy5zdGF0dXMgPSBVcGxvYWRlclN0YXR1cy5UUllfVVBMT0FESU5HO1xyXG4gICAgICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICAgICAgdGhpcy5zdGF0dXMgPSBVcGxvYWRlclN0YXR1cy5VUExPQURJTkc7XHJcbiAgICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICAgIGxldCBkU2l6ZT10aGlzLmRhdGFTaXplKHVsLmRhdGEpO1xyXG4gICAgICAgICAgICBsZXQgdGltZW91dEZvckRhdGFTaXplPWRTaXplKnRoaXMuUE9TVF9USU1FT1VUX1BFUl9LQi8xMDAwO1xyXG4gICAgICAgICAgICBsZXQgdGltZW9WYWw6bnVtYmVyPU1hdGgucm91bmQodGhpcy5QT1NUX01JTl9USU1FT1VUK3RpbWVvdXRGb3JEYXRhU2l6ZSlcclxuICAgICAgICAgICAgLy8gcGlwZSh0aW1lb3V0KCkpIGlzIG5vdCB0aGUgc2FtZSBhcyB4aHIudGltZW91dFxyXG5cclxuICAgICAgICAgIGxldCB1cGxvYWRlZFVwbG9hZDpVcGxvYWR8bnVsbD1udWxsO1xyXG4gICAgICAgICAgICAvL2NvbnNvbGUuZGVidWcoXCJQb3N0IHVwbG9hZDogXCIrdWwpXHJcbiAgICAgICAgICAgIHRoaXMuaHR0cC5wb3N0KHVsLnVybCx1bC5kYXRhLHt3aXRoQ3JlZGVudGlhbHM6dGhpcy53aXRoQ3JlZGVudGlhbHN9KS5waXBlKHRpbWVvdXQodGltZW9WYWwpKS5zdWJzY3JpYmUoXHJcbiAgICAgICAgICAgICAgICB7XHJcbiAgICAgICAgICAgICAgICAgICAgbmV4dDogKGRhdGEpPT5cclxuICAgICAgICAgICAgICAgICAgICB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHVwbG9hZGVkVXBsb2FkID0gdWw7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vY29uc29sZS5kZWJ1ZygnTmV4dCBtZXRob2QgY2FsbGVkIGZvciB1cGxvYWQ6ICcrdXBsb2FkZWRVcGxvYWQpXHJcbiAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICAgICwgZXJyb3I6KGVycjogSHR0cEVycm9yUmVzcG9uc2UpID0+IHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGVyci5lcnJvciBpbnN0YW5jZW9mIEVycm9yKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBBIGNsaWVudC1zaWRlIG9yIG5ldHdvcmsgZXJyb3Igb2NjdXJyZWQuIEhhbmRsZSBpdCBhY2NvcmRpbmdseS5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnNvbGUuZXJyb3IoJ1VwbG9hZCBlcnJvciBvY2N1cnJlZDonLCBlcnIuZXJyb3IubWVzc2FnZSk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBUaGUgYmFja2VuZCByZXR1cm5lZCBhbiB1bnN1Y2Nlc3NmdWwgcmVzcG9uc2UgY29kZS5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIFRoZSByZXNwb25zZSBib2R5IG1heSBjb250YWluIGNsdWVzIGFzIHRvIHdoYXQgd2VudCB3cm9uZyxcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnNvbGUuZXJyb3IoYFVwbG9hZCBlcnJvcjogU2VydmVyIHJldHVybmVkIGNvZGUgJHtlcnIuc3RhdHVzfWApO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMucHJvY2Vzc0Vycm9yKHVsKVxyXG4gICAgICAgICAgICAgICAgICAgIH0sIGNvbXBsZXRlOiAoKSA9PiB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vY29uc29sZS5kZWJ1ZygnVXBsb2FkIGNvbXBsZXRlIG1ldGhvZCBjYWxsZWQnKVxyXG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAodXBsb2FkZWRVcGxvYWQpIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICh0aGlzLkRFQlVHX0RFTEFZID4gMCkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdpbmRvdy5zZXRUaW1lb3V0KCgpID0+IHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy51cGxvYWREb25lKHVsKTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9LCB0aGlzLkRFQlVHX0RFTEFZKTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy51cGxvYWREb25lKHVwbG9hZGVkVXBsb2FkKVxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc29sZS5lcnJvcignVXBsb2FkIHBvc3QgY29tcGxldGUsIGJ1dCB1cGxvYWQgbm90IHNldCBpbiBuZXh0IG1ldGhvZCEnKVxyXG4gICAgICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgfSk7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICBwcml2YXRlIHByb2Nlc3NFcnJvcih1bDpVcGxvYWQpIHtcclxuICAgICAgICAgICAgLy9jb25zb2xlLmRlYnVnKFwiUHJvY2VzcyB1cGxvYWQgZXJyb3IuLi5cIilcclxuICAgICAgICAgICAgdWwuc3RhdHVzPVVwbG9hZFN0YXR1cy5FUlJcclxuICAgICAgICAgICAgdGhpcy5zdGF0dXMgPSBVcGxvYWRlclN0YXR1cy5FUlI7XHJcblxyXG4gICAgICAgICAgICBsZXQgdWUgPSBuZXcgVXBsb2FkZXJTdGF0dXNDaGFuZ2VFdmVudCh0aGlzLl9zaXplUXVldWVkLCB0aGlzLl9zaXplRG9uZSwgdGhpcy5zdGF0dXMpO1xyXG4gICAgICAgICAgICBpZiAodGhpcy5saXN0ZW5lcikge1xyXG4gICAgICAgICAgICAgICAgdGhpcy5saXN0ZW5lcih1ZSk7XHJcbiAgICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICAgIC8vIHNldCByZXRyeSB0aW1lclxyXG4gICAgICAgICAgICB0aGlzLnJldHJ5VGltZXJJZD13aW5kb3cuc2V0VGltZW91dCgoKSA9PiB7XHJcbiAgICAgICAgICAgICAgICB0aGlzLnJldHJ5VGltZXJSdW5uaW5nPWZhbHNlO1xyXG4gICAgICAgICAgICAgICAgLy9jb25zb2xlLmRlYnVnKFwiVXBsb2FkIHJldHJ5IHRpbWVyIGV4cGlyZWQuIENvbnRpbnVlIHByb2Nlc3NpbmcuLi5cIilcclxuICAgICAgICAgICAgICAgIHRoaXMucHJvY2VzcygpO1xyXG4gICAgICAgICAgICB9LCB0aGlzLlJFVFJZX0RFTEFZKTtcclxuXHJcbiAgICAgICAgICAgIHRoaXMucmV0cnlUaW1lclJ1bm5pbmc9dHJ1ZTtcclxuICAgICAgICAgICAgLy9jb25zb2xlLmRlYnVnKFwiU3RhcnRlZCB1cGxvYWQgcmV0cnkgdGltZXIgXCIrdGhpcy5SRVRSWV9ERUxBWStcIm1zIC4uLlwiKVxyXG4gICAgICAgIH1cclxuXHJcbiAgICAgIHByaXZhdGUgcHJvY2VzcygpIHtcclxuICAgICAgICAvLyBjbGVhciByZXRyeSB0aW1lciBpZiBzZXRcclxuICAgICAgICBpZih0aGlzLnJldHJ5VGltZXJSdW5uaW5nKXtcclxuICAgICAgICAgICAgaWYodGhpcy5yZXRyeVRpbWVySWQpIHtcclxuICAgICAgICAgICAgICAgIHdpbmRvdy5jbGVhclRpbWVvdXQodGhpcy5yZXRyeVRpbWVySWQpXHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgIHRoaXMucmV0cnlUaW1lclJ1bm5pbmc9ZmFsc2VcclxuICAgICAgICAgIC8vY29uc29sZS5kZWJ1ZyhcIkNsZWFyZWQgcmV0cnkgdGltZXIuXCIpXHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICBsZXQgcHVsOiBVcGxvYWQgfCBudWxsID0gbnVsbDtcclxuXHJcbiAgICAgICAgLy9jb25zb2xlLmRlYnVnKFwiVXBsb2FkZXIgc3RhdHVzOiBcIit0aGlzLnN0YXR1cylcclxuXHJcbiAgICAgICAgbGV0IHMgPSB0aGlzLnF1ZS5sZW5ndGg7XHJcbiAgICAgICAgLy9jb25zb2xlLmRlYnVnKHMrXCIgdXBsb2FkcyBhcmUgaW4gdGhlIHF1ZXVlLlwiKVxyXG5cclxuICAgICAgICBpZiAocz4wICYmIFVwbG9hZGVyU3RhdHVzLlVQTE9BRElORyAhPSB0aGlzLnN0YXR1cyAmJiBVcGxvYWRlclN0YXR1cy5UUllfVVBMT0FESU5HICE9IHRoaXMuc3RhdHVzKSB7XHJcblxyXG4gICAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBzOyBpKyspIHtcclxuICAgICAgICAgICAgbGV0IHVsID0gdGhpcy5xdWVbaV07XHJcbiAgICAgICAgICAgIC8vY29uc29sZS5sb2coXCJVcGxvYWQgXCIrdWwrXCIgc3RhdHVzOlwiK3VsLnN0YXR1cylcclxuICAgICAgICAgICAgaWYgKHVsLnN0YXR1cyA9PT0gVXBsb2FkU3RhdHVzLklETEUpIHtcclxuICAgICAgICAgICAgICAvL2NvbnNvbGUubG9nKFwiVXBsb2FkIFwiK3VsK1wiIHN0YXJ0VXBsb2FkXCIpXHJcbiAgICAgICAgICAgICAgdGhpcy5zdGFydFVwbG9hZCh1bCk7XHJcbiAgICAgICAgICAgICAgcHVsID0gdWw7XHJcbiAgICAgICAgICAgICAgYnJlYWs7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgIH1cclxuICAgICAgICAgIGlmICghcHVsKSB7XHJcbiAgICAgICAgICAgIC8vY29uc29sZS5sb2coXCJDaGVjayBFUlIgdXBsb2Fkcy4uLlwiKVxyXG4gICAgICAgICAgICAvLyBub3cgZmFpbGVkIHVwbG9hZHNcclxuICAgICAgICAgICAgLy9jb25zb2xlLmRlYnVnKFwiTm8gcmVndWxhciB1cGxvYWQgZm91bmQuIExvb2tpbmcgZm9yIGVycm9yIHN0YXRlIHVwbG9hZHMuXCIpXHJcbiAgICAgICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgczsgaSsrKSB7XHJcbiAgICAgICAgICAgICAgbGV0IHVsID0gdGhpcy5xdWVbaV07XHJcbiAgICAgICAgICAgICAgLy9jb25zb2xlLmxvZyhcIlVwbG9hZCBcIit1bCtcIiBzdGF0dXM6XCIrdWwuc3RhdHVzKVxyXG4gICAgICAgICAgICAgIGlmICh1bC5zdGF0dXMgPT09IFVwbG9hZFN0YXR1cy5FUlIpIHtcclxuICAgICAgICAgICAgICAgIC8vY29uc29sZS5sb2coXCJVcGxvYWQgKEVSUikgXCIrdWwrXCIgc3RhcnRVcGxvYWRcIilcclxuICAgICAgICAgICAgICAgIC8vY29uc29sZS5kZWJ1ZyhcIlN0YXJ0IGVycm9yIHN0YXRlIHVwbG9hZCBcIit1bClcclxuICAgICAgICAgICAgICAgIHRoaXMuc3RhcnRVcGxvYWQodWwpO1xyXG4gICAgICAgICAgICAgICAgcHVsID0gdWw7XHJcbiAgICAgICAgICAgICAgICBicmVhaztcclxuICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgIH1cclxuICAgICAgICB9XHJcbiAgICAgICAgaWYocz09MCl7XHJcbiAgICAgICAgICAvL2NvbnNvbGUuZGVidWcoXCJVcGxvYWQgZG9uZS5cIilcclxuICAgICAgICAgIHRoaXMuc3RhdHVzPVVwbG9hZGVyU3RhdHVzLkRPTkVcclxuICAgICAgICB9XHJcbiAgICAgICAgbGV0IHVlID0gbmV3IFVwbG9hZGVyU3RhdHVzQ2hhbmdlRXZlbnQodGhpcy5fc2l6ZVF1ZXVlZCwgdGhpcy5fc2l6ZURvbmUsIHRoaXMuc3RhdHVzKTtcclxuICAgICAgICBpZiAodGhpcy5saXN0ZW5lcikge1xyXG4gICAgICAgICAgdGhpcy5saXN0ZW5lcih1ZSk7XHJcbiAgICAgICAgfVxyXG4gICAgICB9XHJcblxyXG4gICAgICAgIHF1ZXVlVXBsb2FkKHVsOiBVcGxvYWQpIHtcclxuICAgICAgICAgICAgaWYgKHVsKSB7XHJcbiAgICAgICAgICAgICAgICBsZXQgdWxTaXplID0gdGhpcy5kYXRhU2l6ZSh1bC5kYXRhKTtcclxuICAgICAgICAgICAgICAgIHRoaXMucXVlLnB1c2godWwpO1xyXG4gICAgICAgICAgICAgICAgdGhpcy5fc2l6ZVF1ZXVlZCArPSB1bFNpemU7XHJcbiAgICAgICAgICAgICAgICB0aGlzLnByb2Nlc3MoKTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuICAgIH1cclxuXHJcblxyXG4iXX0=
|
|
@@ -1,65 +1,65 @@
|
|
|
1
|
-
import { SprDb } from "./db/inddb";
|
|
2
|
-
import { Observable } from "rxjs";
|
|
3
|
-
import { PersistentAudioStorageTarget } from "./audio/inddb_audio_buffer";
|
|
4
|
-
export class RecorderComponent {
|
|
5
|
-
constructor(uploader) {
|
|
6
|
-
this.uploader = uploader;
|
|
7
|
-
this.dataSaved = true;
|
|
8
|
-
this._persistentAudioStorageTarget = null;
|
|
9
|
-
}
|
|
10
|
-
printStorageInfos() {
|
|
11
|
-
// Safari seems not to support the estimate function.
|
|
12
|
-
if (navigator.storage && navigator.storage.estimate instanceof Function) {
|
|
13
|
-
navigator.storage.estimate().then((se) => {
|
|
14
|
-
console.info("Estimated storage usage: " + se.usage + ", quota: " + se.quota);
|
|
15
|
-
}).catch((err) => "Could not get get storage infos: " + err.message);
|
|
16
|
-
}
|
|
17
|
-
else {
|
|
18
|
-
console.info("User agent does not support storage manager estimate function.");
|
|
19
|
-
}
|
|
20
|
-
}
|
|
21
|
-
prepare(persistentAudioStorage = false) {
|
|
22
|
-
if (persistentAudioStorage) {
|
|
23
|
-
this.printStorageInfos();
|
|
24
|
-
}
|
|
25
|
-
return new Observable(subscriber => {
|
|
26
|
-
if (persistentAudioStorage) {
|
|
27
|
-
SprDb.prepare().subscribe({
|
|
28
|
-
next: (db) => {
|
|
29
|
-
this._persistentAudioStorageTarget = new PersistentAudioStorageTarget(db, SprDb.RECORDING_FILE_CACHE_OBJECT_STORE_NAME);
|
|
30
|
-
//let delCnt=0;
|
|
31
|
-
this._persistentAudioStorageTarget.deleteAll().subscribe({
|
|
32
|
-
next: () => {
|
|
33
|
-
//delCnt++;
|
|
34
|
-
subscriber.next();
|
|
35
|
-
},
|
|
36
|
-
complete: () => {
|
|
37
|
-
//console.info('Storage info after deletion of all ('+delCnt+') entries:');
|
|
38
|
-
console.info('Persistent audio storage object store cleared.');
|
|
39
|
-
this.printStorageInfos();
|
|
40
|
-
subscriber.complete();
|
|
41
|
-
},
|
|
42
|
-
error: (err) => {
|
|
43
|
-
subscriber.error(err);
|
|
44
|
-
}
|
|
45
|
-
});
|
|
46
|
-
window.addEventListener('beforeunload', (e) => {
|
|
47
|
-
if (this._persistentAudioStorageTarget) {
|
|
48
|
-
// Delete on page leave. Di not register callbacks to prevent page leave blocking
|
|
49
|
-
this._persistentAudioStorageTarget.deleteAll().subscribe();
|
|
50
|
-
}
|
|
51
|
-
});
|
|
52
|
-
},
|
|
53
|
-
error: (err) => {
|
|
54
|
-
subscriber.error(err);
|
|
55
|
-
}
|
|
56
|
-
});
|
|
57
|
-
}
|
|
58
|
-
else {
|
|
59
|
-
subscriber.next();
|
|
60
|
-
subscriber.complete();
|
|
61
|
-
}
|
|
62
|
-
});
|
|
63
|
-
}
|
|
64
|
-
}
|
|
1
|
+
import { SprDb } from "./db/inddb";
|
|
2
|
+
import { Observable } from "rxjs";
|
|
3
|
+
import { PersistentAudioStorageTarget } from "./audio/inddb_audio_buffer";
|
|
4
|
+
export class RecorderComponent {
|
|
5
|
+
constructor(uploader) {
|
|
6
|
+
this.uploader = uploader;
|
|
7
|
+
this.dataSaved = true;
|
|
8
|
+
this._persistentAudioStorageTarget = null;
|
|
9
|
+
}
|
|
10
|
+
printStorageInfos() {
|
|
11
|
+
// Safari seems not to support the estimate function.
|
|
12
|
+
if (navigator.storage && navigator.storage.estimate instanceof Function) {
|
|
13
|
+
navigator.storage.estimate().then((se) => {
|
|
14
|
+
console.info("Estimated storage usage: " + se.usage + ", quota: " + se.quota);
|
|
15
|
+
}).catch((err) => "Could not get get storage infos: " + err.message);
|
|
16
|
+
}
|
|
17
|
+
else {
|
|
18
|
+
console.info("User agent does not support storage manager estimate function.");
|
|
19
|
+
}
|
|
20
|
+
}
|
|
21
|
+
prepare(persistentAudioStorage = false) {
|
|
22
|
+
if (persistentAudioStorage) {
|
|
23
|
+
this.printStorageInfos();
|
|
24
|
+
}
|
|
25
|
+
return new Observable(subscriber => {
|
|
26
|
+
if (persistentAudioStorage) {
|
|
27
|
+
SprDb.prepare().subscribe({
|
|
28
|
+
next: (db) => {
|
|
29
|
+
this._persistentAudioStorageTarget = new PersistentAudioStorageTarget(db, SprDb.RECORDING_FILE_CACHE_OBJECT_STORE_NAME);
|
|
30
|
+
//let delCnt=0;
|
|
31
|
+
this._persistentAudioStorageTarget.deleteAll().subscribe({
|
|
32
|
+
next: () => {
|
|
33
|
+
//delCnt++;
|
|
34
|
+
subscriber.next();
|
|
35
|
+
},
|
|
36
|
+
complete: () => {
|
|
37
|
+
//console.info('Storage info after deletion of all ('+delCnt+') entries:');
|
|
38
|
+
console.info('Persistent audio storage object store cleared.');
|
|
39
|
+
this.printStorageInfos();
|
|
40
|
+
subscriber.complete();
|
|
41
|
+
},
|
|
42
|
+
error: (err) => {
|
|
43
|
+
subscriber.error(err);
|
|
44
|
+
}
|
|
45
|
+
});
|
|
46
|
+
window.addEventListener('beforeunload', (e) => {
|
|
47
|
+
if (this._persistentAudioStorageTarget) {
|
|
48
|
+
// Delete on page leave. Di not register callbacks to prevent page leave blocking
|
|
49
|
+
this._persistentAudioStorageTarget.deleteAll().subscribe();
|
|
50
|
+
}
|
|
51
|
+
});
|
|
52
|
+
},
|
|
53
|
+
error: (err) => {
|
|
54
|
+
subscriber.error(err);
|
|
55
|
+
}
|
|
56
|
+
});
|
|
57
|
+
}
|
|
58
|
+
else {
|
|
59
|
+
subscriber.next();
|
|
60
|
+
subscriber.complete();
|
|
61
|
+
}
|
|
62
|
+
});
|
|
63
|
+
}
|
|
64
|
+
}
|
|
65
65
|
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicmVjb3JkZXJfY29tcG9uZW50LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vcHJvamVjdHMvc3BlZWNocmVjb3JkZXJuZy9zcmMvbGliL3JlY29yZGVyX2NvbXBvbmVudC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFDQSxPQUFPLEVBQUMsS0FBSyxFQUFDLE1BQU0sWUFBWSxDQUFDO0FBQ2pDLE9BQU8sRUFBQyxVQUFVLEVBQUMsTUFBTSxNQUFNLENBQUM7QUFDaEMsT0FBTyxFQUFDLDRCQUE0QixFQUFDLE1BQU0sNEJBQTRCLENBQUM7QUFReEUsTUFBTSxPQUFnQixpQkFBaUI7SUFLbkMsWUFBc0IsUUFBK0I7UUFBL0IsYUFBUSxHQUFSLFFBQVEsQ0FBdUI7UUFIckQsY0FBUyxHQUFZLElBQUksQ0FBQztRQUVoQixrQ0FBNkIsR0FBbUMsSUFBSSxDQUFDO0lBQ3ZCLENBQUM7SUFFekQsaUJBQWlCO1FBQ2YscURBQXFEO1FBQ3JELElBQUcsU0FBUyxDQUFDLE9BQU8sSUFBSSxTQUFTLENBQUMsT0FBTyxDQUFDLFFBQVEsWUFBWSxRQUFRLEVBQUU7WUFDdEUsU0FBUyxDQUFDLE9BQU8sQ0FBQyxRQUFRLEVBQUUsQ0FBQyxJQUFJLENBQUMsQ0FBQyxFQUFFLEVBQUUsRUFBRTtnQkFDdkMsT0FBTyxDQUFDLElBQUksQ0FBQywyQkFBMkIsR0FBRyxFQUFFLENBQUMsS0FBSyxHQUFHLFdBQVcsR0FBRyxFQUFFLENBQUMsS0FBSyxDQUFDLENBQUM7WUFDaEYsQ0FBQyxDQUFDLENBQUMsS0FBSyxDQUFDLENBQUMsR0FBRyxFQUFFLEVBQUUsQ0FBQyxtQ0FBbUMsR0FBRyxHQUFHLENBQUMsT0FBTyxDQUFDLENBQUM7U0FDdEU7YUFBSTtZQUNILE9BQU8sQ0FBQyxJQUFJLENBQUMsZ0VBQWdFLENBQUMsQ0FBQztTQUNoRjtJQUNILENBQUM7SUFFRCxPQUFPLENBQUMsc0JBQXNCLEdBQUMsS0FBSztRQUVoQyxJQUFHLHNCQUFzQixFQUFDO1lBQ3RCLElBQUksQ0FBQyxpQkFBaUIsRUFBRSxDQUFDO1NBQzVCO1FBQ0gsT0FBTyxJQUFJLFVBQVUsQ0FBQyxVQUFVLENBQUMsRUFBRTtZQUNqQyxJQUFJLHNCQUFzQixFQUFFO2dCQUMxQixLQUFLLENBQUMsT0FBTyxFQUFFLENBQUMsU0FBUyxDQUFDO29CQUN4QixJQUFJLEVBQUUsQ0FBQyxFQUFFLEVBQUUsRUFBRTt3QkFDWCxJQUFJLENBQUMsNkJBQTZCLEdBQUcsSUFBSSw0QkFBNEIsQ0FBQyxFQUFFLEVBQUUsS0FBSyxDQUFDLHNDQUFzQyxDQUFDLENBQUM7d0JBQ3hILGVBQWU7d0JBQ2YsSUFBSSxDQUFDLDZCQUE2QixDQUFDLFNBQVMsRUFBRSxDQUFDLFNBQVMsQ0FBQzs0QkFDdkQsSUFBSSxFQUFDLEdBQUUsRUFBRTtnQ0FDUCxXQUFXO2dDQUNYLFVBQVUsQ0FBQyxJQUFJLEVBQUUsQ0FBQzs0QkFDcEIsQ0FBQzs0QkFDRCxRQUFRLEVBQUMsR0FBRSxFQUFFO2dDQUNYLDJFQUEyRTtnQ0FDM0UsT0FBTyxDQUFDLElBQUksQ0FBQyxnREFBZ0QsQ0FBQyxDQUFDO2dDQUMvRCxJQUFJLENBQUMsaUJBQWlCLEVBQUUsQ0FBQztnQ0FDekIsVUFBVSxDQUFDLFFBQVEsRUFBRSxDQUFDOzRCQUN4QixDQUFDOzRCQUNELEtBQUssRUFBQyxDQUFDLEdBQUcsRUFBQyxFQUFFO2dDQUNYLFVBQVUsQ0FBQyxLQUFLLENBQUMsR0FBRyxDQUFDLENBQUM7NEJBQ3hCLENBQUM7eUJBRUYsQ0FBQyxDQUFDO3dCQUVILE1BQU0sQ0FBQyxnQkFBZ0IsQ0FBQyxjQUFjLEVBQUMsQ0FBQyxDQUFDLEVBQUMsRUFBRTs0QkFDeEMsSUFBRyxJQUFJLENBQUMsNkJBQTZCLEVBQUU7Z0NBQ25DLGlGQUFpRjtnQ0FDakYsSUFBSSxDQUFDLDZCQUE2QixDQUFDLFNBQVMsRUFBRSxDQUFDLFNBQVMsRUFBRSxDQUFDOzZCQUM5RDt3QkFDTCxDQUFDLENBQUMsQ0FBQztvQkFFTCxDQUFDO29CQUNELEtBQUssRUFBQyxDQUFDLEdBQUcsRUFBQyxFQUFFO3dCQUNYLFVBQVUsQ0FBQyxLQUFLLENBQUMsR0FBRyxDQUFDLENBQUM7b0JBQ3hCLENBQUM7aUJBQ0YsQ0FBQyxDQUFDO2FBQ0o7aUJBQUk7Z0JBQ0gsVUFBVSxDQUFDLElBQUksRUFBRSxDQUFDO2dCQUNsQixVQUFVLENBQUMsUUFBUSxFQUFFLENBQUM7YUFDdkI7UUFDSCxDQUFDLENBQ0YsQ0FBQztJQUNGLENBQUM7Q0FJSiIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7U3BlZWNoUmVjb3JkZXJVcGxvYWRlcn0gZnJvbSBcIi4vc3BlZWNocmVjb3JkZXIvc3BydXBsb2FkZXJcIjtcclxuaW1wb3J0IHtTcHJEYn0gZnJvbSBcIi4vZGIvaW5kZGJcIjtcclxuaW1wb3J0IHtPYnNlcnZhYmxlfSBmcm9tIFwicnhqc1wiO1xyXG5pbXBvcnQge1BlcnNpc3RlbnRBdWRpb1N0b3JhZ2VUYXJnZXR9IGZyb20gXCIuL2F1ZGlvL2luZGRiX2F1ZGlvX2J1ZmZlclwiO1xyXG5cclxuXHJcbmV4cG9ydCBpbnRlcmZhY2UgUmVhZHlTdGF0ZVByb3ZpZGVyIHtcclxuICAgIHJlYWR5KCk6Ym9vbGVhbjtcclxufVxyXG5cclxuXHJcbmV4cG9ydCBhYnN0cmFjdCBjbGFzcyBSZWNvcmRlckNvbXBvbmVudCBpbXBsZW1lbnRzIFJlYWR5U3RhdGVQcm92aWRlcntcclxuXHJcbiAgICBkYXRhU2F2ZWQ6IGJvb2xlYW4gPSB0cnVlO1xyXG5cclxuICAgIHByb3RlY3RlZCBfcGVyc2lzdGVudEF1ZGlvU3RvcmFnZVRhcmdldDpQZXJzaXN0ZW50QXVkaW9TdG9yYWdlVGFyZ2V0fG51bGw9bnVsbDtcclxuICAgIGNvbnN0cnVjdG9yKHByb3RlY3RlZCB1cGxvYWRlcjpTcGVlY2hSZWNvcmRlclVwbG9hZGVyKSB7fVxyXG5cclxuICAgIHByaW50U3RvcmFnZUluZm9zKCl7XHJcbiAgICAgIC8vIFNhZmFyaSBzZWVtcyBub3QgdG8gc3VwcG9ydCB0aGUgZXN0aW1hdGUgZnVuY3Rpb24uXHJcbiAgICAgIGlmKG5hdmlnYXRvci5zdG9yYWdlICYmIG5hdmlnYXRvci5zdG9yYWdlLmVzdGltYXRlIGluc3RhbmNlb2YgRnVuY3Rpb24pIHtcclxuICAgICAgICBuYXZpZ2F0b3Iuc3RvcmFnZS5lc3RpbWF0ZSgpLnRoZW4oKHNlKSA9PiB7XHJcbiAgICAgICAgICBjb25zb2xlLmluZm8oXCJFc3RpbWF0ZWQgc3RvcmFnZSB1c2FnZTogXCIgKyBzZS51c2FnZSArIFwiLCBxdW90YTogXCIgKyBzZS5xdW90YSk7XHJcbiAgICAgICAgfSkuY2F0Y2goKGVycikgPT4gXCJDb3VsZCBub3QgZ2V0IGdldCBzdG9yYWdlIGluZm9zOiBcIiArIGVyci5tZXNzYWdlKTtcclxuICAgICAgfWVsc2V7XHJcbiAgICAgICAgY29uc29sZS5pbmZvKFwiVXNlciBhZ2VudCBkb2VzIG5vdCBzdXBwb3J0IHN0b3JhZ2UgbWFuYWdlciBlc3RpbWF0ZSBmdW5jdGlvbi5cIik7XHJcbiAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICBwcmVwYXJlKHBlcnNpc3RlbnRBdWRpb1N0b3JhZ2U9ZmFsc2UpOk9ic2VydmFibGU8dm9pZD57XHJcblxyXG4gICAgICAgIGlmKHBlcnNpc3RlbnRBdWRpb1N0b3JhZ2Upe1xyXG4gICAgICAgICAgICB0aGlzLnByaW50U3RvcmFnZUluZm9zKCk7XHJcbiAgICAgICAgfVxyXG4gICAgICByZXR1cm4gbmV3IE9ic2VydmFibGUoc3Vic2NyaWJlciA9PiB7XHJcbiAgICAgICAgaWYgKHBlcnNpc3RlbnRBdWRpb1N0b3JhZ2UpIHtcclxuICAgICAgICAgIFNwckRiLnByZXBhcmUoKS5zdWJzY3JpYmUoe1xyXG4gICAgICAgICAgICBuZXh0OiAoZGIpID0+IHtcclxuICAgICAgICAgICAgICB0aGlzLl9wZXJzaXN0ZW50QXVkaW9TdG9yYWdlVGFyZ2V0ID0gbmV3IFBlcnNpc3RlbnRBdWRpb1N0b3JhZ2VUYXJnZXQoZGIsIFNwckRiLlJFQ09SRElOR19GSUxFX0NBQ0hFX09CSkVDVF9TVE9SRV9OQU1FKTtcclxuICAgICAgICAgICAgICAvL2xldCBkZWxDbnQ9MDtcclxuICAgICAgICAgICAgICB0aGlzLl9wZXJzaXN0ZW50QXVkaW9TdG9yYWdlVGFyZ2V0LmRlbGV0ZUFsbCgpLnN1YnNjcmliZSh7XHJcbiAgICAgICAgICAgICAgICBuZXh0OigpPT57XHJcbiAgICAgICAgICAgICAgICAgIC8vZGVsQ250Kys7XHJcbiAgICAgICAgICAgICAgICAgIHN1YnNjcmliZXIubmV4dCgpO1xyXG4gICAgICAgICAgICAgICAgfSxcclxuICAgICAgICAgICAgICAgIGNvbXBsZXRlOigpPT57XHJcbiAgICAgICAgICAgICAgICAgIC8vY29uc29sZS5pbmZvKCdTdG9yYWdlIGluZm8gYWZ0ZXIgZGVsZXRpb24gb2YgYWxsICgnK2RlbENudCsnKSBlbnRyaWVzOicpO1xyXG4gICAgICAgICAgICAgICAgICBjb25zb2xlLmluZm8oJ1BlcnNpc3RlbnQgYXVkaW8gc3RvcmFnZSBvYmplY3Qgc3RvcmUgY2xlYXJlZC4nKTtcclxuICAgICAgICAgICAgICAgICAgdGhpcy5wcmludFN0b3JhZ2VJbmZvcygpO1xyXG4gICAgICAgICAgICAgICAgICBzdWJzY3JpYmVyLmNvbXBsZXRlKCk7XHJcbiAgICAgICAgICAgICAgICB9LFxyXG4gICAgICAgICAgICAgICAgZXJyb3I6KGVycik9PntcclxuICAgICAgICAgICAgICAgICAgc3Vic2NyaWJlci5lcnJvcihlcnIpO1xyXG4gICAgICAgICAgICAgICAgfVxyXG5cclxuICAgICAgICAgICAgICB9KTtcclxuXHJcbiAgICAgICAgICAgICAgd2luZG93LmFkZEV2ZW50TGlzdGVuZXIoJ2JlZm9yZXVubG9hZCcsKGUpPT57XHJcbiAgICAgICAgICAgICAgICAgIGlmKHRoaXMuX3BlcnNpc3RlbnRBdWRpb1N0b3JhZ2VUYXJnZXQpIHtcclxuICAgICAgICAgICAgICAgICAgICAgIC8vIERlbGV0ZSBvbiBwYWdlIGxlYXZlLiBEaSBub3QgcmVnaXN0ZXIgY2FsbGJhY2tzIHRvIHByZXZlbnQgcGFnZSBsZWF2ZSBibG9ja2luZ1xyXG4gICAgICAgICAgICAgICAgICAgICAgdGhpcy5fcGVyc2lzdGVudEF1ZGlvU3RvcmFnZVRhcmdldC5kZWxldGVBbGwoKS5zdWJzY3JpYmUoKTtcclxuICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgIH0pO1xyXG5cclxuICAgICAgICAgICAgfSxcclxuICAgICAgICAgICAgZXJyb3I6KGVycik9PntcclxuICAgICAgICAgICAgICBzdWJzY3JpYmVyLmVycm9yKGVycik7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgIH0pO1xyXG4gICAgICAgIH1lbHNle1xyXG4gICAgICAgICAgc3Vic2NyaWJlci5uZXh0KCk7XHJcbiAgICAgICAgICBzdWJzY3JpYmVyLmNvbXBsZXRlKCk7XHJcbiAgICAgICAgfVxyXG4gICAgICB9XHJcbiAgICApO1xyXG4gICAgfVxyXG5cclxuICAgIGFic3RyYWN0IHJlYWR5KCk6Ym9vbGVhbjtcclxuICAgIGFic3RyYWN0IGdldCBzY3JlZW5Mb2NrZWQoKTpib29sZWFuO1xyXG59XHJcblxyXG4iXX0=
|
|
@@ -0,0 +1,49 @@
|
|
|
1
|
+
export var ConstraintType;
|
|
2
|
+
(function (ConstraintType) {
|
|
3
|
+
ConstraintType["Exact"] = "EXACT";
|
|
4
|
+
ConstraintType["Ideal"] = "IDEAL";
|
|
5
|
+
})(ConstraintType || (ConstraintType = {}));
|
|
6
|
+
;
|
|
7
|
+
export var Platform;
|
|
8
|
+
(function (Platform) {
|
|
9
|
+
Platform["Linux"] = "LINUX";
|
|
10
|
+
Platform["macOS"] = "MACOS";
|
|
11
|
+
Platform["Windows"] = "WINDOWS";
|
|
12
|
+
Platform["Android"] = "ANDROID";
|
|
13
|
+
})(Platform || (Platform = {}));
|
|
14
|
+
export var BrowserBase;
|
|
15
|
+
(function (BrowserBase) {
|
|
16
|
+
BrowserBase["Chromium"] = "CHROMIUM";
|
|
17
|
+
})(BrowserBase || (BrowserBase = {}));
|
|
18
|
+
;
|
|
19
|
+
export var Browser;
|
|
20
|
+
(function (Browser) {
|
|
21
|
+
Browser["Firefox"] = "FIREFOX";
|
|
22
|
+
Browser["Chromium"] = "CHROMIUM";
|
|
23
|
+
Browser["Chrome"] = "CHROME";
|
|
24
|
+
Browser["Edge"] = "EDGE";
|
|
25
|
+
Browser["Opera"] = "OPERA";
|
|
26
|
+
})(Browser || (Browser = {}));
|
|
27
|
+
export var AudioStorageType;
|
|
28
|
+
(function (AudioStorageType) {
|
|
29
|
+
AudioStorageType["MEM_ENTIRE"] = "MEM_ENTIRE";
|
|
30
|
+
AudioStorageType["MEM_CHUNKED"] = "MEM_CHUNKED";
|
|
31
|
+
AudioStorageType["DB_CHUNKED"] = "DB_CHUNKED";
|
|
32
|
+
AudioStorageType["NET_CHUNKED"] = "NET_CHUNKED";
|
|
33
|
+
AudioStorageType["MEM_ENTIRE_AUTO_NET_CHUNKED"] = "MEM_ENTIRE_AUTO_NET_CHUNKED";
|
|
34
|
+
AudioStorageType["MEM_CHUNKED_AUTO_NET_CHUNKED"] = "MEM_CHUNKED_AUTO_NET_CHUNKED";
|
|
35
|
+
})(AudioStorageType || (AudioStorageType = {}));
|
|
36
|
+
export class ProjectUtil {
|
|
37
|
+
static { this.DEFAULT_AUDIO_CHANNEL_COUNT = 2; }
|
|
38
|
+
static audioChannelCount(project) {
|
|
39
|
+
let chs = ProjectUtil.DEFAULT_AUDIO_CHANNEL_COUNT;
|
|
40
|
+
if (project.mediaCaptureFormat) {
|
|
41
|
+
chs = project.mediaCaptureFormat.audioChannelCount;
|
|
42
|
+
}
|
|
43
|
+
else if (project.audioFormat) {
|
|
44
|
+
chs = project.audioFormat.channels;
|
|
45
|
+
}
|
|
46
|
+
return chs;
|
|
47
|
+
}
|
|
48
|
+
}
|
|
49
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicHJvamVjdC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL3NwZWVjaHJlY29yZGVybmcvc3JjL2xpYi9zcGVlY2hyZWNvcmRlci9wcm9qZWN0L3Byb2plY3QudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBZ0JBLE1BQU0sQ0FBTixJQUFZLGNBQTRDO0FBQXhELFdBQVksY0FBYztJQUFFLGlDQUFhLENBQUE7SUFBQyxpQ0FBYSxDQUFBO0FBQUEsQ0FBQyxFQUE1QyxjQUFjLEtBQWQsY0FBYyxRQUE4QjtBQUFBLENBQUM7QUFFekQsTUFBTSxDQUFOLElBQVksUUFBMEU7QUFBdEYsV0FBWSxRQUFRO0lBQUUsMkJBQWEsQ0FBQTtJQUFDLDJCQUFhLENBQUE7SUFBQywrQkFBaUIsQ0FBQTtJQUFDLCtCQUFpQixDQUFBO0FBQUEsQ0FBQyxFQUExRSxRQUFRLEtBQVIsUUFBUSxRQUFrRTtBQUN0RixNQUFNLENBQU4sSUFBWSxXQUFpQztBQUE3QyxXQUFZLFdBQVc7SUFBRSxvQ0FBbUIsQ0FBQTtBQUFBLENBQUMsRUFBakMsV0FBVyxLQUFYLFdBQVcsUUFBc0I7QUFBQSxDQUFDO0FBQzlDLE1BQU0sQ0FBTixJQUFZLE9BQXlGO0FBQXJHLFdBQVksT0FBTztJQUFFLDhCQUFpQixDQUFBO0lBQUMsZ0NBQW1CLENBQUE7SUFBQyw0QkFBZSxDQUFBO0lBQUMsd0JBQVcsQ0FBQTtJQUFDLDBCQUFhLENBQUE7QUFBQSxDQUFDLEVBQXpGLE9BQU8sS0FBUCxPQUFPLFFBQWtGO0FBRXJHLE1BQU0sQ0FBTixJQUFZLGdCQU9YO0FBUEQsV0FBWSxnQkFBZ0I7SUFDMUIsNkNBQXVCLENBQUE7SUFDdkIsK0NBQXlCLENBQUE7SUFDekIsNkNBQXVCLENBQUE7SUFDdkIsK0NBQXlCLENBQUE7SUFDekIsK0VBQXlELENBQUE7SUFDekQsaUZBQTJELENBQUE7QUFDN0QsQ0FBQyxFQVBXLGdCQUFnQixLQUFoQixnQkFBZ0IsUUFPM0I7QUF3QkQsTUFBTSxPQUFPLFdBQVc7YUFFQyxnQ0FBMkIsR0FBQyxDQUFDLENBQUM7SUFFckQsTUFBTSxDQUFDLGlCQUFpQixDQUFDLE9BQWU7UUFDdEMsSUFBSSxHQUFHLEdBQUMsV0FBVyxDQUFDLDJCQUEyQixDQUFDO1FBQ2hELElBQUcsT0FBTyxDQUFDLGtCQUFrQixFQUFDO1lBQzVCLEdBQUcsR0FBQyxPQUFPLENBQUMsa0JBQWtCLENBQUMsaUJBQWlCLENBQUM7U0FDbEQ7YUFBSyxJQUFHLE9BQU8sQ0FBQyxXQUFXLEVBQUM7WUFDM0IsR0FBRyxHQUFDLE9BQU8sQ0FBQyxXQUFXLENBQUMsUUFBUSxDQUFDO1NBQ2xDO1FBQ0QsT0FBTyxHQUFHLENBQUM7SUFDYixDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiXHJcbmV4cG9ydCBpbnRlcmZhY2UgQXVkaW9Gb3JtYXQge1xyXG4gIGNoYW5uZWxzOiBudW1iZXI7XHJcbn1cclxuXHJcbmV4cG9ydCBpbnRlcmZhY2UgTWVkaWFDYXB0dXJlRm9ybWF0IHtcclxuICBhdWRpb0NoYW5uZWxDb3VudDogbnVtYmVyO1xyXG59XHJcblxyXG5leHBvcnQgaW50ZXJmYWNlIEF1ZGlvRGV2aWNlIHtcclxuICBuYW1lIDogc3RyaW5nLFxyXG4gIHBsYXliYWNrIDogYm9vbGVhbixcclxuICByZWdleCA6IGJvb2xlYW5cclxufVxyXG5cclxuXHJcbmV4cG9ydCBlbnVtIENvbnN0cmFpbnRUeXBlIHtFeGFjdD0nRVhBQ1QnLElkZWFsPSdJREVBTCd9O1xyXG5cclxuZXhwb3J0IGVudW0gUGxhdGZvcm0ge0xpbnV4PSdMSU5VWCcsbWFjT1M9J01BQ09TJyxXaW5kb3dzPSdXSU5ET1dTJyxBbmRyb2lkPSdBTkRST0lEJ31cclxuZXhwb3J0IGVudW0gQnJvd3NlckJhc2Uge0Nocm9taXVtPSdDSFJPTUlVTSd9O1xyXG5leHBvcnQgZW51bSBCcm93c2VyIHtGaXJlZm94PSdGSVJFRk9YJyxDaHJvbWl1bT0nQ0hST01JVU0nLENocm9tZT0nQ0hST01FJyxFZGdlPSdFREdFJyxPcGVyYT0nT1BFUkEnfVxyXG5cclxuZXhwb3J0IGVudW0gQXVkaW9TdG9yYWdlVHlwZSB7XHJcbiAgTUVNX0VOVElSRT0nTUVNX0VOVElSRScsXHJcbiAgTUVNX0NIVU5LRUQ9J01FTV9DSFVOS0VEJyxcclxuICBEQl9DSFVOS0VEPSdEQl9DSFVOS0VEJyxcclxuICBORVRfQ0hVTktFRD0nTkVUX0NIVU5LRUQnLFxyXG4gIE1FTV9FTlRJUkVfQVVUT19ORVRfQ0hVTktFRD0nTUVNX0VOVElSRV9BVVRPX05FVF9DSFVOS0VEJyxcclxuICBNRU1fQ0hVTktFRF9BVVRPX05FVF9DSFVOS0VEPSdNRU1fQ0hVTktFRF9BVVRPX05FVF9DSFVOS0VEJ1xyXG59XHJcblxyXG5leHBvcnQgaW50ZXJmYWNlIEF1dG9HYWluQ29udHJvbENvbmZpZyB7XHJcbiAgdmFsdWU6IGJvb2xlYW4sXHJcbiAgLy9jb25zdHJhaW50VHlwZSA6IENvbnN0cmFpbnRUeXBlLFxyXG4gIHBsYXRmb3JtOiBQbGF0Zm9ybSxcclxuICAvL2Jyb3dzZXJCYXNlOkJyb3dzZXJCYXNlLFxyXG4gIC8vYnJvd3NlcjpCcm93c2VyXHJcbn1cclxuXHJcbmV4cG9ydCBpbnRlcmZhY2UgUHJvamVjdCB7XHJcbiAgbmFtZTogc3RyaW5nLFxyXG4gIHJlY29yZGluZ0RldmljZVdha2VMb2NrPzpib29sZWFuLFxyXG4gIGF1ZGlvRm9ybWF0PzogQXVkaW9Gb3JtYXQsXHJcbiAgbWVkaWFDYXB0dXJlRm9ybWF0PzogTWVkaWFDYXB0dXJlRm9ybWF0LFxyXG4gIGF1dG9HYWluQ29udHJvbENvbmZpZ3M/OkFycmF5PEF1dG9HYWluQ29udHJvbENvbmZpZz4sXHJcbiAgYWxsb3dFY2hvQ2FuY2VsbGF0aW9uPzpib29sZWFuLFxyXG4gIGF1ZGlvRGV2aWNlcz86IEFycmF5PEF1ZGlvRGV2aWNlPixcclxuICBjaHVua2VkUmVjb3JkaW5nPzogYm9vbGVhbixcclxuICBjbGllbnRBdWRpb1N0b3JhZ2VUeXBlPzpBdWRpb1N0b3JhZ2VUeXBlLFxyXG4gIHNob3dTZXNzaW9uQ29tcGxldGVNZXNzYWdlPzpib29sZWFuO1xyXG59XHJcblxyXG5cclxuZXhwb3J0IGNsYXNzIFByb2plY3RVdGlsIHtcclxuXHJcbiAgcHVibGljIHN0YXRpYyByZWFkb25seSBERUZBVUxUX0FVRElPX0NIQU5ORUxfQ09VTlQ9MjtcclxuXHJcbiAgc3RhdGljIGF1ZGlvQ2hhbm5lbENvdW50KHByb2plY3Q6UHJvamVjdCk6IG51bWJlcntcclxuICAgIGxldCBjaHM9UHJvamVjdFV0aWwuREVGQVVMVF9BVURJT19DSEFOTkVMX0NPVU5UO1xyXG4gICAgaWYocHJvamVjdC5tZWRpYUNhcHR1cmVGb3JtYXQpe1xyXG4gICAgICBjaHM9cHJvamVjdC5tZWRpYUNhcHR1cmVGb3JtYXQuYXVkaW9DaGFubmVsQ291bnQ7XHJcbiAgICB9ZWxzZSBpZihwcm9qZWN0LmF1ZGlvRm9ybWF0KXtcclxuICAgICAgY2hzPXByb2plY3QuYXVkaW9Gb3JtYXQuY2hhbm5lbHM7XHJcbiAgICB9XHJcbiAgICByZXR1cm4gY2hzO1xyXG4gIH1cclxuXHJcbn1cclxuXHJcblxyXG5cclxuIl19
|