@buoy-gg/network 7.0.40 → 7.0.42
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 +11 -79
- package/lib/commonjs/index.js +1 -325
- package/lib/commonjs/index.web.js +1 -420
- package/lib/commonjs/network/components/DataViewer.web.js +1 -879
- package/lib/commonjs/network/components/NetworkCopyScreen.web.js +1 -48
- package/lib/commonjs/network/components/NetworkCopySettingsView.js +27 -755
- package/lib/commonjs/network/components/NetworkCopySettingsView.web.js +14 -1242
- package/lib/commonjs/network/components/NetworkDetailScreen.web.js +1 -101
- package/lib/commonjs/network/components/NetworkDetailStepper.js +1 -108
- package/lib/commonjs/network/components/NetworkDetailStepper.web.js +1 -298
- package/lib/commonjs/network/components/NetworkEventDetailView.js +15 -1130
- package/lib/commonjs/network/components/NetworkEventDetailView.web.js +15 -1484
- package/lib/commonjs/network/components/NetworkEventItemCompact.js +2 -401
- package/lib/commonjs/network/components/NetworkEventItemCompact.web.js +2 -820
- package/lib/commonjs/network/components/NetworkFilterScreen.web.js +1 -55
- package/lib/commonjs/network/components/NetworkFilterViewV3.js +1 -442
- package/lib/commonjs/network/components/NetworkFilterViewV3.web.js +1 -1310
- package/lib/commonjs/network/components/NetworkHeaderLive.js +1 -375
- package/lib/commonjs/network/components/NetworkHeaderLive.web.js +1 -623
- package/lib/commonjs/network/components/NetworkHeaderMenu.js +1 -190
- package/lib/commonjs/network/components/NetworkListScreen.js +1 -404
- package/lib/commonjs/network/components/NetworkListScreen.web.js +1 -625
- package/lib/commonjs/network/components/NetworkModal.js +1 -786
- package/lib/commonjs/network/components/NetworkNumberPrompt.js +1 -178
- package/lib/commonjs/network/components/NetworkNumberPrompt.web.js +1 -232
- package/lib/commonjs/network/components/NetworkOverrideEditor.js +1 -814
- package/lib/commonjs/network/components/NetworkOverrideEditor.web.js +1 -942
- package/lib/commonjs/network/components/NetworkOverrideHeaderButton.js +1 -107
- package/lib/commonjs/network/components/NetworkOverrideHeaderButton.web.js +1 -133
- package/lib/commonjs/network/components/NetworkOverridesButton.js +1 -90
- package/lib/commonjs/network/components/NetworkOverridesButton.web.js +1 -143
- package/lib/commonjs/network/components/NetworkOverridesScreen.js +1 -543
- package/lib/commonjs/network/components/NetworkOverridesScreen.web.js +1 -830
- package/lib/commonjs/network/components/NetworkSavedScreen.js +1 -226
- package/lib/commonjs/network/components/NetworkSavedScreen.web.js +1 -463
- package/lib/commonjs/network/components/NetworkUpgradeBanner.js +1 -76
- package/lib/commonjs/network/components/response-editor/Explorer.js +1 -973
- package/lib/commonjs/network/components/response-editor/Explorer.web.js +1 -1136
- package/lib/commonjs/network/components/response-editor/deleteNestedDataByPath.js +1 -56
- package/lib/commonjs/network/components/response-editor/editorContext.js +1 -33
- package/lib/commonjs/network/components/response-editor/updateNestedDataByPath.js +1 -61
- package/lib/commonjs/network/conditions/NetworkConditionsControl.js +1 -235
- package/lib/commonjs/network/conditions/NetworkConditionsControl.test.js +1 -136
- package/lib/commonjs/network/conditions/NetworkConditionsIcon.js +1 -33
- package/lib/commonjs/network/conditions/NetworkFloatingTool.js +1 -310
- package/lib/commonjs/network/conditions/NetworkFloatingTool.test.js +1 -219
- package/lib/commonjs/network/conditions/store.js +1 -75
- package/lib/commonjs/network/conditions/wait.js +1 -43
- package/lib/commonjs/network/conditions/xhr.js +1 -110
- package/lib/commonjs/network/hooks/useLiveNetworkEvent.js +1 -62
- package/lib/commonjs/network/hooks/useNetworkBadgeCounts.js +1 -83
- package/lib/commonjs/network/hooks/useNetworkEventList.js +1 -108
- package/lib/commonjs/network/hooks/useNetworkEvents.js +1 -318
- package/lib/commonjs/network/hooks/useNetworkHasMatches.js +1 -56
- package/lib/commonjs/network/hooks/useNetworkSaved.js +1 -38
- package/lib/commonjs/network/hooks/useNetworkSelection.js +1 -53
- package/lib/commonjs/network/hooks/useOverrideRules.js +1 -36
- package/lib/commonjs/network/hooks/useTickEveryMinute.js +1 -21
- package/lib/commonjs/network/overrides/applyToFetch.js +1 -80
- package/lib/commonjs/network/overrides/applyToXhr.js +2 -453
- package/lib/commonjs/network/overrides/engine.js +1 -93
- package/lib/commonjs/network/overrides/matchRule.js +1 -81
- package/lib/commonjs/network/overrides/overriddenRows.js +1 -0
- package/lib/commonjs/network/overrides/overrideRulesStore.js +1 -550
- package/lib/commonjs/network/overrides/presets.js +1 -70
- package/lib/commonjs/network/overrides/resolveOverride.js +1 -158
- package/lib/commonjs/network/overrides/types.js +1 -90
- package/lib/commonjs/network/sync/networkBodyResolver.js +1 -39
- package/lib/commonjs/network/sync/networkSyncAdapter.js +1 -882
- package/lib/commonjs/network/sync/overrideHonesty.release.test.js +1 -36
- package/lib/commonjs/network/types/index.js +1 -5
- package/lib/commonjs/network/utils/extractOperationName.js +1 -80
- package/lib/commonjs/network/utils/filterNetworkEvents.js +1 -96
- package/lib/commonjs/network/utils/formatGraphQLVariables.js +1 -219
- package/lib/commonjs/network/utils/formatting.js +1 -30
- package/lib/commonjs/network/utils/generateCurl.js +2 -71
- package/lib/commonjs/network/utils/generateNetworkCopyText.js +37 -166
- package/lib/commonjs/network/utils/httpCompletion.js +1 -37
- package/lib/commonjs/network/utils/networkEventStore.js +1 -393
- package/lib/commonjs/network/utils/networkListener.js +4 -1259
- package/lib/commonjs/network/utils/networkSavedStore.js +3 -577
- package/lib/commonjs/network/utils/networkSelectionStore.js +1 -193
- package/lib/commonjs/network/utils/realNow.js +1 -0
- package/lib/commonjs/network/utils/requestId.js +1 -0
- package/lib/commonjs/network/utils/resolveRequestUrl.js +1 -0
- package/lib/commonjs/network/utils/selectSavedEvents.js +1 -39
- package/lib/commonjs/network/utils/startNetworkCapture.js +1 -0
- package/lib/commonjs/network/utils/withPinnedFirst.js +1 -32
- package/lib/commonjs/preset.js +1 -102
- package/lib/module/index.js +1 -103
- package/lib/module/index.web.js +1 -82
- package/lib/module/network/components/DataViewer.web.js +1 -875
- package/lib/module/network/components/NetworkCopyScreen.web.js +1 -44
- package/lib/module/network/components/NetworkCopySettingsView.js +27 -750
- package/lib/module/network/components/NetworkCopySettingsView.web.js +14 -1237
- package/lib/module/network/components/NetworkDetailScreen.web.js +1 -97
- package/lib/module/network/components/NetworkDetailStepper.js +1 -104
- package/lib/module/network/components/NetworkDetailStepper.web.js +1 -296
- package/lib/module/network/components/NetworkEventDetailView.js +15 -1129
- package/lib/module/network/components/NetworkEventDetailView.web.js +15 -1482
- package/lib/module/network/components/NetworkEventItemCompact.js +2 -398
- package/lib/module/network/components/NetworkEventItemCompact.web.js +2 -818
- package/lib/module/network/components/NetworkFilterScreen.web.js +1 -51
- package/lib/module/network/components/NetworkFilterViewV3.js +1 -438
- package/lib/module/network/components/NetworkFilterViewV3.web.js +1 -1306
- package/lib/module/network/components/NetworkHeaderLive.js +1 -366
- package/lib/module/network/components/NetworkHeaderLive.web.js +1 -617
- package/lib/module/network/components/NetworkHeaderMenu.js +1 -184
- package/lib/module/network/components/NetworkListScreen.js +1 -400
- package/lib/module/network/components/NetworkListScreen.web.js +1 -623
- package/lib/module/network/components/NetworkModal.js +1 -781
- package/lib/module/network/components/NetworkNumberPrompt.js +1 -174
- package/lib/module/network/components/NetworkNumberPrompt.web.js +1 -230
- package/lib/module/network/components/NetworkOverrideEditor.js +1 -811
- package/lib/module/network/components/NetworkOverrideEditor.web.js +1 -939
- package/lib/module/network/components/NetworkOverrideHeaderButton.js +1 -104
- package/lib/module/network/components/NetworkOverrideHeaderButton.web.js +1 -131
- package/lib/module/network/components/NetworkOverridesButton.js +1 -87
- package/lib/module/network/components/NetworkOverridesButton.web.js +1 -141
- package/lib/module/network/components/NetworkOverridesScreen.js +1 -539
- package/lib/module/network/components/NetworkOverridesScreen.web.js +1 -826
- package/lib/module/network/components/NetworkSavedScreen.js +1 -222
- package/lib/module/network/components/NetworkSavedScreen.web.js +1 -461
- package/lib/module/network/components/NetworkUpgradeBanner.js +1 -72
- package/lib/module/network/components/response-editor/Explorer.js +1 -972
- package/lib/module/network/components/response-editor/Explorer.web.js +1 -1133
- package/lib/module/network/components/response-editor/deleteNestedDataByPath.js +1 -51
- package/lib/module/network/components/response-editor/editorContext.js +1 -29
- package/lib/module/network/components/response-editor/updateNestedDataByPath.js +1 -56
- package/lib/module/network/conditions/NetworkConditionsControl.js +1 -231
- package/lib/module/network/conditions/NetworkConditionsControl.test.js +1 -135
- package/lib/module/network/conditions/NetworkConditionsIcon.js +1 -29
- package/lib/module/network/conditions/NetworkFloatingTool.js +1 -304
- package/lib/module/network/conditions/NetworkFloatingTool.test.js +1 -218
- package/lib/module/network/conditions/store.js +1 -65
- package/lib/module/network/conditions/wait.js +1 -38
- package/lib/module/network/conditions/xhr.js +1 -106
- package/lib/module/network/hooks/useLiveNetworkEvent.js +1 -58
- package/lib/module/network/hooks/useNetworkBadgeCounts.js +1 -79
- package/lib/module/network/hooks/useNetworkEventList.js +1 -104
- package/lib/module/network/hooks/useNetworkEvents.js +1 -314
- package/lib/module/network/hooks/useNetworkHasMatches.js +1 -52
- package/lib/module/network/hooks/useNetworkSaved.js +1 -34
- package/lib/module/network/hooks/useNetworkSelection.js +1 -46
- package/lib/module/network/hooks/useOverrideRules.js +1 -32
- package/lib/module/network/hooks/useTickEveryMinute.js +1 -11
- package/lib/module/network/overrides/applyToFetch.js +1 -72
- package/lib/module/network/overrides/applyToXhr.js +2 -446
- package/lib/module/network/overrides/engine.js +1 -85
- package/lib/module/network/overrides/matchRule.js +1 -75
- package/lib/module/network/overrides/overriddenRows.js +1 -0
- package/lib/module/network/overrides/overrideRulesStore.js +1 -547
- package/lib/module/network/overrides/presets.js +1 -65
- package/lib/module/network/overrides/resolveOverride.js +1 -152
- package/lib/module/network/overrides/types.js +1 -86
- package/lib/module/network/sync/networkBodyResolver.js +1 -34
- package/lib/module/network/sync/networkSyncAdapter.js +1 -880
- package/lib/module/network/sync/overrideHonesty.release.test.js +1 -35
- package/lib/module/network/types/index.js +1 -3
- package/lib/module/network/utils/extractOperationName.js +1 -76
- package/lib/module/network/utils/filterNetworkEvents.js +1 -92
- package/lib/module/network/utils/formatGraphQLVariables.js +1 -213
- package/lib/module/network/utils/formatting.js +1 -9
- package/lib/module/network/utils/generateCurl.js +2 -67
- package/lib/module/network/utils/generateNetworkCopyText.js +37 -162
- package/lib/module/network/utils/httpCompletion.js +1 -32
- package/lib/module/network/utils/networkEventStore.js +1 -391
- package/lib/module/network/utils/networkListener.js +4 -1249
- package/lib/module/network/utils/networkSavedStore.js +3 -572
- package/lib/module/network/utils/networkSelectionStore.js +1 -188
- package/lib/module/network/utils/realNow.js +1 -0
- package/lib/module/network/utils/requestId.js +1 -0
- package/lib/module/network/utils/resolveRequestUrl.js +1 -0
- package/lib/module/network/utils/selectSavedEvents.js +1 -35
- package/lib/module/network/utils/startNetworkCapture.js +1 -0
- package/lib/module/network/utils/withPinnedFirst.js +1 -28
- package/lib/module/preset.js +1 -100
- package/lib/typescript/index.d.ts +1 -0
- package/lib/typescript/network/overrides/applyToXhr.d.ts +1 -0
- package/lib/typescript/network/overrides/engine.d.ts +1 -1
- package/lib/typescript/network/overrides/matchRule.d.ts +1 -1
- package/lib/typescript/network/overrides/overriddenRows.d.ts +16 -0
- package/lib/typescript/network/overrides/resolveOverride.d.ts +2 -2
- package/lib/typescript/network/overrides/types.d.ts +9 -0
- package/lib/typescript/network/utils/networkListener.d.ts +14 -4
- package/lib/typescript/network/utils/networkSavedStore.d.ts +4 -4
- package/lib/typescript/network/utils/realNow.d.ts +18 -0
- package/lib/typescript/network/utils/requestId.d.ts +2 -0
- package/lib/typescript/network/utils/resolveRequestUrl.d.ts +3 -0
- package/lib/typescript/network/utils/startNetworkCapture.d.ts +6 -0
- package/lib/web/index.mjs +145 -0
- package/package.json +32 -10
- package/lib/typescript/index.d.ts.map +0 -1
- package/lib/typescript/index.web.d.ts.map +0 -1
- package/lib/typescript/network/components/DataViewer.web.d.ts.map +0 -1
- package/lib/typescript/network/components/NetworkCopyScreen.web.d.ts.map +0 -1
- package/lib/typescript/network/components/NetworkCopySettingsView.d.ts.map +0 -1
- package/lib/typescript/network/components/NetworkCopySettingsView.web.d.ts.map +0 -1
- package/lib/typescript/network/components/NetworkDetailScreen.web.d.ts.map +0 -1
- package/lib/typescript/network/components/NetworkDetailStepper.d.ts.map +0 -1
- package/lib/typescript/network/components/NetworkDetailStepper.web.d.ts.map +0 -1
- package/lib/typescript/network/components/NetworkEventDetailView.d.ts.map +0 -1
- package/lib/typescript/network/components/NetworkEventDetailView.web.d.ts.map +0 -1
- package/lib/typescript/network/components/NetworkEventItemCompact.d.ts.map +0 -1
- package/lib/typescript/network/components/NetworkEventItemCompact.web.d.ts.map +0 -1
- package/lib/typescript/network/components/NetworkFilterScreen.web.d.ts.map +0 -1
- package/lib/typescript/network/components/NetworkFilterViewV3.d.ts.map +0 -1
- package/lib/typescript/network/components/NetworkFilterViewV3.web.d.ts.map +0 -1
- package/lib/typescript/network/components/NetworkHeaderLive.d.ts.map +0 -1
- package/lib/typescript/network/components/NetworkHeaderLive.web.d.ts.map +0 -1
- package/lib/typescript/network/components/NetworkHeaderMenu.d.ts.map +0 -1
- package/lib/typescript/network/components/NetworkListScreen.d.ts.map +0 -1
- package/lib/typescript/network/components/NetworkListScreen.web.d.ts.map +0 -1
- package/lib/typescript/network/components/NetworkModal.d.ts.map +0 -1
- package/lib/typescript/network/components/NetworkNumberPrompt.d.ts.map +0 -1
- package/lib/typescript/network/components/NetworkNumberPrompt.web.d.ts.map +0 -1
- package/lib/typescript/network/components/NetworkOverrideEditor.d.ts.map +0 -1
- package/lib/typescript/network/components/NetworkOverrideEditor.web.d.ts.map +0 -1
- package/lib/typescript/network/components/NetworkOverrideHeaderButton.d.ts.map +0 -1
- package/lib/typescript/network/components/NetworkOverrideHeaderButton.web.d.ts.map +0 -1
- package/lib/typescript/network/components/NetworkOverridesButton.d.ts.map +0 -1
- package/lib/typescript/network/components/NetworkOverridesButton.web.d.ts.map +0 -1
- package/lib/typescript/network/components/NetworkOverridesScreen.d.ts.map +0 -1
- package/lib/typescript/network/components/NetworkOverridesScreen.web.d.ts.map +0 -1
- package/lib/typescript/network/components/NetworkSavedScreen.d.ts.map +0 -1
- package/lib/typescript/network/components/NetworkSavedScreen.web.d.ts.map +0 -1
- package/lib/typescript/network/components/NetworkUpgradeBanner.d.ts.map +0 -1
- package/lib/typescript/network/components/response-editor/Explorer.d.ts.map +0 -1
- package/lib/typescript/network/components/response-editor/Explorer.web.d.ts.map +0 -1
- package/lib/typescript/network/components/response-editor/deleteNestedDataByPath.d.ts.map +0 -1
- package/lib/typescript/network/components/response-editor/editorContext.d.ts.map +0 -1
- package/lib/typescript/network/components/response-editor/updateNestedDataByPath.d.ts.map +0 -1
- package/lib/typescript/network/conditions/NetworkConditionsControl.d.ts.map +0 -1
- package/lib/typescript/network/conditions/NetworkConditionsControl.test.d.ts.map +0 -1
- package/lib/typescript/network/conditions/NetworkConditionsIcon.d.ts.map +0 -1
- package/lib/typescript/network/conditions/NetworkFloatingTool.d.ts.map +0 -1
- package/lib/typescript/network/conditions/NetworkFloatingTool.test.d.ts.map +0 -1
- package/lib/typescript/network/conditions/store.d.ts.map +0 -1
- package/lib/typescript/network/conditions/wait.d.ts.map +0 -1
- package/lib/typescript/network/conditions/xhr.d.ts.map +0 -1
- package/lib/typescript/network/hooks/useLiveNetworkEvent.d.ts.map +0 -1
- package/lib/typescript/network/hooks/useNetworkBadgeCounts.d.ts.map +0 -1
- package/lib/typescript/network/hooks/useNetworkEventList.d.ts.map +0 -1
- package/lib/typescript/network/hooks/useNetworkEvents.d.ts.map +0 -1
- package/lib/typescript/network/hooks/useNetworkHasMatches.d.ts.map +0 -1
- package/lib/typescript/network/hooks/useNetworkSaved.d.ts.map +0 -1
- package/lib/typescript/network/hooks/useNetworkSelection.d.ts.map +0 -1
- package/lib/typescript/network/hooks/useOverrideRules.d.ts.map +0 -1
- package/lib/typescript/network/hooks/useTickEveryMinute.d.ts.map +0 -1
- package/lib/typescript/network/overrides/applyToFetch.d.ts.map +0 -1
- package/lib/typescript/network/overrides/applyToXhr.d.ts.map +0 -1
- package/lib/typescript/network/overrides/engine.d.ts.map +0 -1
- package/lib/typescript/network/overrides/matchRule.d.ts.map +0 -1
- package/lib/typescript/network/overrides/overrideRulesStore.d.ts.map +0 -1
- package/lib/typescript/network/overrides/presets.d.ts.map +0 -1
- package/lib/typescript/network/overrides/resolveOverride.d.ts.map +0 -1
- package/lib/typescript/network/overrides/types.d.ts.map +0 -1
- package/lib/typescript/network/sync/networkBodyResolver.d.ts.map +0 -1
- package/lib/typescript/network/sync/networkSyncAdapter.d.ts.map +0 -1
- package/lib/typescript/network/sync/overrideHonesty.release.test.d.ts.map +0 -1
- package/lib/typescript/network/types/index.d.ts.map +0 -1
- package/lib/typescript/network/utils/extractOperationName.d.ts.map +0 -1
- package/lib/typescript/network/utils/filterNetworkEvents.d.ts.map +0 -1
- package/lib/typescript/network/utils/formatGraphQLVariables.d.ts.map +0 -1
- package/lib/typescript/network/utils/formatting.d.ts.map +0 -1
- package/lib/typescript/network/utils/generateCurl.d.ts.map +0 -1
- package/lib/typescript/network/utils/generateNetworkCopyText.d.ts.map +0 -1
- package/lib/typescript/network/utils/httpCompletion.d.ts.map +0 -1
- package/lib/typescript/network/utils/networkEventStore.d.ts.map +0 -1
- package/lib/typescript/network/utils/networkListener.d.ts.map +0 -1
- package/lib/typescript/network/utils/networkSavedStore.d.ts.map +0 -1
- package/lib/typescript/network/utils/networkSelectionStore.d.ts.map +0 -1
- package/lib/typescript/network/utils/selectSavedEvents.d.ts.map +0 -1
- package/lib/typescript/network/utils/withPinnedFirst.d.ts.map +0 -1
- package/lib/typescript/preset.d.ts.map +0 -1
|
@@ -1,152 +1 @@
|
|
|
1
|
-
"use strict";
|
|
2
|
-
|
|
3
|
-
/**
|
|
4
|
-
* Decide whether a request is overridden — the whole decision, in one pure
|
|
5
|
-
* function.
|
|
6
|
-
*
|
|
7
|
-
* Pure on purpose: this is the piece worth unit-testing, and it runs inside the
|
|
8
|
-
* app's own `XMLHttpRequest.send()`, so it must be cheap, total, and incapable
|
|
9
|
-
* of throwing. Everything that could surprise (defaults, clamping, content-type
|
|
10
|
-
* inference) is resolved HERE, so `applyToXhr` never makes a decision — it just
|
|
11
|
-
* performs the outcome.
|
|
12
|
-
*/
|
|
13
|
-
|
|
14
|
-
import { ruleMatches } from "./matchRule";
|
|
15
|
-
import { STATUS_MAX, STATUS_MIN } from "./types";
|
|
16
|
-
|
|
17
|
-
/**
|
|
18
|
-
* Traffic that must never be overridden, whatever the user's rules say.
|
|
19
|
-
*
|
|
20
|
-
* A `*` pattern is a completely reasonable thing for a developer to write
|
|
21
|
-
* ("break everything and see what the app does"), and without this it would
|
|
22
|
-
* also break Buoy's own licence checks — turning "I tested an error state" into
|
|
23
|
-
* "the dev tools stopped working and I don't know why". Metro/debugger traffic
|
|
24
|
-
* is already excluded upstream by `networkListener.shouldIgnoreUrl`.
|
|
25
|
-
*/
|
|
26
|
-
const NEVER_OVERRIDE = [/(^|\.)keygen\.sh/i, /^https?:\/\/(www\.)?buoy\.gg\/api\/license(\/|$)/i];
|
|
27
|
-
function isProtectedUrl(url) {
|
|
28
|
-
return NEVER_OVERRIDE.some(pattern => pattern.test(url));
|
|
29
|
-
}
|
|
30
|
-
|
|
31
|
-
/**
|
|
32
|
-
* Guess a `content-type` when the rule didn't set one.
|
|
33
|
-
*
|
|
34
|
-
* Getting this wrong is not cosmetic: a client that trusts the header (axios's
|
|
35
|
-
* default transform, any `response.json()` wrapper) will hand the app a string
|
|
36
|
-
* where it expected an object, and the override looks broken rather than the
|
|
37
|
-
* header looking wrong.
|
|
38
|
-
*/
|
|
39
|
-
function inferContentType(body) {
|
|
40
|
-
const trimmed = body.trim();
|
|
41
|
-
if (trimmed === "") return "text/plain; charset=utf-8";
|
|
42
|
-
if (trimmed.startsWith("{") || trimmed.startsWith("[")) {
|
|
43
|
-
try {
|
|
44
|
-
JSON.parse(trimmed);
|
|
45
|
-
return "application/json";
|
|
46
|
-
} catch {
|
|
47
|
-
// Looks like JSON, isn't. Fall through — mislabelling it would be worse.
|
|
48
|
-
}
|
|
49
|
-
}
|
|
50
|
-
return "text/plain; charset=utf-8";
|
|
51
|
-
}
|
|
52
|
-
function hasHeader(headers, name) {
|
|
53
|
-
const wanted = name.toLowerCase();
|
|
54
|
-
return Object.keys(headers).some(key => key.toLowerCase() === wanted);
|
|
55
|
-
}
|
|
56
|
-
|
|
57
|
-
/** Normalize a matched rule into the exact instructions the interceptor needs. */
|
|
58
|
-
function toOutcome(rule) {
|
|
59
|
-
const delayMs = Math.max(0, rule.delayMs ?? 0);
|
|
60
|
-
if (rule.kind === "delay") {
|
|
61
|
-
return {
|
|
62
|
-
kind: "delay",
|
|
63
|
-
rule,
|
|
64
|
-
delayMs
|
|
65
|
-
};
|
|
66
|
-
}
|
|
67
|
-
if (rule.kind === "fail") {
|
|
68
|
-
return {
|
|
69
|
-
kind: "fail",
|
|
70
|
-
rule,
|
|
71
|
-
delayMs,
|
|
72
|
-
failKind: rule.failKind ?? "network"
|
|
73
|
-
};
|
|
74
|
-
}
|
|
75
|
-
const body = rule.body ?? "";
|
|
76
|
-
const headers = {
|
|
77
|
-
...(rule.headers ?? {})
|
|
78
|
-
};
|
|
79
|
-
if (!hasHeader(headers, "content-type")) {
|
|
80
|
-
headers["content-type"] = inferContentType(body);
|
|
81
|
-
}
|
|
82
|
-
return {
|
|
83
|
-
kind: "respond",
|
|
84
|
-
rule,
|
|
85
|
-
delayMs,
|
|
86
|
-
// Clamped, not rejected: whatwg-fetch's Response constructor THROWS outside
|
|
87
|
-
// [200, 599], which would crash the app's own fetch instead of overriding
|
|
88
|
-
// it. The editor constrains the input; this guarantees it.
|
|
89
|
-
status: Math.min(STATUS_MAX, Math.max(STATUS_MIN, rule.status ?? 200)),
|
|
90
|
-
statusText: rule.statusText ?? "",
|
|
91
|
-
headers,
|
|
92
|
-
body
|
|
93
|
-
};
|
|
94
|
-
}
|
|
95
|
-
|
|
96
|
-
/** A rule that has burned through its `times` budget no longer applies. */
|
|
97
|
-
export function isSpent(rule) {
|
|
98
|
-
return typeof rule.times === "number" && rule.hits >= rule.times;
|
|
99
|
-
}
|
|
100
|
-
|
|
101
|
-
/**
|
|
102
|
-
* Is this rule in a phase where it should actually fire?
|
|
103
|
-
*
|
|
104
|
-
* Only `alternate` can answer no. It reads the CURRENT `seen` count, before
|
|
105
|
-
* this match is recorded, so an untouched rule (`seen === 0`) lets the first
|
|
106
|
-
* request through and overrides the second.
|
|
107
|
-
*/
|
|
108
|
-
export function shouldApply(rule) {
|
|
109
|
-
if (!rule.alternate) return true;
|
|
110
|
-
return rule.seen % 2 === 1;
|
|
111
|
-
}
|
|
112
|
-
|
|
113
|
-
/**
|
|
114
|
-
* The first enabled rule whose pattern covers this request, phase ignored.
|
|
115
|
-
*
|
|
116
|
-
* Separate from `resolveOverride` because an alternating rule has to advance
|
|
117
|
-
* its phase on the requests it deliberately skips — the caller needs the rule
|
|
118
|
-
* back even when the answer is "not this time".
|
|
119
|
-
*/
|
|
120
|
-
export function findMatchingRule(url, method, rules) {
|
|
121
|
-
if (rules.length === 0) return null;
|
|
122
|
-
// Chrome skips OPTIONS too (`NetworkPersistenceManager.ts:953`). A faked
|
|
123
|
-
// preflight fails CORS in a way that looks nothing like the rule you wrote.
|
|
124
|
-
if (method.toUpperCase() === "OPTIONS") return null;
|
|
125
|
-
if (isProtectedUrl(url)) return null;
|
|
126
|
-
for (const rule of rules) {
|
|
127
|
-
if (!rule.enabled) continue;
|
|
128
|
-
if (isSpent(rule)) continue;
|
|
129
|
-
if (!ruleMatches(rule, url, method)) continue;
|
|
130
|
-
return rule;
|
|
131
|
-
}
|
|
132
|
-
return null;
|
|
133
|
-
}
|
|
134
|
-
|
|
135
|
-
/**
|
|
136
|
-
* First ENABLED matching rule wins outright — no merging across rules.
|
|
137
|
-
*
|
|
138
|
-
* Chrome cascades header overrides from the most general path segment to the
|
|
139
|
-
* most specific, but that only exists because its rules are directory-nested
|
|
140
|
-
* files. A flat list with a cascade would be a rule whose effect you cannot see
|
|
141
|
-
* by reading it, which is exactly the wrong trade on a phone screen.
|
|
142
|
-
*
|
|
143
|
-
* @param url Full request URL, query string included.
|
|
144
|
-
* @param method HTTP method as the caller sent it (case-insensitive).
|
|
145
|
-
* @param rules Ordered rule list; earlier entries win.
|
|
146
|
-
*/
|
|
147
|
-
export function resolveOverride(url, method, rules) {
|
|
148
|
-
const rule = findMatchingRule(url, method, rules);
|
|
149
|
-
if (!rule || !shouldApply(rule)) return null;
|
|
150
|
-
return toOutcome(rule);
|
|
151
|
-
}
|
|
152
|
-
export { toOutcome };
|
|
1
|
+
"use strict";import{ruleMatches as s}from"./matchRule";import{STATUS_MAX as a,STATUS_MIN as u}from"./types";const f=[/(^|\.)keygen\.sh/i,/^https?:\/\/(www\.)?buoy\.gg\/api\/license(\/|$)/i];function c(t){return f.some(n=>n.test(t))}function p(t){const n=t.trim();if(n==="")return"text/plain; charset=utf-8";if(n.startsWith("{")||n.startsWith("[")){try{JSON.parse(n);return"application/json"}catch{}}return"text/plain; charset=utf-8"}function d(t,n){const e=n.toLowerCase();return Object.keys(t).some(i=>i.toLowerCase()===e)}function o(t){const n=Math.max(0,t.delayMs??0);if(t.kind==="delay"){return{kind:"delay",rule:t,delayMs:n}}if(t.kind==="fail"){return{kind:"fail",rule:t,delayMs:n,failKind:t.failKind??"network"}}const e=t.body??"";const i={...t.headers??{}};if(!d(i,"content-type")){i["content-type"]=p(e)}return{kind:"respond",rule:t,delayMs:n,status:Math.min(a,Math.max(u,t.status??200)),statusText:t.statusText??"",headers:i,body:e}}export function isSpent(t){return typeof t.times==="number"&&t.hits>=t.times}export function shouldApply(t){if(!t.alternate)return true;return t.seen%2===1}export function findMatchingRule(t,n,e,i){if(e.length===0)return null;if(n.toUpperCase()==="OPTIONS")return null;if(c(t))return null;for(const r of e){if(!r.enabled)continue;if(isSpent(r))continue;if(!s(r,t,n,i))continue;return r}return null}export function resolveOverride(t,n,e,i){const r=findMatchingRule(t,n,e,i);if(!r||!shouldApply(r))return null;return o(r)}export{o as toOutcome};
|
|
@@ -1,86 +1 @@
|
|
|
1
|
-
"use strict";
|
|
2
|
-
|
|
3
|
-
import { TIER_LIMITS } from "@buoy-gg/shared-ui";
|
|
4
|
-
|
|
5
|
-
/**
|
|
6
|
-
* Network response overrides — the rule model.
|
|
7
|
-
*
|
|
8
|
-
* This is Buoy's answer to Chrome DevTools' "Local Overrides", reshaped for
|
|
9
|
-
* mobile. Two deliberate differences from Chrome are worth knowing, because
|
|
10
|
-
* they explain the whole shape of this file:
|
|
11
|
-
*
|
|
12
|
-
* 1. Chrome's rules ARE a directory tree — a body override is a file at
|
|
13
|
-
* `<host>/<path>`, header overrides live in per-directory `.headers` files,
|
|
14
|
-
* and its general→specific header cascade exists only to hang off that
|
|
15
|
-
* nesting. We have no filesystem, so rules are a flat ordered list and the
|
|
16
|
-
* FIRST enabled match wins outright. That's what Charles/Proxyman/MSW do,
|
|
17
|
-
* and it's what a developer can reason about on a phone screen.
|
|
18
|
-
*
|
|
19
|
-
* 2. Chrome CANNOT change a status code. `NetworkManager.ts` computes
|
|
20
|
-
* `responseCode = isBodyOverridden ? 200 : (responseStatusCode || 200)`, so
|
|
21
|
-
* overriding a body forces 200, and there is no latency or failure
|
|
22
|
-
* simulation at all. Chrome's feature is "serve different bytes". Forcing a
|
|
23
|
-
* 500, a timeout or a 3s stall is the entire mobile use case, so `status`,
|
|
24
|
-
* `delayMs` and `kind: "fail"` below are the point of the exercise.
|
|
25
|
-
*/
|
|
26
|
-
|
|
27
|
-
/**
|
|
28
|
-
* What a rule does when it matches.
|
|
29
|
-
*
|
|
30
|
-
* - `respond` — synthesize a response. The request never leaves the device.
|
|
31
|
-
* - `fail` — synthesize a transport failure (offline / timeout). Also never
|
|
32
|
-
* leaves the device.
|
|
33
|
-
* - `delay` — let the real request run, just late. Pure latency injection.
|
|
34
|
-
*/
|
|
35
|
-
|
|
36
|
-
/**
|
|
37
|
-
* Which transport failure to fake.
|
|
38
|
-
*
|
|
39
|
-
* `network` surfaces the way a real offline request does — `fetch` rejects with
|
|
40
|
-
* `TypeError: Network request failed`. This is also how you simulate "status 0":
|
|
41
|
-
* you can't, via `respond`, because whatwg-fetch's `Response` constructor throws
|
|
42
|
-
* a RangeError outside 200–599 (see STATUS_MIN/STATUS_MAX).
|
|
43
|
-
*/
|
|
44
|
-
|
|
45
|
-
/**
|
|
46
|
-
* Status codes a synthesized response may use.
|
|
47
|
-
*
|
|
48
|
-
* NOT an arbitrary product decision: React Native's `fetch` is the whatwg-fetch
|
|
49
|
-
* polyfill, whose `Response` constructor throws
|
|
50
|
-
* `RangeError: The status provided is outside the range [200, 599]`. A rule set
|
|
51
|
-
* to 0 would therefore crash the app's own fetch call rather than override it.
|
|
52
|
-
* Use `kind: "fail"` for connection-level failures.
|
|
53
|
-
*/
|
|
54
|
-
export const STATUS_MIN = 200;
|
|
55
|
-
export const STATUS_MAX = 599;
|
|
56
|
-
|
|
57
|
-
/** Bounds the persisted list so a runaway UI can't fill storage. */
|
|
58
|
-
export const MAX_RULES = 50;
|
|
59
|
-
|
|
60
|
-
/**
|
|
61
|
-
* @deprecated Read the live limit with `useLimit("network.overrideRules")` —
|
|
62
|
-
* this only reports the FREE tier's value. Kept because it is part of the
|
|
63
|
-
* package's public exports.
|
|
64
|
-
*/
|
|
65
|
-
export const FREE_TIER_RULE_LIMIT = TIER_LIMITS["network.overrideRules"].free;
|
|
66
|
-
|
|
67
|
-
/**
|
|
68
|
-
* Stamped onto the `NetworkEvent` a rule affected, so the list can badge the
|
|
69
|
-
* row and the detail view can offer "edit / disable the rule that did this".
|
|
70
|
-
*/
|
|
71
|
-
|
|
72
|
-
/**
|
|
73
|
-
* A matched rule, normalized into exactly what the interceptor needs — defaults
|
|
74
|
-
* resolved, status clamped, content-type inferred. Keeping normalization in the
|
|
75
|
-
* resolver means `applyToXhr` never has to make a decision.
|
|
76
|
-
*/
|
|
77
|
-
|
|
78
|
-
/** The marker recorded for an outcome. */
|
|
79
|
-
export function markForOutcome(outcome) {
|
|
80
|
-
return {
|
|
81
|
-
ruleId: outcome.rule.id,
|
|
82
|
-
ruleName: outcome.rule.name,
|
|
83
|
-
kind: outcome.kind,
|
|
84
|
-
delayMs: outcome.delayMs || undefined
|
|
85
|
-
};
|
|
86
|
-
}
|
|
1
|
+
"use strict";import{TIER_LIMITS as r}from"@buoy-gg/shared-ui";export const STATUS_MIN=200;export const STATUS_MAX=599;export const MAX_RULES=50;export const FREE_TIER_RULE_LIMIT=r["network.overrideRules"].free;export function markForOutcome(e){return{ruleId:e.rule.id,ruleName:e.rule.name,kind:e.kind,delayMs:e.delayMs||void 0}}
|
|
@@ -1,34 +1 @@
|
|
|
1
|
-
"use strict";
|
|
2
|
-
|
|
3
|
-
import { createContext, useContext } from "react";
|
|
4
|
-
|
|
5
|
-
/**
|
|
6
|
-
* The full request/response bodies for a single network event, fetched on
|
|
7
|
-
* demand. Either field may be `null` when the event genuinely has no body.
|
|
8
|
-
*/
|
|
9
|
-
|
|
10
|
-
/**
|
|
11
|
-
* Resolves request/response bodies that were omitted from a synced snapshot.
|
|
12
|
-
*
|
|
13
|
-
* Large bodies (see `networkSyncAdapter`) are stripped from the list snapshot
|
|
14
|
-
* so they aren't re-streamed every ~200ms; the detail view fetches them lazily
|
|
15
|
-
* through this resolver when a request is opened.
|
|
16
|
-
*
|
|
17
|
-
* On the device this is never provided — bodies are always inline — so the
|
|
18
|
-
* detail view simply falls back to the inline data. The desktop dashboard
|
|
19
|
-
* provides a resolver that fetches the body over the devtool protocol.
|
|
20
|
-
*/
|
|
21
|
-
import { jsx as _jsx } from "react/jsx-runtime";
|
|
22
|
-
const NetworkBodyResolverContext = /*#__PURE__*/createContext(null);
|
|
23
|
-
export function NetworkBodyResolverProvider({
|
|
24
|
-
resolver,
|
|
25
|
-
children
|
|
26
|
-
}) {
|
|
27
|
-
return /*#__PURE__*/_jsx(NetworkBodyResolverContext.Provider, {
|
|
28
|
-
value: resolver,
|
|
29
|
-
children: children
|
|
30
|
-
});
|
|
31
|
-
}
|
|
32
|
-
export function useNetworkBodyResolver() {
|
|
33
|
-
return useContext(NetworkBodyResolverContext);
|
|
34
|
-
}
|
|
1
|
+
"use strict";import{createContext as t,useContext as n}from"react";import{jsx as s}from"react/jsx-runtime";const e=t(null);export function NetworkBodyResolverProvider({resolver:o,children:r}){return s(e.Provider,{value:o,children:r})}export function useNetworkBodyResolver(){return n(e)}
|