|
(function(modules) { |
|
|
|
var installedModules = {}; |
|
|
|
|
|
function __webpack_require__(moduleId) { |
|
|
|
|
|
if(installedModules[moduleId]) { |
|
return installedModules[moduleId].exports; |
|
} |
|
|
|
var module = installedModules[moduleId] = { |
|
i: moduleId, |
|
l: false, |
|
exports: {} |
|
}; |
|
|
|
|
|
modules[moduleId].call(module.exports, module, module.exports, __webpack_require__); |
|
|
|
|
|
module.l = true; |
|
|
|
|
|
return module.exports; |
|
} |
|
|
|
|
|
|
|
__webpack_require__.m = modules; |
|
|
|
|
|
__webpack_require__.c = installedModules; |
|
|
|
|
|
__webpack_require__.d = function(exports, name, getter) { |
|
if(!__webpack_require__.o(exports, name)) { |
|
Object.defineProperty(exports, name, { enumerable: true, get: getter }); |
|
} |
|
}; |
|
|
|
|
|
__webpack_require__.r = function(exports) { |
|
if(typeof Symbol !== 'undefined' && Symbol.toStringTag) { |
|
Object.defineProperty(exports, Symbol.toStringTag, { value: 'Module' }); |
|
} |
|
Object.defineProperty(exports, '__esModule', { value: true }); |
|
}; |
|
|
|
|
|
|
|
|
|
|
|
|
|
__webpack_require__.t = function(value, mode) { |
|
if(mode & 1) value = __webpack_require__(value); |
|
if(mode & 8) return value; |
|
if((mode & 4) && typeof value === 'object' && value && value.__esModule) return value; |
|
var ns = Object.create(null); |
|
__webpack_require__.r(ns); |
|
Object.defineProperty(ns, 'default', { enumerable: true, value: value }); |
|
if(mode & 2 && typeof value != 'string') for(var key in value) __webpack_require__.d(ns, key, function(key) { return value[key]; }.bind(null, key)); |
|
return ns; |
|
}; |
|
|
|
|
|
__webpack_require__.n = function(module) { |
|
var getter = module && module.__esModule ? |
|
function getDefault() { return module['default']; } : |
|
function getModuleExports() { return module; }; |
|
__webpack_require__.d(getter, 'a', getter); |
|
return getter; |
|
}; |
|
|
|
|
|
__webpack_require__.o = function(object, property) { return Object.prototype.hasOwnProperty.call(object, property); }; |
|
|
|
|
|
__webpack_require__.p = ""; |
|
|
|
|
|
|
|
return __webpack_require__(__webpack_require__.s = "./node_modules/babel-loader/lib/index.js?!./node_modules/scratch-storage/src/FetchWorkerTool.worker.js"); |
|
}) |
|
|
|
({ |
|
|
|
"./node_modules/babel-loader/lib/index.js?!./node_modules/scratch-storage/src/FetchWorkerTool.worker.js": |
|
|
|
|
|
|
|
|
|
(function(module, exports, __webpack_require__) { |
|
|
|
|
|
|
|
const saferFetchAsArrayBuffer = __webpack_require__( "./node_modules/scratch-storage/src/safer-fetch.js"); |
|
const complete = []; |
|
let timeoutId = null; |
|
const checkCompleted = () => { |
|
if (timeoutId) return; |
|
timeoutId = setTimeout(() => { |
|
timeoutId = null; |
|
if (complete.length) { |
|
|
|
|
|
postMessage(complete.slice(), |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
complete.map(response => response.buffer).filter(Boolean)); |
|
complete.length = 0; |
|
} |
|
}); |
|
}; |
|
|
|
|
|
|
|
|
|
|
|
const onMessage = _ref => { |
|
let { |
|
data: job |
|
} = _ref; |
|
saferFetchAsArrayBuffer(job.url, job.options).then(buffer => complete.push({ |
|
id: job.id, |
|
buffer |
|
})).catch(error => complete.push({ |
|
id: job.id, |
|
error: error && error.message || "Failed request: ".concat(job.url) |
|
})).then(checkCompleted); |
|
}; |
|
if (self.fetch) { |
|
postMessage({ |
|
support: { |
|
fetch: true |
|
} |
|
}); |
|
self.addEventListener('message', onMessage); |
|
} else { |
|
postMessage({ |
|
support: { |
|
fetch: false |
|
} |
|
}); |
|
self.addEventListener('message', _ref2 => { |
|
let { |
|
data: job |
|
} = _ref2; |
|
postMessage([{ |
|
id: job.id, |
|
error: 'fetch is unavailable' |
|
}]); |
|
}); |
|
} |
|
|
|
}), |
|
|
|
"./node_modules/scratch-storage/src/safer-fetch.js": |
|
|
|
|
|
|
|
|
|
(function(module, exports) { |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
let currentFetches = 0; |
|
const queue = []; |
|
const startNextFetch = _ref => { |
|
let [resolve, url, options] = _ref; |
|
let firstError; |
|
let failedAttempts = 0; |
|
const attemptToFetch = () => fetch(url, options).then(result => { |
|
|
|
|
|
|
|
if (result.ok || result.status === 0) return result.arrayBuffer(); |
|
if (result.status === 404) return null; |
|
return Promise.reject(result.status); |
|
}).then(buffer => { |
|
currentFetches--; |
|
checkStartNextFetch(); |
|
return buffer; |
|
}).catch(error => { |
|
if (error === 403) { |
|
|
|
throw error; |
|
} |
|
console.warn("Attempt to fetch ".concat(url, " failed"), error); |
|
if (!firstError) { |
|
firstError = error; |
|
} |
|
if (failedAttempts < 2) { |
|
failedAttempts++; |
|
return new Promise(cb => setTimeout(cb, (failedAttempts + Math.random() - 1) * 5000)).then(attemptToFetch); |
|
} |
|
currentFetches--; |
|
checkStartNextFetch(); |
|
throw firstError; |
|
}); |
|
return resolve(attemptToFetch()); |
|
}; |
|
const checkStartNextFetch = () => { |
|
if (currentFetches < 100 && queue.length > 0) { |
|
currentFetches++; |
|
startNextFetch(queue.shift()); |
|
} |
|
}; |
|
const saferFetchAsArrayBuffer = (url, options) => new Promise(resolve => { |
|
queue.push([resolve, url, options]); |
|
checkStartNextFetch(); |
|
}); |
|
module.exports = saferFetchAsArrayBuffer; |
|
|
|
}) |
|
|
|
}); |
|
|