drizzle-edge-pg-proxy-client
Version:
PostgreSQL HTTP client compatible with Neon's interface for edge environments
63 lines (53 loc) • 2.14 kB
text/typescript
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
}
};
}
}