@portel/photon 1.26.0 → 1.27.0
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/dist/auto-ui/beam/routes/api-daemon.d.ts +1 -0
- package/dist/auto-ui/beam/routes/api-daemon.d.ts.map +1 -1
- package/dist/auto-ui/beam/routes/api-daemon.js +35 -1
- package/dist/auto-ui/beam/routes/api-daemon.js.map +1 -1
- package/dist/beam-form.bundle.js +41 -1
- package/dist/beam-form.bundle.js.map +2 -2
- package/dist/beam.bundle.js +1661 -252
- package/dist/beam.bundle.js.map +4 -4
- package/dist/cli/commands/daemon.d.ts.map +1 -1
- package/dist/cli/commands/daemon.js +157 -0
- package/dist/cli/commands/daemon.js.map +1 -1
- package/dist/daemon/client.d.ts +1 -0
- package/dist/daemon/client.d.ts.map +1 -1
- package/dist/daemon/client.js +110 -23
- package/dist/daemon/client.js.map +1 -1
- package/dist/daemon/in-process-bridge.d.ts +29 -0
- package/dist/daemon/in-process-bridge.d.ts.map +1 -0
- package/dist/daemon/in-process-bridge.js +26 -0
- package/dist/daemon/in-process-bridge.js.map +1 -0
- package/dist/daemon/manager.d.ts +103 -1
- package/dist/daemon/manager.d.ts.map +1 -1
- package/dist/daemon/manager.js +313 -92
- package/dist/daemon/manager.js.map +1 -1
- package/dist/daemon/protocol.d.ts +1 -1
- package/dist/daemon/protocol.d.ts.map +1 -1
- package/dist/daemon/protocol.js +1 -0
- package/dist/daemon/protocol.js.map +1 -1
- package/dist/daemon/server.js +832 -37
- package/dist/daemon/server.js.map +1 -1
- package/dist/loader.d.ts.map +1 -1
- package/dist/loader.js +11 -0
- package/dist/loader.js.map +1 -1
- package/package.json +1 -1
- package/templates/cloudflare/worker.ts.template +94 -22
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"daemon.d.ts","sourceRoot":"","sources":["../../../src/cli/commands/daemon.ts"],"names":[],"mappings":"AAAA;;;;GAIG;
|
|
1
|
+
{"version":3,"file":"daemon.d.ts","sourceRoot":"","sources":["../../../src/cli/commands/daemon.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAIH,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAsGzC;;GAEG;AACH,wBAAgB,sBAAsB,CAAC,OAAO,EAAE,OAAO,GAAG,IAAI,CAkK7D"}
|
|
@@ -3,7 +3,113 @@
|
|
|
3
3
|
*
|
|
4
4
|
* Manage the Photon background daemon process (start, stop, restart, status).
|
|
5
5
|
*/
|
|
6
|
+
import * as fs from 'fs';
|
|
7
|
+
import * as path from 'path';
|
|
6
8
|
import { getErrorMessage } from '../../shared/error-handler.js';
|
|
9
|
+
const PHOTON_FILE_EXTS = ['.photon.ts', '.photon.tsx', '.photon.js'];
|
|
10
|
+
// Directories that never contain user-authored photons. Walking into them
|
|
11
|
+
// just wastes IO. Covers the JS/TS, Python, Rust, Java, Cocoa, and Ruby
|
|
12
|
+
// build/cache trees — codex consult P8 finding.
|
|
13
|
+
const SKIP_DIRS = new Set([
|
|
14
|
+
'node_modules',
|
|
15
|
+
'dist',
|
|
16
|
+
'build',
|
|
17
|
+
'out',
|
|
18
|
+
'target',
|
|
19
|
+
'vendor',
|
|
20
|
+
'coverage',
|
|
21
|
+
'Pods',
|
|
22
|
+
'DerivedData',
|
|
23
|
+
'.git',
|
|
24
|
+
'.next',
|
|
25
|
+
'.turbo',
|
|
26
|
+
'.parcel-cache',
|
|
27
|
+
'.cache',
|
|
28
|
+
'.data',
|
|
29
|
+
'.gradle',
|
|
30
|
+
'.venv',
|
|
31
|
+
'venv',
|
|
32
|
+
'__pycache__',
|
|
33
|
+
'.pytest_cache',
|
|
34
|
+
'.mypy_cache',
|
|
35
|
+
'.tox',
|
|
36
|
+
]);
|
|
37
|
+
/**
|
|
38
|
+
* Return true if `dir` (or any subdirectory) contains a `.photon.{ts,tsx,js}`
|
|
39
|
+
* file. Bounded by `maxDepth` so a base pointing at `$HOME` does not walk
|
|
40
|
+
* the entire tree.
|
|
41
|
+
*
|
|
42
|
+
* Dot-directories: codex consult P7 — the previous walker skipped every
|
|
43
|
+
* dot-dir, which can hide a legitimate photon under `.examples/` or a
|
|
44
|
+
* user-authored hidden folder. Now only skips entries explicitly listed
|
|
45
|
+
* in SKIP_DIRS, so user-authored hidden dirs are visited.
|
|
46
|
+
*
|
|
47
|
+
* Symlinks: `Dirent.isDirectory()` is false for symlinked directories, so
|
|
48
|
+
* the previous walker silently ignored them. We now check
|
|
49
|
+
* `Dirent.isSymbolicLink()`, resolve via `fs.realpathSync.native`, and
|
|
50
|
+
* traverse the target. A `visited` set keyed on real paths prevents loops
|
|
51
|
+
* (a -> b -> a or self-symlinks).
|
|
52
|
+
*/
|
|
53
|
+
function hasPhotonFile(dir, maxDepth = 6) {
|
|
54
|
+
const visited = new Set();
|
|
55
|
+
let startReal;
|
|
56
|
+
try {
|
|
57
|
+
startReal = fs.realpathSync.native(dir);
|
|
58
|
+
}
|
|
59
|
+
catch {
|
|
60
|
+
return false;
|
|
61
|
+
}
|
|
62
|
+
visited.add(startReal);
|
|
63
|
+
const stack = [{ p: startReal, d: 0 }];
|
|
64
|
+
while (stack.length > 0) {
|
|
65
|
+
const { p, d } = stack.pop();
|
|
66
|
+
let entries;
|
|
67
|
+
try {
|
|
68
|
+
entries = fs.readdirSync(p, { withFileTypes: true });
|
|
69
|
+
}
|
|
70
|
+
catch {
|
|
71
|
+
continue;
|
|
72
|
+
}
|
|
73
|
+
for (const entry of entries) {
|
|
74
|
+
if (entry.isFile()) {
|
|
75
|
+
if (PHOTON_FILE_EXTS.some((ext) => entry.name.endsWith(ext)))
|
|
76
|
+
return true;
|
|
77
|
+
continue;
|
|
78
|
+
}
|
|
79
|
+
if (d >= maxDepth)
|
|
80
|
+
continue;
|
|
81
|
+
if (SKIP_DIRS.has(entry.name))
|
|
82
|
+
continue;
|
|
83
|
+
const childPath = path.join(p, entry.name);
|
|
84
|
+
if (entry.isDirectory()) {
|
|
85
|
+
stack.push({ p: childPath, d: d + 1 });
|
|
86
|
+
}
|
|
87
|
+
else if (entry.isSymbolicLink()) {
|
|
88
|
+
let real;
|
|
89
|
+
try {
|
|
90
|
+
real = fs.realpathSync.native(childPath);
|
|
91
|
+
}
|
|
92
|
+
catch {
|
|
93
|
+
continue;
|
|
94
|
+
}
|
|
95
|
+
if (visited.has(real))
|
|
96
|
+
continue;
|
|
97
|
+
let stat;
|
|
98
|
+
try {
|
|
99
|
+
stat = fs.statSync(real);
|
|
100
|
+
}
|
|
101
|
+
catch {
|
|
102
|
+
continue;
|
|
103
|
+
}
|
|
104
|
+
if (!stat.isDirectory())
|
|
105
|
+
continue;
|
|
106
|
+
visited.add(real);
|
|
107
|
+
stack.push({ p: real, d: d + 1 });
|
|
108
|
+
}
|
|
109
|
+
}
|
|
110
|
+
}
|
|
111
|
+
return false;
|
|
112
|
+
}
|
|
7
113
|
/**
|
|
8
114
|
* Register daemon command group
|
|
9
115
|
*/
|
|
@@ -66,6 +172,57 @@ export function registerDaemonCommands(program) {
|
|
|
66
172
|
process.exit(1);
|
|
67
173
|
}
|
|
68
174
|
});
|
|
175
|
+
daemonCmd
|
|
176
|
+
.command('prune-bases')
|
|
177
|
+
.description('Remove registered PHOTON_DIRs whose path is gone OR has no .photon.{ts,tsx,js} files')
|
|
178
|
+
.option('--dry-run', 'Print what would be pruned without modifying the registry')
|
|
179
|
+
.action(async (opts) => {
|
|
180
|
+
try {
|
|
181
|
+
const { printInfo, printSuccess } = await import('../../cli-formatter.js');
|
|
182
|
+
const { readBasesRegistry, writeBasesRegistry } = await import('@portel/photon-core');
|
|
183
|
+
const registry = readBasesRegistry();
|
|
184
|
+
const removed = [];
|
|
185
|
+
const kept = [];
|
|
186
|
+
for (const entry of registry.bases) {
|
|
187
|
+
let stat = null;
|
|
188
|
+
try {
|
|
189
|
+
stat = fs.statSync(entry.path);
|
|
190
|
+
}
|
|
191
|
+
catch {
|
|
192
|
+
removed.push({ path: entry.path, reason: 'path missing' });
|
|
193
|
+
continue;
|
|
194
|
+
}
|
|
195
|
+
if (!stat.isDirectory()) {
|
|
196
|
+
removed.push({ path: entry.path, reason: 'not a directory' });
|
|
197
|
+
continue;
|
|
198
|
+
}
|
|
199
|
+
if (!hasPhotonFile(entry.path)) {
|
|
200
|
+
removed.push({ path: entry.path, reason: 'no .photon files' });
|
|
201
|
+
continue;
|
|
202
|
+
}
|
|
203
|
+
kept.push(entry);
|
|
204
|
+
}
|
|
205
|
+
if (removed.length === 0) {
|
|
206
|
+
printSuccess(`Bases registry is clean (${kept.length} bases kept).`);
|
|
207
|
+
return;
|
|
208
|
+
}
|
|
209
|
+
for (const r of removed) {
|
|
210
|
+
console.log(` ${opts.dryRun ? '[dry-run]' : 'remove'}: ${r.path} (${r.reason})`);
|
|
211
|
+
}
|
|
212
|
+
if (opts.dryRun) {
|
|
213
|
+
printInfo(`Would remove ${removed.length} of ${registry.bases.length} bases.`);
|
|
214
|
+
return;
|
|
215
|
+
}
|
|
216
|
+
writeBasesRegistry({ bases: kept });
|
|
217
|
+
printSuccess(`Pruned ${removed.length} of ${registry.bases.length} bases.`);
|
|
218
|
+
printInfo('Restart the daemon for the change to take effect on running schedules.');
|
|
219
|
+
}
|
|
220
|
+
catch (error) {
|
|
221
|
+
const { printError } = await import('../../cli-formatter.js');
|
|
222
|
+
printError(`Failed to prune bases: ${getErrorMessage(error)}`);
|
|
223
|
+
process.exit(1);
|
|
224
|
+
}
|
|
225
|
+
});
|
|
69
226
|
daemonCmd
|
|
70
227
|
.command('status')
|
|
71
228
|
.description('Show daemon status and health info')
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"daemon.js","sourceRoot":"","sources":["../../../src/cli/commands/daemon.ts"],"names":[],"mappings":"AAAA;;;;GAIG;
|
|
1
|
+
{"version":3,"file":"daemon.js","sourceRoot":"","sources":["../../../src/cli/commands/daemon.ts"],"names":[],"mappings":"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"}
|
package/dist/daemon/client.d.ts
CHANGED
|
@@ -167,6 +167,7 @@ export declare function enableSchedule(photonName: string, method: string, worki
|
|
|
167
167
|
export declare function disableSchedule(photonName: string, method: string, workingDir?: string): Promise<unknown>;
|
|
168
168
|
export declare function pauseSchedule(photonName: string, method: string, workingDir?: string): Promise<unknown>;
|
|
169
169
|
export declare function resumeSchedule(photonName: string, method: string, workingDir?: string): Promise<unknown>;
|
|
170
|
+
export declare function addManualSchedule(photonName: string, method: string, cron: string, workingDir?: string): Promise<unknown>;
|
|
170
171
|
export interface ExecutionHistoryEntry {
|
|
171
172
|
ts: number;
|
|
172
173
|
jobId: string;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"client.d.ts","sourceRoot":"","sources":["../../src/daemon/client.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAMH,OAAO,EAAE,aAAa,EAAkB,MAAM,eAAe,CAAC;AAyG9D;;;GAGG;AACH,qBAAa,mBAAoB,SAAQ,KAAK;gBAChC,MAAM,CAAC,EAAE,MAAM;CAI5B;
|
|
1
|
+
{"version":3,"file":"client.d.ts","sourceRoot":"","sources":["../../src/daemon/client.ts"],"names":[],"mappings":"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"}
|
package/dist/daemon/client.js
CHANGED
|
@@ -109,6 +109,71 @@ export class DaemonShutdownError extends Error {
|
|
|
109
109
|
this.name = 'DaemonShutdownError';
|
|
110
110
|
}
|
|
111
111
|
}
|
|
112
|
+
/**
|
|
113
|
+
* Detects a Windows named-pipe address (e.g. `\\.\pipe\photon-daemon`).
|
|
114
|
+
* Named pipes have no filesystem entry, so existsSync would always return
|
|
115
|
+
* false and incorrectly fail the connection.
|
|
116
|
+
*/
|
|
117
|
+
function isWindowsNamedPipe(socketPath) {
|
|
118
|
+
return process.platform === 'win32' && socketPath.startsWith('\\\\.\\pipe\\');
|
|
119
|
+
}
|
|
120
|
+
/**
|
|
121
|
+
* Open a connection to the daemon (Unix domain socket on POSIX, named
|
|
122
|
+
* pipe on Windows).
|
|
123
|
+
*
|
|
124
|
+
* Wraps net.createConnection() with two safeguards every caller used to
|
|
125
|
+
* have to repeat (and most forgot):
|
|
126
|
+
*
|
|
127
|
+
* 1. existsSync guard — if the unix socket file is missing, fail with a
|
|
128
|
+
* clean ENOENT error rather than letting Bun throw synchronously
|
|
129
|
+
* before any 'error' listener can attach (which crashes the process).
|
|
130
|
+
* Skipped for Windows named pipes — they have no filesystem entry,
|
|
131
|
+
* so existsSync returns false even when the daemon is reachable.
|
|
132
|
+
* 2. try/catch around createConnection — TOCTOU between the existsSync
|
|
133
|
+
* check and the actual connect call leaves a small window where
|
|
134
|
+
* the file vanishes; wrap to convert any sync throw into a normal
|
|
135
|
+
* reject inside the enclosing Promise.
|
|
136
|
+
*
|
|
137
|
+
* Use this for every daemon socket connect in the client. Do NOT call
|
|
138
|
+
* net.createConnection(socketPath) directly — Bun's behavior on a missing
|
|
139
|
+
* unix socket is to throw synchronously, which bypasses the standard
|
|
140
|
+
* 'error' event handling used everywhere else.
|
|
141
|
+
*/
|
|
142
|
+
function connectToDaemon(socketPath) {
|
|
143
|
+
if (!isWindowsNamedPipe(socketPath) && !fs.existsSync(socketPath)) {
|
|
144
|
+
const err = new Error(`connect ENOENT ${socketPath}`);
|
|
145
|
+
err.code = 'ENOENT';
|
|
146
|
+
err.syscall = 'connect';
|
|
147
|
+
err.address = socketPath;
|
|
148
|
+
throw err;
|
|
149
|
+
}
|
|
150
|
+
try {
|
|
151
|
+
return net.createConnection(socketPath);
|
|
152
|
+
}
|
|
153
|
+
catch (err) {
|
|
154
|
+
// Race: file vanished between existsSync and createConnection, or
|
|
155
|
+
// some other sync throw (EACCES, EPERM). Re-throw so the enclosing
|
|
156
|
+
// Promise rejects normally instead of the process crashing.
|
|
157
|
+
throw err;
|
|
158
|
+
}
|
|
159
|
+
}
|
|
160
|
+
/**
|
|
161
|
+
* connectToDaemon variant for the best-effort health-check helpers
|
|
162
|
+
* (pingDaemon, queryDaemonStatus, clearInstances) whose Promise
|
|
163
|
+
* executors only have `resolve` — a sync throw from connectToDaemon
|
|
164
|
+
* would surface as an unhandled rejection their callers don't expect.
|
|
165
|
+
*
|
|
166
|
+
* Returns null instead of throwing, so the caller can resolve a fallback
|
|
167
|
+
* value (false/null) and keep the "is the daemon reachable?" semantics.
|
|
168
|
+
*/
|
|
169
|
+
function tryConnectToDaemon(socketPath) {
|
|
170
|
+
try {
|
|
171
|
+
return connectToDaemon(socketPath);
|
|
172
|
+
}
|
|
173
|
+
catch {
|
|
174
|
+
return null;
|
|
175
|
+
}
|
|
176
|
+
}
|
|
112
177
|
/**
|
|
113
178
|
* Check if an error indicates the daemon is unreachable (crashed or not started)
|
|
114
179
|
*/
|
|
@@ -169,7 +234,7 @@ export async function sendCommand(photonName, method, args, options) {
|
|
|
169
234
|
export async function reloadDaemonPhoton(photonName, photonPath, workingDir) {
|
|
170
235
|
const socketPath = getGlobalSocketPath();
|
|
171
236
|
return new Promise((resolve, reject) => {
|
|
172
|
-
const client =
|
|
237
|
+
const client = connectToDaemon(socketPath);
|
|
173
238
|
const requestId = `reload_${Date.now()}`;
|
|
174
239
|
let buffer = '';
|
|
175
240
|
const timeout = setTimeout(() => {
|
|
@@ -219,7 +284,7 @@ async function sendCommandDirect(photonName, method, args, photonPath, sessionId
|
|
|
219
284
|
const socketPath = getGlobalSocketPath();
|
|
220
285
|
const requestId = `req_${Date.now()}_${Math.random()}`;
|
|
221
286
|
return new Promise((resolve, reject) => {
|
|
222
|
-
const client =
|
|
287
|
+
const client = connectToDaemon(socketPath);
|
|
223
288
|
let buffer = '';
|
|
224
289
|
let responseReceived = false;
|
|
225
290
|
// No wall-clock or idle timeout on the CLI side. The photon-developer
|
|
@@ -332,7 +397,7 @@ export async function subscribeChannel(photonName, channel, handler, options) {
|
|
|
332
397
|
const socketPath = getGlobalSocketPath();
|
|
333
398
|
const subscribeId = `sub_${Date.now()}_${Math.random().toString(36).slice(2)}`;
|
|
334
399
|
return new Promise((resolve, reject) => {
|
|
335
|
-
const client =
|
|
400
|
+
const client = connectToDaemon(socketPath);
|
|
336
401
|
let subscribed = false;
|
|
337
402
|
let buffer = '';
|
|
338
403
|
client.on('connect', () => {
|
|
@@ -491,7 +556,7 @@ export async function publishToChannel(photonName, channel, message, workingDir)
|
|
|
491
556
|
const socketPath = getGlobalSocketPath();
|
|
492
557
|
const requestId = `pub_${Date.now()}_${Math.random().toString(36).slice(2)}`;
|
|
493
558
|
return new Promise((resolve, reject) => {
|
|
494
|
-
const client =
|
|
559
|
+
const client = connectToDaemon(socketPath);
|
|
495
560
|
const timeout = setTimeout(() => {
|
|
496
561
|
client.destroy();
|
|
497
562
|
reject(new Error('Publish timeout'));
|
|
@@ -540,7 +605,7 @@ export async function acquireLock(photonName, lockName, timeout, workingDir) {
|
|
|
540
605
|
const socketPath = getGlobalSocketPath();
|
|
541
606
|
const requestId = `lock_${Date.now()}_${Math.random().toString(36).slice(2)}`;
|
|
542
607
|
return new Promise((resolve, reject) => {
|
|
543
|
-
const client =
|
|
608
|
+
const client = connectToDaemon(socketPath);
|
|
544
609
|
const requestTimeout = setTimeout(() => {
|
|
545
610
|
client.destroy();
|
|
546
611
|
reject(new Error('Lock request timeout'));
|
|
@@ -590,7 +655,7 @@ export async function releaseLock(photonName, lockName, workingDir) {
|
|
|
590
655
|
const socketPath = getGlobalSocketPath();
|
|
591
656
|
const requestId = `unlock_${Date.now()}_${Math.random().toString(36).slice(2)}`;
|
|
592
657
|
return new Promise((resolve, reject) => {
|
|
593
|
-
const client =
|
|
658
|
+
const client = connectToDaemon(socketPath);
|
|
594
659
|
const timeout = setTimeout(() => {
|
|
595
660
|
client.destroy();
|
|
596
661
|
reject(new Error('Unlock request timeout'));
|
|
@@ -638,7 +703,7 @@ export async function listLocks(photonName) {
|
|
|
638
703
|
const socketPath = getGlobalSocketPath();
|
|
639
704
|
const requestId = `listlocks_${Date.now()}_${Math.random().toString(36).slice(2)}`;
|
|
640
705
|
return new Promise((resolve, reject) => {
|
|
641
|
-
const client =
|
|
706
|
+
const client = connectToDaemon(socketPath);
|
|
642
707
|
const timeout = setTimeout(() => {
|
|
643
708
|
client.destroy();
|
|
644
709
|
reject(new Error('List locks request timeout'));
|
|
@@ -684,7 +749,7 @@ export async function assignLock(photonName, lockName, holder, timeout, workingD
|
|
|
684
749
|
const socketPath = getGlobalSocketPath();
|
|
685
750
|
const requestId = `assignlock_${Date.now()}_${Math.random().toString(36).slice(2)}`;
|
|
686
751
|
return new Promise((resolve, reject) => {
|
|
687
|
-
const client =
|
|
752
|
+
const client = connectToDaemon(socketPath);
|
|
688
753
|
const requestTimeout = setTimeout(() => {
|
|
689
754
|
client.destroy();
|
|
690
755
|
reject(new Error('Assign lock request timeout'));
|
|
@@ -734,7 +799,7 @@ export async function transferLock(photonName, lockName, fromHolder, toHolder, t
|
|
|
734
799
|
const socketPath = getGlobalSocketPath();
|
|
735
800
|
const requestId = `transferlock_${Date.now()}_${Math.random().toString(36).slice(2)}`;
|
|
736
801
|
return new Promise((resolve, reject) => {
|
|
737
|
-
const client =
|
|
802
|
+
const client = connectToDaemon(socketPath);
|
|
738
803
|
const requestTimeout = setTimeout(() => {
|
|
739
804
|
client.destroy();
|
|
740
805
|
reject(new Error('Transfer lock request timeout'));
|
|
@@ -785,7 +850,7 @@ export async function releaseIdentityLock(photonName, lockName, holder, workingD
|
|
|
785
850
|
const socketPath = getGlobalSocketPath();
|
|
786
851
|
const requestId = `releaselock_${Date.now()}_${Math.random().toString(36).slice(2)}`;
|
|
787
852
|
return new Promise((resolve, reject) => {
|
|
788
|
-
const client =
|
|
853
|
+
const client = connectToDaemon(socketPath);
|
|
789
854
|
const requestTimeout = setTimeout(() => {
|
|
790
855
|
client.destroy();
|
|
791
856
|
reject(new Error('Release lock request timeout'));
|
|
@@ -834,7 +899,7 @@ export async function queryLock(photonName, lockName) {
|
|
|
834
899
|
const socketPath = getGlobalSocketPath();
|
|
835
900
|
const requestId = `querylock_${Date.now()}_${Math.random().toString(36).slice(2)}`;
|
|
836
901
|
return new Promise((resolve, reject) => {
|
|
837
|
-
const client =
|
|
902
|
+
const client = connectToDaemon(socketPath);
|
|
838
903
|
const requestTimeout = setTimeout(() => {
|
|
839
904
|
client.destroy();
|
|
840
905
|
reject(new Error('Query lock request timeout'));
|
|
@@ -880,7 +945,7 @@ export async function scheduleJob(photonName, jobId, method, cron, args) {
|
|
|
880
945
|
const socketPath = getGlobalSocketPath();
|
|
881
946
|
const requestId = `schedule_${Date.now()}_${Math.random().toString(36).slice(2)}`;
|
|
882
947
|
return new Promise((resolve, reject) => {
|
|
883
|
-
const client =
|
|
948
|
+
const client = connectToDaemon(socketPath);
|
|
884
949
|
const timeout = setTimeout(() => {
|
|
885
950
|
client.destroy();
|
|
886
951
|
reject(new Error('Schedule request timeout'));
|
|
@@ -930,7 +995,7 @@ export async function unscheduleJob(photonName, jobId) {
|
|
|
930
995
|
const socketPath = getGlobalSocketPath();
|
|
931
996
|
const requestId = `unschedule_${Date.now()}_${Math.random().toString(36).slice(2)}`;
|
|
932
997
|
return new Promise((resolve, reject) => {
|
|
933
|
-
const client =
|
|
998
|
+
const client = connectToDaemon(socketPath);
|
|
934
999
|
const timeout = setTimeout(() => {
|
|
935
1000
|
client.destroy();
|
|
936
1001
|
reject(new Error('Unschedule request timeout'));
|
|
@@ -976,7 +1041,7 @@ export async function listJobs(photonName) {
|
|
|
976
1041
|
const socketPath = getGlobalSocketPath();
|
|
977
1042
|
const requestId = `listjobs_${Date.now()}_${Math.random().toString(36).slice(2)}`;
|
|
978
1043
|
return new Promise((resolve, reject) => {
|
|
979
|
-
const client =
|
|
1044
|
+
const client = connectToDaemon(socketPath);
|
|
980
1045
|
const timeout = setTimeout(() => {
|
|
981
1046
|
client.destroy();
|
|
982
1047
|
reject(new Error('List jobs request timeout'));
|
|
@@ -1019,7 +1084,7 @@ async function sendSimpleDaemonRequest(req) {
|
|
|
1019
1084
|
const socketPath = getGlobalSocketPath();
|
|
1020
1085
|
const requestId = req.id || `${req.type}_${Date.now()}_${Math.random().toString(36).slice(2)}`;
|
|
1021
1086
|
return new Promise((resolve, reject) => {
|
|
1022
|
-
const client =
|
|
1087
|
+
const client = connectToDaemon(socketPath);
|
|
1023
1088
|
let buffer = '';
|
|
1024
1089
|
const timer = setTimeout(() => {
|
|
1025
1090
|
client.destroy();
|
|
@@ -1080,6 +1145,15 @@ export async function pauseSchedule(photonName, method, workingDir) {
|
|
|
1080
1145
|
export async function resumeSchedule(photonName, method, workingDir) {
|
|
1081
1146
|
return sendSimpleDaemonRequest({ type: 'resume_schedule', photonName, method, workingDir });
|
|
1082
1147
|
}
|
|
1148
|
+
export async function addManualSchedule(photonName, method, cron, workingDir) {
|
|
1149
|
+
return sendSimpleDaemonRequest({
|
|
1150
|
+
type: 'add_manual_schedule',
|
|
1151
|
+
photonName,
|
|
1152
|
+
method,
|
|
1153
|
+
cron,
|
|
1154
|
+
workingDir,
|
|
1155
|
+
});
|
|
1156
|
+
}
|
|
1083
1157
|
export async function fetchExecutionHistory(photonName, method, opts = {}) {
|
|
1084
1158
|
return sendSimpleDaemonRequest({
|
|
1085
1159
|
type: 'get_execution_history',
|
|
@@ -1095,12 +1169,16 @@ export async function fetchExecutionHistory(photonName, method, opts = {}) {
|
|
|
1095
1169
|
*/
|
|
1096
1170
|
export async function pingDaemon(photonName) {
|
|
1097
1171
|
const socketPath = getGlobalSocketPath();
|
|
1098
|
-
if (!fs.existsSync(socketPath)) {
|
|
1172
|
+
if (!isWindowsNamedPipe(socketPath) && !fs.existsSync(socketPath)) {
|
|
1099
1173
|
return false;
|
|
1100
1174
|
}
|
|
1101
1175
|
const requestId = `ping_${Date.now()}`;
|
|
1102
1176
|
return new Promise((resolve) => {
|
|
1103
|
-
const client =
|
|
1177
|
+
const client = tryConnectToDaemon(socketPath);
|
|
1178
|
+
if (!client) {
|
|
1179
|
+
resolve(false);
|
|
1180
|
+
return;
|
|
1181
|
+
}
|
|
1104
1182
|
const timeout = setTimeout(() => {
|
|
1105
1183
|
client.destroy();
|
|
1106
1184
|
resolve(false);
|
|
@@ -1144,13 +1222,18 @@ export async function pingDaemon(photonName) {
|
|
|
1144
1222
|
export async function queryDaemonStatus() {
|
|
1145
1223
|
const socketPath = getGlobalSocketPath();
|
|
1146
1224
|
// Bail early if socket doesn't exist — avoids Bun crashing on ENOENT
|
|
1147
|
-
// before the 'error' event listener can be attached
|
|
1148
|
-
|
|
1225
|
+
// before the 'error' event listener can be attached.
|
|
1226
|
+
// Skip the existsSync check on Windows named pipes (no FS entry).
|
|
1227
|
+
if (!isWindowsNamedPipe(socketPath) && !fs.existsSync(socketPath)) {
|
|
1149
1228
|
return null;
|
|
1150
1229
|
}
|
|
1151
1230
|
const requestId = `status_${Date.now()}`;
|
|
1152
1231
|
return new Promise((resolve) => {
|
|
1153
|
-
const client =
|
|
1232
|
+
const client = tryConnectToDaemon(socketPath);
|
|
1233
|
+
if (!client) {
|
|
1234
|
+
resolve(null);
|
|
1235
|
+
return;
|
|
1236
|
+
}
|
|
1154
1237
|
const timeout = setTimeout(() => {
|
|
1155
1238
|
client.destroy();
|
|
1156
1239
|
resolve(null);
|
|
@@ -1197,12 +1280,16 @@ export async function queryDaemonStatus() {
|
|
|
1197
1280
|
*/
|
|
1198
1281
|
export async function clearInstances(photonName, workingDir) {
|
|
1199
1282
|
const socketPath = getGlobalSocketPath();
|
|
1200
|
-
if (!fs.existsSync(socketPath)) {
|
|
1283
|
+
if (!isWindowsNamedPipe(socketPath) && !fs.existsSync(socketPath)) {
|
|
1201
1284
|
return false;
|
|
1202
1285
|
}
|
|
1203
1286
|
const requestId = `clearinst_${Date.now()}_${Math.random().toString(36).slice(2)}`;
|
|
1204
1287
|
return new Promise((resolve) => {
|
|
1205
|
-
const client =
|
|
1288
|
+
const client = tryConnectToDaemon(socketPath);
|
|
1289
|
+
if (!client) {
|
|
1290
|
+
resolve(false);
|
|
1291
|
+
return;
|
|
1292
|
+
}
|
|
1206
1293
|
const timeout = setTimeout(() => {
|
|
1207
1294
|
client.destroy();
|
|
1208
1295
|
resolve(false);
|
|
@@ -1240,7 +1327,7 @@ export async function getEventsSince(photonName, channel, lastEventId) {
|
|
|
1240
1327
|
const socketPath = getGlobalSocketPath();
|
|
1241
1328
|
const requestId = `getevents_${Date.now()}_${Math.random().toString(36).slice(2)}`;
|
|
1242
1329
|
return new Promise((resolve, reject) => {
|
|
1243
|
-
const client =
|
|
1330
|
+
const client = connectToDaemon(socketPath);
|
|
1244
1331
|
const timeout = setTimeout(() => {
|
|
1245
1332
|
client.destroy();
|
|
1246
1333
|
reject(new Error('Get events request timeout'));
|