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
ReadRepository<PrismaClient,LifecycleEffect,string,Tx<PrismaClient>>
Constructors
Constructor
new LifecycleEffectRepository(prismaClient: PrismaClient, options?: LifecycleRepositoryOptions): LifecycleEffectRepository;Defined in: server/lifecycle/lifecycle-effect-repository.ts:61
Parameters
| Parameter | Type |
|---|---|
prismaClient | PrismaClient |
options | LifecycleRepositoryOptions |
Returns
LifecycleEffectRepository
Overrides
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
logger?
protected readonly optional logger?: Logger;Defined in: server/persistence/base-repository.ts:64
Inherited from
prismaClient
protected prismaClient: PrismaClientLike<Tx<PrismaClient<PrismaClientOptions, never, DefaultArgs>>> & PrismaClient<PrismaClientOptions, never, DefaultArgs>;Defined in: server/persistence/base-repository.ts:69
Inherited from
Accessors
actorId
Get Signature
get protected actorId(): string | null | undefined;Defined in: server/persistence/base-repository.ts:76
Returns
string | null | undefined
Inherited from
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
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
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
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 normallyReturns
this
Inherited from
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
Methods
_count()
protected _count(): Promise<number>;Defined in: server/lifecycle/lifecycle-effect-repository.ts:90
Returns
Promise<number>
Overrides
_exists()
protected _exists(id: string): Promise<boolean>;Defined in: server/lifecycle/lifecycle-effect-repository.ts:83
Parameters
| Parameter | Type |
|---|---|
id | string |
Returns
Promise<boolean>
Overrides
_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
| Parameter | Type |
|---|---|
id | string |
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
_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
| Parameter | Type |
|---|---|
pagination | { page: number; pageSize: number; } |
pagination.page | number |
pagination.pageSize | number |
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
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
| Parameter | Type |
|---|---|
input | ClaimBatchInput |
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
count()
count(): Promise<number>;Defined in: server/persistence/base-repository.ts:191
Returns
Promise<number>
Inherited from
exists()
exists(id: string): Promise<boolean>;Defined in: server/persistence/base-repository.ts:187
Parameters
| Parameter | Type |
|---|---|
id | string |
Returns
Promise<boolean>
Inherited from
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
| Parameter | Type |
|---|---|
id | string |
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
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
| Parameter | Type |
|---|---|
id | string |
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
| Parameter | Type |
|---|---|
transitionId | string |
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
| Parameter | Type |
|---|---|
pagination | { page: number; pageSize: number; } |
pagination.page | number |
pagination.pageSize | number |
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
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
| Parameter | Type |
|---|---|
inputs | InsertEffectInput[] |
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
| Parameter | Type |
|---|---|
_entityId | string |
_action | string |
_metadata? | Record<string, unknown> |
Returns
Promise<void>
Inherited from
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
| Parameter | Type |
|---|---|
effect | ClaimedEffect |
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
| Parameter | Type |
|---|---|
effect | ClaimedEffect |
lastError | string |
maxAttempts | number |
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
| Parameter | Type |
|---|---|
id | string |
Returns
Error
Overrides
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
| Parameter | Type |
|---|---|
effect | ClaimedEffect |
Returns
Promise<boolean>