cursedbelt 5.86.0 โ 5.87.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/dist/react/engagement/beacon.d.ts +8 -1
- package/dist/react/engagement/beacon.d.ts.map +1 -1
- package/dist/react/engagement/beacon.js +22 -7
- package/dist/react/engagement/beacon.js.map +1 -1
- package/dist/react/engagement/beaconClient.d.ts +27 -0
- package/dist/react/engagement/beaconClient.d.ts.map +1 -1
- package/dist/react/engagement/beaconClient.js +45 -0
- package/dist/react/engagement/beaconClient.js.map +1 -1
- package/dist/react/engagement/index.d.ts +2 -2
- package/dist/react/engagement/index.d.ts.map +1 -1
- package/dist/react/engagement/index.js +3 -3
- package/dist/react/engagement/index.js.map +1 -1
- package/dist/testing/appleWalk.d.ts +7 -0
- package/dist/testing/appleWalk.d.ts.map +1 -1
- package/dist/testing/appleWalk.js +19 -1
- package/dist/testing/appleWalk.js.map +1 -1
- package/package.json +1 -1
- package/src/react/engagement/beacon.spec.tsx +62 -0
- package/src/react/engagement/beacon.tsx +32 -7
- package/src/react/engagement/beaconClient.spec.ts +44 -1
- package/src/react/engagement/beaconClient.ts +50 -0
- package/src/react/engagement/index.ts +4 -2
- package/src/testing/appleWalk.ts +17 -1
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import { type ReportPlaceOptions } from "./beaconClient.js";
|
|
1
|
+
import { type ReportActionOptions, type ReportPlaceOptions } from "./beaconClient.js";
|
|
2
2
|
/**
|
|
3
3
|
* Report `place` whenever it changes.
|
|
4
4
|
*
|
|
@@ -8,6 +8,13 @@ import { type ReportPlaceOptions } from "./beaconClient.js";
|
|
|
8
8
|
* placeholder becomes a real row in the console.
|
|
9
9
|
*/
|
|
10
10
|
export declare function useEngagementBeacon(place: string | null, options?: ReportPlaceOptions): void;
|
|
11
|
+
/**
|
|
12
|
+
* A press handler that reports `action` as used (forge task 3470) โ `const onSearch =
|
|
13
|
+
* useEngagementAction("search")`, then call it where the feature RUNS. Stable across renders, so it
|
|
14
|
+
* can sit in a dependency list; fire-and-forget, like everything here. `reportAction` says what it
|
|
15
|
+
* may and may not carry.
|
|
16
|
+
*/
|
|
17
|
+
export declare function useEngagementAction(action: string, options?: ReportActionOptions): () => void;
|
|
11
18
|
/**
|
|
12
19
|
* Report wherever the browser IS, and keep reporting as it moves.
|
|
13
20
|
*
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"beacon.d.ts","sourceRoot":"","sources":["../../../src/react/engagement/beacon.tsx"],"names":[],"mappings":"AAQA,OAAO,
|
|
1
|
+
{"version":3,"file":"beacon.d.ts","sourceRoot":"","sources":["../../../src/react/engagement/beacon.tsx"],"names":[],"mappings":"AAQA,OAAO,EACN,KAAK,mBAAmB,EACxB,KAAK,kBAAkB,EAIvB,MAAM,mBAAmB,CAAC;AAE3B;;;;;;;GAOG;AACH,wBAAgB,mBAAmB,CAAC,KAAK,EAAE,MAAM,GAAG,IAAI,EAAE,OAAO,GAAE,kBAAuB,GAAG,IAAI,CAWhG;AAED;;;;;GAKG;AACH,wBAAgB,mBAAmB,CAAC,MAAM,EAAE,MAAM,EAAE,OAAO,GAAE,mBAAwB,GAAG,MAAM,IAAI,CAKjG;AAED;;;;;;;;;;;;;GAaG;AACH,wBAAgB,iBAAiB,CAAC,OAAO,GAAE,kBAAuB,GAAG,IAAI,CASxE;AAED;;;;;;;;GAQG;AAEH,wBAAgB,gBAAgB,CAAC,KAAK,EAAE;IAAE,QAAQ,CAAC,EAAE,MAAM,CAAA;CAAE,GAAG,IAAI,CAGnE"}
|
|
@@ -5,8 +5,8 @@
|
|
|
5
5
|
* no DOM) can import `reportPlace` without pulling React in, and so the app's
|
|
6
6
|
* own router stays the thing that decides what "a place" is.
|
|
7
7
|
*/
|
|
8
|
-
import { useEffect } from "react";
|
|
9
|
-
import { reportPlace, startLocationBeacon } from "./beaconClient.js";
|
|
8
|
+
import { useCallback, useEffect } from "react";
|
|
9
|
+
import { reportAction, reportPlace, startLocationBeacon, } from "./beaconClient.js";
|
|
10
10
|
/**
|
|
11
11
|
* Report `place` whenever it changes.
|
|
12
12
|
*
|
|
@@ -16,14 +16,29 @@ import { reportPlace, startLocationBeacon } from "./beaconClient.js";
|
|
|
16
16
|
* placeholder becomes a real row in the console.
|
|
17
17
|
*/
|
|
18
18
|
export function useEngagementBeacon(place, options = {}) {
|
|
19
|
-
|
|
19
|
+
// ๐ด Every field, not just `basePath` (forge task 3538): rebuilding the object as `{ basePath }`
|
|
20
|
+
// dropped `assumeSignedIn`, so desk โ whose door is Cloudflare Access, with no session route โ
|
|
21
|
+
// still probed `/api/auth/session` and its 404 put a console error on every page.
|
|
22
|
+
const { basePath, fetchImpl, sessionPath, assumeSignedIn } = options;
|
|
20
23
|
useEffect(() => {
|
|
21
24
|
if (!place)
|
|
22
25
|
return;
|
|
23
26
|
// Fire and forget; `reportPlace` never rejects. Not awaited on purpose โ
|
|
24
27
|
// a route change must not wait on telemetry.
|
|
25
|
-
void reportPlace(place,
|
|
26
|
-
}, [place, basePath]);
|
|
28
|
+
void reportPlace(place, { basePath, fetchImpl, sessionPath, assumeSignedIn });
|
|
29
|
+
}, [place, basePath, fetchImpl, sessionPath, assumeSignedIn]);
|
|
30
|
+
}
|
|
31
|
+
/**
|
|
32
|
+
* A press handler that reports `action` as used (forge task 3470) โ `const onSearch =
|
|
33
|
+
* useEngagementAction("search")`, then call it where the feature RUNS. Stable across renders, so it
|
|
34
|
+
* can sit in a dependency list; fire-and-forget, like everything here. `reportAction` says what it
|
|
35
|
+
* may and may not carry.
|
|
36
|
+
*/
|
|
37
|
+
export function useEngagementAction(action, options = {}) {
|
|
38
|
+
const { basePath, fetchImpl, sessionPath, assumeSignedIn, place } = options;
|
|
39
|
+
return useCallback(() => {
|
|
40
|
+
void reportAction(action, { basePath, fetchImpl, sessionPath, assumeSignedIn, place });
|
|
41
|
+
}, [action, basePath, fetchImpl, sessionPath, assumeSignedIn, place]);
|
|
27
42
|
}
|
|
28
43
|
/**
|
|
29
44
|
* Report wherever the browser IS, and keep reporting as it moves.
|
|
@@ -40,11 +55,11 @@ export function useEngagementBeacon(place, options = {}) {
|
|
|
40
55
|
* de-duplicates, so a re-render costs nothing.
|
|
41
56
|
*/
|
|
42
57
|
export function useLocationBeacon(options = {}) {
|
|
43
|
-
const basePath = options
|
|
58
|
+
const { basePath, fetchImpl, sessionPath, assumeSignedIn } = options;
|
|
44
59
|
// Delegates to the plain-JS starter so there is ONE implementation of the
|
|
45
60
|
// listener set. Most apps call `startLocationBeacon()` from `main.tsx`
|
|
46
61
|
// instead; this exists for a shell that would rather own the lifetime.
|
|
47
|
-
useEffect(() => startLocationBeacon(
|
|
62
|
+
useEffect(() => startLocationBeacon({ basePath, fetchImpl, sessionPath, assumeSignedIn }), [basePath, fetchImpl, sessionPath, assumeSignedIn]);
|
|
48
63
|
}
|
|
49
64
|
/**
|
|
50
65
|
* The location beacon as an element, for a shell that mounts declaratively.
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"beacon.js","sourceRoot":"","sources":["../../../src/react/engagement/beacon.tsx"],"names":[],"mappings":"AAAA;;;;;;GAMG;AACH,OAAO,EAAE,SAAS,EAAE,MAAM,OAAO,CAAC;
|
|
1
|
+
{"version":3,"file":"beacon.js","sourceRoot":"","sources":["../../../src/react/engagement/beacon.tsx"],"names":[],"mappings":"AAAA;;;;;;GAMG;AACH,OAAO,EAAE,WAAW,EAAE,SAAS,EAAE,MAAM,OAAO,CAAC;AAC/C,OAAO,EAGN,YAAY,EACZ,WAAW,EACX,mBAAmB,GACnB,MAAM,mBAAmB,CAAC;AAE3B;;;;;;;GAOG;AACH,MAAM,UAAU,mBAAmB,CAAC,KAAoB,EAAE,UAA8B,EAAE;IACzF,iGAAiG;IACjG,+FAA+F;IAC/F,kFAAkF;IAClF,MAAM,EAAE,QAAQ,EAAE,SAAS,EAAE,WAAW,EAAE,cAAc,EAAE,GAAG,OAAO,CAAC;IACrE,SAAS,CAAC,GAAG,EAAE;QACd,IAAI,CAAC,KAAK;YAAE,OAAO;QACnB,yEAAyE;QACzE,6CAA6C;QAC7C,KAAK,WAAW,CAAC,KAAK,EAAE,EAAE,QAAQ,EAAE,SAAS,EAAE,WAAW,EAAE,cAAc,EAAE,CAAC,CAAC;IAC/E,CAAC,EAAE,CAAC,KAAK,EAAE,QAAQ,EAAE,SAAS,EAAE,WAAW,EAAE,cAAc,CAAC,CAAC,CAAC;AAC/D,CAAC;AAED;;;;;GAKG;AACH,MAAM,UAAU,mBAAmB,CAAC,MAAc,EAAE,UAA+B,EAAE;IACpF,MAAM,EAAE,QAAQ,EAAE,SAAS,EAAE,WAAW,EAAE,cAAc,EAAE,KAAK,EAAE,GAAG,OAAO,CAAC;IAC5E,OAAO,WAAW,CAAC,GAAG,EAAE;QACvB,KAAK,YAAY,CAAC,MAAM,EAAE,EAAE,QAAQ,EAAE,SAAS,EAAE,WAAW,EAAE,cAAc,EAAE,KAAK,EAAE,CAAC,CAAC;IACxF,CAAC,EAAE,CAAC,MAAM,EAAE,QAAQ,EAAE,SAAS,EAAE,WAAW,EAAE,cAAc,EAAE,KAAK,CAAC,CAAC,CAAC;AACvE,CAAC;AAED;;;;;;;;;;;;;GAaG;AACH,MAAM,UAAU,iBAAiB,CAAC,UAA8B,EAAE;IACjE,MAAM,EAAE,QAAQ,EAAE,SAAS,EAAE,WAAW,EAAE,cAAc,EAAE,GAAG,OAAO,CAAC;IACrE,0EAA0E;IAC1E,uEAAuE;IACvE,uEAAuE;IACvE,SAAS,CACR,GAAG,EAAE,CAAC,mBAAmB,CAAC,EAAE,QAAQ,EAAE,SAAS,EAAE,WAAW,EAAE,cAAc,EAAE,CAAC,EAC/E,CAAC,QAAQ,EAAE,SAAS,EAAE,WAAW,EAAE,cAAc,CAAC,CAClD,CAAC;AACH,CAAC;AAED;;;;;;;;GAQG;AACH,gEAAgE;AAChE,MAAM,UAAU,gBAAgB,CAAC,KAA4B;IAC5D,iBAAiB,CAAC,KAAK,CAAC,QAAQ,CAAC,CAAC,CAAC,EAAE,QAAQ,EAAE,KAAK,CAAC,QAAQ,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC;IACtE,OAAO,IAAI,CAAC;AACb,CAAC"}
|
|
@@ -94,6 +94,33 @@ export declare function resetEngagementBeacon(): void;
|
|
|
94
94
|
* settle it without a timer.
|
|
95
95
|
*/
|
|
96
96
|
export declare function reportPlace(place: string, options?: ReportPlaceOptions): Promise<boolean>;
|
|
97
|
+
export interface ReportActionOptions extends ReportPlaceOptions {
|
|
98
|
+
/**
|
|
99
|
+
* The place the action happened on. Defaults to where the browser IS โ the server resolves it
|
|
100
|
+
* against the manifest exactly as it resolves a view, so the default is right for every app.
|
|
101
|
+
*/
|
|
102
|
+
place?: string;
|
|
103
|
+
}
|
|
104
|
+
/**
|
|
105
|
+
* Report that a FEATURE was used โ `reportAction("search")` โ beside the place it was used on
|
|
106
|
+
* (forge task 3470). Returns whether anything was sent.
|
|
107
|
+
*
|
|
108
|
+
* The owner's question is "what features do they use and ignore"; a page view cannot answer it,
|
|
109
|
+
* because one page holds several features. So the app names the action at the press, from the
|
|
110
|
+
* `actions` list its `routes.manifest.json` declares. The privacy contract is the place's:
|
|
111
|
+
*
|
|
112
|
+
* ยท ๐ด a NAME, never a value. `reportAction("search")` when a search RUNS โ never the query,
|
|
113
|
+
* and never once per keystroke (call it where the search commits, not in an onChange). There
|
|
114
|
+
* is no parameter for a value, so there is nowhere to put one.
|
|
115
|
+
* ยท an undeclared name records as `other` server-side, so a missing manifest entry shows up as
|
|
116
|
+
* a row rather than as a feature nobody uses.
|
|
117
|
+
* ยท the same silence: session-probed (the probe's answer is shared with `reportPlace`, one per
|
|
118
|
+
* page load), fire-and-forget, never throws, never logs.
|
|
119
|
+
*
|
|
120
|
+
* NOT de-duplicated, unlike `reportPlace`: three plays are three uses. Only call it from apps
|
|
121
|
+
* whose recorder was mounted WITH `actions` โ elsewhere `/action` is a 404 in the console.
|
|
122
|
+
*/
|
|
123
|
+
export declare function reportAction(action: string, options?: ReportActionOptions): Promise<boolean>;
|
|
97
124
|
/** Detaches the listeners `startLocationBeacon` installed. */
|
|
98
125
|
export type StopBeacon = () => void;
|
|
99
126
|
/**
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"beaconClient.d.ts","sourceRoot":"","sources":["../../../src/react/engagement/beaconClient.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAmDG;AAEH,2EAA2E;AAC3E,eAAO,MAAM,oBAAoB,oBAAoB,CAAC;AAEtD;;;;;;;GAOG;AACH,eAAO,MAAM,YAAY,sBAAsB,CAAC;AAEhD,MAAM,WAAW,kBAAkB;IAClC,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,iDAAiD;IACjD,SAAS,CAAC,EAAE,OAAO,KAAK,CAAC;IACzB,4EAA4E;IAC5E,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB;;;;;;;OAOG;IACH,cAAc,CAAC,EAAE,OAAO,CAAC;CACzB;AAaD;;;;;;GAMG;AACH,wBAAgB,oBAAoB,IAAI,MAAM,CAI7C;AAYD,8DAA8D;AAC9D,wBAAgB,qBAAqB,IAAI,IAAI,CAG5C;AAyBD;;;;;GAKG;AACH,wBAAsB,WAAW,CAChC,KAAK,EAAE,MAAM,EACb,OAAO,GAAE,kBAAuB,GAC9B,OAAO,CAAC,OAAO,CAAC,CA+BlB;AAED,8DAA8D;AAC9D,MAAM,MAAM,UAAU,GAAG,MAAM,IAAI,CAAC;AAIpC;;;;;;;;;;;;;;;;;;GAkBG;AACH,wBAAgB,mBAAmB,CAAC,OAAO,GAAE,kBAAuB,GAAG,UAAU,CAehF"}
|
|
1
|
+
{"version":3,"file":"beaconClient.d.ts","sourceRoot":"","sources":["../../../src/react/engagement/beaconClient.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAmDG;AAEH,2EAA2E;AAC3E,eAAO,MAAM,oBAAoB,oBAAoB,CAAC;AAEtD;;;;;;;GAOG;AACH,eAAO,MAAM,YAAY,sBAAsB,CAAC;AAEhD,MAAM,WAAW,kBAAkB;IAClC,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,iDAAiD;IACjD,SAAS,CAAC,EAAE,OAAO,KAAK,CAAC;IACzB,4EAA4E;IAC5E,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB;;;;;;;OAOG;IACH,cAAc,CAAC,EAAE,OAAO,CAAC;CACzB;AAaD;;;;;;GAMG;AACH,wBAAgB,oBAAoB,IAAI,MAAM,CAI7C;AAYD,8DAA8D;AAC9D,wBAAgB,qBAAqB,IAAI,IAAI,CAG5C;AAyBD;;;;;GAKG;AACH,wBAAsB,WAAW,CAChC,KAAK,EAAE,MAAM,EACb,OAAO,GAAE,kBAAuB,GAC9B,OAAO,CAAC,OAAO,CAAC,CA+BlB;AAED,MAAM,WAAW,mBAAoB,SAAQ,kBAAkB;IAC9D;;;OAGG;IACH,KAAK,CAAC,EAAE,MAAM,CAAC;CACf;AAED;;;;;;;;;;;;;;;;;;GAkBG;AACH,wBAAsB,YAAY,CAAC,MAAM,EAAE,MAAM,EAAE,OAAO,GAAE,mBAAwB,GAAG,OAAO,CAAC,OAAO,CAAC,CAqBtG;AAED,8DAA8D;AAC9D,MAAM,MAAM,UAAU,GAAG,MAAM,IAAI,CAAC;AAIpC;;;;;;;;;;;;;;;;;;GAkBG;AACH,wBAAgB,mBAAmB,CAAC,OAAO,GAAE,kBAAuB,GAAG,UAAU,CAehF"}
|
|
@@ -163,6 +163,51 @@ export async function reportPlace(place, options = {}) {
|
|
|
163
163
|
return false;
|
|
164
164
|
}
|
|
165
165
|
}
|
|
166
|
+
/**
|
|
167
|
+
* Report that a FEATURE was used โ `reportAction("search")` โ beside the place it was used on
|
|
168
|
+
* (forge task 3470). Returns whether anything was sent.
|
|
169
|
+
*
|
|
170
|
+
* The owner's question is "what features do they use and ignore"; a page view cannot answer it,
|
|
171
|
+
* because one page holds several features. So the app names the action at the press, from the
|
|
172
|
+
* `actions` list its `routes.manifest.json` declares. The privacy contract is the place's:
|
|
173
|
+
*
|
|
174
|
+
* ยท ๐ด a NAME, never a value. `reportAction("search")` when a search RUNS โ never the query,
|
|
175
|
+
* and never once per keystroke (call it where the search commits, not in an onChange). There
|
|
176
|
+
* is no parameter for a value, so there is nowhere to put one.
|
|
177
|
+
* ยท an undeclared name records as `other` server-side, so a missing manifest entry shows up as
|
|
178
|
+
* a row rather than as a feature nobody uses.
|
|
179
|
+
* ยท the same silence: session-probed (the probe's answer is shared with `reportPlace`, one per
|
|
180
|
+
* page load), fire-and-forget, never throws, never logs.
|
|
181
|
+
*
|
|
182
|
+
* NOT de-duplicated, unlike `reportPlace`: three plays are three uses. Only call it from apps
|
|
183
|
+
* whose recorder was mounted WITH `actions` โ elsewhere `/action` is a 404 in the console.
|
|
184
|
+
*/
|
|
185
|
+
export async function reportAction(action, options = {}) {
|
|
186
|
+
if (!action)
|
|
187
|
+
return false;
|
|
188
|
+
const doFetch = options.fetchImpl ?? globalThis.fetch;
|
|
189
|
+
if (typeof doFetch !== "function")
|
|
190
|
+
return false;
|
|
191
|
+
if (options.assumeSignedIn !== true) {
|
|
192
|
+
sessionAnswer ??= hasSession(options);
|
|
193
|
+
if (!(await sessionAnswer))
|
|
194
|
+
return false;
|
|
195
|
+
}
|
|
196
|
+
const place = options.place ?? (typeof window === "undefined" ? "/" : currentLocationPlace());
|
|
197
|
+
try {
|
|
198
|
+
await doFetch(`${options.basePath ?? ENGAGEMENT_BASE_PATH}/action`, {
|
|
199
|
+
method: "POST",
|
|
200
|
+
headers: { "content-type": "application/json" },
|
|
201
|
+
credentials: "same-origin",
|
|
202
|
+
body: JSON.stringify({ place, action }),
|
|
203
|
+
keepalive: true,
|
|
204
|
+
});
|
|
205
|
+
return true;
|
|
206
|
+
}
|
|
207
|
+
catch {
|
|
208
|
+
return false;
|
|
209
|
+
}
|
|
210
|
+
}
|
|
166
211
|
let running = null;
|
|
167
212
|
/**
|
|
168
213
|
* Start reporting wherever the browser is, and keep reporting as it moves.
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"beaconClient.js","sourceRoot":"","sources":["../../../src/react/engagement/beaconClient.ts"],"names":[],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"beaconClient.js","sourceRoot":"","sources":["../../../src/react/engagement/beaconClient.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,3 +1,3 @@
|
|
|
1
|
-
export { ENGAGEMENT_BASE_PATH, type ReportPlaceOptions, reportPlace, resetEngagementBeacon, SESSION_PATH, type StopBeacon, startLocationBeacon, currentLocationPlace, } from './beaconClient.js';
|
|
2
|
-
export { EngagementBeacon, useEngagementBeacon, useLocationBeacon } from './beacon.js';
|
|
1
|
+
export { ENGAGEMENT_BASE_PATH, type ReportActionOptions, type ReportPlaceOptions, reportAction, reportPlace, resetEngagementBeacon, SESSION_PATH, type StopBeacon, startLocationBeacon, currentLocationPlace, } from './beaconClient.js';
|
|
2
|
+
export { EngagementBeacon, useEngagementAction, useEngagementBeacon, useLocationBeacon } from './beacon.js';
|
|
3
3
|
//# sourceMappingURL=index.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/react/engagement/index.ts"],"names":[],"mappings":"AAEA,OAAO,EACN,oBAAoB,EACpB,KAAK,kBAAkB,EACvB,WAAW,EACX,qBAAqB,EACrB,YAAY,EACZ,KAAK,UAAU,EACf,mBAAmB,EACnB,oBAAoB,GACpB,MAAM,mBAAmB,CAAC;AAC3B,OAAO,EAAE,gBAAgB,EAAE,mBAAmB,EAAE,iBAAiB,EAAE,MAAM,aAAa,CAAC"}
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/react/engagement/index.ts"],"names":[],"mappings":"AAEA,OAAO,EACN,oBAAoB,EACpB,KAAK,mBAAmB,EACxB,KAAK,kBAAkB,EACvB,YAAY,EACZ,WAAW,EACX,qBAAqB,EACrB,YAAY,EACZ,KAAK,UAAU,EACf,mBAAmB,EACnB,oBAAoB,GACpB,MAAM,mBAAmB,CAAC;AAC3B,OAAO,EAAE,gBAAgB,EAAE,mBAAmB,EAAE,mBAAmB,EAAE,iBAAiB,EAAE,MAAM,aAAa,CAAC"}
|
|
@@ -1,5 +1,5 @@
|
|
|
1
|
-
// `cursedbelt/react/engagement-beacon` โ the engagement beacon: `reportPlace` and
|
|
1
|
+
// `cursedbelt/react/engagement-beacon` โ the engagement beacon: `reportPlace`, `reportAction` and
|
|
2
2
|
// `startLocationBeacon` (plain JS, no React) and the React hooks over them.
|
|
3
|
-
export { ENGAGEMENT_BASE_PATH, reportPlace, resetEngagementBeacon, SESSION_PATH, startLocationBeacon, currentLocationPlace, } from './beaconClient.js';
|
|
4
|
-
export { EngagementBeacon, useEngagementBeacon, useLocationBeacon } from './beacon.js';
|
|
3
|
+
export { ENGAGEMENT_BASE_PATH, reportAction, reportPlace, resetEngagementBeacon, SESSION_PATH, startLocationBeacon, currentLocationPlace, } from './beaconClient.js';
|
|
4
|
+
export { EngagementBeacon, useEngagementAction, useEngagementBeacon, useLocationBeacon } from './beacon.js';
|
|
5
5
|
//# sourceMappingURL=index.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/react/engagement/index.ts"],"names":[],"mappings":"AAAA,
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/react/engagement/index.ts"],"names":[],"mappings":"AAAA,kGAAkG;AAClG,4EAA4E;AAC5E,OAAO,EACN,oBAAoB,EAGpB,YAAY,EACZ,WAAW,EACX,qBAAqB,EACrB,YAAY,EAEZ,mBAAmB,EACnB,oBAAoB,GACpB,MAAM,mBAAmB,CAAC;AAC3B,OAAO,EAAE,gBAAgB,EAAE,mBAAmB,EAAE,mBAAmB,EAAE,iBAAiB,EAAE,MAAM,aAAa,CAAC"}
|
|
@@ -14,6 +14,13 @@ export declare const KEYBOARD_STANDIN = "(() => {\n const real = window.visualV
|
|
|
14
14
|
* A resize or a navigation can swap a whole layout โ family's phone shell remounts its page behind a
|
|
15
15
|
* Spinner and fills it ~450ms later, with no DOM mutation in between โ and a frame audited before
|
|
16
16
|
* that is the empty shell. Shared by the Chromium audit (`designBaseline.ts`) and the Apple pass.
|
|
17
|
+
*
|
|
18
|
+
* ๐ด A finite animation on the document's clock is FINISHED, not waited on (forge task 3534). That
|
|
19
|
+
* clock only advances when the browser paints a frame, and a loaded Mac starves frames: a table's
|
|
20
|
+
* 150ms `transition-colors` after the ledger's scheme switch was still mid-way when the 5s cap let
|
|
21
|
+
* the audit in, and binary-server's file rows read as light ink on a light row (FND-9). The audit
|
|
22
|
+
* judges a page at rest, which is exactly where `finish()` puts it; the poll still counts it as
|
|
23
|
+
* motion, so whatever its `transitionend` sets off settles before the audit reads anything.
|
|
17
24
|
*/
|
|
18
25
|
export declare function settleInPage(): Promise<void>;
|
|
19
26
|
/** Scrolls the page's main pane to `to` and says how far it can go. */
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"appleWalk.d.ts","sourceRoot":"","sources":["../../src/testing/appleWalk.ts"],"names":[],"mappings":"AAmBA,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,mBAAmB,CAAC;AACrD,OAAO,EAAE,KAAK,kBAAkB,EAAe,KAAK,eAAe,EAAE,KAAK,cAAc,EAAE,MAAM,kBAAkB,CAAC;AACnH,OAAO,EAA6B,KAAK,YAAY,EAA6C,MAAM,iBAAiB,CAAC;AAE1H;;;;GAIG;AACH,eAAO,MAAM,gBAAgB,61BAWxB,CAAC;AAEN
|
|
1
|
+
{"version":3,"file":"appleWalk.d.ts","sourceRoot":"","sources":["../../src/testing/appleWalk.ts"],"names":[],"mappings":"AAmBA,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,mBAAmB,CAAC;AACrD,OAAO,EAAE,KAAK,kBAAkB,EAAe,KAAK,eAAe,EAAE,KAAK,cAAc,EAAE,MAAM,kBAAkB,CAAC;AACnH,OAAO,EAA6B,KAAK,YAAY,EAA6C,MAAM,iBAAiB,CAAC;AAE1H;;;;GAIG;AACH,eAAO,MAAM,gBAAgB,61BAWxB,CAAC;AAEN;;;;;;;;;;;;;;GAcG;AACH,wBAAgB,YAAY,IAAI,OAAO,CAAC,IAAI,CAAC,CA8B5C;AAED,uEAAuE;AACvE,wBAAgB,gBAAgB,CAAC,EAAE,EAAE,MAAM,GAAG;IAAE,EAAE,EAAE,MAAM,CAAC;IAAC,GAAG,EAAE,MAAM,CAAA;CAAE,CAQxE;AAED,0HAA0H;AAC1H,wBAAgB,YAAY,IAAI,IAAI,CAKnC;AAED;;;;GAIG;AACH,wBAAgB,gBAAgB,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAarD;AAED,+IAA+I;AAC/I,wBAAsB,kBAAkB,CAAC,CAAC,QAAQ,EAAE,IAAI,CAAC,EAAE,SAAS,CAAC,MAAM,EAAE,MAAM,CAAC,GAAG,OAAO,CAAC,YAAY,CAAC,CA0B3G;AAED,2HAA2H;AAC3H,wBAAgB,4BAA4B,CAAC,MAAM,EAAE,MAAM,GAAG,OAAO,CAGpE;AAED,oCAAoC;AACpC,wBAAgB,kBAAkB,IAAI,IAAI,CAEzC;AAED,yGAAyG;AACzG,MAAM,WAAW,SAAU,SAAQ,cAAc;IAC/C,YAAY,IAAI;QAAE,KAAK,EAAE,MAAM,CAAC;QAAC,MAAM,EAAE,MAAM,CAAA;KAAE,GAAG,IAAI,CAAC;IACzD,UAAU,CAAC,CAAC,OAAO,EAAE;QAAE,IAAI,EAAE,MAAM,CAAA;KAAE,GAAG,OAAO,CAAC,OAAO,CAAC,CAAC;IACzD,cAAc,CAAC,CAAC,EAAE,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;CAC5C;AAED,MAAM,WAAW,iBAAkB,SAAQ,kBAAkB;IAC3D,qHAAqH;IACrH,IAAI,CAAC,EAAE,OAAO,CAAC;IACf,oGAAoG;IACpG,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,6GAA6G;IAC7G,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,kDAAkD;IAClD,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,iIAAiI;IACjI,KAAK,CAAC,EAAE,OAAO,CAAC;CACjB;AAKD,2EAA2E;AAC3E,wBAAgB,MAAM,CAAC,QAAQ,EAAE,eAAe,EAAE,GAAG,eAAe,EAAE,CAErE;AAED;;;;GAIG;AACH,wBAAsB,UAAU,CAAC,IAAI,EAAE,SAAS,EAAE,KAAK,EAAE,MAAM,EAAE,MAAM,EAAE,WAAW,EAAE,OAAO,GAAE,iBAAsB,GAAG,OAAO,CAAC;IAAE,UAAU,EAAE,eAAe,EAAE,CAAC;IAAC,SAAS,EAAE,MAAM,CAAA;CAAE,CAAC,CA+CpL"}
|
|
@@ -43,6 +43,13 @@ export const KEYBOARD_STANDIN = `(() => {
|
|
|
43
43
|
* A resize or a navigation can swap a whole layout โ family's phone shell remounts its page behind a
|
|
44
44
|
* Spinner and fills it ~450ms later, with no DOM mutation in between โ and a frame audited before
|
|
45
45
|
* that is the empty shell. Shared by the Chromium audit (`designBaseline.ts`) and the Apple pass.
|
|
46
|
+
*
|
|
47
|
+
* ๐ด A finite animation on the document's clock is FINISHED, not waited on (forge task 3534). That
|
|
48
|
+
* clock only advances when the browser paints a frame, and a loaded Mac starves frames: a table's
|
|
49
|
+
* 150ms `transition-colors` after the ledger's scheme switch was still mid-way when the 5s cap let
|
|
50
|
+
* the audit in, and binary-server's file rows read as light ink on a light row (FND-9). The audit
|
|
51
|
+
* judges a page at rest, which is exactly where `finish()` puts it; the poll still counts it as
|
|
52
|
+
* motion, so whatever its `transitionend` sets off settles before the audit reads anything.
|
|
46
53
|
*/
|
|
47
54
|
export function settleInPage() {
|
|
48
55
|
return new Promise((resolve) => {
|
|
@@ -54,7 +61,18 @@ export function settleInPage() {
|
|
|
54
61
|
observer.observe(document.body, { subtree: true, childList: true, characterData: true, attributes: true });
|
|
55
62
|
const started = performance.now();
|
|
56
63
|
const poll = setInterval(() => {
|
|
57
|
-
const
|
|
64
|
+
const moving = document.getAnimations().filter((a) => a.playState === 'running' && a.effect?.getComputedTiming().endTime !== Infinity);
|
|
65
|
+
for (const a of moving) {
|
|
66
|
+
if (a.timeline !== document.timeline)
|
|
67
|
+
continue; // a scroll-driven one is where the scroll puts it
|
|
68
|
+
try {
|
|
69
|
+
a.finish();
|
|
70
|
+
}
|
|
71
|
+
catch {
|
|
72
|
+
// A negative-rate or zero-length effect that cannot finish is still waited on, as before.
|
|
73
|
+
}
|
|
74
|
+
}
|
|
75
|
+
const animating = moving.length > 0;
|
|
58
76
|
const loading = [...document.querySelectorAll('.animate-spin, [aria-busy="true"]')].some((el) => el.checkVisibility({ opacityProperty: true, visibilityProperty: true }));
|
|
59
77
|
calm = changed || animating || loading ? 0 : calm + 1;
|
|
60
78
|
changed = false;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"appleWalk.js","sourceRoot":"","sources":["../../src/testing/appleWalk.ts"],"names":[],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"appleWalk.js","sourceRoot":"","sources":["../../src/testing/appleWalk.ts"],"names":[],"mappings":"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"}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "cursedbelt",
|
|
3
|
-
"version": "5.
|
|
3
|
+
"version": "5.87.0",
|
|
4
4
|
"license": "ISC",
|
|
5
5
|
"type": "module",
|
|
6
6
|
"description": "The React design system of the cursedbelt split โ components, styles, theme. cursedbelt-core below it; server tier in cursedbelt-server.",
|
|
@@ -0,0 +1,62 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* The React hooks hand `reportPlace` EVERY option they are given (forge task 3538).
|
|
3
|
+
*
|
|
4
|
+
* Both hooks used to rebuild the options as `{ basePath }`, so `assumeSignedIn`, `sessionPath` and
|
|
5
|
+
* `fetchImpl` vanished on the way through: desk asked for no session probe and got one, against a
|
|
6
|
+
* route it has never served.
|
|
7
|
+
*/
|
|
8
|
+
import { afterEach, beforeEach, describe, expect, test } from "bun:test";
|
|
9
|
+
import { cleanup, renderHook, waitFor } from "@testing-library/react";
|
|
10
|
+
import { useEngagementAction, useEngagementBeacon, useLocationBeacon } from "./beacon.js";
|
|
11
|
+
import { resetEngagementBeacon } from "./beaconClient.js";
|
|
12
|
+
|
|
13
|
+
/** A `fetch` that records every URL and answers every one signed in. */
|
|
14
|
+
function recordingFetch() {
|
|
15
|
+
const calls: string[] = [];
|
|
16
|
+
const impl = (async (input: string) => {
|
|
17
|
+
calls.push(String(input));
|
|
18
|
+
return { ok: true, status: 200, json: async () => ({ authenticated: true }) };
|
|
19
|
+
}) as unknown as typeof fetch;
|
|
20
|
+
return { impl, calls };
|
|
21
|
+
}
|
|
22
|
+
|
|
23
|
+
beforeEach(() => resetEngagementBeacon());
|
|
24
|
+
afterEach(() => cleanup());
|
|
25
|
+
|
|
26
|
+
describe("useEngagementBeacon", () => {
|
|
27
|
+
test("assumeSignedIn and fetchImpl reach reportPlace: one POST, no session probe", async () => {
|
|
28
|
+
const { impl, calls } = recordingFetch();
|
|
29
|
+
renderHook(() => useEngagementBeacon("board", { assumeSignedIn: true, fetchImpl: impl, basePath: "/api/eng" }));
|
|
30
|
+
await waitFor(() => expect(calls).toEqual(["/api/eng/view"]));
|
|
31
|
+
});
|
|
32
|
+
|
|
33
|
+
test("sessionPath reaches reportPlace: the probe goes where the app says", async () => {
|
|
34
|
+
const { impl, calls } = recordingFetch();
|
|
35
|
+
renderHook(() => useEngagementBeacon("board", { sessionPath: "/auth/me", fetchImpl: impl }));
|
|
36
|
+
await waitFor(() => expect(calls).toEqual(["/auth/me", "/api/engagement/view"]));
|
|
37
|
+
});
|
|
38
|
+
});
|
|
39
|
+
|
|
40
|
+
describe("useLocationBeacon", () => {
|
|
41
|
+
test("forwards every option to the location beacon too", async () => {
|
|
42
|
+
const { impl, calls } = recordingFetch();
|
|
43
|
+
const { unmount } = renderHook(() => useLocationBeacon({ assumeSignedIn: true, fetchImpl: impl }));
|
|
44
|
+
await waitFor(() => expect(calls).toEqual(["/api/engagement/view"]));
|
|
45
|
+
unmount();
|
|
46
|
+
});
|
|
47
|
+
});
|
|
48
|
+
|
|
49
|
+
describe("useEngagementAction", () => {
|
|
50
|
+
test("a stable handler that posts the action with every option it was given", async () => {
|
|
51
|
+
const { impl, calls } = recordingFetch();
|
|
52
|
+
const { result, rerender } = renderHook(() =>
|
|
53
|
+
useEngagementAction("search", { assumeSignedIn: true, fetchImpl: impl, basePath: "/api/eng", place: "library" }),
|
|
54
|
+
);
|
|
55
|
+
const first = result.current;
|
|
56
|
+
rerender();
|
|
57
|
+
expect(result.current).toBe(first);
|
|
58
|
+
expect(calls).toEqual([]);
|
|
59
|
+
result.current();
|
|
60
|
+
await waitFor(() => expect(calls).toEqual(["/api/eng/action"]));
|
|
61
|
+
});
|
|
62
|
+
});
|
|
@@ -5,8 +5,14 @@
|
|
|
5
5
|
* no DOM) can import `reportPlace` without pulling React in, and so the app's
|
|
6
6
|
* own router stays the thing that decides what "a place" is.
|
|
7
7
|
*/
|
|
8
|
-
import { useEffect } from "react";
|
|
9
|
-
import {
|
|
8
|
+
import { useCallback, useEffect } from "react";
|
|
9
|
+
import {
|
|
10
|
+
type ReportActionOptions,
|
|
11
|
+
type ReportPlaceOptions,
|
|
12
|
+
reportAction,
|
|
13
|
+
reportPlace,
|
|
14
|
+
startLocationBeacon,
|
|
15
|
+
} from "./beaconClient.js";
|
|
10
16
|
|
|
11
17
|
/**
|
|
12
18
|
* Report `place` whenever it changes.
|
|
@@ -17,13 +23,29 @@ import { type ReportPlaceOptions, reportPlace, startLocationBeacon } from "./bea
|
|
|
17
23
|
* placeholder becomes a real row in the console.
|
|
18
24
|
*/
|
|
19
25
|
export function useEngagementBeacon(place: string | null, options: ReportPlaceOptions = {}): void {
|
|
20
|
-
|
|
26
|
+
// ๐ด Every field, not just `basePath` (forge task 3538): rebuilding the object as `{ basePath }`
|
|
27
|
+
// dropped `assumeSignedIn`, so desk โ whose door is Cloudflare Access, with no session route โ
|
|
28
|
+
// still probed `/api/auth/session` and its 404 put a console error on every page.
|
|
29
|
+
const { basePath, fetchImpl, sessionPath, assumeSignedIn } = options;
|
|
21
30
|
useEffect(() => {
|
|
22
31
|
if (!place) return;
|
|
23
32
|
// Fire and forget; `reportPlace` never rejects. Not awaited on purpose โ
|
|
24
33
|
// a route change must not wait on telemetry.
|
|
25
|
-
void reportPlace(place,
|
|
26
|
-
}, [place, basePath]);
|
|
34
|
+
void reportPlace(place, { basePath, fetchImpl, sessionPath, assumeSignedIn });
|
|
35
|
+
}, [place, basePath, fetchImpl, sessionPath, assumeSignedIn]);
|
|
36
|
+
}
|
|
37
|
+
|
|
38
|
+
/**
|
|
39
|
+
* A press handler that reports `action` as used (forge task 3470) โ `const onSearch =
|
|
40
|
+
* useEngagementAction("search")`, then call it where the feature RUNS. Stable across renders, so it
|
|
41
|
+
* can sit in a dependency list; fire-and-forget, like everything here. `reportAction` says what it
|
|
42
|
+
* may and may not carry.
|
|
43
|
+
*/
|
|
44
|
+
export function useEngagementAction(action: string, options: ReportActionOptions = {}): () => void {
|
|
45
|
+
const { basePath, fetchImpl, sessionPath, assumeSignedIn, place } = options;
|
|
46
|
+
return useCallback(() => {
|
|
47
|
+
void reportAction(action, { basePath, fetchImpl, sessionPath, assumeSignedIn, place });
|
|
48
|
+
}, [action, basePath, fetchImpl, sessionPath, assumeSignedIn, place]);
|
|
27
49
|
}
|
|
28
50
|
|
|
29
51
|
/**
|
|
@@ -41,11 +63,14 @@ export function useEngagementBeacon(place: string | null, options: ReportPlaceOp
|
|
|
41
63
|
* de-duplicates, so a re-render costs nothing.
|
|
42
64
|
*/
|
|
43
65
|
export function useLocationBeacon(options: ReportPlaceOptions = {}): void {
|
|
44
|
-
const basePath = options
|
|
66
|
+
const { basePath, fetchImpl, sessionPath, assumeSignedIn } = options;
|
|
45
67
|
// Delegates to the plain-JS starter so there is ONE implementation of the
|
|
46
68
|
// listener set. Most apps call `startLocationBeacon()` from `main.tsx`
|
|
47
69
|
// instead; this exists for a shell that would rather own the lifetime.
|
|
48
|
-
useEffect(
|
|
70
|
+
useEffect(
|
|
71
|
+
() => startLocationBeacon({ basePath, fetchImpl, sessionPath, assumeSignedIn }),
|
|
72
|
+
[basePath, fetchImpl, sessionPath, assumeSignedIn],
|
|
73
|
+
);
|
|
49
74
|
}
|
|
50
75
|
|
|
51
76
|
/**
|
|
@@ -13,7 +13,7 @@
|
|
|
13
13
|
* this file runs in the package's plain `bun test`.
|
|
14
14
|
*/
|
|
15
15
|
import { beforeEach, describe, expect, test } from "bun:test";
|
|
16
|
-
import { reportPlace, resetEngagementBeacon, SESSION_PATH } from "./beaconClient.js";
|
|
16
|
+
import { reportAction, reportPlace, resetEngagementBeacon, SESSION_PATH } from "./beaconClient.js";
|
|
17
17
|
|
|
18
18
|
/** A `fetch` that records every call and answers from a script. */
|
|
19
19
|
function recordingFetch(answers: Record<string, { status?: number; body?: unknown }>) {
|
|
@@ -136,3 +136,46 @@ describe("a caller that already knows may skip the probe", () => {
|
|
|
136
136
|
expect(calls).toEqual(["/api/engagement/view"]);
|
|
137
137
|
});
|
|
138
138
|
});
|
|
139
|
+
|
|
140
|
+
describe("reportAction โ a feature NAME on a place, with the same silence (task 3470)", () => {
|
|
141
|
+
/** A `fetch` that keeps each POST's body too. */
|
|
142
|
+
function bodyFetch(signedIn: boolean) {
|
|
143
|
+
const posts: { url: string; body: unknown }[] = [];
|
|
144
|
+
const calls: string[] = [];
|
|
145
|
+
const impl = (async (input: string, init?: { body?: string }) => {
|
|
146
|
+
const url = String(input);
|
|
147
|
+
calls.push(url);
|
|
148
|
+
if (init?.body) posts.push({ url, body: JSON.parse(init.body) });
|
|
149
|
+
return { ok: true, status: 200, json: async () => ({ authenticated: signedIn }) };
|
|
150
|
+
}) as unknown as typeof fetch;
|
|
151
|
+
return { impl, calls, posts };
|
|
152
|
+
}
|
|
153
|
+
|
|
154
|
+
test("signed out, nothing but the probe", async () => {
|
|
155
|
+
const { impl, calls } = bodyFetch(false);
|
|
156
|
+
expect(await reportAction("search", { fetchImpl: impl, place: "library" })).toBe(false);
|
|
157
|
+
expect(calls).toEqual([SESSION_PATH]);
|
|
158
|
+
});
|
|
159
|
+
|
|
160
|
+
test("๐ด the body is the place and the action NAME โ nothing else can travel", async () => {
|
|
161
|
+
const { impl, posts } = bodyFetch(true);
|
|
162
|
+
expect(await reportAction("search", { fetchImpl: impl, place: "library" })).toBe(true);
|
|
163
|
+
expect(posts).toEqual([{ url: "/api/engagement/action", body: { place: "library", action: "search" } }]);
|
|
164
|
+
});
|
|
165
|
+
|
|
166
|
+
test("NOT de-duplicated: three plays are three uses, and one session probe", async () => {
|
|
167
|
+
const { impl, calls } = bodyFetch(true);
|
|
168
|
+
for (let i = 0; i < 3; i++) await reportAction("play", { fetchImpl: impl, place: "/" });
|
|
169
|
+
expect(calls).toEqual([SESSION_PATH, "/api/engagement/action", "/api/engagement/action", "/api/engagement/action"]);
|
|
170
|
+
});
|
|
171
|
+
|
|
172
|
+
test("an empty name sends nothing; a throwing fetch is false, never a rejection", async () => {
|
|
173
|
+
const { impl, calls } = bodyFetch(true);
|
|
174
|
+
expect(await reportAction("", { fetchImpl: impl })).toBe(false);
|
|
175
|
+
expect(calls).toEqual([]);
|
|
176
|
+
const boom = (async () => {
|
|
177
|
+
throw new Error("offline");
|
|
178
|
+
}) as unknown as typeof fetch;
|
|
179
|
+
expect(await reportAction("play", { fetchImpl: boom, assumeSignedIn: true, place: "/" })).toBe(false);
|
|
180
|
+
});
|
|
181
|
+
});
|
|
@@ -186,6 +186,56 @@ export async function reportPlace(
|
|
|
186
186
|
}
|
|
187
187
|
}
|
|
188
188
|
|
|
189
|
+
export interface ReportActionOptions extends ReportPlaceOptions {
|
|
190
|
+
/**
|
|
191
|
+
* The place the action happened on. Defaults to where the browser IS โ the server resolves it
|
|
192
|
+
* against the manifest exactly as it resolves a view, so the default is right for every app.
|
|
193
|
+
*/
|
|
194
|
+
place?: string;
|
|
195
|
+
}
|
|
196
|
+
|
|
197
|
+
/**
|
|
198
|
+
* Report that a FEATURE was used โ `reportAction("search")` โ beside the place it was used on
|
|
199
|
+
* (forge task 3470). Returns whether anything was sent.
|
|
200
|
+
*
|
|
201
|
+
* The owner's question is "what features do they use and ignore"; a page view cannot answer it,
|
|
202
|
+
* because one page holds several features. So the app names the action at the press, from the
|
|
203
|
+
* `actions` list its `routes.manifest.json` declares. The privacy contract is the place's:
|
|
204
|
+
*
|
|
205
|
+
* ยท ๐ด a NAME, never a value. `reportAction("search")` when a search RUNS โ never the query,
|
|
206
|
+
* and never once per keystroke (call it where the search commits, not in an onChange). There
|
|
207
|
+
* is no parameter for a value, so there is nowhere to put one.
|
|
208
|
+
* ยท an undeclared name records as `other` server-side, so a missing manifest entry shows up as
|
|
209
|
+
* a row rather than as a feature nobody uses.
|
|
210
|
+
* ยท the same silence: session-probed (the probe's answer is shared with `reportPlace`, one per
|
|
211
|
+
* page load), fire-and-forget, never throws, never logs.
|
|
212
|
+
*
|
|
213
|
+
* NOT de-duplicated, unlike `reportPlace`: three plays are three uses. Only call it from apps
|
|
214
|
+
* whose recorder was mounted WITH `actions` โ elsewhere `/action` is a 404 in the console.
|
|
215
|
+
*/
|
|
216
|
+
export async function reportAction(action: string, options: ReportActionOptions = {}): Promise<boolean> {
|
|
217
|
+
if (!action) return false;
|
|
218
|
+
const doFetch = options.fetchImpl ?? globalThis.fetch;
|
|
219
|
+
if (typeof doFetch !== "function") return false;
|
|
220
|
+
if (options.assumeSignedIn !== true) {
|
|
221
|
+
sessionAnswer ??= hasSession(options);
|
|
222
|
+
if (!(await sessionAnswer)) return false;
|
|
223
|
+
}
|
|
224
|
+
const place = options.place ?? (typeof window === "undefined" ? "/" : currentLocationPlace());
|
|
225
|
+
try {
|
|
226
|
+
await doFetch(`${options.basePath ?? ENGAGEMENT_BASE_PATH}/action`, {
|
|
227
|
+
method: "POST",
|
|
228
|
+
headers: { "content-type": "application/json" },
|
|
229
|
+
credentials: "same-origin",
|
|
230
|
+
body: JSON.stringify({ place, action }),
|
|
231
|
+
keepalive: true,
|
|
232
|
+
});
|
|
233
|
+
return true;
|
|
234
|
+
} catch {
|
|
235
|
+
return false;
|
|
236
|
+
}
|
|
237
|
+
}
|
|
238
|
+
|
|
189
239
|
/** Detaches the listeners `startLocationBeacon` installed. */
|
|
190
240
|
export type StopBeacon = () => void;
|
|
191
241
|
|
|
@@ -1,8 +1,10 @@
|
|
|
1
|
-
// `cursedbelt/react/engagement-beacon` โ the engagement beacon: `reportPlace` and
|
|
1
|
+
// `cursedbelt/react/engagement-beacon` โ the engagement beacon: `reportPlace`, `reportAction` and
|
|
2
2
|
// `startLocationBeacon` (plain JS, no React) and the React hooks over them.
|
|
3
3
|
export {
|
|
4
4
|
ENGAGEMENT_BASE_PATH,
|
|
5
|
+
type ReportActionOptions,
|
|
5
6
|
type ReportPlaceOptions,
|
|
7
|
+
reportAction,
|
|
6
8
|
reportPlace,
|
|
7
9
|
resetEngagementBeacon,
|
|
8
10
|
SESSION_PATH,
|
|
@@ -10,4 +12,4 @@ export {
|
|
|
10
12
|
startLocationBeacon,
|
|
11
13
|
currentLocationPlace,
|
|
12
14
|
} from './beaconClient.js';
|
|
13
|
-
export { EngagementBeacon, useEngagementBeacon, useLocationBeacon } from './beacon.js';
|
|
15
|
+
export { EngagementBeacon, useEngagementAction, useEngagementBeacon, useLocationBeacon } from './beacon.js';
|
package/src/testing/appleWalk.ts
CHANGED
|
@@ -46,6 +46,13 @@ export const KEYBOARD_STANDIN = `(() => {
|
|
|
46
46
|
* A resize or a navigation can swap a whole layout โ family's phone shell remounts its page behind a
|
|
47
47
|
* Spinner and fills it ~450ms later, with no DOM mutation in between โ and a frame audited before
|
|
48
48
|
* that is the empty shell. Shared by the Chromium audit (`designBaseline.ts`) and the Apple pass.
|
|
49
|
+
*
|
|
50
|
+
* ๐ด A finite animation on the document's clock is FINISHED, not waited on (forge task 3534). That
|
|
51
|
+
* clock only advances when the browser paints a frame, and a loaded Mac starves frames: a table's
|
|
52
|
+
* 150ms `transition-colors` after the ledger's scheme switch was still mid-way when the 5s cap let
|
|
53
|
+
* the audit in, and binary-server's file rows read as light ink on a light row (FND-9). The audit
|
|
54
|
+
* judges a page at rest, which is exactly where `finish()` puts it; the poll still counts it as
|
|
55
|
+
* motion, so whatever its `transitionend` sets off settles before the audit reads anything.
|
|
49
56
|
*/
|
|
50
57
|
export function settleInPage(): Promise<void> {
|
|
51
58
|
return new Promise<void>((resolve) => {
|
|
@@ -57,7 +64,16 @@ export function settleInPage(): Promise<void> {
|
|
|
57
64
|
observer.observe(document.body, { subtree: true, childList: true, characterData: true, attributes: true });
|
|
58
65
|
const started = performance.now();
|
|
59
66
|
const poll = setInterval(() => {
|
|
60
|
-
const
|
|
67
|
+
const moving = document.getAnimations().filter((a) => a.playState === 'running' && a.effect?.getComputedTiming().endTime !== Infinity);
|
|
68
|
+
for (const a of moving) {
|
|
69
|
+
if (a.timeline !== document.timeline) continue; // a scroll-driven one is where the scroll puts it
|
|
70
|
+
try {
|
|
71
|
+
a.finish();
|
|
72
|
+
} catch {
|
|
73
|
+
// A negative-rate or zero-length effect that cannot finish is still waited on, as before.
|
|
74
|
+
}
|
|
75
|
+
}
|
|
76
|
+
const animating = moving.length > 0;
|
|
61
77
|
const loading = [...document.querySelectorAll('.animate-spin, [aria-busy="true"]')].some((el) => el.checkVisibility({ opacityProperty: true, visibilityProperty: true }));
|
|
62
78
|
calm = changed || animating || loading ? 0 : calm + 1;
|
|
63
79
|
changed = false;
|