@loutrejs/loutre 0.4.1 → 0.6.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (164) hide show
  1. package/README.md +63 -32
  2. package/dist/adapters/aws-lambda.d.ts +5 -3
  3. package/dist/adapters/aws-lambda.js +53 -23
  4. package/dist/adapters/bun.d.ts +7 -4
  5. package/dist/adapters/bun.js +52 -42
  6. package/dist/adapters/cloudflare-workers.d.ts +5 -3
  7. package/dist/adapters/cloudflare-workers.js +23 -28
  8. package/dist/adapters/deno.d.ts +7 -4
  9. package/dist/adapters/deno.js +94 -57
  10. package/dist/adapters/electron.d.ts +13 -5
  11. package/dist/adapters/electron.js +76 -28
  12. package/dist/application/definition.d.ts +31 -0
  13. package/dist/application/definition.js +16 -0
  14. package/dist/application/index.d.ts +4 -63
  15. package/dist/application/index.js +2 -11
  16. package/dist/application/kernel-internal.d.ts +2 -0
  17. package/dist/application/kernel-internal.js +10 -0
  18. package/dist/application/kernel.d.ts +21 -0
  19. package/dist/application/kernel.js +65 -0
  20. package/dist/core/diagnostic.d.ts +9 -0
  21. package/dist/core/diagnostic.js +9 -0
  22. package/dist/core/extension.d.ts +107 -0
  23. package/dist/core/extension.js +73 -0
  24. package/dist/core/generic-layer.d.ts +26 -0
  25. package/dist/core/generic-layer.js +116 -0
  26. package/dist/core/index.d.ts +31 -15
  27. package/dist/core/index.js +15 -15
  28. package/dist/core/injection.d.ts +4 -13
  29. package/dist/core/injection.js +63 -0
  30. package/dist/core/model/context.d.ts +18 -0
  31. package/dist/core/model/context.js +34 -0
  32. package/dist/core/model/lifecycle.d.ts +5 -0
  33. package/dist/core/model/lifecycle.js +44 -0
  34. package/dist/core/model/modules.d.ts +2 -0
  35. package/dist/core/model/modules.js +101 -0
  36. package/dist/core/model/providers.d.ts +4 -0
  37. package/dist/core/model/providers.js +74 -0
  38. package/dist/core/model/snapshot.d.ts +6 -0
  39. package/dist/core/model/snapshot.js +31 -0
  40. package/dist/core/model/types.d.ts +78 -0
  41. package/dist/core/model/validation.d.ts +4 -0
  42. package/dist/core/model/validation.js +40 -0
  43. package/dist/core/model/visibility.d.ts +4 -0
  44. package/dist/core/model/visibility.js +20 -0
  45. package/dist/core/model.d.ts +10 -0
  46. package/dist/core/model.js +346 -0
  47. package/dist/core/module.d.ts +8 -13
  48. package/dist/core/source-location.d.ts +8 -0
  49. package/dist/core/source-location.js +31 -0
  50. package/dist/core/token-internal.d.ts +3 -0
  51. package/dist/core/token-internal.js +4 -0
  52. package/dist/core/type.d.ts +7 -0
  53. package/dist/core/type.js +4 -0
  54. package/dist/generated/version.d.ts +1 -1
  55. package/dist/generated/version.js +1 -1
  56. package/dist/graph/index.d.ts +2 -3
  57. package/dist/graph/index.js +1 -3
  58. package/dist/graph/model.d.ts +34 -0
  59. package/dist/graph/model.js +127 -0
  60. package/dist/http/auth.d.ts +46 -0
  61. package/dist/http/auth.js +96 -0
  62. package/dist/http/client.d.ts +28 -31
  63. package/dist/http/client.js +60 -41
  64. package/dist/http/cors-internal.d.ts +29 -0
  65. package/dist/http/cors-internal.js +160 -0
  66. package/dist/http/cors.d.ts +5 -8
  67. package/dist/http/cors.js +7 -165
  68. package/dist/http/extension.d.ts +348 -0
  69. package/dist/http/extension.js +947 -0
  70. package/dist/http/index.d.ts +9 -7
  71. package/dist/http/index.js +5 -7
  72. package/dist/{application → http}/openapi.d.ts +12 -3
  73. package/dist/{application → http}/openapi.js +164 -101
  74. package/dist/http/path.d.ts +2 -39
  75. package/dist/http/path.js +7 -2
  76. package/dist/http/runtime/request.d.ts +17 -0
  77. package/dist/http/runtime/request.js +109 -0
  78. package/dist/http/runtime/response.d.ts +18 -0
  79. package/dist/http/runtime/response.js +108 -0
  80. package/dist/index.d.ts +4 -0
  81. package/dist/index.js +2 -0
  82. package/dist/message-port/extension.d.ts +66 -0
  83. package/dist/message-port/extension.js +395 -0
  84. package/dist/message-port/index.d.ts +4 -73
  85. package/dist/message-port/index.js +2 -189
  86. package/dist/message-port/transport.d.ts +11 -0
  87. package/dist/message-port/transport.js +45 -0
  88. package/dist/runtime/async-iterator-lifecycle.d.ts +12 -0
  89. package/dist/runtime/async-iterator-lifecycle.js +95 -0
  90. package/dist/runtime/capability.d.ts +11 -11
  91. package/dist/runtime/capability.js +3 -3
  92. package/dist/runtime/di.d.ts +2 -22
  93. package/dist/runtime/di.js +8 -285
  94. package/dist/runtime/execution-tracker.d.ts +8 -0
  95. package/dist/runtime/execution-tracker.js +54 -0
  96. package/dist/runtime/index.d.ts +15 -9
  97. package/dist/runtime/index.js +9 -9
  98. package/dist/runtime/ingress-gate.d.ts +7 -0
  99. package/dist/runtime/ingress-gate.js +33 -0
  100. package/dist/runtime/kernel.d.ts +23 -0
  101. package/dist/runtime/kernel.js +354 -0
  102. package/dist/runtime/logger.d.ts +2 -0
  103. package/dist/runtime/logger.js +2 -0
  104. package/dist/runtime/node-capabilities.d.ts +1 -1
  105. package/dist/runtime/node-capabilities.js +1 -1
  106. package/dist/runtime/server-port.d.ts +2 -0
  107. package/dist/runtime/server-port.js +11 -0
  108. package/dist/tasks/extension.d.ts +144 -0
  109. package/dist/tasks/extension.js +499 -0
  110. package/dist/tasks/index.d.ts +2 -0
  111. package/dist/tasks/index.js +1 -0
  112. package/dist/tasks/runtime/cron.d.ts +6 -0
  113. package/dist/tasks/runtime/cron.js +89 -0
  114. package/dist/websocket/errors.d.ts +9 -0
  115. package/dist/websocket/errors.js +18 -0
  116. package/dist/websocket/extension.d.ts +154 -0
  117. package/dist/websocket/extension.js +524 -0
  118. package/dist/websocket/index.d.ts +3 -0
  119. package/dist/websocket/index.js +2 -0
  120. package/package.json +12 -16
  121. package/dist/application/binding.d.ts +0 -33
  122. package/dist/application/binding.js +0 -295
  123. package/dist/application/host.d.ts +0 -8
  124. package/dist/application/host.js +0 -14
  125. package/dist/application/queue.d.ts +0 -3
  126. package/dist/application/queue.js +0 -4
  127. package/dist/application/scheduler.d.ts +0 -2
  128. package/dist/application/scheduler.js +0 -45
  129. package/dist/core/context-key.d.ts +0 -14
  130. package/dist/core/context-key.js +0 -14
  131. package/dist/core/contract.d.ts +0 -94
  132. package/dist/core/contract.js +0 -79
  133. package/dist/core/execution.d.ts +0 -78
  134. package/dist/core/execution.js +0 -61
  135. package/dist/core/implementation.d.ts +0 -34
  136. package/dist/core/implementation.js +0 -30
  137. package/dist/core/layer.d.ts +0 -109
  138. package/dist/core/layer.js +0 -52
  139. package/dist/graph/compiler.d.ts +0 -4
  140. package/dist/graph/compiler.js +0 -228
  141. package/dist/graph/graph.d.ts +0 -17
  142. package/dist/graph/graph.js +0 -1103
  143. package/dist/graph/ir.d.ts +0 -175
  144. package/dist/http/application.d.ts +0 -18
  145. package/dist/http/application.js +0 -506
  146. package/dist/http/basic-auth.d.ts +0 -37
  147. package/dist/http/basic-auth.js +0 -67
  148. package/dist/http/definitions.d.ts +0 -225
  149. package/dist/http/definitions.js +0 -69
  150. package/dist/http/hosted-protocol.d.ts +0 -4
  151. package/dist/http/hosted-protocol.js +0 -4
  152. package/dist/http/params.d.ts +0 -2
  153. package/dist/http/params.js +0 -19
  154. package/dist/http/request-body.d.ts +0 -4
  155. package/dist/http/request-body.js +0 -6
  156. package/dist/http/validate.d.ts +0 -20
  157. package/dist/http/validate.js +0 -6
  158. package/dist/message-port/environment.d.ts +0 -2
  159. package/dist/message-port/environment.js +0 -4
  160. package/dist/runtime/application.d.ts +0 -38
  161. package/dist/runtime/application.js +0 -339
  162. package/dist/runtime/pipeline.d.ts +0 -11
  163. package/dist/runtime/pipeline.js +0 -161
  164. /package/dist/{graph/ir.js → core/model/types.js} +0 -0
@@ -1,37 +0,0 @@
1
- import { type ContextKey, type ContextKeyValue, type LayerDescriptor } from '../core/index.js';
2
- import type { LogicalHttpResult } from './definitions.js';
3
- export interface BasicAuthCredentials {
4
- readonly username: string;
5
- readonly password: string;
6
- }
7
- export interface BasicAuthUnauthorized<TVariant extends string, TBody> {
8
- readonly variant: TVariant;
9
- readonly body: TBody;
10
- }
11
- export interface BasicAuthOptions<TPrincipal extends ContextKey, TVariant extends string, TUnauthorizedBody> {
12
- readonly realm: string;
13
- readonly principal: TPrincipal;
14
- readonly authenticate: (credentials: BasicAuthCredentials) => ContextKeyValue<TPrincipal> | null | undefined | Promise<ContextKeyValue<TPrincipal> | null | undefined>;
15
- readonly unauthorized: BasicAuthUnauthorized<TVariant, TUnauthorizedBody>;
16
- readonly name?: string;
17
- }
18
- type BasicAuthShortCircuits<TVariant extends string> = readonly [
19
- {
20
- readonly protocol: 'http';
21
- readonly variant: TVariant;
22
- readonly response: {
23
- readonly status: 401;
24
- };
25
- }
26
- ];
27
- type BasicAuthResponseHeaders = {
28
- readonly 'www-authenticate': string;
29
- };
30
- export interface BasicAuthLayerDescriptor<TPrincipal extends ContextKey, TVariant extends string, TUnauthorizedBody> extends LayerDescriptor<readonly [], readonly [TPrincipal], string extends TVariant ? unknown : LogicalHttpResult<TVariant, TUnauthorizedBody, BasicAuthResponseHeaders>, BasicAuthShortCircuits<TVariant>, string, 'authentication', readonly [], BasicAuthContext> {
31
- readonly role: 'authentication';
32
- }
33
- export interface BasicAuthContext {
34
- readonly headers: Readonly<Record<string, string | undefined>>;
35
- }
36
- export declare function basicAuth<TPrincipal extends ContextKey, const TVariant extends string, TUnauthorizedBody>(options: BasicAuthOptions<TPrincipal, TVariant, TUnauthorizedBody>): BasicAuthLayerDescriptor<TPrincipal, TVariant, TUnauthorizedBody>;
37
- export {};
@@ -1,67 +0,0 @@
1
- import { layer, shortCircuit, } from '../core/index.js';
2
- export function basicAuth(options) {
3
- const challenge = formatBasicChallenge(options.realm);
4
- const descriptor = layer({
5
- name: options.name ?? 'basicAuth',
6
- role: 'authentication',
7
- provides: [options.principal],
8
- shortCircuits: [
9
- {
10
- protocol: 'http',
11
- variant: options.unauthorized.variant,
12
- response: { status: 401 },
13
- },
14
- ],
15
- factory: () => async (ctx, next) => {
16
- const credentials = decodeBasicCredentials(ctx.headers.authorization);
17
- if (!credentials) {
18
- return unauthorizedResult(options.unauthorized, challenge);
19
- }
20
- const principal = await options.authenticate(credentials);
21
- if (principal == null) {
22
- return unauthorizedResult(options.unauthorized, challenge);
23
- }
24
- await next({
25
- [options.principal.name]: principal,
26
- });
27
- },
28
- });
29
- return Object.freeze(descriptor);
30
- }
31
- function unauthorizedResult(unauthorized, challenge) {
32
- return shortCircuit({
33
- kind: 'http-result',
34
- variant: unauthorized.variant,
35
- body: unauthorized.body,
36
- headers: {
37
- 'www-authenticate': challenge,
38
- },
39
- });
40
- }
41
- function formatBasicChallenge(realm) {
42
- if (realm.length === 0 || /[\u0000-\u001f\u007f]/.test(realm)) {
43
- throw new TypeError('Basic authentication realm cannot be empty or contain control characters');
44
- }
45
- const escaped = realm.replace(/[\\"]/g, '\\$&');
46
- return `Basic realm="${escaped}", charset="UTF-8"`;
47
- }
48
- function decodeBasicCredentials(authorization) {
49
- const match = /^Basic +([A-Za-z0-9+/]+={0,2})$/i.exec(authorization ?? '');
50
- if (!match?.[1])
51
- return undefined;
52
- try {
53
- const binary = atob(match[1]);
54
- const bytes = Uint8Array.from(binary, (character) => character.charCodeAt(0));
55
- const decoded = new TextDecoder('utf-8', { fatal: true }).decode(bytes);
56
- const separator = decoded.indexOf(':');
57
- if (separator < 0)
58
- return undefined;
59
- return {
60
- username: decoded.slice(0, separator),
61
- password: decoded.slice(separator + 1),
62
- };
63
- }
64
- catch {
65
- return undefined;
66
- }
67
- }
@@ -1,225 +0,0 @@
1
- import type { ContractDefinition, ContextProvidedBeforeTerminal, HasValidationBeforeTerminal, IsValidProtocolPipeline, PipelineItem, ProtocolDescriptor, ProtocolFactory, ProtocolGroup, SchemaInput, SchemaOutput, ShortCircuitDeclarationsOf, ShortCircuitResultOf, StandardSchemaV1, TerminalLayerDescriptor, ValidationLayerDescriptor } from '../core/index.js';
2
- import type { Logger } from '../runtime/index.js';
3
- import { type HttpDispatchKey, type IsValidHttpPath, type PathParamNames, type RawPathParams } from './path.js';
4
- export type HttpParamsSchemas = Readonly<Record<string, StandardSchemaV1>>;
5
- export interface HttpRequestBodyDefinition<TSchema extends StandardSchemaV1 = StandardSchemaV1> {
6
- readonly contentType: string;
7
- readonly schema: TSchema;
8
- }
9
- export interface HttpRequestDefinition {
10
- readonly params?: HttpParamsSchemas;
11
- readonly query?: StandardSchemaV1;
12
- readonly headers?: StandardSchemaV1;
13
- readonly body?: HttpRequestBodyDefinition;
14
- }
15
- export type HttpHeaderValue = string | readonly string[];
16
- export type HttpHeaders = Readonly<Record<string, HttpHeaderValue | undefined>>;
17
- export interface HttpErrorMatcher<TError extends {
18
- readonly data: unknown;
19
- }> {
20
- is(error: unknown): error is TError;
21
- }
22
- export interface HttpErrorMapping<TError extends {
23
- readonly data: unknown;
24
- } = {
25
- readonly data: unknown;
26
- }, TResult = unknown> {
27
- readonly kind: 'http-error-mapping';
28
- readonly definition: HttpErrorMatcher<TError>;
29
- readonly map: (error: TError) => TResult | Promise<TResult>;
30
- }
31
- export interface HttpResponseDefinition {
32
- readonly status: number;
33
- readonly description?: string;
34
- readonly body: StandardSchemaV1;
35
- readonly headers?: StandardSchemaV1;
36
- readonly staticHeaders?: HttpHeaders;
37
- readonly error?: HttpErrorMapping<any, any>;
38
- readonly stream?: 'server';
39
- }
40
- export interface HttpProtocolDefinition {
41
- readonly method: string;
42
- readonly path: string;
43
- readonly summary?: string;
44
- readonly description?: string;
45
- readonly tags?: readonly string[];
46
- readonly deprecated?: boolean;
47
- readonly request?: HttpRequestDefinition;
48
- readonly responses: Readonly<Record<string, HttpResponseDefinition>>;
49
- readonly pipeline: readonly PipelineItem[];
50
- readonly interaction?: 'unary' | 'server-stream';
51
- }
52
- export interface HttpProtocol<TDefinition extends HttpProtocolDefinition = HttpProtocolDefinition> extends ProtocolDescriptor<'http', HttpControllerContextDefinition<TDefinition>, DeclaredHttpResults<TDefinition['responses']>, HttpDispatchKey<TDefinition['method'], TDefinition['path']>> {
53
- readonly definition: TDefinition;
54
- readonly interaction: TDefinition extends {
55
- readonly interaction: infer TInteraction;
56
- } ? TInteraction & ('unary' | 'server-stream') : 'unary';
57
- }
58
- type IsHttpPipelineCompatible<TPipeline extends readonly PipelineItem[], TResponses extends HttpProtocolDefinition['responses']> = number extends TPipeline['length'] ? false : TPipeline extends readonly [infer THead, ...infer TTail] ? IsLayerShortCircuitCompatible<ShortCircuitResultOf<THead>, TResponses> extends true ? IsShortCircuitDeclarationsCompatible<ShortCircuitDeclarationsOf<THead>, TResponses> extends true ? IsHttpPipelineCompatible<Extract<TTail, readonly PipelineItem[]>, TResponses> : false : false : true;
59
- type IsAny<T> = 0 extends 1 & T ? true : false;
60
- type IsUnknown<T> = unknown extends T ? [keyof T] extends [never] ? true : false : false;
61
- type ResponseBodyOutput<TResponse extends HttpResponseDefinition> = TResponse extends {
62
- readonly stream: 'server';
63
- } ? AsyncIterable<SchemaOutput<TResponse['body']>> : SchemaOutput<TResponse['body']>;
64
- type ResponseHeadersOutput<TResponse extends HttpResponseDefinition> = TResponse extends {
65
- readonly headers: infer THeaders extends StandardSchemaV1;
66
- } ? SchemaOutput<THeaders> : never;
67
- type DeclaredHttpResults<TResponses extends HttpProtocolDefinition['responses']> = string extends keyof TResponses ? LogicalHttpResult : {
68
- [TVariant in keyof TResponses & string]: NonNullable<TResponses[TVariant]> extends infer TResponse extends HttpResponseDefinition ? LogicalHttpResult<TVariant, ResponseBodyOutput<TResponse>, ResponseHeadersOutput<TResponse>> : never;
69
- }[keyof TResponses & string];
70
- type IsResultHeadersCompatible<TResult, TResponses extends HttpProtocolDefinition['responses']> = string extends keyof TResponses ? true : TResult extends {
71
- readonly variant: infer TVariant extends keyof TResponses;
72
- } ? TResult extends {
73
- readonly headers: infer TResultHeaders;
74
- } ? NonNullable<TResponses[TVariant]> extends infer TResponse extends HttpResponseDefinition ? [ResponseHeadersOutput<TResponse>] extends [never] ? false : Exclude<keyof TResultHeaders, keyof NonNullable<ResponseHeadersOutput<TResponse>>> extends never ? true : false : false : true : false;
75
- type AreResultHeadersCompatible<TResult, TResponses extends HttpProtocolDefinition['responses']> = false extends (TResult extends unknown ? IsResultHeadersCompatible<TResult, TResponses> : never) ? false : true;
76
- type IsLayerShortCircuitCompatible<TResult, TResponses extends HttpProtocolDefinition['responses']> = IsAny<TResult> extends true ? true : IsUnknown<TResult> extends true ? true : [TResult] extends [never] ? true : [TResult] extends [DeclaredHttpResults<TResponses>] ? AreResultHeadersCompatible<TResult, TResponses> : false;
77
- type IsShortCircuitDeclarationsCompatible<TDeclarations, TResponses extends HttpProtocolDefinition['responses']> = IsAny<TDeclarations> extends true ? true : IsUnknown<TDeclarations> extends true ? true : TDeclarations extends readonly unknown[] ? number extends TDeclarations['length'] ? true : TDeclarations extends readonly [infer THead, ...infer TTail] ? IsHttpShortCircuitDeclarationCompatible<THead, TResponses> extends true ? IsShortCircuitDeclarationsCompatible<TTail, TResponses> : false : true : true;
78
- type IsHttpShortCircuitDeclarationCompatible<TDeclaration, TResponses extends HttpProtocolDefinition['responses']> = TDeclaration extends {
79
- readonly protocol: 'http';
80
- readonly variant: infer TVariant extends string;
81
- } ? string extends TVariant ? true : TVariant extends keyof TResponses ? NonNullable<TResponses[TVariant]> extends HttpResponseDefinition ? TDeclaration extends {
82
- readonly response: {
83
- readonly status: infer TStatus extends number;
84
- };
85
- } ? NonNullable<TResponses[TVariant]>['status'] extends TStatus ? true : number extends NonNullable<TResponses[TVariant]>['status'] ? true : false : true : false : false : true;
86
- type HttpPipelineConstraint<TDefinition extends HttpProtocolDefinition> = IsValidProtocolPipeline<TDefinition['pipeline'], 'http'> extends true ? IsHttpPipelineCompatible<TDefinition['pipeline'], TDefinition['responses']> extends true ? unknown : {
87
- readonly pipeline: never;
88
- } : {
89
- readonly pipeline: never;
90
- };
91
- type IsResponseHeadersSchemaCompatible<TResponse> = TResponse extends HttpResponseDefinition ? TResponse extends {
92
- readonly headers: infer THeaders extends StandardSchemaV1;
93
- } ? SchemaOutput<THeaders> extends HttpHeaders | undefined ? true : false : true : false;
94
- type AreResponseHeadersSchemasCompatible<TResponses extends HttpProtocolDefinition['responses']> = false extends {
95
- [TVariant in keyof TResponses]: IsResponseHeadersSchemaCompatible<TResponses[TVariant]>;
96
- }[keyof TResponses] ? false : true;
97
- type HttpResponseConstraint<TDefinition extends HttpProtocolDefinition> = string extends keyof TDefinition['responses'] ? {
98
- readonly responses: never;
99
- } : AreResponseHeadersSchemasCompatible<TDefinition['responses']> extends true ? AreErrorMappingsCompatible<TDefinition['responses']> extends true ? unknown : {
100
- readonly responses: never;
101
- } : {
102
- readonly responses: never;
103
- };
104
- type IsExactParamsSchemaMap<TPath extends string, TSchemas extends HttpParamsSchemas> = Exclude<keyof TSchemas, PathParamNames<TPath>> extends never ? Exclude<PathParamNames<TPath>, keyof TSchemas> extends never ? true : false : false;
105
- type DoParamsSchemasAcceptStrings<TSchemas extends HttpParamsSchemas> = false extends {
106
- [TName in keyof TSchemas]: IsRawStringCompatible<SchemaInput<TSchemas[TName]>>;
107
- }[keyof TSchemas] ? false : true;
108
- type IsRawStringCompatible<TInput> = string extends TInput ? true : [Extract<TInput, string>] extends [never] ? false : true;
109
- type IsUnion<TValue, TCandidate = TValue> = TValue extends unknown ? [TCandidate] extends [TValue] ? false : true : never;
110
- type IsSingleStringLiteral<TValue extends string> = string extends TValue ? false : true extends IsUnion<TValue> ? false : true;
111
- type HttpPathConstraint<TDefinition extends HttpProtocolDefinition> = IsSingleStringLiteral<TDefinition['method']> extends false ? {
112
- readonly method: never;
113
- } : IsSingleStringLiteral<TDefinition['path']> extends false ? {
114
- readonly path: never;
115
- } : IsValidHttpPath<TDefinition['path']> extends true ? TDefinition['request'] extends {
116
- readonly params: infer TSchemas extends HttpParamsSchemas;
117
- } ? IsExactParamsSchemaMap<TDefinition['path'], TSchemas> extends true ? DoParamsSchemasAcceptStrings<TSchemas> extends true ? unknown : {
118
- readonly request: never;
119
- } : {
120
- readonly request: never;
121
- } : HasValidationBeforeTerminal<TDefinition['pipeline'], 'params'> extends true ? {
122
- readonly pipeline: never;
123
- } : unknown : {
124
- readonly path: never;
125
- };
126
- type ErrorMappingResult<TResponse> = TResponse extends {
127
- readonly error: infer TMapping extends HttpErrorMapping<any, any>;
128
- } ? Awaited<ReturnType<TMapping['map']>> : never;
129
- type IsErrorMappingCompatible<TResponse> = TResponse extends HttpResponseDefinition ? TResponse extends {
130
- readonly error: HttpErrorMapping<any, any>;
131
- } ? ErrorMappingResult<TResponse> extends HttpResponseResult<ResponseBodyOutput<TResponse>, ResponseHeadersOutput<TResponse>> ? true : false : true : false;
132
- type AreErrorMappingsCompatible<TResponses extends HttpProtocolDefinition['responses']> = false extends {
133
- [TVariant in keyof TResponses]: IsErrorMappingCompatible<TResponses[TVariant]>;
134
- }[keyof TResponses] ? false : true;
135
- declare function defineHttp<const TDefinition extends HttpProtocolDefinition>(definition: TDefinition & HttpPipelineConstraint<TDefinition> & HttpResponseConstraint<TDefinition> & HttpPathConstraint<TDefinition>): HttpProtocol<TDefinition>;
136
- type HttpProtocolGroup<TDefinitions extends Record<string, HttpProtocolDefinition>> = ProtocolGroup<'http', {
137
- [K in keyof TDefinitions]: HttpProtocol<TDefinitions[K]>;
138
- }>;
139
- type HttpDefinitionsConstraint<TDefinitions extends Record<string, HttpProtocolDefinition>> = {
140
- [K in keyof TDefinitions]: TDefinitions[K] & HttpPipelineConstraint<TDefinitions[K]> & HttpResponseConstraint<TDefinitions[K]> & HttpPathConstraint<TDefinitions[K]>;
141
- };
142
- export interface HttpProtocolFactory extends ProtocolFactory<'http'> {
143
- <const TDefinitions extends Record<string, HttpProtocolDefinition>>(definitions: TDefinitions & HttpDefinitionsConstraint<TDefinitions>): HttpProtocolGroup<TDefinitions>;
144
- readonly route: typeof defineHttp;
145
- readonly controller: TerminalLayerDescriptor<'http'>;
146
- readonly error: typeof httpError;
147
- }
148
- export declare const http: HttpProtocolFactory;
149
- export declare const validate: Readonly<{
150
- params: ValidationLayerDescriptor & {
151
- readonly part: "params";
152
- readonly name: "validate.params";
153
- };
154
- query: ValidationLayerDescriptor & {
155
- readonly part: "query";
156
- readonly name: "validate.query";
157
- };
158
- headers: ValidationLayerDescriptor & {
159
- readonly part: "headers";
160
- readonly name: "validate.headers";
161
- };
162
- body: ValidationLayerDescriptor & {
163
- readonly part: "body";
164
- readonly name: "validate.body";
165
- };
166
- }>;
167
- type ProceduresForHttp<TContract extends ContractDefinition> = {
168
- [K in keyof TContract['procedures']]: 'http' extends keyof TContract['procedures'][K]['protocols'] ? K : never;
169
- }[keyof TContract['procedures']] & string;
170
- type HttpProtocolAt<TContract extends ContractDefinition, TProcedure extends keyof TContract['procedures']> = TContract['procedures'][TProcedure]['protocols']['http' & keyof TContract['procedures'][TProcedure]['protocols']] extends infer TProtocol ? TProtocol extends {
171
- readonly definition: infer TDefinition;
172
- } ? TDefinition extends HttpProtocolDefinition ? HttpProtocol<TDefinition> : never : never : never;
173
- type RequestBodySchema<TBody> = TBody extends HttpRequestBodyDefinition<infer TSchema> ? TSchema : never;
174
- type PartOutput<TDefinition extends HttpProtocolDefinition, TPart extends keyof HttpRequestDefinition> = TPart extends 'params' ? HasValidationBeforeTerminal<TDefinition['pipeline'], 'params'> extends true ? TDefinition['request'] extends {
175
- readonly params: infer TSchemas extends HttpParamsSchemas;
176
- } ? ValidatedPathParams<TSchemas> : never : RawPathParams<TDefinition['path']> : HasValidationBeforeTerminal<TDefinition['pipeline'], TPart> extends false ? unknown : TDefinition['request'] extends HttpRequestDefinition ? TPart extends keyof TDefinition['request'] ? TPart extends 'body' ? SchemaOutput<RequestBodySchema<NonNullable<TDefinition['request'][TPart]>>> : NonNullable<TDefinition['request'][TPart]> extends StandardSchemaV1 ? SchemaOutput<NonNullable<TDefinition['request'][TPart]>> : unknown : unknown : unknown;
177
- type ValidatedPathParams<TSchemas extends HttpParamsSchemas> = Readonly<{
178
- [TName in keyof TSchemas]: SchemaOutput<TSchemas[TName]>;
179
- }>;
180
- type HttpResultHeaders<THeaders> = IsAny<THeaders> extends true ? {
181
- readonly headers?: HttpHeaders;
182
- } : IsUnknown<THeaders> extends true ? {
183
- readonly headers?: HttpHeaders;
184
- } : [THeaders] extends [never] ? {
185
- readonly headers?: never;
186
- } : undefined extends THeaders ? {
187
- readonly headers?: Exclude<THeaders, undefined>;
188
- } : {
189
- readonly headers: THeaders;
190
- };
191
- export type HttpResponseResult<TBody, THeaders = unknown> = {
192
- readonly body: TBody;
193
- } & HttpResultHeaders<THeaders>;
194
- type ErrorOf<TDefinition> = TDefinition extends HttpErrorMatcher<infer TError> ? TError : never;
195
- export declare function httpError<TDefinition extends HttpErrorMatcher<{
196
- readonly data: unknown;
197
- }>>(definition: TDefinition): HttpErrorMapping<ErrorOf<TDefinition>, {
198
- readonly body: ErrorOf<TDefinition>['data'];
199
- }>;
200
- export declare function httpError<TDefinition extends HttpErrorMatcher<{
201
- readonly data: unknown;
202
- }>, const TResult>(definition: TDefinition, map: (error: ErrorOf<TDefinition>) => TResult | Promise<TResult>): HttpErrorMapping<ErrorOf<TDefinition>, TResult>;
203
- export type LogicalHttpResult<TVariant extends string = string, TBody = unknown, THeaders = unknown> = {
204
- readonly kind: 'http-result';
205
- readonly variant: TVariant;
206
- readonly body: TBody;
207
- } & HttpResultHeaders<THeaders>;
208
- type ResponseHelpers<TDefinition extends HttpProtocolDefinition> = {
209
- [TVariant in keyof TDefinition['responses'] & string]: (result: HttpResponseResult<ResponseBodyOutput<TDefinition['responses'][TVariant]>, ResponseHeadersOutput<TDefinition['responses'][TVariant]>>) => LogicalHttpResult<TVariant, ResponseBodyOutput<TDefinition['responses'][TVariant]>, ResponseHeadersOutput<TDefinition['responses'][TVariant]>>;
210
- };
211
- type HttpControllerContextDefinition<TDefinition extends HttpProtocolDefinition> = {
212
- readonly params: PartOutput<TDefinition, 'params'>;
213
- readonly query: PartOutput<TDefinition, 'query'>;
214
- readonly headers: PartOutput<TDefinition, 'headers'>;
215
- readonly body: PartOutput<TDefinition, 'body'>;
216
- readonly response: ResponseHelpers<TDefinition>;
217
- readonly logger: Logger;
218
- readonly signal: AbortSignal;
219
- } & ContextProvidedBeforeTerminal<TDefinition['pipeline']>;
220
- export type HttpControllerContext<TProtocol extends HttpProtocol<any>> = HttpControllerContextDefinition<TProtocol['definition']>;
221
- export type ControllerOf<TContract extends ContractDefinition, TProtocol extends 'http', TProcedures extends ProceduresForHttp<TContract> = ProceduresForHttp<TContract>> = TProtocol extends 'http' ? {
222
- [K in TProcedures]: (context: HttpControllerContext<HttpProtocolAt<TContract, K>>) => DeclaredHttpResults<HttpProtocolAt<TContract, K>['definition']['responses']> | Promise<DeclaredHttpResults<HttpProtocolAt<TContract, K>['definition']['responses']>>;
223
- } : never;
224
- export type ContextOf<TController, TProcedure extends keyof TController> = TController[TProcedure] extends (context: infer TContext, ...args: any[]) => any ? TContext : never;
225
- export {};
@@ -1,69 +0,0 @@
1
- import { childPipelineOf, protocolGroup } from '../core/index.js';
2
- import { createHttpDispatchKey, parseHttpPath, } from './path.js';
3
- const controller = Object.freeze({
4
- kind: 'terminal',
5
- name: 'http.controller',
6
- role: 'terminal',
7
- protocol: 'http',
8
- });
9
- function defineHttp(definition) {
10
- const segments = parseHttpPath(definition.path);
11
- const paramsSchemas = definition.request?.params;
12
- if (paramsSchemas) {
13
- const pathNames = segments.flatMap((segment) => segment.kind === 'param' ? [segment.name] : []);
14
- const schemaNames = Object.keys(paramsSchemas);
15
- if (pathNames.length !== schemaNames.length ||
16
- pathNames.some((name) => !Object.hasOwn(paramsSchemas, name))) {
17
- throw new Error('HTTP path parameter names and request.params keys must match');
18
- }
19
- }
20
- else if (hasParamsValidation(definition.pipeline)) {
21
- throw new Error('validate.params requires request.params');
22
- }
23
- const body = definition.request?.body;
24
- if (body && body.contentType.trim().length === 0) {
25
- throw new Error('HTTP request body contentType must not be empty');
26
- }
27
- return {
28
- kind: 'protocol',
29
- protocol: 'http',
30
- interaction: definition.interaction ?? 'unary',
31
- dispatchKey: createHttpDispatchKey(definition.method, segments),
32
- definition,
33
- };
34
- }
35
- function hasParamsValidation(pipeline) {
36
- return pipeline.some((item) => (item.kind === 'validation' && item.part === 'params') ||
37
- (item.kind === 'layer' &&
38
- hasParamsValidation(childPipelineOf(item) ?? [])));
39
- }
40
- function defineHttpGroup(definitions) {
41
- return protocolGroup('http', Object.fromEntries(Object.entries(definitions).map(([name, definition]) => [name, defineHttp(definition)])));
42
- }
43
- export const http = Object.assign(defineHttpGroup, {
44
- protocol: 'http',
45
- route: defineHttp,
46
- controller,
47
- error: httpError,
48
- });
49
- function validationLayer(part) {
50
- return Object.freeze({
51
- kind: 'validation',
52
- name: `validate.${part}`,
53
- role: 'validation',
54
- part,
55
- });
56
- }
57
- export const validate = Object.freeze({
58
- params: validationLayer('params'),
59
- query: validationLayer('query'),
60
- headers: validationLayer('headers'),
61
- body: validationLayer('body'),
62
- });
63
- export function httpError(definition, map) {
64
- return Object.freeze({
65
- kind: 'http-error-mapping',
66
- definition,
67
- map: map ?? ((error) => ({ body: error.data })),
68
- });
69
- }
@@ -1,4 +0,0 @@
1
- import { http as baseHttp } from './definitions.js';
2
- export declare const http: typeof baseHttp & {
3
- readonly capabilities: readonly ['http'];
4
- };
@@ -1,4 +0,0 @@
1
- import { http as baseHttp } from './definitions.js';
2
- export const http = Object.assign(baseHttp, {
3
- capabilities: ['http'],
4
- });
@@ -1,2 +0,0 @@
1
- import type { HttpParamsSchemas } from './definitions.js';
2
- export declare function validateHttpParamsSchemas(schemas: HttpParamsSchemas, value: Readonly<Record<string, string>>): Promise<Record<string, unknown>>;
@@ -1,19 +0,0 @@
1
- import { SchemaValidationError, validateSchema } from '../core/index.js';
2
- export async function validateHttpParamsSchemas(schemas, value) {
3
- const output = {};
4
- for (const [name, schema] of Object.entries(schemas)) {
5
- try {
6
- output[name] = await validateSchema(schema, value[name]);
7
- }
8
- catch (error) {
9
- if (error instanceof SchemaValidationError) {
10
- throw new SchemaValidationError(error.issues.map((issue) => ({
11
- ...issue,
12
- path: [name, ...(issue.path ?? [])],
13
- })));
14
- }
15
- throw error;
16
- }
17
- }
18
- return output;
19
- }
@@ -1,4 +0,0 @@
1
- import type { StandardSchemaV1 } from '../core/index.js';
2
- import type { HttpRequestBodyDefinition } from './definitions.js';
3
- export declare function httpRequestBodySchema(body: HttpRequestBodyDefinition): StandardSchemaV1;
4
- export declare function httpRequestBodyContentType(body: HttpRequestBodyDefinition): string;
@@ -1,6 +0,0 @@
1
- export function httpRequestBodySchema(body) {
2
- return body.schema;
3
- }
4
- export function httpRequestBodyContentType(body) {
5
- return body.contentType;
6
- }
@@ -1,20 +0,0 @@
1
- import { cors } from './cors.js';
2
- export declare const validate: Readonly<{
3
- params: import("../index.js").ValidationLayerDescriptor & {
4
- readonly part: "params";
5
- readonly name: "validate.params";
6
- };
7
- query: import("../index.js").ValidationLayerDescriptor & {
8
- readonly part: "query";
9
- readonly name: "validate.query";
10
- };
11
- headers: import("../index.js").ValidationLayerDescriptor & {
12
- readonly part: "headers";
13
- readonly name: "validate.headers";
14
- };
15
- body: import("../index.js").ValidationLayerDescriptor & {
16
- readonly part: "body";
17
- readonly name: "validate.body";
18
- };
19
- cors: typeof cors;
20
- }>;
@@ -1,6 +0,0 @@
1
- import { cors } from './cors.js';
2
- import { validate as inputValidation } from './definitions.js';
3
- export const validate = Object.freeze({
4
- ...inputValidation,
5
- cors,
6
- });
@@ -1,2 +0,0 @@
1
- import type { MessagePortProtocolExecution } from './index.js';
2
- export declare function initializeMessagePortExecution(application: MessagePortProtocolExecution, environmentSource: unknown): Promise<void>;
@@ -1,4 +0,0 @@
1
- import { initializeWithEnvironment } from '../runtime/index.js';
2
- export function initializeMessagePortExecution(application, environmentSource) {
3
- return initializeWithEnvironment(application, environmentSource);
4
- }
@@ -1,38 +0,0 @@
1
- import { type ArgsClass, type EnvClass, type ModuleInstance, type ModuleTemplate, type TaskArguments, type TaskDescriptor, type TaskOutput, type TokenLike } from '../core/index.js';
2
- import { Container, type RuntimeModuleGraph } from './di.js';
3
- import { Logger } from './logger.js';
4
- export interface ApplicationRuntimeOptions {
5
- readonly logger?: Logger;
6
- readonly environmentSource?: unknown;
7
- readonly arguments?: ArgsClass;
8
- readonly argumentsSource?: unknown;
9
- readonly tasks?: readonly TaskDescriptor<any, any>[];
10
- readonly publicTasks?: readonly TaskDescriptor<any, any>[];
11
- }
12
- export interface InitializableApplication {
13
- initialize(): Promise<void>;
14
- }
15
- export declare function initializeWithEnvironment(application: InitializableApplication, environmentSource: unknown): Promise<void>;
16
- export declare class EnvironmentBindingError extends Error {
17
- readonly code = "LUTRE_ENV_003";
18
- constructor(environment: EnvClass, cause: unknown);
19
- }
20
- export declare class ArgumentsBindingError extends Error {
21
- readonly code = "LUTRE_ARGS_003";
22
- constructor(argumentsContract: ArgsClass, cause: unknown);
23
- }
24
- export declare class ApplicationRuntime {
25
- #private;
26
- readonly graph: RuntimeModuleGraph;
27
- readonly container: Container;
28
- constructor(roots: readonly (ModuleInstance | ModuleTemplate<void>)[], options?: ApplicationRuntimeOptions);
29
- initialize(): Promise<void>;
30
- get<T>(token: TokenLike<T>): T;
31
- run<TTask extends TaskDescriptor<any, any>>(task: TTask, ...args: TaskArguments<TTask>): Promise<TaskOutput<TTask>>;
32
- /** public run()ではTrigger専用Taskを拒否するため、Trigger Host専用経路を分ける。 */
33
- runTask<TTask extends TaskDescriptor<any, any>>(task: TTask, ...args: TaskArguments<TTask>): Promise<TaskOutput<TTask>>;
34
- execute<T>(execution: () => T | Promise<T>): Promise<T>;
35
- stopAcceptingExecutions(): void;
36
- shutdown(signal?: string): Promise<void>;
37
- }
38
- export declare function createApplicationRuntime(roots: readonly (ModuleInstance | ModuleTemplate<void>)[], options?: ApplicationRuntimeOptions): ApplicationRuntime;