summaryrefslogtreecommitdiff
path: root/public/assets/actiontext.esm-e787c6f528f0a88ee04de7c5ce4e3ab37fcf2691629ed21f0b30ee2db848c8c8.js
diff options
context:
space:
mode:
Diffstat (limited to 'public/assets/actiontext.esm-e787c6f528f0a88ee04de7c5ce4e3ab37fcf2691629ed21f0b30ee2db848c8c8.js')
-rw-r--r--public/assets/actiontext.esm-e787c6f528f0a88ee04de7c5ce4e3ab37fcf2691629ed21f0b30ee2db848c8c8.js889
1 files changed, 889 insertions, 0 deletions
diff --git a/public/assets/actiontext.esm-e787c6f528f0a88ee04de7c5ce4e3ab37fcf2691629ed21f0b30ee2db848c8c8.js b/public/assets/actiontext.esm-e787c6f528f0a88ee04de7c5ce4e3ab37fcf2691629ed21f0b30ee2db848c8c8.js
new file mode 100644
index 0000000..2f433b7
--- /dev/null
+++ b/public/assets/actiontext.esm-e787c6f528f0a88ee04de7c5ce4e3ab37fcf2691629ed21f0b30ee2db848c8c8.js
@@ -0,0 +1,889 @@
1var sparkMd5 = {
2 exports: {}
3};
4
5(function(module, exports) {
6 (function(factory) {
7 {
8 module.exports = factory();
9 }
10 })((function(undefined$1) {
11 var hex_chr = [ "0", "1", "2", "3", "4", "5", "6", "7", "8", "9", "a", "b", "c", "d", "e", "f" ];
12 function md5cycle(x, k) {
13 var a = x[0], b = x[1], c = x[2], d = x[3];
14 a += (b & c | ~b & d) + k[0] - 680876936 | 0;
15 a = (a << 7 | a >>> 25) + b | 0;
16 d += (a & b | ~a & c) + k[1] - 389564586 | 0;
17 d = (d << 12 | d >>> 20) + a | 0;
18 c += (d & a | ~d & b) + k[2] + 606105819 | 0;
19 c = (c << 17 | c >>> 15) + d | 0;
20 b += (c & d | ~c & a) + k[3] - 1044525330 | 0;
21 b = (b << 22 | b >>> 10) + c | 0;
22 a += (b & c | ~b & d) + k[4] - 176418897 | 0;
23 a = (a << 7 | a >>> 25) + b | 0;
24 d += (a & b | ~a & c) + k[5] + 1200080426 | 0;
25 d = (d << 12 | d >>> 20) + a | 0;
26 c += (d & a | ~d & b) + k[6] - 1473231341 | 0;
27 c = (c << 17 | c >>> 15) + d | 0;
28 b += (c & d | ~c & a) + k[7] - 45705983 | 0;
29 b = (b << 22 | b >>> 10) + c | 0;
30 a += (b & c | ~b & d) + k[8] + 1770035416 | 0;
31 a = (a << 7 | a >>> 25) + b | 0;
32 d += (a & b | ~a & c) + k[9] - 1958414417 | 0;
33 d = (d << 12 | d >>> 20) + a | 0;
34 c += (d & a | ~d & b) + k[10] - 42063 | 0;
35 c = (c << 17 | c >>> 15) + d | 0;
36 b += (c & d | ~c & a) + k[11] - 1990404162 | 0;
37 b = (b << 22 | b >>> 10) + c | 0;
38 a += (b & c | ~b & d) + k[12] + 1804603682 | 0;
39 a = (a << 7 | a >>> 25) + b | 0;
40 d += (a & b | ~a & c) + k[13] - 40341101 | 0;
41 d = (d << 12 | d >>> 20) + a | 0;
42 c += (d & a | ~d & b) + k[14] - 1502002290 | 0;
43 c = (c << 17 | c >>> 15) + d | 0;
44 b += (c & d | ~c & a) + k[15] + 1236535329 | 0;
45 b = (b << 22 | b >>> 10) + c | 0;
46 a += (b & d | c & ~d) + k[1] - 165796510 | 0;
47 a = (a << 5 | a >>> 27) + b | 0;
48 d += (a & c | b & ~c) + k[6] - 1069501632 | 0;
49 d = (d << 9 | d >>> 23) + a | 0;
50 c += (d & b | a & ~b) + k[11] + 643717713 | 0;
51 c = (c << 14 | c >>> 18) + d | 0;
52 b += (c & a | d & ~a) + k[0] - 373897302 | 0;
53 b = (b << 20 | b >>> 12) + c | 0;
54 a += (b & d | c & ~d) + k[5] - 701558691 | 0;
55 a = (a << 5 | a >>> 27) + b | 0;
56 d += (a & c | b & ~c) + k[10] + 38016083 | 0;
57 d = (d << 9 | d >>> 23) + a | 0;
58 c += (d & b | a & ~b) + k[15] - 660478335 | 0;
59 c = (c << 14 | c >>> 18) + d | 0;
60 b += (c & a | d & ~a) + k[4] - 405537848 | 0;
61 b = (b << 20 | b >>> 12) + c | 0;
62 a += (b & d | c & ~d) + k[9] + 568446438 | 0;
63 a = (a << 5 | a >>> 27) + b | 0;
64 d += (a & c | b & ~c) + k[14] - 1019803690 | 0;
65 d = (d << 9 | d >>> 23) + a | 0;
66 c += (d & b | a & ~b) + k[3] - 187363961 | 0;
67 c = (c << 14 | c >>> 18) + d | 0;
68 b += (c & a | d & ~a) + k[8] + 1163531501 | 0;
69 b = (b << 20 | b >>> 12) + c | 0;
70 a += (b & d | c & ~d) + k[13] - 1444681467 | 0;
71 a = (a << 5 | a >>> 27) + b | 0;
72 d += (a & c | b & ~c) + k[2] - 51403784 | 0;
73 d = (d << 9 | d >>> 23) + a | 0;
74 c += (d & b | a & ~b) + k[7] + 1735328473 | 0;
75 c = (c << 14 | c >>> 18) + d | 0;
76 b += (c & a | d & ~a) + k[12] - 1926607734 | 0;
77 b = (b << 20 | b >>> 12) + c | 0;
78 a += (b ^ c ^ d) + k[5] - 378558 | 0;
79 a = (a << 4 | a >>> 28) + b | 0;
80 d += (a ^ b ^ c) + k[8] - 2022574463 | 0;
81 d = (d << 11 | d >>> 21) + a | 0;
82 c += (d ^ a ^ b) + k[11] + 1839030562 | 0;
83 c = (c << 16 | c >>> 16) + d | 0;
84 b += (c ^ d ^ a) + k[14] - 35309556 | 0;
85 b = (b << 23 | b >>> 9) + c | 0;
86 a += (b ^ c ^ d) + k[1] - 1530992060 | 0;
87 a = (a << 4 | a >>> 28) + b | 0;
88 d += (a ^ b ^ c) + k[4] + 1272893353 | 0;
89 d = (d << 11 | d >>> 21) + a | 0;
90 c += (d ^ a ^ b) + k[7] - 155497632 | 0;
91 c = (c << 16 | c >>> 16) + d | 0;
92 b += (c ^ d ^ a) + k[10] - 1094730640 | 0;
93 b = (b << 23 | b >>> 9) + c | 0;
94 a += (b ^ c ^ d) + k[13] + 681279174 | 0;
95 a = (a << 4 | a >>> 28) + b | 0;
96 d += (a ^ b ^ c) + k[0] - 358537222 | 0;
97 d = (d << 11 | d >>> 21) + a | 0;
98 c += (d ^ a ^ b) + k[3] - 722521979 | 0;
99 c = (c << 16 | c >>> 16) + d | 0;
100 b += (c ^ d ^ a) + k[6] + 76029189 | 0;
101 b = (b << 23 | b >>> 9) + c | 0;
102 a += (b ^ c ^ d) + k[9] - 640364487 | 0;
103 a = (a << 4 | a >>> 28) + b | 0;
104 d += (a ^ b ^ c) + k[12] - 421815835 | 0;
105 d = (d << 11 | d >>> 21) + a | 0;
106 c += (d ^ a ^ b) + k[15] + 530742520 | 0;
107 c = (c << 16 | c >>> 16) + d | 0;
108 b += (c ^ d ^ a) + k[2] - 995338651 | 0;
109 b = (b << 23 | b >>> 9) + c | 0;
110 a += (c ^ (b | ~d)) + k[0] - 198630844 | 0;
111 a = (a << 6 | a >>> 26) + b | 0;
112 d += (b ^ (a | ~c)) + k[7] + 1126891415 | 0;
113 d = (d << 10 | d >>> 22) + a | 0;
114 c += (a ^ (d | ~b)) + k[14] - 1416354905 | 0;
115 c = (c << 15 | c >>> 17) + d | 0;
116 b += (d ^ (c | ~a)) + k[5] - 57434055 | 0;
117 b = (b << 21 | b >>> 11) + c | 0;
118 a += (c ^ (b | ~d)) + k[12] + 1700485571 | 0;
119 a = (a << 6 | a >>> 26) + b | 0;
120 d += (b ^ (a | ~c)) + k[3] - 1894986606 | 0;
121 d = (d << 10 | d >>> 22) + a | 0;
122 c += (a ^ (d | ~b)) + k[10] - 1051523 | 0;
123 c = (c << 15 | c >>> 17) + d | 0;
124 b += (d ^ (c | ~a)) + k[1] - 2054922799 | 0;
125 b = (b << 21 | b >>> 11) + c | 0;
126 a += (c ^ (b | ~d)) + k[8] + 1873313359 | 0;
127 a = (a << 6 | a >>> 26) + b | 0;
128 d += (b ^ (a | ~c)) + k[15] - 30611744 | 0;
129 d = (d << 10 | d >>> 22) + a | 0;
130 c += (a ^ (d | ~b)) + k[6] - 1560198380 | 0;
131 c = (c << 15 | c >>> 17) + d | 0;
132 b += (d ^ (c | ~a)) + k[13] + 1309151649 | 0;
133 b = (b << 21 | b >>> 11) + c | 0;
134 a += (c ^ (b | ~d)) + k[4] - 145523070 | 0;
135 a = (a << 6 | a >>> 26) + b | 0;
136 d += (b ^ (a | ~c)) + k[11] - 1120210379 | 0;
137 d = (d << 10 | d >>> 22) + a | 0;
138 c += (a ^ (d | ~b)) + k[2] + 718787259 | 0;
139 c = (c << 15 | c >>> 17) + d | 0;
140 b += (d ^ (c | ~a)) + k[9] - 343485551 | 0;
141 b = (b << 21 | b >>> 11) + c | 0;
142 x[0] = a + x[0] | 0;
143 x[1] = b + x[1] | 0;
144 x[2] = c + x[2] | 0;
145 x[3] = d + x[3] | 0;
146 }
147 function md5blk(s) {
148 var md5blks = [], i;
149 for (i = 0; i < 64; i += 4) {
150 md5blks[i >> 2] = s.charCodeAt(i) + (s.charCodeAt(i + 1) << 8) + (s.charCodeAt(i + 2) << 16) + (s.charCodeAt(i + 3) << 24);
151 }
152 return md5blks;
153 }
154 function md5blk_array(a) {
155 var md5blks = [], i;
156 for (i = 0; i < 64; i += 4) {
157 md5blks[i >> 2] = a[i] + (a[i + 1] << 8) + (a[i + 2] << 16) + (a[i + 3] << 24);
158 }
159 return md5blks;
160 }
161 function md51(s) {
162 var n = s.length, state = [ 1732584193, -271733879, -1732584194, 271733878 ], i, length, tail, tmp, lo, hi;
163 for (i = 64; i <= n; i += 64) {
164 md5cycle(state, md5blk(s.substring(i - 64, i)));
165 }
166 s = s.substring(i - 64);
167 length = s.length;
168 tail = [ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 ];
169 for (i = 0; i < length; i += 1) {
170 tail[i >> 2] |= s.charCodeAt(i) << (i % 4 << 3);
171 }
172 tail[i >> 2] |= 128 << (i % 4 << 3);
173 if (i > 55) {
174 md5cycle(state, tail);
175 for (i = 0; i < 16; i += 1) {
176 tail[i] = 0;
177 }
178 }
179 tmp = n * 8;
180 tmp = tmp.toString(16).match(/(.*?)(.{0,8})$/);
181 lo = parseInt(tmp[2], 16);
182 hi = parseInt(tmp[1], 16) || 0;
183 tail[14] = lo;
184 tail[15] = hi;
185 md5cycle(state, tail);
186 return state;
187 }
188 function md51_array(a) {
189 var n = a.length, state = [ 1732584193, -271733879, -1732584194, 271733878 ], i, length, tail, tmp, lo, hi;
190 for (i = 64; i <= n; i += 64) {
191 md5cycle(state, md5blk_array(a.subarray(i - 64, i)));
192 }
193 a = i - 64 < n ? a.subarray(i - 64) : new Uint8Array(0);
194 length = a.length;
195 tail = [ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 ];
196 for (i = 0; i < length; i += 1) {
197 tail[i >> 2] |= a[i] << (i % 4 << 3);
198 }
199 tail[i >> 2] |= 128 << (i % 4 << 3);
200 if (i > 55) {
201 md5cycle(state, tail);
202 for (i = 0; i < 16; i += 1) {
203 tail[i] = 0;
204 }
205 }
206 tmp = n * 8;
207 tmp = tmp.toString(16).match(/(.*?)(.{0,8})$/);
208 lo = parseInt(tmp[2], 16);
209 hi = parseInt(tmp[1], 16) || 0;
210 tail[14] = lo;
211 tail[15] = hi;
212 md5cycle(state, tail);
213 return state;
214 }
215 function rhex(n) {
216 var s = "", j;
217 for (j = 0; j < 4; j += 1) {
218 s += hex_chr[n >> j * 8 + 4 & 15] + hex_chr[n >> j * 8 & 15];
219 }
220 return s;
221 }
222 function hex(x) {
223 var i;
224 for (i = 0; i < x.length; i += 1) {
225 x[i] = rhex(x[i]);
226 }
227 return x.join("");
228 }
229 if (hex(md51("hello")) !== "5d41402abc4b2a76b9719d911017c592") ;
230 if (typeof ArrayBuffer !== "undefined" && !ArrayBuffer.prototype.slice) {
231 (function() {
232 function clamp(val, length) {
233 val = val | 0 || 0;
234 if (val < 0) {
235 return Math.max(val + length, 0);
236 }
237 return Math.min(val, length);
238 }
239 ArrayBuffer.prototype.slice = function(from, to) {
240 var length = this.byteLength, begin = clamp(from, length), end = length, num, target, targetArray, sourceArray;
241 if (to !== undefined$1) {
242 end = clamp(to, length);
243 }
244 if (begin > end) {
245 return new ArrayBuffer(0);
246 }
247 num = end - begin;
248 target = new ArrayBuffer(num);
249 targetArray = new Uint8Array(target);
250 sourceArray = new Uint8Array(this, begin, num);
251 targetArray.set(sourceArray);
252 return target;
253 };
254 })();
255 }
256 function toUtf8(str) {
257 if (/[\u0080-\uFFFF]/.test(str)) {
258 str = unescape(encodeURIComponent(str));
259 }
260 return str;
261 }
262 function utf8Str2ArrayBuffer(str, returnUInt8Array) {
263 var length = str.length, buff = new ArrayBuffer(length), arr = new Uint8Array(buff), i;
264 for (i = 0; i < length; i += 1) {
265 arr[i] = str.charCodeAt(i);
266 }
267 return returnUInt8Array ? arr : buff;
268 }
269 function arrayBuffer2Utf8Str(buff) {
270 return String.fromCharCode.apply(null, new Uint8Array(buff));
271 }
272 function concatenateArrayBuffers(first, second, returnUInt8Array) {
273 var result = new Uint8Array(first.byteLength + second.byteLength);
274 result.set(new Uint8Array(first));
275 result.set(new Uint8Array(second), first.byteLength);
276 return returnUInt8Array ? result : result.buffer;
277 }
278 function hexToBinaryString(hex) {
279 var bytes = [], length = hex.length, x;
280 for (x = 0; x < length - 1; x += 2) {
281 bytes.push(parseInt(hex.substr(x, 2), 16));
282 }
283 return String.fromCharCode.apply(String, bytes);
284 }
285 function SparkMD5() {
286 this.reset();
287 }
288 SparkMD5.prototype.append = function(str) {
289 this.appendBinary(toUtf8(str));
290 return this;
291 };
292 SparkMD5.prototype.appendBinary = function(contents) {
293 this._buff += contents;
294 this._length += contents.length;
295 var length = this._buff.length, i;
296 for (i = 64; i <= length; i += 64) {
297 md5cycle(this._hash, md5blk(this._buff.substring(i - 64, i)));
298 }
299 this._buff = this._buff.substring(i - 64);
300 return this;
301 };
302 SparkMD5.prototype.end = function(raw) {
303 var buff = this._buff, length = buff.length, i, tail = [ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 ], ret;
304 for (i = 0; i < length; i += 1) {
305 tail[i >> 2] |= buff.charCodeAt(i) << (i % 4 << 3);
306 }
307 this._finish(tail, length);
308 ret = hex(this._hash);
309 if (raw) {
310 ret = hexToBinaryString(ret);
311 }
312 this.reset();
313 return ret;
314 };
315 SparkMD5.prototype.reset = function() {
316 this._buff = "";
317 this._length = 0;
318 this._hash = [ 1732584193, -271733879, -1732584194, 271733878 ];
319 return this;
320 };
321 SparkMD5.prototype.getState = function() {
322 return {
323 buff: this._buff,
324 length: this._length,
325 hash: this._hash.slice()
326 };
327 };
328 SparkMD5.prototype.setState = function(state) {
329 this._buff = state.buff;
330 this._length = state.length;
331 this._hash = state.hash;
332 return this;
333 };
334 SparkMD5.prototype.destroy = function() {
335 delete this._hash;
336 delete this._buff;
337 delete this._length;
338 };
339 SparkMD5.prototype._finish = function(tail, length) {
340 var i = length, tmp, lo, hi;
341 tail[i >> 2] |= 128 << (i % 4 << 3);
342 if (i > 55) {
343 md5cycle(this._hash, tail);
344 for (i = 0; i < 16; i += 1) {
345 tail[i] = 0;
346 }
347 }
348 tmp = this._length * 8;
349 tmp = tmp.toString(16).match(/(.*?)(.{0,8})$/);
350 lo = parseInt(tmp[2], 16);
351 hi = parseInt(tmp[1], 16) || 0;
352 tail[14] = lo;
353 tail[15] = hi;
354 md5cycle(this._hash, tail);
355 };
356 SparkMD5.hash = function(str, raw) {
357 return SparkMD5.hashBinary(toUtf8(str), raw);
358 };
359 SparkMD5.hashBinary = function(content, raw) {
360 var hash = md51(content), ret = hex(hash);
361 return raw ? hexToBinaryString(ret) : ret;
362 };
363 SparkMD5.ArrayBuffer = function() {
364 this.reset();
365 };
366 SparkMD5.ArrayBuffer.prototype.append = function(arr) {
367 var buff = concatenateArrayBuffers(this._buff.buffer, arr, true), length = buff.length, i;
368 this._length += arr.byteLength;
369 for (i = 64; i <= length; i += 64) {
370 md5cycle(this._hash, md5blk_array(buff.subarray(i - 64, i)));
371 }
372 this._buff = i - 64 < length ? new Uint8Array(buff.buffer.slice(i - 64)) : new Uint8Array(0);
373 return this;
374 };
375 SparkMD5.ArrayBuffer.prototype.end = function(raw) {
376 var buff = this._buff, length = buff.length, tail = [ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 ], i, ret;
377 for (i = 0; i < length; i += 1) {
378 tail[i >> 2] |= buff[i] << (i % 4 << 3);
379 }
380 this._finish(tail, length);
381 ret = hex(this._hash);
382 if (raw) {
383 ret = hexToBinaryString(ret);
384 }
385 this.reset();
386 return ret;
387 };
388 SparkMD5.ArrayBuffer.prototype.reset = function() {
389 this._buff = new Uint8Array(0);
390 this._length = 0;
391 this._hash = [ 1732584193, -271733879, -1732584194, 271733878 ];
392 return this;
393 };
394 SparkMD5.ArrayBuffer.prototype.getState = function() {
395 var state = SparkMD5.prototype.getState.call(this);
396 state.buff = arrayBuffer2Utf8Str(state.buff);
397 return state;
398 };
399 SparkMD5.ArrayBuffer.prototype.setState = function(state) {
400 state.buff = utf8Str2ArrayBuffer(state.buff, true);
401 return SparkMD5.prototype.setState.call(this, state);
402 };
403 SparkMD5.ArrayBuffer.prototype.destroy = SparkMD5.prototype.destroy;
404 SparkMD5.ArrayBuffer.prototype._finish = SparkMD5.prototype._finish;
405 SparkMD5.ArrayBuffer.hash = function(arr, raw) {
406 var hash = md51_array(new Uint8Array(arr)), ret = hex(hash);
407 return raw ? hexToBinaryString(ret) : ret;
408 };
409 return SparkMD5;
410 }));
411})(sparkMd5);
412
413var SparkMD5 = sparkMd5.exports;
414
415const fileSlice = File.prototype.slice || File.prototype.mozSlice || File.prototype.webkitSlice;
416
417class FileChecksum {
418 static create(file, callback) {
419 const instance = new FileChecksum(file);
420 instance.create(callback);
421 }
422 constructor(file) {
423 this.file = file;
424 this.chunkSize = 2097152;
425 this.chunkCount = Math.ceil(this.file.size / this.chunkSize);
426 this.chunkIndex = 0;
427 }
428 create(callback) {
429 this.callback = callback;
430 this.md5Buffer = new SparkMD5.ArrayBuffer;
431 this.fileReader = new FileReader;
432 this.fileReader.addEventListener("load", (event => this.fileReaderDidLoad(event)));
433 this.fileReader.addEventListener("error", (event => this.fileReaderDidError(event)));
434 this.readNextChunk();
435 }
436 fileReaderDidLoad(event) {
437 this.md5Buffer.append(event.target.result);
438 if (!this.readNextChunk()) {
439 const binaryDigest = this.md5Buffer.end(true);
440 const base64digest = btoa(binaryDigest);
441 this.callback(null, base64digest);
442 }
443 }
444 fileReaderDidError(event) {
445 this.callback(`Error reading ${this.file.name}`);
446 }
447 readNextChunk() {
448 if (this.chunkIndex < this.chunkCount || this.chunkIndex == 0 && this.chunkCount == 0) {
449 const start = this.chunkIndex * this.chunkSize;
450 const end = Math.min(start + this.chunkSize, this.file.size);
451 const bytes = fileSlice.call(this.file, start, end);
452 this.fileReader.readAsArrayBuffer(bytes);
453 this.chunkIndex++;
454 return true;
455 } else {
456 return false;
457 }
458 }
459}
460
461function getMetaValue(name) {
462 const element = findElement(document.head, `meta[name="${name}"]`);
463 if (element) {
464 return element.getAttribute("content");
465 }
466}
467
468function findElements(root, selector) {
469 if (typeof root == "string") {
470 selector = root;
471 root = document;
472 }
473 const elements = root.querySelectorAll(selector);
474 return toArray(elements);
475}
476
477function findElement(root, selector) {
478 if (typeof root == "string") {
479 selector = root;
480 root = document;
481 }
482 return root.querySelector(selector);
483}
484
485function dispatchEvent(element, type, eventInit = {}) {
486 const {disabled: disabled} = element;
487 const {bubbles: bubbles, cancelable: cancelable, detail: detail} = eventInit;
488 const event = document.createEvent("Event");
489 event.initEvent(type, bubbles || true, cancelable || true);
490 event.detail = detail || {};
491 try {
492 element.disabled = false;
493 element.dispatchEvent(event);
494 } finally {
495 element.disabled = disabled;
496 }
497 return event;
498}
499
500function toArray(value) {
501 if (Array.isArray(value)) {
502 return value;
503 } else if (Array.from) {
504 return Array.from(value);
505 } else {
506 return [].slice.call(value);
507 }
508}
509
510class BlobRecord {
511 constructor(file, checksum, url, customHeaders = {}) {
512 this.file = file;
513 this.attributes = {
514 filename: file.name,
515 content_type: file.type || "application/octet-stream",
516 byte_size: file.size,
517 checksum: checksum
518 };
519 this.xhr = new XMLHttpRequest;
520 this.xhr.open("POST", url, true);
521 this.xhr.responseType = "json";
522 this.xhr.setRequestHeader("Content-Type", "application/json");
523 this.xhr.setRequestHeader("Accept", "application/json");
524 this.xhr.setRequestHeader("X-Requested-With", "XMLHttpRequest");
525 Object.keys(customHeaders).forEach((headerKey => {
526 this.xhr.setRequestHeader(headerKey, customHeaders[headerKey]);
527 }));
528 const csrfToken = getMetaValue("csrf-token");
529 if (csrfToken != undefined) {
530 this.xhr.setRequestHeader("X-CSRF-Token", csrfToken);
531 }
532 this.xhr.addEventListener("load", (event => this.requestDidLoad(event)));
533 this.xhr.addEventListener("error", (event => this.requestDidError(event)));
534 }
535 get status() {
536 return this.xhr.status;
537 }
538 get response() {
539 const {responseType: responseType, response: response} = this.xhr;
540 if (responseType == "json") {
541 return response;
542 } else {
543 return JSON.parse(response);
544 }
545 }
546 create(callback) {
547 this.callback = callback;
548 this.xhr.send(JSON.stringify({
549 blob: this.attributes
550 }));
551 }
552 requestDidLoad(event) {
553 if (this.status >= 200 && this.status < 300) {
554 const {response: response} = this;
555 const {direct_upload: direct_upload} = response;
556 delete response.direct_upload;
557 this.attributes = response;
558 this.directUploadData = direct_upload;
559 this.callback(null, this.toJSON());
560 } else {
561 this.requestDidError(event);
562 }
563 }
564 requestDidError(event) {
565 this.callback(`Error creating Blob for "${this.file.name}". Status: ${this.status}`);
566 }
567 toJSON() {
568 const result = {};
569 for (const key in this.attributes) {
570 result[key] = this.attributes[key];
571 }
572 return result;
573 }
574}
575
576class BlobUpload {
577 constructor(blob) {
578 this.blob = blob;
579 this.file = blob.file;
580 const {url: url, headers: headers} = blob.directUploadData;
581 this.xhr = new XMLHttpRequest;
582 this.xhr.open("PUT", url, true);
583 this.xhr.responseType = "text";
584 for (const key in headers) {
585 this.xhr.setRequestHeader(key, headers[key]);
586 }
587 this.xhr.addEventListener("load", (event => this.requestDidLoad(event)));
588 this.xhr.addEventListener("error", (event => this.requestDidError(event)));
589 }
590 create(callback) {
591 this.callback = callback;
592 this.xhr.send(this.file.slice());
593 }
594 requestDidLoad(event) {
595 const {status: status, response: response} = this.xhr;
596 if (status >= 200 && status < 300) {
597 this.callback(null, response);
598 } else {
599 this.requestDidError(event);
600 }
601 }
602 requestDidError(event) {
603 this.callback(`Error storing "${this.file.name}". Status: ${this.xhr.status}`);
604 }
605}
606
607let id = 0;
608
609class DirectUpload {
610 constructor(file, url, delegate, customHeaders = {}) {
611 this.id = ++id;
612 this.file = file;
613 this.url = url;
614 this.delegate = delegate;
615 this.customHeaders = customHeaders;
616 }
617 create(callback) {
618 FileChecksum.create(this.file, ((error, checksum) => {
619 if (error) {
620 callback(error);
621 return;
622 }
623 const blob = new BlobRecord(this.file, checksum, this.url, this.customHeaders);
624 notify(this.delegate, "directUploadWillCreateBlobWithXHR", blob.xhr);
625 blob.create((error => {
626 if (error) {
627 callback(error);
628 } else {
629 const upload = new BlobUpload(blob);
630 notify(this.delegate, "directUploadWillStoreFileWithXHR", upload.xhr);
631 upload.create((error => {
632 if (error) {
633 callback(error);
634 } else {
635 callback(null, blob.toJSON());
636 }
637 }));
638 }
639 }));
640 }));
641 }
642}
643
644function notify(object, methodName, ...messages) {
645 if (object && typeof object[methodName] == "function") {
646 return object[methodName](...messages);
647 }
648}
649
650class DirectUploadController {
651 constructor(input, file) {
652 this.input = input;
653 this.file = file;
654 this.directUpload = new DirectUpload(this.file, this.url, this);
655 this.dispatch("initialize");
656 }
657 start(callback) {
658 const hiddenInput = document.createElement("input");
659 hiddenInput.type = "hidden";
660 hiddenInput.name = this.input.name;
661 this.input.insertAdjacentElement("beforebegin", hiddenInput);
662 this.dispatch("start");
663 this.directUpload.create(((error, attributes) => {
664 if (error) {
665 hiddenInput.parentNode.removeChild(hiddenInput);
666 this.dispatchError(error);
667 } else {
668 hiddenInput.value = attributes.signed_id;
669 }
670 this.dispatch("end");
671 callback(error);
672 }));
673 }
674 uploadRequestDidProgress(event) {
675 const progress = event.loaded / event.total * 100;
676 if (progress) {
677 this.dispatch("progress", {
678 progress: progress
679 });
680 }
681 }
682 get url() {
683 return this.input.getAttribute("data-direct-upload-url");
684 }
685 dispatch(name, detail = {}) {
686 detail.file = this.file;
687 detail.id = this.directUpload.id;
688 return dispatchEvent(this.input, `direct-upload:${name}`, {
689 detail: detail
690 });
691 }
692 dispatchError(error) {
693 const event = this.dispatch("error", {
694 error: error
695 });
696 if (!event.defaultPrevented) {
697 alert(error);
698 }
699 }
700 directUploadWillCreateBlobWithXHR(xhr) {
701 this.dispatch("before-blob-request", {
702 xhr: xhr
703 });
704 }
705 directUploadWillStoreFileWithXHR(xhr) {
706 this.dispatch("before-storage-request", {
707 xhr: xhr
708 });
709 xhr.upload.addEventListener("progress", (event => this.uploadRequestDidProgress(event)));
710 }
711}
712
713const inputSelector = "input[type=file][data-direct-upload-url]:not([disabled])";
714
715class DirectUploadsController {
716 constructor(form) {
717 this.form = form;
718 this.inputs = findElements(form, inputSelector).filter((input => input.files.length));
719 }
720 start(callback) {
721 const controllers = this.createDirectUploadControllers();
722 const startNextController = () => {
723 const controller = controllers.shift();
724 if (controller) {
725 controller.start((error => {
726 if (error) {
727 callback(error);
728 this.dispatch("end");
729 } else {
730 startNextController();
731 }
732 }));
733 } else {
734 callback();
735 this.dispatch("end");
736 }
737 };
738 this.dispatch("start");
739 startNextController();
740 }
741 createDirectUploadControllers() {
742 const controllers = [];
743 this.inputs.forEach((input => {
744 toArray(input.files).forEach((file => {
745 const controller = new DirectUploadController(input, file);
746 controllers.push(controller);
747 }));
748 }));
749 return controllers;
750 }
751 dispatch(name, detail = {}) {
752 return dispatchEvent(this.form, `direct-uploads:${name}`, {
753 detail: detail
754 });
755 }
756}
757
758const processingAttribute = "data-direct-uploads-processing";
759
760const submitButtonsByForm = new WeakMap;
761
762let started = false;
763
764function start() {
765 if (!started) {
766 started = true;
767 document.addEventListener("click", didClick, true);
768 document.addEventListener("submit", didSubmitForm, true);
769 document.addEventListener("ajax:before", didSubmitRemoteElement);
770 }
771}
772
773function didClick(event) {
774 const button = event.target.closest("button, input");
775 if (button && button.type === "submit" && button.form) {
776 submitButtonsByForm.set(button.form, button);
777 }
778}
779
780function didSubmitForm(event) {
781 handleFormSubmissionEvent(event);
782}
783
784function didSubmitRemoteElement(event) {
785 if (event.target.tagName == "FORM") {
786 handleFormSubmissionEvent(event);
787 }
788}
789
790function handleFormSubmissionEvent(event) {
791 const form = event.target;
792 if (form.hasAttribute(processingAttribute)) {
793 event.preventDefault();
794 return;
795 }
796 const controller = new DirectUploadsController(form);
797 const {inputs: inputs} = controller;
798 if (inputs.length) {
799 event.preventDefault();
800 form.setAttribute(processingAttribute, "");
801 inputs.forEach(disable);
802 controller.start((error => {
803 form.removeAttribute(processingAttribute);
804 if (error) {
805 inputs.forEach(enable);
806 } else {
807 submitForm(form);
808 }
809 }));
810 }
811}
812
813function submitForm(form) {
814 let button = submitButtonsByForm.get(form) || findElement(form, "input[type=submit], button[type=submit]");
815 if (button) {
816 const {disabled: disabled} = button;
817 button.disabled = false;
818 button.focus();
819 button.click();
820 button.disabled = disabled;
821 } else {
822 button = document.createElement("input");
823 button.type = "submit";
824 button.style.display = "none";
825 form.appendChild(button);
826 button.click();
827 form.removeChild(button);
828 }
829 submitButtonsByForm.delete(form);
830}
831
832function disable(input) {
833 input.disabled = true;
834}
835
836function enable(input) {
837 input.disabled = false;
838}
839
840function autostart() {
841 if (window.ActiveStorage) {
842 start();
843 }
844}
845
846setTimeout(autostart, 1);
847
848class AttachmentUpload {
849 constructor(attachment, element) {
850 this.attachment = attachment;
851 this.element = element;
852 this.directUpload = new DirectUpload(attachment.file, this.directUploadUrl, this);
853 }
854 start() {
855 this.directUpload.create(this.directUploadDidComplete.bind(this));
856 }
857 directUploadWillStoreFileWithXHR(xhr) {
858 xhr.upload.addEventListener("progress", (event => {
859 const progress = event.loaded / event.total * 100;
860 this.attachment.setUploadProgress(progress);
861 }));
862 }
863 directUploadDidComplete(error, attributes) {
864 if (error) {
865 throw new Error(`Direct upload failed: ${error}`);
866 }
867 this.attachment.setAttributes({
868 sgid: attributes.attachable_sgid,
869 url: this.createBlobUrl(attributes.signed_id, attributes.filename)
870 });
871 }
872 createBlobUrl(signedId, filename) {
873 return this.blobUrlTemplate.replace(":signed_id", signedId).replace(":filename", encodeURIComponent(filename));
874 }
875 get directUploadUrl() {
876 return this.element.dataset.directUploadUrl;
877 }
878 get blobUrlTemplate() {
879 return this.element.dataset.blobUrlTemplate;
880 }
881}
882
883addEventListener("trix-attachment-add", (event => {
884 const {attachment: attachment, target: target} = event;
885 if (attachment.file) {
886 const upload = new AttachmentUpload(attachment, target);
887 upload.start();
888 }
889}));