UNPKG

@travetto/model-sql

Version:

SQL backing for the travetto model module, with real-time modeling support for SQL schemas.

54 lines (50 loc) 1.79 kB
import type { AsyncIterableMethodDescriptor, AsyncMethodDescriptor } from '@travetto/runtime'; import type { Connection, TransactionType } from './base.ts'; /** * Indicating something is aware of connections */ export interface ConnectionAware<C = unknown> { connection: Connection<C>; } /** * Decorator to ensure a method runs with a valid connection * @kind decorator */ export function Connected() { return function <T extends { connection?: Connection }>( target: T, property: string, descriptor: AsyncMethodDescriptor<T> ): void { const handle = descriptor.value!; descriptor.value = function (...args: unknown[]): ReturnType<typeof handle> { return this.connection!.runWithActive(() => handle.call(this, ...args)); }; }; } /** * Decorator to ensure a method runs with a valid connection * @kind decorator */ export function ConnectedIterator() { return function <T extends { connection?: Connection }>( target: T, property: string, descriptor: AsyncIterableMethodDescriptor<T> ): void { const handle = descriptor.value!; descriptor.value = async function* (...args: unknown[]): ReturnType<typeof handle> { yield* this.connection!.iterateWithActive(() => handle.call(this, ...args)); }; }; } /** * Decorator to ensure a method runs with a valid transaction * @kind decorator */ export function Transactional(mode: TransactionType = 'required') { return function <T extends { connection?: Connection }>( target: unknown, property: string, descriptor: AsyncMethodDescriptor<T> ): void { const handle = descriptor.value!; descriptor.value = function (...args: unknown[]): ReturnType<typeof handle> { return this.connection!.runWithTransaction(mode, () => handle.call(this, ...args)); }; }; }