runpane 2.3.0 → 2.3.2

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.
@@ -0,0 +1,176 @@
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.PaneDaemonClientError = void 0;
7
+ exports.resolvePaneDirectory = resolvePaneDirectory;
8
+ exports.getPaneDaemonEndpoint = getPaneDaemonEndpoint;
9
+ exports.invokeDaemon = invokeDaemon;
10
+ const node_crypto_1 = require("node:crypto");
11
+ const node_net_1 = __importDefault(require("node:net"));
12
+ const node_os_1 = __importDefault(require("node:os"));
13
+ const node_path_1 = __importDefault(require("node:path"));
14
+ const node_string_decoder_1 = require("node:string_decoder");
15
+ const FRAME_DELIMITER = '\n';
16
+ const UNIX_SOCKET_BASE_DIRECTORY = '/tmp';
17
+ const DAEMON_SOCKET_FILENAME = 'daemon.sock';
18
+ const DEFAULT_TIMEOUT_MS = 130_000;
19
+ class PaneDaemonClientError extends Error {
20
+ code;
21
+ constructor(message, code) {
22
+ super(message);
23
+ this.code = code;
24
+ this.name = 'PaneDaemonClientError';
25
+ }
26
+ }
27
+ exports.PaneDaemonClientError = PaneDaemonClientError;
28
+ function resolvePaneDirectory(paneDir) {
29
+ return paneDir ?? process.env.PANE_DIR ?? process.env.FOOZOL_DIR ?? node_path_1.default.join(node_os_1.default.homedir(), '.pane');
30
+ }
31
+ function getPaneDaemonEndpoint(appDirectory, platform = process.platform) {
32
+ const resolvedAppDirectory = resolveAppDirectory(appDirectory, platform);
33
+ if (platform === 'win32') {
34
+ return {
35
+ transport: 'pipe',
36
+ path: getWindowsPipeName(resolvedAppDirectory),
37
+ };
38
+ }
39
+ return {
40
+ transport: 'unix',
41
+ path: node_path_1.default.posix.join(getUnixSocketDirectoryName(resolvedAppDirectory), DAEMON_SOCKET_FILENAME),
42
+ };
43
+ }
44
+ async function invokeDaemon(channel, args = [], options = {}) {
45
+ const endpoint = getPaneDaemonEndpoint(resolvePaneDirectory(options.paneDir));
46
+ const request = {
47
+ type: 'request',
48
+ id: 1,
49
+ channel,
50
+ args,
51
+ };
52
+ return new Promise((resolve, reject) => {
53
+ const socket = node_net_1.default.createConnection(endpoint.path);
54
+ const decoder = new PaneDaemonFrameDecoder();
55
+ let settled = false;
56
+ const timeoutRef = {};
57
+ const settle = (error, result) => {
58
+ if (settled) {
59
+ return;
60
+ }
61
+ settled = true;
62
+ if (timeoutRef.current) {
63
+ clearTimeout(timeoutRef.current);
64
+ }
65
+ socket.removeAllListeners();
66
+ if (!socket.destroyed) {
67
+ socket.destroy();
68
+ }
69
+ if (error) {
70
+ reject(error);
71
+ return;
72
+ }
73
+ resolve(result);
74
+ };
75
+ timeoutRef.current = setTimeout(() => {
76
+ settle(new PaneDaemonClientError(`Timed out waiting for Pane daemon response on ${endpoint.path}`, 'ERR_RUNPANE_DAEMON_TIMEOUT'));
77
+ }, options.timeoutMs ?? DEFAULT_TIMEOUT_MS);
78
+ socket.once('connect', () => {
79
+ socket.write(encodePaneDaemonFrame(request));
80
+ });
81
+ socket.on('data', (chunk) => {
82
+ try {
83
+ const frames = decoder.push(chunk);
84
+ for (const frame of frames) {
85
+ if (frame.type !== 'response' || frame.id !== request.id) {
86
+ continue;
87
+ }
88
+ if (frame.ok) {
89
+ settle(null, frame.result);
90
+ return;
91
+ }
92
+ settle(new PaneDaemonClientError(frame.error.message, frame.error.code));
93
+ return;
94
+ }
95
+ }
96
+ catch (error) {
97
+ settle(error instanceof Error ? error : new Error(String(error)));
98
+ }
99
+ });
100
+ socket.once('error', (error) => {
101
+ const code = error.code ?? 'ERR_RUNPANE_DAEMON_CONNECT_FAILED';
102
+ settle(new PaneDaemonClientError(`Could not connect to Pane daemon at ${endpoint.path}: ${error.message}`, code));
103
+ });
104
+ socket.once('close', () => {
105
+ if (!settled) {
106
+ settle(new PaneDaemonClientError(`Pane daemon closed the connection before responding at ${endpoint.path}`, 'ERR_RUNPANE_DAEMON_CLOSED'));
107
+ }
108
+ });
109
+ });
110
+ }
111
+ function resolveAppDirectory(appDirectory, platform) {
112
+ if (platform === 'win32') {
113
+ return node_path_1.default.win32.resolve(appDirectory);
114
+ }
115
+ return node_path_1.default.posix.resolve(appDirectory);
116
+ }
117
+ function getWindowsPipeName(appDirectory) {
118
+ const hash = (0, node_crypto_1.createHash)('sha256')
119
+ .update(appDirectory.toLowerCase())
120
+ .digest('hex')
121
+ .slice(0, 16);
122
+ return `\\\\.\\pipe\\pane-daemon-${hash}`;
123
+ }
124
+ function getUnixSocketDirectoryName(appDirectory) {
125
+ const hash = (0, node_crypto_1.createHash)('sha256')
126
+ .update(appDirectory)
127
+ .digest('hex')
128
+ .slice(0, 16);
129
+ const uidSuffix = typeof process.getuid === 'function' ? `-${process.getuid()}` : '';
130
+ return node_path_1.default.posix.join(UNIX_SOCKET_BASE_DIRECTORY, `pane-daemon${uidSuffix}-${hash}`);
131
+ }
132
+ function encodePaneDaemonFrame(frame) {
133
+ return `${JSON.stringify(frame)}${FRAME_DELIMITER}`;
134
+ }
135
+ class PaneDaemonFrameDecoder {
136
+ buffer = '';
137
+ decoder = new node_string_decoder_1.StringDecoder('utf8');
138
+ push(chunk) {
139
+ this.buffer += typeof chunk === 'string' ? chunk : this.decoder.write(chunk);
140
+ const frames = [];
141
+ let delimiterIndex = this.buffer.indexOf(FRAME_DELIMITER);
142
+ while (delimiterIndex !== -1) {
143
+ const rawFrame = this.buffer.slice(0, delimiterIndex);
144
+ this.buffer = this.buffer.slice(delimiterIndex + FRAME_DELIMITER.length);
145
+ if (rawFrame.trim().length > 0) {
146
+ frames.push(parseFrame(rawFrame));
147
+ }
148
+ delimiterIndex = this.buffer.indexOf(FRAME_DELIMITER);
149
+ }
150
+ return frames;
151
+ }
152
+ }
153
+ function parseFrame(rawFrame) {
154
+ const parsed = JSON.parse(rawFrame);
155
+ if (!isPaneDaemonFrame(parsed)) {
156
+ throw new Error('Failed to parse Pane daemon frame: frame does not match Pane daemon protocol');
157
+ }
158
+ return parsed;
159
+ }
160
+ function isPaneDaemonFrame(frame) {
161
+ if (typeof frame !== 'object' || frame === null) {
162
+ return false;
163
+ }
164
+ const candidate = frame;
165
+ if (candidate.type === 'event') {
166
+ return typeof candidate.channel === 'string' && Array.isArray(candidate.args);
167
+ }
168
+ if (candidate.type === 'request') {
169
+ return typeof candidate.id === 'number' && typeof candidate.channel === 'string' && Array.isArray(candidate.args);
170
+ }
171
+ if (candidate.type === 'response') {
172
+ return typeof candidate.id === 'number' && typeof candidate.ok === 'boolean';
173
+ }
174
+ return false;
175
+ }
176
+ //# sourceMappingURL=daemonClient.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"daemonClient.js","sourceRoot":"","sources":["../src/daemonClient.ts"],"names":[],"mappings":";;;;;;AAmEA,oDAEC;AAED,sDAcC;AAED,oCA4EC;AAnKD,6CAAyC;AACzC,wDAA2B;AAC3B,sDAAyB;AACzB,0DAA6B;AAC7B,6DAAoD;AAgDpD,MAAM,eAAe,GAAG,IAAI,CAAC;AAC7B,MAAM,0BAA0B,GAAG,MAAM,CAAC;AAC1C,MAAM,sBAAsB,GAAG,aAAa,CAAC;AAC7C,MAAM,kBAAkB,GAAG,OAAO,CAAC;AAEnC,MAAa,qBAAsB,SAAQ,KAAK;IAGnC;IAFX,YACE,OAAe,EACN,IAAa;QAEtB,KAAK,CAAC,OAAO,CAAC,CAAC;QAFN,SAAI,GAAJ,IAAI,CAAS;QAGtB,IAAI,CAAC,IAAI,GAAG,uBAAuB,CAAC;IACtC,CAAC;CACF;AARD,sDAQC;AAED,SAAgB,oBAAoB,CAAC,OAAgB;IACnD,OAAO,OAAO,IAAI,OAAO,CAAC,GAAG,CAAC,QAAQ,IAAI,OAAO,CAAC,GAAG,CAAC,UAAU,IAAI,mBAAI,CAAC,IAAI,CAAC,iBAAE,CAAC,OAAO,EAAE,EAAE,OAAO,CAAC,CAAC;AACvG,CAAC;AAED,SAAgB,qBAAqB,CAAC,YAAoB,EAAE,WAA4B,OAAO,CAAC,QAAQ;IACtG,MAAM,oBAAoB,GAAG,mBAAmB,CAAC,YAAY,EAAE,QAAQ,CAAC,CAAC;IAEzE,IAAI,QAAQ,KAAK,OAAO,EAAE,CAAC;QACzB,OAAO;YACL,SAAS,EAAE,MAAM;YACjB,IAAI,EAAE,kBAAkB,CAAC,oBAAoB,CAAC;SAC/C,CAAC;IACJ,CAAC;IAED,OAAO;QACL,SAAS,EAAE,MAAM;QACjB,IAAI,EAAE,mBAAI,CAAC,KAAK,CAAC,IAAI,CAAC,0BAA0B,CAAC,oBAAoB,CAAC,EAAE,sBAAsB,CAAC;KAChG,CAAC;AACJ,CAAC;AAEM,KAAK,UAAU,YAAY,CAChC,OAAe,EACf,OAAkB,EAAE,EACpB,UAAyB,EAAE;IAE3B,MAAM,QAAQ,GAAG,qBAAqB,CAAC,oBAAoB,CAAC,OAAO,CAAC,OAAO,CAAC,CAAC,CAAC;IAC9E,MAAM,OAAO,GAA2B;QACtC,IAAI,EAAE,SAAS;QACf,EAAE,EAAE,CAAC;QACL,OAAO;QACP,IAAI;KACL,CAAC;IAEF,OAAO,IAAI,OAAO,CAAI,CAAC,OAAO,EAAE,MAAM,EAAE,EAAE;QACxC,MAAM,MAAM,GAAG,kBAAG,CAAC,gBAAgB,CAAC,QAAQ,CAAC,IAAI,CAAC,CAAC;QACnD,MAAM,OAAO,GAAG,IAAI,sBAAsB,EAAE,CAAC;QAC7C,IAAI,OAAO,GAAG,KAAK,CAAC;QACpB,MAAM,UAAU,GAAgD,EAAE,CAAC;QAEnE,MAAM,MAAM,GAAG,CAAC,KAAmB,EAAE,MAAU,EAAE,EAAE;YACjD,IAAI,OAAO,EAAE,CAAC;gBACZ,OAAO;YACT,CAAC;YACD,OAAO,GAAG,IAAI,CAAC;YACf,IAAI,UAAU,CAAC,OAAO,EAAE,CAAC;gBACvB,YAAY,CAAC,UAAU,CAAC,OAAO,CAAC,CAAC;YACnC,CAAC;YACD,MAAM,CAAC,kBAAkB,EAAE,CAAC;YAC5B,IAAI,CAAC,MAAM,CAAC,SAAS,EAAE,CAAC;gBACtB,MAAM,CAAC,OAAO,EAAE,CAAC;YACnB,CAAC;YACD,IAAI,KAAK,EAAE,CAAC;gBACV,MAAM,CAAC,KAAK,CAAC,CAAC;gBACd,OAAO;YACT,CAAC;YACD,OAAO,CAAC,MAAW,CAAC,CAAC;QACvB,CAAC,CAAC;QAEF,UAAU,CAAC,OAAO,GAAG,UAAU,CAAC,GAAG,EAAE;YACnC,MAAM,CAAC,IAAI,qBAAqB,CAAC,iDAAiD,QAAQ,CAAC,IAAI,EAAE,EAAE,4BAA4B,CAAC,CAAC,CAAC;QACpI,CAAC,EAAE,OAAO,CAAC,SAAS,IAAI,kBAAkB,CAAC,CAAC;QAE5C,MAAM,CAAC,IAAI,CAAC,SAAS,EAAE,GAAG,EAAE;YAC1B,MAAM,CAAC,KAAK,CAAC,qBAAqB,CAAC,OAAO,CAAC,CAAC,CAAC;QAC/C,CAAC,CAAC,CAAC;QAEH,MAAM,CAAC,EAAE,CAAC,MAAM,EAAE,CAAC,KAAK,EAAE,EAAE;YAC1B,IAAI,CAAC;gBACH,MAAM,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;gBACnC,KAAK,MAAM,KAAK,IAAI,MAAM,EAAE,CAAC;oBAC3B,IAAI,KAAK,CAAC,IAAI,KAAK,UAAU,IAAI,KAAK,CAAC,EAAE,KAAK,OAAO,CAAC,EAAE,EAAE,CAAC;wBACzD,SAAS;oBACX,CAAC;oBACD,IAAI,KAAK,CAAC,EAAE,EAAE,CAAC;wBACb,MAAM,CAAC,IAAI,EAAE,KAAK,CAAC,MAAW,CAAC,CAAC;wBAChC,OAAO;oBACT,CAAC;oBACD,MAAM,CAAC,IAAI,qBAAqB,CAAC,KAAK,CAAC,KAAK,CAAC,OAAO,EAAE,KAAK,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,CAAC;oBACzE,OAAO;gBACT,CAAC;YACH,CAAC;YAAC,OAAO,KAAK,EAAE,CAAC;gBACf,MAAM,CAAC,KAAK,YAAY,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,IAAI,KAAK,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC;YACpE,CAAC;QACH,CAAC,CAAC,CAAC;QAEH,MAAM,CAAC,IAAI,CAAC,OAAO,EAAE,CAAC,KAA4B,EAAE,EAAE;YACpD,MAAM,IAAI,GAAG,KAAK,CAAC,IAAI,IAAI,mCAAmC,CAAC;YAC/D,MAAM,CAAC,IAAI,qBAAqB,CAAC,uCAAuC,QAAQ,CAAC,IAAI,KAAK,KAAK,CAAC,OAAO,EAAE,EAAE,IAAI,CAAC,CAAC,CAAC;QACpH,CAAC,CAAC,CAAC;QAEH,MAAM,CAAC,IAAI,CAAC,OAAO,EAAE,GAAG,EAAE;YACxB,IAAI,CAAC,OAAO,EAAE,CAAC;gBACb,MAAM,CAAC,IAAI,qBAAqB,CAAC,0DAA0D,QAAQ,CAAC,IAAI,EAAE,EAAE,2BAA2B,CAAC,CAAC,CAAC;YAC5I,CAAC;QACH,CAAC,CAAC,CAAC;IACL,CAAC,CAAC,CAAC;AACL,CAAC;AAED,SAAS,mBAAmB,CAAC,YAAoB,EAAE,QAAyB;IAC1E,IAAI,QAAQ,KAAK,OAAO,EAAE,CAAC;QACzB,OAAO,mBAAI,CAAC,KAAK,CAAC,OAAO,CAAC,YAAY,CAAC,CAAC;IAC1C,CAAC;IACD,OAAO,mBAAI,CAAC,KAAK,CAAC,OAAO,CAAC,YAAY,CAAC,CAAC;AAC1C,CAAC;AAED,SAAS,kBAAkB,CAAC,YAAoB;IAC9C,MAAM,IAAI,GAAG,IAAA,wBAAU,EAAC,QAAQ,CAAC;SAC9B,MAAM,CAAC,YAAY,CAAC,WAAW,EAAE,CAAC;SAClC,MAAM,CAAC,KAAK,CAAC;SACb,KAAK,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC;IAEhB,OAAO,4BAA4B,IAAI,EAAE,CAAC;AAC5C,CAAC;AAED,SAAS,0BAA0B,CAAC,YAAoB;IACtD,MAAM,IAAI,GAAG,IAAA,wBAAU,EAAC,QAAQ,CAAC;SAC9B,MAAM,CAAC,YAAY,CAAC;SACpB,MAAM,CAAC,KAAK,CAAC;SACb,KAAK,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC;IAChB,MAAM,SAAS,GAAG,OAAO,OAAO,CAAC,MAAM,KAAK,UAAU,CAAC,CAAC,CAAC,IAAI,OAAO,CAAC,MAAM,EAAE,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;IAErF,OAAO,mBAAI,CAAC,KAAK,CAAC,IAAI,CAAC,0BAA0B,EAAE,cAAc,SAAS,IAAI,IAAI,EAAE,CAAC,CAAC;AACxF,CAAC;AAED,SAAS,qBAAqB,CAAC,KAAsB;IACnD,OAAO,GAAG,IAAI,CAAC,SAAS,CAAC,KAAK,CAAC,GAAG,eAAe,EAAE,CAAC;AACtD,CAAC;AAED,MAAM,sBAAsB;IAClB,MAAM,GAAG,EAAE,CAAC;IACZ,OAAO,GAAG,IAAI,mCAAa,CAAC,MAAM,CAAC,CAAC;IAE5C,IAAI,CAAC,KAAsB;QACzB,IAAI,CAAC,MAAM,IAAI,OAAO,KAAK,KAAK,QAAQ,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,IAAI,CAAC,OAAO,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC;QAE7E,MAAM,MAAM,GAAsB,EAAE,CAAC;QACrC,IAAI,cAAc,GAAG,IAAI,CAAC,MAAM,CAAC,OAAO,CAAC,eAAe,CAAC,CAAC;QAE1D,OAAO,cAAc,KAAK,CAAC,CAAC,EAAE,CAAC;YAC7B,MAAM,QAAQ,GAAG,IAAI,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC,EAAE,cAAc,CAAC,CAAC;YACtD,IAAI,CAAC,MAAM,GAAG,IAAI,CAAC,MAAM,CAAC,KAAK,CAAC,cAAc,GAAG,eAAe,CAAC,MAAM,CAAC,CAAC;YAEzE,IAAI,QAAQ,CAAC,IAAI,EAAE,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;gBAC/B,MAAM,CAAC,IAAI,CAAC,UAAU,CAAC,QAAQ,CAAC,CAAC,CAAC;YACpC,CAAC;YAED,cAAc,GAAG,IAAI,CAAC,MAAM,CAAC,OAAO,CAAC,eAAe,CAAC,CAAC;QACxD,CAAC;QAED,OAAO,MAAM,CAAC;IAChB,CAAC;CACF;AAED,SAAS,UAAU,CAAC,QAAgB;IAClC,MAAM,MAAM,GAAG,IAAI,CAAC,KAAK,CAAC,QAAQ,CAAY,CAAC;IAC/C,IAAI,CAAC,iBAAiB,CAAC,MAAM,CAAC,EAAE,CAAC;QAC/B,MAAM,IAAI,KAAK,CAAC,8EAA8E,CAAC,CAAC;IAClG,CAAC;IACD,OAAO,MAAM,CAAC;AAChB,CAAC;AAED,SAAS,iBAAiB,CAAC,KAAc;IACvC,IAAI,OAAO,KAAK,KAAK,QAAQ,IAAI,KAAK,KAAK,IAAI,EAAE,CAAC;QAChD,OAAO,KAAK,CAAC;IACf,CAAC;IAED,MAAM,SAAS,GAAG,KAAiC,CAAC;IACpD,IAAI,SAAS,CAAC,IAAI,KAAK,OAAO,EAAE,CAAC;QAC/B,OAAO,OAAO,SAAS,CAAC,OAAO,KAAK,QAAQ,IAAI,KAAK,CAAC,OAAO,CAAC,SAAS,CAAC,IAAI,CAAC,CAAC;IAChF,CAAC;IACD,IAAI,SAAS,CAAC,IAAI,KAAK,SAAS,EAAE,CAAC;QACjC,OAAO,OAAO,SAAS,CAAC,EAAE,KAAK,QAAQ,IAAI,OAAO,SAAS,CAAC,OAAO,KAAK,QAAQ,IAAI,KAAK,CAAC,OAAO,CAAC,SAAS,CAAC,IAAI,CAAC,CAAC;IACpH,CAAC;IACD,IAAI,SAAS,CAAC,IAAI,KAAK,UAAU,EAAE,CAAC;QAClC,OAAO,OAAO,SAAS,CAAC,EAAE,KAAK,QAAQ,IAAI,OAAO,SAAS,CAAC,EAAE,KAAK,SAAS,CAAC;IAC/E,CAAC;IACD,OAAO,KAAK,CAAC;AACf,CAAC"}