ts-procedures 9.1.0 → 9.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/CHANGELOG.md +48 -0
- package/agent_config/claude-code/skills/ts-procedures/api-reference.md +4 -0
- package/agent_config/copilot/copilot-instructions.md +2 -0
- package/agent_config/cursor/cursorrules +2 -0
- package/build/codegen/bin/cli.d.ts +4 -0
- package/build/codegen/bin/cli.js +19 -0
- package/build/codegen/bin/cli.js.map +1 -1
- package/build/codegen/bin/cli.test.js +21 -0
- package/build/codegen/bin/cli.test.js.map +1 -1
- package/build/codegen/bin/flag-specs.js +3 -0
- package/build/codegen/bin/flag-specs.js.map +1 -1
- package/build/codegen/check-output.d.ts +28 -0
- package/build/codegen/check-output.js +216 -0
- package/build/codegen/check-output.js.map +1 -0
- package/build/codegen/check-output.test.d.ts +1 -0
- package/build/codegen/check-output.test.js +160 -0
- package/build/codegen/check-output.test.js.map +1 -0
- package/build/codegen/emit/api-route.js +1 -1
- package/build/codegen/emit/api-route.js.map +1 -1
- package/build/codegen/emit/context.d.ts +9 -0
- package/build/codegen/emit/http-stream-route.js +1 -1
- package/build/codegen/emit/http-stream-route.js.map +1 -1
- package/build/codegen/emit/rpc-route.js +1 -1
- package/build/codegen/emit/rpc-route.js.map +1 -1
- package/build/codegen/emit/scope-file.js +14 -0
- package/build/codegen/emit/scope-file.js.map +1 -1
- package/build/codegen/emit/stream-route.js +1 -1
- package/build/codegen/emit/stream-route.js.map +1 -1
- package/build/codegen/emit-scope.test.js +55 -0
- package/build/codegen/emit-scope.test.js.map +1 -1
- package/build/codegen/emit-types.js +19 -0
- package/build/codegen/emit-types.js.map +1 -1
- package/build/codegen/emit-types.test.js +34 -0
- package/build/codegen/emit-types.test.js.map +1 -1
- package/build/codegen/index.d.ts +14 -0
- package/build/codegen/index.js +11 -1
- package/build/codegen/index.js.map +1 -1
- package/build/codegen/targets/ts/name-collision.test.d.ts +1 -0
- package/build/codegen/targets/ts/name-collision.test.js +30 -0
- package/build/codegen/targets/ts/name-collision.test.js.map +1 -0
- package/build/codegen/targets/ts/run.js +13 -0
- package/build/codegen/targets/ts/run.js.map +1 -1
- package/build/errors.d.ts +33 -0
- package/build/errors.js +91 -0
- package/build/errors.js.map +1 -0
- package/build/errors.test.d.ts +1 -0
- package/build/errors.test.js +122 -0
- package/build/errors.test.js.map +1 -0
- package/build/implementations/http/doc-registry.d.ts +28 -0
- package/build/implementations/http/doc-registry.js +96 -0
- package/build/implementations/http/doc-registry.js.map +1 -0
- package/build/implementations/http/doc-registry.test.d.ts +1 -0
- package/build/implementations/http/doc-registry.test.js +516 -0
- package/build/implementations/http/doc-registry.test.js.map +1 -0
- package/build/implementations/http/error-taxonomy.d.ts +249 -0
- package/build/implementations/http/error-taxonomy.js +252 -0
- package/build/implementations/http/error-taxonomy.js.map +1 -0
- package/build/implementations/http/error-taxonomy.test.d.ts +1 -0
- package/build/implementations/http/error-taxonomy.test.js +399 -0
- package/build/implementations/http/error-taxonomy.test.js.map +1 -0
- package/build/implementations/http/express-rpc/error-taxonomy.test.d.ts +1 -0
- package/build/implementations/http/express-rpc/error-taxonomy.test.js +83 -0
- package/build/implementations/http/express-rpc/error-taxonomy.test.js.map +1 -0
- package/build/implementations/http/express-rpc/index.d.ts +125 -0
- package/build/implementations/http/express-rpc/index.js +216 -0
- package/build/implementations/http/express-rpc/index.js.map +1 -0
- package/build/implementations/http/express-rpc/index.test.d.ts +1 -0
- package/build/implementations/http/express-rpc/index.test.js +684 -0
- package/build/implementations/http/express-rpc/index.test.js.map +1 -0
- package/build/implementations/http/express-rpc/types.d.ts +11 -0
- package/build/implementations/http/express-rpc/types.js +2 -0
- package/build/implementations/http/express-rpc/types.js.map +1 -0
- package/build/implementations/http/hono-api/error-taxonomy.test.d.ts +1 -0
- package/build/implementations/http/hono-api/error-taxonomy.test.js +137 -0
- package/build/implementations/http/hono-api/error-taxonomy.test.js.map +1 -0
- package/build/implementations/http/hono-api/index.d.ts +151 -0
- package/build/implementations/http/hono-api/index.js +344 -0
- package/build/implementations/http/hono-api/index.js.map +1 -0
- package/build/implementations/http/hono-api/index.test.d.ts +1 -0
- package/build/implementations/http/hono-api/index.test.js +992 -0
- package/build/implementations/http/hono-api/index.test.js.map +1 -0
- package/build/implementations/http/hono-api/types.d.ts +13 -0
- package/build/implementations/http/hono-api/types.js +2 -0
- package/build/implementations/http/hono-api/types.js.map +1 -0
- package/build/implementations/http/hono-rpc/error-taxonomy.test.d.ts +1 -0
- package/build/implementations/http/hono-rpc/error-taxonomy.test.js +64 -0
- package/build/implementations/http/hono-rpc/error-taxonomy.test.js.map +1 -0
- package/build/implementations/http/hono-rpc/index.d.ts +130 -0
- package/build/implementations/http/hono-rpc/index.js +209 -0
- package/build/implementations/http/hono-rpc/index.js.map +1 -0
- package/build/implementations/http/hono-rpc/index.test.d.ts +1 -0
- package/build/implementations/http/hono-rpc/index.test.js +828 -0
- package/build/implementations/http/hono-rpc/index.test.js.map +1 -0
- package/build/implementations/http/hono-rpc/types.d.ts +11 -0
- package/build/implementations/http/hono-rpc/types.js +2 -0
- package/build/implementations/http/hono-rpc/types.js.map +1 -0
- package/build/implementations/http/hono-stream/error-taxonomy.test.d.ts +1 -0
- package/build/implementations/http/hono-stream/error-taxonomy.test.js +159 -0
- package/build/implementations/http/hono-stream/error-taxonomy.test.js.map +1 -0
- package/build/implementations/http/hono-stream/index.d.ts +171 -0
- package/build/implementations/http/hono-stream/index.js +415 -0
- package/build/implementations/http/hono-stream/index.js.map +1 -0
- package/build/implementations/http/hono-stream/index.test.d.ts +1 -0
- package/build/implementations/http/hono-stream/index.test.js +1383 -0
- package/build/implementations/http/hono-stream/index.test.js.map +1 -0
- package/build/implementations/http/hono-stream/types.d.ts +15 -0
- package/build/implementations/http/hono-stream/types.js +2 -0
- package/build/implementations/http/hono-stream/types.js.map +1 -0
- package/build/implementations/http/on-request-error.test.d.ts +1 -0
- package/build/implementations/http/on-request-error.test.js +173 -0
- package/build/implementations/http/on-request-error.test.js.map +1 -0
- package/build/implementations/http/route-errors.test.d.ts +1 -0
- package/build/implementations/http/route-errors.test.js +139 -0
- package/build/implementations/http/route-errors.test.js.map +1 -0
- package/build/implementations/types.d.ts +192 -0
- package/build/implementations/types.js +2 -0
- package/build/implementations/types.js.map +1 -0
- package/build/index.d.ts +165 -0
- package/build/index.js +258 -0
- package/build/index.js.map +1 -0
- package/build/index.test.d.ts +1 -0
- package/build/index.test.js +920 -0
- package/build/index.test.js.map +1 -0
- package/build/schema/extract-json-schema.d.ts +2 -0
- package/build/schema/extract-json-schema.js +12 -0
- package/build/schema/extract-json-schema.js.map +1 -0
- package/build/schema/extract-json-schema.test.d.ts +1 -0
- package/build/schema/extract-json-schema.test.js +23 -0
- package/build/schema/extract-json-schema.test.js.map +1 -0
- package/build/schema/parser.d.ts +28 -0
- package/build/schema/parser.js +170 -0
- package/build/schema/parser.js.map +1 -0
- package/build/schema/parser.test.d.ts +1 -0
- package/build/schema/parser.test.js +120 -0
- package/build/schema/parser.test.js.map +1 -0
- package/build/schema/resolve-schema-lib.d.ts +12 -0
- package/build/schema/resolve-schema-lib.js +11 -0
- package/build/schema/resolve-schema-lib.js.map +1 -0
- package/build/schema/resolve-schema-lib.test.d.ts +1 -0
- package/build/schema/resolve-schema-lib.test.js +17 -0
- package/build/schema/resolve-schema-lib.test.js.map +1 -0
- package/build/schema/types.d.ts +8 -0
- package/build/schema/types.js +2 -0
- package/build/schema/types.js.map +1 -0
- package/build/stack-utils.d.ts +25 -0
- package/build/stack-utils.js +95 -0
- package/build/stack-utils.js.map +1 -0
- package/build/stack-utils.test.d.ts +1 -0
- package/build/stack-utils.test.js +80 -0
- package/build/stack-utils.test.js.map +1 -0
- package/docs/client-and-codegen.md +17 -0
- package/docs/migration-v8-to-v9.md +12 -4
- package/package.json +1 -1
- package/src/codegen/bin/cli.test.ts +28 -0
- package/src/codegen/bin/cli.ts +26 -0
- package/src/codegen/bin/flag-specs.ts +3 -0
- package/src/codegen/check-output.test.ts +177 -0
- package/src/codegen/check-output.ts +262 -0
- package/src/codegen/emit/api-route.ts +1 -1
- package/src/codegen/emit/context.ts +9 -0
- package/src/codegen/emit/http-stream-route.ts +1 -1
- package/src/codegen/emit/rpc-route.ts +1 -1
- package/src/codegen/emit/scope-file.ts +17 -0
- package/src/codegen/emit/stream-route.ts +1 -1
- package/src/codegen/emit-scope.test.ts +60 -0
- package/src/codegen/emit-types.test.ts +36 -0
- package/src/codegen/emit-types.ts +20 -0
- package/src/codegen/index.ts +23 -1
- package/src/codegen/targets/ts/name-collision.test.ts +34 -0
- package/src/codegen/targets/ts/run.ts +16 -0
|
@@ -0,0 +1,415 @@
|
|
|
1
|
+
import { Hono } from 'hono';
|
|
2
|
+
import { streamSSE, streamText } from 'hono/streaming';
|
|
3
|
+
import { kebabCase } from 'es-toolkit/string';
|
|
4
|
+
import { castArray } from 'es-toolkit/compat';
|
|
5
|
+
import { ProcedureValidationError } from '../../../errors.js';
|
|
6
|
+
import { defineErrorTaxonomy, resolveErrorResponse, } from '../error-taxonomy.js';
|
|
7
|
+
export { defineErrorTaxonomy };
|
|
8
|
+
const sseMetadata = new WeakMap();
|
|
9
|
+
export function sse(data, options) {
|
|
10
|
+
sseMetadata.set(data, options ?? {});
|
|
11
|
+
return data;
|
|
12
|
+
}
|
|
13
|
+
function getSSEMeta(value) {
|
|
14
|
+
if (typeof value === 'object' && value !== null) {
|
|
15
|
+
return sseMetadata.get(value);
|
|
16
|
+
}
|
|
17
|
+
return undefined;
|
|
18
|
+
}
|
|
19
|
+
/**
|
|
20
|
+
* Builder class for creating a Hono application with streaming RPC routes.
|
|
21
|
+
*
|
|
22
|
+
* Usage:
|
|
23
|
+
* const StreamRPC = Procedures<StreamContext, RPCConfig>()
|
|
24
|
+
*
|
|
25
|
+
* const streamApp = new HonoStreamAppBuilder()
|
|
26
|
+
* .register(StreamRPC, (c): Promise<StreamContext> => { /* context resolution logic * / })
|
|
27
|
+
* .build();
|
|
28
|
+
*
|
|
29
|
+
* const app = streamApp.app; // Hono application
|
|
30
|
+
* const docs = streamApp.docs; // Stream route documentation
|
|
31
|
+
*/
|
|
32
|
+
export class HonoStreamAppBuilder {
|
|
33
|
+
config;
|
|
34
|
+
/**
|
|
35
|
+
* Constructor for HonoStreamAppBuilder.
|
|
36
|
+
*/
|
|
37
|
+
constructor(config) {
|
|
38
|
+
this.config = config;
|
|
39
|
+
if (config?.app) {
|
|
40
|
+
this._app = config.app;
|
|
41
|
+
}
|
|
42
|
+
if (config?.onRequestStart) {
|
|
43
|
+
this._app.use('*', async (c, next) => {
|
|
44
|
+
config.onRequestStart(c);
|
|
45
|
+
await next();
|
|
46
|
+
});
|
|
47
|
+
}
|
|
48
|
+
}
|
|
49
|
+
/**
|
|
50
|
+
* Generates the stream route path based on the RPC configuration.
|
|
51
|
+
*/
|
|
52
|
+
static makeStreamHttpRoutePath({ name, config, prefix, }) {
|
|
53
|
+
const normalizedPrefix = prefix ? (prefix.startsWith('/') ? prefix : `/${prefix}`) : '';
|
|
54
|
+
return `${normalizedPrefix}/${castArray(config.scope).map(kebabCase).join('/')}/${kebabCase(name)}/${String(config.version).trim()}`;
|
|
55
|
+
}
|
|
56
|
+
/**
|
|
57
|
+
* Instance method wrapper for makeStreamHttpRoutePath that uses the builder's pathPrefix.
|
|
58
|
+
*/
|
|
59
|
+
makeStreamHttpRoutePath(name, config) {
|
|
60
|
+
return HonoStreamAppBuilder.makeStreamHttpRoutePath({
|
|
61
|
+
name,
|
|
62
|
+
config,
|
|
63
|
+
prefix: this.config?.pathPrefix,
|
|
64
|
+
});
|
|
65
|
+
}
|
|
66
|
+
factories = [];
|
|
67
|
+
_app = new Hono();
|
|
68
|
+
_docs = [];
|
|
69
|
+
_skipped = [];
|
|
70
|
+
get app() {
|
|
71
|
+
return this._app;
|
|
72
|
+
}
|
|
73
|
+
get docs() {
|
|
74
|
+
return this._docs;
|
|
75
|
+
}
|
|
76
|
+
/**
|
|
77
|
+
* Procedures that were skipped at `build()` time because they don't fit
|
|
78
|
+
* this builder (e.g. non-streaming procedures registered against the
|
|
79
|
+
* stream builder). Surfaced via `DocSource.skippedProcedures` so
|
|
80
|
+
* DocRegistry can warn about coverage gaps.
|
|
81
|
+
*/
|
|
82
|
+
get skippedProcedures() {
|
|
83
|
+
return this._skipped;
|
|
84
|
+
}
|
|
85
|
+
/**
|
|
86
|
+
* Registers a procedure factory with its context.
|
|
87
|
+
* Only streaming procedures (created with CreateStream) will be registered.
|
|
88
|
+
*/
|
|
89
|
+
register(factory, factoryContext, options) {
|
|
90
|
+
this.factories.push({
|
|
91
|
+
factory,
|
|
92
|
+
factoryContext,
|
|
93
|
+
streamMode: options?.streamMode,
|
|
94
|
+
extendProcedureDoc: options?.extendProcedureDoc,
|
|
95
|
+
});
|
|
96
|
+
return this;
|
|
97
|
+
}
|
|
98
|
+
/**
|
|
99
|
+
* Creates a route handler for streaming procedures.
|
|
100
|
+
*/
|
|
101
|
+
createStreamHandler(procedure, factoryContext, streamMode) {
|
|
102
|
+
return async (c) => {
|
|
103
|
+
try {
|
|
104
|
+
const context = typeof factoryContext === 'function' ? await factoryContext(c) : factoryContext;
|
|
105
|
+
// GET: query params, POST: JSON body
|
|
106
|
+
const params = c.req.method === 'GET'
|
|
107
|
+
? Object.fromEntries(new URL(c.req.url).searchParams)
|
|
108
|
+
: await c.req.json().catch(() => ({}));
|
|
109
|
+
// Validate params BEFORE starting the stream. Throw so both the
|
|
110
|
+
// validation path and the outer-catch (context resolution) path flow
|
|
111
|
+
// through one dispatch site.
|
|
112
|
+
if (procedure.config.validation?.params) {
|
|
113
|
+
const { errors } = procedure.config.validation.params(params);
|
|
114
|
+
if (errors) {
|
|
115
|
+
throw new ProcedureValidationError(procedure.name, `Validation error for ${procedure.name}`, errors);
|
|
116
|
+
}
|
|
117
|
+
}
|
|
118
|
+
if (this.config?.onStreamStart) {
|
|
119
|
+
this.config.onStreamStart(procedure, c, streamMode);
|
|
120
|
+
}
|
|
121
|
+
if (streamMode === 'sse') {
|
|
122
|
+
return this.handleSSEStream(procedure, context, params, c);
|
|
123
|
+
}
|
|
124
|
+
else {
|
|
125
|
+
return this.handleTextStream(procedure, context, params, c);
|
|
126
|
+
}
|
|
127
|
+
}
|
|
128
|
+
catch (error) {
|
|
129
|
+
// Observer fires first — cross-cutting, cannot alter dispatch or the
|
|
130
|
+
// response. Swallow any throw from the observer so the primary flow
|
|
131
|
+
// never breaks because of instrumentation.
|
|
132
|
+
if (this.config?.onRequestError) {
|
|
133
|
+
try {
|
|
134
|
+
await this.config.onRequestError({ err: error, procedure, raw: c });
|
|
135
|
+
}
|
|
136
|
+
catch (observerErr) {
|
|
137
|
+
console.error('[ts-procedures hono-stream] onRequestError threw — swallowed:', observerErr);
|
|
138
|
+
}
|
|
139
|
+
}
|
|
140
|
+
// Dispatch: taxonomy → onError → hard default. The two modes are
|
|
141
|
+
// peers; developers configure whichever fits their app.
|
|
142
|
+
if (this.config?.errors || this.config?.unknownError) {
|
|
143
|
+
const resolved = resolveErrorResponse({
|
|
144
|
+
err: error,
|
|
145
|
+
userTaxonomy: this.config.errors,
|
|
146
|
+
unknownError: this.config.unknownError,
|
|
147
|
+
procedure,
|
|
148
|
+
raw: c,
|
|
149
|
+
});
|
|
150
|
+
if (resolved) {
|
|
151
|
+
await resolved.runOnCatch();
|
|
152
|
+
return c.json(resolved.body, resolved.statusCode);
|
|
153
|
+
}
|
|
154
|
+
}
|
|
155
|
+
if (this.config?.onError) {
|
|
156
|
+
return this.config.onError(procedure, c, error);
|
|
157
|
+
}
|
|
158
|
+
return c.json({ error: error.message }, 500);
|
|
159
|
+
}
|
|
160
|
+
};
|
|
161
|
+
}
|
|
162
|
+
/**
|
|
163
|
+
* Handles SSE streaming mode.
|
|
164
|
+
*/
|
|
165
|
+
handleSSEStream(procedure, context, params, c) {
|
|
166
|
+
return streamSSE(c, async (stream) => {
|
|
167
|
+
// Pass isPrevalidated: true since we already validated params in createStreamHandler
|
|
168
|
+
const generator = procedure.handler({ ...context, signal: c.req.raw.signal, isPrevalidated: true }, params);
|
|
169
|
+
stream.onAbort(async () => {
|
|
170
|
+
await generator.return(undefined);
|
|
171
|
+
});
|
|
172
|
+
let eventId = 0;
|
|
173
|
+
try {
|
|
174
|
+
const iterator = generator[Symbol.asyncIterator]();
|
|
175
|
+
let iterResult = await iterator.next();
|
|
176
|
+
while (!iterResult.done) {
|
|
177
|
+
const value = iterResult.value;
|
|
178
|
+
const currentId = eventId++;
|
|
179
|
+
const meta = getSSEMeta(value);
|
|
180
|
+
const data = typeof value === 'string'
|
|
181
|
+
? value
|
|
182
|
+
: value != null
|
|
183
|
+
? JSON.stringify(value)
|
|
184
|
+
: '';
|
|
185
|
+
await stream.writeSSE({
|
|
186
|
+
data,
|
|
187
|
+
event: meta?.event ?? procedure.name,
|
|
188
|
+
id: meta?.id ?? String(currentId),
|
|
189
|
+
...(meta?.retry !== undefined && { retry: meta.retry }),
|
|
190
|
+
});
|
|
191
|
+
iterResult = await iterator.next();
|
|
192
|
+
}
|
|
193
|
+
// Send return value as a special 'return' event (if present)
|
|
194
|
+
if (iterResult.value !== undefined) {
|
|
195
|
+
const returnData = typeof iterResult.value === 'string'
|
|
196
|
+
? iterResult.value
|
|
197
|
+
: JSON.stringify(iterResult.value);
|
|
198
|
+
await stream.writeSSE({
|
|
199
|
+
data: returnData,
|
|
200
|
+
event: 'return',
|
|
201
|
+
id: String(eventId++),
|
|
202
|
+
});
|
|
203
|
+
}
|
|
204
|
+
}
|
|
205
|
+
catch (error) {
|
|
206
|
+
// Dispatch order mirrors hono-rpc: taxonomy → onMidStreamError → default.
|
|
207
|
+
// The HTTP status is already committed (200 OK headers were sent the
|
|
208
|
+
// moment streaming started), so the taxonomy here only drives the
|
|
209
|
+
// wire-protocol body shape — clients dispatch through the same error
|
|
210
|
+
// registry as RPC/API responses by reading `data.name`.
|
|
211
|
+
let errorData;
|
|
212
|
+
let sseEventOverride;
|
|
213
|
+
let sseIdOverride;
|
|
214
|
+
let sseRetryOverride;
|
|
215
|
+
let runOnCatch;
|
|
216
|
+
if (this.config?.errors || this.config?.unknownError) {
|
|
217
|
+
const resolved = resolveErrorResponse({
|
|
218
|
+
err: error,
|
|
219
|
+
userTaxonomy: this.config.errors,
|
|
220
|
+
unknownError: this.config.unknownError,
|
|
221
|
+
procedure,
|
|
222
|
+
raw: c,
|
|
223
|
+
});
|
|
224
|
+
if (resolved) {
|
|
225
|
+
errorData = resolved.body;
|
|
226
|
+
sseEventOverride = 'error';
|
|
227
|
+
runOnCatch = resolved.runOnCatch;
|
|
228
|
+
}
|
|
229
|
+
}
|
|
230
|
+
if (errorData === undefined && this.config?.onMidStreamError) {
|
|
231
|
+
const errorResult = this.config.onMidStreamError(procedure, c, error);
|
|
232
|
+
if (errorResult?.data !== undefined) {
|
|
233
|
+
errorData = errorResult.data;
|
|
234
|
+
sseEventOverride = procedure.name;
|
|
235
|
+
}
|
|
236
|
+
}
|
|
237
|
+
if (errorData === undefined) {
|
|
238
|
+
errorData = { error: error.message };
|
|
239
|
+
sseEventOverride = 'error';
|
|
240
|
+
}
|
|
241
|
+
const sseMeta = getSSEMeta(errorData);
|
|
242
|
+
await stream.writeSSE({
|
|
243
|
+
data: typeof errorData === 'string' ? errorData : JSON.stringify(errorData),
|
|
244
|
+
event: sseMeta?.event ?? sseEventOverride ?? 'error',
|
|
245
|
+
id: sseMeta?.id ?? sseIdOverride ?? String(eventId++),
|
|
246
|
+
...((sseMeta?.retry ?? sseRetryOverride) !== undefined && {
|
|
247
|
+
retry: (sseMeta?.retry ?? sseRetryOverride),
|
|
248
|
+
}),
|
|
249
|
+
});
|
|
250
|
+
if (runOnCatch) {
|
|
251
|
+
await runOnCatch();
|
|
252
|
+
}
|
|
253
|
+
// closeStream defaults to true if not specified
|
|
254
|
+
// (stream closes naturally after this handler completes)
|
|
255
|
+
}
|
|
256
|
+
finally {
|
|
257
|
+
if (this.config?.onStreamEnd) {
|
|
258
|
+
this.config.onStreamEnd(procedure, c, 'sse');
|
|
259
|
+
}
|
|
260
|
+
if (this.config?.onRequestEnd) {
|
|
261
|
+
this.config.onRequestEnd(c);
|
|
262
|
+
}
|
|
263
|
+
}
|
|
264
|
+
});
|
|
265
|
+
}
|
|
266
|
+
/**
|
|
267
|
+
* Handles text streaming mode.
|
|
268
|
+
*/
|
|
269
|
+
handleTextStream(procedure, context, params, c) {
|
|
270
|
+
return streamText(c, async (stream) => {
|
|
271
|
+
// Pass isPrevalidated: true since we already validated params in createStreamHandler
|
|
272
|
+
const generator = procedure.handler({ ...context, signal: c.req.raw.signal, isPrevalidated: true }, params);
|
|
273
|
+
stream.onAbort(async () => {
|
|
274
|
+
await generator.return(undefined);
|
|
275
|
+
});
|
|
276
|
+
try {
|
|
277
|
+
for await (const value of generator) {
|
|
278
|
+
await stream.writeln(JSON.stringify(value));
|
|
279
|
+
}
|
|
280
|
+
}
|
|
281
|
+
catch (error) {
|
|
282
|
+
// Same dispatch order as SSE — taxonomy first, onMidStreamError next,
|
|
283
|
+
// hard default last. Text streams have no event/id metadata, so we
|
|
284
|
+
// only forward the body bytes.
|
|
285
|
+
let errorData;
|
|
286
|
+
let runOnCatch;
|
|
287
|
+
if (this.config?.errors || this.config?.unknownError) {
|
|
288
|
+
const resolved = resolveErrorResponse({
|
|
289
|
+
err: error,
|
|
290
|
+
userTaxonomy: this.config.errors,
|
|
291
|
+
unknownError: this.config.unknownError,
|
|
292
|
+
procedure,
|
|
293
|
+
raw: c,
|
|
294
|
+
});
|
|
295
|
+
if (resolved) {
|
|
296
|
+
errorData = resolved.body;
|
|
297
|
+
runOnCatch = resolved.runOnCatch;
|
|
298
|
+
}
|
|
299
|
+
}
|
|
300
|
+
if (errorData === undefined && this.config?.onMidStreamError) {
|
|
301
|
+
const errorResult = this.config.onMidStreamError(procedure, c, error);
|
|
302
|
+
if (errorResult?.data !== undefined) {
|
|
303
|
+
errorData = errorResult.data;
|
|
304
|
+
}
|
|
305
|
+
}
|
|
306
|
+
if (errorData === undefined) {
|
|
307
|
+
errorData = { error: error.message };
|
|
308
|
+
}
|
|
309
|
+
await stream.writeln(JSON.stringify(errorData));
|
|
310
|
+
if (runOnCatch) {
|
|
311
|
+
await runOnCatch();
|
|
312
|
+
}
|
|
313
|
+
}
|
|
314
|
+
finally {
|
|
315
|
+
if (this.config?.onStreamEnd) {
|
|
316
|
+
this.config.onStreamEnd(procedure, c, 'text');
|
|
317
|
+
}
|
|
318
|
+
if (this.config?.onRequestEnd) {
|
|
319
|
+
this.config.onRequestEnd(c);
|
|
320
|
+
}
|
|
321
|
+
}
|
|
322
|
+
});
|
|
323
|
+
}
|
|
324
|
+
/**
|
|
325
|
+
* Builds and returns the Hono application with registered streaming routes.
|
|
326
|
+
*/
|
|
327
|
+
build() {
|
|
328
|
+
this.factories.forEach(({ factory, factoryContext, streamMode, extendProcedureDoc }) => {
|
|
329
|
+
const mode = streamMode ?? this.config?.defaultStreamMode ?? 'sse';
|
|
330
|
+
const procedures = factory.getProcedures();
|
|
331
|
+
// Track non-streaming procedures so DocRegistry can warn about coverage
|
|
332
|
+
// gaps (e.g. a regular procedure registered with this builder will get
|
|
333
|
+
// dropped here and needs to be registered with HonoRPCAppBuilder).
|
|
334
|
+
for (const p of procedures) {
|
|
335
|
+
if (p.isStream !== true) {
|
|
336
|
+
const reason = 'Non-streaming procedure registered with HonoStreamAppBuilder — register it with HonoRPCAppBuilder (or HonoApiAppBuilder) instead.';
|
|
337
|
+
this._skipped.push({ name: p.name, reason });
|
|
338
|
+
console.warn(`[ts-procedures hono-stream] Skipping procedure "${p.name}": ${reason}`);
|
|
339
|
+
}
|
|
340
|
+
}
|
|
341
|
+
procedures
|
|
342
|
+
.filter((p) => p.isStream === true)
|
|
343
|
+
.forEach((procedure) => {
|
|
344
|
+
const route = this.buildStreamHttpRouteDoc(procedure, mode, extendProcedureDoc);
|
|
345
|
+
this._docs.push(route);
|
|
346
|
+
const handler = this.createStreamHandler(procedure, factoryContext, mode);
|
|
347
|
+
// Register both GET and POST handlers
|
|
348
|
+
this._app.get(route.path, handler);
|
|
349
|
+
this._app.post(route.path, handler);
|
|
350
|
+
});
|
|
351
|
+
});
|
|
352
|
+
return this._app;
|
|
353
|
+
}
|
|
354
|
+
/**
|
|
355
|
+
* Generates the Stream HTTP route documentation for the given procedure.
|
|
356
|
+
*/
|
|
357
|
+
buildStreamHttpRouteDoc(procedure, streamMode, extendProcedureDoc) {
|
|
358
|
+
const { config } = procedure;
|
|
359
|
+
const path = HonoStreamAppBuilder.makeStreamHttpRoutePath({
|
|
360
|
+
name: procedure.name,
|
|
361
|
+
config,
|
|
362
|
+
prefix: this.config?.pathPrefix,
|
|
363
|
+
});
|
|
364
|
+
// POST first so codegen (which uses `methods[0]`) defaults to POST. POST is
|
|
365
|
+
// the canonical method for streaming procedures because it can carry a body
|
|
366
|
+
// for params; GET is the supplementary method for query-string callers.
|
|
367
|
+
const methods = ['post', 'get'];
|
|
368
|
+
const jsonSchema = {};
|
|
369
|
+
if (config.schema?.params) {
|
|
370
|
+
jsonSchema.params = config.schema.params;
|
|
371
|
+
}
|
|
372
|
+
if (streamMode === 'sse') {
|
|
373
|
+
jsonSchema.yieldType = {
|
|
374
|
+
type: 'object',
|
|
375
|
+
description: 'SSE message envelope. The data field contains the procedure yield value.',
|
|
376
|
+
required: ['data', 'event', 'id'],
|
|
377
|
+
properties: {
|
|
378
|
+
data: config.schema?.yieldType ?? {},
|
|
379
|
+
event: { type: 'string' },
|
|
380
|
+
id: { type: 'string' },
|
|
381
|
+
retry: { type: 'number' },
|
|
382
|
+
},
|
|
383
|
+
};
|
|
384
|
+
}
|
|
385
|
+
else if (config.schema?.yieldType) {
|
|
386
|
+
// Text mode: pass through as-is
|
|
387
|
+
jsonSchema.yieldType = config.schema.yieldType;
|
|
388
|
+
}
|
|
389
|
+
if (config.schema?.returnType) {
|
|
390
|
+
jsonSchema.returnType = config.schema.returnType;
|
|
391
|
+
}
|
|
392
|
+
const base = {
|
|
393
|
+
kind: 'stream',
|
|
394
|
+
name: procedure.name,
|
|
395
|
+
version: config.version,
|
|
396
|
+
scope: config.scope,
|
|
397
|
+
path,
|
|
398
|
+
methods: [...methods],
|
|
399
|
+
streamMode,
|
|
400
|
+
jsonSchema,
|
|
401
|
+
};
|
|
402
|
+
if (config.errors && config.errors.length > 0) {
|
|
403
|
+
base.errors = [...config.errors];
|
|
404
|
+
}
|
|
405
|
+
let extendedDoc = {};
|
|
406
|
+
if (extendProcedureDoc) {
|
|
407
|
+
extendedDoc = extendProcedureDoc({ base, procedure });
|
|
408
|
+
}
|
|
409
|
+
return {
|
|
410
|
+
...extendedDoc,
|
|
411
|
+
...base,
|
|
412
|
+
};
|
|
413
|
+
}
|
|
414
|
+
}
|
|
415
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../../src/implementations/http/hono-stream/index.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export {};
|