@rawnodes/logger 1.6.0 → 1.8.0

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/dist/index.d.mts CHANGED
@@ -1,4 +1,7 @@
1
+ import TransportStream from 'winston-transport';
2
+
1
3
  declare const LOG_LEVELS: {
4
+ readonly off: -1;
2
5
  readonly error: 0;
3
6
  readonly warn: 1;
4
7
  readonly info: 2;
@@ -11,11 +14,21 @@ type LogLevel = keyof typeof LOG_LEVELS;
11
14
  declare function isValidLogLevel(level: string): level is LogLevel;
12
15
  declare function assertLogLevel(level: string): asserts level is LogLevel;
13
16
  type LogFormat = 'json' | 'plain' | 'logfmt' | 'simple';
17
+ interface LevelRule {
18
+ match: Record<string, unknown> & {
19
+ context?: string;
20
+ };
21
+ level: LogLevel;
22
+ }
14
23
  interface ConsoleConfig {
15
24
  format: LogFormat;
25
+ level?: LogLevel;
26
+ rules?: LevelRule[];
16
27
  }
17
28
  interface FileConfig {
18
29
  format: LogFormat;
30
+ level?: LogLevel;
31
+ rules?: LevelRule[];
19
32
  dirname: string;
20
33
  filename: string;
21
34
  datePattern?: string;
@@ -23,10 +36,52 @@ interface FileConfig {
23
36
  maxSize?: string;
24
37
  maxFiles?: string;
25
38
  }
39
+ interface HttpTransportBaseConfig {
40
+ level?: LogLevel;
41
+ rules?: LevelRule[];
42
+ batchSize?: number;
43
+ flushInterval?: number;
44
+ maxRetries?: number;
45
+ retryDelay?: number;
46
+ }
47
+ interface DiscordConfig extends HttpTransportBaseConfig {
48
+ webhookUrl: string;
49
+ username?: string;
50
+ avatarUrl?: string;
51
+ embedColors?: Partial<Record<LogLevel, number>>;
52
+ includeTimestamp?: boolean;
53
+ includeMeta?: boolean;
54
+ maxEmbedFields?: number;
55
+ }
56
+ interface TelegramConfig extends HttpTransportBaseConfig {
57
+ botToken: string;
58
+ chatId: string | number;
59
+ parseMode?: 'Markdown' | 'MarkdownV2' | 'HTML';
60
+ disableNotification?: boolean;
61
+ threadId?: number;
62
+ replyToMessageId?: number;
63
+ }
64
+ interface CloudWatchConfig extends HttpTransportBaseConfig {
65
+ logGroupName: string;
66
+ logStreamName: string;
67
+ region: string;
68
+ accessKeyId: string;
69
+ secretAccessKey: string;
70
+ createLogGroup?: boolean;
71
+ createLogStream?: boolean;
72
+ }
73
+ interface LevelConfigObject {
74
+ default: LogLevel;
75
+ rules?: LevelRule[];
76
+ }
77
+ type LevelConfig = LogLevel | LevelConfigObject;
26
78
  interface LoggerConfig {
27
- level: LogLevel;
79
+ level: LevelConfig;
28
80
  console: ConsoleConfig;
29
81
  file?: FileConfig;
82
+ discord?: DiscordConfig;
83
+ telegram?: TelegramConfig;
84
+ cloudwatch?: CloudWatchConfig;
30
85
  }
31
86
  type LoggerContext = Record<string, unknown>;
32
87
  type LevelOverrideMatch<TContext extends LoggerContext> = Partial<TContext> & {
@@ -35,6 +90,7 @@ type LevelOverrideMatch<TContext extends LoggerContext> = Partial<TContext> & {
35
90
  interface LevelOverride<TContext extends LoggerContext> {
36
91
  match: LevelOverrideMatch<TContext>;
37
92
  level: LogLevel;
93
+ readonly?: boolean;
38
94
  }
39
95
  type Meta = object | (() => object);
40
96
 
@@ -52,7 +108,7 @@ declare class Logger<TContext extends LoggerContext = LoggerContext> {
52
108
  for(context: string): Logger<TContext>;
53
109
  getStore(): LoggerStore<TContext>;
54
110
  setLevelOverride(match: LevelOverrideMatch<TContext>, level: LogLevel): void;
55
- removeLevelOverride(match: LevelOverrideMatch<TContext>): void;
111
+ removeLevelOverride(match: LevelOverrideMatch<TContext>): boolean;
56
112
  clearLevelOverrides(): void;
57
113
  getLevelOverrides(): LevelOverride<TContext>[];
58
114
  profile(id: string, meta?: object): void;
@@ -78,6 +134,98 @@ interface SingletonLogger<TContext extends LoggerContext> {
78
134
  }
79
135
  declare function createSingletonLogger<TContext extends LoggerContext = LoggerContext>(): SingletonLogger<TContext>;
80
136
 
137
+ declare function matchesContext(storeContext: LoggerContext | undefined, loggerContext: string | undefined, match: Record<string, unknown> & {
138
+ context?: string;
139
+ }): boolean;
140
+
141
+ interface BufferedMessage {
142
+ level: LogLevel;
143
+ message: string;
144
+ timestamp: Date;
145
+ context?: string;
146
+ meta?: Record<string, unknown>;
147
+ }
148
+ interface BufferOptions {
149
+ batchSize: number;
150
+ flushInterval: number;
151
+ maxRetries: number;
152
+ retryDelay: number;
153
+ onFlush: (messages: BufferedMessage[]) => Promise<void>;
154
+ onError?: (error: Error, messages: BufferedMessage[]) => void;
155
+ }
156
+ declare class MessageBuffer {
157
+ private options;
158
+ private queue;
159
+ private timer;
160
+ private flushing;
161
+ private closed;
162
+ constructor(options: BufferOptions);
163
+ add(message: BufferedMessage): void;
164
+ flush(): Promise<void>;
165
+ close(): Promise<void>;
166
+ private scheduleFlush;
167
+ private clearTimer;
168
+ private sendWithRetry;
169
+ private delay;
170
+ }
171
+
172
+ interface BaseHttpTransportOptions {
173
+ batchSize?: number;
174
+ flushInterval?: number;
175
+ maxRetries?: number;
176
+ retryDelay?: number;
177
+ }
178
+ declare abstract class BaseHttpTransport extends TransportStream {
179
+ protected buffer: MessageBuffer;
180
+ constructor(opts?: BaseHttpTransportOptions);
181
+ log(info: Record<string, unknown>, callback: () => void): void;
182
+ close(): Promise<void>;
183
+ protected transformMessage(info: Record<string, unknown>): BufferedMessage;
184
+ protected handleError(error: Error, messages: BufferedMessage[]): void;
185
+ protected abstract sendBatch(messages: BufferedMessage[]): Promise<void>;
186
+ }
187
+
188
+ declare class DiscordTransport extends BaseHttpTransport {
189
+ private config;
190
+ constructor(config: DiscordConfig);
191
+ protected sendBatch(messages: BufferedMessage[]): Promise<void>;
192
+ private createEmbed;
193
+ private metaToFields;
194
+ private sendWebhook;
195
+ private chunkArray;
196
+ }
197
+
198
+ declare class TelegramTransport extends BaseHttpTransport {
199
+ private config;
200
+ private apiUrl;
201
+ constructor(config: TelegramConfig);
202
+ protected sendBatch(messages: BufferedMessage[]): Promise<void>;
203
+ private formatBatchMessage;
204
+ private formatMarkdown;
205
+ private formatHtml;
206
+ private shouldMute;
207
+ private sendMessage;
208
+ private escapeMarkdownV2;
209
+ private escapeHtml;
210
+ }
211
+
212
+ declare class CloudWatchTransport extends BaseHttpTransport {
213
+ private config;
214
+ private client;
215
+ private sequenceToken;
216
+ private initialized;
217
+ private initPromise;
218
+ constructor(config: CloudWatchConfig);
219
+ protected sendBatch(messages: BufferedMessage[]): Promise<void>;
220
+ private ensureInitialized;
221
+ private initialize;
222
+ private createLogGroupIfNotExists;
223
+ private createLogStreamIfNotExists;
224
+ private fetchSequenceToken;
225
+ private isResourceAlreadyExistsError;
226
+ private isInvalidSequenceTokenError;
227
+ }
228
+
81
229
  interface TimingResult {
82
230
  label: string;
83
231
  durationMs: number;
@@ -112,4 +260,4 @@ declare function flattenObject(obj: Record<string, unknown>, prefix?: string): R
112
260
  declare function formatLogfmtValue(value: unknown): string;
113
261
  declare function formatLogfmt(data: Record<string, unknown>): string;
114
262
 
115
- export { type ConsoleConfig, type FileConfig, LOG_LEVELS, type LevelOverride, type LevelOverrideMatch, type LogFormat, type LogLevel, Logger, type LoggerConfig, type LoggerContext, LoggerStore, type MaskSecretsOptions, type Meta, type RequestIdOptions, type SingletonLogger, type TimingResult, assertLogLevel, createMasker, createSingletonLogger, extractRequestId, flattenObject, formatLogfmt, formatLogfmtValue, generateRequestId, getOrGenerateRequestId, isValidLogLevel, maskSecrets, measureAsync, measureSync };
263
+ export { BaseHttpTransport, type BaseHttpTransportOptions, type BufferOptions, type BufferedMessage, type CloudWatchConfig, CloudWatchTransport, type ConsoleConfig, type DiscordConfig, DiscordTransport, type FileConfig, type HttpTransportBaseConfig, LOG_LEVELS, type LevelConfig, type LevelConfigObject, type LevelOverride, type LevelOverrideMatch, type LevelRule, type LogFormat, type LogLevel, Logger, type LoggerConfig, type LoggerContext, LoggerStore, type MaskSecretsOptions, MessageBuffer, type Meta, type RequestIdOptions, type SingletonLogger, type TelegramConfig, TelegramTransport, type TimingResult, assertLogLevel, createMasker, createSingletonLogger, extractRequestId, flattenObject, formatLogfmt, formatLogfmtValue, generateRequestId, getOrGenerateRequestId, isValidLogLevel, maskSecrets, matchesContext, measureAsync, measureSync };
package/dist/index.d.ts CHANGED
@@ -1,4 +1,7 @@
1
+ import TransportStream from 'winston-transport';
2
+
1
3
  declare const LOG_LEVELS: {
4
+ readonly off: -1;
2
5
  readonly error: 0;
3
6
  readonly warn: 1;
4
7
  readonly info: 2;
@@ -11,11 +14,21 @@ type LogLevel = keyof typeof LOG_LEVELS;
11
14
  declare function isValidLogLevel(level: string): level is LogLevel;
12
15
  declare function assertLogLevel(level: string): asserts level is LogLevel;
13
16
  type LogFormat = 'json' | 'plain' | 'logfmt' | 'simple';
17
+ interface LevelRule {
18
+ match: Record<string, unknown> & {
19
+ context?: string;
20
+ };
21
+ level: LogLevel;
22
+ }
14
23
  interface ConsoleConfig {
15
24
  format: LogFormat;
25
+ level?: LogLevel;
26
+ rules?: LevelRule[];
16
27
  }
17
28
  interface FileConfig {
18
29
  format: LogFormat;
30
+ level?: LogLevel;
31
+ rules?: LevelRule[];
19
32
  dirname: string;
20
33
  filename: string;
21
34
  datePattern?: string;
@@ -23,10 +36,52 @@ interface FileConfig {
23
36
  maxSize?: string;
24
37
  maxFiles?: string;
25
38
  }
39
+ interface HttpTransportBaseConfig {
40
+ level?: LogLevel;
41
+ rules?: LevelRule[];
42
+ batchSize?: number;
43
+ flushInterval?: number;
44
+ maxRetries?: number;
45
+ retryDelay?: number;
46
+ }
47
+ interface DiscordConfig extends HttpTransportBaseConfig {
48
+ webhookUrl: string;
49
+ username?: string;
50
+ avatarUrl?: string;
51
+ embedColors?: Partial<Record<LogLevel, number>>;
52
+ includeTimestamp?: boolean;
53
+ includeMeta?: boolean;
54
+ maxEmbedFields?: number;
55
+ }
56
+ interface TelegramConfig extends HttpTransportBaseConfig {
57
+ botToken: string;
58
+ chatId: string | number;
59
+ parseMode?: 'Markdown' | 'MarkdownV2' | 'HTML';
60
+ disableNotification?: boolean;
61
+ threadId?: number;
62
+ replyToMessageId?: number;
63
+ }
64
+ interface CloudWatchConfig extends HttpTransportBaseConfig {
65
+ logGroupName: string;
66
+ logStreamName: string;
67
+ region: string;
68
+ accessKeyId: string;
69
+ secretAccessKey: string;
70
+ createLogGroup?: boolean;
71
+ createLogStream?: boolean;
72
+ }
73
+ interface LevelConfigObject {
74
+ default: LogLevel;
75
+ rules?: LevelRule[];
76
+ }
77
+ type LevelConfig = LogLevel | LevelConfigObject;
26
78
  interface LoggerConfig {
27
- level: LogLevel;
79
+ level: LevelConfig;
28
80
  console: ConsoleConfig;
29
81
  file?: FileConfig;
82
+ discord?: DiscordConfig;
83
+ telegram?: TelegramConfig;
84
+ cloudwatch?: CloudWatchConfig;
30
85
  }
31
86
  type LoggerContext = Record<string, unknown>;
32
87
  type LevelOverrideMatch<TContext extends LoggerContext> = Partial<TContext> & {
@@ -35,6 +90,7 @@ type LevelOverrideMatch<TContext extends LoggerContext> = Partial<TContext> & {
35
90
  interface LevelOverride<TContext extends LoggerContext> {
36
91
  match: LevelOverrideMatch<TContext>;
37
92
  level: LogLevel;
93
+ readonly?: boolean;
38
94
  }
39
95
  type Meta = object | (() => object);
40
96
 
@@ -52,7 +108,7 @@ declare class Logger<TContext extends LoggerContext = LoggerContext> {
52
108
  for(context: string): Logger<TContext>;
53
109
  getStore(): LoggerStore<TContext>;
54
110
  setLevelOverride(match: LevelOverrideMatch<TContext>, level: LogLevel): void;
55
- removeLevelOverride(match: LevelOverrideMatch<TContext>): void;
111
+ removeLevelOverride(match: LevelOverrideMatch<TContext>): boolean;
56
112
  clearLevelOverrides(): void;
57
113
  getLevelOverrides(): LevelOverride<TContext>[];
58
114
  profile(id: string, meta?: object): void;
@@ -78,6 +134,98 @@ interface SingletonLogger<TContext extends LoggerContext> {
78
134
  }
79
135
  declare function createSingletonLogger<TContext extends LoggerContext = LoggerContext>(): SingletonLogger<TContext>;
80
136
 
137
+ declare function matchesContext(storeContext: LoggerContext | undefined, loggerContext: string | undefined, match: Record<string, unknown> & {
138
+ context?: string;
139
+ }): boolean;
140
+
141
+ interface BufferedMessage {
142
+ level: LogLevel;
143
+ message: string;
144
+ timestamp: Date;
145
+ context?: string;
146
+ meta?: Record<string, unknown>;
147
+ }
148
+ interface BufferOptions {
149
+ batchSize: number;
150
+ flushInterval: number;
151
+ maxRetries: number;
152
+ retryDelay: number;
153
+ onFlush: (messages: BufferedMessage[]) => Promise<void>;
154
+ onError?: (error: Error, messages: BufferedMessage[]) => void;
155
+ }
156
+ declare class MessageBuffer {
157
+ private options;
158
+ private queue;
159
+ private timer;
160
+ private flushing;
161
+ private closed;
162
+ constructor(options: BufferOptions);
163
+ add(message: BufferedMessage): void;
164
+ flush(): Promise<void>;
165
+ close(): Promise<void>;
166
+ private scheduleFlush;
167
+ private clearTimer;
168
+ private sendWithRetry;
169
+ private delay;
170
+ }
171
+
172
+ interface BaseHttpTransportOptions {
173
+ batchSize?: number;
174
+ flushInterval?: number;
175
+ maxRetries?: number;
176
+ retryDelay?: number;
177
+ }
178
+ declare abstract class BaseHttpTransport extends TransportStream {
179
+ protected buffer: MessageBuffer;
180
+ constructor(opts?: BaseHttpTransportOptions);
181
+ log(info: Record<string, unknown>, callback: () => void): void;
182
+ close(): Promise<void>;
183
+ protected transformMessage(info: Record<string, unknown>): BufferedMessage;
184
+ protected handleError(error: Error, messages: BufferedMessage[]): void;
185
+ protected abstract sendBatch(messages: BufferedMessage[]): Promise<void>;
186
+ }
187
+
188
+ declare class DiscordTransport extends BaseHttpTransport {
189
+ private config;
190
+ constructor(config: DiscordConfig);
191
+ protected sendBatch(messages: BufferedMessage[]): Promise<void>;
192
+ private createEmbed;
193
+ private metaToFields;
194
+ private sendWebhook;
195
+ private chunkArray;
196
+ }
197
+
198
+ declare class TelegramTransport extends BaseHttpTransport {
199
+ private config;
200
+ private apiUrl;
201
+ constructor(config: TelegramConfig);
202
+ protected sendBatch(messages: BufferedMessage[]): Promise<void>;
203
+ private formatBatchMessage;
204
+ private formatMarkdown;
205
+ private formatHtml;
206
+ private shouldMute;
207
+ private sendMessage;
208
+ private escapeMarkdownV2;
209
+ private escapeHtml;
210
+ }
211
+
212
+ declare class CloudWatchTransport extends BaseHttpTransport {
213
+ private config;
214
+ private client;
215
+ private sequenceToken;
216
+ private initialized;
217
+ private initPromise;
218
+ constructor(config: CloudWatchConfig);
219
+ protected sendBatch(messages: BufferedMessage[]): Promise<void>;
220
+ private ensureInitialized;
221
+ private initialize;
222
+ private createLogGroupIfNotExists;
223
+ private createLogStreamIfNotExists;
224
+ private fetchSequenceToken;
225
+ private isResourceAlreadyExistsError;
226
+ private isInvalidSequenceTokenError;
227
+ }
228
+
81
229
  interface TimingResult {
82
230
  label: string;
83
231
  durationMs: number;
@@ -112,4 +260,4 @@ declare function flattenObject(obj: Record<string, unknown>, prefix?: string): R
112
260
  declare function formatLogfmtValue(value: unknown): string;
113
261
  declare function formatLogfmt(data: Record<string, unknown>): string;
114
262
 
115
- export { type ConsoleConfig, type FileConfig, LOG_LEVELS, type LevelOverride, type LevelOverrideMatch, type LogFormat, type LogLevel, Logger, type LoggerConfig, type LoggerContext, LoggerStore, type MaskSecretsOptions, type Meta, type RequestIdOptions, type SingletonLogger, type TimingResult, assertLogLevel, createMasker, createSingletonLogger, extractRequestId, flattenObject, formatLogfmt, formatLogfmtValue, generateRequestId, getOrGenerateRequestId, isValidLogLevel, maskSecrets, measureAsync, measureSync };
263
+ export { BaseHttpTransport, type BaseHttpTransportOptions, type BufferOptions, type BufferedMessage, type CloudWatchConfig, CloudWatchTransport, type ConsoleConfig, type DiscordConfig, DiscordTransport, type FileConfig, type HttpTransportBaseConfig, LOG_LEVELS, type LevelConfig, type LevelConfigObject, type LevelOverride, type LevelOverrideMatch, type LevelRule, type LogFormat, type LogLevel, Logger, type LoggerConfig, type LoggerContext, LoggerStore, type MaskSecretsOptions, MessageBuffer, type Meta, type RequestIdOptions, type SingletonLogger, type TelegramConfig, TelegramTransport, type TimingResult, assertLogLevel, createMasker, createSingletonLogger, extractRequestId, flattenObject, formatLogfmt, formatLogfmtValue, generateRequestId, getOrGenerateRequestId, isValidLogLevel, maskSecrets, matchesContext, measureAsync, measureSync };