@logbrew/sdk 0.1.38 → 0.1.39
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/automatic-delivery.cjs +271 -0
- package/batch-sender.cjs +164 -0
- package/bounded-number.cjs +34 -0
- package/browser-breadcrumbs.cjs +346 -136
- package/capture-support.cjs +100 -0
- package/client-options.cjs +292 -0
- package/client-report.cjs +232 -0
- package/client.cjs +447 -0
- package/console-arguments.cjs +151 -0
- package/console-capture.cjs +194 -0
- package/core.cjs +30 -2810
- package/delivery-health.cjs +133 -0
- package/error-causes.cjs +130 -0
- package/error-details.cjs +124 -0
- package/error-issue.cjs +187 -0
- package/event-clone.cjs +55 -0
- package/event-metadata.cjs +40 -0
- package/event-pipeline.cjs +325 -0
- package/event-queue.cjs +306 -0
- package/event-store.cjs +237 -0
- package/event-validation.cjs +159 -0
- package/examples/agent-timeline.cjs +57 -46
- package/examples/agent-timeline.mjs +41 -35
- package/examples/index.mjs +122 -94
- package/examples/readme-example.cjs +36 -27
- package/examples/readme-example.mjs +21 -17
- package/examples/real-user-smoke.cjs +41 -32
- package/examples/real-user-smoke.mjs +26 -22
- package/exception-chain.cjs +205 -0
- package/index.d.ts +144 -1076
- package/index.js +1 -1
- package/issue-exception.cjs +13 -8
- package/metric-validation.cjs +95 -0
- package/network-milestone.cjs +155 -0
- package/null-value.cjs +4 -0
- package/opentelemetry-bridge.cjs +330 -0
- package/opentelemetry-context.cjs +245 -0
- package/opentelemetry-exceptions.cjs +69 -0
- package/opentelemetry-keys.cjs +183 -0
- package/opentelemetry-span.cjs +286 -0
- package/opentelemetry-summary.cjs +213 -0
- package/opentelemetry-time.cjs +131 -0
- package/opentelemetry.cjs +99 -1068
- package/package.json +55 -1
- package/pino-destination.cjs +108 -0
- package/pino-record.cjs +237 -0
- package/product-action.cjs +163 -0
- package/provided-breadcrumbs.cjs +117 -0
- package/random-hex.cjs +29 -0
- package/react-native.js +1 -1
- package/recording-transport.cjs +68 -0
- package/release-artifacts-build.cjs +263 -84
- package/release-artifacts-common.js +347 -66
- package/release-artifacts-debug-id.js +178 -0
- package/release-artifacts-inspect.js +213 -0
- package/release-artifacts-issue-event.js +99 -0
- package/release-artifacts-manifest-artifact.js +107 -0
- package/release-artifacts-manifest.js +77 -0
- package/release-artifacts-mappings.js +265 -0
- package/release-artifacts-prepare.js +297 -0
- package/release-artifacts-source-context.js +210 -0
- package/release-artifacts-symbolication.js +272 -421
- package/release-artifacts-upload-files.js +122 -0
- package/release-artifacts-upload-request.js +246 -0
- package/release-artifacts-upload.js +155 -300
- package/release-artifacts-urls.js +49 -0
- package/release-artifacts.js +189 -662
- package/retry-delay.cjs +32 -0
- package/span-validation.cjs +191 -0
- package/stored-events.cjs +243 -0
- package/types/client.d.ts +67 -0
- package/types/delivery.d.ts +125 -0
- package/types/issues.d.ts +249 -0
- package/types/logging.d.ts +175 -0
- package/types/opentelemetry.d.ts +205 -0
- package/types/product.d.ts +128 -0
- package/types/recording-transport.d.ts +15 -0
- package/types/sdk-error.d.ts +9 -0
- package/types/telemetry.d.ts +171 -0
- package/types/trace-context.d.ts +110 -0
- package/types/transport-error.d.ts +10 -0
- package/utf8.cjs +37 -0
- package/validation.cjs +49 -1
- package/vite-release-artifacts-config.cjs +120 -0
- package/vite-release-artifacts.cjs +199 -99
- package/vite-release-artifacts.d.cts +65 -40
- package/vite-release-artifacts.d.ts +65 -40
- package/vite-release-artifacts.js +2 -2
- package/winston-info.cjs +205 -0
- package/winston.cjs +189 -289
package/winston.cjs
CHANGED
|
@@ -1,323 +1,223 @@
|
|
|
1
1
|
const { Writable } = require("node:stream");
|
|
2
2
|
|
|
3
|
-
const {
|
|
4
|
-
const {
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
} = require("./
|
|
3
|
+
const { callableOrUndefined, captureSettings, settledFlush } = require("./capture-support.cjs");
|
|
4
|
+
const { LogBrewClient } = require("./client.cjs");
|
|
5
|
+
const { traceFromProvider } = require("./log-context.cjs");
|
|
6
|
+
const { NULL_VALUE } = require("./null-value.cjs");
|
|
7
|
+
const { SdkError } = require("./sdk-error.cjs");
|
|
8
|
+
const { isObjectValue, isRecord, isTruthy, optionalProperty } = require("./validation.cjs");
|
|
9
|
+
const { logAttributesFromWinstonInfo, timestampFromWinstonInfo, winstonMessage } = require("./winston-info.cjs");
|
|
10
|
+
|
|
11
|
+
/**
|
|
12
|
+
* @import { IssueBreadcrumbLevel } from "./index.cjs"
|
|
13
|
+
* @import { CaptureClient } from "./capture-support.cjs"
|
|
14
|
+
* @typedef {CaptureClient & Readonly<{
|
|
15
|
+
* breadcrumbProvider: unknown,
|
|
16
|
+
* addBreadcrumb: (breadcrumb: unknown) => unknown
|
|
17
|
+
* }>} WinstonClient
|
|
18
|
+
* @typedef {{ type: "debug", category: string, level: IssueBreadcrumbLevel, message: string }} WinstonBreadcrumb
|
|
19
|
+
*/
|
|
10
20
|
|
|
11
|
-
// Runtime packages with request scopes (such as @logbrew/node) register a recorder that keeps
|
|
12
|
-
// breadcrumbs with the active request instead of the whole client.
|
|
13
21
|
const BREADCRUMB_RECORDER = Symbol.for("@logbrew/sdk.breadcrumbRecorder");
|
|
14
22
|
const MAX_BREADCRUMB_MESSAGE_LENGTH = 512;
|
|
15
|
-
const
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
"
|
|
20
|
-
"
|
|
21
|
-
"error",
|
|
22
|
-
"
|
|
23
|
+
const FIRST_CHARACTER = 0;
|
|
24
|
+
const NO_PENDING_EVENTS = 0;
|
|
25
|
+
/** @type {ReadonlyMap<string, IssueBreadcrumbLevel>} */
|
|
26
|
+
const BREADCRUMB_LEVELS = new Map([
|
|
27
|
+
["error", "error"],
|
|
28
|
+
["crit", "error"],
|
|
29
|
+
["critical", "error"],
|
|
30
|
+
["fatal", "error"],
|
|
31
|
+
["alert", "error"],
|
|
32
|
+
["emerg", "error"],
|
|
33
|
+
["warn", "warning"],
|
|
34
|
+
["warning", "warning"],
|
|
35
|
+
["verbose", "debug"],
|
|
36
|
+
["debug", "debug"],
|
|
37
|
+
["silly", "debug"]
|
|
23
38
|
]);
|
|
24
39
|
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
throw new SdkError("validation_error", "Winston transport client must be a LogBrewClient");
|
|
33
|
-
}
|
|
34
|
-
|
|
35
|
-
const transport = config.transport;
|
|
36
|
-
const breadcrumbs = config.breadcrumbs !== false;
|
|
37
|
-
const flushOnWrite = config.flushOnWrite === true;
|
|
38
|
-
const includeErrorStack = config.includeErrorStack === true;
|
|
39
|
-
const logger = config.logger ?? "winston";
|
|
40
|
-
const metadata = compactMetadata(config.metadata);
|
|
41
|
-
const timestamp = typeof config.timestamp === "function"
|
|
42
|
-
? config.timestamp
|
|
43
|
-
: () => new Date().toISOString();
|
|
44
|
-
const eventIdPrefix = config.eventIdPrefix ?? "winston";
|
|
45
|
-
const onError = typeof config.onError === "function" ? config.onError : () => {};
|
|
46
|
-
const traceProvider = typeof config.traceProvider === "function" ? config.traceProvider : null;
|
|
47
|
-
const state = {
|
|
48
|
-
captured: 0,
|
|
49
|
-
pendingFlush: Promise.resolve(null)
|
|
50
|
-
};
|
|
40
|
+
/**
|
|
41
|
+
* @param {unknown} level
|
|
42
|
+
* @returns {IssueBreadcrumbLevel}
|
|
43
|
+
*/
|
|
44
|
+
function winstonBreadcrumbLevel(level) {
|
|
45
|
+
return BREADCRUMB_LEVELS.get(String(level).toLowerCase()) ?? "info";
|
|
46
|
+
}
|
|
51
47
|
|
|
52
|
-
|
|
53
|
-
|
|
54
|
-
|
|
55
|
-
|
|
56
|
-
|
|
57
|
-
|
|
58
|
-
|
|
59
|
-
|
|
60
|
-
|
|
61
|
-
|
|
62
|
-
|
|
63
|
-
|
|
64
|
-
|
|
65
|
-
|
|
66
|
-
|
|
67
|
-
|
|
68
|
-
|
|
69
|
-
|
|
70
|
-
|
|
71
|
-
|
|
72
|
-
|
|
73
|
-
|
|
74
|
-
|
|
75
|
-
} finally {
|
|
76
|
-
callback();
|
|
48
|
+
class WinstonCapture {
|
|
49
|
+
/**
|
|
50
|
+
* @param {Readonly<Record<string, unknown>>} config
|
|
51
|
+
* @param {WinstonClient} client
|
|
52
|
+
*/
|
|
53
|
+
constructor(config, client) {
|
|
54
|
+
this.client = client;
|
|
55
|
+
this.breadcrumbs = config["breadcrumbs"] !== false;
|
|
56
|
+
this.settings = captureSettings(config, "flushOnWrite", "winston");
|
|
57
|
+
this.traceProvider = callableOrUndefined(config["traceProvider"]);
|
|
58
|
+
this.captured = 0;
|
|
59
|
+
/** @type {Promise<unknown>} */
|
|
60
|
+
this.pendingFlush = Promise.resolve(NULL_VALUE);
|
|
61
|
+
}
|
|
62
|
+
|
|
63
|
+
/**
|
|
64
|
+
* @param {unknown} info
|
|
65
|
+
* @returns {void}
|
|
66
|
+
*/
|
|
67
|
+
write(info) {
|
|
68
|
+
try {
|
|
69
|
+
if (this.breadcrumbs) {
|
|
70
|
+
this.recordBreadcrumb(info);
|
|
77
71
|
}
|
|
72
|
+
this.capture(info);
|
|
73
|
+
} catch (error) {
|
|
74
|
+
this.settings.onError(error);
|
|
78
75
|
}
|
|
79
|
-
}
|
|
76
|
+
}
|
|
80
77
|
|
|
81
|
-
|
|
82
|
-
|
|
83
|
-
|
|
84
|
-
|
|
78
|
+
/**
|
|
79
|
+
* @param {unknown} info
|
|
80
|
+
* @returns {boolean}
|
|
81
|
+
*/
|
|
82
|
+
recordBreadcrumb(info) {
|
|
83
|
+
if (!isRecord(info) || info["silent"] === true) {
|
|
84
|
+
return false;
|
|
85
85
|
}
|
|
86
|
-
|
|
87
|
-
|
|
88
|
-
|
|
89
|
-
|
|
90
|
-
|
|
91
|
-
|
|
92
|
-
|
|
86
|
+
/** @type {WinstonBreadcrumb} */
|
|
87
|
+
const breadcrumb = {
|
|
88
|
+
type: "debug",
|
|
89
|
+
|
|
90
|
+
category: "log.winston",
|
|
91
|
+
level: winstonBreadcrumbLevel(info["level"]),
|
|
92
|
+
message: [...winstonMessage(info)].slice(FIRST_CHARACTER, MAX_BREADCRUMB_MESSAGE_LENGTH).join("")
|
|
93
|
+
};
|
|
94
|
+
/** @type {unknown} */
|
|
95
|
+
const recorder = isTruthy(this.client.breadcrumbProvider) ? Reflect.get(globalThis, BREADCRUMB_RECORDER) : undefined;
|
|
96
|
+
try {
|
|
97
|
+
if (typeof recorder === "function") {
|
|
98
|
+
Reflect.apply(recorder, undefined, [breadcrumb]);
|
|
99
|
+
} else {
|
|
100
|
+
this.client.addBreadcrumb(breadcrumb);
|
|
101
|
+
}
|
|
102
|
+
return true;
|
|
103
|
+
} catch {
|
|
104
|
+
return false;
|
|
93
105
|
}
|
|
94
|
-
return state.pendingFlush;
|
|
95
|
-
};
|
|
96
|
-
if (typeof config.level === "string" && config.level.trim() !== "") {
|
|
97
|
-
winstonTransport.level = config.level;
|
|
98
106
|
}
|
|
99
|
-
if (config.name !== undefined) {
|
|
100
|
-
winstonTransport.name = String(config.name);
|
|
101
|
-
}
|
|
102
|
-
if (config.silent === true) {
|
|
103
|
-
winstonTransport.silent = true;
|
|
104
|
-
}
|
|
105
|
-
if (config.handleExceptions === true) {
|
|
106
|
-
winstonTransport.handleExceptions = true;
|
|
107
|
-
}
|
|
108
|
-
if (config.handleRejections === true) {
|
|
109
|
-
winstonTransport.handleRejections = true;
|
|
110
|
-
}
|
|
111
|
-
|
|
112
|
-
return winstonTransport;
|
|
113
|
-
}
|
|
114
|
-
|
|
115
|
-
function captureWinstonInfo(config) {
|
|
116
|
-
if (config.info?.silent === true) {
|
|
117
|
-
return;
|
|
118
|
-
}
|
|
119
|
-
config.state.captured += 1;
|
|
120
|
-
config.client.log(
|
|
121
|
-
`${config.eventIdPrefix}_${config.state.captured}`,
|
|
122
|
-
timestampFromWinstonInfo(config.info, config.timestamp),
|
|
123
|
-
logAttributesFromWinstonInfo(config.info, {
|
|
124
|
-
includeErrorStack: config.includeErrorStack,
|
|
125
|
-
logger: config.logger,
|
|
126
|
-
metadata: config.metadata,
|
|
127
|
-
trace: traceFromProvider(config.traceProvider, config.onError)
|
|
128
|
-
})
|
|
129
|
-
);
|
|
130
|
-
if (config.flushOnWrite && config.transport) {
|
|
131
|
-
config.state.pendingFlush = Promise.resolve(config.client.flush(config.transport)).catch((error) => {
|
|
132
|
-
config.onError(error);
|
|
133
|
-
return null;
|
|
134
|
-
});
|
|
135
|
-
}
|
|
136
|
-
}
|
|
137
107
|
|
|
138
|
-
|
|
139
|
-
|
|
140
|
-
|
|
141
|
-
|
|
142
|
-
|
|
143
|
-
|
|
144
|
-
|
|
145
|
-
level: winstonBreadcrumbLevel(info.level),
|
|
146
|
-
message: Array.from(winstonMessage(info)).slice(0, MAX_BREADCRUMB_MESSAGE_LENGTH).join("")
|
|
147
|
-
};
|
|
148
|
-
const recorder = client.breadcrumbProvider ? globalThis[BREADCRUMB_RECORDER] : undefined;
|
|
149
|
-
try {
|
|
150
|
-
if (typeof recorder === "function") {
|
|
151
|
-
recorder(breadcrumb);
|
|
152
|
-
} else {
|
|
153
|
-
client.addBreadcrumb(breadcrumb);
|
|
108
|
+
/**
|
|
109
|
+
* @param {unknown} info
|
|
110
|
+
* @returns {void}
|
|
111
|
+
*/
|
|
112
|
+
capture(info) {
|
|
113
|
+
if (optionalProperty(info, "silent") === true) {
|
|
114
|
+
return;
|
|
154
115
|
}
|
|
155
|
-
|
|
156
|
-
|
|
157
|
-
|
|
158
|
-
|
|
159
|
-
|
|
160
|
-
|
|
161
|
-
|
|
162
|
-
|
|
163
|
-
|
|
164
|
-
|
|
165
|
-
|
|
166
|
-
|
|
167
|
-
|
|
168
|
-
|
|
169
|
-
case "warn":
|
|
170
|
-
case "warning":
|
|
171
|
-
return "warning";
|
|
172
|
-
case "verbose":
|
|
173
|
-
case "debug":
|
|
174
|
-
case "silly":
|
|
175
|
-
return "debug";
|
|
176
|
-
default:
|
|
177
|
-
return "info";
|
|
178
|
-
}
|
|
179
|
-
}
|
|
180
|
-
|
|
181
|
-
function logAttributesFromWinstonInfo(info, options = {}) {
|
|
182
|
-
if (!info || Array.isArray(info) || typeof info !== "object") {
|
|
183
|
-
throw new SdkError("validation_error", "Winston info must be an object");
|
|
184
|
-
}
|
|
185
|
-
|
|
186
|
-
const level = logbrewLevelFromWinstonLevel(info.level);
|
|
187
|
-
const metadata = {
|
|
188
|
-
...compactMetadata(options.metadata),
|
|
189
|
-
winstonLevel: winstonLevelLabel(info.level),
|
|
190
|
-
...winstonContextMetadata(info),
|
|
191
|
-
...traceMetadataFromLogContext(options.trace)
|
|
192
|
-
};
|
|
193
|
-
addWinstonErrorMetadata(metadata, info, options.includeErrorStack === true);
|
|
194
|
-
|
|
195
|
-
return {
|
|
196
|
-
message: winstonMessage(info),
|
|
197
|
-
level,
|
|
198
|
-
...(options.logger ? { logger: options.logger } : {}),
|
|
199
|
-
metadata
|
|
200
|
-
};
|
|
201
|
-
}
|
|
202
|
-
|
|
203
|
-
function timestampFromWinstonInfo(info, fallbackTimestamp) {
|
|
204
|
-
const value = info?.timestamp ?? info?.time;
|
|
205
|
-
if (typeof value === "number" && Number.isFinite(value)) {
|
|
206
|
-
return new Date(value).toISOString();
|
|
207
|
-
}
|
|
208
|
-
if (typeof value === "string" && value.trim() !== "") {
|
|
209
|
-
const parsed = new Date(value);
|
|
210
|
-
if (!Number.isNaN(parsed.valueOf())) {
|
|
211
|
-
return parsed.toISOString();
|
|
116
|
+
const { settings } = this;
|
|
117
|
+
this.captured += 1;
|
|
118
|
+
this.client.log(
|
|
119
|
+
[settings.eventIdPrefix, this.captured].join("_"),
|
|
120
|
+
timestampFromWinstonInfo(info, settings.timestamp),
|
|
121
|
+
logAttributesFromWinstonInfo(info, {
|
|
122
|
+
includeErrorStack: settings.includeErrorStack,
|
|
123
|
+
logger: settings.logger,
|
|
124
|
+
metadata: settings.metadata,
|
|
125
|
+
trace: traceFromProvider(this.traceProvider, settings.onError)
|
|
126
|
+
})
|
|
127
|
+
);
|
|
128
|
+
if (settings.flushOnEvent && isTruthy(settings.transport)) {
|
|
129
|
+
this.pendingFlush = settledFlush(this.client.flush(settings.transport), settings.onError);
|
|
212
130
|
}
|
|
213
|
-
return value;
|
|
214
131
|
}
|
|
215
|
-
if (value instanceof Date && !Number.isNaN(value.valueOf())) {
|
|
216
|
-
return value.toISOString();
|
|
217
|
-
}
|
|
218
|
-
return fallbackTimestamp();
|
|
219
|
-
}
|
|
220
132
|
|
|
221
|
-
|
|
222
|
-
|
|
223
|
-
|
|
224
|
-
|
|
225
|
-
|
|
226
|
-
|
|
227
|
-
|
|
228
|
-
|
|
229
|
-
case "error":
|
|
230
|
-
return "error";
|
|
231
|
-
case "crit":
|
|
232
|
-
case "critical":
|
|
233
|
-
case "fatal":
|
|
234
|
-
return "critical";
|
|
235
|
-
case "http":
|
|
236
|
-
case "verbose":
|
|
237
|
-
case "info":
|
|
238
|
-
default:
|
|
239
|
-
return "info";
|
|
133
|
+
/**
|
|
134
|
+
* @returns {void}
|
|
135
|
+
*/
|
|
136
|
+
flushPending() {
|
|
137
|
+
const { settings } = this;
|
|
138
|
+
if (isTruthy(settings.transport) && this.client.pendingEvents() > NO_PENDING_EVENTS) {
|
|
139
|
+
this.pendingFlush = settledFlush(this.client.flush(settings.transport), settings.onError);
|
|
140
|
+
}
|
|
240
141
|
}
|
|
241
|
-
}
|
|
242
142
|
|
|
243
|
-
|
|
244
|
-
|
|
245
|
-
|
|
246
|
-
|
|
247
|
-
|
|
248
|
-
|
|
249
|
-
|
|
250
|
-
|
|
251
|
-
const error = info.err ?? info.error;
|
|
252
|
-
if (error && typeof error === "object" && typeof error.message === "string" && error.message.trim() !== "") {
|
|
253
|
-
return error.message;
|
|
143
|
+
/**
|
|
144
|
+
* @returns {() => Promise<unknown>}
|
|
145
|
+
*/
|
|
146
|
+
flushHandler() {
|
|
147
|
+
return async () => {
|
|
148
|
+
this.flushPending();
|
|
149
|
+
return this.pendingFlush;
|
|
150
|
+
};
|
|
254
151
|
}
|
|
255
|
-
return "winston event";
|
|
256
152
|
}
|
|
257
153
|
|
|
258
|
-
|
|
259
|
-
|
|
260
|
-
|
|
261
|
-
|
|
262
|
-
|
|
263
|
-
|
|
154
|
+
/**
|
|
155
|
+
* @this {Readonly<{ write: (chunk: unknown) => boolean }>}
|
|
156
|
+
* @param {unknown} info
|
|
157
|
+
* @param {unknown} callback
|
|
158
|
+
* @returns {void}
|
|
159
|
+
*/
|
|
160
|
+
function log(info, callback) {
|
|
161
|
+
this.write(info);
|
|
162
|
+
if (typeof callback === "function") {
|
|
163
|
+
Reflect.apply(callback, undefined, []);
|
|
264
164
|
}
|
|
265
|
-
return metadata;
|
|
266
165
|
}
|
|
267
166
|
|
|
268
|
-
|
|
269
|
-
|
|
270
|
-
|
|
271
|
-
|
|
272
|
-
|
|
273
|
-
|
|
274
|
-
|
|
275
|
-
|
|
276
|
-
}
|
|
277
|
-
|
|
278
|
-
|
|
279
|
-
}
|
|
280
|
-
|
|
281
|
-
|
|
282
|
-
}
|
|
283
|
-
}
|
|
167
|
+
/**
|
|
168
|
+
* @param {Readonly<Record<string, unknown>>} config
|
|
169
|
+
* @returns {Readonly<Record<string, unknown>>}
|
|
170
|
+
*/
|
|
171
|
+
function winstonTransportOptions(config) {
|
|
172
|
+
const { level, name } = config;
|
|
173
|
+
const nameText = String(name);
|
|
174
|
+
return {
|
|
175
|
+
...(typeof level === "string" && level.trim() !== "" ? { level } : {}),
|
|
176
|
+
...(name === undefined ? {} : { name: nameText }),
|
|
177
|
+
...(config["silent"] === true ? { silent: true } : {}),
|
|
178
|
+
...(config["handleExceptions"] === true ? { handleExceptions: true } : {}),
|
|
179
|
+
...(config["handleRejections"] === true ? { handleRejections: true } : {})
|
|
180
|
+
};
|
|
284
181
|
}
|
|
285
182
|
|
|
286
|
-
|
|
287
|
-
|
|
288
|
-
|
|
183
|
+
/**
|
|
184
|
+
* @param {unknown} config
|
|
185
|
+
* @returns {Writable}
|
|
186
|
+
*/
|
|
187
|
+
function createLogBrewWinstonTransport(config) {
|
|
188
|
+
if (!isObjectValue(config)) {
|
|
189
|
+
throw new SdkError("validation_error", "Winston transport config must be an object");
|
|
289
190
|
}
|
|
290
|
-
|
|
291
|
-
|
|
292
|
-
|
|
293
|
-
metadata.errorMessage = error.message;
|
|
294
|
-
}
|
|
295
|
-
if (includeErrorStack && error.stack) {
|
|
296
|
-
metadata.errorStack = error.stack;
|
|
297
|
-
}
|
|
298
|
-
return;
|
|
191
|
+
const { client } = config;
|
|
192
|
+
if (!(client instanceof LogBrewClient)) {
|
|
193
|
+
throw new SdkError("validation_error", "Winston transport client must be a LogBrewClient");
|
|
299
194
|
}
|
|
300
|
-
|
|
301
|
-
|
|
302
|
-
|
|
303
|
-
|
|
304
|
-
|
|
305
|
-
|
|
306
|
-
|
|
307
|
-
|
|
308
|
-
|
|
309
|
-
|
|
310
|
-
|
|
311
|
-
|
|
195
|
+
const capture = new WinstonCapture(config, client);
|
|
196
|
+
const winstonTransport = new Writable({
|
|
197
|
+
objectMode: true,
|
|
198
|
+
/**
|
|
199
|
+
* @param {unknown} info
|
|
200
|
+
* @param {unknown} _encoding
|
|
201
|
+
* @param {() => void} callback
|
|
202
|
+
* @returns {void}
|
|
203
|
+
*/
|
|
204
|
+
write(info, _encoding, callback) {
|
|
205
|
+
try {
|
|
206
|
+
capture.write(info);
|
|
207
|
+
} finally {
|
|
208
|
+
Reflect.apply(callback, undefined, []);
|
|
209
|
+
}
|
|
312
210
|
}
|
|
313
|
-
|
|
314
|
-
|
|
315
|
-
|
|
316
|
-
|
|
317
|
-
|
|
211
|
+
});
|
|
212
|
+
return Object.assign(
|
|
213
|
+
winstonTransport,
|
|
214
|
+
{
|
|
215
|
+
log,
|
|
216
|
+
|
|
217
|
+
flush: capture.flushHandler()
|
|
218
|
+
},
|
|
219
|
+
winstonTransportOptions(config)
|
|
220
|
+
);
|
|
318
221
|
}
|
|
319
222
|
|
|
320
|
-
module.exports = {
|
|
321
|
-
createLogBrewWinstonTransport,
|
|
322
|
-
logAttributesFromWinstonInfo
|
|
323
|
-
};
|
|
223
|
+
module.exports = { createLogBrewWinstonTransport, logAttributesFromWinstonInfo };
|