elysia 2.0.0-exp.46 → 2.0.0-exp.49

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 (118) hide show
  1. package/dist/adapter/bun/index.js +16 -5
  2. package/dist/adapter/bun/index.mjs +17 -6
  3. package/dist/adapter/index.d.ts +1 -1
  4. package/dist/adapter/index.js +1 -3
  5. package/dist/adapter/index.mjs +1 -3
  6. package/dist/adapter/response-ownership.d.ts +5 -0
  7. package/dist/adapter/response-ownership.js +13 -0
  8. package/dist/adapter/response-ownership.mjs +10 -0
  9. package/dist/adapter/utils.d.ts +4 -4
  10. package/dist/adapter/utils.js +57 -17
  11. package/dist/adapter/utils.mjs +58 -18
  12. package/dist/adapter/web-standard/handler.d.ts +3 -3
  13. package/dist/adapter/web-standard/handler.js +39 -43
  14. package/dist/adapter/web-standard/handler.mjs +39 -43
  15. package/dist/base.d.ts +27 -2
  16. package/dist/base.js +191 -59
  17. package/dist/base.mjs +191 -59
  18. package/dist/compile/analysis-cache.d.ts +6 -0
  19. package/dist/compile/analysis-cache.js +14 -0
  20. package/dist/compile/analysis-cache.mjs +13 -0
  21. package/dist/compile/aot-capture.js +15 -1
  22. package/dist/compile/aot-capture.mjs +15 -1
  23. package/dist/compile/aot.d.ts +5 -0
  24. package/dist/compile/aot.js +8 -0
  25. package/dist/compile/aot.mjs +8 -0
  26. package/dist/compile/handler/descriptor.d.ts +3 -3
  27. package/dist/compile/handler/descriptor.js +4 -3
  28. package/dist/compile/handler/descriptor.mjs +5 -4
  29. package/dist/compile/handler/index.d.ts +6 -3
  30. package/dist/compile/handler/index.js +11 -43
  31. package/dist/compile/handler/index.mjs +11 -43
  32. package/dist/compile/handler/jit.d.ts +1 -1
  33. package/dist/compile/handler/jit.js +26 -18
  34. package/dist/compile/handler/jit.mjs +27 -19
  35. package/dist/compile/handler/params.js +1 -0
  36. package/dist/compile/handler/params.mjs +2 -1
  37. package/dist/compile/handler/reconstruct.d.ts +2 -2
  38. package/dist/compile/handler/reconstruct.js +12 -3
  39. package/dist/compile/handler/reconstruct.mjs +13 -4
  40. package/dist/compile/handler/utils.js +1 -1
  41. package/dist/compile/handler/utils.mjs +1 -1
  42. package/dist/compile/jit-probe.d.ts +0 -2
  43. package/dist/compile/jit-probe.js +1 -3
  44. package/dist/compile/jit-probe.mjs +1 -3
  45. package/dist/compile/lexer.d.ts +1 -1
  46. package/dist/cookie/crypto.d.ts +4 -1
  47. package/dist/cookie/crypto.js +26 -4
  48. package/dist/cookie/crypto.mjs +24 -5
  49. package/dist/cookie/utils.d.ts +10 -3
  50. package/dist/cookie/utils.js +30 -5
  51. package/dist/cookie/utils.mjs +30 -6
  52. package/dist/generation.d.ts +11 -1
  53. package/dist/generation.js +17 -1
  54. package/dist/generation.mjs +13 -1
  55. package/dist/handler/fetch.js +13 -11
  56. package/dist/handler/fetch.mjs +13 -11
  57. package/dist/index.d.ts +5 -4
  58. package/dist/index.js +3 -0
  59. package/dist/index.mjs +3 -2
  60. package/dist/package.js +1 -1
  61. package/dist/package.mjs +1 -1
  62. package/dist/plugin/aot/core.d.ts +23 -4
  63. package/dist/plugin/aot/core.js +22 -26
  64. package/dist/plugin/aot/core.mjs +21 -25
  65. package/dist/plugin/aot/rspack.js +1 -2
  66. package/dist/plugin/aot/rspack.mjs +2 -3
  67. package/dist/plugin/aot/source.d.ts +3 -33
  68. package/dist/plugin/aot/source.js +29 -31
  69. package/dist/plugin/aot/source.mjs +30 -31
  70. package/dist/plugin/aot/treeshake.d.ts +2 -8
  71. package/dist/plugin/aot/treeshake.js +3 -3
  72. package/dist/plugin/aot/treeshake.mjs +3 -3
  73. package/dist/plugin/trace.d.ts +10 -0
  74. package/dist/plugin/trace.js +39 -0
  75. package/dist/plugin/trace.mjs +36 -0
  76. package/dist/plugin/websocket.d.ts +6 -0
  77. package/dist/plugin/websocket.js +61 -0
  78. package/dist/plugin/websocket.mjs +60 -0
  79. package/dist/route-table.d.ts +1 -2
  80. package/dist/route-table.js +2 -6
  81. package/dist/route-table.mjs +2 -6
  82. package/dist/sucrose.d.ts +1 -7
  83. package/dist/sucrose.js +444 -231
  84. package/dist/sucrose.mjs +445 -229
  85. package/dist/trace.d.ts +6 -1
  86. package/dist/type/bridge-live.d.ts +4 -3
  87. package/dist/type/bridge-live.js +2 -0
  88. package/dist/type/bridge-live.mjs +2 -1
  89. package/dist/type/bridge.d.ts +4 -3
  90. package/dist/type/bridge.js +2 -0
  91. package/dist/type/bridge.mjs +2 -1
  92. package/dist/type/constants.d.ts +1 -1
  93. package/dist/type/exports.d.ts +1 -1
  94. package/dist/type/index.d.ts +1 -1
  95. package/dist/type/validator/index.d.ts +2 -2
  96. package/dist/type/validator/validator-cache.js +7 -3
  97. package/dist/type/validator/validator-cache.mjs +7 -3
  98. package/dist/types.d.ts +1 -31
  99. package/dist/utils.d.ts +12 -1
  100. package/dist/utils.js +20 -0
  101. package/dist/utils.mjs +18 -1
  102. package/dist/validator/index.d.ts +1 -1
  103. package/dist/validator/route.d.ts +1 -1
  104. package/dist/ws/context.d.ts +1 -1
  105. package/dist/ws/route.d.ts +4 -2
  106. package/dist/ws/route.js +37 -3
  107. package/dist/ws/route.mjs +36 -4
  108. package/dist/ws/types.d.ts +46 -2
  109. package/package.json +9 -10
  110. package/dist/compile/plan/emit.d.ts +0 -18
  111. package/dist/compile/plan/emit.js +0 -434
  112. package/dist/compile/plan/emit.mjs +0 -433
  113. package/dist/compile/plan/plan.d.ts +0 -53
  114. package/dist/compile/plan/plan.js +0 -96
  115. package/dist/compile/plan/plan.mjs +0 -94
  116. package/dist/experimental/resume.d.ts +0 -11
  117. package/dist/experimental/resume.js +0 -12
  118. package/dist/experimental/resume.mjs +0 -11
@@ -7,6 +7,7 @@ const require_adapter_default_headers = require('../default-headers.js');
7
7
  const require_adapter_utils = require('../utils.js');
8
8
 
9
9
  //#region src/adapter/web-standard/handler.ts
10
+ const textPlainInit = { headers: { "content-type": "text/plain" } };
10
11
  function handleElysiaFile(file, set = { headers: require_utils.nullObject() }, request) {
11
12
  const path = file.path;
12
13
  const contentType = require_universal_file.mime[path.slice(path.lastIndexOf(".") + 1).toLowerCase()];
@@ -20,23 +21,17 @@ function handleElysiaFile(file, set = { headers: require_utils.nullObject() }, r
20
21
  });
21
22
  return require_adapter_utils.handleFile(file.value, set, request);
22
23
  }
23
- function responseTag(response) {
24
- if (response === null || response === void 0) return void 0;
25
- const proto = Object.getPrototypeOf(response);
26
- if (proto === null) return "Object";
27
- return proto.constructor?.name;
28
- }
29
- function mapResponseWithSet(response, set, request) {
24
+ function mapResponseWithSet(response, set, request, owned) {
30
25
  require_adapter_utils.handleSet(set);
31
26
  const headers = set.headers;
32
- switch (responseTag(response)) {
27
+ switch (response?.constructor?.name) {
33
28
  case "String":
34
29
  if (!require_universal_constants.isBun && !headers["content-type"]) require_adapter_utils.materializeSetHeaders(set)["content-type"] = "text/plain";
35
30
  return new Response(response, set);
36
31
  case "Array": return Response.json(response, set);
37
32
  case "Object":
38
33
  if (response["~ely-form"]) return new Response(require_utils.formToFormData(response), set);
39
- if (typeof response?.next === "function") return handleStream(response, set, request);
34
+ if (typeof response?.next === "function") return handleStream(response, set, request, void 0, owned);
40
35
  return Response.json(response, set);
41
36
  case "Number":
42
37
  case "Boolean": return new Response(response.toString(), set);
@@ -46,32 +41,33 @@ function mapResponseWithSet(response, set, request) {
46
41
  case "ElysiaStatus":
47
42
  set.status = response.code;
48
43
  if (response.headers) Object.assign(require_adapter_utils.materializeSetHeaders(set), response.headers);
49
- return mapResponseWithSet(response.response, set, request);
44
+ return mapResponseWithSet(response.response, set, request, owned);
50
45
  case void 0: return response ? Response.json(response, set) : new Response(null, set);
51
- case "Response": return handleResponse(response, set, request);
52
- case "Error": return errorToResponse(response, set);
53
- case "Promise": return response.then((x) => mapResponseWithSet(x, set, request));
54
- case "Function": return mapResponseWithSet(response(), set, request);
46
+ case "Response": return handleResponse(response, set, request, owned);
47
+ case "Error": return errorToResponse(response, set, request, owned);
48
+ case "Promise": return response.then((x) => mapResponseWithSet(x, set, request, owned));
49
+ case "Function": return mapResponseWithSet(response(), set, request, owned);
55
50
  case "FormData": return new Response(response, set);
56
- default: return mapResponseFallback(response, set, request);
51
+ default: return mapResponseFallback(response, set, request, owned);
57
52
  }
58
53
  }
59
- function mapResponse(response, set, request) {
54
+ function mapResponse(response, set, request, owned) {
60
55
  const headers = set.headers;
61
- if (set.status !== void 0 || set.cookie || headers["\0"] === headers || require_utils.isNotEmpty(headers)) return mapResponseWithSet(response, set, request);
56
+ if (set.status !== void 0 || set.cookie || headers["\0"] === headers || require_utils.isNotEmpty(headers)) return mapResponseWithSet(response, set, request, owned);
62
57
  if (response instanceof require_error.ElysiaStatus) {
63
58
  set.status = response.code;
64
59
  if (response.headers) Object.assign(set.headers, response.headers);
65
- return mapResponse(response.response, set, request);
60
+ return mapResponse(response.response, set, request, owned);
66
61
  }
67
- if (response instanceof Response) return response;
68
- if (response instanceof Promise) return response.then((x) => mapResponse(x, set, request));
69
- if (typeof response?.next === "function" || response instanceof ReadableStream) return handleStream(response, set, request);
70
- return mapCompactResponse(response, request);
62
+ if (response instanceof Response) return owned ? handleResponse(response, void 0, request, true) : response;
63
+ if (response instanceof Promise) return response.then((x) => mapResponse(x, set, request, owned));
64
+ if (typeof response?.next === "function" || response instanceof ReadableStream) return handleStream(response, set, request, void 0, owned);
65
+ return mapCompactResponse(response, request, owned);
71
66
  }
72
- function mapCompactResponse(response, request) {
73
- switch (responseTag(response)) {
74
- case "String": return new Response(response, require_universal_constants.isBun ? void 0 : { headers: { "content-type": "text/plain" } });
67
+ const textHeaders = require_universal_constants.isBun ? void 0 : textPlainInit;
68
+ function mapCompactResponse(response, request, owned) {
69
+ switch (response?.constructor?.name) {
70
+ case "String": return new Response(response, textHeaders);
75
71
  case "Array": return Response.json(response);
76
72
  case "Object":
77
73
  if (response["~ely-form"]) return new Response(require_utils.formToFormData(response));
@@ -84,22 +80,22 @@ function mapCompactResponse(response, request) {
84
80
  case "ElysiaStatus": return mapResponse(response.response, {
85
81
  status: response.code,
86
82
  headers: response.headers ? Object.assign(require_utils.nullObject(), response.headers) : require_utils.nullObject()
87
- });
83
+ }, request, owned);
88
84
  case void 0: return response ? Response.json(response) : new Response("");
89
- case "Response": return response;
90
- case "Error": return errorToResponse(response);
91
- case "Promise": return response.then((x) => mapCompactResponse(x, request));
92
- case "Function": return mapCompactResponse(response(), request);
85
+ case "Response": return owned ? handleResponse(response, void 0, request, true) : response;
86
+ case "Error": return errorToResponse(response, void 0, request, owned);
87
+ case "Promise": return response.then((x) => mapCompactResponse(x, request, owned));
88
+ case "Function": return mapCompactResponse(response(), request, owned);
93
89
  case "FormData": return new Response(response);
94
- default: return mapCompactResponseFallback(response, void 0, request);
90
+ default: return mapCompactResponseFallback(response, void 0, request, owned);
95
91
  }
96
92
  }
97
- function errorToResponse(error, set) {
93
+ function errorToResponse(error, set, request, owned = false) {
98
94
  if (error?.toResponse) {
99
95
  const targetSet = set ?? { headers: require_utils.nullObject() };
100
96
  const apply = (resolved) => {
101
97
  if (resolved instanceof Response) targetSet.status = resolved.status;
102
- return mapResponse(resolved, targetSet);
98
+ return mapResponse(resolved, targetSet, request, owned);
103
99
  };
104
100
  const raw = error.toResponse();
105
101
  return typeof raw?.then === "function" ? raw.then(apply) : apply(raw);
@@ -115,31 +111,31 @@ function errorToResponse(error, set) {
115
111
  });
116
112
  }
117
113
  function mapFallback(map) {
118
- return (response, set, request) => {
119
- if (response instanceof Response) return handleResponse(response, set, request);
120
- if (response instanceof Promise) return response.then((x) => map(x, set, request));
121
- if (response instanceof Error) return errorToResponse(response, set);
114
+ return (response, set, request, owned = false) => {
115
+ if (response instanceof Response) return handleResponse(response, set, request, owned);
116
+ if (response instanceof Promise) return response.then((x) => map(x, set, request, owned));
117
+ if (response instanceof Error) return errorToResponse(response, set, request, owned);
122
118
  if (response instanceof require_error.ElysiaStatus) if (set) {
123
119
  set.status = response.code;
124
120
  if (response.headers) set.headers = {
125
121
  ...set.headers,
126
122
  ...response.headers
127
123
  };
128
- return map(response.response, set, request);
124
+ return map(response.response, set, request, owned);
129
125
  } else return mapResponse(response.response, {
130
126
  status: response.code,
131
127
  headers: response.headers ? { ...response.headers } : {}
132
- });
133
- if (typeof response?.next === "function" || response instanceof ReadableStream) return handleStream(response, set, request);
134
- if (typeof response?.then === "function") return response.then((x) => map(x, set, request));
128
+ }, request, owned);
129
+ if (typeof response?.next === "function" || response instanceof ReadableStream) return handleStream(response, set, request, void 0, owned);
130
+ if (typeof response?.then === "function") return response.then((x) => map(x, set, request, owned));
135
131
  if (Array.isArray(response)) return Response.json(response);
136
- if (typeof response?.toResponse === "function") return map(response.toResponse(), set, request);
132
+ if (typeof response?.toResponse === "function") return map(response.toResponse(), set, request, owned);
137
133
  if (response?.constructor?.name === "Cookie" && response.jar) return new Response(response.value, set);
138
134
  return new Response(response, set);
139
135
  };
140
136
  }
141
137
  const mapResponseFallback = mapFallback(mapResponse);
142
- const mapCompactResponseFallback = mapFallback((response, _, request) => mapCompactResponse(response, request));
138
+ const mapCompactResponseFallback = mapFallback((response, _, request, owned) => mapCompactResponse(response, request, owned));
143
139
  const handleResponse = require_adapter_utils.createResponseHandler({
144
140
  mapResponse,
145
141
  mapCompactResponse
@@ -6,6 +6,7 @@ import { defaultHeaders } from "../default-headers.mjs";
6
6
  import { createResponseHandler, createStreamHandler, handleFile, handleSet, materializeSetHeaders } from "../utils.mjs";
7
7
 
8
8
  //#region src/adapter/web-standard/handler.ts
9
+ const textPlainInit = { headers: { "content-type": "text/plain" } };
9
10
  function handleElysiaFile(file, set = { headers: nullObject() }, request) {
10
11
  const path = file.path;
11
12
  const contentType = mime[path.slice(path.lastIndexOf(".") + 1).toLowerCase()];
@@ -19,23 +20,17 @@ function handleElysiaFile(file, set = { headers: nullObject() }, request) {
19
20
  });
20
21
  return handleFile(file.value, set, request);
21
22
  }
22
- function responseTag(response) {
23
- if (response === null || response === void 0) return void 0;
24
- const proto = Object.getPrototypeOf(response);
25
- if (proto === null) return "Object";
26
- return proto.constructor?.name;
27
- }
28
- function mapResponseWithSet(response, set, request) {
23
+ function mapResponseWithSet(response, set, request, owned) {
29
24
  handleSet(set);
30
25
  const headers = set.headers;
31
- switch (responseTag(response)) {
26
+ switch (response?.constructor?.name) {
32
27
  case "String":
33
28
  if (!isBun && !headers["content-type"]) materializeSetHeaders(set)["content-type"] = "text/plain";
34
29
  return new Response(response, set);
35
30
  case "Array": return Response.json(response, set);
36
31
  case "Object":
37
32
  if (response["~ely-form"]) return new Response(formToFormData(response), set);
38
- if (typeof response?.next === "function") return handleStream(response, set, request);
33
+ if (typeof response?.next === "function") return handleStream(response, set, request, void 0, owned);
39
34
  return Response.json(response, set);
40
35
  case "Number":
41
36
  case "Boolean": return new Response(response.toString(), set);
@@ -45,32 +40,33 @@ function mapResponseWithSet(response, set, request) {
45
40
  case "ElysiaStatus":
46
41
  set.status = response.code;
47
42
  if (response.headers) Object.assign(materializeSetHeaders(set), response.headers);
48
- return mapResponseWithSet(response.response, set, request);
43
+ return mapResponseWithSet(response.response, set, request, owned);
49
44
  case void 0: return response ? Response.json(response, set) : new Response(null, set);
50
- case "Response": return handleResponse(response, set, request);
51
- case "Error": return errorToResponse(response, set);
52
- case "Promise": return response.then((x) => mapResponseWithSet(x, set, request));
53
- case "Function": return mapResponseWithSet(response(), set, request);
45
+ case "Response": return handleResponse(response, set, request, owned);
46
+ case "Error": return errorToResponse(response, set, request, owned);
47
+ case "Promise": return response.then((x) => mapResponseWithSet(x, set, request, owned));
48
+ case "Function": return mapResponseWithSet(response(), set, request, owned);
54
49
  case "FormData": return new Response(response, set);
55
- default: return mapResponseFallback(response, set, request);
50
+ default: return mapResponseFallback(response, set, request, owned);
56
51
  }
57
52
  }
58
- function mapResponse(response, set, request) {
53
+ function mapResponse(response, set, request, owned) {
59
54
  const headers = set.headers;
60
- if (set.status !== void 0 || set.cookie || headers["\0"] === headers || isNotEmpty(headers)) return mapResponseWithSet(response, set, request);
55
+ if (set.status !== void 0 || set.cookie || headers["\0"] === headers || isNotEmpty(headers)) return mapResponseWithSet(response, set, request, owned);
61
56
  if (response instanceof ElysiaStatus) {
62
57
  set.status = response.code;
63
58
  if (response.headers) Object.assign(set.headers, response.headers);
64
- return mapResponse(response.response, set, request);
59
+ return mapResponse(response.response, set, request, owned);
65
60
  }
66
- if (response instanceof Response) return response;
67
- if (response instanceof Promise) return response.then((x) => mapResponse(x, set, request));
68
- if (typeof response?.next === "function" || response instanceof ReadableStream) return handleStream(response, set, request);
69
- return mapCompactResponse(response, request);
61
+ if (response instanceof Response) return owned ? handleResponse(response, void 0, request, true) : response;
62
+ if (response instanceof Promise) return response.then((x) => mapResponse(x, set, request, owned));
63
+ if (typeof response?.next === "function" || response instanceof ReadableStream) return handleStream(response, set, request, void 0, owned);
64
+ return mapCompactResponse(response, request, owned);
70
65
  }
71
- function mapCompactResponse(response, request) {
72
- switch (responseTag(response)) {
73
- case "String": return new Response(response, isBun ? void 0 : { headers: { "content-type": "text/plain" } });
66
+ const textHeaders = isBun ? void 0 : textPlainInit;
67
+ function mapCompactResponse(response, request, owned) {
68
+ switch (response?.constructor?.name) {
69
+ case "String": return new Response(response, textHeaders);
74
70
  case "Array": return Response.json(response);
75
71
  case "Object":
76
72
  if (response["~ely-form"]) return new Response(formToFormData(response));
@@ -83,22 +79,22 @@ function mapCompactResponse(response, request) {
83
79
  case "ElysiaStatus": return mapResponse(response.response, {
84
80
  status: response.code,
85
81
  headers: response.headers ? Object.assign(nullObject(), response.headers) : nullObject()
86
- });
82
+ }, request, owned);
87
83
  case void 0: return response ? Response.json(response) : new Response("");
88
- case "Response": return response;
89
- case "Error": return errorToResponse(response);
90
- case "Promise": return response.then((x) => mapCompactResponse(x, request));
91
- case "Function": return mapCompactResponse(response(), request);
84
+ case "Response": return owned ? handleResponse(response, void 0, request, true) : response;
85
+ case "Error": return errorToResponse(response, void 0, request, owned);
86
+ case "Promise": return response.then((x) => mapCompactResponse(x, request, owned));
87
+ case "Function": return mapCompactResponse(response(), request, owned);
92
88
  case "FormData": return new Response(response);
93
- default: return mapCompactResponseFallback(response, void 0, request);
89
+ default: return mapCompactResponseFallback(response, void 0, request, owned);
94
90
  }
95
91
  }
96
- function errorToResponse(error, set) {
92
+ function errorToResponse(error, set, request, owned = false) {
97
93
  if (error?.toResponse) {
98
94
  const targetSet = set ?? { headers: nullObject() };
99
95
  const apply = (resolved) => {
100
96
  if (resolved instanceof Response) targetSet.status = resolved.status;
101
- return mapResponse(resolved, targetSet);
97
+ return mapResponse(resolved, targetSet, request, owned);
102
98
  };
103
99
  const raw = error.toResponse();
104
100
  return typeof raw?.then === "function" ? raw.then(apply) : apply(raw);
@@ -114,31 +110,31 @@ function errorToResponse(error, set) {
114
110
  });
115
111
  }
116
112
  function mapFallback(map) {
117
- return (response, set, request) => {
118
- if (response instanceof Response) return handleResponse(response, set, request);
119
- if (response instanceof Promise) return response.then((x) => map(x, set, request));
120
- if (response instanceof Error) return errorToResponse(response, set);
113
+ return (response, set, request, owned = false) => {
114
+ if (response instanceof Response) return handleResponse(response, set, request, owned);
115
+ if (response instanceof Promise) return response.then((x) => map(x, set, request, owned));
116
+ if (response instanceof Error) return errorToResponse(response, set, request, owned);
121
117
  if (response instanceof ElysiaStatus) if (set) {
122
118
  set.status = response.code;
123
119
  if (response.headers) set.headers = {
124
120
  ...set.headers,
125
121
  ...response.headers
126
122
  };
127
- return map(response.response, set, request);
123
+ return map(response.response, set, request, owned);
128
124
  } else return mapResponse(response.response, {
129
125
  status: response.code,
130
126
  headers: response.headers ? { ...response.headers } : {}
131
- });
132
- if (typeof response?.next === "function" || response instanceof ReadableStream) return handleStream(response, set, request);
133
- if (typeof response?.then === "function") return response.then((x) => map(x, set, request));
127
+ }, request, owned);
128
+ if (typeof response?.next === "function" || response instanceof ReadableStream) return handleStream(response, set, request, void 0, owned);
129
+ if (typeof response?.then === "function") return response.then((x) => map(x, set, request, owned));
134
130
  if (Array.isArray(response)) return Response.json(response);
135
- if (typeof response?.toResponse === "function") return map(response.toResponse(), set, request);
131
+ if (typeof response?.toResponse === "function") return map(response.toResponse(), set, request, owned);
136
132
  if (response?.constructor?.name === "Cookie" && response.jar) return new Response(response.value, set);
137
133
  return new Response(response, set);
138
134
  };
139
135
  }
140
136
  const mapResponseFallback = mapFallback(mapResponse);
141
- const mapCompactResponseFallback = mapFallback((response, _, request) => mapCompactResponse(response, request));
137
+ const mapCompactResponseFallback = mapFallback((response, _, request, owned) => mapCompactResponse(response, request, owned));
142
138
  const handleResponse = createResponseHandler({
143
139
  mapResponse,
144
140
  mapCompactResponse
package/dist/base.d.ts CHANGED
@@ -1,12 +1,12 @@
1
1
  import { ElysiaStatus } from "./error.js";
2
- import { WSHandlerResponse, WSLocalHook, WSMessageHandler } from "./ws/types.js";
3
- import { TraceHandler } from "./trace.js";
2
+ import { TraceCapability, TraceHandler } from "./trace.js";
4
3
  import { ListenCallback, Serve, Server } from "./universal/server.js";
5
4
  import { AddRoute, AddWSRoute, AfterHandler, AfterResponseHandler, AnyErrorConstructor, AnyLocalHook, BodyHandler, CompiledHandler, CreateEden, DefaultEphemeral, DefaultMetadata, DefaultSingleton, DefinitionBase, DocumentDecoration, ElysiaConfig, ElysiaHandlerToResponseSchemaAmbiguous, EphemeralType, ErrorDefinitionEntry, ErrorHandler, EventScope, ExcludeElysiaResponse, ExtractErrorFromHandle, GlobalHookReturn, GracefulHandler, GuardHookSingleton, GuardLocalHook, HTTPMethod, HistoryEntry, HookContextSchema, HookContextSingleton, InlineHandler, InlineHandlerNonMacro, InputSchema, InputSchemaKey, InternalRoute, IntersectIfObjectSchema, JoinPath, LocalHook, LocalHookReturn, Macro, MacroSchemaChannel, MacroToContext, MacroToProperty, MapResponse, MaybeArray, MaybePromise, MergeElysiaInstances, MergeSchema, MergeScopedSchemas, MetadataBase, NonResolvableMacroKey, ObjectMacroDefs, OptionalHandler, PluginHookReturn, PreHandler, Prettify, PublicRoute, ResolveRouteErrors, RouteBase, ScopedHookReturn, ScopedMapDeriveReturn, SingletonBase, StaticMapAliases, TransformHandler, UnionResponseStatus, UnwrapRoute, WrapFn } from "./types.js";
6
5
  import { ChainNode } from "./utils.js";
7
6
  import { Context, ErrorContext, LifecycleContext } from "./context.js";
8
7
  import { AnySchema } from "./type/types.js";
9
8
  import { AotFingerprint, CompilerSession, ProgramId } from "./compile/aot.js";
9
+ import { WSCapability, WSHandlerResponse, WSLocalHook, WSMessageHandler, WSOptions, WSOptionsEntry } from "./ws/types.js";
10
10
  import { RouteTable } from "./route-table.js";
11
11
  import { Generation } from "./generation.js";
12
12
  import Memoirist from "memoirist";
@@ -39,8 +39,18 @@ declare class Elysia<const in out BasePath extends string = '', const in out Sco
39
39
  hoc?: WrapFn<any>[];
40
40
  setup?: GracefulHandler<any>[];
41
41
  cleanup?: GracefulHandler<any>[];
42
+ capability?: {
43
+ trace?: {
44
+ provider: TraceCapability;
45
+ };
46
+ ws?: {
47
+ provider: WSCapability;
48
+ options?: WSOptionsEntry[];
49
+ };
50
+ };
42
51
  };
43
52
  '~hookChain'?: ChainNode;
53
+ '~wsConfig'?: WSOptions;
44
54
  server?: Server;
45
55
  get history(): readonly HistoryEntry[];
46
56
  get ['~routes'](): readonly InternalRoute[];
@@ -514,6 +524,21 @@ declare class Elysia<const in out BasePath extends string = '', const in out Sco
514
524
  parser: Metadata['parser'];
515
525
  response: Metadata['response'] & MacroContext['response'] & ElysiaHandlerToResponseSchemaAmbiguous<BeforeHandle> & ElysiaHandlerToResponseSchemaAmbiguous<AfterHandle> & ElysiaHandlerToResponseSchemaAmbiguous<ErrorHandle>;
516
526
  }, {}, Ephemeral, Volatile>) => NewElysia): Elysia<BasePath, Scope, Singleton, Definitions, Metadata, Routes & NewElysia['~Routes'], Ephemeral, Volatile>;
527
+ /**
528
+ * Single idempotent capability resolver-accessor (README rev 2.1). Reads
529
+ * the merged `~ext.capability` channel — never mutated during a build — and
530
+ * throws when a capability is used but its provider was never registered.
531
+ * For `trace` the resolved view IS the nearest-root provider (merge already
532
+ * keeps it); for `ws` it additionally resolves the depth-precedence base
533
+ * options. Called at the start of every router build and by `compileHandler`
534
+ * before it reads the frozen root, so direct-compiler paths resolve without
535
+ * a prior seal.
536
+ */
537
+ ['~resolvedCapability'](kind: 'trace'): TraceCapability | undefined;
538
+ ['~resolvedCapability'](kind: 'ws'): {
539
+ provider: WSCapability;
540
+ options: WSOptions | undefined;
541
+ } | undefined;
517
542
  /**
518
543
  * ### macro
519
544
  * Declare a custom route property: applying it on a route or guard folds