@hyper-fetch/core
Version:
Cache, Queue and Persist your requests no matter if you are online or offline!
72 lines (58 loc) • 2.26 kB
text/typescript
import { EventEmitter } from "utils";
import { getRequestManagerEvents } from "managers";
/**
* **Request Manager** is used to emit `request lifecycle events` like - request start, request end, upload and download progress.
* It is also the place of `request aborting` system, here we store all the keys and controllers that are isolated for each client instance.
*/
export class RequestManager {
emitter = new EventEmitter();
events = getRequestManagerEvents(this.emitter);
constructor() {
this.emitter?.setMaxListeners(1000);
}
abortControllers = new Map<string, Map<string, AbortController>>();
addAbortController = (abortKey: string, requestId: string) => {
let abortGroup = this.abortControllers.get(abortKey);
if (!abortGroup) {
const newAbortGroup = new Map();
abortGroup = newAbortGroup;
this.abortControllers.set(abortKey, newAbortGroup);
}
const abortController = abortGroup.get(requestId);
if (!abortController || abortController.signal.aborted) {
abortGroup.set(requestId, new AbortController());
}
};
getAbortController = (abortKey: string, requestId: string) => {
return this.abortControllers.get(abortKey)?.get(requestId);
};
removeAbortController = (abortKey: string, requestId: string) => {
this.abortControllers.get(abortKey)?.delete(requestId);
};
// Aborting
useAbortController = (abortKey: string, requestId: string) => {
const controller = this.abortControllers.get(abortKey)?.get(requestId);
controller?.abort();
};
abortByKey = (abortKey: string) => {
const controllers = this.abortControllers.get(abortKey);
if (controllers) {
const entries = Array.from(controllers.entries());
entries.forEach(([key]) => {
this.useAbortController(abortKey, key);
});
}
};
abortByRequestId = (abortKey: string, requestId: string) => {
this.useAbortController(abortKey, requestId);
};
abortAll = () => {
const entries = Array.from(this.abortControllers.entries());
entries.forEach(([abortKey, value]) => {
const controllers = Array.from(value.entries());
controllers.forEach(([requestId]) => {
this.useAbortController(abortKey, requestId);
});
});
};
}