@pikku/redis 0.12.21 → 0.12.24

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/README.md CHANGED
@@ -3,8 +3,9 @@
3
3
  Redis-backed implementations of the Pikku service interfaces — workflow state,
4
4
  agent runs, secrets, sessions, and the channel and event-hub stores.
5
5
 
6
- Uses `ioredis`. Distributed run locking is handled with `SET NX` plus a TTL, so
7
- concurrent workers can safely share a run.
6
+ Uses `ioredis`. `RedisLeaseService` implements leases with `SET NX` plus a TTL,
7
+ and the workflow service locks runs and steps on whichever `leaseService` it is
8
+ given, so concurrent workers can safely share a run.
8
9
 
9
10
  ## Install
10
11
 
@@ -16,21 +17,23 @@ npm install @pikku/redis ioredis
16
17
 
17
18
  ```typescript
18
19
  import Redis from 'ioredis'
19
- import { RedisWorkflowService } from '@pikku/redis'
20
+ import { RedisLeaseService, RedisWorkflowService } from '@pikku/redis'
20
21
 
21
- const workflowService = new RedisWorkflowService(
22
- new Redis('redis://localhost:6379'),
23
- queueService,
24
- 'workflows'
25
- )
22
+ const redis = new Redis('redis://localhost:6379')
23
+ const leaseService = new RedisLeaseService(redis)
24
+
25
+ const workflowService = new RedisWorkflowService(redis, {
26
+ leaseService,
27
+ keyPrefix: 'workflows',
28
+ })
26
29
 
27
30
  await workflowService.init()
28
31
  ```
29
32
 
30
33
  The first argument also accepts a connection string or an `ioredis` options
31
34
  object, in which case the service owns the connection and `close()` will end
32
- it. Omit `queueService` to run workflows inline, which is useful in tests. The
33
- third argument is the key prefix, defaulting to `workflows`.
35
+ it. `keyPrefix` defaults to `workflows`. Register the same `leaseService` as the
36
+ app's `leaseService`.
34
37
 
35
38
  ## Docs
36
39
 
@@ -8,3 +8,5 @@ export { RedisAgentRunService } from './redis-agent-run-service.js';
8
8
  export { RedisSecretService } from './redis-secret-service.js';
9
9
  export type { AgentRunService, AgentRunRow } from '@pikku/core/agent';
10
10
  export { RedisSessionStore } from './redis-session-store.js';
11
+ export { RedisLeaseService } from './redis-lease-service.js';
12
+ export type { RedisLeaseServiceConfig } from './redis-lease-service.js';
package/dist/src/index.js CHANGED
@@ -6,4 +6,5 @@ export { RedisWorkflowRunService } from './redis-workflow-run-service.js';
6
6
  export { RedisAgentRunService } from './redis-agent-run-service.js';
7
7
  export { RedisSecretService } from './redis-secret-service.js';
8
8
  export { RedisSessionStore } from './redis-session-store.js';
9
+ export { RedisLeaseService } from './redis-lease-service.js';
9
10
  //# sourceMappingURL=index.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,iBAAiB,EAAE,MAAM,0BAA0B,CAAA;AAC5D,OAAO,EAAE,sBAAsB,EAAE,MAAM,+BAA+B,CAAA;AACtE,OAAO,EAAE,kBAAkB,EAAE,MAAM,2BAA2B,CAAA;AAC9D,OAAO,EAAE,oBAAoB,EAAE,MAAM,6BAA6B,CAAA;AAClE,OAAO,EAAE,uBAAuB,EAAE,MAAM,iCAAiC,CAAA;AAEzE,OAAO,EAAE,oBAAoB,EAAE,MAAM,8BAA8B,CAAA;AACnE,OAAO,EAAE,kBAAkB,EAAE,MAAM,2BAA2B,CAAA;AAE9D,OAAO,EAAE,iBAAiB,EAAE,MAAM,0BAA0B,CAAA"}
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,iBAAiB,EAAE,MAAM,0BAA0B,CAAA;AAC5D,OAAO,EAAE,sBAAsB,EAAE,MAAM,+BAA+B,CAAA;AACtE,OAAO,EAAE,kBAAkB,EAAE,MAAM,2BAA2B,CAAA;AAC9D,OAAO,EAAE,oBAAoB,EAAE,MAAM,6BAA6B,CAAA;AAClE,OAAO,EAAE,uBAAuB,EAAE,MAAM,iCAAiC,CAAA;AAEzE,OAAO,EAAE,oBAAoB,EAAE,MAAM,8BAA8B,CAAA;AACnE,OAAO,EAAE,kBAAkB,EAAE,MAAM,2BAA2B,CAAA;AAE9D,OAAO,EAAE,iBAAiB,EAAE,MAAM,0BAA0B,CAAA;AAC5D,OAAO,EAAE,iBAAiB,EAAE,MAAM,0BAA0B,CAAA"}
@@ -52,7 +52,9 @@ export class RedisDeploymentService {
52
52
  pipeline.zadd(this.functionsIndexKey(fn), expiryScore, config.deploymentId);
53
53
  }
54
54
  await pipeline.exec();
55
- this.heartbeatTimer = setInterval(() => this.sendHeartbeat(), this.heartbeatInterval);
55
+ this.heartbeatTimer = setInterval(() => {
56
+ void this.sendHeartbeat();
57
+ }, this.heartbeatInterval);
56
58
  }
57
59
  async stop() {
58
60
  if (this.heartbeatTimer) {
@@ -1 +1 @@
1
- {"version":3,"file":"redis-deployment-service.js","sourceRoot":"","sources":["../../src/redis-deployment-service.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"redis-deployment-service.js","sourceRoot":"","sources":["../../src/redis-deployment-service.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,18 @@
1
+ import type { Lease, LeaseService } from '@pikku/core/services';
2
+ import { Redis, type RedisOptions } from 'ioredis';
3
+ export interface RedisLeaseServiceConfig {
4
+ keyPrefix?: string;
5
+ }
6
+ export declare class RedisLeaseService implements LeaseService {
7
+ private redis;
8
+ private ownsConnection;
9
+ private keyPrefix;
10
+ constructor(connectionOrConfig: Redis | RedisOptions | string | undefined, config?: RedisLeaseServiceConfig);
11
+ acquire(key: string, holder: string, ttlMs: number): Promise<Lease | null>;
12
+ refresh(lease: Lease, ttlMs: number): Promise<Lease | null>;
13
+ release(lease: Lease): Promise<void>;
14
+ get(key: string): Promise<Lease | null>;
15
+ close(): Promise<void>;
16
+ private leaseKey;
17
+ private tokenKey;
18
+ }
@@ -0,0 +1,94 @@
1
+ import { Redis } from 'ioredis';
2
+ const NOW_MS = `
3
+ local time = redis.call('TIME')
4
+ local now = tonumber(time[1]) * 1000 + math.floor(tonumber(time[2]) / 1000)
5
+ `;
6
+ const ACQUIRE = `${NOW_MS}
7
+ local ttl = tonumber(ARGV[2])
8
+ local current = redis.call('HMGET', KEYS[1], 'holder', 'token')
9
+ local token
10
+ if current[1] then
11
+ if current[1] ~= ARGV[1] then return false end
12
+ token = tonumber(current[2])
13
+ else
14
+ token = redis.call('INCR', KEYS[2])
15
+ redis.call('HSET', KEYS[1], 'holder', ARGV[1], 'token', token)
16
+ end
17
+ redis.call('PEXPIRE', KEYS[1], ttl)
18
+ return {token, now + ttl}
19
+ `;
20
+ const REFRESH = `${NOW_MS}
21
+ local current = redis.call('HMGET', KEYS[1], 'holder', 'token')
22
+ if current[1] ~= ARGV[1] or current[2] ~= ARGV[2] then return false end
23
+ local ttl = tonumber(ARGV[3])
24
+ redis.call('PEXPIRE', KEYS[1], ttl)
25
+ return now + ttl
26
+ `;
27
+ const RELEASE = `
28
+ local current = redis.call('HMGET', KEYS[1], 'holder', 'token')
29
+ if current[1] ~= ARGV[1] or current[2] ~= ARGV[2] then return 0 end
30
+ return redis.call('DEL', KEYS[1])
31
+ `;
32
+ const GET = `${NOW_MS}
33
+ local current = redis.call('HMGET', KEYS[1], 'holder', 'token')
34
+ if not current[1] then return false end
35
+ local left = redis.call('PTTL', KEYS[1])
36
+ if left <= 0 then return false end
37
+ return {current[1], tonumber(current[2]), now + left}
38
+ `;
39
+ export class RedisLeaseService {
40
+ redis;
41
+ ownsConnection;
42
+ keyPrefix;
43
+ constructor(connectionOrConfig, config = {}) {
44
+ if (connectionOrConfig instanceof Redis) {
45
+ this.redis = connectionOrConfig;
46
+ this.ownsConnection = false;
47
+ }
48
+ else if (typeof connectionOrConfig === 'string') {
49
+ this.redis = new Redis(connectionOrConfig);
50
+ this.ownsConnection = true;
51
+ }
52
+ else {
53
+ this.redis = new Redis(connectionOrConfig ?? {});
54
+ this.ownsConnection = true;
55
+ }
56
+ this.keyPrefix = config.keyPrefix ?? 'pikku';
57
+ }
58
+ async acquire(key, holder, ttlMs) {
59
+ const acquired = (await this.redis.eval(ACQUIRE, 2, this.leaseKey(key), this.tokenKey(key), holder, toPexpire(ttlMs)));
60
+ if (!acquired)
61
+ return null;
62
+ const [token, expiresAt] = acquired;
63
+ return { key, holder, token, expiresAt: new Date(expiresAt) };
64
+ }
65
+ async refresh(lease, ttlMs) {
66
+ const expiresAt = (await this.redis.eval(REFRESH, 1, this.leaseKey(lease.key), lease.holder, String(lease.token), toPexpire(ttlMs)));
67
+ if (expiresAt === null)
68
+ return null;
69
+ return { ...lease, expiresAt: new Date(expiresAt) };
70
+ }
71
+ async release(lease) {
72
+ await this.redis.eval(RELEASE, 1, this.leaseKey(lease.key), lease.holder, String(lease.token));
73
+ }
74
+ async get(key) {
75
+ const current = (await this.redis.eval(GET, 1, this.leaseKey(key)));
76
+ if (!current)
77
+ return null;
78
+ const [holder, token, expiresAt] = current;
79
+ return { key, holder, token, expiresAt: new Date(expiresAt) };
80
+ }
81
+ async close() {
82
+ if (this.ownsConnection) {
83
+ await this.redis.quit();
84
+ }
85
+ }
86
+ leaseKey(key) {
87
+ return `${this.keyPrefix}:lease:{${key}}`;
88
+ }
89
+ tokenKey(key) {
90
+ return `${this.keyPrefix}:lease-token:{${key}}`;
91
+ }
92
+ }
93
+ const toPexpire = (ttlMs) => Math.max(1, Math.ceil(ttlMs));
94
+ //# sourceMappingURL=redis-lease-service.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"redis-lease-service.js","sourceRoot":"","sources":["../../src/redis-lease-service.ts"],"names":[],"mappings":"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"}
@@ -47,9 +47,18 @@ export class RedisWorkflowRunService {
47
47
  const data = await this.redis.hgetall(key);
48
48
  if (!data.stepId)
49
49
  continue;
50
+ const settled = data.status === 'succeeded' || data.status === 'failed';
51
+ const [latest] = settled
52
+ ? await this.redis.zrange(this.stepHistoryKey(data.stepId), '-1', '-1')
53
+ : [];
54
+ const finished = latest ? JSON.parse(latest) : undefined;
50
55
  steps.push({
51
56
  stepId: data.stepId,
52
57
  stepName: this.extractStepName(key, runId),
58
+ succeededAt: finished?.succeededAt
59
+ ? new Date(finished.succeededAt)
60
+ : undefined,
61
+ failedAt: finished?.failedAt ? new Date(finished.failedAt) : undefined,
53
62
  rpcName: data.rpcName || undefined,
54
63
  data: data.data ? JSON.parse(data.data) : undefined,
55
64
  status: data.status,
@@ -58,6 +67,7 @@ export class RedisWorkflowRunService {
58
67
  attemptCount: Number(data.attemptCount || 1),
59
68
  retries: data.retries ? Number(data.retries) : undefined,
60
69
  retryDelay: data.retryDelay || undefined,
70
+ childRunId: data.childRunId || undefined,
61
71
  createdAt: new Date(Number(data.createdAt)),
62
72
  updatedAt: new Date(Number(data.updatedAt)),
63
73
  });
@@ -1 +1 @@
1
- {"version":3,"file":"redis-workflow-run-service.js","sourceRoot":"","sources":["../../src/redis-workflow-run-service.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"redis-workflow-run-service.js","sourceRoot":"","sources":["../../src/redis-workflow-run-service.ts"],"names":[],"mappings":"AAQA,MAAM,OAAO,uBAAuB;IAExB,KAAK;IACL,SAAS;IAFnB,YACU,KAAY,EACZ,SAAS,GAAG,WAAW;qBADvB,KAAK;yBACL,SAAS;IAChB,CAAC;IAEI,MAAM,CAAC,KAAa;QAC1B,OAAO,GAAG,IAAI,CAAC,SAAS,QAAQ,KAAK,EAAE,CAAA;IACzC,CAAC;IAEO,cAAc,CAAC,KAAa;QAClC,OAAO,GAAG,IAAI,CAAC,SAAS,SAAS,KAAK,IAAI,CAAA;IAC5C,CAAC;IAEO,cAAc,CAAC,MAAc;QACnC,OAAO,GAAG,IAAI,CAAC,SAAS,iBAAiB,MAAM,EAAE,CAAA;IACnD,CAAC;IAEO,UAAU,CAAC,IAAY,EAAE,SAAiB;QAChD,OAAO,GAAG,IAAI,CAAC,SAAS,YAAY,IAAI,IAAI,SAAS,EAAE,CAAA;IACzD,CAAC;IAED,KAAK,CAAC,QAAQ,CAAC,OAKd;QACC,MAAM,EAAE,YAAY,EAAE,MAAM,EAAE,KAAK,GAAG,EAAE,EAAE,MAAM,GAAG,CAAC,EAAE,GAAG,OAAO,IAAI,EAAE,CAAA;QAEtE,MAAM,OAAO,GAAG,MAAM,IAAI,CAAC,QAAQ,CAAC,GAAG,IAAI,CAAC,SAAS,QAAQ,CAAC,CAAA;QAE9D,MAAM,IAAI,GAAkB,EAAE,CAAA;QAC9B,KAAK,MAAM,GAAG,IAAI,OAAO,EAAE,CAAC;YAC1B,MAAM,IAAI,GAAG,MAAM,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,GAAG,CAAC,CAAA;YAC1C,IAAI,CAAC,IAAI,CAAC,EAAE;gBAAE,SAAQ;YAEtB,IAAI,YAAY,IAAI,IAAI,CAAC,QAAQ,KAAK,YAAY;gBAAE,SAAQ;YAC5D,IAAI,MAAM,IAAI,IAAI,CAAC,MAAM,KAAK,MAAM;gBAAE,SAAQ;YAE9C,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,UAAU,CAAC,IAAI,CAAC,CAAC,CAAA;QAClC,CAAC;QAED,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,SAAS,CAAC,OAAO,EAAE,GAAG,CAAC,CAAC,SAAS,CAAC,OAAO,EAAE,CAAC,CAAA;QAElE,OAAO,IAAI,CAAC,KAAK,CAAC,MAAM,EAAE,MAAM,GAAG,KAAK,CAAC,CAAA;IAC3C,CAAC;IAED,KAAK,CAAC,MAAM,CAAC,EAAU;QACrB,MAAM,IAAI,GAAG,MAAM,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,IAAI,CAAC,MAAM,CAAC,EAAE,CAAC,CAAC,CAAA;QACtD,IAAI,CAAC,IAAI,CAAC,EAAE;YAAE,OAAO,IAAI,CAAA;QACzB,OAAO,IAAI,CAAC,UAAU,CAAC,IAAI,CAAC,CAAA;IAC9B,CAAC;IAED,KAAK,CAAC,WAAW,CACf,KAAa;QAIb,MAAM,QAAQ,GAAG,MAAM,IAAI,CAAC,QAAQ,CAAC,IAAI,CAAC,cAAc,CAAC,KAAK,CAAC,CAAC,CAAA;QAEhE,MAAM,KAAK,GAEP,EAAE,CAAA;QAEN,KAAK,MAAM,GAAG,IAAI,QAAQ,EAAE,CAAC;YAC3B,MAAM,IAAI,GAAG,MAAM,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,GAAG,CAAC,CAAA;YAC1C,IAAI,CAAC,IAAI,CAAC,MAAM;gBAAE,SAAQ;YAE1B,MAAM,OAAO,GAAG,IAAI,CAAC,MAAM,KAAK,WAAW,IAAI,IAAI,CAAC,MAAM,KAAK,QAAQ,CAAA;YACvE,MAAM,CAAC,MAAM,CAAC,GAAG,OAAO;gBACtB,CAAC,CAAC,MAAM,IAAI,CAAC,KAAK,CAAC,MAAM,CAAC,IAAI,CAAC,cAAc,CAAC,IAAI,CAAC,MAAM,CAAC,EAAE,IAAI,EAAE,IAAI,CAAC;gBACvE,CAAC,CAAC,EAAE,CAAA;YACN,MAAM,QAAQ,GAAG,MAAM,CAAC,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,SAAS,CAAA;YAExD,KAAK,CAAC,IAAI,CAAC;gBACT,MAAM,EAAE,IAAI,CAAC,MAAM;gBACnB,QAAQ,EAAE,IAAI,CAAC,eAAe,CAAC,GAAG,EAAE,KAAK,CAAC;gBAC1C,WAAW,EAAE,QAAQ,EAAE,WAAW;oBAChC,CAAC,CAAC,IAAI,IAAI,CAAC,QAAQ,CAAC,WAAW,CAAC;oBAChC,CAAC,CAAC,SAAS;gBACb,QAAQ,EAAE,QAAQ,EAAE,QAAQ,CAAC,CAAC,CAAC,IAAI,IAAI,CAAC,QAAQ,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC,SAAS;gBACtE,OAAO,EAAE,IAAI,CAAC,OAAO,IAAI,SAAS;gBAClC,IAAI,EAAE,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,SAAS;gBACnD,MAAM,EAAE,IAAI,CAAC,MAAa;gBAC1B,MAAM,EAAE,IAAI,CAAC,MAAM,CAAC,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,SAAS;gBACzD,KAAK,EAAE,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,SAAS;gBACtD,YAAY,EAAE,MAAM,CAAC,IAAI,CAAC,YAAY,IAAI,CAAC,CAAC;gBAC5C,OAAO,EAAE,IAAI,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,SAAS;gBACxD,UAAU,EAAE,IAAI,CAAC,UAAU,IAAI,SAAS;gBACxC,UAAU,EAAE,IAAI,CAAC,UAAU,IAAI,SAAS;gBACxC,SAAS,EAAE,IAAI,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC;gBAC3C,SAAS,EAAE,IAAI,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC;aAC5C,CAAC,CAAA;QACJ,CAAC;QAED,KAAK,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,SAAS,CAAC,OAAO,EAAE,GAAG,CAAC,CAAC,SAAS,CAAC,OAAO,EAAE,CAAC,CAAA;QAEnE,OAAO,KAAK,CAAA;IACd,CAAC;IAED,KAAK,CAAC,aAAa,CACjB,KAAa;QAEb,MAAM,QAAQ,GAAG,MAAM,IAAI,CAAC,QAAQ,CAAC,IAAI,CAAC,cAAc,CAAC,KAAK,CAAC,CAAC,CAAA;QAEhE,MAAM,iBAAiB,GAA4C,EAAE,CAAA;QAErE,KAAK,MAAM,GAAG,IAAI,QAAQ,EAAE,CAAC;YAC3B,MAAM,IAAI,GAAG,MAAM,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,GAAG,CAAC,CAAA;YAC1C,IAAI,CAAC,IAAI,CAAC,MAAM;gBAAE,SAAQ;YAE1B,MAAM,cAAc,GAAG,MAAM,IAAI,CAAC,KAAK,CAAC,MAAM,CAC5C,IAAI,CAAC,cAAc,CAAC,IAAI,CAAC,MAAM,CAAC,EAChC,CAAC,EACD,IAAI,CACL,CAAA;YAED,KAAK,MAAM,QAAQ,IAAI,cAAc,EAAE,CAAC;gBACtC,MAAM,KAAK,GAAG,IAAI,CAAC,KAAK,CAAC,QAAQ,CAAC,CAAA;gBAClC,iBAAiB,CAAC,IAAI,CAAC;oBACrB,MAAM,EAAE,KAAK,CAAC,MAAM;oBACpB,QAAQ,EAAE,KAAK,CAAC,QAAQ;oBACxB,MAAM,EAAE,KAAK,CAAC,MAAM;oBACpB,MAAM,EAAE,KAAK,CAAC,MAAM,CAAC,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,SAAS;oBAC3D,KAAK,EAAE,KAAK,CAAC,KAAK,CAAC,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,SAAS;oBACxD,YAAY,EAAE,KAAK,CAAC,YAAY;oBAChC,OAAO,EAAE,KAAK,CAAC,OAAO;oBACtB,UAAU,EAAE,KAAK,CAAC,UAAU;oBAC5B,SAAS,EAAE,IAAI,IAAI,CAAC,KAAK,CAAC,SAAS,CAAC;oBACpC,SAAS,EAAE,IAAI,IAAI,CAAC,KAAK,CAAC,SAAS,CAAC;oBACpC,SAAS,EAAE,KAAK,CAAC,SAAS,CAAC,CAAC,CAAC,IAAI,IAAI,CAAC,KAAK,CAAC,SAAS,CAAC,CAAC,CAAC,CAAC,SAAS;oBAClE,WAAW,EAAE,KAAK,CAAC,WAAW;wBAC5B,CAAC,CAAC,IAAI,IAAI,CAAC,KAAK,CAAC,WAAW,CAAC;wBAC7B,CAAC,CAAC,SAAS;oBACb,WAAW,EAAE,KAAK,CAAC,WAAW;wBAC5B,CAAC,CAAC,IAAI,IAAI,CAAC,KAAK,CAAC,WAAW,CAAC;wBAC7B,CAAC,CAAC,SAAS;oBACb,QAAQ,EAAE,KAAK,CAAC,QAAQ,CAAC,CAAC,CAAC,IAAI,IAAI,CAAC,KAAK,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC,SAAS;iBAChE,CAAC,CAAA;YACJ,CAAC;QACH,CAAC;QAED,OAAO,iBAAiB,CAAC,IAAI,CAC3B,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,SAAS,CAAC,OAAO,EAAE,GAAG,CAAC,CAAC,SAAS,CAAC,OAAO,EAAE,CACxD,CAAA;IACH,CAAC;IAED,KAAK,CAAC,wBAAwB;QAC5B,MAAM,OAAO,GAAG,MAAM,IAAI,CAAC,QAAQ,CAAC,GAAG,IAAI,CAAC,SAAS,QAAQ,CAAC,CAAA;QAE9D,MAAM,KAAK,GAAG,IAAI,GAAG,EAAU,CAAA;QAC/B,KAAK,MAAM,GAAG,IAAI,OAAO,EAAE,CAAC;YAC1B,MAAM,QAAQ,GAAG,MAAM,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,GAAG,EAAE,UAAU,CAAC,CAAA;YACvD,IAAI,QAAQ;gBAAE,KAAK,CAAC,GAAG,CAAC,QAAQ,CAAC,CAAA;QACnC,CAAC;QAED,OAAO,CAAC,GAAG,KAAK,CAAC,CAAC,IAAI,EAAE,CAAA;IAC1B,CAAC;IAED,KAAK,CAAC,kBAAkB,CACtB,IAAY,EACZ,SAAiB;QAEjB,MAAM,IAAI,GAAG,MAAM,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,IAAI,CAAC,UAAU,CAAC,IAAI,EAAE,SAAS,CAAC,CAAC,CAAA;QACvE,IAAI,CAAC,IAAI,CAAC,KAAK;YAAE,OAAO,IAAI,CAAA;QAC5B,OAAO;YACL,KAAK,EAAE,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,KAAK,CAAC;YAC7B,MAAM,EAAE,IAAI,CAAC,MAAO;SACrB,CAAA;IACH,CAAC;IAED,KAAK,CAAC,SAAS,CAAC,EAAU;QACxB,MAAM,MAAM,GAAG,MAAM,IAAI,CAAC,KAAK,CAAC,MAAM,CAAC,IAAI,CAAC,MAAM,CAAC,EAAE,CAAC,CAAC,CAAA;QACvD,IAAI,CAAC,MAAM;YAAE,OAAO,KAAK,CAAA;QAEzB,MAAM,QAAQ,GAAG,MAAM,IAAI,CAAC,QAAQ,CAAC,IAAI,CAAC,cAAc,CAAC,EAAE,CAAC,CAAC,CAAA;QAE7D,MAAM,YAAY,GAAG,CAAC,IAAI,CAAC,MAAM,CAAC,EAAE,CAAC,CAAC,CAAA;QAEtC,KAAK,MAAM,OAAO,IAAI,QAAQ,EAAE,CAAC;YAC/B,MAAM,MAAM,GAAG,MAAM,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,OAAO,EAAE,QAAQ,CAAC,CAAA;YACvD,YAAY,CAAC,IAAI,CAAC,OAAO,CAAC,CAAA;YAC1B,IAAI,MAAM,EAAE,CAAC;gBACX,YAAY,CAAC,IAAI,CAAC,IAAI,CAAC,cAAc,CAAC,MAAM,CAAC,CAAC,CAAA;YAChD,CAAC;QACH,CAAC;QAED,MAAM,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,GAAG,YAAY,CAAC,CAAA;QACrC,OAAO,IAAI,CAAA;IACb,CAAC;IAEO,UAAU,CAAC,IAA4B;QAC7C,OAAO;YACL,EAAE,EAAE,IAAI,CAAC,EAAG;YACZ,QAAQ,EAAE,IAAI,CAAC,QAAS;YACxB,MAAM,EAAE,IAAI,CAAC,MAAyB;YACtC,KAAK,EAAE,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,KAAM,CAAC;YAC9B,MAAM,EAAE,IAAI,CAAC,MAAM,CAAC,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,SAAS;YACzD,KAAK,EAAE,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,SAAS;YACtD,MAAM,EAAE,IAAI,CAAC,MAAM,KAAK,MAAM,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,SAAS;YACjD,SAAS,EAAE,IAAI,CAAC,SAAS,IAAI,SAAS;YACtC,aAAa,EAAE,IAAI,CAAC,aAAa,KAAK,MAAM,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,SAAS;YAC/D,YAAY,EAAE,IAAI,CAAC,YAAY;gBAC7B,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,YAAY,CAAC;gBAC/B,CAAC,CAAC,SAAS;YACb,IAAI,EAAE,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,EAAE,IAAI,EAAE,SAAS,EAAE;YAC7D,SAAS,EAAE,IAAI,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,SAAU,CAAC,CAAC;YAC5C,SAAS,EAAE,IAAI,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,SAAU,CAAC,CAAC;SAC7C,CAAA;IACH,CAAC;IAEO,eAAe,CAAC,GAAW,EAAE,KAAa;QAChD,MAAM,MAAM,GAAG,GAAG,IAAI,CAAC,SAAS,SAAS,KAAK,GAAG,CAAA;QACjD,OAAO,GAAG,CAAC,KAAK,CAAC,MAAM,CAAC,MAAM,CAAC,CAAA;IACjC,CAAC;IAEO,KAAK,CAAC,QAAQ,CAAC,OAAe;QACpC,MAAM,IAAI,GAAa,EAAE,CAAA;QACzB,IAAI,MAAM,GAAG,GAAG,CAAA;QAChB,GAAG,CAAC;YACF,MAAM,CAAC,SAAS,EAAE,SAAS,CAAC,GAAG,MAAM,IAAI,CAAC,KAAK,CAAC,IAAI,CAClD,MAAM,EACN,OAAO,EACP,OAAO,EACP,OAAO,EACP,GAAG,CACJ,CAAA;YACD,MAAM,GAAG,SAAS,CAAA;YAClB,IAAI,CAAC,IAAI,CAAC,GAAG,SAAS,CAAC,CAAA;QACzB,CAAC,QAAQ,MAAM,KAAK,GAAG,EAAC;QACxB,OAAO,IAAI,CAAA;IACb,CAAC;CACF"}
@@ -1,19 +1,18 @@
1
1
  import type { SerializedError } from '@pikku/core/errors';
2
2
  import { PikkuWorkflowService } from '@pikku/core/workflow';
3
- import type { WorkflowPlannedStep, WorkflowQueueOptions, WorkflowRun, WorkflowRunWire, StepState, StepStatus, WorkflowStatus, WorkflowVersionStatus } from '@pikku/core/workflow';
3
+ import type { WorkflowPlannedStep, WorkflowServiceOptions, WorkflowRun, WorkflowRunWire, StepState, StepStatus, WorkflowStatus, WorkflowVersionStatus } from '@pikku/core/workflow';
4
4
  import { Redis, type RedisOptions } from 'ioredis';
5
5
  export declare class RedisWorkflowService extends PikkuWorkflowService {
6
6
  private redis;
7
7
  private keyPrefix;
8
8
  private ownsConnection;
9
- private lockTTL;
10
- constructor(connectionOrConfig: Redis | RedisOptions | string | undefined, keyPrefix?: string, options?: WorkflowQueueOptions);
9
+ constructor(connectionOrConfig: Redis | RedisOptions | string | undefined, { keyPrefix, ...options }: WorkflowServiceOptions & {
10
+ keyPrefix?: string;
11
+ });
11
12
  init(): Promise<void>;
12
13
  private runKey;
13
14
  private stepKey;
14
15
  private stepHistoryKey;
15
- private lockKey;
16
- private stepLockKey;
17
16
  private saveStepHistory;
18
17
  private updateCurrentHistoryRecord;
19
18
  protected createRunImpl(workflowName: string, input: any, inline: boolean, graphHash: string, wire: WorkflowRunWire, options?: {
@@ -27,17 +26,22 @@ export declare class RedisWorkflowService extends PikkuWorkflowService {
27
26
  retryDelay?: string | number;
28
27
  }, fromStepName?: string): Promise<StepState>;
29
28
  getStepState(runId: string, stepName: string): Promise<StepState>;
29
+ getRunSteps(runId: string): Promise<Array<StepState & {
30
+ stepName: string;
31
+ rpcName?: string;
32
+ data?: any;
33
+ }>>;
30
34
  getRunHistory(runId: string): Promise<Array<StepState & {
31
35
  stepName: string;
32
36
  }>>;
33
37
  protected setStepRunningImpl(stepId: string): Promise<void>;
34
38
  protected setStepScheduledImpl(stepId: string): Promise<void>;
35
39
  protected setStepChildRunIdImpl(stepId: string, childRunId: string): Promise<void>;
36
- protected setStepResultImpl(stepId: string, result: any): Promise<void>;
37
- protected setStepErrorImpl(stepId: string, error: Error): Promise<void>;
38
- private withLock;
39
- withRunLock<T>(id: string, fn: () => Promise<T>): Promise<T>;
40
- withStepLock<T>(runId: string, stepName: string, fn: () => Promise<T>): Promise<T>;
40
+ refreshStepLease(stepId: string, leaseMs: number | null, attempt?: number): Promise<boolean>;
41
+ protected setStepResultImpl(stepId: string, result: any, attempt?: number): Promise<void>;
42
+ protected setStepErrorImpl(stepId: string, error: Error, attempt?: number): Promise<void>;
43
+ private writeStepOutcome;
44
+ private parseStepId;
41
45
  protected createRetryAttemptImpl(stepId: string, status: 'pending' | 'running'): Promise<StepState>;
42
46
  getCompletedGraphState(runId: string): Promise<{
43
47
  completedNodeIds: string[];
@@ -48,6 +52,7 @@ export declare class RedisWorkflowService extends PikkuWorkflowService {
48
52
  stepName: string;
49
53
  status: StepStatus;
50
54
  fromStepName?: string;
55
+ leaseExpiresAt?: Date;
51
56
  }>>;
52
57
  getNodeResults(runId: string, nodeIds: string[]): Promise<Record<string, any>>;
53
58
  protected setBranchTakenImpl(stepId: string, branchKey: string): Promise<void>;
@@ -1,12 +1,40 @@
1
- import { PikkuWorkflowService } from '@pikku/core/workflow';
1
+ import { RedisWorkflowRunService } from './redis-workflow-run-service.js';
2
+ import { PikkuWorkflowService, WorkflowStepSupersededError, } from '@pikku/core/workflow';
2
3
  import { Redis } from 'ioredis';
3
4
  import { randomUUID } from 'crypto';
5
+ const FENCED_STEP_WRITE = `
6
+ local stepId = redis.call('HGET', KEYS[1], 'stepId')
7
+ local current = tonumber(redis.call('HGET', KEYS[1], 'attemptCount') or '1')
8
+ if ARGV[2] ~= '' and (stepId ~= ARGV[1] or current ~= tonumber(ARGV[2])) then
9
+ return -1
10
+ end
11
+ redis.call('HDEL', KEYS[1], ARGV[3])
12
+ for i = 4, #ARGV, 2 do
13
+ redis.call('HSET', KEYS[1], ARGV[i], ARGV[i + 1])
14
+ end
15
+ return current
16
+ `;
17
+ const FENCED_LEASE_REFRESH = `
18
+ local stepId = redis.call('HGET', KEYS[1], 'stepId')
19
+ if stepId ~= ARGV[1] then
20
+ return 0
21
+ end
22
+ local current = tonumber(redis.call('HGET', KEYS[1], 'attemptCount') or '1')
23
+ if ARGV[2] ~= '' and current ~= tonumber(ARGV[2]) then
24
+ return 0
25
+ end
26
+ if ARGV[3] == '' then
27
+ redis.call('HDEL', KEYS[1], 'leaseExpiresAt')
28
+ else
29
+ redis.call('HSET', KEYS[1], 'leaseExpiresAt', ARGV[3])
30
+ end
31
+ return 1
32
+ `;
4
33
  export class RedisWorkflowService extends PikkuWorkflowService {
5
34
  redis;
6
35
  keyPrefix;
7
36
  ownsConnection;
8
- lockTTL = 30000;
9
- constructor(connectionOrConfig, keyPrefix = 'workflows', options = {}) {
37
+ constructor(connectionOrConfig, { keyPrefix = 'workflows', ...options }) {
10
38
  super(options);
11
39
  this.keyPrefix = keyPrefix;
12
40
  if (typeof connectionOrConfig === 'object' &&
@@ -33,12 +61,6 @@ export class RedisWorkflowService extends PikkuWorkflowService {
33
61
  stepHistoryKey(stepId) {
34
62
  return `${this.keyPrefix}:step-history:${stepId}`;
35
63
  }
36
- lockKey(runId) {
37
- return `${this.keyPrefix}:lock:${runId}`;
38
- }
39
- stepLockKey(runId, stepName) {
40
- return `${this.keyPrefix}:step-lock:${runId}:${stepName}`;
41
- }
42
64
  async saveStepHistory(stepId, stepName, attemptCount, status, result, error, retries, retryDelay) {
43
65
  const historyKey = this.stepHistoryKey(stepId);
44
66
  const now = Date.now();
@@ -204,10 +226,16 @@ export class RedisWorkflowService extends PikkuWorkflowService {
204
226
  retries: data.retries ? Number(data.retries) : undefined,
205
227
  retryDelay: data.retryDelay,
206
228
  fromStepName: data.fromStepName || undefined,
229
+ leaseExpiresAt: data.leaseExpiresAt
230
+ ? new Date(Number(data.leaseExpiresAt))
231
+ : undefined,
207
232
  createdAt: new Date(Number(data.createdAt)),
208
233
  updatedAt: new Date(Number(data.updatedAt)),
209
234
  };
210
235
  }
236
+ async getRunSteps(runId) {
237
+ return new RedisWorkflowRunService(this.redis, this.keyPrefix).getRunSteps(runId);
238
+ }
211
239
  async getRunHistory(runId) {
212
240
  const pattern = `${this.keyPrefix}:step:${runId}:*`;
213
241
  const stepKeys = [];
@@ -285,62 +313,38 @@ export class RedisWorkflowService extends PikkuWorkflowService {
285
313
  const key = this.stepKey(runId, stepName);
286
314
  await this.redis.hmset(key, 'childRunId', childRunId, 'updatedAt', Date.now().toString());
287
315
  }
288
- async setStepResultImpl(stepId, result) {
289
- const parts = stepId.split(':');
290
- const runId = parts[0];
291
- const stepName = parts.slice(1, -1).join(':');
292
- const now = Date.now();
293
- const key = this.stepKey(runId, stepName);
294
- const data = await this.redis.hgetall(key);
295
- const attemptCount = Number(data.attemptCount || 1);
296
- const retries = data.retries ? Number(data.retries) : undefined;
297
- const retryDelay = data.retryDelay;
298
- await this.redis.hmset(key, 'status', 'succeeded', 'result', JSON.stringify(result), 'updatedAt', now.toString());
299
- await this.redis.hdel(key, 'error');
300
- await this.updateCurrentHistoryRecord(stepId, stepName, attemptCount, 'succeeded', result, undefined, retries, retryDelay);
316
+ async refreshStepLease(stepId, leaseMs, attempt) {
317
+ const { runId, stepName } = this.parseStepId(stepId);
318
+ const moved = await this.redis.eval(FENCED_LEASE_REFRESH, 1, this.stepKey(runId, stepName), stepId, attempt?.toString() ?? '', leaseMs === null ? '' : (Date.now() + leaseMs).toString());
319
+ return Number(moved) === 1;
301
320
  }
302
- async setStepErrorImpl(stepId, error) {
303
- const parts = stepId.split(':');
304
- const runId = parts[0];
305
- const stepName = parts.slice(1, -1).join(':');
306
- const now = Date.now();
307
- const key = this.stepKey(runId, stepName);
308
- const data = await this.redis.hgetall(key);
309
- const attemptCount = Number(data.attemptCount || 1);
310
- const retries = data.retries ? Number(data.retries) : undefined;
311
- const retryDelay = data.retryDelay;
321
+ async setStepResultImpl(stepId, result, attempt) {
322
+ await this.writeStepOutcome(stepId, 'succeeded', attempt, result);
323
+ }
324
+ async setStepErrorImpl(stepId, error, attempt) {
312
325
  const serializedError = {
313
326
  message: error.message,
314
327
  stack: error.stack,
315
328
  code: error.code,
316
329
  };
317
- await this.redis.hmset(key, 'status', 'failed', 'error', JSON.stringify(serializedError), 'updatedAt', now.toString());
318
- await this.redis.hdel(key, 'result');
319
- await this.updateCurrentHistoryRecord(stepId, stepName, attemptCount, 'failed', undefined, serializedError, retries, retryDelay);
320
- }
321
- async withLock(lockKey, errorMessage, fn) {
322
- const lockValue = randomUUID();
323
- const maxRetries = 10;
324
- const retryDelay = 100;
325
- for (let i = 0; i < maxRetries; i++) {
326
- const acquired = await this.redis.set(lockKey, lockValue, 'PX', this.lockTTL, 'NX');
327
- if (acquired === 'OK') {
328
- try {
329
- return await fn();
330
- }
331
- finally {
332
- await this.redis.eval(`if redis.call("get", KEYS[1]) == ARGV[1] then return redis.call("del", KEYS[1]) else return 0 end`, 1, lockKey, lockValue);
333
- }
334
- }
335
- await new Promise((resolve) => setTimeout(resolve, retryDelay));
336
- }
337
- throw new Error(`${errorMessage} after ${maxRetries} retries`);
330
+ await this.writeStepOutcome(stepId, 'failed', attempt, undefined, serializedError);
338
331
  }
339
- async withRunLock(id, fn) {
340
- return this.withLock(this.lockKey(id), `Failed to acquire lock for run ${id}`, fn);
332
+ async writeStepOutcome(stepId, status, attempt, result, error) {
333
+ const { runId, stepName } = this.parseStepId(stepId);
334
+ const key = this.stepKey(runId, stepName);
335
+ const outcome = status === 'succeeded'
336
+ ? ['result', JSON.stringify(result)]
337
+ : ['error', JSON.stringify(error)];
338
+ const written = Number(await this.redis.eval(FENCED_STEP_WRITE, 1, key, stepId, attempt?.toString() ?? '', status === 'succeeded' ? 'error' : 'result', 'status', status, ...outcome, 'updatedAt', Date.now().toString()));
339
+ if (written === -1) {
340
+ throw new WorkflowStepSupersededError(stepId, attempt);
341
+ }
342
+ const [retries, retryDelay] = await this.redis.hmget(key, 'retries', 'retryDelay');
343
+ await this.updateCurrentHistoryRecord(stepId, stepName, written, status, result, error, retries ? Number(retries) : undefined, retryDelay ?? undefined);
341
344
  }
342
- async withStepLock(runId, stepName, fn) {
343
- return this.withLock(this.stepLockKey(runId, stepName), `Failed to acquire step lock for run ${runId}, step ${stepName}`, fn);
345
+ parseStepId(stepId) {
346
+ const parts = stepId.split(':');
347
+ return { runId: parts[0], stepName: parts.slice(1, -1).join(':') };
344
348
  }
345
349
  async createRetryAttemptImpl(stepId, status) {
346
350
  const parts = stepId.split(':');
@@ -413,7 +417,7 @@ export class RedisWorkflowService extends PikkuWorkflowService {
413
417
  const [newCursor, foundKeys] = await this.redis.scan(cursor, 'MATCH', pattern, 'COUNT', 100);
414
418
  cursor = newCursor;
415
419
  for (const key of foundKeys) {
416
- const [status, fromStepName] = await this.redis.hmget(key, 'status', 'fromStepName');
420
+ const [status, fromStepName, leaseExpiresAt] = await this.redis.hmget(key, 'status', 'fromStepName', 'leaseExpiresAt');
417
421
  const parts = key.split(':');
418
422
  const stepIndex = parts.lastIndexOf('step');
419
423
  if (stepIndex === -1 || parts[stepIndex + 1] !== runId)
@@ -422,6 +426,9 @@ export class RedisWorkflowService extends PikkuWorkflowService {
422
426
  stepName: parts.slice(stepIndex + 2).join(':'),
423
427
  status: status,
424
428
  fromStepName: fromStepName || undefined,
429
+ leaseExpiresAt: leaseExpiresAt
430
+ ? new Date(Number(leaseExpiresAt))
431
+ : undefined,
425
432
  });
426
433
  }
427
434
  } while (cursor !== '0');