@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/LICENSE
ADDED
|
@@ -0,0 +1,19 @@
|
|
|
1
|
+
Copyright © 2022 The Riddance Authors (see git commits)
|
|
2
|
+
|
|
3
|
+
Permission is hereby granted, free of charge, to any person obtaining a copy
|
|
4
|
+
of this software and associated documentation files (the “Software”), to deal
|
|
5
|
+
in the Software without restriction, including without limitation the rights
|
|
6
|
+
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
|
7
|
+
copies of the Software, and to permit persons to whom the Software is
|
|
8
|
+
furnished to do so, subject to the following conditions:
|
|
9
|
+
|
|
10
|
+
The above copyright notice and this permission notice shall be included in all
|
|
11
|
+
copies or substantial portions of the Software.
|
|
12
|
+
|
|
13
|
+
THE SOFTWARE IS PROVIDED “AS IS”, WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
|
14
|
+
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
|
15
|
+
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
|
16
|
+
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
|
17
|
+
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
|
18
|
+
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
|
|
19
|
+
SOFTWARE.
|
package/context.d.ts
ADDED
|
@@ -0,0 +1,93 @@
|
|
|
1
|
+
export interface Environment {
|
|
2
|
+
readonly [key: string]: string;
|
|
3
|
+
}
|
|
4
|
+
export interface Logger {
|
|
5
|
+
enrich(fields: object): Logger;
|
|
6
|
+
trace(message: string, error?: unknown, fields?: object): void;
|
|
7
|
+
debug(message: string, error?: unknown, fields?: object): void;
|
|
8
|
+
info(message: string, error?: unknown, fields?: object): void;
|
|
9
|
+
warn(message: string, error?: unknown, fields?: object): void;
|
|
10
|
+
error(message: string, error?: unknown, fields?: object): void;
|
|
11
|
+
fatal(message: string, error?: unknown, fields?: object): void;
|
|
12
|
+
}
|
|
13
|
+
export interface AbortSignal {
|
|
14
|
+
aborted: boolean;
|
|
15
|
+
addEventListener: (type: 'abort', listener: (this: AbortSignal, event: unknown) => unknown, options?: {
|
|
16
|
+
capture?: boolean;
|
|
17
|
+
once?: boolean;
|
|
18
|
+
passive?: boolean;
|
|
19
|
+
}) => void;
|
|
20
|
+
removeEventListener: (type: 'abort', listener: (this: AbortSignal, event: unknown) => unknown, options?: {
|
|
21
|
+
capture?: boolean;
|
|
22
|
+
}) => void;
|
|
23
|
+
}
|
|
24
|
+
export declare type MutableJson = null | boolean | number | string | MutableJson[] | {
|
|
25
|
+
[key: string]: MutableJson;
|
|
26
|
+
};
|
|
27
|
+
export declare type Json = null | boolean | number | string | readonly Json[] | {
|
|
28
|
+
readonly [key: string]: Json;
|
|
29
|
+
};
|
|
30
|
+
export declare function objectSpreadable(json?: Json): {
|
|
31
|
+
readonly [key: string]: Json;
|
|
32
|
+
};
|
|
33
|
+
export declare function arraySpreadable(json?: Json): readonly Json[];
|
|
34
|
+
export interface HandlerConfiguration {
|
|
35
|
+
/**
|
|
36
|
+
* An indication of CPU usage of the handler.
|
|
37
|
+
* @default 'low'
|
|
38
|
+
*/
|
|
39
|
+
readonly compute?: 'high' | 'low';
|
|
40
|
+
/**
|
|
41
|
+
* An indication of memory usage of the handler.
|
|
42
|
+
* @default 'low'
|
|
43
|
+
*/
|
|
44
|
+
readonly memory?: 'high' | 'low';
|
|
45
|
+
/**
|
|
46
|
+
* A boolean indicating whether to enrich the log with the body of events, requests or responses. Set to false if the body is large or contain very sensitive data.
|
|
47
|
+
* @default false
|
|
48
|
+
*/
|
|
49
|
+
readonly excludeBodyFromLogs?: boolean;
|
|
50
|
+
/**
|
|
51
|
+
* The level below which log entries will be discarded.
|
|
52
|
+
* @default 'trace'
|
|
53
|
+
*/
|
|
54
|
+
readonly minimumLogLevel?: 'trace' | 'debug' | 'info' | 'warning' | 'error' | 'fatal';
|
|
55
|
+
/**
|
|
56
|
+
* The number of seconds the function is expected to finish executing in.
|
|
57
|
+
*/
|
|
58
|
+
readonly timeout?: number;
|
|
59
|
+
}
|
|
60
|
+
export interface Context {
|
|
61
|
+
readonly env: Environment;
|
|
62
|
+
readonly log: Logger;
|
|
63
|
+
readonly signal: AbortSignal;
|
|
64
|
+
now(): Date;
|
|
65
|
+
readonly operationId?: string;
|
|
66
|
+
readonly client?: {
|
|
67
|
+
readonly id?: string;
|
|
68
|
+
readonly ip?: string;
|
|
69
|
+
readonly port?: number;
|
|
70
|
+
readonly userAgent?: string;
|
|
71
|
+
};
|
|
72
|
+
readonly meta?: {
|
|
73
|
+
readonly packageName: string;
|
|
74
|
+
readonly fileName: string;
|
|
75
|
+
readonly revision?: string;
|
|
76
|
+
};
|
|
77
|
+
emit(topic: string, type: string, subject: string, data?: Json, messageId?: string): void;
|
|
78
|
+
eventBarrier(): Promise<void>;
|
|
79
|
+
onSuccess(fn: () => Promise<void> | void): void;
|
|
80
|
+
}
|
|
81
|
+
export declare function httpRequestHeaders(context: Context): {
|
|
82
|
+
[key: string]: string;
|
|
83
|
+
};
|
|
84
|
+
export declare function throwOnNotOK<T extends {
|
|
85
|
+
ok?: boolean;
|
|
86
|
+
status?: number;
|
|
87
|
+
text?: () => Promise<string>;
|
|
88
|
+
}>(response: T, message: string, data?: {
|
|
89
|
+
[key: string]: unknown;
|
|
90
|
+
}): Promise<T>;
|
|
91
|
+
export declare function measure<T>(logger: {
|
|
92
|
+
trace: (message: string, _: undefined, f: object) => void;
|
|
93
|
+
}, name: string, fn: () => Promise<T> | T, fields?: object): Promise<T>;
|
package/context.js
ADDED
|
@@ -0,0 +1,70 @@
|
|
|
1
|
+
import { performance } from 'perf_hooks';
|
|
2
|
+
import { highPrecisionISODate } from './host/logging.js';
|
|
3
|
+
/*@__INLINE__*/
|
|
4
|
+
export function objectSpreadable(json) {
|
|
5
|
+
if (!json) {
|
|
6
|
+
return {};
|
|
7
|
+
}
|
|
8
|
+
return json;
|
|
9
|
+
}
|
|
10
|
+
/*@__INLINE__*/
|
|
11
|
+
export function arraySpreadable(json) {
|
|
12
|
+
if (!Array.isArray(json)) {
|
|
13
|
+
return [];
|
|
14
|
+
}
|
|
15
|
+
return json;
|
|
16
|
+
}
|
|
17
|
+
export function httpRequestHeaders(context) {
|
|
18
|
+
const headers = {
|
|
19
|
+
'user-agent': `${context.meta?.packageName ?? '?'}/${context.meta?.revision ?? '?'}`,
|
|
20
|
+
};
|
|
21
|
+
if (context.operationId) {
|
|
22
|
+
headers['x-request-id'] = context.operationId;
|
|
23
|
+
}
|
|
24
|
+
if (context.client) {
|
|
25
|
+
if (context.client.id) {
|
|
26
|
+
headers['x-client-id'] = context.client.id;
|
|
27
|
+
}
|
|
28
|
+
if (context.client.ip || context.client.port) {
|
|
29
|
+
headers['x-forwarded-for'] = `${context.client.ip ?? ''}:${context.client.port ?? ''}`;
|
|
30
|
+
}
|
|
31
|
+
if (context.client.userAgent) {
|
|
32
|
+
headers['x-forwarded-for-user-agent'] = context.client.userAgent;
|
|
33
|
+
}
|
|
34
|
+
}
|
|
35
|
+
return headers;
|
|
36
|
+
}
|
|
37
|
+
export async function throwOnNotOK(response, message, data) {
|
|
38
|
+
if (response.ok === false) {
|
|
39
|
+
throw Object.assign(new Error(message), {
|
|
40
|
+
response: {
|
|
41
|
+
status: response.status,
|
|
42
|
+
body: limitSize(await response.text?.()),
|
|
43
|
+
},
|
|
44
|
+
...data,
|
|
45
|
+
});
|
|
46
|
+
}
|
|
47
|
+
return response;
|
|
48
|
+
}
|
|
49
|
+
function limitSize(text) {
|
|
50
|
+
if ((text?.length ?? 0) > 2048) {
|
|
51
|
+
return text?.substring(0, 2048);
|
|
52
|
+
}
|
|
53
|
+
return text;
|
|
54
|
+
}
|
|
55
|
+
export async function measure(logger, name, fn, fields) {
|
|
56
|
+
const start = performance.now();
|
|
57
|
+
try {
|
|
58
|
+
return await fn();
|
|
59
|
+
}
|
|
60
|
+
finally {
|
|
61
|
+
const end = performance.now();
|
|
62
|
+
logger.trace(`Measurement of ${name} time`, undefined, {
|
|
63
|
+
start: highPrecisionISODate(start),
|
|
64
|
+
end: highPrecisionISODate(end),
|
|
65
|
+
duration: (Math.round(end * 10000) - Math.round(start * 10000)) / 10000,
|
|
66
|
+
...fields,
|
|
67
|
+
});
|
|
68
|
+
}
|
|
69
|
+
}
|
|
70
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY29udGV4dC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbImNvbnRleHQudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFFLFdBQVcsRUFBRSxNQUFNLFlBQVksQ0FBQTtBQUN4QyxPQUFPLEVBQUUsb0JBQW9CLEVBQUUsTUFBTSxtQkFBbUIsQ0FBQTtBQStDeEQsZUFBZTtBQUNmLE1BQU0sVUFBVSxnQkFBZ0IsQ0FBQyxJQUFXO0lBQ3hDLElBQUksQ0FBQyxJQUFJLEVBQUU7UUFDUCxPQUFPLEVBQUUsQ0FBQTtLQUNaO0lBQ0QsT0FBTyxJQUFtRCxDQUFBO0FBQzlELENBQUM7QUFFRCxlQUFlO0FBQ2YsTUFBTSxVQUFVLGVBQWUsQ0FBQyxJQUFXO0lBQ3ZDLElBQUksQ0FBQyxLQUFLLENBQUMsT0FBTyxDQUFDLElBQUksQ0FBQyxFQUFFO1FBQ3RCLE9BQU8sRUFBRSxDQUFBO0tBQ1o7SUFDRCxPQUFPLElBQXVCLENBQUE7QUFDbEMsQ0FBQztBQXNERCxNQUFNLFVBQVUsa0JBQWtCLENBQUMsT0FBZ0I7SUFDL0MsTUFBTSxPQUFPLEdBQThCO1FBQ3ZDLFlBQVksRUFBRSxHQUFHLE9BQU8sQ0FBQyxJQUFJLEVBQUUsV0FBVyxJQUFJLEdBQUcsSUFBSSxPQUFPLENBQUMsSUFBSSxFQUFFLFFBQVEsSUFBSSxHQUFHLEVBQUU7S0FDdkYsQ0FBQTtJQUNELElBQUksT0FBTyxDQUFDLFdBQVcsRUFBRTtRQUNyQixPQUFPLENBQUMsY0FBYyxDQUFDLEdBQUcsT0FBTyxDQUFDLFdBQVcsQ0FBQTtLQUNoRDtJQUNELElBQUksT0FBTyxDQUFDLE1BQU0sRUFBRTtRQUNoQixJQUFJLE9BQU8sQ0FBQyxNQUFNLENBQUMsRUFBRSxFQUFFO1lBQ25CLE9BQU8sQ0FBQyxhQUFhLENBQUMsR0FBRyxPQUFPLENBQUMsTUFBTSxDQUFDLEVBQUUsQ0FBQTtTQUM3QztRQUNELElBQUksT0FBTyxDQUFDLE1BQU0sQ0FBQyxFQUFFLElBQUksT0FBTyxDQUFDLE1BQU0sQ0FBQyxJQUFJLEVBQUU7WUFDMUMsT0FBTyxDQUFDLGlCQUFpQixDQUFDLEdBQUcsR0FBRyxPQUFPLENBQUMsTUFBTSxDQUFDLEVBQUUsSUFBSSxFQUFFLElBQUksT0FBTyxDQUFDLE1BQU0sQ0FBQyxJQUFJLElBQUksRUFBRSxFQUFFLENBQUE7U0FDekY7UUFDRCxJQUFJLE9BQU8sQ0FBQyxNQUFNLENBQUMsU0FBUyxFQUFFO1lBQzFCLE9BQU8sQ0FBQyw0QkFBNEIsQ0FBQyxHQUFHLE9BQU8sQ0FBQyxNQUFNLENBQUMsU0FBUyxDQUFBO1NBQ25FO0tBQ0o7SUFDRCxPQUFPLE9BQU8sQ0FBQTtBQUNsQixDQUFDO0FBRUQsTUFBTSxDQUFDLEtBQUssVUFBVSxZQUFZLENBRWhDLFFBQVcsRUFBRSxPQUFlLEVBQUUsSUFBaUM7SUFDN0QsSUFBSSxRQUFRLENBQUMsRUFBRSxLQUFLLEtBQUssRUFBRTtRQUN2QixNQUFNLE1BQU0sQ0FBQyxNQUFNLENBQUMsSUFBSSxLQUFLLENBQUMsT0FBTyxDQUFDLEVBQUU7WUFDcEMsUUFBUSxFQUFFO2dCQUNOLE1BQU0sRUFBRSxRQUFRLENBQUMsTUFBTTtnQkFDdkIsSUFBSSxFQUFFLFNBQVMsQ0FBQyxNQUFNLFFBQVEsQ0FBQyxJQUFJLEVBQUUsRUFBRSxDQUFDO2FBQzNDO1lBQ0QsR0FBRyxJQUFJO1NBQ1YsQ0FBQyxDQUFBO0tBQ0w7SUFDRCxPQUFPLFFBQVEsQ0FBQTtBQUNuQixDQUFDO0FBRUQsU0FBUyxTQUFTLENBQUMsSUFBd0I7SUFDdkMsSUFBSSxDQUFDLElBQUksRUFBRSxNQUFNLElBQUksQ0FBQyxDQUFDLEdBQUcsSUFBSSxFQUFFO1FBQzVCLE9BQU8sSUFBSSxFQUFFLFNBQVMsQ0FBQyxDQUFDLEVBQUUsSUFBSSxDQUFDLENBQUE7S0FDbEM7SUFDRCxPQUFPLElBQUksQ0FBQTtBQUNmLENBQUM7QUFFRCxNQUFNLENBQUMsS0FBSyxVQUFVLE9BQU8sQ0FDekIsTUFBcUUsRUFDckUsSUFBWSxFQUNaLEVBQXdCLEVBQ3hCLE1BQWU7SUFFZixNQUFNLEtBQUssR0FBRyxXQUFXLENBQUMsR0FBRyxFQUFFLENBQUE7SUFDL0IsSUFBSTtRQUNBLE9BQU8sTUFBTSxFQUFFLEVBQUUsQ0FBQTtLQUNwQjtZQUFTO1FBQ04sTUFBTSxHQUFHLEdBQUcsV0FBVyxDQUFDLEdBQUcsRUFBRSxDQUFBO1FBQzdCLE1BQU0sQ0FBQyxLQUFLLENBQUMsa0JBQWtCLElBQUksT0FBTyxFQUFFLFNBQVMsRUFBRTtZQUNuRCxLQUFLLEVBQUUsb0JBQW9CLENBQUMsS0FBSyxDQUFDO1lBQ2xDLEdBQUcsRUFBRSxvQkFBb0IsQ0FBQyxHQUFHLENBQUM7WUFDOUIsUUFBUSxFQUFFLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxHQUFHLEdBQUcsS0FBSyxDQUFDLEdBQUcsSUFBSSxDQUFDLEtBQUssQ0FBQyxLQUFLLEdBQUcsS0FBSyxDQUFDLENBQUMsR0FBRyxLQUFLO1lBQ3ZFLEdBQUcsTUFBTTtTQUNaLENBQUMsQ0FBQTtLQUNMO0FBQ0wsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IHBlcmZvcm1hbmNlIH0gZnJvbSAncGVyZl9ob29rcydcclxuaW1wb3J0IHsgaGlnaFByZWNpc2lvbklTT0RhdGUgfSBmcm9tICcuL2hvc3QvbG9nZ2luZy5qcydcclxuXHJcbmV4cG9ydCBpbnRlcmZhY2UgRW52aXJvbm1lbnQge1xyXG4gICAgcmVhZG9ubHkgW2tleTogc3RyaW5nXTogc3RyaW5nXHJcbn1cclxuXHJcbmV4cG9ydCBpbnRlcmZhY2UgTG9nZ2VyIHtcclxuICAgIGVucmljaChmaWVsZHM6IG9iamVjdCk6IExvZ2dlclxyXG4gICAgdHJhY2UobWVzc2FnZTogc3RyaW5nLCBlcnJvcj86IHVua25vd24sIGZpZWxkcz86IG9iamVjdCk6IHZvaWRcclxuICAgIGRlYnVnKG1lc3NhZ2U6IHN0cmluZywgZXJyb3I/OiB1bmtub3duLCBmaWVsZHM/OiBvYmplY3QpOiB2b2lkXHJcbiAgICBpbmZvKG1lc3NhZ2U6IHN0cmluZywgZXJyb3I/OiB1bmtub3duLCBmaWVsZHM/OiBvYmplY3QpOiB2b2lkXHJcbiAgICB3YXJuKG1lc3NhZ2U6IHN0cmluZywgZXJyb3I/OiB1bmtub3duLCBmaWVsZHM/OiBvYmplY3QpOiB2b2lkXHJcbiAgICBlcnJvcihtZXNzYWdlOiBzdHJpbmcsIGVycm9yPzogdW5rbm93biwgZmllbGRzPzogb2JqZWN0KTogdm9pZFxyXG4gICAgZmF0YWwobWVzc2FnZTogc3RyaW5nLCBlcnJvcj86IHVua25vd24sIGZpZWxkcz86IG9iamVjdCk6IHZvaWRcclxufVxyXG5cclxuZXhwb3J0IGludGVyZmFjZSBBYm9ydFNpZ25hbCB7XHJcbiAgICBhYm9ydGVkOiBib29sZWFuXHJcblxyXG4gICAgYWRkRXZlbnRMaXN0ZW5lcjogKFxyXG4gICAgICAgIHR5cGU6ICdhYm9ydCcsXHJcbiAgICAgICAgbGlzdGVuZXI6ICh0aGlzOiBBYm9ydFNpZ25hbCwgZXZlbnQ6IHVua25vd24pID0+IHVua25vd24sXHJcbiAgICAgICAgb3B0aW9ucz86IHsgY2FwdHVyZT86IGJvb2xlYW47IG9uY2U/OiBib29sZWFuOyBwYXNzaXZlPzogYm9vbGVhbiB9LFxyXG4gICAgKSA9PiB2b2lkXHJcblxyXG4gICAgcmVtb3ZlRXZlbnRMaXN0ZW5lcjogKFxyXG4gICAgICAgIHR5cGU6ICdhYm9ydCcsXHJcbiAgICAgICAgbGlzdGVuZXI6ICh0aGlzOiBBYm9ydFNpZ25hbCwgZXZlbnQ6IHVua25vd24pID0+IHVua25vd24sXHJcbiAgICAgICAgb3B0aW9ucz86IHsgY2FwdHVyZT86IGJvb2xlYW4gfSxcclxuICAgICkgPT4gdm9pZFxyXG59XHJcblxyXG5leHBvcnQgdHlwZSBNdXRhYmxlSnNvbiA9XHJcbiAgICB8IG51bGxcclxuICAgIHwgYm9vbGVhblxyXG4gICAgfCBudW1iZXJcclxuICAgIHwgc3RyaW5nXHJcbiAgICB8IE11dGFibGVKc29uW11cclxuICAgIHwgeyBba2V5OiBzdHJpbmddOiBNdXRhYmxlSnNvbiB9XHJcbmV4cG9ydCB0eXBlIEpzb24gPVxyXG4gICAgfCBudWxsXHJcbiAgICB8IGJvb2xlYW5cclxuICAgIHwgbnVtYmVyXHJcbiAgICB8IHN0cmluZ1xyXG4gICAgfCByZWFkb25seSBKc29uW11cclxuICAgIHwgeyByZWFkb25seSBba2V5OiBzdHJpbmddOiBKc29uIH1cclxuXHJcbi8qQF9fSU5MSU5FX18qL1xyXG5leHBvcnQgZnVuY3Rpb24gb2JqZWN0U3ByZWFkYWJsZShqc29uPzogSnNvbik6IHsgcmVhZG9ubHkgW2tleTogc3RyaW5nXTogSnNvbiB9IHtcclxuICAgIGlmICghanNvbikge1xyXG4gICAgICAgIHJldHVybiB7fVxyXG4gICAgfVxyXG4gICAgcmV0dXJuIGpzb24gYXMgdW5rbm93biBhcyB7IHJlYWRvbmx5IFtrZXk6IHN0cmluZ106IEpzb24gfVxyXG59XHJcblxyXG4vKkBfX0lOTElORV9fKi9cclxuZXhwb3J0IGZ1bmN0aW9uIGFycmF5U3ByZWFkYWJsZShqc29uPzogSnNvbik6IHJlYWRvbmx5IEpzb25bXSB7XHJcbiAgICBpZiAoIUFycmF5LmlzQXJyYXkoanNvbikpIHtcclxuICAgICAgICByZXR1cm4gW11cclxuICAgIH1cclxuICAgIHJldHVybiBqc29uIGFzIHJlYWRvbmx5IEpzb25bXVxyXG59XHJcblxyXG5leHBvcnQgaW50ZXJmYWNlIEhhbmRsZXJDb25maWd1cmF0aW9uIHtcclxuICAgIC8qKlxyXG4gICAgICogQW4gaW5kaWNhdGlvbiBvZiBDUFUgdXNhZ2Ugb2YgdGhlIGhhbmRsZXIuXHJcbiAgICAgKiBAZGVmYXVsdCAnbG93J1xyXG4gICAgICovXHJcbiAgICByZWFkb25seSBjb21wdXRlPzogJ2hpZ2gnIHwgJ2xvdydcclxuICAgIC8qKlxyXG4gICAgICogQW4gaW5kaWNhdGlvbiBvZiBtZW1vcnkgdXNhZ2Ugb2YgdGhlIGhhbmRsZXIuXHJcbiAgICAgKiBAZGVmYXVsdCAnbG93J1xyXG4gICAgICovXHJcbiAgICByZWFkb25seSBtZW1vcnk/OiAnaGlnaCcgfCAnbG93J1xyXG4gICAgLyoqXHJcbiAgICAgKiBBIGJvb2xlYW4gaW5kaWNhdGluZyB3aGV0aGVyIHRvIGVucmljaCB0aGUgbG9nIHdpdGggdGhlIGJvZHkgb2YgZXZlbnRzLCByZXF1ZXN0cyBvciByZXNwb25zZXMuIFNldCB0byBmYWxzZSBpZiB0aGUgYm9keSBpcyBsYXJnZSBvciBjb250YWluIHZlcnkgc2Vuc2l0aXZlIGRhdGEuXHJcbiAgICAgKiBAZGVmYXVsdCBmYWxzZVxyXG4gICAgICovXHJcbiAgICByZWFkb25seSBleGNsdWRlQm9keUZyb21Mb2dzPzogYm9vbGVhblxyXG4gICAgLyoqXHJcbiAgICAgKiBUaGUgbGV2ZWwgYmVsb3cgd2hpY2ggbG9nIGVudHJpZXMgd2lsbCBiZSBkaXNjYXJkZWQuXHJcbiAgICAgKiBAZGVmYXVsdCAndHJhY2UnXHJcbiAgICAgKi9cclxuICAgIHJlYWRvbmx5IG1pbmltdW1Mb2dMZXZlbD86ICd0cmFjZScgfCAnZGVidWcnIHwgJ2luZm8nIHwgJ3dhcm5pbmcnIHwgJ2Vycm9yJyB8ICdmYXRhbCdcclxuICAgIC8qKlxyXG4gICAgICogVGhlIG51bWJlciBvZiBzZWNvbmRzIHRoZSBmdW5jdGlvbiBpcyBleHBlY3RlZCB0byBmaW5pc2ggZXhlY3V0aW5nIGluLlxyXG4gICAgICovXHJcbiAgICByZWFkb25seSB0aW1lb3V0PzogbnVtYmVyXHJcbn1cclxuXHJcbmV4cG9ydCBpbnRlcmZhY2UgQ29udGV4dCB7XHJcbiAgICByZWFkb25seSBlbnY6IEVudmlyb25tZW50XHJcbiAgICByZWFkb25seSBsb2c6IExvZ2dlclxyXG4gICAgcmVhZG9ubHkgc2lnbmFsOiBBYm9ydFNpZ25hbFxyXG4gICAgbm93KCk6IERhdGVcclxuXHJcbiAgICByZWFkb25seSBvcGVyYXRpb25JZD86IHN0cmluZ1xyXG4gICAgcmVhZG9ubHkgY2xpZW50Pzoge1xyXG4gICAgICAgIHJlYWRvbmx5IGlkPzogc3RyaW5nXHJcbiAgICAgICAgcmVhZG9ubHkgaXA/OiBzdHJpbmdcclxuICAgICAgICByZWFkb25seSBwb3J0PzogbnVtYmVyXHJcbiAgICAgICAgcmVhZG9ubHkgdXNlckFnZW50Pzogc3RyaW5nXHJcbiAgICB9XHJcbiAgICByZWFkb25seSBtZXRhPzoge1xyXG4gICAgICAgIHJlYWRvbmx5IHBhY2thZ2VOYW1lOiBzdHJpbmdcclxuICAgICAgICByZWFkb25seSBmaWxlTmFtZTogc3RyaW5nXHJcbiAgICAgICAgcmVhZG9ubHkgcmV2aXNpb24/OiBzdHJpbmdcclxuICAgIH1cclxuXHJcbiAgICBlbWl0KHRvcGljOiBzdHJpbmcsIHR5cGU6IHN0cmluZywgc3ViamVjdDogc3RyaW5nLCBkYXRhPzogSnNvbiwgbWVzc2FnZUlkPzogc3RyaW5nKTogdm9pZFxyXG4gICAgZXZlbnRCYXJyaWVyKCk6IFByb21pc2U8dm9pZD5cclxuXHJcbiAgICBvblN1Y2Nlc3MoZm46ICgpID0+IFByb21pc2U8dm9pZD4gfCB2b2lkKTogdm9pZFxyXG59XHJcblxyXG5leHBvcnQgZnVuY3Rpb24gaHR0cFJlcXVlc3RIZWFkZXJzKGNvbnRleHQ6IENvbnRleHQpIHtcclxuICAgIGNvbnN0IGhlYWRlcnM6IHsgW2tleTogc3RyaW5nXTogc3RyaW5nIH0gPSB7XHJcbiAgICAgICAgJ3VzZXItYWdlbnQnOiBgJHtjb250ZXh0Lm1ldGE/LnBhY2thZ2VOYW1lID8/ICc/J30vJHtjb250ZXh0Lm1ldGE/LnJldmlzaW9uID8/ICc/J31gLFxyXG4gICAgfVxyXG4gICAgaWYgKGNvbnRleHQub3BlcmF0aW9uSWQpIHtcclxuICAgICAgICBoZWFkZXJzWyd4LXJlcXVlc3QtaWQnXSA9IGNvbnRleHQub3BlcmF0aW9uSWRcclxuICAgIH1cclxuICAgIGlmIChjb250ZXh0LmNsaWVudCkge1xyXG4gICAgICAgIGlmIChjb250ZXh0LmNsaWVudC5pZCkge1xyXG4gICAgICAgICAgICBoZWFkZXJzWyd4LWNsaWVudC1pZCddID0gY29udGV4dC5jbGllbnQuaWRcclxuICAgICAgICB9XHJcbiAgICAgICAgaWYgKGNvbnRleHQuY2xpZW50LmlwIHx8IGNvbnRleHQuY2xpZW50LnBvcnQpIHtcclxuICAgICAgICAgICAgaGVhZGVyc1sneC1mb3J3YXJkZWQtZm9yJ10gPSBgJHtjb250ZXh0LmNsaWVudC5pcCA/PyAnJ306JHtjb250ZXh0LmNsaWVudC5wb3J0ID8/ICcnfWBcclxuICAgICAgICB9XHJcbiAgICAgICAgaWYgKGNvbnRleHQuY2xpZW50LnVzZXJBZ2VudCkge1xyXG4gICAgICAgICAgICBoZWFkZXJzWyd4LWZvcndhcmRlZC1mb3ItdXNlci1hZ2VudCddID0gY29udGV4dC5jbGllbnQudXNlckFnZW50XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG4gICAgcmV0dXJuIGhlYWRlcnNcclxufVxyXG5cclxuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIHRocm93T25Ob3RPSzxcclxuICAgIFQgZXh0ZW5kcyB7IG9rPzogYm9vbGVhbjsgc3RhdHVzPzogbnVtYmVyOyB0ZXh0PzogKCkgPT4gUHJvbWlzZTxzdHJpbmc+IH0sXHJcbj4ocmVzcG9uc2U6IFQsIG1lc3NhZ2U6IHN0cmluZywgZGF0YT86IHsgW2tleTogc3RyaW5nXTogdW5rbm93biB9KSB7XHJcbiAgICBpZiAocmVzcG9uc2Uub2sgPT09IGZhbHNlKSB7XHJcbiAgICAgICAgdGhyb3cgT2JqZWN0LmFzc2lnbihuZXcgRXJyb3IobWVzc2FnZSksIHtcclxuICAgICAgICAgICAgcmVzcG9uc2U6IHtcclxuICAgICAgICAgICAgICAgIHN0YXR1czogcmVzcG9uc2Uuc3RhdHVzLFxyXG4gICAgICAgICAgICAgICAgYm9keTogbGltaXRTaXplKGF3YWl0IHJlc3BvbnNlLnRleHQ/LigpKSxcclxuICAgICAgICAgICAgfSxcclxuICAgICAgICAgICAgLi4uZGF0YSxcclxuICAgICAgICB9KVxyXG4gICAgfVxyXG4gICAgcmV0dXJuIHJlc3BvbnNlXHJcbn1cclxuXHJcbmZ1bmN0aW9uIGxpbWl0U2l6ZSh0ZXh0OiBzdHJpbmcgfCB1bmRlZmluZWQpIHtcclxuICAgIGlmICgodGV4dD8ubGVuZ3RoID8/IDApID4gMjA0OCkge1xyXG4gICAgICAgIHJldHVybiB0ZXh0Py5zdWJzdHJpbmcoMCwgMjA0OClcclxuICAgIH1cclxuICAgIHJldHVybiB0ZXh0XHJcbn1cclxuXHJcbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBtZWFzdXJlPFQ+KFxyXG4gICAgbG9nZ2VyOiB7IHRyYWNlOiAobWVzc2FnZTogc3RyaW5nLCBfOiB1bmRlZmluZWQsIGY6IG9iamVjdCkgPT4gdm9pZCB9LFxyXG4gICAgbmFtZTogc3RyaW5nLFxyXG4gICAgZm46ICgpID0+IFByb21pc2U8VD4gfCBULFxyXG4gICAgZmllbGRzPzogb2JqZWN0LFxyXG4pIHtcclxuICAgIGNvbnN0IHN0YXJ0ID0gcGVyZm9ybWFuY2Uubm93KClcclxuICAgIHRyeSB7XHJcbiAgICAgICAgcmV0dXJuIGF3YWl0IGZuKClcclxuICAgIH0gZmluYWxseSB7XHJcbiAgICAgICAgY29uc3QgZW5kID0gcGVyZm9ybWFuY2Uubm93KClcclxuICAgICAgICBsb2dnZXIudHJhY2UoYE1lYXN1cmVtZW50IG9mICR7bmFtZX0gdGltZWAsIHVuZGVmaW5lZCwge1xyXG4gICAgICAgICAgICBzdGFydDogaGlnaFByZWNpc2lvbklTT0RhdGUoc3RhcnQpLFxyXG4gICAgICAgICAgICBlbmQ6IGhpZ2hQcmVjaXNpb25JU09EYXRlKGVuZCksXHJcbiAgICAgICAgICAgIGR1cmF0aW9uOiAoTWF0aC5yb3VuZChlbmQgKiAxMDAwMCkgLSBNYXRoLnJvdW5kKHN0YXJ0ICogMTAwMDApKSAvIDEwMDAwLFxyXG4gICAgICAgICAgICAuLi5maWVsZHMsXHJcbiAgICAgICAgfSlcclxuICAgIH1cclxufVxyXG4iXX0=
|
|
@@ -0,0 +1,51 @@
|
|
|
1
|
+
/// <reference types="node" resolution-mode="require"/>
|
|
2
|
+
import { AbortSignal, Context, Environment, Logger } from '../context.js';
|
|
3
|
+
import { Metadata } from './registry.js';
|
|
4
|
+
export interface ClientInfo {
|
|
5
|
+
readonly operationId?: string;
|
|
6
|
+
readonly clientId?: string;
|
|
7
|
+
readonly clientIp?: string;
|
|
8
|
+
readonly clientPort?: number;
|
|
9
|
+
readonly userAgent?: string;
|
|
10
|
+
}
|
|
11
|
+
export interface EventMetadata {
|
|
12
|
+
topic: string;
|
|
13
|
+
type: string;
|
|
14
|
+
subject: string;
|
|
15
|
+
id?: string;
|
|
16
|
+
}
|
|
17
|
+
export interface BufferedEvent {
|
|
18
|
+
eventTime: Date;
|
|
19
|
+
meta: Omit<EventMetadata, 'topic'>;
|
|
20
|
+
ids: ClientInfo;
|
|
21
|
+
json?: string;
|
|
22
|
+
}
|
|
23
|
+
export interface EventTransport {
|
|
24
|
+
readonly publishRate: number;
|
|
25
|
+
sendEvents(topic: string, events: BufferedEvent[], signal: AbortSignal): Promise<void>;
|
|
26
|
+
}
|
|
27
|
+
export declare type LogLevel = 'trace' | 'debug' | 'info' | 'warning' | 'error' | 'fatal';
|
|
28
|
+
export interface LogEntry {
|
|
29
|
+
readonly level: LogLevel;
|
|
30
|
+
readonly timestamp: number;
|
|
31
|
+
readonly message: string;
|
|
32
|
+
readonly error: unknown;
|
|
33
|
+
readonly json: string;
|
|
34
|
+
}
|
|
35
|
+
export interface LogTransport {
|
|
36
|
+
readonly publishRate?: number;
|
|
37
|
+
sendEntries(entries: LogEntry[], signal: AbortSignal): Promise<void> | undefined;
|
|
38
|
+
}
|
|
39
|
+
export interface RootLogger extends Logger {
|
|
40
|
+
enrichReserved(fields: object): RootLogger;
|
|
41
|
+
flush(): Promise<void>;
|
|
42
|
+
}
|
|
43
|
+
export declare function createContext(clientInfo: ClientInfo, loggers: LogTransport[], eventTransport: EventTransport, timeouts: {
|
|
44
|
+
default: number;
|
|
45
|
+
cap?: number;
|
|
46
|
+
}, outerController: AbortController, meta?: Metadata, environment?: Environment | undefined, now?: (() => Date) | undefined): {
|
|
47
|
+
log: RootLogger;
|
|
48
|
+
context: Context;
|
|
49
|
+
success: () => Promise<unknown>;
|
|
50
|
+
flush: () => Promise<void>;
|
|
51
|
+
};
|
package/host/context.js
ADDED
|
@@ -0,0 +1,104 @@
|
|
|
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 _LogMulticaster_transports;
|
|
13
|
+
import { EventEmitter } from './emitter.js';
|
|
14
|
+
import { makeLogger } from './logging.js';
|
|
15
|
+
class LogMulticaster {
|
|
16
|
+
constructor(transports) {
|
|
17
|
+
_LogMulticaster_transports.set(this, void 0);
|
|
18
|
+
__classPrivateFieldSet(this, _LogMulticaster_transports, transports, "f");
|
|
19
|
+
this.publishRate = transports.map(t => t.publishRate).sort()[0] ?? Number.MAX_SAFE_INTEGER;
|
|
20
|
+
}
|
|
21
|
+
sendEntries(entries, signal) {
|
|
22
|
+
const promises = __classPrivateFieldGet(this, _LogMulticaster_transports, "f").map(t => t.sendEntries(entries, signal)).filter(p => !!p);
|
|
23
|
+
if (promises.length === 0) {
|
|
24
|
+
return;
|
|
25
|
+
}
|
|
26
|
+
return Promise.all(promises);
|
|
27
|
+
}
|
|
28
|
+
}
|
|
29
|
+
_LogMulticaster_transports = new WeakMap();
|
|
30
|
+
export function createContext(clientInfo, loggers, eventTransport, timeouts, outerController, meta, environment, now) {
|
|
31
|
+
const timeout = (timeouts.cap
|
|
32
|
+
? Math.min(meta?.config?.timeout ?? timeouts.default, timeouts.cap)
|
|
33
|
+
: meta?.config?.timeout ?? timeouts.default) * 1000;
|
|
34
|
+
const innerController = new AbortController();
|
|
35
|
+
// eslint-disable-next-line @typescript-eslint/no-non-null-assertion
|
|
36
|
+
const logTransport = loggers.length === 1 ? loggers[0] : new LogMulticaster(loggers);
|
|
37
|
+
const logger = makeLogger(logTransport, meta?.config?.minimumLogLevel, outerController.signal);
|
|
38
|
+
logger.enrichReserved({
|
|
39
|
+
operationId: clientInfo.operationId,
|
|
40
|
+
client: {
|
|
41
|
+
id: clientInfo.clientId,
|
|
42
|
+
ip: clientInfo.clientIp,
|
|
43
|
+
port: clientInfo.clientPort,
|
|
44
|
+
userAgent: clientInfo.userAgent,
|
|
45
|
+
},
|
|
46
|
+
});
|
|
47
|
+
globalLogger = logger;
|
|
48
|
+
const emitter = new EventEmitter(eventTransport, logger, clientInfo, timeout, outerController.signal);
|
|
49
|
+
const successHandlers = [];
|
|
50
|
+
const ctx = {
|
|
51
|
+
env: environment ?? process.env,
|
|
52
|
+
log: logger,
|
|
53
|
+
signal: innerController.signal,
|
|
54
|
+
now: now ?? (() => new Date()),
|
|
55
|
+
operationId: clientInfo.operationId,
|
|
56
|
+
client: {
|
|
57
|
+
id: clientInfo.clientId,
|
|
58
|
+
ip: clientInfo.clientIp,
|
|
59
|
+
port: clientInfo.clientPort,
|
|
60
|
+
userAgent: clientInfo.userAgent,
|
|
61
|
+
},
|
|
62
|
+
meta: meta
|
|
63
|
+
? {
|
|
64
|
+
packageName: meta.packageName,
|
|
65
|
+
fileName: meta.fileName,
|
|
66
|
+
revision: meta.revision,
|
|
67
|
+
}
|
|
68
|
+
: undefined,
|
|
69
|
+
emit: (topic, type, subject, data, messageId) => emitter.emit({ topic, type, subject, id: messageId }, data),
|
|
70
|
+
eventBarrier: () => emitter.flush(),
|
|
71
|
+
onSuccess: (fn) => successHandlers.push(fn),
|
|
72
|
+
};
|
|
73
|
+
const timeoutHandle = setTimeout(() => {
|
|
74
|
+
ctx.log.error('Timeout.', undefined, undefined);
|
|
75
|
+
innerController.abort();
|
|
76
|
+
// eslint-disable-next-line no-void
|
|
77
|
+
void logger.flush();
|
|
78
|
+
// eslint-disable-next-line no-void
|
|
79
|
+
void emitter.flush();
|
|
80
|
+
}, timeout);
|
|
81
|
+
const flushHandle = setTimeout(() => {
|
|
82
|
+
ctx.log.error('Aborting flush.', undefined, undefined);
|
|
83
|
+
outerController.abort();
|
|
84
|
+
}, timeout + 15000);
|
|
85
|
+
return {
|
|
86
|
+
log: logger,
|
|
87
|
+
context: ctx,
|
|
88
|
+
success: () => Promise.all(successHandlers.map(fn => fn())),
|
|
89
|
+
flush: async () => {
|
|
90
|
+
clearTimeout(timeoutHandle);
|
|
91
|
+
await emitter.flush();
|
|
92
|
+
await logger.flush();
|
|
93
|
+
clearTimeout(flushHandle);
|
|
94
|
+
},
|
|
95
|
+
};
|
|
96
|
+
}
|
|
97
|
+
let globalLogger;
|
|
98
|
+
process.on('uncaughtException', err => {
|
|
99
|
+
globalLogger?.fatal('Uncaught exception.', err, undefined);
|
|
100
|
+
});
|
|
101
|
+
process.on('unhandledRejection', reason => {
|
|
102
|
+
globalLogger?.fatal('Unhandled rejection.', reason, undefined);
|
|
103
|
+
});
|
|
104
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY29udGV4dC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbImNvbnRleHQudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7Ozs7Ozs7Ozs7O0FBQ0EsT0FBTyxFQUFFLFlBQVksRUFBRSxNQUFNLGNBQWMsQ0FBQTtBQUMzQyxPQUFPLEVBQUUsVUFBVSxFQUFFLE1BQU0sY0FBYyxDQUFBO0FBNkN6QyxNQUFNLGNBQWM7SUFJaEIsWUFBWSxVQUEwQjtRQUh0Qyw2Q0FBMkI7UUFJdkIsdUJBQUEsSUFBSSw4QkFBZSxVQUFVLE1BQUEsQ0FBQTtRQUM3QixJQUFJLENBQUMsV0FBVyxHQUFHLFVBQVUsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsV0FBVyxDQUFDLENBQUMsSUFBSSxFQUFFLENBQUMsQ0FBQyxDQUFDLElBQUksTUFBTSxDQUFDLGdCQUFnQixDQUFBO0lBQzlGLENBQUM7SUFFRCxXQUFXLENBQUMsT0FBbUIsRUFBRSxNQUFtQjtRQUNoRCxNQUFNLFFBQVEsR0FBRyx1QkFBQSxJQUFJLGtDQUFZLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLFdBQVcsQ0FBQyxPQUFPLEVBQUUsTUFBTSxDQUFDLENBQUMsQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUE7UUFDM0YsSUFBSSxRQUFRLENBQUMsTUFBTSxLQUFLLENBQUMsRUFBRTtZQUN2QixPQUFNO1NBQ1Q7UUFDRCxPQUFPLE9BQU8sQ0FBQyxHQUFHLENBQUMsUUFBUSxDQUE2QixDQUFBO0lBQzVELENBQUM7Q0FDSjs7QUFPRCxNQUFNLFVBQVUsYUFBYSxDQUN6QixVQUFzQixFQUN0QixPQUF1QixFQUN2QixjQUE4QixFQUM5QixRQUEyQyxFQUMzQyxlQUFnQyxFQUNoQyxJQUFlLEVBQ2YsV0FBcUMsRUFDckMsR0FBOEI7SUFPOUIsTUFBTSxPQUFPLEdBQ1QsQ0FBQyxR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QyxZQUFZLEVBQUUsS0FBSyxDQUFDLHNCQUFzQixFQUFFLE1BQU0sRUFBRSxTQUFTLENBQUMsQ0FBQTtBQUNsRSxDQUFDLENBQUMsQ0FBQSIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IEFib3J0U2lnbmFsLCBDb250ZXh0LCBFbnZpcm9ubWVudCwgSnNvbiwgTG9nZ2VyIH0gZnJvbSAnLi4vY29udGV4dC5qcydcclxuaW1wb3J0IHsgRXZlbnRFbWl0dGVyIH0gZnJvbSAnLi9lbWl0dGVyLmpzJ1xyXG5pbXBvcnQgeyBtYWtlTG9nZ2VyIH0gZnJvbSAnLi9sb2dnaW5nLmpzJ1xyXG5pbXBvcnQgeyBNZXRhZGF0YSB9IGZyb20gJy4vcmVnaXN0cnkuanMnXHJcblxyXG5leHBvcnQgaW50ZXJmYWNlIENsaWVudEluZm8ge1xyXG4gICAgcmVhZG9ubHkgb3BlcmF0aW9uSWQ/OiBzdHJpbmdcclxuICAgIHJlYWRvbmx5IGNsaWVudElkPzogc3RyaW5nXHJcbiAgICByZWFkb25seSBjbGllbnRJcD86IHN0cmluZ1xyXG4gICAgcmVhZG9ubHkgY2xpZW50UG9ydD86IG51bWJlclxyXG4gICAgcmVhZG9ubHkgdXNlckFnZW50Pzogc3RyaW5nXHJcbn1cclxuXHJcbmV4cG9ydCBpbnRlcmZhY2UgRXZlbnRNZXRhZGF0YSB7XHJcbiAgICB0b3BpYzogc3RyaW5nXHJcbiAgICB0eXBlOiBzdHJpbmdcclxuICAgIHN1YmplY3Q6IHN0cmluZ1xyXG4gICAgaWQ/OiBzdHJpbmdcclxufVxyXG5cclxuZXhwb3J0IGludGVyZmFjZSBCdWZmZXJlZEV2ZW50IHtcclxuICAgIGV2ZW50VGltZTogRGF0ZVxyXG4gICAgbWV0YTogT21pdDxFdmVudE1ldGFkYXRhLCAndG9waWMnPlxyXG4gICAgaWRzOiBDbGllbnRJbmZvXHJcbiAgICBqc29uPzogc3RyaW5nXHJcbn1cclxuXHJcbmV4cG9ydCBpbnRlcmZhY2UgRXZlbnRUcmFuc3BvcnQge1xyXG4gICAgcmVhZG9ubHkgcHVibGlzaFJhdGU6IG51bWJlclxyXG4gICAgc2VuZEV2ZW50cyh0b3BpYzogc3RyaW5nLCBldmVudHM6IEJ1ZmZlcmVkRXZlbnRbXSwgc2lnbmFsOiBBYm9ydFNpZ25hbCk6IFByb21pc2U8dm9pZD5cclxufVxyXG5cclxuZXhwb3J0IHR5cGUgTG9nTGV2ZWwgPSAndHJhY2UnIHwgJ2RlYnVnJyB8ICdpbmZvJyB8ICd3YXJuaW5nJyB8ICdlcnJvcicgfCAnZmF0YWwnXHJcblxyXG5leHBvcnQgaW50ZXJmYWNlIExvZ0VudHJ5IHtcclxuICAgIHJlYWRvbmx5IGxldmVsOiBMb2dMZXZlbFxyXG4gICAgcmVhZG9ubHkgdGltZXN0YW1wOiBudW1iZXJcclxuICAgIHJlYWRvbmx5IG1lc3NhZ2U6IHN0cmluZ1xyXG4gICAgcmVhZG9ubHkgZXJyb3I6IHVua25vd25cclxuICAgIHJlYWRvbmx5IGpzb246IHN0cmluZ1xyXG59XHJcblxyXG5leHBvcnQgaW50ZXJmYWNlIExvZ1RyYW5zcG9ydCB7XHJcbiAgICByZWFkb25seSBwdWJsaXNoUmF0ZT86IG51bWJlclxyXG4gICAgc2VuZEVudHJpZXMoZW50cmllczogTG9nRW50cnlbXSwgc2lnbmFsOiBBYm9ydFNpZ25hbCk6IFByb21pc2U8dm9pZD4gfCB1bmRlZmluZWRcclxufVxyXG5cclxuY2xhc3MgTG9nTXVsdGljYXN0ZXIgaW1wbGVtZW50cyBMb2dUcmFuc3BvcnQge1xyXG4gICAgI3RyYW5zcG9ydHM6IExvZ1RyYW5zcG9ydFtdXHJcbiAgICByZWFkb25seSBwdWJsaXNoUmF0ZTogbnVtYmVyXHJcblxyXG4gICAgY29uc3RydWN0b3IodHJhbnNwb3J0czogTG9nVHJhbnNwb3J0W10pIHtcclxuICAgICAgICB0aGlzLiN0cmFuc3BvcnRzID0gdHJhbnNwb3J0c1xyXG4gICAgICAgIHRoaXMucHVibGlzaFJhdGUgPSB0cmFuc3BvcnRzLm1hcCh0ID0+IHQucHVibGlzaFJhdGUpLnNvcnQoKVswXSA/PyBOdW1iZXIuTUFYX1NBRkVfSU5URUdFUlxyXG4gICAgfVxyXG5cclxuICAgIHNlbmRFbnRyaWVzKGVudHJpZXM6IExvZ0VudHJ5W10sIHNpZ25hbDogQWJvcnRTaWduYWwpIHtcclxuICAgICAgICBjb25zdCBwcm9taXNlcyA9IHRoaXMuI3RyYW5zcG9ydHMubWFwKHQgPT4gdC5zZW5kRW50cmllcyhlbnRyaWVzLCBzaWduYWwpKS5maWx0ZXIocCA9PiAhIXApXHJcbiAgICAgICAgaWYgKHByb21pc2VzLmxlbmd0aCA9PT0gMCkge1xyXG4gICAgICAgICAgICByZXR1cm5cclxuICAgICAgICB9XHJcbiAgICAgICAgcmV0dXJuIFByb21pc2UuYWxsKHByb21pc2VzKSBhcyB1bmtub3duIGFzIFByb21pc2U8dm9pZD5cclxuICAgIH1cclxufVxyXG5cclxuZXhwb3J0IGludGVyZmFjZSBSb290TG9nZ2VyIGV4dGVuZHMgTG9nZ2VyIHtcclxuICAgIGVucmljaFJlc2VydmVkKGZpZWxkczogb2JqZWN0KTogUm9vdExvZ2dlclxyXG4gICAgZmx1c2goKTogUHJvbWlzZTx2b2lkPlxyXG59XHJcblxyXG5leHBvcnQgZnVuY3Rpb24gY3JlYXRlQ29udGV4dChcclxuICAgIGNsaWVudEluZm86IENsaWVudEluZm8sXHJcbiAgICBsb2dnZXJzOiBMb2dUcmFuc3BvcnRbXSxcclxuICAgIGV2ZW50VHJhbnNwb3J0OiBFdmVudFRyYW5zcG9ydCxcclxuICAgIHRpbWVvdXRzOiB7IGRlZmF1bHQ6IG51bWJlcjsgY2FwPzogbnVtYmVyIH0sXHJcbiAgICBvdXRlckNvbnRyb2xsZXI6IEFib3J0Q29udHJvbGxlcixcclxuICAgIG1ldGE/OiBNZXRhZGF0YSxcclxuICAgIGVudmlyb25tZW50PzogRW52aXJvbm1lbnQgfCB1bmRlZmluZWQsXHJcbiAgICBub3c/OiAoKCkgPT4gRGF0ZSkgfCB1bmRlZmluZWQsXHJcbik6IHtcclxuICAgIGxvZzogUm9vdExvZ2dlclxyXG4gICAgY29udGV4dDogQ29udGV4dFxyXG4gICAgc3VjY2VzczogKCkgPT4gUHJvbWlzZTx1bmtub3duPlxyXG4gICAgZmx1c2g6ICgpID0+IFByb21pc2U8dm9pZD5cclxufSB7XHJcbiAgICBjb25zdCB0aW1lb3V0ID1cclxuICAgICAgICAodGltZW91dHMuY2FwXHJcbiAgICAgICAgICAgID8gTWF0aC5taW4obWV0YT8uY29uZmlnPy50aW1lb3V0ID8/IHRpbWVvdXRzLmRlZmF1bHQsIHRpbWVvdXRzLmNhcClcclxuICAgICAgICAgICAgOiBtZXRhPy5jb25maWc/LnRpbWVvdXQgPz8gdGltZW91dHMuZGVmYXVsdCkgKiAxMDAwXHJcbiAgICBjb25zdCBpbm5lckNvbnRyb2xsZXIgPSBuZXcgQWJvcnRDb250cm9sbGVyKClcclxuICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBAdHlwZXNjcmlwdC1lc2xpbnQvbm8tbm9uLW51bGwtYXNzZXJ0aW9uXHJcbiAgICBjb25zdCBsb2dUcmFuc3BvcnQgPSBsb2dnZXJzLmxlbmd0aCA9PT0gMSA/IGxvZ2dlcnNbMF0hIDogbmV3IExvZ011bHRpY2FzdGVyKGxvZ2dlcnMpXHJcbiAgICBjb25zdCBsb2dnZXIgPSBtYWtlTG9nZ2VyKFxyXG4gICAgICAgIGxvZ1RyYW5zcG9ydCxcclxuICAgICAgICBtZXRhPy5jb25maWc/Lm1pbmltdW1Mb2dMZXZlbCxcclxuICAgICAgICBvdXRlckNvbnRyb2xsZXIuc2lnbmFsIGFzIEFib3J0U2lnbmFsLFxyXG4gICAgKVxyXG4gICAgbG9nZ2VyLmVucmljaFJlc2VydmVkKHtcclxuICAgICAgICBvcGVyYXRpb25JZDogY2xpZW50SW5mby5vcGVyYXRpb25JZCxcclxuICAgICAgICBjbGllbnQ6IHtcclxuICAgICAgICAgICAgaWQ6IGNsaWVudEluZm8uY2xpZW50SWQsXHJcbiAgICAgICAgICAgIGlwOiBjbGllbnRJbmZvLmNsaWVudElwLFxyXG4gICAgICAgICAgICBwb3J0OiBjbGllbnRJbmZvLmNsaWVudFBvcnQsXHJcbiAgICAgICAgICAgIHVzZXJBZ2VudDogY2xpZW50SW5mby51c2VyQWdlbnQsXHJcbiAgICAgICAgfSxcclxuICAgIH0pXHJcbiAgICBnbG9iYWxMb2dnZXIgPSBsb2dnZXJcclxuICAgIGNvbnN0IGVtaXR0ZXIgPSBuZXcgRXZlbnRFbWl0dGVyKFxyXG4gICAgICAgIGV2ZW50VHJhbnNwb3J0LFxyXG4gICAgICAgIGxvZ2dlcixcclxuICAgICAgICBjbGllbnRJbmZvLFxyXG4gICAgICAgIHRpbWVvdXQsXHJcbiAgICAgICAgb3V0ZXJDb250cm9sbGVyLnNpZ25hbCBhcyBBYm9ydFNpZ25hbCxcclxuICAgIClcclxuICAgIGNvbnN0IHN1Y2Nlc3NIYW5kbGVyczogKCgpID0+IFByb21pc2U8dm9pZD4gfCB2b2lkKVtdID0gW11cclxuICAgIGNvbnN0IGN0eCA9IHtcclxuICAgICAgICBlbnY6IGVudmlyb25tZW50ID8/IChwcm9jZXNzLmVudiBhcyBFbnZpcm9ubWVudCksXHJcbiAgICAgICAgbG9nOiBsb2dnZXIsXHJcbiAgICAgICAgc2lnbmFsOiBpbm5lckNvbnRyb2xsZXIuc2lnbmFsIGFzIEFib3J0U2lnbmFsLFxyXG4gICAgICAgIG5vdzogbm93ID8/ICgoKSA9PiBuZXcgRGF0ZSgpKSxcclxuICAgICAgICBvcGVyYXRpb25JZDogY2xpZW50SW5mby5vcGVyYXRpb25JZCxcclxuICAgICAgICBjbGllbnQ6IHtcclxuICAgICAgICAgICAgaWQ6IGNsaWVudEluZm8uY2xpZW50SWQsXHJcbiAgICAgICAgICAgIGlwOiBjbGllbnRJbmZvLmNsaWVudElwLFxyXG4gICAgICAgICAgICBwb3J0OiBjbGllbnRJbmZvLmNsaWVudFBvcnQsXHJcbiAgICAgICAgICAgIHVzZXJBZ2VudDogY2xpZW50SW5mby51c2VyQWdlbnQsXHJcbiAgICAgICAgfSxcclxuICAgICAgICBtZXRhOiBtZXRhXHJcbiAgICAgICAgICAgID8ge1xyXG4gICAgICAgICAgICAgICAgICBwYWNrYWdlTmFtZTogbWV0YS5wYWNrYWdlTmFtZSxcclxuICAgICAgICAgICAgICAgICAgZmlsZU5hbWU6IG1ldGEuZmlsZU5hbWUsXHJcbiAgICAgICAgICAgICAgICAgIHJldmlzaW9uOiBtZXRhLnJldmlzaW9uLFxyXG4gICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgOiB1bmRlZmluZWQsXHJcbiAgICAgICAgZW1pdDogKHRvcGljOiBzdHJpbmcsIHR5cGU6IHN0cmluZywgc3ViamVjdDogc3RyaW5nLCBkYXRhPzogSnNvbiwgbWVzc2FnZUlkPzogc3RyaW5nKSA9PlxyXG4gICAgICAgICAgICBlbWl0dGVyLmVtaXQoeyB0b3BpYywgdHlwZSwgc3ViamVjdCwgaWQ6IG1lc3NhZ2VJZCB9LCBkYXRhKSxcclxuICAgICAgICBldmVudEJhcnJpZXI6ICgpID0+IGVtaXR0ZXIuZmx1c2goKSxcclxuICAgICAgICBvblN1Y2Nlc3M6IChmbjogKCkgPT4gUHJvbWlzZTx2b2lkPiB8IHZvaWQpID0+IHN1Y2Nlc3NIYW5kbGVycy5wdXNoKGZuKSxcclxuICAgIH1cclxuICAgIGNvbnN0IHRpbWVvdXRIYW5kbGUgPSBzZXRUaW1lb3V0KCgpID0+IHtcclxuICAgICAgICBjdHgubG9nLmVycm9yKCdUaW1lb3V0LicsIHVuZGVmaW5lZCwgdW5kZWZpbmVkKVxyXG4gICAgICAgIGlubmVyQ29udHJvbGxlci5hYm9ydCgpXHJcbiAgICAgICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIG5vLXZvaWRcclxuICAgICAgICB2b2lkIGxvZ2dlci5mbHVzaCgpXHJcbiAgICAgICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIG5vLXZvaWRcclxuICAgICAgICB2b2lkIGVtaXR0ZXIuZmx1c2goKVxyXG4gICAgfSwgdGltZW91dClcclxuICAgIGNvbnN0IGZsdXNoSGFuZGxlID0gc2V0VGltZW91dCgoKSA9PiB7XHJcbiAgICAgICAgY3R4LmxvZy5lcnJvcignQWJvcnRpbmcgZmx1c2guJywgdW5kZWZpbmVkLCB1bmRlZmluZWQpXHJcbiAgICAgICAgb3V0ZXJDb250cm9sbGVyLmFib3J0KClcclxuICAgIH0sIHRpbWVvdXQgKyAxNTAwMClcclxuICAgIHJldHVybiB7XHJcbiAgICAgICAgbG9nOiBsb2dnZXIsXHJcbiAgICAgICAgY29udGV4dDogY3R4LFxyXG4gICAgICAgIHN1Y2Nlc3M6ICgpID0+IFByb21pc2UuYWxsKHN1Y2Nlc3NIYW5kbGVycy5tYXAoZm4gPT4gZm4oKSkpLFxyXG4gICAgICAgIGZsdXNoOiBhc3luYyAoKSA9PiB7XHJcbiAgICAgICAgICAgIGNsZWFyVGltZW91dCh0aW1lb3V0SGFuZGxlKVxyXG4gICAgICAgICAgICBhd2FpdCBlbWl0dGVyLmZsdXNoKClcclxuICAgICAgICAgICAgYXdhaXQgbG9nZ2VyLmZsdXNoKClcclxuICAgICAgICAgICAgY2xlYXJUaW1lb3V0KGZsdXNoSGFuZGxlKVxyXG4gICAgICAgIH0sXHJcbiAgICB9XHJcbn1cclxuXHJcbmxldCBnbG9iYWxMb2dnZXI6IExvZ2dlciB8IHVuZGVmaW5lZFxyXG5cclxucHJvY2Vzcy5vbigndW5jYXVnaHRFeGNlcHRpb24nLCBlcnIgPT4ge1xyXG4gICAgZ2xvYmFsTG9nZ2VyPy5mYXRhbCgnVW5jYXVnaHQgZXhjZXB0aW9uLicsIGVyciwgdW5kZWZpbmVkKVxyXG59KVxyXG5wcm9jZXNzLm9uKCd1bmhhbmRsZWRSZWplY3Rpb24nLCByZWFzb24gPT4ge1xyXG4gICAgZ2xvYmFsTG9nZ2VyPy5mYXRhbCgnVW5oYW5kbGVkIHJlamVjdGlvbi4nLCByZWFzb24sIHVuZGVmaW5lZClcclxufSlcclxuIl19
|
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
import { AbortSignal, Json, Logger } from '../context.js';
|
|
2
|
+
import { EventMetadata, EventTransport } from './context.js';
|
|
3
|
+
export declare class EventEmitter {
|
|
4
|
+
#private;
|
|
5
|
+
constructor(transport: EventTransport, logger: Logger, ids: {
|
|
6
|
+
operationId?: string;
|
|
7
|
+
clientId?: string;
|
|
8
|
+
clientIp?: string;
|
|
9
|
+
userAgent?: string;
|
|
10
|
+
}, timeout: number, signal: AbortSignal);
|
|
11
|
+
emit(meta: EventMetadata, data?: Json): void;
|
|
12
|
+
flush(): Promise<void>;
|
|
13
|
+
}
|
package/host/emitter.js
ADDED
|
@@ -0,0 +1,81 @@
|
|
|
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 _EventEmitter_instances, _EventEmitter_transport, _EventEmitter_logger, _EventEmitter_ids, _EventEmitter_emitted, _EventEmitter_size, _EventEmitter_flusher, _EventEmitter_deadline, _EventEmitter_buffered, _EventEmitter_signal, _EventEmitter_startFlush, _EventEmitter_flushEvents;
|
|
13
|
+
export class EventEmitter {
|
|
14
|
+
constructor(transport, logger, ids, timeout, signal) {
|
|
15
|
+
_EventEmitter_instances.add(this);
|
|
16
|
+
_EventEmitter_transport.set(this, void 0);
|
|
17
|
+
_EventEmitter_logger.set(this, void 0);
|
|
18
|
+
_EventEmitter_ids.set(this, void 0);
|
|
19
|
+
_EventEmitter_emitted.set(this, {});
|
|
20
|
+
_EventEmitter_size.set(this, 0);
|
|
21
|
+
_EventEmitter_flusher.set(this, void 0);
|
|
22
|
+
_EventEmitter_deadline.set(this, void 0);
|
|
23
|
+
_EventEmitter_buffered.set(this, void 0);
|
|
24
|
+
_EventEmitter_signal.set(this, void 0);
|
|
25
|
+
__classPrivateFieldSet(this, _EventEmitter_transport, transport, "f");
|
|
26
|
+
__classPrivateFieldSet(this, _EventEmitter_logger, logger, "f");
|
|
27
|
+
__classPrivateFieldSet(this, _EventEmitter_ids, ids, "f");
|
|
28
|
+
__classPrivateFieldSet(this, _EventEmitter_deadline, new Date().getTime() + timeout, "f");
|
|
29
|
+
__classPrivateFieldSet(this, _EventEmitter_buffered, 0, "f");
|
|
30
|
+
__classPrivateFieldSet(this, _EventEmitter_signal, signal, "f");
|
|
31
|
+
}
|
|
32
|
+
emit(meta, data) {
|
|
33
|
+
var _a;
|
|
34
|
+
const eventTime = new Date();
|
|
35
|
+
const timeLeft = __classPrivateFieldGet(this, _EventEmitter_deadline, "f") - new Date().getTime();
|
|
36
|
+
if (__classPrivateFieldGet(this, _EventEmitter_buffered, "f") / __classPrivateFieldGet(this, _EventEmitter_transport, "f").publishRate > timeLeft) {
|
|
37
|
+
throw new Error('Event overflow.');
|
|
38
|
+
}
|
|
39
|
+
const event = data === undefined
|
|
40
|
+
? { meta, ids: __classPrivateFieldGet(this, _EventEmitter_ids, "f"), eventTime }
|
|
41
|
+
: { meta, ids: __classPrivateFieldGet(this, _EventEmitter_ids, "f"), eventTime, json: JSON.stringify(data) };
|
|
42
|
+
const events = __classPrivateFieldGet(this, _EventEmitter_emitted, "f")[meta.topic];
|
|
43
|
+
if (!events) {
|
|
44
|
+
__classPrivateFieldGet(this, _EventEmitter_emitted, "f")[meta.topic] = [event];
|
|
45
|
+
}
|
|
46
|
+
else {
|
|
47
|
+
events.push(event);
|
|
48
|
+
if (events.length > 64 || __classPrivateFieldGet(this, _EventEmitter_size, "f") > 64000) {
|
|
49
|
+
// eslint-disable-next-line no-void
|
|
50
|
+
void this.flush();
|
|
51
|
+
}
|
|
52
|
+
}
|
|
53
|
+
__classPrivateFieldSet(this, _EventEmitter_buffered, (_a = __classPrivateFieldGet(this, _EventEmitter_buffered, "f"), ++_a), "f");
|
|
54
|
+
__classPrivateFieldSet(this, _EventEmitter_size, __classPrivateFieldGet(this, _EventEmitter_size, "f") + (event.json?.length ?? 0), "f");
|
|
55
|
+
}
|
|
56
|
+
async flush() {
|
|
57
|
+
__classPrivateFieldGet(this, _EventEmitter_instances, "m", _EventEmitter_startFlush).call(this, __classPrivateFieldGet(this, _EventEmitter_emitted, "f"));
|
|
58
|
+
__classPrivateFieldSet(this, _EventEmitter_emitted, {}, "f");
|
|
59
|
+
__classPrivateFieldSet(this, _EventEmitter_size, 0, "f");
|
|
60
|
+
return await __classPrivateFieldGet(this, _EventEmitter_flusher, "f");
|
|
61
|
+
}
|
|
62
|
+
}
|
|
63
|
+
_EventEmitter_transport = new WeakMap(), _EventEmitter_logger = new WeakMap(), _EventEmitter_ids = new WeakMap(), _EventEmitter_emitted = new WeakMap(), _EventEmitter_size = new WeakMap(), _EventEmitter_flusher = new WeakMap(), _EventEmitter_deadline = new WeakMap(), _EventEmitter_buffered = new WeakMap(), _EventEmitter_signal = new WeakMap(), _EventEmitter_instances = new WeakSet(), _EventEmitter_startFlush = function _EventEmitter_startFlush(emitted) {
|
|
64
|
+
if (__classPrivateFieldGet(this, _EventEmitter_flusher, "f")) {
|
|
65
|
+
__classPrivateFieldSet(this, _EventEmitter_flusher, __classPrivateFieldGet(this, _EventEmitter_flusher, "f").then(() => __classPrivateFieldGet(this, _EventEmitter_instances, "m", _EventEmitter_flushEvents).call(this, emitted)), "f");
|
|
66
|
+
}
|
|
67
|
+
else {
|
|
68
|
+
__classPrivateFieldSet(this, _EventEmitter_flusher, __classPrivateFieldGet(this, _EventEmitter_instances, "m", _EventEmitter_flushEvents).call(this, emitted), "f");
|
|
69
|
+
}
|
|
70
|
+
}, _EventEmitter_flushEvents = async function _EventEmitter_flushEvents(emitted) {
|
|
71
|
+
await Promise.all(Object.entries(emitted).map(async ([topic, events]) => {
|
|
72
|
+
try {
|
|
73
|
+
await __classPrivateFieldGet(this, _EventEmitter_transport, "f").sendEvents(topic, events, __classPrivateFieldGet(this, _EventEmitter_signal, "f"));
|
|
74
|
+
}
|
|
75
|
+
catch (e) {
|
|
76
|
+
__classPrivateFieldGet(this, _EventEmitter_logger, "f").fatal('Error sending events.', e, { events });
|
|
77
|
+
}
|
|
78
|
+
__classPrivateFieldSet(this, _EventEmitter_buffered, __classPrivateFieldGet(this, _EventEmitter_buffered, "f") - events.length, "f");
|
|
79
|
+
}));
|
|
80
|
+
};
|
|
81
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZW1pdHRlci5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbImVtaXR0ZXIudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7Ozs7Ozs7Ozs7O0FBT0EsTUFBTSxPQUFPLFlBQVk7SUFXckIsWUFDSSxTQUF5QixFQUN6QixNQUFjLEVBQ2QsR0FBdUYsRUFDdkYsT0FBZSxFQUNmLE1BQW1COztRQWZ2QiwwQ0FBbUM7UUFDbkMsdUNBQXdCO1FBQ3hCLG9DQUF5QjtRQUN6QixnQ0FBdUIsRUFBRSxFQUFBO1FBQ3pCLDZCQUFRLENBQUMsRUFBQTtRQUNULHdDQUF3QjtRQUN4Qix5Q0FBMEI7UUFDMUIseUNBQWlCO1FBQ2pCLHVDQUE2QjtRQVN6Qix1QkFBQSxJQUFJLDJCQUFjLFNBQVMsTUFBQSxDQUFBO1FBQzNCLHVCQUFBLElBQUksd0JBQVcsTUFBTSxNQUFBLENBQUE7UUFDckIsdUJBQUEsSUFBSSxxQkFBUSxHQUFHLE1BQUEsQ0FBQTtRQUNmLHVCQUFBLElBQUksMEJBQWEsSUFBSSxJQUFJLEVBQUUsQ0FBQyxPQUFPLEVBQUUsR0FBRyxPQUFPLE1BQUEsQ0FBQTtRQUMvQyx1QkFBQSxJQUFJLDBCQUFhLENBQUMsTUFBQSxDQUFBO1FBQ2xCLHVCQUFBLElBQUksd0JBQVcsTUFBTSxNQUFBLENBQUE7SUFDekIsQ0FBQztJQUVELElBQUksQ0FBQyxJQUFtQixFQUFFLElBQVc7O1FBQ2pDLE1BQU0sU0FBUyxHQUFHLElBQUksSUFBSSxFQUFFLENBQUE7UUFDNUIsTUFBTSxRQUFRLEdBQUcsdUJBQUEsSUFBSSw4QkFBVSxHQUFHLElBQUksSUFBSSxFQUFFLENBQUMsT0FBTyxFQUFFLENBQUE7UUFDdEQsSUFBSSx1QkFBQSxJQUFJLDhCQUFVLEdBQUcsdUJBQUEsSUFBSSwrQkFBVyxDQUFDLFdBQVcsR0FBRyxRQUFRLEVBQUU7WUFDekQsTUFBTSxJQUFJLEtBQUssQ0FBQyxpQkFBaUIsQ0FBQyxDQUFBO1NBQ3JDO1FBQ0QsTUFBTSxLQUFLLEdBQ1AsSUFBSSxLQUFLLFNBQVM7WUFDZCxDQUFDLENBQUMsRUFBRSxJQUFJLEVBQUUsR0FBRyxFQUFFLHVCQUFBLElBQUkseUJBQUssRUFBRSxTQUFTLEVBQUU7WUFDckMsQ0FBQyxDQUFDLEVBQUUsSUFBSSxFQUFFLEdBQUcsRUFBRSx1QkFBQSxJQUFJLHlCQUFLLEVBQUUsU0FBUyxFQUFFLElBQUksRUFBRSxJQUFJLENBQUMsU0FBUyxDQUFDLElBQUksQ0FBQyxFQUFFLENBQUE7UUFDekUsTUFBTSxNQUFNLEdBQUcsdUJBQUEsSUFBSSw2QkFBUyxDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsQ0FBQTtRQUN4QyxJQUFJLENBQUMsTUFBTSxFQUFFO1lBQ1QsdUJBQUEsSUFBSSw2QkFBUyxDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsR0FBRyxDQUFDLEtBQUssQ0FBQyxDQUFBO1NBQ3RDO2FBQU07WUFDSCxNQUFNLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxDQUFBO1lBQ2xCLElBQUksTUFBTSxDQUFDLE1BQU0sR0FBRyxFQUFFLElBQUksdUJBQUEsSUFBSSwwQkFBTSxHQUFHLEtBQUssRUFBRTtnQkFDMUMsbUNBQW1DO2dCQUNuQyxLQUFLLElBQUksQ0FBQyxLQUFLLEVBQUUsQ0FBQTthQUNwQjtTQUNKO1FBQ0QscURBQUEsQ0FBRSw4REFBYyxFQUFoQixJQUFnQixDQUFBLE1BQUEsQ0FBQTtRQUNoQiwwR0FBYyxLQUFLLENBQUMsSUFBSSxFQUFFLE1BQU0sSUFBSSxDQUFDLE9BQUEsQ0FBQTtJQUN6QyxDQUFDO0lBRUQsS0FBSyxDQUFDLEtBQUs7UUFDUCx1QkFBQSxJQUFJLHlEQUFZLE1BQWhCLElBQUksRUFBYSx1QkFBQSxJQUFJLDZCQUFTLENBQUMsQ0FBQTtRQUMvQix1QkFBQSxJQUFJLHlCQUFZLEVBQUUsTUFBQSxDQUFBO1FBQ2xCLHVCQUFBLElBQUksc0JBQVMsQ0FBQyxNQUFBLENBQUE7UUFDZCxPQUFPLE1BQU0sdUJBQUEsSUFBSSw2QkFBUyxDQUFBO0lBQzlCLENBQUM7Q0FzQko7Z2NBcEJlLE9BQW1CO0lBQzNCLElBQUksdUJBQUEsSUFBSSw2QkFBUyxFQUFFO1FBQ2YsdUJBQUEsSUFBSSx5QkFBWSx1QkFBQSxJQUFJLDZCQUFTLENBQUMsSUFBSSxDQUFDLEdBQUcsRUFBRSxDQUFDLHVCQUFBLElBQUksMERBQWEsTUFBakIsSUFBSSxFQUFjLE9BQU8sQ0FBQyxDQUFDLE1BQUEsQ0FBQTtLQUN2RTtTQUFNO1FBQ0gsdUJBQUEsSUFBSSx5QkFBWSx1QkFBQSxJQUFJLDBEQUFhLE1BQWpCLElBQUksRUFBYyxPQUFPLENBQUMsTUFBQSxDQUFBO0tBQzdDO0FBQ0wsQ0FBQyw4QkFFRCxLQUFLLG9DQUFjLE9BQW1CO0lBQ2xDLE1BQU0sT0FBTyxDQUFDLEdBQUcsQ0FDYixNQUFNLENBQUMsT0FBTyxDQUFDLE9BQU8sQ0FBQyxDQUFDLEdBQUcsQ0FBQyxLQUFLLEVBQUUsQ0FBQyxLQUFLLEVBQUUsTUFBTSxDQUFDLEVBQUUsRUFBRTtRQUNsRCxJQUFJO1lBQ0EsTUFBTSx1QkFBQSxJQUFJLCtCQUFXLENBQUMsVUFBVSxDQUFDLEtBQUssRUFBRSxNQUFNLEVBQUUsdUJBQUEsSUFBSSw0QkFBUSxDQUFDLENBQUE7U0FDaEU7UUFBQyxPQUFPLENBQUMsRUFBRTtZQUNSLHVCQUFBLElBQUksNEJBQVEsQ0FBQyxLQUFLLENBQUMsdUJBQXVCLEVBQUUsQ0FBQyxFQUFFLEVBQUUsTUFBTSxFQUFFLENBQUMsQ0FBQTtTQUM3RDtRQUNELGlIQUFrQixNQUFNLENBQUMsTUFBTSxNQUFBLENBQUE7SUFDbkMsQ0FBQyxDQUFDLENBQ0wsQ0FBQTtBQUNMLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBBYm9ydFNpZ25hbCwgSnNvbiwgTG9nZ2VyIH0gZnJvbSAnLi4vY29udGV4dC5qcydcclxuaW1wb3J0IHsgQnVmZmVyZWRFdmVudCwgQ2xpZW50SW5mbywgRXZlbnRNZXRhZGF0YSwgRXZlbnRUcmFuc3BvcnQgfSBmcm9tICcuL2NvbnRleHQuanMnXHJcblxyXG5pbnRlcmZhY2UgRW1pdEJ1ZmZlciB7XHJcbiAgICBbdG9waWM6IHN0cmluZ106IEJ1ZmZlcmVkRXZlbnRbXVxyXG59XHJcblxyXG5leHBvcnQgY2xhc3MgRXZlbnRFbWl0dGVyIHtcclxuICAgIHJlYWRvbmx5ICN0cmFuc3BvcnQ6IEV2ZW50VHJhbnNwb3J0XHJcbiAgICByZWFkb25seSAjbG9nZ2VyOiBMb2dnZXJcclxuICAgIHJlYWRvbmx5ICNpZHM6IENsaWVudEluZm9cclxuICAgICNlbWl0dGVkOiBFbWl0QnVmZmVyID0ge31cclxuICAgICNzaXplID0gMFxyXG4gICAgI2ZsdXNoZXI/OiBQcm9taXNlPHZvaWQ+XHJcbiAgICByZWFkb25seSAjZGVhZGxpbmU6IG51bWJlclxyXG4gICAgI2J1ZmZlcmVkOiBudW1iZXJcclxuICAgIHJlYWRvbmx5ICNzaWduYWw6IEFib3J0U2lnbmFsXHJcblxyXG4gICAgY29uc3RydWN0b3IoXHJcbiAgICAgICAgdHJhbnNwb3J0OiBFdmVudFRyYW5zcG9ydCxcclxuICAgICAgICBsb2dnZXI6IExvZ2dlcixcclxuICAgICAgICBpZHM6IHsgb3BlcmF0aW9uSWQ/OiBzdHJpbmc7IGNsaWVudElkPzogc3RyaW5nOyBjbGllbnRJcD86IHN0cmluZzsgdXNlckFnZW50Pzogc3RyaW5nIH0sXHJcbiAgICAgICAgdGltZW91dDogbnVtYmVyLFxyXG4gICAgICAgIHNpZ25hbDogQWJvcnRTaWduYWwsXHJcbiAgICApIHtcclxuICAgICAgICB0aGlzLiN0cmFuc3BvcnQgPSB0cmFuc3BvcnRcclxuICAgICAgICB0aGlzLiNsb2dnZXIgPSBsb2dnZXJcclxuICAgICAgICB0aGlzLiNpZHMgPSBpZHNcclxuICAgICAgICB0aGlzLiNkZWFkbGluZSA9IG5ldyBEYXRlKCkuZ2V0VGltZSgpICsgdGltZW91dFxyXG4gICAgICAgIHRoaXMuI2J1ZmZlcmVkID0gMFxyXG4gICAgICAgIHRoaXMuI3NpZ25hbCA9IHNpZ25hbFxyXG4gICAgfVxyXG5cclxuICAgIGVtaXQobWV0YTogRXZlbnRNZXRhZGF0YSwgZGF0YT86IEpzb24pOiB2b2lkIHtcclxuICAgICAgICBjb25zdCBldmVudFRpbWUgPSBuZXcgRGF0ZSgpXHJcbiAgICAgICAgY29uc3QgdGltZUxlZnQgPSB0aGlzLiNkZWFkbGluZSAtIG5ldyBEYXRlKCkuZ2V0VGltZSgpXHJcbiAgICAgICAgaWYgKHRoaXMuI2J1ZmZlcmVkIC8gdGhpcy4jdHJhbnNwb3J0LnB1Ymxpc2hSYXRlID4gdGltZUxlZnQpIHtcclxuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdFdmVudCBvdmVyZmxvdy4nKVxyXG4gICAgICAgIH1cclxuICAgICAgICBjb25zdCBldmVudCA9XHJcbiAgICAgICAgICAgIGRhdGEgPT09IHVuZGVmaW5lZFxyXG4gICAgICAgICAgICAgICAgPyB7IG1ldGEsIGlkczogdGhpcy4jaWRzLCBldmVudFRpbWUgfVxyXG4gICAgICAgICAgICAgICAgOiB7IG1ldGEsIGlkczogdGhpcy4jaWRzLCBldmVudFRpbWUsIGpzb246IEpTT04uc3RyaW5naWZ5KGRhdGEpIH1cclxuICAgICAgICBjb25zdCBldmVudHMgPSB0aGlzLiNlbWl0dGVkW21ldGEudG9waWNdXHJcbiAgICAgICAgaWYgKCFldmVudHMpIHtcclxuICAgICAgICAgICAgdGhpcy4jZW1pdHRlZFttZXRhLnRvcGljXSA9IFtldmVudF1cclxuICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICBldmVudHMucHVzaChldmVudClcclxuICAgICAgICAgICAgaWYgKGV2ZW50cy5sZW5ndGggPiA2NCB8fCB0aGlzLiNzaXplID4gNjQwMDApIHtcclxuICAgICAgICAgICAgICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBuby12b2lkXHJcbiAgICAgICAgICAgICAgICB2b2lkIHRoaXMuZmx1c2goKVxyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG4gICAgICAgICsrdGhpcy4jYnVmZmVyZWRcclxuICAgICAgICB0aGlzLiNzaXplICs9IGV2ZW50Lmpzb24/Lmxlbmd0aCA/PyAwXHJcbiAgICB9XHJcblxyXG4gICAgYXN5bmMgZmx1c2goKTogUHJvbWlzZTx2b2lkPiB7XHJcbiAgICAgICAgdGhpcy4jc3RhcnRGbHVzaCh0aGlzLiNlbWl0dGVkKVxyXG4gICAgICAgIHRoaXMuI2VtaXR0ZWQgPSB7fVxyXG4gICAgICAgIHRoaXMuI3NpemUgPSAwXHJcbiAgICAgICAgcmV0dXJuIGF3YWl0IHRoaXMuI2ZsdXNoZXJcclxuICAgIH1cclxuXHJcbiAgICAjc3RhcnRGbHVzaChlbWl0dGVkOiBFbWl0QnVmZmVyKSB7XHJcbiAgICAgICAgaWYgKHRoaXMuI2ZsdXNoZXIpIHtcclxuICAgICAgICAgICAgdGhpcy4jZmx1c2hlciA9IHRoaXMuI2ZsdXNoZXIudGhlbigoKSA9PiB0aGlzLiNmbHVzaEV2ZW50cyhlbWl0dGVkKSlcclxuICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICB0aGlzLiNmbHVzaGVyID0gdGhpcy4jZmx1c2hFdmVudHMoZW1pdHRlZClcclxuICAgICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgYXN5bmMgI2ZsdXNoRXZlbnRzKGVtaXR0ZWQ6IEVtaXRCdWZmZXIpIHtcclxuICAgICAgICBhd2FpdCBQcm9taXNlLmFsbChcclxuICAgICAgICAgICAgT2JqZWN0LmVudHJpZXMoZW1pdHRlZCkubWFwKGFzeW5jIChbdG9waWMsIGV2ZW50c10pID0+IHtcclxuICAgICAgICAgICAgICAgIHRyeSB7XHJcbiAgICAgICAgICAgICAgICAgICAgYXdhaXQgdGhpcy4jdHJhbnNwb3J0LnNlbmRFdmVudHModG9waWMsIGV2ZW50cywgdGhpcy4jc2lnbmFsKVxyXG4gICAgICAgICAgICAgICAgfSBjYXRjaCAoZSkge1xyXG4gICAgICAgICAgICAgICAgICAgIHRoaXMuI2xvZ2dlci5mYXRhbCgnRXJyb3Igc2VuZGluZyBldmVudHMuJywgZSwgeyBldmVudHMgfSlcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgIHRoaXMuI2J1ZmZlcmVkIC09IGV2ZW50cy5sZW5ndGhcclxuICAgICAgICAgICAgfSksXHJcbiAgICAgICAgKVxyXG4gICAgfVxyXG59XHJcbiJdfQ==
|
package/host/http.d.ts
ADDED
|
@@ -0,0 +1,30 @@
|
|
|
1
|
+
/// <reference types="node" resolution-mode="require"/>
|
|
2
|
+
import { Context } from '../context.js';
|
|
3
|
+
import type { Json } from '../http.js';
|
|
4
|
+
import { ClientInfo, RootLogger } from './context.js';
|
|
5
|
+
import type { HttpHandler } from './registry.js';
|
|
6
|
+
export interface Response {
|
|
7
|
+
headers: {
|
|
8
|
+
readonly [key: string]: string;
|
|
9
|
+
};
|
|
10
|
+
status: number;
|
|
11
|
+
body?: string | Buffer;
|
|
12
|
+
}
|
|
13
|
+
declare type RequestOptions = BodylessRequestOptions | StringRequestOptions | JsonRequestOptions;
|
|
14
|
+
interface BodylessRequestOptions {
|
|
15
|
+
uri: string;
|
|
16
|
+
headers?: {
|
|
17
|
+
readonly [key: string]: string;
|
|
18
|
+
};
|
|
19
|
+
}
|
|
20
|
+
interface StringRequestOptions extends BodylessRequestOptions {
|
|
21
|
+
body: string;
|
|
22
|
+
}
|
|
23
|
+
interface JsonRequestOptions extends BodylessRequestOptions {
|
|
24
|
+
json: Json;
|
|
25
|
+
}
|
|
26
|
+
export declare function executeRequest(log: RootLogger, context: Context, handler: HttpHandler, options: RequestOptions, success: () => Promise<unknown>): Promise<Response>;
|
|
27
|
+
export declare function clientFromHeaders(headers: {
|
|
28
|
+
readonly [key: string]: string;
|
|
29
|
+
} | undefined): ClientInfo;
|
|
30
|
+
export {};
|