kadet/nucleus

PHP的异步XMPP库

v0.2.0 2016-08-21 21:06 UTC

This package is auto-updated.

Last update: 2024-08-29 02:06:30 UTC


README

Nucleus Logo

[进行中] Nucleus - PHP的XMPP库

Packagist Milestone Travis Scrutinizer Code Climate Scrutinizer Coverage

基于React PHP的PHP异步XMPP库。
该库仍在开发中,因此不建议使用。它已废弃我的旧kadet/xmpp包。

已可用

模块化客户端类

按照设计,客户端类(\Kadet\Xmpp\XmppClient)像流一样用于在网络中发送和接收数据包,同时充当事件发射器来通知事件,并且作为依赖容器(这是一种对SRP的奇妙违反)来管理模块。它允许将几乎所有逻辑移动到适当的可交换组件中。

基本客户端实例可以非常容易地设置

$loop   = React\EventLoop\Factory::create();
$client = new \Kadet\Xmpp\XmppClient(new \Kadet\Xmpp\Jid('local@domain.tld/resource'), [
    'loop'     => $loop,
    'password' => 'epicpasspeoem',
]);

// Event declatation ...

$client->connect();
$loop->run();

传递给第二个参数的选项与C#的属性实例化等效,因此上面的示例与调用相同

$client = new \Kadet\Xmpp\XmppClient(new \Kadet\Xmpp\Jid('local@domain.tld/resource'));
$client->loop = $loop;
$client->password = 'epicpasspoem';

除了modulesdefault-modules,它们用于初始模块设置。您可以通过将default-modules设置为false来禁用默认模块,但出于非测试目的,强烈不建议这样做。

可用的事件有

element(Kadet\Xmpp\Xml\XmlElement $element) // element received
features(Kadet\Xmpp\StreamFeatures $features) // features received

send.element(Kadet\Xmpp\Xml\XmlElement $element) // element sent
send.text(string $data) // some text (non valid XmlElement) sent

stream.open(Kadet\Xmpp\Xml\XmlElement $stream) // Stream started
stream.close() // Stream closed

stream.error(Kadet\Xmpp\Stream\Error $error) // Stream errored

connect(StreamDuplexInterface $stream) // called when connection is ready
exception(Exception $exception) // called when otherwise unhandled exception happens

此外,所有来自react/stream的默认事件都适用。

TLS处理

大多数XMPP服务器需要TLS连接,默认情况下React流不支持加密。如果底层流实现了\Kadet\Xmpp\Network\SecureStream接口(提供的流类如\Kadet\Xmpp\Network\TcpStream默认实现了该接口),则库将处理加密。

(更好的)事件API

Nucleus使用evenement/evenement的扩展版本来提供方便的EventEmitter API。因此,您现在可以根据谓词过滤事件,并且事件队列是优先级排序的。

$emitter->on($event, $callback, $predicate = null, $priority = 0);

谓词以及回调函数都使用传递给事件的事件参数调用。有几个默认谓词可供使用,您可以在Utils/Filter.php中找到它们。

// Will fire event only if element belongs into self::TLS_NAMESPACE.
$stream->on('element', $callable, with\xmlns(self::TLS_NAMESPACE));

您还可以优先排序事件

$stream->on('element', $second, null, 0);
$stream->on('element', $first, null, 1); // will fire first

默认情况下不提供发送者参数,如果需要,您必须部分应用函数,每个事件发射类中也有快捷方式。

$stream->on('element', $stream->reference($callable)); // Will fire $callable($stream, ...$arguments);

事件队列可以通过事件返回false来停止。

要完成的事情

请查看Trello上的路线图,我会保持更新。项目是按照里程碑系统创建的,这意味着在每个里程碑完成后API应该稳定 - 但目前尚无保证。