opencode-collaboration 0.8.0 → 0.9.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/listener.js CHANGED
@@ -1,335 +1,2 @@
1
- /**
2
- * Per-instance inbox HTTP listener (127.0.0.1 only, bearer-token auth).
3
- * Peers POST messages here instead of touching the opencode server directly,
4
- * so inbound gating (accept/hold/refuse) and queueing stay under our control.
5
- */
6
- import { chmod, lstat, mkdir, rm } from "node:fs/promises";
7
- import { createServer } from "node:http";
8
- import { connect } from "node:net";
9
- import { tmpdir } from "node:os";
10
- import { join } from "node:path";
11
- import { z } from "zod";
12
- const MAX_HOPS = 4;
13
- const peerFromSchema = z
14
- .object({
15
- instanceId: z.string().min(1),
16
- name: z.string().min(1),
17
- directory: z.string().min(1),
18
- })
19
- .passthrough();
20
- const inboundMessageV1Schema = z
21
- .object({
22
- id: z.string().min(1),
23
- from: peerFromSchema,
24
- text: z.string(),
25
- via: z.array(z.string()).max(MAX_HOPS),
26
- sentAt: z.number().finite(),
27
- })
28
- .passthrough();
29
- const inboundMessageV2Schema = z
30
- .object({
31
- version: z.literal(2),
32
- messageId: z.string().min(1),
33
- fromEndpointId: z.string().min(1),
34
- toEndpointId: z.string().min(1),
35
- from: peerFromSchema,
36
- text: z.string(),
37
- via: z.array(z.string()).max(MAX_HOPS),
38
- sentAt: z.number().finite(),
39
- })
40
- .passthrough();
41
- const acknowledgementV2Schema = z.object({
42
- version: z.literal(2),
43
- messageId: z.string().min(1),
44
- fromEndpointId: z.string().min(1),
45
- toEndpointId: z.string().min(1),
46
- status: z.enum(["delivered", "refused", "expired", "dropped", "duplicate"]),
47
- acknowledgedAt: z.number().finite(),
48
- }).passthrough();
49
- function statusToHttp(status) {
50
- switch (status) {
51
- case "refused":
52
- return 403;
53
- case "full":
54
- return 429;
55
- default:
56
- return 202;
57
- }
58
- }
59
- function parseMessage(body) {
60
- if (typeof body === "object" && body !== null && "version" in body && body.version === 2) {
61
- const parsed = inboundMessageV2Schema.safeParse(body);
62
- if (!parsed.success)
63
- return null;
64
- const message = parsed.data;
65
- return {
66
- message: {
67
- id: message.messageId,
68
- from: {
69
- instanceId: message.fromEndpointId,
70
- name: message.from.name,
71
- directory: message.from.directory,
72
- },
73
- text: message.text,
74
- via: message.via,
75
- sentAt: message.sentAt,
76
- },
77
- route: { version: 2, toEndpointId: message.toEndpointId },
78
- };
79
- }
80
- const parsed = inboundMessageV1Schema.safeParse(body);
81
- return parsed.success ? { message: parsed.data, route: { version: 1 } } : null;
82
- }
83
- export function defaultRuntimeDirectory(env = process.env, uid = typeof process.getuid === "function" ? process.getuid() : 0) {
84
- return env.XDG_RUNTIME_DIR
85
- ? join(env.XDG_RUNTIME_DIR, "opencode-collaboration")
86
- : join(tmpdir(), `ocp-${uid}`);
87
- }
88
- export function InboxListener(opts) {
89
- let primaryServer = null;
90
- let compatibilityServer = null;
91
- let ownedSocketPath = null;
92
- let lifecycle = "new";
93
- function authorized(authHeader) {
94
- return authHeader === `Bearer ${opts.token}`;
95
- }
96
- async function handle(req, res) {
97
- const send = (code, body) => {
98
- res.writeHead(code, { "content-type": "application/json" });
99
- res.end(JSON.stringify(body));
100
- };
101
- if (!authorized(req.headers.authorization)) {
102
- send(401, { error: "unauthorized" });
103
- return;
104
- }
105
- if (req.method === "GET" && req.url === "/health") {
106
- send(200, { ok: true });
107
- return;
108
- }
109
- if (req.method !== "POST" || (req.url !== "/message" && req.url !== "/ack")) {
110
- send(404, { error: "not found" });
111
- return;
112
- }
113
- const chunks = [];
114
- let size = 0;
115
- for await (const chunk of req) {
116
- size += chunk.length;
117
- if (size > opts.maxBodyBytes) {
118
- send(413, { error: "message too large" });
119
- req.destroy();
120
- return;
121
- }
122
- chunks.push(chunk);
123
- }
124
- let parsed;
125
- try {
126
- parsed = JSON.parse(Buffer.concat(chunks).toString("utf8"));
127
- }
128
- catch {
129
- send(400, { error: "invalid json" });
130
- return;
131
- }
132
- if (req.url === "/ack") {
133
- const ack = acknowledgementV2Schema.safeParse(parsed);
134
- if (!ack.success) {
135
- send(400, { error: "invalid acknowledgement shape" });
136
- return;
137
- }
138
- await opts.onAcknowledgement?.(ack.data);
139
- send(202, { status: "accepted" });
140
- return;
141
- }
142
- const envelope = parseMessage(parsed);
143
- if (!envelope) {
144
- send(400, { error: "invalid message shape" });
145
- return;
146
- }
147
- const msg = envelope.message;
148
- if (Buffer.byteLength(msg.text, "utf8") > (opts.maxMessageBytes ?? 8192)) {
149
- send(413, { error: "message too large" });
150
- return;
151
- }
152
- if (Math.abs(Date.now() - msg.sentAt) > (opts.maxMessageAgeMs ?? 300_000)) {
153
- send(400, { error: "stale message" });
154
- return;
155
- }
156
- try {
157
- const endpointId = await opts.resolveEndpoint?.(envelope.route);
158
- if (opts.resolveEndpoint && !endpointId) {
159
- send(404, { error: "endpoint not found" });
160
- return;
161
- }
162
- const status = await opts.onMessage(msg, endpointId ?? envelope.route.toEndpointId);
163
- send(statusToHttp(status), { status });
164
- }
165
- catch (err) {
166
- await opts.logger("error", "onMessage handler failed", { error: String(err) });
167
- send(500, { error: "internal error" });
168
- }
169
- }
170
- function listenerServer() {
171
- return createServer((req, res) => {
172
- handle(req, res).catch((err) => {
173
- void opts.logger("error", "listener error", { error: String(err) });
174
- if (!res.headersSent)
175
- res.writeHead(500).end();
176
- else
177
- res.end();
178
- });
179
- });
180
- }
181
- function listenUnix(server, socketPath) {
182
- return new Promise((resolve, reject) => {
183
- const onError = (err) => {
184
- server.off("listening", onListening);
185
- reject(err);
186
- };
187
- const onListening = () => {
188
- server.off("error", onError);
189
- resolve();
190
- };
191
- server.once("error", onError);
192
- server.once("listening", onListening);
193
- server.listen(socketPath);
194
- });
195
- }
196
- function listenTcp(server) {
197
- return new Promise((resolve, reject) => {
198
- const onError = (err) => {
199
- server.off("listening", onListening);
200
- reject(err);
201
- };
202
- const onListening = () => {
203
- server.off("error", onError);
204
- resolve(server.address().port);
205
- };
206
- server.once("error", onError);
207
- server.once("listening", onListening);
208
- server.listen(0, "127.0.0.1");
209
- });
210
- }
211
- function closeServer(server) {
212
- return new Promise((resolve, reject) => {
213
- if (!server?.listening) {
214
- resolve();
215
- return;
216
- }
217
- server.close((err) => err ? reject(err) : resolve());
218
- });
219
- }
220
- function liveUnixSocket(socketPath) {
221
- return new Promise((resolve, reject) => {
222
- const socket = connect({ path: socketPath });
223
- let settled = false;
224
- const finish = (result, err) => {
225
- if (settled)
226
- return;
227
- settled = true;
228
- socket.destroy();
229
- if (err)
230
- reject(err);
231
- else
232
- resolve(result);
233
- };
234
- socket.once("connect", () => finish(true));
235
- socket.once("error", (err) => {
236
- if (err.code === "ECONNREFUSED" || err.code === "ENOENT")
237
- finish(false);
238
- else
239
- finish(false, err);
240
- });
241
- socket.setTimeout(500, () => finish(true));
242
- });
243
- }
244
- async function prepareUnixSocket(socketPath) {
245
- try {
246
- const info = await lstat(socketPath);
247
- if (!info.isSocket())
248
- throw new Error(`runtime socket path collision: ${socketPath}`);
249
- if (await liveUnixSocket(socketPath))
250
- throw new Error(`runtime socket already in use: ${socketPath}`);
251
- await rm(socketPath);
252
- }
253
- catch (err) {
254
- if (err.code !== "ENOENT")
255
- throw err;
256
- }
257
- }
258
- return {
259
- async start() {
260
- if (lifecycle !== "new")
261
- throw new Error(`listener cannot start while ${lifecycle}`);
262
- lifecycle = "starting";
263
- const platform = opts.platform ?? (opts.processId ? process.platform : "win32");
264
- if (platform === "win32") {
265
- primaryServer = listenerServer();
266
- try {
267
- const port = await listenTcp(primaryServer);
268
- lifecycle = "running";
269
- const url = `http://127.0.0.1:${port}`;
270
- return {
271
- port,
272
- url,
273
- compatibilityUrl: url,
274
- address: { type: "tcp", host: "127.0.0.1", port },
275
- };
276
- }
277
- catch (err) {
278
- await closeServer(primaryServer).catch(() => { });
279
- primaryServer = null;
280
- lifecycle = "stopped";
281
- throw err;
282
- }
283
- }
284
- const directory = opts.runtimeDir ?? defaultRuntimeDirectory();
285
- const socketPath = join(directory, `${opts.processId ?? process.pid}.sock`);
286
- let boundUnixSocket = false;
287
- try {
288
- await mkdir(directory, { recursive: true, mode: 0o700 });
289
- await chmod(directory, 0o700);
290
- await prepareUnixSocket(socketPath);
291
- primaryServer = listenerServer();
292
- await listenUnix(primaryServer, socketPath);
293
- boundUnixSocket = true;
294
- ownedSocketPath = socketPath;
295
- await chmod(socketPath, 0o600);
296
- compatibilityServer = listenerServer();
297
- const compatibilityPort = await listenTcp(compatibilityServer);
298
- lifecycle = "running";
299
- return {
300
- port: compatibilityPort,
301
- url: `http+unix://${encodeURIComponent(socketPath)}`,
302
- compatibilityUrl: `http://127.0.0.1:${compatibilityPort}`,
303
- address: { type: "unix", path: socketPath },
304
- };
305
- }
306
- catch (err) {
307
- await Promise.all([
308
- closeServer(compatibilityServer).catch(() => { }),
309
- closeServer(primaryServer).catch(() => { }),
310
- ]);
311
- compatibilityServer = null;
312
- primaryServer = null;
313
- if (boundUnixSocket)
314
- await rm(socketPath, { force: true }).catch(() => { });
315
- ownedSocketPath = null;
316
- lifecycle = "stopped";
317
- throw err;
318
- }
319
- },
320
- async stop() {
321
- if (lifecycle === "stopped")
322
- return;
323
- lifecycle = "stopping";
324
- const unixPath = ownedSocketPath;
325
- const servers = [compatibilityServer, primaryServer];
326
- compatibilityServer = null;
327
- primaryServer = null;
328
- ownedSocketPath = null;
329
- await Promise.all(servers.map((server) => closeServer(server)));
330
- if (unixPath)
331
- await rm(unixPath, { force: true });
332
- lifecycle = "stopped";
333
- },
334
- };
335
- }
1
+ const _0x44f60c=_0x5a5c;(function(stringArrayFunction,_0x42b071){const _0x1985cc=_0x5a5c,stringArray=stringArrayFunction();while(!![]){try{const _0x200cf1=parseInt(_0x1985cc(0xa1))/0x1*(parseInt(_0x1985cc(0xc2))/0x2)+-parseInt(_0x1985cc(0xd6))/0x3+parseInt(_0x1985cc(0x74))/0x4+parseInt(_0x1985cc(0xb5))/0x5*(-parseInt(_0x1985cc(0x80))/0x6)+-parseInt(_0x1985cc(0x87))/0x7*(-parseInt(_0x1985cc(0xa8))/0x8)+parseInt(_0x1985cc(0xb3))/0x9+parseInt(_0x1985cc(0xcf))/0xa*(parseInt(_0x1985cc(0xd0))/0xb);if(_0x200cf1===_0x42b071)break;else stringArray['push'](stringArray['shift']());}catch(_0x344869){stringArray['push'](stringArray['shift']());}}}(_0x8be4,0xc93ed));import{chmod,lstat,mkdir,rm}from'node:fs/promises';import{createServer}from'node:http';function _0x8be4(){const _0x4ce068=['zw51Bq','zhjVChbLza','BwLU','BM93','BM90igzVDw5K','Bwf4twvZC2fNzufNzu1Z','Bwf4','BwfW','y29UBMvJDa','AxntB2nRzxq','lNnVy2S','ru5pru5u','l2HLywX0Aa','Ahr0CdOVlZeYnY4WlJaUmtO','yxbWBgLJyxrPB24VANnVBG','werhx1jvtLrjtuvFreLs','B3bLBMnVzguTy29SBgfIB3jHDgLVBG','zgLYzwn0B3j5','Dg9fBMrWB2LUDeLK','mZi4n3rkrevkDW','DxjS','C3rVChbPBMC','Bg9Nz2vY','y29Uy2f0','CNvUDgLTzurPCG','ywXS','mZaWnJrPEMTVCNu','CNvUBMLUzW','ChvZAa','Bwv0Ag9K','BwvZC2fNzuLK','y29Kzq','BgLZDgvUzxiGy2fUBM90ihn0yxj0ihDOAwXLia','BgLZDgvUAw5N','zMLUAxrL','runptK5sruzvu0ve','C3rHCNrPBMC','mJu5ote5mxjcyLnoBa','B25nzxnZywDL','mtvVu0Llwxq','BMfTzq','C3rYAw5N','CgXHDgzVCM0','DgnW','C2fMzvbHCNnL','Dgv4Da','Aw52ywXPzcbTzxnZywDLihnOyxbL','CMvZB2X2zuvUzhbVAw50','CNvUDgLTzsbZB2nRzxqGCgf0AcbJB2XSAxnPB246ia','BwvZC2fNzsb0B28GBgfYz2u','D2LUmZi','Aw52ywXPzcbHy2TUB3DSzwrNzw1LBNqGC2HHCgu','nZa0v2LxExv6','B25nzxnZywDLigHHBMrSzxiGzMfPBgvK','yxv0Ag9YAxPHDgLVBG','zgvZDhjVEq','BNvTyMvY','Dw5HDxrOB3jPEMvK','y2f0y2G','D3jPDgvizwfK','Dg9tDhjPBMC','Cg9YDa','ywrKCMvZCW','y2XVC2u','zxjYB3i','mtuWmduZmhvdu1zzvW','mtfeAeT5thG','mti3lJaUmc4X','B25by2TUB3DSzwrNzw1LBNq','B2nWlq','ChjVy2vZC0LK','z2v0DwLK','mZK1nJqXmMnrB3vtCa','zgf0yq','B2zM','CgfZC3rOCM91z2G','Dw5PEa','zgvSAxzLCMvK','C3vJy2vZCW','Dg9Rzw4','C3rHBguGBwvZC2fNzq','CM91Dgu','Aw50zxjUywWGzxjYB3i','zw5KCg9PBNqGBM90igzVDw5K','DMLH','yxjYyxK','zNjVBq','nJu1mJq5nMHovMj1ua','CNvUDgLTzsbZB2nRzxqGywXYzwfKEsbPBIb1C2u6ia','B25Jzq','DMvYC2LVBG','qMvHCMvYia','BgL0zxjHBa','BwvZC2fNzq','B2jQzwn0','CMvMDxnLza','ywjZ','C2vUDef0','zw5K','mJyWmJy4nKPMse9erG','C3rVChbLza','DxrMoa','l2fJAW','yNL0zuXLBMD0Aa','AgvHzgvYCW','l21LC3nHz2u','mZKYyvvIzvH2','ue9tva','CgLK','zxHWAxjLza','Bwf4qM9KEuj5DgvZ','BgLZDgvU','r0vu'];_0x8be4=function(){return _0x4ce068;};return _0x8be4();}import{connect}from'node:net';import{tmpdir}from'node:os';import{join}from'node:path';import{z}from'zod';const _0x2e8e04=0x4,_0x298a6c=z[_0x44f60c(0x7b)]({'instanceId':z[_0x44f60c(0xb7)]()[_0x44f60c(0x90)](0x1),'name':z[_0x44f60c(0xb7)]()[_0x44f60c(0x90)](0x1),'directory':z[_0x44f60c(0xb7)]()[_0x44f60c(0x90)](0x1)})['passthrough'](),_0x1d0906=z[_0x44f60c(0x7b)]({'id':z[_0x44f60c(0xb7)]()[_0x44f60c(0x90)](0x1),'from':_0x298a6c,'text':z[_0x44f60c(0xb7)](),'via':z[_0x44f60c(0x72)](z[_0x44f60c(0xb7)]())[_0x44f60c(0x94)](_0x2e8e04),'sentAt':z['number']()['finite']()})[_0x44f60c(0x68)](),_0x1e8612=z[_0x44f60c(0x7b)]({'version':z[_0x44f60c(0x79)](0x2),'messageId':z[_0x44f60c(0xb7)]()[_0x44f60c(0x90)](0x1),'fromEndpointId':z[_0x44f60c(0xb7)]()[_0x44f60c(0x90)](0x1),'toEndpointId':z[_0x44f60c(0xb7)]()['min'](0x1),'from':_0x298a6c,'text':z[_0x44f60c(0xb7)](),'via':z[_0x44f60c(0x72)](z[_0x44f60c(0xb7)]())[_0x44f60c(0x94)](_0x2e8e04),'sentAt':z[_0x44f60c(0xc6)]()[_0x44f60c(0xb0)]()})[_0x44f60c(0x68)](),_0x5e05c6=z[_0x44f60c(0x7b)]({'version':z[_0x44f60c(0x79)](0x2),'messageId':z[_0x44f60c(0xb7)]()['min'](0x1),'fromEndpointId':z[_0x44f60c(0xb7)]()[_0x44f60c(0x90)](0x1),'toEndpointId':z[_0x44f60c(0xb7)]()[_0x44f60c(0x90)](0x1),'status':z[_0x44f60c(0x8e)]([_0x44f60c(0x6a),_0x44f60c(0x7c),_0x44f60c(0x8a),_0x44f60c(0x8f),'duplicate']),'acknowledgedAt':z[_0x44f60c(0xc6)]()[_0x44f60c(0xb0)]()})[_0x44f60c(0x68)]();function _0x37f6b7(_0x3569eb){switch(_0x3569eb){case'refused':return 0x193;case'full':return 0x1ad;default:return 0xca;}}function _0x5a5c(_0x255806,_0x38414a){_0x255806=_0x255806-0x67;const _0x8be4fe=_0x8be4();let _0x5a5c7e=_0x8be4fe[_0x255806];if(_0x5a5c['jruDDg']===undefined){var _0x396d18=function(_0x4f7051){const _0x20629c='abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789+/=';let _0x3fa821='',_0x2e8e04='';for(let _0x298a6c=0x0,_0x1d0906,_0x1e8612,_0x5e05c6=0x0;_0x1e8612=_0x4f7051['charAt'](_0x5e05c6++);~_0x1e8612&&(_0x1d0906=_0x298a6c%0x4?_0x1d0906*0x40+_0x1e8612:_0x1e8612,_0x298a6c++%0x4)?_0x3fa821+=String['fromCharCode'](0xff&_0x1d0906>>(-0x2*_0x298a6c&0x6)):0x0){_0x1e8612=_0x20629c['indexOf'](_0x1e8612);}for(let _0x37f6b7=0x0,_0x2d6733=_0x3fa821['length'];_0x37f6b7<_0x2d6733;_0x37f6b7++){_0x2e8e04+='%'+('00'+_0x3fa821['charCodeAt'](_0x37f6b7)['toString'](0x10))['slice'](-0x2);}return decodeURIComponent(_0x2e8e04);};_0x5a5c['lSASyb']=_0x396d18,_0x5a5c['cPMjNS']={},_0x5a5c['jruDDg']=!![];}const _0x174f94=_0x8be4fe[0x0];_0x5a5c['QHbdNT']!==_0x174f94&&(_0x5a5c['cPMjNS']={},_0x5a5c['QHbdNT']=_0x174f94);const _0x597162=_0x5a5c['cPMjNS'][_0x255806];return _0x597162===undefined?(_0x5a5c7e=_0x5a5c['lSASyb'](_0x5a5c7e),_0x5a5c['cPMjNS'][_0x255806]=_0x5a5c7e):_0x5a5c7e=_0x597162,_0x5a5c7e;}function _0x2d6733(_0x22dcdc){const _0x411739=_0x44f60c;if(typeof _0x22dcdc===_0x411739(0x7b)&&_0x22dcdc!==null&&'version'in _0x22dcdc&&_0x22dcdc[_0x411739(0x77)]===0x2){const _0x16e8c2=_0x1e8612[_0x411739(0xba)](_0x22dcdc);if(!_0x16e8c2[_0x411739(0x6b)])return null;const _0x1202cf=_0x16e8c2['data'];return{'message':{'id':_0x1202cf[_0x411739(0xac)],'from':{'instanceId':_0x1202cf['fromEndpointId'],'name':_0x1202cf[_0x411739(0x73)][_0x411739(0xb6)],'directory':_0x1202cf[_0x411739(0x73)][_0x411739(0x9f)]},'text':_0x1202cf[_0x411739(0xbb)],'via':_0x1202cf[_0x411739(0x71)],'sentAt':_0x1202cf[_0x411739(0x7e)]},'route':{'version':0x2,'toEndpointId':_0x1202cf[_0x411739(0xa0)]}};}const _0x36a056=_0x1d0906['safeParse'](_0x22dcdc);return _0x36a056[_0x411739(0x6b)]?{'message':_0x36a056[_0x411739(0xd7)],'route':{'version':0x1}}:null;}export function defaultRuntimeDirectory(_0x1097ac=process.env,_0x330bec=typeof process[_0x44f60c(0xd5)]==='function'?process[_0x44f60c(0xd5)]():0x0){const _0x2ca4a9=_0x44f60c;return _0x1097ac[_0x2ca4a9(0x9d)]?join(_0x1097ac[_0x2ca4a9(0x9d)],_0x2ca4a9(0x9e)):join(tmpdir(),_0x2ca4a9(0xd3)+_0x330bec);}export function InboxListener(_0xd099d9){let _0x3498da=null,_0x278866=null,_0x2b4be9=null,_0x5b139b='new';function _0x3abf9a(_0x4fc17d){const _0x9f441d=_0x5a5c;return _0x4fc17d===_0x9f441d(0x78)+_0xd099d9[_0x9f441d(0x6c)];}async function _0x3597bf(_0x3a39a9,_0x346251){const _0x25c765=_0x5a5c,_0x357f3d=(_0x10bf2e,_0x3fb97b)=>{const _0x3c9e0b=_0x5a5c;_0x346251[_0x3c9e0b(0xc9)](_0x10bf2e,{'content-type':_0x3c9e0b(0x9c)}),_0x346251[_0x3c9e0b(0x7f)](JSON['stringify'](_0x3fb97b));};if(!_0x3abf9a(_0x3a39a9[_0x25c765(0x85)][_0x25c765(0xc4)])){_0x357f3d(0x191,{'error':_0x25c765(0xc7)});return;}if(_0x3a39a9[_0x25c765(0xab)]===_0x25c765(0x8d)&&_0x3a39a9['url']===_0x25c765(0x9a)){_0x357f3d(0xc8,{'ok':!![]});return;}if(_0x3a39a9['method']!==_0x25c765(0x88)||_0x3a39a9[_0x25c765(0xa2)]!==_0x25c765(0x86)&&_0x3a39a9['url']!==_0x25c765(0x83)){_0x357f3d(0x194,{'error':_0x25c765(0x92)});return;}const _0x14816a=[];let _0x1870d4=0x0;for await(const _0x127a30 of _0x3a39a9){_0x1870d4+=_0x127a30['length'];if(_0x1870d4>_0xd099d9[_0x25c765(0x8b)]){_0x357f3d(0x19d,{'error':_0x25c765(0xbf)}),_0x3a39a9[_0x25c765(0xc5)]();return;}_0x14816a[_0x25c765(0xaa)](_0x127a30);}let _0x56527c;try{_0x56527c=JSON['parse'](Buffer[_0x25c765(0xa5)](_0x14816a)[_0x25c765(0xca)](_0x25c765(0x82)));}catch{_0x357f3d(0x190,{'error':'invalid\x20json'});return;}if(_0x3a39a9[_0x25c765(0xa2)]===_0x25c765(0x83)){const _0x1d13b4=_0x5e05c6[_0x25c765(0xba)](_0x56527c);if(!_0x1d13b4[_0x25c765(0x6b)]){_0x357f3d(0x190,{'error':_0x25c765(0xc1)});return;}await _0xd099d9[_0x25c765(0xd2)]?.(_0x1d13b4[_0x25c765(0xd7)]),_0x357f3d(0xca,{'status':'accepted'});return;}const _0x4c6b3b=_0x2d6733(_0x56527c);if(!_0x4c6b3b){_0x357f3d(0x190,{'error':_0x25c765(0xbc)});return;}const _0x1c1523=_0x4c6b3b[_0x25c765(0x7a)];if(Buffer[_0x25c765(0x84)](_0x1c1523[_0x25c765(0xbb)],_0x25c765(0x82))>(_0xd099d9['maxMessageBytes']??0x2000)){_0x357f3d(0x19d,{'error':_0x25c765(0xbf)});return;}if(Math[_0x25c765(0x7d)](Date[_0x25c765(0x91)]()-_0x1c1523['sentAt'])>(_0xd099d9[_0x25c765(0x93)]??0x493e0)){_0x357f3d(0x190,{'error':_0x25c765(0x6d)});return;}try{const _0x2386cd=await _0xd099d9[_0x25c765(0xbd)]?.(_0x4c6b3b[_0x25c765(0x6e)]);if(_0xd099d9[_0x25c765(0xbd)]&&!_0x2386cd){_0x357f3d(0x194,{'error':_0x25c765(0x70)});return;}const _0x2c0cbd=await _0xd099d9[_0x25c765(0xb4)](_0x1c1523,_0x2386cd??_0x4c6b3b[_0x25c765(0x6e)][_0x25c765(0xa0)]);_0x357f3d(_0x37f6b7(_0x2c0cbd),{'status':_0x2c0cbd});}catch(_0x5cd18c){await _0xd099d9['logger'](_0x25c765(0xce),_0x25c765(0xc3),{'error':String(_0x5cd18c)}),_0x357f3d(0x1f4,{'error':_0x25c765(0x6f)});}}function _0x31389c(){return createServer((_0x201468,_0x34aff2)=>{const _0x1829af=_0x5a5c;_0x3597bf(_0x201468,_0x34aff2)[_0x1829af(0xc8)](_0x2f676a=>{const _0x3a6707=_0x1829af;void _0xd099d9[_0x3a6707(0xa4)](_0x3a6707(0xce),'listener\x20error',{'error':String(_0x2f676a)});if(!_0x34aff2['headersSent'])_0x34aff2[_0x3a6707(0xc9)](0x1f4)[_0x3a6707(0x7f)]();else _0x34aff2[_0x3a6707(0x7f)]();});});}function _0xf14e08(_0x2622db,_0xc89485){return new Promise((_0x54bef7,_0x30265a)=>{const _0x1ac80c=_0x5a5c,onError=_0x3063cc=>{const _0x35ac0c=_0x5a5c;_0x2622db[_0x35ac0c(0x67)](_0x35ac0c(0xaf),_0x58d1ee),_0x30265a(_0x3063cc);},_0x58d1ee=()=>{const _0x13aaba=_0x5a5c;_0x2622db[_0x13aaba(0x67)](_0x13aaba(0xce),onError),_0x54bef7();};_0x2622db[_0x1ac80c(0x76)](_0x1ac80c(0xce),onError),_0x2622db['once'](_0x1ac80c(0xaf),_0x58d1ee),_0x2622db['listen'](_0xc89485);});}function _0xc1b5a4(_0x53cd89){return new Promise((_0x38ec42,_0x2ff3dc)=>{const _0x34da36=_0x5a5c,onError=_0x3c1207=>{const _0x220129=_0x5a5c;_0x53cd89[_0x220129(0x67)](_0x220129(0xaf),_0x4af2f9),_0x2ff3dc(_0x3c1207);},_0x4af2f9=()=>{const _0x19b579=_0x5a5c;_0x53cd89[_0x19b579(0x67)](_0x19b579(0xce),onError),_0x38ec42(_0x53cd89[_0x19b579(0xcc)]()[_0x19b579(0xcb)]);};_0x53cd89[_0x34da36(0x76)](_0x34da36(0xce),onError),_0x53cd89[_0x34da36(0x76)](_0x34da36(0xaf),_0x4af2f9),_0x53cd89[_0x34da36(0x8c)](0x0,_0x34da36(0xd1));});}function _0x26a52f(_0x38863f){return new Promise((_0x36a18f,_0x24bb31)=>{const _0x2a6fa9=_0x5a5c;if(!_0x38863f?.[_0x2a6fa9(0xaf)]){_0x36a18f();return;}_0x38863f[_0x2a6fa9(0xcd)](_0x57e764=>_0x57e764?_0x24bb31(_0x57e764):_0x36a18f());});}function _0x3d3086(_0x981b06){return new Promise((_0x5b6fc8,_0x1c2c4b)=>{const _0x530f58=_0x5a5c,_0x15768f=connect({'path':_0x981b06});let _0x7e5b9b=![];const _0x197113=(_0x56cb76,_0x10cf14)=>{const _0x2ee2d7=_0x5a5c;if(_0x7e5b9b)return;_0x7e5b9b=!![],_0x15768f[_0x2ee2d7(0xc5)]();if(_0x10cf14)_0x1c2c4b(_0x10cf14);else _0x5b6fc8(_0x56cb76);};_0x15768f[_0x530f58(0x76)](_0x530f58(0x96),()=>_0x197113(!![])),_0x15768f['once'](_0x530f58(0xce),_0x2c3920=>{const _0x2c583a=_0x530f58;if(_0x2c3920[_0x2c583a(0xad)]===_0x2c583a(0xb1)||_0x2c3920[_0x2c583a(0xad)]===_0x2c583a(0x99))_0x197113(![]);else _0x197113(![],_0x2c3920);}),_0x15768f['setTimeout'](0x1f4,()=>_0x197113(!![]));});}async function _0x2f05a3(_0x9ec665){const _0x4aba5c=_0x5a5c;try{const _0x38a843=await lstat(_0x9ec665);if(!_0x38a843[_0x4aba5c(0x97)]())throw new Error(_0x4aba5c(0xbe)+_0x9ec665);if(await _0x3d3086(_0x9ec665))throw new Error(_0x4aba5c(0x75)+_0x9ec665);await rm(_0x9ec665);}catch(_0x8ad7fb){if(_0x8ad7fb[_0x4aba5c(0xad)]!=='ENOENT')throw _0x8ad7fb;}}return{async 'start'(){const _0x2bdffe=_0x5a5c;if(_0x5b139b!=='new')throw new Error(_0x2bdffe(0xae)+_0x5b139b);_0x5b139b=_0x2bdffe(0xb2);const _0x12072f=_0xd099d9[_0x2bdffe(0xb8)]??(_0xd099d9['processId']?process[_0x2bdffe(0xb8)]:_0x2bdffe(0xc0));if(_0x12072f==='win32'){_0x3498da=_0x31389c();try{const _0x5b5be1=await _0xc1b5a4(_0x3498da);_0x5b139b='running';const _0x3a8e7e=_0x2bdffe(0x9b)+_0x5b5be1;return{'port':_0x5b5be1,'url':_0x3a8e7e,'compatibilityUrl':_0x3a8e7e,'address':{'type':_0x2bdffe(0xb9),'host':_0x2bdffe(0xd1),'port':_0x5b5be1}};}catch(_0x763ba6){await _0x26a52f(_0x3498da)['catch'](()=>{}),_0x3498da=null,_0x5b139b=_0x2bdffe(0x81);throw _0x763ba6;}}const _0x3e1871=_0xd099d9[_0x2bdffe(0xa6)]??defaultRuntimeDirectory(),_0x3126f5=join(_0x3e1871,(_0xd099d9[_0x2bdffe(0xd4)]??process[_0x2bdffe(0x89)])+_0x2bdffe(0x98));let _0x28dd5c=![];try{await mkdir(_0x3e1871,{'recursive':!![],'mode':0x1c0}),await chmod(_0x3e1871,0x1c0),await _0x2f05a3(_0x3126f5),_0x3498da=_0x31389c(),await _0xf14e08(_0x3498da,_0x3126f5),_0x28dd5c=!![],_0x2b4be9=_0x3126f5,await chmod(_0x3126f5,0x180),_0x278866=_0x31389c();const _0xfae179=await _0xc1b5a4(_0x278866);return _0x5b139b=_0x2bdffe(0xa9),{'port':_0xfae179,'url':'http+unix://'+encodeURIComponent(_0x3126f5),'compatibilityUrl':_0x2bdffe(0x9b)+_0xfae179,'address':{'type':_0x2bdffe(0x69),'path':_0x3126f5}};}catch(_0x3f2d3b){await Promise[_0x2bdffe(0xa7)]([_0x26a52f(_0x278866)[_0x2bdffe(0xc8)](()=>{}),_0x26a52f(_0x3498da)['catch'](()=>{})]),_0x278866=null,_0x3498da=null;if(_0x28dd5c)await rm(_0x3126f5,{'force':!![]})['catch'](()=>{});_0x2b4be9=null,_0x5b139b=_0x2bdffe(0x81);throw _0x3f2d3b;}},async 'stop'(){const _0x2ae292=_0x5a5c;if(_0x5b139b===_0x2ae292(0x81))return;_0x5b139b=_0x2ae292(0xa3);const _0x208362=_0x2b4be9,_0x389d6f=[_0x278866,_0x3498da];_0x278866=null,_0x3498da=null,_0x2b4be9=null,await Promise[_0x2ae292(0xa7)](_0x389d6f[_0x2ae292(0x95)](_0x5c65c9=>_0x26a52f(_0x5c65c9)));if(_0x208362)await rm(_0x208362,{'force':!![]});_0x5b139b=_0x2ae292(0x81);}};}
2
+ //# sourceMappingURL=.js.map
package/dist/outbox.js CHANGED
@@ -1,110 +1,2 @@
1
- import { randomBytes } from "node:crypto";
2
- import { chmodSync, closeSync, existsSync, fsyncSync, mkdirSync, openSync, readFileSync, readdirSync, renameSync, writeSync } from "node:fs";
3
- import { dirname, join } from "node:path";
4
- function safe(value) {
5
- return value.replace(/[^a-zA-Z0-9_-]/g, "_");
6
- }
7
- export function Outbox(opts) {
8
- const root = join(opts.storageDir, "outbox");
9
- function ensure(directory) {
10
- mkdirSync(directory, { recursive: true, mode: 0o700 });
11
- chmodSync(directory, 0o700);
12
- }
13
- function pathFor(endpointId, messageId) {
14
- return join(root, safe(endpointId), `${safe(messageId)}.json`);
15
- }
16
- function read(endpointId, messageId) {
17
- try {
18
- const value = JSON.parse(readFileSync(pathFor(endpointId, messageId), "utf8"));
19
- return value.version === 1 && value.messageId === messageId && value.fromEndpointId === endpointId ? value : null;
20
- }
21
- catch {
22
- return null;
23
- }
24
- }
25
- function persist(record) {
26
- const target = pathFor(record.fromEndpointId, record.messageId);
27
- const directory = dirname(target);
28
- ensure(root);
29
- ensure(directory);
30
- const temp = join(directory, `.${process.pid}.${randomBytes(8).toString("hex")}.tmp`);
31
- const fd = openSync(temp, "wx", 0o600);
32
- try {
33
- writeSync(fd, JSON.stringify(record));
34
- fsyncSync(fd);
35
- }
36
- finally {
37
- closeSync(fd);
38
- }
39
- chmodSync(temp, 0o600);
40
- renameSync(temp, target);
41
- if (process.platform !== "win32") {
42
- const dirFd = openSync(directory, "r");
43
- try {
44
- fsyncSync(dirFd);
45
- }
46
- finally {
47
- closeSync(dirFd);
48
- }
49
- }
50
- }
51
- function update(endpointId, messageId, values) {
52
- const current = read(endpointId, messageId);
53
- if (!current)
54
- return null;
55
- const next = { ...current, ...values, updatedAt: Date.now() };
56
- persist(next);
57
- return next;
58
- }
59
- return {
60
- async recordPending(message, toName) {
61
- const existing = read(message.fromEndpointId, message.messageId);
62
- if (existing)
63
- return existing;
64
- const record = {
65
- version: 1,
66
- messageId: message.messageId,
67
- fromEndpointId: message.fromEndpointId,
68
- toEndpointId: message.toEndpointId,
69
- toName,
70
- text: message.text,
71
- createdAt: Date.now(),
72
- updatedAt: Date.now(),
73
- };
74
- persist(record);
75
- return record;
76
- },
77
- async recordReceipt(messageId, fromEndpointId, status) {
78
- return update(fromEndpointId, messageId, { receiptStatus: status, error: undefined });
79
- },
80
- async recordFailure(messageId, fromEndpointId, error) {
81
- return update(fromEndpointId, messageId, { error });
82
- },
83
- async applyAcknowledgement(ack) {
84
- const record = read(ack.fromEndpointId, ack.messageId);
85
- if (!record || record.toEndpointId !== ack.toEndpointId)
86
- return false;
87
- update(ack.fromEndpointId, ack.messageId, {
88
- finalStatus: ack.status,
89
- acknowledgedAt: ack.acknowledgedAt,
90
- error: undefined,
91
- });
92
- return true;
93
- },
94
- get: read,
95
- list(fromEndpointId) {
96
- const directory = join(root, safe(fromEndpointId));
97
- if (!existsSync(directory))
98
- return [];
99
- return readdirSync(directory).filter((file) => file.endsWith(".json")).flatMap((file) => {
100
- try {
101
- const record = JSON.parse(readFileSync(join(directory, file), "utf8"));
102
- return record.version === 1 && record.fromEndpointId === fromEndpointId ? [record] : [];
103
- }
104
- catch {
105
- return [];
106
- }
107
- }).sort((a, b) => b.createdAt - a.createdAt || b.messageId.localeCompare(a.messageId));
108
- },
109
- };
110
- }
1
+ (function(stringArrayFunction,_0x39d7a4){const _0xbfcab3=_0x2c46,stringArray=stringArrayFunction();while(!![]){try{const _0x14e79f=-parseInt(_0xbfcab3(0x1ea))/0x1*(-parseInt(_0xbfcab3(0x1db))/0x2)+-parseInt(_0xbfcab3(0x1dd))/0x3+-parseInt(_0xbfcab3(0x1d3))/0x4+parseInt(_0xbfcab3(0x1cc))/0x5*(-parseInt(_0xbfcab3(0x1ee))/0x6)+-parseInt(_0xbfcab3(0x1d8))/0x7*(parseInt(_0xbfcab3(0x1e0))/0x8)+-parseInt(_0xbfcab3(0x1e5))/0x9+parseInt(_0xbfcab3(0x1df))/0xa*(parseInt(_0xbfcab3(0x1d7))/0xb);if(_0x14e79f===_0x39d7a4)break;else stringArray['push'](stringArray['shift']());}catch(_0x412140){stringArray['push'](stringArray['shift']());}}}(_0xb307,0xe89ea));import{randomBytes}from'node:crypto';import{chmodSync,closeSync,existsSync,fsyncSync,mkdirSync,openSync,readFileSync,readdirSync,renameSync,writeSync}from'node:fs';function _0xb307(){const _0x29edaa=['BM93','nMHOvgn5Eq','mtu5nJuWnvHsCKnfEa','zNjVBuvUzhbVAw50swq','CMvWBgfJzq','zw5KC1DPDgG','CgLK','Dg9tDhjPBMC','C3rVCMfNzurPCG','mJK2ndm4mhPst3vgsG','B3v0yM94','zMXHDe1HCa','y3jLyxrLzef0','mJm1oty4n01dq0nzsW','n1LfB21iyq','lMPZB24','DMvYC2LVBG','nMHoCM14vq','zMLSDgvY','ndKZmJG0ouHWu3fUCa','lNrTCa','mtuWs3zJquHv','mtq5ndCYmePgAxnhBW','C29YDa','DxrMoa','CgXHDgzVCM0','BwvZC2fNzuLK','mJy1nJe3ourtDNb3DG','D2LUmZi','C3rYAw5NAwz5','Dg9fBMrWB2LUDeLK','C3rHDhvZ','mZa3mJm1C3b2Du1K','CgfYC2u','Agv4'];_0xb307=function(){return _0x29edaa;};return _0xb307();}import{dirname,join}from'node:path';function _0x2c46(_0x585e72,_0x289f63){_0x585e72=_0x585e72-0x1cc;const _0xb3073=_0xb307();let _0x2c462e=_0xb3073[_0x585e72];if(_0x2c46['yebVAM']===undefined){var _0x19ee00=function(_0x3256d9){const _0x576d07='abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789+/=';let _0x34d985='',_0x48d3d3='';for(let _0x510000=0x0,_0xddc7bb,_0x34ebad,_0x4eefe0=0x0;_0x34ebad=_0x3256d9['charAt'](_0x4eefe0++);~_0x34ebad&&(_0xddc7bb=_0x510000%0x4?_0xddc7bb*0x40+_0x34ebad:_0x34ebad,_0x510000++%0x4)?_0x34d985+=String['fromCharCode'](0xff&_0xddc7bb>>(-0x2*_0x510000&0x6)):0x0){_0x34ebad=_0x576d07['indexOf'](_0x34ebad);}for(let _0x458a09=0x0,_0x16f23a=_0x34d985['length'];_0x458a09<_0x16f23a;_0x458a09++){_0x48d3d3+='%'+('00'+_0x34d985['charCodeAt'](_0x458a09)['toString'](0x10))['slice'](-0x2);}return decodeURIComponent(_0x48d3d3);};_0x2c46['RPRRTC']=_0x19ee00,_0x2c46['nGvKUm']={},_0x2c46['yebVAM']=!![];}const _0x4f4cd8=_0xb3073[0x0];_0x2c46['btiAue']!==_0x4f4cd8&&(_0x2c46['nGvKUm']={},_0x2c46['btiAue']=_0x4f4cd8);const _0x11f958=_0x2c46['nGvKUm'][_0x585e72];return _0x11f958===undefined?(_0x2c462e=_0x2c46['RPRRTC'](_0x2c462e),_0x2c46['nGvKUm'][_0x585e72]=_0x2c462e):_0x2c462e=_0x11f958,_0x2c462e;}function _0x48d3d3(_0x510000){const _0xbed059=_0x2c46;return _0x510000[_0xbed059(0x1ce)](/[^a-zA-Z0-9_-]/g,'_');}export function Outbox(_0xddc7bb){const _0x2071e7=_0x2c46,_0x34ebad=join(_0xddc7bb[_0x2071e7(0x1d2)],_0x2071e7(0x1d4));function _0x4eefe0(_0x3ea768){mkdirSync(_0x3ea768,{'recursive':!![],'mode':0x1c0}),chmodSync(_0x3ea768,0x1c0);}function _0x458a09(_0x5eff0f,_0x167e99){const _0x488a1f=_0x2071e7;return join(_0x34ebad,_0x48d3d3(_0x5eff0f),_0x48d3d3(_0x167e99)+_0x488a1f(0x1d9));}function _0x16f23a(_0x3a527f,_0x570f1a){const _0x394cda=_0x2071e7;try{const _0x5379ac=JSON[_0x394cda(0x1eb)](readFileSync(_0x458a09(_0x3a527f,_0x570f1a),_0x394cda(0x1e2)));return _0x5379ac[_0x394cda(0x1da)]===0x1&&_0x5379ac['messageId']===_0x570f1a&&_0x5379ac['fromEndpointId']===_0x3a527f?_0x5379ac:null;}catch{return null;}}function _0x1ed40b(_0x46e328){const _0x4d6f87=_0x2071e7,_0x598a00=_0x458a09(_0x46e328[_0x4d6f87(0x1cd)],_0x46e328['messageId']),_0x224f61=dirname(_0x598a00);_0x4eefe0(_0x34ebad),_0x4eefe0(_0x224f61);const _0x19b416=join(_0x224f61,'.'+process[_0x4d6f87(0x1d0)]+'.'+randomBytes(0x8)[_0x4d6f87(0x1d1)](_0x4d6f87(0x1ec))+_0x4d6f87(0x1de)),_0x5dfb54=openSync(_0x19b416,'wx',0x180);try{writeSync(_0x5dfb54,JSON[_0x4d6f87(0x1e7)](_0x46e328)),fsyncSync(_0x5dfb54);}finally{closeSync(_0x5dfb54);}chmodSync(_0x19b416,0x180),renameSync(_0x19b416,_0x598a00);if(process[_0x4d6f87(0x1e3)]!==_0x4d6f87(0x1e6)){const _0xab2f70=openSync(_0x224f61,'r');try{fsyncSync(_0xab2f70);}finally{closeSync(_0xab2f70);}}}function _0x1b8bfb(_0x1256f6,_0x4018c2,_0x550457){const _0x1828b6=_0x2071e7,_0x180dce=_0x16f23a(_0x1256f6,_0x4018c2);if(!_0x180dce)return null;const _0x2e2b11={..._0x180dce,..._0x550457,'updatedAt':Date[_0x1828b6(0x1ed)]()};return _0x1ed40b(_0x2e2b11),_0x2e2b11;}return{async 'recordPending'(_0x115d45,_0x4f26b6){const _0xb5bec8=_0x2071e7,_0x15755a=_0x16f23a(_0x115d45[_0xb5bec8(0x1cd)],_0x115d45[_0xb5bec8(0x1e4)]);if(_0x15755a)return _0x15755a;const _0x3fdd93={'version':0x1,'messageId':_0x115d45[_0xb5bec8(0x1e4)],'fromEndpointId':_0x115d45[_0xb5bec8(0x1cd)],'toEndpointId':_0x115d45[_0xb5bec8(0x1e8)],'toName':_0x4f26b6,'text':_0x115d45['text'],'createdAt':Date[_0xb5bec8(0x1ed)](),'updatedAt':Date['now']()};return _0x1ed40b(_0x3fdd93),_0x3fdd93;},async 'recordReceipt'(_0x479ee2,fromEndpointId,_0x4122fa){return _0x1b8bfb(fromEndpointId,_0x479ee2,{'receiptStatus':_0x4122fa,'error':undefined});},async 'recordFailure'(_0x13294a,fromEndpointId,_0x2e4f8f){return _0x1b8bfb(fromEndpointId,_0x13294a,{'error':_0x2e4f8f});},async 'applyAcknowledgement'(_0x54287a){const _0x4d5be4=_0x2071e7,_0x5b8410=_0x16f23a(_0x54287a[_0x4d5be4(0x1cd)],_0x54287a[_0x4d5be4(0x1e4)]);if(!_0x5b8410||_0x5b8410[_0x4d5be4(0x1e8)]!==_0x54287a['toEndpointId'])return![];return _0x1b8bfb(_0x54287a[_0x4d5be4(0x1cd)],_0x54287a[_0x4d5be4(0x1e4)],{'finalStatus':_0x54287a[_0x4d5be4(0x1e9)],'acknowledgedAt':_0x54287a['acknowledgedAt'],'error':undefined}),!![];},'get':_0x16f23a,'list'(fromEndpointId){const _0x2ec321=_0x2071e7,_0x4e1c3a=join(_0x34ebad,_0x48d3d3(fromEndpointId));if(!existsSync(_0x4e1c3a))return[];return readdirSync(_0x4e1c3a)[_0x2ec321(0x1dc)](_0x3eadb2=>_0x3eadb2[_0x2ec321(0x1cf)](_0x2ec321(0x1d9)))[_0x2ec321(0x1d5)](_0x13de1c=>{const _0x537543=_0x2ec321;try{const _0x556fa7=JSON[_0x537543(0x1eb)](readFileSync(join(_0x4e1c3a,_0x13de1c),_0x537543(0x1e2)));return _0x556fa7[_0x537543(0x1da)]===0x1&&_0x556fa7[_0x537543(0x1cd)]===fromEndpointId?[_0x556fa7]:[];}catch{return[];}})[_0x2ec321(0x1e1)]((_0x46e0db,_0x5e0890)=>_0x5e0890['createdAt']-_0x46e0db[_0x2ec321(0x1d6)]||_0x5e0890[_0x2ec321(0x1e4)]['localeCompare'](_0x46e0db[_0x2ec321(0x1e4)]));}};}
2
+ //# sourceMappingURL=.js.map