@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.
Files changed (111) hide show
  1. package/README.md +78 -50
  2. package/dist/cli/abort.d.ts +7 -0
  3. package/dist/cli/abort.d.ts.map +1 -0
  4. package/dist/cli/abort.js +35 -0
  5. package/dist/cli/abort.js.map +1 -0
  6. package/dist/cli/client.d.ts +9 -0
  7. package/dist/cli/client.d.ts.map +1 -0
  8. package/dist/cli/client.js +122 -0
  9. package/dist/cli/client.js.map +1 -0
  10. package/dist/cli/commands/clear.d.ts +3 -1
  11. package/dist/cli/commands/clear.d.ts.map +1 -1
  12. package/dist/cli/commands/clear.js +11 -9
  13. package/dist/cli/commands/clear.js.map +1 -1
  14. package/dist/cli/commands/copy.d.ts +3 -1
  15. package/dist/cli/commands/copy.d.ts.map +1 -1
  16. package/dist/cli/commands/copy.js +5 -2
  17. package/dist/cli/commands/copy.js.map +1 -1
  18. package/dist/cli/commands/create.d.ts +3 -1
  19. package/dist/cli/commands/create.d.ts.map +1 -1
  20. package/dist/cli/commands/create.js +2 -2
  21. package/dist/cli/commands/create.js.map +1 -1
  22. package/dist/cli/commands/csv.d.ts +5 -1
  23. package/dist/cli/commands/csv.d.ts.map +1 -1
  24. package/dist/cli/commands/csv.js +38 -13
  25. package/dist/cli/commands/csv.js.map +1 -1
  26. package/dist/cli/commands/deps.d.ts +11 -0
  27. package/dist/cli/commands/deps.d.ts.map +1 -0
  28. package/dist/cli/commands/deps.js +329 -0
  29. package/dist/cli/commands/deps.js.map +1 -0
  30. package/dist/cli/commands/diff.d.ts +7 -0
  31. package/dist/cli/commands/diff.d.ts.map +1 -0
  32. package/dist/cli/commands/diff.js +235 -0
  33. package/dist/cli/commands/diff.js.map +1 -0
  34. package/dist/cli/commands/eval.d.ts +3 -1
  35. package/dist/cli/commands/eval.d.ts.map +1 -1
  36. package/dist/cli/commands/eval.js +23 -8
  37. package/dist/cli/commands/eval.js.map +1 -1
  38. package/dist/cli/commands/get.d.ts +1 -0
  39. package/dist/cli/commands/get.d.ts.map +1 -1
  40. package/dist/cli/commands/get.js +5 -2
  41. package/dist/cli/commands/get.js.map +1 -1
  42. package/dist/cli/commands/info.d.ts +3 -1
  43. package/dist/cli/commands/info.d.ts.map +1 -1
  44. package/dist/cli/commands/info.js +5 -2
  45. package/dist/cli/commands/info.js.map +1 -1
  46. package/dist/cli/commands/objects.d.ts +3 -1
  47. package/dist/cli/commands/objects.d.ts.map +1 -1
  48. package/dist/cli/commands/objects.js +5 -6
  49. package/dist/cli/commands/objects.js.map +1 -1
  50. package/dist/cli/commands/resize.d.ts +1 -0
  51. package/dist/cli/commands/resize.d.ts.map +1 -1
  52. package/dist/cli/commands/resize.js +67 -29
  53. package/dist/cli/commands/resize.js.map +1 -1
  54. package/dist/cli/commands/rows-cols.d.ts +1 -0
  55. package/dist/cli/commands/rows-cols.d.ts.map +1 -1
  56. package/dist/cli/commands/rows-cols.js +101 -45
  57. package/dist/cli/commands/rows-cols.js.map +1 -1
  58. package/dist/cli/commands/screenshot.d.ts +8 -0
  59. package/dist/cli/commands/screenshot.d.ts.map +1 -0
  60. package/dist/cli/commands/screenshot.js +260 -0
  61. package/dist/cli/commands/screenshot.js.map +1 -0
  62. package/dist/cli/commands/search.d.ts +1 -0
  63. package/dist/cli/commands/search.d.ts.map +1 -1
  64. package/dist/cli/commands/search.js +16 -8
  65. package/dist/cli/commands/search.js.map +1 -1
  66. package/dist/cli/commands/set.d.ts +3 -1
  67. package/dist/cli/commands/set.d.ts.map +1 -1
  68. package/dist/cli/commands/set.js +72 -25
  69. package/dist/cli/commands/set.js.map +1 -1
  70. package/dist/cli/commands/sheet.d.ts +3 -1
  71. package/dist/cli/commands/sheet.d.ts.map +1 -1
  72. package/dist/cli/commands/sheet.js +20 -10
  73. package/dist/cli/commands/sheet.js.map +1 -1
  74. package/dist/cli/context.d.ts +18 -6
  75. package/dist/cli/context.d.ts.map +1 -1
  76. package/dist/cli/context.js +93 -8
  77. package/dist/cli/context.js.map +1 -1
  78. package/dist/cli/daemon-entry.d.ts +3 -0
  79. package/dist/cli/daemon-entry.d.ts.map +1 -0
  80. package/dist/cli/daemon-entry.js +4 -0
  81. package/dist/cli/daemon-entry.js.map +1 -0
  82. package/dist/cli/daemon.d.ts +4 -0
  83. package/dist/cli/daemon.d.ts.map +1 -0
  84. package/dist/cli/daemon.js +330 -0
  85. package/dist/cli/daemon.js.map +1 -0
  86. package/dist/cli/dispatch.d.ts +5 -0
  87. package/dist/cli/dispatch.d.ts.map +1 -0
  88. package/dist/cli/dispatch.js +353 -0
  89. package/dist/cli/dispatch.js.map +1 -0
  90. package/dist/cli/file-cache.d.ts +23 -0
  91. package/dist/cli/file-cache.d.ts.map +1 -0
  92. package/dist/cli/file-cache.js +102 -0
  93. package/dist/cli/file-cache.js.map +1 -0
  94. package/dist/cli/index.js +11 -0
  95. package/dist/cli/index.js.map +1 -1
  96. package/dist/cli/main.d.ts.map +1 -1
  97. package/dist/cli/main.js +188 -159
  98. package/dist/cli/main.js.map +1 -1
  99. package/dist/cli/output.d.ts +9 -6
  100. package/dist/cli/output.d.ts.map +1 -1
  101. package/dist/cli/output.js +36 -8
  102. package/dist/cli/output.js.map +1 -1
  103. package/dist/cli/styles.d.ts +14 -19
  104. package/dist/cli/styles.d.ts.map +1 -1
  105. package/dist/cli/styles.js +65 -39
  106. package/dist/cli/styles.js.map +1 -1
  107. package/dist/excel-file.d.ts +3 -1
  108. package/dist/excel-file.d.ts.map +1 -1
  109. package/dist/excel-file.js +50 -6
  110. package/dist/excel-file.js.map +1 -1
  111. 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
- await withFile(filePath, ({ workbook, GC }) => {
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
- const ws = new GC.Spread.Sheets.Worksheet(name);
20
- workbook.addSheet(workbook.getSheetCount(), ws);
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
- workbook.removeSheet(index);
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
- workbook.getSheet(index).name(newName);
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":"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"}
1
+ {"version":3,"file":"sheet.js","sourceRoot":"","sources":["../../../src/cli/commands/sheet.ts"],"names":[],"mappings":"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"}
@@ -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
- export declare function withFile<T>(filePath: string, fn: (ctx: FileContext) => T | Promise<T>, options?: {
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
- }): Promise<T>;
14
- export declare function withNewFile<T>(filePath: string, fn?: (ctx: FileContext) => T | Promise<T>): Promise<T | undefined>;
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":"AAAA;;GAEG;AAEH,OAAO,EAAE,KAAK,SAAS,EAAQ,MAAM,aAAa,CAAC;AACnD,OAAO,KAAK,EAAE,WAAW,EAAE,cAAc,EAAE,MAAM,aAAa,CAAC;AAE/D,MAAM,WAAW,WAAW;IAC1B,IAAI,EAAE,SAAS,CAAC;IAChB,QAAQ,EAAE,cAAc,CAAC;IACzB,EAAE,EAAE,WAAW,CAAC;CACjB;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;IAAE,IAAI,CAAC,EAAE,OAAO,CAAA;CAAE,GAC3B,OAAO,CAAC,CAAC,CAAC,CAYZ;AAED,wBAAsB,WAAW,CAAC,CAAC,EACjC,QAAQ,EAAE,MAAM,EAChB,EAAE,CAAC,EAAE,CAAC,GAAG,EAAE,WAAW,KAAK,CAAC,GAAG,OAAO,CAAC,CAAC,CAAC,GACxC,OAAO,CAAC,CAAC,GAAG,SAAS,CAAC,CAaxB"}
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"}
@@ -1,13 +1,29 @@
1
- /**
2
- * Lifecycle wrapper: init → open/create → execute → save → dispose.
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
- export async function withNewFile(filePath, fn) {
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
- let result;
24
- if (fn) {
25
- result = await fn({ file, workbook: file.workbook, GC });
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
@@ -1 +1 @@
1
- {"version":3,"file":"context.js","sourceRoot":"","sources":["../../src/cli/context.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,EAAkB,IAAI,EAAE,MAAM,aAAa,CAAC;AASnD,MAAM,CAAC,KAAK,UAAU,QAAQ,CAC5B,QAAgB,EAChB,EAAwC,EACxC,OAA4B;IAE5B,MAAM,EAAE,EAAE,EAAE,SAAS,EAAE,EAAE,EAAE,OAAO,EAAE,GAAG,MAAM,IAAI,EAAE,CAAC;IACpD,IAAI,CAAC;QACH,MAAM,IAAI,GAAG,MAAM,EAAE,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC;QACrC,MAAM,MAAM,GAAG,MAAM,EAAE,CAAC,EAAE,IAAI,EAAE,QAAQ,EAAE,IAAI,CAAC,QAAQ,EAAE,EAAE,EAAE,CAAC,CAAC;QAC/D,IAAI,OAAO,EAAE,IAAI,EAAE,CAAC;YAClB,MAAM,IAAI,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC;QAC5B,CAAC;QACD,OAAO,MAAM,CAAC;IAChB,CAAC;YAAS,CAAC;QACT,OAAO,EAAE,CAAC;IACZ,CAAC;AACH,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,WAAW,CAC/B,QAAgB,EAChB,EAAyC;IAEzC,MAAM,EAAE,EAAE,EAAE,SAAS,EAAE,EAAE,EAAE,OAAO,EAAE,GAAG,MAAM,IAAI,EAAE,CAAC;IACpD,IAAI,CAAC;QACH,MAAM,IAAI,GAAG,IAAI,EAAE,EAAE,CAAC;QACtB,IAAI,MAAqB,CAAC;QAC1B,IAAI,EAAE,EAAE,CAAC;YACP,MAAM,GAAG,MAAM,EAAE,CAAC,EAAE,IAAI,EAAE,QAAQ,EAAE,IAAI,CAAC,QAAQ,EAAE,EAAE,EAAE,CAAC,CAAC;QAC3D,CAAC;QACD,MAAM,IAAI,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC;QAC1B,OAAO,MAAW,CAAC;IACrB,CAAC;YAAS,CAAC;QACT,OAAO,EAAE,CAAC;IACZ,CAAC;AACH,CAAC"}
1
+ {"version":3,"file":"context.js","sourceRoot":"","sources":["../../src/cli/context.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,3 @@
1
+ #!/usr/bin/env node
2
+ export {};
3
+ //# sourceMappingURL=daemon-entry.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"daemon-entry.d.ts","sourceRoot":"","sources":["../../src/cli/daemon-entry.ts"],"names":[],"mappings":""}
@@ -0,0 +1,4 @@
1
+ #!/usr/bin/env node
2
+ import { startDaemon } from "./daemon.js";
3
+ await startDaemon();
4
+ //# sourceMappingURL=daemon-entry.js.map
@@ -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,4 @@
1
+ export declare function getSocketPath(): string;
2
+ export declare function getLogPath(): string;
3
+ export declare function startDaemon(): Promise<void>;
4
+ //# sourceMappingURL=daemon.d.ts.map
@@ -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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"}