From 3e934eddab5e991f0b5e71c3058775de7a35c6ae Mon Sep 17 00:00:00 2001 From: Igor Wiedler Date: Wed, 24 Oct 2012 22:25:03 +0200 Subject: [PATCH] Use promises instead of async --- composer.json | 2 +- composer.lock | 271 ++++++++++++++++++++++++++++++++++--- src/React/Whois/Client.php | 37 ++--- 3 files changed, 271 insertions(+), 39 deletions(-) diff --git a/composer.json b/composer.json index f8492a2..639255e 100644 --- a/composer.json +++ b/composer.json @@ -6,7 +6,7 @@ "license": "MIT", "require": { "php": ">=5.3.2", - "react/async": "dev-master", + "jsor/promise": "dev-master", "react/curry": "dev-master", "react/dns": "0.2.*", "react/socket": "0.2.*" diff --git a/composer.lock b/composer.lock index 560c04d..70ccf73 100644 --- a/composer.lock +++ b/composer.lock @@ -1,50 +1,277 @@ { - "hash": "58ecd3caf4ab0b7382973d54641dcb06", + "hash": "c5801492e1352f42fde3ff34b0e887a9", "packages": [ { - "package": "evenement/evenement", + "name": "evenement/evenement", "version": "1.0.x-dev", - "source-reference": "v1.0.0", - "commit-date": "1338390068" + "source": { + "type": "git", + "url": "https://github.com/igorw/evenement", + "reference": "v1.0.0" + }, + "dist": { + "type": "zip", + "url": "https://github.com/igorw/evenement/zipball/v1.0.0", + "reference": "v1.0.0", + "shasum": "" + }, + "require": { + "php": ">=5.3.0" + }, + "time": "1338390068", + "type": "library", + "installation-source": "source", + "autoload": { + "psr-0": { + "Evenement": "src" + } + } }, { - "package": "react/async", + "name": "jsor/promise", "version": "dev-master", - "source-reference": "42b3f74abb8e1984267d0899c0252ab1cc509059", - "commit-date": "1346151501" + "source": { + "type": "git", + "url": "https://github.com/jsor/promise", + "reference": "009a606c81997bc6f74cba93be53820eeeee6ad6" + }, + "dist": { + "type": "zip", + "url": "https://github.com/jsor/promise/zipball/009a606c81997bc6f74cba93be53820eeeee6ad6", + "reference": "009a606c81997bc6f74cba93be53820eeeee6ad6", + "shasum": "" + }, + "require": { + "php": ">=5.3.3" + }, + "time": "1350938834", + "type": "library", + "installation-source": "source", + "autoload": { + "psr-0": { + "Promise": "src/" + } + }, + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Jan Sorgalla", + "email": "jsorgalla@googlemail.com", + "homepage": "http://sorgalla.com", + "role": "maintainer" + } + ], + "description": "A lightweight implementation of CommonJS Promises/A for PHP" }, { - "package": "react/curry", + "name": "react/curry", "version": "dev-master", - "source-reference": "d2ab4a0ffd5c07f32db45a23a0cad2daef986d49", - "commit-date": "1346437355" + "source": { + "type": "git", + "url": "https://github.com/react-php/curry", + "reference": "6cc0b8b012eb26e96d3480328710373347e6a154" + }, + "dist": { + "type": "zip", + "url": "https://github.com/react-php/curry/zipball/6cc0b8b012eb26e96d3480328710373347e6a154", + "reference": "6cc0b8b012eb26e96d3480328710373347e6a154", + "shasum": "" + }, + "require": { + "php": ">=5.3.2" + }, + "time": "1348264992", + "type": "library", + "installation-source": "source", + "autoload": { + "psr-0": { + "React\\Curry": "src" + } + }, + "license": [ + "MIT" + ], + "description": "Partial function application.", + "keywords": [ + "curry", + "currying", + "functional-programming" + ] }, { - "package": "react/dns", - "version": "v0.2.0" + "name": "react/dns", + "version": "v0.2.1", + "target-dir": "React/Dns", + "source": { + "type": "git", + "url": "https://github.com/react-php/dns", + "reference": "v0.2.1" + }, + "dist": { + "type": "zip", + "url": "https://github.com/react-php/dns/zipball/v0.2.1", + "reference": "v0.2.1", + "shasum": "" + }, + "require": { + "php": ">=5.3.2", + "react/socket": "0.2.*" + }, + "time": "2012-09-24 07:50:30", + "type": "library", + "installation-source": "dist", + "autoload": { + "psr-0": { + "React\\Dns": "" + } + }, + "license": [ + "MIT" + ], + "description": "Async DNS resolver.", + "keywords": [ + "dns", + "dns-resolver" + ] }, { - "package": "react/event-loop", - "version": "v0.2.0" + "name": "react/event-loop", + "version": "v0.2.1", + "target-dir": "React/EventLoop", + "source": { + "type": "git", + "url": "https://github.com/react-php/event-loop.git", + "reference": "v0.2.1" + }, + "dist": { + "type": "zip", + "url": "https://github.com/react-php/event-loop/zipball/v0.2.1", + "reference": "v0.2.1", + "shasum": "" + }, + "require": { + "php": ">=5.3.3" + }, + "suggest": { + "ext-libevent": ">=0.0.5" + }, + "time": "2012-09-10 05:53:22", + "type": "library", + "extra": { + "branch-alias": [ + + ] + }, + "installation-source": "dist", + "autoload": { + "psr-0": { + "React\\EventLoop": "" + } + }, + "license": [ + "MIT" + ], + "description": "Event loop abstraction layer that libraries can use for evented I/O.", + "keywords": [ + "event-loop" + ] }, { - "package": "react/socket", - "version": "v0.2.0" + "name": "react/socket", + "version": "v0.2.1", + "target-dir": "React/Socket", + "source": { + "type": "git", + "url": "https://github.com/react-php/socket.git", + "reference": "v0.2.1" + }, + "dist": { + "type": "zip", + "url": "https://github.com/react-php/socket/zipball/v0.2.1", + "reference": "v0.2.1", + "shasum": "" + }, + "require": { + "php": ">=5.3.3", + "evenement/evenement": "1.0.*", + "react/event-loop": "0.2.*", + "react/stream": "0.2.*" + }, + "time": "2012-09-10 05:56:19", + "type": "library", + "extra": { + "branch-alias": [ + + ] + }, + "installation-source": "dist", + "autoload": { + "psr-0": { + "React\\Socket": "" + } + }, + "license": [ + "MIT" + ], + "description": "Library for building an evented socket server.", + "keywords": [ + "Socket" + ] }, { - "package": "react/stream", - "version": "v0.2.0" - } - ], - "packages-dev": [ + "name": "react/stream", + "version": "v0.2.1", + "target-dir": "React/Stream", + "source": { + "type": "git", + "url": "https://github.com/react-php/stream", + "reference": "v0.2.1" + }, + "dist": { + "type": "zip", + "url": "https://github.com/react-php/stream/zipball/v0.2.1", + "reference": "v0.2.1", + "shasum": "" + }, + "require": { + "php": ">=5.3.3", + "evenement/evenement": "1.0.*" + }, + "suggest": { + "react/event-loop": "0.2.*" + }, + "time": "2012-10-13 13:12:04", + "type": "library", + "extra": { + "branch-alias": [ + ] + }, + "installation-source": "dist", + "autoload": { + "psr-0": { + "React\\Stream": "" + } + }, + "license": [ + "MIT" + ], + "description": "Basic readable and writable stream interfaces that support piping.", + "keywords": [ + "stream", + "pipe" + ] + } ], + "packages-dev": null, "aliases": [ ], "minimum-stability": "dev", "stability-flags": { - "react/async": 20, + "jsor/promise": 20, "react/curry": 20 } } diff --git a/src/React/Whois/Client.php b/src/React/Whois/Client.php index f0b8b54..a27a91c 100644 --- a/src/React/Whois/Client.php +++ b/src/React/Whois/Client.php @@ -2,42 +2,45 @@ namespace React\Whois; -use React\Async\Util as Async; +use Promise\Deferred as Deferred; use React\Curry\Util as Curry; use React\Dns\Resolver\Resolver; class Client { - private $resolver; + private $dns; private $connFactory; - public function __construct(Resolver $resolver, $connFactory) + public function __construct(Resolver $dns, $connFactory) { - $this->resolver = $resolver; + $this->dns = $dns; $this->connFactory = $connFactory; } public function query($domain, $callback) { - Async::waterfall( - array( - Curry::bind(array($this, 'resolveWhoisServer'), $domain), - Curry::bind(array($this, 'queryWhoisServer'), $domain), - ), - $callback - ); + $this + ->resolveWhoisServer($domain) + ->then(Curry::bind(array($this, 'queryWhoisServer'), $domain)) + ->then($callback); } - public function resolveWhoisServer($domain, $callback) + public function resolveWhoisServer($domain) { + $deferred = new Deferred(); + $tld = substr(strrchr($domain, '.'), 1); $target = $tld.'.whois-servers.net'; - $this->resolver->resolve($target, $callback); + $this->dns->resolve($target, array($deferred, 'resolve')); + + return $deferred; } - public function queryWhoisServer($domain, $ip, $callback) + public function queryWhoisServer($domain, $ip) { + $deferred = new Deferred(); + $result = ''; $conn = call_user_func($this->connFactory, $ip); @@ -45,9 +48,11 @@ public function queryWhoisServer($domain, $ip, $callback) $conn->on('data', function ($data) use (&$result) { $result .= $data; }); - $conn->on('close', function () use (&$result, $callback) { + $conn->on('close', function () use (&$result, $deferred) { $result = str_replace("\r\n", "\n", $result); - $callback($result); + $deferred->resolve($result); }); + + return $deferred; } }