Configuration

Core Options

OptionTypeDefaultDescription
memoryBudgetMBnumber600Total memory budget in MB. Triggers watermark zones when exceeded.
quality'auto' | QualityLevel'auto'Initial quality. auto selects based on device tier.
maxConcurrentActivenumber1Max iframes active simultaneously. Others frozen with placeholders.
lazyLoadbooleantrueLoad iframes only when visible (IntersectionObserver).
rootMarginstring'200px'Preload distance before viewport entry.
deviceProfile'auto' | DeviceTier'auto'Device tier detection. auto detects from UA and screen.

iOS Configuration

OptionTypeDefaultDescription
ios.crashPreventionbooleantrueEnable all iOS Safari protections.
ios.backgroundFreezebooleantrueFreeze all iframes when page is backgrounded.
ios.backgroundDestroyLowPrioritybooleantrueDestroy low-priority iframes on background (not just freeze).
ios.memoryWarningThresholdnumber0.7Start degrading at this fraction of budget (0-1).
ios.aggressiveCleanupbooleantrueAggressive GC hints and resource cleanup.
ios.maxMemoryMBnumber1200Estimated Safari memory limit for device.
ios.sandboxAttributesstring'allow-scripts allow-same-origin allow-popups'Sandbox attributes applied to iframes.

Watermark Zones

Thresholds are fractions of memoryBudgetMB.

OptionDefaultZone triggered above
watermark.greenMax0.6Yellow (auto-downgrade quality)
watermark.yellowMax0.75Red (freeze non-visible)
watermark.redMax0.85Critical (single iframe, minimal quality)
watermark.criticalMax0.95Emergency (destroy low-priority)

Crash Recovery

OptionTypeDefaultDescription
crashRecovery.enabledbooleantrueEnable crash detection and auto-recovery.
crashRecovery.storageKeystring'iframe-shield-recovery'sessionStorage key for crash state.
crashRecovery.stabilityPeriodMsnumber30000Milliseconds stable before resetting crash counter.
crashRecovery.maxRecoveryAttemptsnumber3After N crashes, load at minimal quality permanently.

Network Budget

OptionTypeDefaultDescription
networkBudget.enabledbooleantrueTrack bytes transferred per iframe domain.
networkBudget.maxTransferMBnumber500Freeze iframe after this many MB downloaded.
networkBudget.trackingIntervalMsnumber2000How often to check transfer budgets.

Debug Overlay

OptionTypeDefaultDescription
debugger.enabledbooleanfalseShow visual debug overlay.
debugger.positionDebugOverlayPosition'bottom-right'Overlay position: bottom-right, bottom-left, top-right, top-left.
debugger.shortcutstring'ctrl+shift+q'Keyboard shortcut to toggle overlay.

Game Proxy / Interceptor

OptionTypeDefaultDescription
interceptor.maxTextureSizenumber1024Max texture dimension in pixels. Larger textures are downscaled.
interceptor.maxCanvasWidthnumber1280Max WebGL canvas width.
interceptor.maxCanvasHeightnumber720Max WebGL canvas height.
interceptor.maxDevicePixelRationumber1Override window.devicePixelRatio.
interceptor.maxFpsnumber30Throttle requestAnimationFrame to this FPS.
interceptor.maxWasmMemoryMBnumber256Cap WebAssembly.Memory maximum pages.
interceptor.audioSampleRatenumber22050Downsample decoded audio buffers to this rate.

Callbacks

CallbackArgumentsWhen
onMemoryWarning(info: MemoryWarningInfo)Memory pressure detected
onQualityChange(id, oldQ, newQ)Quality level changed
onIframeFreeze(id)Iframe frozen
onIframeResume(id)Iframe resumed
onIframeDestroy(id)Iframe destroyed
onCrashPrevented(id, reason)Crash was prevented
onCrashRecovered(info: CrashRecoveryInfo)Recovered from previous crash
onWatermarkZoneChange(oldZone, newZone)Memory zone transition
onError(error: IframeShieldError)Internal error

Full Example

new IframeShield({
  memoryBudgetMB: 600,
  quality: 'auto',
  maxConcurrentActive: 1,
  lazyLoad: true,
  rootMargin: '200px',
  deviceProfile: 'auto',

  ios: {
    crashPrevention: true,
    backgroundFreeze: true,
    backgroundDestroyLowPriority: true,
    memoryWarningThreshold: 0.7,
    aggressiveCleanup: true,
    maxMemoryMB: 1200,
  },

  watermark: { greenMax: 0.6, yellowMax: 0.75, redMax: 0.85, criticalMax: 0.95 },
  crashRecovery: { enabled: true, stabilityPeriodMs: 30000, maxRecoveryAttempts: 3 },
  networkBudget: { enabled: true, maxTransferMB: 500 },
  debugger: { enabled: false, position: 'bottom-right', shortcut: 'ctrl+shift+q' },

  onMemoryWarning: (info) => console.log('Memory:', info.estimatedUsageMB, 'MB'),
  onQualityChange: (id, oldQ, newQ) => console.log(id, oldQ, '->', newQ),
  onCrashPrevented: (id, reason) => console.warn('Crash prevented:', reason),
});