Skip to content

Commit 2267f4f

Browse files
committed
Unify arguments with idle and properly support query callback and frequency as callable
1 parent b36ac85 commit 2267f4f

File tree

4 files changed

+21
-25
lines changed

4 files changed

+21
-25
lines changed

src/Folder.php

Lines changed: 4 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -140,27 +140,22 @@ function (int $msgn) use ($callback, $fetch) {
140140
/**
141141
* {@inheritDoc}
142142
*/
143-
public function poll(int $frequency, callable $callback, ?callable $query = null): void
143+
public function poll(callable $callback, ?callable $query = null, callable|int $frequency = 60): void
144144
{
145-
// The message query to use when fetching messages.
146-
$query ??= fn (MessageQuery $query) => $query;
147-
148145
(new Poll(clone $this->mailbox, $this->path, $frequency))->start(
149-
function (MessageInterface $message) use ($callback, $query) {
146+
function (MessageInterface $message) use ($callback) {
150147
if (! $this->mailbox->connected()) {
151148
$this->mailbox->connect();
152149
}
153150

154151
try {
155-
// Apply the query to the message if needed.
156-
$query($this->messages());
157-
158152
$callback($message);
159153
} catch (Exception) {
160154
// Something happened. We will attempt reconnecting.
161155
$this->mailbox->reconnect();
162156
}
163-
}
157+
},
158+
$query ?? fn (MessageQuery $query) => $query
164159
);
165160
}
166161

src/FolderInterface.php

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -47,9 +47,9 @@ public function messages(): MessageQueryInterface;
4747
public function idle(callable $callback, ?callable $query = null, callable|int $timeout = 300): void;
4848

4949
/**
50-
* Poll for new messages at a given frequency.
50+
* Begin polling for new messages at a given frequency.
5151
*/
52-
public function poll(int $frequency, callable $callback, ?callable $query = null): void;
52+
public function poll(callable $callback, ?callable $query = null, callable|int $frequency = 60): void;
5353

5454
/**
5555
* Move or rename the current folder.

src/Poll.php

Lines changed: 14 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -33,13 +33,13 @@ public function __destruct()
3333
/**
3434
* Poll for new messages at a given frequency.
3535
*/
36-
public function start(callable $callback): void
36+
public function start(callable $callback, callable $query): void
3737
{
3838
$this->connect();
3939

4040
while ($frequency = $this->getNextFrequency()) {
4141
try {
42-
$this->check($callback);
42+
$this->check($callback, $query);
4343
} catch (ImapConnectionClosedException) {
4444
$this->reconnect();
4545
}
@@ -51,24 +51,25 @@ public function start(callable $callback): void
5151
/**
5252
* Check for new messages since the last seen UID.
5353
*/
54-
protected function check(callable $callback): void
54+
protected function check(callable $callback, callable $query): void
5555
{
5656
$folder = $this->folder();
5757

58-
$query = $folder->messages();
58+
if (! $this->lastSeenUid) {
59+
$this->lastSeenUid = $folder->messages()
60+
->first()
61+
?->uid() ?? 0;
5962

60-
// If we have a last seen UID, search for messages after it.
61-
if ($this->lastSeenUid !== null) {
62-
$query->uid($this->lastSeenUid + 1, INF);
63+
return;
6364
}
6465

65-
$messages = $query->get();
66+
$query($folder->messages())
67+
->uid($this->lastSeenUid + 1, INF)
68+
->each(function (MessageInterface $message) use ($callback) {
69+
$callback($message);
6670

67-
foreach ($messages as $message) {
68-
$callback($message);
69-
70-
$this->lastSeenUid = $message->uid();
71-
}
71+
$this->lastSeenUid = $message->uid();
72+
});
7273
}
7374

7475
/**

src/Testing/FakeFolder.php

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -99,7 +99,7 @@ public function idle(callable $callback, ?callable $query = null, callable|int $
9999
/**
100100
* {@inheritDoc}
101101
*/
102-
public function poll(int $frequency, callable $callback, ?callable $query = null): void
102+
public function poll(callable $callback, ?callable $query = null, callable|int $frequency = 60): void
103103
{
104104
foreach ($this->messages as $message) {
105105
$callback($message);

0 commit comments

Comments
 (0)