@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 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
+ };
@@ -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
+ }
@@ -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 {};