@dunx/http 3.2.1 → 3.3.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/dist/{chunk-3nbj06q8.js → chunk-8939brh2.js} +32 -32
- package/dist/chunk-bg0dr54z.js +37 -0
- package/dist/{chunk-3j2n1n11.js → chunk-gmtwad7f.js} +8 -8
- package/dist/client.js +9 -9
- package/dist/index.js +302 -121
- package/dist/internal.js +20 -20
- package/dist/server/application.d.ts +6 -97
- package/dist/server/binding.d.ts +67 -0
- package/dist/server/factory.d.ts +4 -2
- package/dist/server/metrics.d.ts +8 -3
- package/dist/server/options-provider.d.ts +14 -1
- package/dist/server/options.d.ts +141 -0
- package/dist/ws/socket.d.ts +16 -0
- package/package.json +4 -4
- package/dist/chunk-sz4pvqxy.js +0 -108
|
@@ -1,12 +1,12 @@
|
|
|
1
1
|
// @bun
|
|
2
2
|
import {
|
|
3
|
-
|
|
4
|
-
} from "./chunk-
|
|
3
|
+
HttpStatusCode2
|
|
4
|
+
} from "./chunk-bg0dr54z.js";
|
|
5
5
|
|
|
6
6
|
// src/route/marker.ts
|
|
7
7
|
var ROUTE = Symbol.for("dunx.route");
|
|
8
8
|
var CONTROLLER = Symbol.for("dunx.controller");
|
|
9
|
-
var
|
|
9
|
+
var defaultStatusFor2 = (method) => method === "POST" ? HttpStatusCode2.CREATED : HttpStatusCode2.OK;
|
|
10
10
|
var resolvePath = (path) => typeof path === "function" ? path() : path;
|
|
11
11
|
var markRoute = (target, meta) => {
|
|
12
12
|
Object.defineProperty(target, ROUTE, { value: meta, configurable: true });
|
|
@@ -23,7 +23,7 @@ var prefixOf = (target) => target[CONTROLLER] ?? "";
|
|
|
23
23
|
// src/route/metadata.ts
|
|
24
24
|
var META = Symbol.for("dunx.meta");
|
|
25
25
|
var GUARDS = Symbol.for("dunx.guards");
|
|
26
|
-
var
|
|
26
|
+
var metaKey2 = (name) => ({
|
|
27
27
|
name,
|
|
28
28
|
id: Symbol(name)
|
|
29
29
|
});
|
|
@@ -32,18 +32,18 @@ var write = (target, key, value) => {
|
|
|
32
32
|
record.set(key.id, value);
|
|
33
33
|
Object.defineProperty(target, META, { value: record, configurable: true });
|
|
34
34
|
};
|
|
35
|
-
var
|
|
35
|
+
var meta2 = (key, value) => (target) => {
|
|
36
36
|
write(target, key, value);
|
|
37
37
|
return target;
|
|
38
38
|
};
|
|
39
|
-
var
|
|
40
|
-
var
|
|
41
|
-
var
|
|
42
|
-
var
|
|
43
|
-
var
|
|
44
|
-
var
|
|
45
|
-
var
|
|
46
|
-
var
|
|
39
|
+
var ROLES2 = metaKey2("roles");
|
|
40
|
+
var PUBLIC2 = metaKey2("public");
|
|
41
|
+
var HIDDEN2 = metaKey2("hidden");
|
|
42
|
+
var UNMATCHED2 = metaKey2("unmatched");
|
|
43
|
+
var Roles2 = (...roles) => meta2(ROLES2, roles);
|
|
44
|
+
var Public2 = () => meta2(PUBLIC2, true);
|
|
45
|
+
var ApiHidden2 = () => meta2(HIDDEN2, true);
|
|
46
|
+
var UseGuards2 = (...guards) => (target) => {
|
|
47
47
|
const existing = target[GUARDS] ?? [];
|
|
48
48
|
const merged = Object.hasOwn(target, GUARDS) ? [...guards, ...existing] : [...existing, ...guards];
|
|
49
49
|
Object.defineProperty(target, GUARDS, {
|
|
@@ -53,8 +53,8 @@ var UseGuards = (...guards) => (target) => {
|
|
|
53
53
|
return target;
|
|
54
54
|
};
|
|
55
55
|
var guardsOf = (target) => target[GUARDS] ?? [];
|
|
56
|
-
var
|
|
57
|
-
var
|
|
56
|
+
var metaOf2 = (target) => target[META];
|
|
57
|
+
var mergeMeta2 = (...targets) => {
|
|
58
58
|
const merged = new Map;
|
|
59
59
|
for (const target of targets) {
|
|
60
60
|
const record = target[META];
|
|
@@ -67,24 +67,24 @@ var mergeMeta = (...targets) => {
|
|
|
67
67
|
|
|
68
68
|
// src/route/discover.ts
|
|
69
69
|
import { markedMethods } from "@dunx/core";
|
|
70
|
-
var
|
|
70
|
+
var joinPath2 = (prefix, path) => {
|
|
71
71
|
const joined = `/${prefix}/${path}`.replace(/\/{2,}/g, "/");
|
|
72
72
|
return joined.length > 1 ? joined.replace(/\/$/, "") : "/";
|
|
73
73
|
};
|
|
74
|
-
var
|
|
74
|
+
var discoverRoutes2 = (instance) => {
|
|
75
75
|
const klass = instance.constructor;
|
|
76
76
|
const prefix = prefixOf(klass);
|
|
77
77
|
const classGuards = guardsOf(klass);
|
|
78
78
|
const members = instance;
|
|
79
|
-
return markedMethods(Object.getPrototypeOf(instance), routeMetaOf).map(({ name, meta
|
|
80
|
-
method:
|
|
81
|
-
path:
|
|
79
|
+
return markedMethods(Object.getPrototypeOf(instance), routeMetaOf).map(({ name, meta, value: marked }) => ({
|
|
80
|
+
method: meta.method,
|
|
81
|
+
path: joinPath2(prefix, resolvePath(meta.path)),
|
|
82
82
|
controller: klass.name,
|
|
83
83
|
handlerName: name,
|
|
84
84
|
handler: members[name].bind(instance),
|
|
85
|
-
options:
|
|
86
|
-
meta:
|
|
87
|
-
classMeta:
|
|
85
|
+
options: meta.options,
|
|
86
|
+
meta: mergeMeta2(klass, marked),
|
|
87
|
+
classMeta: metaOf2(klass),
|
|
88
88
|
guards: [...classGuards, ...guardsOf(marked)]
|
|
89
89
|
}));
|
|
90
90
|
};
|
|
@@ -101,19 +101,19 @@ var HandlerKind = Object.freeze({
|
|
|
101
101
|
PING: "ping",
|
|
102
102
|
PONG: "pong"
|
|
103
103
|
});
|
|
104
|
-
var markHandler = (target,
|
|
105
|
-
Object.defineProperty(target, HANDLER, { value:
|
|
104
|
+
var markHandler = (target, meta) => {
|
|
105
|
+
Object.defineProperty(target, HANDLER, { value: meta, configurable: true });
|
|
106
106
|
};
|
|
107
107
|
var handlerMetaOf = (value) => typeof value === "function" ? value[HANDLER] : undefined;
|
|
108
108
|
var markGateway = (target, path) => {
|
|
109
109
|
Object.defineProperty(target, GATEWAY, { value: path, configurable: true });
|
|
110
110
|
};
|
|
111
111
|
var gatewayPathOf = (target) => target[GATEWAY] ?? "/";
|
|
112
|
-
var
|
|
112
|
+
var isGateway2 = (target) => target[GATEWAY] !== undefined;
|
|
113
113
|
|
|
114
114
|
// src/server/context.ts
|
|
115
115
|
var EMPTY = new Map;
|
|
116
|
-
var
|
|
116
|
+
var buildContext2 = (route) => {
|
|
117
117
|
const record = route.meta ?? EMPTY;
|
|
118
118
|
return Object.freeze({
|
|
119
119
|
controller: route.controller,
|
|
@@ -142,9 +142,9 @@ var discoverGateway = (instance) => {
|
|
|
142
142
|
return {
|
|
143
143
|
name: klass.name,
|
|
144
144
|
path: normalizePath(gatewayPathOf(klass)),
|
|
145
|
-
handlers: eachHandler(Object.getPrototypeOf(instance)).map(({ name, meta
|
|
146
|
-
kind:
|
|
147
|
-
event:
|
|
145
|
+
handlers: eachHandler(Object.getPrototypeOf(instance)).map(({ name, meta }) => ({
|
|
146
|
+
kind: meta.kind,
|
|
147
|
+
event: meta.event,
|
|
148
148
|
method: name,
|
|
149
149
|
invoke: members[name].bind(instance)
|
|
150
150
|
}))
|
|
@@ -158,7 +158,7 @@ var discoverGateways = (modules, resolve) => {
|
|
|
158
158
|
const candidate = classOf(entry);
|
|
159
159
|
if (!candidate)
|
|
160
160
|
continue;
|
|
161
|
-
if (
|
|
161
|
+
if (isGateway2(candidate.ctor)) {
|
|
162
162
|
discovered.push(discoverGateway(resolve(candidate.token)));
|
|
163
163
|
continue;
|
|
164
164
|
}
|
|
@@ -171,4 +171,4 @@ var discoverGateways = (modules, resolve) => {
|
|
|
171
171
|
return discovered;
|
|
172
172
|
};
|
|
173
173
|
|
|
174
|
-
export {
|
|
174
|
+
export { defaultStatusFor2, markRoute, markController, metaKey2, meta2, ROLES2, PUBLIC2, HIDDEN2, UNMATCHED2, Roles2, Public2, ApiHidden2, UseGuards2, metaOf2, mergeMeta2, joinPath2, discoverRoutes2, HandlerKind, markHandler, markGateway, isGateway2, discoverGateway, discoverGateways, buildContext2 };
|
|
@@ -0,0 +1,37 @@
|
|
|
1
|
+
// @bun
|
|
2
|
+
// src/server/status.ts
|
|
3
|
+
var HttpStatusCode2 = Object.freeze({
|
|
4
|
+
OK: 200,
|
|
5
|
+
CREATED: 201,
|
|
6
|
+
ACCEPTED: 202,
|
|
7
|
+
NO_CONTENT: 204,
|
|
8
|
+
MOVED_PERMANENTLY: 301,
|
|
9
|
+
FOUND: 302,
|
|
10
|
+
NOT_MODIFIED: 304,
|
|
11
|
+
TEMPORARY_REDIRECT: 307,
|
|
12
|
+
PERMANENT_REDIRECT: 308,
|
|
13
|
+
BAD_REQUEST: 400,
|
|
14
|
+
UNAUTHORIZED: 401,
|
|
15
|
+
PAYMENT_REQUIRED: 402,
|
|
16
|
+
FORBIDDEN: 403,
|
|
17
|
+
NOT_FOUND: 404,
|
|
18
|
+
METHOD_NOT_ALLOWED: 405,
|
|
19
|
+
NOT_ACCEPTABLE: 406,
|
|
20
|
+
REQUEST_TIMEOUT: 408,
|
|
21
|
+
CONFLICT: 409,
|
|
22
|
+
GONE: 410,
|
|
23
|
+
PRECONDITION_FAILED: 412,
|
|
24
|
+
PAYLOAD_TOO_LARGE: 413,
|
|
25
|
+
URI_TOO_LONG: 414,
|
|
26
|
+
UNSUPPORTED_MEDIA_TYPE: 415,
|
|
27
|
+
IM_A_TEAPOT: 418,
|
|
28
|
+
UNPROCESSABLE_ENTITY: 422,
|
|
29
|
+
TOO_MANY_REQUESTS: 429,
|
|
30
|
+
INTERNAL_SERVER_ERROR: 500,
|
|
31
|
+
NOT_IMPLEMENTED: 501,
|
|
32
|
+
BAD_GATEWAY: 502,
|
|
33
|
+
SERVICE_UNAVAILABLE: 503,
|
|
34
|
+
GATEWAY_TIMEOUT: 504
|
|
35
|
+
});
|
|
36
|
+
|
|
37
|
+
export { HttpStatusCode2 };
|
|
@@ -1,8 +1,8 @@
|
|
|
1
1
|
// @bun
|
|
2
2
|
// src/server/trace-context.ts
|
|
3
|
-
var
|
|
4
|
-
var
|
|
5
|
-
var
|
|
3
|
+
var TRACEPARENT_HEADER2 = "traceparent";
|
|
4
|
+
var TRACESTATE_HEADER2 = "tracestate";
|
|
5
|
+
var TRACERESPONSE_HEADER2 = "traceresponse";
|
|
6
6
|
var HEX_32 = /^[0-9a-f]{32}$/;
|
|
7
7
|
var HEX_16 = /^[0-9a-f]{16}$/;
|
|
8
8
|
var HEX_2 = /^[0-9a-f]{2}$/;
|
|
@@ -14,10 +14,10 @@ var TRACE = Symbol.for("dunx.http.trace");
|
|
|
14
14
|
var EXPOSE = Symbol.for("dunx.http.trace.expose");
|
|
15
15
|
var mint = (bytes) => crypto.getRandomValues(new Uint8Array(bytes)).toHex();
|
|
16
16
|
|
|
17
|
-
class
|
|
17
|
+
class TraceContext2 {
|
|
18
18
|
static adopt(req, expose = true) {
|
|
19
|
-
const inbound =
|
|
20
|
-
const state = req.headers.get(
|
|
19
|
+
const inbound = TraceContext2.#parse(req.headers.get(TRACEPARENT_HEADER2));
|
|
20
|
+
const state = req.headers.get(TRACESTATE_HEADER2);
|
|
21
21
|
const trace = inbound === undefined ? { traceId: mint(16), spanId: mint(8), flags: DEFAULT_FLAGS } : {
|
|
22
22
|
traceId: inbound.traceId,
|
|
23
23
|
spanId: mint(8),
|
|
@@ -40,7 +40,7 @@ class TraceContext {
|
|
|
40
40
|
const traced = req;
|
|
41
41
|
const trace = traced[TRACE];
|
|
42
42
|
if (trace !== undefined && traced[EXPOSE] === true) {
|
|
43
|
-
response.headers.set(
|
|
43
|
+
response.headers.set(TRACERESPONSE_HEADER2, TraceContext2.header(trace));
|
|
44
44
|
}
|
|
45
45
|
return response;
|
|
46
46
|
}
|
|
@@ -68,4 +68,4 @@ class TraceContext {
|
|
|
68
68
|
}
|
|
69
69
|
}
|
|
70
70
|
|
|
71
|
-
export {
|
|
71
|
+
export { TRACEPARENT_HEADER2, TRACESTATE_HEADER2, TRACERESPONSE_HEADER2, TraceContext2 };
|
package/dist/client.js
CHANGED
|
@@ -1,12 +1,12 @@
|
|
|
1
1
|
// @bun
|
|
2
2
|
import {
|
|
3
|
-
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
} from "./chunk-
|
|
3
|
+
TRACEPARENT_HEADER2,
|
|
4
|
+
TRACESTATE_HEADER2,
|
|
5
|
+
TraceContext2
|
|
6
|
+
} from "./chunk-gmtwad7f.js";
|
|
7
7
|
import {
|
|
8
|
-
|
|
9
|
-
} from "./chunk-
|
|
8
|
+
HttpStatusCode2
|
|
9
|
+
} from "./chunk-bg0dr54z.js";
|
|
10
10
|
|
|
11
11
|
// src/client/errors.ts
|
|
12
12
|
import { AppError } from "@dunx/core";
|
|
@@ -120,7 +120,7 @@ var retryAfterMs = (headers, now = Date.now()) => {
|
|
|
120
120
|
const at = Date.parse(header);
|
|
121
121
|
return Number.isNaN(at) ? undefined : Math.max(0, at - now);
|
|
122
122
|
};
|
|
123
|
-
var isRetryableStatus = (status) => status >=
|
|
123
|
+
var isRetryableStatus = (status) => status >= HttpStatusCode2.INTERNAL_SERVER_ERROR || status === HttpStatusCode2.REQUEST_TIMEOUT || status === HttpStatusCode2.TOO_MANY_REQUESTS;
|
|
124
124
|
var decide = (error, attempt, options) => {
|
|
125
125
|
const {
|
|
126
126
|
retryDelayMs = 1000,
|
|
@@ -330,12 +330,12 @@ class HttpService extends UrlHelper {
|
|
|
330
330
|
...serialised === "" ? {} : { "content-type": "application/json" },
|
|
331
331
|
...this.options.headers,
|
|
332
332
|
...typeof trace?.traceId === "string" && typeof trace.spanId === "string" ? {
|
|
333
|
-
[
|
|
333
|
+
[TRACEPARENT_HEADER2]: TraceContext2.header({
|
|
334
334
|
traceId: trace.traceId,
|
|
335
335
|
spanId: trace.spanId,
|
|
336
336
|
flags: typeof trace.traceFlags === "string" ? trace.traceFlags : "01"
|
|
337
337
|
}),
|
|
338
|
-
...typeof trace.traceState === "string" ? { [
|
|
338
|
+
...typeof trace.traceState === "string" ? { [TRACESTATE_HEADER2]: trace.traceState } : {}
|
|
339
339
|
} : {},
|
|
340
340
|
...config.headerFactory?.({
|
|
341
341
|
timestamp: Math.floor(Date.now() / 1000),
|