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.
Files changed (220) hide show
  1. package/esm2022/lib/action/action.mjs +73 -0
  2. package/{esm2020 → esm2022}/lib/audio/array_audio_buffer.mjs +163 -163
  3. package/{esm2020 → esm2022}/lib/audio/array_audio_buffer_input_stream.mjs +85 -85
  4. package/{esm2020 → esm2022}/lib/audio/array_audio_buffer_random_access_stream.mjs +15 -15
  5. package/esm2022/lib/audio/audio_data_holder.mjs +264 -0
  6. package/{esm2020 → esm2022}/lib/audio/audio_display.mjs +93 -93
  7. package/{esm2020 → esm2022}/lib/audio/audio_player.mjs +213 -213
  8. package/esm2022/lib/audio/capture/capture.mjs +855 -0
  9. package/esm2022/lib/audio/context.mjs +79 -0
  10. package/{esm2020 → esm2022}/lib/audio/dsp/level_measure.mjs +515 -515
  11. package/{esm2020 → esm2022}/lib/audio/format.mjs +16 -16
  12. package/esm2022/lib/audio/impl/wavformat.mjs +6 -0
  13. package/{esm2020 → esm2022}/lib/audio/impl/wavreader.mjs +133 -133
  14. package/esm2022/lib/audio/impl/wavwriter.mjs +105 -0
  15. package/esm2022/lib/audio/inddb_audio_buffer.mjs +508 -0
  16. package/{esm2020 → esm2022}/lib/audio/io/stream.mjs +58 -58
  17. package/esm2022/lib/audio/net_audio_buffer.mjs +293 -0
  18. package/{esm2020 → esm2022}/lib/audio/persistor.mjs +80 -80
  19. package/{esm2020 → esm2022}/lib/audio/playback/array_audio_buffer_source_node.mjs +125 -125
  20. package/esm2022/lib/audio/playback/audio_source_node.mjs +18 -0
  21. package/esm2022/lib/audio/playback/audio_source_worklet_module_loader.mjs +167 -0
  22. package/{esm2020 → esm2022}/lib/audio/playback/inddb_audio_buffer_source_node.mjs +166 -166
  23. package/{esm2020 → esm2022}/lib/audio/playback/net_audio_buffer_source_node.mjs +217 -217
  24. package/esm2022/lib/audio/playback/player.mjs +402 -0
  25. package/esm2022/lib/audio/ui/audio_canvas_layer_comp.mjs +347 -0
  26. package/{esm2020 → esm2022}/lib/audio/ui/audio_display_control.mjs +65 -65
  27. package/{esm2020 → esm2022}/lib/audio/ui/audio_display_scroll_pane.mjs +139 -139
  28. package/{esm2020 → esm2022}/lib/audio/ui/audiosignal.mjs +524 -524
  29. package/{esm2020 → esm2022}/lib/audio/ui/common.mjs +18 -18
  30. package/esm2022/lib/audio/ui/container.mjs +414 -0
  31. package/{esm2020 → esm2022}/lib/audio/ui/livelevel.mjs +352 -352
  32. package/esm2022/lib/audio/ui/scroll_pane_horizontal.mjs +11 -0
  33. package/esm2022/lib/audio/ui/sonagram.mjs +900 -0
  34. package/esm2022/lib/db/inddb.mjs +120 -0
  35. package/esm2022/lib/dsp/utils.mjs +48 -0
  36. package/{esm2020 → esm2022}/lib/io/BinaryReader.mjs +84 -84
  37. package/esm2022/lib/io/BinaryWriter.mjs +74 -0
  38. package/{esm2020 → esm2022}/lib/io/stream.mjs +258 -258
  39. package/{esm2020 → esm2022}/lib/math/2d/geometry.mjs +27 -27
  40. package/esm2022/lib/math/complex.mjs +58 -0
  41. package/{esm2020 → esm2022}/lib/math/dft.mjs +195 -195
  42. package/{esm2020 → esm2022}/lib/media/utils.mjs +13 -13
  43. package/esm2022/lib/net/uploader.mjs +367 -0
  44. package/{esm2020 → esm2022}/lib/recorder_component.mjs +64 -64
  45. package/esm2022/lib/speechrecorder/project/project.mjs +49 -0
  46. package/esm2022/lib/speechrecorder/project/project.service.mjs +64 -0
  47. package/{esm2020 → esm2022}/lib/speechrecorder/recording.mjs +123 -123
  48. package/esm2022/lib/speechrecorder/recordings/basic_recording.service.mjs +218 -0
  49. package/esm2022/lib/speechrecorder/recordings/recordings.service.mjs +1014 -0
  50. package/{esm2020 → esm2022}/lib/speechrecorder/script/script.mjs +114 -114
  51. package/{esm2020 → esm2022}/lib/speechrecorder/script/script.service.mjs +47 -47
  52. package/esm2022/lib/speechrecorder/session/audiorecorder.mjs +1179 -0
  53. package/esm2022/lib/speechrecorder/session/basicrecorder.mjs +668 -0
  54. package/esm2022/lib/speechrecorder/session/controlpanel.mjs +416 -0
  55. package/{esm2020 → esm2022}/lib/speechrecorder/session/item.mjs +29 -29
  56. package/{esm2020 → esm2022}/lib/speechrecorder/session/progress.mjs +69 -69
  57. package/{esm2020 → esm2022}/lib/speechrecorder/session/prompting.mjs +571 -571
  58. package/{esm2020 → esm2022}/lib/speechrecorder/session/recorder_combi_pane.mjs +65 -65
  59. package/esm2022/lib/speechrecorder/session/recording_file_cache.mjs +195 -0
  60. package/{esm2020 → esm2022}/lib/speechrecorder/session/recording_list.mjs +103 -103
  61. package/{esm2020 → esm2022}/lib/speechrecorder/session/recordingfile/recording-file-meta.component.mjs +63 -63
  62. package/{esm2020 → esm2022}/lib/speechrecorder/session/recordingfile/recording-file-navi.component.mjs +51 -51
  63. package/{esm2020 → esm2022}/lib/speechrecorder/session/recordingfile/recording-file-u-i.component.mjs +104 -104
  64. package/{esm2020 → esm2022}/lib/speechrecorder/session/recordingfile/recording-file-view.component.mjs +381 -381
  65. package/{esm2020 → esm2022}/lib/speechrecorder/session/recordingfile/recording-file.mjs +67 -67
  66. package/esm2022/lib/speechrecorder/session/recordingfile/recordingfile-service.mjs +288 -0
  67. package/{esm2020 → esm2022}/lib/speechrecorder/session/session.mjs +1 -1
  68. package/esm2022/lib/speechrecorder/session/session.service.mjs +69 -0
  69. package/{esm2020 → esm2022}/lib/speechrecorder/session/session_finished_dialog.mjs +29 -29
  70. package/esm2022/lib/speechrecorder/session/sessionmanager.mjs +1386 -0
  71. package/{esm2020 → esm2022}/lib/speechrecorder/session/warning_bar.mjs +28 -28
  72. package/{esm2020 → esm2022}/lib/speechrecorder/spruploader.mjs +22 -22
  73. package/{esm2020 → esm2022}/lib/speechrecorder/startstopsignal/startstopsignal.mjs +1 -1
  74. package/esm2022/lib/speechrecorder/startstopsignal/ui/simpletrafficlight.mjs +57 -0
  75. package/{esm2020 → esm2022}/lib/speechrecorderng.component.mjs +388 -388
  76. package/{esm2020 → esm2022}/lib/speechrecorderng.module.mjs +100 -100
  77. package/{esm2020 → esm2022}/lib/spr.config.mjs +26 -26
  78. package/{esm2020 → esm2022}/lib/spr.module.version.mjs +2 -2
  79. package/{esm2020 → esm2022}/lib/ui/canvas_layer_comp.mjs +38 -38
  80. package/{esm2020 → esm2022}/lib/ui/message_dialog.mjs +30 -30
  81. package/esm2022/lib/ui/recordingitem_display.mjs +253 -0
  82. package/{esm2020 → esm2022}/lib/ui/responsive_component.mjs +24 -24
  83. package/{esm2020 → esm2022}/lib/utils/scrollIntoViewToBottom.mjs +23 -23
  84. package/esm2022/lib/utils/ua-parser.mjs +190 -0
  85. package/esm2022/lib/utils/utils.mjs +105 -0
  86. package/esm2022/lib/utils/wake_lock.mjs +114 -0
  87. package/{esm2020 → esm2022}/lib/utils/wake_lock_media.mjs +1 -1
  88. package/{esm2020 → esm2022}/public-api.mjs +33 -33
  89. package/{esm2020 → esm2022}/speechrecorderng.mjs +4 -4
  90. package/{fesm2020 → fesm2022}/speechrecorderng.mjs +16518 -16454
  91. package/fesm2022/speechrecorderng.mjs.map +1 -0
  92. package/index.d.ts +5 -5
  93. package/lib/action/action.d.ts +27 -27
  94. package/lib/audio/array_audio_buffer.d.ts +31 -31
  95. package/lib/audio/array_audio_buffer_input_stream.d.ts +14 -14
  96. package/lib/audio/array_audio_buffer_random_access_stream.d.ts +9 -9
  97. package/lib/audio/audio_data_holder.d.ts +84 -84
  98. package/lib/audio/audio_display.d.ts +36 -36
  99. package/lib/audio/audio_player.d.ts +47 -47
  100. package/lib/audio/capture/capture.d.ts +67 -67
  101. package/lib/audio/context.d.ts +6 -6
  102. package/lib/audio/dsp/level_measure.d.ts +60 -60
  103. package/lib/audio/format.d.ts +11 -11
  104. package/lib/audio/impl/wavformat.d.ts +5 -5
  105. package/lib/audio/impl/wavreader.d.ts +16 -16
  106. package/lib/audio/impl/wavwriter.d.ts +13 -13
  107. package/lib/audio/inddb_audio_buffer.d.ts +68 -68
  108. package/lib/audio/io/stream.d.ts +28 -28
  109. package/lib/audio/net_audio_buffer.d.ts +57 -57
  110. package/lib/audio/persistor.d.ts +29 -29
  111. package/lib/audio/playback/array_audio_buffer_source_node.d.ts +18 -18
  112. package/lib/audio/playback/audio_source_node.d.ts +10 -10
  113. package/lib/audio/playback/audio_source_worklet_module_loader.d.ts +4 -4
  114. package/lib/audio/playback/inddb_audio_buffer_source_node.d.ts +21 -21
  115. package/lib/audio/playback/net_audio_buffer_source_node.d.ts +27 -27
  116. package/lib/audio/playback/player.d.ts +65 -65
  117. package/lib/audio/ui/audio_canvas_layer_comp.d.ts +68 -68
  118. package/lib/audio/ui/audio_display_control.d.ts +25 -25
  119. package/lib/audio/ui/audio_display_scroll_pane.d.ts +26 -26
  120. package/lib/audio/ui/audiosignal.d.ts +30 -30
  121. package/lib/audio/ui/common.d.ts +11 -11
  122. package/lib/audio/ui/container.d.ts +63 -63
  123. package/lib/audio/ui/livelevel.d.ts +60 -60
  124. package/lib/audio/ui/scroll_pane_horizontal.d.ts +5 -5
  125. package/lib/audio/ui/sonagram.d.ts +37 -37
  126. package/lib/db/inddb.d.ts +21 -21
  127. package/lib/dsp/utils.d.ts +19 -19
  128. package/lib/io/BinaryReader.d.ts +18 -18
  129. package/lib/io/BinaryWriter.d.ts +15 -15
  130. package/lib/io/stream.d.ts +59 -59
  131. package/lib/math/2d/geometry.d.ts +18 -18
  132. package/lib/math/complex.d.ts +17 -17
  133. package/lib/math/dft.d.ts +22 -22
  134. package/lib/media/utils.d.ts +3 -3
  135. package/lib/net/uploader.d.ts +81 -81
  136. package/lib/recorder_component.d.ts +16 -16
  137. package/lib/speechrecorder/project/project.d.ts +59 -59
  138. package/lib/speechrecorder/project/project.service.d.ts +21 -21
  139. package/lib/speechrecorder/recording.d.ts +51 -51
  140. package/lib/speechrecorder/recordings/basic_recording.service.d.ts +27 -27
  141. package/lib/speechrecorder/recordings/recordings.service.d.ts +48 -48
  142. package/lib/speechrecorder/script/script.d.ts +80 -79
  143. package/lib/speechrecorder/script/script.service.d.ts +16 -16
  144. package/lib/speechrecorder/session/audiorecorder.d.ts +122 -122
  145. package/lib/speechrecorder/session/basicrecorder.d.ts +139 -139
  146. package/lib/speechrecorder/session/controlpanel.d.ts +109 -107
  147. package/lib/speechrecorder/session/item.d.ts +12 -12
  148. package/lib/speechrecorder/session/progress.d.ts +17 -17
  149. package/lib/speechrecorder/session/prompting.d.ts +121 -121
  150. package/lib/speechrecorder/session/recorder_combi_pane.d.ts +32 -32
  151. package/lib/speechrecorder/session/recording_file_cache.d.ts +33 -33
  152. package/lib/speechrecorder/session/recording_list.d.ts +24 -24
  153. package/lib/speechrecorder/session/recordingfile/recording-file-meta.component.d.ts +15 -15
  154. package/lib/speechrecorder/session/recordingfile/recording-file-navi.component.d.ts +20 -20
  155. package/lib/speechrecorder/session/recordingfile/recording-file-u-i.component.d.ts +31 -31
  156. package/lib/speechrecorder/session/recordingfile/recording-file-view.component.d.ts +55 -55
  157. package/lib/speechrecorder/session/recordingfile/recording-file.d.ts +7 -7
  158. package/lib/speechrecorder/session/recordingfile/recordingfile-service.d.ts +24 -24
  159. package/lib/speechrecorder/session/session.d.ts +15 -15
  160. package/lib/speechrecorder/session/session.service.d.ts +20 -20
  161. package/lib/speechrecorder/session/session_finished_dialog.d.ts +10 -10
  162. package/lib/speechrecorder/session/sessionmanager.d.ts +129 -123
  163. package/lib/speechrecorder/session/warning_bar.d.ts +8 -8
  164. package/lib/speechrecorder/spruploader.d.ts +11 -11
  165. package/lib/speechrecorder/startstopsignal/startstopsignal.d.ts +10 -10
  166. package/lib/speechrecorder/startstopsignal/ui/simpletrafficlight.d.ts +11 -11
  167. package/lib/speechrecorderng.component.d.ts +61 -61
  168. package/lib/speechrecorderng.module.d.ts +56 -56
  169. package/lib/spr.config.d.ts +17 -17
  170. package/lib/spr.module.version.d.ts +1 -1
  171. package/lib/ui/canvas_layer_comp.d.ts +13 -13
  172. package/lib/ui/message_dialog.d.ts +10 -10
  173. package/lib/ui/recordingitem_display.d.ts +84 -84
  174. package/lib/ui/responsive_component.d.ts +9 -9
  175. package/lib/utils/scrollIntoViewToBottom.d.ts +9 -9
  176. package/lib/utils/ua-parser.d.ts +43 -43
  177. package/lib/utils/utils.d.ts +19 -19
  178. package/lib/utils/wake_lock.d.ts +23 -23
  179. package/lib/utils/wake_lock_media.d.ts +1 -1
  180. package/package.json +17 -23
  181. package/public-api.d.ts +33 -33
  182. package/esm2020/lib/action/action.mjs +0 -73
  183. package/esm2020/lib/audio/audio_data_holder.mjs +0 -264
  184. package/esm2020/lib/audio/capture/capture.mjs +0 -855
  185. package/esm2020/lib/audio/context.mjs +0 -79
  186. package/esm2020/lib/audio/impl/wavformat.mjs +0 -6
  187. package/esm2020/lib/audio/impl/wavwriter.mjs +0 -105
  188. package/esm2020/lib/audio/inddb_audio_buffer.mjs +0 -508
  189. package/esm2020/lib/audio/net_audio_buffer.mjs +0 -293
  190. package/esm2020/lib/audio/playback/audio_source_node.mjs +0 -18
  191. package/esm2020/lib/audio/playback/audio_source_worklet_module_loader.mjs +0 -167
  192. package/esm2020/lib/audio/playback/player.mjs +0 -402
  193. package/esm2020/lib/audio/ui/audio_canvas_layer_comp.mjs +0 -347
  194. package/esm2020/lib/audio/ui/container.mjs +0 -414
  195. package/esm2020/lib/audio/ui/scroll_pane_horizontal.mjs +0 -11
  196. package/esm2020/lib/audio/ui/sonagram.mjs +0 -900
  197. package/esm2020/lib/db/inddb.mjs +0 -120
  198. package/esm2020/lib/dsp/utils.mjs +0 -48
  199. package/esm2020/lib/io/BinaryWriter.mjs +0 -74
  200. package/esm2020/lib/math/complex.mjs +0 -58
  201. package/esm2020/lib/net/uploader.mjs +0 -367
  202. package/esm2020/lib/speechrecorder/project/project.mjs +0 -49
  203. package/esm2020/lib/speechrecorder/project/project.service.mjs +0 -64
  204. package/esm2020/lib/speechrecorder/recordings/basic_recording.service.mjs +0 -216
  205. package/esm2020/lib/speechrecorder/recordings/recordings.service.mjs +0 -1014
  206. package/esm2020/lib/speechrecorder/session/audiorecorder.mjs +0 -1179
  207. package/esm2020/lib/speechrecorder/session/basicrecorder.mjs +0 -666
  208. package/esm2020/lib/speechrecorder/session/controlpanel.mjs +0 -409
  209. package/esm2020/lib/speechrecorder/session/recording_file_cache.mjs +0 -195
  210. package/esm2020/lib/speechrecorder/session/recordingfile/recordingfile-service.mjs +0 -288
  211. package/esm2020/lib/speechrecorder/session/session.service.mjs +0 -69
  212. package/esm2020/lib/speechrecorder/session/sessionmanager.mjs +0 -1333
  213. package/esm2020/lib/speechrecorder/startstopsignal/ui/simpletrafficlight.mjs +0 -57
  214. package/esm2020/lib/ui/recordingitem_display.mjs +0 -253
  215. package/esm2020/lib/utils/ua-parser.mjs +0 -190
  216. package/esm2020/lib/utils/utils.mjs +0 -105
  217. package/esm2020/lib/utils/wake_lock.mjs +0 -114
  218. package/fesm2015/speechrecorderng.mjs +0 -17708
  219. package/fesm2015/speechrecorderng.mjs.map +0 -1
  220. 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