@fixback/expo 0.8.3 → 0.9.1

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.
Files changed (46) hide show
  1. package/README.md +5 -7
  2. package/dist/FeedbackModal.d.ts +7 -2
  3. package/dist/FeedbackModal.js +30 -3
  4. package/dist/FeedbackModal.js.map +1 -1
  5. package/dist/FixbackProvider.js +5 -1
  6. package/dist/FixbackProvider.js.map +1 -1
  7. package/dist/adapters.js +5 -4
  8. package/dist/adapters.js.map +1 -1
  9. package/dist/breadcrumbs.d.ts +15 -51
  10. package/dist/breadcrumbs.js +22 -169
  11. package/dist/breadcrumbs.js.map +1 -1
  12. package/dist/client-boot.d.ts +40 -0
  13. package/dist/client-boot.js +269 -0
  14. package/dist/client-boot.js.map +1 -0
  15. package/dist/client-connect.d.ts +33 -0
  16. package/dist/client-connect.js +306 -0
  17. package/dist/client-connect.js.map +1 -0
  18. package/dist/client-replay.d.ts +31 -0
  19. package/dist/client-replay.js +165 -0
  20. package/dist/client-replay.js.map +1 -0
  21. package/dist/client-state.d.ts +131 -0
  22. package/dist/client-state.js +158 -0
  23. package/dist/client-state.js.map +1 -0
  24. package/dist/client.d.ts +10 -245
  25. package/dist/client.js +80 -787
  26. package/dist/client.js.map +1 -1
  27. package/dist/error-capture.js +6 -26
  28. package/dist/error-capture.js.map +1 -1
  29. package/dist/identity.d.ts +0 -2
  30. package/dist/identity.js +0 -3
  31. package/dist/identity.js.map +1 -1
  32. package/dist/options.d.ts +263 -0
  33. package/dist/options.js +12 -0
  34. package/dist/options.js.map +1 -0
  35. package/dist/report.d.ts +13 -12
  36. package/dist/report.js +19 -38
  37. package/dist/report.js.map +1 -1
  38. package/dist/submit.d.ts +10 -37
  39. package/dist/submit.js +14 -64
  40. package/dist/submit.js.map +1 -1
  41. package/dist/tokens.d.ts +8 -3
  42. package/dist/tokens.js +12 -6
  43. package/dist/tokens.js.map +1 -1
  44. package/dist/version.d.ts +1 -1
  45. package/dist/version.js +1 -1
  46. package/package.json +4 -3
package/dist/submit.d.ts CHANGED
@@ -1,8 +1,9 @@
1
1
  /**
2
2
  * The multipart feedback submission — the transport half of the capture loop.
3
3
  *
4
- * The endpoint, the identity compaction, the backpressure window, and the `fetch`
5
- * surface are all shared with the browser SDK through `@fixback/sdk-core`
4
+ * The endpoint, the identity compaction, the backpressure window, the `fetch`
5
+ * surface, and the POST's tail — the gate, the timeout, reading ingest's answer
6
+ * (`postFeedback`) — are all shared with the browser SDK through `@fixback/sdk-core`
6
7
  * (ADR-0028); what stays here is the mobile envelope.
7
8
  *
8
9
  * `POST /api/ingest/feedback` is a multipart request: a single text part
@@ -22,17 +23,10 @@
22
23
  * never breaks the host app. Automatic reports (`source: error`) honour ingest's
23
24
  * `429` + `Retry-After` backpressure; manual reports are never gated.
24
25
  */
25
- import { AutoReportBackoff, feedbackEndpoint, type FetchLike, type IdentityInputs, type ReportContent, type ReporterTier } from "@fixback/sdk-core";
26
+ import { AutoReportBackoff, type FetchLike, type IdentityInputs, type ReportContent, type SubmitResult } from "@fixback/sdk-core";
26
27
  import { type FormDataFactory } from "./http";
27
28
  import type { ReplayAttachment } from "./replay-encode";
28
- export { feedbackEndpoint };
29
- /** What ingest returns for an accepted submission (vendored server shape). */
30
- export interface RecordedFeedback {
31
- readonly feedbackId: string;
32
- readonly issueId: string;
33
- readonly reporterId: string;
34
- readonly tier: ReporterTier;
35
- }
29
+ export type { RecordedFeedback, SubmitResult } from "@fixback/sdk-core";
36
30
  /**
37
31
  * The captured screenshot to attach, if any — a React Native file reference.
38
32
  * The server accepts png/jpeg/webp/gif up to 10 MiB; `react-native-view-shot`
@@ -56,31 +50,6 @@ export interface SubmitInput {
56
50
  */
57
51
  readonly replay?: ReplayAttachment | null;
58
52
  }
59
- /** The outcome of a submission — never an exception. */
60
- export type SubmitResult = {
61
- readonly ok: true;
62
- readonly feedback: RecordedFeedback | null;
63
- } | {
64
- readonly ok: false;
65
- readonly reason: "unreachable" | "refused";
66
- readonly status?: number;
67
- } | {
68
- /**
69
- * A `source: error` report shed under ingest backpressure — either held
70
- * locally because the window is still open, or answered `429` by ingest,
71
- * which opened/extended the window. Manual reports never produce this.
72
- */
73
- readonly ok: false;
74
- readonly reason: "backpressure";
75
- readonly retryAfterSeconds: number;
76
- };
77
- /**
78
- * How long a submission may stay in flight before it is reported as
79
- * `unreachable`. React Native's Android networking applies no default request
80
- * timeout, so without this a stalled connection would hang a report forever.
81
- * The abandoned request keeps running in the background harmlessly.
82
- */
83
- export declare const DEFAULT_SUBMIT_TIMEOUT_MS = 30000;
84
53
  /**
85
54
  * Injectable transport collaborators, defaulted to the real implementations —
86
55
  * the same deps-object shape `requestBoot` takes, `origin` included.
@@ -97,7 +66,11 @@ export interface SubmitDeps {
97
66
  */
98
67
  readonly origin?: string;
99
68
  readonly backoff?: AutoReportBackoff;
100
- /** Overall request timeout in ms; `0` disables. Defaults to {@link DEFAULT_SUBMIT_TIMEOUT_MS}. */
69
+ /**
70
+ * Overall request timeout in ms; `0` disables. Defaults to `DEFAULT_SUBMIT_TIMEOUT_MS`
71
+ * — React Native's Android networking applies no default request timeout, so without
72
+ * one a stalled connection would hang a report forever.
73
+ */
101
74
  readonly timeoutMs?: number;
102
75
  }
103
76
  /**
package/dist/submit.js CHANGED
@@ -2,8 +2,9 @@
2
2
  /**
3
3
  * The multipart feedback submission — the transport half of the capture loop.
4
4
  *
5
- * The endpoint, the identity compaction, the backpressure window, and the `fetch`
6
- * surface are all shared with the browser SDK through `@fixback/sdk-core`
5
+ * The endpoint, the identity compaction, the backpressure window, the `fetch`
6
+ * surface, and the POST's tail — the gate, the timeout, reading ingest's answer
7
+ * (`postFeedback`) — are all shared with the browser SDK through `@fixback/sdk-core`
7
8
  * (ADR-0028); what stays here is the mobile envelope.
8
9
  *
9
10
  * `POST /api/ingest/feedback` is a multipart request: a single text part
@@ -24,10 +25,8 @@
24
25
  * `429` + `Retry-After` backpressure; manual reports are never gated.
25
26
  */
26
27
  Object.defineProperty(exports, "__esModule", { value: true });
27
- exports.DEFAULT_SUBMIT_TIMEOUT_MS = exports.feedbackEndpoint = void 0;
28
28
  exports.submitReport = submitReport;
29
29
  const sdk_core_1 = require("@fixback/sdk-core");
30
- Object.defineProperty(exports, "feedbackEndpoint", { enumerable: true, get: function () { return sdk_core_1.feedbackEndpoint; } });
31
30
  const http_1 = require("./http");
32
31
  /** The multipart field the screenshot binary is sent under (mirrors the server). */
33
32
  const SCREENSHOT_FIELD = "screenshot";
@@ -38,13 +37,6 @@ const SCREENSHOT_FIELD = "screenshot";
38
37
  * (ADR-0044).
39
38
  */
40
39
  const REPLAY_FIELD = "replay";
41
- /**
42
- * How long a submission may stay in flight before it is reported as
43
- * `unreachable`. React Native's Android networking applies no default request
44
- * timeout, so without this a stalled connection would hang a report forever.
45
- * The abandoned request keeps running in the background harmlessly.
46
- */
47
- exports.DEFAULT_SUBMIT_TIMEOUT_MS = 30_000;
48
40
  /**
49
41
  * The shared `source: error` backpressure window for the app. One instance so a
50
42
  * `429` from an auto-report holds the auto-reports that follow it.
@@ -65,17 +57,12 @@ const defaultBackoff = new sdk_core_1.AutoReportBackoff();
65
57
  */
66
58
  async function submitReport(apiUrl, input, deps = {}) {
67
59
  const source = input.content.source ?? "reporter";
68
- const isError = source === "error";
69
60
  const backoff = deps.backoff ?? defaultBackoff;
70
61
  // Client-side backpressure: shed auto-reports while the hold window is open,
71
- // without touching the network. Manual reports are never gated.
72
- if (isError && backoff.isPaused()) {
73
- return {
74
- ok: false,
75
- reason: "backpressure",
76
- retryAfterSeconds: backoff.retryAfterSeconds(),
77
- };
78
- }
62
+ // without touching the network — before the envelope is built.
63
+ const held = (0, sdk_core_1.backpressureHold)(source, backoff);
64
+ if (held)
65
+ return held;
79
66
  const doFetch = deps.fetch ?? (0, sdk_core_1.resolveFetch)();
80
67
  const makeForm = deps.formData ?? (0, http_1.globalFormData)();
81
68
  if (!doFetch || !makeForm)
@@ -121,49 +108,12 @@ async function submitReport(apiUrl, input, deps = {}) {
121
108
  type: input.replay.file.type,
122
109
  });
123
110
  }
124
- const timeoutMs = deps.timeoutMs ?? exports.DEFAULT_SUBMIT_TIMEOUT_MS;
125
- let timer;
126
- let response;
127
- try {
128
- const request = doFetch((0, sdk_core_1.feedbackEndpoint)(apiUrl), {
129
- method: "POST",
130
- headers: deps.origin ? { origin: deps.origin } : {},
131
- body: form,
132
- });
133
- response =
134
- timeoutMs > 0
135
- ? await Promise.race([
136
- request,
137
- new Promise((_, reject) => {
138
- timer = setTimeout(() => reject(new Error("fixback: submission timed out")), timeoutMs);
139
- }),
140
- ])
141
- : await request;
142
- }
143
- catch {
144
- return { ok: false, reason: "unreachable" };
145
- }
146
- finally {
147
- if (timer !== undefined)
148
- clearTimeout(timer);
149
- }
150
- if (!response.ok) {
151
- // A `429` for an auto-report is backpressure, not a refusal: open/extend
152
- // the hold window from `Retry-After` and report the wait. Manual reports
153
- // never 429 here, so any non-2xx for them stays a plain refusal.
154
- if (isError && response.status === 429) {
155
- const retryAfterSeconds = backoff.hold((0, sdk_core_1.safeHeader)(response, "Retry-After"));
156
- return { ok: false, reason: "backpressure", retryAfterSeconds };
157
- }
158
- return { ok: false, reason: "refused", status: response.status };
159
- }
160
- try {
161
- const feedback = (await response.json?.());
162
- return { ok: true, feedback };
163
- }
164
- catch {
165
- // Accepted, but the body wasn't the expected JSON — still a success.
166
- return { ok: true, feedback: null };
167
- }
111
+ return (0, sdk_core_1.postFeedback)((0, sdk_core_1.feedbackEndpoint)(apiUrl), form, {
112
+ fetch: doFetch,
113
+ headers: deps.origin ? { origin: deps.origin } : {},
114
+ timeoutMs: deps.timeoutMs ?? sdk_core_1.DEFAULT_SUBMIT_TIMEOUT_MS,
115
+ backoff,
116
+ source,
117
+ });
168
118
  }
169
119
  //# sourceMappingURL=submit.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"submit.js","sourceRoot":"","sources":["../src/submit.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"submit.js","sourceRoot":"","sources":["../src/submit.ts"],"names":[],"mappings":"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"}
package/dist/tokens.d.ts CHANGED
@@ -2,9 +2,11 @@
2
2
  * A vendored slice of the **Signal** design tokens for the mobile composer.
3
3
  *
4
4
  * React Native cannot consume CSS custom properties, so the semantic roles the
5
- * composer needs are mirrored here as constants. Every value traces to
6
- * `packages/ui/src/tokens.css` (the design source of truth) — change it there
7
- * first, then keep this slice in step (ADR-0021 records the gap).
5
+ * composer needs are mirrored here as constants. Each value copies a token from
6
+ * `packages/ui/src/tokens.css` (the design source of truth), or is one of the few
7
+ * the composer draws with that Signal names no token for. `tokens.test.ts` holds
8
+ * every copy to the token it copies and names the rest. Change `tokens.css` first,
9
+ * then keep this slice in step (ADR-0021 records the gap).
8
10
  *
9
11
  * IBM Plex is not loadable without the host app shipping fonts, so type falls
10
12
  * back to the system stack; the mono accents use the platform's monospace face
@@ -39,6 +41,9 @@ export declare const signal: {
39
41
  readonly success: "#2f9e5b";
40
42
  readonly successSurface: "#e5f5eb";
41
43
  readonly successBorder: "#bfe6cd";
44
+ readonly warningText: "#a36000";
45
+ readonly warningSurface: "#fdf3e2";
46
+ readonly warningBorder: "#f3d9a6";
42
47
  readonly idea: "#8b5cf6";
43
48
  readonly ideaSurface: "#f1ecfe";
44
49
  readonly ideaBorder: "#e0d4fb";
package/dist/tokens.js CHANGED
@@ -5,9 +5,11 @@ exports.signal = void 0;
5
5
  * A vendored slice of the **Signal** design tokens for the mobile composer.
6
6
  *
7
7
  * React Native cannot consume CSS custom properties, so the semantic roles the
8
- * composer needs are mirrored here as constants. Every value traces to
9
- * `packages/ui/src/tokens.css` (the design source of truth) — change it there
10
- * first, then keep this slice in step (ADR-0021 records the gap).
8
+ * composer needs are mirrored here as constants. Each value copies a token from
9
+ * `packages/ui/src/tokens.css` (the design source of truth), or is one of the few
10
+ * the composer draws with that Signal names no token for. `tokens.test.ts` holds
11
+ * every copy to the token it copies and names the rest. Change `tokens.css` first,
12
+ * then keep this slice in step (ADR-0021 records the gap).
11
13
  *
12
14
  * IBM Plex is not loadable without the host app shipping fonts, so type falls
13
15
  * back to the system stack; the mono accents use the platform's monospace face
@@ -34,9 +36,9 @@ exports.signal = {
34
36
  border: "#e6ebf0",
35
37
  borderControl: "#e0e6ec",
36
38
  borderStrong: "#dce3ea",
37
- /* the reporter's ink title bar — roles invert on the dark ground, so the
38
- composer's header matches the web overlay's `--fb-color-ink` / `--fb-color-on-ink*`
39
- (packages/sdk/src/overlay-styles.ts, board `4a`). Kept in step by value. */
39
+ /* the reporter's ink title bar (board `4a`) — roles invert on the dark ground. The
40
+ ground is Signal's heading ink; the muted, subtle and hairline roles on it are the
41
+ composer's own, since the web panel's header went light (docs/agents/design.md). */
40
42
  ink: "#0f1720",
41
43
  onInk: "#ffffff",
42
44
  onInkMuted: "#8996a2",
@@ -49,6 +51,10 @@ exports.signal = {
49
51
  success: "#2f9e5b",
50
52
  successSurface: "#e5f5eb",
51
53
  successBorder: "#bfe6cd",
54
+ /* --fb-color-warning-text / -surface / -border — maintenance mode's notice */
55
+ warningText: "#a36000",
56
+ warningSurface: "#fdf3e2",
57
+ warningBorder: "#f3d9a6",
52
58
  idea: "#8b5cf6",
53
59
  ideaSurface: "#f1ecfe",
54
60
  ideaBorder: "#e0d4fb",
@@ -1 +1 @@
1
- {"version":3,"file":"tokens.js","sourceRoot":"","sources":["../src/tokens.ts"],"names":[],"mappings":";;;AAAA;;;;;;;;;;;;GAYG;AACU,QAAA,MAAM,GAAG;IACpB,+BAA+B;IAC/B,MAAM,EAAE,SAAS;IACjB,UAAU,EAAE,SAAS;IACrB,YAAY,EAAE,SAAS;IAEvB,2BAA2B;IAC3B,IAAI,EAAE,SAAS;IACf,SAAS,EAAE,SAAS;IACpB,SAAS,EAAE,SAAS;IACpB,SAAS,EAAE,SAAS;IACpB,UAAU,EAAE,SAAS;IACrB,SAAS,EAAE,SAAS;IAEpB,wBAAwB;IACxB,OAAO,EAAE,SAAS;IAClB,MAAM,EAAE,SAAS;IACjB,MAAM,EAAE,SAAS;IACjB,IAAI,EAAE,SAAS;IACf,MAAM,EAAE,SAAS;IACjB,aAAa,EAAE,SAAS;IACxB,YAAY,EAAE,SAAS;IAEvB;;kFAE8E;IAC9E,GAAG,EAAE,SAAS;IACd,KAAK,EAAE,SAAS;IAChB,UAAU,EAAE,SAAS;IACrB,WAAW,EAAE,SAAS;IACtB,WAAW,EAAE,2BAA2B;IAExC,yFAAyF;IACzF,MAAM,EAAE,SAAS;IACjB,aAAa,EAAE,SAAS;IACxB,YAAY,EAAE,SAAS;IACvB,OAAO,EAAE,SAAS;IAClB,cAAc,EAAE,SAAS;IACzB,aAAa,EAAE,SAAS;IACxB,IAAI,EAAE,SAAS;IACf,WAAW,EAAE,SAAS;IACtB,UAAU,EAAE,SAAS;IAErB,cAAc;IACd,UAAU,EAAE,SAAS;IACrB,KAAK,EAAE,wBAAwB;CACvB,CAAC"}
1
+ {"version":3,"file":"tokens.js","sourceRoot":"","sources":["../src/tokens.ts"],"names":[],"mappings":";;;AAAA;;;;;;;;;;;;;;GAcG;AACU,QAAA,MAAM,GAAG;IACpB,+BAA+B;IAC/B,MAAM,EAAE,SAAS;IACjB,UAAU,EAAE,SAAS;IACrB,YAAY,EAAE,SAAS;IAEvB,2BAA2B;IAC3B,IAAI,EAAE,SAAS;IACf,SAAS,EAAE,SAAS;IACpB,SAAS,EAAE,SAAS;IACpB,SAAS,EAAE,SAAS;IACpB,UAAU,EAAE,SAAS;IACrB,SAAS,EAAE,SAAS;IAEpB,wBAAwB;IACxB,OAAO,EAAE,SAAS;IAClB,MAAM,EAAE,SAAS;IACjB,MAAM,EAAE,SAAS;IACjB,IAAI,EAAE,SAAS;IACf,MAAM,EAAE,SAAS;IACjB,aAAa,EAAE,SAAS;IACxB,YAAY,EAAE,SAAS;IAEvB;;0FAEsF;IACtF,GAAG,EAAE,SAAS;IACd,KAAK,EAAE,SAAS;IAChB,UAAU,EAAE,SAAS;IACrB,WAAW,EAAE,SAAS;IACtB,WAAW,EAAE,2BAA2B;IAExC,yFAAyF;IACzF,MAAM,EAAE,SAAS;IACjB,aAAa,EAAE,SAAS;IACxB,YAAY,EAAE,SAAS;IACvB,OAAO,EAAE,SAAS;IAClB,cAAc,EAAE,SAAS;IACzB,aAAa,EAAE,SAAS;IACxB,8EAA8E;IAC9E,WAAW,EAAE,SAAS;IACtB,cAAc,EAAE,SAAS;IACzB,aAAa,EAAE,SAAS;IACxB,IAAI,EAAE,SAAS;IACf,WAAW,EAAE,SAAS;IACtB,UAAU,EAAE,SAAS;IAErB,cAAc;IACd,UAAU,EAAE,SAAS;IACrB,KAAK,EAAE,wBAAwB;CACvB,CAAC"}
package/dist/version.d.ts CHANGED
@@ -10,4 +10,4 @@
10
10
  * ever drift. Do not hand-edit this line to a value other than `package.json`'s
11
11
  * version.
12
12
  */
13
- export declare const EXPO_SDK_VERSION = "0.8.3";
13
+ export declare const EXPO_SDK_VERSION = "0.9.1";
package/dist/version.js CHANGED
@@ -13,5 +13,5 @@ exports.EXPO_SDK_VERSION = void 0;
13
13
  * ever drift. Do not hand-edit this line to a value other than `package.json`'s
14
14
  * version.
15
15
  */
16
- exports.EXPO_SDK_VERSION = "0.8.3";
16
+ exports.EXPO_SDK_VERSION = "0.9.1";
17
17
  //# sourceMappingURL=version.js.map
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@fixback/expo",
3
- "version": "0.8.3",
3
+ "version": "0.9.1",
4
4
  "description": "The Fixback capture SDK for Expo / React Native apps — shake the device to report feedback with trace Evidence.",
5
5
  "license": "MIT",
6
6
  "type": "module",
@@ -54,11 +54,12 @@
54
54
  "react": "19.2.8",
55
55
  "react-native": "^0.81.0",
56
56
  "typescript": "5.9.3",
57
- "vitest": "^4.1.10"
57
+ "vitest": "^4.1.10",
58
+ "@fixback/test-config": "0.0.0"
58
59
  },
59
60
  "dependencies": {
60
61
  "@fixback/expo-replay-encoder": "0.2.3",
61
- "@fixback/sdk-core": "0.11.1"
62
+ "@fixback/sdk-core": "0.13.0"
62
63
  },
63
64
  "engines": {
64
65
  "node": ">=20.12"