ts-procedures 3.1.0 → 3.3.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.
Files changed (54) hide show
  1. package/README.md +222 -2
  2. package/build/errors.d.ts +19 -3
  3. package/build/errors.js +54 -5
  4. package/build/errors.js.map +1 -1
  5. package/build/errors.test.js +82 -0
  6. package/build/errors.test.js.map +1 -1
  7. package/build/exports.d.ts +1 -0
  8. package/build/exports.js +1 -0
  9. package/build/exports.js.map +1 -1
  10. package/build/implementations/http/hono-stream/index.d.ts +92 -0
  11. package/build/implementations/http/hono-stream/index.js +229 -0
  12. package/build/implementations/http/hono-stream/index.js.map +1 -0
  13. package/build/implementations/http/hono-stream/index.test.d.ts +1 -0
  14. package/build/implementations/http/hono-stream/index.test.js +681 -0
  15. package/build/implementations/http/hono-stream/index.test.js.map +1 -0
  16. package/build/implementations/http/hono-stream/types.d.ts +24 -0
  17. package/build/implementations/http/hono-stream/types.js +2 -0
  18. package/build/implementations/http/hono-stream/types.js.map +1 -0
  19. package/build/implementations/types.d.ts +15 -1
  20. package/build/index.d.ts +62 -3
  21. package/build/index.js +111 -6
  22. package/build/index.js.map +1 -1
  23. package/build/index.test.js +385 -2
  24. package/build/index.test.js.map +1 -1
  25. package/build/schema/compute-schema.d.ts +9 -2
  26. package/build/schema/compute-schema.js +9 -3
  27. package/build/schema/compute-schema.js.map +1 -1
  28. package/build/schema/parser.d.ts +6 -0
  29. package/build/schema/parser.js +42 -0
  30. package/build/schema/parser.js.map +1 -1
  31. package/build/schema/types.d.ts +1 -0
  32. package/build/stack-utils.d.ts +25 -0
  33. package/build/stack-utils.js +95 -0
  34. package/build/stack-utils.js.map +1 -0
  35. package/build/stack-utils.test.d.ts +1 -0
  36. package/build/stack-utils.test.js +80 -0
  37. package/build/stack-utils.test.js.map +1 -0
  38. package/package.json +1 -1
  39. package/src/errors.test.ts +110 -0
  40. package/src/errors.ts +65 -3
  41. package/src/exports.ts +1 -0
  42. package/src/implementations/http/README.md +87 -55
  43. package/src/implementations/http/hono-stream/README.md +261 -0
  44. package/src/implementations/http/hono-stream/index.test.ts +1009 -0
  45. package/src/implementations/http/hono-stream/index.ts +327 -0
  46. package/src/implementations/http/hono-stream/types.ts +29 -0
  47. package/src/implementations/types.ts +17 -1
  48. package/src/index.test.ts +525 -41
  49. package/src/index.ts +210 -8
  50. package/src/schema/compute-schema.ts +15 -3
  51. package/src/schema/parser.ts +55 -4
  52. package/src/schema/types.ts +4 -0
  53. package/src/stack-utils.test.ts +94 -0
  54. package/src/stack-utils.ts +129 -0
@@ -0,0 +1,229 @@
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
+ /**
6
+ * Builder class for creating a Hono application with streaming RPC routes.
7
+ *
8
+ * Usage:
9
+ * const StreamRPC = Procedures<StreamContext, RPCConfig>()
10
+ *
11
+ * const streamApp = new HonoStreamAppBuilder()
12
+ * .register(StreamRPC, (c): Promise<StreamContext> => { /* context resolution logic * / })
13
+ * .build();
14
+ *
15
+ * const app = streamApp.app; // Hono application
16
+ * const docs = streamApp.docs; // Stream route documentation
17
+ */
18
+ export class HonoStreamAppBuilder {
19
+ config;
20
+ /**
21
+ * Constructor for HonoStreamAppBuilder.
22
+ */
23
+ constructor(config) {
24
+ this.config = config;
25
+ if (config?.app) {
26
+ this._app = config.app;
27
+ }
28
+ if (config?.onRequestStart) {
29
+ this._app.use('*', async (c, next) => {
30
+ config.onRequestStart(c);
31
+ await next();
32
+ });
33
+ }
34
+ if (config?.onRequestEnd) {
35
+ this._app.use('*', async (c, next) => {
36
+ await next();
37
+ config.onRequestEnd(c);
38
+ });
39
+ }
40
+ }
41
+ /**
42
+ * Generates the stream route path based on the RPC configuration.
43
+ */
44
+ static makeStreamHttpRoutePath({ name, config, prefix, }) {
45
+ const normalizedPrefix = prefix ? (prefix.startsWith('/') ? prefix : `/${prefix}`) : '';
46
+ return `${normalizedPrefix}/${castArray(config.scope).map(kebabCase).join('/')}/${kebabCase(name)}/${String(config.version).trim()}`;
47
+ }
48
+ /**
49
+ * Instance method wrapper for makeStreamHttpRoutePath that uses the builder's pathPrefix.
50
+ */
51
+ makeStreamHttpRoutePath(name, config) {
52
+ return HonoStreamAppBuilder.makeStreamHttpRoutePath({
53
+ name,
54
+ config,
55
+ prefix: this.config?.pathPrefix,
56
+ });
57
+ }
58
+ factories = [];
59
+ _app = new Hono();
60
+ _docs = [];
61
+ get app() {
62
+ return this._app;
63
+ }
64
+ get docs() {
65
+ return this._docs;
66
+ }
67
+ /**
68
+ * Registers a procedure factory with its context.
69
+ * Only streaming procedures (created with CreateStream) will be registered.
70
+ */
71
+ register(factory, factoryContext, options) {
72
+ this.factories.push({
73
+ factory,
74
+ factoryContext,
75
+ streamMode: options?.streamMode,
76
+ extendProcedureDoc: options?.extendProcedureDoc,
77
+ });
78
+ return this;
79
+ }
80
+ /**
81
+ * Creates a route handler for streaming procedures.
82
+ */
83
+ createStreamHandler(procedure, factoryContext, streamMode) {
84
+ return async (c) => {
85
+ try {
86
+ const context = typeof factoryContext === 'function'
87
+ ? await factoryContext(c)
88
+ : factoryContext;
89
+ // GET: query params, POST: JSON body
90
+ const params = c.req.method === 'GET'
91
+ ? Object.fromEntries(new URL(c.req.url).searchParams)
92
+ : await c.req.json().catch(() => ({}));
93
+ if (this.config?.onStreamStart) {
94
+ this.config.onStreamStart(procedure, c);
95
+ }
96
+ if (streamMode === 'sse') {
97
+ return this.handleSSEStream(procedure, context, params, c);
98
+ }
99
+ else {
100
+ return this.handleTextStream(procedure, context, params, c);
101
+ }
102
+ }
103
+ catch (error) {
104
+ if (this.config?.onStreamError) {
105
+ return this.config.onStreamError(procedure, c, error);
106
+ }
107
+ return c.json({ error: error.message }, 500);
108
+ }
109
+ };
110
+ }
111
+ /**
112
+ * Handles SSE streaming mode.
113
+ */
114
+ handleSSEStream(procedure, context, params, c) {
115
+ return streamSSE(c, async (stream) => {
116
+ const generator = procedure.handler(context, params);
117
+ stream.onAbort(async () => {
118
+ await generator.return(undefined);
119
+ });
120
+ try {
121
+ let eventId = 0;
122
+ for await (const value of generator) {
123
+ await stream.writeSSE({
124
+ data: JSON.stringify(value),
125
+ event: procedure.name,
126
+ id: String(eventId++),
127
+ });
128
+ }
129
+ }
130
+ catch (error) {
131
+ // Write error as SSE event before closing
132
+ await stream.writeSSE({
133
+ data: JSON.stringify({ error: error.message }),
134
+ event: 'error',
135
+ });
136
+ }
137
+ finally {
138
+ if (this.config?.onStreamEnd) {
139
+ this.config.onStreamEnd(procedure, c);
140
+ }
141
+ }
142
+ });
143
+ }
144
+ /**
145
+ * Handles text streaming mode.
146
+ */
147
+ handleTextStream(procedure, context, params, c) {
148
+ return streamText(c, async (stream) => {
149
+ const generator = procedure.handler(context, params);
150
+ stream.onAbort(async () => {
151
+ await generator.return(undefined);
152
+ });
153
+ try {
154
+ for await (const value of generator) {
155
+ await stream.writeln(JSON.stringify(value));
156
+ }
157
+ }
158
+ catch (error) {
159
+ // Write error as JSON line before closing
160
+ await stream.writeln(JSON.stringify({ error: error.message }));
161
+ }
162
+ finally {
163
+ if (this.config?.onStreamEnd) {
164
+ this.config.onStreamEnd(procedure, c);
165
+ }
166
+ }
167
+ });
168
+ }
169
+ /**
170
+ * Builds and returns the Hono application with registered streaming routes.
171
+ */
172
+ build() {
173
+ this.factories.forEach(({ factory, factoryContext, streamMode, extendProcedureDoc }) => {
174
+ const mode = streamMode ?? this.config?.defaultStreamMode ?? 'sse';
175
+ factory
176
+ .getProcedures()
177
+ .filter((p) => p.isStream === true)
178
+ .forEach((procedure) => {
179
+ const route = this.buildStreamHttpRouteDoc(procedure, mode, extendProcedureDoc);
180
+ this._docs.push(route);
181
+ const handler = this.createStreamHandler(procedure, factoryContext, mode);
182
+ // Register both GET and POST handlers
183
+ this._app.get(route.path, handler);
184
+ this._app.post(route.path, handler);
185
+ });
186
+ });
187
+ return this._app;
188
+ }
189
+ /**
190
+ * Generates the Stream HTTP route documentation for the given procedure.
191
+ */
192
+ buildStreamHttpRouteDoc(procedure, streamMode, extendProcedureDoc) {
193
+ const { config } = procedure;
194
+ const path = HonoStreamAppBuilder.makeStreamHttpRoutePath({
195
+ name: procedure.name,
196
+ config,
197
+ prefix: this.config?.pathPrefix,
198
+ });
199
+ const methods = ['get', 'post'];
200
+ const jsonSchema = {};
201
+ if (config.schema?.params) {
202
+ jsonSchema.params = config.schema.params;
203
+ }
204
+ if (config.schema?.yieldType) {
205
+ jsonSchema.yieldType = config.schema.yieldType;
206
+ }
207
+ if (config.schema?.returnType) {
208
+ jsonSchema.returnType = config.schema.returnType;
209
+ }
210
+ const base = {
211
+ name: procedure.name,
212
+ version: config.version,
213
+ scope: config.scope,
214
+ path,
215
+ methods: [...methods],
216
+ streamMode,
217
+ jsonSchema,
218
+ };
219
+ let extendedDoc = {};
220
+ if (extendProcedureDoc) {
221
+ extendedDoc = extendProcedureDoc({ base, procedure });
222
+ }
223
+ return {
224
+ ...extendedDoc,
225
+ ...base,
226
+ };
227
+ }
228
+ }
229
+ //# 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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"}