@logscopeai/logscope 0.1.0-beta.2
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 +21 -0
- package/README.md +341 -0
- package/dist/client/create-logscope-client.d.ts +23 -0
- package/dist/client/create-logscope-client.js +112 -0
- package/dist/client/create-logscope-client.js.map +1 -0
- package/dist/client/log-methods.d.ts +3 -0
- package/dist/client/log-methods.js +27 -0
- package/dist/client/log-methods.js.map +1 -0
- package/dist/config/config-guards.d.ts +31 -0
- package/dist/config/config-guards.js +128 -0
- package/dist/config/config-guards.js.map +1 -0
- package/dist/config/runtime-config.d.ts +17 -0
- package/dist/config/runtime-config.js +41 -0
- package/dist/config/runtime-config.js.map +1 -0
- package/dist/console/capture-console.d.ts +16 -0
- package/dist/console/capture-console.js +117 -0
- package/dist/console/capture-console.js.map +1 -0
- package/dist/constants.d.ts +7 -0
- package/dist/constants.js +17 -0
- package/dist/constants.js.map +1 -0
- package/dist/filter/level-filter.d.ts +3 -0
- package/dist/filter/level-filter.js +16 -0
- package/dist/filter/level-filter.js.map +1 -0
- package/dist/index.d.ts +5 -0
- package/dist/index.js +26 -0
- package/dist/index.js.map +1 -0
- package/dist/logscope.d.ts +11 -0
- package/dist/logscope.js +61 -0
- package/dist/logscope.js.map +1 -0
- package/dist/normalization/normalize-log.d.ts +12 -0
- package/dist/normalization/normalize-log.js +140 -0
- package/dist/normalization/normalize-log.js.map +1 -0
- package/dist/pino/map-pino-level.d.ts +2 -0
- package/dist/pino/map-pino-level.js +40 -0
- package/dist/pino/map-pino-level.js.map +1 -0
- package/dist/pino/transport.d.ts +20 -0
- package/dist/pino/transport.js +185 -0
- package/dist/pino/transport.js.map +1 -0
- package/dist/pino.d.ts +4 -0
- package/dist/pino.js +11 -0
- package/dist/pino.js.map +1 -0
- package/dist/pipeline/batch-queue.d.ts +9 -0
- package/dist/pipeline/batch-queue.js +29 -0
- package/dist/pipeline/batch-queue.js.map +1 -0
- package/dist/pipeline/delivery-runner.d.ts +12 -0
- package/dist/pipeline/delivery-runner.js +63 -0
- package/dist/pipeline/delivery-runner.js.map +1 -0
- package/dist/pipeline/flush-scheduler.d.ts +14 -0
- package/dist/pipeline/flush-scheduler.js +39 -0
- package/dist/pipeline/flush-scheduler.js.map +1 -0
- package/dist/pipeline/pipeline-ingress.d.ts +19 -0
- package/dist/pipeline/pipeline-ingress.js +37 -0
- package/dist/pipeline/pipeline-ingress.js.map +1 -0
- package/dist/pipeline/pipeline.d.ts +21 -0
- package/dist/pipeline/pipeline.js +109 -0
- package/dist/pipeline/pipeline.js.map +1 -0
- package/dist/retry/backoff.d.ts +2 -0
- package/dist/retry/backoff.js +16 -0
- package/dist/retry/backoff.js.map +1 -0
- package/dist/retry/retry-policy.d.ts +7 -0
- package/dist/retry/retry-policy.js +26 -0
- package/dist/retry/retry-policy.js.map +1 -0
- package/dist/transport/send-ingestion-request.d.ts +4 -0
- package/dist/transport/send-ingestion-request.js +75 -0
- package/dist/transport/send-ingestion-request.js.map +1 -0
- package/dist/transport/transport-types.d.ts +39 -0
- package/dist/transport/transport-types.js +3 -0
- package/dist/transport/transport-types.js.map +1 -0
- package/dist/types.d.ts +69 -0
- package/dist/types.js +3 -0
- package/dist/types.js.map +1 -0
- package/package.json +62 -0
|
@@ -0,0 +1,140 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.normalizeLog = void 0;
|
|
4
|
+
const constants_1 = require("../constants");
|
|
5
|
+
const isJsonSafeObject = (value) => {
|
|
6
|
+
return typeof value === 'object' && value !== null && !Array.isArray(value);
|
|
7
|
+
};
|
|
8
|
+
const sanitizeJsonValue = (value, seenObjects) => {
|
|
9
|
+
if (value === null) {
|
|
10
|
+
return null;
|
|
11
|
+
}
|
|
12
|
+
if (typeof value === 'string' || typeof value === 'number' || typeof value === 'boolean') {
|
|
13
|
+
return value;
|
|
14
|
+
}
|
|
15
|
+
if (typeof value === 'bigint') {
|
|
16
|
+
return value.toString();
|
|
17
|
+
}
|
|
18
|
+
if (typeof value === 'undefined' || typeof value === 'function' || typeof value === 'symbol') {
|
|
19
|
+
return undefined;
|
|
20
|
+
}
|
|
21
|
+
if (value instanceof Date) {
|
|
22
|
+
if (Number.isNaN(value.getTime())) {
|
|
23
|
+
return null;
|
|
24
|
+
}
|
|
25
|
+
return value.toISOString();
|
|
26
|
+
}
|
|
27
|
+
if (Array.isArray(value)) {
|
|
28
|
+
return value.map((item) => {
|
|
29
|
+
const normalizedItem = sanitizeJsonValue(item, seenObjects);
|
|
30
|
+
return normalizedItem === undefined ? null : normalizedItem;
|
|
31
|
+
});
|
|
32
|
+
}
|
|
33
|
+
if (typeof value === 'object') {
|
|
34
|
+
if (seenObjects.has(value)) {
|
|
35
|
+
return '[Circular]';
|
|
36
|
+
}
|
|
37
|
+
seenObjects.add(value);
|
|
38
|
+
const normalizedObject = {};
|
|
39
|
+
for (const [key, nestedValue] of Object.entries(value)) {
|
|
40
|
+
const normalizedNestedValue = sanitizeJsonValue(nestedValue, seenObjects);
|
|
41
|
+
if (normalizedNestedValue !== undefined) {
|
|
42
|
+
normalizedObject[key] = normalizedNestedValue;
|
|
43
|
+
}
|
|
44
|
+
}
|
|
45
|
+
seenObjects.delete(value);
|
|
46
|
+
return normalizedObject;
|
|
47
|
+
}
|
|
48
|
+
return undefined;
|
|
49
|
+
};
|
|
50
|
+
const normalizeMetadata = (metadata) => {
|
|
51
|
+
if (metadata === undefined) {
|
|
52
|
+
return undefined;
|
|
53
|
+
}
|
|
54
|
+
try {
|
|
55
|
+
const normalizedValue = sanitizeJsonValue(metadata, new WeakSet());
|
|
56
|
+
if (normalizedValue === undefined) {
|
|
57
|
+
return undefined;
|
|
58
|
+
}
|
|
59
|
+
if (isJsonSafeObject(normalizedValue)) {
|
|
60
|
+
return normalizedValue;
|
|
61
|
+
}
|
|
62
|
+
return {
|
|
63
|
+
[constants_1.METADATA_PRIMITIVE_VALUE_KEY]: normalizedValue,
|
|
64
|
+
};
|
|
65
|
+
}
|
|
66
|
+
catch {
|
|
67
|
+
return undefined;
|
|
68
|
+
}
|
|
69
|
+
};
|
|
70
|
+
const normalizeMessage = (message) => {
|
|
71
|
+
const normalizedMessage = (() => {
|
|
72
|
+
if (typeof message === 'string') {
|
|
73
|
+
return message;
|
|
74
|
+
}
|
|
75
|
+
try {
|
|
76
|
+
return JSON.stringify(message) ?? '';
|
|
77
|
+
}
|
|
78
|
+
catch {
|
|
79
|
+
try {
|
|
80
|
+
return String(message);
|
|
81
|
+
}
|
|
82
|
+
catch {
|
|
83
|
+
return '[Unserializable message]';
|
|
84
|
+
}
|
|
85
|
+
}
|
|
86
|
+
})();
|
|
87
|
+
if (normalizedMessage.length <= constants_1.MAX_MESSAGE_LENGTH) {
|
|
88
|
+
return normalizedMessage;
|
|
89
|
+
}
|
|
90
|
+
return normalizedMessage.slice(0, constants_1.MAX_MESSAGE_LENGTH);
|
|
91
|
+
};
|
|
92
|
+
const enforceMetadataLimit = (metadata) => {
|
|
93
|
+
if (metadata === undefined) {
|
|
94
|
+
return undefined;
|
|
95
|
+
}
|
|
96
|
+
try {
|
|
97
|
+
const serializedMetadata = JSON.stringify(metadata);
|
|
98
|
+
if (serializedMetadata === undefined) {
|
|
99
|
+
return undefined;
|
|
100
|
+
}
|
|
101
|
+
if (Buffer.byteLength(serializedMetadata, 'utf8') > constants_1.MAX_METADATA_BYTES) {
|
|
102
|
+
return undefined;
|
|
103
|
+
}
|
|
104
|
+
return metadata;
|
|
105
|
+
}
|
|
106
|
+
catch {
|
|
107
|
+
return undefined;
|
|
108
|
+
}
|
|
109
|
+
};
|
|
110
|
+
const toIsoTimestamp = (timestamp, now) => {
|
|
111
|
+
if (timestamp === undefined) {
|
|
112
|
+
return now().toISOString();
|
|
113
|
+
}
|
|
114
|
+
try {
|
|
115
|
+
const parsedTimestamp = timestamp instanceof Date ? timestamp : new Date(timestamp);
|
|
116
|
+
if (Number.isNaN(parsedTimestamp.getTime())) {
|
|
117
|
+
return now().toISOString();
|
|
118
|
+
}
|
|
119
|
+
return parsedTimestamp.toISOString();
|
|
120
|
+
}
|
|
121
|
+
catch {
|
|
122
|
+
return now().toISOString();
|
|
123
|
+
}
|
|
124
|
+
};
|
|
125
|
+
const normalizeLog = (input, options = {}) => {
|
|
126
|
+
const now = options.now ?? (() => new Date());
|
|
127
|
+
const metadata = enforceMetadataLimit(normalizeMetadata(input.metadata));
|
|
128
|
+
const normalizedLog = {
|
|
129
|
+
source: input.source,
|
|
130
|
+
level: input.level,
|
|
131
|
+
timestamp: toIsoTimestamp(input.timestamp, now),
|
|
132
|
+
message: normalizeMessage(input.message),
|
|
133
|
+
};
|
|
134
|
+
if (metadata !== undefined) {
|
|
135
|
+
normalizedLog.metadata = metadata;
|
|
136
|
+
}
|
|
137
|
+
return normalizedLog;
|
|
138
|
+
};
|
|
139
|
+
exports.normalizeLog = normalizeLog;
|
|
140
|
+
//# sourceMappingURL=normalize-log.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"normalize-log.js","sourceRoot":"","sources":["../../src/normalization/normalize-log.ts"],"names":[],"mappings":";;;AAAA,4CAAoG;AAepG,MAAM,gBAAgB,GAAG,CAAC,KAAoB,EAA2B,EAAE;IACzE,OAAO,OAAO,KAAK,KAAK,QAAQ,IAAI,KAAK,KAAK,IAAI,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC;AAC9E,CAAC,CAAC;AAEF,MAAM,iBAAiB,GAAG,CACxB,KAAc,EACd,WAA4B,EACD,EAAE;IAC7B,IAAI,KAAK,KAAK,IAAI,EAAE,CAAC;QACnB,OAAO,IAAI,CAAC;IACd,CAAC;IAED,IAAI,OAAO,KAAK,KAAK,QAAQ,IAAI,OAAO,KAAK,KAAK,QAAQ,IAAI,OAAO,KAAK,KAAK,SAAS,EAAE,CAAC;QACzF,OAAO,KAAK,CAAC;IACf,CAAC;IAED,IAAI,OAAO,KAAK,KAAK,QAAQ,EAAE,CAAC;QAC9B,OAAO,KAAK,CAAC,QAAQ,EAAE,CAAC;IAC1B,CAAC;IAED,IAAI,OAAO,KAAK,KAAK,WAAW,IAAI,OAAO,KAAK,KAAK,UAAU,IAAI,OAAO,KAAK,KAAK,QAAQ,EAAE,CAAC;QAC7F,OAAO,SAAS,CAAC;IACnB,CAAC;IAED,IAAI,KAAK,YAAY,IAAI,EAAE,CAAC;QAC1B,IAAI,MAAM,CAAC,KAAK,CAAC,KAAK,CAAC,OAAO,EAAE,CAAC,EAAE,CAAC;YAClC,OAAO,IAAI,CAAC;QACd,CAAC;QAED,OAAO,KAAK,CAAC,WAAW,EAAE,CAAC;IAC7B,CAAC;IAED,IAAI,KAAK,CAAC,OAAO,CAAC,KAAK,CAAC,EAAE,CAAC;QACzB,OAAO,KAAK,CAAC,GAAG,CAAC,CAAC,IAAI,EAAE,EAAE;YACxB,MAAM,cAAc,GAAG,iBAAiB,CAAC,IAAI,EAAE,WAAW,CAAC,CAAC;YAC5D,OAAO,cAAc,KAAK,SAAS,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,cAAc,CAAC;QAC9D,CAAC,CAAC,CAAC;IACL,CAAC;IAED,IAAI,OAAO,KAAK,KAAK,QAAQ,EAAE,CAAC;QAC9B,IAAI,WAAW,CAAC,GAAG,CAAC,KAAK,CAAC,EAAE,CAAC;YAC3B,OAAO,YAAY,CAAC;QACtB,CAAC;QAED,WAAW,CAAC,GAAG,CAAC,KAAK,CAAC,CAAC;QAEvB,MAAM,gBAAgB,GAAmB,EAAE,CAAC;QAE5C,KAAK,MAAM,CAAC,GAAG,EAAE,WAAW,CAAC,IAAI,MAAM,CAAC,OAAO,CAAC,KAAK,CAAC,EAAE,CAAC;YACvD,MAAM,qBAAqB,GAAG,iBAAiB,CAAC,WAAW,EAAE,WAAW,CAAC,CAAC;YAE1E,IAAI,qBAAqB,KAAK,SAAS,EAAE,CAAC;gBACxC,gBAAgB,CAAC,GAAG,CAAC,GAAG,qBAAqB,CAAC;YAChD,CAAC;QACH,CAAC;QAED,WAAW,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC;QAE1B,OAAO,gBAAgB,CAAC;IAC1B,CAAC;IAED,OAAO,SAAS,CAAC;AACnB,CAAC,CAAC;AAEF,MAAM,iBAAiB,GAAG,CAAC,QAAiB,EAA8B,EAAE;IAC1E,IAAI,QAAQ,KAAK,SAAS,EAAE,CAAC;QAC3B,OAAO,SAAS,CAAC;IACnB,CAAC;IAED,IAAI,CAAC;QACH,MAAM,eAAe,GAAG,iBAAiB,CAAC,QAAQ,EAAE,IAAI,OAAO,EAAU,CAAC,CAAC;QAE3E,IAAI,eAAe,KAAK,SAAS,EAAE,CAAC;YAClC,OAAO,SAAS,CAAC;QACnB,CAAC;QAED,IAAI,gBAAgB,CAAC,eAAe,CAAC,EAAE,CAAC;YACtC,OAAO,eAAe,CAAC;QACzB,CAAC;QAED,OAAO;YACL,CAAC,wCAA4B,CAAC,EAAE,eAAe;SAChD,CAAC;IACJ,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,SAAS,CAAC;IACnB,CAAC;AACH,CAAC,CAAC;AAEF,MAAM,gBAAgB,GAAG,CAAC,OAAgB,EAAU,EAAE;IACpD,MAAM,iBAAiB,GAAG,CAAC,GAAG,EAAE;QAC9B,IAAI,OAAO,OAAO,KAAK,QAAQ,EAAE,CAAC;YAChC,OAAO,OAAO,CAAC;QACjB,CAAC;QAED,IAAI,CAAC;YACH,OAAO,IAAI,CAAC,SAAS,CAAC,OAAO,CAAC,IAAI,EAAE,CAAC;QACvC,CAAC;QAAC,MAAM,CAAC;YACP,IAAI,CAAC;gBACH,OAAO,MAAM,CAAC,OAAO,CAAC,CAAC;YACzB,CAAC;YAAC,MAAM,CAAC;gBACP,OAAO,0BAA0B,CAAC;YACpC,CAAC;QACH,CAAC;IACH,CAAC,CAAC,EAAE,CAAC;IAEL,IAAI,iBAAiB,CAAC,MAAM,IAAI,8BAAkB,EAAE,CAAC;QACnD,OAAO,iBAAiB,CAAC;IAC3B,CAAC;IAED,OAAO,iBAAiB,CAAC,KAAK,CAAC,CAAC,EAAE,8BAAkB,CAAC,CAAC;AACxD,CAAC,CAAC;AAEF,MAAM,oBAAoB,GAAG,CAAC,QAAoC,EAA8B,EAAE;IAChG,IAAI,QAAQ,KAAK,SAAS,EAAE,CAAC;QAC3B,OAAO,SAAS,CAAC;IACnB,CAAC;IAED,IAAI,CAAC;QACH,MAAM,kBAAkB,GAAG,IAAI,CAAC,SAAS,CAAC,QAAQ,CAAC,CAAC;QAEpD,IAAI,kBAAkB,KAAK,SAAS,EAAE,CAAC;YACrC,OAAO,SAAS,CAAC;QACnB,CAAC;QAED,IAAI,MAAM,CAAC,UAAU,CAAC,kBAAkB,EAAE,MAAM,CAAC,GAAG,8BAAkB,EAAE,CAAC;YACvE,OAAO,SAAS,CAAC;QACnB,CAAC;QAED,OAAO,QAAQ,CAAC;IAClB,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,SAAS,CAAC;IACnB,CAAC;AACH,CAAC,CAAC;AAEF,MAAM,cAAc,GAAG,CAAC,SAA6C,EAAE,GAAe,EAAU,EAAE;IAChG,IAAI,SAAS,KAAK,SAAS,EAAE,CAAC;QAC5B,OAAO,GAAG,EAAE,CAAC,WAAW,EAAE,CAAC;IAC7B,CAAC;IAED,IAAI,CAAC;QACH,MAAM,eAAe,GAAG,SAAS,YAAY,IAAI,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,IAAI,IAAI,CAAC,SAAS,CAAC,CAAC;QAEpF,IAAI,MAAM,CAAC,KAAK,CAAC,eAAe,CAAC,OAAO,EAAE,CAAC,EAAE,CAAC;YAC5C,OAAO,GAAG,EAAE,CAAC,WAAW,EAAE,CAAC;QAC7B,CAAC;QAED,OAAO,eAAe,CAAC,WAAW,EAAE,CAAC;IACvC,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,GAAG,EAAE,CAAC,WAAW,EAAE,CAAC;IAC7B,CAAC;AACH,CAAC,CAAC;AAEK,MAAM,YAAY,GAAG,CAC1B,KAAwB,EACxB,UAA+B,EAAE,EACd,EAAE;IACrB,MAAM,GAAG,GAAG,OAAO,CAAC,GAAG,IAAI,CAAC,GAAG,EAAE,CAAC,IAAI,IAAI,EAAE,CAAC,CAAC;IAC9C,MAAM,QAAQ,GAAG,oBAAoB,CAAC,iBAAiB,CAAC,KAAK,CAAC,QAAQ,CAAC,CAAC,CAAC;IAEzE,MAAM,aAAa,GAAsB;QACvC,MAAM,EAAE,KAAK,CAAC,MAAM;QACpB,KAAK,EAAE,KAAK,CAAC,KAAK;QAClB,SAAS,EAAE,cAAc,CAAC,KAAK,CAAC,SAAS,EAAE,GAAG,CAAC;QAC/C,OAAO,EAAE,gBAAgB,CAAC,KAAK,CAAC,OAAO,CAAC;KACzC,CAAC;IAEF,IAAI,QAAQ,KAAK,SAAS,EAAE,CAAC;QAC3B,aAAa,CAAC,QAAQ,GAAG,QAAQ,CAAC;IACpC,CAAC;IAED,OAAO,aAAa,CAAC;AACvB,CAAC,CAAC;AAnBW,QAAA,YAAY,gBAmBvB"}
|
|
@@ -0,0 +1,40 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.mapPinoLevel = void 0;
|
|
4
|
+
const PINO_NUMERIC_LEVEL_MAP = {
|
|
5
|
+
10: 'trace',
|
|
6
|
+
20: 'debug',
|
|
7
|
+
30: 'info',
|
|
8
|
+
40: 'warn',
|
|
9
|
+
50: 'error',
|
|
10
|
+
60: 'fatal',
|
|
11
|
+
};
|
|
12
|
+
const PINO_STRING_LEVEL_MAP = {
|
|
13
|
+
trace: 'trace',
|
|
14
|
+
debug: 'debug',
|
|
15
|
+
info: 'info',
|
|
16
|
+
warn: 'warn',
|
|
17
|
+
warning: 'warn',
|
|
18
|
+
error: 'error',
|
|
19
|
+
fatal: 'fatal',
|
|
20
|
+
};
|
|
21
|
+
const mapPinoLevel = (value) => {
|
|
22
|
+
if (typeof value === 'number') {
|
|
23
|
+
return PINO_NUMERIC_LEVEL_MAP[value];
|
|
24
|
+
}
|
|
25
|
+
if (typeof value !== 'string') {
|
|
26
|
+
return undefined;
|
|
27
|
+
}
|
|
28
|
+
const normalized = value.trim().toLowerCase();
|
|
29
|
+
const mappedLevel = PINO_STRING_LEVEL_MAP[normalized];
|
|
30
|
+
if (mappedLevel !== undefined) {
|
|
31
|
+
return mappedLevel;
|
|
32
|
+
}
|
|
33
|
+
const numericValue = Number(normalized);
|
|
34
|
+
if (Number.isInteger(numericValue)) {
|
|
35
|
+
return PINO_NUMERIC_LEVEL_MAP[numericValue];
|
|
36
|
+
}
|
|
37
|
+
return undefined;
|
|
38
|
+
};
|
|
39
|
+
exports.mapPinoLevel = mapPinoLevel;
|
|
40
|
+
//# sourceMappingURL=map-pino-level.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"map-pino-level.js","sourceRoot":"","sources":["../../src/pino/map-pino-level.ts"],"names":[],"mappings":";;;AAEA,MAAM,sBAAsB,GAAuC;IACjE,EAAE,EAAE,OAAO;IACX,EAAE,EAAE,OAAO;IACX,EAAE,EAAE,MAAM;IACV,EAAE,EAAE,MAAM;IACV,EAAE,EAAE,OAAO;IACX,EAAE,EAAE,OAAO;CACZ,CAAC;AAEF,MAAM,qBAAqB,GAAuC;IAChE,KAAK,EAAE,OAAO;IACd,KAAK,EAAE,OAAO;IACd,IAAI,EAAE,MAAM;IACZ,IAAI,EAAE,MAAM;IACZ,OAAO,EAAE,MAAM;IACf,KAAK,EAAE,OAAO;IACd,KAAK,EAAE,OAAO;CACf,CAAC;AAEK,MAAM,YAAY,GAAG,CAAC,KAAc,EAAwB,EAAE;IACnE,IAAI,OAAO,KAAK,KAAK,QAAQ,EAAE,CAAC;QAC9B,OAAO,sBAAsB,CAAC,KAAK,CAAC,CAAC;IACvC,CAAC;IAED,IAAI,OAAO,KAAK,KAAK,QAAQ,EAAE,CAAC;QAC9B,OAAO,SAAS,CAAC;IACnB,CAAC;IAED,MAAM,UAAU,GAAG,KAAK,CAAC,IAAI,EAAE,CAAC,WAAW,EAAE,CAAC;IAC9C,MAAM,WAAW,GAAG,qBAAqB,CAAC,UAAU,CAAC,CAAC;IAEtD,IAAI,WAAW,KAAK,SAAS,EAAE,CAAC;QAC9B,OAAO,WAAW,CAAC;IACrB,CAAC;IAED,MAAM,YAAY,GAAG,MAAM,CAAC,UAAU,CAAC,CAAC;IAExC,IAAI,MAAM,CAAC,SAAS,CAAC,YAAY,CAAC,EAAE,CAAC;QACnC,OAAO,sBAAsB,CAAC,YAAY,CAAC,CAAC;IAC9C,CAAC;IAED,OAAO,SAAS,CAAC;AACnB,CAAC,CAAC;AAvBW,QAAA,YAAY,gBAuBvB"}
|
|
@@ -0,0 +1,20 @@
|
|
|
1
|
+
import { Writable } from 'node:stream';
|
|
2
|
+
import type { RetryPolicy } from '../retry/retry-policy';
|
|
3
|
+
import { type BatchingPipeline, type CreateBatchingPipelineInput } from '../pipeline/pipeline';
|
|
4
|
+
import type { IngestionRequestResult, SendIngestionRequestInput } from '../transport/transport-types';
|
|
5
|
+
import type { LogFilterConfig } from '../types';
|
|
6
|
+
export interface LogscopePinoTransportOptions {
|
|
7
|
+
apiKey: string;
|
|
8
|
+
endpoint: string;
|
|
9
|
+
source: string;
|
|
10
|
+
logFilter?: LogFilterConfig;
|
|
11
|
+
flushIntervalMs?: number;
|
|
12
|
+
retryPolicy?: Partial<RetryPolicy>;
|
|
13
|
+
}
|
|
14
|
+
export interface PinoTransportDependencies {
|
|
15
|
+
sendBatch: (input: SendIngestionRequestInput) => Promise<IngestionRequestResult>;
|
|
16
|
+
warn: (message: string) => void;
|
|
17
|
+
createPipeline?: (input: CreateBatchingPipelineInput) => BatchingPipeline;
|
|
18
|
+
}
|
|
19
|
+
export declare const createPinoTransportInternal: (options: LogscopePinoTransportOptions, dependencies: PinoTransportDependencies) => Writable;
|
|
20
|
+
export declare const createPinoTransport: (options: LogscopePinoTransportOptions) => Writable;
|
|
@@ -0,0 +1,185 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.createPinoTransport = exports.createPinoTransportInternal = void 0;
|
|
4
|
+
const node_stream_1 = require("node:stream");
|
|
5
|
+
const config_guards_1 = require("../config/config-guards");
|
|
6
|
+
const pipeline_1 = require("../pipeline/pipeline");
|
|
7
|
+
const pipeline_ingress_1 = require("../pipeline/pipeline-ingress");
|
|
8
|
+
const send_ingestion_request_1 = require("../transport/send-ingestion-request");
|
|
9
|
+
const map_pino_level_1 = require("./map-pino-level");
|
|
10
|
+
const UNAUTHORIZED_WARNING_MESSAGE = '[logscope] Pino transport received unauthorized response (401). Check SDK API key configuration.';
|
|
11
|
+
const RETRY_EXHAUSTED_WARNING_MESSAGE = '[logscope] Pino transport dropped log batch after max retry attempts.';
|
|
12
|
+
const runSafe = (callback) => {
|
|
13
|
+
try {
|
|
14
|
+
callback();
|
|
15
|
+
}
|
|
16
|
+
catch {
|
|
17
|
+
// Never throw into user code.
|
|
18
|
+
}
|
|
19
|
+
};
|
|
20
|
+
const runSafeWarn = (warn, message) => {
|
|
21
|
+
runSafe(() => {
|
|
22
|
+
warn(message);
|
|
23
|
+
});
|
|
24
|
+
};
|
|
25
|
+
const createNoopPipeline = () => {
|
|
26
|
+
return {
|
|
27
|
+
enqueue: () => { },
|
|
28
|
+
flushNow: async () => { },
|
|
29
|
+
stop: async () => { },
|
|
30
|
+
};
|
|
31
|
+
};
|
|
32
|
+
const createDefaultDependencies = () => {
|
|
33
|
+
return {
|
|
34
|
+
sendBatch: (input) => (0, send_ingestion_request_1.sendIngestionRequest)(input),
|
|
35
|
+
warn: (message) => console.warn(message),
|
|
36
|
+
};
|
|
37
|
+
};
|
|
38
|
+
const isPinoRecord = (value) => {
|
|
39
|
+
return typeof value === 'object' && value !== null && !Array.isArray(value);
|
|
40
|
+
};
|
|
41
|
+
const toLogMessage = (record) => {
|
|
42
|
+
if (typeof record.msg === 'string') {
|
|
43
|
+
return record.msg;
|
|
44
|
+
}
|
|
45
|
+
if (typeof record.message === 'string') {
|
|
46
|
+
return record.message;
|
|
47
|
+
}
|
|
48
|
+
if (record.msg === undefined && record.message === undefined) {
|
|
49
|
+
return '';
|
|
50
|
+
}
|
|
51
|
+
try {
|
|
52
|
+
return JSON.stringify(record.msg ?? record.message) ?? '';
|
|
53
|
+
}
|
|
54
|
+
catch {
|
|
55
|
+
try {
|
|
56
|
+
return String(record.msg ?? record.message);
|
|
57
|
+
}
|
|
58
|
+
catch {
|
|
59
|
+
return '[Unserializable message]';
|
|
60
|
+
}
|
|
61
|
+
}
|
|
62
|
+
};
|
|
63
|
+
const toTimestamp = (record) => {
|
|
64
|
+
const value = record.time ?? record.timestamp;
|
|
65
|
+
if (value instanceof Date || typeof value === 'string' || typeof value === 'number') {
|
|
66
|
+
return value;
|
|
67
|
+
}
|
|
68
|
+
return undefined;
|
|
69
|
+
};
|
|
70
|
+
const toMetadata = (record) => {
|
|
71
|
+
const metadataEntries = Object.entries(record).filter(([key]) => {
|
|
72
|
+
return (key !== 'level' && key !== 'msg' && key !== 'message' && key !== 'time' && key !== 'timestamp');
|
|
73
|
+
});
|
|
74
|
+
if (metadataEntries.length === 0) {
|
|
75
|
+
return undefined;
|
|
76
|
+
}
|
|
77
|
+
return Object.fromEntries(metadataEntries);
|
|
78
|
+
};
|
|
79
|
+
const createPinoTransportInternal = (options, dependencies) => {
|
|
80
|
+
const guardedOptions = (0, config_guards_1.guardPinoTransportOptions)(options);
|
|
81
|
+
let hasWarnedUnauthorized = false;
|
|
82
|
+
let hasWarnedRetryExhausted = false;
|
|
83
|
+
if (!guardedOptions.isValid) {
|
|
84
|
+
runSafeWarn(dependencies.warn, (0, config_guards_1.buildInvalidPinoOptionsWarning)(guardedOptions.invalidFields));
|
|
85
|
+
}
|
|
86
|
+
const pipeline = (() => {
|
|
87
|
+
const createPipeline = dependencies.createPipeline ?? pipeline_1.createBatchingPipeline;
|
|
88
|
+
if (!guardedOptions.isValid) {
|
|
89
|
+
return createNoopPipeline();
|
|
90
|
+
}
|
|
91
|
+
try {
|
|
92
|
+
return createPipeline({
|
|
93
|
+
endpoint: guardedOptions.endpoint,
|
|
94
|
+
apiKey: guardedOptions.apiKey,
|
|
95
|
+
sendBatch: dependencies.sendBatch,
|
|
96
|
+
flushIntervalMs: guardedOptions.flushIntervalMs,
|
|
97
|
+
retryPolicy: guardedOptions.retryPolicy,
|
|
98
|
+
onBatchResult: (result) => {
|
|
99
|
+
if (!result.shouldWarnUnauthorized || hasWarnedUnauthorized) {
|
|
100
|
+
if (result.errorKind !== 'max_retries_exceeded' || hasWarnedRetryExhausted) {
|
|
101
|
+
return;
|
|
102
|
+
}
|
|
103
|
+
hasWarnedRetryExhausted = true;
|
|
104
|
+
runSafeWarn(dependencies.warn, RETRY_EXHAUSTED_WARNING_MESSAGE);
|
|
105
|
+
return;
|
|
106
|
+
}
|
|
107
|
+
hasWarnedUnauthorized = true;
|
|
108
|
+
runSafeWarn(dependencies.warn, UNAUTHORIZED_WARNING_MESSAGE);
|
|
109
|
+
},
|
|
110
|
+
});
|
|
111
|
+
}
|
|
112
|
+
catch {
|
|
113
|
+
return createNoopPipeline();
|
|
114
|
+
}
|
|
115
|
+
})();
|
|
116
|
+
const ingress = (0, pipeline_ingress_1.createPipelineIngress)({
|
|
117
|
+
source: guardedOptions.source,
|
|
118
|
+
logFilter: guardedOptions.logFilter,
|
|
119
|
+
pipeline,
|
|
120
|
+
});
|
|
121
|
+
let pending = '';
|
|
122
|
+
const dispatchSerializedLine = (serializedLine) => {
|
|
123
|
+
const trimmedLine = serializedLine.trim();
|
|
124
|
+
if (trimmedLine.length === 0) {
|
|
125
|
+
return;
|
|
126
|
+
}
|
|
127
|
+
let parsedLine;
|
|
128
|
+
try {
|
|
129
|
+
parsedLine = JSON.parse(trimmedLine);
|
|
130
|
+
}
|
|
131
|
+
catch {
|
|
132
|
+
return;
|
|
133
|
+
}
|
|
134
|
+
if (!isPinoRecord(parsedLine)) {
|
|
135
|
+
return;
|
|
136
|
+
}
|
|
137
|
+
const level = (0, map_pino_level_1.mapPinoLevel)(parsedLine.level);
|
|
138
|
+
if (level === undefined) {
|
|
139
|
+
return;
|
|
140
|
+
}
|
|
141
|
+
ingress.dispatch({
|
|
142
|
+
level,
|
|
143
|
+
message: toLogMessage(parsedLine),
|
|
144
|
+
metadata: toMetadata(parsedLine),
|
|
145
|
+
timestamp: toTimestamp(parsedLine),
|
|
146
|
+
});
|
|
147
|
+
};
|
|
148
|
+
const consumeChunk = (chunkText) => {
|
|
149
|
+
pending += chunkText;
|
|
150
|
+
const lines = pending.split('\n');
|
|
151
|
+
pending = lines.pop() ?? '';
|
|
152
|
+
lines.forEach((line) => {
|
|
153
|
+
dispatchSerializedLine(line);
|
|
154
|
+
});
|
|
155
|
+
};
|
|
156
|
+
const flushPending = () => {
|
|
157
|
+
if (pending.length === 0) {
|
|
158
|
+
return;
|
|
159
|
+
}
|
|
160
|
+
dispatchSerializedLine(pending);
|
|
161
|
+
pending = '';
|
|
162
|
+
};
|
|
163
|
+
return new node_stream_1.Writable({
|
|
164
|
+
write(chunk, _encoding, callback) {
|
|
165
|
+
runSafe(() => {
|
|
166
|
+
consumeChunk(Buffer.isBuffer(chunk) ? chunk.toString('utf8') : String(chunk));
|
|
167
|
+
});
|
|
168
|
+
callback();
|
|
169
|
+
},
|
|
170
|
+
final(callback) {
|
|
171
|
+
runSafe(() => {
|
|
172
|
+
flushPending();
|
|
173
|
+
});
|
|
174
|
+
void pipeline.stop().finally(() => {
|
|
175
|
+
callback();
|
|
176
|
+
});
|
|
177
|
+
},
|
|
178
|
+
});
|
|
179
|
+
};
|
|
180
|
+
exports.createPinoTransportInternal = createPinoTransportInternal;
|
|
181
|
+
const createPinoTransport = (options) => {
|
|
182
|
+
return (0, exports.createPinoTransportInternal)(options, createDefaultDependencies());
|
|
183
|
+
};
|
|
184
|
+
exports.createPinoTransport = createPinoTransport;
|
|
185
|
+
//# sourceMappingURL=transport.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"transport.js","sourceRoot":"","sources":["../../src/pino/transport.ts"],"names":[],"mappings":"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"}
|
package/dist/pino.d.ts
ADDED
|
@@ -0,0 +1,4 @@
|
|
|
1
|
+
export { createPinoTransport, createPinoTransportInternal, type LogscopePinoTransportOptions, type PinoTransportDependencies, } from './pino/transport';
|
|
2
|
+
export { mapPinoLevel } from './pino/map-pino-level';
|
|
3
|
+
import { createPinoTransport } from './pino/transport';
|
|
4
|
+
export default createPinoTransport;
|
package/dist/pino.js
ADDED
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.mapPinoLevel = exports.createPinoTransportInternal = exports.createPinoTransport = void 0;
|
|
4
|
+
var transport_1 = require("./pino/transport");
|
|
5
|
+
Object.defineProperty(exports, "createPinoTransport", { enumerable: true, get: function () { return transport_1.createPinoTransport; } });
|
|
6
|
+
Object.defineProperty(exports, "createPinoTransportInternal", { enumerable: true, get: function () { return transport_1.createPinoTransportInternal; } });
|
|
7
|
+
var map_pino_level_1 = require("./pino/map-pino-level");
|
|
8
|
+
Object.defineProperty(exports, "mapPinoLevel", { enumerable: true, get: function () { return map_pino_level_1.mapPinoLevel; } });
|
|
9
|
+
const transport_2 = require("./pino/transport");
|
|
10
|
+
exports.default = transport_2.createPinoTransport;
|
|
11
|
+
//# sourceMappingURL=pino.js.map
|
package/dist/pino.js.map
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"pino.js","sourceRoot":"","sources":["../src/pino.ts"],"names":[],"mappings":";;;AAAA,8CAK0B;AAJxB,gHAAA,mBAAmB,OAAA;AACnB,wHAAA,2BAA2B,OAAA;AAI7B,wDAAqD;AAA5C,8GAAA,YAAY,OAAA;AAErB,gDAAuD;AAEvD,kBAAe,+BAAmB,CAAC"}
|
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
import type { IngestionLogEntry } from '../types';
|
|
2
|
+
export interface BatchQueue {
|
|
3
|
+
enqueue(log: IngestionLogEntry): void;
|
|
4
|
+
dequeueBatch(maxBatchSize: number): IngestionLogEntry[];
|
|
5
|
+
size(): number;
|
|
6
|
+
isEmpty(): boolean;
|
|
7
|
+
clear(): void;
|
|
8
|
+
}
|
|
9
|
+
export declare const createBatchQueue: () => BatchQueue;
|
|
@@ -0,0 +1,29 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.createBatchQueue = void 0;
|
|
4
|
+
const createBatchQueue = () => {
|
|
5
|
+
const queue = [];
|
|
6
|
+
return {
|
|
7
|
+
enqueue(log) {
|
|
8
|
+
queue.push(log);
|
|
9
|
+
},
|
|
10
|
+
dequeueBatch(maxBatchSize) {
|
|
11
|
+
if (queue.length === 0 || maxBatchSize <= 0) {
|
|
12
|
+
return [];
|
|
13
|
+
}
|
|
14
|
+
const batchSize = Math.min(maxBatchSize, queue.length);
|
|
15
|
+
return queue.splice(0, batchSize);
|
|
16
|
+
},
|
|
17
|
+
size() {
|
|
18
|
+
return queue.length;
|
|
19
|
+
},
|
|
20
|
+
isEmpty() {
|
|
21
|
+
return queue.length === 0;
|
|
22
|
+
},
|
|
23
|
+
clear() {
|
|
24
|
+
queue.length = 0;
|
|
25
|
+
},
|
|
26
|
+
};
|
|
27
|
+
};
|
|
28
|
+
exports.createBatchQueue = createBatchQueue;
|
|
29
|
+
//# sourceMappingURL=batch-queue.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"batch-queue.js","sourceRoot":"","sources":["../../src/pipeline/batch-queue.ts"],"names":[],"mappings":";;;AAUO,MAAM,gBAAgB,GAAG,GAAe,EAAE;IAC/C,MAAM,KAAK,GAAwB,EAAE,CAAC;IAEtC,OAAO;QACL,OAAO,CAAC,GAAsB;YAC5B,KAAK,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;QAClB,CAAC;QACD,YAAY,CAAC,YAAoB;YAC/B,IAAI,KAAK,CAAC,MAAM,KAAK,CAAC,IAAI,YAAY,IAAI,CAAC,EAAE,CAAC;gBAC5C,OAAO,EAAE,CAAC;YACZ,CAAC;YAED,MAAM,SAAS,GAAG,IAAI,CAAC,GAAG,CAAC,YAAY,EAAE,KAAK,CAAC,MAAM,CAAC,CAAC;YACvD,OAAO,KAAK,CAAC,MAAM,CAAC,CAAC,EAAE,SAAS,CAAC,CAAC;QACpC,CAAC;QACD,IAAI;YACF,OAAO,KAAK,CAAC,MAAM,CAAC;QACtB,CAAC;QACD,OAAO;YACL,OAAO,KAAK,CAAC,MAAM,KAAK,CAAC,CAAC;QAC5B,CAAC;QACD,KAAK;YACH,KAAK,CAAC,MAAM,GAAG,CAAC,CAAC;QACnB,CAAC;KACF,CAAC;AACJ,CAAC,CAAC;AAzBW,QAAA,gBAAgB,oBAyB3B"}
|
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
import { type RetryPolicy } from '../retry/retry-policy';
|
|
2
|
+
import type { IngestionRequestResult, SendIngestionRequestInput } from '../transport/transport-types';
|
|
3
|
+
import type { IngestionLogEntry } from '../types';
|
|
4
|
+
export interface DeliveryRunnerInput {
|
|
5
|
+
endpoint: string;
|
|
6
|
+
apiKey: string;
|
|
7
|
+
logs: IngestionLogEntry[];
|
|
8
|
+
sendBatch: (input: SendIngestionRequestInput) => Promise<IngestionRequestResult>;
|
|
9
|
+
retryPolicy?: Partial<RetryPolicy>;
|
|
10
|
+
waitForRetry?: (delayMs: number) => Promise<void>;
|
|
11
|
+
}
|
|
12
|
+
export declare const runBatchDelivery: (input: DeliveryRunnerInput) => Promise<IngestionRequestResult>;
|
|
@@ -0,0 +1,63 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.runBatchDelivery = void 0;
|
|
4
|
+
const backoff_1 = require("../retry/backoff");
|
|
5
|
+
const retry_policy_1 = require("../retry/retry-policy");
|
|
6
|
+
const waitForDelay = async (delayMs) => {
|
|
7
|
+
await new Promise((resolve) => {
|
|
8
|
+
setTimeout(resolve, delayMs);
|
|
9
|
+
});
|
|
10
|
+
};
|
|
11
|
+
const safeRetryResult = () => {
|
|
12
|
+
return {
|
|
13
|
+
action: 'retry',
|
|
14
|
+
shouldWarnUnauthorized: false,
|
|
15
|
+
errorKind: 'network_error',
|
|
16
|
+
};
|
|
17
|
+
};
|
|
18
|
+
const runBatchDelivery = async (input) => {
|
|
19
|
+
const retryPolicy = (0, retry_policy_1.resolveRetryPolicy)(input.retryPolicy);
|
|
20
|
+
const waitForRetry = input.waitForRetry ?? waitForDelay;
|
|
21
|
+
let retriesPerformed = 0;
|
|
22
|
+
while (true) {
|
|
23
|
+
const result = await (async () => {
|
|
24
|
+
try {
|
|
25
|
+
return await input.sendBatch({
|
|
26
|
+
endpoint: input.endpoint,
|
|
27
|
+
apiKey: input.apiKey,
|
|
28
|
+
logs: input.logs,
|
|
29
|
+
});
|
|
30
|
+
}
|
|
31
|
+
catch {
|
|
32
|
+
return safeRetryResult();
|
|
33
|
+
}
|
|
34
|
+
})();
|
|
35
|
+
if (result.action === 'success' ||
|
|
36
|
+
result.action === 'drop' ||
|
|
37
|
+
result.action === 'unauthorized') {
|
|
38
|
+
return result;
|
|
39
|
+
}
|
|
40
|
+
if (retriesPerformed >= retryPolicy.maxRetries) {
|
|
41
|
+
return {
|
|
42
|
+
action: 'drop',
|
|
43
|
+
shouldWarnUnauthorized: false,
|
|
44
|
+
errorKind: 'max_retries_exceeded',
|
|
45
|
+
};
|
|
46
|
+
}
|
|
47
|
+
const retryAttempt = retriesPerformed + 1;
|
|
48
|
+
const retryDelayMs = (0, backoff_1.calculateRetryDelayMs)(retryAttempt, retryPolicy);
|
|
49
|
+
try {
|
|
50
|
+
await waitForRetry(retryDelayMs);
|
|
51
|
+
}
|
|
52
|
+
catch {
|
|
53
|
+
return {
|
|
54
|
+
action: 'drop',
|
|
55
|
+
shouldWarnUnauthorized: false,
|
|
56
|
+
errorKind: 'max_retries_exceeded',
|
|
57
|
+
};
|
|
58
|
+
}
|
|
59
|
+
retriesPerformed += 1;
|
|
60
|
+
}
|
|
61
|
+
};
|
|
62
|
+
exports.runBatchDelivery = runBatchDelivery;
|
|
63
|
+
//# sourceMappingURL=delivery-runner.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"delivery-runner.js","sourceRoot":"","sources":["../../src/pipeline/delivery-runner.ts"],"names":[],"mappings":";;;AAAA,8CAAyD;AACzD,wDAA6E;AAgB7E,MAAM,YAAY,GAAG,KAAK,EAAE,OAAe,EAAiB,EAAE;IAC5D,MAAM,IAAI,OAAO,CAAO,CAAC,OAAO,EAAE,EAAE;QAClC,UAAU,CAAC,OAAO,EAAE,OAAO,CAAC,CAAC;IAC/B,CAAC,CAAC,CAAC;AACL,CAAC,CAAC;AAEF,MAAM,eAAe,GAAG,GAA2B,EAAE;IACnD,OAAO;QACL,MAAM,EAAE,OAAO;QACf,sBAAsB,EAAE,KAAK;QAC7B,SAAS,EAAE,eAAe;KAC3B,CAAC;AACJ,CAAC,CAAC;AAEK,MAAM,gBAAgB,GAAG,KAAK,EACnC,KAA0B,EACO,EAAE;IACnC,MAAM,WAAW,GAAG,IAAA,iCAAkB,EAAC,KAAK,CAAC,WAAW,CAAC,CAAC;IAC1D,MAAM,YAAY,GAAG,KAAK,CAAC,YAAY,IAAI,YAAY,CAAC;IAExD,IAAI,gBAAgB,GAAG,CAAC,CAAC;IAEzB,OAAO,IAAI,EAAE,CAAC;QACZ,MAAM,MAAM,GAAG,MAAM,CAAC,KAAK,IAAqC,EAAE;YAChE,IAAI,CAAC;gBACH,OAAO,MAAM,KAAK,CAAC,SAAS,CAAC;oBAC3B,QAAQ,EAAE,KAAK,CAAC,QAAQ;oBACxB,MAAM,EAAE,KAAK,CAAC,MAAM;oBACpB,IAAI,EAAE,KAAK,CAAC,IAAI;iBACjB,CAAC,CAAC;YACL,CAAC;YAAC,MAAM,CAAC;gBACP,OAAO,eAAe,EAAE,CAAC;YAC3B,CAAC;QACH,CAAC,CAAC,EAAE,CAAC;QAEL,IACE,MAAM,CAAC,MAAM,KAAK,SAAS;YAC3B,MAAM,CAAC,MAAM,KAAK,MAAM;YACxB,MAAM,CAAC,MAAM,KAAK,cAAc,EAChC,CAAC;YACD,OAAO,MAAM,CAAC;QAChB,CAAC;QAED,IAAI,gBAAgB,IAAI,WAAW,CAAC,UAAU,EAAE,CAAC;YAC/C,OAAO;gBACL,MAAM,EAAE,MAAM;gBACd,sBAAsB,EAAE,KAAK;gBAC7B,SAAS,EAAE,sBAAsB;aAClC,CAAC;QACJ,CAAC;QAED,MAAM,YAAY,GAAG,gBAAgB,GAAG,CAAC,CAAC;QAC1C,MAAM,YAAY,GAAG,IAAA,+BAAqB,EAAC,YAAY,EAAE,WAAW,CAAC,CAAC;QAEtE,IAAI,CAAC;YACH,MAAM,YAAY,CAAC,YAAY,CAAC,CAAC;QACnC,CAAC;QAAC,MAAM,CAAC;YACP,OAAO;gBACL,MAAM,EAAE,MAAM;gBACd,sBAAsB,EAAE,KAAK;gBAC7B,SAAS,EAAE,sBAAsB;aAClC,CAAC;QACJ,CAAC;QAED,gBAAgB,IAAI,CAAC,CAAC;IACxB,CAAC;AACH,CAAC,CAAC;AApDW,QAAA,gBAAgB,oBAoD3B"}
|
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
type TimerHandle = ReturnType<typeof setTimeout>;
|
|
2
|
+
export interface FlushScheduler {
|
|
3
|
+
schedule(): void;
|
|
4
|
+
cancel(): void;
|
|
5
|
+
isScheduled(): boolean;
|
|
6
|
+
}
|
|
7
|
+
export interface CreateFlushSchedulerInput {
|
|
8
|
+
intervalMs: number;
|
|
9
|
+
onFlush: () => void;
|
|
10
|
+
setTimeoutFn?: (callback: () => void, timeoutMs: number) => TimerHandle;
|
|
11
|
+
clearTimeoutFn?: (handle: TimerHandle) => void;
|
|
12
|
+
}
|
|
13
|
+
export declare const createFlushScheduler: (input: CreateFlushSchedulerInput) => FlushScheduler;
|
|
14
|
+
export {};
|
|
@@ -0,0 +1,39 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.createFlushScheduler = void 0;
|
|
4
|
+
const runSafe = (callback) => {
|
|
5
|
+
try {
|
|
6
|
+
callback();
|
|
7
|
+
}
|
|
8
|
+
catch {
|
|
9
|
+
// Timer callbacks must never throw into user code.
|
|
10
|
+
}
|
|
11
|
+
};
|
|
12
|
+
const createFlushScheduler = (input) => {
|
|
13
|
+
const setTimeoutFn = input.setTimeoutFn ?? ((callback, timeoutMs) => setTimeout(callback, timeoutMs));
|
|
14
|
+
const clearTimeoutFn = input.clearTimeoutFn ?? ((handle) => clearTimeout(handle));
|
|
15
|
+
let scheduledHandle;
|
|
16
|
+
return {
|
|
17
|
+
schedule() {
|
|
18
|
+
if (scheduledHandle !== undefined) {
|
|
19
|
+
return;
|
|
20
|
+
}
|
|
21
|
+
scheduledHandle = setTimeoutFn(() => {
|
|
22
|
+
scheduledHandle = undefined;
|
|
23
|
+
runSafe(input.onFlush);
|
|
24
|
+
}, input.intervalMs);
|
|
25
|
+
},
|
|
26
|
+
cancel() {
|
|
27
|
+
if (scheduledHandle === undefined) {
|
|
28
|
+
return;
|
|
29
|
+
}
|
|
30
|
+
clearTimeoutFn(scheduledHandle);
|
|
31
|
+
scheduledHandle = undefined;
|
|
32
|
+
},
|
|
33
|
+
isScheduled() {
|
|
34
|
+
return scheduledHandle !== undefined;
|
|
35
|
+
},
|
|
36
|
+
};
|
|
37
|
+
};
|
|
38
|
+
exports.createFlushScheduler = createFlushScheduler;
|
|
39
|
+
//# sourceMappingURL=flush-scheduler.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"flush-scheduler.js","sourceRoot":"","sources":["../../src/pipeline/flush-scheduler.ts"],"names":[],"mappings":";;;AAeA,MAAM,OAAO,GAAG,CAAC,QAAoB,EAAQ,EAAE;IAC7C,IAAI,CAAC;QACH,QAAQ,EAAE,CAAC;IACb,CAAC;IAAC,MAAM,CAAC;QACP,mDAAmD;IACrD,CAAC;AACH,CAAC,CAAC;AAEK,MAAM,oBAAoB,GAAG,CAAC,KAAgC,EAAkB,EAAE;IACvF,MAAM,YAAY,GAChB,KAAK,CAAC,YAAY,IAAI,CAAC,CAAC,QAAQ,EAAE,SAAS,EAAE,EAAE,CAAC,UAAU,CAAC,QAAQ,EAAE,SAAS,CAAC,CAAC,CAAC;IACnF,MAAM,cAAc,GAAG,KAAK,CAAC,cAAc,IAAI,CAAC,CAAC,MAAM,EAAE,EAAE,CAAC,YAAY,CAAC,MAAM,CAAC,CAAC,CAAC;IAElF,IAAI,eAAwC,CAAC;IAE7C,OAAO;QACL,QAAQ;YACN,IAAI,eAAe,KAAK,SAAS,EAAE,CAAC;gBAClC,OAAO;YACT,CAAC;YAED,eAAe,GAAG,YAAY,CAAC,GAAG,EAAE;gBAClC,eAAe,GAAG,SAAS,CAAC;gBAC5B,OAAO,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC;YACzB,CAAC,EAAE,KAAK,CAAC,UAAU,CAAC,CAAC;QACvB,CAAC;QACD,MAAM;YACJ,IAAI,eAAe,KAAK,SAAS,EAAE,CAAC;gBAClC,OAAO;YACT,CAAC;YAED,cAAc,CAAC,eAAe,CAAC,CAAC;YAChC,eAAe,GAAG,SAAS,CAAC;QAC9B,CAAC;QACD,WAAW;YACT,OAAO,eAAe,KAAK,SAAS,CAAC;QACvC,CAAC;KACF,CAAC;AACJ,CAAC,CAAC;AA9BW,QAAA,oBAAoB,wBA8B/B"}
|
|
@@ -0,0 +1,19 @@
|
|
|
1
|
+
import type { IngestionLogEntry, LogFilterConfig, LogLevel } from '../types';
|
|
2
|
+
export interface PipelineIngressLogInput {
|
|
3
|
+
level: LogLevel;
|
|
4
|
+
message: string;
|
|
5
|
+
metadata?: unknown;
|
|
6
|
+
timestamp?: Date | string | number;
|
|
7
|
+
}
|
|
8
|
+
export interface PipelineIngress {
|
|
9
|
+
dispatch(log: PipelineIngressLogInput): void;
|
|
10
|
+
}
|
|
11
|
+
export interface CreatePipelineIngressInput {
|
|
12
|
+
source: string;
|
|
13
|
+
logFilter?: LogFilterConfig;
|
|
14
|
+
now?: () => Date;
|
|
15
|
+
pipeline: {
|
|
16
|
+
enqueue(log: IngestionLogEntry): void;
|
|
17
|
+
};
|
|
18
|
+
}
|
|
19
|
+
export declare const createPipelineIngress: (input: CreatePipelineIngressInput) => PipelineIngress;
|