arri 0.0.38 → 0.0.42

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/index.cjs CHANGED
@@ -1,10 +1,643 @@
1
1
  'use strict';
2
2
 
3
- const app = require('./shared/arri.8a065f92.cjs');
4
- require('@sinclair/typebox');
5
- require('h3');
6
- require('@sinclair/typebox/errors');
7
- require('@sinclair/typebox/value');
3
+ const typebox = require('@sinclair/typebox');
4
+ const h3 = require('h3');
5
+ const errors = require('@sinclair/typebox/errors');
6
+ const utils = require('./shared/arri.0752aa2b.cjs');
7
+ const value = require('@sinclair/typebox/value');
8
+
9
+ const ErrorResponse = typebox.Type.Object(
10
+ {
11
+ statusCode: typebox.Type.Integer(),
12
+ statusMessage: typebox.Type.String(),
13
+ stack: typebox.Type.Array(typebox.Type.Any()),
14
+ data: typebox.Type.Optional(typebox.Type.Object({}, { additionalProperties: true }))
15
+ },
16
+ { $id: "ErrorResponse" }
17
+ );
18
+ function defineError(statusCode, input = {}) {
19
+ const defaultVals = errorResponseDefaults[statusCode];
20
+ return h3.createError({
21
+ statusCode,
22
+ statusMessage: input.statusMessage ?? defaultVals.message ?? "An unknown error occurred",
23
+ stack: input.stack ?? "",
24
+ data: input.data
25
+ });
26
+ }
27
+ function errorResponseFromValidationErrors(errors, prefixText = `Missing or invalid parameters`) {
28
+ const errorParts = [];
29
+ for (const err of errors) {
30
+ const propName = err.path.split("/");
31
+ propName.shift();
32
+ if (!errorParts.includes(propName.join("."))) {
33
+ errorParts.push(propName.join("."));
34
+ }
35
+ }
36
+ throw defineError(400, {
37
+ statusMessage: `${prefixText}: [${errorParts.join(",")}]`,
38
+ data: errors
39
+ });
40
+ }
41
+ const errorResponseDefaults = {
42
+ 400: {
43
+ name: "BAD_REQUEST",
44
+ message: "Bad Request"
45
+ },
46
+ 401: {
47
+ name: "UNAUTHORIZED",
48
+ message: "Unauthorized"
49
+ },
50
+ 402: {
51
+ name: "PAYMENT_REQUIRED",
52
+ message: "Payment Required"
53
+ },
54
+ 403: {
55
+ name: "FORBIDDEN",
56
+ message: "Forbidden"
57
+ },
58
+ 404: {
59
+ name: "NOT_FOUND",
60
+ message: "Not Found"
61
+ },
62
+ 405: {
63
+ name: "METHOD_NOT_ALLOWED",
64
+ message: "Method Not Allowed"
65
+ },
66
+ 406: {
67
+ name: "NOT_ACCEPTABLE",
68
+ message: "Not Acceptable"
69
+ },
70
+ 407: {
71
+ name: "PROXY_AUTHENTICATION_REQUIRED",
72
+ message: "Proxy Authentication Required"
73
+ },
74
+ 408: {
75
+ name: "REQUEST_TIMEOUT",
76
+ message: "Request Timeout"
77
+ },
78
+ 409: {
79
+ name: "CONFLICT",
80
+ message: "Conflict"
81
+ },
82
+ 410: {
83
+ name: "GONE",
84
+ message: "Gone"
85
+ },
86
+ 411: {
87
+ name: "LENGTH_REQUIRED",
88
+ message: "Length Required"
89
+ },
90
+ 412: {
91
+ name: "PRECONDITION_FAILED",
92
+ message: "Precondition Failed"
93
+ },
94
+ 413: {
95
+ name: "REQUEST_TOO_LONG",
96
+ message: "Request Entity Too Large"
97
+ },
98
+ 414: {
99
+ name: "REQUEST_URI_TOO_LONG",
100
+ message: "Request-URI Too Long"
101
+ },
102
+ 415: {
103
+ name: "UNSUPPORTED_MEDIA_TYPE",
104
+ message: "Unsupported Media Type"
105
+ },
106
+ 416: {
107
+ name: "REQUESTED_RANGE_NOT_SATISFIABLE",
108
+ message: "Requested Range Not Satisfiable"
109
+ },
110
+ 417: {
111
+ name: "EXPECTATION_FAILED",
112
+ message: "Expectation Failed"
113
+ },
114
+ 418: {
115
+ name: "IM_A_TEAPOT",
116
+ message: "I'm a teapot"
117
+ },
118
+ 419: {
119
+ name: "INSUFFICIENT_SPACE_ON_RESOURCE",
120
+ message: "Insufficient Space on Resource"
121
+ },
122
+ 420: {
123
+ name: "METHOD_FAILURE",
124
+ message: "Method Failure"
125
+ },
126
+ 421: {
127
+ name: "MISDIRECTED_REQUEST",
128
+ message: "Misdirected Request"
129
+ },
130
+ 422: {
131
+ name: "UNPROCESSABLE_ENTITY",
132
+ message: "Unprocessable Entity"
133
+ },
134
+ 423: {
135
+ name: "LOCKED",
136
+ message: "Locked"
137
+ },
138
+ 424: {
139
+ name: "FAILED_DEPENDENCY",
140
+ message: "Failed Dependency"
141
+ },
142
+ 428: {
143
+ name: "PRECONDITION_REQUIRED",
144
+ message: "Precondition Required"
145
+ },
146
+ 429: {
147
+ name: "TOO_MANY_REQUESTS",
148
+ message: "Too Many Requests"
149
+ },
150
+ 431: {
151
+ name: "REQUEST_HEADER_FIELDS_TOO_LARGE",
152
+ message: "Request Header Fields Too Large"
153
+ },
154
+ 451: {
155
+ name: "UNAVAILABLE_FOR_LEGAL_REASONS",
156
+ message: "Unavailable For Legal Reasons"
157
+ },
158
+ 500: {
159
+ name: "INTERNAL_SERVER_ERROR",
160
+ message: "Internal Server Error"
161
+ },
162
+ 501: {
163
+ name: "NOT_IMPLEMENTED",
164
+ message: "Not Implemented"
165
+ },
166
+ 502: {
167
+ name: "BAD_GATEWAY",
168
+ message: "Bad Gateway"
169
+ },
170
+ 503: {
171
+ name: "SERVICE_UNAVAILABLE",
172
+ message: "Service Unavailable"
173
+ },
174
+ 504: {
175
+ name: "GATEWAY_TIMEOUT",
176
+ message: "Gateway Timeout"
177
+ },
178
+ 505: {
179
+ name: "HTTP_VERSION_NOT_SUPPORTED",
180
+ message: "HTTP Version Not Supported"
181
+ },
182
+ 507: {
183
+ name: "INSUFFICIENT_STORAGE",
184
+ message: "Insufficient Storage"
185
+ },
186
+ 511: {
187
+ name: "NETWORK_AUTHENTICATION_REQUIRED",
188
+ message: "Network Authentication Required"
189
+ }
190
+ };
191
+ async function handleH3Error(err, context, event, onError) {
192
+ const error = h3.isError(err) ? err : defineError(500, { data: err, stack: `${err}` });
193
+ h3.setResponseStatus(event, error.statusCode);
194
+ if (onError) {
195
+ await onError(error, context, event);
196
+ }
197
+ if (event.handled) {
198
+ return;
199
+ }
200
+ h3.sendError(event, error);
201
+ }
202
+
203
+ function typeboxSafeValidate(schema, coerce = false) {
204
+ const fn = (input) => {
205
+ const finalInput = coerce ? value.Value.Convert(schema, input) : input;
206
+ if (value.Value.Check(schema, finalInput)) {
207
+ return { success: true, value: finalInput };
208
+ }
209
+ const errs = [...value.Value.Errors(schema, finalInput)];
210
+ return {
211
+ success: false,
212
+ errors: errs
213
+ };
214
+ };
215
+ return fn;
216
+ }
217
+
218
+ function isRpc(input) {
219
+ if (typeof input !== "object") {
220
+ return false;
221
+ }
222
+ const anyInput = input;
223
+ if (!utils.isHttpMethod(anyInput.method)) {
224
+ return false;
225
+ }
226
+ if (typeof anyInput.handler !== "function") {
227
+ return false;
228
+ }
229
+ return true;
230
+ }
231
+ function defineRpc(config) {
232
+ return config;
233
+ }
234
+ function createRpcDefinition(rpcName, httpPath, procedure) {
235
+ return {
236
+ description: procedure.description,
237
+ path: httpPath,
238
+ method: procedure.method ?? "post",
239
+ params: getRpcParamDefinition(rpcName, procedure),
240
+ response: getRpcResponseDefinition(rpcName, procedure)
241
+ };
242
+ }
243
+ function getRpcPath(rpcName, prefix = "") {
244
+ const path = rpcName.split(".").map(
245
+ (part) => utils.removeDisallowedChars(
246
+ utils.kebabCase(part),
247
+ `!@#$%^&*()+=[]{}|\\;:'"<>,./?`
248
+ )
249
+ ).join("/");
250
+ const finalPath = prefix ? `/${prefix}/${path}` : `/${path}`;
251
+ return finalPath;
252
+ }
253
+ function getRpcParamName(rpcName, procedure) {
254
+ if (!procedure.params) {
255
+ return null;
256
+ }
257
+ const nameParts = rpcName.split(".").map(
258
+ (part) => utils.removeDisallowedChars(part, `!@#$%^&*()+=[]{}|\\;:'"<>,./?`)
259
+ );
260
+ const paramName = procedure.params.$id ?? utils.pascalCase(`${nameParts.join(`_`)}_params`);
261
+ return paramName;
262
+ }
263
+ function getRpcParamDefinition(rpcName, procedure) {
264
+ if (!procedure.params) {
265
+ return void 0;
266
+ }
267
+ const name = getRpcParamName(rpcName, procedure);
268
+ if (!name) {
269
+ return void 0;
270
+ }
271
+ return name;
272
+ }
273
+ function getRpcResponseName(rpcName, procedure) {
274
+ if (!procedure.response) {
275
+ return null;
276
+ }
277
+ if (typebox.TypeGuard.TObject(procedure.response)) {
278
+ const nameParts = rpcName.split(".").map(
279
+ (part) => utils.removeDisallowedChars(part, `!@#$%^&*()+=[]{}|\\;:'"<>,./?`)
280
+ );
281
+ const responseName = procedure.response.$id ?? utils.pascalCase(`${nameParts.join("_")}_response`);
282
+ return responseName;
283
+ }
284
+ return null;
285
+ }
286
+ function getRpcResponseDefinition(rpcName, procedure) {
287
+ if (!procedure.response) {
288
+ return void 0;
289
+ }
290
+ const name = getRpcResponseName(rpcName, procedure);
291
+ if (!name) {
292
+ return void 0;
293
+ }
294
+ return name;
295
+ }
296
+ function registerRpc(router, path, procedure, middleware, opts) {
297
+ const httpMethod = procedure.method ?? "post";
298
+ const handler = h3.eventHandler(async (event) => {
299
+ const context = {
300
+ type: "procedure",
301
+ params: void 0
302
+ };
303
+ if (h3.isPreflightRequest(event)) {
304
+ return "ok";
305
+ }
306
+ try {
307
+ if (middleware.length) {
308
+ await Promise.all(middleware.map((m) => m(context, event)));
309
+ }
310
+ if (procedure.params) {
311
+ switch (httpMethod) {
312
+ case "get":
313
+ case "head": {
314
+ const parsedParams = await h3.getValidatedQuery(
315
+ event,
316
+ typeboxSafeValidate(procedure.params, true)
317
+ );
318
+ if (!parsedParams.success) {
319
+ const errorParts = [];
320
+ for (const err of parsedParams.errors) {
321
+ const propName = err.path.split("/");
322
+ propName.shift();
323
+ if (!errorParts.includes(propName.join("."))) {
324
+ errorParts.push(propName.join("."));
325
+ }
326
+ }
327
+ throw defineError(400, {
328
+ statusMessage: `Missing or invalid url query parameters: [${errorParts.join(
329
+ ","
330
+ )}]`,
331
+ data: parsedParams.errors
332
+ });
333
+ }
334
+ context.params = parsedParams.value;
335
+ break;
336
+ }
337
+ case "delete":
338
+ case "patch":
339
+ case "post":
340
+ case "put": {
341
+ const parsedParams = await h3.readValidatedBody(
342
+ event,
343
+ typeboxSafeValidate(procedure.params)
344
+ );
345
+ if (!parsedParams.success) {
346
+ let isObjectError = false;
347
+ const errorParts = [];
348
+ for (const err of parsedParams.errors) {
349
+ if (err.type === errors.ValueErrorType.Object) {
350
+ isObjectError = true;
351
+ }
352
+ const propName = err.path.split("/");
353
+ propName.shift();
354
+ if (!errorParts.includes(propName.join("."))) {
355
+ errorParts.push(propName.join("."));
356
+ }
357
+ }
358
+ if (isObjectError) {
359
+ throw defineError(400, {
360
+ statusMessage: `Invalid request body. Expected object.`
361
+ });
362
+ }
363
+ throw defineError(400, {
364
+ statusMessage: `Invalid request body. Affected properties [${errorParts.join(
365
+ ", "
366
+ )}]`,
367
+ data: parsedParams.errors
368
+ });
369
+ }
370
+ context.params = parsedParams.value;
371
+ break;
372
+ }
373
+ default:
374
+ break;
375
+ }
376
+ }
377
+ const response = await procedure.handler(context, event);
378
+ context.response = response;
379
+ if (opts.onBeforeResponse) {
380
+ await opts.onBeforeResponse(context, event);
381
+ }
382
+ if (typeof response === "object") {
383
+ h3.setResponseHeader(event, "Content-Type", "application/json");
384
+ await h3.send(event, JSON.stringify(response));
385
+ } else {
386
+ await h3.send(event, response ?? "");
387
+ }
388
+ if (opts.onAfterResponse) {
389
+ await opts.onAfterResponse(context, event);
390
+ }
391
+ if (procedure.postHandler) {
392
+ await procedure.postHandler(context, event);
393
+ }
394
+ } catch (err) {
395
+ await handleH3Error(err, context, event, opts.onError);
396
+ }
397
+ return "";
398
+ });
399
+ switch (httpMethod) {
400
+ case "get":
401
+ router.get(path, handler);
402
+ break;
403
+ case "head":
404
+ router.head(path, handler);
405
+ break;
406
+ case "delete":
407
+ router.delete(path, handler);
408
+ break;
409
+ case "patch":
410
+ router.patch(path, handler);
411
+ break;
412
+ case "put":
413
+ router.put(path, handler);
414
+ break;
415
+ case "post":
416
+ default:
417
+ router.post(path, handler);
418
+ break;
419
+ }
420
+ }
421
+
422
+ function defineRoute(config) {
423
+ return config;
424
+ }
425
+ const defineMiddleware = (middleware) => middleware;
426
+ function registerRoute(router, route, middleware, prefix, opts) {
427
+ const handler = h3.eventHandler(async (event) => {
428
+ const context = {
429
+ type: "route",
430
+ params: event.context.params,
431
+ query: void 0,
432
+ body: void 0
433
+ };
434
+ try {
435
+ if (middleware.length) {
436
+ for (const m of middleware) {
437
+ await m(context, event);
438
+ }
439
+ }
440
+ if (route.query) {
441
+ const result = await h3.getValidatedQuery(
442
+ event,
443
+ typeboxSafeValidate(route.query, true)
444
+ );
445
+ if (!result.success) {
446
+ throw errorResponseFromValidationErrors(
447
+ result.errors,
448
+ "Missing or invalid query parameters"
449
+ );
450
+ }
451
+ context.query = result.value;
452
+ }
453
+ if (route.body && route.method !== "get" && route.method !== "head") {
454
+ const result = await h3.readValidatedBody(
455
+ event,
456
+ typeboxSafeValidate(route.body)
457
+ );
458
+ if (!result.success) {
459
+ throw errorResponseFromValidationErrors(
460
+ result.errors,
461
+ "Missing or invalid body parameters"
462
+ );
463
+ }
464
+ context.body = result.value;
465
+ }
466
+ const response = await route.handler(context, event);
467
+ context.response = response;
468
+ if (opts?.onBeforeResponse) {
469
+ await opts.onBeforeResponse(context, event);
470
+ }
471
+ if (typeof response === "object") {
472
+ h3.setResponseHeader(event, "Content-Type", "application/json");
473
+ await h3.send(event, JSON.stringify(response));
474
+ } else {
475
+ await h3.send(event, response ?? "");
476
+ }
477
+ if (opts?.onAfterResponse) {
478
+ await opts.onAfterResponse(context, event);
479
+ }
480
+ if (route.postHandler) {
481
+ await route.postHandler(context, event);
482
+ }
483
+ } catch (err) {
484
+ await handleH3Error(err, context, event, opts?.onError);
485
+ }
486
+ if (!event.handled) {
487
+ await h3.send(event, "");
488
+ }
489
+ return "";
490
+ });
491
+ const finalPath = (prefix ? `/${prefix}${route.path}` : route.path).split("//").join("/");
492
+ switch (route.method) {
493
+ case "get":
494
+ router.get(finalPath, handler);
495
+ break;
496
+ case "head":
497
+ router.head(finalPath, handler);
498
+ break;
499
+ case "delete":
500
+ router.delete(finalPath, handler);
501
+ break;
502
+ case "patch":
503
+ router.patch(finalPath, handler);
504
+ break;
505
+ case "post":
506
+ router.post(finalPath, handler);
507
+ break;
508
+ case "put":
509
+ router.put(finalPath, handler);
510
+ break;
511
+ }
512
+ }
513
+
514
+ var __defProp = Object.defineProperty;
515
+ var __defNormalProp = (obj, key, value) => key in obj ? __defProp(obj, key, { enumerable: true, configurable: true, writable: true, value }) : obj[key] = value;
516
+ var __publicField = (obj, key, value) => {
517
+ __defNormalProp(obj, typeof key !== "symbol" ? key + "" : key, value);
518
+ return value;
519
+ };
520
+ const DEV_ENDPOINT_ROOT = `/__arri_dev__`;
521
+ const DEV_DEFINITION_ENDPOINT = `${DEV_ENDPOINT_ROOT}/definition`;
522
+ class Arri {
523
+ constructor(opts = {}) {
524
+ __publicField(this, "__isArri__", true);
525
+ __publicField(this, "h3App");
526
+ __publicField(this, "h3Router", h3.createRouter());
527
+ __publicField(this, "rpcDefinitionPath");
528
+ __publicField(this, "rpcRoutePrefix");
529
+ __publicField(this, "appInfo");
530
+ __publicField(this, "procedures", {});
531
+ __publicField(this, "models", {});
532
+ __publicField(this, "middlewares", []);
533
+ __publicField(this, "onAfterResponse");
534
+ __publicField(this, "onBeforeResponse");
535
+ __publicField(this, "onError");
536
+ this.appInfo = opts?.appInfo;
537
+ this.h3App = h3.createApp({
538
+ debug: opts?.debug,
539
+ onRequest: opts?.onRequest
540
+ });
541
+ this.onError = opts.onError;
542
+ this.onAfterResponse = opts.onAfterResponse;
543
+ this.onBeforeResponse = opts.onBeforeResponse;
544
+ this.rpcRoutePrefix = opts?.rpcRoutePrefix ?? "";
545
+ this.rpcDefinitionPath = opts?.rpcDefinitionPath ?? "__definition";
546
+ this.h3App.use(this.h3Router);
547
+ this.registerRoute({
548
+ path: this.rpcRoutePrefix ? `/${this.rpcRoutePrefix}/${this.rpcDefinitionPath}`.split("//").join("/") : `/${this.rpcDefinitionPath}`,
549
+ method: "get",
550
+ handler: () => this.getAppDefinition()
551
+ });
552
+ if (process.env.ARRI_DEV_MODE === "true") {
553
+ this.registerRoute({
554
+ path: DEV_DEFINITION_ENDPOINT,
555
+ method: "get",
556
+ handler: () => this.getAppDefinition()
557
+ });
558
+ }
559
+ this.h3Router.use(
560
+ "/**",
561
+ h3.eventHandler(async (event) => {
562
+ h3.setResponseStatus(event, 404);
563
+ const error = defineError(404);
564
+ const query = h3.getQuery(event);
565
+ const disallowedBodyMethods = ["GET", "HEAD", "OPTION"];
566
+ const canBody = !disallowedBodyMethods.includes(event.method);
567
+ const context = {
568
+ type: "route",
569
+ params: event.context.params,
570
+ query,
571
+ // eslint-disable-next-line @typescript-eslint/no-confusing-void-expression
572
+ body: canBody ? await h3.readBody(event).catch((_) => void 0) : void 0
573
+ };
574
+ try {
575
+ if (this.middlewares.length) {
576
+ for (const m of this.middlewares) {
577
+ await m(context, event);
578
+ }
579
+ }
580
+ } catch (err) {
581
+ await handleH3Error(err, context, event, this.onError);
582
+ }
583
+ if (event.handled) {
584
+ return;
585
+ }
586
+ if (this.onError) {
587
+ await this.onError(error, context, event);
588
+ }
589
+ if (event.handled) {
590
+ return;
591
+ }
592
+ h3.sendError(event, error);
593
+ })
594
+ );
595
+ }
596
+ registerMiddleware(middleware) {
597
+ this.middlewares.push(middleware);
598
+ }
599
+ registerRpc(name, procedure) {
600
+ const path = getRpcPath(name, this.rpcRoutePrefix);
601
+ this.procedures[name] = createRpcDefinition(name, path, procedure);
602
+ if (typebox.TypeGuard.TObject(procedure.params)) {
603
+ const paramName = getRpcParamName(name, procedure);
604
+ if (paramName) {
605
+ this.models[paramName] = procedure.params;
606
+ }
607
+ }
608
+ if (typebox.TypeGuard.TObject(procedure.response)) {
609
+ const responseName = getRpcResponseName(name, procedure);
610
+ if (responseName) {
611
+ this.models[responseName] = procedure.response;
612
+ }
613
+ }
614
+ registerRpc(this.h3Router, path, procedure, this.middlewares, {
615
+ onError: this.onError,
616
+ onAfterResponse: this.onAfterResponse,
617
+ onBeforeResponse: this.onBeforeResponse
618
+ });
619
+ }
620
+ registerRoute(route) {
621
+ registerRoute(this.h3Router, route, this.middlewares);
622
+ }
623
+ getAppDefinition() {
624
+ const appDef = {
625
+ arriSchemaVersion: "0.0.1",
626
+ info: this.appInfo,
627
+ procedures: {},
628
+ models: this.models,
629
+ errors: ErrorResponse
630
+ };
631
+ Object.keys(this.procedures).forEach((key) => {
632
+ const rpc = this.procedures[key];
633
+ appDef.procedures[key] = rpc;
634
+ });
635
+ return appDef;
636
+ }
637
+ getH3Instance() {
638
+ return this.h3App;
639
+ }
640
+ }
8
641
 
9
642
  const defaultConfig = {
10
643
  port: 3e3,
@@ -31,25 +664,23 @@ function defineConfig(config) {
31
664
  };
32
665
  }
33
666
 
34
- exports.Arri = app.Arri;
35
- exports.DEV_DEFINITION_ENDPOINT = app.DEV_DEFINITION_ENDPOINT;
36
- exports.DEV_ENDPOINT_ROOT = app.DEV_ENDPOINT_ROOT;
37
- exports.ErrorResponse = app.ErrorResponse;
38
- exports.HttpMethodValues = app.HttpMethodValues;
39
- exports.createRpcDefinition = app.createRpcDefinition;
40
- exports.defineError = app.defineError;
41
- exports.defineMiddleware = app.defineMiddleware;
42
- exports.defineRoute = app.defineRoute;
43
- exports.defineRpc = app.defineRpc;
44
- exports.errorResponseFromValidationErrors = app.errorResponseFromValidationErrors;
45
- exports.getRpcParamDefinition = app.getRpcParamDefinition;
46
- exports.getRpcParamName = app.getRpcParamName;
47
- exports.getRpcPath = app.getRpcPath;
48
- exports.getRpcResponseName = app.getRpcResponseName;
49
- exports.handleH3Error = app.handleH3Error;
50
- exports.isHttpMethod = app.isHttpMethod;
51
- exports.isRpc = app.isRpc;
52
- exports.registerRoute = app.registerRoute;
53
- exports.registerRpc = app.registerRpc;
667
+ exports.Arri = Arri;
668
+ exports.DEV_DEFINITION_ENDPOINT = DEV_DEFINITION_ENDPOINT;
669
+ exports.DEV_ENDPOINT_ROOT = DEV_ENDPOINT_ROOT;
670
+ exports.ErrorResponse = ErrorResponse;
671
+ exports.createRpcDefinition = createRpcDefinition;
54
672
  exports.defaultConfig = defaultConfig;
55
673
  exports.defineConfig = defineConfig;
674
+ exports.defineError = defineError;
675
+ exports.defineMiddleware = defineMiddleware;
676
+ exports.defineRoute = defineRoute;
677
+ exports.defineRpc = defineRpc;
678
+ exports.errorResponseFromValidationErrors = errorResponseFromValidationErrors;
679
+ exports.getRpcParamDefinition = getRpcParamDefinition;
680
+ exports.getRpcParamName = getRpcParamName;
681
+ exports.getRpcPath = getRpcPath;
682
+ exports.getRpcResponseName = getRpcResponseName;
683
+ exports.handleH3Error = handleH3Error;
684
+ exports.isRpc = isRpc;
685
+ exports.registerRoute = registerRoute;
686
+ exports.registerRpc = registerRpc;