@c9up/ream 0.2.29 → 0.2.30
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +5 -6
- package/dist/Codemods.d.ts +8 -0
- package/dist/Codemods.d.ts.map +1 -1
- package/dist/Codemods.js +29 -1
- package/dist/Codemods.js.map +1 -1
- package/dist/HttpKernel.d.ts.map +1 -1
- package/dist/HttpKernel.js +17 -5
- package/dist/HttpKernel.js.map +1 -1
- package/dist/Ignitor.d.ts +5 -0
- package/dist/Ignitor.d.ts.map +1 -1
- package/dist/Ignitor.js +12 -1
- package/dist/Ignitor.js.map +1 -1
- package/dist/bodyparser/BodyParserMiddleware.d.ts +4 -4
- package/dist/bodyparser/BodyParserMiddleware.d.ts.map +1 -1
- package/dist/bodyparser/BodyParserMiddleware.js +38 -11
- package/dist/bodyparser/BodyParserMiddleware.js.map +1 -1
- package/dist/bodyparser/MultipartFile.d.ts +21 -15
- package/dist/bodyparser/MultipartFile.d.ts.map +1 -1
- package/dist/bodyparser/MultipartFile.js +40 -58
- package/dist/bodyparser/MultipartFile.js.map +1 -1
- package/dist/bodyparser/parseSize.d.ts +7 -4
- package/dist/bodyparser/parseSize.d.ts.map +1 -1
- package/dist/bodyparser/parseSize.js +12 -17
- package/dist/bodyparser/parseSize.js.map +1 -1
- package/dist/bodyparser/qsParse.d.ts +10 -0
- package/dist/bodyparser/qsParse.d.ts.map +1 -1
- package/dist/bodyparser/qsParse.js +27 -12
- package/dist/bodyparser/qsParse.js.map +1 -1
- package/dist/console/prompts.d.ts.map +1 -1
- package/dist/console/prompts.js +3 -1
- package/dist/console/prompts.js.map +1 -1
- package/dist/container/Container.d.ts.map +1 -1
- package/dist/container/Container.js +61 -71
- package/dist/container/Container.js.map +1 -1
- package/dist/events/Emitter.d.ts +12 -0
- package/dist/events/Emitter.d.ts.map +1 -1
- package/dist/events/Emitter.js +36 -9
- package/dist/events/Emitter.js.map +1 -1
- package/dist/events/helix/helpers.d.ts.map +1 -1
- package/dist/events/helix/helpers.js +19 -9
- package/dist/events/helix/helpers.js.map +1 -1
- package/dist/graphql/GraphQLEngine.d.ts +8 -0
- package/dist/graphql/GraphQLEngine.d.ts.map +1 -1
- package/dist/graphql/GraphQLEngine.js +77 -11
- package/dist/graphql/GraphQLEngine.js.map +1 -1
- package/dist/helpers/MessageBuilder.d.ts +4 -2
- package/dist/helpers/MessageBuilder.d.ts.map +1 -1
- package/dist/helpers/MessageBuilder.js +4 -2
- package/dist/helpers/MessageBuilder.js.map +1 -1
- package/dist/helpers/errors.d.ts +11 -0
- package/dist/helpers/errors.d.ts.map +1 -0
- package/dist/helpers/errors.js +17 -0
- package/dist/helpers/errors.js.map +1 -0
- package/dist/helpers/napi-loader.d.ts.map +1 -1
- package/dist/helpers/napi-loader.js +3 -2
- package/dist/helpers/napi-loader.js.map +1 -1
- package/dist/http/HttpContext.d.ts +20 -2
- package/dist/http/HttpContext.d.ts.map +1 -1
- package/dist/http/HttpContext.js +10 -4
- package/dist/http/HttpContext.js.map +1 -1
- package/dist/http/RedirectBuilder.d.ts.map +1 -1
- package/dist/http/RedirectBuilder.js +4 -0
- package/dist/http/RedirectBuilder.js.map +1 -1
- package/dist/http/Request.d.ts.map +1 -1
- package/dist/http/Request.js +15 -29
- package/dist/http/Request.js.map +1 -1
- package/dist/http/Response.d.ts +7 -4
- package/dist/http/Response.d.ts.map +1 -1
- package/dist/http/Response.js +14 -6
- package/dist/http/Response.js.map +1 -1
- package/dist/http/permissions.d.ts +14 -8
- package/dist/http/permissions.d.ts.map +1 -1
- package/dist/http/permissions.js +26 -16
- package/dist/http/permissions.js.map +1 -1
- package/dist/index.d.ts +2 -2
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +1 -1
- package/dist/index.js.map +1 -1
- package/dist/middleware/Pipeline.js +1 -1
- package/dist/middleware/Pipeline.js.map +1 -1
- package/dist/native/generated.d.ts +16 -30
- package/dist/native/generated.d.ts.map +1 -1
- package/dist/profiler/Profiler.d.ts.map +1 -1
- package/dist/profiler/Profiler.js +4 -1
- package/dist/profiler/Profiler.js.map +1 -1
- package/dist/profiler/client.generated.d.ts +5 -0
- package/dist/profiler/client.generated.d.ts.map +1 -0
- package/dist/profiler/client.generated.js +6 -0
- package/dist/profiler/client.generated.js.map +1 -0
- package/dist/profiler/collectors.d.ts +92 -13
- package/dist/profiler/collectors.d.ts.map +1 -1
- package/dist/profiler/collectors.js +106 -19
- package/dist/profiler/collectors.js.map +1 -1
- package/dist/profiler/endpoint.d.ts +2 -1
- package/dist/profiler/endpoint.d.ts.map +1 -1
- package/dist/profiler/endpoint.js +25 -1
- package/dist/profiler/endpoint.js.map +1 -1
- package/dist/profiler/index.d.ts +8 -4
- package/dist/profiler/index.d.ts.map +1 -1
- package/dist/profiler/index.js +11 -4
- package/dist/profiler/index.js.map +1 -1
- package/dist/profiler/middleware.d.ts.map +1 -1
- package/dist/profiler/middleware.js +76 -10
- package/dist/profiler/middleware.js.map +1 -1
- package/dist/profiler/preview.d.ts +17 -0
- package/dist/profiler/preview.d.ts.map +1 -0
- package/dist/profiler/preview.js +100 -0
- package/dist/profiler/preview.js.map +1 -0
- package/dist/profiler/toolbar.d.ts +15 -23
- package/dist/profiler/toolbar.d.ts.map +1 -1
- package/dist/profiler/toolbar.js +25 -91
- package/dist/profiler/toolbar.js.map +1 -1
- package/dist/profiler/types.d.ts +6 -1
- package/dist/profiler/types.d.ts.map +1 -1
- package/dist/router/Router.d.ts +6 -0
- package/dist/router/Router.d.ts.map +1 -1
- package/dist/router/Router.js +115 -12
- package/dist/router/Router.js.map +1 -1
- package/dist/rpc/RpcRouter.js +3 -3
- package/dist/rpc/RpcRouter.js.map +1 -1
- package/dist/scheduler/Scheduler.js +1 -1
- package/dist/scheduler/Scheduler.js.map +1 -1
- package/dist/security/CookieSigner.d.ts.map +1 -1
- package/dist/security/CookieSigner.js +15 -5
- package/dist/security/CookieSigner.js.map +1 -1
- package/dist/security/SignedUrl.d.ts.map +1 -1
- package/dist/security/SignedUrl.js +10 -18
- package/dist/security/SignedUrl.js.map +1 -1
- package/dist/server/Server.d.ts +4 -1
- package/dist/server/Server.d.ts.map +1 -1
- package/dist/server/Server.js.map +1 -1
- package/dist/server/nativeLimits.d.ts +9 -1
- package/dist/server/nativeLimits.d.ts.map +1 -1
- package/dist/server/nativeLimits.js +8 -0
- package/dist/server/nativeLimits.js.map +1 -1
- package/dist/session/Session.d.ts.map +1 -1
- package/dist/session/Session.js +13 -4
- package/dist/session/Session.js.map +1 -1
- package/dist/session/drivers/MemoryDriver.d.ts.map +1 -1
- package/dist/session/drivers/MemoryDriver.js +14 -2
- package/dist/session/drivers/MemoryDriver.js.map +1 -1
- package/dist/storage/StaticMiddleware.d.ts.map +1 -1
- package/dist/storage/StaticMiddleware.js +20 -9
- package/dist/storage/StaticMiddleware.js.map +1 -1
- package/dist/testing/ApiResponse.d.ts.map +1 -1
- package/dist/testing/ApiResponse.js +7 -1
- package/dist/testing/ApiResponse.js.map +1 -1
- package/dist/testing/TestClient.d.ts.map +1 -1
- package/dist/testing/TestClient.js +16 -4
- package/dist/testing/TestClient.js.map +1 -1
- package/dist/utils/Macroable.d.ts +1 -1
- package/dist/utils/Macroable.js +2 -2
- package/dist/utils/Macroable.js.map +1 -1
- package/events.darwin-arm64.node +0 -0
- package/events.darwin-x64.node +0 -0
- package/events.linux-arm64-gnu.node +0 -0
- package/events.linux-x64-gnu.node +0 -0
- package/events.win32-x64-msvc.node +0 -0
- package/index.darwin-arm64.node +0 -0
- package/index.darwin-x64.node +0 -0
- package/index.linux-arm64-gnu.node +0 -0
- package/index.linux-x64-gnu.node +0 -0
- package/index.win32-x64-msvc.node +0 -0
- package/package.json +1 -2
- package/scheduler.darwin-arm64.node +0 -0
- package/scheduler.darwin-x64.node +0 -0
- package/scheduler.linux-arm64-gnu.node +0 -0
- package/scheduler.linux-x64-gnu.node +0 -0
- package/scheduler.win32-x64-msvc.node +0 -0
- package/src/Codemods.ts +49 -3
- package/src/HttpKernel.ts +18 -7
- package/src/Ignitor.ts +21 -4
- package/src/bodyparser/BodyParserMiddleware.ts +42 -16
- package/src/bodyparser/MultipartFile.ts +46 -67
- package/src/bodyparser/parseSize.ts +17 -17
- package/src/bodyparser/qsParse.ts +28 -13
- package/src/console/prompts.ts +3 -1
- package/src/container/Container.ts +97 -81
- package/src/events/Emitter.ts +37 -10
- package/src/events/helix/helpers.ts +24 -19
- package/src/graphql/GraphQLEngine.ts +89 -13
- package/src/helpers/MessageBuilder.ts +4 -2
- package/src/helpers/errors.ts +16 -0
- package/src/helpers/napi-loader.ts +3 -2
- package/src/http/HttpContext.ts +20 -4
- package/src/http/RedirectBuilder.ts +3 -0
- package/src/http/Request.ts +15 -29
- package/src/http/Response.ts +15 -7
- package/src/http/permissions.ts +31 -15
- package/src/index.ts +2 -1
- package/src/middleware/Pipeline.ts +1 -1
- package/src/native/generated.ts +18 -42
- package/src/profiler/Profiler.ts +4 -1
- package/src/profiler/client/toolbar.css +595 -0
- package/src/profiler/client/toolbar.js +1299 -0
- package/src/profiler/client.generated.ts +7 -0
- package/src/profiler/collectors.ts +156 -19
- package/src/profiler/endpoint.ts +27 -1
- package/src/profiler/index.ts +17 -3
- package/src/profiler/middleware.ts +74 -9
- package/src/profiler/preview.ts +104 -0
- package/src/profiler/toolbar.ts +28 -91
- package/src/profiler/types.ts +6 -1
- package/src/router/Router.ts +136 -13
- package/src/rpc/RpcRouter.ts +4 -4
- package/src/scheduler/Scheduler.ts +1 -1
- package/src/security/CookieSigner.ts +13 -5
- package/src/security/SignedUrl.ts +12 -16
- package/src/server/Server.ts +4 -1
- package/src/server/nativeLimits.ts +18 -1
- package/src/session/Session.ts +13 -4
- package/src/session/drivers/MemoryDriver.ts +15 -2
- package/src/storage/StaticMiddleware.ts +18 -9
- package/src/testing/ApiResponse.ts +7 -1
- package/src/testing/TestClient.ts +14 -5
- package/src/utils/Macroable.ts +2 -2
- package/scripts/build-napi-types.mjs +0 -69
- package/scripts/copy-napi.mjs +0 -121
- package/scripts/generate-mime.mjs +0 -119
- package/scripts/generate-napi-types.mjs +0 -187
|
@@ -11,14 +11,19 @@
|
|
|
11
11
|
* `db:query`, which is the shape atlas documents for bridging its own registry
|
|
12
12
|
* (`onDbQuery((event) => emitter.emit('db:query', event))`). A project on
|
|
13
13
|
* another data layer emits the same event and gets the same panel.
|
|
14
|
+
*
|
|
15
|
+
* Every entry is stamped with `at`, milliseconds since the request arrived, so
|
|
16
|
+
* the bar can lay queries, log lines and events out on one timeline.
|
|
14
17
|
*/
|
|
15
|
-
import type { CollectedData, ProfilerCollector } from './types.js';
|
|
18
|
+
import type { CollectedData, CollectionScope, ProfilerCollector } from './types.js';
|
|
16
19
|
/** One SQL statement, as the panel shows it. */
|
|
17
20
|
export interface RecordedQuery {
|
|
18
21
|
sql: string;
|
|
19
22
|
bindings: readonly unknown[];
|
|
20
23
|
/** Milliseconds. */
|
|
21
24
|
duration: number;
|
|
25
|
+
/** When it started, milliseconds since the request arrived. */
|
|
26
|
+
at: number;
|
|
22
27
|
connection?: string;
|
|
23
28
|
model?: string;
|
|
24
29
|
method?: string;
|
|
@@ -32,16 +37,41 @@ export interface QueryEventSource {
|
|
|
32
37
|
}
|
|
33
38
|
export declare function databaseCollector(events: QueryEventSource, read: () => QueryBag | undefined): ProfilerCollector<QueryBag>;
|
|
34
39
|
export interface QueryBag {
|
|
40
|
+
scope: CollectionScope;
|
|
35
41
|
total: number;
|
|
42
|
+
failed: number;
|
|
36
43
|
duration: number;
|
|
37
44
|
queries: RecordedQuery[];
|
|
38
45
|
}
|
|
39
|
-
/**
|
|
46
|
+
/**
|
|
47
|
+
* The request and what it answered.
|
|
48
|
+
*
|
|
49
|
+
* Filled by the profiling middleware once the handler has run — routing, the
|
|
50
|
+
* session and the user are only known then. Every value that came from the
|
|
51
|
+
* client goes through {@link preview}, which caps it and hides secrets.
|
|
52
|
+
*/
|
|
40
53
|
export declare function requestCollector(): ProfilerCollector<RequestBag>;
|
|
41
54
|
export interface RequestBag {
|
|
42
55
|
route?: string;
|
|
56
|
+
pattern?: string;
|
|
43
57
|
controller?: string;
|
|
44
58
|
userId?: string;
|
|
59
|
+
user?: unknown;
|
|
60
|
+
path?: string;
|
|
61
|
+
ip?: string;
|
|
62
|
+
requestId?: string;
|
|
63
|
+
ajax?: boolean;
|
|
64
|
+
params?: unknown;
|
|
65
|
+
query?: unknown;
|
|
66
|
+
body?: unknown;
|
|
67
|
+
headers?: unknown;
|
|
68
|
+
cookies?: string[];
|
|
69
|
+
session?: unknown;
|
|
70
|
+
response?: {
|
|
71
|
+
status: number;
|
|
72
|
+
contentType?: string;
|
|
73
|
+
headers: unknown;
|
|
74
|
+
};
|
|
45
75
|
}
|
|
46
76
|
/**
|
|
47
77
|
* What went wrong, if anything.
|
|
@@ -70,36 +100,85 @@ export interface ExceptionBag {
|
|
|
70
100
|
export declare function logCollector(events: LogEventSource, read: () => LogBag | undefined): {
|
|
71
101
|
name: string;
|
|
72
102
|
badge: (data: CollectedData) => string | undefined;
|
|
73
|
-
start: () => {
|
|
103
|
+
start: (scope: CollectionScope) => {
|
|
104
|
+
scope: CollectionScope;
|
|
74
105
|
total: number;
|
|
106
|
+
errors: number;
|
|
107
|
+
warnings: number;
|
|
75
108
|
lines: never[];
|
|
76
109
|
};
|
|
77
110
|
finish: (bag: LogBag) => {
|
|
78
111
|
total?: undefined;
|
|
112
|
+
errors?: undefined;
|
|
113
|
+
warnings?: undefined;
|
|
79
114
|
lines?: undefined;
|
|
80
115
|
} | {
|
|
81
116
|
total: number;
|
|
82
|
-
|
|
83
|
-
|
|
84
|
-
|
|
85
|
-
time?: string;
|
|
86
|
-
}[];
|
|
117
|
+
errors: number;
|
|
118
|
+
warnings: number;
|
|
119
|
+
lines: LogLine[];
|
|
87
120
|
};
|
|
88
121
|
};
|
|
89
122
|
/** What the emitter must give the log collector. Structural, as above. */
|
|
90
123
|
export interface LogEventSource {
|
|
91
124
|
on(event: string, listener: (payload: unknown) => void): unknown;
|
|
92
125
|
}
|
|
126
|
+
export interface LogLine {
|
|
127
|
+
level: string;
|
|
128
|
+
message: string;
|
|
129
|
+
time?: string;
|
|
130
|
+
/** Milliseconds since the request arrived. */
|
|
131
|
+
at: number;
|
|
132
|
+
context?: unknown;
|
|
133
|
+
}
|
|
93
134
|
export interface LogBag {
|
|
135
|
+
scope: CollectionScope;
|
|
94
136
|
total: number;
|
|
95
|
-
|
|
96
|
-
|
|
97
|
-
|
|
98
|
-
|
|
137
|
+
errors: number;
|
|
138
|
+
warnings: number;
|
|
139
|
+
lines: LogLine[];
|
|
140
|
+
}
|
|
141
|
+
/**
|
|
142
|
+
* Every event the application emitted while the request ran — cache hits,
|
|
143
|
+
* mail sent, authorisation checks, the application's own domain events.
|
|
144
|
+
*
|
|
145
|
+
* It reads them through the emitter's `tap`, which runs in the emitting code's
|
|
146
|
+
* async context. `onAny` would not do: it is delivered through the native bus,
|
|
147
|
+
* later and outside the request. Queries and log lines are left out: they have
|
|
148
|
+
* their own panels.
|
|
149
|
+
*/
|
|
150
|
+
export declare function eventsCollector(source: EventTapSource, read: () => EventBag | undefined): ProfilerCollector<EventBag>;
|
|
151
|
+
/** What the emitter must give the events collector. Structural. */
|
|
152
|
+
export interface EventTapSource {
|
|
153
|
+
tap(observer: (event: string, data: unknown) => void): unknown;
|
|
154
|
+
}
|
|
155
|
+
export interface EventBag {
|
|
156
|
+
scope: CollectionScope;
|
|
157
|
+
total: number;
|
|
158
|
+
events: Array<{
|
|
159
|
+
name: string;
|
|
160
|
+
at: number;
|
|
161
|
+
data: unknown;
|
|
99
162
|
}>;
|
|
100
163
|
}
|
|
101
|
-
/**
|
|
164
|
+
/** Heap and resident memory once the request is answered. */
|
|
102
165
|
export declare function memoryCollector(): ProfilerCollector<{
|
|
103
166
|
start: number;
|
|
104
167
|
}>;
|
|
168
|
+
/** The application and the runtime it answered on: the bar's right-hand item. */
|
|
169
|
+
export declare function appCollector(info?: {
|
|
170
|
+
version?: string;
|
|
171
|
+
environment?: string;
|
|
172
|
+
}): {
|
|
173
|
+
name: string;
|
|
174
|
+
start: () => undefined;
|
|
175
|
+
finish: () => {
|
|
176
|
+
node: string;
|
|
177
|
+
environment: string;
|
|
178
|
+
platform: string;
|
|
179
|
+
pid: number;
|
|
180
|
+
uptime: number;
|
|
181
|
+
ream?: string | undefined;
|
|
182
|
+
};
|
|
183
|
+
};
|
|
105
184
|
//# sourceMappingURL=collectors.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"collectors.d.ts","sourceRoot":"","sources":["../../src/profiler/collectors.ts"],"names":[],"mappings":"AAAA
|
|
1
|
+
{"version":3,"file":"collectors.d.ts","sourceRoot":"","sources":["../../src/profiler/collectors.ts"],"names":[],"mappings":"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"}
|
|
@@ -11,7 +11,11 @@
|
|
|
11
11
|
* `db:query`, which is the shape atlas documents for bridging its own registry
|
|
12
12
|
* (`onDbQuery((event) => emitter.emit('db:query', event))`). A project on
|
|
13
13
|
* another data layer emits the same event and gets the same panel.
|
|
14
|
+
*
|
|
15
|
+
* Every entry is stamped with `at`, milliseconds since the request arrived, so
|
|
16
|
+
* the bar can lay queries, log lines and events out on one timeline.
|
|
14
17
|
*/
|
|
18
|
+
import { preview } from './preview.js';
|
|
15
19
|
/**
|
|
16
20
|
* How many statements one request may record.
|
|
17
21
|
*
|
|
@@ -28,10 +32,15 @@ export function databaseCollector(events, read) {
|
|
|
28
32
|
const bag = read();
|
|
29
33
|
if (bag === undefined)
|
|
30
34
|
return;
|
|
35
|
+
const duration = durationOf(payload);
|
|
31
36
|
bag.total += 1;
|
|
32
|
-
bag.duration +=
|
|
33
|
-
if (
|
|
34
|
-
bag.
|
|
37
|
+
bag.duration += duration;
|
|
38
|
+
if (isFailed(payload))
|
|
39
|
+
bag.failed += 1;
|
|
40
|
+
if (bag.queries.length < QUERY_CAP) {
|
|
41
|
+
// The event arrives when the statement ENDS: it started `duration` ago.
|
|
42
|
+
bag.queries.push(toQuery(payload, Math.max(0, bag.scope.elapsed() - duration)));
|
|
43
|
+
}
|
|
35
44
|
});
|
|
36
45
|
return {
|
|
37
46
|
name: 'database',
|
|
@@ -40,18 +49,25 @@ export function databaseCollector(events, read) {
|
|
|
40
49
|
const duration = typeof data.duration === 'number' ? data.duration : 0;
|
|
41
50
|
return `${total} ${total === 1 ? 'query' : 'queries'} · ${round(duration)} ms`;
|
|
42
51
|
},
|
|
43
|
-
start: () => ({ total: 0, duration: 0, queries: [] }),
|
|
52
|
+
start: (scope) => ({ scope, total: 0, failed: 0, duration: 0, queries: [] }),
|
|
44
53
|
finish: (bag) => bag === undefined
|
|
45
|
-
? { total: 0, duration: 0, queries: [], capped: false }
|
|
54
|
+
? { total: 0, failed: 0, duration: 0, queries: [], capped: false }
|
|
46
55
|
: {
|
|
47
56
|
total: bag.total,
|
|
57
|
+
failed: bag.failed,
|
|
48
58
|
duration: round(bag.duration),
|
|
49
59
|
queries: bag.queries,
|
|
50
60
|
capped: bag.total > bag.queries.length,
|
|
51
61
|
},
|
|
52
62
|
};
|
|
53
63
|
}
|
|
54
|
-
/**
|
|
64
|
+
/**
|
|
65
|
+
* The request and what it answered.
|
|
66
|
+
*
|
|
67
|
+
* Filled by the profiling middleware once the handler has run — routing, the
|
|
68
|
+
* session and the user are only known then. Every value that came from the
|
|
69
|
+
* client goes through {@link preview}, which caps it and hides secrets.
|
|
70
|
+
*/
|
|
55
71
|
export function requestCollector() {
|
|
56
72
|
return {
|
|
57
73
|
name: 'request',
|
|
@@ -91,9 +107,14 @@ export function logCollector(events, read) {
|
|
|
91
107
|
const bag = read();
|
|
92
108
|
if (bag === undefined)
|
|
93
109
|
return;
|
|
94
|
-
|
|
95
|
-
bag.lines.push(toLine(payload));
|
|
110
|
+
const line = toLine(payload, bag.scope.elapsed());
|
|
96
111
|
bag.total += 1;
|
|
112
|
+
if (line.level === 'error' || line.level === 'fatal')
|
|
113
|
+
bag.errors += 1;
|
|
114
|
+
if (line.level === 'warn')
|
|
115
|
+
bag.warnings += 1;
|
|
116
|
+
if (bag.lines.length < LINE_CAP)
|
|
117
|
+
bag.lines.push(line);
|
|
97
118
|
});
|
|
98
119
|
return {
|
|
99
120
|
name: 'logs',
|
|
@@ -101,43 +122,106 @@ export function logCollector(events, read) {
|
|
|
101
122
|
const total = typeof data.total === 'number' ? data.total : 0;
|
|
102
123
|
return total === 0 ? undefined : `${total} ${total === 1 ? 'log' : 'logs'}`;
|
|
103
124
|
},
|
|
104
|
-
start: () => ({ total: 0, lines: [] }),
|
|
125
|
+
start: (scope) => ({ scope, total: 0, errors: 0, warnings: 0, lines: [] }),
|
|
105
126
|
// Nothing logged is nothing to show: an empty bag renders no panel at all,
|
|
106
127
|
// rather than a heading over an empty list.
|
|
107
|
-
finish: (bag) => bag === undefined || bag.total === 0
|
|
128
|
+
finish: (bag) => bag === undefined || bag.total === 0
|
|
129
|
+
? {}
|
|
130
|
+
: { total: bag.total, errors: bag.errors, warnings: bag.warnings, lines: bag.lines },
|
|
108
131
|
};
|
|
109
132
|
}
|
|
110
133
|
/** As many lines as are worth scrolling; the count stays true past it. */
|
|
111
134
|
const LINE_CAP = 200;
|
|
112
|
-
|
|
135
|
+
/** Fields of a log entry that are its envelope, not its context. */
|
|
136
|
+
const LOG_ENVELOPE = new Set(['level', 'message', 'msg', 'timestamp', 'time']);
|
|
137
|
+
function toLine(payload, at) {
|
|
113
138
|
const entry = asRecord(payload);
|
|
139
|
+
const message = entry.message ?? entry.msg;
|
|
140
|
+
const context = Object.fromEntries(Object.entries(entry).filter(([key]) => !LOG_ENVELOPE.has(key)));
|
|
114
141
|
return {
|
|
115
142
|
level: typeof entry.level === 'string' ? entry.level : 'info',
|
|
116
|
-
message: typeof
|
|
143
|
+
message: typeof message === 'string' ? message : String(message ?? ''),
|
|
144
|
+
at: round(at),
|
|
117
145
|
...(typeof entry.timestamp === 'string' ? { time: entry.timestamp } : {}),
|
|
146
|
+
...(Object.keys(context).length > 0 ? { context: preview(context) } : {}),
|
|
118
147
|
};
|
|
119
148
|
}
|
|
120
|
-
/**
|
|
149
|
+
/**
|
|
150
|
+
* Every event the application emitted while the request ran — cache hits,
|
|
151
|
+
* mail sent, authorisation checks, the application's own domain events.
|
|
152
|
+
*
|
|
153
|
+
* It reads them through the emitter's `tap`, which runs in the emitting code's
|
|
154
|
+
* async context. `onAny` would not do: it is delivered through the native bus,
|
|
155
|
+
* later and outside the request. Queries and log lines are left out: they have
|
|
156
|
+
* their own panels.
|
|
157
|
+
*/
|
|
158
|
+
export function eventsCollector(source, read) {
|
|
159
|
+
source.tap((name, data) => {
|
|
160
|
+
if (OWN_PANEL.has(name))
|
|
161
|
+
return;
|
|
162
|
+
const bag = read();
|
|
163
|
+
if (bag === undefined)
|
|
164
|
+
return;
|
|
165
|
+
bag.total += 1;
|
|
166
|
+
if (bag.events.length < EVENT_CAP) {
|
|
167
|
+
bag.events.push({ name, at: round(bag.scope.elapsed()), data: preview(data) });
|
|
168
|
+
}
|
|
169
|
+
});
|
|
170
|
+
return {
|
|
171
|
+
name: 'events',
|
|
172
|
+
badge: (data) => {
|
|
173
|
+
const total = typeof data.total === 'number' ? data.total : 0;
|
|
174
|
+
return total === 0 ? undefined : `${total} ${total === 1 ? 'event' : 'events'}`;
|
|
175
|
+
},
|
|
176
|
+
start: (scope) => ({ scope, total: 0, events: [] }),
|
|
177
|
+
finish: (bag) => bag === undefined || bag.total === 0
|
|
178
|
+
? {}
|
|
179
|
+
: { total: bag.total, events: bag.events, capped: bag.total > bag.events.length },
|
|
180
|
+
};
|
|
181
|
+
}
|
|
182
|
+
/** Events that already have a panel of their own. */
|
|
183
|
+
const OWN_PANEL = new Set(['db:query', 'log:line']);
|
|
184
|
+
const EVENT_CAP = 300;
|
|
185
|
+
/** Heap and resident memory once the request is answered. */
|
|
121
186
|
export function memoryCollector() {
|
|
122
187
|
return {
|
|
123
188
|
name: 'memory',
|
|
124
189
|
badge: (data) => (typeof data.usedMb === 'number' ? `${data.usedMb.toFixed(1)} MB` : undefined),
|
|
125
190
|
start: () => ({ start: process.memoryUsage().heapUsed }),
|
|
126
191
|
finish: (bag) => {
|
|
127
|
-
const
|
|
192
|
+
const usage = process.memoryUsage();
|
|
128
193
|
return {
|
|
129
|
-
usedMb:
|
|
130
|
-
|
|
194
|
+
usedMb: usage.heapUsed / MB,
|
|
195
|
+
totalMb: usage.heapTotal / MB,
|
|
196
|
+
rssMb: usage.rss / MB,
|
|
197
|
+
deltaMb: bag === undefined ? 0 : (usage.heapUsed - bag.start) / MB,
|
|
131
198
|
};
|
|
132
199
|
},
|
|
133
200
|
};
|
|
134
201
|
}
|
|
135
|
-
|
|
202
|
+
const MB = 1024 * 1024;
|
|
203
|
+
/** The application and the runtime it answered on: the bar's right-hand item. */
|
|
204
|
+
export function appCollector(info = {}) {
|
|
205
|
+
return {
|
|
206
|
+
name: 'app',
|
|
207
|
+
start: () => undefined,
|
|
208
|
+
finish: () => ({
|
|
209
|
+
...(info.version === undefined ? {} : { ream: info.version }),
|
|
210
|
+
node: process.version,
|
|
211
|
+
environment: info.environment ?? process.env.NODE_ENV ?? 'development',
|
|
212
|
+
platform: `${process.platform}-${process.arch}`,
|
|
213
|
+
pid: process.pid,
|
|
214
|
+
uptime: Math.round(process.uptime()),
|
|
215
|
+
}),
|
|
216
|
+
};
|
|
217
|
+
}
|
|
218
|
+
function toQuery(payload, at) {
|
|
136
219
|
const event = asRecord(payload);
|
|
137
220
|
return {
|
|
138
221
|
sql: typeof event.sql === 'string' ? event.sql : String(event.sql ?? ''),
|
|
139
|
-
bindings: Array.isArray(event.bindings) ? event.bindings : [],
|
|
140
|
-
duration: durationOf(payload),
|
|
222
|
+
bindings: Array.isArray(event.bindings) ? event.bindings.map((value) => preview(value)) : [],
|
|
223
|
+
duration: round(durationOf(payload)),
|
|
224
|
+
at: round(at),
|
|
141
225
|
...pickString(event, 'connection'),
|
|
142
226
|
...pickString(event, 'model'),
|
|
143
227
|
...pickString(event, 'method'),
|
|
@@ -145,6 +229,9 @@ function toQuery(payload) {
|
|
|
145
229
|
...(event.error instanceof Error ? { error: event.error.message } : {}),
|
|
146
230
|
};
|
|
147
231
|
}
|
|
232
|
+
function isFailed(payload) {
|
|
233
|
+
return asRecord(payload).error instanceof Error;
|
|
234
|
+
}
|
|
148
235
|
function durationOf(payload) {
|
|
149
236
|
const value = asRecord(payload).duration;
|
|
150
237
|
return typeof value === 'number' && Number.isFinite(value) ? value : 0;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"collectors.js","sourceRoot":"","sources":["../../src/profiler/collectors.ts"],"names":[],"mappings":"AAAA
|
|
1
|
+
{"version":3,"file":"collectors.js","sourceRoot":"","sources":["../../src/profiler/collectors.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,11 +1,12 @@
|
|
|
1
1
|
/**
|
|
2
2
|
* Where the toolbar and the profiler read from.
|
|
3
3
|
*
|
|
4
|
-
*
|
|
4
|
+
* All under `/__ream/profiler` and all development-only:
|
|
5
5
|
*
|
|
6
6
|
* /__ream/profiler the history, newest first
|
|
7
7
|
* /__ream/profiler/<token> one request, every panel
|
|
8
8
|
* /__ream/profiler/<token>.json the same, for the bar in the page
|
|
9
|
+
* /__ream/profiler/_assets/… the bar's own script and stylesheet
|
|
9
10
|
*
|
|
10
11
|
* Server middleware rather than routes, like the hot-reload endpoint: it
|
|
11
12
|
* answers before the application's own middleware, so a profiler request does
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"endpoint.d.ts","sourceRoot":"","sources":["../../src/profiler/endpoint.ts"],"names":[],"mappings":"AAAA
|
|
1
|
+
{"version":3,"file":"endpoint.d.ts","sourceRoot":"","sources":["../../src/profiler/endpoint.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;GAaG;AAGH,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,eAAe,CAAA;AAW7C,mDAAmD;AACnD,MAAM,WAAW,eAAe;IAC9B,OAAO,EAAE;QAAE,GAAG,EAAE,MAAM,MAAM,CAAA;KAAE,CAAA;IAC9B,QAAQ,EAAE;QACR,MAAM,EAAE,CAAC,IAAI,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,KAAK,OAAO,CAAA;QAChD,IAAI,EAAE,CAAC,IAAI,EAAE,OAAO,KAAK,OAAO,CAAA;QAChC,MAAM,EAAE,CAAC,IAAI,EAAE,MAAM,KAAK,OAAO,CAAA;KAClC,CAAA;CACF;AAED,wBAAgB,gBAAgB,CAC9B,QAAQ,EAAE,QAAQ,GACjB,CAAC,GAAG,EAAE,eAAe,EAAE,IAAI,EAAE,MAAM,OAAO,CAAC,IAAI,CAAC,KAAK,OAAO,CAAC,IAAI,CAAC,CAiEpE"}
|
|
@@ -1,18 +1,26 @@
|
|
|
1
1
|
/**
|
|
2
2
|
* Where the toolbar and the profiler read from.
|
|
3
3
|
*
|
|
4
|
-
*
|
|
4
|
+
* All under `/__ream/profiler` and all development-only:
|
|
5
5
|
*
|
|
6
6
|
* /__ream/profiler the history, newest first
|
|
7
7
|
* /__ream/profiler/<token> one request, every panel
|
|
8
8
|
* /__ream/profiler/<token>.json the same, for the bar in the page
|
|
9
|
+
* /__ream/profiler/_assets/… the bar's own script and stylesheet
|
|
9
10
|
*
|
|
10
11
|
* Server middleware rather than routes, like the hot-reload endpoint: it
|
|
11
12
|
* answers before the application's own middleware, so a profiler request does
|
|
12
13
|
* not run the authentication stack and end up in its own history.
|
|
13
14
|
*/
|
|
15
|
+
import { TOOLBAR_CSS, TOOLBAR_JS } from './client.generated.js';
|
|
14
16
|
import { PROFILER_PATH } from './Profiler.js';
|
|
15
17
|
import { renderProfileList, renderProfilePage } from './render.js';
|
|
18
|
+
import { PROFILER_ASSETS_PATH } from './toolbar.js';
|
|
19
|
+
/** The bar's files, by the name the page asks for. */
|
|
20
|
+
const ASSETS = {
|
|
21
|
+
'toolbar.js': { type: 'text/javascript; charset=utf-8', body: TOOLBAR_JS },
|
|
22
|
+
'toolbar.css': { type: 'text/css; charset=utf-8', body: TOOLBAR_CSS },
|
|
23
|
+
};
|
|
16
24
|
export function profilerEndpoint(profiler) {
|
|
17
25
|
return async (ctx, next) => {
|
|
18
26
|
const path = ctx.request.url().split('?')[0] ?? '';
|
|
@@ -20,6 +28,22 @@ export function profilerEndpoint(profiler) {
|
|
|
20
28
|
await next();
|
|
21
29
|
return;
|
|
22
30
|
}
|
|
31
|
+
if (path.startsWith(`${PROFILER_ASSETS_PATH}/`)) {
|
|
32
|
+
const asset = Object.hasOwn(ASSETS, path.slice(PROFILER_ASSETS_PATH.length + 1))
|
|
33
|
+
? ASSETS[path.slice(PROFILER_ASSETS_PATH.length + 1)]
|
|
34
|
+
: undefined;
|
|
35
|
+
if (asset === undefined) {
|
|
36
|
+
ctx.response.status(404);
|
|
37
|
+
ctx.response.send('');
|
|
38
|
+
return;
|
|
39
|
+
}
|
|
40
|
+
ctx.response.header('content-type', asset.type);
|
|
41
|
+
// Revalidated each time: the bar changes with the framework, and a stale
|
|
42
|
+
// copy would show the last version's panels after an upgrade.
|
|
43
|
+
ctx.response.header('cache-control', 'no-cache');
|
|
44
|
+
ctx.response.send(asset.body);
|
|
45
|
+
return;
|
|
46
|
+
}
|
|
23
47
|
if (path === PROFILER_PATH) {
|
|
24
48
|
ctx.response.header('content-type', 'text/html; charset=utf-8');
|
|
25
49
|
ctx.response.send(renderProfileList(profiler.store.recent(50)));
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"endpoint.js","sourceRoot":"","sources":["../../src/profiler/endpoint.ts"],"names":[],"mappings":"AAAA
|
|
1
|
+
{"version":3,"file":"endpoint.js","sourceRoot":"","sources":["../../src/profiler/endpoint.ts"],"names":[],"mappings":"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"}
|
package/dist/profiler/index.d.ts
CHANGED
|
@@ -5,7 +5,7 @@
|
|
|
5
5
|
* rather than a list — and an application that wants its own panel adds a
|
|
6
6
|
* collector here instead of rebuilding the set.
|
|
7
7
|
*/
|
|
8
|
-
import { type QueryEventSource } from './collectors.js';
|
|
8
|
+
import { type EventTapSource, type QueryEventSource } from './collectors.js';
|
|
9
9
|
import { Profiler } from './Profiler.js';
|
|
10
10
|
import type { ProfilerCollector } from './types.js';
|
|
11
11
|
export * from './collectors.js';
|
|
@@ -13,14 +13,18 @@ export { profilerEndpoint } from './endpoint.js';
|
|
|
13
13
|
export { MemoryProfileStore } from './MemoryProfileStore.js';
|
|
14
14
|
export { profileRequest } from './middleware.js';
|
|
15
15
|
export { PROFILER_PATH, PROFILER_TOKEN_HEADER, Profiler } from './Profiler.js';
|
|
16
|
-
export {
|
|
16
|
+
export { isSecretKey, preview, REDACTED } from './preview.js';
|
|
17
|
+
export { PROFILER_ASSETS_PATH, toolbarScript } from './toolbar.js';
|
|
17
18
|
export * from './types.js';
|
|
18
19
|
/**
|
|
19
20
|
* The profiler a dev server runs with.
|
|
20
21
|
*
|
|
21
22
|
* `events` is the application's emitter. The database panel comes from
|
|
22
23
|
* `db:query` on it, which is how a data layer reports a statement without the
|
|
23
|
-
* profiler importing one.
|
|
24
|
+
* profiler importing one; the events panel from its `tap`, when it has one.
|
|
24
25
|
*/
|
|
25
|
-
export declare function createProfiler(events: QueryEventSource
|
|
26
|
+
export declare function createProfiler(events: QueryEventSource & Partial<EventTapSource>, extra?: readonly ProfilerCollector[], info?: {
|
|
27
|
+
version?: string;
|
|
28
|
+
environment?: string;
|
|
29
|
+
}): Profiler;
|
|
26
30
|
//# sourceMappingURL=index.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/profiler/index.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAEH,OAAO,
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/profiler/index.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAEH,OAAO,EAIL,KAAK,cAAc,EAOnB,KAAK,gBAAgB,EAEtB,MAAM,iBAAiB,CAAA;AAExB,OAAO,EAAE,QAAQ,EAAE,MAAM,eAAe,CAAA;AACxC,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,YAAY,CAAA;AAEnD,cAAc,iBAAiB,CAAA;AAC/B,OAAO,EAAE,gBAAgB,EAAE,MAAM,eAAe,CAAA;AAChD,OAAO,EAAE,kBAAkB,EAAE,MAAM,yBAAyB,CAAA;AAC5D,OAAO,EAAE,cAAc,EAAE,MAAM,iBAAiB,CAAA;AAChD,OAAO,EAAE,aAAa,EAAE,qBAAqB,EAAE,QAAQ,EAAE,MAAM,eAAe,CAAA;AAC9E,OAAO,EAAE,WAAW,EAAE,OAAO,EAAE,QAAQ,EAAE,MAAM,cAAc,CAAA;AAC7D,OAAO,EAAE,oBAAoB,EAAE,aAAa,EAAE,MAAM,cAAc,CAAA;AAClE,cAAc,YAAY,CAAA;AAE1B;;;;;;GAMG;AACH,wBAAgB,cAAc,CAC5B,MAAM,EAAE,gBAAgB,GAAG,OAAO,CAAC,cAAc,CAAC,EAClD,KAAK,GAAE,SAAS,iBAAiB,EAAO,EACxC,IAAI,GAAE;IAAE,OAAO,CAAC,EAAE,MAAM,CAAC;IAAC,WAAW,CAAC,EAAE,MAAM,CAAA;CAAO,GACpD,QAAQ,CAuBV"}
|
package/dist/profiler/index.js
CHANGED
|
@@ -5,7 +5,7 @@
|
|
|
5
5
|
* rather than a list — and an application that wants its own panel adds a
|
|
6
6
|
* collector here instead of rebuilding the set.
|
|
7
7
|
*/
|
|
8
|
-
import { databaseCollector, exceptionCollector, logCollector, memoryCollector, requestCollector, } from './collectors.js';
|
|
8
|
+
import { appCollector, databaseCollector, eventsCollector, exceptionCollector, logCollector, memoryCollector, requestCollector, } from './collectors.js';
|
|
9
9
|
import { MemoryProfileStore } from './MemoryProfileStore.js';
|
|
10
10
|
import { Profiler } from './Profiler.js';
|
|
11
11
|
export * from './collectors.js';
|
|
@@ -13,16 +13,17 @@ export { profilerEndpoint } from './endpoint.js';
|
|
|
13
13
|
export { MemoryProfileStore } from './MemoryProfileStore.js';
|
|
14
14
|
export { profileRequest } from './middleware.js';
|
|
15
15
|
export { PROFILER_PATH, PROFILER_TOKEN_HEADER, Profiler } from './Profiler.js';
|
|
16
|
-
export {
|
|
16
|
+
export { isSecretKey, preview, REDACTED } from './preview.js';
|
|
17
|
+
export { PROFILER_ASSETS_PATH, toolbarScript } from './toolbar.js';
|
|
17
18
|
export * from './types.js';
|
|
18
19
|
/**
|
|
19
20
|
* The profiler a dev server runs with.
|
|
20
21
|
*
|
|
21
22
|
* `events` is the application's emitter. The database panel comes from
|
|
22
23
|
* `db:query` on it, which is how a data layer reports a statement without the
|
|
23
|
-
* profiler importing one.
|
|
24
|
+
* profiler importing one; the events panel from its `tap`, when it has one.
|
|
24
25
|
*/
|
|
25
|
-
export function createProfiler(events, extra = []) {
|
|
26
|
+
export function createProfiler(events, extra = [], info = {}) {
|
|
26
27
|
// Built before the profiler so the database collector can read the bag of
|
|
27
28
|
// whichever request is running — the reference is filled in a line later,
|
|
28
29
|
// and nothing reads it until a request arrives.
|
|
@@ -32,7 +33,13 @@ export function createProfiler(events, extra = []) {
|
|
|
32
33
|
databaseCollector(events, () => profiler.current('database')),
|
|
33
34
|
exceptionCollector(),
|
|
34
35
|
logCollector(events, () => profiler.current('logs')),
|
|
36
|
+
...(typeof events.tap === 'function'
|
|
37
|
+
? [
|
|
38
|
+
eventsCollector({ tap: events.tap.bind(events) }, () => profiler.current('events')),
|
|
39
|
+
]
|
|
40
|
+
: []),
|
|
35
41
|
memoryCollector(),
|
|
42
|
+
appCollector(info),
|
|
36
43
|
...extra,
|
|
37
44
|
];
|
|
38
45
|
profiler = new Profiler(collectors, new MemoryProfileStore(collectors));
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/profiler/index.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAEH,OAAO,EACL,iBAAiB,
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/profiler/index.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAEH,OAAO,EACL,YAAY,EACZ,iBAAiB,EAGjB,eAAe,EACf,kBAAkB,EAElB,YAAY,EACZ,eAAe,EAGf,gBAAgB,GACjB,MAAM,iBAAiB,CAAA;AACxB,OAAO,EAAE,kBAAkB,EAAE,MAAM,yBAAyB,CAAA;AAC5D,OAAO,EAAE,QAAQ,EAAE,MAAM,eAAe,CAAA;AAGxC,cAAc,iBAAiB,CAAA;AAC/B,OAAO,EAAE,gBAAgB,EAAE,MAAM,eAAe,CAAA;AAChD,OAAO,EAAE,kBAAkB,EAAE,MAAM,yBAAyB,CAAA;AAC5D,OAAO,EAAE,cAAc,EAAE,MAAM,iBAAiB,CAAA;AAChD,OAAO,EAAE,aAAa,EAAE,qBAAqB,EAAE,QAAQ,EAAE,MAAM,eAAe,CAAA;AAC9E,OAAO,EAAE,WAAW,EAAE,OAAO,EAAE,QAAQ,EAAE,MAAM,cAAc,CAAA;AAC7D,OAAO,EAAE,oBAAoB,EAAE,aAAa,EAAE,MAAM,cAAc,CAAA;AAClE,cAAc,YAAY,CAAA;AAE1B;;;;;;GAMG;AACH,MAAM,UAAU,cAAc,CAC5B,MAAkD,EAClD,QAAsC,EAAE,EACxC,OAAmD,EAAE;IAErD,0EAA0E;IAC1E,0EAA0E;IAC1E,gDAAgD;IAChD,IAAI,QAAkB,CAAA;IACtB,MAAM,UAAU,GAAwB;QACtC,gBAAgB,EAAE;QAClB,iBAAiB,CAAC,MAAM,EAAE,GAAG,EAAE,CAAC,QAAQ,CAAC,OAAO,CAAW,UAAU,CAAC,CAAC;QACvE,kBAAkB,EAAE;QACpB,YAAY,CAAC,MAAM,EAAE,GAAG,EAAE,CAAC,QAAQ,CAAC,OAAO,CAAS,MAAM,CAAC,CAAC;QAC5D,GAAG,CAAC,OAAO,MAAM,CAAC,GAAG,KAAK,UAAU;YAClC,CAAC,CAAC;gBACE,eAAe,CAAC,EAAE,GAAG,EAAE,MAAM,CAAC,GAAG,CAAC,IAAI,CAAC,MAAM,CAAC,EAAE,EAAE,GAAG,EAAE,CACrD,QAAQ,CAAC,OAAO,CAAW,QAAQ,CAAC,CACrC;aACF;YACH,CAAC,CAAC,EAAE,CAAC;QACP,eAAe,EAAE;QACjB,YAAY,CAAC,IAAI,CAAC;QAClB,GAAG,KAAK;KACT,CAAA;IACD,QAAQ,GAAG,IAAI,QAAQ,CAAC,UAAU,EAAE,IAAI,kBAAkB,CAAC,UAAU,CAAC,CAAC,CAAA;IACvE,OAAO,QAAQ,CAAA;AACjB,CAAC"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"middleware.d.ts","sourceRoot":"","sources":["../../src/profiler/middleware.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;GAYG;AAGH,OAAO,KAAK,EAAE,kBAAkB,EAAE,MAAM,2BAA2B,CAAA;AAEnE,OAAO,EAAyB,KAAK,QAAQ,EAAE,MAAM,eAAe,CAAA;
|
|
1
|
+
{"version":3,"file":"middleware.d.ts","sourceRoot":"","sources":["../../src/profiler/middleware.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;GAYG;AAGH,OAAO,KAAK,EAAE,kBAAkB,EAAE,MAAM,2BAA2B,CAAA;AAEnE,OAAO,EAAyB,KAAK,QAAQ,EAAE,MAAM,eAAe,CAAA;AAGpE,wBAAgB,cAAc,CAAC,QAAQ,EAAE,QAAQ,GAAG,kBAAkB,CAqBrE"}
|