@riddance/host 0.0.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/LICENSE +19 -0
- package/context.d.ts +93 -0
- package/context.js +70 -0
- package/host/context.d.ts +51 -0
- package/host/context.js +104 -0
- package/host/emitter.d.ts +13 -0
- package/host/emitter.js +81 -0
- package/host/http.d.ts +30 -0
- package/host/http.js +205 -0
- package/host/logging.d.ts +4 -0
- package/host/logging.js +205 -0
- package/host/reflect.d.ts +24 -0
- package/host/reflect.js +57 -0
- package/host/registry.d.ts +26 -0
- package/host/registry.js +61 -0
- package/http.d.ts +39 -0
- package/http.js +18 -0
- package/package.json +38 -0
package/host/http.js
ADDED
|
@@ -0,0 +1,205 @@
|
|
|
1
|
+
import { parse } from 'node:url';
|
|
2
|
+
import { measure } from '../context.js';
|
|
3
|
+
export async function executeRequest(log, context, handler, options, success) {
|
|
4
|
+
const isShallow = context.env.SHALLOW_KEY && options.headers?.['x-shallow'] === context.env.SHALLOW_KEY;
|
|
5
|
+
const includeBodyInLogs = !handler.config?.excludeBodyFromLogs;
|
|
6
|
+
const logRequest = includeBodyInLogs
|
|
7
|
+
? { method: handler.method, ...options }
|
|
8
|
+
: withoutRequestBody({ method: handler.method, ...options });
|
|
9
|
+
log = log.enrichReserved({ meta: context.meta, request: logRequest });
|
|
10
|
+
if (isShallow) {
|
|
11
|
+
context.log.trace('Shallow request');
|
|
12
|
+
return {
|
|
13
|
+
headers: {},
|
|
14
|
+
status: 204,
|
|
15
|
+
};
|
|
16
|
+
}
|
|
17
|
+
context.log.trace('Request BEGIN');
|
|
18
|
+
try {
|
|
19
|
+
let parsedUrl;
|
|
20
|
+
let pathSteps;
|
|
21
|
+
const req = {
|
|
22
|
+
rawUrl: options.uri,
|
|
23
|
+
get url() {
|
|
24
|
+
return (parsedUrl ??= {
|
|
25
|
+
...parse(this.rawUrl, true),
|
|
26
|
+
pathStepAt: (index) => {
|
|
27
|
+
const steps = (pathSteps ??= parsedUrl.pathname?.split('/') ?? []);
|
|
28
|
+
const step = steps[index];
|
|
29
|
+
if (!step) {
|
|
30
|
+
throw new RangeError(`Path does not have a step at index ${index}.`);
|
|
31
|
+
}
|
|
32
|
+
return step;
|
|
33
|
+
},
|
|
34
|
+
});
|
|
35
|
+
},
|
|
36
|
+
body: requestBody(options),
|
|
37
|
+
headers: options.headers ?? {},
|
|
38
|
+
};
|
|
39
|
+
const result = await measure(context.log, 'execution', () => handler.entry(context, req));
|
|
40
|
+
const response = resultToResponse(result, includeBodyInLogs);
|
|
41
|
+
if (context.signal.aborted) {
|
|
42
|
+
response.headers = {
|
|
43
|
+
'x-timeout': '1',
|
|
44
|
+
...response.headers,
|
|
45
|
+
};
|
|
46
|
+
}
|
|
47
|
+
log = log.enrichReserved({ request: logRequest });
|
|
48
|
+
if (response.status < 300) {
|
|
49
|
+
log.debug('Request END');
|
|
50
|
+
await success();
|
|
51
|
+
}
|
|
52
|
+
else {
|
|
53
|
+
log.warn('Request END');
|
|
54
|
+
}
|
|
55
|
+
return response;
|
|
56
|
+
}
|
|
57
|
+
catch (e) {
|
|
58
|
+
try {
|
|
59
|
+
const response = errorToResponse(e);
|
|
60
|
+
log = log.enrichReserved({ response });
|
|
61
|
+
log.error('Request END', e);
|
|
62
|
+
return response;
|
|
63
|
+
}
|
|
64
|
+
catch (convertError) {
|
|
65
|
+
log.error('Could not convert exception to error response.', convertError);
|
|
66
|
+
return {
|
|
67
|
+
headers: {},
|
|
68
|
+
status: 500,
|
|
69
|
+
};
|
|
70
|
+
}
|
|
71
|
+
}
|
|
72
|
+
}
|
|
73
|
+
function resultToResponse(result, withLogBody) {
|
|
74
|
+
if (!result) {
|
|
75
|
+
return {
|
|
76
|
+
headers: {},
|
|
77
|
+
status: 204,
|
|
78
|
+
};
|
|
79
|
+
}
|
|
80
|
+
else if (typeof result === 'string') {
|
|
81
|
+
const logBody = withLogBody ? result : undefined;
|
|
82
|
+
return {
|
|
83
|
+
headers: {
|
|
84
|
+
'content-type': 'text/plain',
|
|
85
|
+
},
|
|
86
|
+
status: 200,
|
|
87
|
+
body: result,
|
|
88
|
+
logBody,
|
|
89
|
+
};
|
|
90
|
+
}
|
|
91
|
+
else {
|
|
92
|
+
if (result.body === undefined) {
|
|
93
|
+
return {
|
|
94
|
+
headers: result.headers ?? {},
|
|
95
|
+
status: result.status ?? 200,
|
|
96
|
+
};
|
|
97
|
+
}
|
|
98
|
+
else if (typeof result.body === 'string') {
|
|
99
|
+
const logBody = withLogBody ? result.body : undefined;
|
|
100
|
+
return {
|
|
101
|
+
headers: withContentType(result.headers, 'text/plain'),
|
|
102
|
+
status: result.status ?? 200,
|
|
103
|
+
body: result.body,
|
|
104
|
+
logBody,
|
|
105
|
+
};
|
|
106
|
+
}
|
|
107
|
+
else if (Buffer.isBuffer(result.body)) {
|
|
108
|
+
const logBody = withLogBody ? result.body.toString('base64') : undefined;
|
|
109
|
+
return {
|
|
110
|
+
headers: withContentType(result.headers, 'application/octet-stream'),
|
|
111
|
+
status: result.status ?? 200,
|
|
112
|
+
body: result.body,
|
|
113
|
+
logBody,
|
|
114
|
+
};
|
|
115
|
+
}
|
|
116
|
+
else {
|
|
117
|
+
const logBody = withLogBody ? result.body : undefined;
|
|
118
|
+
return {
|
|
119
|
+
headers: withContentType(result.headers, 'application/json'),
|
|
120
|
+
status: result.status ?? 200,
|
|
121
|
+
body: JSON.stringify(result.body),
|
|
122
|
+
logBody,
|
|
123
|
+
};
|
|
124
|
+
}
|
|
125
|
+
}
|
|
126
|
+
}
|
|
127
|
+
function withoutRequestBody(options) {
|
|
128
|
+
if (hasJsonBody(options)) {
|
|
129
|
+
const { json, ...bodyless } = options;
|
|
130
|
+
return bodyless;
|
|
131
|
+
}
|
|
132
|
+
if (hasStringBody(options)) {
|
|
133
|
+
const { body, ...bodyless } = options;
|
|
134
|
+
return bodyless;
|
|
135
|
+
}
|
|
136
|
+
return options;
|
|
137
|
+
}
|
|
138
|
+
function requestBody(options) {
|
|
139
|
+
if (hasJsonBody(options)) {
|
|
140
|
+
return options.json;
|
|
141
|
+
}
|
|
142
|
+
if (hasStringBody(options)) {
|
|
143
|
+
return options.body;
|
|
144
|
+
}
|
|
145
|
+
return undefined;
|
|
146
|
+
}
|
|
147
|
+
function hasJsonBody(options) {
|
|
148
|
+
return options.json !== undefined;
|
|
149
|
+
}
|
|
150
|
+
function hasStringBody(options) {
|
|
151
|
+
return options.body !== undefined;
|
|
152
|
+
}
|
|
153
|
+
function withContentType(headers, contentType) {
|
|
154
|
+
if (!headers) {
|
|
155
|
+
return {
|
|
156
|
+
'content-type': contentType,
|
|
157
|
+
};
|
|
158
|
+
}
|
|
159
|
+
if (!headers['content-type']) {
|
|
160
|
+
headers['content-type'] = contentType;
|
|
161
|
+
}
|
|
162
|
+
return headers;
|
|
163
|
+
}
|
|
164
|
+
function errorToResponse(e) {
|
|
165
|
+
const { body, statusCode: status } = e;
|
|
166
|
+
if (typeof body === 'string') {
|
|
167
|
+
return {
|
|
168
|
+
headers: {
|
|
169
|
+
'content-type': 'text/plain',
|
|
170
|
+
},
|
|
171
|
+
status: status ?? 500,
|
|
172
|
+
body,
|
|
173
|
+
};
|
|
174
|
+
}
|
|
175
|
+
else if (typeof body === 'object') {
|
|
176
|
+
return {
|
|
177
|
+
headers: {
|
|
178
|
+
'content-type': 'application/json',
|
|
179
|
+
},
|
|
180
|
+
status: status ?? 500,
|
|
181
|
+
body: JSON.stringify(body),
|
|
182
|
+
};
|
|
183
|
+
}
|
|
184
|
+
else {
|
|
185
|
+
return {
|
|
186
|
+
headers: {},
|
|
187
|
+
status: status ?? 500,
|
|
188
|
+
};
|
|
189
|
+
}
|
|
190
|
+
}
|
|
191
|
+
export function clientFromHeaders(headers) {
|
|
192
|
+
if (!headers) {
|
|
193
|
+
return {};
|
|
194
|
+
}
|
|
195
|
+
return {
|
|
196
|
+
operationId: headers['x-request-id'] ?? headers['request-id'],
|
|
197
|
+
clientId: headers['x-client-id'] ??
|
|
198
|
+
headers['x-installation-id'] ??
|
|
199
|
+
headers['client-id'] ??
|
|
200
|
+
headers['installation-id'],
|
|
201
|
+
clientIp: headers['x-forwarded-for'],
|
|
202
|
+
userAgent: headers['x-forwarded-for-user-agent'] ?? headers['user-agent'],
|
|
203
|
+
};
|
|
204
|
+
}
|
|
205
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaHR0cC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbImh0dHAudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFFLEtBQUssRUFBc0IsTUFBTSxVQUFVLENBQUE7QUFDcEQsT0FBTyxFQUFXLE9BQU8sRUFBRSxNQUFNLGVBQWUsQ0FBQTtBQTBCaEQsTUFBTSxDQUFDLEtBQUssVUFBVSxjQUFjLENBQ2hDLEdBQWUsRUFDZixPQUFnQixFQUNoQixPQUFvQixFQUNwQixPQUF1QixFQUN2QixPQUErQjtJQUUvQixNQUFNLFNBQVMsR0FDWCxPQUFPLENBQUMsR0FBRyxDQUFDLFdBQVcsSUFBSSxPQUFPLENBQUMsT0FBTyxFQUFFLENBQUMsV0FBVyxDQUFDLEtBQUssT0FBTyxDQUFDLEdBQUcsQ0FBQyxXQUFXLENBQUE7SUFDekYsTUFBTSxpQkFBaUIsR0FBRyxDQUFDLE9BQU8sQ0FBQyxNQUFNLEVBQUUsbUJBQW1CLENBQUE7SUFDOUQsTUFBTSxVQUFVLEdBQUcsaUJBQWlCO1FBQ2hDLENBQUMsQ0FBQyxFQUFFLE1BQU0sRUFBRSxPQUFPLENBQUMsTUFBTSxFQUFFLEdBQUcsT0FBTyxFQUFFO1FBQ3hDLENBQUMsQ0FBQyxrQkFBa0IsQ0FBQyxFQUFFLE1BQU0sRUFBRSxPQUFPLENBQUMsTUFBTSxFQUFFLEdBQUcsT0FBTyxFQUFFLENBQUMsQ0FBQTtJQUNoRSxHQUFHLEdBQUcsR0FBRyxDQUFDLGNBQWMsQ0FBQyxFQUFFLElBQUksRUFBRSxPQUFPLENBQUMsSUFBSSxFQUFFLE9BQU8sRUFBRSxVQUFVLEVBQUUsQ0FBQyxDQUFBO0lBQ3JFLElBQUksU0FBUyxFQUFFO1FBQ1gsT0FBTyxDQUFDLEdBQUcsQ0FBQyxLQUFLLENBQUMsaUJBQWlCLENBQUMsQ0FBQTtRQUNwQyxPQUFPO1lBQ0gsT0FBTyxFQUFFLEVBQUU7WUFDWCxNQUFNLEVBQUUsR0FBRztTQUNkLENBQUE7S0FDSjtJQUNELE9BQU8sQ0FBQyxHQUFHLENBQUMsS0FBSyxDQUFD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LEVBQUUsT0FBTyxDQUFDLGNBQWMsQ0FBQyxJQUFJLE9BQU8sQ0FBQyxZQUFZLENBQUM7UUFDN0QsUUFBUSxFQUNKLE9BQU8sQ0FBQyxhQUFhLENBQUM7WUFDdEIsT0FBTyxDQUFDLG1CQUFtQixDQUFDO1lBQzVCLE9BQU8sQ0FBQyxXQUFXLENBQUM7WUFDcEIsT0FBTyxDQUFDLGlCQUFpQixDQUFDO1FBQzlCLFFBQVEsRUFBRSxPQUFPLENBQUMsaUJBQWlCLENBQUM7UUFDcEMsU0FBUyxFQUFFLE9BQU8sQ0FBQyw0QkFBNEIsQ0FBQyxJQUFJLE9BQU8sQ0FBQyxZQUFZLENBQUM7S0FDNUUsQ0FBQTtBQUNMLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBwYXJzZSwgVXJsV2l0aFBhcnNlZFF1ZXJ5IH0gZnJvbSAnbm9kZTp1cmwnXHJcbmltcG9ydCB7IENvbnRleHQsIG1lYXN1cmUgfSBmcm9tICcuLi9jb250ZXh0LmpzJ1xyXG5pbXBvcnQgdHlwZSB7IEpzb24sIFJlc3BvbnNlSGVhZGVycywgUmVzdWx0IH0gZnJvbSAnLi4vaHR0cC5qcydcclxuaW1wb3J0IHsgQ2xpZW50SW5mbywgUm9vdExvZ2dlciB9IGZyb20gJy4vY29udGV4dC5qcydcclxuaW1wb3J0IHR5cGUgeyBIdHRwSGFuZGxlciB9IGZyb20gJy4vcmVnaXN0cnkuanMnXHJcblxyXG5leHBvcnQgaW50ZXJmYWNlIFJlc3BvbnNlIHtcclxuICAgIGhlYWRlcnM6IHsgcmVhZG9ubHkgW2tleTogc3RyaW5nXTogc3RyaW5nIH1cclxuICAgIHN0YXR1czogbnVtYmVyXHJcbiAgICBib2R5Pzogc3RyaW5nIHwgQnVmZmVyXHJcbn1cclxuXHJcbnR5cGUgUmVxdWVzdE9wdGlvbnMgPSBCb2R5bGVzc1JlcXVlc3RPcHRpb25zIHwgU3RyaW5nUmVxdWVzdE9wdGlvbnMgfCBKc29uUmVxdWVzdE9wdGlvbnNcclxuXHJcbmludGVyZmFjZSBCb2R5bGVzc1JlcXVlc3RPcHRpb25zIHtcclxuICAgIHVyaTogc3RyaW5nXHJcbiAgICBoZWFkZXJzPzogeyByZWFkb25seSBba2V5OiBzdHJpbmddOiBzdHJpbmcgfVxyXG59XHJcblxyXG5pbnRlcmZhY2UgU3RyaW5nUmVxdWVzdE9wdGlvbnMgZXh0ZW5kcyBCb2R5bGVzc1JlcXVlc3RPcHRpb25zIHtcclxuICAgIGJvZHk6IHN0cmluZ1xyXG59XHJcblxyXG5pbnRlcmZhY2UgSnNvblJlcXVlc3RPcHRpb25zIGV4dGVuZHMgQm9keWxlc3NSZXF1ZXN0T3B0aW9ucyB7XHJcbiAgICBqc29uOiBKc29uXHJcbn1cclxuXHJcbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBleGVjdXRlUmVxdWVzdChcclxuICAgIGxvZzogUm9vdExvZ2dlcixcclxuICAgIGNvbnRleHQ6IENvbnRleHQsXHJcbiAgICBoYW5kbGVyOiBIdHRwSGFuZGxlcixcclxuICAgIG9wdGlvbnM6IFJlcXVlc3RPcHRpb25zLFxyXG4gICAgc3VjY2VzczogKCkgPT4gUHJvbWlzZTx1bmtub3duPixcclxuKTogUHJvbWlzZTxSZXNwb25zZT4ge1xyXG4gICAgY29uc3QgaXNTaGFsbG93ID1cclxuICAgICAgICBjb250ZXh0LmVudi5TSEFMTE9XX0tFWSAmJiBvcHRpb25zLmhlYWRlcnM/LlsneC1zaGFsbG93J10gPT09IGNvbnRleHQuZW52LlNIQUxMT1dfS0VZXHJcbiAgICBjb25zdCBpbmNsdWRlQm9keUluTG9ncyA9ICFoYW5kbGVyLmNvbmZpZz8uZXhjbHVkZUJvZHlGcm9tTG9nc1xyXG4gICAgY29uc3QgbG9nUmVxdWVzdCA9IGluY2x1ZGVCb2R5SW5Mb2dzXHJcbiAgICAgICAgPyB7IG1ldGhvZDogaGFuZGxlci5tZXRob2QsIC4uLm9wdGlvbnMgfVxyXG4gICAgICAgIDogd2l0aG91dFJlcXVlc3RCb2R5KHsgbWV0aG9kOiBoYW5kbGVyLm1ldGhvZCwgLi4ub3B0aW9ucyB9KVxyXG4gICAgbG9nID0gbG9nLmVucmljaFJlc2VydmVkKHsgbWV0YTogY29udGV4dC5tZXRhLCByZXF1ZXN0OiBsb2dSZXF1ZXN0IH0pXHJcbiAgICBpZiAoaXNTaGFsbG93KSB7XHJcbiAgICAgICAgY29udGV4dC5sb2cudHJhY2UoJ1NoYWxsb3cgcmVxdWVzdCcpXHJcbiAgICAgICAgcmV0dXJuIHtcclxuICAgICAgICAgICAgaGVhZGVyczoge30sXHJcbiAgICAgICAgICAgIHN0YXR1czogMjA0LFxyXG4gICAgICAgIH1cclxuICAgIH1cclxuICAgIGNvbnRleHQubG9nLnRyYWNlKCdSZXF1ZXN0IEJFR0lOJylcclxuICAgIHRyeSB7XHJcbiAgICAgICAgbGV0IHBhcnNlZFVybDogVXJsV2l0aFBhcnNlZFF1ZXJ5ICYgeyBwYXRoU3RlcEF0OiAoaW5kZXg6IG51bWJlcikgPT4gc3RyaW5nIH1cclxuICAgICAgICBsZXQgcGF0aFN0ZXBzOiBzdHJpbmdbXVxyXG4gICAgICAgIGNvbnN0IHJlcSA9IHtcclxuICAgICAgICAgICAgcmF3VXJsOiBvcHRpb25zLnVyaSxcclxuICAgICAgICAgICAgZ2V0IHVybCgpIHtcclxuICAgICAgICAgICAgICAgIHJldHVybiAocGFyc2VkVXJsID8/PSB7XHJcbiAgICAgICAgICAgICAgICAgICAgLi4ucGFyc2UodGhpcy5yYXdVcmwsIHRydWUpLFxyXG4gICAgICAgICAgICAgICAgICAgIHBhdGhTdGVwQXQ6IChpbmRleDogbnVtYmVyKSA9PiB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHN0ZXBzID0gKHBhdGhTdGVwcyA/Pz0gcGFyc2VkVXJsLnBhdGhuYW1lPy5zcGxpdCgnLycpID8/IFtdKVxyXG4gICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBzdGVwID0gc3RlcHNbaW5kZXhdXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmICghc3RlcCkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IFJhbmdlRXJyb3IoYFBhdGggZG9lcyBub3QgaGF2ZSBhIHN0ZXAgYXQgaW5kZXggJHtpbmRleH0uYClcclxuICAgICAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gc3RlcFxyXG4gICAgICAgICAgICAgICAgICAgIH0sXHJcbiAgICAgICAgICAgICAgICB9KVxyXG4gICAgICAgICAgICB9LFxyXG4gICAgICAgICAgICBib2R5OiByZXF1ZXN0Qm9keShvcHRpb25zKSxcclxuICAgICAgICAgICAgaGVhZGVyczogb3B0aW9ucy5oZWFkZXJzID8/IHt9LFxyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgY29uc3QgcmVzdWx0ID0gYXdhaXQgbWVhc3VyZShjb250ZXh0LmxvZywgJ2V4ZWN1dGlvbicsICgpID0+IGhhbmRsZXIuZW50cnkoY29udGV4dCwgcmVxKSlcclxuXHJcbiAgICAgICAgY29uc3QgcmVzcG9uc2UgPSByZXN1bHRUb1Jlc3BvbnNlKHJlc3VsdCwgaW5jbHVkZUJvZHlJbkxvZ3MpXHJcblxyXG4gICAgICAgIGlmIChjb250ZXh0LnNpZ25hbC5hYm9ydGVkKSB7XHJcbiAgICAgICAgICAgIHJlc3BvbnNlLmhlYWRlcnMgPSB7XHJcbiAgICAgICAgICAgICAgICAneC10aW1lb3V0JzogJzEnLFxyXG4gICAgICAgICAgICAgICAgLi4ucmVzcG9uc2UuaGVhZGVycyxcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgbG9nID0gbG9nLmVucmljaFJlc2VydmVkKHsgcmVxdWVzdDogbG9nUmVxdWVzdCB9KVxyXG4gICAgICAgIGlmIChyZXNwb25zZS5zdGF0dXMgPCAzMDApIHtcclxuICAgICAgICAgICAgbG9nLmRlYnVnKCdSZXF1ZXN0IEVORCcpXHJcbiAgICAgICAgICAgIGF3YWl0IHN1Y2Nlc3MoKVxyXG4gICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgIGxvZy53YXJuKCdSZXF1ZXN0IEVORCcpXHJcbiAgICAgICAgfVxyXG4gICAgICAgIHJldHVybiByZXNwb25zZVxyXG4gICAgfSBjYXRjaCAoZSkge1xyXG4gICAgICAgIHRyeSB7XHJcbiAgICAgICAgICAgIGNvbnN0IHJlc3BvbnNlID0gZXJyb3JUb1Jlc3BvbnNlKGUpXHJcbiAgICAgICAgICAgIGxvZyA9IGxvZy5lbnJpY2hSZXNlcnZlZCh7IHJlc3BvbnNlIH0pXHJcbiAgICAgICAgICAgIGxvZy5lcnJvcignUmVxdWVzdCBFTkQnLCBlKVxyXG4gICAgICAgICAgICByZXR1cm4gcmVzcG9uc2VcclxuICAgICAgICB9IGNhdGNoIChjb252ZXJ0RXJyb3IpIHtcclxuICAgICAgICAgICAgbG9nLmVycm9yKCdDb3VsZCBub3QgY29udmVydCBleGNlcHRpb24gdG8gZXJyb3IgcmVzcG9uc2UuJywgY29udmVydEVycm9yKVxyXG4gICAgICAgICAgICByZXR1cm4ge1xyXG4gICAgICAgICAgICAgICAgaGVhZGVyczoge30sXHJcbiAgICAgICAgICAgICAgICBzdGF0dXM6IDUwMCxcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuICAgIH1cclxufVxyXG5cclxuZnVuY3Rpb24gcmVzdWx0VG9SZXNwb25zZShyZXN1bHQ6IFJlc3VsdCwgd2l0aExvZ0JvZHk6IGJvb2xlYW4pOiBSZXNwb25zZSAmIHsgbG9nQm9keT86IHVua25vd24gfSB7XHJcbiAgICBpZiAoIXJlc3VsdCkge1xyXG4gICAgICAgIHJldHVybiB7XHJcbiAgICAgICAgICAgIGhlYWRlcnM6IHt9LFxyXG4gICAgICAgICAgICBzdGF0dXM6IDIwNCxcclxuICAgICAgICB9XHJcbiAgICB9IGVsc2UgaWYgKHR5cGVvZiByZXN1bHQgPT09ICdzdHJpbmcnKSB7XHJcbiAgICAgICAgY29uc3QgbG9nQm9keSA9IHdpdGhMb2dCb2R5ID8gcmVzdWx0IDogdW5kZWZpbmVkXHJcbiAgICAgICAgcmV0dXJuIHtcclxuICAgICAgICAgICAgaGVhZGVyczoge1xyXG4gICAgICAgICAgICAgICAgJ2NvbnRlbnQtdHlwZSc6ICd0ZXh0L3BsYWluJyxcclxuICAgICAgICAgICAgfSxcclxuICAgICAgICAgICAgc3RhdHVzOiAyMDAsXHJcbiAgICAgICAgICAgIGJvZHk6IHJlc3VsdCxcclxuICAgICAgICAgICAgbG9nQm9keSxcclxuICAgICAgICB9XHJcbiAgICB9IGVsc2Uge1xyXG4gICAgICAgIGlmIChyZXN1bHQuYm9keSA9PT0gdW5kZWZpbmVkKSB7XHJcbiAgICAgICAgICAgIHJldHVybiB7XHJcbiAgICAgICAgICAgICAgICBoZWFkZXJzOiByZXN1bHQuaGVhZGVycyA/PyB7fSxcclxuICAgICAgICAgICAgICAgIHN0YXR1czogcmVzdWx0LnN0YXR1cyA/PyAyMDAsXHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9IGVsc2UgaWYgKHR5cGVvZiByZXN1bHQuYm9keSA9PT0gJ3N0cmluZycpIHtcclxuICAgICAgICAgICAgY29uc3QgbG9nQm9keSA9IHdpdGhMb2dCb2R5ID8gcmVzdWx0LmJvZHkgOiB1bmRlZmluZWRcclxuICAgICAgICAgICAgcmV0dXJuIHtcclxuICAgICAgICAgICAgICAgIGhlYWRlcnM6IHdpdGhDb250ZW50VHlwZShyZXN1bHQuaGVhZGVycywgJ3RleHQvcGxhaW4nKSxcclxuICAgICAgICAgICAgICAgIHN0YXR1czogcmVzdWx0LnN0YXR1cyA/PyAyMDAsXHJcbiAgICAgICAgICAgICAgICBib2R5OiByZXN1bHQuYm9keSxcclxuICAgICAgICAgICAgICAgIGxvZ0JvZHksXHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9IGVsc2UgaWYgKEJ1ZmZlci5pc0J1ZmZlcihyZXN1bHQuYm9keSkpIHtcclxuICAgICAgICAgICAgY29uc3QgbG9nQm9keSA9IHdpdGhMb2dCb2R5ID8gcmVzdWx0LmJvZHkudG9TdHJpbmcoJ2Jhc2U2NCcpIDogdW5kZWZpbmVkXHJcbiAgICAgICAgICAgIHJldHVybiB7XHJcbiAgICAgICAgICAgICAgICBoZWFkZXJzOiB3aXRoQ29udGVudFR5cGUocmVzdWx0LmhlYWRlcnMsICdhcHBsaWNhdGlvbi9vY3RldC1zdHJlYW0nKSxcclxuICAgICAgICAgICAgICAgIHN0YXR1czogcmVzdWx0LnN0YXR1cyA/PyAyMDAsXHJcbiAgICAgICAgICAgICAgICBib2R5OiByZXN1bHQuYm9keSxcclxuICAgICAgICAgICAgICAgIGxvZ0JvZHksXHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICBjb25zdCBsb2dCb2R5ID0gd2l0aExvZ0JvZHkgPyByZXN1bHQuYm9keSA6IHVuZGVmaW5lZFxyXG4gICAgICAgICAgICByZXR1cm4ge1xyXG4gICAgICAgICAgICAgICAgaGVhZGVyczogd2l0aENvbnRlbnRUeXBlKHJlc3VsdC5oZWFkZXJzLCAnYXBwbGljYXRpb24vanNvbicpLFxyXG4gICAgICAgICAgICAgICAgc3RhdHVzOiByZXN1bHQuc3RhdHVzID8/IDIwMCxcclxuICAgICAgICAgICAgICAgIGJvZHk6IEpTT04uc3RyaW5naWZ5KHJlc3VsdC5ib2R5KSxcclxuICAgICAgICAgICAgICAgIGxvZ0JvZHksXHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9XHJcbiAgICB9XHJcbn1cclxuXHJcbmZ1bmN0aW9uIHdpdGhvdXRSZXF1ZXN0Qm9keShvcHRpb25zOiBSZXF1ZXN0T3B0aW9ucyAmIHsgbWV0aG9kOiBzdHJpbmcgfSkge1xyXG4gICAgaWYgKGhhc0pzb25Cb2R5KG9wdGlvbnMpKSB7XHJcbiAgICAgICAgY29uc3QgeyBqc29uLCAuLi5ib2R5bGVzcyB9ID0gb3B0aW9uc1xyXG4gICAgICAgIHJldHVybiBib2R5bGVzc1xyXG4gICAgfVxyXG4gICAgaWYgKGhhc1N0cmluZ0JvZHkob3B0aW9ucykpIHtcclxuICAgICAgICBjb25zdCB7IGJvZHksIC4uLmJvZHlsZXNzIH0gPSBvcHRpb25zXHJcbiAgICAgICAgcmV0dXJuIGJvZHlsZXNzXHJcbiAgICB9XHJcbiAgICByZXR1cm4gb3B0aW9uc1xyXG59XHJcblxyXG5mdW5jdGlvbiByZXF1ZXN0Qm9keShvcHRpb25zOiBSZXF1ZXN0T3B0aW9ucyk6IEpzb24gfCBzdHJpbmcgfCB1bmRlZmluZWQge1xyXG4gICAgaWYgKGhhc0pzb25Cb2R5KG9wdGlvbnMpKSB7XHJcbiAgICAgICAgcmV0dXJuIG9wdGlvbnMuanNvblxyXG4gICAgfVxyXG4gICAgaWYgKGhhc1N0cmluZ0JvZHkob3B0aW9ucykpIHtcclxuICAgICAgICByZXR1cm4gb3B0aW9ucy5ib2R5XHJcbiAgICB9XHJcbiAgICByZXR1cm4gdW5kZWZpbmVkXHJcbn1cclxuXHJcbmZ1bmN0aW9uIGhhc0pzb25Cb2R5KG9wdGlvbnM6IFJlcXVlc3RPcHRpb25zKTogb3B0aW9ucyBpcyBKc29uUmVxdWVzdE9wdGlvbnMge1xyXG4gICAgcmV0dXJuIChvcHRpb25zIGFzIHsganNvbj86IHVua25vd24gfSkuanNvbiAhPT0gdW5kZWZpbmVkXHJcbn1cclxuXHJcbmZ1bmN0aW9uIGhhc1N0cmluZ0JvZHkob3B0aW9uczogUmVxdWVzdE9wdGlvbnMpOiBvcHRpb25zIGlzIFN0cmluZ1JlcXVlc3RPcHRpb25zIHtcclxuICAgIHJldHVybiAob3B0aW9ucyBhcyB7IGJvZHk/OiB1bmtub3duIH0pLmJvZHkgIT09IHVuZGVmaW5lZFxyXG59XHJcblxyXG5mdW5jdGlvbiB3aXRoQ29udGVudFR5cGUoaGVhZGVyczogUmVzcG9uc2VIZWFkZXJzIHwgdW5kZWZpbmVkLCBjb250ZW50VHlwZTogc3RyaW5nKSB7XHJcbiAgICBpZiAoIWhlYWRlcnMpIHtcclxuICAgICAgICByZXR1cm4ge1xyXG4gICAgICAgICAgICAnY29udGVudC10eXBlJzogY29udGVudFR5cGUsXHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG4gICAgaWYgKCFoZWFkZXJzWydjb250ZW50LXR5cGUnXSkge1xyXG4gICAgICAgIGhlYWRlcnNbJ2NvbnRlbnQtdHlwZSddID0gY29udGVudFR5cGVcclxuICAgIH1cclxuICAgIHJldHVybiBoZWFkZXJzXHJcbn1cclxuXHJcbmZ1bmN0aW9uIGVycm9yVG9SZXNwb25zZShlOiB1bmtub3duKTogUmVzcG9uc2Uge1xyXG4gICAgY29uc3QgeyBib2R5LCBzdGF0dXNDb2RlOiBzdGF0dXMgfSA9IGUgYXMgeyBib2R5PzogdW5rbm93bjsgc3RhdHVzQ29kZT86IG51bWJlciB9XHJcbiAgICBpZiAodHlwZW9mIGJvZHkgPT09ICdzdHJpbmcnKSB7XHJcbiAgICAgICAgcmV0dXJuIHtcclxuICAgICAgICAgICAgaGVhZGVyczoge1xyXG4gICAgICAgICAgICAgICAgJ2NvbnRlbnQtdHlwZSc6ICd0ZXh0L3BsYWluJyxcclxuICAgICAgICAgICAgfSxcclxuICAgICAgICAgICAgc3RhdHVzOiBzdGF0dXMgPz8gNTAwLFxyXG4gICAgICAgICAgICBib2R5LFxyXG4gICAgICAgIH1cclxuICAgIH0gZWxzZSBpZiAodHlwZW9mIGJvZHkgPT09ICdvYmplY3QnKSB7XHJcbiAgICAgICAgcmV0dXJuIHtcclxuICAgICAgICAgICAgaGVhZGVyczoge1xyXG4gICAgICAgICAgICAgICAgJ2NvbnRlbnQtdHlwZSc6ICdhcHBsaWNhdGlvbi9qc29uJyxcclxuICAgICAgICAgICAgfSxcclxuICAgICAgICAgICAgc3RhdHVzOiBzdGF0dXMgPz8gNTAwLFxyXG4gICAgICAgICAgICBib2R5OiBKU09OLnN0cmluZ2lmeShib2R5KSxcclxuICAgICAgICB9XHJcbiAgICB9IGVsc2Uge1xyXG4gICAgICAgIHJldHVybiB7XHJcbiAgICAgICAgICAgIGhlYWRlcnM6IHt9LFxyXG4gICAgICAgICAgICBzdGF0dXM6IHN0YXR1cyA/PyA1MDAsXHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG59XHJcblxyXG5leHBvcnQgZnVuY3Rpb24gY2xpZW50RnJvbUhlYWRlcnMoXHJcbiAgICBoZWFkZXJzOiB7IHJlYWRvbmx5IFtrZXk6IHN0cmluZ106IHN0cmluZyB9IHwgdW5kZWZpbmVkLFxyXG4pOiBDbGllbnRJbmZvIHtcclxuICAgIGlmICghaGVhZGVycykge1xyXG4gICAgICAgIHJldHVybiB7fVxyXG4gICAgfVxyXG4gICAgcmV0dXJuIHtcclxuICAgICAgICBvcGVyYXRpb25JZDogaGVhZGVyc1sneC1yZXF1ZXN0LWlkJ10gPz8gaGVhZGVyc1sncmVxdWVzdC1pZCddLFxyXG4gICAgICAgIGNsaWVudElkOlxyXG4gICAgICAgICAgICBoZWFkZXJzWyd4LWNsaWVudC1pZCddID8/XHJcbiAgICAgICAgICAgIGhlYWRlcnNbJ3gtaW5zdGFsbGF0aW9uLWlkJ10gPz9cclxuICAgICAgICAgICAgaGVhZGVyc1snY2xpZW50LWlkJ10gPz9cclxuICAgICAgICAgICAgaGVhZGVyc1snaW5zdGFsbGF0aW9uLWlkJ10sXHJcbiAgICAgICAgY2xpZW50SXA6IGhlYWRlcnNbJ3gtZm9yd2FyZGVkLWZvciddLFxyXG4gICAgICAgIHVzZXJBZ2VudDogaGVhZGVyc1sneC1mb3J3YXJkZWQtZm9yLXVzZXItYWdlbnQnXSA/PyBoZWFkZXJzWyd1c2VyLWFnZW50J10sXHJcbiAgICB9XHJcbn1cclxuIl19
|
|
@@ -0,0 +1,4 @@
|
|
|
1
|
+
import { AbortSignal } from '../context.js';
|
|
2
|
+
import { LogLevel, LogTransport, RootLogger } from './context.js';
|
|
3
|
+
export declare function makeLogger(transport: LogTransport, minimumLogLevel: LogLevel | undefined, signal: AbortSignal): RootLogger;
|
|
4
|
+
export declare function highPrecisionISODate(performanceNow: number): string;
|
package/host/logging.js
ADDED
|
@@ -0,0 +1,205 @@
|
|
|
1
|
+
var __classPrivateFieldSet = (this && this.__classPrivateFieldSet) || function (receiver, state, value, kind, f) {
|
|
2
|
+
if (kind === "m") throw new TypeError("Private method is not writable");
|
|
3
|
+
if (kind === "a" && !f) throw new TypeError("Private accessor was defined without a setter");
|
|
4
|
+
if (typeof state === "function" ? receiver !== state || !f : !state.has(receiver)) throw new TypeError("Cannot write private member to an object whose class did not declare it");
|
|
5
|
+
return (kind === "a" ? f.call(receiver, value) : f ? f.value = value : state.set(receiver, value)), value;
|
|
6
|
+
};
|
|
7
|
+
var __classPrivateFieldGet = (this && this.__classPrivateFieldGet) || function (receiver, state, kind, f) {
|
|
8
|
+
if (kind === "a" && !f) throw new TypeError("Private accessor was defined without a getter");
|
|
9
|
+
if (typeof state === "function" ? receiver !== state || !f : !state.has(receiver)) throw new TypeError("Cannot read private member from an object whose class did not declare it");
|
|
10
|
+
return kind === "m" ? f : kind === "a" ? f.call(receiver) : f ? f.value : state.get(receiver);
|
|
11
|
+
};
|
|
12
|
+
var _LogBuffer_instances, _LogBuffer_transport, _LogBuffer_entries, _LogBuffer_size, _LogBuffer_flusher, _LogBuffer_signal, _LogBuffer_asyncTransport, _LogBuffer_timeout, _LogBuffer_startFlush, _EnrichingLogger_buffer, _EnrichingLogger_reservedEnrichment, _EnrichingLogger_customEnrichment, _EnrichingLogger_level;
|
|
13
|
+
import { performance } from 'perf_hooks';
|
|
14
|
+
export function makeLogger(transport, minimumLogLevel, signal) {
|
|
15
|
+
return new EnrichingLogger(new LogBuffer(transport, signal), minimumLogLevel
|
|
16
|
+
? ['fatal', 'error', 'warning', 'info', 'debug', 'trace'].indexOf(minimumLogLevel)
|
|
17
|
+
: 5, signal);
|
|
18
|
+
}
|
|
19
|
+
const performanceTimeOrigin100ns = Math.round(performance.timeOrigin * 10000);
|
|
20
|
+
export function highPrecisionISODate(performanceNow) {
|
|
21
|
+
const now100ns = performanceTimeOrigin100ns + Math.round(performanceNow * 10000);
|
|
22
|
+
return (new Date(now100ns / 10000).toISOString().substring(0, 20) +
|
|
23
|
+
(now100ns % 10000000).toString().padStart(7, '0') +
|
|
24
|
+
'Z');
|
|
25
|
+
}
|
|
26
|
+
class LogBuffer {
|
|
27
|
+
constructor(transport, signal) {
|
|
28
|
+
_LogBuffer_instances.add(this);
|
|
29
|
+
_LogBuffer_transport.set(this, void 0);
|
|
30
|
+
_LogBuffer_entries.set(this, []);
|
|
31
|
+
_LogBuffer_size.set(this, 0);
|
|
32
|
+
_LogBuffer_flusher.set(this, void 0);
|
|
33
|
+
_LogBuffer_signal.set(this, void 0);
|
|
34
|
+
_LogBuffer_asyncTransport.set(this, void 0);
|
|
35
|
+
_LogBuffer_timeout.set(this, void 0);
|
|
36
|
+
__classPrivateFieldSet(this, _LogBuffer_transport, transport, "f");
|
|
37
|
+
__classPrivateFieldSet(this, _LogBuffer_signal, signal, "f");
|
|
38
|
+
}
|
|
39
|
+
collect(level, numericLogLevel, message, error, fields, reservedEnrichment, customEnrichment) {
|
|
40
|
+
const offset = performance.now();
|
|
41
|
+
const json = JSON.stringify({
|
|
42
|
+
timestamp: highPrecisionISODate(offset),
|
|
43
|
+
level,
|
|
44
|
+
message,
|
|
45
|
+
error: errorAsJson(error),
|
|
46
|
+
...reservedEnrichment,
|
|
47
|
+
...((fields || customEnrichment) && {
|
|
48
|
+
fields: customEnrichment
|
|
49
|
+
? fields
|
|
50
|
+
? { ...customEnrichment, ...fields }
|
|
51
|
+
: customEnrichment
|
|
52
|
+
: fields,
|
|
53
|
+
}),
|
|
54
|
+
});
|
|
55
|
+
__classPrivateFieldGet(this, _LogBuffer_entries, "f").push({
|
|
56
|
+
timestamp: offset,
|
|
57
|
+
level,
|
|
58
|
+
message,
|
|
59
|
+
error,
|
|
60
|
+
json,
|
|
61
|
+
});
|
|
62
|
+
__classPrivateFieldSet(this, _LogBuffer_size, __classPrivateFieldGet(this, _LogBuffer_size, "f") + json.length, "f");
|
|
63
|
+
if (__classPrivateFieldGet(this, _LogBuffer_asyncTransport, "f") === false) {
|
|
64
|
+
// eslint-disable-next-line no-void
|
|
65
|
+
void __classPrivateFieldGet(this, _LogBuffer_transport, "f").sendEntries(__classPrivateFieldGet(this, _LogBuffer_entries, "f"), __classPrivateFieldGet(this, _LogBuffer_signal, "f"));
|
|
66
|
+
__classPrivateFieldSet(this, _LogBuffer_entries, [], "f");
|
|
67
|
+
__classPrivateFieldSet(this, _LogBuffer_size, 0, "f");
|
|
68
|
+
}
|
|
69
|
+
else if (__classPrivateFieldGet(this, _LogBuffer_asyncTransport, "f") === undefined) {
|
|
70
|
+
__classPrivateFieldSet(this, _LogBuffer_asyncTransport, true, "f");
|
|
71
|
+
setImmediate(() => {
|
|
72
|
+
if (__classPrivateFieldGet(this, _LogBuffer_flusher, "f")) {
|
|
73
|
+
return;
|
|
74
|
+
}
|
|
75
|
+
const sendResult = __classPrivateFieldGet(this, _LogBuffer_transport, "f").sendEntries(__classPrivateFieldGet(this, _LogBuffer_entries, "f"), __classPrivateFieldGet(this, _LogBuffer_signal, "f"));
|
|
76
|
+
__classPrivateFieldSet(this, _LogBuffer_entries, [], "f");
|
|
77
|
+
__classPrivateFieldSet(this, _LogBuffer_size, 0, "f");
|
|
78
|
+
if (sendResult) {
|
|
79
|
+
__classPrivateFieldSet(this, _LogBuffer_flusher, sendResult, "f");
|
|
80
|
+
}
|
|
81
|
+
else {
|
|
82
|
+
__classPrivateFieldSet(this, _LogBuffer_asyncTransport, false, "f");
|
|
83
|
+
}
|
|
84
|
+
});
|
|
85
|
+
}
|
|
86
|
+
else {
|
|
87
|
+
if (numericLogLevel < 2 || __classPrivateFieldGet(this, _LogBuffer_entries, "f").length > 8 || __classPrivateFieldGet(this, _LogBuffer_size, "f") > 64000) {
|
|
88
|
+
// eslint-disable-next-line no-void
|
|
89
|
+
void this.flush();
|
|
90
|
+
}
|
|
91
|
+
else {
|
|
92
|
+
__classPrivateFieldSet(this, _LogBuffer_timeout, setTimeout(() => {
|
|
93
|
+
// eslint-disable-next-line no-void
|
|
94
|
+
void this.flush();
|
|
95
|
+
__classPrivateFieldSet(this, _LogBuffer_timeout, undefined, "f");
|
|
96
|
+
}, 2000), "f");
|
|
97
|
+
}
|
|
98
|
+
}
|
|
99
|
+
}
|
|
100
|
+
async flush() {
|
|
101
|
+
if (__classPrivateFieldGet(this, _LogBuffer_entries, "f").length === 0) {
|
|
102
|
+
return;
|
|
103
|
+
}
|
|
104
|
+
__classPrivateFieldGet(this, _LogBuffer_instances, "m", _LogBuffer_startFlush).call(this, __classPrivateFieldGet(this, _LogBuffer_entries, "f"));
|
|
105
|
+
__classPrivateFieldSet(this, _LogBuffer_entries, [], "f");
|
|
106
|
+
__classPrivateFieldSet(this, _LogBuffer_size, 0, "f");
|
|
107
|
+
if (__classPrivateFieldGet(this, _LogBuffer_timeout, "f")) {
|
|
108
|
+
clearTimeout(__classPrivateFieldGet(this, _LogBuffer_timeout, "f"));
|
|
109
|
+
__classPrivateFieldSet(this, _LogBuffer_timeout, undefined, "f");
|
|
110
|
+
}
|
|
111
|
+
return await __classPrivateFieldGet(this, _LogBuffer_flusher, "f");
|
|
112
|
+
}
|
|
113
|
+
}
|
|
114
|
+
_LogBuffer_transport = new WeakMap(), _LogBuffer_entries = new WeakMap(), _LogBuffer_size = new WeakMap(), _LogBuffer_flusher = new WeakMap(), _LogBuffer_signal = new WeakMap(), _LogBuffer_asyncTransport = new WeakMap(), _LogBuffer_timeout = new WeakMap(), _LogBuffer_instances = new WeakSet(), _LogBuffer_startFlush = function _LogBuffer_startFlush(entries) {
|
|
115
|
+
if (__classPrivateFieldGet(this, _LogBuffer_flusher, "f")) {
|
|
116
|
+
__classPrivateFieldSet(this, _LogBuffer_flusher, __classPrivateFieldGet(this, _LogBuffer_flusher, "f").then(() => __classPrivateFieldGet(this, _LogBuffer_transport, "f").sendEntries(entries, __classPrivateFieldGet(this, _LogBuffer_signal, "f"))), "f");
|
|
117
|
+
}
|
|
118
|
+
else {
|
|
119
|
+
__classPrivateFieldSet(this, _LogBuffer_flusher, __classPrivateFieldGet(this, _LogBuffer_transport, "f").sendEntries(entries, __classPrivateFieldGet(this, _LogBuffer_signal, "f")), "f");
|
|
120
|
+
}
|
|
121
|
+
};
|
|
122
|
+
class EnrichingLogger {
|
|
123
|
+
constructor(buffer, level, reservedEnrichment, customEnrichment) {
|
|
124
|
+
_EnrichingLogger_buffer.set(this, void 0);
|
|
125
|
+
_EnrichingLogger_reservedEnrichment.set(this, void 0);
|
|
126
|
+
_EnrichingLogger_customEnrichment.set(this, void 0);
|
|
127
|
+
_EnrichingLogger_level.set(this, void 0);
|
|
128
|
+
__classPrivateFieldSet(this, _EnrichingLogger_buffer, buffer, "f");
|
|
129
|
+
__classPrivateFieldSet(this, _EnrichingLogger_level, level, "f");
|
|
130
|
+
__classPrivateFieldSet(this, _EnrichingLogger_reservedEnrichment, reservedEnrichment, "f");
|
|
131
|
+
__classPrivateFieldSet(this, _EnrichingLogger_customEnrichment, customEnrichment, "f");
|
|
132
|
+
}
|
|
133
|
+
enrich(fields) {
|
|
134
|
+
return new EnrichingLogger(__classPrivateFieldGet(this, _EnrichingLogger_buffer, "f"), __classPrivateFieldGet(this, _EnrichingLogger_level, "f"), __classPrivateFieldGet(this, _EnrichingLogger_reservedEnrichment, "f"), {
|
|
135
|
+
...(__classPrivateFieldGet(this, _EnrichingLogger_customEnrichment, "f") ?? {}),
|
|
136
|
+
...fields,
|
|
137
|
+
});
|
|
138
|
+
}
|
|
139
|
+
flush() {
|
|
140
|
+
return __classPrivateFieldGet(this, _EnrichingLogger_buffer, "f").flush();
|
|
141
|
+
}
|
|
142
|
+
enrichReserved(fields) {
|
|
143
|
+
return new EnrichingLogger(__classPrivateFieldGet(this, _EnrichingLogger_buffer, "f"), __classPrivateFieldGet(this, _EnrichingLogger_level, "f"), {
|
|
144
|
+
...(__classPrivateFieldGet(this, _EnrichingLogger_reservedEnrichment, "f") ?? {}),
|
|
145
|
+
...fields,
|
|
146
|
+
}, __classPrivateFieldGet(this, _EnrichingLogger_customEnrichment, "f"));
|
|
147
|
+
}
|
|
148
|
+
trace(message, error, fields) {
|
|
149
|
+
if (__classPrivateFieldGet(this, _EnrichingLogger_level, "f") < 5) {
|
|
150
|
+
return;
|
|
151
|
+
}
|
|
152
|
+
__classPrivateFieldGet(this, _EnrichingLogger_buffer, "f").collect('trace', 5, message, error, fields, __classPrivateFieldGet(this, _EnrichingLogger_reservedEnrichment, "f"), __classPrivateFieldGet(this, _EnrichingLogger_customEnrichment, "f"));
|
|
153
|
+
}
|
|
154
|
+
debug(message, error, fields) {
|
|
155
|
+
if (__classPrivateFieldGet(this, _EnrichingLogger_level, "f") < 4) {
|
|
156
|
+
return;
|
|
157
|
+
}
|
|
158
|
+
__classPrivateFieldGet(this, _EnrichingLogger_buffer, "f").collect('debug', 4, message, error, fields, __classPrivateFieldGet(this, _EnrichingLogger_reservedEnrichment, "f"), __classPrivateFieldGet(this, _EnrichingLogger_customEnrichment, "f"));
|
|
159
|
+
}
|
|
160
|
+
info(message, error, fields) {
|
|
161
|
+
if (__classPrivateFieldGet(this, _EnrichingLogger_level, "f") < 3) {
|
|
162
|
+
return;
|
|
163
|
+
}
|
|
164
|
+
__classPrivateFieldGet(this, _EnrichingLogger_buffer, "f").collect('debug', 3, message, error, fields, __classPrivateFieldGet(this, _EnrichingLogger_reservedEnrichment, "f"), __classPrivateFieldGet(this, _EnrichingLogger_customEnrichment, "f"));
|
|
165
|
+
}
|
|
166
|
+
warn(message, error, fields) {
|
|
167
|
+
if (__classPrivateFieldGet(this, _EnrichingLogger_level, "f") < 2) {
|
|
168
|
+
return;
|
|
169
|
+
}
|
|
170
|
+
__classPrivateFieldGet(this, _EnrichingLogger_buffer, "f").collect('debug', 2, message, error, fields, __classPrivateFieldGet(this, _EnrichingLogger_reservedEnrichment, "f"), __classPrivateFieldGet(this, _EnrichingLogger_customEnrichment, "f"));
|
|
171
|
+
}
|
|
172
|
+
error(message, error, fields) {
|
|
173
|
+
if (__classPrivateFieldGet(this, _EnrichingLogger_level, "f") < 1) {
|
|
174
|
+
return;
|
|
175
|
+
}
|
|
176
|
+
__classPrivateFieldGet(this, _EnrichingLogger_buffer, "f").collect('error', 1, message, error, fields, __classPrivateFieldGet(this, _EnrichingLogger_reservedEnrichment, "f"), __classPrivateFieldGet(this, _EnrichingLogger_customEnrichment, "f"));
|
|
177
|
+
}
|
|
178
|
+
fatal(message, error, fields) {
|
|
179
|
+
__classPrivateFieldGet(this, _EnrichingLogger_buffer, "f").collect('fatal', 0, message, error, fields, __classPrivateFieldGet(this, _EnrichingLogger_reservedEnrichment, "f"), __classPrivateFieldGet(this, _EnrichingLogger_customEnrichment, "f"));
|
|
180
|
+
}
|
|
181
|
+
}
|
|
182
|
+
_EnrichingLogger_buffer = new WeakMap(), _EnrichingLogger_reservedEnrichment = new WeakMap(), _EnrichingLogger_customEnrichment = new WeakMap(), _EnrichingLogger_level = new WeakMap();
|
|
183
|
+
function errorAsJson(error) {
|
|
184
|
+
if (error === undefined || error === null) {
|
|
185
|
+
return undefined;
|
|
186
|
+
}
|
|
187
|
+
if (error instanceof Error) {
|
|
188
|
+
return {
|
|
189
|
+
message: error.message,
|
|
190
|
+
name: error.name,
|
|
191
|
+
stack: error.stack,
|
|
192
|
+
...error,
|
|
193
|
+
};
|
|
194
|
+
}
|
|
195
|
+
if (error instanceof Object) {
|
|
196
|
+
return {
|
|
197
|
+
...error,
|
|
198
|
+
};
|
|
199
|
+
}
|
|
200
|
+
return {
|
|
201
|
+
message: error?.toString(),
|
|
202
|
+
name: typeof error,
|
|
203
|
+
};
|
|
204
|
+
}
|
|
205
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibG9nZ2luZy5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbImxvZ2dpbmcudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7Ozs7Ozs7Ozs7O0FBQUEsT0FBTyxFQUFFLFdBQVcsRUFBRSxNQUFNLFlBQVksQ0FBQTtBQUl4QyxNQUFNLFVBQVUsVUFBVSxDQUN0QixTQUF1QixFQUN2QixlQUFxQyxFQUNyQyxNQUFtQjtJQUVuQixPQUFPLElBQUksZUFBZSxDQUN0QixJQUFJLFNBQVMsQ0FBQyxTQUFTLEVBQUUsTUFBTSxDQUFDLEVBQ2hDLGVBQWU7UUFDWCxDQUFDLENBQUMsQ0FBQyxPQUFPLEVBQUUsT0FBTyxFQUFFLFNBQVMsRUFBRSxNQUFNLEVBQUUsT0FBTyxFQUFFLE9BQU8sQ0FBQyxDQUFDLE9BQU8sQ0FBQyxlQUFlLENBQUM7UUFDbEYsQ0FBQyxDQUFDLENBQUMsRUFDUCxNQUFNLENBQ1QsQ0FBQTtBQUNMLENBQUM7QUFFRCxNQUFNLDBCQUEwQixHQUFHLElBQUksQ0FBQyxLQUFLLENBQUMsV0FBVyxDQUFDLFVBQVUsR0FBRyxLQUFLLENBQUMsQ0FBQTtBQUU3RSxNQUFNLFVBQVUsb0JBQW9CLENBQUMsY0FBc0I7SUFDdkQsTUFBTSxRQUFRLEdBQUcsMEJBQTBCLEdBQUcsSUFBSSxDQUFDLEtBQUssQ0FBQyxjQUFjLEdBQUcsS0FBSyxDQUFDLENBQUE7SUFDaEYsT0FBTyxDQUNILElBQUksSUFBSSxDQUFDLFFBQVEsR0FBRyxLQUFLLENBQUMsQ0FBQyxXQUFXLEVBQUUsQ0FBQyxTQUFTLENBQUMsQ0FBQyxFQUFFLEVBQUUsQ0FBQztRQUN6RCxDQUFDLFFBQVEsR0FBRyxRQUFRLENBQUMsQ0FBQyxRQUFRLEVBQUUsQ0FBQyxRQUFRLENBQUMsQ0FBQyxFQUFFLEdBQUcsQ0FBQztRQUNqRCxHQUFHLENBQ04sQ0FBQTtBQUNMLENBQUM7QUFFRCxNQUFNLFNBQVM7SUFTWCxZQUFZLFNBQXVCLEVBQUUsTUFBbUI7O1FBUnhELHVDQUFpQztRQUNqQyw2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LElBQUksK0JBQVEsQ0FBQyxPQUFPLENBQ2hCLE9BQU8sRUFDUCxDQUFDLEVBQ0QsT0FBTyxFQUNQLEtBQUssRUFDTCxNQUFNLEVBQ04sdUJBQUEsSUFBSSwyQ0FBb0IsRUFDeEIsdUJBQUEsSUFBSSx5Q0FBa0IsQ0FDekIsQ0FBQTtJQUNMLENBQUM7SUFDRCxLQUFLLENBQUMsT0FBZSxFQUFFLEtBQWMsRUFBRSxNQUEwQjtRQUM3RCx1QkFBQSxJQUFJLCtCQUFRLENBQUMsT0FBTyxDQUNoQixPQUFPLEVBQ1AsQ0FBQyxFQUNELE9BQU8sRUFDUCxLQUFLLEVBQ0wsTUFBTSxFQUNOLHVCQUFBLElBQUksMkNBQW9CLEVBQ3hCLHVCQUFBLElBQUkseUNBQWtCLENBQ3pCLENBQUE7SUFDTCxDQUFDO0NBQ0o7O0FBRUQsU0FBUyxXQUFXLENBQUMsS0FBYztJQUMvQixJQUFJLEtBQUssS0FBSyxTQUFTLElBQUksS0FBSyxLQUFLLElBQUksRUFBRTtRQUN2QyxPQUFPLFNBQVMsQ0FBQTtLQUNuQjtJQUNELElBQUksS0FBSyxZQUFZLEtBQUssRUFBRTtRQUN4QixPQUFPO1lBQ0gsT0FBTyxFQUFFLEtBQUssQ0FBQyxPQUFPO1lBQ3RCLElBQUksRUFBRSxLQUFLLENBQUMsSUFBSTtZQUNoQixLQUFLLEVBQUUsS0FBSyxDQUFDLEtBQUs7WUFDbEIsR0FBSSxLQUErQztTQUM5QyxDQUFBO0tBQ1o7SUFDRCxJQUFJLEtBQUssWUFBWSxNQUFNLEVBQUU7UUFDekIsT0FBTztZQUNILEdBQUcsS0FBSztTQUNILENBQUE7S0FDWjtJQUNELE9BQU87UUFDSCxPQUFPLEVBQUcsS0FBNEIsRUFBRSxRQUFRLEVBQUU7UUFDbEQsSUFBSSxFQUFFLE9BQU8sS0FBSztLQUNiLENBQUE7QUFDYixDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgcGVyZm9ybWFuY2UgfSBmcm9tICdwZXJmX2hvb2tzJ1xyXG5pbXBvcnQgeyBBYm9ydFNpZ25hbCwgSnNvbiwgTG9nZ2VyIH0gZnJvbSAnLi4vY29udGV4dC5qcydcclxuaW1wb3J0IHsgTG9nRW50cnksIExvZ0xldmVsLCBMb2dUcmFuc3BvcnQsIFJvb3RMb2dnZXIgfSBmcm9tICcuL2NvbnRleHQuanMnXHJcblxyXG5leHBvcnQgZnVuY3Rpb24gbWFrZUxvZ2dlcihcclxuICAgIHRyYW5zcG9ydDogTG9nVHJhbnNwb3J0LFxyXG4gICAgbWluaW11bUxvZ0xldmVsOiBMb2dMZXZlbCB8IHVuZGVmaW5lZCxcclxuICAgIHNpZ25hbDogQWJvcnRTaWduYWwsXHJcbik6IFJvb3RMb2dnZXIge1xyXG4gICAgcmV0dXJuIG5ldyBFbnJpY2hpbmdMb2dnZXIoXHJcbiAgICAgICAgbmV3IExvZ0J1ZmZlcih0cmFuc3BvcnQsIHNpZ25hbCksXHJcbiAgICAgICAgbWluaW11bUxvZ0xldmVsXHJcbiAgICAgICAgICAgID8gWydmYXRhbCcsICdlcnJvcicsICd3YXJuaW5nJywgJ2luZm8nLCAnZGVidWcnLCAndHJhY2UnXS5pbmRleE9mKG1pbmltdW1Mb2dMZXZlbClcclxuICAgICAgICAgICAgOiA1LFxyXG4gICAgICAgIHNpZ25hbCxcclxuICAgIClcclxufVxyXG5cclxuY29uc3QgcGVyZm9ybWFuY2VUaW1lT3JpZ2luMTAwbnMgPSBNYXRoLnJvdW5kKHBlcmZvcm1hbmNlLnRpbWVPcmlnaW4gKiAxMDAwMClcclxuXHJcbmV4cG9ydCBmdW5jdGlvbiBoaWdoUHJlY2lzaW9uSVNPRGF0ZShwZXJmb3JtYW5jZU5vdzogbnVtYmVyKSB7XHJcbiAgICBjb25zdCBub3cxMDBucyA9IHBlcmZvcm1hbmNlVGltZU9yaWdpbjEwMG5zICsgTWF0aC5yb3VuZChwZXJmb3JtYW5jZU5vdyAqIDEwMDAwKVxyXG4gICAgcmV0dXJuIChcclxuICAgICAgICBuZXcgRGF0ZShub3cxMDBucyAvIDEwMDAwKS50b0lTT1N0cmluZygpLnN1YnN0cmluZygwLCAyMCkgK1xyXG4gICAgICAgIChub3cxMDBucyAlIDEwMDAwMDAwKS50b1N0cmluZygpLnBhZFN0YXJ0KDcsICcwJykgK1xyXG4gICAgICAgICdaJ1xyXG4gICAgKVxyXG59XHJcblxyXG5jbGFzcyBMb2dCdWZmZXIge1xyXG4gICAgcmVhZG9ubHkgI3RyYW5zcG9ydDogTG9nVHJhbnNwb3J0XHJcbiAgICAjZW50cmllczogTG9nRW50cnlbXSA9IFtdXHJcbiAgICAjc2l6ZSA9IDBcclxuICAgICNmbHVzaGVyPzogUHJvbWlzZTx2b2lkPiB8IHVuZGVmaW5lZFxyXG4gICAgcmVhZG9ubHkgI3NpZ25hbDogQWJvcnRTaWduYWxcclxuICAgICNhc3luY1RyYW5zcG9ydDogYm9vbGVhbiB8IHVuZGVmaW5lZFxyXG4gICAgI3RpbWVvdXQ6IE5vZGVKUy5UaW1lb3V0IHwgdW5kZWZpbmVkXHJcblxyXG4gICAgY29uc3RydWN0b3IodHJhbnNwb3J0OiBMb2dUcmFuc3BvcnQsIHNpZ25hbDogQWJvcnRTaWduYWwpIHtcclxuICAgICAgICB0aGlzLiN0cmFuc3BvcnQgPSB0cmFuc3BvcnRcclxuICAgICAgICB0aGlzLiNzaWduYWwgPSBzaWduYWxcclxuICAgIH1cclxuXHJcbiAgICBjb2xsZWN0KFxyXG4gICAgICAgIGxldmVsOiBMb2dMZXZlbCxcclxuICAgICAgICBudW1lcmljTG9nTGV2ZWw6IG51bWJlcixcclxuICAgICAgICBtZXNzYWdlOiBzdHJpbmcsXHJcbiAgICAgICAgZXJyb3I6IHVua25vd24sXHJcbiAgICAgICAgZmllbGRzOiBvYmplY3QgfCB1bmRlZmluZWQsXHJcbiAgICAgICAgcmVzZXJ2ZWRFbnJpY2htZW50OiBvYmplY3QgfCB1bmRlZmluZWQsXHJcbiAgICAgICAgY3VzdG9tRW5yaWNobWVudDogb2JqZWN0IHwgdW5kZWZpbmVkLFxyXG4gICAgKSB7XHJcbiAgICAgICAgY29uc3Qgb2Zmc2V0ID0gcGVyZm9ybWFuY2Uubm93KClcclxuICAgICAgICBjb25zdCBqc29uID0gSlNPTi5zdHJpbmdpZnkoe1xyXG4gICAgICAgICAgICB0aW1lc3RhbXA6IGhpZ2hQcmVjaXNpb25JU09EYXRlKG9mZnNldCksXHJcbiAgICAgICAgICAgIGxldmVsLFxyXG4gICAgICAgICAgICBtZXNzYWdlLFxyXG4gICAgICAgICAgICBlcnJvcjogZXJyb3JBc0pzb24oZXJyb3IpLFxyXG4gICAgICAgICAgICAuLi5yZXNlcnZlZEVucmljaG1lbnQsXHJcbiAgICAgICAgICAgIC4uLigoZmllbGRzIHx8IGN1c3RvbUVucmljaG1lbnQpICYmIHtcclxuICAgICAgICAgICAgICAgIGZpZWxkczogY3VzdG9tRW5yaWNobWVudFxyXG4gICAgICAgICAgICAgICAgICAgID8gZmllbGRzXHJcbiAgICAgICAgICAgICAgICAgICAgICAgID8geyAuLi5jdXN0b21FbnJpY2htZW50LCAuLi5maWVsZHMgfVxyXG4gICAgICAgICAgICAgICAgICAgICAgICA6IGN1c3RvbUVucmljaG1lbnRcclxuICAgICAgICAgICAgICAgICAgICA6IGZpZWxkcyxcclxuICAgICAgICAgICAgfSksXHJcbiAgICAgICAgfSlcclxuICAgICAgICB0aGlzLiNlbnRyaWVzLnB1c2goe1xyXG4gICAgICAgICAgICB0aW1lc3RhbXA6IG9mZnNldCxcclxuICAgICAgICAgICAgbGV2ZWwsXHJcbiAgICAgICAgICAgIG1lc3NhZ2UsXHJcbiAgICAgICAgICAgIGVycm9yLFxyXG4gICAgICAgICAgICBqc29uLFxyXG4gICAgICAgIH0pXHJcbiAgICAgICAgdGhpcy4jc2l6ZSArPSBqc29uLmxlbmd0aFxyXG5cclxuICAgICAgICBpZiAodGhpcy4jYXN5bmNUcmFuc3BvcnQgPT09IGZhbHNlKSB7XHJcbiAgICAgICAgICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBuby12b2lkXHJcbiAgICAgICAgICAgIHZvaWQgdGhpcy4jdHJhbnNwb3J0LnNlbmRFbnRyaWVzKHRoaXMuI2VudHJpZXMsIHRoaXMuI3NpZ25hbClcclxuICAgICAgICAgICAgdGhpcy4jZW50cmllcyA9IFtdXHJcbiAgICAgICAgICAgIHRoaXMuI3NpemUgPSAwXHJcbiAgICAgICAgfSBlbHNlIGlmICh0aGlzLiNhc3luY1RyYW5zcG9ydCA9PT0gdW5kZWZpbmVkKSB7XHJcbiAgICAgICAgICAgIHRoaXMuI2FzeW5jVHJhbnNwb3J0ID0gdHJ1ZVxyXG4gICAgICAgICAgICBzZXRJbW1lZGlhdGUoKCkgPT4ge1xyXG4gICAgICAgICAgICAgICAgaWYgKHRoaXMuI2ZsdXNoZXIpIHtcclxuICAgICAgICAgICAgICAgICAgICByZXR1cm5cclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgIGNvbnN0IHNlbmRSZXN1bHQgPSB0aGlzLiN0cmFuc3BvcnQuc2VuZEVudHJpZXModGhpcy4jZW50cmllcywgdGhpcy4jc2lnbmFsKVxyXG4gICAgICAgICAgICAgICAgdGhpcy4jZW50cmllcyA9IFtdXHJcbiAgICAgICAgICAgICAgICB0aGlzLiNzaXplID0gMFxyXG4gICAgICAgICAgICAgICAgaWYgKHNlbmRSZXN1bHQpIHtcclxuICAgICAgICAgICAgICAgICAgICB0aGlzLiNmbHVzaGVyID0gc2VuZFJlc3VsdFxyXG4gICAgICAgICAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgICAgICAgICB0aGlzLiNhc3luY1RyYW5zcG9ydCA9IGZhbHNlXHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIH0pXHJcbiAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgaWYgKG51bWVyaWNMb2dMZXZlbCA8IDIgfHwgdGhpcy4jZW50cmllcy5sZW5ndGggPiA4IHx8IHRoaXMuI3NpemUgPiA2NDAwMCkge1xyXG4gICAgICAgICAgICAgICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIG5vLXZvaWRcclxuICAgICAgICAgICAgICAgIHZvaWQgdGhpcy5mbHVzaCgpXHJcbiAgICAgICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgICAgICB0aGlzLiN0aW1lb3V0ID0gc2V0VGltZW91dCgoKSA9PiB7XHJcbiAgICAgICAgICAgICAgICAgICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIG5vLXZvaWRcclxuICAgICAgICAgICAgICAgICAgICB2b2lkIHRoaXMuZmx1c2goKVxyXG4gICAgICAgICAgICAgICAgICAgIHRoaXMuI3RpbWVvdXQgPSB1bmRlZmluZWRcclxuICAgICAgICAgICAgICAgIH0sIDIwMDApXHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgYXN5bmMgZmx1c2goKTogUHJvbWlzZTx2b2lkPiB7XHJcbiAgICAgICAgaWYgKHRoaXMuI2VudHJpZXMubGVuZ3RoID09PSAwKSB7XHJcbiAgICAgICAgICAgIHJldHVyblxyXG4gICAgICAgIH1cclxuICAgICAgICB0aGlzLiNzdGFydEZsdXNoKHRoaXMuI2VudHJpZXMpXHJcbiAgICAgICAgdGhpcy4jZW50cmllcyA9IFtdXHJcbiAgICAgICAgdGhpcy4jc2l6ZSA9IDBcclxuICAgICAgICBpZiAodGhpcy4jdGltZW91dCkge1xyXG4gICAgICAgICAgICBjbGVhclRpbWVvdXQodGhpcy4jdGltZW91dClcclxuICAgICAgICAgICAgdGhpcy4jdGltZW91dCA9IHVuZGVmaW5lZFxyXG4gICAgICAgIH1cclxuICAgICAgICByZXR1cm4gYXdhaXQgdGhpcy4jZmx1c2hlclxyXG4gICAgfVxyXG5cclxuICAgICNzdGFydEZsdXNoKGVudHJpZXM6IExvZ0VudHJ5W10pIHtcclxuICAgICAgICBpZiAodGhpcy4jZmx1c2hlcikge1xyXG4gICAgICAgICAgICB0aGlzLiNmbHVzaGVyID0gdGhpcy4jZmx1c2hlci50aGVuKCgpID0+XHJcbiAgICAgICAgICAgICAgICB0aGlzLiN0cmFuc3BvcnQuc2VuZEVudHJpZXMoZW50cmllcywgdGhpcy4jc2lnbmFsKSxcclxuICAgICAgICAgICAgKVxyXG4gICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgIHRoaXMuI2ZsdXNoZXIgPSB0aGlzLiN0cmFuc3BvcnQuc2VuZEVudHJpZXMoZW50cmllcywgdGhpcy4jc2lnbmFsKVxyXG4gICAgICAgIH1cclxuICAgIH1cclxufVxyXG5cclxuY2xhc3MgRW5yaWNoaW5nTG9nZ2VyIGltcGxlbWVudHMgTG9nZ2VyIHtcclxuICAgIHJlYWRvbmx5ICNidWZmZXI6IExvZ0J1ZmZlclxyXG4gICAgcmVhZG9ubHkgI3Jlc2VydmVkRW5yaWNobWVudD86IG9iamVjdFxyXG4gICAgcmVhZG9ubHkgI2N1c3RvbUVucmljaG1lbnQ/OiBvYmplY3RcclxuICAgIHJlYWRvbmx5ICNsZXZlbDogbnVtYmVyXHJcblxyXG4gICAgY29uc3RydWN0b3IoXHJcbiAgICAgICAgYnVmZmVyOiBMb2dCdWZmZXIsXHJcbiAgICAgICAgbGV2ZWw6IG51bWJlcixcclxuICAgICAgICByZXNlcnZlZEVucmljaG1lbnQ/OiBvYmplY3QsXHJcbiAgICAgICAgY3VzdG9tRW5yaWNobWVudD86IG9iamVjdCxcclxuICAgICkge1xyXG4gICAgICAgIHRoaXMuI2J1ZmZlciA9IGJ1ZmZlclxyXG4gICAgICAgIHRoaXMuI2xldmVsID0gbGV2ZWxcclxuICAgICAgICB0aGlzLiNyZXNlcnZlZEVucmljaG1lbnQgPSByZXNlcnZlZEVucmljaG1lbnRcclxuICAgICAgICB0aGlzLiNjdXN0b21FbnJpY2htZW50ID0gY3VzdG9tRW5yaWNobWVudFxyXG4gICAgfVxyXG5cclxuICAgIGVucmljaChmaWVsZHM6IG9iamVjdCk6IExvZ2dlciB7XHJcbiAgICAgICAgcmV0dXJuIG5ldyBFbnJpY2hpbmdMb2dnZXIodGhpcy4jYnVmZmVyLCB0aGlzLiNsZXZlbCwgdGhpcy4jcmVzZXJ2ZWRFbnJpY2htZW50LCB7XHJcbiAgICAgICAgICAgIC4uLih0aGlzLiNjdXN0b21FbnJpY2htZW50ID8/IHt9KSxcclxuICAgICAgICAgICAgLi4uZmllbGRzLFxyXG4gICAgICAgIH0pXHJcbiAgICB9XHJcblxyXG4gICAgZmx1c2goKSB7XHJcbiAgICAgICAgcmV0dXJuIHRoaXMuI2J1ZmZlci5mbHVzaCgpXHJcbiAgICB9XHJcblxyXG4gICAgZW5yaWNoUmVzZXJ2ZWQoZmllbGRzOiBvYmplY3QpOiBFbnJpY2hpbmdMb2dnZXIge1xyXG4gICAgICAgIHJldHVybiBuZXcgRW5yaWNoaW5nTG9nZ2VyKFxyXG4gICAgICAgICAgICB0aGlzLiNidWZmZXIsXHJcbiAgICAgICAgICAgIHRoaXMuI2xldmVsLFxyXG4gICAgICAgICAgICB7XHJcbiAgICAgICAgICAgICAgICAuLi4odGhpcy4jcmVzZXJ2ZWRFbnJpY2htZW50ID8/IHt9KSxcclxuICAgICAgICAgICAgICAgIC4uLmZpZWxkcyxcclxuICAgICAgICAgICAgfSxcclxuICAgICAgICAgICAgdGhpcy4jY3VzdG9tRW5yaWNobWVudCxcclxuICAgICAgICApXHJcbiAgICB9XHJcblxyXG4gICAgdHJhY2UobWVzc2FnZTogc3RyaW5nLCBlcnJvcjogdW5rbm93biwgZmllbGRzOiBvYmplY3QgfCB1bmRlZmluZWQpOiB2b2lkIHtcclxuICAgICAgICBpZiAodGhpcy4jbGV2ZWwgPCA1KSB7XHJcbiAgICAgICAgICAgIHJldHVyblxyXG4gICAgICAgIH1cclxuICAgICAgICB0aGlzLiNidWZmZXIuY29sbGVjdChcclxuICAgICAgICAgICAgJ3RyYWNlJyxcclxuICAgICAgICAgICAgNSxcclxuICAgICAgICAgICAgbWVzc2FnZSxcclxuICAgICAgICAgICAgZXJyb3IsXHJcbiAgICAgICAgICAgIGZpZWxkcyxcclxuICAgICAgICAgICAgdGhpcy4jcmVzZXJ2ZWRFbnJpY2htZW50LFxyXG4gICAgICAgICAgICB0aGlzLiNjdXN0b21FbnJpY2htZW50LFxyXG4gICAgICAgIClcclxuICAgIH1cclxuICAgIGRlYnVnKG1lc3NhZ2U6IHN0cmluZywgZXJyb3I6IHVua25vd24sIGZpZWxkczogb2JqZWN0IHwgdW5kZWZpbmVkKTogdm9pZCB7XHJcbiAgICAgICAgaWYgKHRoaXMuI2xldmVsIDwgNCkge1xyXG4gICAgICAgICAgICByZXR1cm5cclxuICAgICAgICB9XHJcbiAgICAgICAgdGhpcy4jYnVmZmVyLmNvbGxlY3QoXHJcbiAgICAgICAgICAgICdkZWJ1ZycsXHJcbiAgICAgICAgICAgIDQsXHJcbiAgICAgICAgICAgIG1lc3NhZ2UsXHJcbiAgICAgICAgICAgIGVycm9yLFxyXG4gICAgICAgICAgICBmaWVsZHMsXHJcbiAgICAgICAgICAgIHRoaXMuI3Jlc2VydmVkRW5yaWNobWVudCxcclxuICAgICAgICAgICAgdGhpcy4jY3VzdG9tRW5yaWNobWVudCxcclxuICAgICAgICApXHJcbiAgICB9XHJcbiAgICBpbmZvKG1lc3NhZ2U6IHN0cmluZywgZXJyb3I6IHVua25vd24sIGZpZWxkczogb2JqZWN0IHwgdW5kZWZpbmVkKTogdm9pZCB7XHJcbiAgICAgICAgaWYgKHRoaXMuI2xldmVsIDwgMykge1xyXG4gICAgICAgICAgICByZXR1cm5cclxuICAgICAgICB9XHJcbiAgICAgICAgdGhpcy4jYnVmZmVyLmNvbGxlY3QoXHJcbiAgICAgICAgICAgICdkZWJ1ZycsXHJcbiAgICAgICAgICAgIDMsXHJcbiAgICAgICAgICAgIG1lc3NhZ2UsXHJcbiAgICAgICAgICAgIGVycm9yLFxyXG4gICAgICAgICAgICBmaWVsZHMsXHJcbiAgICAgICAgICAgIHRoaXMuI3Jlc2VydmVkRW5yaWNobWVudCxcclxuICAgICAgICAgICAgdGhpcy4jY3VzdG9tRW5yaWNobWVudCxcclxuICAgICAgICApXHJcbiAgICB9XHJcbiAgICB3YXJuKG1lc3NhZ2U6IHN0cmluZywgZXJyb3I6IHVua25vd24sIGZpZWxkczogb2JqZWN0IHwgdW5kZWZpbmVkKTogdm9pZCB7XHJcbiAgICAgICAgaWYgKHRoaXMuI2xldmVsIDwgMikge1xyXG4gICAgICAgICAgICByZXR1cm5cclxuICAgICAgICB9XHJcbiAgICAgICAgdGhpcy4jYnVmZmVyLmNvbGxlY3QoXHJcbiAgICAgICAgICAgICdkZWJ1ZycsXHJcbiAgICAgICAgICAgIDIsXHJcbiAgICAgICAgICAgIG1lc3NhZ2UsXHJcbiAgICAgICAgICAgIGVycm9yLFxyXG4gICAgICAgICAgICBmaWVsZHMsXHJcbiAgICAgICAgICAgIHRoaXMuI3Jlc2VydmVkRW5yaWNobWVudCxcclxuICAgICAgICAgICAgdGhpcy4jY3VzdG9tRW5yaWNobWVudCxcclxuICAgICAgICApXHJcbiAgICB9XHJcbiAgICBlcnJvcihtZXNzYWdlOiBzdHJpbmcsIGVycm9yOiB1bmtub3duLCBmaWVsZHM6IG9iamVjdCB8IHVuZGVmaW5lZCk6IHZvaWQge1xyXG4gICAgICAgIGlmICh0aGlzLiNsZXZlbCA8IDEpIHtcclxuICAgICAgICAgICAgcmV0dXJuXHJcbiAgICAgICAgfVxyXG4gICAgICAgIHRoaXMuI2J1ZmZlci5jb2xsZWN0KFxyXG4gICAgICAgICAgICAnZXJyb3InLFxyXG4gICAgICAgICAgICAxLFxyXG4gICAgICAgICAgICBtZXNzYWdlLFxyXG4gICAgICAgICAgICBlcnJvcixcclxuICAgICAgICAgICAgZmllbGRzLFxyXG4gICAgICAgICAgICB0aGlzLiNyZXNlcnZlZEVucmljaG1lbnQsXHJcbiAgICAgICAgICAgIHRoaXMuI2N1c3RvbUVucmljaG1lbnQsXHJcbiAgICAgICAgKVxyXG4gICAgfVxyXG4gICAgZmF0YWwobWVzc2FnZTogc3RyaW5nLCBlcnJvcjogdW5rbm93biwgZmllbGRzOiBvYmplY3QgfCB1bmRlZmluZWQpOiB2b2lkIHtcclxuICAgICAgICB0aGlzLiNidWZmZXIuY29sbGVjdChcclxuICAgICAgICAgICAgJ2ZhdGFsJyxcclxuICAgICAgICAgICAgMCxcclxuICAgICAgICAgICAgbWVzc2FnZSxcclxuICAgICAgICAgICAgZXJyb3IsXHJcbiAgICAgICAgICAgIGZpZWxkcyxcclxuICAgICAgICAgICAgdGhpcy4jcmVzZXJ2ZWRFbnJpY2htZW50LFxyXG4gICAgICAgICAgICB0aGlzLiNjdXN0b21FbnJpY2htZW50LFxyXG4gICAgICAgIClcclxuICAgIH1cclxufVxyXG5cclxuZnVuY3Rpb24gZXJyb3JBc0pzb24oZXJyb3I6IHVua25vd24pOiBKc29uIHwgdW5kZWZpbmVkIHtcclxuICAgIGlmIChlcnJvciA9PT0gdW5kZWZpbmVkIHx8IGVycm9yID09PSBudWxsKSB7XHJcbiAgICAgICAgcmV0dXJuIHVuZGVmaW5lZFxyXG4gICAgfVxyXG4gICAgaWYgKGVycm9yIGluc3RhbmNlb2YgRXJyb3IpIHtcclxuICAgICAgICByZXR1cm4ge1xyXG4gICAgICAgICAgICBtZXNzYWdlOiBlcnJvci5tZXNzYWdlLFxyXG4gICAgICAgICAgICBuYW1lOiBlcnJvci5uYW1lLFxyXG4gICAgICAgICAgICBzdGFjazogZXJyb3Iuc3RhY2ssXHJcbiAgICAgICAgICAgIC4uLihlcnJvciBhcyB1bmtub3duIGFzIHsgW2tleTogc3RyaW5nXTogdW5rbm93biB9KSxcclxuICAgICAgICB9IGFzIEpzb25cclxuICAgIH1cclxuICAgIGlmIChlcnJvciBpbnN0YW5jZW9mIE9iamVjdCkge1xyXG4gICAgICAgIHJldHVybiB7XHJcbiAgICAgICAgICAgIC4uLmVycm9yLFxyXG4gICAgICAgIH0gYXMgSnNvblxyXG4gICAgfVxyXG4gICAgcmV0dXJuIHtcclxuICAgICAgICBtZXNzYWdlOiAoZXJyb3IgYXMgb2JqZWN0IHwgdW5kZWZpbmVkKT8udG9TdHJpbmcoKSxcclxuICAgICAgICBuYW1lOiB0eXBlb2YgZXJyb3IsXHJcbiAgICB9IGFzIEpzb25cclxufVxyXG4iXX0=
|
|
@@ -0,0 +1,24 @@
|
|
|
1
|
+
/// <reference types="node" resolution-mode="require"/>
|
|
2
|
+
import { HttpHandlerConfiguration } from '../http.js';
|
|
3
|
+
declare type CPU = 'arm' | 'arm64' | 'ia32' | 'mips' | 'mipsel' | 'ppc' | 'ppc64' | 's390' | 's390x' | 'x32' | 'x64';
|
|
4
|
+
declare type CpuConfig = CPU | `!${CPU}`;
|
|
5
|
+
declare type OSConfig = NodeJS.Platform | `!${NodeJS.Platform}`;
|
|
6
|
+
export interface PackageJsonConfiguration {
|
|
7
|
+
nodeVersion?: string;
|
|
8
|
+
cpus?: CpuConfig[];
|
|
9
|
+
os?: OSConfig[];
|
|
10
|
+
}
|
|
11
|
+
export interface Reflection {
|
|
12
|
+
name: string;
|
|
13
|
+
http: {
|
|
14
|
+
name: string;
|
|
15
|
+
method: string;
|
|
16
|
+
pathPattern: string;
|
|
17
|
+
pathRegExp: RegExp;
|
|
18
|
+
config: HttpHandlerConfiguration & PackageJsonConfiguration;
|
|
19
|
+
}[];
|
|
20
|
+
}
|
|
21
|
+
export declare function resolveCpu(config: PackageJsonConfiguration, supported: CPU[]): CPU;
|
|
22
|
+
export declare function resolveOS(config: PackageJsonConfiguration, supported: NodeJS.Platform[]): NodeJS.Platform;
|
|
23
|
+
export declare function reflect(path: string): Promise<Reflection>;
|
|
24
|
+
export {};
|
package/host/reflect.js
ADDED
|
@@ -0,0 +1,57 @@
|
|
|
1
|
+
import { readdir, readFile } from 'node:fs/promises';
|
|
2
|
+
import { basename, extname, join } from 'node:path';
|
|
3
|
+
import { pathToFileURL } from 'node:url';
|
|
4
|
+
export function resolveCpu(config, supported) {
|
|
5
|
+
const resolved = resolve(config.cpus, supported);
|
|
6
|
+
if (!resolved) {
|
|
7
|
+
// resolve<T>(config, supported) actually asserts config is (T | `!${T}`)[], but that's not supported yet.
|
|
8
|
+
// eslint-disable-next-line @typescript-eslint/no-non-null-assertion
|
|
9
|
+
throw new Error('Unsupported CPUs: ' + config.cpus.join(', '));
|
|
10
|
+
}
|
|
11
|
+
return resolved;
|
|
12
|
+
}
|
|
13
|
+
export function resolveOS(config, supported) {
|
|
14
|
+
const resolved = resolve(config.os, supported);
|
|
15
|
+
if (!resolved) {
|
|
16
|
+
// resolve<T>(config, supported) actually asserts config is (T | `!${T}`)[], but that's not supported yet.
|
|
17
|
+
// eslint-disable-next-line @typescript-eslint/no-non-null-assertion
|
|
18
|
+
throw new Error('Unsupported operating systems: ' + config.os.join(', '));
|
|
19
|
+
}
|
|
20
|
+
return resolved;
|
|
21
|
+
}
|
|
22
|
+
function resolve(config, supported) {
|
|
23
|
+
if (!config) {
|
|
24
|
+
return supported[0];
|
|
25
|
+
}
|
|
26
|
+
return supported.find(s => config.includes(s) && !config.includes(`!${s}`));
|
|
27
|
+
}
|
|
28
|
+
export async function reflect(path) {
|
|
29
|
+
const packageJson = await readConfig();
|
|
30
|
+
const files = (await readdir(path)).filter(file => extname(file) === '.ts' && !file.endsWith('.d.ts'));
|
|
31
|
+
const { getHandlers, setMeta } = (await import(pathToFileURL(join(process.cwd(), 'node_modules/@riddance/host/host/registry.js')).toString()));
|
|
32
|
+
for (const file of files) {
|
|
33
|
+
const base = basename(file, '.ts');
|
|
34
|
+
setMeta(packageJson.name, base, undefined, packageJson.config);
|
|
35
|
+
await import(pathToFileURL(join(process.cwd(), path, base + '.js')).toString());
|
|
36
|
+
}
|
|
37
|
+
return {
|
|
38
|
+
name: packageJson.name,
|
|
39
|
+
http: getHandlers('http').map(h => ({
|
|
40
|
+
config: {
|
|
41
|
+
...h.config,
|
|
42
|
+
cpus: packageJson.cpu,
|
|
43
|
+
os: packageJson.os,
|
|
44
|
+
nodeVersion: packageJson.engines?.node,
|
|
45
|
+
},
|
|
46
|
+
name: h.meta?.fileName ?? '',
|
|
47
|
+
method: h.method,
|
|
48
|
+
pathPattern: h.pathPattern,
|
|
49
|
+
pathRegExp: h.pathRegExp,
|
|
50
|
+
})),
|
|
51
|
+
};
|
|
52
|
+
}
|
|
53
|
+
async function readConfig() {
|
|
54
|
+
const packageJson = JSON.parse(await readFile('package.json', 'utf-8'));
|
|
55
|
+
return packageJson;
|
|
56
|
+
}
|
|
57
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicmVmbGVjdC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbInJlZmxlY3QudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFFLE9BQU8sRUFBRSxRQUFRLEVBQUUsTUFBTSxrQkFBa0IsQ0FBQTtBQUNwRCxPQUFPLEVBQUUsUUFBUSxFQUFFLE9BQU8sRUFBRSxJQUFJLEVBQUUsTUFBTSxXQUFXLENBQUE7QUFDbkQsT0FBTyxFQUFFLGFBQWEsRUFBRSxNQUFNLFVBQVUsQ0FBQTtBQW9DeEMsTUFBTSxVQUFVLFVBQVUsQ0FBQyxNQUFnQyxFQUFFLFNBQWdCO0lBQ3pFLE1BQU0sUUFBUSxHQUFHLE9BQU8sQ0FBQyxNQUFNLENBQUMsSUFBSSxFQUFFLFNBQVMsQ0FBQyxDQUFBO0lBQ2hELElBQUksQ0FBQyxRQUFRLEVBQUU7UUFDWCwwR0FBMEc7UUFDMUcsb0VBQW9FO1FBQ3BFLE1BQU0sSUFBSSxLQUFLLENBQUMsb0JBQW9CLEdBQUcsTUFBTSxDQUFDLElBQUssQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQTtLQUNsRTtJQUNELE9BQU8sUUFBUSxDQUFBO0FBQ25CLENBQUM7QUFFRCxNQUFNLFVBQVUsU0FBUyxDQUNyQixNQUFnQyxFQUNoQyxTQUE0QjtJQUU1QixNQUFNLFFBQVEsR0FBRyxPQUFPLENBQUMsTUFBTSxDQUFDLEVBQUUsRUFBRSxTQUFTLENBQUMsQ0FBQTtJQUM5QyxJQUFJLENBQUMsUUFBUSxFQUFFO1FBQ1gsMEdBQTBHO1FBQzFHLG9FQUFvRTtRQUNwRSxNQUFNLElBQUksS0FBSyxDQUFDLGlDQUFpQyxHQUFHLE1BQU0sQ0FBQyxFQUFHLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUE7S0FDN0U7SUFDRCxPQUFPLFFBQVEsQ0FBQTtBQUNuQixDQUFDO0FBRUQsU0FBUyxPQUFPLENBQ1osTUFBbUMsRUFDbkMsU0FBYztJQUVkLElBQUksQ0FBQyxNQUFNLEVBQUU7UUFDVCxPQUFPLFNBQVMsQ0FBQyxDQUFDLENBQUMsQ0FBQTtLQUN0QjtJQUNELE9BQU8sU0FBUyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLE1BQU0sQ0FBQyxRQUFRLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxNQUFNLENBQUMsUUFBUSxDQUFDLElBQUksQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFBO0FBQy9FLENBQUM7QUFFRCxNQUFNLENBQUMsS0FBSyxVQUFVLE9BQU8sQ0FBQyxJQUFZO0lBQ3RDLE1BQU0sV0FBVyxHQUFHLE1BQU0sVUFBVSxFQUFFLENBQUE7SUFDdEMsTUFBTSxLQUFLLEdBQUcsQ0FBQyxNQUFNLE9BQU8sQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLE1BQU0sQ0FDdEMsSUFBSSxDQUFDLEVBQUUsQ0FBQyxPQUFPLENBQUMsSUFBSSxDQUFDLEtBQUssS0FBSyxJQUFJLENBQUMsSUFBSSxDQUFDLFFBQVEsQ0FBQyxPQUFPLENBQUMsQ0FDN0QsQ0FBQTtJQUNELE1BQU0sRUFBRSxXQUFXLEVBQUUsT0FBTyxFQUFFLEdBQUcsQ0FBQyxNQUFNLE1BQU0sQ0FDMUMsYUFBYSxDQUNULElBQUksQ0FBQyxPQUFPLENBQUMsR0FBRyxFQUFFLEVBQUUsOENBQThDLENBQUMsQ0FDdEUsQ0FBQyxRQUFRLEVBQUUsQ0FDZixDQWVBLENBQUE7SUFFRCxLQUFLLE1BQU0sSUFBSSxJQUFJLEtBQUssRUFBRTtRQUN0QixNQUFNLElBQUksR0FBRyxRQUFRLENBQUMsSUFBSSxFQUFFLEtBQUssQ0FBQyxDQUFBO1FBQ2xDLE9BQU8sQ0FBQyxXQUFXLENBQUMsSUFBSSxFQUFFLElBQUksRUFBRSxTQUFTLEVBQUUsV0FBVyxDQUFDLE1BQU0sQ0FBQyxDQUFBO1FBQzlELE1BQU0sTUFBTSxDQUFDLGFBQWEsQ0FBQyxJQUFJLENBQUMsT0FBTyxDQUFDLEdBQUcsRUFBRSxFQUFFLElBQUksRUFBRSxJQUFJLEdBQUcsS0FBSyxDQUFDLENBQUMsQ0FBQyxRQUFRLEVBQUUsQ0FBQyxDQUFBO0tBQ2xGO0lBRUQsT0FBTztRQUNILElBQUksRUFBRSxXQUFXLENBQUMsSUFBSTtRQUN0QixJQUFJLEVBQUUsV0FBVyxDQUFDLE1BQU0sQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUM7WUFDaEMsTUFBTSxFQUFFO2dCQUNKLEdBQUcsQ0FBQyxDQUFDLE1BQU07Z0JBQ1gsSUFBSSxFQUFFLFdBQVcsQ0FBQyxHQUFHO2dCQUNyQixFQUFFLEVBQUUsV0FBVyxDQUFDLEVBQUU7Z0JBQ2xCLFdBQVcsRUFBRSxXQUFXLENBQUMsT0FBTyxFQUFFLElBQUk7YUFDekM7WUFDRCxJQUFJLEVBQUUsQ0FBQyxDQUFDLElBQUksRUFBRSxRQUFRLElBQUksRUFBRTtZQUM1QixNQUFNLEVBQUUsQ0FBQyxDQUFDLE1BQU07WUFDaEIsV0FBVyxFQUFFLENBQUMsQ0FBQyxXQUFXO1lBQzFCLFVBQVUsRUFBRSxDQUFDLENBQUMsVUFBVTtTQUMzQixDQUFDLENBQUM7S0FDTixDQUFBO0FBQ0wsQ0FBQztBQUVELEtBQUssVUFBVSxVQUFVO0lBQ3JCLE1BQU0sV0FBVyxHQUFHLElBQUksQ0FBQyxLQUFLLENBQUMsTUFBTSxRQUFRLENBQUMsY0FBYyxFQUFFLE9BQU8sQ0FBQyxDQU1yRSxDQUFBO0lBQ0QsT0FBTyxXQUFXLENBQUE7QUFDdEIsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IHJlYWRkaXIsIHJlYWRGaWxlIH0gZnJvbSAnbm9kZTpmcy9wcm9taXNlcydcclxuaW1wb3J0IHsgYmFzZW5hbWUsIGV4dG5hbWUsIGpvaW4gfSBmcm9tICdub2RlOnBhdGgnXHJcbmltcG9ydCB7IHBhdGhUb0ZpbGVVUkwgfSBmcm9tICdub2RlOnVybCdcclxuaW1wb3J0IHsgSHR0cEhhbmRsZXJDb25maWd1cmF0aW9uIH0gZnJvbSAnLi4vaHR0cC5qcydcclxuaW1wb3J0IHsgUGFja2FnZUNvbmZpZ3VyYXRpb24gfSBmcm9tICcuL3JlZ2lzdHJ5LmpzJ1xyXG5cclxudHlwZSBDUFUgPVxyXG4gICAgfCAnYXJtJ1xyXG4gICAgfCAnYXJtNjQnXHJcbiAgICB8ICdpYTMyJ1xyXG4gICAgfCAnbWlwcydcclxuICAgIHwgJ21pcHNlbCdcclxuICAgIHwgJ3BwYydcclxuICAgIHwgJ3BwYzY0J1xyXG4gICAgfCAnczM5MCdcclxuICAgIHwgJ3MzOTB4J1xyXG4gICAgfCAneDMyJ1xyXG4gICAgfCAneDY0J1xyXG50eXBlIENwdUNvbmZpZyA9IENQVSB8IGAhJHtDUFV9YFxyXG50eXBlIE9TQ29uZmlnID0gTm9kZUpTLlBsYXRmb3JtIHwgYCEke05vZGVKUy5QbGF0Zm9ybX1gXHJcblxyXG5leHBvcnQgaW50ZXJmYWNlIFBhY2thZ2VKc29uQ29uZmlndXJhdGlvbiB7XHJcbiAgICBub2RlVmVyc2lvbj86IHN0cmluZ1xyXG4gICAgY3B1cz86IENwdUNvbmZpZ1tdXHJcbiAgICBvcz86IE9TQ29uZmlnW11cclxufVxyXG5cclxuZXhwb3J0IGludGVyZmFjZSBSZWZsZWN0aW9uIHtcclxuICAgIG5hbWU6IHN0cmluZ1xyXG4gICAgaHR0cDoge1xyXG4gICAgICAgIG5hbWU6IHN0cmluZ1xyXG4gICAgICAgIG1ldGhvZDogc3RyaW5nXHJcbiAgICAgICAgcGF0aFBhdHRlcm46IHN0cmluZ1xyXG4gICAgICAgIHBhdGhSZWdFeHA6IFJlZ0V4cFxyXG4gICAgICAgIGNvbmZpZzogSHR0cEhhbmRsZXJDb25maWd1cmF0aW9uICYgUGFja2FnZUpzb25Db25maWd1cmF0aW9uXHJcbiAgICB9W11cclxufVxyXG5cclxuZXhwb3J0IGZ1bmN0aW9uIHJlc29sdmVDcHUoY29uZmlnOiBQYWNrYWdlSnNvbkNvbmZpZ3VyYXRpb24sIHN1cHBvcnRlZDogQ1BVW10pOiBDUFUge1xyXG4gICAgY29uc3QgcmVzb2x2ZWQgPSByZXNvbHZlKGNvbmZpZy5jcHVzLCBzdXBwb3J0ZWQpXHJcbiAgICBpZiAoIXJlc29sdmVkKSB7XHJcbiAgICAgICAgLy8gcmVzb2x2ZTxUPihjb25maWcsIHN1cHBvcnRlZCkgYWN0dWFsbHkgYXNzZXJ0cyBjb25maWcgaXMgKFQgfCBgISR7VH1gKVtdLCBidXQgdGhhdCdzIG5vdCBzdXBwb3J0ZWQgeWV0LlxyXG4gICAgICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBAdHlwZXNjcmlwdC1lc2xpbnQvbm8tbm9uLW51bGwtYXNzZXJ0aW9uXHJcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdVbnN1cHBvcnRlZCBDUFVzOiAnICsgY29uZmlnLmNwdXMhLmpvaW4oJywgJykpXHJcbiAgICB9XHJcbiAgICByZXR1cm4gcmVzb2x2ZWRcclxufVxyXG5cclxuZXhwb3J0IGZ1bmN0aW9uIHJlc29sdmVPUyhcclxuICAgIGNvbmZpZzogUGFja2FnZUpzb25Db25maWd1cmF0aW9uLFxyXG4gICAgc3VwcG9ydGVkOiBOb2RlSlMuUGxhdGZvcm1bXSxcclxuKTogTm9kZUpTLlBsYXRmb3JtIHtcclxuICAgIGNvbnN0IHJlc29sdmVkID0gcmVzb2x2ZShjb25maWcub3MsIHN1cHBvcnRlZClcclxuICAgIGlmICghcmVzb2x2ZWQpIHtcclxuICAgICAgICAvLyByZXNvbHZlPFQ+KGNvbmZpZywgc3VwcG9ydGVkKSBhY3R1YWxseSBhc3NlcnRzIGNvbmZpZyBpcyAoVCB8IGAhJHtUfWApW10sIGJ1dCB0aGF0J3Mgbm90IHN1cHBvcnRlZCB5ZXQuXHJcbiAgICAgICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9uby1ub24tbnVsbC1hc3NlcnRpb25cclxuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ1Vuc3VwcG9ydGVkIG9wZXJhdGluZyBzeXN0ZW1zOiAnICsgY29uZmlnLm9zIS5qb2luKCcsICcpKVxyXG4gICAgfVxyXG4gICAgcmV0dXJuIHJlc29sdmVkXHJcbn1cclxuXHJcbmZ1bmN0aW9uIHJlc29sdmU8VCBleHRlbmRzIHN0cmluZz4oXHJcbiAgICBjb25maWc6IChUIHwgYCEke1R9YClbXSB8IHVuZGVmaW5lZCxcclxuICAgIHN1cHBvcnRlZDogVFtdLFxyXG4pOiBUIHwgdW5kZWZpbmVkIHtcclxuICAgIGlmICghY29uZmlnKSB7XHJcbiAgICAgICAgcmV0dXJuIHN1cHBvcnRlZFswXVxyXG4gICAgfVxyXG4gICAgcmV0dXJuIHN1cHBvcnRlZC5maW5kKHMgPT4gY29uZmlnLmluY2x1ZGVzKHMpICYmICFjb25maWcuaW5jbHVkZXMoYCEke3N9YCkpXHJcbn1cclxuXHJcbmV4cG9ydCBhc3luYyBmdW5jdGlvbiByZWZsZWN0KHBhdGg6IHN0cmluZyk6IFByb21pc2U8UmVmbGVjdGlvbj4ge1xyXG4gICAgY29uc3QgcGFja2FnZUpzb24gPSBhd2FpdCByZWFkQ29uZmlnKClcclxuICAgIGNvbnN0IGZpbGVzID0gKGF3YWl0IHJlYWRkaXIocGF0aCkpLmZpbHRlcihcclxuICAgICAgICBmaWxlID0+IGV4dG5hbWUoZmlsZSkgPT09ICcudHMnICYmICFmaWxlLmVuZHNXaXRoKCcuZC50cycpLFxyXG4gICAgKVxyXG4gICAgY29uc3QgeyBnZXRIYW5kbGVycywgc2V0TWV0YSB9ID0gKGF3YWl0IGltcG9ydChcclxuICAgICAgICBwYXRoVG9GaWxlVVJMKFxyXG4gICAgICAgICAgICBqb2luKHByb2Nlc3MuY3dkKCksICdub2RlX21vZHVsZXMvQHJpZGRhbmNlL2hvc3QvaG9zdC9yZWdpc3RyeS5qcycpLFxyXG4gICAgICAgICkudG9TdHJpbmcoKVxyXG4gICAgKSkgYXMge1xyXG4gICAgICAgIGdldEhhbmRsZXJzOiAodHlwZTogc3RyaW5nKSA9PiB7XHJcbiAgICAgICAgICAgIG5hbWU6IHN0cmluZ1xyXG4gICAgICAgICAgICBtZXRhPzogeyBmaWxlTmFtZTogc3RyaW5nIH1cclxuICAgICAgICAgICAgY29uZmlnOiBIdHRwSGFuZGxlckNvbmZpZ3VyYXRpb25cclxuICAgICAgICAgICAgbWV0aG9kOiBzdHJpbmdcclxuICAgICAgICAgICAgcGF0aFBhdHRlcm46IHN0cmluZ1xyXG4gICAgICAgICAgICBwYXRoUmVnRXhwOiBSZWdFeHBcclxuICAgICAgICB9W11cclxuICAgICAgICBzZXRNZXRhOiAoXHJcbiAgICAgICAgICAgIHBhY2thZ2VOYW1lOiBzdHJpbmcsXHJcbiAgICAgICAgICAgIGZpbGVOYW1lOiBzdHJpbmcsXHJcbiAgICAgICAgICAgIHJldjogc3RyaW5nIHwgdW5kZWZpbmVkLFxyXG4gICAgICAgICAgICBjZmc6IFBhY2thZ2VDb25maWd1cmF0aW9uIHwgdW5kZWZpbmVkLFxyXG4gICAgICAgICkgPT4gdm9pZFxyXG4gICAgfVxyXG5cclxuICAgIGZvciAoY29uc3QgZmlsZSBvZiBmaWxlcykge1xyXG4gICAgICAgIGNvbnN0IGJhc2UgPSBiYXNlbmFtZShmaWxlLCAnLnRzJylcclxuICAgICAgICBzZXRNZXRhKHBhY2thZ2VKc29uLm5hbWUsIGJhc2UsIHVuZGVmaW5lZCwgcGFja2FnZUpzb24uY29uZmlnKVxyXG4gICAgICAgIGF3YWl0IGltcG9ydChwYXRoVG9GaWxlVVJMKGpvaW4ocHJvY2Vzcy5jd2QoKSwgcGF0aCwgYmFzZSArICcuanMnKSkudG9TdHJpbmcoKSlcclxuICAgIH1cclxuXHJcbiAgICByZXR1cm4ge1xyXG4gICAgICAgIG5hbWU6IHBhY2thZ2VKc29uLm5hbWUsXHJcbiAgICAgICAgaHR0cDogZ2V0SGFuZGxlcnMoJ2h0dHAnKS5tYXAoaCA9PiAoe1xyXG4gICAgICAgICAgICBjb25maWc6IHtcclxuICAgICAgICAgICAgICAgIC4uLmguY29uZmlnLFxyXG4gICAgICAgICAgICAgICAgY3B1czogcGFja2FnZUpzb24uY3B1LFxyXG4gICAgICAgICAgICAgICAgb3M6IHBhY2thZ2VKc29uLm9zLFxyXG4gICAgICAgICAgICAgICAgbm9kZVZlcnNpb246IHBhY2thZ2VKc29uLmVuZ2luZXM/Lm5vZGUsXHJcbiAgICAgICAgICAgIH0sXHJcbiAgICAgICAgICAgIG5hbWU6IGgubWV0YT8uZmlsZU5hbWUgPz8gJycsXHJcbiAgICAgICAgICAgIG1ldGhvZDogaC5tZXRob2QsXHJcbiAgICAgICAgICAgIHBhdGhQYXR0ZXJuOiBoLnBhdGhQYXR0ZXJuLFxyXG4gICAgICAgICAgICBwYXRoUmVnRXhwOiBoLnBhdGhSZWdFeHAsXHJcbiAgICAgICAgfSkpLFxyXG4gICAgfVxyXG59XHJcblxyXG5hc3luYyBmdW5jdGlvbiByZWFkQ29uZmlnKCkge1xyXG4gICAgY29uc3QgcGFja2FnZUpzb24gPSBKU09OLnBhcnNlKGF3YWl0IHJlYWRGaWxlKCdwYWNrYWdlLmpzb24nLCAndXRmLTgnKSkgYXMge1xyXG4gICAgICAgIG5hbWU6IHN0cmluZ1xyXG4gICAgICAgIGVuZ2luZXM/OiB7IFtlbmdpbmU6IHN0cmluZ106IHN0cmluZyB9XHJcbiAgICAgICAgY3B1PzogQ3B1Q29uZmlnW11cclxuICAgICAgICBvcz86IE9TQ29uZmlnW11cclxuICAgICAgICBjb25maWc/OiBvYmplY3RcclxuICAgIH1cclxuICAgIHJldHVybiBwYWNrYWdlSnNvblxyXG59XHJcbiJdfQ==
|
|
@@ -0,0 +1,26 @@
|
|
|
1
|
+
import { HandlerConfiguration } from '../context.js';
|
|
2
|
+
import { Handler } from '../http.js';
|
|
3
|
+
export interface HttpHandler {
|
|
4
|
+
meta: Metadata | undefined;
|
|
5
|
+
config: (PackageConfiguration & HandlerConfiguration) | undefined;
|
|
6
|
+
method: Method;
|
|
7
|
+
pathPattern: string;
|
|
8
|
+
pathRegExp: RegExp;
|
|
9
|
+
entry: Handler;
|
|
10
|
+
}
|
|
11
|
+
interface HandlerTypes {
|
|
12
|
+
http: HttpHandler;
|
|
13
|
+
}
|
|
14
|
+
export declare function getHandlers(type: keyof HandlerTypes): HttpHandler[];
|
|
15
|
+
export declare function setMeta(packageName: string, fileName: string, revision: string | undefined, config: PackageConfiguration | undefined): void;
|
|
16
|
+
export interface PackageConfiguration extends HandlerConfiguration {
|
|
17
|
+
}
|
|
18
|
+
export interface Metadata {
|
|
19
|
+
packageName: string;
|
|
20
|
+
fileName: string;
|
|
21
|
+
revision: string | undefined;
|
|
22
|
+
config?: PackageConfiguration;
|
|
23
|
+
}
|
|
24
|
+
export declare type Method = 'GET' | 'POST' | 'PUT' | 'PATCH' | 'DELETE';
|
|
25
|
+
export declare function registerHttpHandler(method: Method, path: string, configOrHandler: HandlerConfiguration | Handler, fn?: Handler): void;
|
|
26
|
+
export {};
|