ts-procedures 5.0.0 → 5.2.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/README.md +36 -5
- package/build/implementations/http/express-rpc/index.js +13 -1
- package/build/implementations/http/express-rpc/index.js.map +1 -1
- package/build/implementations/http/hono-rpc/index.js +1 -1
- package/build/implementations/http/hono-rpc/index.js.map +1 -1
- package/build/implementations/http/hono-stream/index.d.ts +14 -15
- package/build/implementations/http/hono-stream/index.js +9 -7
- package/build/implementations/http/hono-stream/index.js.map +1 -1
- package/build/implementations/http/hono-stream/index.test.js +166 -2
- package/build/implementations/http/hono-stream/index.test.js.map +1 -1
- package/build/implementations/http/hono-stream/types.d.ts +3 -3
- package/build/implementations/types.d.ts +5 -5
- package/build/index.d.ts +1 -0
- package/build/index.js +7 -3
- package/build/index.js.map +1 -1
- package/build/index.test.js +77 -0
- package/build/index.test.js.map +1 -1
- package/package.json +1 -1
- package/src/implementations/http/README.md +12 -0
- package/src/implementations/http/express-rpc/README.md +27 -0
- package/src/implementations/http/express-rpc/index.ts +14 -2
- package/src/implementations/http/hono-rpc/README.md +25 -0
- package/src/implementations/http/hono-rpc/index.ts +2 -2
- package/src/implementations/http/hono-stream/README.md +112 -42
- package/src/implementations/http/hono-stream/index.test.ts +213 -4
- package/src/implementations/http/hono-stream/index.ts +25 -24
- package/src/implementations/http/hono-stream/types.ts +3 -3
- package/src/implementations/types.ts +5 -5
- package/src/index.test.ts +95 -0
- package/src/index.ts +9 -3
package/README.md
CHANGED
|
@@ -90,9 +90,11 @@ CreateStream(name, config, handler)
|
|
|
90
90
|
async function* (ctx, params) => AsyncGenerator<TYield, TReturn | void>
|
|
91
91
|
```
|
|
92
92
|
|
|
93
|
-
**Context Extensions:**
|
|
93
|
+
**Context Extensions (all handlers):**
|
|
94
94
|
- `ctx.error(message, meta?)` - Create a ProcedureError
|
|
95
|
-
- `ctx.signal
|
|
95
|
+
- `ctx.signal?` - AbortSignal for cancellation support (optional for `Create`, always present for `CreateStream`)
|
|
96
|
+
|
|
97
|
+
When using the built-in HTTP implementations (Hono, Express), `ctx.signal` is automatically injected from the HTTP request, so handlers can detect client disconnection. For direct usage without a server, `signal` is `undefined` unless you pass one in context.
|
|
96
98
|
|
|
97
99
|
**Returns:**
|
|
98
100
|
- `{ [name]: handler }` - Named generator export
|
|
@@ -366,7 +368,9 @@ const { ValidatedStream } = CreateStream(
|
|
|
366
368
|
|
|
367
369
|
### Abort Signal Integration
|
|
368
370
|
|
|
369
|
-
|
|
371
|
+
#### Streaming Procedures
|
|
372
|
+
|
|
373
|
+
The `ctx.signal` allows stream handlers to detect when consumers stop iterating. After completion, `signal.reason` indicates why the stream ended:
|
|
370
374
|
|
|
371
375
|
```typescript
|
|
372
376
|
const { CancellableStream } = CreateStream(
|
|
@@ -378,7 +382,12 @@ const { CancellableStream } = CreateStream(
|
|
|
378
382
|
yield await fetchNextItem()
|
|
379
383
|
}
|
|
380
384
|
} finally {
|
|
381
|
-
//
|
|
385
|
+
// Distinguish normal completion from client disconnect
|
|
386
|
+
if (ctx.signal.reason === 'stream-completed') {
|
|
387
|
+
// Stream finished normally
|
|
388
|
+
} else {
|
|
389
|
+
// Client disconnected or external abort
|
|
390
|
+
}
|
|
382
391
|
await cleanup()
|
|
383
392
|
}
|
|
384
393
|
},
|
|
@@ -390,6 +399,28 @@ for await (const item of CancellableStream({}, {})) {
|
|
|
390
399
|
}
|
|
391
400
|
```
|
|
392
401
|
|
|
402
|
+
#### Regular Procedures
|
|
403
|
+
|
|
404
|
+
For regular procedures, `ctx.signal` is available when the server implementation provides it. The built-in HTTP integrations (Hono RPC, Express RPC) inject the request's abort signal automatically:
|
|
405
|
+
|
|
406
|
+
```typescript
|
|
407
|
+
const { Create } = Procedures<{ signal: AbortSignal }>()
|
|
408
|
+
|
|
409
|
+
const { LongQuery } = Create(
|
|
410
|
+
'LongQuery',
|
|
411
|
+
{},
|
|
412
|
+
async (ctx, params) => {
|
|
413
|
+
// Pass signal to downstream operations
|
|
414
|
+
const result = await fetch('https://api.example.com/data', {
|
|
415
|
+
signal: ctx.signal,
|
|
416
|
+
})
|
|
417
|
+
return result.json()
|
|
418
|
+
},
|
|
419
|
+
)
|
|
420
|
+
```
|
|
421
|
+
|
|
422
|
+
When using the Hono or Express implementations, `ctx.signal` aborts when the client disconnects, automatically cancelling in-flight `fetch()` calls, database queries, or any other signal-aware operation.
|
|
423
|
+
|
|
393
424
|
### SSE Integration Example
|
|
394
425
|
|
|
395
426
|
```typescript
|
|
@@ -719,7 +750,7 @@ import {
|
|
|
719
750
|
|
|
720
751
|
// Types
|
|
721
752
|
TLocalContext,
|
|
722
|
-
TStreamContext, // Streaming context
|
|
753
|
+
TStreamContext, // Streaming context (AbortSignal always present)
|
|
723
754
|
TProcedureRegistration,
|
|
724
755
|
TStreamProcedureRegistration, // Streaming procedure registration
|
|
725
756
|
TNoContextProvided,
|
|
@@ -105,7 +105,19 @@ export class ExpressRPCAppBuilder {
|
|
|
105
105
|
const context = typeof factoryContext === 'function'
|
|
106
106
|
? await factoryContext(req)
|
|
107
107
|
: factoryContext;
|
|
108
|
-
|
|
108
|
+
let ac;
|
|
109
|
+
const ctxWithSignal = Object.defineProperty({ ...context }, 'signal', {
|
|
110
|
+
get() {
|
|
111
|
+
if (!ac) {
|
|
112
|
+
ac = new AbortController();
|
|
113
|
+
req.on('close', () => { if (!res.writableFinished)
|
|
114
|
+
ac.abort(); });
|
|
115
|
+
}
|
|
116
|
+
return ac.signal;
|
|
117
|
+
},
|
|
118
|
+
enumerable: true,
|
|
119
|
+
});
|
|
120
|
+
res.json(await procedure.handler(ctxWithSignal, req.body));
|
|
109
121
|
if (this.config?.onSuccess) {
|
|
110
122
|
this.config.onSuccess(procedure, req, res);
|
|
111
123
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../../src/implementations/http/express-rpc/index.ts"],"names":[],"mappings":"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
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../../src/implementations/http/express-rpc/index.ts"],"names":[],"mappings":"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"}
|
|
@@ -101,7 +101,7 @@ export class HonoRPCAppBuilder {
|
|
|
101
101
|
: factoryContext;
|
|
102
102
|
// Hono uses c.req.json() for body parsing
|
|
103
103
|
const body = await c.req.json().catch(() => ({}));
|
|
104
|
-
const result = await procedure.handler(context, body);
|
|
104
|
+
const result = await procedure.handler({ ...context, signal: c.req.raw.signal }, body);
|
|
105
105
|
if (this.config?.onSuccess) {
|
|
106
106
|
this.config.onSuccess(procedure, c);
|
|
107
107
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../../src/implementations/http/hono-rpc/index.ts"],"names":[],"mappings":"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
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../../src/implementations/http/hono-rpc/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,IAAI,EAAW,MAAM,MAAM,CAAA;AACpC,OAAO,EAAE,SAAS,EAAE,MAAM,mBAAmB,CAAA;AAS7C,OAAO,EAAE,SAAS,EAAE,MAAM,mBAAmB,CAAA;AA6B7C;;;;;;;;;;;;;;GAcG;AACH,MAAM,OAAO,iBAAiB;IAMP;IALrB;;;;OAIG;IACH,YAAqB,MAAgC;QAAhC,WAAM,GAAN,MAAM,CAA0B;QACnD,IAAI,MAAM,EAAE,GAAG,EAAE,CAAC;YAChB,IAAI,CAAC,IAAI,GAAG,MAAM,CAAC,GAAG,CAAA;QACxB,CAAC;QAED,IAAI,MAAM,EAAE,cAAc,EAAE,CAAC;YAC3B,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,GAAG,EAAE,KAAK,EAAE,CAAC,EAAE,IAAI,EAAE,EAAE;gBACnC,MAAM,CAAC,cAAe,CAAC,CAAC,CAAC,CAAA;gBACzB,MAAM,IAAI,EAAE,CAAA;YACd,CAAC,CAAC,CAAA;QACJ,CAAC;QAED,IAAI,MAAM,EAAE,YAAY,EAAE,CAAC;YACzB,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,GAAG,EAAE,KAAK,EAAE,CAAC,EAAE,IAAI,EAAE,EAAE;gBACnC,MAAM,IAAI,EAAE,CAAA;gBACZ,MAAM,CAAC,YAAa,CAAC,CAAC,CAAC,CAAA;YACzB,CAAC,CAAC,CAAA;QACJ,CAAC;IACH,CAAC;IAED;;;;;;;;OAQG;IACH,MAAM,CAAC,oBAAoB,CAAC,EAC1B,IAAI,EACJ,MAAM,EACN,MAAM,GAKP;QACC,MAAM,gBAAgB,GAAG,MAAM,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC,UAAU,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,IAAI,MAAM,EAAE,CAAC,CAAC,CAAC,CAAC,EAAE,CAAA;QAEvF,OAAO,GAAG,gBAAgB,IAAI,SAAS,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC,GAAG,CAAC,SAAS,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,IAAI,SAAS,CAAC,IAAI,CAAC,IAAI,MAAM,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC,IAAI,EAAE,EAAE,CAAA;IACtI,CAAC;IAED;;;OAGG;IACH,oBAAoB,CAAC,IAAY,EAAE,MAAiB;QAClD,OAAO,iBAAiB,CAAC,oBAAoB,CAAC;YAC5C,IAAI;YACJ,MAAM;YACN,MAAM,EAAE,IAAI,CAAC,MAAM,EAAE,UAAU;SAChC,CAAC,CAAA;IACJ,CAAC;IAEO,SAAS,GAA2B,EAAE,CAAA;IAEtC,IAAI,GAAS,IAAI,IAAI,EAAE,CAAA;IACvB,KAAK,GAAiC,EAAE,CAAA;IAEhD,IAAI,GAAG;QACL,OAAO,IAAI,CAAC,IAAI,CAAA;IAClB,CAAC;IAED,IAAI,IAAI;QACN,OAAO,IAAI,CAAC,KAAK,CAAA;IACnB,CAAC;IAED;;;;;;OAMG;IACH,QAAQ,CACN,OAAiB,EACjB,cAEkF,EAClF,kBAKyB;QAEzB,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC,EAAE,OAAO,EAAE,cAAc,EAAE,kBAAkB,EAA0B,CAAC,CAAA;QAC5F,OAAO,IAAI,CAAA;IACb,CAAC;IAED;;;OAGG;IACH,KAAK;QACH,IAAI,CAAC,SAAS,CAAC,OAAO,CAAC,CAAC,EAAE,OAAO,EAAE,cAAc,EAAE,kBAAkB,EAAE,EAAE,EAAE;YACzE,OAAO,CAAC,aAAa,EAAE,CAAC,GAAG,CAAC,CAAC,SAAiD,EAAE,EAAE;gBAChF,MAAM,KAAK,GAAG,IAAI,CAAC,oBAAoB,CAAC,SAAS,EAAE,kBAAkB,CAAC,CAAA;gBAEtE,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,KAAK,CAAC,CAAA;gBAEtB,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,KAAK,CAAC,IAAI,EAAE,KAAK,EAAE,CAAC,EAAE,EAAE;oBACrC,IAAI,CAAC;wBACH,MAAM,OAAO,GACX,OAAO,cAAc,KAAK,UAAU;4BAClC,CAAC,CAAC,MAAM,cAAc,CAAC,CAAC,CAAC;4BACzB,CAAC,CAAE,cAAiD,CAAA;wBAExD,0CAA0C;wBAC1C,MAAM,IAAI,GAAG,MAAM,CAAC,CAAC,GAAG,CAAC,IAAI,EAAE,CAAC,KAAK,CAAC,GAAG,EAAE,CAAC,CAAC,EAAE,CAAC,CAAC,CAAA;wBACjD,MAAM,MAAM,GAAG,MAAM,SAAS,CAAC,OAAO,CAAC,EAAE,GAAG,OAAO,EAAE,MAAM,EAAE,CAAC,CAAC,GAAG,CAAC,GAAG,CAAC,MAAM,EAAE,EAAE,IAAI,CAAC,CAAA;wBAEtF,IAAI,IAAI,CAAC,MAAM,EAAE,SAAS,EAAE,CAAC;4BAC3B,IAAI,CAAC,MAAM,CAAC,SAAS,CAAC,SAAS,EAAE,CAAC,CAAC,CAAA;wBACrC,CAAC;wBAED,6CAA6C;wBAC7C,OAAO,CAAC,CAAC,IAAI,CAAC,MAAM,CAAC,CAAA;oBACvB,CAAC;oBAAC,OAAO,KAAK,EAAE,CAAC;wBACf,IAAI,IAAI,CAAC,MAAM,EAAE,OAAO,EAAE,CAAC;4BACzB,OAAO,IAAI,CAAC,MAAM,CAAC,OAAO,CAAC,SAAS,EAAE,CAAC,EAAE,KAAc,CAAC,CAAA;wBAC1D,CAAC;wBACD,yBAAyB;wBACzB,OAAO,CAAC,CAAC,IAAI,CAAC,EAAE,KAAK,EAAG,KAAe,CAAC,OAAO,EAAE,EAAE,GAAG,CAAC,CAAA;oBACzD,CAAC;gBACH,CAAC,CAAC,CAAA;YACJ,CAAC,CAAC,CAAA;QACJ,CAAC,CAAC,CAAA;QAEF,OAAO,IAAI,CAAC,IAAI,CAAA;IAClB,CAAC;IAED;;;OAGG;IACK,oBAAoB,CAC1B,SAAiD,EACjD,kBAAyD;QAEzD,MAAM,EAAE,MAAM,EAAE,GAAG,SAAS,CAAA;QAC5B,MAAM,IAAI,GAAG,iBAAiB,CAAC,oBAAoB,CAAC;YAClD,IAAI,EAAE,SAAS,CAAC,IAAI;YACpB,MAAM;YACN,MAAM,EAAE,IAAI,CAAC,MAAM,EAAE,UAAU;SAChC,CAAC,CAAA;QACF,MAAM,MAAM,GAAG,MAAe,CAAA,CAAC,uBAAuB;QACtD,MAAM,UAAU,GAA2E,EAAE,CAAA;QAE7F,IAAI,MAAM,CAAC,MAAM,EAAE,MAAM,EAAE,CAAC;YAC1B,UAAU,CAAC,IAAI,GAAG,MAAM,CAAC,MAAM,CAAC,MAAM,CAAA;QACxC,CAAC;QACD,IAAI,MAAM,CAAC,MAAM,EAAE,UAAU,EAAE,CAAC;YAC9B,UAAU,CAAC,QAAQ,GAAG,MAAM,CAAC,MAAM,CAAC,UAAU,CAAA;QAChD,CAAC;QAED,MAAM,IAAI,GAAG;YACX,IAAI,EAAE,SAAS,CAAC,IAAI;YACpB,OAAO,EAAE,MAAM,CAAC,OAAO;YACvB,KAAK,EAAE,MAAM,CAAC,KAAK;YACnB,IAAI;YACJ,MAAM;YACN,UAAU;SACX,CAAA;QACD,IAAI,WAAW,GAAW,EAAE,CAAA;QAE5B,IAAI,kBAAkB,EAAE,CAAC;YACvB,WAAW,GAAG,kBAAkB,CAAC,EAAE,IAAI,EAAE,SAAS,EAAE,CAAC,CAAA;QACvD,CAAC;QAED,OAAO;YACL,GAAG,WAAW;YACd,GAAG,IAAI;SACR,CAAA;IACH,CAAC;CACF"}
|
|
@@ -2,6 +2,7 @@ import { Hono, Context } from 'hono';
|
|
|
2
2
|
import { TStreamProcedureRegistration } from '../../../index.js';
|
|
3
3
|
import { ExtractConfig, ExtractContext, ProceduresFactory, RPCConfig } from '../../types.js';
|
|
4
4
|
import { StreamHttpRouteDoc, StreamMode } from './types.js';
|
|
5
|
+
import { ProcedureValidationError } from '../../../errors.js';
|
|
5
6
|
export type { StreamHttpRouteDoc, StreamMode };
|
|
6
7
|
export type SSEOptions = {
|
|
7
8
|
event?: string;
|
|
@@ -12,17 +13,13 @@ export declare function sse<T extends object>(data: T, options?: SSEOptions): T;
|
|
|
12
13
|
/**
|
|
13
14
|
* Result from onMidStreamError callback.
|
|
14
15
|
* @property data - The data to write as the SSE `data:` field content (should match yieldType schema)
|
|
15
|
-
* @property event - Optional SSE event name (defaults to procedure name if data provided, 'error' otherwise)
|
|
16
|
-
* @property id - Optional SSE event id (auto-incremented if not provided)
|
|
17
16
|
* @property closeStream - Whether to close the stream after writing (defaults to true)
|
|
18
17
|
*/
|
|
19
|
-
export type MidStreamErrorResult = {
|
|
20
|
-
data:
|
|
21
|
-
event?: string;
|
|
22
|
-
id?: string;
|
|
18
|
+
export type MidStreamErrorResult<TErrorData = unknown> = {
|
|
19
|
+
data: TErrorData;
|
|
23
20
|
closeStream?: boolean;
|
|
24
21
|
};
|
|
25
|
-
export type HonoStreamAppBuilderConfig = {
|
|
22
|
+
export type HonoStreamAppBuilderConfig<TErrorData = unknown> = {
|
|
26
23
|
/**
|
|
27
24
|
* An existing Hono application instance to use.
|
|
28
25
|
* If not provided, a new instance will be created.
|
|
@@ -34,22 +31,24 @@ export type HonoStreamAppBuilderConfig = {
|
|
|
34
31
|
defaultStreamMode?: StreamMode;
|
|
35
32
|
onRequestStart?: (c: Context) => void;
|
|
36
33
|
onRequestEnd?: (c: Context) => void;
|
|
37
|
-
onStreamStart?: (procedure: TStreamProcedureRegistration, c: Context) => void;
|
|
38
|
-
onStreamEnd?: (procedure: TStreamProcedureRegistration, c: Context) => void;
|
|
34
|
+
onStreamStart?: (procedure: TStreamProcedureRegistration, c: Context, streamMode: StreamMode) => void;
|
|
35
|
+
onStreamEnd?: (procedure: TStreamProcedureRegistration, c: Context, streamMode: StreamMode) => void;
|
|
39
36
|
/**
|
|
40
37
|
* Called for errors BEFORE streaming starts (validation, auth, context resolution).
|
|
41
38
|
* Return value IS used as the HTTP response.
|
|
42
39
|
*/
|
|
43
|
-
onPreStreamError?: (procedure: TStreamProcedureRegistration, c: Context, error: Error) => Response | Promise<Response>;
|
|
40
|
+
onPreStreamError?: (procedure: TStreamProcedureRegistration, c: Context, error: ProcedureValidationError | Error) => Response | Promise<Response>;
|
|
44
41
|
/**
|
|
45
42
|
* Called for errors DURING streaming (generator throws).
|
|
46
43
|
* Return value is written to the stream as a yield.
|
|
47
44
|
* Should return a value matching your yieldType schema (e.g., error variant of a union).
|
|
48
45
|
* Return undefined to use default behavior (writes { error: message }).
|
|
49
46
|
*
|
|
50
|
-
*
|
|
47
|
+
* Use sse() to attach SSE metadata (event, id, retry) to the error data object.
|
|
48
|
+
*
|
|
49
|
+
* @returns { data, closeStream? } - data to yield, whether to close after (default true)
|
|
51
50
|
*/
|
|
52
|
-
onMidStreamError?: (procedure: TStreamProcedureRegistration, c: Context, error: Error) => MidStreamErrorResult | undefined;
|
|
51
|
+
onMidStreamError?: (procedure: TStreamProcedureRegistration, c: Context, error: Error) => MidStreamErrorResult<TErrorData> | undefined;
|
|
53
52
|
};
|
|
54
53
|
/**
|
|
55
54
|
* Builder class for creating a Hono application with streaming RPC routes.
|
|
@@ -64,12 +63,12 @@ export type HonoStreamAppBuilderConfig = {
|
|
|
64
63
|
* const app = streamApp.app; // Hono application
|
|
65
64
|
* const docs = streamApp.docs; // Stream route documentation
|
|
66
65
|
*/
|
|
67
|
-
export declare class HonoStreamAppBuilder {
|
|
68
|
-
readonly config?: HonoStreamAppBuilderConfig | undefined;
|
|
66
|
+
export declare class HonoStreamAppBuilder<TErrorData = unknown> {
|
|
67
|
+
readonly config?: HonoStreamAppBuilderConfig<TErrorData> | undefined;
|
|
69
68
|
/**
|
|
70
69
|
* Constructor for HonoStreamAppBuilder.
|
|
71
70
|
*/
|
|
72
|
-
constructor(config?: HonoStreamAppBuilderConfig | undefined);
|
|
71
|
+
constructor(config?: HonoStreamAppBuilderConfig<TErrorData> | undefined);
|
|
73
72
|
/**
|
|
74
73
|
* Generates the stream route path based on the RPC configuration.
|
|
75
74
|
*/
|
|
@@ -107,7 +107,7 @@ export class HonoStreamAppBuilder {
|
|
|
107
107
|
}
|
|
108
108
|
}
|
|
109
109
|
if (this.config?.onStreamStart) {
|
|
110
|
-
this.config.onStreamStart(procedure, c);
|
|
110
|
+
this.config.onStreamStart(procedure, c, streamMode);
|
|
111
111
|
}
|
|
112
112
|
if (streamMode === 'sse') {
|
|
113
113
|
return this.handleSSEStream(procedure, context, params, c);
|
|
@@ -131,7 +131,7 @@ export class HonoStreamAppBuilder {
|
|
|
131
131
|
handleSSEStream(procedure, context, params, c) {
|
|
132
132
|
return streamSSE(c, async (stream) => {
|
|
133
133
|
// Pass isPrevalidated: true since we already validated params in createStreamHandler
|
|
134
|
-
const generator = procedure.handler({ ...context, isPrevalidated: true }, params);
|
|
134
|
+
const generator = procedure.handler({ ...context, signal: c.req.raw.signal, isPrevalidated: true }, params);
|
|
135
135
|
stream.onAbort(async () => {
|
|
136
136
|
await generator.return(undefined);
|
|
137
137
|
});
|
|
@@ -161,17 +161,19 @@ export class HonoStreamAppBuilder {
|
|
|
161
161
|
}
|
|
162
162
|
// Write error value to stream
|
|
163
163
|
const errorData = errorResult?.data ?? { error: error.message };
|
|
164
|
+
const sseMeta = getSSEMeta(errorData);
|
|
164
165
|
await stream.writeSSE({
|
|
165
166
|
data: typeof errorData === 'string' ? errorData : JSON.stringify(errorData),
|
|
166
|
-
event:
|
|
167
|
-
id:
|
|
167
|
+
event: sseMeta?.event ?? (errorResult?.data !== undefined ? procedure.name : 'error'),
|
|
168
|
+
id: sseMeta?.id ?? String(eventId++),
|
|
169
|
+
...(sseMeta?.retry !== undefined && { retry: sseMeta.retry }),
|
|
168
170
|
});
|
|
169
171
|
// closeStream defaults to true if not specified
|
|
170
172
|
// (stream closes naturally after this handler completes)
|
|
171
173
|
}
|
|
172
174
|
finally {
|
|
173
175
|
if (this.config?.onStreamEnd) {
|
|
174
|
-
this.config.onStreamEnd(procedure, c);
|
|
176
|
+
this.config.onStreamEnd(procedure, c, 'sse');
|
|
175
177
|
}
|
|
176
178
|
if (this.config?.onRequestEnd) {
|
|
177
179
|
this.config.onRequestEnd(c);
|
|
@@ -185,7 +187,7 @@ export class HonoStreamAppBuilder {
|
|
|
185
187
|
handleTextStream(procedure, context, params, c) {
|
|
186
188
|
return streamText(c, async (stream) => {
|
|
187
189
|
// Pass isPrevalidated: true since we already validated params in createStreamHandler
|
|
188
|
-
const generator = procedure.handler({ ...context, isPrevalidated: true }, params);
|
|
190
|
+
const generator = procedure.handler({ ...context, signal: c.req.raw.signal, isPrevalidated: true }, params);
|
|
189
191
|
stream.onAbort(async () => {
|
|
190
192
|
await generator.return(undefined);
|
|
191
193
|
});
|
|
@@ -206,7 +208,7 @@ export class HonoStreamAppBuilder {
|
|
|
206
208
|
}
|
|
207
209
|
finally {
|
|
208
210
|
if (this.config?.onStreamEnd) {
|
|
209
|
-
this.config.onStreamEnd(procedure, c);
|
|
211
|
+
this.config.onStreamEnd(procedure, c, 'text');
|
|
210
212
|
}
|
|
211
213
|
if (this.config?.onRequestEnd) {
|
|
212
214
|
this.config.onRequestEnd(c);
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../../src/implementations/http/hono-stream/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,IAAI,EAAW,MAAM,MAAM,CAAA;AACpC,OAAO,EAAE,SAAS,EAAE,UAAU,EAAE,MAAM,gBAAgB,CAAA;AACtD,OAAO,EAAE,SAAS,EAAE,MAAM,mBAAmB,CAAA;AAC7C,OAAO,EAAE,SAAS,EAAE,MAAM,mBAAmB,CAAA;AAI7C,OAAO,EAAE,wBAAwB,EAAE,MAAM,oBAAoB,CAAA;AAU7D,MAAM,WAAW,GAAG,IAAI,OAAO,EAAsB,CAAA;AAErD,MAAM,UAAU,GAAG,CAAmB,IAAO,EAAE,OAAoB;IACjE,WAAW,CAAC,GAAG,CAAC,IAAI,EAAE,OAAO,IAAI,EAAE,CAAC,CAAA;IACpC,OAAO,IAAI,CAAA;AACb,CAAC;AAED,SAAS,UAAU,CAAC,KAAc;IAChC,IAAI,OAAO,KAAK,KAAK,QAAQ,IAAI,KAAK,KAAK,IAAI,EAAE,CAAC;QAChD,OAAO,WAAW,CAAC,GAAG,CAAC,KAAK,CAAC,CAAA;IAC/B,CAAC;IACD,OAAO,SAAS,CAAA;AAClB,CAAC;
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../../src/implementations/http/hono-stream/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,IAAI,EAAW,MAAM,MAAM,CAAA;AACpC,OAAO,EAAE,SAAS,EAAE,UAAU,EAAE,MAAM,gBAAgB,CAAA;AACtD,OAAO,EAAE,SAAS,EAAE,MAAM,mBAAmB,CAAA;AAC7C,OAAO,EAAE,SAAS,EAAE,MAAM,mBAAmB,CAAA;AAI7C,OAAO,EAAE,wBAAwB,EAAE,MAAM,oBAAoB,CAAA;AAU7D,MAAM,WAAW,GAAG,IAAI,OAAO,EAAsB,CAAA;AAErD,MAAM,UAAU,GAAG,CAAmB,IAAO,EAAE,OAAoB;IACjE,WAAW,CAAC,GAAG,CAAC,IAAI,EAAE,OAAO,IAAI,EAAE,CAAC,CAAA;IACpC,OAAO,IAAI,CAAA;AACb,CAAC;AAED,SAAS,UAAU,CAAC,KAAc;IAChC,IAAI,OAAO,KAAK,KAAK,QAAQ,IAAI,KAAK,KAAK,IAAI,EAAE,CAAC;QAChD,OAAO,WAAW,CAAC,GAAG,CAAC,KAAK,CAAC,CAAA;IAC/B,CAAC;IACD,OAAO,SAAS,CAAA;AAClB,CAAC;AAoDD;;;;;;;;;;;;GAYG;AACH,MAAM,OAAO,oBAAoB;IAIV;IAHrB;;OAEG;IACH,YAAqB,MAA+C;QAA/C,WAAM,GAAN,MAAM,CAAyC;QAClE,IAAI,MAAM,EAAE,GAAG,EAAE,CAAC;YAChB,IAAI,CAAC,IAAI,GAAG,MAAM,CAAC,GAAG,CAAA;QACxB,CAAC;QAED,IAAI,MAAM,EAAE,cAAc,EAAE,CAAC;YAC3B,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,GAAG,EAAE,KAAK,EAAE,CAAC,EAAE,IAAI,EAAE,EAAE;gBACnC,MAAM,CAAC,cAAe,CAAC,CAAC,CAAC,CAAA;gBACzB,MAAM,IAAI,EAAE,CAAA;YACd,CAAC,CAAC,CAAA;QACJ,CAAC;IACH,CAAC;IAED;;OAEG;IACH,MAAM,CAAC,uBAAuB,CAAC,EAC7B,IAAI,EACJ,MAAM,EACN,MAAM,GAKP;QACC,MAAM,gBAAgB,GAAG,MAAM,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC,UAAU,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,IAAI,MAAM,EAAE,CAAC,CAAC,CAAC,CAAC,EAAE,CAAA;QAEvF,OAAO,GAAG,gBAAgB,IAAI,SAAS,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC,GAAG,CAAC,SAAS,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,IAAI,SAAS,CAAC,IAAI,CAAC,IAAI,MAAM,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC,IAAI,EAAE,EAAE,CAAA;IACtI,CAAC;IAED;;OAEG;IACH,uBAAuB,CAAC,IAAY,EAAE,MAAiB;QACrD,OAAO,oBAAoB,CAAC,uBAAuB,CAAC;YAClD,IAAI;YACJ,MAAM;YACN,MAAM,EAAE,IAAI,CAAC,MAAM,EAAE,UAAU;SAChC,CAAC,CAAA;IACJ,CAAC;IAEO,SAAS,GAAiC,EAAE,CAAA;IAE5C,IAAI,GAAS,IAAI,IAAI,EAAE,CAAA;IACvB,KAAK,GAAoC,EAAE,CAAA;IAEnD,IAAI,GAAG;QACL,OAAO,IAAI,CAAC,IAAI,CAAA;IAClB,CAAC;IAED,IAAI,IAAI;QACN,OAAO,IAAI,CAAC,KAAK,CAAA;IACnB,CAAC;IAED;;;OAGG;IACH,QAAQ,CACN,OAAiB,EACjB,cAEkF,EAClF,OAMC;QAED,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC;YAClB,OAAO;YACP,cAAc;YACd,UAAU,EAAE,OAAO,EAAE,UAAU;YAC/B,kBAAkB,EAAE,OAAO,EAAE,kBAAkB;SAClB,CAAC,CAAA;QAChC,OAAO,IAAI,CAAA;IACb,CAAC;IAED;;OAEG;IACK,mBAAmB,CACzB,SAAuC,EACvC,cAAuD,EACvD,UAAsB;QAEtB,OAAO,KAAK,EAAE,CAAU,EAAE,EAAE;YAC1B,IAAI,CAAC;gBACH,MAAM,OAAO,GACX,OAAO,cAAc,KAAK,UAAU,CAAC,CAAC,CAAC,MAAM,cAAc,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,cAAc,CAAA;gBAEjF,qCAAqC;gBACrC,MAAM,MAAM,GACV,CAAC,CAAC,GAAG,CAAC,MAAM,KAAK,KAAK;oBACpB,CAAC,CAAC,MAAM,CAAC,WAAW,CAAC,IAAI,GAAG,CAAC,CAAC,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC,YAAY,CAAC;oBACrD,CAAC,CAAC,MAAM,CAAC,CAAC,GAAG,CAAC,IAAI,EAAE,CAAC,KAAK,CAAC,GAAG,EAAE,CAAC,CAAC,EAAE,CAAC,CAAC,CAAA;gBAE1C,6CAA6C;gBAC7C,IAAI,SAAS,CAAC,MAAM,CAAC,UAAU,EAAE,MAAM,EAAE,CAAC;oBACxC,MAAM,EAAE,MAAM,EAAE,GAAG,SAAS,CAAC,MAAM,CAAC,UAAU,CAAC,MAAM,CAAC,MAAM,CAAC,CAAA;oBAC7D,IAAI,MAAM,EAAE,CAAC;wBACX,MAAM,KAAK,GAAG,IAAI,wBAAwB,CACxC,SAAS,CAAC,IAAI,EACd,wBAAwB,SAAS,CAAC,IAAI,EAAE,EACxC,MAAM,CACP,CAAA;wBACD,mCAAmC;wBACnC,IAAI,IAAI,CAAC,MAAM,EAAE,gBAAgB,EAAE,CAAC;4BAClC,OAAO,IAAI,CAAC,MAAM,CAAC,gBAAgB,CAAC,SAAS,EAAE,CAAC,EAAE,KAAK,CAAC,CAAA;wBAC1D,CAAC;wBACD,OAAO,CAAC,CAAC,IAAI,CAAC,EAAE,KAAK,EAAE,KAAK,CAAC,OAAO,EAAE,EAAE,GAAG,CAAC,CAAA;oBAC9C,CAAC;gBACH,CAAC;gBAED,IAAI,IAAI,CAAC,MAAM,EAAE,aAAa,EAAE,CAAC;oBAC/B,IAAI,CAAC,MAAM,CAAC,aAAa,CAAC,SAAS,EAAE,CAAC,EAAE,UAAU,CAAC,CAAA;gBACrD,CAAC;gBAED,IAAI,UAAU,KAAK,KAAK,EAAE,CAAC;oBACzB,OAAO,IAAI,CAAC,eAAe,CAAC,SAAS,EAAE,OAAO,EAAE,MAAM,EAAE,CAAC,CAAC,CAAA;gBAC5D,CAAC;qBAAM,CAAC;oBACN,OAAO,IAAI,CAAC,gBAAgB,CAAC,SAAS,EAAE,OAAO,EAAE,MAAM,EAAE,CAAC,CAAC,CAAA;gBAC7D,CAAC;YACH,CAAC;YAAC,OAAO,KAAK,EAAE,CAAC;gBACf,qDAAqD;gBACrD,IAAI,IAAI,CAAC,MAAM,EAAE,gBAAgB,EAAE,CAAC;oBAClC,OAAO,IAAI,CAAC,MAAM,CAAC,gBAAgB,CAAC,SAAS,EAAE,CAAC,EAAE,KAAc,CAAC,CAAA;gBACnE,CAAC;gBACD,OAAO,CAAC,CAAC,IAAI,CAAC,EAAE,KAAK,EAAG,KAAe,CAAC,OAAO,EAAE,EAAE,GAAG,CAAC,CAAA;YACzD,CAAC;QACH,CAAC,CAAA;IACH,CAAC;IAED;;OAEG;IACK,eAAe,CACrB,SAAuC,EACvC,OAAY,EACZ,MAAW,EACX,CAAU;QAEV,OAAO,SAAS,CAAC,CAAC,EAAE,KAAK,EAAE,MAAM,EAAE,EAAE;YACnC,qFAAqF;YACrF,MAAM,SAAS,GAAG,SAAS,CAAC,OAAO,CAAC,EAAE,GAAG,OAAO,EAAE,MAAM,EAAE,CAAC,CAAC,GAAG,CAAC,GAAG,CAAC,MAAM,EAAE,cAAc,EAAE,IAAI,EAAE,EAAE,MAAM,CAAC,CAAA;YAE3G,MAAM,CAAC,OAAO,CAAC,KAAK,IAAI,EAAE;gBACxB,MAAM,SAAS,CAAC,MAAM,CAAC,SAAS,CAAC,CAAA;YACnC,CAAC,CAAC,CAAA;YAEF,IAAI,OAAO,GAAG,CAAC,CAAA;YACf,IAAI,CAAC;gBACH,IAAI,KAAK,EAAE,MAAM,KAAK,IAAI,SAAS,EAAE,CAAC;oBACpC,MAAM,SAAS,GAAG,OAAO,EAAE,CAAA;oBAC3B,MAAM,IAAI,GAAG,UAAU,CAAC,KAAK,CAAC,CAAA;oBAE9B,MAAM,IAAI,GACR,OAAO,KAAK,KAAK,QAAQ;wBACvB,CAAC,CAAC,KAAK;wBACP,CAAC,CAAC,KAAK,IAAI,IAAI;4BACb,CAAC,CAAC,IAAI,CAAC,SAAS,CAAC,KAAK,CAAC;4BACvB,CAAC,CAAC,EAAE,CAAA;oBAEV,MAAM,MAAM,CAAC,QAAQ,CAAC;wBACpB,IAAI;wBACJ,KAAK,EAAE,IAAI,EAAE,KAAK,IAAI,SAAS,CAAC,IAAI;wBACpC,EAAE,EAAE,IAAI,EAAE,EAAE,IAAI,MAAM,CAAC,SAAS,CAAC;wBACjC,GAAG,CAAC,IAAI,EAAE,KAAK,KAAK,SAAS,IAAI,EAAE,KAAK,EAAE,IAAI,CAAC,KAAK,EAAE,CAAC;qBACxD,CAAC,CAAA;gBACJ,CAAC;YACH,CAAC;YAAC,OAAO,KAAK,EAAE,CAAC;gBACf,yDAAyD;gBACzD,IAAI,WAAyD,CAAA;gBAE7D,IAAI,IAAI,CAAC,MAAM,EAAE,gBAAgB,EAAE,CAAC;oBAClC,WAAW,GAAG,IAAI,CAAC,MAAM,CAAC,gBAAgB,CAAC,SAAS,EAAE,CAAC,EAAE,KAAc,CAAC,CAAA;gBAC1E,CAAC;gBAED,8BAA8B;gBAC9B,MAAM,SAAS,GAAG,WAAW,EAAE,IAAI,IAAI,EAAE,KAAK,EAAG,KAAe,CAAC,OAAO,EAAE,CAAA;gBAC1E,MAAM,OAAO,GAAG,UAAU,CAAC,SAAS,CAAC,CAAA;gBAErC,MAAM,MAAM,CAAC,QAAQ,CAAC;oBACpB,IAAI,EAAE,OAAO,SAAS,KAAK,QAAQ,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,IAAI,CAAC,SAAS,CAAC,SAAS,CAAC;oBAC3E,KAAK,EAAE,OAAO,EAAE,KAAK,IAAI,CAAC,WAAW,EAAE,IAAI,KAAK,SAAS,CAAC,CAAC,CAAC,SAAS,CAAC,IAAI,CAAC,CAAC,CAAC,OAAO,CAAC;oBACrF,EAAE,EAAE,OAAO,EAAE,EAAE,IAAI,MAAM,CAAC,OAAO,EAAE,CAAC;oBACpC,GAAG,CAAC,OAAO,EAAE,KAAK,KAAK,SAAS,IAAI,EAAE,KAAK,EAAE,OAAO,CAAC,KAAK,EAAE,CAAC;iBAC9D,CAAC,CAAA;gBAEF,gDAAgD;gBAChD,yDAAyD;YAC3D,CAAC;oBAAS,CAAC;gBACT,IAAI,IAAI,CAAC,MAAM,EAAE,WAAW,EAAE,CAAC;oBAC7B,IAAI,CAAC,MAAM,CAAC,WAAW,CAAC,SAAS,EAAE,CAAC,EAAE,KAAK,CAAC,CAAA;gBAC9C,CAAC;gBACD,IAAI,IAAI,CAAC,MAAM,EAAE,YAAY,EAAE,CAAC;oBAC9B,IAAI,CAAC,MAAM,CAAC,YAAY,CAAC,CAAC,CAAC,CAAA;gBAC7B,CAAC;YACH,CAAC;QACH,CAAC,CAAC,CAAA;IACJ,CAAC;IAED;;OAEG;IACK,gBAAgB,CACtB,SAAuC,EACvC,OAAY,EACZ,MAAW,EACX,CAAU;QAEV,OAAO,UAAU,CAAC,CAAC,EAAE,KAAK,EAAE,MAAM,EAAE,EAAE;YACpC,qFAAqF;YACrF,MAAM,SAAS,GAAG,SAAS,CAAC,OAAO,CAAC,EAAE,GAAG,OAAO,EAAE,MAAM,EAAE,CAAC,CAAC,GAAG,CAAC,GAAG,CAAC,MAAM,EAAE,cAAc,EAAE,IAAI,EAAE,EAAE,MAAM,CAAC,CAAA;YAE3G,MAAM,CAAC,OAAO,CAAC,KAAK,IAAI,EAAE;gBACxB,MAAM,SAAS,CAAC,MAAM,CAAC,SAAS,CAAC,CAAA;YACnC,CAAC,CAAC,CAAA;YAEF,IAAI,CAAC;gBACH,IAAI,KAAK,EAAE,MAAM,KAAK,IAAI,SAAS,EAAE,CAAC;oBACpC,MAAM,MAAM,CAAC,OAAO,CAAC,IAAI,CAAC,SAAS,CAAC,KAAK,CAAC,CAAC,CAAA;gBAC7C,CAAC;YACH,CAAC;YAAC,OAAO,KAAK,EAAE,CAAC;gBACf,yDAAyD;gBACzD,IAAI,WAAyD,CAAA;gBAE7D,IAAI,IAAI,CAAC,MAAM,EAAE,gBAAgB,EAAE,CAAC;oBAClC,WAAW,GAAG,IAAI,CAAC,MAAM,CAAC,gBAAgB,CAAC,SAAS,EAAE,CAAC,EAAE,KAAc,CAAC,CAAA;gBAC1E,CAAC;gBAED,8BAA8B;gBAC9B,MAAM,SAAS,GAAG,WAAW,EAAE,IAAI,IAAI,EAAE,KAAK,EAAG,KAAe,CAAC,OAAO,EAAE,CAAA;gBAC1E,MAAM,MAAM,CAAC,OAAO,CAAC,IAAI,CAAC,SAAS,CAAC,SAAS,CAAC,CAAC,CAAA;YACjD,CAAC;oBAAS,CAAC;gBACT,IAAI,IAAI,CAAC,MAAM,EAAE,WAAW,EAAE,CAAC;oBAC7B,IAAI,CAAC,MAAM,CAAC,WAAW,CAAC,SAAS,EAAE,CAAC,EAAE,MAAM,CAAC,CAAA;gBAC/C,CAAC;gBACD,IAAI,IAAI,CAAC,MAAM,EAAE,YAAY,EAAE,CAAC;oBAC9B,IAAI,CAAC,MAAM,CAAC,YAAY,CAAC,CAAC,CAAC,CAAA;gBAC7B,CAAC;YACH,CAAC;QACH,CAAC,CAAC,CAAA;IACJ,CAAC;IAED;;OAEG;IACH,KAAK;QACH,IAAI,CAAC,SAAS,CAAC,OAAO,CAAC,CAAC,EAAE,OAAO,EAAE,cAAc,EAAE,UAAU,EAAE,kBAAkB,EAAE,EAAE,EAAE;YACrF,MAAM,IAAI,GAAG,UAAU,IAAI,IAAI,CAAC,MAAM,EAAE,iBAAiB,IAAI,KAAK,CAAA;YAElE,OAAO;iBACJ,aAAa,EAAE;iBACf,MAAM,CACL,CAAC,CAAyB,EAAqC,EAAE,CAAC,CAAC,CAAC,QAAQ,KAAK,IAAI,CACtF;iBACA,OAAO,CAAC,CAAC,SAAuD,EAAE,EAAE;gBACnE,MAAM,KAAK,GAAG,IAAI,CAAC,uBAAuB,CAAC,SAAS,EAAE,IAAI,EAAE,kBAAkB,CAAC,CAAA;gBAE/E,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,KAAK,CAAC,CAAA;gBAEtB,MAAM,OAAO,GAAG,IAAI,CAAC,mBAAmB,CAAC,SAAS,EAAE,cAAc,EAAE,IAAI,CAAC,CAAA;gBAEzE,sCAAsC;gBACtC,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,KAAK,CAAC,IAAI,EAAE,OAAO,CAAC,CAAA;gBAClC,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,KAAK,CAAC,IAAI,EAAE,OAAO,CAAC,CAAA;YACrC,CAAC,CAAC,CAAA;QACN,CAAC,CAAC,CAAA;QAEF,OAAO,IAAI,CAAC,IAAI,CAAA;IAClB,CAAC;IAED;;OAEG;IACK,uBAAuB,CAC7B,SAAuD,EACvD,UAAsB,EACtB,kBAAgE;QAEhE,MAAM,EAAE,MAAM,EAAE,GAAG,SAAS,CAAA;QAC5B,MAAM,IAAI,GAAG,oBAAoB,CAAC,uBAAuB,CAAC;YACxD,IAAI,EAAE,SAAS,CAAC,IAAI;YACpB,MAAM;YACN,MAAM,EAAE,IAAI,CAAC,MAAM,EAAE,UAAU;SAChC,CAAC,CAAA;QACF,MAAM,OAAO,GAAG,CAAC,KAAK,EAAE,MAAM,CAAU,CAAA;QACxC,MAAM,UAAU,GAAoH,EAAE,CAAA;QAEtI,IAAI,MAAM,CAAC,MAAM,EAAE,MAAM,EAAE,CAAC;YAC1B,UAAU,CAAC,MAAM,GAAG,MAAM,CAAC,MAAM,CAAC,MAAM,CAAA;QAC1C,CAAC;QACD,IAAI,UAAU,KAAK,KAAK,EAAE,CAAC;YACzB,UAAU,CAAC,SAAS,GAAG;gBACrB,IAAI,EAAE,QAAQ;gBACd,WAAW,EAAE,0EAA0E;gBACvF,QAAQ,EAAE,CAAC,MAAM,EAAE,OAAO,EAAE,IAAI,CAAC;gBACjC,UAAU,EAAE;oBACV,IAAI,EAAE,MAAM,CAAC,MAAM,EAAE,SAAS,IAAI,EAAE;oBACpC,KAAK,EAAE,EAAE,IAAI,EAAE,QAAQ,EAAE;oBACzB,EAAE,EAAE,EAAE,IAAI,EAAE,QAAQ,EAAE;oBACtB,KAAK,EAAE,EAAE,IAAI,EAAE,QAAQ,EAAE;iBAC1B;aACF,CAAA;QACH,CAAC;aAAM,IAAI,MAAM,CAAC,MAAM,EAAE,SAAS,EAAE,CAAC;YACpC,gCAAgC;YAChC,UAAU,CAAC,SAAS,GAAG,MAAM,CAAC,MAAM,CAAC,SAAS,CAAA;QAChD,CAAC;QACD,IAAI,MAAM,CAAC,MAAM,EAAE,UAAU,EAAE,CAAC;YAC9B,UAAU,CAAC,UAAU,GAAG,MAAM,CAAC,MAAM,CAAC,UAAU,CAAA;QAClD,CAAC;QAED,MAAM,IAAI,GAAuB;YAC/B,IAAI,EAAE,SAAS,CAAC,IAAI;YACpB,OAAO,EAAE,MAAM,CAAC,OAAO;YACvB,KAAK,EAAE,MAAM,CAAC,KAAK;YACnB,IAAI;YACJ,OAAO,EAAE,CAAC,GAAG,OAAO,CAAC;YACrB,UAAU;YACV,UAAU;SACX,CAAA;QAED,IAAI,WAAW,GAAW,EAAE,CAAA;QAE5B,IAAI,kBAAkB,EAAE,CAAC;YACvB,WAAW,GAAG,kBAAkB,CAAC,EAAE,IAAI,EAAE,SAAS,EAAE,CAAC,CAAA;QACvD,CAAC;QAED,OAAO;YACL,GAAG,WAAW;YACd,GAAG,IAAI;SACR,CAAA;IACH,CAAC;CACF"}
|
|
@@ -4,6 +4,7 @@ import { Hono } from 'hono';
|
|
|
4
4
|
import { v } from 'suretype';
|
|
5
5
|
import { Procedures } from '../../../index.js';
|
|
6
6
|
import { HonoStreamAppBuilder, sse } from './index.js';
|
|
7
|
+
import { ProcedureValidationError } from '../../../errors.js';
|
|
7
8
|
/**
|
|
8
9
|
* HonoStreamAppBuilder Test Suite
|
|
9
10
|
*
|
|
@@ -274,7 +275,7 @@ describe('HonoStreamAppBuilder', () => {
|
|
|
274
275
|
expect(onRequestEnd).toHaveBeenCalledTimes(1);
|
|
275
276
|
expect(onRequestEnd.mock.calls[0][0]).toHaveProperty('req');
|
|
276
277
|
});
|
|
277
|
-
test('onStreamStart is called before streaming begins', async () => {
|
|
278
|
+
test('onStreamStart is called before streaming begins with streamMode', async () => {
|
|
278
279
|
const onStreamStart = vi.fn();
|
|
279
280
|
const builder = new HonoStreamAppBuilder({ onStreamStart });
|
|
280
281
|
const RPC = Procedures();
|
|
@@ -286,8 +287,9 @@ describe('HonoStreamAppBuilder', () => {
|
|
|
286
287
|
await app.request('/test/test/1');
|
|
287
288
|
expect(onStreamStart).toHaveBeenCalledTimes(1);
|
|
288
289
|
expect(onStreamStart.mock.calls[0][0]).toHaveProperty('name', 'Test');
|
|
290
|
+
expect(onStreamStart.mock.calls[0][2]).toBe('sse');
|
|
289
291
|
});
|
|
290
|
-
test('onStreamEnd is called after stream completes', async () => {
|
|
292
|
+
test('onStreamEnd is called after stream completes with streamMode', async () => {
|
|
291
293
|
const onStreamEnd = vi.fn();
|
|
292
294
|
const builder = new HonoStreamAppBuilder({ onStreamEnd });
|
|
293
295
|
const RPC = Procedures();
|
|
@@ -301,6 +303,7 @@ describe('HonoStreamAppBuilder', () => {
|
|
|
301
303
|
await res.text();
|
|
302
304
|
expect(onStreamEnd).toHaveBeenCalledTimes(1);
|
|
303
305
|
expect(onStreamEnd.mock.calls[0][0]).toHaveProperty('name', 'Test');
|
|
306
|
+
expect(onStreamEnd.mock.calls[0][2]).toBe('sse');
|
|
304
307
|
});
|
|
305
308
|
test('hooks execute in correct order', async () => {
|
|
306
309
|
const order = [];
|
|
@@ -1064,6 +1067,167 @@ describe('HonoStreamAppBuilder', () => {
|
|
|
1064
1067
|
});
|
|
1065
1068
|
});
|
|
1066
1069
|
// --------------------------------------------------------------------------
|
|
1070
|
+
// streamMode in Lifecycle Hooks
|
|
1071
|
+
// --------------------------------------------------------------------------
|
|
1072
|
+
describe('streamMode in lifecycle hooks', () => {
|
|
1073
|
+
test('onStreamStart receives sse streamMode', async () => {
|
|
1074
|
+
const onStreamStart = vi.fn();
|
|
1075
|
+
const builder = new HonoStreamAppBuilder({ onStreamStart });
|
|
1076
|
+
const RPC = Procedures();
|
|
1077
|
+
RPC.CreateStream('Test', { scope: 'test', version: 1 }, async function* () {
|
|
1078
|
+
yield { ok: true };
|
|
1079
|
+
});
|
|
1080
|
+
builder.register(RPC, () => ({}));
|
|
1081
|
+
const app = builder.build();
|
|
1082
|
+
await app.request('/test/test/1');
|
|
1083
|
+
expect(onStreamStart).toHaveBeenCalledTimes(1);
|
|
1084
|
+
const [, , streamMode] = onStreamStart.mock.calls[0];
|
|
1085
|
+
expect(streamMode).toBe('sse');
|
|
1086
|
+
});
|
|
1087
|
+
test('onStreamEnd receives text streamMode', async () => {
|
|
1088
|
+
const onStreamEnd = vi.fn();
|
|
1089
|
+
const builder = new HonoStreamAppBuilder({ defaultStreamMode: 'text', onStreamEnd });
|
|
1090
|
+
const RPC = Procedures();
|
|
1091
|
+
RPC.CreateStream('Test', { scope: 'test', version: 1 }, async function* () {
|
|
1092
|
+
yield { ok: true };
|
|
1093
|
+
});
|
|
1094
|
+
builder.register(RPC, () => ({}));
|
|
1095
|
+
const app = builder.build();
|
|
1096
|
+
const res = await app.request('/test/test/1');
|
|
1097
|
+
await res.text();
|
|
1098
|
+
expect(onStreamEnd).toHaveBeenCalledTimes(1);
|
|
1099
|
+
const [, , streamMode] = onStreamEnd.mock.calls[0];
|
|
1100
|
+
expect(streamMode).toBe('text');
|
|
1101
|
+
});
|
|
1102
|
+
test('onStreamStart and onStreamEnd receive matching streamMode', async () => {
|
|
1103
|
+
const modes = {};
|
|
1104
|
+
const builder = new HonoStreamAppBuilder({
|
|
1105
|
+
defaultStreamMode: 'text',
|
|
1106
|
+
onStreamStart: (_proc, _c, mode) => { modes.start = mode; },
|
|
1107
|
+
onStreamEnd: (_proc, _c, mode) => { modes.end = mode; },
|
|
1108
|
+
});
|
|
1109
|
+
const RPC = Procedures();
|
|
1110
|
+
RPC.CreateStream('Test', { scope: 'test', version: 1 }, async function* () {
|
|
1111
|
+
yield { ok: true };
|
|
1112
|
+
});
|
|
1113
|
+
builder.register(RPC, () => ({}));
|
|
1114
|
+
const app = builder.build();
|
|
1115
|
+
const res = await app.request('/test/test/1');
|
|
1116
|
+
await res.text();
|
|
1117
|
+
expect(modes.start).toBe('text');
|
|
1118
|
+
expect(modes.end).toBe('text');
|
|
1119
|
+
});
|
|
1120
|
+
});
|
|
1121
|
+
// --------------------------------------------------------------------------
|
|
1122
|
+
// sse() in onMidStreamError
|
|
1123
|
+
// --------------------------------------------------------------------------
|
|
1124
|
+
describe('sse() in onMidStreamError', () => {
|
|
1125
|
+
test('sse() wraps error data with custom event and id', async () => {
|
|
1126
|
+
const builder = new HonoStreamAppBuilder({
|
|
1127
|
+
onMidStreamError: (procedure, c, error) => {
|
|
1128
|
+
return {
|
|
1129
|
+
data: sse({ type: 'error', message: error.message }, { event: 'custom-error', id: 'err-1' }),
|
|
1130
|
+
};
|
|
1131
|
+
},
|
|
1132
|
+
});
|
|
1133
|
+
const RPC = Procedures();
|
|
1134
|
+
RPC.CreateStream('ErrorStream', { scope: 'error', version: 1 }, async function* () {
|
|
1135
|
+
yield { type: 'data', value: 1 };
|
|
1136
|
+
throw new Error('Something broke');
|
|
1137
|
+
});
|
|
1138
|
+
builder.register(RPC, () => ({}));
|
|
1139
|
+
const app = builder.build();
|
|
1140
|
+
const res = await app.request('/error/error-stream/1');
|
|
1141
|
+
const text = await res.text();
|
|
1142
|
+
// Normal yield
|
|
1143
|
+
expect(text).toContain('data: {"type":"data","value":1}');
|
|
1144
|
+
// Error yield with sse() metadata
|
|
1145
|
+
expect(text).toContain('event: custom-error');
|
|
1146
|
+
expect(text).toContain('id: err-1');
|
|
1147
|
+
expect(text).toContain('"type":"error"');
|
|
1148
|
+
});
|
|
1149
|
+
test('string error data without sse() uses default event and id', async () => {
|
|
1150
|
+
const builder = new HonoStreamAppBuilder({
|
|
1151
|
+
onMidStreamError: () => {
|
|
1152
|
+
return { data: 'plain error string' };
|
|
1153
|
+
},
|
|
1154
|
+
});
|
|
1155
|
+
const RPC = Procedures();
|
|
1156
|
+
RPC.CreateStream('ErrorStream', { scope: 'error', version: 1 }, async function* () {
|
|
1157
|
+
yield { count: 1 };
|
|
1158
|
+
throw new Error('fail');
|
|
1159
|
+
});
|
|
1160
|
+
builder.register(RPC, () => ({}));
|
|
1161
|
+
const app = builder.build();
|
|
1162
|
+
const res = await app.request('/error/error-stream/1');
|
|
1163
|
+
const text = await res.text();
|
|
1164
|
+
// String data can't use sse() (not an object), so defaults apply
|
|
1165
|
+
expect(text).toContain('data: plain error string');
|
|
1166
|
+
// event defaults to procedure name when data is provided
|
|
1167
|
+
expect(text).toContain('event: ErrorStream');
|
|
1168
|
+
});
|
|
1169
|
+
});
|
|
1170
|
+
// --------------------------------------------------------------------------
|
|
1171
|
+
// Generic TErrorData
|
|
1172
|
+
// --------------------------------------------------------------------------
|
|
1173
|
+
describe('generic TErrorData', () => {
|
|
1174
|
+
test('typed builder constrains onMidStreamError return type', async () => {
|
|
1175
|
+
const builder = new HonoStreamAppBuilder({
|
|
1176
|
+
onMidStreamError: (_procedure, _c, error) => {
|
|
1177
|
+
// This satisfies MidStreamErrorResult<ErrorPayload>
|
|
1178
|
+
return {
|
|
1179
|
+
data: { type: 'error', code: 'STREAM_FAILED', message: error.message },
|
|
1180
|
+
};
|
|
1181
|
+
},
|
|
1182
|
+
});
|
|
1183
|
+
const RPC = Procedures();
|
|
1184
|
+
RPC.CreateStream('ErrorStream', { scope: 'error', version: 1 }, async function* () {
|
|
1185
|
+
yield { value: 1 };
|
|
1186
|
+
throw new Error('typed error');
|
|
1187
|
+
});
|
|
1188
|
+
builder.register(RPC, () => ({}));
|
|
1189
|
+
const app = builder.build();
|
|
1190
|
+
const res = await app.request('/error/error-stream/1');
|
|
1191
|
+
const text = await res.text();
|
|
1192
|
+
expect(text).toContain('"code":"STREAM_FAILED"');
|
|
1193
|
+
// Error message may be wrapped by Procedures with prefix
|
|
1194
|
+
expect(text).toContain('typed error');
|
|
1195
|
+
});
|
|
1196
|
+
});
|
|
1197
|
+
// --------------------------------------------------------------------------
|
|
1198
|
+
// ProcedureValidationError narrowing in onPreStreamError
|
|
1199
|
+
// --------------------------------------------------------------------------
|
|
1200
|
+
describe('ProcedureValidationError narrowing', () => {
|
|
1201
|
+
test('instanceof check works in onPreStreamError', async () => {
|
|
1202
|
+
let wasValidationError = false;
|
|
1203
|
+
const builder = new HonoStreamAppBuilder({
|
|
1204
|
+
onPreStreamError: (procedure, c, error) => {
|
|
1205
|
+
if (error instanceof ProcedureValidationError) {
|
|
1206
|
+
wasValidationError = true;
|
|
1207
|
+
return c.json({ validation: true, errors: error.errors }, 422);
|
|
1208
|
+
}
|
|
1209
|
+
return c.json({ error: error.message }, 500);
|
|
1210
|
+
},
|
|
1211
|
+
});
|
|
1212
|
+
const RPC = Procedures();
|
|
1213
|
+
RPC.CreateStream('Validated', {
|
|
1214
|
+
scope: 'validated',
|
|
1215
|
+
version: 1,
|
|
1216
|
+
schema: { params: v.object({ count: v.number() }) },
|
|
1217
|
+
}, async function* (ctx, params) {
|
|
1218
|
+
yield { count: params.count };
|
|
1219
|
+
});
|
|
1220
|
+
builder.register(RPC, () => ({}));
|
|
1221
|
+
const app = builder.build();
|
|
1222
|
+
const res = await app.request('/validated/validated/1?count=not-a-number');
|
|
1223
|
+
expect(res.status).toBe(422);
|
|
1224
|
+
expect(wasValidationError).toBe(true);
|
|
1225
|
+
const body = await res.json();
|
|
1226
|
+
expect(body.validation).toBe(true);
|
|
1227
|
+
expect(body.errors).toBeDefined();
|
|
1228
|
+
});
|
|
1229
|
+
});
|
|
1230
|
+
// --------------------------------------------------------------------------
|
|
1067
1231
|
// Integration Test
|
|
1068
1232
|
// --------------------------------------------------------------------------
|
|
1069
1233
|
describe('integration', () => {
|