@simplysm/core-node 14.0.11 → 14.0.12
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/README.md +40 -4
- package/dist/features/fs-watcher.d.ts +25 -1
- package/dist/features/fs-watcher.d.ts.map +1 -1
- package/dist/features/fs-watcher.js +100 -10
- package/dist/features/fs-watcher.js.map +1 -1
- package/dist/utils/cp.d.ts +16 -16
- package/dist/utils/cp.d.ts.map +1 -1
- package/dist/utils/cp.js +41 -44
- package/dist/utils/cp.js.map +1 -1
- package/dist/utils/fs.d.ts +4 -4
- package/dist/utils/fs.d.ts.map +1 -1
- package/dist/utils/fs.js +10 -11
- package/dist/utils/fs.js.map +1 -1
- package/docs/cpx.md +173 -0
- package/docs/fs-watcher.md +2 -2
- package/docs/pathx.md +21 -22
- package/package.json +3 -3
- package/src/features/fs-watcher.ts +124 -13
- package/src/utils/cp.ts +67 -65
- package/src/utils/fs.ts +13 -11
package/dist/utils/fs.js
CHANGED
|
@@ -196,24 +196,24 @@ export async function read(targetPath) {
|
|
|
196
196
|
}
|
|
197
197
|
}
|
|
198
198
|
/**
|
|
199
|
-
* 파일을
|
|
199
|
+
* 파일을 Uint8Array로 읽는다.
|
|
200
200
|
* @param targetPath - 읽을 파일 경로
|
|
201
201
|
*/
|
|
202
|
-
export function
|
|
202
|
+
export function readBytesSync(targetPath) {
|
|
203
203
|
try {
|
|
204
|
-
return fs.readFileSync(targetPath);
|
|
204
|
+
return new Uint8Array(fs.readFileSync(targetPath));
|
|
205
205
|
}
|
|
206
206
|
catch (err) {
|
|
207
207
|
throw new SdError(err, targetPath);
|
|
208
208
|
}
|
|
209
209
|
}
|
|
210
210
|
/**
|
|
211
|
-
* 파일을
|
|
211
|
+
* 파일을 Uint8Array로 읽는다 (비동기).
|
|
212
212
|
* @param targetPath - 읽을 파일 경로
|
|
213
213
|
*/
|
|
214
|
-
export async function
|
|
214
|
+
export async function readBytes(targetPath) {
|
|
215
215
|
try {
|
|
216
|
-
return await fs.promises.readFile(targetPath);
|
|
216
|
+
return new Uint8Array(await fs.promises.readFile(targetPath));
|
|
217
217
|
}
|
|
218
218
|
catch (err) {
|
|
219
219
|
throw new SdError(err, targetPath);
|
|
@@ -457,12 +457,10 @@ export function findAllParentChildPathsSync(childGlob, fromPath, rootPath) {
|
|
|
457
457
|
* 그렇지 않으면 파일 시스템 루트까지 검색한다.
|
|
458
458
|
*/
|
|
459
459
|
export async function findAllParentChildPaths(childGlob, fromPath, rootPath) {
|
|
460
|
-
const
|
|
460
|
+
const dirs = [];
|
|
461
461
|
let current = fromPath;
|
|
462
462
|
while (current) {
|
|
463
|
-
|
|
464
|
-
const globResults = await glob(potential);
|
|
465
|
-
resultPaths.push(...globResults);
|
|
463
|
+
dirs.push(current);
|
|
466
464
|
if (current === rootPath)
|
|
467
465
|
break;
|
|
468
466
|
const next = path.dirname(current);
|
|
@@ -470,7 +468,8 @@ export async function findAllParentChildPaths(childGlob, fromPath, rootPath) {
|
|
|
470
468
|
break;
|
|
471
469
|
current = next;
|
|
472
470
|
}
|
|
473
|
-
|
|
471
|
+
const results = await Promise.all(dirs.map((dir) => glob(path.resolve(dir, childGlob))));
|
|
472
|
+
return results.flat();
|
|
474
473
|
}
|
|
475
474
|
//#endregion
|
|
476
475
|
//# sourceMappingURL=fs.js.map
|
package/dist/utils/fs.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"fs.js","sourceRoot":"","sources":["../../src/utils/fs.ts"],"names":[],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"fs.js","sourceRoot":"","sources":["../../src/utils/fs.ts"],"names":[],"mappings":"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"}
|
package/docs/cpx.md
ADDED
|
@@ -0,0 +1,173 @@
|
|
|
1
|
+
# cpx
|
|
2
|
+
|
|
3
|
+
Namespace of child process execution utilities. Provides async/sync process spawning with automatic encoding detection, a `PromiseLike` wrapper for process control, and byte decoding helpers.
|
|
4
|
+
|
|
5
|
+
Imported as:
|
|
6
|
+
```typescript
|
|
7
|
+
import { cpx } from "@simplysm/core-node";
|
|
8
|
+
```
|
|
9
|
+
|
|
10
|
+
## Types
|
|
11
|
+
|
|
12
|
+
### ExecOptions
|
|
13
|
+
|
|
14
|
+
```ts
|
|
15
|
+
interface ExecOptions {
|
|
16
|
+
cwd?: string;
|
|
17
|
+
env?: Record<string, string>;
|
|
18
|
+
stdio?: "pipe" | "inherit";
|
|
19
|
+
shell?: boolean;
|
|
20
|
+
reject?: boolean;
|
|
21
|
+
}
|
|
22
|
+
```
|
|
23
|
+
|
|
24
|
+
| Field | Type | Default | Description |
|
|
25
|
+
|-------|------|---------|-------------|
|
|
26
|
+
| `cwd` | `string` | `undefined` | Working directory for the child process |
|
|
27
|
+
| `env` | `Record<string, string>` | `undefined` | Extra environment variables (merged with `process.env`) |
|
|
28
|
+
| `stdio` | `"pipe" \| "inherit"` | `"pipe"` | `"pipe"` captures stdout/stderr; `"inherit"` passes them through |
|
|
29
|
+
| `shell` | `boolean` | `false` | Run the command in a shell |
|
|
30
|
+
| `reject` | `boolean` | `true` | If `false`, the promise resolves even on non-zero exit codes |
|
|
31
|
+
|
|
32
|
+
### ExecSyncOptions
|
|
33
|
+
|
|
34
|
+
```ts
|
|
35
|
+
type ExecSyncOptions = Omit<ExecOptions, "reject">
|
|
36
|
+
```
|
|
37
|
+
|
|
38
|
+
Same as `ExecOptions` without the `reject` field. `execSync` always returns a result regardless of exit code.
|
|
39
|
+
|
|
40
|
+
### ExecResult
|
|
41
|
+
|
|
42
|
+
```ts
|
|
43
|
+
interface ExecResult {
|
|
44
|
+
stdout: string;
|
|
45
|
+
stderr: string;
|
|
46
|
+
exitCode: number;
|
|
47
|
+
}
|
|
48
|
+
```
|
|
49
|
+
|
|
50
|
+
| Field | Type | Description |
|
|
51
|
+
|-------|------|-------------|
|
|
52
|
+
| `stdout` | `string` | Captured standard output (empty when `stdio: "inherit"`) |
|
|
53
|
+
| `stderr` | `string` | Captured standard error (empty when `stdio: "inherit"`) |
|
|
54
|
+
| `exitCode` | `number` | Process exit code |
|
|
55
|
+
|
|
56
|
+
## ExecProcess
|
|
57
|
+
|
|
58
|
+
```ts
|
|
59
|
+
class ExecProcess implements PromiseLike<ExecResult> {
|
|
60
|
+
get pid(): number | undefined;
|
|
61
|
+
then<TResult1, TResult2>(
|
|
62
|
+
onfulfilled?: ((value: ExecResult) => TResult1 | PromiseLike<TResult1>) | null,
|
|
63
|
+
onrejected?: ((reason: unknown) => TResult2 | PromiseLike<TResult2>) | null,
|
|
64
|
+
): Promise<TResult1 | TResult2>;
|
|
65
|
+
catch<TResult>(
|
|
66
|
+
onrejected?: ((reason: unknown) => TResult | PromiseLike<TResult>) | null,
|
|
67
|
+
): Promise<ExecResult | TResult>;
|
|
68
|
+
kill(signal?: NodeJS.Signals | number): boolean;
|
|
69
|
+
}
|
|
70
|
+
```
|
|
71
|
+
|
|
72
|
+
A `PromiseLike<ExecResult>` wrapper around `ChildProcess`. Can be `await`ed for the result or `kill()`ed to terminate the process.
|
|
73
|
+
|
|
74
|
+
| Property/Method | Description |
|
|
75
|
+
|-----------------|-------------|
|
|
76
|
+
| `pid` | Process ID of the child process (undefined if not yet spawned) |
|
|
77
|
+
| `then()` | Standard `PromiseLike` fulfillment |
|
|
78
|
+
| `catch()` | Standard promise rejection handler |
|
|
79
|
+
| `kill(signal?)` | Send a signal to terminate the child process |
|
|
80
|
+
|
|
81
|
+
## Functions
|
|
82
|
+
|
|
83
|
+
### exec
|
|
84
|
+
|
|
85
|
+
```ts
|
|
86
|
+
function exec(cmd: string, args: string[], options?: ExecOptions): ExecProcess
|
|
87
|
+
```
|
|
88
|
+
|
|
89
|
+
Spawn a child process asynchronously. Returns an `ExecProcess` that can be awaited or killed.
|
|
90
|
+
|
|
91
|
+
| Parameter | Type | Description |
|
|
92
|
+
|-----------|------|-------------|
|
|
93
|
+
| `cmd` | `string` | Command to execute |
|
|
94
|
+
| `args` | `string[]` | Command arguments |
|
|
95
|
+
| `options` | `ExecOptions` | Execution options |
|
|
96
|
+
|
|
97
|
+
By default, rejects if exit code is non-zero. Set `options.reject: false` to always resolve. Output is decoded using system encoding detection (UTF-8 with fallback).
|
|
98
|
+
|
|
99
|
+
### execSync
|
|
100
|
+
|
|
101
|
+
```ts
|
|
102
|
+
function execSync(cmd: string, args: string[], options?: ExecSyncOptions): ExecResult
|
|
103
|
+
```
|
|
104
|
+
|
|
105
|
+
Spawn a child process synchronously. Always returns an `ExecResult` regardless of exit code.
|
|
106
|
+
|
|
107
|
+
| Parameter | Type | Description |
|
|
108
|
+
|-----------|------|-------------|
|
|
109
|
+
| `cmd` | `string` | Command to execute |
|
|
110
|
+
| `args` | `string[]` | Command arguments |
|
|
111
|
+
| `options` | `ExecSyncOptions` | Execution options |
|
|
112
|
+
|
|
113
|
+
### codePageToEncoding
|
|
114
|
+
|
|
115
|
+
```ts
|
|
116
|
+
function codePageToEncoding(codePage: number): string
|
|
117
|
+
```
|
|
118
|
+
|
|
119
|
+
Convert a Windows code page number to a standard encoding name. Falls back to `"utf-8"` for unknown code pages.
|
|
120
|
+
|
|
121
|
+
Supported code pages: 65001 (utf-8), 949 (euc-kr), 932 (shift-jis), 936 (gbk), 950 (big5), 1252/1251/1250 (windows-*), 874 (windows-874).
|
|
122
|
+
|
|
123
|
+
### getSystemEncoding
|
|
124
|
+
|
|
125
|
+
```ts
|
|
126
|
+
function getSystemEncoding(): string
|
|
127
|
+
```
|
|
128
|
+
|
|
129
|
+
Detect the system console encoding. On Windows, runs `chcp` to get the code page. On other platforms, reads `LANG`/`LC_ALL` environment variables. The result is cached after the first call.
|
|
130
|
+
|
|
131
|
+
### resetEncodingCache
|
|
132
|
+
|
|
133
|
+
```ts
|
|
134
|
+
function resetEncodingCache(): void
|
|
135
|
+
```
|
|
136
|
+
|
|
137
|
+
Clear the cached system encoding so the next `getSystemEncoding()` call re-detects.
|
|
138
|
+
|
|
139
|
+
### decodeBytes
|
|
140
|
+
|
|
141
|
+
```ts
|
|
142
|
+
function decodeBytes(raw: Uint8Array, systemEncoding?: string): string
|
|
143
|
+
```
|
|
144
|
+
|
|
145
|
+
Decode a `Uint8Array` to a string. First tries UTF-8 (with `fatal: true`); if that fails, falls back to the system encoding.
|
|
146
|
+
|
|
147
|
+
| Parameter | Type | Description |
|
|
148
|
+
|-----------|------|-------------|
|
|
149
|
+
| `raw` | `Uint8Array` | Raw bytes to decode |
|
|
150
|
+
| `systemEncoding` | `string` | Override encoding (defaults to `getSystemEncoding()`) |
|
|
151
|
+
|
|
152
|
+
## Usage
|
|
153
|
+
|
|
154
|
+
```ts
|
|
155
|
+
import { cpx } from "@simplysm/core-node";
|
|
156
|
+
|
|
157
|
+
// Basic execution
|
|
158
|
+
const result = await cpx.exec("git", ["status"], { cwd: "/project" });
|
|
159
|
+
// result.stdout, result.stderr, result.exitCode
|
|
160
|
+
|
|
161
|
+
// Inherit stdio
|
|
162
|
+
await cpx.exec("make", ["build"], { stdio: "inherit" });
|
|
163
|
+
|
|
164
|
+
// Don't reject on failure
|
|
165
|
+
const { exitCode } = await cpx.exec("test-cmd", [], { reject: false });
|
|
166
|
+
|
|
167
|
+
// Kill a long-running process
|
|
168
|
+
const proc = cpx.exec("long-cmd", []);
|
|
169
|
+
proc.kill();
|
|
170
|
+
|
|
171
|
+
// Synchronous execution
|
|
172
|
+
const syncResult = cpx.execSync("node", ["--version"]);
|
|
173
|
+
```
|
package/docs/fs-watcher.md
CHANGED
|
@@ -22,14 +22,14 @@ Supported file change event types.
|
|
|
22
22
|
```ts
|
|
23
23
|
interface FsWatcherChangeInfo {
|
|
24
24
|
event: FsWatcherEvent;
|
|
25
|
-
path:
|
|
25
|
+
path: PosixPath;
|
|
26
26
|
}
|
|
27
27
|
```
|
|
28
28
|
|
|
29
29
|
| Field | Type | Description |
|
|
30
30
|
|-------|------|-------------|
|
|
31
31
|
| `event` | `FsWatcherEvent` | The type of change event |
|
|
32
|
-
| `path` | `
|
|
32
|
+
| `path` | `PosixPath` | Normalized absolute path of the changed file/directory |
|
|
33
33
|
|
|
34
34
|
## FsWatcher
|
|
35
35
|
|
package/docs/pathx.md
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
# pathx
|
|
2
2
|
|
|
3
|
-
Namespace of path manipulation utilities. Provides
|
|
3
|
+
Namespace of path manipulation utilities. Provides a branded POSIX path type, path conversion, and directory-based filtering.
|
|
4
4
|
|
|
5
5
|
Imported as:
|
|
6
6
|
```typescript
|
|
@@ -9,27 +9,39 @@ import { pathx } from "@simplysm/core-node";
|
|
|
9
9
|
|
|
10
10
|
## Types
|
|
11
11
|
|
|
12
|
-
###
|
|
12
|
+
### PosixPath
|
|
13
13
|
|
|
14
14
|
```ts
|
|
15
|
-
type
|
|
15
|
+
type PosixPath = string & { [POSIX]: never }
|
|
16
16
|
```
|
|
17
17
|
|
|
18
|
-
Branded string type
|
|
18
|
+
Branded string type guaranteeing forward-slash (`/`) separators. Can only be created via `posix()` or `posixResolve()`.
|
|
19
19
|
|
|
20
20
|
## Functions
|
|
21
21
|
|
|
22
22
|
### posix
|
|
23
23
|
|
|
24
24
|
```ts
|
|
25
|
-
function posix(
|
|
25
|
+
function posix(p: string): PosixPath
|
|
26
26
|
```
|
|
27
27
|
|
|
28
|
-
Convert a path to POSIX style (backslashes replaced with forward slashes).
|
|
28
|
+
Convert a path to POSIX style (backslashes replaced with forward slashes). No path resolution or joining is performed.
|
|
29
29
|
|
|
30
30
|
```ts
|
|
31
|
-
pathx.posix("C:\\Users\\test");
|
|
32
|
-
|
|
31
|
+
pathx.posix("C:\\Users\\test"); // "C:/Users/test"
|
|
32
|
+
```
|
|
33
|
+
|
|
34
|
+
### posixResolve
|
|
35
|
+
|
|
36
|
+
```ts
|
|
37
|
+
function posixResolve(...args: string[]): PosixPath
|
|
38
|
+
```
|
|
39
|
+
|
|
40
|
+
Resolve path segments to an absolute path, then convert to POSIX style.
|
|
41
|
+
|
|
42
|
+
```ts
|
|
43
|
+
pathx.posixResolve("/base", "sub", "file.txt"); // "/base/sub/file.txt"
|
|
44
|
+
pathx.posixResolve("relative/path"); // "D:/cwd/relative/path"
|
|
33
45
|
```
|
|
34
46
|
|
|
35
47
|
### changeFileDirectory
|
|
@@ -76,7 +88,7 @@ pathx.basenameWithoutExt("/path/to/file.spec.ts"); // "file.spec"
|
|
|
76
88
|
function isChildPath(childPath: string, parentPath: string): boolean
|
|
77
89
|
```
|
|
78
90
|
|
|
79
|
-
Check if `childPath` is a descendant of `parentPath`. Returns `false` for identical paths. Paths are normalized internally via `
|
|
91
|
+
Check if `childPath` is a descendant of `parentPath`. Returns `false` for identical paths. Paths are normalized internally via `posixResolve()`.
|
|
80
92
|
|
|
81
93
|
```ts
|
|
82
94
|
pathx.isChildPath("/a/b/c", "/a/b"); // true
|
|
@@ -84,19 +96,6 @@ pathx.isChildPath("/a/b", "/a/b/c"); // false
|
|
|
84
96
|
pathx.isChildPath("/a/b", "/a/b"); // false (same path)
|
|
85
97
|
```
|
|
86
98
|
|
|
87
|
-
### norm
|
|
88
|
-
|
|
89
|
-
```ts
|
|
90
|
-
function norm(...paths: string[]): NormPath
|
|
91
|
-
```
|
|
92
|
-
|
|
93
|
-
Normalize and resolve path segments into a `NormPath` (absolute, platform-native separators).
|
|
94
|
-
|
|
95
|
-
```ts
|
|
96
|
-
pathx.norm("/some/path"); // NormPath
|
|
97
|
-
pathx.norm("relative", "path"); // NormPath (resolved to absolute)
|
|
98
|
-
```
|
|
99
|
-
|
|
100
99
|
### filterByTargets
|
|
101
100
|
|
|
102
101
|
```ts
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@simplysm/core-node",
|
|
3
|
-
"version": "14.0.
|
|
3
|
+
"version": "14.0.12",
|
|
4
4
|
"description": "심플리즘 패키지 - 코어 (node)",
|
|
5
5
|
"author": "심플리즘",
|
|
6
6
|
"license": "Apache-2.0",
|
|
@@ -23,9 +23,9 @@
|
|
|
23
23
|
"chokidar": "^5.0.0",
|
|
24
24
|
"consola": "^3.4.2",
|
|
25
25
|
"glob": "^13.0.6",
|
|
26
|
-
"minimatch": "^10.2.
|
|
26
|
+
"minimatch": "^10.2.5",
|
|
27
27
|
"tsx": "^4.21.0",
|
|
28
|
-
"@simplysm/core-common": "14.0.
|
|
28
|
+
"@simplysm/core-common": "14.0.12"
|
|
29
29
|
},
|
|
30
30
|
"devDependencies": {
|
|
31
31
|
"@types/node": "^20.19.37"
|
|
@@ -74,6 +74,9 @@ export interface FsWatcherChangeInfo {
|
|
|
74
74
|
* await watcher.close();
|
|
75
75
|
*/
|
|
76
76
|
export class FsWatcher {
|
|
77
|
+
private static readonly _MAX_RETRIES = 3;
|
|
78
|
+
private static readonly _RETRY_DELAY_MS = 1000;
|
|
79
|
+
|
|
77
80
|
/**
|
|
78
81
|
* 파일 감시를 시작한다 (비동기).
|
|
79
82
|
* ready 이벤트가 발생할 때까지 대기한다.
|
|
@@ -102,17 +105,40 @@ export class FsWatcher {
|
|
|
102
105
|
});
|
|
103
106
|
}
|
|
104
107
|
|
|
105
|
-
private
|
|
108
|
+
private _watcher: chokidar.FSWatcher;
|
|
109
|
+
private readonly _paths: string[];
|
|
110
|
+
private readonly _options: chokidar.ChokidarOptions;
|
|
106
111
|
private readonly _ignoreInitial: boolean = true;
|
|
107
112
|
private readonly _debounceQueues: DebounceQueue[] = [];
|
|
108
113
|
private readonly _globMatchers: Minimatch[] = [];
|
|
114
|
+
private readonly _allHandlers: Array<(event: string, path: string) => void> = [];
|
|
115
|
+
private readonly _creationStack: string;
|
|
116
|
+
private _retryCount = 0;
|
|
117
|
+
private _isRecovering = false;
|
|
109
118
|
|
|
110
119
|
private readonly _logger = consola.withTag("sd-fs-watcher");
|
|
111
120
|
|
|
112
121
|
private constructor(paths: string[], options?: chokidar.ChokidarOptions) {
|
|
122
|
+
// 생성 시점의 스택트레이스를 저장 (에러 발생 시 호출부 추적용)
|
|
123
|
+
this._creationStack = new Error().stack ?? "";
|
|
124
|
+
this._paths = [...paths];
|
|
125
|
+
this._options = { ...options };
|
|
126
|
+
|
|
127
|
+
this._watcher = this._buildChokidarWatcher();
|
|
128
|
+
this._ignoreInitial = options?.ignoreInitial ?? this._ignoreInitial;
|
|
129
|
+
|
|
130
|
+
this._setupErrorHandler();
|
|
131
|
+
}
|
|
132
|
+
|
|
133
|
+
/**
|
|
134
|
+
* 저장된 paths와 options로 chokidar watcher를 생성한다.
|
|
135
|
+
* glob 패턴에서 base 디렉토리를 추출하고 globMatchers를 재구성한다.
|
|
136
|
+
*/
|
|
137
|
+
private _buildChokidarWatcher(): chokidar.FSWatcher {
|
|
113
138
|
const watchPaths: string[] = [];
|
|
139
|
+
this._globMatchers.length = 0;
|
|
114
140
|
|
|
115
|
-
for (const p of
|
|
141
|
+
for (const p of this._paths) {
|
|
116
142
|
const posixPath = posix(p);
|
|
117
143
|
if (GLOB_CHARS_RE.test(posixPath)) {
|
|
118
144
|
this._globMatchers.push(new Minimatch(posixPath, { dot: true }));
|
|
@@ -125,19 +151,98 @@ export class FsWatcher {
|
|
|
125
151
|
// 중복 경로 제거
|
|
126
152
|
const uniquePaths = [...new Set(watchPaths)];
|
|
127
153
|
|
|
128
|
-
|
|
154
|
+
return chokidar.watch(uniquePaths, {
|
|
129
155
|
persistent: true,
|
|
130
|
-
...
|
|
156
|
+
...this._options,
|
|
131
157
|
ignoreInitial: true,
|
|
132
158
|
});
|
|
133
|
-
|
|
159
|
+
}
|
|
134
160
|
|
|
135
|
-
|
|
161
|
+
/**
|
|
162
|
+
* chokidar watcher에 에러 핸들러를 등록한다.
|
|
163
|
+
* EPERM 에러 감지 시 자동 복구를 시도한다.
|
|
164
|
+
*/
|
|
165
|
+
private _setupErrorHandler(): void {
|
|
136
166
|
this._watcher.on("error", (err) => {
|
|
137
|
-
|
|
167
|
+
const errDetail = err instanceof Error ? (err.stack ?? err.message) : String(err);
|
|
168
|
+
this._logger.error(
|
|
169
|
+
`FsWatcher 오류: ${errDetail}\n---- creation stack ----\n${this._creationStack}`,
|
|
170
|
+
);
|
|
171
|
+
|
|
172
|
+
if (
|
|
173
|
+
err instanceof Error &&
|
|
174
|
+
"code" in err &&
|
|
175
|
+
(err as NodeJS.ErrnoException).code === "EPERM" &&
|
|
176
|
+
!this._isRecovering
|
|
177
|
+
) {
|
|
178
|
+
void this._handleEperm();
|
|
179
|
+
}
|
|
138
180
|
});
|
|
139
181
|
}
|
|
140
182
|
|
|
183
|
+
/**
|
|
184
|
+
* EPERM 에러 발생 시 watcher를 재생성한다.
|
|
185
|
+
* 최대 _MAX_RETRIES회까지 _RETRY_DELAY_MS 간격으로 재시도한다.
|
|
186
|
+
* 성공 시 재시도 카운터를 초기화한다.
|
|
187
|
+
*/
|
|
188
|
+
private async _handleEperm(): Promise<void> {
|
|
189
|
+
if (this._isRecovering) return;
|
|
190
|
+
this._isRecovering = true;
|
|
191
|
+
|
|
192
|
+
while (this._retryCount < FsWatcher._MAX_RETRIES) {
|
|
193
|
+
this._retryCount++;
|
|
194
|
+
this._logger.warn(
|
|
195
|
+
`EPERM 감지 — ${this._retryCount}/${FsWatcher._MAX_RETRIES} watcher 재시작 시도...`,
|
|
196
|
+
);
|
|
197
|
+
|
|
198
|
+
try {
|
|
199
|
+
try {
|
|
200
|
+
await this._watcher.close();
|
|
201
|
+
} catch {
|
|
202
|
+
// close 실패 무시
|
|
203
|
+
}
|
|
204
|
+
|
|
205
|
+
await new Promise((resolve) => setTimeout(resolve, FsWatcher._RETRY_DELAY_MS));
|
|
206
|
+
|
|
207
|
+
this._watcher = this._buildChokidarWatcher();
|
|
208
|
+
this._setupErrorHandler();
|
|
209
|
+
|
|
210
|
+
for (const handler of this._allHandlers) {
|
|
211
|
+
this._watcher.on("all", handler);
|
|
212
|
+
}
|
|
213
|
+
|
|
214
|
+
await new Promise<void>((resolve, reject) => {
|
|
215
|
+
const onReady = () => {
|
|
216
|
+
this._watcher.removeListener("error", onError);
|
|
217
|
+
resolve();
|
|
218
|
+
};
|
|
219
|
+
const onError = (e: unknown) => {
|
|
220
|
+
this._watcher.removeListener("ready", onReady);
|
|
221
|
+
reject(e);
|
|
222
|
+
};
|
|
223
|
+
this._watcher.once("ready", onReady);
|
|
224
|
+
this._watcher.once("error", onError);
|
|
225
|
+
});
|
|
226
|
+
|
|
227
|
+
// 성공 — 카운터 초기화 후 복구 완료
|
|
228
|
+
this._retryCount = 0;
|
|
229
|
+
this._isRecovering = false;
|
|
230
|
+
this._logger.success("watcher 재시작 완료");
|
|
231
|
+
return;
|
|
232
|
+
} catch (err) {
|
|
233
|
+
const errDetail = err instanceof Error ? err.message : String(err);
|
|
234
|
+
this._logger.error(
|
|
235
|
+
`watcher 재시작 실패 (${this._retryCount}/${FsWatcher._MAX_RETRIES}): ${errDetail}`,
|
|
236
|
+
);
|
|
237
|
+
}
|
|
238
|
+
}
|
|
239
|
+
|
|
240
|
+
this._logger.error(
|
|
241
|
+
`EPERM 재시도 최대 횟수(${FsWatcher._MAX_RETRIES}회) 초과 — 재시도 중단`,
|
|
242
|
+
);
|
|
243
|
+
this._isRecovering = false;
|
|
244
|
+
}
|
|
245
|
+
|
|
141
246
|
/**
|
|
142
247
|
* 파일 변경 이벤트 핸들러를 등록한다.
|
|
143
248
|
* 지정된 지연 시간 동안 이벤트를 수집하여 콜백을 한 번 호출한다.
|
|
@@ -161,7 +266,7 @@ export class FsWatcher {
|
|
|
161
266
|
});
|
|
162
267
|
}
|
|
163
268
|
|
|
164
|
-
|
|
269
|
+
const handler = (event: string, filePath: string) => {
|
|
165
270
|
// 지원되는 이벤트만 처리
|
|
166
271
|
if (!FS_WATCHER_EVENTS.includes(event as FsWatcherEvent)) return;
|
|
167
272
|
|
|
@@ -180,7 +285,7 @@ export class FsWatcher {
|
|
|
180
285
|
* - 그 외 → 최신 이벤트로 덮어쓰기
|
|
181
286
|
*/
|
|
182
287
|
if (!changeInfoMap.has(filePath)) {
|
|
183
|
-
changeInfoMap.set(filePath, event);
|
|
288
|
+
changeInfoMap.set(filePath, event as EventName);
|
|
184
289
|
}
|
|
185
290
|
const prevEvent = changeInfoMap.get(filePath)!;
|
|
186
291
|
|
|
@@ -193,14 +298,17 @@ export class FsWatcher {
|
|
|
193
298
|
) {
|
|
194
299
|
// add 후 unlink → 변경 없음 (삭제)
|
|
195
300
|
changeInfoMap.delete(filePath);
|
|
196
|
-
} else if (prevEvent === "unlink" &&
|
|
197
|
-
// unlink 후 add
|
|
301
|
+
} else if (prevEvent === "unlink" && event === "add") {
|
|
302
|
+
// unlink 후 add → add (파일 재생성)
|
|
198
303
|
changeInfoMap.set(filePath, "add");
|
|
304
|
+
} else if (prevEvent === "unlink" && event === "change") {
|
|
305
|
+
// unlink 후 change → change (이전 사이클에서 이미 존재하던 파일이 삭제 후 수정된 경우)
|
|
306
|
+
changeInfoMap.set(filePath, "change");
|
|
199
307
|
} else if (prevEvent === "unlinkDir" && event === "addDir") {
|
|
200
308
|
// unlinkDir 후 addDir → addDir (디렉토리 재생성)
|
|
201
309
|
changeInfoMap.set(filePath, "addDir");
|
|
202
310
|
} else {
|
|
203
|
-
changeInfoMap.set(filePath, event);
|
|
311
|
+
changeInfoMap.set(filePath, event as EventName);
|
|
204
312
|
}
|
|
205
313
|
|
|
206
314
|
fnQ.run(async () => {
|
|
@@ -218,7 +326,10 @@ export class FsWatcher {
|
|
|
218
326
|
|
|
219
327
|
await cb(changeInfos);
|
|
220
328
|
});
|
|
221
|
-
}
|
|
329
|
+
};
|
|
330
|
+
|
|
331
|
+
this._allHandlers.push(handler);
|
|
332
|
+
this._watcher.on("all", handler);
|
|
222
333
|
|
|
223
334
|
return this;
|
|
224
335
|
}
|