Added File and JSON Dish types and updated types for compression ops.

This commit is contained in:
n1474335 2018-04-21 13:41:42 +01:00
parent 76a066ab74
commit a8aa1bc5e8
9 changed files with 94 additions and 59 deletions

View File

@ -54,6 +54,10 @@ class Dish {
case "bignumber": case "bignumber":
case "big number": case "big number":
return Dish.BIG_NUMBER; return Dish.BIG_NUMBER;
case "json":
return Dish.JSON;
case "file":
return Dish.FILE;
case "list<file>": case "list<file>":
return Dish.LIST_FILE; return Dish.LIST_FILE;
default: default:
@ -82,6 +86,10 @@ class Dish {
return "ArrayBuffer"; return "ArrayBuffer";
case Dish.BIG_NUMBER: case Dish.BIG_NUMBER:
return "BigNumber"; return "BigNumber";
case Dish.JSON:
return "JSON";
case Dish.FILE:
return "File";
case Dish.LIST_FILE: case Dish.LIST_FILE:
return "List<File>"; return "List<File>";
default: default:
@ -160,6 +168,13 @@ class Dish {
case Dish.BIG_NUMBER: case Dish.BIG_NUMBER:
this.value = this.value instanceof BigNumber ? Utils.strToByteArray(this.value.toFixed()) : []; this.value = this.value instanceof BigNumber ? Utils.strToByteArray(this.value.toFixed()) : [];
break; break;
case Dish.JSON:
this.value = this.value ? Utils.strToByteArray(JSON.stringify(this.value)) : [];
break;
case Dish.FILE:
this.value = await Utils.readFile(this.value);
this.value = Array.prototype.slice.call(this.value);
break;
case Dish.LIST_FILE: case Dish.LIST_FILE:
this.value = await Promise.all(this.value.map(async f => Utils.readFile(f))); this.value = await Promise.all(this.value.map(async f => Utils.readFile(f)));
this.value = this.value.map(b => Array.prototype.slice.call(b)); this.value = this.value.map(b => Array.prototype.slice.call(b));
@ -194,8 +209,15 @@ class Dish {
} }
this.type = Dish.BIG_NUMBER; this.type = Dish.BIG_NUMBER;
break; break;
case Dish.LIST_FILE: case Dish.JSON:
this.value = JSON.parse(byteArrayToStr(this.value));
this.type = Dish.JSON;
break;
case Dish.FILE:
this.value = new File(this.value, "unknown"); this.value = new File(this.value, "unknown");
break;
case Dish.LIST_FILE:
this.value = [new File(this.value, "unknown")];
this.type = Dish.LIST_FILE; this.type = Dish.LIST_FILE;
break; break;
default: default:
@ -235,6 +257,11 @@ class Dish {
return this.value instanceof ArrayBuffer; return this.value instanceof ArrayBuffer;
case Dish.BIG_NUMBER: case Dish.BIG_NUMBER:
return this.value instanceof BigNumber; return this.value instanceof BigNumber;
case Dish.JSON:
// All values can be serialised in some manner, so we return true in all cases
return true;
case Dish.FILE:
return this.value instanceof File;
case Dish.LIST_FILE: case Dish.LIST_FILE:
return this.value instanceof Array && return this.value instanceof Array &&
this.value.reduce((acc, curr) => acc && curr instanceof File, true); this.value.reduce((acc, curr) => acc && curr instanceof File, true);
@ -262,6 +289,10 @@ class Dish {
return this.value.toString().length; return this.value.toString().length;
case Dish.ARRAY_BUFFER: case Dish.ARRAY_BUFFER:
return this.value.byteLength; return this.value.byteLength;
case Dish.JSON:
return JSON.stringify(this.value).length;
case Dish.FILE:
return this.value.size;
case Dish.LIST_FILE: case Dish.LIST_FILE:
return this.value.reduce((acc, curr) => acc + curr.size, 0); return this.value.reduce((acc, curr) => acc + curr.size, 0);
default: default:
@ -308,12 +339,24 @@ Dish.ARRAY_BUFFER = 4;
* @enum * @enum
*/ */
Dish.BIG_NUMBER = 5; Dish.BIG_NUMBER = 5;
/**
* Dish data type enum for JSON.
* @readonly
* @enum
*/
Dish.JSON = 6;
/** /**
* Dish data type enum for lists of files. * Dish data type enum for lists of files.
* @readonly * @readonly
* @enum * @enum
*/ */
Dish.LIST_FILE = 6; Dish.FILE = 7;
/**
* Dish data type enum for lists of files.
* @readonly
* @enum
*/
Dish.LIST_FILE = 8;
export default Dish; export default Dish;

View File

@ -5,7 +5,6 @@
*/ */
import Operation from "../Operation"; import Operation from "../Operation";
import Utils from "../Utils";
import zlibAndGzip from "zlibjs/bin/zlib_and_gzip.min"; import zlibAndGzip from "zlibjs/bin/zlib_and_gzip.min";
const Zlib = zlibAndGzip.Zlib; const Zlib = zlibAndGzip.Zlib;
@ -24,21 +23,19 @@ class Gunzip extends Operation {
this.name = "Gunzip"; this.name = "Gunzip";
this.module = "Compression"; this.module = "Compression";
this.description = "Decompresses data which has been compressed using the deflate algorithm with gzip headers."; this.description = "Decompresses data which has been compressed using the deflate algorithm with gzip headers.";
this.inputType = "byteArray"; this.inputType = "ArrayBuffer";
this.outputType = "byteArray"; this.outputType = "ArrayBuffer";
this.args = []; this.args = [];
} }
/** /**
* @param {byteArray} input * @param {ArrayBuffer} input
* @param {Object[]} args * @param {Object[]} args
* @returns {byteArray} * @returns {File}
*/ */
run(input, args) { run(input, args) {
// Deal with character encoding issues const gunzip = new Zlib.Gunzip(new Uint8Array(input));
input = Utils.strToByteArray(Utils.byteArrayToUtf8(input)); return new Uint8Array(gunzip.decompress()).buffer;
const gunzip = new Zlib.Gunzip(input);
return Array.prototype.slice.call(gunzip.decompress());
} }
} }

View File

@ -24,8 +24,8 @@ class Gzip extends Operation {
this.name = "Gzip"; this.name = "Gzip";
this.module = "Compression"; this.module = "Compression";
this.description = "Compresses data using the deflate algorithm with gzip headers."; this.description = "Compresses data using the deflate algorithm with gzip headers.";
this.inputType = "byteArray"; this.inputType = "ArrayBuffer";
this.outputType = "byteArray"; this.outputType = "ArrayBuffer";
this.args = [ this.args = [
{ {
name: "Compression type", name: "Compression type",
@ -51,9 +51,9 @@ class Gzip extends Operation {
} }
/** /**
* @param {byteArray} input * @param {ArrayBuffer} input
* @param {Object[]} args * @param {Object[]} args
* @returns {byteArray} * @returns {ArrayBuffer}
*/ */
run(input, args) { run(input, args) {
const filename = args[1], const filename = args[1],
@ -76,8 +76,8 @@ class Gzip extends Operation {
options.comment = comment; options.comment = comment;
} }
const gzip = new Zlib.Gzip(input, options); const gzip = new Zlib.Gzip(new Uint8Array(input), options);
return Array.prototype.slice.call(gzip.compress()); return new Uint8Array(gzip.compress()).buffer;
} }
} }

View File

@ -30,8 +30,8 @@ class RawDeflate extends Operation {
this.name = "Raw Deflate"; this.name = "Raw Deflate";
this.module = "Compression"; this.module = "Compression";
this.description = "Compresses data using the deflate algorithm with no headers."; this.description = "Compresses data using the deflate algorithm with no headers.";
this.inputType = "byteArray"; this.inputType = "ArrayBuffer";
this.outputType = "byteArray"; this.outputType = "ArrayBuffer";
this.args = [ this.args = [
{ {
name: "Compression type", name: "Compression type",
@ -42,15 +42,15 @@ class RawDeflate extends Operation {
} }
/** /**
* @param {byteArray} input * @param {ArrayBuffer} input
* @param {Object[]} args * @param {Object[]} args
* @returns {byteArray} * @returns {ArrayBuffer}
*/ */
run(input, args) { run(input, args) {
const deflate = new Zlib.RawDeflate(input, { const deflate = new Zlib.RawDeflate(new Uint8Array(input), {
compressionType: RAW_COMPRESSION_TYPE_LOOKUP[args[0]] compressionType: RAW_COMPRESSION_TYPE_LOOKUP[args[0]]
}); });
return Array.prototype.slice.call(deflate.compress()); return new Uint8Array(deflate.compress()).buffer;
} }
} }

View File

@ -5,7 +5,6 @@
*/ */
import Operation from "../Operation"; import Operation from "../Operation";
import Utils from "../Utils";
import {INFLATE_BUFFER_TYPE} from "../lib/Zlib"; import {INFLATE_BUFFER_TYPE} from "../lib/Zlib";
import rawinflate from "zlibjs/bin/rawinflate.min"; import rawinflate from "zlibjs/bin/rawinflate.min";
@ -30,8 +29,8 @@ class RawInflate extends Operation {
this.name = "Raw Inflate"; this.name = "Raw Inflate";
this.module = "Compression"; this.module = "Compression";
this.description = "Decompresses data which has been compressed using the deflate algorithm with no headers."; this.description = "Decompresses data which has been compressed using the deflate algorithm with no headers.";
this.inputType = "byteArray"; this.inputType = "ArrayBuffer";
this.outputType = "byteArray"; this.outputType = "ArrayBuffer";
this.args = [ this.args = [
{ {
name: "Start index", name: "Start index",
@ -62,21 +61,19 @@ class RawInflate extends Operation {
} }
/** /**
* @param {byteArray} input * @param {ArrayBuffer} input
* @param {Object[]} args * @param {Object[]} args
* @returns {byteArray} * @returns {ArrayBuffer}
*/ */
run(input, args) { run(input, args) {
// Deal with character encoding issues const inflate = new Zlib.RawInflate(new Uint8Array(input), {
input = Utils.strToByteArray(Utils.byteArrayToUtf8(input));
const inflate = new Zlib.RawInflate(input, {
index: args[0], index: args[0],
bufferSize: args[1], bufferSize: args[1],
bufferType: RAW_BUFFER_TYPE_LOOKUP[args[2]], bufferType: RAW_BUFFER_TYPE_LOOKUP[args[2]],
resize: args[3], resize: args[3],
verify: args[4] verify: args[4]
}), }),
result = Array.prototype.slice.call(inflate.decompress()); result = new Uint8Array(inflate.decompress());
// Raw Inflate somethimes messes up and returns nonsense like this: // Raw Inflate somethimes messes up and returns nonsense like this:
// ]....]....]....]....]....]....]....]....]....]....]....]....]....]... // ]....]....]....]....]....]....]....]....]....]....]....]....]....]...
@ -97,7 +94,7 @@ class RawInflate extends Operation {
} }
} }
// This seems to be the easiest way... // This seems to be the easiest way...
return result; return result.buffer;
} }
} }

View File

@ -24,7 +24,7 @@ class Unzip extends Operation {
this.name = "Unzip"; this.name = "Unzip";
this.module = "Compression"; this.module = "Compression";
this.description = "Decompresses data using the PKZIP algorithm and displays it per file, with support for passwords."; this.description = "Decompresses data using the PKZIP algorithm and displays it per file, with support for passwords.";
this.inputType = "byteArray"; this.inputType = "ArrayBuffer";
this.outputType = "List<File>"; this.outputType = "List<File>";
this.presentType = "html"; this.presentType = "html";
this.args = [ this.args = [
@ -42,7 +42,7 @@ class Unzip extends Operation {
} }
/** /**
* @param {byteArray} input * @param {ArrayBuffer} input
* @param {Object[]} args * @param {Object[]} args
* @returns {File[]} * @returns {File[]}
*/ */
@ -51,7 +51,7 @@ class Unzip extends Operation {
password: Utils.strToByteArray(args[0]), password: Utils.strToByteArray(args[0]),
verify: args[1] verify: args[1]
}, },
unzip = new Zlib.Unzip(input, options), unzip = new Zlib.Unzip(new Uint8Array(input), options),
filenames = unzip.getFilenames(); filenames = unzip.getFilenames();
return filenames.map(fileName => { return filenames.map(fileName => {

View File

@ -36,8 +36,8 @@ class Zip extends Operation {
this.name = "Zip"; this.name = "Zip";
this.module = "Compression"; this.module = "Compression";
this.description = "Compresses data using the PKZIP algorithm with the given filename.<br><br>No support for multiple files at this time."; this.description = "Compresses data using the PKZIP algorithm with the given filename.<br><br>No support for multiple files at this time.";
this.inputType = "byteArray"; this.inputType = "ArrayBuffer";
this.outputType = "byteArray"; this.outputType = "File";
this.args = [ this.args = [
{ {
name: "Filename", name: "Filename",
@ -73,14 +73,15 @@ class Zip extends Operation {
} }
/** /**
* @param {byteArray} input * @param {ArrayBuffer} input
* @param {Object[]} args * @param {Object[]} args
* @returns {byteArray} * @returns {File}
*/ */
run(input, args) { run(input, args) {
const password = Utils.strToByteArray(args[2]), const filename = args[0],
password = Utils.strToByteArray(args[2]),
options = { options = {
filename: Utils.strToByteArray(args[0]), filename: Utils.strToByteArray(filename),
comment: Utils.strToByteArray(args[1]), comment: Utils.strToByteArray(args[1]),
compressionMethod: ZIP_COMPRESSION_METHOD_LOOKUP[args[3]], compressionMethod: ZIP_COMPRESSION_METHOD_LOOKUP[args[3]],
os: ZIP_OS_LOOKUP[args[4]], os: ZIP_OS_LOOKUP[args[4]],
@ -92,8 +93,8 @@ class Zip extends Operation {
if (password.length) if (password.length)
zip.setPassword(password); zip.setPassword(password);
zip.addFile(input, options); zip.addFile(new Uint8Array(input), options);
return Array.prototype.slice.call(zip.compress()); return new File([zip.compress()], filename);
} }
} }

View File

@ -24,8 +24,8 @@ class ZlibDeflate extends Operation {
this.name = "Zlib Deflate"; this.name = "Zlib Deflate";
this.module = "Compression"; this.module = "Compression";
this.description = "Compresses data using the deflate algorithm adding zlib headers."; this.description = "Compresses data using the deflate algorithm adding zlib headers.";
this.inputType = "byteArray"; this.inputType = "ArrayBuffer";
this.outputType = "byteArray"; this.outputType = "ArrayBuffer";
this.args = [ this.args = [
{ {
name: "Compression type", name: "Compression type",
@ -36,15 +36,15 @@ class ZlibDeflate extends Operation {
} }
/** /**
* @param {byteArray} input * @param {ArrayBuffer} input
* @param {Object[]} args * @param {Object[]} args
* @returns {byteArray} * @returns {ArrayBuffer}
*/ */
run(input, args) { run(input, args) {
const deflate = new Zlib.Deflate(input, { const deflate = new Zlib.Deflate(new Uint8Array(input), {
compressionType: ZLIB_COMPRESSION_TYPE_LOOKUP[args[0]] compressionType: ZLIB_COMPRESSION_TYPE_LOOKUP[args[0]]
}); });
return Array.prototype.slice.call(deflate.compress()); return new Uint8Array(deflate.compress()).buffer;
} }
} }

View File

@ -5,7 +5,6 @@
*/ */
import Operation from "../Operation"; import Operation from "../Operation";
import Utils from "../Utils";
import {INFLATE_BUFFER_TYPE} from "../lib/Zlib"; import {INFLATE_BUFFER_TYPE} from "../lib/Zlib";
import zlibAndGzip from "zlibjs/bin/zlib_and_gzip.min"; import zlibAndGzip from "zlibjs/bin/zlib_and_gzip.min";
@ -30,8 +29,8 @@ class ZlibInflate extends Operation {
this.name = "Zlib Inflate"; this.name = "Zlib Inflate";
this.module = "Compression"; this.module = "Compression";
this.description = "Decompresses data which has been compressed using the deflate algorithm with zlib headers."; this.description = "Decompresses data which has been compressed using the deflate algorithm with zlib headers.";
this.inputType = "byteArray"; this.inputType = "ArrayBuffer";
this.outputType = "byteArray"; this.outputType = "ArrayBuffer";
this.args = [ this.args = [
{ {
name: "Start index", name: "Start index",
@ -62,21 +61,19 @@ class ZlibInflate extends Operation {
} }
/** /**
* @param {byteArray} input * @param {ArrayBuffer} input
* @param {Object[]} args * @param {Object[]} args
* @returns {byteArray} * @returns {ArrayBuffer}
*/ */
run(input, args) { run(input, args) {
// Deal with character encoding issues const inflate = new Zlib.Inflate(new Uint8Array(input), {
input = Utils.strToByteArray(Utils.byteArrayToUtf8(input));
const inflate = new Zlib.Inflate(input, {
index: args[0], index: args[0],
bufferSize: args[1], bufferSize: args[1],
bufferType: ZLIB_BUFFER_TYPE_LOOKUP[args[2]], bufferType: ZLIB_BUFFER_TYPE_LOOKUP[args[2]],
resize: args[3], resize: args[3],
verify: args[4] verify: args[4]
}); });
return Array.prototype.slice.call(inflate.decompress()); return new Uint8Array(inflate.decompress()).buffer;
} }
} }