Add per-domain toggle to disable automatic HTTP redirect following in the Native and Agent interceptors. When disabled, requests return the redirect response (status code, headers, body) without following the Location header. Previously HTTP redirects were always followed (on browser, can't do much about that, see https://fetch.spec.whatwg.org/#atomic-http-redirect-handling) without option to inspect the redirect response itself. This prevented developers from accessing redirect metadata needed when testing OAuth flows (PKCE where intermediate responses contain authorization tokens), authentication endpoints that return codes in Location headers with 302 status, and debugging API redirect chains. But on the desktop app, redirects were just never followed, creating the opposite effect. The browser's fetch API applies atomic HTTP redirect handling per spec, making it impossible to intercept redirects and inspect their responses. The Native and Agent interceptors use curl and native HTTP clients respectively, both supporting redirect control, making this feature viable for these specific interceptors. (Proxyscotch tbd). |
||
|---|---|---|
| .. | ||
| src | ||
| package.json | ||
| README.md | ||
| tsconfig.base.json | ||
| tsconfig.decl.json | ||
| tsconfig.json | ||
| vite.config.d.ts | ||
| vite.config.ts | ||
Hoppscotch Kernel
Cross-platform abstraction kernel for Hoppscotch, a unified interface between application logic and platform-specific implementations.
Architecture
The kernel acts as a thin abstraction layer, mediating between high-level application logic and low-level platform implementations, similar to how operating system kernels abstract over hardware details. This helps the core Hoppscotch app be platform-agnostic while maintaining near native performance.
This codebase is minimal by design, providing just the building blocks for constructing features. If possible, always try composition before modifying the kernel directly.
Modules
IO Module
File system and external resource handling:
interface IoV1 {
saveFileWithDialog(opts: SaveFileWithDialogOptions): Promise<SaveFileResponse>
openExternalLink(opts: OpenExternalLinkOptions): Promise<OpenExternalLinkResponse>
listen<T>(event: string, handler: EventCallback<T>): Promise<UnlistenFn>
}
Relay Module
Network operations with platform-specific optimizations:
interface RelayV1 {
readonly capabilities: RelayCapabilities
execute(request: RelayRequest): {
cancel: () => Promise<void>
emitter: RelayEventEmitter<RelayRequestEvents>
response: Promise<Either<RelayError, RelayResponse>>
}
}
Store Module
Cross-platform persistence with encryption support:
interface StoreV1 {
readonly capabilities: Set<StoreCapability>
set(namespace: string, key: string, value: unknown, options?: StorageOptions): Promise<Either<StoreError, void>>
watch(namespace: string, key: string): Promise<StoreEventEmitter<StoreEvents>>
}
Usage
Kernel Initialization
import { initKernel } from '@hoppscotch/kernel'
// Platform-specific initialization
const kernel = initKernel('web' | 'desktop')
Network Operations
import { RelayRequest } from '@hoppscotch/kernel'
const request: RelayRequest = {
id: 1,
url: "https://api.example.com",
method: "GET",
version: "HTTP/1.1",
headers: {
"Content-Type": "application/json"
}
}
// Execute with capability checks
const { response, cancel } = kernel.relay.execute(request)
Storage Operations
// Encrypted storage with compression
await kernel.store.set("collections", "team-a", data, {
encrypt: true,
compress: true
})
// Watch for changes
const watcher = await kernel.store.watch("collections", "team-a")
watcher.on("change",
(update) => console.log("Collection updated:", update)
)
File Operations
// Platform-agnostic file save
await kernel.io.saveFileWithDialog({
data: new Uint8Array([...]),
suggestedFilename: "export.json",
contentType: "application/json"
})