@loutrejs/loutre 0.7.0 → 0.8.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.
Files changed (48) hide show
  1. package/dist/adapters/bun.d.ts +2 -4
  2. package/dist/adapters/bun.js +36 -28
  3. package/dist/adapters/cloudflare-workers.d.ts +2 -4
  4. package/dist/adapters/cloudflare-workers.js +6 -11
  5. package/dist/adapters/server-transports.d.ts +4 -0
  6. package/dist/adapters/server-transports.js +18 -0
  7. package/dist/adapters/websocket-native.d.ts +24 -0
  8. package/dist/adapters/websocket-native.js +150 -0
  9. package/dist/core/extension.d.ts +13 -1
  10. package/dist/core/extension.js +19 -0
  11. package/dist/core/index.d.ts +1 -1
  12. package/dist/core/model/modules.js +13 -17
  13. package/dist/core/model.js +14 -4
  14. package/dist/core/module.d.ts +3 -3
  15. package/dist/devtools/capsule.js +13 -11
  16. package/dist/devtools/values.js +10 -13
  17. package/dist/generated/version.d.ts +1 -1
  18. package/dist/generated/version.js +1 -1
  19. package/dist/graph/model.js +37 -40
  20. package/dist/http/auth.d.ts +2 -2
  21. package/dist/http/auth.js +9 -0
  22. package/dist/http/client.js +5 -5
  23. package/dist/http/extension.d.ts +37 -10
  24. package/dist/http/extension.js +117 -39
  25. package/dist/http/index.d.ts +3 -2
  26. package/dist/http/index.js +1 -1
  27. package/dist/http/openapi.d.ts +3 -4
  28. package/dist/http/openapi.js +45 -26
  29. package/dist/http/request-head.d.ts +6 -0
  30. package/dist/http/request-head.js +1 -0
  31. package/dist/http/route-validation.d.ts +9 -0
  32. package/dist/http/route-validation.js +18 -0
  33. package/dist/http/runtime/response.js +10 -10
  34. package/dist/runtime/di.js +40 -39
  35. package/dist/runtime/engine.d.ts +1 -1
  36. package/dist/runtime/engine.js +1 -2
  37. package/dist/runtime/node-capabilities.d.ts +1 -1
  38. package/dist/runtime/node-capabilities.js +2 -1
  39. package/dist/tasks/extension.js +103 -114
  40. package/dist/websocket/driver.d.ts +30 -0
  41. package/dist/websocket/driver.js +96 -0
  42. package/dist/websocket/extension.d.ts +33 -12
  43. package/dist/websocket/extension.js +60 -44
  44. package/dist/websocket/index.d.ts +3 -1
  45. package/dist/websocket/index.js +1 -0
  46. package/package.json +3 -6
  47. package/dist/adapters/deno.d.ts +0 -35
  48. package/dist/adapters/deno.js +0 -231
@@ -1,231 +0,0 @@
1
- import { createKernelApplication, } from '../application/index.js';
2
- import { bindApplicationCapability } from '../application/kernel-internal.js';
3
- import { httpExecutionExtension } from '../http/index.js';
4
- import { LOUTRE_VERSION, startStartupPresentation } from '../presentation.js';
5
- import { assertRuntimeEngine } from '../runtime/engine.js';
6
- import { serverUrl } from '../runtime/server-url.js';
7
- import { canRetryOnNextPort, initialServerPort, } from '../runtime/server-port.js';
8
- export const denoRuntime = {
9
- runtime: 'deno',
10
- capabilities: new Set([
11
- 'http.server',
12
- 'http.request.streaming',
13
- 'http.response.streaming',
14
- 'stream.readable',
15
- 'stream.writable',
16
- 'runtime.longLived',
17
- 'runtime.shutdownHook',
18
- 'env.runtime',
19
- 'crypto.random',
20
- ]),
21
- bind,
22
- create,
23
- };
24
- function bind(options) {
25
- assertRuntimeEngine('deno');
26
- if (options.application.model.extensions.get(httpExecutionExtension) ===
27
- undefined) {
28
- throw new Error('LUTRE_RUNTIME_HTTP_REQUIRED: denoRuntime.bind() requires the HTTP Execution Extension.');
29
- }
30
- const application = createKernelApplication({
31
- ...options,
32
- application: options.application,
33
- capabilities: [
34
- bindApplicationCapability(options.application.model, 'http.server', {
35
- runtime: 'deno',
36
- }),
37
- ...(options.capabilities ?? []),
38
- ],
39
- environment: 'environment' in options ? options.environment : denoEnvironment(),
40
- });
41
- let initialization;
42
- return {
43
- async fetch(request) {
44
- initialization ??= application.init();
45
- await initialization;
46
- return application.http.fetch(request);
47
- },
48
- close: (signal) => application.close(signal),
49
- };
50
- }
51
- async function create(options) {
52
- assertRuntimeEngine('deno');
53
- const deno = denoGlobal();
54
- const startedAt = performance.now();
55
- const isTTY = deno?.stdout?.isTerminal?.() === true;
56
- const presentation = startStartupPresentation({ version: LOUTRE_VERSION }, {
57
- terminal: {
58
- isTTY,
59
- color: isTTY && deno?.env?.get?.('NO_COLOR') === undefined,
60
- },
61
- write: (value) => console.log(value),
62
- });
63
- if (options.application.model.extensions.get(httpExecutionExtension) ===
64
- undefined) {
65
- throw new Error('LUTRE_RUNTIME_HTTP_REQUIRED: denoRuntime.create() requires the HTTP Execution Extension.');
66
- }
67
- const hosted = createKernelApplication({
68
- ...options,
69
- application: options.application,
70
- capabilities: [
71
- bindApplicationCapability(options.application.model, 'http.server', {
72
- runtime: 'deno',
73
- }),
74
- ...(options.capabilities ?? []),
75
- ],
76
- environment: 'environment' in options ? options.environment : denoEnvironment(),
77
- });
78
- await hosted.init();
79
- const application = hosted;
80
- const http = hosted
81
- .http;
82
- const closeApplication = application.close.bind(application);
83
- let server;
84
- let removeShutdownHooks;
85
- let serving = false;
86
- let closed = false;
87
- let closingPromise;
88
- let serverClosingPromise;
89
- const beginServerClose = () => {
90
- if (serverClosingPromise)
91
- return serverClosingPromise;
92
- if (!server)
93
- return Promise.resolve();
94
- const closingServer = server;
95
- serverClosingPromise = Promise.resolve()
96
- .then(() => closingServer.shutdown())
97
- .then(() => {
98
- if (server === closingServer)
99
- server = undefined;
100
- }, (error) => {
101
- serverClosingPromise = undefined;
102
- throw error;
103
- });
104
- void serverClosingPromise.catch(() => undefined);
105
- return serverClosingPromise;
106
- };
107
- const close = (signal) => {
108
- if (closed)
109
- return Promise.resolve();
110
- if (closingPromise)
111
- return closingPromise;
112
- closingPromise = (async () => {
113
- removeShutdownHooks?.();
114
- removeShutdownHooks = undefined;
115
- const errors = [];
116
- const serverClosing = beginServerClose();
117
- try {
118
- await closeApplication(signal);
119
- }
120
- catch (error) {
121
- errors.push(error);
122
- }
123
- if (errors.length === 0) {
124
- try {
125
- await serverClosing;
126
- }
127
- catch (error) {
128
- errors.push(error);
129
- }
130
- }
131
- if (errors.length > 0) {
132
- throw new AggregateError(errors, 'Deno runtime shutdown failed');
133
- }
134
- closed = true;
135
- })().catch((error) => {
136
- closingPromise = undefined;
137
- throw error;
138
- });
139
- return closingPromise;
140
- };
141
- const serve = async (serveOptions = {}) => {
142
- if (closed) {
143
- throw new Error('LUTRE_APP_STOPPED: Application is stopped.');
144
- }
145
- if (serving) {
146
- throw new Error('LUTRE_RUNTIME_ALREADY_SERVING: Deno runtime Application is already serving.');
147
- }
148
- if (!deno?.serve) {
149
- await close().catch(() => undefined);
150
- throw new Error('LUTRE_DENO_UNAVAILABLE: Deno.serve() is not available.');
151
- }
152
- serving = true;
153
- try {
154
- const requestedPort = serveOptions.port;
155
- let port = initialServerPort(requestedPort);
156
- while (true) {
157
- try {
158
- server = deno.serve({
159
- port,
160
- ...(serveOptions.hostname === undefined
161
- ? {}
162
- : { hostname: serveOptions.hostname }),
163
- onListen: () => undefined,
164
- }, createDenoFetchDriver(http));
165
- break;
166
- }
167
- catch (error) {
168
- if (requestedPort !== undefined || !canRetryOnNextPort(error, port)) {
169
- throw error;
170
- }
171
- port += 1;
172
- }
173
- }
174
- presentation.ready({
175
- server: serverUrl(serveOptions.hostname, port),
176
- runtime: `Deno ${deno.version?.deno ?? 'unknown'}`,
177
- environment: deno.env?.get?.('DENO_ENV') ??
178
- deno.env?.get?.('NODE_ENV') ??
179
- 'development',
180
- startupDurationMs: performance.now() - startedAt,
181
- });
182
- removeShutdownHooks =
183
- serveOptions.shutdownHooks === false
184
- ? undefined
185
- : registerDenoShutdownHooks(deno, close);
186
- return { port };
187
- }
188
- catch (error) {
189
- await close().catch(() => undefined);
190
- throw error;
191
- }
192
- };
193
- Object.assign(application, { serve, close });
194
- return application;
195
- }
196
- function registerDenoShutdownHooks(deno, close) {
197
- if (!deno.addSignalListener || !deno.removeSignalListener) {
198
- return undefined;
199
- }
200
- const handlers = new Map();
201
- const remove = () => {
202
- for (const [signal, handler] of handlers) {
203
- deno.removeSignalListener?.(signal, handler);
204
- }
205
- handlers.clear();
206
- };
207
- for (const signal of ['SIGINT', 'SIGTERM']) {
208
- const handler = () => {
209
- remove();
210
- void close(signal);
211
- };
212
- handlers.set(signal, handler);
213
- deno.addSignalListener(signal, handler);
214
- }
215
- return remove;
216
- }
217
- function createDenoFetchDriver(application) {
218
- let initialization;
219
- return async (request) => {
220
- initialization ??= application.initialize?.() ?? Promise.resolve();
221
- await initialization;
222
- return application.fetch(request);
223
- };
224
- }
225
- function denoEnvironment() {
226
- const deno = denoGlobal();
227
- return deno?.env?.toObject ? deno.env.toObject() : undefined;
228
- }
229
- function denoGlobal() {
230
- return globalThis.Deno;
231
- }