Template
1
0

feat: update payment views

This commit is contained in:
2025-12-06 20:42:10 +01:00
parent ce4d5ba013
commit 37164b560f
49 changed files with 1826 additions and 624 deletions

View File

@@ -7,6 +7,74 @@ import {
} from "../libraries/adapter.ts";
import { ServerError, type ServerErrorType } from "../libraries/errors.ts";
class HttpReadQueue {
#cache = new Map<string, any>();
#queue: {
[url: string]: {
cb: () => Promise<any>;
resolve: (value: any) => void;
}[];
} = {};
#processing = new Set<string>();
async push<TCallback extends () => Promise<any>>(url: string, cb: TCallback) {
return new Promise<any>((resolve) => {
if (this.#queue[url] === undefined) {
this.#queue[url] = [];
}
this.#queue[url].push({
cb,
resolve,
});
this.process(url);
});
}
async process(url: string) {
const cachedResponse = this.#cache.get(url);
if (cachedResponse !== undefined) {
return this.drain(url);
}
if (this.#processing.has(url) === true) {
return;
}
const job = this.#queue[url]?.shift();
if (job === undefined) {
return this.#processing.delete(url);
}
this.#processing.add(url);
const result = await job.cb();
this.#cache.set(url, result);
job.resolve(result);
this.drain(url);
setTimeout(() => {
this.#cache.delete(url);
}, 1000);
return this.#processing.delete(url);
}
drain(url: string) {
const cache = this.#cache.get(url);
if (cache === undefined) {
return;
}
const job = this.#queue[url]?.shift();
if (job !== undefined) {
job.resolve(cache);
this.drain(url);
}
}
}
/**
* HttpAdapter provides a unified transport layer for Relay.
*
@@ -37,6 +105,8 @@ import { ServerError, type ServerErrorType } from "../libraries/errors.ts";
* ```
*/
export class HttpAdapter implements RelayAdapter {
readonly #queue = new HttpReadQueue();
/**
* Instantiate a new HttpAdapter instance.
*
@@ -92,7 +162,15 @@ export class HttpAdapter implements RelayAdapter {
// ### Response
return this.request(`${endpoint}${query}`, init);
const url = `${endpoint}${query}`;
if (method === "GET") {
return this.#queue.push(url, () => {
return this.request(url, init);
});
}
return this.request(url, init);
}
/**

View File

@@ -131,6 +131,7 @@ async function toParsedArgs(
): Promise<Record<string, string | number | boolean>> {
const result = await zod.safeParseAsync(args);
if (result.success === false) {
console.error(msg, args, result.error);
throw new Error(msg);
}
return result.data as Record<string, string | number | boolean>;