@mongrov/core 0.5.1 → 0.7.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.
@@ -1,3 +1,4 @@
1
+ import { devConsoleLogger, FailureGate } from '../internal-log';
1
2
  let FileSystemModule = null;
2
3
  function getFileSystem() {
3
4
  if (!FileSystemModule) {
@@ -17,70 +18,216 @@ function getFileSystem() {
17
18
  }
18
19
  return FileSystemModule;
19
20
  }
21
+ let AppendFileClass;
22
+ // Hermes provides it; core's tsconfig has no DOM lib to declare it.
23
+ function currentEncoder() {
24
+ return globalThis.TextEncoder;
25
+ }
26
+ /** `null` on expo-file-system before v19 (no `File` / `Paths`), or without a TextEncoder. */
27
+ function getAppendFile() {
28
+ if (AppendFileClass === undefined) {
29
+ try {
30
+ const mod = require('expo-file-system');
31
+ AppendFileClass = typeof mod.File === 'function' && mod.Paths !== undefined && currentEncoder() ? mod.File : null;
32
+ }
33
+ catch {
34
+ AppendFileClass = null;
35
+ }
36
+ }
37
+ return AppendFileClass;
38
+ }
39
+ /** Test seam: forget the probed API so the next write probes again. */
40
+ export function resetFileApiForTests() {
41
+ AppendFileClass = undefined;
42
+ }
43
+ // UTC, the same clock as every entry's `timestamp`, so a file's name and the
44
+ // lines inside it agree on which hour they belong to.
20
45
  function formatDate(date) {
21
- const y = date.getFullYear();
22
- const m = String(date.getMonth() + 1).padStart(2, '0');
23
- const d = String(date.getDate()).padStart(2, '0');
46
+ const y = date.getUTCFullYear();
47
+ const m = String(date.getUTCMonth() + 1).padStart(2, '0');
48
+ const d = String(date.getUTCDate()).padStart(2, '0');
24
49
  return `${y}-${m}-${d}`;
25
50
  }
51
+ function formatHour(date) {
52
+ return `${formatDate(date)}T${String(date.getUTCHours()).padStart(2, '0')}`;
53
+ }
54
+ /**
55
+ * `logs-YYYY-MM-DDTHH-NNN.txt`: a new file every UTC hour, and a new `NNN`
56
+ * when the current one passes `maxFileSizeKB`. Names sort chronologically,
57
+ * and a pre-0.7 day file (`logs-YYYY-MM-DD.txt`) sorts before the same day's
58
+ * hourly files (`.` < `T`), so legacy and new files read in one order.
59
+ */
60
+ function rotatedName(hour, seq) {
61
+ return `logs-${hour}-${String(seq).padStart(3, '0')}.txt`;
62
+ }
63
+ const ROTATED_RE = /^logs-(\d{4}-\d{2}-\d{2}T\d{2})-(\d{3,})\.txt$/;
64
+ const DATE_RE = /^logs-(\d{4}-\d{2}-\d{2})/;
65
+ function isLogFile(name) {
66
+ return name.startsWith('logs-') && name.endsWith('.txt');
67
+ }
68
+ /** The UTC day a log file belongs to, legacy or hourly; `null` if neither. */
69
+ function fileDay(name) {
70
+ return DATE_RE.exec(name)?.[1] ?? null;
71
+ }
26
72
  export class FileTransport {
27
- constructor(config) {
73
+ /**
74
+ * `logger` receives this transport's own failures. `createLogger` passes
75
+ * one that skips this transport; standalone use falls back to the dev
76
+ * console.
77
+ */
78
+ constructor(config, logger) {
28
79
  this.name = 'file';
80
+ this.writeFailures = new FailureGate();
29
81
  this.initialized = false;
30
- // Serial write queue to prevent concurrent read-then-write race conditions
31
- this.writeChain = Promise.resolve();
82
+ this.fallbackReported = false;
83
+ this.current = null;
84
+ // Entries waiting for the next write, and the callers waiting on them.
85
+ // Lines that arrive while a write is in flight are coalesced into the next
86
+ // one: one open (or one read+rewrite, on the fallback) per batch, not per
87
+ // line.
88
+ this.pending = [];
89
+ this.pendingWaiters = [];
90
+ this.writing = null;
32
91
  // Throttle cleanup to once per minute
33
92
  this.lastCleanup = 0;
34
93
  this.cleanupIntervalMs = 60000;
94
+ this.log = logger ?? devConsoleLogger();
35
95
  const fs = getFileSystem();
36
96
  this.directory
37
97
  = config?.directory ?? `${fs.documentDirectory ?? ''}logs/`;
38
98
  this.maxSizeMB = config?.maxSizeMB ?? 5;
99
+ this.maxFileBytes = (config?.maxFileSizeKB ?? 1024) * 1024;
39
100
  this.retentionDays = config?.retentionDays ?? 7;
40
101
  }
41
- async send(entries) {
42
- // Chain writes to serialize file access
43
- const op = this.writeChain.then(() => this.doWrite(entries));
44
- this.writeChain = op.catch(() => { });
45
- return op;
102
+ /** Resolves once these entries are on disk (or the write failed). */
103
+ send(entries) {
104
+ this.pending.push(...entries);
105
+ const done = new Promise(resolve => this.pendingWaiters.push(resolve));
106
+ if (!this.writing)
107
+ this.writing = this.drain();
108
+ return done;
109
+ }
110
+ /** Resolves once everything sent so far has been written. */
111
+ async flush() {
112
+ while (this.writing)
113
+ await this.writing;
114
+ }
115
+ async drain() {
116
+ while (this.pending.length > 0) {
117
+ const batch = this.pending;
118
+ const waiters = this.pendingWaiters;
119
+ this.pending = [];
120
+ this.pendingWaiters = [];
121
+ await this.doWrite(batch);
122
+ for (const resolve of waiters)
123
+ resolve();
124
+ }
125
+ this.writing = null;
46
126
  }
47
127
  async doWrite(entries) {
48
128
  try {
49
129
  await this.ensureDirectory();
130
+ const target = await this.targetFile(new Date());
50
131
  const now = Date.now();
51
132
  if (now - this.lastCleanup >= this.cleanupIntervalMs) {
52
- await this.cleanupIfNeeded();
133
+ await this.cleanupIfNeeded(target.name);
53
134
  this.lastCleanup = now;
54
135
  }
55
136
  const lines = `${entries.map(e => JSON.stringify(e)).join('\n')}\n`;
56
- const filename = `logs-${formatDate(new Date())}.txt`;
57
- const filePath = `${this.directory}${filename}`;
58
- const fs = getFileSystem();
59
- const info = await fs.getInfoAsync(filePath);
60
- if (info.exists) {
61
- // Append by reading existing content + new lines
62
- const existing = await fs.readAsStringAsync(filePath);
63
- await fs.writeAsStringAsync(filePath, existing + lines);
137
+ target.size += await this.append(`${this.directory}${target.name}`, lines);
138
+ const failed = this.writeFailures.recover();
139
+ if (failed > 0)
140
+ this.log.info('[FileTransport] writes recovered', { failedWrites: failed });
141
+ }
142
+ catch (error) {
143
+ // Logging must never crash the app. The lines are lost from the file
144
+ // (the ring buffer still has them); report once per run of failures.
145
+ if (this.writeFailures.fail()) {
146
+ this.log.error('[FileTransport] write failed; file log is missing lines', {
147
+ error: String(error),
148
+ lost: entries.length,
149
+ });
150
+ }
151
+ }
152
+ }
153
+ /**
154
+ * The file this batch goes to. A new UTC hour starts a new file; so does a
155
+ * current file at or past `maxFileSizeKB`. On the first write of an hour
156
+ * (a relaunch, say) it continues the newest file already on disk for that
157
+ * hour, so a restart does not leave a run of near-empty files.
158
+ */
159
+ async targetFile(at) {
160
+ const hour = formatHour(at);
161
+ if (this.current?.hour !== hour)
162
+ this.current = await this.resumeHour(hour);
163
+ if (this.current.size >= this.maxFileBytes) {
164
+ const seq = this.current.seq + 1;
165
+ this.current = { hour, seq, name: rotatedName(hour, seq), size: 0 };
166
+ }
167
+ return this.current;
168
+ }
169
+ async resumeHour(hour) {
170
+ const fs = getFileSystem();
171
+ const latest = (await fs.readDirectoryAsync(this.directory))
172
+ .map(name => ROTATED_RE.exec(name))
173
+ .filter((m) => m !== null && m[1] === hour)
174
+ .map(m => Number(m[2]))
175
+ .sort((a, b) => a - b)
176
+ .pop();
177
+ if (latest === undefined)
178
+ return { hour, seq: 0, name: rotatedName(hour, 0), size: 0 };
179
+ const name = rotatedName(hour, latest);
180
+ const info = await fs.getInfoAsync(`${this.directory}${name}`);
181
+ return { hour, seq: latest, name, size: info.size ?? 0 };
182
+ }
183
+ /**
184
+ * Appends at the end of the file and returns the bytes written. Never reads
185
+ * the file on the append path: a kill mid-write can at worst cut the last
186
+ * line, not the lines already on disk.
187
+ */
188
+ async append(filePath, lines) {
189
+ const AppendFileCtor = getAppendFile();
190
+ if (AppendFileCtor) {
191
+ const bytes = new (currentEncoder())().encode(lines);
192
+ const file = new AppendFileCtor(filePath);
193
+ if (!file.exists)
194
+ file.create();
195
+ const handle = file.open();
196
+ try {
197
+ handle.offset = handle.size ?? 0;
198
+ handle.writeBytes(bytes);
64
199
  }
65
- else {
66
- await fs.writeAsStringAsync(filePath, lines);
200
+ finally {
201
+ handle.close();
67
202
  }
203
+ return bytes.length;
68
204
  }
69
- catch (error) {
70
- // Logging should never crash the app
71
- console.warn('[FileTransport] Write failed:', error);
205
+ if (!this.fallbackReported) {
206
+ this.fallbackReported = true;
207
+ this.log.info('[FileTransport] append API unavailable; rewriting the file per batch', {
208
+ reason: 'expo-file-system < 19 (no File / Paths) or no TextEncoder',
209
+ });
210
+ }
211
+ const fs = getFileSystem();
212
+ const info = await fs.getInfoAsync(filePath);
213
+ if (info.exists) {
214
+ const existing = await fs.readAsStringAsync(filePath);
215
+ await fs.writeAsStringAsync(filePath, existing + lines);
216
+ }
217
+ else {
218
+ await fs.writeAsStringAsync(filePath, lines);
72
219
  }
220
+ return lines.length;
73
221
  }
222
+ /** Newest first. */
74
223
  async getLogFiles() {
75
224
  try {
76
225
  const fs = getFileSystem();
77
226
  const files = await fs.readDirectoryAsync(this.directory);
78
- return files
79
- .filter(f => f.startsWith('logs-') && f.endsWith('.txt'))
80
- .sort()
81
- .reverse();
227
+ return files.filter(isLogFile).sort().reverse();
82
228
  }
83
229
  catch {
230
+ // expected: no directory yet means no files have been written.
84
231
  return [];
85
232
  }
86
233
  }
@@ -88,6 +235,26 @@ export class FileTransport {
88
235
  const fs = getFileSystem();
89
236
  return fs.readAsStringAsync(`${this.directory}${filename}`);
90
237
  }
238
+ /**
239
+ * Every retained file, legacy day files and hourly files together, oldest
240
+ * first: one JSON entry per line, oldest line first. Unlike the ring buffer
241
+ * this survives an app restart or crash. Waits for pending writes first, so
242
+ * the result includes everything sent.
243
+ */
244
+ async readAll() {
245
+ await this.flush();
246
+ const files = (await this.getLogFiles()).reverse();
247
+ let out = '';
248
+ for (const file of files) {
249
+ try {
250
+ out += await this.readFile(file);
251
+ }
252
+ catch {
253
+ // A file removed by cleanup mid-read is simply skipped.
254
+ }
255
+ }
256
+ return out;
257
+ }
91
258
  async ensureDirectory() {
92
259
  if (this.initialized)
93
260
  return;
@@ -98,44 +265,50 @@ export class FileTransport {
98
265
  }
99
266
  this.initialized = true;
100
267
  }
101
- async cleanupIfNeeded() {
268
+ /**
269
+ * Deletes whole files only, never `current` (the file being written):
270
+ * first those older than `retentionDays`, then the oldest until the
271
+ * directory is under `maxSizeMB`. No file is ever cut, so every line left
272
+ * on disk is a line as it was written.
273
+ */
274
+ async cleanupIfNeeded(current) {
102
275
  try {
103
276
  const fs = getFileSystem();
104
- const files = await fs.readDirectoryAsync(this.directory);
105
- const logFiles = files
106
- .filter(f => f.startsWith('logs-') && f.endsWith('.txt'))
277
+ const files = (await fs.readDirectoryAsync(this.directory))
278
+ .filter(isLogFile)
107
279
  .sort();
108
- // Delete files older than retentionDays
109
280
  const cutoffDate = new Date();
110
- cutoffDate.setDate(cutoffDate.getDate() - this.retentionDays);
111
- const cutoffStr = formatDate(cutoffDate);
112
- for (const file of logFiles) {
113
- const dateStr = file.replace('logs-', '').replace('.txt', '');
114
- if (dateStr < cutoffStr) {
281
+ cutoffDate.setUTCDate(cutoffDate.getUTCDate() - this.retentionDays);
282
+ const cutoff = formatDate(cutoffDate);
283
+ const kept = [];
284
+ for (const file of files) {
285
+ const day = fileDay(file);
286
+ if (file !== current && day !== null && day < cutoff)
115
287
  await fs.deleteAsync(`${this.directory}${file}`, { idempotent: true });
116
- }
288
+ else
289
+ kept.push(file);
117
290
  }
118
- // Check total size and delete oldest if exceeding maxSizeMB
291
+ const sizes = new Map();
119
292
  let totalSize = 0;
120
- const remaining = (await fs.readDirectoryAsync(this.directory))
121
- .filter(f => f.startsWith('logs-') && f.endsWith('.txt'))
122
- .sort();
123
- for (const file of remaining) {
124
- const info = await fs.getInfoAsync(`${this.directory}${file}`);
125
- totalSize += info.size ?? 0;
293
+ for (const file of kept) {
294
+ const size = (await fs.getInfoAsync(`${this.directory}${file}`)).size ?? 0;
295
+ sizes.set(file, size);
296
+ totalSize += size;
126
297
  }
127
298
  const maxSizeBytes = this.maxSizeMB * 1024 * 1024;
128
- let i = 0;
129
- while (totalSize > maxSizeBytes && i < remaining.length) {
130
- const file = remaining[i];
131
- const info = await fs.getInfoAsync(`${this.directory}${file}`);
299
+ for (const file of kept) {
300
+ if (totalSize <= maxSizeBytes)
301
+ break;
302
+ if (file === current)
303
+ continue;
132
304
  await fs.deleteAsync(`${this.directory}${file}`, { idempotent: true });
133
- totalSize -= info.size ?? 0;
134
- i++;
305
+ totalSize -= sizes.get(file) ?? 0;
135
306
  }
136
307
  }
137
- catch {
138
- // Cleanup failures are non-critical
308
+ catch (error) {
309
+ // Non-critical: the next cleanup (a minute on) tries again, but a
310
+ // cleanup that keeps failing lets the log directory grow unbounded.
311
+ this.log.warn('[FileTransport] cleanup failed', { error: String(error) });
139
312
  }
140
313
  }
141
314
  }
@@ -1 +1 @@
1
- {"version":3,"file":"file.js","sourceRoot":"","sources":["../../src/transports/file.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"file.js","sourceRoot":"","sources":["../../src/transports/file.ts"],"names":[],"mappings":"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"}
@@ -1,3 +1,4 @@
1
+ import type { InternalLogger } from '../internal-log';
1
2
  import type { LogEntry, LogTransport, WebhookConfig } from '../types';
2
3
  export declare class WebhookTransport implements LogTransport {
3
4
  readonly name = "webhook";
@@ -6,7 +7,16 @@ export declare class WebhookTransport implements LogTransport {
6
7
  private timer;
7
8
  private offlineQueue;
8
9
  private flushing;
9
- constructor(config: WebhookConfig);
10
+ private readonly log;
11
+ private readonly rejections;
12
+ private droppedEntries;
13
+ private readonly postFailures;
14
+ /**
15
+ * `logger` receives this transport's own failures. `createLogger` passes
16
+ * one that skips this transport (a report about a failing webhook must not
17
+ * be posted to that webhook); standalone use falls back to the dev console.
18
+ */
19
+ constructor(config: WebhookConfig, logger?: InternalLogger);
10
20
  send(entries: LogEntry[]): Promise<void>;
11
21
  flush(): Promise<void>;
12
22
  destroy(): Promise<void>;
@@ -1 +1 @@
1
- {"version":3,"file":"webhook.d.ts","sourceRoot":"","sources":["../../src/transports/webhook.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,QAAQ,EAAE,YAAY,EAAE,aAAa,EAAE,MAAM,UAAU,CAAA;AAGrE,qBAAa,gBAAiB,YAAW,YAAY;IACnD,QAAQ,CAAC,IAAI,aAAY;IAEzB,OAAO,CAAC,QAAQ,CAAC,MAAM,CAG2B;IAElD,OAAO,CAAC,KAAK,CAAiB;IAC9B,OAAO,CAAC,KAAK,CAA8C;IAC3D,OAAO,CAAC,YAAY,CAAc;IAClC,OAAO,CAAC,QAAQ,CAAQ;gBAEZ,MAAM,EAAE,aAAa;IAkB3B,IAAI,CAAC,OAAO,EAAE,QAAQ,EAAE,GAAG,OAAO,CAAC,IAAI,CAAC;IAQxC,KAAK,IAAI,OAAO,CAAC,IAAI,CAAC;IAKtB,OAAO,IAAI,OAAO,CAAC,IAAI,CAAC;IAO9B,OAAO,CAAC,UAAU;IAQlB,OAAO,CAAC,SAAS;YAOH,UAAU;YAsBV,WAAW;CA2B1B"}
1
+ {"version":3,"file":"webhook.d.ts","sourceRoot":"","sources":["../../src/transports/webhook.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,iBAAiB,CAAA;AACrD,OAAO,KAAK,EAAE,QAAQ,EAAE,YAAY,EAAE,aAAa,EAAE,MAAM,UAAU,CAAA;AAIrE,qBAAa,gBAAiB,YAAW,YAAY;IACnD,QAAQ,CAAC,IAAI,aAAY;IAEzB,OAAO,CAAC,QAAQ,CAAC,MAAM,CAG2B;IAElD,OAAO,CAAC,KAAK,CAAiB;IAC9B,OAAO,CAAC,KAAK,CAA8C;IAC3D,OAAO,CAAC,YAAY,CAAc;IAClC,OAAO,CAAC,QAAQ,CAAQ;IACxB,OAAO,CAAC,QAAQ,CAAC,GAAG,CAAgB;IAGpC,OAAO,CAAC,QAAQ,CAAC,UAAU,CAAoB;IAC/C,OAAO,CAAC,cAAc,CAAI;IAC1B,OAAO,CAAC,QAAQ,CAAC,YAAY,CAAoB;IAEjD;;;;OAIG;gBACS,MAAM,EAAE,aAAa,EAAE,MAAM,CAAC,EAAE,cAAc;IAmBpD,IAAI,CAAC,OAAO,EAAE,QAAQ,EAAE,GAAG,OAAO,CAAC,IAAI,CAAC;IAQxC,KAAK,IAAI,OAAO,CAAC,IAAI,CAAC;IAKtB,OAAO,IAAI,OAAO,CAAC,IAAI,CAAC;IAO9B,OAAO,CAAC,UAAU;IAUlB,OAAO,CAAC,SAAS;YAOH,UAAU;YA8BV,WAAW;CAwC1B"}
@@ -1,10 +1,22 @@
1
+ import { devConsoleLogger, FailureGate } from '../internal-log';
1
2
  import { OfflineQueue } from '../offline-queue';
2
3
  export class WebhookTransport {
3
- constructor(config) {
4
+ /**
5
+ * `logger` receives this transport's own failures. `createLogger` passes
6
+ * one that skips this transport (a report about a failing webhook must not
7
+ * be posted to that webhook); standalone use falls back to the dev console.
8
+ */
9
+ constructor(config, logger) {
4
10
  this.name = 'webhook';
5
11
  this.batch = [];
6
12
  this.timer = null;
7
13
  this.flushing = false;
14
+ // A 4xx usually means bad auth or a bad URL: every batch drops until it
15
+ // is fixed. Reported once per run, with the total dropped at its end.
16
+ this.rejections = new FailureGate();
17
+ this.droppedEntries = 0;
18
+ this.postFailures = new FailureGate();
19
+ this.log = logger ?? devConsoleLogger();
8
20
  this.config = {
9
21
  url: config.url,
10
22
  batchSize: config.batchSize ?? 10,
@@ -13,7 +25,7 @@ export class WebhookTransport {
13
25
  headers: config.headers,
14
26
  formatPayload: config.formatPayload,
15
27
  };
16
- this.offlineQueue = new OfflineQueue(entries => this.postEntries(entries), { maxRetries: this.config.maxRetries });
28
+ this.offlineQueue = new OfflineQueue(entries => this.postEntries(entries), { maxRetries: this.config.maxRetries, logger: this.log });
17
29
  this.startTimer();
18
30
  }
19
31
  async send(entries) {
@@ -35,7 +47,9 @@ export class WebhookTransport {
35
47
  startTimer() {
36
48
  this.timer = setInterval(() => {
37
49
  if (this.batch.length > 0) {
38
- this.flushBatch().catch(() => { });
50
+ this.flushBatch().catch((error) => {
51
+ this.log.error('[WebhookTransport] timed flush threw', { error: String(error) });
52
+ });
39
53
  }
40
54
  }, this.config.batchIntervalMs);
41
55
  }
@@ -53,11 +67,19 @@ export class WebhookTransport {
53
67
  this.batch = [];
54
68
  try {
55
69
  await this.postEntries(entries);
70
+ const failed = this.postFailures.recover();
71
+ if (failed > 0)
72
+ this.log.info('[WebhookTransport] posts recovered', { failedPosts: failed });
56
73
  }
57
- catch {
58
- // Delegate to offline queue for retry. The error itself is deliberately
59
- // not inspected — every failure mode here has the same remedy, and the
60
- // queue is what carries the entries forward.
74
+ catch (error) {
75
+ // Delegate to offline queue for retry — every failure mode here has the
76
+ // same remedy, and the queue is what carries the entries forward.
77
+ if (this.postFailures.fail()) {
78
+ this.log.warn('[WebhookTransport] post failed; queued for retry', {
79
+ error: String(error),
80
+ entries: entries.length,
81
+ });
82
+ }
61
83
  this.offlineQueue.enqueue(entries);
62
84
  }
63
85
  finally {
@@ -78,13 +100,27 @@ export class WebhookTransport {
78
100
  });
79
101
  if (response.status >= 400 && response.status < 500) {
80
102
  // Client error — drop entries, retrying won't help
81
- console.warn(`[WebhookTransport] HTTP ${response.status}: dropping ${entries.length} entries`);
103
+ this.droppedEntries += entries.length;
104
+ if (this.rejections.fail()) {
105
+ this.log.error('[WebhookTransport] rejected by server; dropping entries', {
106
+ status: response.status,
107
+ entries: entries.length,
108
+ });
109
+ }
82
110
  return;
83
111
  }
84
112
  if (!response.ok) {
85
113
  // 5xx — throw to trigger offline queue retry
86
114
  throw new Error(`HTTP ${response.status}`);
87
115
  }
116
+ const rejected = this.rejections.recover();
117
+ if (rejected > 0) {
118
+ this.log.warn('[WebhookTransport] accepted again after rejections', {
119
+ rejectedBatches: rejected,
120
+ droppedEntries: this.droppedEntries,
121
+ });
122
+ this.droppedEntries = 0;
123
+ }
88
124
  }
89
125
  }
90
126
  //# sourceMappingURL=webhook.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"webhook.js","sourceRoot":"","sources":["../../src/transports/webhook.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"webhook.js","sourceRoot":"","sources":["../../src/transports/webhook.ts"],"names":[],"mappings":"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"}
package/dist/types.d.ts CHANGED
@@ -30,7 +30,10 @@ export interface RingBufferConfig {
30
30
  maxSize?: number;
31
31
  }
32
32
  export interface FileConfig {
33
+ /** Total size of the log directory; the oldest whole files go first. Default 5. */
33
34
  maxSizeMB?: number;
35
+ /** A file past this starts the next one in the same hour. Default 1024. */
36
+ maxFileSizeKB?: number;
34
37
  retentionDays?: number;
35
38
  directory?: string;
36
39
  }
@@ -51,5 +54,11 @@ export interface LoggerConfig {
51
54
  appVersion: string;
52
55
  updateId?: string;
53
56
  onException?: (error: Error, context?: Record<string, unknown>) => void;
57
+ /**
58
+ * Rewrites every entry before any transport sees it. Defaults to
59
+ * `defaultRedact` (secret-looking keys and emails masked); compose with it
60
+ * to add app rules, or pass `false` to log verbatim.
61
+ */
62
+ redact?: ((entry: LogEntry) => LogEntry) | false;
54
63
  }
55
64
  //# sourceMappingURL=types.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../src/types.ts"],"names":[],"mappings":"AAAA,MAAM,MAAM,QAAQ,GAAG,OAAO,GAAG,MAAM,GAAG,MAAM,GAAG,OAAO,CAAA;AAE1D,MAAM,WAAW,UAAU;IACzB,MAAM,CAAC,EAAE,MAAM,CAAA;IACf,SAAS,EAAE,MAAM,CAAA;IACjB,UAAU,CAAC,EAAE,MAAM,CAAA;IACnB,UAAU,EAAE,MAAM,CAAA;IAClB,QAAQ,CAAC,EAAE,MAAM,CAAA;IACjB,QAAQ,EAAE,KAAK,GAAG,SAAS,CAAA;IAC3B,QAAQ,CAAC,EAAE,MAAM,CAAA;CAClB;AAED,MAAM,WAAW,QAAQ;IACvB,EAAE,EAAE,MAAM,CAAA;IACV,SAAS,EAAE,MAAM,CAAA;IACjB,KAAK,EAAE,QAAQ,CAAA;IACf,OAAO,EAAE,MAAM,CAAA;IACf,IAAI,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAA;IAC9B,OAAO,EAAE,UAAU,CAAA;CACpB;AAED,MAAM,WAAW,SAAS;IACxB,KAAK,CAAC,EAAE,QAAQ,CAAA;IAChB,KAAK,CAAC,EAAE,IAAI,CAAA;IACZ,MAAM,CAAC,EAAE,MAAM,CAAA;IACf,KAAK,CAAC,EAAE,MAAM,CAAA;CACf;AAED,MAAM,WAAW,YAAY;IAC3B,IAAI,EAAE,MAAM,CAAA;IACZ,IAAI,EAAE,CAAC,OAAO,EAAE,QAAQ,EAAE,KAAK,OAAO,CAAC,IAAI,CAAC,CAAA;CAC7C;AAED,MAAM,WAAW,gBAAgB;IAC/B,OAAO,CAAC,EAAE,MAAM,CAAA;CACjB;AAED,MAAM,WAAW,UAAU;IACzB,SAAS,CAAC,EAAE,MAAM,CAAA;IAClB,aAAa,CAAC,EAAE,MAAM,CAAA;IACtB,SAAS,CAAC,EAAE,MAAM,CAAA;CACnB;AAED,MAAM,WAAW,aAAa;IAC5B,GAAG,EAAE,MAAM,CAAA;IACX,OAAO,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAA;IAChC,SAAS,CAAC,EAAE,MAAM,CAAA;IAClB,eAAe,CAAC,EAAE,MAAM,CAAA;IACxB,UAAU,CAAC,EAAE,MAAM,CAAA;IACnB,aAAa,CAAC,EAAE,CAAC,OAAO,EAAE,QAAQ,EAAE,KAAK,OAAO,CAAA;CACjD;AAED,MAAM,WAAW,YAAY;IAC3B,QAAQ,CAAC,EAAE,QAAQ,CAAA;IACnB,UAAU,CAAC,EAAE,gBAAgB,GAAG,OAAO,CAAA;IACvC,IAAI,CAAC,EAAE,UAAU,GAAG,OAAO,CAAA;IAC3B,OAAO,CAAC,EAAE,aAAa,CAAA;IACvB,UAAU,CAAC,EAAE,YAAY,EAAE,CAAA;IAC3B,UAAU,EAAE,MAAM,CAAA;IAClB,QAAQ,CAAC,EAAE,MAAM,CAAA;IACjB,WAAW,CAAC,EAAE,CAAC,KAAK,EAAE,KAAK,EAAE,OAAO,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,KAAK,IAAI,CAAA;CACxE"}
1
+ {"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../src/types.ts"],"names":[],"mappings":"AAAA,MAAM,MAAM,QAAQ,GAAG,OAAO,GAAG,MAAM,GAAG,MAAM,GAAG,OAAO,CAAA;AAE1D,MAAM,WAAW,UAAU;IACzB,MAAM,CAAC,EAAE,MAAM,CAAA;IACf,SAAS,EAAE,MAAM,CAAA;IACjB,UAAU,CAAC,EAAE,MAAM,CAAA;IACnB,UAAU,EAAE,MAAM,CAAA;IAClB,QAAQ,CAAC,EAAE,MAAM,CAAA;IACjB,QAAQ,EAAE,KAAK,GAAG,SAAS,CAAA;IAC3B,QAAQ,CAAC,EAAE,MAAM,CAAA;CAClB;AAED,MAAM,WAAW,QAAQ;IACvB,EAAE,EAAE,MAAM,CAAA;IACV,SAAS,EAAE,MAAM,CAAA;IACjB,KAAK,EAAE,QAAQ,CAAA;IACf,OAAO,EAAE,MAAM,CAAA;IACf,IAAI,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAA;IAC9B,OAAO,EAAE,UAAU,CAAA;CACpB;AAED,MAAM,WAAW,SAAS;IACxB,KAAK,CAAC,EAAE,QAAQ,CAAA;IAChB,KAAK,CAAC,EAAE,IAAI,CAAA;IACZ,MAAM,CAAC,EAAE,MAAM,CAAA;IACf,KAAK,CAAC,EAAE,MAAM,CAAA;CACf;AAED,MAAM,WAAW,YAAY;IAC3B,IAAI,EAAE,MAAM,CAAA;IACZ,IAAI,EAAE,CAAC,OAAO,EAAE,QAAQ,EAAE,KAAK,OAAO,CAAC,IAAI,CAAC,CAAA;CAC7C;AAED,MAAM,WAAW,gBAAgB;IAC/B,OAAO,CAAC,EAAE,MAAM,CAAA;CACjB;AAED,MAAM,WAAW,UAAU;IACzB,mFAAmF;IACnF,SAAS,CAAC,EAAE,MAAM,CAAA;IAClB,2EAA2E;IAC3E,aAAa,CAAC,EAAE,MAAM,CAAA;IACtB,aAAa,CAAC,EAAE,MAAM,CAAA;IACtB,SAAS,CAAC,EAAE,MAAM,CAAA;CACnB;AAED,MAAM,WAAW,aAAa;IAC5B,GAAG,EAAE,MAAM,CAAA;IACX,OAAO,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAA;IAChC,SAAS,CAAC,EAAE,MAAM,CAAA;IAClB,eAAe,CAAC,EAAE,MAAM,CAAA;IACxB,UAAU,CAAC,EAAE,MAAM,CAAA;IACnB,aAAa,CAAC,EAAE,CAAC,OAAO,EAAE,QAAQ,EAAE,KAAK,OAAO,CAAA;CACjD;AAED,MAAM,WAAW,YAAY;IAC3B,QAAQ,CAAC,EAAE,QAAQ,CAAA;IACnB,UAAU,CAAC,EAAE,gBAAgB,GAAG,OAAO,CAAA;IACvC,IAAI,CAAC,EAAE,UAAU,GAAG,OAAO,CAAA;IAC3B,OAAO,CAAC,EAAE,aAAa,CAAA;IACvB,UAAU,CAAC,EAAE,YAAY,EAAE,CAAA;IAC3B,UAAU,EAAE,MAAM,CAAA;IAClB,QAAQ,CAAC,EAAE,MAAM,CAAA;IACjB,WAAW,CAAC,EAAE,CAAC,KAAK,EAAE,KAAK,EAAE,OAAO,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,KAAK,IAAI,CAAA;IACvE;;;;OAIG;IACH,MAAM,CAAC,EAAE,CAAC,CAAC,KAAK,EAAE,QAAQ,KAAK,QAAQ,CAAC,GAAG,KAAK,CAAA;CACjD"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@mongrov/core",
3
- "version": "0.5.1",
3
+ "version": "0.7.0",
4
4
  "description": "Structured logging for React Native / Expo — ring buffer, file, and webhook transports with offline queue. Includes dev-tools UI components.",
5
5
  "license": "MIT",
6
6
  "repository": {