@hewliyang/headless-spreadjs 0.0.3 → 0.0.4
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 +78 -50
- package/dist/cli/abort.d.ts +7 -0
- package/dist/cli/abort.d.ts.map +1 -0
- package/dist/cli/abort.js +35 -0
- package/dist/cli/abort.js.map +1 -0
- package/dist/cli/client.d.ts +9 -0
- package/dist/cli/client.d.ts.map +1 -0
- package/dist/cli/client.js +122 -0
- package/dist/cli/client.js.map +1 -0
- package/dist/cli/commands/clear.d.ts +3 -1
- package/dist/cli/commands/clear.d.ts.map +1 -1
- package/dist/cli/commands/clear.js +11 -9
- package/dist/cli/commands/clear.js.map +1 -1
- package/dist/cli/commands/copy.d.ts +3 -1
- package/dist/cli/commands/copy.d.ts.map +1 -1
- package/dist/cli/commands/copy.js +5 -2
- package/dist/cli/commands/copy.js.map +1 -1
- package/dist/cli/commands/create.d.ts +3 -1
- package/dist/cli/commands/create.d.ts.map +1 -1
- package/dist/cli/commands/create.js +2 -2
- package/dist/cli/commands/create.js.map +1 -1
- package/dist/cli/commands/csv.d.ts +5 -1
- package/dist/cli/commands/csv.d.ts.map +1 -1
- package/dist/cli/commands/csv.js +38 -13
- package/dist/cli/commands/csv.js.map +1 -1
- package/dist/cli/commands/deps.d.ts +11 -0
- package/dist/cli/commands/deps.d.ts.map +1 -0
- package/dist/cli/commands/deps.js +329 -0
- package/dist/cli/commands/deps.js.map +1 -0
- package/dist/cli/commands/diff.d.ts +7 -0
- package/dist/cli/commands/diff.d.ts.map +1 -0
- package/dist/cli/commands/diff.js +235 -0
- package/dist/cli/commands/diff.js.map +1 -0
- package/dist/cli/commands/eval.d.ts +3 -1
- package/dist/cli/commands/eval.d.ts.map +1 -1
- package/dist/cli/commands/eval.js +23 -8
- package/dist/cli/commands/eval.js.map +1 -1
- package/dist/cli/commands/get.d.ts +1 -0
- package/dist/cli/commands/get.d.ts.map +1 -1
- package/dist/cli/commands/get.js +5 -2
- package/dist/cli/commands/get.js.map +1 -1
- package/dist/cli/commands/info.d.ts +3 -1
- package/dist/cli/commands/info.d.ts.map +1 -1
- package/dist/cli/commands/info.js +5 -2
- package/dist/cli/commands/info.js.map +1 -1
- package/dist/cli/commands/objects.d.ts +3 -1
- package/dist/cli/commands/objects.d.ts.map +1 -1
- package/dist/cli/commands/objects.js +5 -6
- package/dist/cli/commands/objects.js.map +1 -1
- package/dist/cli/commands/resize.d.ts +1 -0
- package/dist/cli/commands/resize.d.ts.map +1 -1
- package/dist/cli/commands/resize.js +67 -29
- package/dist/cli/commands/resize.js.map +1 -1
- package/dist/cli/commands/rows-cols.d.ts +1 -0
- package/dist/cli/commands/rows-cols.d.ts.map +1 -1
- package/dist/cli/commands/rows-cols.js +101 -45
- package/dist/cli/commands/rows-cols.js.map +1 -1
- package/dist/cli/commands/screenshot.d.ts +8 -0
- package/dist/cli/commands/screenshot.d.ts.map +1 -0
- package/dist/cli/commands/screenshot.js +260 -0
- package/dist/cli/commands/screenshot.js.map +1 -0
- package/dist/cli/commands/search.d.ts +1 -0
- package/dist/cli/commands/search.d.ts.map +1 -1
- package/dist/cli/commands/search.js +16 -8
- package/dist/cli/commands/search.js.map +1 -1
- package/dist/cli/commands/set.d.ts +3 -1
- package/dist/cli/commands/set.d.ts.map +1 -1
- package/dist/cli/commands/set.js +72 -25
- package/dist/cli/commands/set.js.map +1 -1
- package/dist/cli/commands/sheet.d.ts +3 -1
- package/dist/cli/commands/sheet.d.ts.map +1 -1
- package/dist/cli/commands/sheet.js +20 -10
- package/dist/cli/commands/sheet.js.map +1 -1
- package/dist/cli/context.d.ts +18 -6
- package/dist/cli/context.d.ts.map +1 -1
- package/dist/cli/context.js +93 -8
- package/dist/cli/context.js.map +1 -1
- package/dist/cli/daemon-entry.d.ts +3 -0
- package/dist/cli/daemon-entry.d.ts.map +1 -0
- package/dist/cli/daemon-entry.js +4 -0
- package/dist/cli/daemon-entry.js.map +1 -0
- package/dist/cli/daemon.d.ts +4 -0
- package/dist/cli/daemon.d.ts.map +1 -0
- package/dist/cli/daemon.js +330 -0
- package/dist/cli/daemon.js.map +1 -0
- package/dist/cli/dispatch.d.ts +5 -0
- package/dist/cli/dispatch.d.ts.map +1 -0
- package/dist/cli/dispatch.js +353 -0
- package/dist/cli/dispatch.js.map +1 -0
- package/dist/cli/file-cache.d.ts +23 -0
- package/dist/cli/file-cache.d.ts.map +1 -0
- package/dist/cli/file-cache.js +102 -0
- package/dist/cli/file-cache.js.map +1 -0
- package/dist/cli/index.js +11 -0
- package/dist/cli/index.js.map +1 -1
- package/dist/cli/main.d.ts.map +1 -1
- package/dist/cli/main.js +188 -159
- package/dist/cli/main.js.map +1 -1
- package/dist/cli/output.d.ts +9 -6
- package/dist/cli/output.d.ts.map +1 -1
- package/dist/cli/output.js +36 -8
- package/dist/cli/output.js.map +1 -1
- package/dist/cli/styles.d.ts +14 -19
- package/dist/cli/styles.d.ts.map +1 -1
- package/dist/cli/styles.js +65 -39
- package/dist/cli/styles.js.map +1 -1
- package/dist/excel-file.d.ts +3 -1
- package/dist/excel-file.d.ts.map +1 -1
- package/dist/excel-file.js +50 -6
- package/dist/excel-file.js.map +1 -1
- package/package.json +9 -1
|
@@ -1,12 +1,15 @@
|
|
|
1
|
+
import { throwIfAborted } from "../abort.js";
|
|
1
2
|
import { withFile } from "../context.js";
|
|
2
3
|
import { fail, ok } from "../output.js";
|
|
3
|
-
export async function sheet(filePath, op, args) {
|
|
4
|
+
export async function sheet(filePath, op, args, options) {
|
|
4
5
|
const needsSave = op !== "list";
|
|
5
|
-
|
|
6
|
+
const signal = options?.signal;
|
|
7
|
+
await withFile(filePath, ({ file, workbook, GC }) => {
|
|
6
8
|
switch (op) {
|
|
7
9
|
case "list": {
|
|
8
10
|
const sheets = [];
|
|
9
11
|
for (let i = 0; i < workbook.getSheetCount(); i++) {
|
|
12
|
+
throwIfAborted(signal);
|
|
10
13
|
sheets.push({ index: i, name: workbook.getSheet(i).name() });
|
|
11
14
|
}
|
|
12
15
|
ok({ sheets });
|
|
@@ -16,8 +19,10 @@ export async function sheet(filePath, op, args) {
|
|
|
16
19
|
const name = args[0];
|
|
17
20
|
if (!name)
|
|
18
21
|
fail("Usage: hsx sheet <file> create <name>");
|
|
19
|
-
|
|
20
|
-
|
|
22
|
+
file.batch(() => {
|
|
23
|
+
const ws = new GC.Spread.Sheets.Worksheet(name);
|
|
24
|
+
workbook.addSheet(workbook.getSheetCount(), ws);
|
|
25
|
+
});
|
|
21
26
|
ok({ created: name, index: workbook.getSheetCount() - 1 });
|
|
22
27
|
break;
|
|
23
28
|
}
|
|
@@ -25,13 +30,15 @@ export async function sheet(filePath, op, args) {
|
|
|
25
30
|
const name = args[0];
|
|
26
31
|
if (!name)
|
|
27
32
|
fail("Usage: hsx sheet <file> delete <name>");
|
|
28
|
-
const index = findSheet(workbook, name);
|
|
33
|
+
const index = findSheet(workbook, name, signal);
|
|
29
34
|
if (index === -1)
|
|
30
35
|
fail(`Sheet not found: ${name}`);
|
|
31
36
|
if (workbook.getSheetCount() <= 1) {
|
|
32
37
|
fail("Cannot delete the only sheet.");
|
|
33
38
|
}
|
|
34
|
-
|
|
39
|
+
file.batch(() => {
|
|
40
|
+
workbook.removeSheet(index);
|
|
41
|
+
});
|
|
35
42
|
ok({ deleted: name });
|
|
36
43
|
break;
|
|
37
44
|
}
|
|
@@ -40,20 +47,23 @@ export async function sheet(filePath, op, args) {
|
|
|
40
47
|
if (!oldName || !newName) {
|
|
41
48
|
fail("Usage: hsx sheet <file> rename <old> <new>");
|
|
42
49
|
}
|
|
43
|
-
const index = findSheet(workbook, oldName);
|
|
50
|
+
const index = findSheet(workbook, oldName, signal);
|
|
44
51
|
if (index === -1)
|
|
45
52
|
fail(`Sheet not found: ${oldName}`);
|
|
46
|
-
|
|
53
|
+
file.batch(() => {
|
|
54
|
+
workbook.getSheet(index).name(newName);
|
|
55
|
+
});
|
|
47
56
|
ok({ renamed: { from: oldName, to: newName } });
|
|
48
57
|
break;
|
|
49
58
|
}
|
|
50
59
|
default:
|
|
51
60
|
fail(`Unknown sheet operation: ${op}`);
|
|
52
61
|
}
|
|
53
|
-
}, { save: needsSave });
|
|
62
|
+
}, { save: needsSave, signal });
|
|
54
63
|
}
|
|
55
|
-
function findSheet(workbook, name) {
|
|
64
|
+
function findSheet(workbook, name, signal) {
|
|
56
65
|
for (let i = 0; i < workbook.getSheetCount(); i++) {
|
|
66
|
+
throwIfAborted(signal);
|
|
57
67
|
if (workbook.getSheet(i).name() === name)
|
|
58
68
|
return i;
|
|
59
69
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"sheet.js","sourceRoot":"","sources":["../../../src/cli/commands/sheet.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,QAAQ,EAAE,MAAM,eAAe,CAAC;AACzC,OAAO,EAAE,IAAI,EAAE,EAAE,EAAE,MAAM,cAAc,CAAC;AAIxC,MAAM,CAAC,KAAK,UAAU,KAAK,CACzB,QAAgB,EAChB,EAAW,EACX,IAAc;
|
|
1
|
+
{"version":3,"file":"sheet.js","sourceRoot":"","sources":["../../../src/cli/commands/sheet.ts"],"names":[],"mappings":"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"}
|
package/dist/cli/context.d.ts
CHANGED
|
@@ -1,15 +1,27 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* Lifecycle wrapper: init → open/create → execute → save → dispose.
|
|
3
|
-
*/
|
|
4
1
|
import { type ExcelFile } from "../index.js";
|
|
5
2
|
import type { GCNamespace, SpreadWorkbook } from "../types.js";
|
|
3
|
+
import type { FileCache } from "./file-cache.js";
|
|
6
4
|
export interface FileContext {
|
|
7
5
|
file: ExcelFile;
|
|
8
6
|
workbook: SpreadWorkbook;
|
|
9
7
|
GC: GCNamespace;
|
|
10
8
|
}
|
|
11
|
-
|
|
9
|
+
interface DaemonRuntime {
|
|
10
|
+
GC: GCNamespace;
|
|
11
|
+
ExcelFile: typeof ExcelFile;
|
|
12
|
+
fileCache: FileCache;
|
|
13
|
+
cwd: string;
|
|
14
|
+
writeThrough: boolean;
|
|
15
|
+
}
|
|
16
|
+
interface FileOptions {
|
|
12
17
|
save?: boolean;
|
|
13
|
-
|
|
14
|
-
|
|
18
|
+
signal?: AbortSignal | null;
|
|
19
|
+
}
|
|
20
|
+
export declare function runWithDaemonRuntime<T>(runtime: DaemonRuntime, fn: () => T | Promise<T>): T | Promise<T>;
|
|
21
|
+
export declare function getDaemonRuntime(): DaemonRuntime | null;
|
|
22
|
+
export declare function withFile<T>(filePath: string, fn: (ctx: FileContext) => T | Promise<T>, options?: FileOptions): Promise<T>;
|
|
23
|
+
export declare function withNewFile<T>(filePath: string, fn?: (ctx: FileContext) => T | Promise<T>, options?: {
|
|
24
|
+
signal?: AbortSignal | null;
|
|
25
|
+
}): Promise<T | undefined>;
|
|
26
|
+
export {};
|
|
15
27
|
//# sourceMappingURL=context.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"context.d.ts","sourceRoot":"","sources":["../../src/cli/context.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"context.d.ts","sourceRoot":"","sources":["../../src/cli/context.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,KAAK,SAAS,EAAQ,MAAM,aAAa,CAAC;AACnD,OAAO,KAAK,EAAE,WAAW,EAAE,cAAc,EAAE,MAAM,aAAa,CAAC;AAE/D,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,iBAAiB,CAAC;AAEjD,MAAM,WAAW,WAAW;IAC1B,IAAI,EAAE,SAAS,CAAC;IAChB,QAAQ,EAAE,cAAc,CAAC;IACzB,EAAE,EAAE,WAAW,CAAC;CACjB;AAED,UAAU,aAAa;IACrB,EAAE,EAAE,WAAW,CAAC;IAChB,SAAS,EAAE,OAAO,SAAS,CAAC;IAC5B,SAAS,EAAE,SAAS,CAAC;IACrB,GAAG,EAAE,MAAM,CAAC;IACZ,YAAY,EAAE,OAAO,CAAC;CACvB;AAED,UAAU,WAAW;IACnB,IAAI,CAAC,EAAE,OAAO,CAAC;IACf,MAAM,CAAC,EAAE,WAAW,GAAG,IAAI,CAAC;CAC7B;AAID,wBAAgB,oBAAoB,CAAC,CAAC,EACpC,OAAO,EAAE,aAAa,EACtB,EAAE,EAAE,MAAM,CAAC,GAAG,OAAO,CAAC,CAAC,CAAC,GACvB,CAAC,GAAG,OAAO,CAAC,CAAC,CAAC,CAEhB;AAED,wBAAgB,gBAAgB,IAAI,aAAa,GAAG,IAAI,CAEvD;AAED,wBAAsB,QAAQ,CAAC,CAAC,EAC9B,QAAQ,EAAE,MAAM,EAChB,EAAE,EAAE,CAAC,GAAG,EAAE,WAAW,KAAK,CAAC,GAAG,OAAO,CAAC,CAAC,CAAC,EACxC,OAAO,CAAC,EAAE,WAAW,GACpB,OAAO,CAAC,CAAC,CAAC,CAuBZ;AA0DD,wBAAsB,WAAW,CAAC,CAAC,EACjC,QAAQ,EAAE,MAAM,EAChB,EAAE,CAAC,EAAE,CAAC,GAAG,EAAE,WAAW,KAAK,CAAC,GAAG,OAAO,CAAC,CAAC,CAAC,EACzC,OAAO,CAAC,EAAE;IAAE,MAAM,CAAC,EAAE,WAAW,GAAG,IAAI,CAAA;CAAE,GACxC,OAAO,CAAC,CAAC,GAAG,SAAS,CAAC,CAsBxB"}
|
package/dist/cli/context.js
CHANGED
|
@@ -1,13 +1,29 @@
|
|
|
1
|
-
|
|
2
|
-
|
|
3
|
-
*/
|
|
1
|
+
import { AsyncLocalStorage } from "node:async_hooks";
|
|
2
|
+
import { resolve } from "node:path";
|
|
4
3
|
import { init } from "../index.js";
|
|
4
|
+
import { throwIfAborted } from "./abort.js";
|
|
5
|
+
const runtimeStore = new AsyncLocalStorage();
|
|
6
|
+
export function runWithDaemonRuntime(runtime, fn) {
|
|
7
|
+
return runtimeStore.run(runtime, fn);
|
|
8
|
+
}
|
|
9
|
+
export function getDaemonRuntime() {
|
|
10
|
+
return runtimeStore.getStore() ?? null;
|
|
11
|
+
}
|
|
5
12
|
export async function withFile(filePath, fn, options) {
|
|
13
|
+
const signal = options?.signal;
|
|
14
|
+
throwIfAborted(signal);
|
|
15
|
+
const daemonRuntime = runtimeStore.getStore();
|
|
16
|
+
if (daemonRuntime) {
|
|
17
|
+
return withFileDaemon(daemonRuntime, filePath, fn, options);
|
|
18
|
+
}
|
|
6
19
|
const { GC, ExcelFile: EF, dispose } = await init();
|
|
7
20
|
try {
|
|
21
|
+
throwIfAborted(signal);
|
|
8
22
|
const file = await EF.open(filePath);
|
|
23
|
+
throwIfAborted(signal);
|
|
9
24
|
const result = await fn({ file, workbook: file.workbook, GC });
|
|
10
25
|
if (options?.save) {
|
|
26
|
+
throwIfAborted(signal);
|
|
11
27
|
await file.save(filePath);
|
|
12
28
|
}
|
|
13
29
|
return result;
|
|
@@ -16,14 +32,68 @@ export async function withFile(filePath, fn, options) {
|
|
|
16
32
|
dispose();
|
|
17
33
|
}
|
|
18
34
|
}
|
|
19
|
-
|
|
35
|
+
async function withFileDaemon(rt, filePath, fn, options) {
|
|
36
|
+
const signal = options?.signal;
|
|
37
|
+
throwIfAborted(signal);
|
|
38
|
+
const absPath = resolve(rt.cwd, filePath);
|
|
39
|
+
let cached = await rt.fileCache.get(filePath, rt.cwd);
|
|
40
|
+
if (!cached) {
|
|
41
|
+
throwIfAborted(signal);
|
|
42
|
+
const file = await rt.ExcelFile.open(absPath);
|
|
43
|
+
throwIfAborted(signal);
|
|
44
|
+
await rt.fileCache.put(filePath, rt.cwd, file);
|
|
45
|
+
cached = { file, absPath };
|
|
46
|
+
}
|
|
47
|
+
const wasDirty = rt.fileCache.isDirty(filePath, rt.cwd);
|
|
48
|
+
let result;
|
|
49
|
+
try {
|
|
50
|
+
throwIfAborted(signal);
|
|
51
|
+
result = await fn({
|
|
52
|
+
file: cached.file,
|
|
53
|
+
workbook: cached.file.workbook,
|
|
54
|
+
GC: rt.GC,
|
|
55
|
+
});
|
|
56
|
+
}
|
|
57
|
+
catch (err) {
|
|
58
|
+
if (!wasDirty) {
|
|
59
|
+
rt.fileCache.invalidate(filePath, rt.cwd);
|
|
60
|
+
}
|
|
61
|
+
throw err;
|
|
62
|
+
}
|
|
63
|
+
if (options?.save) {
|
|
64
|
+
throwIfAborted(signal);
|
|
65
|
+
if (rt.writeThrough) {
|
|
66
|
+
try {
|
|
67
|
+
await cached.file.save(cached.absPath);
|
|
68
|
+
throwIfAborted(signal);
|
|
69
|
+
await rt.fileCache.updateMtime(filePath, rt.cwd);
|
|
70
|
+
}
|
|
71
|
+
catch (err) {
|
|
72
|
+
rt.fileCache.invalidate(filePath, rt.cwd);
|
|
73
|
+
throw err;
|
|
74
|
+
}
|
|
75
|
+
}
|
|
76
|
+
else {
|
|
77
|
+
rt.fileCache.markDirty(filePath, rt.cwd);
|
|
78
|
+
}
|
|
79
|
+
}
|
|
80
|
+
return result;
|
|
81
|
+
}
|
|
82
|
+
export async function withNewFile(filePath, fn, options) {
|
|
83
|
+
const signal = options?.signal;
|
|
84
|
+
throwIfAborted(signal);
|
|
85
|
+
const daemonRuntime = runtimeStore.getStore();
|
|
86
|
+
if (daemonRuntime) {
|
|
87
|
+
return withNewFileDaemon(daemonRuntime, filePath, fn, options);
|
|
88
|
+
}
|
|
20
89
|
const { GC, ExcelFile: EF, dispose } = await init();
|
|
21
90
|
try {
|
|
91
|
+
throwIfAborted(signal);
|
|
22
92
|
const file = new EF();
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
93
|
+
const result = fn
|
|
94
|
+
? await fn({ file, workbook: file.workbook, GC })
|
|
95
|
+
: undefined;
|
|
96
|
+
throwIfAborted(signal);
|
|
27
97
|
await file.save(filePath);
|
|
28
98
|
return result;
|
|
29
99
|
}
|
|
@@ -31,4 +101,19 @@ export async function withNewFile(filePath, fn) {
|
|
|
31
101
|
dispose();
|
|
32
102
|
}
|
|
33
103
|
}
|
|
104
|
+
async function withNewFileDaemon(rt, filePath, fn, options) {
|
|
105
|
+
const signal = options?.signal;
|
|
106
|
+
throwIfAborted(signal);
|
|
107
|
+
const absPath = resolve(rt.cwd, filePath);
|
|
108
|
+
const file = new rt.ExcelFile();
|
|
109
|
+
const result = fn
|
|
110
|
+
? await fn({ file, workbook: file.workbook, GC: rt.GC })
|
|
111
|
+
: undefined;
|
|
112
|
+
throwIfAborted(signal);
|
|
113
|
+
await file.save(absPath);
|
|
114
|
+
throwIfAborted(signal);
|
|
115
|
+
await rt.fileCache.put(filePath, rt.cwd, file);
|
|
116
|
+
await rt.fileCache.updateMtime(filePath, rt.cwd);
|
|
117
|
+
return result;
|
|
118
|
+
}
|
|
34
119
|
//# sourceMappingURL=context.js.map
|
package/dist/cli/context.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"context.js","sourceRoot":"","sources":["../../src/cli/context.ts"],"names":[],"mappings":"AAAA
|
|
1
|
+
{"version":3,"file":"context.js","sourceRoot":"","sources":["../../src/cli/context.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"daemon-entry.d.ts","sourceRoot":"","sources":["../../src/cli/daemon-entry.ts"],"names":[],"mappings":""}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"daemon-entry.js","sourceRoot":"","sources":["../../src/cli/daemon-entry.ts"],"names":[],"mappings":";AAEA,OAAO,EAAE,WAAW,EAAE,MAAM,aAAa,CAAC;AAE1C,MAAM,WAAW,EAAE,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"daemon.d.ts","sourceRoot":"","sources":["../../src/cli/daemon.ts"],"names":[],"mappings":"AAmCA,wBAAgB,aAAa,IAAI,MAAM,CAKtC;AAED,wBAAgB,UAAU,IAAI,MAAM,CAMnC;AA+BD,wBAAsB,WAAW,IAAI,OAAO,CAAC,IAAI,CAAC,CAyTjD"}
|
|
@@ -0,0 +1,330 @@
|
|
|
1
|
+
import { existsSync, unlinkSync } from "node:fs";
|
|
2
|
+
import { connect, createServer } from "node:net";
|
|
3
|
+
import { homedir } from "node:os";
|
|
4
|
+
import { join } from "node:path";
|
|
5
|
+
import { dispose as disposeRuntime, init } from "../index.js";
|
|
6
|
+
import { registerSignalTimeout, throwIfAborted } from "./abort.js";
|
|
7
|
+
import { runWithDaemonRuntime } from "./context.js";
|
|
8
|
+
import { dispatch } from "./dispatch.js";
|
|
9
|
+
import { FileCache } from "./file-cache.js";
|
|
10
|
+
import { createIoContext, runWithIo } from "./output.js";
|
|
11
|
+
function envEnabled(value) {
|
|
12
|
+
if (!value)
|
|
13
|
+
return false;
|
|
14
|
+
return /^(1|true|yes|on)$/i.test(value.trim());
|
|
15
|
+
}
|
|
16
|
+
function envPositiveInt(value, fallback) {
|
|
17
|
+
if (!value)
|
|
18
|
+
return fallback;
|
|
19
|
+
const parsed = Number.parseInt(value, 10);
|
|
20
|
+
return Number.isFinite(parsed) && parsed > 0 ? parsed : fallback;
|
|
21
|
+
}
|
|
22
|
+
const IDLE_TIMEOUT_MS = 5 * 60 * 1000;
|
|
23
|
+
const AUTO_FLUSH_INTERVAL_MS = envPositiveInt(process.env.HSX_AUTO_FLUSH_MS, 5_000);
|
|
24
|
+
const DEFAULT_CACHE_SIZE = 10;
|
|
25
|
+
const DEFAULT_REQUEST_TIMEOUT_MS = 30_000;
|
|
26
|
+
const PROBE_TIMEOUT_MS = 3_000;
|
|
27
|
+
function errorMessage(err) {
|
|
28
|
+
return err instanceof Error ? err.message : String(err);
|
|
29
|
+
}
|
|
30
|
+
export function getSocketPath() {
|
|
31
|
+
if (process.env.HSX_SOCKET_PATH)
|
|
32
|
+
return process.env.HSX_SOCKET_PATH;
|
|
33
|
+
return process.platform === "win32"
|
|
34
|
+
? "\\\\.\\pipe\\hsx-daemon"
|
|
35
|
+
: join(homedir(), ".hsx-daemon.sock");
|
|
36
|
+
}
|
|
37
|
+
export function getLogPath() {
|
|
38
|
+
const socketPath = getSocketPath();
|
|
39
|
+
if (socketPath.startsWith("\\\\.\\pipe\\")) {
|
|
40
|
+
return join(homedir(), ".hsx-daemon.log");
|
|
41
|
+
}
|
|
42
|
+
return `${socketPath.replace(/\.sock$/, "")}.log`;
|
|
43
|
+
}
|
|
44
|
+
function isDaemonListening(socketPath) {
|
|
45
|
+
return new Promise((resolve) => {
|
|
46
|
+
const probe = connect({ path: socketPath });
|
|
47
|
+
const timeout = setTimeout(() => {
|
|
48
|
+
probe.destroy();
|
|
49
|
+
resolve(false);
|
|
50
|
+
}, PROBE_TIMEOUT_MS);
|
|
51
|
+
probe.on("connect", () => {
|
|
52
|
+
clearTimeout(timeout);
|
|
53
|
+
probe.end();
|
|
54
|
+
resolve(true);
|
|
55
|
+
});
|
|
56
|
+
probe.on("error", () => {
|
|
57
|
+
clearTimeout(timeout);
|
|
58
|
+
resolve(false);
|
|
59
|
+
});
|
|
60
|
+
});
|
|
61
|
+
}
|
|
62
|
+
export async function startDaemon() {
|
|
63
|
+
const socketPath = getSocketPath();
|
|
64
|
+
if (process.platform !== "win32" && existsSync(socketPath)) {
|
|
65
|
+
if (await isDaemonListening(socketPath)) {
|
|
66
|
+
process.stderr.write(`${JSON.stringify({ error: "Daemon already running" })}\n`);
|
|
67
|
+
process.exit(1);
|
|
68
|
+
}
|
|
69
|
+
try {
|
|
70
|
+
unlinkSync(socketPath);
|
|
71
|
+
}
|
|
72
|
+
catch { }
|
|
73
|
+
}
|
|
74
|
+
const { GC, ExcelFile } = await init();
|
|
75
|
+
const cacheSize = envPositiveInt(process.env.HSX_CACHE_SIZE, DEFAULT_CACHE_SIZE);
|
|
76
|
+
const writeThrough = envEnabled(process.env.HSX_WRITE_THROUGH);
|
|
77
|
+
const fileCache = new FileCache(cacheSize);
|
|
78
|
+
let idleTimer = null;
|
|
79
|
+
let activeConnections = 0;
|
|
80
|
+
const server = createServer(handleConnection);
|
|
81
|
+
function daemonLog(msg) {
|
|
82
|
+
const ts = new Date().toISOString();
|
|
83
|
+
process.stderr.write(`[hsx-daemon ${ts}] ${msg}\n`);
|
|
84
|
+
}
|
|
85
|
+
function resetIdleTimer() {
|
|
86
|
+
if (idleTimer)
|
|
87
|
+
clearTimeout(idleTimer);
|
|
88
|
+
idleTimer = setTimeout(() => {
|
|
89
|
+
if (activeConnections === 0) {
|
|
90
|
+
void shutdown().catch((err) => {
|
|
91
|
+
daemonLog(`idle shutdown failed: ${errorMessage(err)}`);
|
|
92
|
+
});
|
|
93
|
+
}
|
|
94
|
+
}, IDLE_TIMEOUT_MS);
|
|
95
|
+
}
|
|
96
|
+
let shuttingDown = false;
|
|
97
|
+
async function shutdown(options) {
|
|
98
|
+
if (shuttingDown)
|
|
99
|
+
return;
|
|
100
|
+
shuttingDown = true;
|
|
101
|
+
if (idleTimer)
|
|
102
|
+
clearTimeout(idleTimer);
|
|
103
|
+
if (autoFlushTimer)
|
|
104
|
+
clearInterval(autoFlushTimer);
|
|
105
|
+
if (!options?.skipFlush) {
|
|
106
|
+
try {
|
|
107
|
+
const flushed = await fileCache.flushDirty();
|
|
108
|
+
if (flushed > 0) {
|
|
109
|
+
daemonLog(`flushed ${flushed} dirty file(s) to disk`);
|
|
110
|
+
}
|
|
111
|
+
}
|
|
112
|
+
catch (err) {
|
|
113
|
+
daemonLog(`shutdown aborted: failed to flush dirty files: ${errorMessage(err)}`);
|
|
114
|
+
shuttingDown = false;
|
|
115
|
+
resetIdleTimer();
|
|
116
|
+
throw err;
|
|
117
|
+
}
|
|
118
|
+
}
|
|
119
|
+
fileCache.clear();
|
|
120
|
+
server.close();
|
|
121
|
+
try {
|
|
122
|
+
unlinkSync(socketPath);
|
|
123
|
+
}
|
|
124
|
+
catch { }
|
|
125
|
+
disposeRuntime();
|
|
126
|
+
process.exit(0);
|
|
127
|
+
}
|
|
128
|
+
let queue = Promise.resolve();
|
|
129
|
+
function enqueue(fn) {
|
|
130
|
+
const task = queue
|
|
131
|
+
.catch((err) => daemonLog(`queue error: ${errorMessage(err)}`))
|
|
132
|
+
.then(fn);
|
|
133
|
+
queue = task;
|
|
134
|
+
return task;
|
|
135
|
+
}
|
|
136
|
+
let autoFlushTimer = null;
|
|
137
|
+
if (!writeThrough) {
|
|
138
|
+
autoFlushTimer = setInterval(() => {
|
|
139
|
+
if (fileCache.dirtyCount > 0) {
|
|
140
|
+
enqueue(async () => {
|
|
141
|
+
try {
|
|
142
|
+
const flushed = await fileCache.flushDirty();
|
|
143
|
+
if (flushed > 0) {
|
|
144
|
+
daemonLog(`auto-flush: saved ${flushed} dirty file(s) to disk`);
|
|
145
|
+
}
|
|
146
|
+
}
|
|
147
|
+
catch (err) {
|
|
148
|
+
daemonLog(`auto-flush failed: ${errorMessage(err)}`);
|
|
149
|
+
}
|
|
150
|
+
}).catch(() => { });
|
|
151
|
+
}
|
|
152
|
+
}, AUTO_FLUSH_INTERVAL_MS);
|
|
153
|
+
autoFlushTimer.unref();
|
|
154
|
+
}
|
|
155
|
+
async function handleRequest(request, signal) {
|
|
156
|
+
try {
|
|
157
|
+
throwIfAborted(signal);
|
|
158
|
+
if (request.argv[0] === "daemon" && request.argv[1] === "stop") {
|
|
159
|
+
const flushed = await fileCache.flushDirty();
|
|
160
|
+
if (flushed > 0) {
|
|
161
|
+
daemonLog(`flushed ${flushed} dirty file(s) before stop`);
|
|
162
|
+
}
|
|
163
|
+
return {
|
|
164
|
+
stdout: `${JSON.stringify({ stopped: true })}\n`,
|
|
165
|
+
stderr: "",
|
|
166
|
+
exitCode: 0,
|
|
167
|
+
shutdown: true,
|
|
168
|
+
};
|
|
169
|
+
}
|
|
170
|
+
if (request.argv[0] === "daemon" && request.argv[1] === "flush") {
|
|
171
|
+
const flushed = await fileCache.flushDirty();
|
|
172
|
+
if (flushed > 0) {
|
|
173
|
+
daemonLog(`flushed ${flushed} dirty file(s) via explicit request`);
|
|
174
|
+
}
|
|
175
|
+
return {
|
|
176
|
+
stdout: `${JSON.stringify({
|
|
177
|
+
flushed,
|
|
178
|
+
dirtyFiles: fileCache.dirtyCount,
|
|
179
|
+
})}\n`,
|
|
180
|
+
stderr: "",
|
|
181
|
+
exitCode: 0,
|
|
182
|
+
};
|
|
183
|
+
}
|
|
184
|
+
if (request.argv[0] === "daemon" && request.argv[1] === "status") {
|
|
185
|
+
const mem = process.memoryUsage();
|
|
186
|
+
return {
|
|
187
|
+
stdout: `${JSON.stringify({
|
|
188
|
+
pid: process.pid,
|
|
189
|
+
cachedFiles: fileCache.size,
|
|
190
|
+
dirtyFiles: fileCache.dirtyCount,
|
|
191
|
+
maxCacheSize: fileCache.maxCacheSize,
|
|
192
|
+
writeThrough,
|
|
193
|
+
uptime: Math.floor(process.uptime()),
|
|
194
|
+
heapUsedMB: Math.round(mem.heapUsed / 1024 / 1024),
|
|
195
|
+
rssMB: Math.round(mem.rss / 1024 / 1024),
|
|
196
|
+
logFile: getLogPath(),
|
|
197
|
+
})}\n`,
|
|
198
|
+
stderr: "",
|
|
199
|
+
exitCode: 0,
|
|
200
|
+
};
|
|
201
|
+
}
|
|
202
|
+
const runtime = {
|
|
203
|
+
GC,
|
|
204
|
+
ExcelFile,
|
|
205
|
+
fileCache,
|
|
206
|
+
cwd: request.cwd,
|
|
207
|
+
writeThrough,
|
|
208
|
+
};
|
|
209
|
+
const io = createIoContext(request.stdin);
|
|
210
|
+
try {
|
|
211
|
+
await runWithDaemonRuntime(runtime, () => runWithIo(io, () => dispatch(request.argv, { signal })));
|
|
212
|
+
return { stdout: io.stdout, stderr: io.stderr, exitCode: 0 };
|
|
213
|
+
}
|
|
214
|
+
catch (err) {
|
|
215
|
+
return {
|
|
216
|
+
stdout: io.stdout,
|
|
217
|
+
stderr: `${io.stderr}${JSON.stringify({ error: errorMessage(err) })}\n`,
|
|
218
|
+
exitCode: 1,
|
|
219
|
+
};
|
|
220
|
+
}
|
|
221
|
+
}
|
|
222
|
+
catch (err) {
|
|
223
|
+
return {
|
|
224
|
+
stdout: "",
|
|
225
|
+
stderr: `${JSON.stringify({ error: errorMessage(err) })}\n`,
|
|
226
|
+
exitCode: 1,
|
|
227
|
+
};
|
|
228
|
+
}
|
|
229
|
+
}
|
|
230
|
+
function handleConnection(socket) {
|
|
231
|
+
activeConnections++;
|
|
232
|
+
resetIdleTimer();
|
|
233
|
+
const activeControllers = new Set();
|
|
234
|
+
let buffer = "";
|
|
235
|
+
socket.on("data", (data) => {
|
|
236
|
+
buffer += data.toString();
|
|
237
|
+
let newlineIdx = buffer.indexOf("\n");
|
|
238
|
+
while (newlineIdx !== -1) {
|
|
239
|
+
const line = buffer.slice(0, newlineIdx);
|
|
240
|
+
buffer = buffer.slice(newlineIdx + 1);
|
|
241
|
+
if (line.trim()) {
|
|
242
|
+
let request;
|
|
243
|
+
try {
|
|
244
|
+
request = JSON.parse(line);
|
|
245
|
+
}
|
|
246
|
+
catch {
|
|
247
|
+
socket.write(`${JSON.stringify({ stdout: "", stderr: "Invalid JSON\n", exitCode: 1 })}\n`);
|
|
248
|
+
newlineIdx = buffer.indexOf("\n");
|
|
249
|
+
continue;
|
|
250
|
+
}
|
|
251
|
+
const controller = new AbortController();
|
|
252
|
+
activeControllers.add(controller);
|
|
253
|
+
const requestTimeoutMs = envPositiveInt(request.timeoutMs ? String(request.timeoutMs) : undefined, DEFAULT_REQUEST_TIMEOUT_MS);
|
|
254
|
+
registerSignalTimeout(controller.signal, requestTimeoutMs, `Command timed out after ${Math.ceil(requestTimeoutMs / 1000)}s`);
|
|
255
|
+
const timeout = setTimeout(() => {
|
|
256
|
+
controller.abort(new Error(`Command timed out after ${Math.ceil(requestTimeoutMs / 1000)}s`));
|
|
257
|
+
}, requestTimeoutMs);
|
|
258
|
+
enqueue(async () => {
|
|
259
|
+
try {
|
|
260
|
+
const response = await handleRequest(request, controller.signal);
|
|
261
|
+
const { shutdown: shouldShutdown, ...wire } = response;
|
|
262
|
+
try {
|
|
263
|
+
socket.write(`${JSON.stringify(wire)}\n`, (err) => {
|
|
264
|
+
if (err)
|
|
265
|
+
daemonLog(`socket.write error: ${err.message}`);
|
|
266
|
+
if (shouldShutdown) {
|
|
267
|
+
void shutdown({ skipFlush: true }).catch((shutdownErr) => {
|
|
268
|
+
daemonLog(`shutdown failed after stop ack: ${errorMessage(shutdownErr)}`);
|
|
269
|
+
});
|
|
270
|
+
}
|
|
271
|
+
});
|
|
272
|
+
}
|
|
273
|
+
catch (err) {
|
|
274
|
+
daemonLog(`socket.write threw: ${errorMessage(err)}`);
|
|
275
|
+
}
|
|
276
|
+
}
|
|
277
|
+
finally {
|
|
278
|
+
clearTimeout(timeout);
|
|
279
|
+
activeControllers.delete(controller);
|
|
280
|
+
}
|
|
281
|
+
}).catch((err) => {
|
|
282
|
+
daemonLog(`request handling failed: ${errorMessage(err)}`);
|
|
283
|
+
});
|
|
284
|
+
}
|
|
285
|
+
newlineIdx = buffer.indexOf("\n");
|
|
286
|
+
}
|
|
287
|
+
});
|
|
288
|
+
let disconnected = false;
|
|
289
|
+
const onDisconnect = () => {
|
|
290
|
+
if (disconnected)
|
|
291
|
+
return;
|
|
292
|
+
disconnected = true;
|
|
293
|
+
for (const controller of activeControllers) {
|
|
294
|
+
controller.abort(new Error("Client disconnected"));
|
|
295
|
+
}
|
|
296
|
+
activeConnections--;
|
|
297
|
+
resetIdleTimer();
|
|
298
|
+
};
|
|
299
|
+
socket.on("close", onDisconnect);
|
|
300
|
+
socket.on("error", onDisconnect);
|
|
301
|
+
}
|
|
302
|
+
server.on("error", (err) => {
|
|
303
|
+
daemonLog(`server error: ${err.message}`);
|
|
304
|
+
try {
|
|
305
|
+
unlinkSync(socketPath);
|
|
306
|
+
}
|
|
307
|
+
catch { }
|
|
308
|
+
disposeRuntime();
|
|
309
|
+
process.exit(1);
|
|
310
|
+
});
|
|
311
|
+
server.listen(socketPath, () => {
|
|
312
|
+
if (process.send)
|
|
313
|
+
process.send({ ready: true });
|
|
314
|
+
process.stdout.write(`${JSON.stringify({ daemon: "started", pid: process.pid })}\n`);
|
|
315
|
+
resetIdleTimer();
|
|
316
|
+
});
|
|
317
|
+
process.on("SIGINT", () => {
|
|
318
|
+
void shutdown().catch((err) => {
|
|
319
|
+
daemonLog(`SIGINT shutdown failed: ${errorMessage(err)}`);
|
|
320
|
+
process.exit(1);
|
|
321
|
+
});
|
|
322
|
+
});
|
|
323
|
+
process.on("SIGTERM", () => {
|
|
324
|
+
void shutdown().catch((err) => {
|
|
325
|
+
daemonLog(`SIGTERM shutdown failed: ${errorMessage(err)}`);
|
|
326
|
+
process.exit(1);
|
|
327
|
+
});
|
|
328
|
+
});
|
|
329
|
+
}
|
|
330
|
+
//# sourceMappingURL=daemon.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"daemon.js","sourceRoot":"","sources":["../../src/cli/daemon.ts"],"names":[],"mappings":"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"}
|