UNPKG

drizzle-edge-pg-proxy-client

Version:

PostgreSQL HTTP client compatible with Neon's interface for edge environments

63 lines (53 loc) 2.14 kB
import type { ParameterizedQuery } from './types'; // Import necessary type // Create a class implementing Promise for SQL queries with expanded functionality to match Neon's export class QueryPromise<T = any> implements Promise<T> { readonly [Symbol.toStringTag]: string = 'Promise'; public queryData: ParameterizedQuery; public opts?: any; constructor( private executeFn: (query: string, params: any[]) => Promise<T>, queryObj: ParameterizedQuery, opts?: any ) { this.queryData = queryObj; this.opts = opts; } then<TResult1 = T, TResult2 = never>( onfulfilled?: ((value: T) => TResult1 | PromiseLike<TResult1>) | null | undefined, onrejected?: ((reason: any) => TResult2 | PromiseLike<TResult2>) | null | undefined ): Promise<TResult1 | TResult2> { return this.executeFn(this.queryData.query, this.queryData.params).then(onfulfilled, onrejected); } catch<TResult = never>( onrejected?: ((reason: any) => TResult | PromiseLike<TResult>) | null | undefined ): Promise<T | TResult> { return this.executeFn(this.queryData.query, this.queryData.params).catch(onrejected); } finally(onfinally?: (() => void) | null | undefined): Promise<T> { return this.executeFn(this.queryData.query, this.queryData.params).finally(onfinally); } // For compatibility with result iteration, implement Symbol.iterator [Symbol.iterator](): Iterator<T> { // Create a reference to the promise outside the iterator const promise = this; let isDone = false; let resolvedValue: T | undefined = undefined; return { next(): IteratorResult<T> { if (isDone) { return { done: true, value: undefined as any }; } if (resolvedValue === undefined) { // For the first call, return the promise result return promise.then((value: T) => { resolvedValue = value; return { done: false, value }; }) as any; // Cast needed } // For subsequent calls isDone = true; return { done: true, value: undefined as any }; // Mark as done } }; } }