@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.
@@ -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
+ }