@yolo-croket-dev/core 1.7.25-slowquery.33 → 1.7.25-slowquery.35
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/decorators/abort-event.decorator.js +53 -14
- package/functions/{abort.d.ts → abort/abort.d.ts} +0 -5
- package/functions/{abort.js → abort/abort.js} +1 -16
- package/functions/abort/enhanced-promise-patch.d.ts +22 -0
- package/functions/abort/enhanced-promise-patch.js +175 -0
- package/functions/abort/index.d.ts +2 -0
- package/functions/abort/index.js +18 -0
- package/functions/index.d.ts +0 -1
- package/functions/index.js +0 -1
- package/package.json +1 -1
- /package/functions/{abort-context.d.ts → abort/abort-context.d.ts} +0 -0
- /package/functions/{abort-context.js → abort/abort-context.js} +0 -0
|
@@ -3,29 +3,68 @@ Object.defineProperty(exports, "__esModule", { value: true });
|
|
|
3
3
|
exports.AbortEvent = void 0;
|
|
4
4
|
// src/modules/rpc-testing/decorators/abort-event.decorator.ts
|
|
5
5
|
const abort_1 = require("../functions/abort");
|
|
6
|
-
|
|
6
|
+
// import { AbortablePromise } from '@xuchaoqian/abortable-promise';
|
|
7
7
|
/**
|
|
8
8
|
* 이벤트 기반으로 AbortSignal을 감지하는 데코레이터 (Interval 없음)
|
|
9
9
|
*/
|
|
10
10
|
function AbortEvent() {
|
|
11
11
|
return function (target, propertyKey, descriptor) {
|
|
12
12
|
const originalMethod = descriptor.value;
|
|
13
|
-
// eslint-disable-next-line no-param-reassign
|
|
14
|
-
// descriptor.value = async function (...args: unknown[]) {
|
|
15
|
-
// const abortablePromise = AbortablePromise.newWithSignal()
|
|
16
|
-
// try {
|
|
17
|
-
// // const result = await new AbortablePromise(originalMethod.apply(this, args), getCurrentAbortSignal() || undefined);
|
|
18
|
-
// const result = await new AbortablePromise(() => originalMethod.apply(this, args), getCurrentAbortSignal() || undefined);
|
|
19
|
-
// return result;
|
|
20
|
-
// } catch (error) {
|
|
21
|
-
// throw error;
|
|
22
|
-
// }
|
|
23
|
-
// };
|
|
24
13
|
descriptor.value = async function (...args) {
|
|
25
|
-
|
|
14
|
+
const abortSignal = (0, abort_1.getCurrentAbortSignal)();
|
|
15
|
+
if (!abortSignal) {
|
|
16
|
+
return originalMethod.apply(this, args);
|
|
17
|
+
}
|
|
18
|
+
if (abortSignal.aborted) {
|
|
19
|
+
throw new Error('REQUEST_ABORTED: 작업이 이미 중단되었습니다');
|
|
20
|
+
}
|
|
21
|
+
// AbortablePromise를 사용하여 실제로 중단 가능한 Promise 생성
|
|
22
|
+
return new AbortablePromise((resolve, reject) => {
|
|
23
|
+
const abortHandler = () => {
|
|
24
|
+
reject(new Error('REQUEST_ABORTED: 작업이 중단되었습니다'));
|
|
25
|
+
};
|
|
26
|
+
abortSignal.addEventListener('abort', abortHandler, { once: true });
|
|
27
|
+
// 원본 메서드 실행
|
|
28
|
+
originalMethod.apply(this, args)
|
|
29
|
+
.then((result) => {
|
|
30
|
+
abortSignal.removeEventListener('abort', abortHandler);
|
|
31
|
+
resolve(result);
|
|
32
|
+
})
|
|
33
|
+
.catch((error) => {
|
|
34
|
+
abortSignal.removeEventListener('abort', abortHandler);
|
|
35
|
+
reject(error);
|
|
36
|
+
});
|
|
37
|
+
}, abortSignal);
|
|
26
38
|
};
|
|
27
|
-
new abortable_promise_1.AbortablePromise(() => descriptor.value, (0, abort_1.getCurrentAbortSignal)() || undefined);
|
|
28
39
|
return descriptor;
|
|
29
40
|
};
|
|
30
41
|
}
|
|
31
42
|
exports.AbortEvent = AbortEvent;
|
|
43
|
+
// AbortablePromise 클래스
|
|
44
|
+
class AbortablePromise extends Promise {
|
|
45
|
+
constructor(executor, signal) {
|
|
46
|
+
super((resolve, reject) => {
|
|
47
|
+
if (signal === null || signal === void 0 ? void 0 : signal.aborted) {
|
|
48
|
+
reject(new Error('REQUEST_ABORTED: Promise가 이미 중단되었습니다'));
|
|
49
|
+
return;
|
|
50
|
+
}
|
|
51
|
+
const abortHandler = () => {
|
|
52
|
+
reject(new Error('REQUEST_ABORTED: Promise가 중단되었습니다'));
|
|
53
|
+
};
|
|
54
|
+
if (signal) {
|
|
55
|
+
signal.addEventListener('abort', abortHandler, { once: true });
|
|
56
|
+
}
|
|
57
|
+
executor((value) => {
|
|
58
|
+
if (signal) {
|
|
59
|
+
signal.removeEventListener('abort', abortHandler);
|
|
60
|
+
}
|
|
61
|
+
resolve(value);
|
|
62
|
+
}, (reason) => {
|
|
63
|
+
if (signal) {
|
|
64
|
+
signal.removeEventListener('abort', abortHandler);
|
|
65
|
+
}
|
|
66
|
+
reject(reason);
|
|
67
|
+
});
|
|
68
|
+
});
|
|
69
|
+
}
|
|
70
|
+
}
|
|
@@ -46,11 +46,6 @@ export declare function setTimeoutWithAbort(callback: () => void, delay: number,
|
|
|
46
46
|
* @returns 중단 가능한 Promise
|
|
47
47
|
*/
|
|
48
48
|
export declare function repeatWithAbort(task: () => Promise<void> | void, interval: number, abortSignal?: AbortSignal): Promise<void>;
|
|
49
|
-
/**
|
|
50
|
-
* 현재 컨텍스트 정보를 로깅하는 디버그 함수
|
|
51
|
-
* @param message 로그 메시지
|
|
52
|
-
*/
|
|
53
|
-
export declare function logAbortContext(message: string): void;
|
|
54
49
|
/**
|
|
55
50
|
* 이벤트 기반으로 중단 가능한 Promise 실행
|
|
56
51
|
* @param promise 원본 Promise
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
"use strict";
|
|
2
2
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
-
exports.withAbortSignalEventBased = exports.
|
|
3
|
+
exports.withAbortSignalEventBased = 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을 가져오는 전역 함수
|
|
@@ -183,21 +183,6 @@ function repeatWithAbort(task, interval, abortSignal) {
|
|
|
183
183
|
});
|
|
184
184
|
}
|
|
185
185
|
exports.repeatWithAbort = repeatWithAbort;
|
|
186
|
-
/**
|
|
187
|
-
* 현재 컨텍스트 정보를 로깅하는 디버그 함수
|
|
188
|
-
* @param message 로그 메시지
|
|
189
|
-
*/
|
|
190
|
-
function logAbortContext(message) {
|
|
191
|
-
var _a;
|
|
192
|
-
const context = abort_context_1.AbortContext.getCurrentContext();
|
|
193
|
-
// eslint-disable-next-line no-console
|
|
194
|
-
console.log(`[AbortContext] ${message}`, {
|
|
195
|
-
requestId: context === null || context === void 0 ? void 0 : context.requestId,
|
|
196
|
-
isAborted: (_a = context === null || context === void 0 ? void 0 : context.abortSignal) === null || _a === void 0 ? void 0 : _a.aborted,
|
|
197
|
-
hasSignal: !!(context === null || context === void 0 ? void 0 : context.abortSignal),
|
|
198
|
-
});
|
|
199
|
-
}
|
|
200
|
-
exports.logAbortContext = logAbortContext;
|
|
201
186
|
/**
|
|
202
187
|
* 이벤트 기반으로 중단 가능한 Promise 실행
|
|
203
188
|
* @param promise 원본 Promise
|
|
@@ -0,0 +1,22 @@
|
|
|
1
|
+
declare global {
|
|
2
|
+
var Promise: PromiseConstructor;
|
|
3
|
+
}
|
|
4
|
+
export declare class EnhancedPromisePatch {
|
|
5
|
+
private static isPatched;
|
|
6
|
+
private static originalPromise;
|
|
7
|
+
private static originalSetTimeout;
|
|
8
|
+
static patch(): void;
|
|
9
|
+
private static patchPromise;
|
|
10
|
+
private static patchSetTimeout;
|
|
11
|
+
static unpatch(): void;
|
|
12
|
+
/**
|
|
13
|
+
* 현재 패치 상태 확인
|
|
14
|
+
* @returns 패치 여부
|
|
15
|
+
*/
|
|
16
|
+
static getPatchStatus(): boolean;
|
|
17
|
+
/**
|
|
18
|
+
* 패치된 Promise가 중단 가능한지 테스트
|
|
19
|
+
* @returns 테스트 결과
|
|
20
|
+
*/
|
|
21
|
+
static testAbortablePromise(): Promise<boolean>;
|
|
22
|
+
}
|
|
@@ -0,0 +1,175 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
|
|
3
|
+
if (k2 === undefined) k2 = k;
|
|
4
|
+
var desc = Object.getOwnPropertyDescriptor(m, k);
|
|
5
|
+
if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
|
|
6
|
+
desc = { enumerable: true, get: function() { return m[k]; } };
|
|
7
|
+
}
|
|
8
|
+
Object.defineProperty(o, k2, desc);
|
|
9
|
+
}) : (function(o, m, k, k2) {
|
|
10
|
+
if (k2 === undefined) k2 = k;
|
|
11
|
+
o[k2] = m[k];
|
|
12
|
+
}));
|
|
13
|
+
var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
|
|
14
|
+
Object.defineProperty(o, "default", { enumerable: true, value: v });
|
|
15
|
+
}) : function(o, v) {
|
|
16
|
+
o["default"] = v;
|
|
17
|
+
});
|
|
18
|
+
var __importStar = (this && this.__importStar) || function (mod) {
|
|
19
|
+
if (mod && mod.__esModule) return mod;
|
|
20
|
+
var result = {};
|
|
21
|
+
if (mod != null) for (var k in mod) if (k !== "default" && Object.prototype.hasOwnProperty.call(mod, k)) __createBinding(result, mod, k);
|
|
22
|
+
__setModuleDefault(result, mod);
|
|
23
|
+
return result;
|
|
24
|
+
};
|
|
25
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
26
|
+
exports.EnhancedPromisePatch = void 0;
|
|
27
|
+
// packages/core/functions/abort/enhanced-promise-patch.ts
|
|
28
|
+
const abort_1 = require("./abort");
|
|
29
|
+
class EnhancedPromisePatch {
|
|
30
|
+
static patch() {
|
|
31
|
+
if (this.isPatched) {
|
|
32
|
+
return;
|
|
33
|
+
}
|
|
34
|
+
console.log('Enhanced Promise Patch 시작...');
|
|
35
|
+
this.patchPromise();
|
|
36
|
+
this.patchSetTimeout();
|
|
37
|
+
this.isPatched = true;
|
|
38
|
+
console.log('Enhanced Promise Patch 적용 완료');
|
|
39
|
+
}
|
|
40
|
+
static patchPromise() {
|
|
41
|
+
this.originalPromise = global.Promise;
|
|
42
|
+
// Promise 생성자 패치
|
|
43
|
+
global.Promise = new Proxy(global.Promise, {
|
|
44
|
+
construct(target, args) {
|
|
45
|
+
const abortSignal = (0, abort_1.getCurrentAbortSignal)();
|
|
46
|
+
if (abortSignal === null || abortSignal === void 0 ? void 0 : abortSignal.aborted) {
|
|
47
|
+
return Promise.reject(new Error('REQUEST_ABORTED: Promise가 중단되었습니다'));
|
|
48
|
+
}
|
|
49
|
+
// target은 Promise 생성자이므로, new 연산자와 함께 사용해야 하며, args는 [executor] 형태의 튜플임을 명시합니다.
|
|
50
|
+
const promise = Reflect.construct(target, args);
|
|
51
|
+
if (!abortSignal) {
|
|
52
|
+
return promise;
|
|
53
|
+
}
|
|
54
|
+
// Promise 체인에 중단 확인 추가
|
|
55
|
+
return promise.then((result) => {
|
|
56
|
+
if (abortSignal.aborted) {
|
|
57
|
+
throw new Error('REQUEST_ABORTED: Promise 실행 중 중단되었습니다');
|
|
58
|
+
}
|
|
59
|
+
return result;
|
|
60
|
+
}, (error) => {
|
|
61
|
+
if (abortSignal.aborted) {
|
|
62
|
+
throw new Error('REQUEST_ABORTED: Promise 실행 중 중단되었습니다');
|
|
63
|
+
}
|
|
64
|
+
throw error;
|
|
65
|
+
});
|
|
66
|
+
},
|
|
67
|
+
});
|
|
68
|
+
// Promise.resolve 패치
|
|
69
|
+
const originalResolve = global.Promise.resolve;
|
|
70
|
+
global.Promise.resolve = (value) => {
|
|
71
|
+
const abortSignal = (0, abort_1.getCurrentAbortSignal)();
|
|
72
|
+
if (abortSignal === null || abortSignal === void 0 ? void 0 : abortSignal.aborted) {
|
|
73
|
+
return Promise.reject(new Error('REQUEST_ABORTED: Promise.resolve가 중단되었습니다'));
|
|
74
|
+
}
|
|
75
|
+
const promise = originalResolve.call(global.Promise, value);
|
|
76
|
+
if (!abortSignal) {
|
|
77
|
+
return promise;
|
|
78
|
+
}
|
|
79
|
+
return promise.then((result) => {
|
|
80
|
+
if (abortSignal.aborted) {
|
|
81
|
+
throw new Error('REQUEST_ABORTED: Promise.resolve 실행 중 중단되었습니다');
|
|
82
|
+
}
|
|
83
|
+
return result;
|
|
84
|
+
}, (error) => {
|
|
85
|
+
if (abortSignal.aborted) {
|
|
86
|
+
throw new Error('REQUEST_ABORTED: Promise.resolve 실행 중 중단되었습니다');
|
|
87
|
+
}
|
|
88
|
+
throw error;
|
|
89
|
+
});
|
|
90
|
+
};
|
|
91
|
+
// Promise.reject 패치
|
|
92
|
+
const originalReject = global.Promise.reject;
|
|
93
|
+
global.Promise.reject = (reason) => {
|
|
94
|
+
const abortSignal = (0, abort_1.getCurrentAbortSignal)();
|
|
95
|
+
if (abortSignal === null || abortSignal === void 0 ? void 0 : abortSignal.aborted) {
|
|
96
|
+
return Promise.reject(new Error('REQUEST_ABORTED: Promise.reject가 중단되었습니다'));
|
|
97
|
+
}
|
|
98
|
+
return originalReject.call(global.Promise, reason);
|
|
99
|
+
};
|
|
100
|
+
}
|
|
101
|
+
static patchSetTimeout() {
|
|
102
|
+
this.originalSetTimeout = global.setTimeout;
|
|
103
|
+
// eslint-disable-next-line @typescript-eslint/ban-types
|
|
104
|
+
global.setTimeout = (callback, delay, ...args) => {
|
|
105
|
+
const abortSignal = (0, abort_1.getCurrentAbortSignal)();
|
|
106
|
+
if (abortSignal === null || abortSignal === void 0 ? void 0 : abortSignal.aborted) {
|
|
107
|
+
throw new Error('REQUEST_ABORTED: setTimeout이 중단되었습니다');
|
|
108
|
+
}
|
|
109
|
+
const timerId = this.originalSetTimeout(() => {
|
|
110
|
+
if (abortSignal === null || abortSignal === void 0 ? void 0 : abortSignal.aborted) {
|
|
111
|
+
throw new Error('REQUEST_ABORTED: setTimeout 콜백이 중단되었습니다');
|
|
112
|
+
}
|
|
113
|
+
callback(...args);
|
|
114
|
+
}, delay);
|
|
115
|
+
if (abortSignal) {
|
|
116
|
+
const abortHandler = () => {
|
|
117
|
+
clearTimeout(timerId);
|
|
118
|
+
};
|
|
119
|
+
abortSignal.addEventListener('abort', abortHandler, { once: true });
|
|
120
|
+
}
|
|
121
|
+
return timerId;
|
|
122
|
+
};
|
|
123
|
+
}
|
|
124
|
+
static unpatch() {
|
|
125
|
+
if (!this.isPatched) {
|
|
126
|
+
return;
|
|
127
|
+
}
|
|
128
|
+
global.Promise = this.originalPromise;
|
|
129
|
+
global.setTimeout = this.originalSetTimeout;
|
|
130
|
+
this.isPatched = false;
|
|
131
|
+
console.log('Enhanced Promise Patch 복원 완료');
|
|
132
|
+
}
|
|
133
|
+
/**
|
|
134
|
+
* 현재 패치 상태 확인
|
|
135
|
+
* @returns 패치 여부
|
|
136
|
+
*/
|
|
137
|
+
static getPatchStatus() {
|
|
138
|
+
return this.isPatched;
|
|
139
|
+
}
|
|
140
|
+
/**
|
|
141
|
+
* 패치된 Promise가 중단 가능한지 테스트
|
|
142
|
+
* @returns 테스트 결과
|
|
143
|
+
*/
|
|
144
|
+
static async testAbortablePromise() {
|
|
145
|
+
try {
|
|
146
|
+
const abortController = new AbortController();
|
|
147
|
+
// AbortContext를 설정하여 테스트
|
|
148
|
+
const { AbortContext } = await Promise.resolve().then(() => __importStar(require('./abort-context')));
|
|
149
|
+
return new Promise((resolve) => {
|
|
150
|
+
AbortContext.run(abortController.signal, 'test', () => {
|
|
151
|
+
const promise = new Promise((resolve) => {
|
|
152
|
+
setTimeout(() => resolve('완료'), 1000);
|
|
153
|
+
});
|
|
154
|
+
// 500ms 후 중단
|
|
155
|
+
setTimeout(() => {
|
|
156
|
+
abortController.abort();
|
|
157
|
+
}, 500);
|
|
158
|
+
promise
|
|
159
|
+
.then(() => {
|
|
160
|
+
resolve(false); // 중단되지 않았음
|
|
161
|
+
})
|
|
162
|
+
.catch((error) => {
|
|
163
|
+
resolve(error.message.includes('REQUEST_ABORTED')); // 중단됨
|
|
164
|
+
});
|
|
165
|
+
});
|
|
166
|
+
});
|
|
167
|
+
}
|
|
168
|
+
catch (error) {
|
|
169
|
+
console.error('테스트 실패:', error);
|
|
170
|
+
return false;
|
|
171
|
+
}
|
|
172
|
+
}
|
|
173
|
+
}
|
|
174
|
+
exports.EnhancedPromisePatch = EnhancedPromisePatch;
|
|
175
|
+
EnhancedPromisePatch.isPatched = false;
|
|
@@ -0,0 +1,18 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
|
|
3
|
+
if (k2 === undefined) k2 = k;
|
|
4
|
+
var desc = Object.getOwnPropertyDescriptor(m, k);
|
|
5
|
+
if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
|
|
6
|
+
desc = { enumerable: true, get: function() { return m[k]; } };
|
|
7
|
+
}
|
|
8
|
+
Object.defineProperty(o, k2, desc);
|
|
9
|
+
}) : (function(o, m, k, k2) {
|
|
10
|
+
if (k2 === undefined) k2 = k;
|
|
11
|
+
o[k2] = m[k];
|
|
12
|
+
}));
|
|
13
|
+
var __exportStar = (this && this.__exportStar) || function(m, exports) {
|
|
14
|
+
for (var p in m) if (p !== "default" && !Object.prototype.hasOwnProperty.call(exports, p)) __createBinding(exports, m, p);
|
|
15
|
+
};
|
|
16
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
17
|
+
__exportStar(require("./abort"), exports);
|
|
18
|
+
__exportStar(require("./abort-context"), exports);
|
package/functions/index.d.ts
CHANGED
package/functions/index.js
CHANGED
|
@@ -21,4 +21,3 @@ __exportStar(require("./rewrite-file-value.function"), exports);
|
|
|
21
21
|
__exportStar(require("./amqp-call-manager.function"), exports);
|
|
22
22
|
__exportStar(require("./extract-redis-url.function"), exports);
|
|
23
23
|
__exportStar(require("./abort"), exports);
|
|
24
|
-
__exportStar(require("./abort-context"), exports);
|
package/package.json
CHANGED
|
File without changes
|
|
File without changes
|