legonode 0.0.1
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 +107 -0
- package/dist/cli/cli.d.ts +3 -0
- package/dist/cli/cli.d.ts.map +1 -0
- package/dist/cli/cli.js +44 -0
- package/dist/cli/cli.js.map +1 -0
- package/dist/cli/commands/build.d.ts +8 -0
- package/dist/cli/commands/build.d.ts.map +1 -0
- package/dist/cli/commands/build.js +101 -0
- package/dist/cli/commands/build.js.map +1 -0
- package/dist/cli/commands/dev.d.ts +13 -0
- package/dist/cli/commands/dev.d.ts.map +1 -0
- package/dist/cli/commands/dev.js +285 -0
- package/dist/cli/commands/dev.js.map +1 -0
- package/dist/cli/commands/start.d.ts +10 -0
- package/dist/cli/commands/start.d.ts.map +1 -0
- package/dist/cli/commands/start.js +108 -0
- package/dist/cli/commands/start.js.map +1 -0
- package/dist/cli/pluginHooks.d.ts +5 -0
- package/dist/cli/pluginHooks.d.ts.map +1 -0
- package/dist/cli/pluginHooks.js +11 -0
- package/dist/cli/pluginHooks.js.map +1 -0
- package/dist/src/body/parseBody.d.ts +11 -0
- package/dist/src/body/parseBody.d.ts.map +1 -0
- package/dist/src/body/parseBody.js +113 -0
- package/dist/src/body/parseBody.js.map +1 -0
- package/dist/src/config/loadConfig.d.ts +71 -0
- package/dist/src/config/loadConfig.d.ts.map +1 -0
- package/dist/src/config/loadConfig.js +69 -0
- package/dist/src/config/loadConfig.js.map +1 -0
- package/dist/src/core/context.d.ts +139 -0
- package/dist/src/core/context.d.ts.map +1 -0
- package/dist/src/core/context.js +293 -0
- package/dist/src/core/context.js.map +1 -0
- package/dist/src/core/lifecycle.d.ts +3 -0
- package/dist/src/core/lifecycle.d.ts.map +1 -0
- package/dist/src/core/lifecycle.js +14 -0
- package/dist/src/core/lifecycle.js.map +1 -0
- package/dist/src/core/runtime.d.ts +28 -0
- package/dist/src/core/runtime.d.ts.map +1 -0
- package/dist/src/core/runtime.js +104 -0
- package/dist/src/core/runtime.js.map +1 -0
- package/dist/src/cors/cors.d.ts +5 -0
- package/dist/src/cors/cors.d.ts.map +1 -0
- package/dist/src/cors/cors.js +75 -0
- package/dist/src/cors/cors.js.map +1 -0
- package/dist/src/events/eventBus.d.ts +19 -0
- package/dist/src/events/eventBus.d.ts.map +1 -0
- package/dist/src/events/eventBus.js +29 -0
- package/dist/src/events/eventBus.js.map +1 -0
- package/dist/src/events/eventExecutor.d.ts +5 -0
- package/dist/src/events/eventExecutor.d.ts.map +1 -0
- package/dist/src/events/eventExecutor.js +84 -0
- package/dist/src/events/eventExecutor.js.map +1 -0
- package/dist/src/index.d.ts +23 -0
- package/dist/src/index.d.ts.map +1 -0
- package/dist/src/index.js +13 -0
- package/dist/src/index.js.map +1 -0
- package/dist/src/json/fastStringify.d.ts +7 -0
- package/dist/src/json/fastStringify.d.ts.map +1 -0
- package/dist/src/json/fastStringify.js +73 -0
- package/dist/src/json/fastStringify.js.map +1 -0
- package/dist/src/loader/fileScanner.d.ts +18 -0
- package/dist/src/loader/fileScanner.d.ts.map +1 -0
- package/dist/src/loader/fileScanner.js +133 -0
- package/dist/src/loader/fileScanner.js.map +1 -0
- package/dist/src/loader/moduleCache.d.ts +3 -0
- package/dist/src/loader/moduleCache.d.ts.map +1 -0
- package/dist/src/loader/moduleCache.js +19 -0
- package/dist/src/loader/moduleCache.js.map +1 -0
- package/dist/src/loader/moduleLoader.d.ts +2 -0
- package/dist/src/loader/moduleLoader.d.ts.map +1 -0
- package/dist/src/loader/moduleLoader.js +4 -0
- package/dist/src/loader/moduleLoader.js.map +1 -0
- package/dist/src/logger/requestLogger.d.ts +20 -0
- package/dist/src/logger/requestLogger.d.ts.map +1 -0
- package/dist/src/logger/requestLogger.js +63 -0
- package/dist/src/logger/requestLogger.js.map +1 -0
- package/dist/src/middleware/middlewareLoader.d.ts +3 -0
- package/dist/src/middleware/middlewareLoader.d.ts.map +1 -0
- package/dist/src/middleware/middlewareLoader.js +28 -0
- package/dist/src/middleware/middlewareLoader.js.map +1 -0
- package/dist/src/middleware/middlewareResolver.d.ts +13 -0
- package/dist/src/middleware/middlewareResolver.d.ts.map +1 -0
- package/dist/src/middleware/middlewareResolver.js +72 -0
- package/dist/src/middleware/middlewareResolver.js.map +1 -0
- package/dist/src/middleware/middlewareRunner.d.ts +10 -0
- package/dist/src/middleware/middlewareRunner.d.ts.map +1 -0
- package/dist/src/middleware/middlewareRunner.js +27 -0
- package/dist/src/middleware/middlewareRunner.js.map +1 -0
- package/dist/src/middleware/middlewareTable.d.ts +6 -0
- package/dist/src/middleware/middlewareTable.d.ts.map +1 -0
- package/dist/src/middleware/middlewareTable.js +44 -0
- package/dist/src/middleware/middlewareTable.js.map +1 -0
- package/dist/src/pipeline/compose.d.ts +10 -0
- package/dist/src/pipeline/compose.d.ts.map +1 -0
- package/dist/src/pipeline/compose.js +35 -0
- package/dist/src/pipeline/compose.js.map +1 -0
- package/dist/src/pipeline/pipelineCache.d.ts +16 -0
- package/dist/src/pipeline/pipelineCache.d.ts.map +1 -0
- package/dist/src/pipeline/pipelineCache.js +73 -0
- package/dist/src/pipeline/pipelineCache.js.map +1 -0
- package/dist/src/plugin/pluginAPI.d.ts +63 -0
- package/dist/src/plugin/pluginAPI.d.ts.map +1 -0
- package/dist/src/plugin/pluginAPI.js +2 -0
- package/dist/src/plugin/pluginAPI.js.map +1 -0
- package/dist/src/plugin/pluginManager.d.ts +6 -0
- package/dist/src/plugin/pluginManager.d.ts.map +1 -0
- package/dist/src/plugin/pluginManager.js +16 -0
- package/dist/src/plugin/pluginManager.js.map +1 -0
- package/dist/src/router/matcher.d.ts +10 -0
- package/dist/src/router/matcher.d.ts.map +1 -0
- package/dist/src/router/matcher.js +69 -0
- package/dist/src/router/matcher.js.map +1 -0
- package/dist/src/router/radixTree.d.ts +24 -0
- package/dist/src/router/radixTree.d.ts.map +1 -0
- package/dist/src/router/radixTree.js +208 -0
- package/dist/src/router/radixTree.js.map +1 -0
- package/dist/src/router/routeLoader.d.ts +22 -0
- package/dist/src/router/routeLoader.d.ts.map +1 -0
- package/dist/src/router/routeLoader.js +94 -0
- package/dist/src/router/routeLoader.js.map +1 -0
- package/dist/src/router/routeTable.d.ts +25 -0
- package/dist/src/router/routeTable.d.ts.map +1 -0
- package/dist/src/router/routeTable.js +133 -0
- package/dist/src/router/routeTable.js.map +1 -0
- package/dist/src/router/router.d.ts +18 -0
- package/dist/src/router/router.d.ts.map +1 -0
- package/dist/src/router/router.js +158 -0
- package/dist/src/router/router.js.map +1 -0
- package/dist/src/schedules/parseSchedule.d.ts +15 -0
- package/dist/src/schedules/parseSchedule.d.ts.map +1 -0
- package/dist/src/schedules/parseSchedule.js +111 -0
- package/dist/src/schedules/parseSchedule.js.map +1 -0
- package/dist/src/schedules/runScheduler.d.ts +14 -0
- package/dist/src/schedules/runScheduler.d.ts.map +1 -0
- package/dist/src/schedules/runScheduler.js +58 -0
- package/dist/src/schedules/runScheduler.js.map +1 -0
- package/dist/src/schedules/scheduleLoader.d.ts +14 -0
- package/dist/src/schedules/scheduleLoader.d.ts.map +1 -0
- package/dist/src/schedules/scheduleLoader.js +122 -0
- package/dist/src/schedules/scheduleLoader.js.map +1 -0
- package/dist/src/schedules/types.d.ts +37 -0
- package/dist/src/schedules/types.d.ts.map +1 -0
- package/dist/src/schedules/types.js +2 -0
- package/dist/src/schedules/types.js.map +1 -0
- package/dist/src/server/errorHandler.d.ts +4 -0
- package/dist/src/server/errorHandler.d.ts.map +1 -0
- package/dist/src/server/errorHandler.js +10 -0
- package/dist/src/server/errorHandler.js.map +1 -0
- package/dist/src/server/requestHandler.d.ts +35 -0
- package/dist/src/server/requestHandler.d.ts.map +1 -0
- package/dist/src/server/requestHandler.js +439 -0
- package/dist/src/server/requestHandler.js.map +1 -0
- package/dist/src/server/server.d.ts +20 -0
- package/dist/src/server/server.d.ts.map +1 -0
- package/dist/src/server/server.js +74 -0
- package/dist/src/server/server.js.map +1 -0
- package/dist/src/tasks/scheduler.d.ts +10 -0
- package/dist/src/tasks/scheduler.d.ts.map +1 -0
- package/dist/src/tasks/scheduler.js +10 -0
- package/dist/src/tasks/scheduler.js.map +1 -0
- package/dist/src/tasks/taskRunner.d.ts +3 -0
- package/dist/src/tasks/taskRunner.d.ts.map +1 -0
- package/dist/src/tasks/taskRunner.js +4 -0
- package/dist/src/tasks/taskRunner.js.map +1 -0
- package/dist/src/trace/traceEngine.d.ts +45 -0
- package/dist/src/trace/traceEngine.d.ts.map +1 -0
- package/dist/src/trace/traceEngine.js +63 -0
- package/dist/src/trace/traceEngine.js.map +1 -0
- package/dist/src/trace/traceStore.d.ts +10 -0
- package/dist/src/trace/traceStore.d.ts.map +1 -0
- package/dist/src/trace/traceStore.js +10 -0
- package/dist/src/trace/traceStore.js.map +1 -0
- package/dist/src/utils/logger.d.ts +6 -0
- package/dist/src/utils/logger.d.ts.map +1 -0
- package/dist/src/utils/logger.js +21 -0
- package/dist/src/utils/logger.js.map +1 -0
- package/dist/src/utils/path.d.ts +2 -0
- package/dist/src/utils/path.d.ts.map +1 -0
- package/dist/src/utils/path.js +4 -0
- package/dist/src/utils/path.js.map +1 -0
- package/dist/src/validation/routeSchema.d.ts +77 -0
- package/dist/src/validation/routeSchema.d.ts.map +1 -0
- package/dist/src/validation/routeSchema.js +134 -0
- package/dist/src/validation/routeSchema.js.map +1 -0
- package/dist/src/validation/validateApp.d.ts +20 -0
- package/dist/src/validation/validateApp.d.ts.map +1 -0
- package/dist/src/validation/validateApp.js +23 -0
- package/dist/src/validation/validateApp.js.map +1 -0
- package/dist/src/validation/validateBody.d.ts +7 -0
- package/dist/src/validation/validateBody.d.ts.map +1 -0
- package/dist/src/validation/validateBody.js +8 -0
- package/dist/src/validation/validateBody.js.map +1 -0
- package/package.json +31 -0
|
@@ -0,0 +1,293 @@
|
|
|
1
|
+
import { getNoopLogger } from "../logger/requestLogger.js";
|
|
2
|
+
/** Pick default status when handler does not call res.status(): prefer 200, then 201, then 204; else 200. */
|
|
3
|
+
export function getDefaultStatusFromSchema(schema) {
|
|
4
|
+
if (!schema || typeof schema !== "object")
|
|
5
|
+
return 200;
|
|
6
|
+
const keys = Object.keys(schema)
|
|
7
|
+
.map(Number)
|
|
8
|
+
.filter((k) => !Number.isNaN(k));
|
|
9
|
+
if (keys.length === 0)
|
|
10
|
+
return 200;
|
|
11
|
+
if (keys.includes(200))
|
|
12
|
+
return 200;
|
|
13
|
+
if (keys.includes(201))
|
|
14
|
+
return 201;
|
|
15
|
+
if (keys.includes(204))
|
|
16
|
+
return 204;
|
|
17
|
+
return 200;
|
|
18
|
+
}
|
|
19
|
+
function createLegonodeResponse(nodeRes, defaultStatusRef, responseSizeRef, beforeSend, ctxRef) {
|
|
20
|
+
const state = {
|
|
21
|
+
nodeRes,
|
|
22
|
+
defaultStatusRef,
|
|
23
|
+
responseSizeRef,
|
|
24
|
+
sent: false,
|
|
25
|
+
explicitStatus: null,
|
|
26
|
+
headers: Object.create(null),
|
|
27
|
+
};
|
|
28
|
+
function effectiveStatus() {
|
|
29
|
+
return state.explicitStatus ?? state.defaultStatusRef.current;
|
|
30
|
+
}
|
|
31
|
+
function applyHeaders() {
|
|
32
|
+
for (const [k, v] of Object.entries(state.headers)) {
|
|
33
|
+
state.nodeRes.setHeader(k, String(v));
|
|
34
|
+
}
|
|
35
|
+
}
|
|
36
|
+
function doSend(body) {
|
|
37
|
+
state.sent = true;
|
|
38
|
+
if (state.responseSizeRef) {
|
|
39
|
+
state.responseSizeRef.current =
|
|
40
|
+
body === undefined ? 0 : Buffer.isBuffer(body) ? body.length : typeof body === "string" ? Buffer.byteLength(body) : body.length;
|
|
41
|
+
}
|
|
42
|
+
state.nodeRes.statusCode = effectiveStatus();
|
|
43
|
+
applyHeaders();
|
|
44
|
+
if (body !== undefined) {
|
|
45
|
+
state.nodeRes.end(Buffer.isBuffer(body) ? body : typeof body === "string" ? body : Buffer.from(body));
|
|
46
|
+
}
|
|
47
|
+
else {
|
|
48
|
+
state.nodeRes.end();
|
|
49
|
+
}
|
|
50
|
+
}
|
|
51
|
+
function end(body) {
|
|
52
|
+
if (state.sent)
|
|
53
|
+
return;
|
|
54
|
+
if (beforeSend && ctxRef?.current) {
|
|
55
|
+
const c = ctxRef;
|
|
56
|
+
return (async () => {
|
|
57
|
+
await beforeSend(c.current);
|
|
58
|
+
if (state.sent)
|
|
59
|
+
return;
|
|
60
|
+
doSend(body);
|
|
61
|
+
})();
|
|
62
|
+
}
|
|
63
|
+
doSend(body);
|
|
64
|
+
}
|
|
65
|
+
function sendJson(data) {
|
|
66
|
+
if (state.sent)
|
|
67
|
+
return;
|
|
68
|
+
state.nodeRes.setHeader("content-type", "application/json; charset=utf-8");
|
|
69
|
+
return end(JSON.stringify(data));
|
|
70
|
+
}
|
|
71
|
+
const chain = {
|
|
72
|
+
json(data) {
|
|
73
|
+
return sendJson(data);
|
|
74
|
+
},
|
|
75
|
+
send(body) {
|
|
76
|
+
return end(body);
|
|
77
|
+
},
|
|
78
|
+
text(body) {
|
|
79
|
+
if (state.sent)
|
|
80
|
+
return;
|
|
81
|
+
state.nodeRes.setHeader("content-type", "text/plain; charset=utf-8");
|
|
82
|
+
return end(body);
|
|
83
|
+
},
|
|
84
|
+
html(body) {
|
|
85
|
+
if (state.sent)
|
|
86
|
+
return;
|
|
87
|
+
state.nodeRes.setHeader("content-type", "text/html; charset=utf-8");
|
|
88
|
+
return end(body);
|
|
89
|
+
}
|
|
90
|
+
};
|
|
91
|
+
function doRedirect(url, code) {
|
|
92
|
+
state.explicitStatus = code;
|
|
93
|
+
if (state.responseSizeRef)
|
|
94
|
+
state.responseSizeRef.current = 0;
|
|
95
|
+
state.nodeRes.setHeader("location", url);
|
|
96
|
+
applyHeaders();
|
|
97
|
+
state.sent = true;
|
|
98
|
+
state.nodeRes.statusCode = effectiveStatus();
|
|
99
|
+
state.nodeRes.end();
|
|
100
|
+
}
|
|
101
|
+
function redirect(url, code = 302) {
|
|
102
|
+
if (state.sent)
|
|
103
|
+
return;
|
|
104
|
+
if (beforeSend && ctxRef?.current) {
|
|
105
|
+
const c = ctxRef;
|
|
106
|
+
return (async () => {
|
|
107
|
+
await beforeSend(c.current);
|
|
108
|
+
if (state.sent)
|
|
109
|
+
return;
|
|
110
|
+
doRedirect(url, code);
|
|
111
|
+
})();
|
|
112
|
+
}
|
|
113
|
+
doRedirect(url, code);
|
|
114
|
+
}
|
|
115
|
+
function doStream(readable) {
|
|
116
|
+
state.sent = true;
|
|
117
|
+
if (state.responseSizeRef)
|
|
118
|
+
state.responseSizeRef.current = 0;
|
|
119
|
+
state.nodeRes.statusCode = effectiveStatus();
|
|
120
|
+
applyHeaders();
|
|
121
|
+
readable.pipe(state.nodeRes);
|
|
122
|
+
}
|
|
123
|
+
function stream(readable) {
|
|
124
|
+
if (state.sent)
|
|
125
|
+
return;
|
|
126
|
+
if (beforeSend && ctxRef?.current) {
|
|
127
|
+
const c = ctxRef;
|
|
128
|
+
return (async () => {
|
|
129
|
+
await beforeSend(c.current);
|
|
130
|
+
if (state.sent)
|
|
131
|
+
return;
|
|
132
|
+
doStream(readable);
|
|
133
|
+
})();
|
|
134
|
+
}
|
|
135
|
+
doStream(readable);
|
|
136
|
+
}
|
|
137
|
+
const res = {
|
|
138
|
+
get raw() {
|
|
139
|
+
return state.nodeRes;
|
|
140
|
+
},
|
|
141
|
+
status(code) {
|
|
142
|
+
state.explicitStatus = code;
|
|
143
|
+
return chain;
|
|
144
|
+
},
|
|
145
|
+
get headers() {
|
|
146
|
+
return state.headers;
|
|
147
|
+
},
|
|
148
|
+
setHeader(name, value) {
|
|
149
|
+
state.headers[name.toLowerCase()] = value;
|
|
150
|
+
},
|
|
151
|
+
send(body) {
|
|
152
|
+
return end(body);
|
|
153
|
+
},
|
|
154
|
+
html(body) {
|
|
155
|
+
if (state.sent)
|
|
156
|
+
return;
|
|
157
|
+
state.nodeRes.setHeader("content-type", "text/html; charset=utf-8");
|
|
158
|
+
return end(body);
|
|
159
|
+
},
|
|
160
|
+
json(data) {
|
|
161
|
+
return sendJson(data);
|
|
162
|
+
},
|
|
163
|
+
text(body) {
|
|
164
|
+
if (state.sent)
|
|
165
|
+
return;
|
|
166
|
+
state.nodeRes.setHeader("content-type", "text/plain; charset=utf-8");
|
|
167
|
+
return end(body);
|
|
168
|
+
},
|
|
169
|
+
redirect,
|
|
170
|
+
stream,
|
|
171
|
+
get sent() {
|
|
172
|
+
return state.sent;
|
|
173
|
+
},
|
|
174
|
+
get statusCode() {
|
|
175
|
+
return effectiveStatus();
|
|
176
|
+
},
|
|
177
|
+
reinit(n, d, r) {
|
|
178
|
+
state.nodeRes = n;
|
|
179
|
+
state.defaultStatusRef = d;
|
|
180
|
+
state.responseSizeRef = r;
|
|
181
|
+
state.sent = false;
|
|
182
|
+
state.explicitStatus = null;
|
|
183
|
+
for (const k of Object.keys(state.headers))
|
|
184
|
+
delete state.headers[k];
|
|
185
|
+
}
|
|
186
|
+
};
|
|
187
|
+
return res;
|
|
188
|
+
}
|
|
189
|
+
const ctxPool = [];
|
|
190
|
+
const EMPTY_PARAMS = Object.create(null);
|
|
191
|
+
/** Parse query string to a plain object (no URLSearchParams allocation; null prototype). */
|
|
192
|
+
function parseQuery(search) {
|
|
193
|
+
const obj = Object.create(null);
|
|
194
|
+
if (!search.length)
|
|
195
|
+
return obj;
|
|
196
|
+
let start = 0;
|
|
197
|
+
while (start < search.length) {
|
|
198
|
+
const eq = search.indexOf("=", start);
|
|
199
|
+
const amp = search.indexOf("&", start);
|
|
200
|
+
const end = amp === -1 ? search.length : amp;
|
|
201
|
+
const key = decodeURIComponent(search.slice(start, eq === -1 ? end : eq).replace(/\+/g, " "));
|
|
202
|
+
const value = eq === -1 || eq >= end
|
|
203
|
+
? ""
|
|
204
|
+
: decodeURIComponent(search.slice(eq + 1, end).replace(/\+/g, " "));
|
|
205
|
+
if (key.length)
|
|
206
|
+
obj[key] = value;
|
|
207
|
+
start = amp === -1 ? search.length : amp + 1;
|
|
208
|
+
}
|
|
209
|
+
return obj;
|
|
210
|
+
}
|
|
211
|
+
function parseQueryFromReq(req) {
|
|
212
|
+
const raw = req.url ?? "/";
|
|
213
|
+
const i = raw.indexOf("?");
|
|
214
|
+
const search = i === -1 ? "" : raw.slice(i + 1);
|
|
215
|
+
return parseQuery(search);
|
|
216
|
+
}
|
|
217
|
+
function allocContext(req, res, beforeSend) {
|
|
218
|
+
const responseSchemaRef = {};
|
|
219
|
+
const defaultStatusRef = { current: 200 };
|
|
220
|
+
const responseSizeRef = { current: 0 };
|
|
221
|
+
const ctxRef = { current: null };
|
|
222
|
+
const ctx = {
|
|
223
|
+
req,
|
|
224
|
+
res: createLegonodeResponse(res, defaultStatusRef, responseSizeRef, beforeSend, ctxRef),
|
|
225
|
+
__responseSchemaRef: responseSchemaRef,
|
|
226
|
+
__defaultStatusRef: defaultStatusRef,
|
|
227
|
+
__responseSizeRef: responseSizeRef,
|
|
228
|
+
params: Object.create(null),
|
|
229
|
+
get query() {
|
|
230
|
+
if (ctx.__queryCache === undefined) {
|
|
231
|
+
ctx.__queryCache = parseQueryFromReq(ctx.req);
|
|
232
|
+
}
|
|
233
|
+
return ctx.__queryCache;
|
|
234
|
+
},
|
|
235
|
+
set query(v) {
|
|
236
|
+
ctx.__queryCache = v;
|
|
237
|
+
},
|
|
238
|
+
body: null,
|
|
239
|
+
state: Object.create(null),
|
|
240
|
+
emit: () => { },
|
|
241
|
+
schedule: () => { },
|
|
242
|
+
logger: getNoopLogger(),
|
|
243
|
+
log: { state: [] },
|
|
244
|
+
trace: { get traceId() { return ""; } },
|
|
245
|
+
__ctxRef: ctxRef,
|
|
246
|
+
};
|
|
247
|
+
ctxRef.current = ctx;
|
|
248
|
+
return ctx;
|
|
249
|
+
}
|
|
250
|
+
function reinitContext(ctx, req, res, beforeSend) {
|
|
251
|
+
const defaultStatusRef = ctx.__defaultStatusRef;
|
|
252
|
+
const responseSizeRef = ctx.__responseSizeRef;
|
|
253
|
+
defaultStatusRef.current = 200;
|
|
254
|
+
responseSizeRef.current = 0;
|
|
255
|
+
ctx.req = req;
|
|
256
|
+
if (ctx.__ctxRef)
|
|
257
|
+
ctx.__ctxRef.current = ctx;
|
|
258
|
+
if (ctx.res.reinit) {
|
|
259
|
+
ctx.res.reinit(res, defaultStatusRef, responseSizeRef);
|
|
260
|
+
}
|
|
261
|
+
else {
|
|
262
|
+
const ctxRef = ctx.__ctxRef ?? { current: ctx };
|
|
263
|
+
ctx.res = createLegonodeResponse(res, defaultStatusRef, responseSizeRef, beforeSend, ctxRef);
|
|
264
|
+
}
|
|
265
|
+
ctx.params = Object.create(null);
|
|
266
|
+
ctx.body = null;
|
|
267
|
+
delete ctx.__queryCache;
|
|
268
|
+
ctx.state = Object.create(null);
|
|
269
|
+
ctx.log.state = [];
|
|
270
|
+
return ctx;
|
|
271
|
+
}
|
|
272
|
+
/** Get context from pool or create new. Use releaseContext(ctx) in finally when done. When usePool is false, always alloc (faster hot path for hello-world). */
|
|
273
|
+
export function getContext(req, res, usePool = false, beforeSend) {
|
|
274
|
+
if (!usePool)
|
|
275
|
+
return allocContext(req, res, beforeSend);
|
|
276
|
+
const recycled = ctxPool.pop();
|
|
277
|
+
if (recycled)
|
|
278
|
+
return reinitContext(recycled, req, res, beforeSend);
|
|
279
|
+
return allocContext(req, res, beforeSend);
|
|
280
|
+
}
|
|
281
|
+
/** Return context to pool. Call in request handler finally. Keeps ctx.res for reuse via reinit. */
|
|
282
|
+
export function releaseContext(ctx) {
|
|
283
|
+
ctx.req = null;
|
|
284
|
+
ctx.params = EMPTY_PARAMS;
|
|
285
|
+
ctx.body = null;
|
|
286
|
+
delete ctx.__queryCache;
|
|
287
|
+
ctx.state = Object.create(null);
|
|
288
|
+
ctx.log.state = [];
|
|
289
|
+
ctxPool.push(ctx);
|
|
290
|
+
}
|
|
291
|
+
/** Get a request context (from pool when possible). Same as getContext; exported for backwards compatibility. */
|
|
292
|
+
export const createContext = getContext;
|
|
293
|
+
//# sourceMappingURL=context.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"context.js","sourceRoot":"","sources":["../../../src/core/context.ts"],"names":[],"mappings":"AAQA,OAAO,EAAE,aAAa,EAAE,MAAM,4BAA4B,CAAC;AAuI3D,6GAA6G;AAC7G,MAAM,UAAU,0BAA0B,CAAC,MAAqC;IAC9E,IAAI,CAAC,MAAM,IAAI,OAAO,MAAM,KAAK,QAAQ;QAAE,OAAO,GAAG,CAAC;IACtD,MAAM,IAAI,GAAG,MAAM,CAAC,IAAI,CAAC,MAAM,CAAC;SAC7B,GAAG,CAAC,MAAM,CAAC;SACX,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC,CAAC,CAAa,CAAC;IAC/C,IAAI,IAAI,CAAC,MAAM,KAAK,CAAC;QAAE,OAAO,GAAG,CAAC;IAClC,IAAI,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC;QAAE,OAAO,GAAG,CAAC;IACnC,IAAI,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC;QAAE,OAAO,GAAG,CAAC;IACnC,IAAI,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC;QAAE,OAAO,GAAG,CAAC;IACnC,OAAO,GAAG,CAAC;AACb,CAAC;AAcD,SAAS,sBAAsB,CAC7B,OAAuB,EACvB,gBAAkC,EAClC,eAAqC,EACrC,UAAyB,EACzB,MAA4C;IAE5C,MAAM,KAAK,GAAkB;QAC3B,OAAO;QACP,gBAAgB;QAChB,eAAe;QACf,IAAI,EAAE,KAAK;QACX,cAAc,EAAE,IAAI;QACpB,OAAO,EAAE,MAAM,CAAC,MAAM,CAAC,IAAI,CAAoC;KAChE,CAAC;IAEF,SAAS,eAAe;QACtB,OAAO,KAAK,CAAC,cAAc,IAAI,KAAK,CAAC,gBAAgB,CAAC,OAAO,CAAC;IAChE,CAAC;IAED,SAAS,YAAY;QACnB,KAAK,MAAM,CAAC,CAAC,EAAE,CAAC,CAAC,IAAI,MAAM,CAAC,OAAO,CAAC,KAAK,CAAC,OAAO,CAAC,EAAE,CAAC;YACnD,KAAK,CAAC,OAAO,CAAC,SAAS,CAAC,CAAC,EAAE,MAAM,CAAC,CAAC,CAAC,CAAC,CAAC;QACxC,CAAC;IACH,CAAC;IAED,SAAS,MAAM,CAAC,IAAmC;QACjD,KAAK,CAAC,IAAI,GAAG,IAAI,CAAC;QAClB,IAAI,KAAK,CAAC,eAAe,EAAE,CAAC;YAC1B,KAAK,CAAC,eAAe,CAAC,OAAO;gBAC3B,IAAI,KAAK,SAAS,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC,QAAQ,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC,CAAC,OAAO,IAAI,KAAK,QAAQ,CAAC,CAAC,CAAC,MAAM,CAAC,UAAU,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,MAAM,CAAC;QACpI,CAAC;QACD,KAAK,CAAC,OAAO,CAAC,UAAU,GAAG,eAAe,EAAE,CAAC;QAC7C,YAAY,EAAE,CAAC;QACf,IAAI,IAAI,KAAK,SAAS,EAAE,CAAC;YACvB,KAAK,CAAC,OAAO,CAAC,GAAG,CAAC,MAAM,CAAC,QAAQ,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,OAAO,IAAI,KAAK,QAAQ,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,MAAM,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC;QACxG,CAAC;aAAM,CAAC;YACN,KAAK,CAAC,OAAO,CAAC,GAAG,EAAE,CAAC;QACtB,CAAC;IACH,CAAC;IAED,SAAS,GAAG,CAAC,IAAmC;QAC9C,IAAI,KAAK,CAAC,IAAI;YAAE,OAAO;QACvB,IAAI,UAAU,IAAI,MAAM,EAAE,OAAO,EAAE,CAAC;YAClC,MAAM,CAAC,GAAG,MAAM,CAAC;YACjB,OAAO,CAAC,KAAK,IAAI,EAAE;gBACjB,MAAM,UAAU,CAAC,CAAC,CAAC,OAAQ,CAAC,CAAC;gBAC7B,IAAI,KAAK,CAAC,IAAI;oBAAE,OAAO;gBACvB,MAAM,CAAC,IAAI,CAAC,CAAC;YACf,CAAC,CAAC,EAAE,CAAC;QACP,CAAC;QACD,MAAM,CAAC,IAAI,CAAC,CAAC;IACf,CAAC;IAED,SAAS,QAAQ,CAAC,IAAa;QAC7B,IAAI,KAAK,CAAC,IAAI;YAAE,OAAO;QACvB,KAAK,CAAC,OAAO,CAAC,SAAS,CAAC,cAAc,EAAE,iCAAiC,CAAC,CAAC;QAC3E,OAAO,GAAG,CAAC,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC,CAAC,CAAC;IACnC,CAAC;IAED,MAAM,KAAK,GAAmB;QAC5B,IAAI,CAAC,IAAa;YAChB,OAAO,QAAQ,CAAC,IAAI,CAAC,CAAC;QACxB,CAAC;QACD,IAAI,CAAC,IAAkC;YACrC,OAAO,GAAG,CAAC,IAAI,CAAC,CAAC;QACnB,CAAC;QACD,IAAI,CAAC,IAAY;YACf,IAAI,KAAK,CAAC,IAAI;gBAAE,OAAO;YACvB,KAAK,CAAC,OAAO,CAAC,SAAS,CAAC,cAAc,EAAE,2BAA2B,CAAC,CAAC;YACrE,OAAO,GAAG,CAAC,IAAI,CAAC,CAAC;QACnB,CAAC;QACD,IAAI,CAAC,IAAY;YACf,IAAI,KAAK,CAAC,IAAI;gBAAE,OAAO;YACvB,KAAK,CAAC,OAAO,CAAC,SAAS,CAAC,cAAc,EAAE,0BAA0B,CAAC,CAAC;YACpE,OAAO,GAAG,CAAC,IAAI,CAAC,CAAC;QACnB,CAAC;KACF,CAAC;IAEF,SAAS,UAAU,CAAC,GAAW,EAAE,IAAY;QAC3C,KAAK,CAAC,cAAc,GAAG,IAAI,CAAC;QAC5B,IAAI,KAAK,CAAC,eAAe;YAAE,KAAK,CAAC,eAAe,CAAC,OAAO,GAAG,CAAC,CAAC;QAC7D,KAAK,CAAC,OAAO,CAAC,SAAS,CAAC,UAAU,EAAE,GAAG,CAAC,CAAC;QACzC,YAAY,EAAE,CAAC;QACf,KAAK,CAAC,IAAI,GAAG,IAAI,CAAC;QAClB,KAAK,CAAC,OAAO,CAAC,UAAU,GAAG,eAAe,EAAE,CAAC;QAC7C,KAAK,CAAC,OAAO,CAAC,GAAG,EAAE,CAAC;IACtB,CAAC;IAED,SAAS,QAAQ,CAAC,GAAW,EAAE,IAAI,GAAG,GAAG;QACvC,IAAI,KAAK,CAAC,IAAI;YAAE,OAAO;QACvB,IAAI,UAAU,IAAI,MAAM,EAAE,OAAO,EAAE,CAAC;YAClC,MAAM,CAAC,GAAG,MAAM,CAAC;YACjB,OAAO,CAAC,KAAK,IAAI,EAAE;gBACjB,MAAM,UAAU,CAAC,CAAC,CAAC,OAAQ,CAAC,CAAC;gBAC7B,IAAI,KAAK,CAAC,IAAI;oBAAE,OAAO;gBACvB,UAAU,CAAC,GAAG,EAAE,IAAI,CAAC,CAAC;YACxB,CAAC,CAAC,EAAE,CAAC;QACP,CAAC;QACD,UAAU,CAAC,GAAG,EAAE,IAAI,CAAC,CAAC;IACxB,CAAC;IAED,SAAS,QAAQ,CAAC,QAAkB;QAClC,KAAK,CAAC,IAAI,GAAG,IAAI,CAAC;QAClB,IAAI,KAAK,CAAC,eAAe;YAAE,KAAK,CAAC,eAAe,CAAC,OAAO,GAAG,CAAC,CAAC;QAC7D,KAAK,CAAC,OAAO,CAAC,UAAU,GAAG,eAAe,EAAE,CAAC;QAC7C,YAAY,EAAE,CAAC;QACf,QAAQ,CAAC,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC;IAC/B,CAAC;IAED,SAAS,MAAM,CAAC,QAAkB;QAChC,IAAI,KAAK,CAAC,IAAI;YAAE,OAAO;QACvB,IAAI,UAAU,IAAI,MAAM,EAAE,OAAO,EAAE,CAAC;YAClC,MAAM,CAAC,GAAG,MAAM,CAAC;YACjB,OAAO,CAAC,KAAK,IAAI,EAAE;gBACjB,MAAM,UAAU,CAAC,CAAC,CAAC,OAAQ,CAAC,CAAC;gBAC7B,IAAI,KAAK,CAAC,IAAI;oBAAE,OAAO;gBACvB,QAAQ,CAAC,QAAQ,CAAC,CAAC;YACrB,CAAC,CAAC,EAAE,CAAC;QACP,CAAC;QACD,QAAQ,CAAC,QAAQ,CAAC,CAAC;IACrB,CAAC;IAED,MAAM,GAAG,GAAqB;QAC5B,IAAI,GAAG;YACL,OAAO,KAAK,CAAC,OAAO,CAAC;QACvB,CAAC;QACD,MAAM,CAAC,IAAY;YACjB,KAAK,CAAC,cAAc,GAAG,IAAI,CAAC;YAC5B,OAAO,KAAK,CAAC;QACf,CAAC;QACD,IAAI,OAAO;YACT,OAAO,KAAK,CAAC,OAAO,CAAC;QACvB,CAAC;QACD,SAAS,CAAC,IAAY,EAAE,KAAsB;YAC5C,KAAK,CAAC,OAAO,CAAC,IAAI,CAAC,WAAW,EAAE,CAAC,GAAG,KAAK,CAAC;QAC5C,CAAC;QACD,IAAI,CAAC,IAAkC;YACrC,OAAO,GAAG,CAAC,IAAI,CAAC,CAAC;QACnB,CAAC;QACD,IAAI,CAAC,IAAY;YACf,IAAI,KAAK,CAAC,IAAI;gBAAE,OAAO;YACvB,KAAK,CAAC,OAAO,CAAC,SAAS,CAAC,cAAc,EAAE,0BAA0B,CAAC,CAAC;YACpE,OAAO,GAAG,CAAC,IAAI,CAAC,CAAC;QACnB,CAAC;QACD,IAAI,CAAC,IAAa;YAChB,OAAO,QAAQ,CAAC,IAAI,CAAC,CAAC;QACxB,CAAC;QACD,IAAI,CAAC,IAAY;YACf,IAAI,KAAK,CAAC,IAAI;gBAAE,OAAO;YACvB,KAAK,CAAC,OAAO,CAAC,SAAS,CAAC,cAAc,EAAE,2BAA2B,CAAC,CAAC;YACrE,OAAO,GAAG,CAAC,IAAI,CAAC,CAAC;QACnB,CAAC;QACD,QAAQ;QACR,MAAM;QACN,IAAI,IAAI;YACN,OAAO,KAAK,CAAC,IAAI,CAAC;QACpB,CAAC;QACD,IAAI,UAAU;YACZ,OAAO,eAAe,EAAE,CAAC;QAC3B,CAAC;QACD,MAAM,CAAC,CAAiB,EAAE,CAAmB,EAAE,CAAuB;YACpE,KAAK,CAAC,OAAO,GAAG,CAAC,CAAC;YAClB,KAAK,CAAC,gBAAgB,GAAG,CAAC,CAAC;YAC3B,KAAK,CAAC,eAAe,GAAG,CAAC,CAAC;YAC1B,KAAK,CAAC,IAAI,GAAG,KAAK,CAAC;YACnB,KAAK,CAAC,cAAc,GAAG,IAAI,CAAC;YAC5B,KAAK,MAAM,CAAC,IAAI,MAAM,CAAC,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC;gBAAE,OAAO,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC;QACtE,CAAC;KACF,CAAC;IAEF,OAAO,GAAG,CAAC;AACb,CAAC;AAED,MAAM,OAAO,GAAsB,EAAE,CAAC;AACtC,MAAM,YAAY,GAAG,MAAM,CAAC,MAAM,CAAC,IAAI,CAAsC,CAAC;AAE9E,4FAA4F;AAC5F,SAAS,UAAU,CAAC,MAAc;IAChC,MAAM,GAAG,GAAG,MAAM,CAAC,MAAM,CAAC,IAAI,CAA2B,CAAC;IAC1D,IAAI,CAAC,MAAM,CAAC,MAAM;QAAE,OAAO,GAAG,CAAC;IAC/B,IAAI,KAAK,GAAG,CAAC,CAAC;IACd,OAAO,KAAK,GAAG,MAAM,CAAC,MAAM,EAAE,CAAC;QAC7B,MAAM,EAAE,GAAG,MAAM,CAAC,OAAO,CAAC,GAAG,EAAE,KAAK,CAAC,CAAC;QACtC,MAAM,GAAG,GAAG,MAAM,CAAC,OAAO,CAAC,GAAG,EAAE,KAAK,CAAC,CAAC;QACvC,MAAM,GAAG,GAAG,GAAG,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC,CAAC,GAAG,CAAC;QAC7C,MAAM,GAAG,GAAG,kBAAkB,CAAC,MAAM,CAAC,KAAK,CAAC,KAAK,EAAE,EAAE,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,OAAO,CAAC,KAAK,EAAE,GAAG,CAAC,CAAC,CAAC;QAC9F,MAAM,KAAK,GACT,EAAE,KAAK,CAAC,CAAC,IAAI,EAAE,IAAI,GAAG;YACpB,CAAC,CAAC,EAAE;YACJ,CAAC,CAAC,kBAAkB,CAAC,MAAM,CAAC,KAAK,CAAC,EAAE,GAAG,CAAC,EAAE,GAAG,CAAC,CAAC,OAAO,CAAC,KAAK,EAAE,GAAG,CAAC,CAAC,CAAC;QACxE,IAAI,GAAG,CAAC,MAAM;YAAE,GAAG,CAAC,GAAG,CAAC,GAAG,KAAK,CAAC;QACjC,KAAK,GAAG,GAAG,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC,CAAC,GAAG,GAAG,CAAC,CAAC;IAC/C,CAAC;IACD,OAAO,GAAG,CAAC;AACb,CAAC;AAED,SAAS,iBAAiB,CAAC,GAAoB;IAC7C,MAAM,GAAG,GAAG,GAAG,CAAC,GAAG,IAAI,GAAG,CAAC;IAC3B,MAAM,CAAC,GAAG,GAAG,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC;IAC3B,MAAM,MAAM,GAAG,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,GAAG,CAAC,KAAK,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC;IAChD,OAAO,UAAU,CAAC,MAAM,CAAC,CAAC;AAC5B,CAAC;AAED,SAAS,YAAY,CACnB,GAAoB,EACpB,GAAmB,EACnB,UAAyB;IAEzB,MAAM,iBAAiB,GAAsB,EAAE,CAAC;IAChD,MAAM,gBAAgB,GAAqB,EAAE,OAAO,EAAE,GAAG,EAAE,CAAC;IAC5D,MAAM,eAAe,GAAwB,EAAE,OAAO,EAAE,CAAC,EAAE,CAAC;IAC5D,MAAM,MAAM,GAAwC,EAAE,OAAO,EAAE,IAAI,EAAE,CAAC;IAEtE,MAAM,GAAG,GAAoB;QAC3B,GAAG;QACH,GAAG,EAAE,sBAAsB,CAAC,GAAG,EAAE,gBAAgB,EAAE,eAAe,EAAE,UAAU,EAAE,MAAM,CAAC;QACvF,mBAAmB,EAAE,iBAAiB;QACtC,kBAAkB,EAAE,gBAAgB;QACpC,iBAAiB,EAAE,eAAe;QAClC,MAAM,EAAE,MAAM,CAAC,MAAM,CAAC,IAAI,CAAsC;QAChE,IAAI,KAAK;YACP,IAAI,GAAG,CAAC,YAAY,KAAK,SAAS,EAAE,CAAC;gBACnC,GAAG,CAAC,YAAY,GAAG,iBAAiB,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC;YAChD,CAAC;YACD,OAAO,GAAG,CAAC,YAAY,CAAC;QAC1B,CAAC;QACD,IAAI,KAAK,CAAC,CAAyB;YACjC,GAAG,CAAC,YAAY,GAAG,CAAC,CAAC;QACvB,CAAC;QACD,IAAI,EAAE,IAAI;QACV,KAAK,EAAE,MAAM,CAAC,MAAM,CAAC,IAAI,CAA4B;QACrD,IAAI,EAAE,GAAG,EAAE,GAAE,CAAC;QACd,QAAQ,EAAE,GAAG,EAAE,GAAE,CAAC;QAClB,MAAM,EAAE,aAAa,EAAE;QACvB,GAAG,EAAE,EAAE,KAAK,EAAE,EAAE,EAAE;QAClB,KAAK,EAAE,EAAE,IAAI,OAAO,KAAK,OAAO,EAAE,CAAC,CAAC,CAAC,EAAE;QACvC,QAAQ,EAAE,MAAM;KACjB,CAAC;IACF,MAAM,CAAC,OAAO,GAAG,GAAG,CAAC;IACrB,OAAO,GAAG,CAAC;AACb,CAAC;AAED,SAAS,aAAa,CACpB,GAAoB,EACpB,GAAoB,EACpB,GAAmB,EACnB,UAAyB;IAEzB,MAAM,gBAAgB,GAAG,GAAG,CAAC,kBAAmB,CAAC;IACjD,MAAM,eAAe,GAAG,GAAG,CAAC,iBAAkB,CAAC;IAC/C,gBAAgB,CAAC,OAAO,GAAG,GAAG,CAAC;IAC/B,eAAe,CAAC,OAAO,GAAG,CAAC,CAAC;IAC5B,GAAG,CAAC,GAAG,GAAG,GAAG,CAAC;IACd,IAAI,GAAG,CAAC,QAAQ;QAAE,GAAG,CAAC,QAAQ,CAAC,OAAO,GAAG,GAAG,CAAC;IAC7C,IAAI,GAAG,CAAC,GAAG,CAAC,MAAM,EAAE,CAAC;QACnB,GAAG,CAAC,GAAG,CAAC,MAAM,CAAC,GAAG,EAAE,gBAAgB,EAAE,eAAe,CAAC,CAAC;IACzD,CAAC;SAAM,CAAC;QACN,MAAM,MAAM,GAAG,GAAG,CAAC,QAAQ,IAAI,EAAE,OAAO,EAAE,GAAG,EAAE,CAAC;QAChD,GAAG,CAAC,GAAG,GAAG,sBAAsB,CAAC,GAAG,EAAE,gBAAgB,EAAE,eAAe,EAAE,UAAU,EAAE,MAAM,CAAC,CAAC;IAC/F,CAAC;IACD,GAAG,CAAC,MAAM,GAAG,MAAM,CAAC,MAAM,CAAC,IAAI,CAAsC,CAAC;IACtE,GAAG,CAAC,IAAI,GAAG,IAAI,CAAC;IAChB,OAAQ,GAAkC,CAAC,YAAY,CAAC;IACxD,GAAG,CAAC,KAAK,GAAG,MAAM,CAAC,MAAM,CAAC,IAAI,CAA4B,CAAC;IAC3D,GAAG,CAAC,GAAG,CAAC,KAAK,GAAG,EAAE,CAAC;IACnB,OAAO,GAAG,CAAC;AACb,CAAC;AAED,gKAAgK;AAChK,MAAM,UAAU,UAAU,CACxB,GAAoB,EACpB,GAAmB,EACnB,OAAO,GAAG,KAAK,EACf,UAAyB;IAEzB,IAAI,CAAC,OAAO;QAAE,OAAO,YAAY,CAAC,GAAG,EAAE,GAAG,EAAE,UAAU,CAAC,CAAC;IACxD,MAAM,QAAQ,GAAG,OAAO,CAAC,GAAG,EAAE,CAAC;IAC/B,IAAI,QAAQ;QAAE,OAAO,aAAa,CAAC,QAAQ,EAAE,GAAG,EAAE,GAAG,EAAE,UAAU,CAAC,CAAC;IACnE,OAAO,YAAY,CAAC,GAAG,EAAE,GAAG,EAAE,UAAU,CAAC,CAAC;AAC5C,CAAC;AAED,mGAAmG;AACnG,MAAM,UAAU,cAAc,CAAC,GAAoB;IAChD,GAAgC,CAAC,GAAG,GAAG,IAAK,CAAC;IAC9C,GAAG,CAAC,MAAM,GAAG,YAAY,CAAC;IAC1B,GAAG,CAAC,IAAI,GAAG,IAAI,CAAC;IAChB,OAAQ,GAAkC,CAAC,YAAY,CAAC;IACxD,GAAG,CAAC,KAAK,GAAG,MAAM,CAAC,MAAM,CAAC,IAAI,CAA4B,CAAC;IAC3D,GAAG,CAAC,GAAG,CAAC,KAAK,GAAG,EAAE,CAAC;IACnB,OAAO,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;AACpB,CAAC;AAED,iHAAiH;AACjH,MAAM,CAAC,MAAM,aAAa,GAAG,UAAU,CAAC"}
|
|
@@ -0,0 +1,3 @@
|
|
|
1
|
+
export declare const lifecycleStages: readonly ["requestReceived", "createContext", "traceStart", "globalMiddleware", "routeMatch", "routeMiddleware", "handler", "emitEvents", "responseTransform", "sendResponse", "traceEnd"];
|
|
2
|
+
export type LifecycleStage = (typeof lifecycleStages)[number];
|
|
3
|
+
//# sourceMappingURL=lifecycle.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"lifecycle.d.ts","sourceRoot":"","sources":["../../../src/core/lifecycle.ts"],"names":[],"mappings":"AAAA,eAAO,MAAM,eAAe,4LAYlB,CAAC;AAEX,MAAM,MAAM,cAAc,GAAG,CAAC,OAAO,eAAe,CAAC,CAAC,MAAM,CAAC,CAAC"}
|
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
export const lifecycleStages = [
|
|
2
|
+
"requestReceived",
|
|
3
|
+
"createContext",
|
|
4
|
+
"traceStart",
|
|
5
|
+
"globalMiddleware",
|
|
6
|
+
"routeMatch",
|
|
7
|
+
"routeMiddleware",
|
|
8
|
+
"handler",
|
|
9
|
+
"emitEvents",
|
|
10
|
+
"responseTransform",
|
|
11
|
+
"sendResponse",
|
|
12
|
+
"traceEnd"
|
|
13
|
+
];
|
|
14
|
+
//# sourceMappingURL=lifecycle.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"lifecycle.js","sourceRoot":"","sources":["../../../src/core/lifecycle.ts"],"names":[],"mappings":"AAAA,MAAM,CAAC,MAAM,eAAe,GAAG;IAC7B,iBAAiB;IACjB,eAAe;IACf,YAAY;IACZ,kBAAkB;IAClB,YAAY;IACZ,iBAAiB;IACjB,SAAS;IACT,YAAY;IACZ,mBAAmB;IACnB,cAAc;IACd,UAAU;CACF,CAAC"}
|
|
@@ -0,0 +1,28 @@
|
|
|
1
|
+
import type { IncomingMessage, ServerResponse } from "node:http";
|
|
2
|
+
import { type LegonodeContext } from "./context.js";
|
|
3
|
+
import type { EventBus } from "../events/eventBus.js";
|
|
4
|
+
import type { LegonodePlugin } from "../plugin/pluginAPI.js";
|
|
5
|
+
import type { TracerFn, TraceStartFn } from "../trace/traceEngine.js";
|
|
6
|
+
import type { ScheduleRunnerFn } from "../schedules/scheduleLoader.js";
|
|
7
|
+
export type RuntimeOptions = {
|
|
8
|
+
appDir?: string | undefined;
|
|
9
|
+
plugins?: LegonodePlugin[];
|
|
10
|
+
eventBus?: EventBus;
|
|
11
|
+
scheduleRunner?: ScheduleRunnerFn;
|
|
12
|
+
tracer?: TracerFn;
|
|
13
|
+
traceStart?: TraceStartFn;
|
|
14
|
+
/** When false, disable tracer/traceStart callbacks (default: true). Logger always has traceId for correlation. */
|
|
15
|
+
tracing?: boolean;
|
|
16
|
+
/** When true, reuse context objects from a pool (can reduce GC; enable for long-lived servers with many routes). */
|
|
17
|
+
contextPool?: boolean;
|
|
18
|
+
};
|
|
19
|
+
export declare function createRuntime(options?: RuntimeOptions): {
|
|
20
|
+
createRequestContext: (req: IncomingMessage, res: ServerResponse) => LegonodeContext;
|
|
21
|
+
events: EventBus;
|
|
22
|
+
hasPlugins: boolean;
|
|
23
|
+
contextPool: boolean;
|
|
24
|
+
tracing: boolean;
|
|
25
|
+
runHook: (hook: keyof LegonodePlugin, ...args: unknown[]) => Promise<void>;
|
|
26
|
+
};
|
|
27
|
+
export type Runtime = ReturnType<typeof createRuntime>;
|
|
28
|
+
//# sourceMappingURL=runtime.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"runtime.d.ts","sourceRoot":"","sources":["../../../src/core/runtime.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,eAAe,EAAE,cAAc,EAAE,MAAM,WAAW,CAAC;AAEjE,OAAO,EAAc,KAAK,eAAe,EAAE,MAAM,cAAc,CAAC;AAIhE,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,uBAAuB,CAAC;AAEtD,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,wBAAwB,CAAC;AAC7D,OAAO,KAAK,EAAE,QAAQ,EAAa,YAAY,EAAkB,MAAM,yBAAyB,CAAC;AACjG,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,gCAAgC,CAAC;AAEvE,MAAM,MAAM,cAAc,GAAG;IAC3B,MAAM,CAAC,EAAE,MAAM,GAAG,SAAS,CAAC;IAC5B,OAAO,CAAC,EAAE,cAAc,EAAE,CAAC;IAC3B,QAAQ,CAAC,EAAE,QAAQ,CAAC;IACpB,cAAc,CAAC,EAAE,gBAAgB,CAAC;IAClC,MAAM,CAAC,EAAE,QAAQ,CAAC;IAClB,UAAU,CAAC,EAAE,YAAY,CAAC;IAC1B,kHAAkH;IAClH,OAAO,CAAC,EAAE,OAAO,CAAC;IAClB,oHAAoH;IACpH,WAAW,CAAC,EAAE,OAAO,CAAC;CACvB,CAAC;AAEF,wBAAgB,aAAa,CAAC,OAAO,GAAE,cAAmB;gCAcrB,eAAe,OAAO,cAAc;;;;;;EAwFxE;AAED,MAAM,MAAM,OAAO,GAAG,UAAU,CAAC,OAAO,aAAa,CAAC,CAAC"}
|
|
@@ -0,0 +1,104 @@
|
|
|
1
|
+
import { getContext } from "./context.js";
|
|
2
|
+
import { createTraceSpan } from "../trace/traceEngine.js";
|
|
3
|
+
import { createRequestLogger } from "../logger/requestLogger.js";
|
|
4
|
+
import { createEventBus } from "../events/eventBus.js";
|
|
5
|
+
import { createPluginManager } from "../plugin/pluginManager.js";
|
|
6
|
+
export function createRuntime(options = {}) {
|
|
7
|
+
const events = options.eventBus ?? createEventBus();
|
|
8
|
+
const scheduleRunner = options.scheduleRunner ?? (() => { });
|
|
9
|
+
const plugins = options.plugins ?? [];
|
|
10
|
+
const pluginManager = createPluginManager(plugins);
|
|
11
|
+
const useTracing = options.tracing !== false &&
|
|
12
|
+
process.env.LEGONODE_SKIP_TRACING !== "1" &&
|
|
13
|
+
process.env.LEGONODE_SKIP_TRACING !== "true";
|
|
14
|
+
const tracer = useTracing ? options.tracer : undefined;
|
|
15
|
+
const traceStart = useTracing ? options.traceStart : undefined;
|
|
16
|
+
const hasPlugins = plugins.length > 0;
|
|
17
|
+
const contextPool = options.contextPool === true;
|
|
18
|
+
function createRequestContext(req, res) {
|
|
19
|
+
const beforeSend = hasPlugins
|
|
20
|
+
? (ctx) => pluginManager.runHook("beforeResponse", ctx)
|
|
21
|
+
: undefined;
|
|
22
|
+
const ctx = getContext(req, res, contextPool, beforeSend);
|
|
23
|
+
const requestTraceStart = traceStart
|
|
24
|
+
? (data) => {
|
|
25
|
+
traceStart(data);
|
|
26
|
+
ctx.log.state.push({
|
|
27
|
+
level: "info",
|
|
28
|
+
args: [{ method: data.method, pathname: data.pathname }, "request started"],
|
|
29
|
+
timestamp: data.startTime
|
|
30
|
+
});
|
|
31
|
+
}
|
|
32
|
+
: undefined;
|
|
33
|
+
const requestTracer = tracer
|
|
34
|
+
? (data) => {
|
|
35
|
+
tracer(data);
|
|
36
|
+
ctx.log.state.push({
|
|
37
|
+
level: "info",
|
|
38
|
+
args: [
|
|
39
|
+
{
|
|
40
|
+
method: data.method,
|
|
41
|
+
pathname: data.pathname,
|
|
42
|
+
...(data.statusCode != null && { statusCode: data.statusCode }),
|
|
43
|
+
durationMs: data.durationMs,
|
|
44
|
+
...(data.routeId != null && { routeId: data.routeId }),
|
|
45
|
+
...(data.responseSize != null && { responseSize: data.responseSize }),
|
|
46
|
+
...(data.error != null && { error: data.error })
|
|
47
|
+
},
|
|
48
|
+
"request completed"
|
|
49
|
+
],
|
|
50
|
+
timestamp: data.endTime
|
|
51
|
+
});
|
|
52
|
+
}
|
|
53
|
+
: undefined;
|
|
54
|
+
const span = createTraceSpan(requestTracer, requestTraceStart);
|
|
55
|
+
ctx.log.state = [];
|
|
56
|
+
ctx.logger = createRequestLogger(span.traceId, undefined, ctx.log.state);
|
|
57
|
+
ctx.trace = { get traceId() { return span.traceId; } };
|
|
58
|
+
ctx.__traceSpan = span;
|
|
59
|
+
ctx.emit = (name, payload) => {
|
|
60
|
+
if (hasPlugins) {
|
|
61
|
+
void pluginManager.runHook("onEventEmit", ctx, { name, payload });
|
|
62
|
+
}
|
|
63
|
+
events.emit(name, payload, {
|
|
64
|
+
traceId: span.traceId,
|
|
65
|
+
logger: ctx.logger,
|
|
66
|
+
eventName: name
|
|
67
|
+
});
|
|
68
|
+
};
|
|
69
|
+
ctx.schedule = (name, payload) => {
|
|
70
|
+
if (hasPlugins) {
|
|
71
|
+
void pluginManager.runHook("onCronRun", ctx, {
|
|
72
|
+
name,
|
|
73
|
+
payload,
|
|
74
|
+
source: "manual"
|
|
75
|
+
});
|
|
76
|
+
}
|
|
77
|
+
const result = scheduleRunner(name, payload);
|
|
78
|
+
if (result && typeof result.then === "function") {
|
|
79
|
+
return result.catch((error) => {
|
|
80
|
+
if (hasPlugins) {
|
|
81
|
+
void pluginManager.runHook("onCronError", ctx, {
|
|
82
|
+
name,
|
|
83
|
+
payload,
|
|
84
|
+
source: "manual",
|
|
85
|
+
error
|
|
86
|
+
});
|
|
87
|
+
}
|
|
88
|
+
throw error;
|
|
89
|
+
});
|
|
90
|
+
}
|
|
91
|
+
return result;
|
|
92
|
+
};
|
|
93
|
+
return ctx;
|
|
94
|
+
}
|
|
95
|
+
return {
|
|
96
|
+
createRequestContext,
|
|
97
|
+
events,
|
|
98
|
+
hasPlugins,
|
|
99
|
+
contextPool,
|
|
100
|
+
tracing: useTracing,
|
|
101
|
+
runHook: pluginManager.runHook.bind(pluginManager)
|
|
102
|
+
};
|
|
103
|
+
}
|
|
104
|
+
//# sourceMappingURL=runtime.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"runtime.js","sourceRoot":"","sources":["../../../src/core/runtime.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,5 @@
|
|
|
1
|
+
import type { IncomingMessage } from "node:http";
|
|
2
|
+
import type { CorsConfig } from "../config/loadConfig.js";
|
|
3
|
+
export declare function shouldRejectCorsRequest(cors: CorsConfig | boolean, req: IncomingMessage): boolean;
|
|
4
|
+
export declare function getCorsHeaders(cors: CorsConfig | boolean, req: IncomingMessage): Record<string, string>;
|
|
5
|
+
//# sourceMappingURL=cors.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"cors.d.ts","sourceRoot":"","sources":["../../../src/cors/cors.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,WAAW,CAAC;AACjD,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,yBAAyB,CAAC;AAqD1D,wBAAgB,uBAAuB,CAAC,IAAI,EAAE,UAAU,GAAG,OAAO,EAAE,GAAG,EAAE,eAAe,GAAG,OAAO,CAKjG;AAED,wBAAgB,cAAc,CAC5B,IAAI,EAAE,UAAU,GAAG,OAAO,EAC1B,GAAG,EAAE,eAAe,GACnB,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAsBxB"}
|
|
@@ -0,0 +1,75 @@
|
|
|
1
|
+
const DEFAULT_METHODS = ["GET", "HEAD", "PUT", "POST", "DELETE", "PATCH", "OPTIONS"];
|
|
2
|
+
const DEFAULT_HEADERS = ["content-type", "authorization", "accept"];
|
|
3
|
+
function getRequestOrigin(req) {
|
|
4
|
+
const raw = req.headers.origin;
|
|
5
|
+
if (typeof raw === "string")
|
|
6
|
+
return raw;
|
|
7
|
+
if (Array.isArray(raw))
|
|
8
|
+
return raw[0] ?? null;
|
|
9
|
+
return null;
|
|
10
|
+
}
|
|
11
|
+
function isOriginAllowed(config, req) {
|
|
12
|
+
const origin = getRequestOrigin(req);
|
|
13
|
+
const cfg = config.origin || [];
|
|
14
|
+
if (!origin) {
|
|
15
|
+
// Non-browser or same-origin requests usually don't send Origin.
|
|
16
|
+
return true;
|
|
17
|
+
}
|
|
18
|
+
if (cfg === undefined || cfg === true) {
|
|
19
|
+
return true;
|
|
20
|
+
}
|
|
21
|
+
if (typeof cfg === "string") {
|
|
22
|
+
return cfg === origin;
|
|
23
|
+
}
|
|
24
|
+
if (Array.isArray(cfg)) {
|
|
25
|
+
return cfg.includes(origin);
|
|
26
|
+
}
|
|
27
|
+
return false;
|
|
28
|
+
}
|
|
29
|
+
function resolveOrigin(config, req) {
|
|
30
|
+
const origin = getRequestOrigin(req);
|
|
31
|
+
if (!isOriginAllowed(config, req))
|
|
32
|
+
return null;
|
|
33
|
+
const cfg = config.origin;
|
|
34
|
+
if (cfg === undefined || cfg === true) {
|
|
35
|
+
return origin;
|
|
36
|
+
}
|
|
37
|
+
if (cfg === false) {
|
|
38
|
+
return null;
|
|
39
|
+
}
|
|
40
|
+
if (typeof cfg === "string") {
|
|
41
|
+
return cfg;
|
|
42
|
+
}
|
|
43
|
+
if (Array.isArray(cfg)) {
|
|
44
|
+
// Allowed when list contains request origin.
|
|
45
|
+
return origin;
|
|
46
|
+
}
|
|
47
|
+
return null;
|
|
48
|
+
}
|
|
49
|
+
export function shouldRejectCorsRequest(cors, req) {
|
|
50
|
+
const config = typeof cors === "boolean" ? {} : cors;
|
|
51
|
+
const origin = getRequestOrigin(req);
|
|
52
|
+
if (!origin)
|
|
53
|
+
return false;
|
|
54
|
+
return !isOriginAllowed(config, req);
|
|
55
|
+
}
|
|
56
|
+
export function getCorsHeaders(cors, req) {
|
|
57
|
+
const config = typeof cors === "boolean" ? {} : cors;
|
|
58
|
+
const allowOrigin = resolveOrigin(config, req);
|
|
59
|
+
if (!allowOrigin)
|
|
60
|
+
return {};
|
|
61
|
+
const headers = {
|
|
62
|
+
"Access-Control-Allow-Origin": allowOrigin
|
|
63
|
+
};
|
|
64
|
+
const methods = config.methods ?? DEFAULT_METHODS;
|
|
65
|
+
headers["Access-Control-Allow-Methods"] = Array.isArray(methods) ? methods.join(", ") : methods;
|
|
66
|
+
const allowedHeaders = config.allowedHeaders ?? DEFAULT_HEADERS;
|
|
67
|
+
headers["Access-Control-Allow-Headers"] = Array.isArray(allowedHeaders)
|
|
68
|
+
? allowedHeaders.join(", ")
|
|
69
|
+
: allowedHeaders;
|
|
70
|
+
if (config.credentials === true) {
|
|
71
|
+
headers["Access-Control-Allow-Credentials"] = "true";
|
|
72
|
+
}
|
|
73
|
+
return headers;
|
|
74
|
+
}
|
|
75
|
+
//# sourceMappingURL=cors.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"cors.js","sourceRoot":"","sources":["../../../src/cors/cors.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,19 @@
|
|
|
1
|
+
import type { LegonodeLogger } from "../logger/requestLogger.js";
|
|
2
|
+
export type EventEmitterFn = (name: string, payload?: unknown) => void;
|
|
3
|
+
/** Context passed to event handlers for tracing and logging. Ties event execution to the request that emitted it. */
|
|
4
|
+
export type EventContext = {
|
|
5
|
+
/** Trace id of the request that emitted the event (empty when emitted outside a request, e.g. cron). */
|
|
6
|
+
traceId: string;
|
|
7
|
+
/** Logger with traceId in bindings so logs from the handler correlate with the API call. */
|
|
8
|
+
logger: LegonodeLogger;
|
|
9
|
+
/** Event name (e.g. "user.created"). */
|
|
10
|
+
eventName: string;
|
|
11
|
+
};
|
|
12
|
+
export type EventHandler = (payload: unknown, ctx: EventContext) => void | Promise<void>;
|
|
13
|
+
export type EventBus = {
|
|
14
|
+
on: (name: string, handler: EventHandler) => void;
|
|
15
|
+
/** Emit with optional event context (set by framework when called from request ctx.emit). */
|
|
16
|
+
emit: (name: string, payload?: unknown, eventCtx?: EventContext) => void;
|
|
17
|
+
};
|
|
18
|
+
export declare function createEventBus(): EventBus;
|
|
19
|
+
//# sourceMappingURL=eventBus.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"eventBus.d.ts","sourceRoot":"","sources":["../../../src/events/eventBus.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,4BAA4B,CAAC;AAGjE,MAAM,MAAM,cAAc,GAAG,CAAC,IAAI,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE,OAAO,KAAK,IAAI,CAAC;AAEvE,qHAAqH;AACrH,MAAM,MAAM,YAAY,GAAG;IACzB,wGAAwG;IACxG,OAAO,EAAE,MAAM,CAAC;IAChB,4FAA4F;IAC5F,MAAM,EAAE,cAAc,CAAC;IACvB,wCAAwC;IACxC,SAAS,EAAE,MAAM,CAAC;CACnB,CAAC;AAEF,MAAM,MAAM,YAAY,GAAG,CAAC,OAAO,EAAE,OAAO,EAAE,GAAG,EAAE,YAAY,KAAK,IAAI,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;AAEzF,MAAM,MAAM,QAAQ,GAAG;IACrB,EAAE,EAAE,CAAC,IAAI,EAAE,MAAM,EAAE,OAAO,EAAE,YAAY,KAAK,IAAI,CAAC;IAClD,6FAA6F;IAC7F,IAAI,EAAE,CAAC,IAAI,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE,OAAO,EAAE,QAAQ,CAAC,EAAE,YAAY,KAAK,IAAI,CAAC;CAC1E,CAAC;AAUF,wBAAgB,cAAc,IAAI,QAAQ,CAmBzC"}
|
|
@@ -0,0 +1,29 @@
|
|
|
1
|
+
import { getBaseLogger } from "../logger/requestLogger.js";
|
|
2
|
+
function defaultEventContext(eventName) {
|
|
3
|
+
return {
|
|
4
|
+
traceId: "",
|
|
5
|
+
logger: getBaseLogger().child({ eventName }),
|
|
6
|
+
eventName
|
|
7
|
+
};
|
|
8
|
+
}
|
|
9
|
+
export function createEventBus() {
|
|
10
|
+
const handlers = new Map();
|
|
11
|
+
return {
|
|
12
|
+
on: (name, handler) => {
|
|
13
|
+
const list = handlers.get(name) ?? [];
|
|
14
|
+
list.push(handler);
|
|
15
|
+
handlers.set(name, list);
|
|
16
|
+
},
|
|
17
|
+
emit: (name, payload, eventCtx) => {
|
|
18
|
+
const list = handlers.get(name) ?? [];
|
|
19
|
+
if (list.length === 0) {
|
|
20
|
+
console.warn(`[Event] event not found: "${name}"`);
|
|
21
|
+
return;
|
|
22
|
+
}
|
|
23
|
+
const ctx = eventCtx ?? defaultEventContext(name);
|
|
24
|
+
for (const handler of list)
|
|
25
|
+
void handler(payload, ctx);
|
|
26
|
+
}
|
|
27
|
+
};
|
|
28
|
+
}
|
|
29
|
+
//# sourceMappingURL=eventBus.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"eventBus.js","sourceRoot":"","sources":["../../../src/events/eventBus.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,aAAa,EAAE,MAAM,4BAA4B,CAAC;AAsB3D,SAAS,mBAAmB,CAAC,SAAiB;IAC5C,OAAO;QACL,OAAO,EAAE,EAAE;QACX,MAAM,EAAE,aAAa,EAAE,CAAC,KAAK,CAAC,EAAE,SAAS,EAAE,CAAC;QAC5C,SAAS;KACV,CAAC;AACJ,CAAC;AAED,MAAM,UAAU,cAAc;IAC5B,MAAM,QAAQ,GAAG,IAAI,GAAG,EAA0B,CAAC;IAEnD,OAAO;QACL,EAAE,EAAE,CAAC,IAAI,EAAE,OAAO,EAAE,EAAE;YACpB,MAAM,IAAI,GAAG,QAAQ,CAAC,GAAG,CAAC,IAAI,CAAC,IAAI,EAAE,CAAC;YACtC,IAAI,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC;YACnB,QAAQ,CAAC,GAAG,CAAC,IAAI,EAAE,IAAI,CAAC,CAAC;QAC3B,CAAC;QACD,IAAI,EAAE,CAAC,IAAI,EAAE,OAAO,EAAE,QAAQ,EAAE,EAAE;YAChC,MAAM,IAAI,GAAG,QAAQ,CAAC,GAAG,CAAC,IAAI,CAAC,IAAI,EAAE,CAAC;YACtC,IAAI,IAAI,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;gBACtB,OAAO,CAAC,IAAI,CAAC,6BAA6B,IAAI,GAAG,CAAC,CAAC;gBACnD,OAAO;YACT,CAAC;YACD,MAAM,GAAG,GAAG,QAAQ,IAAI,mBAAmB,CAAC,IAAI,CAAC,CAAC;YAClD,KAAK,MAAM,OAAO,IAAI,IAAI;gBAAE,KAAK,OAAO,CAAC,OAAO,EAAE,GAAG,CAAC,CAAC;QACzD,CAAC;KACF,CAAC;AACJ,CAAC"}
|
|
@@ -0,0 +1,5 @@
|
|
|
1
|
+
import type { EventBus } from "./eventBus.js";
|
|
2
|
+
export declare function getOrCreateEventBus(appDir: string): Promise<EventBus>;
|
|
3
|
+
export declare function clearEventBusCache(appDir?: string): void;
|
|
4
|
+
export declare function registerEventHandlersFromApp(bus: EventBus, appDir: string): Promise<void>;
|
|
5
|
+
//# sourceMappingURL=eventExecutor.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"eventExecutor.d.ts","sourceRoot":"","sources":["../../../src/events/eventExecutor.ts"],"names":[],"mappings":"AAKA,OAAO,KAAK,EAAE,QAAQ,EAAgB,MAAM,eAAe,CAAC;AAI5D,wBAAsB,mBAAmB,CAAC,MAAM,EAAE,MAAM,GAAG,OAAO,CAAC,QAAQ,CAAC,CAQ3E;AAED,wBAAgB,kBAAkB,CAAC,MAAM,CAAC,EAAE,MAAM,GAAG,IAAI,CAGxD;AAuBD,wBAAsB,4BAA4B,CAAC,GAAG,EAAE,QAAQ,EAAE,MAAM,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAkC/F"}
|