Skip to content
This repository was archived by the owner on Oct 22, 2025. It is now read-only.

Commit fa62c21

Browse files
committed
Implement new alarm methods
1 parent 4180e86 commit fa62c21

File tree

7 files changed

+104
-9
lines changed

7 files changed

+104
-9
lines changed

packages/actor-core/src/actor/driver.ts

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -14,6 +14,8 @@ export interface ActorDriver {
1414

1515
// Schedule
1616
setAlarm(actor: AnyActorInstance, timestamp: number): Promise<void>;
17+
getAlarm(actor: AnyActorInstance): Promise<number | null>;
18+
deleteAlarm(actor: AnyActorInstance): Promise<void>;
1719

1820
// TODO:
1921
//destroy(): Promise<void>;

packages/actor-core/src/test/driver/actor.ts

Lines changed: 18 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -8,9 +8,11 @@ export interface ActorDriverContext {
88

99
export class TestActorDriver implements ActorDriver {
1010
#state: TestGlobalState;
11+
#alarms: Map<string, { timeout: NodeJS.Timeout, timestamp: number }>;
1112

1213
constructor(state: TestGlobalState) {
1314
this.#state = state;
15+
this.#alarms = new Map();
1416
}
1517

1618
getContext(_actorId: string): ActorDriverContext {
@@ -29,8 +31,23 @@ export class TestActorDriver implements ActorDriver {
2931

3032
async setAlarm(actor: AnyActorInstance, timestamp: number): Promise<void> {
3133
const delay = Math.max(timestamp - Date.now(), 0);
32-
setTimeout(() => {
34+
const timeout = setTimeout(() => {
35+
this.#alarms.delete(actor.id);
3336
actor.onAlarm();
3437
}, delay);
38+
this.#alarms.set(actor.id, { timeout, timestamp });
39+
}
40+
41+
async getAlarm(actor: AnyActorInstance): Promise<number | null> {
42+
const alarm = this.#alarms.get(actor.id);
43+
return alarm ? alarm.timestamp : null;
44+
}
45+
46+
async deleteAlarm(actor: AnyActorInstance): Promise<void> {
47+
const alarm = this.#alarms.get(actor.id);
48+
if (alarm) {
49+
clearTimeout(alarm.timeout);
50+
this.#alarms.delete(actor.id);
51+
}
3552
}
3653
}

packages/drivers/file-system/src/actor.ts

Lines changed: 20 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -8,9 +8,11 @@ export type ActorDriverContext = Record<never, never>;
88
*/
99
export class FileSystemActorDriver implements ActorDriver {
1010
#state: FileSystemGlobalState;
11+
#alarms: Map<string, { timeout: NodeJS.Timeout, timestamp: number }>;
1112

1213
constructor(state: FileSystemGlobalState) {
1314
this.#state = state;
15+
this.#alarms = new Map();
1416
}
1517

1618
/**
@@ -36,9 +38,24 @@ export class FileSystemActorDriver implements ActorDriver {
3638
}
3739

3840
async setAlarm(actor: AnyActorInstance, timestamp: number): Promise<void> {
39-
const delay = Math.max(0, timestamp - Date.now());
40-
setTimeout(() => {
41+
const delay = Math.max(timestamp - Date.now(), 0);
42+
const timeout = setTimeout(() => {
43+
this.#alarms.delete(actor.id);
4144
actor.onAlarm();
4245
}, delay);
46+
this.#alarms.set(actor.id, { timeout, timestamp });
4347
}
44-
}
48+
49+
async getAlarm(actor: AnyActorInstance): Promise<number | null> {
50+
const alarm = this.#alarms.get(actor.id);
51+
return alarm ? alarm.timestamp : null;
52+
}
53+
54+
async deleteAlarm(actor: AnyActorInstance): Promise<void> {
55+
const alarm = this.#alarms.get(actor.id);
56+
if (alarm) {
57+
clearTimeout(alarm.timeout);
58+
this.#alarms.delete(actor.id);
59+
}
60+
}
61+
}

packages/drivers/memory/src/actor.ts

Lines changed: 18 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -5,9 +5,11 @@ export type ActorDriverContext = Record<never, never>;
55

66
export class MemoryActorDriver implements ActorDriver {
77
#state: MemoryGlobalState;
8+
#alarms: Map<string, { timeout: NodeJS.Timeout, timestamp: number }>;
89

910
constructor(state: MemoryGlobalState) {
1011
this.#state = state;
12+
this.#alarms = new Map();
1113
}
1214

1315
getContext(_actorId: string): ActorDriverContext {
@@ -24,8 +26,23 @@ export class MemoryActorDriver implements ActorDriver {
2426

2527
async setAlarm(actor: AnyActorInstance, timestamp: number): Promise<void> {
2628
const delay = Math.max(timestamp - Date.now(), 0);
27-
setTimeout(() => {
29+
const timeout = setTimeout(() => {
30+
this.#alarms.delete(actor.id);
2831
actor.onAlarm();
2932
}, delay);
33+
this.#alarms.set(actor.id, { timeout, timestamp });
34+
}
35+
36+
async getAlarm(actor: AnyActorInstance): Promise<number | null> {
37+
const alarm = this.#alarms.get(actor.id);
38+
return alarm ? alarm.timestamp : null;
39+
}
40+
41+
async deleteAlarm(actor: AnyActorInstance): Promise<void> {
42+
const alarm = this.#alarms.get(actor.id);
43+
if (alarm) {
44+
clearTimeout(alarm.timeout);
45+
this.#alarms.delete(actor.id);
46+
}
3047
}
3148
}

packages/drivers/redis/src/actor.ts

Lines changed: 18 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -8,9 +8,11 @@ export interface ActorDriverContext {
88

99
export class RedisActorDriver implements ActorDriver {
1010
#redis: Redis;
11+
#alarms: Map<string, { timeout: NodeJS.Timeout, timestamp: number }>;
1112

1213
constructor(redis: Redis) {
1314
this.#redis = redis;
15+
this.#alarms = new Map();
1416
}
1517

1618
getContext(_actorId: string): ActorDriverContext {
@@ -32,8 +34,23 @@ export class RedisActorDriver implements ActorDriver {
3234

3335
async setAlarm(actor: AnyActorInstance, timestamp: number): Promise<void> {
3436
const delay = Math.max(timestamp - Date.now(), 0);
35-
setTimeout(() => {
37+
const timeout = setTimeout(() => {
38+
this.#alarms.delete(actor.id);
3639
actor.onAlarm();
3740
}, delay);
41+
this.#alarms.set(actor.id, { timeout, timestamp });
42+
}
43+
44+
async getAlarm(actor: AnyActorInstance): Promise<number | null> {
45+
const alarm = this.#alarms.get(actor.id);
46+
return alarm ? alarm.timestamp : null;
47+
}
48+
49+
async deleteAlarm(actor: AnyActorInstance): Promise<void> {
50+
const alarm = this.#alarms.get(actor.id);
51+
if (alarm) {
52+
clearTimeout(alarm.timeout);
53+
this.#alarms.delete(actor.id);
54+
}
3855
}
3956
}

packages/platforms/cloudflare-workers/src/actor_driver.ts

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -61,4 +61,12 @@ export class CloudflareWorkersActorDriver implements ActorDriver {
6161
async setAlarm(actor: AnyActorInstance, timestamp: number): Promise<void> {
6262
await this.#getDOCtx(actor.id).storage.setAlarm(timestamp);
6363
}
64+
65+
async getAlarm(actor: AnyActorInstance): Promise<number | null> {
66+
return await this.#getDOCtx(actor.id).storage.getAlarm();
67+
}
68+
69+
async deleteAlarm(actor: AnyActorInstance): Promise<void> {
70+
await this.#getDOCtx(actor.id).storage.deleteAlarm();
71+
}
6472
}

packages/platforms/rivet/src/actor_driver.ts

Lines changed: 20 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -7,9 +7,11 @@ export interface ActorDriverContext {
77

88
export class RivetActorDriver implements ActorDriver {
99
#ctx: ActorContext;
10+
#alarms: Map<string, { timeout: NodeJS.Timeout, timestamp: number }>;
1011

1112
constructor(ctx: ActorContext) {
1213
this.#ctx = ctx;
14+
this.#alarms = new Map();
1315
}
1416

1517
getContext(_actorId: string): ActorDriverContext {
@@ -27,9 +29,24 @@ export class RivetActorDriver implements ActorDriver {
2729
}
2830

2931
async setAlarm(actor: AnyActorInstance, timestamp: number): Promise<void> {
30-
const timeout = Math.max(0, timestamp - Date.now());
31-
setTimeout(() => {
32+
const delay = Math.max(timestamp - Date.now(), 0);
33+
const timeout = setTimeout(() => {
34+
this.#alarms.delete(actor.id);
3235
actor.onAlarm();
33-
}, timeout);
36+
}, delay);
37+
this.#alarms.set(actor.id, { timeout, timestamp });
38+
}
39+
40+
async getAlarm(actor: AnyActorInstance): Promise<number | null> {
41+
const alarm = this.#alarms.get(actor.id);
42+
return alarm ? alarm.timestamp : null;
43+
}
44+
45+
async deleteAlarm(actor: AnyActorInstance): Promise<void> {
46+
const alarm = this.#alarms.get(actor.id);
47+
if (alarm) {
48+
clearTimeout(alarm.timeout);
49+
this.#alarms.delete(actor.id);
50+
}
3451
}
3552
}

0 commit comments

Comments
 (0)