@flareapp/electron 0.1.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/README.md +173 -0
- package/dist/main.cjs +486 -0
- package/dist/main.d.cts +77 -0
- package/dist/main.d.mts +77 -0
- package/dist/main.mjs +406 -0
- package/dist/preload.cjs +21 -0
- package/dist/preload.d.cts +8 -0
- package/dist/preload.d.mts +8 -0
- package/dist/preload.mjs +20 -0
- package/dist/renderer.cjs +84 -0
- package/dist/renderer.d.cts +30 -0
- package/dist/renderer.d.mts +30 -0
- package/dist/renderer.mjs +81 -0
- package/package.json +80 -0
|
@@ -0,0 +1,84 @@
|
|
|
1
|
+
Object.defineProperty(exports, Symbol.toStringTag, { value: 'Module' });
|
|
2
|
+
let _flareapp_js_browser = require("@flareapp/js/browser");
|
|
3
|
+
let _flareapp_core = require("@flareapp/core");
|
|
4
|
+
|
|
5
|
+
//#region src/constants.ts
|
|
6
|
+
/** Global key the preload bridge exposes in the renderer's main world. */
|
|
7
|
+
const FLARE_BRIDGE_KEY = "__flare";
|
|
8
|
+
|
|
9
|
+
//#endregion
|
|
10
|
+
//#region src/env.ts
|
|
11
|
+
const CLIENT_VERSION = typeof process !== "undefined" && true ? "0.1.0" : "?";
|
|
12
|
+
|
|
13
|
+
//#endregion
|
|
14
|
+
//#region src/renderer/RendererFlare.ts
|
|
15
|
+
var RendererFlare = class extends _flareapp_js_browser.Flare {
|
|
16
|
+
maxReportBytes;
|
|
17
|
+
rendererBeforeSubmit = (r) => r;
|
|
18
|
+
noBridgeCount = 0;
|
|
19
|
+
oversizedCount = 0;
|
|
20
|
+
sendFailedCount = 0;
|
|
21
|
+
constructor(options = {}) {
|
|
22
|
+
super();
|
|
23
|
+
this.maxReportBytes = options.maxReportBytes ?? 1e6;
|
|
24
|
+
this.setSdkInfo({
|
|
25
|
+
name: "@flareapp/electron",
|
|
26
|
+
version: CLIENT_VERSION
|
|
27
|
+
});
|
|
28
|
+
}
|
|
29
|
+
configure(config) {
|
|
30
|
+
if (config.beforeSubmit !== void 0) this.rendererBeforeSubmit = config.beforeSubmit;
|
|
31
|
+
return super.configure(config);
|
|
32
|
+
}
|
|
33
|
+
/**
|
|
34
|
+
* Renderer transport. Core's sendReport short-circuits without an API key, so we override it
|
|
35
|
+
* entirely: scrub, serialize cycle-safely, size-check, then forward a STRING over the bridge.
|
|
36
|
+
*/
|
|
37
|
+
async sendReport(report) {
|
|
38
|
+
const scrubbed = await this.rendererBeforeSubmit(report);
|
|
39
|
+
if (!scrubbed) return;
|
|
40
|
+
const payload = (0, _flareapp_core.flatJsonStringify)(scrubbed);
|
|
41
|
+
if (byteLength(payload) > this.maxReportBytes) {
|
|
42
|
+
this.oversizedCount += 1;
|
|
43
|
+
if (shouldWarn(this.oversizedCount)) console.warn(`[flare] Renderer report exceeds maxReportBytes; dropping. (count: ${this.oversizedCount})`);
|
|
44
|
+
return;
|
|
45
|
+
}
|
|
46
|
+
const bridge = globalThis[FLARE_BRIDGE_KEY];
|
|
47
|
+
if (!bridge) {
|
|
48
|
+
this.noBridgeCount += 1;
|
|
49
|
+
if (shouldWarn(this.noBridgeCount)) console.warn(`[flare] window.__flare is not available. Did you call exposeFlare() in your preload script? (count: ${this.noBridgeCount})`);
|
|
50
|
+
return;
|
|
51
|
+
}
|
|
52
|
+
try {
|
|
53
|
+
await bridge.report(payload);
|
|
54
|
+
} catch (error) {
|
|
55
|
+
this.sendFailedCount += 1;
|
|
56
|
+
if (shouldWarn(this.sendFailedCount)) console.warn(`[flare] Failed to forward a report to the main process. (count: ${this.sendFailedCount})`, error);
|
|
57
|
+
}
|
|
58
|
+
}
|
|
59
|
+
};
|
|
60
|
+
function byteLength(s) {
|
|
61
|
+
return new TextEncoder().encode(s).length;
|
|
62
|
+
}
|
|
63
|
+
function shouldWarn(count) {
|
|
64
|
+
if (count < 1) return false;
|
|
65
|
+
let n = count;
|
|
66
|
+
while (n > 1) {
|
|
67
|
+
if (n % 10 !== 0) return false;
|
|
68
|
+
n /= 10;
|
|
69
|
+
}
|
|
70
|
+
return n === 1;
|
|
71
|
+
}
|
|
72
|
+
|
|
73
|
+
//#endregion
|
|
74
|
+
//#region src/renderer.ts
|
|
75
|
+
const flare = new RendererFlare();
|
|
76
|
+
if (typeof window !== "undefined" && window) {
|
|
77
|
+
window.flare = flare;
|
|
78
|
+
(0, _flareapp_js_browser.catchWindowErrors)();
|
|
79
|
+
}
|
|
80
|
+
|
|
81
|
+
//#endregion
|
|
82
|
+
exports.FLARE_BRIDGE_KEY = FLARE_BRIDGE_KEY;
|
|
83
|
+
exports.RendererFlare = RendererFlare;
|
|
84
|
+
exports.flare = flare;
|
|
@@ -0,0 +1,30 @@
|
|
|
1
|
+
import { Config, Report } from "@flareapp/core";
|
|
2
|
+
import { Flare } from "@flareapp/js/browser";
|
|
3
|
+
|
|
4
|
+
//#region src/renderer/RendererFlare.d.ts
|
|
5
|
+
type RendererFlareOptions = {
|
|
6
|
+
/** Max serialized report size in bytes; oversized reports are dropped with a warning. */maxReportBytes?: number;
|
|
7
|
+
};
|
|
8
|
+
declare class RendererFlare extends Flare {
|
|
9
|
+
private maxReportBytes;
|
|
10
|
+
private rendererBeforeSubmit;
|
|
11
|
+
private noBridgeCount;
|
|
12
|
+
private oversizedCount;
|
|
13
|
+
private sendFailedCount;
|
|
14
|
+
constructor(options?: RendererFlareOptions);
|
|
15
|
+
configure(config: Partial<Config>): this;
|
|
16
|
+
/**
|
|
17
|
+
* Renderer transport. Core's sendReport short-circuits without an API key, so we override it
|
|
18
|
+
* entirely: scrub, serialize cycle-safely, size-check, then forward a STRING over the bridge.
|
|
19
|
+
*/
|
|
20
|
+
sendReport(report: Report): Promise<void>;
|
|
21
|
+
}
|
|
22
|
+
//#endregion
|
|
23
|
+
//#region src/constants.d.ts
|
|
24
|
+
/** Global key the preload bridge exposes in the renderer's main world. */
|
|
25
|
+
declare const FLARE_BRIDGE_KEY = "__flare";
|
|
26
|
+
//#endregion
|
|
27
|
+
//#region src/renderer.d.ts
|
|
28
|
+
declare const flare: RendererFlare;
|
|
29
|
+
//#endregion
|
|
30
|
+
export { FLARE_BRIDGE_KEY, RendererFlare, type RendererFlareOptions, flare };
|
|
@@ -0,0 +1,30 @@
|
|
|
1
|
+
import { Flare } from "@flareapp/js/browser";
|
|
2
|
+
import { Config, Report } from "@flareapp/core";
|
|
3
|
+
|
|
4
|
+
//#region src/renderer/RendererFlare.d.ts
|
|
5
|
+
type RendererFlareOptions = {
|
|
6
|
+
/** Max serialized report size in bytes; oversized reports are dropped with a warning. */maxReportBytes?: number;
|
|
7
|
+
};
|
|
8
|
+
declare class RendererFlare extends Flare {
|
|
9
|
+
private maxReportBytes;
|
|
10
|
+
private rendererBeforeSubmit;
|
|
11
|
+
private noBridgeCount;
|
|
12
|
+
private oversizedCount;
|
|
13
|
+
private sendFailedCount;
|
|
14
|
+
constructor(options?: RendererFlareOptions);
|
|
15
|
+
configure(config: Partial<Config>): this;
|
|
16
|
+
/**
|
|
17
|
+
* Renderer transport. Core's sendReport short-circuits without an API key, so we override it
|
|
18
|
+
* entirely: scrub, serialize cycle-safely, size-check, then forward a STRING over the bridge.
|
|
19
|
+
*/
|
|
20
|
+
sendReport(report: Report): Promise<void>;
|
|
21
|
+
}
|
|
22
|
+
//#endregion
|
|
23
|
+
//#region src/constants.d.ts
|
|
24
|
+
/** Global key the preload bridge exposes in the renderer's main world. */
|
|
25
|
+
declare const FLARE_BRIDGE_KEY = "__flare";
|
|
26
|
+
//#endregion
|
|
27
|
+
//#region src/renderer.d.ts
|
|
28
|
+
declare const flare: RendererFlare;
|
|
29
|
+
//#endregion
|
|
30
|
+
export { FLARE_BRIDGE_KEY, RendererFlare, type RendererFlareOptions, flare };
|
|
@@ -0,0 +1,81 @@
|
|
|
1
|
+
import { Flare, catchWindowErrors } from "@flareapp/js/browser";
|
|
2
|
+
import { flatJsonStringify } from "@flareapp/core";
|
|
3
|
+
|
|
4
|
+
//#region src/constants.ts
|
|
5
|
+
/** Global key the preload bridge exposes in the renderer's main world. */
|
|
6
|
+
const FLARE_BRIDGE_KEY = "__flare";
|
|
7
|
+
|
|
8
|
+
//#endregion
|
|
9
|
+
//#region src/env.ts
|
|
10
|
+
const CLIENT_VERSION = typeof process !== "undefined" && true ? "0.1.0" : "?";
|
|
11
|
+
|
|
12
|
+
//#endregion
|
|
13
|
+
//#region src/renderer/RendererFlare.ts
|
|
14
|
+
var RendererFlare = class extends Flare {
|
|
15
|
+
maxReportBytes;
|
|
16
|
+
rendererBeforeSubmit = (r) => r;
|
|
17
|
+
noBridgeCount = 0;
|
|
18
|
+
oversizedCount = 0;
|
|
19
|
+
sendFailedCount = 0;
|
|
20
|
+
constructor(options = {}) {
|
|
21
|
+
super();
|
|
22
|
+
this.maxReportBytes = options.maxReportBytes ?? 1e6;
|
|
23
|
+
this.setSdkInfo({
|
|
24
|
+
name: "@flareapp/electron",
|
|
25
|
+
version: CLIENT_VERSION
|
|
26
|
+
});
|
|
27
|
+
}
|
|
28
|
+
configure(config) {
|
|
29
|
+
if (config.beforeSubmit !== void 0) this.rendererBeforeSubmit = config.beforeSubmit;
|
|
30
|
+
return super.configure(config);
|
|
31
|
+
}
|
|
32
|
+
/**
|
|
33
|
+
* Renderer transport. Core's sendReport short-circuits without an API key, so we override it
|
|
34
|
+
* entirely: scrub, serialize cycle-safely, size-check, then forward a STRING over the bridge.
|
|
35
|
+
*/
|
|
36
|
+
async sendReport(report) {
|
|
37
|
+
const scrubbed = await this.rendererBeforeSubmit(report);
|
|
38
|
+
if (!scrubbed) return;
|
|
39
|
+
const payload = flatJsonStringify(scrubbed);
|
|
40
|
+
if (byteLength(payload) > this.maxReportBytes) {
|
|
41
|
+
this.oversizedCount += 1;
|
|
42
|
+
if (shouldWarn(this.oversizedCount)) console.warn(`[flare] Renderer report exceeds maxReportBytes; dropping. (count: ${this.oversizedCount})`);
|
|
43
|
+
return;
|
|
44
|
+
}
|
|
45
|
+
const bridge = globalThis[FLARE_BRIDGE_KEY];
|
|
46
|
+
if (!bridge) {
|
|
47
|
+
this.noBridgeCount += 1;
|
|
48
|
+
if (shouldWarn(this.noBridgeCount)) console.warn(`[flare] window.__flare is not available. Did you call exposeFlare() in your preload script? (count: ${this.noBridgeCount})`);
|
|
49
|
+
return;
|
|
50
|
+
}
|
|
51
|
+
try {
|
|
52
|
+
await bridge.report(payload);
|
|
53
|
+
} catch (error) {
|
|
54
|
+
this.sendFailedCount += 1;
|
|
55
|
+
if (shouldWarn(this.sendFailedCount)) console.warn(`[flare] Failed to forward a report to the main process. (count: ${this.sendFailedCount})`, error);
|
|
56
|
+
}
|
|
57
|
+
}
|
|
58
|
+
};
|
|
59
|
+
function byteLength(s) {
|
|
60
|
+
return new TextEncoder().encode(s).length;
|
|
61
|
+
}
|
|
62
|
+
function shouldWarn(count) {
|
|
63
|
+
if (count < 1) return false;
|
|
64
|
+
let n = count;
|
|
65
|
+
while (n > 1) {
|
|
66
|
+
if (n % 10 !== 0) return false;
|
|
67
|
+
n /= 10;
|
|
68
|
+
}
|
|
69
|
+
return n === 1;
|
|
70
|
+
}
|
|
71
|
+
|
|
72
|
+
//#endregion
|
|
73
|
+
//#region src/renderer.ts
|
|
74
|
+
const flare = new RendererFlare();
|
|
75
|
+
if (typeof window !== "undefined" && window) {
|
|
76
|
+
window.flare = flare;
|
|
77
|
+
catchWindowErrors();
|
|
78
|
+
}
|
|
79
|
+
|
|
80
|
+
//#endregion
|
|
81
|
+
export { FLARE_BRIDGE_KEY, RendererFlare, flare };
|
package/package.json
ADDED
|
@@ -0,0 +1,80 @@
|
|
|
1
|
+
{
|
|
2
|
+
"name": "@flareapp/electron",
|
|
3
|
+
"version": "0.1.0",
|
|
4
|
+
"description": "Experimental Electron SDK for flareapp.io",
|
|
5
|
+
"homepage": "https://flareapp.io",
|
|
6
|
+
"bugs": {
|
|
7
|
+
"url": "https://github.com/spatie/flare-client-js/issues"
|
|
8
|
+
},
|
|
9
|
+
"repository": {
|
|
10
|
+
"type": "git",
|
|
11
|
+
"url": "git+https://github.com/spatie/flare-client-js.git"
|
|
12
|
+
},
|
|
13
|
+
"license": "MIT",
|
|
14
|
+
"author": {
|
|
15
|
+
"name": "Spatie",
|
|
16
|
+
"email": "info@spatie.be"
|
|
17
|
+
},
|
|
18
|
+
"files": [
|
|
19
|
+
"dist"
|
|
20
|
+
],
|
|
21
|
+
"exports": {
|
|
22
|
+
"./main": {
|
|
23
|
+
"import": {
|
|
24
|
+
"types": "./dist/main.d.mts",
|
|
25
|
+
"default": "./dist/main.mjs"
|
|
26
|
+
},
|
|
27
|
+
"require": {
|
|
28
|
+
"types": "./dist/main.d.cts",
|
|
29
|
+
"default": "./dist/main.cjs"
|
|
30
|
+
}
|
|
31
|
+
},
|
|
32
|
+
"./preload": {
|
|
33
|
+
"import": {
|
|
34
|
+
"types": "./dist/preload.d.mts",
|
|
35
|
+
"default": "./dist/preload.mjs"
|
|
36
|
+
},
|
|
37
|
+
"require": {
|
|
38
|
+
"types": "./dist/preload.d.cts",
|
|
39
|
+
"default": "./dist/preload.cjs"
|
|
40
|
+
}
|
|
41
|
+
},
|
|
42
|
+
"./renderer": {
|
|
43
|
+
"import": {
|
|
44
|
+
"types": "./dist/renderer.d.mts",
|
|
45
|
+
"default": "./dist/renderer.mjs"
|
|
46
|
+
},
|
|
47
|
+
"require": {
|
|
48
|
+
"types": "./dist/renderer.d.cts",
|
|
49
|
+
"default": "./dist/renderer.cjs"
|
|
50
|
+
}
|
|
51
|
+
}
|
|
52
|
+
},
|
|
53
|
+
"engines": {
|
|
54
|
+
"node": ">=22"
|
|
55
|
+
},
|
|
56
|
+
"scripts": {
|
|
57
|
+
"prepublishOnly": "npm run build",
|
|
58
|
+
"build": "tsdown",
|
|
59
|
+
"test": "vitest run",
|
|
60
|
+
"typescript": "tsc --noEmit",
|
|
61
|
+
"verify:exports": "node scripts/verify-exports.mjs",
|
|
62
|
+
"release": "release-it"
|
|
63
|
+
},
|
|
64
|
+
"dependencies": {
|
|
65
|
+
"@flareapp/core": "2.4.0",
|
|
66
|
+
"@flareapp/js": "2.4.0"
|
|
67
|
+
},
|
|
68
|
+
"peerDependencies": {
|
|
69
|
+
"electron": ">=35"
|
|
70
|
+
},
|
|
71
|
+
"devDependencies": {
|
|
72
|
+
"electron": "^35.0.0",
|
|
73
|
+
"tsdown": "^0.20.3",
|
|
74
|
+
"typescript": "^5.7.0",
|
|
75
|
+
"vitest": "^4.0.18"
|
|
76
|
+
},
|
|
77
|
+
"publishConfig": {
|
|
78
|
+
"access": "public"
|
|
79
|
+
}
|
|
80
|
+
}
|