lograil 0.1.0 → 0.1.4
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/CHANGELOG.md +105 -1
- package/README.md +3 -1
- package/dist/cjs/context/async-context.browser.d.ts +1 -7
- package/dist/cjs/context/async-context.browser.d.ts.map +1 -1
- package/dist/cjs/context/async-context.browser.js +4 -1
- package/dist/cjs/context/async-context.browser.js.map +1 -1
- package/dist/cjs/context/context.js +1 -1
- package/dist/cjs/context/context.js.map +1 -1
- package/dist/cjs/core/logger.d.ts +20 -16
- package/dist/cjs/core/logger.d.ts.map +1 -1
- package/dist/cjs/core/logger.js +115 -48
- package/dist/cjs/core/logger.js.map +1 -1
- package/dist/cjs/pipeline/formatter.d.ts.map +1 -1
- package/dist/cjs/pipeline/formatter.js +64 -31
- package/dist/cjs/pipeline/formatter.js.map +1 -1
- package/dist/cjs/pipeline/pipeline.d.ts.map +1 -1
- package/dist/cjs/pipeline/pipeline.js +2 -1
- package/dist/cjs/pipeline/pipeline.js.map +1 -1
- package/dist/cjs/pipeline/processor.d.ts.map +1 -1
- package/dist/cjs/pipeline/processor.js +18 -6
- package/dist/cjs/pipeline/processor.js.map +1 -1
- package/dist/cjs/pipeline/sampler.d.ts.map +1 -1
- package/dist/cjs/pipeline/sampler.js +5 -0
- package/dist/cjs/pipeline/sampler.js.map +1 -1
- package/dist/cjs/plugin/manager.d.ts.map +1 -1
- package/dist/cjs/plugin/manager.js +9 -1
- package/dist/cjs/plugin/manager.js.map +1 -1
- package/dist/cjs/plugin/otel-trace.d.ts.map +1 -1
- package/dist/cjs/plugin/otel-trace.js +4 -7
- package/dist/cjs/plugin/otel-trace.js.map +1 -1
- package/dist/cjs/runtime/electron-binding.d.ts +4 -0
- package/dist/cjs/runtime/electron-binding.d.ts.map +1 -1
- package/dist/cjs/runtime/electron-binding.js +24 -2
- package/dist/cjs/runtime/electron-binding.js.map +1 -1
- package/dist/cjs/runtime/electron.d.ts.map +1 -1
- package/dist/cjs/runtime/electron.js +7 -1
- package/dist/cjs/runtime/electron.js.map +1 -1
- package/dist/cjs/runtime/process-lifecycle.d.ts.map +1 -1
- package/dist/cjs/runtime/process-lifecycle.js +11 -0
- package/dist/cjs/runtime/process-lifecycle.js.map +1 -1
- package/dist/cjs/transport/cluster-ipc.d.ts +2 -0
- package/dist/cjs/transport/cluster-ipc.d.ts.map +1 -1
- package/dist/cjs/transport/cluster-ipc.js +53 -5
- package/dist/cjs/transport/cluster-ipc.js.map +1 -1
- package/dist/cjs/transport/console.d.ts.map +1 -1
- package/dist/cjs/transport/console.js +10 -9
- package/dist/cjs/transport/console.js.map +1 -1
- package/dist/cjs/transport/electron-ipc.d.ts +4 -17
- package/dist/cjs/transport/electron-ipc.d.ts.map +1 -1
- package/dist/cjs/transport/electron-ipc.js +42 -73
- package/dist/cjs/transport/electron-ipc.js.map +1 -1
- package/dist/cjs/transport/file.d.ts +10 -4
- package/dist/cjs/transport/file.d.ts.map +1 -1
- package/dist/cjs/transport/file.js +28 -8
- package/dist/cjs/transport/file.js.map +1 -1
- package/dist/cjs/transport/live.d.ts +2 -1
- package/dist/cjs/transport/live.d.ts.map +1 -1
- package/dist/cjs/transport/live.js +4 -1
- package/dist/cjs/transport/live.js.map +1 -1
- package/dist/cjs/transport/otlp.d.ts +1 -1
- package/dist/cjs/transport/otlp.d.ts.map +1 -1
- package/dist/cjs/transport/otlp.js +24 -21
- package/dist/cjs/transport/otlp.js.map +1 -1
- package/dist/cjs/transport/worker-ipc.d.ts +3 -0
- package/dist/cjs/transport/worker-ipc.d.ts.map +1 -1
- package/dist/cjs/transport/worker-ipc.js +76 -8
- package/dist/cjs/transport/worker-ipc.js.map +1 -1
- package/dist/cjs/types.d.ts +16 -5
- package/dist/cjs/types.d.ts.map +1 -1
- package/dist/cjs/types.js +5 -1
- package/dist/cjs/types.js.map +1 -1
- package/dist/esm/context/async-context.browser.d.ts +1 -7
- package/dist/esm/context/async-context.browser.d.ts.map +1 -1
- package/dist/esm/context/async-context.browser.js +4 -1
- package/dist/esm/context/async-context.browser.js.map +1 -1
- package/dist/esm/context/context.js +1 -1
- package/dist/esm/context/context.js.map +1 -1
- package/dist/esm/core/logger.d.ts +20 -16
- package/dist/esm/core/logger.d.ts.map +1 -1
- package/dist/esm/core/logger.js +115 -48
- package/dist/esm/core/logger.js.map +1 -1
- package/dist/esm/pipeline/formatter.d.ts.map +1 -1
- package/dist/esm/pipeline/formatter.js +64 -31
- package/dist/esm/pipeline/formatter.js.map +1 -1
- package/dist/esm/pipeline/pipeline.d.ts.map +1 -1
- package/dist/esm/pipeline/pipeline.js +2 -1
- package/dist/esm/pipeline/pipeline.js.map +1 -1
- package/dist/esm/pipeline/processor.d.ts.map +1 -1
- package/dist/esm/pipeline/processor.js +18 -6
- package/dist/esm/pipeline/processor.js.map +1 -1
- package/dist/esm/pipeline/sampler.d.ts.map +1 -1
- package/dist/esm/pipeline/sampler.js +5 -0
- package/dist/esm/pipeline/sampler.js.map +1 -1
- package/dist/esm/plugin/manager.d.ts.map +1 -1
- package/dist/esm/plugin/manager.js +9 -1
- package/dist/esm/plugin/manager.js.map +1 -1
- package/dist/esm/plugin/otel-trace.d.ts.map +1 -1
- package/dist/esm/plugin/otel-trace.js +4 -7
- package/dist/esm/plugin/otel-trace.js.map +1 -1
- package/dist/esm/runtime/electron-binding.d.ts +4 -0
- package/dist/esm/runtime/electron-binding.d.ts.map +1 -1
- package/dist/esm/runtime/electron-binding.js +24 -2
- package/dist/esm/runtime/electron-binding.js.map +1 -1
- package/dist/esm/runtime/electron.d.ts.map +1 -1
- package/dist/esm/runtime/electron.js +7 -1
- package/dist/esm/runtime/electron.js.map +1 -1
- package/dist/esm/runtime/process-lifecycle.d.ts.map +1 -1
- package/dist/esm/runtime/process-lifecycle.js +11 -0
- package/dist/esm/runtime/process-lifecycle.js.map +1 -1
- package/dist/esm/transport/cluster-ipc.d.ts +2 -0
- package/dist/esm/transport/cluster-ipc.d.ts.map +1 -1
- package/dist/esm/transport/cluster-ipc.js +52 -5
- package/dist/esm/transport/cluster-ipc.js.map +1 -1
- package/dist/esm/transport/console.d.ts.map +1 -1
- package/dist/esm/transport/console.js +10 -9
- package/dist/esm/transport/console.js.map +1 -1
- package/dist/esm/transport/electron-ipc.d.ts +4 -17
- package/dist/esm/transport/electron-ipc.d.ts.map +1 -1
- package/dist/esm/transport/electron-ipc.js +42 -71
- package/dist/esm/transport/electron-ipc.js.map +1 -1
- package/dist/esm/transport/file.d.ts +10 -4
- package/dist/esm/transport/file.d.ts.map +1 -1
- package/dist/esm/transport/file.js +28 -8
- package/dist/esm/transport/file.js.map +1 -1
- package/dist/esm/transport/live.d.ts +2 -1
- package/dist/esm/transport/live.d.ts.map +1 -1
- package/dist/esm/transport/live.js +4 -1
- package/dist/esm/transport/live.js.map +1 -1
- package/dist/esm/transport/otlp.d.ts +1 -1
- package/dist/esm/transport/otlp.d.ts.map +1 -1
- package/dist/esm/transport/otlp.js +24 -21
- package/dist/esm/transport/otlp.js.map +1 -1
- package/dist/esm/transport/worker-ipc.d.ts +3 -0
- package/dist/esm/transport/worker-ipc.d.ts.map +1 -1
- package/dist/esm/transport/worker-ipc.js +75 -8
- package/dist/esm/transport/worker-ipc.js.map +1 -1
- package/dist/esm/types.d.ts +16 -5
- package/dist/esm/types.d.ts.map +1 -1
- package/dist/esm/types.js +5 -1
- package/dist/esm/types.js.map +1 -1
- package/package.json +12 -3
- package/dist/cjs/transport/rotating-file.d.ts +0 -67
- package/dist/cjs/transport/rotating-file.d.ts.map +0 -1
- package/dist/cjs/transport/rotating-file.js +0 -179
- package/dist/cjs/transport/rotating-file.js.map +0 -1
- package/dist/esm/transport/rotating-file.d.ts +0 -67
- package/dist/esm/transport/rotating-file.d.ts.map +0 -1
- package/dist/esm/transport/rotating-file.js +0 -175
- package/dist/esm/transport/rotating-file.js.map +0 -1
|
@@ -12,6 +12,10 @@ export declare function isElectronProcess(): boolean;
|
|
|
12
12
|
* that performs `require('electron')`, so a web bundler can swap this whole
|
|
13
13
|
* module for `electron-binding.browser` (via package.json `browser`) and never
|
|
14
14
|
* touch the Electron binary.
|
|
15
|
+
*
|
|
16
|
+
* When the electron binary is absent (e.g. test environments with
|
|
17
|
+
* `ELECTRON_SKIP_BINARY_DOWNLOAD=1`), returns a minimal stub so the rest of
|
|
18
|
+
* the API remains callable without crashing.
|
|
15
19
|
*/
|
|
16
20
|
export declare function getElectron(): ElectronModule;
|
|
17
21
|
/**
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"electron-binding.d.ts","sourceRoot":"","sources":["../../../src/runtime/electron-binding.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,GAAG,EAAE,MAAM,UAAU,CAAC;AAEpC;;;;GAIG;AACH,MAAM,MAAM,cAAc,GAAG,OAAO,QAAQ,CAAC,mBAAmB,CAAC;AAIjE,oDAAoD;AACpD,wBAAgB,iBAAiB,IAAI,OAAO,CAK3C;AAED
|
|
1
|
+
{"version":3,"file":"electron-binding.d.ts","sourceRoot":"","sources":["../../../src/runtime/electron-binding.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,GAAG,EAAE,MAAM,UAAU,CAAC;AAEpC;;;;GAIG;AACH,MAAM,MAAM,cAAc,GAAG,OAAO,QAAQ,CAAC,mBAAmB,CAAC;AAIjE,oDAAoD;AACpD,wBAAgB,iBAAiB,IAAI,OAAO,CAK3C;AAED;;;;;;;;;GASG;AACH,wBAAgB,WAAW,IAAI,cAAc,CA+B5C;AAED;;;;;GAKG;AACH,wBAAgB,cAAc,IAAI,GAAG,GAAG,SAAS,CAOhD"}
|
|
@@ -14,6 +14,10 @@ function isElectronProcess() {
|
|
|
14
14
|
* that performs `require('electron')`, so a web bundler can swap this whole
|
|
15
15
|
* module for `electron-binding.browser` (via package.json `browser`) and never
|
|
16
16
|
* touch the Electron binary.
|
|
17
|
+
*
|
|
18
|
+
* When the electron binary is absent (e.g. test environments with
|
|
19
|
+
* `ELECTRON_SKIP_BINARY_DOWNLOAD=1`), returns a minimal stub so the rest of
|
|
20
|
+
* the API remains callable without crashing.
|
|
17
21
|
*/
|
|
18
22
|
function getElectron() {
|
|
19
23
|
if (cached !== undefined) {
|
|
@@ -26,8 +30,26 @@ function getElectron() {
|
|
|
26
30
|
cached = null;
|
|
27
31
|
throw new Error('electron is only available inside an Electron process');
|
|
28
32
|
}
|
|
29
|
-
|
|
30
|
-
|
|
33
|
+
try {
|
|
34
|
+
// eslint-disable-next-line @typescript-eslint/no-require-imports
|
|
35
|
+
cached = require('electron');
|
|
36
|
+
}
|
|
37
|
+
catch {
|
|
38
|
+
// Electron binary not installed (e.g. ELECTRON_SKIP_BINARY_DOWNLOAD=1).
|
|
39
|
+
// Return a minimal stub so the library does not crash at runtime.
|
|
40
|
+
cached = {
|
|
41
|
+
ipcRenderer: { send() { } },
|
|
42
|
+
ipcMain: { on() { }, removeListener() { } },
|
|
43
|
+
app: {
|
|
44
|
+
getPath() {
|
|
45
|
+
return '/tmp';
|
|
46
|
+
},
|
|
47
|
+
on() { },
|
|
48
|
+
removeAllListeners() { },
|
|
49
|
+
},
|
|
50
|
+
};
|
|
51
|
+
return cached;
|
|
52
|
+
}
|
|
31
53
|
return cached;
|
|
32
54
|
}
|
|
33
55
|
/**
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"electron-binding.js","sourceRoot":"","sources":["../../../src/runtime/electron-binding.ts"],"names":[],"mappings":";;AAYA,8CAKC;
|
|
1
|
+
{"version":3,"file":"electron-binding.js","sourceRoot":"","sources":["../../../src/runtime/electron-binding.ts"],"names":[],"mappings":";;AAYA,8CAKC;AAYD,kCA+BC;AAQD,wCAOC;AAlED,IAAI,MAAyC,CAAC;AAE9C,oDAAoD;AACpD,SAAgB,iBAAiB;IAC/B,OAAO,CACL,OAAO,OAAO,KAAK,WAAW;QAC9B,CAAC,CAAE,OAAgD,CAAC,QAAQ,EAAE,QAAQ,CACvE,CAAC;AACJ,CAAC;AAED;;;;;;;;;GASG;AACH,SAAgB,WAAW;IACzB,IAAI,MAAM,KAAK,SAAS,EAAE,CAAC;QACzB,IAAI,MAAM,KAAK,IAAI,EAAE,CAAC;YACpB,MAAM,IAAI,KAAK,CAAC,uDAAuD,CAAC,CAAC;QAC3E,CAAC;QACD,OAAO,MAAM,CAAC;IAChB,CAAC;IACD,IAAI,CAAC,iBAAiB,EAAE,EAAE,CAAC;QACzB,MAAM,GAAG,IAAI,CAAC;QACd,MAAM,IAAI,KAAK,CAAC,uDAAuD,CAAC,CAAC;IAC3E,CAAC;IACD,IAAI,CAAC;QACH,iEAAiE;QACjE,MAAM,GAAG,OAAO,CAAC,UAAU,CAAmB,CAAC;IACjD,CAAC;IAAC,MAAM,CAAC;QACP,wEAAwE;QACxE,kEAAkE;QAClE,MAAM,GAAG;YACP,WAAW,EAAE,EAAE,IAAI,KAAI,CAAC,EAAE;YAC1B,OAAO,EAAE,EAAE,EAAE,KAAI,CAAC,EAAE,cAAc,KAAI,CAAC,EAAE;YACzC,GAAG,EAAE;gBACH,OAAO;oBACL,OAAO,MAAM,CAAC;gBAChB,CAAC;gBACD,EAAE,KAAI,CAAC;gBACP,kBAAkB,KAAI,CAAC;aACxB;SAC2B,CAAC;QAC/B,OAAO,MAAM,CAAC;IAChB,CAAC;IACD,OAAO,MAAM,CAAC;AAChB,CAAC;AAED;;;;;GAKG;AACH,SAAgB,cAAc;IAC5B,IAAI,CAAC,iBAAiB,EAAE;QAAE,OAAO,SAAS,CAAC;IAC3C,IAAI,CAAC;QACH,OAAO,WAAW,EAAE,CAAC,GAAG,CAAC;IAC3B,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,SAAS,CAAC;IACnB,CAAC;AACH,CAAC"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"electron.d.ts","sourceRoot":"","sources":["../../../src/runtime/electron.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,cAAc,CAAC;AAEnD,OAAO,KAAK,EAAE,0BAA0B,EAAE,MAAM,oBAAoB,CAAC;AAErE,OAAO,KAAK,EAAE,8BAA8B,EAAE,MAAM,wBAAwB,CAAC;AAE7E,OAAO,EAAE,yBAAyB,EAAE,MAAM,oBAAoB,CAAC;AAC/D,YAAY,EAAE,0BAA0B,EAAE,MAAM,oBAAoB,CAAC;AACrE,OAAO,EAAE,6BAA6B,EAAE,MAAM,wBAAwB,CAAC;AACvE,YAAY,EAAE,8BAA8B,EAAE,MAAM,wBAAwB,CAAC;AAE7E;;;;GAIG;AACH,MAAM,MAAM,sBAAsB,GAAG,0BAA0B,GAAG,8BAA8B,CAAC;AAWjG;;;;GAIG;AACH,wBAAgB,qBAAqB,CAAC,OAAO,GAAE,sBAA2B,GAAG,cAAc,
|
|
1
|
+
{"version":3,"file":"electron.d.ts","sourceRoot":"","sources":["../../../src/runtime/electron.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,cAAc,CAAC;AAEnD,OAAO,KAAK,EAAE,0BAA0B,EAAE,MAAM,oBAAoB,CAAC;AAErE,OAAO,KAAK,EAAE,8BAA8B,EAAE,MAAM,wBAAwB,CAAC;AAE7E,OAAO,EAAE,yBAAyB,EAAE,MAAM,oBAAoB,CAAC;AAC/D,YAAY,EAAE,0BAA0B,EAAE,MAAM,oBAAoB,CAAC;AACrE,OAAO,EAAE,6BAA6B,EAAE,MAAM,wBAAwB,CAAC;AACvE,YAAY,EAAE,8BAA8B,EAAE,MAAM,wBAAwB,CAAC;AAE7E;;;;GAIG;AACH,MAAM,MAAM,sBAAsB,GAAG,0BAA0B,GAAG,8BAA8B,CAAC;AAWjG;;;;GAIG;AACH,wBAAgB,qBAAqB,CAAC,OAAO,GAAE,sBAA2B,GAAG,cAAc,CAW1F"}
|
|
@@ -22,6 +22,12 @@ function isMainProcess() {
|
|
|
22
22
|
function createElectronRuntime(options = {}) {
|
|
23
23
|
return isMainProcess()
|
|
24
24
|
? (0, electron_main_js_1.createElectronMainRuntime)(options)
|
|
25
|
-
: (0, electron_renderer_js_1.createElectronRendererRuntime)(
|
|
25
|
+
: (0, electron_renderer_js_1.createElectronRendererRuntime)({
|
|
26
|
+
ipcRenderer: typeof require === 'function'
|
|
27
|
+
? // eslint-disable-next-line
|
|
28
|
+
require('electron').ipcRenderer
|
|
29
|
+
: undefined,
|
|
30
|
+
...options,
|
|
31
|
+
});
|
|
26
32
|
}
|
|
27
33
|
//# sourceMappingURL=electron.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"electron.js","sourceRoot":"","sources":["../../../src/runtime/electron.ts"],"names":[],"mappings":";;;AAgCA,
|
|
1
|
+
{"version":3,"file":"electron.js","sourceRoot":"","sources":["../../../src/runtime/electron.ts"],"names":[],"mappings":";;;AAgCA,sDAWC;AA1CD,yDAA+D;AAE/D,iEAAuE;AAGvE,uDAA+D;AAAtD,6HAAA,yBAAyB,OAAA;AAElC,+DAAuE;AAA9D,qIAAA,6BAA6B,OAAA;AAUtC,SAAS,aAAa;IACpB,yEAAyE;IACzE,wEAAwE;IACxE,wDAAwD;IACxD,OAAO,CACL,OAAO,OAAO,KAAK,WAAW,IAAK,OAAwC,CAAC,IAAI,KAAK,UAAU,CAChG,CAAC;AACJ,CAAC;AAED;;;;GAIG;AACH,SAAgB,qBAAqB,CAAC,UAAkC,EAAE;IACxE,OAAO,aAAa,EAAE;QACpB,CAAC,CAAC,IAAA,4CAAyB,EAAC,OAAO,CAAC;QACpC,CAAC,CAAC,IAAA,oDAA6B,EAAC;YAC5B,WAAW,EACT,OAAO,OAAO,KAAK,UAAU;gBAC3B,CAAC,CAAC,2BAA2B;oBAC3B,OAAO,CAAC,UAAU,CAAC,CAAC,WAAW;gBACjC,CAAC,CAAC,SAAS;YACf,GAAG,OAAO;SACX,CAAC,CAAC;AACT,CAAC"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"process-lifecycle.d.ts","sourceRoot":"","sources":["../../../src/runtime/process-lifecycle.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,cAAc,CAAC;AAgBnD;;;;;;;;;GASG;AACH,wBAAgB,sBAAsB,IAAI,cAAc,
|
|
1
|
+
{"version":3,"file":"process-lifecycle.d.ts","sourceRoot":"","sources":["../../../src/runtime/process-lifecycle.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,cAAc,CAAC;AAgBnD;;;;;;;;;GASG;AACH,wBAAgB,sBAAsB,IAAI,cAAc,CAsEvD"}
|
|
@@ -46,10 +46,21 @@ function createProcessLifecycle() {
|
|
|
46
46
|
proc.on('beforeExit', onBeforeExit);
|
|
47
47
|
proc.on('SIGINT', onSigInt);
|
|
48
48
|
proc.on('SIGTERM', onSigTerm);
|
|
49
|
+
// Windows does not emit `SIGTERM`. Register `SIGBREAK` (Ctrl+Break) as a
|
|
50
|
+
// best-effort fallback so `autoFlushOnExit` has a signal hook on that
|
|
51
|
+
// platform. In practice taskkill / OS shutdown kills without emitting any
|
|
52
|
+
// Node signal, so no handler can cover that path — the `beforeExit` hook
|
|
53
|
+
// is the only portable shutdown flush mechanism.
|
|
54
|
+
if (process.platform === 'win32') {
|
|
55
|
+
proc.on('SIGBREAK', onSigInt);
|
|
56
|
+
}
|
|
49
57
|
return () => {
|
|
50
58
|
proc.removeListener('beforeExit', onBeforeExit);
|
|
51
59
|
proc.removeListener('SIGINT', onSigInt);
|
|
52
60
|
proc.removeListener('SIGTERM', onSigTerm);
|
|
61
|
+
if (process.platform === 'win32') {
|
|
62
|
+
proc.removeListener('SIGBREAK', onSigInt);
|
|
63
|
+
}
|
|
53
64
|
};
|
|
54
65
|
},
|
|
55
66
|
onUncaughtError(cb) {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"process-lifecycle.js","sourceRoot":"","sources":["../../../src/runtime/process-lifecycle.ts"],"names":[],"mappings":";;AA0BA,
|
|
1
|
+
{"version":3,"file":"process-lifecycle.js","sourceRoot":"","sources":["../../../src/runtime/process-lifecycle.ts"],"names":[],"mappings":"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"}
|
|
@@ -33,4 +33,6 @@ export interface ClusterReceiverOptions {
|
|
|
33
33
|
export declare function registerClusterReceiver(ingest: (entry: LogEntry) => void, options?: ClusterReceiverOptions & {
|
|
34
34
|
onLevelCommand?: (level: number) => void;
|
|
35
35
|
}): () => void;
|
|
36
|
+
/** Reset internal state for testing. */
|
|
37
|
+
export declare function _resetClusterReceiverState(): void;
|
|
36
38
|
//# sourceMappingURL=cluster-ipc.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"cluster-ipc.d.ts","sourceRoot":"","sources":["../../../src/transport/cluster-ipc.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,aAAa,CAAC;AAC5C,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,gBAAgB,CAAC;
|
|
1
|
+
{"version":3,"file":"cluster-ipc.d.ts","sourceRoot":"","sources":["../../../src/transport/cluster-ipc.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,aAAa,CAAC;AAC5C,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,gBAAgB,CAAC;AAShD,8DAA8D;AAC9D,eAAO,MAAM,mBAAmB,wBAAwB,CAAC;AACzD,MAAM,WAAW,0BAA0B;IACzC,qDAAqD;IACrD,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,sBAAsB;IACtB,IAAI,CAAC,EAAE,MAAM,CAAC;CACf;AACD;;;;GAIG;AACH,qBAAa,mBAAoB,YAAW,SAAS;IACnD,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;gBACV,OAAO,GAAE,0BAA+B;IAGpD,KAAK,CAAC,KAAK,EAAE,QAAQ,EAAE,UAAU,EAAE,MAAM,GAAG,IAAI;IAkBhD,iEAAiE;IACjE,gBAAgB,CAAC,KAAK,EAAE,MAAM,GAAG,IAAI;CAatC;AACD,MAAM,WAAW,sBAAsB;IACrC,iFAAiF;IACjF,OAAO,CAAC,EAAE,MAAM,CAAC;CAClB;AAmBD;;;;;GAKG;AACH,wBAAgB,uBAAuB,CACrC,MAAM,EAAE,CAAC,KAAK,EAAE,QAAQ,KAAK,IAAI,EACjC,OAAO,GAAE,sBAAsB,GAAG;IAAE,cAAc,CAAC,EAAE,CAAC,KAAK,EAAE,MAAM,KAAK,IAAI,CAAA;CAAO,GAClF,MAAM,IAAI,CA+CZ;AACD,wCAAwC;AACxC,wBAAgB,0BAA0B,IAAI,IAAI,CAKjD"}
|
|
@@ -2,7 +2,12 @@
|
|
|
2
2
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
3
|
exports.ClusterIpcTransport = exports.CLUSTER_IPC_CHANNEL = void 0;
|
|
4
4
|
exports.registerClusterReceiver = registerClusterReceiver;
|
|
5
|
+
exports._resetClusterReceiverState = _resetClusterReceiverState;
|
|
5
6
|
const types_js_1 = require("../types.js");
|
|
7
|
+
// Captured at module load so error reporting never recurses into itself.
|
|
8
|
+
const RAW_CONSOLE_ERROR = typeof console !== 'undefined' && typeof console.error === 'function'
|
|
9
|
+
? console.error.bind(console)
|
|
10
|
+
: () => { };
|
|
6
11
|
/** IPC channel for cluster worker → primary communication. */
|
|
7
12
|
exports.CLUSTER_IPC_CHANNEL = 'lograil:cluster:log';
|
|
8
13
|
/**
|
|
@@ -20,7 +25,9 @@ class ClusterIpcTransport {
|
|
|
20
25
|
if (typeof proc.send === 'function') {
|
|
21
26
|
proc.send(entry, (err) => {
|
|
22
27
|
if (err) {
|
|
23
|
-
|
|
28
|
+
// Primary gone or channel closed — surface the error so users can
|
|
29
|
+
// detect cluster worker communication failures.
|
|
30
|
+
RAW_CONSOLE_ERROR('[lograil] cluster-ipc primary unreachable:', err);
|
|
24
31
|
}
|
|
25
32
|
});
|
|
26
33
|
}
|
|
@@ -44,6 +51,19 @@ class ClusterIpcTransport {
|
|
|
44
51
|
}
|
|
45
52
|
}
|
|
46
53
|
exports.ClusterIpcTransport = ClusterIpcTransport;
|
|
54
|
+
/**
|
|
55
|
+
* Shared dedup state on globalThis so that multiple bundled copies of this
|
|
56
|
+
* module all share the same registration flag and callbacks.
|
|
57
|
+
*/
|
|
58
|
+
const _DEDUP_CLUSTER = Symbol('lograil:cluster-ipc:dedup');
|
|
59
|
+
function _getClusterState() {
|
|
60
|
+
if (typeof globalThis !== 'undefined' && _DEDUP_CLUSTER in globalThis)
|
|
61
|
+
return globalThis[_DEDUP_CLUSTER];
|
|
62
|
+
const s = { registered: false, ingest: null, onLevelCommand: null };
|
|
63
|
+
if (typeof globalThis !== 'undefined')
|
|
64
|
+
globalThis[_DEDUP_CLUSTER] = s;
|
|
65
|
+
return s;
|
|
66
|
+
}
|
|
47
67
|
/**
|
|
48
68
|
* Primary-side helper: listen on the cluster IPC channel and feed received
|
|
49
69
|
* worker entries into the provided `ingest` callback (typically
|
|
@@ -55,22 +75,50 @@ function registerClusterReceiver(ingest, options = {}) {
|
|
|
55
75
|
const proc = process;
|
|
56
76
|
if (!proc.on || !proc.removeListener)
|
|
57
77
|
return () => { };
|
|
78
|
+
// Guard against duplicate registration on the same process.
|
|
79
|
+
// Use globalThis-based state so multiple bundled copies share the same flag.
|
|
80
|
+
const state = _getClusterState();
|
|
81
|
+
if (state.registered) {
|
|
82
|
+
// Update the callback so the existing handler processes new loggers
|
|
83
|
+
state.ingest = ingest;
|
|
84
|
+
state.onLevelCommand = onLevelCommand ?? null;
|
|
85
|
+
return () => {
|
|
86
|
+
if (state.ingest === ingest) {
|
|
87
|
+
state.ingest = null;
|
|
88
|
+
state.onLevelCommand = null;
|
|
89
|
+
}
|
|
90
|
+
};
|
|
91
|
+
}
|
|
92
|
+
state.registered = true;
|
|
93
|
+
state.ingest = ingest;
|
|
94
|
+
state.onLevelCommand = onLevelCommand ?? null;
|
|
58
95
|
const handler = (message) => {
|
|
59
|
-
if ((0, types_js_1.isLogLevelCommand)(message)) {
|
|
60
|
-
onLevelCommand
|
|
96
|
+
if (state.onLevelCommand && (0, types_js_1.isLogLevelCommand)(message)) {
|
|
97
|
+
state.onLevelCommand((0, types_js_1.normalizeLevel)(message.level));
|
|
61
98
|
return;
|
|
62
99
|
}
|
|
63
|
-
if (
|
|
100
|
+
if (state.ingest &&
|
|
101
|
+
message &&
|
|
64
102
|
typeof message === 'object' &&
|
|
65
103
|
'level' in message &&
|
|
66
104
|
'message' in message &&
|
|
67
105
|
'timestamp' in message) {
|
|
68
|
-
ingest(message);
|
|
106
|
+
state.ingest(message);
|
|
69
107
|
}
|
|
70
108
|
};
|
|
71
109
|
proc.on('message', handler);
|
|
72
110
|
return () => {
|
|
111
|
+
state.registered = false;
|
|
112
|
+
state.ingest = null;
|
|
113
|
+
state.onLevelCommand = null;
|
|
73
114
|
proc.removeListener?.('message', handler);
|
|
74
115
|
};
|
|
75
116
|
}
|
|
117
|
+
/** Reset internal state for testing. */
|
|
118
|
+
function _resetClusterReceiverState() {
|
|
119
|
+
const state = _getClusterState();
|
|
120
|
+
state.registered = false;
|
|
121
|
+
state.ingest = null;
|
|
122
|
+
state.onLevelCommand = null;
|
|
123
|
+
}
|
|
76
124
|
//# sourceMappingURL=cluster-ipc.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"cluster-ipc.js","sourceRoot":"","sources":["../../../src/transport/cluster-ipc.ts"],"names":[],"mappings":";;;
|
|
1
|
+
{"version":3,"file":"cluster-ipc.js","sourceRoot":"","sources":["../../../src/transport/cluster-ipc.ts"],"names":[],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"console.d.ts","sourceRoot":"","sources":["../../../src/transport/console.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,QAAQ,EAAE,YAAY,EAAE,MAAM,aAAa,CAAC;AAC1D,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,0BAA0B,CAAC;AAE1D,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,gBAAgB,CAAC;
|
|
1
|
+
{"version":3,"file":"console.d.ts","sourceRoot":"","sources":["../../../src/transport/console.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,QAAQ,EAAE,YAAY,EAAE,MAAM,aAAa,CAAC;AAC1D,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,0BAA0B,CAAC;AAE1D,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,gBAAgB,CAAC;AAwBhD,MAAM,WAAW,uBAAuB;IACtC,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,SAAS,CAAC,EAAE,SAAS,CAAC;IACtB,8CAA8C;IAC9C,SAAS,CAAC,EAAE,OAAO,CAAC,MAAM,CAAC,MAAM,EAAE,CAAC,GAAG,IAAI,EAAE,OAAO,EAAE,KAAK,IAAI,CAAC,CAAC,CAAC;IAClE;;;;;OAKG;IACH,YAAY,CAAC,EAAE,YAAY,EAAE,CAAC;CAC/B;AAED;;;GAGG;AACH,qBAAa,gBAAiB,YAAW,SAAS;IAChD,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;IACtB,QAAQ,CAAC,SAAS,EAAE,SAAS,CAAC;IAE9B,OAAO,CAAC,SAAS,CAA+C;gBAEpD,OAAO,GAAE,uBAA4B;IAiBjD,KAAK,CAAC,KAAK,EAAE,QAAQ,EAAE,SAAS,EAAE,MAAM,GAAG,IAAI;CAIhD"}
|
|
@@ -13,6 +13,15 @@ const realConsole = {
|
|
|
13
13
|
error: console.error.bind(console),
|
|
14
14
|
log: console.log.bind(console),
|
|
15
15
|
};
|
|
16
|
+
/** Default method mapping shared across all ConsoleTransport instances. */
|
|
17
|
+
const DEFAULT_METHOD_MAP = {
|
|
18
|
+
trace: realConsole.trace,
|
|
19
|
+
debug: realConsole.debug,
|
|
20
|
+
info: realConsole.info,
|
|
21
|
+
warn: realConsole.warn,
|
|
22
|
+
error: realConsole.error,
|
|
23
|
+
fatal: realConsole.error,
|
|
24
|
+
};
|
|
16
25
|
/**
|
|
17
26
|
* Writes log entries to the global `console`. Suitable for both Web and
|
|
18
27
|
* Node/Electron runtimes.
|
|
@@ -21,15 +30,7 @@ class ConsoleTransport {
|
|
|
21
30
|
constructor(options = {}) {
|
|
22
31
|
this.name = options.name ?? 'console';
|
|
23
32
|
this.formatter = options.formatter ?? (0, formatter_js_1.createLineFormatter)();
|
|
24
|
-
this.methodMap = {
|
|
25
|
-
trace: realConsole.trace,
|
|
26
|
-
debug: realConsole.debug,
|
|
27
|
-
info: realConsole.info,
|
|
28
|
-
warn: realConsole.warn,
|
|
29
|
-
error: realConsole.error,
|
|
30
|
-
fatal: realConsole.error,
|
|
31
|
-
...options.methodMap,
|
|
32
|
-
};
|
|
33
|
+
this.methodMap = { ...DEFAULT_METHOD_MAP, ...options.methodMap };
|
|
33
34
|
// Route the requested levels to stderr (console.error). Applied after
|
|
34
35
|
// `methodMap` so an explicitly provided method for a level is not silently
|
|
35
36
|
// overridden. Defaults to empty — the default `methodMap` already sends
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"console.js","sourceRoot":"","sources":["../../../src/transport/console.ts"],"names":[],"mappings":";;;AAEA,2DAA+D;AAG/D,8EAA8E;AAC9E,4EAA4E;AAC5E,sEAAsE;AACtE,MAAM,WAAW,GAAG;IAClB,KAAK,EAAE,OAAO,CAAC,KAAK,CAAC,IAAI,CAAC,OAAO,CAAC;IAClC,KAAK,EAAE,OAAO,CAAC,KAAK,CAAC,IAAI,CAAC,OAAO,CAAC;IAClC,IAAI,EAAE,OAAO,CAAC,IAAI,CAAC,IAAI,CAAC,OAAO,CAAC;IAChC,IAAI,EAAE,OAAO,CAAC,IAAI,CAAC,IAAI,CAAC,OAAO,CAAC;IAChC,KAAK,EAAE,OAAO,CAAC,KAAK,CAAC,IAAI,CAAC,OAAO,CAAC;IAClC,GAAG,EAAE,OAAO,CAAC,GAAG,CAAC,IAAI,CAAC,OAAO,CAAC;CAC/B,CAAC;
|
|
1
|
+
{"version":3,"file":"console.js","sourceRoot":"","sources":["../../../src/transport/console.ts"],"names":[],"mappings":";;;AAEA,2DAA+D;AAG/D,8EAA8E;AAC9E,4EAA4E;AAC5E,sEAAsE;AACtE,MAAM,WAAW,GAAG;IAClB,KAAK,EAAE,OAAO,CAAC,KAAK,CAAC,IAAI,CAAC,OAAO,CAAC;IAClC,KAAK,EAAE,OAAO,CAAC,KAAK,CAAC,IAAI,CAAC,OAAO,CAAC;IAClC,IAAI,EAAE,OAAO,CAAC,IAAI,CAAC,IAAI,CAAC,OAAO,CAAC;IAChC,IAAI,EAAE,OAAO,CAAC,IAAI,CAAC,IAAI,CAAC,OAAO,CAAC;IAChC,KAAK,EAAE,OAAO,CAAC,KAAK,CAAC,IAAI,CAAC,OAAO,CAAC;IAClC,GAAG,EAAE,OAAO,CAAC,GAAG,CAAC,IAAI,CAAC,OAAO,CAAC;CAC/B,CAAC;AAEF,2EAA2E;AAC3E,MAAM,kBAAkB,GAAiD;IACvE,KAAK,EAAE,WAAW,CAAC,KAAK;IACxB,KAAK,EAAE,WAAW,CAAC,KAAK;IACxB,IAAI,EAAE,WAAW,CAAC,IAAI;IACtB,IAAI,EAAE,WAAW,CAAC,IAAI;IACtB,KAAK,EAAE,WAAW,CAAC,KAAK;IACxB,KAAK,EAAE,WAAW,CAAC,KAAK;CACzB,CAAC;AAgBF;;;GAGG;AACH,MAAa,gBAAgB;IAM3B,YAAY,UAAmC,EAAE;QAC/C,IAAI,CAAC,IAAI,GAAG,OAAO,CAAC,IAAI,IAAI,SAAS,CAAC;QACtC,IAAI,CAAC,SAAS,GAAG,OAAO,CAAC,SAAS,IAAI,IAAA,kCAAmB,GAAE,CAAC;QAC5D,IAAI,CAAC,SAAS,GAAG,EAAE,GAAG,kBAAkB,EAAE,GAAG,OAAO,CAAC,SAAS,EAG7D,CAAC;QACF,sEAAsE;QACtE,2EAA2E;QAC3E,wEAAwE;QACxE,2EAA2E;QAC3E,MAAM,YAAY,GAAG,OAAO,CAAC,YAAY,IAAI,EAAE,CAAC;QAChD,KAAK,MAAM,KAAK,IAAI,YAAY,EAAE,CAAC;YACjC,IAAI,CAAC,SAAS,CAAC,KAAK,CAAC,GAAG,WAAW,CAAC,KAAK,CAAC;QAC5C,CAAC;IACH,CAAC;IAED,KAAK,CAAC,KAAe,EAAE,SAAiB;QACtC,MAAM,EAAE,GAAG,IAAI,CAAC,SAAS,CAAC,KAAK,CAAC,SAAS,CAAC,IAAI,WAAW,CAAC,GAAG,CAAC;QAC9D,EAAE,CAAC,SAAS,CAAC,CAAC;IAChB,CAAC;CACF;AA3BD,4CA2BC"}
|
|
@@ -1,21 +1,8 @@
|
|
|
1
1
|
import type { LogEntry } from '../types.js';
|
|
2
2
|
import type { Transport } from './transport.js';
|
|
3
3
|
import type { IpcRenderer } from 'electron';
|
|
4
|
-
/** Minimal view of
|
|
4
|
+
/** Minimal view of "IpcRenderer" the transport actually needs. */
|
|
5
5
|
type IpcSender = Pick<IpcRenderer, 'send'>;
|
|
6
|
-
/** Shape we probe for at runtime to enable the zero-copy transfer path. */
|
|
7
|
-
type IpcZeroCopySender = IpcSender & {
|
|
8
|
-
postMessage?: (channel: string, message: unknown, transfer?: unknown[]) => void;
|
|
9
|
-
};
|
|
10
|
-
/**
|
|
11
|
-
* Serialize an entry to an `ArrayBuffer` (UTF-8 JSON). The returned buffer is
|
|
12
|
-
* transferable: hand it to `postMessage(channel, buffer, [buffer])` so the
|
|
13
|
-
* underlying memory is moved across the process boundary instead of being
|
|
14
|
-
* structured-cloned (copied) by Electron.
|
|
15
|
-
*/
|
|
16
|
-
export declare function encodeEntry(entry: LogEntry): ArrayBuffer;
|
|
17
|
-
/** Inverse of {@link encodeEntry}. */
|
|
18
|
-
export declare function decodeEntry(buffer: ArrayBuffer | Uint8Array): LogEntry;
|
|
19
6
|
export declare const LOGRAIL_CHANNEL = "lograil:log";
|
|
20
7
|
/**
|
|
21
8
|
* Metadata key (on `LogEntry.metadata`) used to mark entries that originated
|
|
@@ -34,13 +21,13 @@ export interface ElectronIpcTransportOptions {
|
|
|
34
21
|
* `contextIsolation: true`): pass the `ipcRenderer` obtained from a preload
|
|
35
22
|
* bridge instead of letting the transport call `require('electron')`.
|
|
36
23
|
*/
|
|
37
|
-
ipcRenderer?:
|
|
24
|
+
ipcRenderer?: IpcSender;
|
|
38
25
|
}
|
|
39
26
|
/**
|
|
40
27
|
* Renderer-side transport. Forwards each log entry to the Electron main
|
|
41
28
|
* process over IPC, where it is persisted by the main logger (the renderer
|
|
42
|
-
* itself has no filesystem access).
|
|
43
|
-
*
|
|
29
|
+
* itself has no filesystem access). Uses structured cloning via
|
|
30
|
+
* `ipcRenderer.send()`.
|
|
44
31
|
*/
|
|
45
32
|
export declare class ElectronIpcTransport implements Transport {
|
|
46
33
|
readonly name: string;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"electron-ipc.d.ts","sourceRoot":"","sources":["../../../src/transport/electron-ipc.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,aAAa,CAAC;AAC5C,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,gBAAgB,CAAC;AAGhD,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,UAAU,CAAC;AAS5C,kEAAkE;AAClE,KAAK,SAAS,GAAG,IAAI,CAAC,WAAW,EAAE,MAAM,CAAC,CAAC;AAE3C,
|
|
1
|
+
{"version":3,"file":"electron-ipc.d.ts","sourceRoot":"","sources":["../../../src/transport/electron-ipc.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,aAAa,CAAC;AAC5C,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,gBAAgB,CAAC;AAGhD,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,UAAU,CAAC;AAS5C,kEAAkE;AAClE,KAAK,SAAS,GAAG,IAAI,CAAC,WAAW,EAAE,MAAM,CAAC,CAAC;AAE3C,eAAO,MAAM,eAAe,gBAAgB,CAAC;AAE7C;;;;GAIG;AACH,eAAO,MAAM,uBAAuB,qBAAqB,CAAC;AAE1D,MAAM,WAAW,2BAA2B;IAC1C,kDAAkD;IAClD,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,sBAAsB;IACtB,IAAI,CAAC,EAAE,MAAM,CAAC;IACd;;;;;OAKG;IACH,WAAW,CAAC,EAAE,SAAS,CAAC;CACzB;AAED;;;;;GAKG;AACH,qBAAa,oBAAqB,YAAW,SAAS;IACpD,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;IACtB,QAAQ,CAAC,OAAO,EAAE,MAAM,CAAC;IAEzB,OAAO,CAAC,WAAW,CAAC,CAAY;IAChC,OAAO,CAAC,WAAW,CAAC,CAAY;gBAEpB,OAAO,GAAE,2BAAgC;IAMrD,OAAO,CAAC,MAAM;IAYd,KAAK,CAAC,KAAK,EAAE,QAAQ,EAAE,UAAU,EAAE,MAAM,GAAG,IAAI;IAWhD,8DAA8D;IAC9D,gBAAgB,CAAC,KAAK,EAAE,MAAM,GAAG,IAAI;CAUtC;AAED,MAAM,WAAW,kBAAkB;IACjC,OAAO,CAAC,EAAE,MAAM,CAAC;CAClB;AAeD;;;;;GAKG;AACH,wBAAgB,mBAAmB,CACjC,MAAM,EAAE,CAAC,KAAK,EAAE,QAAQ,KAAK,IAAI,EACjC,OAAO,GAAE,kBAAkB,GAAG;IAAE,cAAc,CAAC,EAAE,CAAC,KAAK,EAAE,MAAM,KAAK,IAAI,CAAA;CAAO,GAC9E,MAAM,IAAI,CA+BZ"}
|
|
@@ -1,8 +1,6 @@
|
|
|
1
1
|
"use strict";
|
|
2
2
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
3
|
exports.ElectronIpcTransport = exports.RENDERER_PROCESS_MARKER = exports.LOGRAIL_CHANNEL = void 0;
|
|
4
|
-
exports.encodeEntry = encodeEntry;
|
|
5
|
-
exports.decodeEntry = decodeEntry;
|
|
6
4
|
exports.registerIpcReceiver = registerIpcReceiver;
|
|
7
5
|
const types_js_1 = require("../types.js");
|
|
8
6
|
const electron_binding_js_1 = require("../runtime/electron-binding.js");
|
|
@@ -10,23 +8,6 @@ const electron_binding_js_1 = require("../runtime/electron-binding.js");
|
|
|
10
8
|
const RAW_CONSOLE_ERROR = typeof console !== 'undefined' && typeof console.error === 'function'
|
|
11
9
|
? console.error.bind(console)
|
|
12
10
|
: () => { };
|
|
13
|
-
// Reused across calls so we don't allocate an encoder/decoder per log line.
|
|
14
|
-
const encoder = new TextEncoder();
|
|
15
|
-
const decoder = new TextDecoder();
|
|
16
|
-
/**
|
|
17
|
-
* Serialize an entry to an `ArrayBuffer` (UTF-8 JSON). The returned buffer is
|
|
18
|
-
* transferable: hand it to `postMessage(channel, buffer, [buffer])` so the
|
|
19
|
-
* underlying memory is moved across the process boundary instead of being
|
|
20
|
-
* structured-cloned (copied) by Electron.
|
|
21
|
-
*/
|
|
22
|
-
function encodeEntry(entry) {
|
|
23
|
-
return encoder.encode(JSON.stringify(entry)).buffer;
|
|
24
|
-
}
|
|
25
|
-
/** Inverse of {@link encodeEntry}. */
|
|
26
|
-
function decodeEntry(buffer) {
|
|
27
|
-
const bytes = buffer instanceof Uint8Array ? buffer : new Uint8Array(buffer);
|
|
28
|
-
return JSON.parse(decoder.decode(bytes));
|
|
29
|
-
}
|
|
30
11
|
exports.LOGRAIL_CHANNEL = 'lograil:log';
|
|
31
12
|
/**
|
|
32
13
|
* Metadata key (on `LogEntry.metadata`) used to mark entries that originated
|
|
@@ -37,8 +18,8 @@ exports.RENDERER_PROCESS_MARKER = '__lograilProcess';
|
|
|
37
18
|
/**
|
|
38
19
|
* Renderer-side transport. Forwards each log entry to the Electron main
|
|
39
20
|
* process over IPC, where it is persisted by the main logger (the renderer
|
|
40
|
-
* itself has no filesystem access).
|
|
41
|
-
*
|
|
21
|
+
* itself has no filesystem access). Uses structured cloning via
|
|
22
|
+
* `ipcRenderer.send()`.
|
|
42
23
|
*/
|
|
43
24
|
class ElectronIpcTransport {
|
|
44
25
|
constructor(options = {}) {
|
|
@@ -64,20 +45,10 @@ class ElectronIpcTransport {
|
|
|
64
45
|
if (!ipc)
|
|
65
46
|
return;
|
|
66
47
|
try {
|
|
67
|
-
|
|
68
|
-
if (typeof sender.postMessage === 'function') {
|
|
69
|
-
// Zero-copy path: serialize once, then transfer the buffer's ownership
|
|
70
|
-
// across the process boundary (no structured-clone of the object graph).
|
|
71
|
-
const buf = encodeEntry(entry);
|
|
72
|
-
sender.postMessage(this.channel, buf, [buf]);
|
|
73
|
-
}
|
|
74
|
-
else {
|
|
75
|
-
// Fallback: Electron structured-clones the whole entry object.
|
|
76
|
-
ipc.send(this.channel, entry);
|
|
77
|
-
}
|
|
48
|
+
ipc.send(this.channel, entry);
|
|
78
49
|
}
|
|
79
50
|
catch (err) {
|
|
80
|
-
// Report IPC failure so users can diagnose renderer
|
|
51
|
+
// Report IPC failure so users can diagnose renderer -> main delivery issues.
|
|
81
52
|
RAW_CONSOLE_ERROR(`[lograil] ipc transport (${this.name}) send failed:`, err);
|
|
82
53
|
}
|
|
83
54
|
}
|
|
@@ -88,21 +59,28 @@ class ElectronIpcTransport {
|
|
|
88
59
|
return;
|
|
89
60
|
const cmd = { __lograilCmd: true, __lograilCmdType: 'setLevel', level };
|
|
90
61
|
try {
|
|
91
|
-
|
|
92
|
-
if (typeof sender.postMessage === 'function') {
|
|
93
|
-
const buf = encoder.encode(JSON.stringify(cmd)).buffer;
|
|
94
|
-
sender.postMessage(this.channel, buf, [buf]);
|
|
95
|
-
}
|
|
96
|
-
else {
|
|
97
|
-
ipc.send(this.channel, cmd);
|
|
98
|
-
}
|
|
62
|
+
ipc.send(this.channel, cmd);
|
|
99
63
|
}
|
|
100
64
|
catch {
|
|
101
|
-
/* silently drop
|
|
65
|
+
/* silently drop - command loss is not fatal */
|
|
102
66
|
}
|
|
103
67
|
}
|
|
104
68
|
}
|
|
105
69
|
exports.ElectronIpcTransport = ElectronIpcTransport;
|
|
70
|
+
/**
|
|
71
|
+
* Shared dedup state on globalThis so that multiple bundled copies of this
|
|
72
|
+
* module (e.g. from node_modules hoisting or chunk splitting) all share the
|
|
73
|
+
* same registration set instead of each keeping their own independent one.
|
|
74
|
+
*/
|
|
75
|
+
const _DEDUP_ELECTRON = Symbol('lograil:electron-ipc:dedup');
|
|
76
|
+
function _getRegisteredChannels() {
|
|
77
|
+
if (typeof globalThis !== 'undefined' && _DEDUP_ELECTRON in globalThis)
|
|
78
|
+
return globalThis[_DEDUP_ELECTRON];
|
|
79
|
+
const s = new Set();
|
|
80
|
+
if (typeof globalThis !== 'undefined')
|
|
81
|
+
globalThis[_DEDUP_ELECTRON] = s;
|
|
82
|
+
return s;
|
|
83
|
+
}
|
|
106
84
|
/**
|
|
107
85
|
* Main-side helper: listen on the IPC channel and feed received renderer
|
|
108
86
|
* entries into the provided `ingest` callback (typically `logger.ingestEntry`).
|
|
@@ -115,39 +93,30 @@ function registerIpcReceiver(ingest, options = {}) {
|
|
|
115
93
|
// `electron` is only present in a main process; resolve it lazily.
|
|
116
94
|
const ipcMain = (0, electron_binding_js_1.getElectron)().ipcMain;
|
|
117
95
|
const handler = (_event, payload) => {
|
|
118
|
-
|
|
119
|
-
|
|
120
|
-
|
|
121
|
-
|
|
122
|
-
if ((0, types_js_1.isLogLevelCommand)(decoded)) {
|
|
123
|
-
onLevelCommand?.((0, types_js_1.normalizeLevel)(decoded.level));
|
|
124
|
-
return;
|
|
125
|
-
}
|
|
126
|
-
const entry = decoded;
|
|
127
|
-
ingest({
|
|
128
|
-
...entry,
|
|
129
|
-
metadata: { ...entry.metadata, [exports.RENDERER_PROCESS_MARKER]: 'renderer' },
|
|
130
|
-
});
|
|
131
|
-
}
|
|
132
|
-
catch {
|
|
133
|
-
return;
|
|
134
|
-
}
|
|
135
|
-
}
|
|
136
|
-
else {
|
|
137
|
-
const data = payload;
|
|
138
|
-
if ((0, types_js_1.isLogLevelCommand)(data)) {
|
|
139
|
-
onLevelCommand?.((0, types_js_1.normalizeLevel)(data.level));
|
|
140
|
-
return;
|
|
141
|
-
}
|
|
142
|
-
const entry = data;
|
|
143
|
-
// Copy-on-write: mark renderer-origin without mutating a shared/frozen entry.
|
|
144
|
-
ingest({
|
|
145
|
-
...entry,
|
|
146
|
-
metadata: { ...entry.metadata, [exports.RENDERER_PROCESS_MARKER]: 'renderer' },
|
|
147
|
-
});
|
|
96
|
+
const data = payload;
|
|
97
|
+
if ((0, types_js_1.isLogLevelCommand)(data)) {
|
|
98
|
+
onLevelCommand?.((0, types_js_1.normalizeLevel)(data.level));
|
|
99
|
+
return;
|
|
148
100
|
}
|
|
101
|
+
const entry = data;
|
|
102
|
+
// Copy-on-write: mark renderer-origin without mutating a shared/frozen entry.
|
|
103
|
+
ingest({
|
|
104
|
+
...entry,
|
|
105
|
+
metadata: { ...entry.metadata, [exports.RENDERER_PROCESS_MARKER]: 'renderer' },
|
|
106
|
+
});
|
|
149
107
|
};
|
|
108
|
+
// Guard against duplicate registration: if this channel is already tracked,
|
|
109
|
+
// do not add another handler (multiple loggers on the same channel would
|
|
110
|
+
// cause each IPC message to be processed once per logger).
|
|
111
|
+
const registeredChannels = _getRegisteredChannels();
|
|
112
|
+
if (registeredChannels.has(channel)) {
|
|
113
|
+
return () => { };
|
|
114
|
+
}
|
|
115
|
+
registeredChannels.add(channel);
|
|
150
116
|
ipcMain.on(channel, handler);
|
|
151
|
-
return () =>
|
|
117
|
+
return () => {
|
|
118
|
+
registeredChannels.delete(channel);
|
|
119
|
+
ipcMain.removeListener(channel, handler);
|
|
120
|
+
};
|
|
152
121
|
}
|
|
153
122
|
//# sourceMappingURL=electron-ipc.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"electron-ipc.js","sourceRoot":"","sources":["../../../src/transport/electron-ipc.ts"],"names":[],"mappings":";;;
|
|
1
|
+
{"version":3,"file":"electron-ipc.js","sourceRoot":"","sources":["../../../src/transport/electron-ipc.ts"],"names":[],"mappings":"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"}
|
|
@@ -53,7 +53,8 @@ export interface RotateSizeOptions extends FileBaseOptions {
|
|
|
53
53
|
mode: 'rotate-size';
|
|
54
54
|
/** Size in bytes that triggers a rotation. */
|
|
55
55
|
maxSize: number;
|
|
56
|
-
/** Number of generations to keep (active file + N-1 backups).
|
|
56
|
+
/** Number of generations to keep (active file + N-1 backups). `1` keeps only
|
|
57
|
+
* the active file; `<=0` disables generation trimming. */
|
|
57
58
|
maxFiles: number;
|
|
58
59
|
}
|
|
59
60
|
/** 2.2 — roll by time (hour or day), naming each file with a timestamp. */
|
|
@@ -63,7 +64,8 @@ export interface RotateTimeOptions extends FileBaseOptions {
|
|
|
63
64
|
unit: 'hour' | 'day';
|
|
64
65
|
/** Number of time buckets (stamps) to keep. When a bucket contains
|
|
65
66
|
* multiple seq files (via `maxSize`), the entire bucket is kept or
|
|
66
|
-
* deleted as a unit.
|
|
67
|
+
* deleted as a unit. `1` keeps only the newest bucket; `<=0` (or omitted)
|
|
68
|
+
* means unbounded. */
|
|
67
69
|
maxFiles?: number;
|
|
68
70
|
/**
|
|
69
71
|
* Max bytes per time bucket. When the active file within the same time
|
|
@@ -97,7 +99,8 @@ export interface RotateCustomOptions extends FileBaseOptions {
|
|
|
97
99
|
shouldRotate: (entry: LogEntry, ctx: RotateContext) => boolean;
|
|
98
100
|
/** Name the seq-th file. Required (no sensible default for custom). */
|
|
99
101
|
fileName: (app: string, seq: number, ext: string) => string;
|
|
100
|
-
/** Max number of files to keep.
|
|
102
|
+
/** Max number of files to keep. `1` keeps only the active file; `<=0` (or
|
|
103
|
+
* omitted) means unbounded. */
|
|
101
104
|
maxFiles?: number;
|
|
102
105
|
}
|
|
103
106
|
export type FileTransportOptions = SingleAppendOptions | SingleTruncateOptions | RotateSizeOptions | RotateTimeOptions | RotateCustomOptions;
|
|
@@ -139,6 +142,8 @@ export declare class FileTransport implements Transport {
|
|
|
139
142
|
readonly name: string;
|
|
140
143
|
readonly formatter: Formatter;
|
|
141
144
|
readonly filter?: (entry: LogEntry) => boolean;
|
|
145
|
+
/** Optional error hook, forwarded to the pipeline's global `onLoggerError`. */
|
|
146
|
+
onError?(err: unknown, entry: LogEntry): void;
|
|
142
147
|
/** Effective capacity limits, for diagnostics (e.g. "why was my log file
|
|
143
148
|
* deleted?"). `maxSize`/`maxFiles` reflect the active rotation mode;
|
|
144
149
|
* `maxTotalSize`/`maxAge` are the global caps (`Infinity`/`-1` = unset). */
|
|
@@ -160,7 +165,6 @@ export declare class FileTransport implements Transport {
|
|
|
160
165
|
private readonly owned;
|
|
161
166
|
private readonly createdAt;
|
|
162
167
|
private closed;
|
|
163
|
-
private reportedFirstError;
|
|
164
168
|
private handle;
|
|
165
169
|
private queue;
|
|
166
170
|
private ownedScanned;
|
|
@@ -168,6 +172,7 @@ export declare class FileTransport implements Transport {
|
|
|
168
172
|
private static readonly PERIODIC_INTERVAL_MS;
|
|
169
173
|
private writeCount;
|
|
170
174
|
private lastCheckMs;
|
|
175
|
+
private _lastWrittenEntry;
|
|
171
176
|
constructor(options: FileTransportOptions);
|
|
172
177
|
/** Absolute path of the log directory. */
|
|
173
178
|
getDir(): string;
|
|
@@ -183,6 +188,7 @@ export declare class FileTransport implements Transport {
|
|
|
183
188
|
private ensureHandle;
|
|
184
189
|
private scanOwned;
|
|
185
190
|
private closeHandle;
|
|
191
|
+
private getActiveSize;
|
|
186
192
|
write(entry: LogEntry, formatted: string): void | Promise<void>;
|
|
187
193
|
flush(): Promise<void>;
|
|
188
194
|
close(): Promise<void>;
|