elysia 2.0.0-beta.20 → 2.0.0-beta.21
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/compile/aot.d.ts +8 -8
- package/dist/compile/aot.js +16 -14
- package/dist/compile/aot.mjs +14 -14
- package/dist/compile/handler/descriptor.js +2 -3
- package/dist/compile/handler/descriptor.mjs +2 -3
- package/dist/compile/handler/index.d.ts +2 -1
- package/dist/compile/handler/index.js +144 -24
- package/dist/compile/handler/index.mjs +146 -27
- package/dist/compile/handler/jit.d.ts +2 -0
- package/dist/compile/handler/jit.js +3 -2
- package/dist/compile/handler/jit.mjs +3 -2
- package/dist/compile/handler/reconstruct.js +3 -2
- package/dist/compile/handler/reconstruct.mjs +3 -2
- package/dist/cookie/config.d.ts +6 -2
- package/dist/cookie/config.js +68 -8
- package/dist/cookie/config.mjs +69 -10
- package/dist/cookie/utils.js +3 -3
- package/dist/cookie/utils.mjs +4 -4
- package/dist/package.js +1 -1
- package/dist/package.mjs +1 -1
- package/dist/plugin/aot/core.d.ts +5 -0
- package/dist/plugin/aot/core.js +37 -1
- package/dist/plugin/aot/core.mjs +37 -1
- package/dist/plugin/aot/source.js +24 -9
- package/dist/plugin/aot/source.mjs +24 -9
- package/dist/schema-snapshot.js +4 -3
- package/dist/schema-snapshot.mjs +4 -3
- package/dist/type/coerce.d.ts +1 -1
- package/dist/type/constants.d.ts +1 -1
- package/dist/type/elysia/keep-config.d.ts +14 -0
- package/dist/type/elysia/keep-config.js +62 -0
- package/dist/type/elysia/keep-config.mjs +53 -0
- package/dist/type/exports.d.ts +3 -2
- package/dist/type/exports.js +10 -0
- package/dist/type/exports.mjs +2 -1
- package/dist/type/index.js +10 -0
- package/dist/type/index.mjs +10 -0
- package/dist/type/typebox-type-live.d.ts +2 -2
- package/dist/type/typebox-type-live.js +8 -0
- package/dist/type/typebox-type-live.mjs +2 -2
- package/dist/type/typebox-type.d.ts +10 -2
- package/dist/type/typebox-type.js +64 -0
- package/dist/type/typebox-type.mjs +17 -1
- package/dist/types.d.ts +3 -2
- package/dist/utils.d.ts +3 -1
- package/dist/utils.js +23 -0
- package/dist/utils.mjs +22 -1
- package/dist/ws/route.js +33 -5
- package/dist/ws/route.mjs +35 -7
- package/package.json +1 -1
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
import { TypeboxTypeNamespaces } from "./typebox-type.js";
|
|
2
|
-
import { Codec, Decode, Evaluate, Intersect, Module, Null, Ref, Refine, Undefined, Unsafe } from "typebox/type";
|
|
2
|
+
import { Codec, Composite, Decode, Evaluate, Interface, Intersect, Mapped, Module, Null, Omit, Partial, Pick, ReadonlyObject, Ref, Refine, Required, Undefined, Unsafe } from "typebox/type";
|
|
3
3
|
|
|
4
4
|
//#region src/type/typebox-type-live.d.ts
|
|
5
5
|
declare function injectTypeboxType(typebox?: TypeboxTypeNamespaces): void;
|
|
@@ -8,4 +8,4 @@ declare function markTypeUsed(): void;
|
|
|
8
8
|
declare const isTypeUsed: () => boolean;
|
|
9
9
|
declare const isTypeNamespaceLoaded: () => boolean;
|
|
10
10
|
//#endregion
|
|
11
|
-
export { Codec, Decode, Evaluate, Intersect, Module, Null, Ref, Refine, type TypeboxTypeNamespaces, Undefined, Unsafe, injectTypeboxType, isTypeNamespaceLoaded, isTypeUsed, loadTypeNamespace, markTypeUsed };
|
|
11
|
+
export { Codec, Composite, Decode, Evaluate, Interface, Intersect, Mapped, Module, Null, Omit, Partial, Pick, ReadonlyObject, Ref, Refine, Required, type TypeboxTypeNamespaces, Undefined, Unsafe, injectTypeboxType, isTypeNamespaceLoaded, isTypeUsed, loadTypeNamespace, markTypeUsed };
|
|
@@ -21,13 +21,21 @@ const isTypeNamespaceLoaded = () => true;
|
|
|
21
21
|
|
|
22
22
|
//#endregion
|
|
23
23
|
exports.Codec = typebox_type.Codec;
|
|
24
|
+
exports.Composite = typebox_type.Composite;
|
|
24
25
|
exports.Decode = typebox_type.Decode;
|
|
25
26
|
exports.Evaluate = typebox_type.Evaluate;
|
|
27
|
+
exports.Interface = typebox_type.Interface;
|
|
26
28
|
exports.Intersect = typebox_type.Intersect;
|
|
29
|
+
exports.Mapped = typebox_type.Mapped;
|
|
27
30
|
exports.Module = typebox_type.Module;
|
|
28
31
|
exports.Null = typebox_type.Null;
|
|
32
|
+
exports.Omit = typebox_type.Omit;
|
|
33
|
+
exports.Partial = typebox_type.Partial;
|
|
34
|
+
exports.Pick = typebox_type.Pick;
|
|
35
|
+
exports.ReadonlyObject = typebox_type.ReadonlyObject;
|
|
29
36
|
exports.Ref = typebox_type.Ref;
|
|
30
37
|
exports.Refine = typebox_type.Refine;
|
|
38
|
+
exports.Required = typebox_type.Required;
|
|
31
39
|
exports.Undefined = typebox_type.Undefined;
|
|
32
40
|
exports.Unsafe = typebox_type.Unsafe;
|
|
33
41
|
exports.injectTypeboxType = injectTypeboxType;
|
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
import * as type from "typebox/type";
|
|
2
|
-
import { Codec, Decode, Evaluate, Intersect, Module, Null, Ref, Refine, Undefined, Unsafe } from "typebox/type";
|
|
2
|
+
import { Codec, Composite, Decode, Evaluate, Interface, Intersect, Mapped, Module, Null, Omit, Partial, Pick, ReadonlyObject, Ref, Refine, Required, Undefined, Unsafe } from "typebox/type";
|
|
3
3
|
import * as system from "./typebox-system-lite.mjs";
|
|
4
4
|
|
|
5
5
|
//#region src/type/typebox-type-live.ts
|
|
@@ -17,4 +17,4 @@ const isTypeUsed = () => true;
|
|
|
17
17
|
const isTypeNamespaceLoaded = () => true;
|
|
18
18
|
|
|
19
19
|
//#endregion
|
|
20
|
-
export { Codec, Decode, Evaluate, Intersect, Module, Null, Ref, Refine, Undefined, Unsafe, injectTypeboxType, isTypeNamespaceLoaded, isTypeUsed, loadTypeNamespace, markTypeUsed };
|
|
20
|
+
export { Codec, Composite, Decode, Evaluate, Interface, Intersect, Mapped, Module, Null, Omit, Partial, Pick, ReadonlyObject, Ref, Refine, Required, Undefined, Unsafe, injectTypeboxType, isTypeNamespaceLoaded, isTypeUsed, loadTypeNamespace, markTypeUsed };
|
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
import * as _$typebox_type0 from "typebox/type";
|
|
2
|
-
import { Codec as Codec$1, Decode as Decode$1, Evaluate as Evaluate$1, Intersect as Intersect$1, Module as Module$1, Null as Null$1, Ref as Ref$1, Refine as Refine$1, Undefined as Undefined$1, Unsafe as Unsafe$1 } from "typebox/type";
|
|
2
|
+
import { Codec as Codec$1, Composite as Composite$1, Decode as Decode$1, Evaluate as Evaluate$1, Interface as Interface$1, Intersect as Intersect$1, Mapped as Mapped$1, Module as Module$1, Null as Null$1, Omit as Omit$1, Partial as Partial$1, Pick as Pick$1, ReadonlyObject as ReadonlyObject$1, Ref as Ref$1, Refine as Refine$1, Required as Required$1, Undefined as Undefined$1, Unsafe as Unsafe$1 } from "typebox/type";
|
|
3
3
|
import * as _$typebox_system0 from "typebox/system";
|
|
4
4
|
|
|
5
5
|
//#region src/type/typebox-type.d.ts
|
|
@@ -12,15 +12,23 @@ declare const markTypeUsed: () => void;
|
|
|
12
12
|
declare const isTypeUsed: () => boolean;
|
|
13
13
|
declare const isTypeNamespaceLoaded: () => boolean;
|
|
14
14
|
declare let Codec: typeof Codec$1;
|
|
15
|
+
declare let Composite: typeof Composite$1;
|
|
15
16
|
declare let Decode: typeof Decode$1;
|
|
16
17
|
declare let Evaluate: typeof Evaluate$1;
|
|
18
|
+
declare let Interface: typeof Interface$1;
|
|
17
19
|
declare let Intersect: typeof Intersect$1;
|
|
20
|
+
declare let Mapped: typeof Mapped$1;
|
|
18
21
|
declare let Module: typeof Module$1;
|
|
19
22
|
declare let Null: typeof Null$1;
|
|
23
|
+
declare let Omit: typeof Omit$1;
|
|
24
|
+
declare let Partial: typeof Partial$1;
|
|
25
|
+
declare let Pick: typeof Pick$1;
|
|
26
|
+
declare let ReadonlyObject: typeof ReadonlyObject$1;
|
|
20
27
|
declare let Ref: typeof Ref$1;
|
|
21
28
|
declare let Refine: typeof Refine$1;
|
|
29
|
+
declare let Required: typeof Required$1;
|
|
22
30
|
declare let Undefined: typeof Undefined$1;
|
|
23
31
|
declare let Unsafe: typeof Unsafe$1;
|
|
24
32
|
declare function injectTypeboxType(typebox: TypeboxTypeNamespaces): void;
|
|
25
33
|
//#endregion
|
|
26
|
-
export { Codec, Decode, Evaluate, Intersect, Module, Null, Ref, Refine, TypeboxTypeNamespaces, Undefined, Unsafe, injectTypeboxType, isTypeNamespaceLoaded, isTypeUsed, loadTypeNamespace, markTypeUsed };
|
|
34
|
+
export { Codec, Composite, Decode, Evaluate, Interface, Intersect, Mapped, Module, Null, Omit, Partial, Pick, ReadonlyObject, Ref, Refine, Required, TypeboxTypeNamespaces, Undefined, Unsafe, injectTypeboxType, isTypeNamespaceLoaded, isTypeUsed, loadTypeNamespace, markTypeUsed };
|
|
@@ -42,26 +42,42 @@ function stub(get) {
|
|
|
42
42
|
};
|
|
43
43
|
}
|
|
44
44
|
let Codec = stub(() => Codec);
|
|
45
|
+
let Composite = stub(() => Composite);
|
|
45
46
|
let Decode = stub(() => Decode);
|
|
46
47
|
let Evaluate = stub(() => Evaluate);
|
|
48
|
+
let Interface = stub(() => Interface);
|
|
47
49
|
let Intersect = stub(() => Intersect);
|
|
50
|
+
let Mapped = stub(() => Mapped);
|
|
48
51
|
let Module = stub(() => Module);
|
|
49
52
|
let Null = stub(() => Null);
|
|
53
|
+
let Omit = stub(() => Omit);
|
|
54
|
+
let Partial = stub(() => Partial);
|
|
55
|
+
let Pick = stub(() => Pick);
|
|
56
|
+
let ReadonlyObject = stub(() => ReadonlyObject);
|
|
50
57
|
let Ref = stub(() => Ref);
|
|
51
58
|
let Refine = stub(() => Refine);
|
|
59
|
+
let Required = stub(() => Required);
|
|
52
60
|
let Undefined = stub(() => Undefined);
|
|
53
61
|
let Unsafe = stub(() => Unsafe);
|
|
54
62
|
function injectTypeboxType(typebox) {
|
|
55
63
|
const first = namespaces === void 0;
|
|
56
64
|
namespaces = typebox;
|
|
57
65
|
Codec = typebox.type.Codec;
|
|
66
|
+
Composite = typebox.type.Composite;
|
|
58
67
|
Decode = typebox.type.Decode;
|
|
59
68
|
Evaluate = typebox.type.Evaluate;
|
|
69
|
+
Interface = typebox.type.Interface;
|
|
60
70
|
Intersect = typebox.type.Intersect;
|
|
71
|
+
Mapped = typebox.type.Mapped;
|
|
61
72
|
Module = typebox.type.Module;
|
|
62
73
|
Null = typebox.type.Null;
|
|
74
|
+
Omit = typebox.type.Omit;
|
|
75
|
+
Partial = typebox.type.Partial;
|
|
76
|
+
Pick = typebox.type.Pick;
|
|
77
|
+
ReadonlyObject = typebox.type.ReadonlyObject;
|
|
63
78
|
Ref = typebox.type.Ref;
|
|
64
79
|
Refine = typebox.type.Refine;
|
|
80
|
+
Required = typebox.type.Required;
|
|
65
81
|
Undefined = typebox.type.Undefined;
|
|
66
82
|
Unsafe = typebox.type.Unsafe;
|
|
67
83
|
if (first) typebox.system.Settings.Set({ unionPrioritySort: false });
|
|
@@ -74,6 +90,12 @@ Object.defineProperty(exports, 'Codec', {
|
|
|
74
90
|
return Codec;
|
|
75
91
|
}
|
|
76
92
|
});
|
|
93
|
+
Object.defineProperty(exports, 'Composite', {
|
|
94
|
+
enumerable: true,
|
|
95
|
+
get: function () {
|
|
96
|
+
return Composite;
|
|
97
|
+
}
|
|
98
|
+
});
|
|
77
99
|
Object.defineProperty(exports, 'Decode', {
|
|
78
100
|
enumerable: true,
|
|
79
101
|
get: function () {
|
|
@@ -86,12 +108,24 @@ Object.defineProperty(exports, 'Evaluate', {
|
|
|
86
108
|
return Evaluate;
|
|
87
109
|
}
|
|
88
110
|
});
|
|
111
|
+
Object.defineProperty(exports, 'Interface', {
|
|
112
|
+
enumerable: true,
|
|
113
|
+
get: function () {
|
|
114
|
+
return Interface;
|
|
115
|
+
}
|
|
116
|
+
});
|
|
89
117
|
Object.defineProperty(exports, 'Intersect', {
|
|
90
118
|
enumerable: true,
|
|
91
119
|
get: function () {
|
|
92
120
|
return Intersect;
|
|
93
121
|
}
|
|
94
122
|
});
|
|
123
|
+
Object.defineProperty(exports, 'Mapped', {
|
|
124
|
+
enumerable: true,
|
|
125
|
+
get: function () {
|
|
126
|
+
return Mapped;
|
|
127
|
+
}
|
|
128
|
+
});
|
|
95
129
|
Object.defineProperty(exports, 'Module', {
|
|
96
130
|
enumerable: true,
|
|
97
131
|
get: function () {
|
|
@@ -104,6 +138,30 @@ Object.defineProperty(exports, 'Null', {
|
|
|
104
138
|
return Null;
|
|
105
139
|
}
|
|
106
140
|
});
|
|
141
|
+
Object.defineProperty(exports, 'Omit', {
|
|
142
|
+
enumerable: true,
|
|
143
|
+
get: function () {
|
|
144
|
+
return Omit;
|
|
145
|
+
}
|
|
146
|
+
});
|
|
147
|
+
Object.defineProperty(exports, 'Partial', {
|
|
148
|
+
enumerable: true,
|
|
149
|
+
get: function () {
|
|
150
|
+
return Partial;
|
|
151
|
+
}
|
|
152
|
+
});
|
|
153
|
+
Object.defineProperty(exports, 'Pick', {
|
|
154
|
+
enumerable: true,
|
|
155
|
+
get: function () {
|
|
156
|
+
return Pick;
|
|
157
|
+
}
|
|
158
|
+
});
|
|
159
|
+
Object.defineProperty(exports, 'ReadonlyObject', {
|
|
160
|
+
enumerable: true,
|
|
161
|
+
get: function () {
|
|
162
|
+
return ReadonlyObject;
|
|
163
|
+
}
|
|
164
|
+
});
|
|
107
165
|
Object.defineProperty(exports, 'Ref', {
|
|
108
166
|
enumerable: true,
|
|
109
167
|
get: function () {
|
|
@@ -116,6 +174,12 @@ Object.defineProperty(exports, 'Refine', {
|
|
|
116
174
|
return Refine;
|
|
117
175
|
}
|
|
118
176
|
});
|
|
177
|
+
Object.defineProperty(exports, 'Required', {
|
|
178
|
+
enumerable: true,
|
|
179
|
+
get: function () {
|
|
180
|
+
return Required;
|
|
181
|
+
}
|
|
182
|
+
});
|
|
119
183
|
Object.defineProperty(exports, 'Undefined', {
|
|
120
184
|
enumerable: true,
|
|
121
185
|
get: function () {
|
|
@@ -41,30 +41,46 @@ function stub(get) {
|
|
|
41
41
|
};
|
|
42
42
|
}
|
|
43
43
|
let Codec = stub(() => Codec);
|
|
44
|
+
let Composite = stub(() => Composite);
|
|
44
45
|
let Decode = stub(() => Decode);
|
|
45
46
|
let Evaluate = stub(() => Evaluate);
|
|
47
|
+
let Interface = stub(() => Interface);
|
|
46
48
|
let Intersect = stub(() => Intersect);
|
|
49
|
+
let Mapped = stub(() => Mapped);
|
|
47
50
|
let Module = stub(() => Module);
|
|
48
51
|
let Null = stub(() => Null);
|
|
52
|
+
let Omit = stub(() => Omit);
|
|
53
|
+
let Partial = stub(() => Partial);
|
|
54
|
+
let Pick = stub(() => Pick);
|
|
55
|
+
let ReadonlyObject = stub(() => ReadonlyObject);
|
|
49
56
|
let Ref = stub(() => Ref);
|
|
50
57
|
let Refine = stub(() => Refine);
|
|
58
|
+
let Required = stub(() => Required);
|
|
51
59
|
let Undefined = stub(() => Undefined);
|
|
52
60
|
let Unsafe = stub(() => Unsafe);
|
|
53
61
|
function injectTypeboxType(typebox) {
|
|
54
62
|
const first = namespaces === void 0;
|
|
55
63
|
namespaces = typebox;
|
|
56
64
|
Codec = typebox.type.Codec;
|
|
65
|
+
Composite = typebox.type.Composite;
|
|
57
66
|
Decode = typebox.type.Decode;
|
|
58
67
|
Evaluate = typebox.type.Evaluate;
|
|
68
|
+
Interface = typebox.type.Interface;
|
|
59
69
|
Intersect = typebox.type.Intersect;
|
|
70
|
+
Mapped = typebox.type.Mapped;
|
|
60
71
|
Module = typebox.type.Module;
|
|
61
72
|
Null = typebox.type.Null;
|
|
73
|
+
Omit = typebox.type.Omit;
|
|
74
|
+
Partial = typebox.type.Partial;
|
|
75
|
+
Pick = typebox.type.Pick;
|
|
76
|
+
ReadonlyObject = typebox.type.ReadonlyObject;
|
|
62
77
|
Ref = typebox.type.Ref;
|
|
63
78
|
Refine = typebox.type.Refine;
|
|
79
|
+
Required = typebox.type.Required;
|
|
64
80
|
Undefined = typebox.type.Undefined;
|
|
65
81
|
Unsafe = typebox.type.Unsafe;
|
|
66
82
|
if (first) typebox.system.Settings.Set({ unionPrioritySort: false });
|
|
67
83
|
}
|
|
68
84
|
|
|
69
85
|
//#endregion
|
|
70
|
-
export { Codec, Decode, Evaluate, Intersect, Module, Null, Ref, Refine, Undefined, Unsafe, injectTypeboxType, isTypeNamespaceLoaded, isTypeUsed, loadTypeNamespace, markTypeUsed };
|
|
86
|
+
export { Codec, Composite, Decode, Evaluate, Interface, Intersect, Mapped, Module, Null, Omit, Partial, Pick, ReadonlyObject, Ref, Refine, Required, Undefined, Unsafe, injectTypeboxType, isTypeNamespaceLoaded, isTypeUsed, loadTypeNamespace, markTypeUsed };
|
package/dist/types.d.ts
CHANGED
|
@@ -836,6 +836,7 @@ type ObjectMacroDefs<N, AmbientSchema extends RouteSchema, ScopedSchemas extends
|
|
|
836
836
|
derive: Singleton['derive'] & MacroRefResolve<MacroFn, K extends keyof Refs ? Refs[K] : {}, Definitions['typebox']>;
|
|
837
837
|
}, Definitions['error']>> } & { [K in keyof N]: N[K] extends ((...a: any[]) => any) ? unknown : string extends keyof N[K] ? unknown : { [P in Exclude<keyof N[K], MacroPropertyKey | InputSchemaKey | keyof MacroFn | keyof N>]: `Unknown macro property '${P & string}'` } } & N;
|
|
838
838
|
type CreateEden<Path extends string, Property extends Record<string, unknown> = {}> = Path extends `/${infer Rest}` ? _CreateEden<Rest, Property> : Path extends '' | '/' ? Property : _CreateEden<Path, Property>;
|
|
839
|
+
type CreateRouteEden<BasePath extends string, Path extends string, Property extends Record<string, unknown>> = string extends Path ? {} : CreateEden<JoinPath<BasePath, Path>, Property>;
|
|
839
840
|
type _CreateEden<Path extends string, Property extends Record<string, unknown> = {}> = Path extends `${infer Start}/${infer Rest}` ? { [x in Start]: _CreateEden<Rest, Property> } : Path extends '' ? Property : { [x in Path]: Property };
|
|
840
841
|
/**
|
|
841
842
|
* Value an annotation knob resolves to, `never` when it annotates nothing.
|
|
@@ -1112,7 +1113,7 @@ type MergeElysiaInstances<Instances extends AnyElysia[] = [], Prefix extends str
|
|
|
1112
1113
|
derive: Singleton['derive'];
|
|
1113
1114
|
}, Definitions, Metadata, Routes, Ephemeral, Volatile>;
|
|
1114
1115
|
type WrapFn<Callback extends (...params: any) => MaybePromise<Response> = (request: Request, ...rest: any[]) => MaybePromise<Response>> = (fetch: (request: Request, ...rest: any[]) => MaybePromise<Response>) => Callback;
|
|
1115
|
-
type AddRoute<BasePath extends string, Scope extends EventScope, Singleton extends SingletonBase, Definitions extends DefinitionBase, Metadata extends MetadataBase, Routes extends RouteBase, Ephemeral extends EphemeralType, Volatile extends EphemeralType, Method extends string, Path extends string, Schema extends RouteSchema, MacroContext extends RouteSchema, Handle> = Elysia<BasePath, Scope, Singleton, Definitions, Metadata, Routes &
|
|
1116
|
+
type AddRoute<BasePath extends string, Scope extends EventScope, Singleton extends SingletonBase, Definitions extends DefinitionBase, Metadata extends MetadataBase, Routes extends RouteBase, Ephemeral extends EphemeralType, Volatile extends EphemeralType, Method extends string, Path extends string, Schema extends RouteSchema, MacroContext extends RouteSchema, Handle> = Elysia<BasePath, Scope, Singleton, Definitions, Metadata, Routes & CreateRouteEden<BasePath, Path, { [method in Method]: WithHandledErrors<CreateEdenResponse<Path, Schema, MacroContext, ComposeElysiaResponse<Schema & MacroContext & Metadata['schemas'] & Ephemeral['schemas'] & Volatile['schemas'], Handle, UnionResponseStatus<Metadata['response'], UnionResponseStatus<Ephemeral['response'], UnionResponseStatus<Volatile['response'], MacroContext['return'] & {}>>>, [...Definitions['error'], ...Ephemeral['error'], ...Volatile['error']], Path>, UnhandledReturnedErrorOf<Handle, [...Definitions['error'], ...Ephemeral['error'], ...Volatile['error']]>>, Handle, [...Definitions['error'], ...Ephemeral['error'], ...Volatile['error']]> }>, Ephemeral, Volatile>;
|
|
1116
1117
|
type HookContextSchema<Metadata extends MetadataBase, Ephemeral extends EphemeralType, Volatile extends EphemeralType, BasePath extends string> = MergeSchema<Volatile['schema'], MergeSchema<Ephemeral['schema'], Metadata['schema']>, BasePath> & Metadata['schemas'] & Ephemeral['schemas'] & Volatile['schemas'];
|
|
1117
1118
|
type HookContextSingleton<Singleton extends SingletonBase, Ephemeral extends EphemeralType, Volatile extends EphemeralType> = Singleton & {
|
|
1118
1119
|
derive: Ephemeral['derive'] & Volatile['derive'];
|
|
@@ -1213,7 +1214,7 @@ type ScopedMapDeriveReturn<HookScope extends EventScope, BasePath extends string
|
|
|
1213
1214
|
response: UnionResponseStatus<Volatile['response'], ResponseAddition>;
|
|
1214
1215
|
error: Volatile['error'];
|
|
1215
1216
|
}>;
|
|
1216
|
-
type AddWSRoute<BasePath extends string, Scope extends EventScope, Singleton extends SingletonBase, Definitions extends DefinitionBase, Metadata extends MetadataBase, Routes extends RouteBase, Ephemeral extends EphemeralType, Volatile extends EphemeralType, Path extends string, Schema extends RouteSchema, MacroContext extends RouteSchema, Response> = Elysia<BasePath, Scope, Singleton, Definitions, Metadata, Routes &
|
|
1217
|
+
type AddWSRoute<BasePath extends string, Scope extends EventScope, Singleton extends SingletonBase, Definitions extends DefinitionBase, Metadata extends MetadataBase, Routes extends RouteBase, Ephemeral extends EphemeralType, Volatile extends EphemeralType, Path extends string, Schema extends RouteSchema, MacroContext extends RouteSchema, Response> = Elysia<BasePath, Scope, Singleton, Definitions, Metadata, Routes & CreateRouteEden<BasePath, Path, {
|
|
1217
1218
|
subscribe: CreateWSEdenResponse<Path, Schema, MacroContext, ComposeElysiaResponse<Schema & MacroContext & Metadata['schemas'] & Ephemeral['schemas'] & Volatile['schemas'], Response, UnionResponseStatus<Metadata['response'], UnionResponseStatus<Ephemeral['response'], UnionResponseStatus<Volatile['response'], MacroContext['return'] & {}>>>, [...Definitions['error'], ...Ephemeral['error'], ...Volatile['error']], Path>>;
|
|
1218
1219
|
}>, Ephemeral, Volatile>;
|
|
1219
1220
|
type GuardHookSingleton<Singleton extends SingletonBase, Ephemeral extends EphemeralType, Volatile extends EphemeralType, MacroContext> = Singleton & {
|
package/dist/utils.d.ts
CHANGED
|
@@ -20,6 +20,8 @@ declare const isNotEmpty: <T extends Object>(obj?: T) => boolean | undefined;
|
|
|
20
20
|
*/
|
|
21
21
|
declare function evictOldestHalf(cache: Map<any, any>): void;
|
|
22
22
|
declare function fnv1a(str: string): number;
|
|
23
|
+
declare const compositionKeys: readonly string[];
|
|
24
|
+
declare function refTargets(roots: unknown[], models?: Record<string, unknown>): (name: string) => Iterable<unknown>;
|
|
23
25
|
/**
|
|
24
26
|
* Maps each lifecycle/derive function to the hash of the named plugin it was
|
|
25
27
|
* first registered on. Used by `.use()` to dedup absorbed hooks: if a fn's
|
|
@@ -209,4 +211,4 @@ declare const isSocketQuiet: (socket: {
|
|
|
209
211
|
}) => boolean;
|
|
210
212
|
declare const isHTMLBundle: (value: unknown) => value is BunHTMLBundlelike;
|
|
211
213
|
//#endregion
|
|
212
|
-
export { ChainNode, CompactBeforeHandleChunk, CompactBeforeHandlePrefix, DeriveEntry, ELYSIA_FORM_PROTOTYPE, assignOwn, authorityEnd, bytes, clearFlattenChainMemo, cloneHook, clonePlainDecorators, clonePlainDeep, coalesceSchemas, compactBeforeHandleConflicts, compactBeforeHandlePrefix, constantTimeEqual, createErrorEventHandler, deriveEntryFn, eventProperties, evictOldestHalf, flattenChain, flattenChainMemo, flattenChainMemoReadonly, fnOrigin, fnv1a, form, formToFormData, getLoosePath, guardNonPlainLeaves, hookToGuard, invalidateMacroEpoch, isBlob, isByteStream, isCompactBeforeHandleOnly, isDisposable, isElysiaForm, isEmpty, isHTMLBundle, isLocalScope, isMapDeriveEntry, isNotEmpty, isPlainObject, isRecordNumber, isSingleton, isSocketQuiet, joinPath, macroEpoch, macroOrigin, mapDeriveEntry, markSingletons, mergeArray, mergeDeep, mergeHook, mergeResponse, nullObject, prefix, pushField, redirect, replaceUrlPath, requestId, rootSnapshot, schemaProperties, serializeMacroSeed, sse, sseData, throwLifecycleErrors };
|
|
214
|
+
export { ChainNode, CompactBeforeHandleChunk, CompactBeforeHandlePrefix, DeriveEntry, ELYSIA_FORM_PROTOTYPE, assignOwn, authorityEnd, bytes, clearFlattenChainMemo, cloneHook, clonePlainDecorators, clonePlainDeep, coalesceSchemas, compactBeforeHandleConflicts, compactBeforeHandlePrefix, compositionKeys, constantTimeEqual, createErrorEventHandler, deriveEntryFn, eventProperties, evictOldestHalf, flattenChain, flattenChainMemo, flattenChainMemoReadonly, fnOrigin, fnv1a, form, formToFormData, getLoosePath, guardNonPlainLeaves, hookToGuard, invalidateMacroEpoch, isBlob, isByteStream, isCompactBeforeHandleOnly, isDisposable, isElysiaForm, isEmpty, isHTMLBundle, isLocalScope, isMapDeriveEntry, isNotEmpty, isPlainObject, isRecordNumber, isSingleton, isSocketQuiet, joinPath, macroEpoch, macroOrigin, mapDeriveEntry, markSingletons, mergeArray, mergeDeep, mergeHook, mergeResponse, nullObject, prefix, pushField, redirect, refTargets, replaceUrlPath, requestId, rootSnapshot, schemaProperties, serializeMacroSeed, sse, sseData, throwLifecycleErrors };
|
package/dist/utils.js
CHANGED
|
@@ -37,6 +37,27 @@ function fnv1a(str) {
|
|
|
37
37
|
}
|
|
38
38
|
return hash >>> 0;
|
|
39
39
|
}
|
|
40
|
+
const compositionKeys = Object.freeze([
|
|
41
|
+
"allOf",
|
|
42
|
+
"anyOf",
|
|
43
|
+
"oneOf",
|
|
44
|
+
"~cookieFrom"
|
|
45
|
+
]);
|
|
46
|
+
function refTargets(roots, models = {}) {
|
|
47
|
+
const targets = nullObject();
|
|
48
|
+
const add = (name, schema) => (targets[name] ??= /* @__PURE__ */ new Set()).add(schema);
|
|
49
|
+
const seen = /* @__PURE__ */ new Set();
|
|
50
|
+
const index = (node) => {
|
|
51
|
+
if (!node || typeof node !== "object" || seen.has(node)) return;
|
|
52
|
+
seen.add(node);
|
|
53
|
+
if (typeof node.$id === "string") add(node.$id.slice(node.$id.lastIndexOf("/") + 1), node);
|
|
54
|
+
for (const key in node) index(node[key]);
|
|
55
|
+
index(node["~cookieFrom"]);
|
|
56
|
+
};
|
|
57
|
+
for (const name in models) add(name, models[name]);
|
|
58
|
+
roots.concat(Object.values(models)).forEach(index);
|
|
59
|
+
return (name) => targets[name] ?? [];
|
|
60
|
+
}
|
|
40
61
|
/**
|
|
41
62
|
* Maps each lifecycle/derive function to the hash of the named plugin it was
|
|
42
63
|
* first registered on. Used by `.use()` to dedup absorbed hooks: if a fn's
|
|
@@ -713,6 +734,7 @@ exports.clonePlainDeep = clonePlainDeep;
|
|
|
713
734
|
exports.coalesceSchemas = coalesceSchemas;
|
|
714
735
|
exports.compactBeforeHandleConflicts = compactBeforeHandleConflicts;
|
|
715
736
|
exports.compactBeforeHandlePrefix = compactBeforeHandlePrefix;
|
|
737
|
+
exports.compositionKeys = compositionKeys;
|
|
716
738
|
exports.constantTimeEqual = constantTimeEqual;
|
|
717
739
|
exports.createErrorEventHandler = createErrorEventHandler;
|
|
718
740
|
exports.deriveEntryFn = deriveEntryFn;
|
|
@@ -756,6 +778,7 @@ exports.nullObject = nullObject;
|
|
|
756
778
|
exports.prefix = prefix;
|
|
757
779
|
exports.pushField = pushField;
|
|
758
780
|
exports.redirect = redirect;
|
|
781
|
+
exports.refTargets = refTargets;
|
|
759
782
|
exports.replaceUrlPath = replaceUrlPath;
|
|
760
783
|
exports.requestId = requestId;
|
|
761
784
|
exports.rootSnapshot = rootSnapshot;
|
package/dist/utils.mjs
CHANGED
|
@@ -36,6 +36,27 @@ function fnv1a(str) {
|
|
|
36
36
|
}
|
|
37
37
|
return hash >>> 0;
|
|
38
38
|
}
|
|
39
|
+
const compositionKeys = Object.freeze([
|
|
40
|
+
"allOf",
|
|
41
|
+
"anyOf",
|
|
42
|
+
"oneOf",
|
|
43
|
+
"~cookieFrom"
|
|
44
|
+
]);
|
|
45
|
+
function refTargets(roots, models = {}) {
|
|
46
|
+
const targets = nullObject();
|
|
47
|
+
const add = (name, schema) => (targets[name] ??= /* @__PURE__ */ new Set()).add(schema);
|
|
48
|
+
const seen = /* @__PURE__ */ new Set();
|
|
49
|
+
const index = (node) => {
|
|
50
|
+
if (!node || typeof node !== "object" || seen.has(node)) return;
|
|
51
|
+
seen.add(node);
|
|
52
|
+
if (typeof node.$id === "string") add(node.$id.slice(node.$id.lastIndexOf("/") + 1), node);
|
|
53
|
+
for (const key in node) index(node[key]);
|
|
54
|
+
index(node["~cookieFrom"]);
|
|
55
|
+
};
|
|
56
|
+
for (const name in models) add(name, models[name]);
|
|
57
|
+
roots.concat(Object.values(models)).forEach(index);
|
|
58
|
+
return (name) => targets[name] ?? [];
|
|
59
|
+
}
|
|
39
60
|
/**
|
|
40
61
|
* Maps each lifecycle/derive function to the hash of the named plugin it was
|
|
41
62
|
* first registered on. Used by `.use()` to dedup absorbed hooks: if a fn's
|
|
@@ -701,4 +722,4 @@ const isSocketQuiet = (socket) => socket.readyState === 3 && !socket.data.inflig
|
|
|
701
722
|
const isHTMLBundle = (value) => Object.prototype.toString.call(value) === "[object HTMLBundle]" || typeof value?.index === "string" && Array.isArray(value.files);
|
|
702
723
|
|
|
703
724
|
//#endregion
|
|
704
|
-
export { ELYSIA_FORM_PROTOTYPE, assignOwn, authorityEnd, bytes, clearFlattenChainMemo, cloneHook, clonePlainDecorators, clonePlainDeep, coalesceSchemas, compactBeforeHandleConflicts, compactBeforeHandlePrefix, constantTimeEqual, createErrorEventHandler, deriveEntryFn, eventProperties, evictOldestHalf, flattenChain, flattenChainMemo, flattenChainMemoReadonly, fnOrigin, fnv1a, form, formToFormData, getLoosePath, guardNonPlainLeaves, hookToGuard, invalidateMacroEpoch, isBlob, isByteStream, isCompactBeforeHandleOnly, isDisposable, isElysiaForm, isEmpty, isHTMLBundle, isLocalScope, isMapDeriveEntry, isNotEmpty, isPlainObject, isRecordNumber, isSingleton, isSocketQuiet, joinPath, macroEpoch, macroOrigin, mapDeriveEntry, markSingletons, mergeArray, mergeDeep, mergeHook, mergeResponse, nullObject, prefix, pushField, redirect, replaceUrlPath, requestId, rootSnapshot, schemaProperties, serializeMacroSeed, sse, sseData, throwLifecycleErrors };
|
|
725
|
+
export { ELYSIA_FORM_PROTOTYPE, assignOwn, authorityEnd, bytes, clearFlattenChainMemo, cloneHook, clonePlainDecorators, clonePlainDeep, coalesceSchemas, compactBeforeHandleConflicts, compactBeforeHandlePrefix, compositionKeys, constantTimeEqual, createErrorEventHandler, deriveEntryFn, eventProperties, evictOldestHalf, flattenChain, flattenChainMemo, flattenChainMemoReadonly, fnOrigin, fnv1a, form, formToFormData, getLoosePath, guardNonPlainLeaves, hookToGuard, invalidateMacroEpoch, isBlob, isByteStream, isCompactBeforeHandleOnly, isDisposable, isElysiaForm, isEmpty, isHTMLBundle, isLocalScope, isMapDeriveEntry, isNotEmpty, isPlainObject, isRecordNumber, isSingleton, isSocketQuiet, joinPath, macroEpoch, macroOrigin, mapDeriveEntry, markSingletons, mergeArray, mergeDeep, mergeHook, mergeResponse, nullObject, prefix, pushField, redirect, refTargets, replaceUrlPath, requestId, rootSnapshot, schemaProperties, serializeMacroSeed, sse, sseData, throwLifecycleErrors };
|
package/dist/ws/route.js
CHANGED
|
@@ -6,9 +6,11 @@ const require_error = require('../error.js');
|
|
|
6
6
|
const require_cookie_crypto = require('../cookie/crypto.js');
|
|
7
7
|
const require_adapter_web_standard_handler = require('../adapter/web-standard/handler.js');
|
|
8
8
|
const require_parse_query = require('../parse-query.js');
|
|
9
|
+
const require_compile_aot = require('../compile/aot.js');
|
|
9
10
|
const require_generation = require('../generation.js');
|
|
10
11
|
const require_cookie_config = require('../cookie/config.js');
|
|
11
12
|
const require_cookie_utils = require('../cookie/utils.js');
|
|
13
|
+
const require_handler_utils = require('../handler/utils.js');
|
|
12
14
|
const require_handler_error = require('../handler/error.js');
|
|
13
15
|
const require_compile_handler_utils = require('../compile/handler/utils.js');
|
|
14
16
|
const require_sucrose = require('../sucrose.js');
|
|
@@ -177,7 +179,21 @@ function buildWSRoute(route, app) {
|
|
|
177
179
|
const inheritedChain = route[6];
|
|
178
180
|
const composed = require_compile_handler_index.composeRouteHook(instance, route[4], appHookChain, inheritedChain, app, route[7]) ?? hook;
|
|
179
181
|
let validators;
|
|
180
|
-
const
|
|
182
|
+
const programId = require_generation.frozenRootOf(app)["~programId"];
|
|
183
|
+
const captured = require_compile_aot.Compiled.getHandler(programId, "WS", route[1]);
|
|
184
|
+
let live = false;
|
|
185
|
+
if (require_compile_aot.Capture.isCapturing()) require_compile_aot.Capture.handler({
|
|
186
|
+
method: "WS",
|
|
187
|
+
path: route[1],
|
|
188
|
+
alias: "",
|
|
189
|
+
code: "",
|
|
190
|
+
k: require_compile_handler_index.routeShape(composed, void 0, app)
|
|
191
|
+
});
|
|
192
|
+
else if (require_compile_aot.Compiled.hasProgram(programId)) {
|
|
193
|
+
const shape = require_compile_handler_index.routeShape(composed, void 0, app);
|
|
194
|
+
live = shape === void 0 || captured?.k !== shape;
|
|
195
|
+
}
|
|
196
|
+
const frozenEager = require_type_bridge.isBridgeLive() || live ? void 0 : require_compile_handler_frozen_validator.buildFrozenRouteValidator(composed, app, "WS", route[1]);
|
|
181
197
|
if (frozenEager) validators = frozenEager;
|
|
182
198
|
else try {
|
|
183
199
|
validators = new require_validator_route.RouteValidator(composed, {
|
|
@@ -186,7 +202,7 @@ function buildWSRoute(route, app) {
|
|
|
186
202
|
normalize: require_generation.frozenRootOf(app)["~config"]?.normalize,
|
|
187
203
|
sanitize: require_generation.frozenRootOf(app)["~config"]?.sanitize,
|
|
188
204
|
schemas: composed.schemas,
|
|
189
|
-
aot: {
|
|
205
|
+
aot: live ? void 0 : {
|
|
190
206
|
method: "WS",
|
|
191
207
|
path: route[1]
|
|
192
208
|
},
|
|
@@ -194,10 +210,12 @@ function buildWSRoute(route, app) {
|
|
|
194
210
|
});
|
|
195
211
|
} catch (error) {
|
|
196
212
|
if (!require_compile_handler_frozen_validator.isBridgeNotInitialized(error)) throw error;
|
|
213
|
+
if (live) throw new Error(require_compile_aot.aotDrift("WS", route[1]), { cause: error });
|
|
197
214
|
const frozen = require_compile_handler_frozen_validator.buildFrozenRouteValidator(composed, app, "WS", route[1]);
|
|
198
215
|
if (!frozen) throw error;
|
|
199
216
|
validators = frozen;
|
|
200
217
|
}
|
|
218
|
+
if (live && captured) require_compile_aot.warnAotDrift("WS", route[1]);
|
|
201
219
|
const responseValidator = validators.response;
|
|
202
220
|
const defaultResponseValidator = responseValidator ? responseValidator[200] ?? responseValidator[Object.keys(responseValidator)[0]] : void 0;
|
|
203
221
|
const cookieIsOptional = !!composed.cookie?.["~optional"];
|
|
@@ -233,9 +251,14 @@ function buildWSRoute(route, app) {
|
|
|
233
251
|
mapResponse: mapResponses,
|
|
234
252
|
afterResponse: afterResponses
|
|
235
253
|
});
|
|
236
|
-
const cookieConfig = validators.cookie || inference.cookie ? require_cookie_config.compileCookieConfig(composed.cookie, require_generation.frozenRootOf(app)["~config"]?.cookie) : void 0;
|
|
254
|
+
const cookieConfig = validators.cookie || inference.cookie ? require_cookie_config.compileCookieConfig(composed.cookie, require_generation.frozenRootOf(app)["~config"]?.cookie, require_generation.frozenRootOf(app)["~ext"]?.models, composed.schemas) : void 0;
|
|
255
|
+
const signCookies = cookieConfig?.hasSign ? (set) => require_cookie_utils.signCookieValues(set.cookie, cookieConfig) : void 0;
|
|
237
256
|
const parseMessage = require_ws_parser.createMessageParser(parseHooks);
|
|
238
|
-
const handleUpgradeError = require_handler_error.createErrorHandler(errorHandlers.length ? errorHandlers : void 0, ((response, set, context) =>
|
|
257
|
+
const handleUpgradeError = require_handler_error.createErrorHandler(errorHandlers.length ? errorHandlers : void 0, ((response, set, context) => {
|
|
258
|
+
const map = () => require_adapter_web_standard_handler.mapResponse(response, set, context?.request);
|
|
259
|
+
const pending = signCookies?.(set);
|
|
260
|
+
return pending ? pending.then(map) : map();
|
|
261
|
+
}), require_generation.frozenRootOf(app)["~config"]?.allowUnsafeValidationDetails);
|
|
239
262
|
async function handleError(ws, error) {
|
|
240
263
|
const errCtx = Object.create(ws);
|
|
241
264
|
errCtx.error = error;
|
|
@@ -422,6 +445,7 @@ function buildWSRoute(route, app) {
|
|
|
422
445
|
else require_utils.assignOwn(context, r);
|
|
423
446
|
} else if (r !== void 0) {
|
|
424
447
|
if (r instanceof Response) return r;
|
|
448
|
+
if (signCookies) await signCookies(context.set);
|
|
425
449
|
return require_adapter_web_standard_handler.mapResponse(r, context.set, context.request);
|
|
426
450
|
}
|
|
427
451
|
}
|
|
@@ -454,7 +478,11 @@ function buildWSRoute(route, app) {
|
|
|
454
478
|
}
|
|
455
479
|
})) return new Response("Expected a websocket connection", { status: 400 });
|
|
456
480
|
} catch (error) {
|
|
457
|
-
|
|
481
|
+
try {
|
|
482
|
+
return await handleUpgradeError(context, error);
|
|
483
|
+
} catch (thrown) {
|
|
484
|
+
return require_handler_utils.finalizeRouteError(app, context, thrown, signCookies);
|
|
485
|
+
}
|
|
458
486
|
}
|
|
459
487
|
};
|
|
460
488
|
const options = require_utils.nullObject();
|
package/dist/ws/route.mjs
CHANGED
|
@@ -5,16 +5,18 @@ import { ElysiaError, ElysiaStatus, ValidationError, elysiaErrorProblem, interna
|
|
|
5
5
|
import { hasSyncHmac } from "../cookie/crypto.mjs";
|
|
6
6
|
import { mapResponse } from "../adapter/web-standard/handler.mjs";
|
|
7
7
|
import { parseQueryFromURL } from "../parse-query.mjs";
|
|
8
|
+
import { Capture, Compiled, aotDrift, warnAotDrift } from "../compile/aot.mjs";
|
|
8
9
|
import { frozenRootOf } from "../generation.mjs";
|
|
9
10
|
import { compileCookieConfig } from "../cookie/config.mjs";
|
|
10
|
-
import { buildCookieJar, parseCookieRaw, parseCookieRawDeferred, parseCookieRawLazy } from "../cookie/utils.mjs";
|
|
11
|
+
import { buildCookieJar, parseCookieRaw, parseCookieRawDeferred, parseCookieRawLazy, signCookieValues } from "../cookie/utils.mjs";
|
|
12
|
+
import { finalizeRouteError } from "../handler/utils.mjs";
|
|
11
13
|
import { adoptErrorType, claimsProblemType, createErrorHandler, readAnnotation, resolveStatus, statusFallbackBody } from "../handler/error.mjs";
|
|
12
14
|
import { deriveModes, getQueryParseChannels, replaceDeriveContext } from "../compile/handler/utils.mjs";
|
|
13
15
|
import { sucrose } from "../sucrose.mjs";
|
|
14
16
|
import { StandardValidator } from "../validator/index.mjs";
|
|
15
17
|
import { RouteValidator } from "../validator/route.mjs";
|
|
16
18
|
import { buildFrozenRouteValidator, isBridgeNotInitialized } from "../compile/handler/frozen-validator.mjs";
|
|
17
|
-
import { composeRouteHook, localMacroRoot, resolveWSLocalHook } from "../compile/handler/index.mjs";
|
|
19
|
+
import { composeRouteHook, localMacroRoot, resolveWSLocalHook, routeShape } from "../compile/handler/index.mjs";
|
|
18
20
|
import { ElysiaWS, isGeneratorObject, trackWSSettling } from "./context.mjs";
|
|
19
21
|
import { createMessageParser } from "./parser.mjs";
|
|
20
22
|
|
|
@@ -176,7 +178,21 @@ function buildWSRoute(route, app) {
|
|
|
176
178
|
const inheritedChain = route[6];
|
|
177
179
|
const composed = composeRouteHook(instance, route[4], appHookChain, inheritedChain, app, route[7]) ?? hook;
|
|
178
180
|
let validators;
|
|
179
|
-
const
|
|
181
|
+
const programId = frozenRootOf(app)["~programId"];
|
|
182
|
+
const captured = Compiled.getHandler(programId, "WS", route[1]);
|
|
183
|
+
let live = false;
|
|
184
|
+
if (Capture.isCapturing()) Capture.handler({
|
|
185
|
+
method: "WS",
|
|
186
|
+
path: route[1],
|
|
187
|
+
alias: "",
|
|
188
|
+
code: "",
|
|
189
|
+
k: routeShape(composed, void 0, app)
|
|
190
|
+
});
|
|
191
|
+
else if (Compiled.hasProgram(programId)) {
|
|
192
|
+
const shape = routeShape(composed, void 0, app);
|
|
193
|
+
live = shape === void 0 || captured?.k !== shape;
|
|
194
|
+
}
|
|
195
|
+
const frozenEager = isBridgeLive() || live ? void 0 : buildFrozenRouteValidator(composed, app, "WS", route[1]);
|
|
180
196
|
if (frozenEager) validators = frozenEager;
|
|
181
197
|
else try {
|
|
182
198
|
validators = new RouteValidator(composed, {
|
|
@@ -185,7 +201,7 @@ function buildWSRoute(route, app) {
|
|
|
185
201
|
normalize: frozenRootOf(app)["~config"]?.normalize,
|
|
186
202
|
sanitize: frozenRootOf(app)["~config"]?.sanitize,
|
|
187
203
|
schemas: composed.schemas,
|
|
188
|
-
aot: {
|
|
204
|
+
aot: live ? void 0 : {
|
|
189
205
|
method: "WS",
|
|
190
206
|
path: route[1]
|
|
191
207
|
},
|
|
@@ -193,10 +209,12 @@ function buildWSRoute(route, app) {
|
|
|
193
209
|
});
|
|
194
210
|
} catch (error) {
|
|
195
211
|
if (!isBridgeNotInitialized(error)) throw error;
|
|
212
|
+
if (live) throw new Error(aotDrift("WS", route[1]), { cause: error });
|
|
196
213
|
const frozen = buildFrozenRouteValidator(composed, app, "WS", route[1]);
|
|
197
214
|
if (!frozen) throw error;
|
|
198
215
|
validators = frozen;
|
|
199
216
|
}
|
|
217
|
+
if (live && captured) warnAotDrift("WS", route[1]);
|
|
200
218
|
const responseValidator = validators.response;
|
|
201
219
|
const defaultResponseValidator = responseValidator ? responseValidator[200] ?? responseValidator[Object.keys(responseValidator)[0]] : void 0;
|
|
202
220
|
const cookieIsOptional = !!composed.cookie?.["~optional"];
|
|
@@ -232,9 +250,14 @@ function buildWSRoute(route, app) {
|
|
|
232
250
|
mapResponse: mapResponses,
|
|
233
251
|
afterResponse: afterResponses
|
|
234
252
|
});
|
|
235
|
-
const cookieConfig = validators.cookie || inference.cookie ? compileCookieConfig(composed.cookie, frozenRootOf(app)["~config"]?.cookie) : void 0;
|
|
253
|
+
const cookieConfig = validators.cookie || inference.cookie ? compileCookieConfig(composed.cookie, frozenRootOf(app)["~config"]?.cookie, frozenRootOf(app)["~ext"]?.models, composed.schemas) : void 0;
|
|
254
|
+
const signCookies = cookieConfig?.hasSign ? (set) => signCookieValues(set.cookie, cookieConfig) : void 0;
|
|
236
255
|
const parseMessage = createMessageParser(parseHooks);
|
|
237
|
-
const handleUpgradeError = createErrorHandler(errorHandlers.length ? errorHandlers : void 0, ((response, set, context) =>
|
|
256
|
+
const handleUpgradeError = createErrorHandler(errorHandlers.length ? errorHandlers : void 0, ((response, set, context) => {
|
|
257
|
+
const map = () => mapResponse(response, set, context?.request);
|
|
258
|
+
const pending = signCookies?.(set);
|
|
259
|
+
return pending ? pending.then(map) : map();
|
|
260
|
+
}), frozenRootOf(app)["~config"]?.allowUnsafeValidationDetails);
|
|
238
261
|
async function handleError(ws, error) {
|
|
239
262
|
const errCtx = Object.create(ws);
|
|
240
263
|
errCtx.error = error;
|
|
@@ -421,6 +444,7 @@ function buildWSRoute(route, app) {
|
|
|
421
444
|
else assignOwn(context, r);
|
|
422
445
|
} else if (r !== void 0) {
|
|
423
446
|
if (r instanceof Response) return r;
|
|
447
|
+
if (signCookies) await signCookies(context.set);
|
|
424
448
|
return mapResponse(r, context.set, context.request);
|
|
425
449
|
}
|
|
426
450
|
}
|
|
@@ -453,7 +477,11 @@ function buildWSRoute(route, app) {
|
|
|
453
477
|
}
|
|
454
478
|
})) return new Response("Expected a websocket connection", { status: 400 });
|
|
455
479
|
} catch (error) {
|
|
456
|
-
|
|
480
|
+
try {
|
|
481
|
+
return await handleUpgradeError(context, error);
|
|
482
|
+
} catch (thrown) {
|
|
483
|
+
return finalizeRouteError(app, context, thrown, signCookies);
|
|
484
|
+
}
|
|
457
485
|
}
|
|
458
486
|
};
|
|
459
487
|
const options = nullObject();
|