Kaizen
Browse modulesLifecyclelifecycle/serverClasses

Class: LifecycleEffectRepository

Defined in: server/lifecycle/lifecycle-effect-repository.ts:53

Repository over lifecycle_effects — the transactional outbox. Writes (insert) participate in the engine's transaction via this.tx; the claim / mark methods are called by the dispatcher, typically OUTSIDE the producing transaction.

The claim path increments attempts AT CLAIM TIME so a handler that crashes (never reaching markFailed) still counts toward the dead-letter threshold — a poison row can't be retried forever.

Extends

Constructors

Constructor

new LifecycleEffectRepository(prismaClient: PrismaClient, options?: LifecycleRepositoryOptions): LifecycleEffectRepository;

Defined in: server/lifecycle/lifecycle-effect-repository.ts:61

Parameters

ParameterType
prismaClientPrismaClient
optionsLifecycleRepositoryOptions

Returns

LifecycleEffectRepository

Overrides

ReadRepository.constructor

Properties

ENTITY_TYPE?

protected readonly optional ENTITY_TYPE?: string;

Defined in: server/persistence/base-repository.ts:61

Set ENTITY_TYPE in child repositories to enable automatic activity logging. When set, create/update/delete operations auto-log unless silenced with .silent. Requires an activity model on the consumer's Prisma schema.

Inherited from

ReadRepository.ENTITY_TYPE


logger?

protected readonly optional logger?: Logger;

Defined in: server/persistence/base-repository.ts:64

Inherited from

ReadRepository.logger


prismaClient

protected prismaClient: PrismaClientLike<Tx<PrismaClient<PrismaClientOptions, never, DefaultArgs>>> & PrismaClient<PrismaClientOptions, never, DefaultArgs>;

Defined in: server/persistence/base-repository.ts:69

Inherited from

ReadRepository.prismaClient

Accessors

actorId

Get Signature

get protected actorId(): string | null | undefined;

Defined in: server/persistence/base-repository.ts:76

Returns

string | null | undefined

Inherited from

ReadRepository.actorId


auditCreate

Get Signature

get protected auditCreate(): {
  createdBy: string | null | undefined;
  updatedBy: string | null | undefined;
};

Defined in: server/persistence/base-repository.ts:90

Returns
{
  createdBy: string | null | undefined;
  updatedBy: string | null | undefined;
}
createdBy
createdBy: string | null | undefined = actorId;
updatedBy
updatedBy: string | null | undefined = actorId;

Inherited from

ReadRepository.auditCreate


auditDelete

Get Signature

get protected auditDelete(): {
  deletedAt: Date;
  deletedBy: string | null | undefined;
};

Defined in: server/persistence/base-repository.ts:99

Returns
{
  deletedAt: Date;
  deletedBy: string | null | undefined;
}
deletedAt
deletedAt: Date;
deletedBy
deletedBy: string | null | undefined;

Inherited from

ReadRepository.auditDelete


auditUpdate

Get Signature

get protected auditUpdate(): {
  updatedBy: string | null | undefined;
};

Defined in: server/persistence/base-repository.ts:95

Returns
{
  updatedBy: string | null | undefined;
}
updatedBy
updatedBy: string | null | undefined;

Inherited from

ReadRepository.auditUpdate


silent

Get Signature

get silent(): this;

Defined in: server/persistence/base-repository.ts:115

Suppress activity logging for the next mutation call. One-shot: the flag is consumed by the next create/update/delete.

Example
await repo.silent.update(id, data);   // no activity logged
await repo.update(id, data);          // activity logged normally
Returns

this

Inherited from

ReadRepository.silent


tx

Get Signature

get protected tx(): TTx;

Defined in: server/persistence/base-repository.ts:86

The current Prisma handle: the active transaction if one is running on this async context, otherwise the raw client.

Returns

TTx

Inherited from

ReadRepository.tx

Methods

_count()

protected _count(): Promise<number>;

Defined in: server/lifecycle/lifecycle-effect-repository.ts:90

Returns

Promise<number>

Overrides

ReadRepository._count


_exists()

protected _exists(id: string): Promise<boolean>;

Defined in: server/lifecycle/lifecycle-effect-repository.ts:83

Parameters

ParameterType
idstring

Returns

Promise<boolean>

Overrides

ReadRepository._exists


_findById()

protected _findById(id: string): Promise<
  | {
  attempts: number;
  claimedBy: string | null;
  createdAt: Date;
  createdBy: string | null;
  dispatchedAt: Date | null;
  effectName: string;
  id: string;
  lastError: string | null;
  lockedUntil: Date | null;
  ordinal: number;
  organizationId: string | null;
  payload: JsonValue;
  status: LifecycleEffectStatus;
  transitionId: string;
  updatedAt: Date;
  updatedBy: string | null;
}
| null>;

Defined in: server/lifecycle/lifecycle-effect-repository.ts:77

Parameters

ParameterType
idstring

Returns

Promise< | { attempts: number; claimedBy: string | null; createdAt: Date; createdBy: string | null; dispatchedAt: Date | null; effectName: string; id: string; lastError: string | null; lockedUntil: Date | null; ordinal: number; organizationId: string | null; payload: JsonValue; status: LifecycleEffectStatus; transitionId: string; updatedAt: Date; updatedBy: string | null; } | null>

Overrides

ReadRepository._findById


_findMany()

protected _findMany(pagination: {
  page: number;
  pageSize: number;
}): Promise<{
  items: {
     attempts: number;
     claimedBy: string | null;
     createdAt: Date;
     createdBy: string | null;
     dispatchedAt: Date | null;
     effectName: string;
     id: string;
     lastError: string | null;
     lockedUntil: Date | null;
     ordinal: number;
     organizationId: string | null;
     payload: JsonValue;
     status: LifecycleEffectStatus;
     transitionId: string;
     updatedAt: Date;
     updatedBy: string | null;
  }[];
  total: number;
}>;

Defined in: server/lifecycle/lifecycle-effect-repository.ts:94

Parameters

ParameterType
pagination{ page: number; pageSize: number; }
pagination.pagenumber
pagination.pageSizenumber

Returns

Promise<{ items: { attempts: number; claimedBy: string | null; createdAt: Date; createdBy: string | null; dispatchedAt: Date | null; effectName: string; id: string; lastError: string | null; lockedUntil: Date | null; ordinal: number; organizationId: string | null; payload: JsonValue; status: LifecycleEffectStatus; transitionId: string; updatedAt: Date; updatedBy: string | null; }[]; total: number; }>

Overrides

ReadRepository._findMany


claimBatch()

claimBatch(input: ClaimBatchInput): Promise<{
  attempts: number;
  claimedBy: string | null;
  createdAt: Date;
  createdBy: string | null;
  dispatchedAt: Date | null;
  effectName: string;
  id: string;
  lastError: string | null;
  lockedUntil: Date | null;
  ordinal: number;
  organizationId: string | null;
  payload: JsonValue;
  status: LifecycleEffectStatus;
  transitionId: string;
  updatedAt: Date;
  updatedBy: string | null;
}[]>;

Defined in: server/lifecycle/lifecycle-effect-repository.ts:156

Claim a batch of dispatchable effects: rows that are pending, or processing with an expired lease, AND still under maxAttempts. Claiming marks the row processing, stamps claimedBy + lockedUntil, and bumps attempts.

Exhausted rows (attempts >= maxAttempts) are dead-lettered (failed) in a SEPARATE step that does NOT consume the claim budget — otherwise a batch of poison rows could starve real pending work and make drain report claimed === 0 while dispatchable effects remain, stalling the "loop until claimed === 0" driver. Invariant: claimBatch returns > 0 whenever any dispatchable row (pending or expired-lease, attempts < maxAttempts) exists.

The claim is a single updateManyAndReturn whose where re-checks claimability (still pending, or still-expired lease), so a row another worker grabbed concurrently no longer matches — two workers never claim the same row, and there is no per-row N+1. Ordered by (transitionId, ordinal) to preserve per-transition dispatch order.

Parameters

ParameterType
inputClaimBatchInput

Returns

Promise<{ attempts: number; claimedBy: string | null; createdAt: Date; createdBy: string | null; dispatchedAt: Date | null; effectName: string; id: string; lastError: string | null; lockedUntil: Date | null; ordinal: number; organizationId: string | null; payload: JsonValue; status: LifecycleEffectStatus; transitionId: string; updatedAt: Date; updatedBy: string | null; }[]>


consumeSilent()

protected consumeSilent(): boolean;

Defined in: server/persistence/base-repository.ts:128

Consume and reset the silent flag. Called by template methods.

Returns

boolean

Inherited from

ReadRepository.consumeSilent


count()

count(): Promise<number>;

Defined in: server/persistence/base-repository.ts:191

Returns

Promise<number>

Inherited from

ReadRepository.count


exists()

exists(id: string): Promise<boolean>;

Defined in: server/persistence/base-repository.ts:187

Parameters

ParameterType
idstring

Returns

Promise<boolean>

Inherited from

ReadRepository.exists


findById()

findById(id: string): Promise<
  | {
  attempts: number;
  claimedBy: string | null;
  createdAt: Date;
  createdBy: string | null;
  dispatchedAt: Date | null;
  effectName: string;
  id: string;
  lastError: string | null;
  lockedUntil: Date | null;
  ordinal: number;
  organizationId: string | null;
  payload: JsonValue;
  status: LifecycleEffectStatus;
  transitionId: string;
  updatedAt: Date;
  updatedBy: string | null;
}
| null>;

Defined in: server/persistence/base-repository.ts:177

Parameters

ParameterType
idstring

Returns

Promise< | { attempts: number; claimedBy: string | null; createdAt: Date; createdBy: string | null; dispatchedAt: Date | null; effectName: string; id: string; lastError: string | null; lockedUntil: Date | null; ordinal: number; organizationId: string | null; payload: JsonValue; status: LifecycleEffectStatus; transitionId: string; updatedAt: Date; updatedBy: string | null; } | null>

Inherited from

ReadRepository.findById


findByIdOrThrow()

findByIdOrThrow(id: string): Promise<{
  attempts: number;
  claimedBy: string | null;
  createdAt: Date;
  createdBy: string | null;
  dispatchedAt: Date | null;
  effectName: string;
  id: string;
  lastError: string | null;
  lockedUntil: Date | null;
  ordinal: number;
  organizationId: string | null;
  payload: JsonValue;
  status: LifecycleEffectStatus;
  transitionId: string;
  updatedAt: Date;
  updatedBy: string | null;
}>;

Defined in: server/persistence/base-repository.ts:181

Parameters

ParameterType
idstring

Returns

Promise<{ attempts: number; claimedBy: string | null; createdAt: Date; createdBy: string | null; dispatchedAt: Date | null; effectName: string; id: string; lastError: string | null; lockedUntil: Date | null; ordinal: number; organizationId: string | null; payload: JsonValue; status: LifecycleEffectStatus; transitionId: string; updatedAt: Date; updatedBy: string | null; }>

Inherited from

ReadRepository.findByIdOrThrow


findByTransitionId()

findByTransitionId(transitionId: string): Promise<{
  attempts: number;
  claimedBy: string | null;
  createdAt: Date;
  createdBy: string | null;
  dispatchedAt: Date | null;
  effectName: string;
  id: string;
  lastError: string | null;
  lockedUntil: Date | null;
  ordinal: number;
  organizationId: string | null;
  payload: JsonValue;
  status: LifecycleEffectStatus;
  transitionId: string;
  updatedAt: Date;
  updatedBy: string | null;
}[]>;

Defined in: server/lifecycle/lifecycle-effect-repository.ts:129

All effect rows for a transition, in declared (ordinal) order.

Parameters

ParameterType
transitionIdstring

Returns

Promise<{ attempts: number; claimedBy: string | null; createdAt: Date; createdBy: string | null; dispatchedAt: Date | null; effectName: string; id: string; lastError: string | null; lockedUntil: Date | null; ordinal: number; organizationId: string | null; payload: JsonValue; status: LifecycleEffectStatus; transitionId: string; updatedAt: Date; updatedBy: string | null; }[]>


findMany()

findMany(pagination: {
  page: number;
  pageSize: number;
}): Promise<OffsetPaginatedResult<{
  attempts: number;
  claimedBy: string | null;
  createdAt: Date;
  createdBy: string | null;
  dispatchedAt: Date | null;
  effectName: string;
  id: string;
  lastError: string | null;
  lockedUntil: Date | null;
  ordinal: number;
  organizationId: string | null;
  payload: JsonValue;
  status: LifecycleEffectStatus;
  transitionId: string;
  updatedAt: Date;
  updatedBy: string | null;
}>>;

Defined in: server/persistence/base-repository.ts:195

Parameters

ParameterType
pagination{ page: number; pageSize: number; }
pagination.pagenumber
pagination.pageSizenumber

Returns

Promise<OffsetPaginatedResult<{ attempts: number; claimedBy: string | null; createdAt: Date; createdBy: string | null; dispatchedAt: Date | null; effectName: string; id: string; lastError: string | null; lockedUntil: Date | null; ordinal: number; organizationId: string | null; payload: JsonValue; status: LifecycleEffectStatus; transitionId: string; updatedAt: Date; updatedBy: string | null; }>>

Inherited from

ReadRepository.findMany


insertMany()

insertMany(inputs: InsertEffectInput[]): Promise<number>;

Defined in: server/lifecycle/lifecycle-effect-repository.ts:110

Insert a batch of pending effect rows for a transition (audit-threaded).

Parameters

ParameterType
inputsInsertEffectInput[]

Returns

Promise<number>


logActivity()

protected logActivity(
   _entityId: string, 
   _action: string, 
   _metadata?: Record<string, unknown>
): Promise<void>;

Defined in: server/persistence/base-repository.ts:140

Log an activity entry.

NOTE: This is not implemented because there's no activity model implemented in taproot yet! https://linear.app/kaizenlabs/issue/ENG-7846/add-activity-log-tables

Parameters

ParameterType
_entityIdstring
_actionstring
_metadata?Record<string, unknown>

Returns

Promise<void>

Inherited from

ReadRepository.logActivity


markDispatched()

markDispatched(effect: ClaimedEffect): Promise<boolean>;

Defined in: server/lifecycle/lifecycle-effect-repository.ts:236

Mark a claimed effect dispatched and release its lease. This is the at-least-once delivery boundary: a handler may have succeeded but this write (or the process) crashed before recording it, so the row's lease expires and the effect is redelivered. Handlers MUST therefore be idempotent.

Parameters

ParameterType
effectClaimedEffect

Returns

Promise<boolean>


markFailed()

markFailed(
   effect: ClaimedEffect, 
   lastError: string, 
   maxAttempts: number
): Promise<boolean>;

Defined in: server/lifecycle/lifecycle-effect-repository.ts:275

Mark a claimed effect's dispatch outcome a failure: back to pending for retry, or failed (dead-letter) when it has now reached maxAttempts. Releases the lease either way.

Parameters

ParameterType
effectClaimedEffect
lastErrorstring
maxAttemptsnumber

Returns

Promise<boolean>


notFoundError()

protected notFoundError(id: string): Error;

Defined in: server/lifecycle/lifecycle-effect-repository.ts:73

Create a not-found error. Override to provide custom error types.

Parameters

ParameterType
idstring

Returns

Error

Overrides

ReadRepository.notFoundError


release()

release(effect: ClaimedEffect): Promise<boolean>;

Defined in: server/lifecycle/lifecycle-effect-repository.ts:256

Release a claimed-but-not-dispatched effect back to pending, clearing its lease. Used when a caller deliberately does not invoke the handler. Refunds the claim-time attempt because the effect was never delivered.

Parameters

ParameterType
effectClaimedEffect

Returns

Promise<boolean>

On this page