@moxxy/plugin-channel-http 0.28.1 → 0.29.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/channel.d.ts.map +1 -1
- package/dist/channel.js +16 -9
- package/dist/channel.js.map +1 -1
- package/package.json +9 -9
- package/src/channel.ts +13 -8
- package/src/router.test.ts +34 -15
package/dist/channel.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"channel.d.ts","sourceRoot":"","sources":["../src/channel.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,aAAa,IAAI,OAAO,EAAE,MAAM,YAAY,CAAC;AAC3D,OAAO,KAAK,EACV,OAAO,EACP,aAAa,EACb,oBAAoB,EACpB,kBAAkB,EACnB,MAAM,YAAY,CAAC;AAOpB,MAAM,WAAW,kBAAkB;IACjC,QAAQ,CAAC,IAAI,CAAC,EAAE,MAAM,CAAC;IACvB,QAAQ,CAAC,IAAI,CAAC,EAAE,MAAM,CAAC;IACvB,6FAA6F;IAC7F,QAAQ,CAAC,SAAS,CAAC,EAAE,MAAM,CAAC;IAC5B;0EACsE;IACtE,QAAQ,CAAC,kBAAkB,CAAC,EAAE,MAAM,CAAC;IACrC;;;;iBAIa;IACb,QAAQ,CAAC,aAAa,CAAC,EAAE,MAAM,CAAC;IAChC;;;;;OAKG;IACH,QAAQ,CAAC,YAAY,CAAC,EAAE,aAAa,CAAC,MAAM,CAAC,CAAC;IAC9C,QAAQ,CAAC,MAAM,CAAC,EAAE;QAChB,IAAI,CAAC,CAAC,GAAG,EAAE,MAAM,EAAE,IAAI,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,IAAI,CAAC;QACzD,IAAI,CAAC,CAAC,GAAG,EAAE,MAAM,EAAE,IAAI,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,IAAI,CAAC;KAC1D,CAAC;CACH;AAED,MAAM,WAAW,aAAc,SAAQ,oBAAoB;IACzD,QAAQ,CAAC,OAAO,EAAE,OAAO,CAAC;CAC3B;AAED,qBAAa,WAAY,YAAW,OAAO,CAAC,aAAa,CAAC;IACxD,QAAQ,CAAC,IAAI,UAAU;IACvB,QAAQ,CAAC,kBAAkB,EAAE,kBAAkB,CAAC;IAChD,OAAO,CAAC,QAAQ,CAAC,IAAI,CAAS;IAC9B,OAAO,CAAC,QAAQ,CAAC,IAAI,CAAS;IAC9B,OAAO,CAAC,QAAQ,CAAC,SAAS,CAAgB;IAC1C,OAAO,CAAC,QAAQ,CAAC,kBAAkB,CAAS;IAC5C,OAAO,CAAC,QAAQ,CAAC,aAAa,CAAqB;IACnD,OAAO,CAAC,QAAQ,CAAC,MAAM,CAA+B;IACtD,OAAO,CAAC,MAAM,CAAuB;IACrC,OAAO,CAAC,cAAc,CAAK;IAE3B;;mFAE+E;IAC/E,IAAI,SAAS,IAAI,MAAM,CAEtB;gBAEW,IAAI,GAAE,kBAAuB;IAoBnC,KAAK,CAAC,SAAS,EAAE,aAAa,GAAG,OAAO,CAAC,aAAa,CAAC;
|
|
1
|
+
{"version":3,"file":"channel.d.ts","sourceRoot":"","sources":["../src/channel.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,aAAa,IAAI,OAAO,EAAE,MAAM,YAAY,CAAC;AAC3D,OAAO,KAAK,EACV,OAAO,EACP,aAAa,EACb,oBAAoB,EACpB,kBAAkB,EACnB,MAAM,YAAY,CAAC;AAOpB,MAAM,WAAW,kBAAkB;IACjC,QAAQ,CAAC,IAAI,CAAC,EAAE,MAAM,CAAC;IACvB,QAAQ,CAAC,IAAI,CAAC,EAAE,MAAM,CAAC;IACvB,6FAA6F;IAC7F,QAAQ,CAAC,SAAS,CAAC,EAAE,MAAM,CAAC;IAC5B;0EACsE;IACtE,QAAQ,CAAC,kBAAkB,CAAC,EAAE,MAAM,CAAC;IACrC;;;;iBAIa;IACb,QAAQ,CAAC,aAAa,CAAC,EAAE,MAAM,CAAC;IAChC;;;;;OAKG;IACH,QAAQ,CAAC,YAAY,CAAC,EAAE,aAAa,CAAC,MAAM,CAAC,CAAC;IAC9C,QAAQ,CAAC,MAAM,CAAC,EAAE;QAChB,IAAI,CAAC,CAAC,GAAG,EAAE,MAAM,EAAE,IAAI,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,IAAI,CAAC;QACzD,IAAI,CAAC,CAAC,GAAG,EAAE,MAAM,EAAE,IAAI,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,IAAI,CAAC;KAC1D,CAAC;CACH;AAED,MAAM,WAAW,aAAc,SAAQ,oBAAoB;IACzD,QAAQ,CAAC,OAAO,EAAE,OAAO,CAAC;CAC3B;AAED,qBAAa,WAAY,YAAW,OAAO,CAAC,aAAa,CAAC;IACxD,QAAQ,CAAC,IAAI,UAAU;IACvB,QAAQ,CAAC,kBAAkB,EAAE,kBAAkB,CAAC;IAChD,OAAO,CAAC,QAAQ,CAAC,IAAI,CAAS;IAC9B,OAAO,CAAC,QAAQ,CAAC,IAAI,CAAS;IAC9B,OAAO,CAAC,QAAQ,CAAC,SAAS,CAAgB;IAC1C,OAAO,CAAC,QAAQ,CAAC,kBAAkB,CAAS;IAC5C,OAAO,CAAC,QAAQ,CAAC,aAAa,CAAqB;IACnD,OAAO,CAAC,QAAQ,CAAC,MAAM,CAA+B;IACtD,OAAO,CAAC,MAAM,CAAuB;IACrC,OAAO,CAAC,cAAc,CAAK;IAE3B;;mFAE+E;IAC/E,IAAI,SAAS,IAAI,MAAM,CAEtB;gBAEW,IAAI,GAAE,kBAAuB;IAoBnC,KAAK,CAAC,SAAS,EAAE,aAAa,GAAG,OAAO,CAAC,aAAa,CAAC;CAkI9D"}
|
package/dist/channel.js
CHANGED
|
@@ -74,7 +74,9 @@ export class HttpChannel {
|
|
|
74
74
|
catch (err) {
|
|
75
75
|
// Log the full error server-side; return a generic message so internal
|
|
76
76
|
// paths/provider details can't leak to a (possibly remote) caller.
|
|
77
|
-
this.logger
|
|
77
|
+
const logger = this.logger;
|
|
78
|
+
if (logger?.warn)
|
|
79
|
+
logger.warn('http handler threw', { err: String(err) });
|
|
78
80
|
if (!res.headersSent) {
|
|
79
81
|
res.writeHead(500, { 'content-type': 'application/json' });
|
|
80
82
|
res.end(JSON.stringify({ error: 'internal' }));
|
|
@@ -122,16 +124,20 @@ export class HttpChannel {
|
|
|
122
124
|
// `running` promise so callers awaiting it observe the crash instead of
|
|
123
125
|
// mistaking it for a clean shutdown.
|
|
124
126
|
server.on('error', (err) => {
|
|
125
|
-
this.logger
|
|
127
|
+
const logger = this.logger;
|
|
128
|
+
if (logger?.warn)
|
|
129
|
+
logger.warn('http server error', { err: String(err) });
|
|
126
130
|
rejectRunning(err);
|
|
127
131
|
});
|
|
128
132
|
const addr = server.address();
|
|
129
133
|
this.boundPortValue = typeof addr === 'object' && addr ? addr.port : this.port;
|
|
130
|
-
this.logger
|
|
131
|
-
|
|
132
|
-
|
|
133
|
-
|
|
134
|
-
|
|
134
|
+
const logger = this.logger;
|
|
135
|
+
if (logger?.info)
|
|
136
|
+
logger.info('http channel listening', {
|
|
137
|
+
host: this.host,
|
|
138
|
+
port: this.boundPortValue,
|
|
139
|
+
authEnabled: this.authToken !== null,
|
|
140
|
+
});
|
|
135
141
|
resolve();
|
|
136
142
|
});
|
|
137
143
|
});
|
|
@@ -152,8 +158,9 @@ export class HttpChannel {
|
|
|
152
158
|
if (!srv)
|
|
153
159
|
return resolve();
|
|
154
160
|
srv.close((err) => {
|
|
155
|
-
|
|
156
|
-
|
|
161
|
+
const logger = this.logger;
|
|
162
|
+
if (err && logger?.warn)
|
|
163
|
+
logger.warn('http server close error', { err: String(err) });
|
|
157
164
|
resolve();
|
|
158
165
|
});
|
|
159
166
|
});
|
package/dist/channel.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"channel.js","sourceRoot":"","sources":["../src/channel.ts"],"names":[],"mappings":"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
|
|
1
|
+
{"version":3,"file":"channel.js","sourceRoot":"","sources":["../src/channel.ts"],"names":[],"mappings":"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"}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@moxxy/plugin-channel-http",
|
|
3
|
-
"version": "0.
|
|
3
|
+
"version": "0.29.0",
|
|
4
4
|
"description": "Request-response HTTP channel for moxxy. POST /v1/turn drives one turn synchronously; POST /v1/turn/stream returns Server-Sent Events. Bearer-token auth + allow-list permission flow (no human in the loop).",
|
|
5
5
|
"keywords": [
|
|
6
6
|
"moxxy",
|
|
@@ -57,19 +57,19 @@
|
|
|
57
57
|
},
|
|
58
58
|
"dependencies": {
|
|
59
59
|
"zod": "^3.24.0",
|
|
60
|
-
"@moxxy/sdk": "0.
|
|
60
|
+
"@moxxy/sdk": "0.29.0"
|
|
61
61
|
},
|
|
62
62
|
"devDependencies": {
|
|
63
63
|
"@types/node": "^22.10.0",
|
|
64
64
|
"typescript": "^5.7.3",
|
|
65
65
|
"vitest": "^2.1.8",
|
|
66
|
-
"@moxxy/
|
|
67
|
-
"@moxxy/
|
|
68
|
-
"@moxxy/testing": "0.0.
|
|
69
|
-
"@moxxy/runner": "0.2.
|
|
70
|
-
"@moxxy/tools-builtin": "0.0.
|
|
71
|
-
"@moxxy/
|
|
72
|
-
"@moxxy/
|
|
66
|
+
"@moxxy/core": "0.29.0",
|
|
67
|
+
"@moxxy/mode-default": "0.29.0",
|
|
68
|
+
"@moxxy/testing": "0.0.48",
|
|
69
|
+
"@moxxy/runner": "0.2.34",
|
|
70
|
+
"@moxxy/tools-builtin": "0.0.43",
|
|
71
|
+
"@moxxy/vitest-preset": "0.0.0",
|
|
72
|
+
"@moxxy/tsconfig": "0.0.0"
|
|
73
73
|
},
|
|
74
74
|
"scripts": {
|
|
75
75
|
"build": "tsc -p tsconfig.json",
|
package/src/channel.ts
CHANGED
|
@@ -121,7 +121,8 @@ export class HttpChannel implements Channel<HttpStartOpts> {
|
|
|
121
121
|
} catch (err) {
|
|
122
122
|
// Log the full error server-side; return a generic message so internal
|
|
123
123
|
// paths/provider details can't leak to a (possibly remote) caller.
|
|
124
|
-
this.logger
|
|
124
|
+
const logger = this.logger;
|
|
125
|
+
if (logger?.warn) logger.warn('http handler threw', { err: String(err) });
|
|
125
126
|
if (!res.headersSent) {
|
|
126
127
|
res.writeHead(500, { 'content-type': 'application/json' });
|
|
127
128
|
res.end(JSON.stringify({ error: 'internal' }));
|
|
@@ -169,16 +170,19 @@ export class HttpChannel implements Channel<HttpStartOpts> {
|
|
|
169
170
|
// `running` promise so callers awaiting it observe the crash instead of
|
|
170
171
|
// mistaking it for a clean shutdown.
|
|
171
172
|
server.on('error', (err: unknown) => {
|
|
172
|
-
this.logger
|
|
173
|
+
const logger = this.logger;
|
|
174
|
+
if (logger?.warn) logger.warn('http server error', { err: String(err) });
|
|
173
175
|
rejectRunning(err);
|
|
174
176
|
});
|
|
175
177
|
const addr = server.address();
|
|
176
178
|
this.boundPortValue = typeof addr === 'object' && addr ? addr.port : this.port;
|
|
177
|
-
this.logger
|
|
178
|
-
|
|
179
|
-
|
|
180
|
-
|
|
181
|
-
|
|
179
|
+
const logger = this.logger;
|
|
180
|
+
if (logger?.info)
|
|
181
|
+
logger.info('http channel listening', {
|
|
182
|
+
host: this.host,
|
|
183
|
+
port: this.boundPortValue,
|
|
184
|
+
authEnabled: this.authToken !== null,
|
|
185
|
+
});
|
|
182
186
|
resolve();
|
|
183
187
|
});
|
|
184
188
|
});
|
|
@@ -201,7 +205,8 @@ export class HttpChannel implements Channel<HttpStartOpts> {
|
|
|
201
205
|
await new Promise<void>((resolve) => {
|
|
202
206
|
if (!srv) return resolve();
|
|
203
207
|
srv.close((err) => {
|
|
204
|
-
|
|
208
|
+
const logger = this.logger;
|
|
209
|
+
if (err && logger?.warn) logger.warn('http server close error', { err: String(err) });
|
|
205
210
|
resolve();
|
|
206
211
|
});
|
|
207
212
|
});
|
package/src/router.test.ts
CHANGED
|
@@ -3,7 +3,7 @@ import type { IncomingMessage, ServerResponse } from 'node:http';
|
|
|
3
3
|
import { Readable } from 'node:stream';
|
|
4
4
|
import { Socket } from 'node:net';
|
|
5
5
|
import { Session, silentLogger } from '@moxxy/core';
|
|
6
|
-
import { defineTranscriber } from '@moxxy/sdk';
|
|
6
|
+
import { assertDefined, defineTranscriber } from '@moxxy/sdk';
|
|
7
7
|
import type { ClientSession } from '@moxxy/sdk';
|
|
8
8
|
import {
|
|
9
9
|
routeRequest,
|
|
@@ -80,7 +80,9 @@ function makeResponse(): ServerResponse & {
|
|
|
80
80
|
},
|
|
81
81
|
on(event: string, fn: (...args: unknown[]) => void) {
|
|
82
82
|
if (!listeners.has(event)) listeners.set(event, new Set());
|
|
83
|
-
listeners.get(event)
|
|
83
|
+
const set = listeners.get(event);
|
|
84
|
+
assertDefined(set, 'listener set exists after ensure');
|
|
85
|
+
set.add(fn);
|
|
84
86
|
return this;
|
|
85
87
|
},
|
|
86
88
|
once(event: string, fn: (...args: unknown[]) => void) {
|
|
@@ -89,7 +91,9 @@ function makeResponse(): ServerResponse & {
|
|
|
89
91
|
fn(...args);
|
|
90
92
|
};
|
|
91
93
|
if (!listeners.has(event)) listeners.set(event, new Set());
|
|
92
|
-
listeners.get(event)
|
|
94
|
+
const set = listeners.get(event);
|
|
95
|
+
assertDefined(set, 'listener set exists after ensure');
|
|
96
|
+
set.add(wrap);
|
|
93
97
|
return this;
|
|
94
98
|
},
|
|
95
99
|
off(event: string, fn: (...args: unknown[]) => void) {
|
|
@@ -255,7 +259,8 @@ describe('handleTurn — client-disconnect abort (u70-1)', () => {
|
|
|
255
259
|
resolveClosed();
|
|
256
260
|
return (async function* () {
|
|
257
261
|
await new Promise<void>((resolve) => {
|
|
258
|
-
opts?.signal
|
|
262
|
+
const signal = opts?.signal;
|
|
263
|
+
signal?.addEventListener('abort', () => resolve());
|
|
259
264
|
});
|
|
260
265
|
})();
|
|
261
266
|
},
|
|
@@ -276,9 +281,10 @@ describe('handleTurn — client-disconnect abort (u70-1)', () => {
|
|
|
276
281
|
// Wait until runTurn is in-flight, then simulate the client disconnect.
|
|
277
282
|
await sawSignal;
|
|
278
283
|
expect(capturedSignal).toBeDefined();
|
|
279
|
-
|
|
284
|
+
assertDefined(capturedSignal, 'an abort signal was captured');
|
|
285
|
+
expect(capturedSignal.aborted).toBe(false);
|
|
280
286
|
res._emit('close');
|
|
281
|
-
expect(capturedSignal
|
|
287
|
+
expect(capturedSignal.aborted).toBe(true);
|
|
282
288
|
|
|
283
289
|
await handlerDone;
|
|
284
290
|
// The close listener is detached after the turn settles (no leak).
|
|
@@ -323,7 +329,10 @@ describe('driveTurn', () => {
|
|
|
323
329
|
signal = opts?.signal;
|
|
324
330
|
started();
|
|
325
331
|
return (async function* () {
|
|
326
|
-
await new Promise<void>((resolve) =>
|
|
332
|
+
await new Promise<void>((resolve) => {
|
|
333
|
+
const sig = opts?.signal;
|
|
334
|
+
sig?.addEventListener('abort', () => resolve());
|
|
335
|
+
});
|
|
327
336
|
})();
|
|
328
337
|
},
|
|
329
338
|
} as unknown as ClientSession;
|
|
@@ -331,9 +340,10 @@ describe('driveTurn', () => {
|
|
|
331
340
|
const res = makeResponse();
|
|
332
341
|
const done = driveTurn(session, 'hi', {}, res);
|
|
333
342
|
await inFlight;
|
|
334
|
-
|
|
343
|
+
assertDefined(signal, 'an abort signal was captured');
|
|
344
|
+
expect(signal.aborted).toBe(false);
|
|
335
345
|
res._emit('close');
|
|
336
|
-
expect(signal
|
|
346
|
+
expect(signal.aborted).toBe(true);
|
|
337
347
|
await done;
|
|
338
348
|
});
|
|
339
349
|
|
|
@@ -436,7 +446,10 @@ describe('handleTurn — concurrency cap', () => {
|
|
|
436
446
|
({
|
|
437
447
|
runTurn: (_p: string, opts?: { signal?: AbortSignal }) =>
|
|
438
448
|
(async function* () {
|
|
439
|
-
await new Promise<void>((resolve) =>
|
|
449
|
+
await new Promise<void>((resolve) => {
|
|
450
|
+
const signal = opts?.signal;
|
|
451
|
+
signal?.addEventListener('abort', () => resolve());
|
|
452
|
+
});
|
|
440
453
|
})(),
|
|
441
454
|
}) as unknown as ClientSession;
|
|
442
455
|
|
|
@@ -502,7 +515,8 @@ describe('driveTurn — buffered-events bound', () => {
|
|
|
502
515
|
let aborted = false;
|
|
503
516
|
const session = {
|
|
504
517
|
runTurn: (_p: string, opts?: { signal?: AbortSignal }) => {
|
|
505
|
-
opts?.signal
|
|
518
|
+
const signal = opts?.signal;
|
|
519
|
+
signal?.addEventListener('abort', () => {
|
|
506
520
|
aborted = true;
|
|
507
521
|
});
|
|
508
522
|
return (async function* () {
|
|
@@ -604,13 +618,14 @@ describe('handleTurnStream — backpressure + closed-socket safety', () => {
|
|
|
604
618
|
// Let the handler reach the first parked write.
|
|
605
619
|
await new Promise((r) => setTimeout(r, 5));
|
|
606
620
|
expect(settled).toBe(false);
|
|
607
|
-
|
|
621
|
+
assertDefined(signal, 'an abort signal was captured');
|
|
622
|
+
expect(signal.aborted).toBe(false);
|
|
608
623
|
|
|
609
624
|
// Fire the inactivity timeout — must abort the turn and let the handler exit.
|
|
610
625
|
res._fireTimeout();
|
|
611
626
|
await done;
|
|
612
627
|
expect(settled).toBe(true);
|
|
613
|
-
expect(signal
|
|
628
|
+
expect(signal.aborted).toBe(true);
|
|
614
629
|
});
|
|
615
630
|
|
|
616
631
|
it('disarms the stall timer after the stream settles cleanly', async () => {
|
|
@@ -640,7 +655,10 @@ describe('handleTurnStream — backpressure + closed-socket safety', () => {
|
|
|
640
655
|
runTurn: (_p: string, opts?: { signal?: AbortSignal }) => {
|
|
641
656
|
signal = opts?.signal;
|
|
642
657
|
return (async function* () {
|
|
643
|
-
await new Promise<void>((resolve) =>
|
|
658
|
+
await new Promise<void>((resolve) => {
|
|
659
|
+
const sig = opts?.signal;
|
|
660
|
+
sig?.addEventListener('abort', () => resolve());
|
|
661
|
+
});
|
|
644
662
|
})();
|
|
645
663
|
},
|
|
646
664
|
} as unknown as ClientSession;
|
|
@@ -656,7 +674,8 @@ describe('handleTurnStream — backpressure + closed-socket safety', () => {
|
|
|
656
674
|
// Emit a socket error mid-stream — must not propagate.
|
|
657
675
|
expect(() => res._emit('error', new Error('ECONNRESET'))).not.toThrow();
|
|
658
676
|
await expect(done).resolves.toBeUndefined();
|
|
659
|
-
|
|
677
|
+
assertDefined(signal, 'an abort signal was captured');
|
|
678
|
+
expect(signal.aborted).toBe(true);
|
|
660
679
|
expect(warn).toHaveBeenCalledWith('http stream response error', expect.objectContaining({}));
|
|
661
680
|
});
|
|
662
681
|
});
|