Skip to main content
Module

x/grm/request_iter.ts

MTProto API Client for Deno 🦕
Latest
File
// deno-lint-ignore-file no-explicit-anyimport { sleep, TotalList } from "./helpers.ts";import { AbstractTelegramClient } from "./client/abstract_telegram_client.ts";
interface BaseRequestIterInterface { reverse?: boolean; waitTime?: number;}
export class RequestIter implements AsyncIterable<any> { public client: AbstractTelegramClient; public reverse: boolean | undefined; public waitTime: number | undefined; protected readonly limit: number; protected left: number; protected buffer: Array<any> | undefined; private index: number; protected total: number | undefined; private lastLoad: number; kwargs: Record<never, never>;
constructor( client: AbstractTelegramClient, limit?: number, params: BaseRequestIterInterface = {}, args = {}, ) { this.client = client; this.reverse = params.reverse; this.waitTime = params.waitTime; this.limit = Math.max(!limit ? Number.MAX_SAFE_INTEGER : limit, 0); this.left = this.limit; this.buffer = undefined; this.kwargs = args; this.index = 0; this.total = undefined; this.lastLoad = 0; }
async _init(_kwargs: any): Promise<boolean | void> { // for overload }
[Symbol.asyncIterator](): AsyncIterator<any, any, undefined> { this.buffer = undefined; this.index = 0; this.lastLoad = 0; this.left = this.limit; return { next: async () => { if (this.buffer === undefined) { this.buffer = []; if (await this._init(this.kwargs)) { this.left = this.buffer.length; } } if (this.left <= 0) { return { value: undefined, done: true }; } if (this.index === this.buffer.length) { if (this.waitTime) { await sleep( this.waitTime - (new Date().getTime() / 1000 - this.lastLoad), ); } this.lastLoad = new Date().getTime() / 1000; this.index = 0; this.buffer = []; const nextChunk = await this._loadNextChunk(); if (nextChunk === false) { // we exit; return { value: undefined, done: true, }; } if (nextChunk) this.left = this.buffer.length; }
if (!this.buffer || !this.buffer.length) { return { value: undefined, done: true }; } const result = this.buffer[this.index]; this.left -= 1; this.index += 1; return { value: result, done: false }; }, }; }
async collect() { const result = new TotalList(); for await (const message of this) { result.push(message); } result.total = this.total; return result; }
_loadNextChunk(): Promise<boolean | undefined> { throw new Error("Not Implemented"); }}