file-worker
Advanced tools
Comparing version
@@ -6,7 +6,11 @@ declare module "types" { | ||
export interface FileWorkerReader { | ||
read(length: number): void; | ||
readAll(): void; | ||
onData: FileWorkerOnDataHandler; | ||
onFinished: Function; | ||
} | ||
export interface FileWorkerWriter { | ||
write(data: any): void; | ||
writeOnce(data: any): void; | ||
finish(): void; | ||
} | ||
@@ -13,0 +17,0 @@ export interface FileWorkerProcessor extends Function { |
@@ -48,3 +48,20 @@ var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) { | ||
this.file = file; | ||
this.currentReader = 0; | ||
} | ||
FileWorkerReaderImplement.prototype.read = function (length) { | ||
var maxLength = Math.min(this.file.size, this.currentReader + length); | ||
if (this.currentReader == this.file.size) { | ||
this.onFinished(); | ||
} | ||
else { | ||
var blob = this.file.slice(this.currentReader, maxLength); | ||
this.currentReader = maxLength; | ||
var fileReader = new FileReaderSync(); | ||
var arrayBuffer = fileReader.readAsArrayBuffer(blob); | ||
this.onData(arrayBuffer); | ||
if (this.currentReader == this.file.size) { | ||
this.onFinished(); | ||
} | ||
} | ||
}; | ||
FileWorkerReaderImplement.prototype.readAll = function () { | ||
@@ -54,2 +71,3 @@ var fileReader = new FileReaderSync(); | ||
this.onData(arrayBuffer); | ||
this.onFinished(); | ||
}; | ||
@@ -60,6 +78,13 @@ return FileWorkerReaderImplement; | ||
var file = e.data; | ||
var writerBuffer = []; | ||
var reader = new FileWorkerReaderImplement(file); | ||
var writer = { | ||
write: function (data) { | ||
writerBuffer.push(data); | ||
}, | ||
writeOnce: function (data) { | ||
self.postMessage(data); | ||
}, | ||
finish: function () { | ||
self.postMessage(writerBuffer); | ||
} | ||
@@ -71,3 +96,3 @@ }; | ||
catch (e) { | ||
self.postMessage(e); | ||
self.postMessage({ error: e.toString() }); | ||
} | ||
@@ -74,0 +99,0 @@ }); |
@@ -136,3 +136,19 @@ ;(function(global) { | ||
this.file = file; | ||
this.currentReader = 0; | ||
} | ||
FileWorkerReaderImplement.prototype.read = function (length) { | ||
var maxLength = Math.min(this.file.size, this.currentReader + length); | ||
if (this.currentReader == this.file.size) { | ||
this.onFinished(); | ||
} else { | ||
var blob = this.file.slice(this.currentReader, maxLength); | ||
this.currentReader = maxLength; | ||
var fileReader = new FileReaderSync(); | ||
var arrayBuffer = fileReader.readAsArrayBuffer(blob); | ||
this.onData(arrayBuffer); | ||
if (this.currentReader == this.file.size) { | ||
this.onFinished(); | ||
} | ||
} | ||
}; | ||
FileWorkerReaderImplement.prototype.readAll = function () { | ||
@@ -142,2 +158,3 @@ var fileReader = new FileReaderSync(); | ||
this.onData(arrayBuffer); | ||
this.onFinished(); | ||
}; | ||
@@ -148,6 +165,13 @@ return FileWorkerReaderImplement; | ||
var file = e.data; | ||
var writerBuffer = []; | ||
var reader = new FileWorkerReaderImplement(file); | ||
var writer = { | ||
write: function (data) { | ||
writerBuffer.push(data); | ||
}, | ||
writeOnce: function (data) { | ||
self.postMessage(data); | ||
}, | ||
finish: function () { | ||
self.postMessage(writerBuffer); | ||
} | ||
@@ -158,3 +182,3 @@ }; | ||
} catch (e) { | ||
self.postMessage(e); | ||
self.postMessage({ error: e.toString() }); | ||
} | ||
@@ -161,0 +185,0 @@ }); |
@@ -5,7 +5,11 @@ export interface FileWorkerOnDataHandler extends Function { | ||
export interface FileWorkerReader { | ||
read(length: number): void; | ||
readAll(): void; | ||
onData: FileWorkerOnDataHandler; | ||
onFinished: Function; | ||
} | ||
export interface FileWorkerWriter { | ||
write(data: any): void; | ||
writeOnce(data: any): void; | ||
finish(): void; | ||
} | ||
@@ -12,0 +16,0 @@ export interface FileWorkerProcessor extends Function { |
@@ -8,3 +8,20 @@ "use strict"; | ||
this.file = file; | ||
this.currentReader = 0; | ||
} | ||
FileWorkerReaderImplement.prototype.read = function (length) { | ||
var maxLength = Math.min(this.file.size, this.currentReader + length); | ||
if (this.currentReader == this.file.size) { | ||
this.onFinished(); | ||
} | ||
else { | ||
var blob = this.file.slice(this.currentReader, maxLength); | ||
this.currentReader = maxLength; | ||
var fileReader = new FileReaderSync(); | ||
var arrayBuffer = fileReader.readAsArrayBuffer(blob); | ||
this.onData(arrayBuffer); | ||
if (this.currentReader == this.file.size) { | ||
this.onFinished(); | ||
} | ||
} | ||
}; | ||
FileWorkerReaderImplement.prototype.readAll = function () { | ||
@@ -14,2 +31,3 @@ var fileReader = new FileReaderSync(); | ||
this.onData(arrayBuffer); | ||
this.onFinished(); | ||
}; | ||
@@ -20,6 +38,13 @@ return FileWorkerReaderImplement; | ||
var file = e.data; | ||
var writerBuffer = []; | ||
var reader = new FileWorkerReaderImplement(file); | ||
var writer = { | ||
write: function (data) { | ||
writerBuffer.push(data); | ||
}, | ||
writeOnce: function (data) { | ||
self.postMessage(data); | ||
}, | ||
finish: function () { | ||
self.postMessage(writerBuffer); | ||
} | ||
@@ -31,3 +56,3 @@ }; | ||
catch (e) { | ||
self.postMessage(e); | ||
self.postMessage({ error: e.toString() }); | ||
} | ||
@@ -34,0 +59,0 @@ }); |
{ | ||
"name": "file-worker", | ||
"version": "0.0.7", | ||
"version": "0.0.10", | ||
"description": "Process files asynchronous at browser with web worker.", | ||
@@ -20,5 +20,8 @@ "main": "dist/commonjs/index.js", | ||
"gulp-amdclean": "^1.1.1", | ||
"gulp-rename": "^1.2.2", | ||
"gulp-typescript": "^3.1.5", | ||
"gulp-uglify": "^2.1.0", | ||
"gulp-webserver": "^0.9.1", | ||
"jasmine-core": "^2.5.2", | ||
"karma": "^1.5.0", | ||
"karma-chrome-launcher": "^2.0.0", | ||
@@ -31,6 +34,3 @@ "karma-firefox-launcher": "^1.0.1", | ||
"typescript": "^2.2.1" | ||
}, | ||
"dependencies": { | ||
"karma": "^1.5.0" | ||
} | ||
} |
JavaScript File Worker | ||
====================== | ||
*Process file asynchronously at Web Worker at browser.* | ||
***Process files asynchronously by Web Worker in browsers.*** | ||
@@ -20,13 +20,18 @@ Web Worker is a browser technology that allow some JavaScript code | ||
[](https://travis-ci.org/imdreamrunner/js-file-worker) | ||
## Usage | ||
*Step 1: Import the file* | ||
**Step 1: Import the file** | ||
You can do it in HTML. | ||
You can [download the latest release](https://github.com/imdreamrunner/js-file-worker/releases) | ||
for browser and import it in HTML. | ||
```html | ||
<script src="../../dist/browser/FileWorker.js"></script> | ||
<script src="FileWorker.js"></script> | ||
``` | ||
Or using NPM if you use webpack or TypeScript. | ||
Or using NPM if you use webpack or TypeScript. This package | ||
is available on NPM called [file-worker](https://www.npmjs.com/package/file-worker) | ||
as well. | ||
@@ -37,4 +42,20 @@ ```bash | ||
*Step 2: Write file processor* | ||
To use this package in JavaScript, you can require it | ||
```javascript | ||
var FileWorker = require("file-worker"); | ||
``` | ||
or import it. | ||
```javascript | ||
import FileWorker from "file-worker"; | ||
``` | ||
Because this library is written in TypeScript, if you are using | ||
an editor like WebStorm, you shall be able to get the handy | ||
auto-completion. | ||
**Step 2: Write file processor** | ||
Assuming you want to compute the MD5 of your file, you can write | ||
@@ -48,3 +69,3 @@ a processor like this. However there is an existing library | ||
reader.onData = function (bytes) { | ||
writer.write(computeMD5(bytes)); | ||
writer.writeOnce(computeMD5(bytes)); | ||
}; | ||
@@ -62,3 +83,3 @@ reader.readAll(); | ||
*Step 3: Get processed content* | ||
**Step 3: Get processed content** | ||
@@ -68,4 +89,9 @@ Assuming you get a File object from the browser's FileAPI. You can | ||
``` | ||
FileWorker.readFile(file, byteProcessor) | ||
`FileWorker.readFile` is an `async` function, i.e. it is non-blocking and | ||
will return a promise. You can either use `.then` and callback to get the result. | ||
If you use it in browser or prefer traditional `.then`: | ||
```javascript | ||
FileWorker.readFile(file, md5Processor) | ||
.then(function(result) { | ||
@@ -76,3 +102,24 @@ console.log(result); | ||
`FileWorker.readFile` is an `async` function. You can either use `.then` | ||
and callback to get the result. | ||
Or call it with await. | ||
```javascript | ||
const getMD5(file) = async () => { await FileWorker.readFile(file, md5Processor); } | ||
``` | ||
## License | ||
**ISC License** | ||
Copyright (c) 2017, FileWorker Authors | ||
Permission to use, copy, modify, and/or distribute this software for any | ||
purpose with or without fee is hereby granted, provided that the above | ||
copyright notice and this permission notice appear in all copies. | ||
THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES WITH | ||
REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY | ||
AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT, | ||
INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM | ||
LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE | ||
OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR | ||
PERFORMANCE OF THIS SOFTWARE. |
@@ -6,4 +6,6 @@ export interface FileWorkerOnDataHandler extends Function { | ||
export interface FileWorkerReader { | ||
read(length:number):void; | ||
readAll():void; | ||
onData: FileWorkerOnDataHandler; | ||
onFinished: Function; | ||
} | ||
@@ -13,2 +15,4 @@ | ||
write(data:any):void; | ||
writeOnce(data:any):void; | ||
finish():void; | ||
} | ||
@@ -15,0 +19,0 @@ |
@@ -11,9 +11,29 @@ import {FileWorkerWriter, FileWorkerProcessor, FileWorkerReader, FileWorkerOnDataHandler} from "./types"; | ||
class FileWorkerReaderImplement implements FileWorkerReader { | ||
onFinished: Function; | ||
onData: FileWorkerOnDataHandler; | ||
private file : File; | ||
private currentReader : number; | ||
constructor(file: File) { | ||
this.file = file; | ||
this.currentReader = 0; | ||
} | ||
read(length:number) { | ||
const maxLength = Math.min(this.file.size, this.currentReader + length); | ||
if (this.currentReader == this.file.size) { | ||
this.onFinished(); | ||
} else { | ||
const blob = this.file.slice(this.currentReader, maxLength); | ||
this.currentReader = maxLength; | ||
const fileReader = new FileReaderSync(); | ||
const arrayBuffer = fileReader.readAsArrayBuffer(blob); | ||
this.onData(arrayBuffer); | ||
if (this.currentReader == this.file.size) { | ||
this.onFinished(); | ||
} | ||
} | ||
} | ||
readAll() { | ||
@@ -23,2 +43,3 @@ const fileReader = new FileReaderSync(); | ||
this.onData(arrayBuffer); | ||
this.onFinished(); | ||
} | ||
@@ -29,6 +50,13 @@ } | ||
const file: File = <File>e.data; | ||
const writerBuffer : any[] = []; | ||
const reader : FileWorkerReader = <FileWorkerReader>new FileWorkerReaderImplement(file); | ||
const writer : FileWorkerWriter = <FileWorkerWriter>{ | ||
write: (data: any) => { | ||
writerBuffer.push(data); | ||
}, | ||
writeOnce: (data: any) => { | ||
self.postMessage(data); | ||
}, | ||
finish: () => { | ||
self.postMessage(writerBuffer); | ||
} | ||
@@ -39,3 +67,3 @@ }; | ||
} catch (e) { | ||
self.postMessage(e); | ||
self.postMessage({error: e.toString()}); | ||
} | ||
@@ -42,0 +70,0 @@ }); |
34252
42.55%0
-100%21
10.53%683
19.61%120
64.38%15
25%- Removed
- Removed
- Removed
- Removed
- Removed
- Removed
- Removed
- Removed
- Removed
- Removed
- Removed
- Removed
- Removed
- Removed
- Removed
- Removed
- Removed
- Removed
- Removed
- Removed
- Removed
- Removed
- Removed
- Removed
- Removed
- Removed
- Removed
- Removed
- Removed
- Removed
- Removed
- Removed
- Removed
- Removed
- Removed
- Removed
- Removed
- Removed
- Removed
- Removed
- Removed
- Removed
- Removed
- Removed
- Removed
- Removed
- Removed
- Removed
- Removed
- Removed
- Removed
- Removed
- Removed
- Removed
- Removed
- Removed
- Removed
- Removed
- Removed
- Removed
- Removed
- Removed
- Removed
- Removed
- Removed
- Removed
- Removed
- Removed
- Removed
- Removed
- Removed
- Removed
- Removed
- Removed
- Removed
- Removed
- Removed
- Removed
- Removed
- Removed
- Removed
- Removed
- Removed
- Removed
- Removed
- Removed
- Removed
- Removed
- Removed
- Removed
- Removed
- Removed
- Removed
- Removed
- Removed
- Removed
- Removed
- Removed
- Removed
- Removed
- Removed
- Removed
- Removed
- Removed
- Removed
- Removed
- Removed
- Removed
- Removed
- Removed
- Removed
- Removed
- Removed
- Removed
- Removed
- Removed
- Removed
- Removed
- Removed
- Removed
- Removed
- Removed
- Removed
- Removed
- Removed
- Removed
- Removed
- Removed
- Removed
- Removed
- Removed
- Removed
- Removed
- Removed
- Removed
- Removed
- Removed
- Removed
- Removed
- Removed
- Removed
- Removed
- Removed
- Removed
- Removed
- Removed
- Removed
- Removed
- Removed
- Removed
- Removed
- Removed
- Removed
- Removed
- Removed
- Removed
- Removed
- Removed
- Removed
- Removed
- Removed
- Removed
- Removed
- Removed
- Removed
- Removed
- Removed
- Removed
- Removed
- Removed
- Removed
- Removed
- Removed
- Removed
- Removed
- Removed
- Removed
- Removed
- Removed
- Removed
- Removed
- Removed
- Removed
- Removed
- Removed
- Removed
- Removed
- Removed
- Removed
- Removed
- Removed
- Removed
- Removed
- Removed
- Removed
- Removed
- Removed
- Removed
- Removed
- Removed
- Removed
- Removed
- Removed
- Removed
- Removed
- Removed
- Removed
- Removed
- Removed
- Removed
- Removed
- Removed
- Removed
- Removed
- Removed
- Removed
- Removed
- Removed
- Removed
- Removed
- Removed
- Removed
- Removed
- Removed
- Removed
- Removed
- Removed
- Removed
- Removed
- Removed
- Removed
- Removed
- Removed
- Removed
- Removed
- Removed
- Removed
- Removed