summaryrefslogtreecommitdiff
path: root/www/external/screwdriver.js
diff options
context:
space:
mode:
Diffstat (limited to 'www/external/screwdriver.js')
-rw-r--r--www/external/screwdriver.js151
1 files changed, 151 insertions, 0 deletions
diff --git a/www/external/screwdriver.js b/www/external/screwdriver.js
new file mode 100644
index 00000000..c6733776
--- /dev/null
+++ b/www/external/screwdriver.js
@@ -0,0 +1,151 @@
+;(function() {
+
+ if(typeof Blob === 'undefined')
+ return console.warn('Screw-FileReader is only meant to work in those' +
+ 'engine who already has some basic support for blob')
+
+ var blob = Blob.prototype
+ var fullStreamSupport = false
+ var basicStreamSupport = false
+ var fetchTransform = false
+ var URL = window.URL || window.webkitURL
+
+ function promisify(obj) {
+ return new Promise(function(resolve, reject) {
+ obj.onload =
+ obj.onerror = function(evt) {
+ obj.onload =
+ obj.onerror = null
+
+ evt.type === 'load'
+ ? resolve(obj.result || obj)
+ : reject(obj.error)
+ }
+ })
+ }
+
+ function toImage(url) {
+ var img = new Image
+ img.src = url
+ return promisify(img)
+ }
+
+ try {
+ new ReadableStream({})
+ basicStreamSupport = true
+ } catch (e) {}
+
+ try {
+ new ReadableStream({type: 'bytes'})
+ fullStreamSupport = true
+ } catch (e) {}
+
+ try {
+ (new Response(new Blob)).getReader()
+ fetchTransform = true
+ } catch (e) {}
+
+ if(!blob.arrayBuffer) {
+ blob.arrayBuffer = function arrayBuffer() {
+ var fr = new FileReader
+ fr.readAsArrayBuffer(this)
+ return promisify(fr)
+ }
+ }
+
+ if(!blob.text) {
+ blob.text = function text() {
+ var fr = new FileReader
+ fr.readAsText(this)
+ return promisify(fr)
+ }
+ }
+
+ if(!blob.dataURL) {
+ blob.dataURL = function dataURL() {
+ var fr = new FileReader
+ fr.readAsDataURL(this)
+ return promisify(fr)
+ }
+ }
+
+ if(!blob.url) {
+ blob.url = function url() {
+ return URL ? URL.createObjectURL(this) : null
+ }
+ }
+
+ if(!blob.json) {
+ blob.json = function json() {
+ return this.text().then(JSON.parse)
+ }
+ }
+
+ if(!blob.image) {
+ blob.image = function image() {
+ return Promise.resolve(this.url() || this.dataURL()).then(toImage)
+ }
+ }
+
+ if(!blob.stream) {
+ blob.stream =
+
+ fullStreamSupport ? function stream() {
+ var position = 0
+ var blob = this
+
+ return new ReadableStream({
+ type: 'bytes',
+ autoAllocateChunkSize: 524288,
+
+ pull: function (controller) {
+ var v = controller.byobRequest.view
+ var chunk = blob.slice(position, position + v.byteLength)
+ return chunk.arrayBuffer()
+ .then(function (buffer) {
+ let uint8array = new Uint8Array(buffer)
+ let bytesRead = uint8array.byteLength
+
+ position += bytesRead
+ v.set(uint8array)
+ controller.byobRequest.respond(bytesRead)
+
+ if(position >= blob.size)
+ controller.close()
+ })
+ }
+ })
+ }:
+
+ // basic stream support
+ basicStreamSupport ? function stream(blob){
+ var position = 0
+ var blob = this
+
+ return new ReadableStream({
+ pull: function (controller) {
+ var chunk = blob.slice(position, position + 524288)
+
+ return chunk.arrayBuffer().then(function (buffer) {
+ position += buffer.byteLength
+ let uint8array = new Uint8Array(buffer)
+ controller.enqueue(uint8array)
+
+ if(position == blob.size)
+ controller.close()
+ })
+ }
+ })
+ }:
+
+ // fetchTransform
+ fetchTransform ? function stream() {
+ return (new Response(this)).body
+ }:
+
+ function stream() {
+ throw new Error('Include https://github.com/creatorrr/web-streams-polyfill')
+ }
+ }
+
+}());