@lordierclaw/bluenote 0.4.1 → 0.4.3
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 +2 -0
- package/package.json +6 -2
- package/dist/bin.d.ts +0 -2
- package/dist/bin.js +0 -10
- package/dist/bin.js.map +0 -1
- package/dist/cli.d.ts +0 -4
- package/dist/cli.js +0 -37
- package/dist/cli.js.map +0 -1
- package/dist/commands/daemon.d.ts +0 -2
- package/dist/commands/daemon.js +0 -163
- package/dist/commands/daemon.js.map +0 -1
- package/dist/commands/doctor.d.ts +0 -2
- package/dist/commands/doctor.js +0 -113
- package/dist/commands/doctor.js.map +0 -1
- package/dist/commands/help.d.ts +0 -3
- package/dist/commands/help.js +0 -25
- package/dist/commands/help.js.map +0 -1
- package/dist/commands/tui.d.ts +0 -2
- package/dist/commands/tui.js +0 -63
- package/dist/commands/tui.js.map +0 -1
- package/dist/commands/version.d.ts +0 -2
- package/dist/commands/version.js +0 -17
- package/dist/commands/version.js.map +0 -1
- package/dist/commands/web.d.ts +0 -2
- package/dist/commands/web.js +0 -63
- package/dist/commands/web.js.map +0 -1
- package/dist/daemon/paths.d.ts +0 -3
- package/dist/daemon/paths.js +0 -29
- package/dist/daemon/paths.js.map +0 -1
- package/dist/daemon/router.d.ts +0 -38
- package/dist/daemon/router.js +0 -107
- package/dist/daemon/router.js.map +0 -1
- package/dist/daemon/server.d.ts +0 -13
- package/dist/daemon/server.js +0 -78
- package/dist/daemon/server.js.map +0 -1
- package/dist/daemon/token.d.ts +0 -1
- package/dist/daemon/token.js +0 -11
- package/dist/daemon/token.js.map +0 -1
- package/dist/types.d.ts +0 -11
- package/dist/types.js +0 -3
- package/dist/types.js.map +0 -1
- package/dist/utils/command-discovery.d.ts +0 -31
- package/dist/utils/command-discovery.js +0 -162
- package/dist/utils/command-discovery.js.map +0 -1
- package/dist/utils/daemon-state.d.ts +0 -21
- package/dist/utils/daemon-state.js +0 -99
- package/dist/utils/daemon-state.js.map +0 -1
- package/dist/utils/lazy-import.d.ts +0 -1
- package/dist/utils/lazy-import.js +0 -10
- package/dist/utils/lazy-import.js.map +0 -1
- package/dist/utils/package-info.d.ts +0 -15
- package/dist/utils/package-info.js +0 -49
- package/dist/utils/package-info.js.map +0 -1
- package/dist/utils/runtime-requirements.d.ts +0 -8
- package/dist/utils/runtime-requirements.js +0 -26
- package/dist/utils/runtime-requirements.js.map +0 -1
- package/dist/utils/write.d.ts +0 -1
- package/dist/utils/write.js +0 -9
- package/dist/utils/write.js.map +0 -1
package/dist/daemon/paths.js
DELETED
|
@@ -1,29 +0,0 @@
|
|
|
1
|
-
"use strict";
|
|
2
|
-
var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
3
|
-
return (mod && mod.__esModule) ? mod : { "default": mod };
|
|
4
|
-
};
|
|
5
|
-
Object.defineProperty(exports, "__esModule", { value: true });
|
|
6
|
-
exports.getBluenoteStateDir = getBluenoteStateDir;
|
|
7
|
-
exports.getDaemonStatePath = getDaemonStatePath;
|
|
8
|
-
exports.ensureParentDir = ensureParentDir;
|
|
9
|
-
const fs_1 = __importDefault(require("fs"));
|
|
10
|
-
const os_1 = __importDefault(require("os"));
|
|
11
|
-
const path_1 = __importDefault(require("path"));
|
|
12
|
-
function getBluenoteStateDir(env = process.env) {
|
|
13
|
-
if (env.BLUENOTE_DAEMON_STATE)
|
|
14
|
-
return path_1.default.dirname(env.BLUENOTE_DAEMON_STATE);
|
|
15
|
-
if (env.BLUENOTE_CONFIG_HOME)
|
|
16
|
-
return path_1.default.join(env.BLUENOTE_CONFIG_HOME, "bluenote");
|
|
17
|
-
if (env.XDG_CONFIG_HOME)
|
|
18
|
-
return path_1.default.join(env.XDG_CONFIG_HOME, "bluenote");
|
|
19
|
-
return path_1.default.join(os_1.default.homedir(), ".config", "bluenote");
|
|
20
|
-
}
|
|
21
|
-
function getDaemonStatePath(env = process.env) {
|
|
22
|
-
if (env.BLUENOTE_DAEMON_STATE)
|
|
23
|
-
return env.BLUENOTE_DAEMON_STATE;
|
|
24
|
-
return path_1.default.join(getBluenoteStateDir(env), "daemon.json");
|
|
25
|
-
}
|
|
26
|
-
function ensureParentDir(filePath) {
|
|
27
|
-
fs_1.default.mkdirSync(path_1.default.dirname(filePath), { recursive: true });
|
|
28
|
-
}
|
|
29
|
-
//# sourceMappingURL=paths.js.map
|
package/dist/daemon/paths.js.map
DELETED
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"paths.js","sourceRoot":"","sources":["../../src/daemon/paths.ts"],"names":[],"mappings":";;;;;AAIA,kDAKC;AAED,gDAGC;AAED,0CAEC;AAlBD,4CAAmB;AACnB,4CAAmB;AACnB,gDAAuB;AAEvB,SAAgB,mBAAmB,CAAC,MAAyB,OAAO,CAAC,GAAG;IACtE,IAAI,GAAG,CAAC,qBAAqB;QAAE,OAAO,cAAI,CAAC,OAAO,CAAC,GAAG,CAAC,qBAAqB,CAAC,CAAA;IAC7E,IAAI,GAAG,CAAC,oBAAoB;QAAE,OAAO,cAAI,CAAC,IAAI,CAAC,GAAG,CAAC,oBAAoB,EAAE,UAAU,CAAC,CAAA;IACpF,IAAI,GAAG,CAAC,eAAe;QAAE,OAAO,cAAI,CAAC,IAAI,CAAC,GAAG,CAAC,eAAe,EAAE,UAAU,CAAC,CAAA;IAC1E,OAAO,cAAI,CAAC,IAAI,CAAC,YAAE,CAAC,OAAO,EAAE,EAAE,SAAS,EAAE,UAAU,CAAC,CAAA;AACvD,CAAC;AAED,SAAgB,kBAAkB,CAAC,MAAyB,OAAO,CAAC,GAAG;IACrE,IAAI,GAAG,CAAC,qBAAqB;QAAE,OAAO,GAAG,CAAC,qBAAqB,CAAA;IAC/D,OAAO,cAAI,CAAC,IAAI,CAAC,mBAAmB,CAAC,GAAG,CAAC,EAAE,aAAa,CAAC,CAAA;AAC3D,CAAC;AAED,SAAgB,eAAe,CAAC,QAAgB;IAC9C,YAAE,CAAC,SAAS,CAAC,cAAI,CAAC,OAAO,CAAC,QAAQ,CAAC,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAA;AAC3D,CAAC"}
|
package/dist/daemon/router.d.ts
DELETED
|
@@ -1,38 +0,0 @@
|
|
|
1
|
-
import http from "http";
|
|
2
|
-
export type ApiErrorBody = {
|
|
3
|
-
error: {
|
|
4
|
-
code: string;
|
|
5
|
-
message: string;
|
|
6
|
-
hint?: string;
|
|
7
|
-
};
|
|
8
|
-
};
|
|
9
|
-
export type DaemonRequestContext = {
|
|
10
|
-
request: http.IncomingMessage;
|
|
11
|
-
response: http.ServerResponse;
|
|
12
|
-
url: URL;
|
|
13
|
-
};
|
|
14
|
-
export type DaemonRouteHandler = (context: DaemonRequestContext) => void | Promise<void>;
|
|
15
|
-
export type DaemonRouteOptions = {
|
|
16
|
-
auth?: boolean;
|
|
17
|
-
};
|
|
18
|
-
export declare class HttpError extends Error {
|
|
19
|
-
readonly statusCode: number;
|
|
20
|
-
readonly code: string;
|
|
21
|
-
readonly hint?: string;
|
|
22
|
-
constructor(statusCode: number, code: string, message: string, hint?: string);
|
|
23
|
-
}
|
|
24
|
-
export declare function writeJson(response: http.ServerResponse, statusCode: number, body: unknown): void;
|
|
25
|
-
export declare function toApiErrorBody(error: unknown): {
|
|
26
|
-
statusCode: number;
|
|
27
|
-
body: ApiErrorBody;
|
|
28
|
-
};
|
|
29
|
-
export declare function isBearerAuthorized(request: http.IncomingMessage, token: string): boolean;
|
|
30
|
-
export declare function requireBearerAuth(request: http.IncomingMessage, token: string): void;
|
|
31
|
-
export declare function readRequestBody(request: http.IncomingMessage, limitBytes?: number): Promise<string>;
|
|
32
|
-
export type DaemonRouter = {
|
|
33
|
-
get(path: string, handler: DaemonRouteHandler, options?: DaemonRouteOptions): void;
|
|
34
|
-
post(path: string, handler: DaemonRouteHandler, options?: DaemonRouteOptions): void;
|
|
35
|
-
register(method: string, path: string, handler: DaemonRouteHandler, options?: DaemonRouteOptions): void;
|
|
36
|
-
handle(request: http.IncomingMessage, response: http.ServerResponse): void;
|
|
37
|
-
};
|
|
38
|
-
export declare function createDaemonRouter(token: string): DaemonRouter;
|
package/dist/daemon/router.js
DELETED
|
@@ -1,107 +0,0 @@
|
|
|
1
|
-
"use strict";
|
|
2
|
-
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
-
exports.HttpError = void 0;
|
|
4
|
-
exports.writeJson = writeJson;
|
|
5
|
-
exports.toApiErrorBody = toApiErrorBody;
|
|
6
|
-
exports.isBearerAuthorized = isBearerAuthorized;
|
|
7
|
-
exports.requireBearerAuth = requireBearerAuth;
|
|
8
|
-
exports.readRequestBody = readRequestBody;
|
|
9
|
-
exports.createDaemonRouter = createDaemonRouter;
|
|
10
|
-
class HttpError extends Error {
|
|
11
|
-
constructor(statusCode, code, message, hint) {
|
|
12
|
-
super(message);
|
|
13
|
-
this.statusCode = statusCode;
|
|
14
|
-
this.code = code;
|
|
15
|
-
this.hint = hint;
|
|
16
|
-
}
|
|
17
|
-
}
|
|
18
|
-
exports.HttpError = HttpError;
|
|
19
|
-
function writeJson(response, statusCode, body) {
|
|
20
|
-
const text = JSON.stringify(body);
|
|
21
|
-
response.writeHead(statusCode, {
|
|
22
|
-
"content-type": "application/json; charset=utf-8",
|
|
23
|
-
"content-length": Buffer.byteLength(text),
|
|
24
|
-
});
|
|
25
|
-
response.end(text);
|
|
26
|
-
}
|
|
27
|
-
function toApiErrorBody(error) {
|
|
28
|
-
if (error instanceof HttpError) {
|
|
29
|
-
return {
|
|
30
|
-
statusCode: error.statusCode,
|
|
31
|
-
body: {
|
|
32
|
-
error: {
|
|
33
|
-
code: error.code,
|
|
34
|
-
message: error.message,
|
|
35
|
-
...(error.hint ? { hint: error.hint } : {}),
|
|
36
|
-
},
|
|
37
|
-
},
|
|
38
|
-
};
|
|
39
|
-
}
|
|
40
|
-
return {
|
|
41
|
-
statusCode: 500,
|
|
42
|
-
body: { error: { code: "internal_error", message: "Unexpected daemon error" } },
|
|
43
|
-
};
|
|
44
|
-
}
|
|
45
|
-
function isBearerAuthorized(request, token) {
|
|
46
|
-
const authorization = request.headers.authorization || "";
|
|
47
|
-
return authorization === `Bearer ${token}`;
|
|
48
|
-
}
|
|
49
|
-
function requireBearerAuth(request, token) {
|
|
50
|
-
if (!isBearerAuthorized(request, token)) {
|
|
51
|
-
throw new HttpError(401, "unauthorized", "Missing or invalid daemon token");
|
|
52
|
-
}
|
|
53
|
-
}
|
|
54
|
-
async function readRequestBody(request, limitBytes = 1024 * 1024) {
|
|
55
|
-
const chunks = [];
|
|
56
|
-
let totalBytes = 0;
|
|
57
|
-
for await (const chunk of request) {
|
|
58
|
-
const buffer = Buffer.isBuffer(chunk) ? chunk : Buffer.from(String(chunk));
|
|
59
|
-
totalBytes += buffer.byteLength;
|
|
60
|
-
if (totalBytes > limitBytes) {
|
|
61
|
-
throw new HttpError(400, "request_too_large", "Request body is too large");
|
|
62
|
-
}
|
|
63
|
-
chunks.push(buffer);
|
|
64
|
-
}
|
|
65
|
-
return Buffer.concat(chunks).toString("utf8");
|
|
66
|
-
}
|
|
67
|
-
function createDaemonRouter(token) {
|
|
68
|
-
const routes = [];
|
|
69
|
-
function register(method, path, handler, options = {}) {
|
|
70
|
-
routes.push({ method: method.toUpperCase(), path, handler, auth: options.auth !== false });
|
|
71
|
-
}
|
|
72
|
-
function handle(request, response) {
|
|
73
|
-
const url = new URL(request.url || "/", "http://127.0.0.1");
|
|
74
|
-
const method = request.method || "GET";
|
|
75
|
-
const route = routes.find((candidate) => candidate.method === method && candidate.path === url.pathname);
|
|
76
|
-
Promise.resolve()
|
|
77
|
-
.then(async () => {
|
|
78
|
-
if (!route) {
|
|
79
|
-
requireBearerAuth(request, token);
|
|
80
|
-
throw new HttpError(404, "not_found", "Route not found");
|
|
81
|
-
}
|
|
82
|
-
if (route.auth) {
|
|
83
|
-
requireBearerAuth(request, token);
|
|
84
|
-
}
|
|
85
|
-
await route.handler({ request, response, url });
|
|
86
|
-
})
|
|
87
|
-
.catch((error) => {
|
|
88
|
-
if (response.headersSent || response.writableEnded) {
|
|
89
|
-
response.end();
|
|
90
|
-
return;
|
|
91
|
-
}
|
|
92
|
-
const { statusCode, body } = toApiErrorBody(error);
|
|
93
|
-
writeJson(response, statusCode, body);
|
|
94
|
-
});
|
|
95
|
-
}
|
|
96
|
-
return {
|
|
97
|
-
get(path, handler, options) {
|
|
98
|
-
register("GET", path, handler, options);
|
|
99
|
-
},
|
|
100
|
-
post(path, handler, options) {
|
|
101
|
-
register("POST", path, handler, options);
|
|
102
|
-
},
|
|
103
|
-
register,
|
|
104
|
-
handle,
|
|
105
|
-
};
|
|
106
|
-
}
|
|
107
|
-
//# sourceMappingURL=router.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"router.js","sourceRoot":"","sources":["../../src/daemon/router.ts"],"names":[],"mappings":";;;AA0CA,8BAOC;AAED,wCAkBC;AAED,gDAGC;AAED,8CAIC;AAED,0CAcC;AASD,gDA2CC;AAvHD,MAAa,SAAU,SAAQ,KAAK;IAKlC,YAAY,UAAkB,EAAE,IAAY,EAAE,OAAe,EAAE,IAAa;QAC1E,KAAK,CAAC,OAAO,CAAC,CAAA;QACd,IAAI,CAAC,UAAU,GAAG,UAAU,CAAA;QAC5B,IAAI,CAAC,IAAI,GAAG,IAAI,CAAA;QAChB,IAAI,CAAC,IAAI,GAAG,IAAI,CAAA;IAClB,CAAC;CACF;AAXD,8BAWC;AAED,SAAgB,SAAS,CAAC,QAA6B,EAAE,UAAkB,EAAE,IAAa;IACxF,MAAM,IAAI,GAAG,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC,CAAA;IACjC,QAAQ,CAAC,SAAS,CAAC,UAAU,EAAE;QAC7B,cAAc,EAAE,iCAAiC;QACjD,gBAAgB,EAAE,MAAM,CAAC,UAAU,CAAC,IAAI,CAAC;KAC1C,CAAC,CAAA;IACF,QAAQ,CAAC,GAAG,CAAC,IAAI,CAAC,CAAA;AACpB,CAAC;AAED,SAAgB,cAAc,CAAC,KAAc;IAC3C,IAAI,KAAK,YAAY,SAAS,EAAE,CAAC;QAC/B,OAAO;YACL,UAAU,EAAE,KAAK,CAAC,UAAU;YAC5B,IAAI,EAAE;gBACJ,KAAK,EAAE;oBACL,IAAI,EAAE,KAAK,CAAC,IAAI;oBAChB,OAAO,EAAE,KAAK,CAAC,OAAO;oBACtB,GAAG,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,IAAI,EAAE,KAAK,CAAC,IAAI,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;iBAC5C;aACF;SACF,CAAA;IACH,CAAC;IAED,OAAO;QACL,UAAU,EAAE,GAAG;QACf,IAAI,EAAE,EAAE,KAAK,EAAE,EAAE,IAAI,EAAE,gBAAgB,EAAE,OAAO,EAAE,yBAAyB,EAAE,EAAE;KAChF,CAAA;AACH,CAAC;AAED,SAAgB,kBAAkB,CAAC,OAA6B,EAAE,KAAa;IAC7E,MAAM,aAAa,GAAG,OAAO,CAAC,OAAO,CAAC,aAAa,IAAI,EAAE,CAAA;IACzD,OAAO,aAAa,KAAK,UAAU,KAAK,EAAE,CAAA;AAC5C,CAAC;AAED,SAAgB,iBAAiB,CAAC,OAA6B,EAAE,KAAa;IAC5E,IAAI,CAAC,kBAAkB,CAAC,OAAO,EAAE,KAAK,CAAC,EAAE,CAAC;QACxC,MAAM,IAAI,SAAS,CAAC,GAAG,EAAE,cAAc,EAAE,iCAAiC,CAAC,CAAA;IAC7E,CAAC;AACH,CAAC;AAEM,KAAK,UAAU,eAAe,CAAC,OAA6B,EAAE,UAAU,GAAG,IAAI,GAAG,IAAI;IAC3F,MAAM,MAAM,GAAa,EAAE,CAAA;IAC3B,IAAI,UAAU,GAAG,CAAC,CAAA;IAElB,IAAI,KAAK,EAAE,MAAM,KAAK,IAAI,OAAO,EAAE,CAAC;QAClC,MAAM,MAAM,GAAG,MAAM,CAAC,QAAQ,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,MAAM,CAAC,IAAI,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC,CAAA;QAC1E,UAAU,IAAI,MAAM,CAAC,UAAU,CAAA;QAC/B,IAAI,UAAU,GAAG,UAAU,EAAE,CAAC;YAC5B,MAAM,IAAI,SAAS,CAAC,GAAG,EAAE,mBAAmB,EAAE,2BAA2B,CAAC,CAAA;QAC5E,CAAC;QACD,MAAM,CAAC,IAAI,CAAC,MAAM,CAAC,CAAA;IACrB,CAAC;IAED,OAAO,MAAM,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC,QAAQ,CAAC,MAAM,CAAC,CAAA;AAC/C,CAAC;AASD,SAAgB,kBAAkB,CAAC,KAAa;IAC9C,MAAM,MAAM,GAAkB,EAAE,CAAA;IAEhC,SAAS,QAAQ,CAAC,MAAc,EAAE,IAAY,EAAE,OAA2B,EAAE,UAA8B,EAAE;QAC3G,MAAM,CAAC,IAAI,CAAC,EAAE,MAAM,EAAE,MAAM,CAAC,WAAW,EAAE,EAAE,IAAI,EAAE,OAAO,EAAE,IAAI,EAAE,OAAO,CAAC,IAAI,KAAK,KAAK,EAAE,CAAC,CAAA;IAC5F,CAAC;IAED,SAAS,MAAM,CAAC,OAA6B,EAAE,QAA6B;QAC1E,MAAM,GAAG,GAAG,IAAI,GAAG,CAAC,OAAO,CAAC,GAAG,IAAI,GAAG,EAAE,kBAAkB,CAAC,CAAA;QAC3D,MAAM,MAAM,GAAG,OAAO,CAAC,MAAM,IAAI,KAAK,CAAA;QACtC,MAAM,KAAK,GAAG,MAAM,CAAC,IAAI,CAAC,CAAC,SAAS,EAAE,EAAE,CAAC,SAAS,CAAC,MAAM,KAAK,MAAM,IAAI,SAAS,CAAC,IAAI,KAAK,GAAG,CAAC,QAAQ,CAAC,CAAA;QAExG,OAAO,CAAC,OAAO,EAAE;aACd,IAAI,CAAC,KAAK,IAAI,EAAE;YACf,IAAI,CAAC,KAAK,EAAE,CAAC;gBACX,iBAAiB,CAAC,OAAO,EAAE,KAAK,CAAC,CAAA;gBACjC,MAAM,IAAI,SAAS,CAAC,GAAG,EAAE,WAAW,EAAE,iBAAiB,CAAC,CAAA;YAC1D,CAAC;YACD,IAAI,KAAK,CAAC,IAAI,EAAE,CAAC;gBACf,iBAAiB,CAAC,OAAO,EAAE,KAAK,CAAC,CAAA;YACnC,CAAC;YACD,MAAM,KAAK,CAAC,OAAO,CAAC,EAAE,OAAO,EAAE,QAAQ,EAAE,GAAG,EAAE,CAAC,CAAA;QACjD,CAAC,CAAC;aACD,KAAK,CAAC,CAAC,KAAK,EAAE,EAAE;YACf,IAAI,QAAQ,CAAC,WAAW,IAAI,QAAQ,CAAC,aAAa,EAAE,CAAC;gBACnD,QAAQ,CAAC,GAAG,EAAE,CAAA;gBACd,OAAM;YACR,CAAC;YACD,MAAM,EAAE,UAAU,EAAE,IAAI,EAAE,GAAG,cAAc,CAAC,KAAK,CAAC,CAAA;YAClD,SAAS,CAAC,QAAQ,EAAE,UAAU,EAAE,IAAI,CAAC,CAAA;QACvC,CAAC,CAAC,CAAA;IACN,CAAC;IAED,OAAO;QACL,GAAG,CAAC,IAAI,EAAE,OAAO,EAAE,OAAO;YACxB,QAAQ,CAAC,KAAK,EAAE,IAAI,EAAE,OAAO,EAAE,OAAO,CAAC,CAAA;QACzC,CAAC;QACD,IAAI,CAAC,IAAI,EAAE,OAAO,EAAE,OAAO;YACzB,QAAQ,CAAC,MAAM,EAAE,IAAI,EAAE,OAAO,EAAE,OAAO,CAAC,CAAA;QAC1C,CAAC;QACD,QAAQ;QACR,MAAM;KACP,CAAA;AACH,CAAC"}
|
package/dist/daemon/server.d.ts
DELETED
|
@@ -1,13 +0,0 @@
|
|
|
1
|
-
export type DaemonMetadata = {
|
|
2
|
-
pid: number;
|
|
3
|
-
url: string;
|
|
4
|
-
token: string;
|
|
5
|
-
startedAt: string;
|
|
6
|
-
version: string;
|
|
7
|
-
};
|
|
8
|
-
export type DaemonServerOptions = {
|
|
9
|
-
statePath: string;
|
|
10
|
-
token: string;
|
|
11
|
-
version: string;
|
|
12
|
-
};
|
|
13
|
-
export declare function startDaemonServer(options: DaemonServerOptions): Promise<void>;
|
package/dist/daemon/server.js
DELETED
|
@@ -1,78 +0,0 @@
|
|
|
1
|
-
"use strict";
|
|
2
|
-
var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
3
|
-
return (mod && mod.__esModule) ? mod : { "default": mod };
|
|
4
|
-
};
|
|
5
|
-
Object.defineProperty(exports, "__esModule", { value: true });
|
|
6
|
-
exports.startDaemonServer = startDaemonServer;
|
|
7
|
-
const fs_1 = __importDefault(require("fs"));
|
|
8
|
-
const http_1 = __importDefault(require("http"));
|
|
9
|
-
const paths_1 = require("./paths");
|
|
10
|
-
const router_1 = require("./router");
|
|
11
|
-
const BLUENOTE_DAEMON_API_VERSION = "1";
|
|
12
|
-
async function startDaemonServer(options) {
|
|
13
|
-
const router = (0, router_1.createDaemonRouter)(options.token);
|
|
14
|
-
const server = http_1.default.createServer((request, response) => router.handle(request, response));
|
|
15
|
-
router.get("/health", ({ response }) => {
|
|
16
|
-
(0, router_1.writeJson)(response, 200, { ok: true, name: "bluenote-daemon", version: options.version });
|
|
17
|
-
}, { auth: false });
|
|
18
|
-
router.get("/capabilities", ({ response }) => {
|
|
19
|
-
(0, router_1.writeJson)(response, 200, {
|
|
20
|
-
ok: true,
|
|
21
|
-
name: "bluenote-daemon",
|
|
22
|
-
version: options.version,
|
|
23
|
-
mode: "local-only",
|
|
24
|
-
apiVersion: BLUENOTE_DAEMON_API_VERSION,
|
|
25
|
-
workspaceApi: true,
|
|
26
|
-
notesApi: false,
|
|
27
|
-
aiApi: false,
|
|
28
|
-
clients: {
|
|
29
|
-
web: { daemonEnvironment: true },
|
|
30
|
-
tui: { daemonEnvironment: true },
|
|
31
|
-
},
|
|
32
|
-
});
|
|
33
|
-
});
|
|
34
|
-
router.post("/shutdown", ({ response }) => {
|
|
35
|
-
(0, router_1.writeJson)(response, 200, { ok: true });
|
|
36
|
-
server.close(() => {
|
|
37
|
-
try {
|
|
38
|
-
fs_1.default.rmSync(options.statePath, { force: true });
|
|
39
|
-
}
|
|
40
|
-
finally {
|
|
41
|
-
process.exit(0);
|
|
42
|
-
}
|
|
43
|
-
});
|
|
44
|
-
});
|
|
45
|
-
await new Promise((resolve, reject) => {
|
|
46
|
-
server.once("error", reject);
|
|
47
|
-
server.listen(0, "127.0.0.1", () => resolve());
|
|
48
|
-
});
|
|
49
|
-
const address = server.address();
|
|
50
|
-
const metadata = {
|
|
51
|
-
pid: process.pid,
|
|
52
|
-
url: `http://127.0.0.1:${address.port}`,
|
|
53
|
-
token: options.token,
|
|
54
|
-
startedAt: new Date().toISOString(),
|
|
55
|
-
version: options.version,
|
|
56
|
-
};
|
|
57
|
-
(0, paths_1.ensureParentDir)(options.statePath);
|
|
58
|
-
fs_1.default.rmSync(options.statePath, { force: true });
|
|
59
|
-
fs_1.default.writeFileSync(options.statePath, `${JSON.stringify(metadata, null, 2)}\n`, { mode: 0o600 });
|
|
60
|
-
fs_1.default.chmodSync(options.statePath, 0o600);
|
|
61
|
-
const cleanup = () => {
|
|
62
|
-
try {
|
|
63
|
-
fs_1.default.rmSync(options.statePath, { force: true });
|
|
64
|
-
}
|
|
65
|
-
catch {
|
|
66
|
-
// best effort
|
|
67
|
-
}
|
|
68
|
-
};
|
|
69
|
-
process.once("SIGTERM", () => {
|
|
70
|
-
cleanup();
|
|
71
|
-
process.exit(0);
|
|
72
|
-
});
|
|
73
|
-
process.once("SIGINT", () => {
|
|
74
|
-
cleanup();
|
|
75
|
-
process.exit(0);
|
|
76
|
-
});
|
|
77
|
-
}
|
|
78
|
-
//# sourceMappingURL=server.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"server.js","sourceRoot":"","sources":["../../src/daemon/server.ts"],"names":[],"mappings":"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"}
|
package/dist/daemon/token.d.ts
DELETED
|
@@ -1 +0,0 @@
|
|
|
1
|
-
export declare function createDaemonToken(): string;
|
package/dist/daemon/token.js
DELETED
|
@@ -1,11 +0,0 @@
|
|
|
1
|
-
"use strict";
|
|
2
|
-
var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
3
|
-
return (mod && mod.__esModule) ? mod : { "default": mod };
|
|
4
|
-
};
|
|
5
|
-
Object.defineProperty(exports, "__esModule", { value: true });
|
|
6
|
-
exports.createDaemonToken = createDaemonToken;
|
|
7
|
-
const crypto_1 = __importDefault(require("crypto"));
|
|
8
|
-
function createDaemonToken() {
|
|
9
|
-
return crypto_1.default.randomBytes(32).toString("hex");
|
|
10
|
-
}
|
|
11
|
-
//# sourceMappingURL=token.js.map
|
package/dist/daemon/token.js.map
DELETED
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"token.js","sourceRoot":"","sources":["../../src/daemon/token.ts"],"names":[],"mappings":";;;;;AAEA,8CAEC;AAJD,oDAA2B;AAE3B,SAAgB,iBAAiB;IAC/B,OAAO,gBAAM,CAAC,WAAW,CAAC,EAAE,CAAC,CAAC,QAAQ,CAAC,KAAK,CAAC,CAAA;AAC/C,CAAC"}
|
package/dist/types.d.ts
DELETED
|
@@ -1,11 +0,0 @@
|
|
|
1
|
-
export interface CommandIo {
|
|
2
|
-
stdout?: NodeJS.WritableStream;
|
|
3
|
-
stderr?: NodeJS.WritableStream;
|
|
4
|
-
env?: NodeJS.ProcessEnv;
|
|
5
|
-
nodeVersion?: string;
|
|
6
|
-
platform?: NodeJS.Platform;
|
|
7
|
-
clientLoader?: (specifier: string) => Promise<unknown>;
|
|
8
|
-
spawn?: typeof import("child_process").spawn;
|
|
9
|
-
spawnSync?: typeof import("child_process").spawnSync;
|
|
10
|
-
}
|
|
11
|
-
export type CommandRunner = (args: string[], io?: CommandIo) => Promise<number> | number;
|
package/dist/types.js
DELETED
package/dist/types.js.map
DELETED
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"types.js","sourceRoot":"","sources":["../src/types.ts"],"names":[],"mappings":""}
|
|
@@ -1,31 +0,0 @@
|
|
|
1
|
-
export type CommandDiscoveryOptions = {
|
|
2
|
-
path?: string;
|
|
3
|
-
pathext?: string;
|
|
4
|
-
platform?: NodeJS.Platform;
|
|
5
|
-
};
|
|
6
|
-
export type CommandResolution = {
|
|
7
|
-
command: string;
|
|
8
|
-
path: string;
|
|
9
|
-
};
|
|
10
|
-
export type ClientRuntimeMode = "auto" | "path" | "built";
|
|
11
|
-
export type ClientCommandResolution = CommandResolution & {
|
|
12
|
-
mode: "path" | "built";
|
|
13
|
-
};
|
|
14
|
-
export type ClientCommandDiscoveryOptions = CommandDiscoveryOptions & {
|
|
15
|
-
env?: NodeJS.ProcessEnv;
|
|
16
|
-
clientMode?: string;
|
|
17
|
-
builtClientDir?: string;
|
|
18
|
-
};
|
|
19
|
-
export type ParsedClientModeArgs = {
|
|
20
|
-
ok: true;
|
|
21
|
-
mode: ClientRuntimeMode;
|
|
22
|
-
args: string[];
|
|
23
|
-
} | {
|
|
24
|
-
ok: false;
|
|
25
|
-
message: string;
|
|
26
|
-
};
|
|
27
|
-
export declare function findCommandOnPath(command: string, options?: CommandDiscoveryOptions): CommandResolution | undefined;
|
|
28
|
-
export declare function normalizeClientRuntimeMode(value: string | undefined): ClientRuntimeMode;
|
|
29
|
-
export declare function parseClientModeArgs(args: string[], env?: NodeJS.ProcessEnv): ParsedClientModeArgs;
|
|
30
|
-
export declare function clientExecutableCandidates(command: string, platform: NodeJS.Platform, pathext?: string): string[];
|
|
31
|
-
export declare function resolveClientCommand(command: string, options?: ClientCommandDiscoveryOptions): ClientCommandResolution | undefined;
|
|
@@ -1,162 +0,0 @@
|
|
|
1
|
-
"use strict";
|
|
2
|
-
var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
3
|
-
return (mod && mod.__esModule) ? mod : { "default": mod };
|
|
4
|
-
};
|
|
5
|
-
Object.defineProperty(exports, "__esModule", { value: true });
|
|
6
|
-
exports.findCommandOnPath = findCommandOnPath;
|
|
7
|
-
exports.normalizeClientRuntimeMode = normalizeClientRuntimeMode;
|
|
8
|
-
exports.parseClientModeArgs = parseClientModeArgs;
|
|
9
|
-
exports.clientExecutableCandidates = clientExecutableCandidates;
|
|
10
|
-
exports.resolveClientCommand = resolveClientCommand;
|
|
11
|
-
const fs_1 = __importDefault(require("fs"));
|
|
12
|
-
const os_1 = __importDefault(require("os"));
|
|
13
|
-
const path_1 = __importDefault(require("path"));
|
|
14
|
-
function isClientRuntimeMode(value) {
|
|
15
|
-
return value === "path" || value === "built" || value === "auto";
|
|
16
|
-
}
|
|
17
|
-
function isExecutableFile(filePath, platform) {
|
|
18
|
-
try {
|
|
19
|
-
const stat = fs_1.default.statSync(filePath);
|
|
20
|
-
if (!stat.isFile())
|
|
21
|
-
return false;
|
|
22
|
-
if (platform === "win32")
|
|
23
|
-
return true;
|
|
24
|
-
return (stat.mode & 0o111) !== 0;
|
|
25
|
-
}
|
|
26
|
-
catch {
|
|
27
|
-
return false;
|
|
28
|
-
}
|
|
29
|
-
}
|
|
30
|
-
function windowsCandidates(command, pathext) {
|
|
31
|
-
if (path_1.default.extname(command))
|
|
32
|
-
return [command];
|
|
33
|
-
const extensions = pathext
|
|
34
|
-
.split(";")
|
|
35
|
-
.map((extension) => extension.trim())
|
|
36
|
-
.filter(Boolean);
|
|
37
|
-
return [command, ...extensions.map((extension) => `${command}${extension}`)];
|
|
38
|
-
}
|
|
39
|
-
function findCommandOnPath(command, options = {}) {
|
|
40
|
-
const searchPath = options.path !== undefined ? options.path : process.env.PATH || "";
|
|
41
|
-
const platform = options.platform || process.platform;
|
|
42
|
-
const pathext = options.pathext !== undefined ? options.pathext : process.env.PATHEXT || ".COM;.EXE;.BAT;.CMD";
|
|
43
|
-
const pathEntries = searchPath.split(path_1.default.delimiter).filter(Boolean);
|
|
44
|
-
const candidates = platform === "win32" ? windowsCandidates(command, pathext) : [command];
|
|
45
|
-
for (const directory of pathEntries) {
|
|
46
|
-
for (const candidate of candidates) {
|
|
47
|
-
const candidatePath = path_1.default.resolve(directory, candidate);
|
|
48
|
-
if (isExecutableFile(candidatePath, platform))
|
|
49
|
-
return { command, path: candidatePath };
|
|
50
|
-
}
|
|
51
|
-
}
|
|
52
|
-
return undefined;
|
|
53
|
-
}
|
|
54
|
-
function normalizeClientRuntimeMode(value) {
|
|
55
|
-
if (isClientRuntimeMode(value))
|
|
56
|
-
return value;
|
|
57
|
-
return "auto";
|
|
58
|
-
}
|
|
59
|
-
function invalidModeMessage(source, value) {
|
|
60
|
-
return `Invalid ${source} "${value}". Expected auto, path, or built.\n`;
|
|
61
|
-
}
|
|
62
|
-
function getClientModeConfigPath(env) {
|
|
63
|
-
if (env.APPDATA && !env.BLUENOTE_CONFIG_HOME && !env.XDG_CONFIG_HOME)
|
|
64
|
-
return path_1.default.join(env.APPDATA, "bluenote", "client-mode.env");
|
|
65
|
-
const configRoot = env.BLUENOTE_CONFIG_HOME || env.XDG_CONFIG_HOME || path_1.default.join(os_1.default.homedir(), ".config");
|
|
66
|
-
return path_1.default.join(configRoot, "bluenote", "client-mode.env");
|
|
67
|
-
}
|
|
68
|
-
function readPersistedClientMode(env) {
|
|
69
|
-
try {
|
|
70
|
-
const content = fs_1.default.readFileSync(getClientModeConfigPath(env), "utf8");
|
|
71
|
-
const config = {};
|
|
72
|
-
for (const line of content.split(/\r?\n/)) {
|
|
73
|
-
const trimmed = line.trim();
|
|
74
|
-
if (!trimmed || trimmed.startsWith("#"))
|
|
75
|
-
continue;
|
|
76
|
-
const index = trimmed.indexOf("=");
|
|
77
|
-
if (index === -1)
|
|
78
|
-
continue;
|
|
79
|
-
const key = trimmed.slice(0, index);
|
|
80
|
-
const value = trimmed.slice(index + 1);
|
|
81
|
-
if (key === "BLUENOTE_CLIENT_MODE")
|
|
82
|
-
config.mode = value;
|
|
83
|
-
if (key === "BLUENOTE_BUILT_CLIENT_DIR")
|
|
84
|
-
config.builtClientDir = value;
|
|
85
|
-
}
|
|
86
|
-
return config;
|
|
87
|
-
}
|
|
88
|
-
catch {
|
|
89
|
-
return {};
|
|
90
|
-
}
|
|
91
|
-
}
|
|
92
|
-
function parseClientModeArgs(args, env = process.env) {
|
|
93
|
-
const remaining = [];
|
|
94
|
-
let mode = "auto";
|
|
95
|
-
if (env.BLUENOTE_CLIENT_MODE !== undefined) {
|
|
96
|
-
if (!isClientRuntimeMode(env.BLUENOTE_CLIENT_MODE))
|
|
97
|
-
return { ok: false, message: invalidModeMessage("BLUENOTE_CLIENT_MODE", env.BLUENOTE_CLIENT_MODE) };
|
|
98
|
-
mode = env.BLUENOTE_CLIENT_MODE;
|
|
99
|
-
}
|
|
100
|
-
for (let index = 0; index < args.length; index += 1) {
|
|
101
|
-
const arg = args[index];
|
|
102
|
-
if (arg === "--client-mode") {
|
|
103
|
-
const value = args[index + 1];
|
|
104
|
-
if (!value || value.startsWith("--"))
|
|
105
|
-
return { ok: false, message: "Missing value for --client-mode. Expected auto, path, or built.\n" };
|
|
106
|
-
if (!isClientRuntimeMode(value))
|
|
107
|
-
return { ok: false, message: invalidModeMessage("--client-mode", value) };
|
|
108
|
-
mode = value;
|
|
109
|
-
index += 1;
|
|
110
|
-
continue;
|
|
111
|
-
}
|
|
112
|
-
if (arg.startsWith("--client-mode=")) {
|
|
113
|
-
const value = arg.slice("--client-mode=".length);
|
|
114
|
-
if (!isClientRuntimeMode(value))
|
|
115
|
-
return { ok: false, message: invalidModeMessage("--client-mode", value) };
|
|
116
|
-
mode = value;
|
|
117
|
-
continue;
|
|
118
|
-
}
|
|
119
|
-
remaining.push(arg);
|
|
120
|
-
}
|
|
121
|
-
return { ok: true, mode, args: remaining };
|
|
122
|
-
}
|
|
123
|
-
function clientExecutableCandidates(command, platform, pathext) {
|
|
124
|
-
if (platform === "win32")
|
|
125
|
-
return windowsCandidates(command, pathext || ".EXE;.CMD;.BAT;.COM");
|
|
126
|
-
return [command];
|
|
127
|
-
}
|
|
128
|
-
function findBuiltClient(command, options = {}) {
|
|
129
|
-
const env = options.env || process.env;
|
|
130
|
-
const persisted = readPersistedClientMode(env);
|
|
131
|
-
const builtClientDir = options.builtClientDir || env.BLUENOTE_BUILT_CLIENT_DIR || persisted.builtClientDir;
|
|
132
|
-
if (!builtClientDir)
|
|
133
|
-
return undefined;
|
|
134
|
-
const platform = options.platform || process.platform;
|
|
135
|
-
const candidates = clientExecutableCandidates(command, platform, options.pathext || env.PATHEXT);
|
|
136
|
-
for (const candidate of candidates) {
|
|
137
|
-
const candidatePath = path_1.default.resolve(builtClientDir, candidate);
|
|
138
|
-
if (isExecutableFile(candidatePath, platform))
|
|
139
|
-
return { command, path: candidatePath };
|
|
140
|
-
}
|
|
141
|
-
return undefined;
|
|
142
|
-
}
|
|
143
|
-
function resolveClientCommand(command, options = {}) {
|
|
144
|
-
const env = options.env || process.env;
|
|
145
|
-
const persisted = readPersistedClientMode(env);
|
|
146
|
-
const configuredMode = options.clientMode && options.clientMode !== "auto" ? options.clientMode : env.BLUENOTE_CLIENT_MODE || persisted.mode;
|
|
147
|
-
const mode = normalizeClientRuntimeMode(configuredMode);
|
|
148
|
-
const platform = options.platform || process.platform;
|
|
149
|
-
const pathext = options.pathext !== undefined ? options.pathext : env.PATHEXT;
|
|
150
|
-
if (mode !== "path") {
|
|
151
|
-
const built = findBuiltClient(command, { ...options, env, platform, pathext });
|
|
152
|
-
if (built)
|
|
153
|
-
return { ...built, mode: "built" };
|
|
154
|
-
if (mode === "built")
|
|
155
|
-
return undefined;
|
|
156
|
-
}
|
|
157
|
-
const onPath = findCommandOnPath(command, { path: options.path !== undefined ? options.path : env.PATH, platform, pathext });
|
|
158
|
-
if (onPath)
|
|
159
|
-
return { ...onPath, mode: "path" };
|
|
160
|
-
return undefined;
|
|
161
|
-
}
|
|
162
|
-
//# sourceMappingURL=command-discovery.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"command-discovery.js","sourceRoot":"","sources":["../../src/utils/command-discovery.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,21 +0,0 @@
|
|
|
1
|
-
import type { DaemonMetadata } from "../daemon/server";
|
|
2
|
-
export type DaemonConnection = {
|
|
3
|
-
url: string;
|
|
4
|
-
token: string;
|
|
5
|
-
pid?: number;
|
|
6
|
-
};
|
|
7
|
-
export type DaemonStatus = {
|
|
8
|
-
state: "running" | "stopped" | "stale" | "unreachable";
|
|
9
|
-
metadata?: DaemonMetadata;
|
|
10
|
-
healthOk?: boolean;
|
|
11
|
-
};
|
|
12
|
-
export declare function readDaemonMetadata(env?: NodeJS.ProcessEnv): DaemonMetadata | undefined;
|
|
13
|
-
export declare function removeDaemonMetadata(env?: NodeJS.ProcessEnv): void;
|
|
14
|
-
export declare function getDaemonConnection(env?: NodeJS.ProcessEnv): DaemonConnection | undefined;
|
|
15
|
-
export declare function isProcessAlive(pid: number | undefined): boolean;
|
|
16
|
-
export declare function requestJson(url: string, options?: {
|
|
17
|
-
method?: string;
|
|
18
|
-
token?: string;
|
|
19
|
-
timeoutMs?: number;
|
|
20
|
-
}): Promise<unknown>;
|
|
21
|
-
export declare function readDaemonStatus(env?: NodeJS.ProcessEnv): Promise<DaemonStatus>;
|
|
@@ -1,99 +0,0 @@
|
|
|
1
|
-
"use strict";
|
|
2
|
-
var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
3
|
-
return (mod && mod.__esModule) ? mod : { "default": mod };
|
|
4
|
-
};
|
|
5
|
-
Object.defineProperty(exports, "__esModule", { value: true });
|
|
6
|
-
exports.readDaemonMetadata = readDaemonMetadata;
|
|
7
|
-
exports.removeDaemonMetadata = removeDaemonMetadata;
|
|
8
|
-
exports.getDaemonConnection = getDaemonConnection;
|
|
9
|
-
exports.isProcessAlive = isProcessAlive;
|
|
10
|
-
exports.requestJson = requestJson;
|
|
11
|
-
exports.readDaemonStatus = readDaemonStatus;
|
|
12
|
-
const fs_1 = __importDefault(require("fs"));
|
|
13
|
-
const http_1 = __importDefault(require("http"));
|
|
14
|
-
const paths_1 = require("../daemon/paths");
|
|
15
|
-
function readDaemonMetadata(env = process.env) {
|
|
16
|
-
const statePath = (0, paths_1.getDaemonStatePath)(env);
|
|
17
|
-
try {
|
|
18
|
-
const parsed = JSON.parse(fs_1.default.readFileSync(statePath, "utf8"));
|
|
19
|
-
if (typeof parsed.url !== "string" || typeof parsed.token !== "string")
|
|
20
|
-
return undefined;
|
|
21
|
-
return {
|
|
22
|
-
pid: typeof parsed.pid === "number" ? parsed.pid : 0,
|
|
23
|
-
url: parsed.url,
|
|
24
|
-
token: parsed.token,
|
|
25
|
-
startedAt: typeof parsed.startedAt === "string" ? parsed.startedAt : "",
|
|
26
|
-
version: typeof parsed.version === "string" ? parsed.version : "",
|
|
27
|
-
};
|
|
28
|
-
}
|
|
29
|
-
catch {
|
|
30
|
-
return undefined;
|
|
31
|
-
}
|
|
32
|
-
}
|
|
33
|
-
function removeDaemonMetadata(env = process.env) {
|
|
34
|
-
fs_1.default.rmSync((0, paths_1.getDaemonStatePath)(env), { force: true });
|
|
35
|
-
}
|
|
36
|
-
function getDaemonConnection(env = process.env) {
|
|
37
|
-
const metadata = readDaemonMetadata(env);
|
|
38
|
-
if (!metadata)
|
|
39
|
-
return undefined;
|
|
40
|
-
return { url: metadata.url, token: metadata.token, pid: metadata.pid || undefined };
|
|
41
|
-
}
|
|
42
|
-
function isProcessAlive(pid) {
|
|
43
|
-
if (!pid || pid <= 0)
|
|
44
|
-
return false;
|
|
45
|
-
try {
|
|
46
|
-
process.kill(pid, 0);
|
|
47
|
-
return true;
|
|
48
|
-
}
|
|
49
|
-
catch {
|
|
50
|
-
return false;
|
|
51
|
-
}
|
|
52
|
-
}
|
|
53
|
-
async function requestJson(url, options = {}) {
|
|
54
|
-
return await new Promise((resolve, reject) => {
|
|
55
|
-
const request = http_1.default.request(url, {
|
|
56
|
-
method: options.method || "GET",
|
|
57
|
-
timeout: options.timeoutMs || 1000,
|
|
58
|
-
headers: options.token ? { authorization: `Bearer ${options.token}` } : undefined,
|
|
59
|
-
}, (response) => {
|
|
60
|
-
let body = "";
|
|
61
|
-
response.setEncoding("utf8");
|
|
62
|
-
response.on("data", (chunk) => {
|
|
63
|
-
body += chunk;
|
|
64
|
-
});
|
|
65
|
-
response.on("end", () => {
|
|
66
|
-
if (!response.statusCode || response.statusCode < 200 || response.statusCode >= 300) {
|
|
67
|
-
reject(new Error(`HTTP ${response.statusCode || 0}`));
|
|
68
|
-
return;
|
|
69
|
-
}
|
|
70
|
-
try {
|
|
71
|
-
resolve(body ? JSON.parse(body) : {});
|
|
72
|
-
}
|
|
73
|
-
catch (error) {
|
|
74
|
-
reject(error);
|
|
75
|
-
}
|
|
76
|
-
});
|
|
77
|
-
});
|
|
78
|
-
request.on("timeout", () => {
|
|
79
|
-
request.destroy(new Error("request timed out"));
|
|
80
|
-
});
|
|
81
|
-
request.on("error", reject);
|
|
82
|
-
request.end();
|
|
83
|
-
});
|
|
84
|
-
}
|
|
85
|
-
async function readDaemonStatus(env = process.env) {
|
|
86
|
-
const metadata = readDaemonMetadata(env);
|
|
87
|
-
if (!metadata)
|
|
88
|
-
return { state: "stopped" };
|
|
89
|
-
try {
|
|
90
|
-
const health = await requestJson(`${metadata.url}/health`, { timeoutMs: 750 });
|
|
91
|
-
if (health && health.ok === true)
|
|
92
|
-
return { state: "running", metadata, healthOk: true };
|
|
93
|
-
return { state: "unreachable", metadata, healthOk: false };
|
|
94
|
-
}
|
|
95
|
-
catch {
|
|
96
|
-
return { state: isProcessAlive(metadata.pid) ? "unreachable" : "stale", metadata, healthOk: false };
|
|
97
|
-
}
|
|
98
|
-
}
|
|
99
|
-
//# sourceMappingURL=daemon-state.js.map
|