Skip to content

Commit 238a64b

Browse files
authored
Unique timers (#323)
1 parent ede7dbb commit 238a64b

5 files changed

Lines changed: 42 additions & 11 deletions

File tree

src/Signal.php

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -13,7 +13,7 @@
1313
use Workflow\Middleware\WithoutOverlappingMiddleware;
1414
use Workflow\Models\StoredWorkflow;
1515

16-
final class Signal implements ShouldBeEncrypted, ShouldQueue
16+
class Signal implements ShouldBeEncrypted, ShouldQueue
1717
{
1818
use Dispatchable;
1919
use InteractsWithQueue;

src/Timer.php

Lines changed: 25 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,25 @@
1+
<?php
2+
3+
declare(strict_types=1);
4+
5+
namespace Workflow;
6+
7+
use Illuminate\Contracts\Queue\ShouldBeUnique;
8+
use Workflow\Models\StoredWorkflow;
9+
10+
final class Timer extends Signal implements ShouldBeUnique
11+
{
12+
public function __construct(
13+
public StoredWorkflow $storedWorkflow,
14+
public int $index,
15+
$connection = null,
16+
$queue = null
17+
) {
18+
parent::__construct($storedWorkflow, $connection, $queue);
19+
}
20+
21+
public function uniqueId()
22+
{
23+
return $this->storedWorkflow->id . ':' . $this->index;
24+
}
25+
}

src/Traits/Timers.php

Lines changed: 8 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -9,7 +9,7 @@
99
use React\Promise\PromiseInterface;
1010
use function React\Promise\resolve;
1111
use Workflow\Serializers\Serializer;
12-
use Workflow\Signal;
12+
use Workflow\Timer;
1313

1414
trait Timers
1515
{
@@ -66,7 +66,7 @@ public static function timer(int|string|CarbonInterval $seconds): PromiseInterfa
6666
->create([
6767
'index' => self::$context->index,
6868
'now' => self::$context->now,
69-
'class' => Signal::class,
69+
'class' => Timer::class,
7070
'result' => Serializer::serialize(true),
7171
]);
7272
} catch (\Illuminate\Database\UniqueConstraintViolationException $exception) {
@@ -90,7 +90,12 @@ public static function timer(int|string|CarbonInterval $seconds): PromiseInterfa
9090
}
9191
}
9292

93-
Signal::dispatch(self::$context->storedWorkflow, self::connection(), self::queue())->delay($delay);
93+
Timer::dispatch(
94+
self::$context->storedWorkflow,
95+
self::$context->index,
96+
self::connection(),
97+
self::queue()
98+
)->delay($delay);
9499
}
95100

96101
++self::$context->index;

tests/Unit/Traits/TimersTest.php

Lines changed: 6 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -15,8 +15,8 @@
1515
use Tests\TestCase;
1616
use Workflow\Models\StoredWorkflow;
1717
use Workflow\Serializers\Serializer;
18-
use Workflow\Signal;
1918
use Workflow\States\WorkflowPendingStatus;
19+
use Workflow\Timer;
2020
use Workflow\WorkflowStub;
2121

2222
final class TimersTest extends TestCase
@@ -109,7 +109,7 @@ public function testStoresResult(): void
109109
$this->assertDatabaseHas('workflow_logs', [
110110
'stored_workflow_id' => $workflow->id(),
111111
'index' => 0,
112-
'class' => Signal::class,
112+
'class' => Timer::class,
113113
]);
114114
$this->assertSame(true, Serializer::unserialize($workflow->logs()->firstWhere('index', 0)->result));
115115
}
@@ -127,7 +127,7 @@ public function testLoadsStoredResult(): void
127127
->create([
128128
'index' => 0,
129129
'now' => now(),
130-
'class' => Signal::class,
130+
'class' => Timer::class,
131131
'result' => Serializer::serialize(true),
132132
]);
133133

@@ -141,7 +141,7 @@ public function testLoadsStoredResult(): void
141141
$this->assertDatabaseHas('workflow_logs', [
142142
'stored_workflow_id' => $workflow->id(),
143143
'index' => 0,
144-
'class' => Signal::class,
144+
'class' => Timer::class,
145145
]);
146146
$this->assertSame(true, Serializer::unserialize($workflow->logs()->firstWhere('index', 0)->result));
147147
}
@@ -159,7 +159,7 @@ public function testHandlesDuplicateLogInsertionProperly(): void
159159
->create([
160160
'index' => 0,
161161
'now' => now(),
162-
'class' => Signal::class,
162+
'class' => Timer::class,
163163
'result' => Serializer::serialize(true),
164164
]);
165165

@@ -296,7 +296,7 @@ public function testTimerCapsDelayForSqsDriver(): void
296296

297297
$this->assertNull($result);
298298

299-
Bus::assertDispatched(Signal::class, function ($job) use ($now) {
299+
Bus::assertDispatched(Timer::class, function ($job) use ($now) {
300300
$delaySeconds = $job->delay->diffInSeconds($now);
301301
$this->assertLessThanOrEqual(900, $delaySeconds);
302302
$this->assertGreaterThanOrEqual(899, $delaySeconds);

tests/Unit/WorkflowStubTest.php

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -20,6 +20,7 @@
2020
use Workflow\States\WorkflowCreatedStatus;
2121
use Workflow\States\WorkflowPendingStatus;
2222
use Workflow\States\WorkflowWaitingStatus;
23+
use Workflow\Timer;
2324
use Workflow\WorkflowStub;
2425

2526
final class WorkflowStubTest extends TestCase
@@ -204,7 +205,7 @@ public function testAwaitWithTimeoutTimedout(): void
204205
$this->assertDatabaseHas('workflow_logs', [
205206
'stored_workflow_id' => $workflow->id(),
206207
'index' => 1,
207-
'class' => Signal::class,
208+
'class' => Timer::class,
208209
]);
209210
$this->assertTrue(Serializer::unserialize($workflow->logs()->firstWhere('index', 1)->result));
210211
}

0 commit comments

Comments
 (0)