@yolo-croket-dev/core 1.7.25-slowquery.21 → 1.7.25-slowquery.23
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/functions/abort.d.ts +7 -0
- package/functions/abort.js +47 -1
- package/interceptors/rpc.interceptor.js +12 -0
- package/package.json +1 -1
package/functions/abort.d.ts
CHANGED
|
@@ -51,3 +51,10 @@ export declare function repeatWithAbort(task: () => Promise<void> | void, interv
|
|
|
51
51
|
* @param message 로그 메시지
|
|
52
52
|
*/
|
|
53
53
|
export declare function logAbortContext(message: string): void;
|
|
54
|
+
/**
|
|
55
|
+
* 이벤트 기반으로 중단 가능한 Promise 실행
|
|
56
|
+
* @param promise 원본 Promise
|
|
57
|
+
* @param abortSignal 중단 신호 (선택사항, 없으면 현재 컨텍스트에서 가져옴)
|
|
58
|
+
* @returns 중단 가능한 Promise
|
|
59
|
+
*/
|
|
60
|
+
export declare function withAbortSignalEventBased<T>(promise: Promise<T>, abortSignal?: AbortSignal): Promise<T>;
|
package/functions/abort.js
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
"use strict";
|
|
2
2
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
-
exports.logAbortContext = exports.repeatWithAbort = exports.setTimeoutWithAbort = exports.delayWithAbort = exports.withAbortSignal = exports.throwIfAborted = exports.isAborted = exports.getCurrentAbortSignal = void 0;
|
|
3
|
+
exports.withAbortSignalEventBased = exports.logAbortContext = exports.repeatWithAbort = exports.setTimeoutWithAbort = exports.delayWithAbort = exports.withAbortSignal = exports.throwIfAborted = exports.isAborted = exports.getCurrentAbortSignal = void 0;
|
|
4
4
|
const abort_context_1 = require("./abort-context");
|
|
5
5
|
/**
|
|
6
6
|
* 현재 컨텍스트의 AbortSignal을 가져오는 전역 함수
|
|
@@ -198,3 +198,49 @@ function logAbortContext(message) {
|
|
|
198
198
|
});
|
|
199
199
|
}
|
|
200
200
|
exports.logAbortContext = logAbortContext;
|
|
201
|
+
/**
|
|
202
|
+
* 이벤트 기반으로 중단 가능한 Promise 실행
|
|
203
|
+
* @param promise 원본 Promise
|
|
204
|
+
* @param abortSignal 중단 신호 (선택사항, 없으면 현재 컨텍스트에서 가져옴)
|
|
205
|
+
* @returns 중단 가능한 Promise
|
|
206
|
+
*/
|
|
207
|
+
function withAbortSignalEventBased(promise, abortSignal) {
|
|
208
|
+
const signal = abortSignal || getCurrentAbortSignal();
|
|
209
|
+
if (!signal) {
|
|
210
|
+
return promise;
|
|
211
|
+
}
|
|
212
|
+
return new Promise((resolve, reject) => {
|
|
213
|
+
// 이미 중단된 경우
|
|
214
|
+
if (signal.aborted) {
|
|
215
|
+
reject(new Error('REQUEST_ABORTED: 작업이 이미 중단되었습니다'));
|
|
216
|
+
return;
|
|
217
|
+
}
|
|
218
|
+
let isCompleted = false;
|
|
219
|
+
// abort 이벤트 리스너 (즉시 반응)
|
|
220
|
+
const abortHandler = () => {
|
|
221
|
+
if (!isCompleted) {
|
|
222
|
+
isCompleted = true;
|
|
223
|
+
reject(new Error('REQUEST_ABORTED: 작업이 중단되었습니다'));
|
|
224
|
+
}
|
|
225
|
+
};
|
|
226
|
+
// 이벤트 리스너 등록
|
|
227
|
+
signal.addEventListener('abort', abortHandler, { once: true });
|
|
228
|
+
// 원본 Promise 처리
|
|
229
|
+
promise
|
|
230
|
+
.then((result) => {
|
|
231
|
+
if (!isCompleted) {
|
|
232
|
+
isCompleted = true;
|
|
233
|
+
signal.removeEventListener('abort', abortHandler);
|
|
234
|
+
resolve(result);
|
|
235
|
+
}
|
|
236
|
+
})
|
|
237
|
+
.catch((error) => {
|
|
238
|
+
if (!isCompleted) {
|
|
239
|
+
isCompleted = true;
|
|
240
|
+
signal.removeEventListener('abort', abortHandler);
|
|
241
|
+
reject(error);
|
|
242
|
+
}
|
|
243
|
+
});
|
|
244
|
+
});
|
|
245
|
+
}
|
|
246
|
+
exports.withAbortSignalEventBased = withAbortSignalEventBased;
|
|
@@ -302,6 +302,18 @@ let RPCInterceptor = class RPCInterceptor {
|
|
|
302
302
|
abortController.abort();
|
|
303
303
|
return (0, rxjs_1.throwError)(() => new Error(this.DEFAULT_TIMEOUT_MESSAGE));
|
|
304
304
|
},
|
|
305
|
+
}), (0, operators_1.catchError)((error) => {
|
|
306
|
+
// eslint-disable-next-line no-console
|
|
307
|
+
console.log('AbortInterceptor: 에러 발생', {
|
|
308
|
+
error: error.message,
|
|
309
|
+
isAborted: abortController.signal.aborted,
|
|
310
|
+
});
|
|
311
|
+
// abort된 경우와 일반 에러를 구분
|
|
312
|
+
if (abortController.signal.aborted) {
|
|
313
|
+
return (0, rxjs_1.throwError)(() => new Error(`REQUEST_ABORTED: ${this.DEFAULT_TIMEOUT_MESSAGE}`));
|
|
314
|
+
}
|
|
315
|
+
// 다음 handler로 넘기고싶다.
|
|
316
|
+
return next.handle();
|
|
305
317
|
}), (0, operators_1.tap)({
|
|
306
318
|
next: async (val) => {
|
|
307
319
|
val.isError = false;
|