@gate-forge/witness 0.12.0 → 0.13.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/client/witness-client.d.ts +10 -1
- package/dist/client/witness-client.d.ts.map +1 -1
- package/dist/client/witness-client.js +11 -3
- package/dist/client/witness-client.js.map +1 -1
- package/dist/constants.d.ts +15 -0
- package/dist/constants.d.ts.map +1 -1
- package/dist/constants.js +21 -0
- package/dist/constants.js.map +1 -1
- package/dist/witness/api-settlement.d.ts +86 -0
- package/dist/witness/api-settlement.d.ts.map +1 -0
- package/dist/witness/api-settlement.js +150 -0
- package/dist/witness/api-settlement.js.map +1 -0
- package/dist/witness/browser.d.ts +13 -3
- package/dist/witness/browser.d.ts.map +1 -1
- package/dist/witness/browser.js +168 -2
- package/dist/witness/browser.js.map +1 -1
- package/dist/witness/classifications.d.ts +4 -6
- package/dist/witness/classifications.d.ts.map +1 -1
- package/dist/witness/classifications.js.map +1 -1
- package/dist/witness/page-observation.d.ts +93 -0
- package/dist/witness/page-observation.d.ts.map +1 -0
- package/dist/witness/page-observation.js +117 -0
- package/dist/witness/page-observation.js.map +1 -0
- package/dist/witness/page-observer-registration.d.ts +49 -0
- package/dist/witness/page-observer-registration.d.ts.map +1 -0
- package/dist/witness/page-observer-registration.js +194 -0
- package/dist/witness/page-observer-registration.js.map +1 -0
- package/dist/witness/page-observer.d.ts +18 -0
- package/dist/witness/page-observer.d.ts.map +1 -0
- package/dist/witness/page-observer.js +462 -0
- package/dist/witness/page-observer.js.map +1 -0
- package/dist/witness/server.d.ts.map +1 -1
- package/dist/witness/server.js +188 -1
- package/dist/witness/server.js.map +1 -1
- package/dist/witness/types.d.ts +70 -0
- package/dist/witness/types.d.ts.map +1 -1
- package/package.json +2 -2
|
@@ -0,0 +1,194 @@
|
|
|
1
|
+
import { driveEngineVisit } from './browser.js';
|
|
2
|
+
import { observePageBrowser } from './page-observer.js';
|
|
3
|
+
export class PageObserverRegistrationError extends Error {
|
|
4
|
+
status;
|
|
5
|
+
constructor(message, status) {
|
|
6
|
+
super(message);
|
|
7
|
+
this.status = status;
|
|
8
|
+
this.name = 'PageObserverRegistrationError';
|
|
9
|
+
}
|
|
10
|
+
}
|
|
11
|
+
export async function registerPageObserver(input) {
|
|
12
|
+
const { state, body } = input;
|
|
13
|
+
const session = input.requireSession(body);
|
|
14
|
+
if (body.testId !== session.testId)
|
|
15
|
+
throw new PageObserverRegistrationError('page observer test identity does not match its session', 403);
|
|
16
|
+
if (!Number.isInteger(body.debuggingPort) || body.debuggingPort < 1 || body.debuggingPort > 65535) {
|
|
17
|
+
throw new PageObserverRegistrationError('page observer debuggingPort must be a valid TCP port', 400);
|
|
18
|
+
}
|
|
19
|
+
// Authority cutover (0.13): the request carries NOTHING but session
|
|
20
|
+
// credentials and the debugging port. Every grading input comes from
|
|
21
|
+
// the supervisor-registered context; without one there is no page
|
|
22
|
+
// proof, whatever the suite body or environment claims.
|
|
23
|
+
const context = state.pageObservation;
|
|
24
|
+
if (context === null) {
|
|
25
|
+
throw new PageObserverRegistrationError('page observation refused: no controller-registered page-observation context exists for this run', 409);
|
|
26
|
+
}
|
|
27
|
+
// Static browser-API tamper risks match the SUPERVISOR-opened session
|
|
28
|
+
// identity (its registered spec file, or an applicable trusted test id)
|
|
29
|
+
// — never suite metadata, and never a mutable environment variable.
|
|
30
|
+
const tamperRisk = context.tamperRisks.find((risk) => (risk.testId !== null && risk.testId === session.testId) ||
|
|
31
|
+
(session.registeredFile !== null && risk.file === session.registeredFile));
|
|
32
|
+
if (tamperRisk !== undefined) {
|
|
33
|
+
throw new PageObserverRegistrationError('PAGE_OBSERVATION_TAMPER_RISK: page records refused for this test; browser API mutation at ' +
|
|
34
|
+
`${tamperRisk.locationFile}:${String(tamperRisk.line)}`, 403);
|
|
35
|
+
}
|
|
36
|
+
if (state.pageObservers.has(session.sessionId)) {
|
|
37
|
+
throw new PageObserverRegistrationError('page observer is already registered for this session', 409);
|
|
38
|
+
}
|
|
39
|
+
const usedExchanges = new Set();
|
|
40
|
+
let observationSequence = 0;
|
|
41
|
+
let observer;
|
|
42
|
+
try {
|
|
43
|
+
observer = await observePageBrowser({
|
|
44
|
+
debuggingPort: body.debuggingPort,
|
|
45
|
+
pages: context.pages,
|
|
46
|
+
loginRoutes: context.loginRoutes,
|
|
47
|
+
errorMarkers: context.errorMarkers,
|
|
48
|
+
appOrigins: context.appOrigins,
|
|
49
|
+
isProxiedExchange(url, status) {
|
|
50
|
+
const path = new URL(url).pathname;
|
|
51
|
+
const exchange = state.observed.find((candidate) => candidate.sessionId === session.sessionId && candidate.path === path && candidate.status === status &&
|
|
52
|
+
!usedExchanges.has(candidate.seq));
|
|
53
|
+
if (exchange === undefined)
|
|
54
|
+
return false;
|
|
55
|
+
usedExchanges.add(exchange.seq);
|
|
56
|
+
return true;
|
|
57
|
+
},
|
|
58
|
+
onVisit(visit, verdict) {
|
|
59
|
+
// An unmatched observation (out-of-table or undeclared-login page)
|
|
60
|
+
// must never mint obligation ids like `null:page:loads`; a matched
|
|
61
|
+
// page keeps its records even when the verdict refuses it.
|
|
62
|
+
if (!context.pages.some((page) => page.id === verdict.pageId))
|
|
63
|
+
return;
|
|
64
|
+
// Origin enforcement (0.13 authority cutover): a MATCHED route
|
|
65
|
+
// whose FINAL URL origin the controller never declared can never
|
|
66
|
+
// mint proof — the explicit refusal replaces the verdict, so
|
|
67
|
+
// wrong-origin content is recorded as refused, never satisfied.
|
|
68
|
+
let finalOrigin = null;
|
|
69
|
+
try {
|
|
70
|
+
finalOrigin = new URL(visit.url).origin;
|
|
71
|
+
}
|
|
72
|
+
catch {
|
|
73
|
+
finalOrigin = null;
|
|
74
|
+
}
|
|
75
|
+
let finalVerdict = verdict;
|
|
76
|
+
if (finalOrigin === null || !context.appOrigins.includes(finalOrigin)) {
|
|
77
|
+
finalVerdict = {
|
|
78
|
+
pageId: verdict.pageId,
|
|
79
|
+
finalUrl: visit.url,
|
|
80
|
+
loads: { satisfied: false, refusalReasons: ['PAGE_APP_ORIGIN_MISMATCH'] },
|
|
81
|
+
dataOk: { satisfied: false, refusalReasons: ['PAGE_APP_ORIGIN_MISMATCH'] },
|
|
82
|
+
};
|
|
83
|
+
}
|
|
84
|
+
const payload = {
|
|
85
|
+
channel: 'observed',
|
|
86
|
+
routeId: finalVerdict.pageId,
|
|
87
|
+
finalUrl: visit.url,
|
|
88
|
+
navigations: visit.navigations,
|
|
89
|
+
exceptions: visit.exceptions,
|
|
90
|
+
domMarkerHit: visit.domMarkerHit,
|
|
91
|
+
apiStatuses: visit.apiResponses.map(({ url, status, remoteAddress, proxied }) => ({ url, status, remoteAddress, proxied })),
|
|
92
|
+
// One payload shared by both promise records; the sequence
|
|
93
|
+
// increases on every observation of this registered session.
|
|
94
|
+
apiRequestsSettled: visit.apiRequestsSettled,
|
|
95
|
+
observationSequence: observationSequence++,
|
|
96
|
+
loads: finalVerdict.loads,
|
|
97
|
+
dataOk: finalVerdict.dataOk,
|
|
98
|
+
};
|
|
99
|
+
const recordIds = state.pageObservationRecords.get(session.sessionId) ?? [];
|
|
100
|
+
recordIds.push(input.issueRecord(`${finalVerdict.pageId}:page:loads`, session.testId, payload));
|
|
101
|
+
recordIds.push(input.issueRecord(`${finalVerdict.pageId}:page:data-ok`, session.testId, payload));
|
|
102
|
+
state.pageObservationRecords.set(session.sessionId, recordIds);
|
|
103
|
+
},
|
|
104
|
+
});
|
|
105
|
+
}
|
|
106
|
+
catch (error) {
|
|
107
|
+
throw new PageObserverRegistrationError(`could not attach page observer: ${error instanceof Error ? error.message : String(error)}`, 503);
|
|
108
|
+
}
|
|
109
|
+
state.pageObservers.set(session.sessionId, observer);
|
|
110
|
+
session.activity += 1;
|
|
111
|
+
input.response.writeHead(200, { 'content-type': 'application/json' });
|
|
112
|
+
input.response.end(JSON.stringify({ registered: true }));
|
|
113
|
+
}
|
|
114
|
+
/**
|
|
115
|
+
* Visits referee-selected page gaps in the engine-owned session and issues
|
|
116
|
+
* the same page-observation records with their independent channel.
|
|
117
|
+
*/
|
|
118
|
+
function normalizePageStorageState(raw) {
|
|
119
|
+
if (raw === undefined)
|
|
120
|
+
return undefined;
|
|
121
|
+
if (raw === null || typeof raw !== 'object' || !('cookies' in raw) || !Array.isArray(raw.cookies) ||
|
|
122
|
+
!('origins' in raw) || !Array.isArray(raw.origins)) {
|
|
123
|
+
throw new PageObserverRegistrationError('page sweep storage state must contain cookie and origin arrays', 400);
|
|
124
|
+
}
|
|
125
|
+
const cookies = raw.cookies.map((entry) => {
|
|
126
|
+
if (entry === null || typeof entry !== 'object' || !('name' in entry) || typeof entry.name !== 'string' ||
|
|
127
|
+
!('value' in entry) || typeof entry.value !== 'string' || !('domain' in entry) || typeof entry.domain !== 'string' ||
|
|
128
|
+
!('path' in entry) || typeof entry.path !== 'string' || !('expires' in entry) || typeof entry.expires !== 'number' ||
|
|
129
|
+
!('httpOnly' in entry) || typeof entry.httpOnly !== 'boolean' || !('secure' in entry) || typeof entry.secure !== 'boolean' ||
|
|
130
|
+
!('sameSite' in entry) || (entry.sameSite !== 'Strict' && entry.sameSite !== 'Lax' && entry.sameSite !== 'None')) {
|
|
131
|
+
throw new PageObserverRegistrationError('page sweep storage state contains an invalid cookie', 400);
|
|
132
|
+
}
|
|
133
|
+
return {
|
|
134
|
+
name: entry.name,
|
|
135
|
+
value: entry.value,
|
|
136
|
+
domain: entry.domain,
|
|
137
|
+
path: entry.path,
|
|
138
|
+
expires: entry.expires,
|
|
139
|
+
httpOnly: entry.httpOnly,
|
|
140
|
+
secure: entry.secure,
|
|
141
|
+
sameSite: entry.sameSite,
|
|
142
|
+
};
|
|
143
|
+
});
|
|
144
|
+
const origins = raw.origins.map((entry) => {
|
|
145
|
+
if (entry === null || typeof entry !== 'object' || !('origin' in entry) || typeof entry.origin !== 'string' ||
|
|
146
|
+
!('localStorage' in entry) || !Array.isArray(entry.localStorage)) {
|
|
147
|
+
throw new PageObserverRegistrationError('page sweep storage state contains an invalid origin', 400);
|
|
148
|
+
}
|
|
149
|
+
const localStorage = entry.localStorage.map((item) => {
|
|
150
|
+
if (item === null || typeof item !== 'object' || !('name' in item) || typeof item.name !== 'string' ||
|
|
151
|
+
!('value' in item) || typeof item.value !== 'string') {
|
|
152
|
+
throw new PageObserverRegistrationError('page sweep storage state contains an invalid local-storage value', 400);
|
|
153
|
+
}
|
|
154
|
+
return { name: item.name, value: item.value };
|
|
155
|
+
});
|
|
156
|
+
return { origin: entry.origin, localStorage };
|
|
157
|
+
});
|
|
158
|
+
return { cookies, origins };
|
|
159
|
+
}
|
|
160
|
+
export async function sweepPageVisits(input) {
|
|
161
|
+
const page = await input.browser.pageFor(input.sessionId, normalizePageStorageState(input.storageState));
|
|
162
|
+
const visits = [];
|
|
163
|
+
let observationSequence = 0;
|
|
164
|
+
for (const route of input.routes) {
|
|
165
|
+
const observation = await driveEngineVisit(page, input.appBase, route, input.routes, {
|
|
166
|
+
loginRoutes: input.loginRoutes,
|
|
167
|
+
errorMarkers: input.errorMarkers,
|
|
168
|
+
});
|
|
169
|
+
const { verdict, visit } = observation;
|
|
170
|
+
if (verdict.pageId === null) {
|
|
171
|
+
throw new PageObserverRegistrationError(`engine visit did not match a declared page route: ${route.path}`, 503);
|
|
172
|
+
}
|
|
173
|
+
const payload = {
|
|
174
|
+
channel: 'swept',
|
|
175
|
+
routeId: verdict.pageId,
|
|
176
|
+
finalUrl: visit.url,
|
|
177
|
+
navigations: visit.navigations,
|
|
178
|
+
exceptions: visit.exceptions,
|
|
179
|
+
domMarkerHit: visit.domMarkerHit,
|
|
180
|
+
apiStatuses: visit.apiResponses.map(({ url, status, remoteAddress, proxied }) => ({ url, status, remoteAddress, proxied })),
|
|
181
|
+
// One payload reused for both contracts; the sequence increases
|
|
182
|
+
// within this sweep.
|
|
183
|
+
apiRequestsSettled: visit.apiRequestsSettled,
|
|
184
|
+
observationSequence: observationSequence++,
|
|
185
|
+
loads: verdict.loads,
|
|
186
|
+
dataOk: verdict.dataOk,
|
|
187
|
+
};
|
|
188
|
+
input.issueRecord(`${verdict.pageId}:page:loads`, input.testId, payload);
|
|
189
|
+
input.issueRecord(`${verdict.pageId}:page:data-ok`, input.testId, payload);
|
|
190
|
+
visits.push({ routeId: verdict.pageId, verdict });
|
|
191
|
+
}
|
|
192
|
+
return visits;
|
|
193
|
+
}
|
|
194
|
+
//# sourceMappingURL=page-observer-registration.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"page-observer-registration.js","sourceRoot":"","sources":["../../src/witness/page-observer-registration.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,18 @@
|
|
|
1
|
+
import { type ObservedPageVisit, type PageRoute, type PageVisitVerdict } from './page-observation.js';
|
|
2
|
+
export interface PageObserverOptions {
|
|
3
|
+
debuggingPort: number;
|
|
4
|
+
pages: readonly PageRoute[];
|
|
5
|
+
loginRoutes?: readonly string[];
|
|
6
|
+
errorMarkers: readonly string[];
|
|
7
|
+
appOrigins: readonly string[];
|
|
8
|
+
isProxiedExchange: (url: string, status: number) => boolean;
|
|
9
|
+
onVisit: (visit: ObservedPageVisit, verdict: PageVisitVerdict) => void | Promise<void>;
|
|
10
|
+
quietMs?: number;
|
|
11
|
+
}
|
|
12
|
+
export interface PageObserver {
|
|
13
|
+
flush(): Promise<void>;
|
|
14
|
+
close(): Promise<void>;
|
|
15
|
+
}
|
|
16
|
+
/** Attach the witness's independent Playwright/CDP client to an existing browser. */
|
|
17
|
+
export declare function observePageBrowser(options: PageObserverOptions): Promise<PageObserver>;
|
|
18
|
+
//# sourceMappingURL=page-observer.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"page-observer.d.ts","sourceRoot":"","sources":["../../src/witness/page-observer.ts"],"names":[],"mappings":"AACA,OAAO,EAKL,KAAK,iBAAiB,EACtB,KAAK,SAAS,EACd,KAAK,gBAAgB,EACtB,MAAM,uBAAuB,CAAC;AAO/B,MAAM,WAAW,mBAAmB;IAClC,aAAa,EAAE,MAAM,CAAC;IACtB,KAAK,EAAE,SAAS,SAAS,EAAE,CAAC;IAC5B,WAAW,CAAC,EAAE,SAAS,MAAM,EAAE,CAAC;IAChC,YAAY,EAAE,SAAS,MAAM,EAAE,CAAC;IAChC,UAAU,EAAE,SAAS,MAAM,EAAE,CAAC;IAC9B,iBAAiB,EAAE,CAAC,GAAG,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,KAAK,OAAO,CAAC;IAC5D,OAAO,EAAE,CAAC,KAAK,EAAE,iBAAiB,EAAE,OAAO,EAAE,gBAAgB,KAAK,IAAI,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;IACvF,OAAO,CAAC,EAAE,MAAM,CAAC;CAClB;AAyDD,MAAM,WAAW,YAAY;IAC3B,KAAK,IAAI,OAAO,CAAC,IAAI,CAAC,CAAC;IACvB,KAAK,IAAI,OAAO,CAAC,IAAI,CAAC,CAAC;CACxB;AAoDD,qFAAqF;AACrF,wBAAsB,kBAAkB,CAAC,OAAO,EAAE,mBAAmB,GAAG,OAAO,CAAC,YAAY,CAAC,CAmY5F"}
|