/* eslint-disable max-params */ import type EventEmitter from "events"; import type { RequestEventType, RequestLoadingEventType, RequestProgressEventType, RequestResponseEventType, RequestRemovedEventType, RequestDeduplicatedEventType, } from "managers"; import { getRequestStarByQueryKey, getResponseStartByQueryKey, getDownloadProgressByQueryKey, getUploadProgressByQueryKey, getResponseByIdKey, getAbortByAbortKey, getAbortByIdKey, getResponseByCacheKey, getUploadProgressByIdKey, getDownloadProgressByIdKey, getResponseStartByIdKey, getRequestStartByIdKey, getLoadingByQueryKey, getLoadingByIdKey, getRemoveByQueryKey, getRemoveByIdKey, getLoadingKey, getRequestStartKey, getUploadProgressKey, getDownloadProgressKey, getResponseKey, getAbortKey, getRemoveKey, getResponseStartKey, getLoadingByCacheKey, getRequestDeduplicatedKey, getRequestDeduplicatedByIdKey, getRequestDeduplicatedByCacheKey, getRequestDeduplicatedByQueryKey, } from "managers"; import type { AdapterInstance } from "adapter"; import type { RequestInstance } from "request"; import type { Client } from "client"; import type { ExtendRequest } from "types"; export const getRequestManagerEvents = (emitter: EventEmitter) => ({ /** * Emiter */ // Deduplicated emitDeduplicated: (data: RequestDeduplicatedEventType, isTriggeredExternally = false): void => { emitter.emit(getRequestDeduplicatedKey(), data, isTriggeredExternally); emitter.emit(getRequestDeduplicatedByIdKey(data.requestId), data, isTriggeredExternally); emitter.emit(getRequestDeduplicatedByCacheKey(data.request.cacheKey), data, isTriggeredExternally); emitter.emit(getRequestDeduplicatedByQueryKey(data.request.queryKey), data, isTriggeredExternally); }, // Loading emitLoading: (data: RequestLoadingEventType, isTriggeredExternally = false): void => { emitter.emit(getLoadingKey(), data, isTriggeredExternally); emitter.emit(getLoadingByIdKey(data.requestId), data, isTriggeredExternally); emitter.emit(getLoadingByCacheKey(data.request.cacheKey), data, isTriggeredExternally); emitter.emit(getLoadingByQueryKey(data.request.queryKey), data, isTriggeredExternally); }, // Start emitRequestStart: (data: RequestEventType, isTriggeredExternally = false): void => { emitter.emit(getRequestStartKey(), data, isTriggeredExternally); emitter.emit(getRequestStartByIdKey(data.requestId), data, isTriggeredExternally); emitter.emit(getRequestStarByQueryKey(data.request.queryKey), data, isTriggeredExternally); }, emitResponseStart: (data: RequestEventType, isTriggeredExternally = false): void => { emitter.emit(getResponseStartKey(), data, isTriggeredExternally); emitter.emit(getResponseStartByIdKey(data.requestId), data, isTriggeredExternally); emitter.emit(getResponseStartByQueryKey(data.request.queryKey), data, isTriggeredExternally); }, // Progress emitUploadProgress: (data: RequestProgressEventType, isTriggeredExternally = false): void => { emitter.emit(getUploadProgressKey(), data, isTriggeredExternally); emitter.emit(getUploadProgressByIdKey(data.requestId), data, isTriggeredExternally); emitter.emit(getUploadProgressByQueryKey(data.request.queryKey), data, isTriggeredExternally); }, emitDownloadProgress: (data: RequestProgressEventType, isTriggeredExternally = false): void => { emitter.emit(getDownloadProgressKey(), data, isTriggeredExternally); emitter.emit(getDownloadProgressByIdKey(data.requestId), data, isTriggeredExternally); emitter.emit(getDownloadProgressByQueryKey(data.request.queryKey), data, isTriggeredExternally); }, // Response emitResponse: ( data: RequestResponseEventType }>>, isTriggeredExternally = false, ): void => { emitter.emit(getResponseKey(), data, isTriggeredExternally); emitter.emit(getResponseByIdKey(data.requestId), data, isTriggeredExternally); emitter.emit(getResponseByCacheKey(data.request.cacheKey), data, isTriggeredExternally); }, // Abort emitAbort: (data: RequestEventType, isTriggeredExternally = false): void => { emitter.emit(getAbortKey(), data, isTriggeredExternally); emitter.emit(getAbortByIdKey(data.requestId), data, isTriggeredExternally); emitter.emit(getAbortByAbortKey(data.request.abortKey), data, isTriggeredExternally); }, // Remove emitRemove: (data: RequestRemovedEventType, isTriggeredExternally = false): void => { emitter.emit(getRemoveKey(), data, isTriggeredExternally); emitter.emit(getRemoveByIdKey(data.requestId), data, isTriggeredExternally); emitter.emit(getRemoveByQueryKey(data.request.queryKey), data, isTriggeredExternally); }, /** * Listeners */ // Deduplicated onDeduplicated: ( callback: (data: RequestDeduplicatedEventType) => void, ): VoidFunction => { emitter.on(getRequestDeduplicatedKey(), callback); return () => emitter.removeListener(getRequestDeduplicatedKey(), callback); }, onDeduplicatedByQueue: ( queryKey: string, callback: (data: RequestDeduplicatedEventType) => void, ): VoidFunction => { emitter.on(getRequestDeduplicatedByQueryKey(queryKey), callback); return () => emitter.removeListener(getRequestDeduplicatedByQueryKey(queryKey), callback); }, onDeduplicatedByCache: ( cacheKey: string, callback: (data: RequestDeduplicatedEventType) => void, ): VoidFunction => { emitter.on(getRequestDeduplicatedByCacheKey(cacheKey), callback); return () => emitter.removeListener(getRequestDeduplicatedByCacheKey(cacheKey), callback); }, onDeduplicatedById: ( requestId: string, callback: (data: RequestDeduplicatedEventType) => void, ): VoidFunction => { emitter.on(getRequestDeduplicatedByIdKey(requestId), callback); return () => emitter.removeListener(getRequestDeduplicatedByIdKey(requestId), callback); }, // Loading onLoading: (callback: (data: RequestLoadingEventType) => void): VoidFunction => { emitter.on(getLoadingKey(), callback); return () => emitter.removeListener(getLoadingKey(), callback); }, onLoadingByQueue: ( queryKey: string, callback: (data: RequestLoadingEventType) => void, ): VoidFunction => { emitter.on(getLoadingByQueryKey(queryKey), callback); return () => emitter.removeListener(getLoadingByQueryKey(queryKey), callback); }, onLoadingByCache: ( cacheKey: string, callback: (data: RequestLoadingEventType) => void, ): VoidFunction => { emitter.on(getLoadingByCacheKey(cacheKey), callback); return () => emitter.removeListener(getLoadingByCacheKey(cacheKey), callback); }, onLoadingById: ( requestId: string, callback: (data: RequestLoadingEventType) => void, ): VoidFunction => { emitter.on(getLoadingByIdKey(requestId), callback); return () => emitter.removeListener(getLoadingByIdKey(requestId), callback); }, // Request Start onRequestStart: (callback: (details: RequestEventType) => void): VoidFunction => { emitter.on(getRequestStartKey(), callback); return () => emitter.removeListener(getRequestStartKey(), callback); }, onRequestStartByQueue: ( queryKey: string, callback: (details: RequestEventType) => void, ): VoidFunction => { emitter.on(getRequestStarByQueryKey(queryKey), callback); return () => emitter.removeListener(getRequestStarByQueryKey(queryKey), callback); }, onRequestStartById: ( requestId: string, callback: (details: RequestEventType) => void, ): VoidFunction => { emitter.on(getRequestStartByIdKey(requestId), callback); return () => emitter.removeListener(getRequestStartByIdKey(requestId), callback); }, // Response Start onResponseStart: (callback: (details: RequestEventType) => void): VoidFunction => { emitter.on(getResponseStartKey(), callback); return () => emitter.removeListener(getResponseStartKey(), callback); }, onResponseStartByQueue: ( queryKey: string, callback: (details: RequestEventType) => void, ): VoidFunction => { emitter.on(getResponseStartByQueryKey(queryKey), callback); return () => emitter.removeListener(getResponseStartByQueryKey(queryKey), callback); }, onResponseStartById: ( requestId: string, callback: (details: RequestEventType) => void, ): VoidFunction => { emitter.on(getResponseStartByIdKey(requestId), callback); return () => emitter.removeListener(getResponseStartByIdKey(requestId), callback); }, // Progress onUploadProgress: ( callback: (data: RequestProgressEventType) => void, ): VoidFunction => { emitter.on(getUploadProgressKey(), callback); return () => emitter.removeListener(getUploadProgressKey(), callback); }, onUploadProgressByQueue: ( queryKey: string, callback: (data: RequestProgressEventType) => void, ): VoidFunction => { emitter.on(getUploadProgressByQueryKey(queryKey), callback); return () => emitter.removeListener(getUploadProgressByQueryKey(queryKey), callback); }, onUploadProgressById: ( requestId: string, callback: (data: RequestProgressEventType) => void, ): VoidFunction => { emitter.on(getUploadProgressByIdKey(requestId), callback); return () => emitter.removeListener(getUploadProgressByIdKey(requestId), callback); }, onDownloadProgress: ( callback: (data: RequestProgressEventType) => void, ): VoidFunction => { emitter.on(getDownloadProgressKey(), callback); return () => emitter.removeListener(getDownloadProgressKey(), callback); }, onDownloadProgressByQueue: ( queryKey: string, callback: (data: RequestProgressEventType) => void, ): VoidFunction => { emitter.on(getDownloadProgressByQueryKey(queryKey), callback); return () => emitter.removeListener(getDownloadProgressByQueryKey(queryKey), callback); }, onDownloadProgressById: ( requestId: string, callback: (data: RequestProgressEventType) => void, ): VoidFunction => { emitter.on(getDownloadProgressByIdKey(requestId), callback); return () => emitter.removeListener(getDownloadProgressByIdKey(requestId), callback); }, // Response onResponse: (callback: (data: RequestResponseEventType) => void): VoidFunction => { emitter.on(getResponseKey(), callback); return () => emitter.removeListener(getResponseKey(), callback); }, onResponseByCache: ( cacheKey: string, callback: (data: RequestResponseEventType) => void, ): VoidFunction => { emitter.on(getResponseByCacheKey(cacheKey), callback); return () => emitter.removeListener(getResponseByCacheKey(cacheKey), callback); }, onResponseById: ( requestId: string, callback: (data: RequestResponseEventType) => void, ): VoidFunction => { emitter.on(getResponseByIdKey(requestId), callback); return () => emitter.removeListener(getResponseByIdKey(requestId), callback); }, // Abort onAbort: ( callback: (request: RequestEventType) => void, ): VoidFunction => { emitter.on(getAbortKey(), callback); return () => emitter.removeListener(getAbortKey(), callback); }, onAbortByKey: ( abortKey: string, callback: (request: RequestEventType) => void, ): VoidFunction => { emitter.on(getAbortByAbortKey(abortKey), callback); return () => emitter.removeListener(getAbortByAbortKey(abortKey), callback); }, onAbortById: ( requestId: string, callback: (data: RequestEventType) => void, ): VoidFunction => { emitter.on(getAbortByIdKey(requestId), callback); return () => emitter.removeListener(getAbortByIdKey(requestId), callback); }, // Remove onRemove: ( callback: (data: RequestRemovedEventType) => void, ): VoidFunction => { emitter.on(getRemoveKey(), callback); return () => emitter.removeListener(getRemoveKey(), callback); }, onRemoveByQueue: ( queryKey: string, callback: (data: RequestRemovedEventType) => void, ): VoidFunction => { emitter.on(getRemoveByQueryKey(queryKey), callback); return () => emitter.removeListener(getRemoveByQueryKey(queryKey), callback); }, onRemoveById: ( requestId: string, callback: (data: RequestRemovedEventType) => void, ): VoidFunction => { emitter.on(getRemoveByIdKey(requestId), callback); return () => emitter.removeListener(getRemoveByIdKey(requestId), callback); }, });