/** Stored per-cell freshness and completion metadata. */ export type CellStalenessMeta = { status?: string | null; completedAt?: number | null; staleAt?: number | null; staleAfterSeconds?: number | null; }; /** * Previous durable cell value passed to object-column resolvers. * * The runtime supplies this when a row+column is being recomputed after a * previous value existed. `value` has the same type that the column returns; * freshness metadata lives beside it. * * @sdkReference runtime 120 */ export type PreviousCell = { /** Previous completed value for this row+column. */ value: Value; /** Millisecond timestamp when the previous value completed. */ completedAt?: number; /** Millisecond timestamp when the previous value becomes stale; `null` means no expiry. */ staleAt?: number | null; /** Resolved numeric TTL in seconds for the previous value, when present. */ staleAfterSeconds?: number; }; export const DEEPLINE_CELL_META_FIELD = '__deeplineCellMeta'; export function previousCellFromValue(input: { hasValue: boolean; value: Value; meta?: CellStalenessMeta | null; }): PreviousCell | undefined { if (!input.hasValue) { return undefined; } const previous: PreviousCell = { value: input.value, }; if ( typeof input.meta?.completedAt === 'number' && Number.isFinite(input.meta.completedAt) ) { previous.completedAt = input.meta.completedAt; } if ( input.meta && Object.prototype.hasOwnProperty.call(input.meta, 'staleAt') ) { previous.staleAt = typeof input.meta.staleAt === 'number' && Number.isFinite(input.meta.staleAt) ? input.meta.staleAt : null; } if ( typeof input.meta?.staleAfterSeconds === 'number' && Number.isFinite(input.meta.staleAfterSeconds) ) { previous.staleAfterSeconds = input.meta.staleAfterSeconds; } return previous; }