diff --git a/png-async/png-async-tests.ts b/png-async/png-async-tests.ts
new file mode 100644
index 000000000..6523089a2
--- /dev/null
+++ b/png-async/png-async-tests.ts
@@ -0,0 +1,32 @@
+///
+
+import fs = require('fs');
+import png = require('png-async');
+
+var devnull = process.platform === 'win32' ? 'nul' : '/dev/null';
+
+// stream test
+var img = new png.Image({
+ width: 1,
+ height: 1,
+ fill: true
+})
+ .pack()
+ .pipe(png.createImage({
+ deflateStrategy: png.EDeflateStrategy.FIXED,
+ filterType: png.EFilterType.Auto
+ })
+ .on('parsed', function () {
+
+ if (this.data[0] !== 0) {
+ throw new Error('invalid data');
+ }
+
+ this.data[0] = 255;
+ this.data[3] = 255;
+
+ this.pack().pipe(fs.createWriteStream(devnull)).on('finish', () => {
+ console.log('done');
+ });
+ })
+ );
diff --git a/png-async/png-async.d.ts b/png-async/png-async.d.ts
new file mode 100644
index 000000000..2898c4665
--- /dev/null
+++ b/png-async/png-async.d.ts
@@ -0,0 +1,58 @@
+// Type definitions for png-async
+// Project: https://github.com/kanreisa/node-png-async
+// Definitions by: Yuki KAN
+// Definitions: https://github.com/borisyankov/DefinitelyTyped
+
+///
+
+declare module 'png-async' {
+ import stream = require('stream');
+
+ export interface IImageOptions {
+ width?: number;
+ height?: number;
+ fill?: boolean;
+ checkCRC?: boolean;
+ deflateChunkSize?: number;
+ deflateLevel?: number;
+ deflateStrategy?: EDeflateStrategy;
+ filterType?: EFilterType;
+ }
+
+ export enum EDeflateStrategy {
+ DEFAULT_STRATEGY = 0,
+ FILTERED = 1,
+ HUFFMAN_ONLY = 2,
+ RLE = 3,
+ FIXED = 4,
+ }
+
+ export enum EFilterType {
+ Auto = -1,
+ None = 0,
+ Sub = 1,
+ Up = 2,
+ Average = 3,
+ Paeth = 4,
+ }
+
+ export function createImage(option?: IImageOptions): Image;
+
+ export class Image extends stream.Duplex {
+ width: number;
+ height: number;
+ gamma: number;
+ data: Buffer;
+ constructor(option?: IImageOptions);
+ pack(): Image;
+ parse(data: Buffer, callback?: (err: Error, image: Image) => void): Image;
+ write(data: any, cb?: any): boolean;
+ end(data?: any): void;
+ bitblt(dst: Image, sx: number, sy: number, w: number, h: number, dx: number, dy: number): Image;
+
+ on(event: string, listener: Function): Image;
+ once(event: string, listener: Function): Image;
+ removeListener(event: string, listener: Function): Image;
+ removeAllListeners(event: string): Image;
+ }
+}