File size: 1,576 Bytes
7aec436
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
import {readAsArrayBuffer} from '../common/readers';
import request from '../common/request';
import { AbortError } from '../common/errors';

const downloadProject = async (buffer, progressCallback) => {
  const controller = typeof AbortController === 'function' && new AbortController();
  const downloadProject = await import(/* webpackChunkName: "downloader" */ './download-project.js');
  let reject;
  return {
    promise: new Promise((_resolve, _reject) => {
      reject = _reject;

      downloadProject.downloadProject(buffer, progressCallback, controller && controller.signal)
        .then(result => _resolve(result))
        .catch(err => _reject(err));
    }),

    terminate: () => {
      reject(new AbortError());
      if (controller) {
        controller.abort();
      }
    }
  };
};

const fromURL = async (url, progressCallback) => {
  const buffer = await request({
    url,
    type: 'arraybuffer',
    progressCallback: (progress) => {
      progressCallback('fetch', progress);
    }
  });
  return downloadProject(buffer, progressCallback);
};

const fromID = (id, token, progressCallback) => {
  const tokenPart = token ? `?token=${token}` : '';
  const url = `https://projects.penguinmod.com/api/projects/getPublished?type=file&id=${id}`;
  return fromURL(url, progressCallback);
};

const fromFile = async (file, progressCallback) => {
  const buffer = await readAsArrayBuffer(file);
  return downloadProject(buffer, progressCallback);
};

export default {
  fromID,
  fromURL,
  fromFile
};