Files
insta-recipe/docs/plans/RefactorServiceWorkerForProperPWACompliance.md
Giancarmine Salucci 93aa25a31c fix: resolve critical app functionality issues
Complete implementation of fixes for queue processing, SSE connection display, service worker installation, and failing tests.

Key Changes:
- Fix queue processor startup with proper import and subscription mechanism
- Implement centralized API error handling middleware for proper HTTP status codes
- Enhance service worker configuration for PWA compliance and reliability
- Fix SSE connection display with reactive state management
- Add comprehensive test coverage and health check endpoints

Results:
- All 169 tests now passing (previously 16 failing)
- Queue items process immediately from pending to success/error states
- Real-time SSE connection status with auto-reconnection logic
- Proper PWA functionality with working service worker registration
- API endpoints return correct HTTP status codes (400/404/409) instead of 500 errors

This resolves the critical issues preventing core app functionality and enables proper production deployment.
2025-12-22 04:27:59 +01:00

23 KiB

Execution Plan: Refactor Service Worker for Proper PWA Compliance

Date: 2025-12-22
Outcome Name: RefactorServiceWorkerForProperPWACompliance
Status: Planning
Priority: Critical - Service Worker conflicts breaking PWA functionality


Executive Summary

The current service worker implementation is suffering from architectural conflicts between SvelteKit's built-in service worker system and the @vite-pwa/sveltekit plugin approach. This is causing:

  1. Service Worker Evaluation Errors: Browser console shows "ServiceWorker script threw an exception during script evaluation"
  2. PWA Registration Conflicts: Multiple service workers attempting to register simultaneously
  3. Push Notification Failures: Service worker not responding to push notification requests due to initialization failures
  4. Workbox Import Issues: Missing workbox manifest causing runtime errors
  5. TypeScript Compilation Problems: Service worker TypeScript not properly compiled for browser execution

The application currently uses a 270-line service worker with comprehensive push notification handling, background sync, and workbox precaching, but architectural conflicts prevent proper functionality.


Current State Analysis

Service Worker Architecture Issues

Identified Conflicts:

  1. Dual Service Worker Registration: SvelteKit auto-registers its service worker while @vite-pwa/sveltekit also registers one
  2. Mixed API Usage: Service worker uses Workbox APIs but not SvelteKit's $service-worker module
  3. Manifest Integration Gap: PWA manifest in vite.config.ts not properly integrated with layout files
  4. TypeScript Processing: Service worker TypeScript may not be properly processed by vite-pwa plugin

Current Implementation Strengths (Must Preserve):

  • Workbox precaching with precacheAndRoute() and cleanupOutdatedCaches()
  • Navigation route handling with NavigationRoute
  • Comprehensive push notification handling with custom actions
  • Notification click/close handlers with client communication via postMessage()
  • Background sync support for retry operations
  • Message handling for SKIP_WAITING, GET_VERSION, QUEUE_RETRY
  • Robust error handling and logging throughout
  • Keep-alive mechanism for notification display
  • Custom notification actions (view, retry, dismiss)

Vite PWA Configuration Analysis

Current Configuration (vite.config.ts):

SvelteKitPWA({
    strategies: 'injectManifest',
    filename: 'service-worker.ts',
    injectManifest: {
        swSrc: 'src/service-worker.ts',
        swDest: 'service-worker.js',
        injectionPoint: 'self.__WB_MANIFEST'
    },
    workbox: {
        globPatterns: ['client/**/*.{js,css,ico,png,svg,webp,woff,woff2}']
    },
    devOptions: { enabled: true }
})

Issues Found:

  1. SvelteKit Service Worker Not Disabled: svelte.config.js doesn't disable SvelteKit's built-in service worker
  2. Missing PWA Integration: No PWA registration in app layout or hooks
  3. Development Mode Conflicts: Both development service workers competing
  4. Build Configuration: TypeScript service worker compilation may have issues

Documentation Research Findings

@vite-pwa/sveltekit Plugin Capabilities:

  1. TypeScript Support: Plugin DOES support TypeScript service workers with injectManifest strategy
  2. Workbox Integration: Full workbox library available in injected manifest approach
  3. Custom Logic: Allows complex service worker logic with push notifications
  4. SvelteKit Integration: Designed to work with SvelteKit routing and SSR

Best Practices Identified:

  1. Disable SvelteKit Service Worker: Must set serviceWorker: { register: false } in svelte.config.js
  2. Use Single Service Worker Strategy: Choose either SvelteKit's or vite-pwa's approach, not both
  3. Proper TypeScript Compilation: Ensure service worker TypeScript is correctly processed
  4. Development vs Production: Configure different behaviors for dev/prod environments
  5. Manifest Integration: Ensure PWA manifest is properly linked and registered

Root Cause Analysis

Primary Issue: Conflicting Service Worker Registration

Problem: SvelteKit automatically registers its own service worker while @vite-pwa/sveltekit plugin also tries to register one, creating conflicts.

Evidence:

  • Service worker evaluation errors in browser console
  • Multiple registration attempts visible in Network/Application tabs
  • Push notifications failing due to unclear service worker ownership

Solution: Disable SvelteKit's service worker and use only vite-pwa plugin approach

Secondary Issue: Workbox Manifest Injection Problems

Problem: self.__WB_MANIFEST not properly injected during build process

Evidence:

  • Current service worker checks for self.__WB_MANIFEST existence
  • Build process may not be correctly replacing injection point
  • TypeScript compilation interfering with workbox manifest injection

Solution: Ensure proper build pipeline for TypeScript service worker with workbox injection

Tertiary Issue: Development vs Production Configuration

Problem: Different behaviors needed for development and production environments

Evidence:

  • Development mode has different service worker registration patterns
  • Hot reloading conflicts with service worker updates
  • SSL requirements different between environments

Solution: Configure environment-specific service worker behaviors


Technical Specification

Architecture Decision: Pure @vite-pwa/sveltekit Approach

Chosen Strategy: injectManifest with TypeScript service worker

  • Maintains all current push notification functionality
  • Supports complex custom service worker logic
  • Compatible with TypeScript
  • Integrates with SvelteKit routing
  • Supports both development and production builds

Rejected Alternative: SvelteKit's built-in service worker

  • Limited customization options
  • No direct workbox integration
  • Would require complete rewrite of push notification logic
  • Less mature PWA features

Service Worker Structure (Preserve Current Functionality)

Core Modules to Maintain:

  1. Workbox Precaching: precacheAndRoute(self.__WB_MANIFEST)
  2. Navigation Routing: registerRoute(new NavigationRoute(...))
  3. Push Notification Handlers:
    • push event listener
    • notificationclick event listener
    • notificationclose event listener
  4. Message Handling: message event for client communication
  5. Background Sync: For retry operations
  6. Error Handling: Global error and promise rejection handlers

New Requirements:

  1. Proper TypeScript Compilation: Ensure service worker TS compiles correctly
  2. Manifest Injection Validation: Verify self.__WB_MANIFEST is properly injected
  3. Environment Detection: Different behavior for dev vs prod
  4. Registration Coordination: Single service worker registration path

Configuration Changes Required

1. SvelteKit Configuration (svelte.config.js)

const config = {
    preprocess: vitePreprocess(),
    kit: {
        adapter: adapter(),
        serviceWorker: {
            register: false  // Disable SvelteKit service worker
        }
    }
};

2. Vite PWA Configuration (vite.config.ts)

SvelteKitPWA({
    strategies: 'injectManifest',
    filename: 'service-worker.ts',
    mode: process.env.NODE_ENV === 'production' ? 'production' : 'development',
    injectManifest: {
        swSrc: 'src/service-worker.ts',
        swDest: 'service-worker.js',
        injectionPoint: 'self.__WB_MANIFEST'
    },
    workbox: {
        globPatterns: ['client/**/*.{js,css,ico,png,svg,webp,woff,woff2}'],
        cleanupOutdatedCaches: true,
        skipWaiting: false,  // Let service worker control this
        clientsClaim: false  // Let service worker control this
    },
    devOptions: {
        enabled: true,
        suppressWarnings: true,
        navigateFallback: '/',
        type: 'module'
    }
})

3. Service Worker Validation (src/service-worker.ts)

// Enhanced manifest validation
if (!self.__WB_MANIFEST) {
    console.warn('[SW] Workbox manifest not injected - running in dev mode or build issue');
} else if (!Array.isArray(self.__WB_MANIFEST)) {
    console.error('[SW] Workbox manifest invalid format');
} else {
    console.log(`[SW] Workbox manifest loaded with ${self.__WB_MANIFEST.length} entries`);
    precacheAndRoute(self.__WB_MANIFEST);
}

Build Pipeline Validation

TypeScript Compilation Check:

  • Ensure service worker TypeScript compiles to valid JavaScript
  • Verify all import statements resolve correctly
  • Confirm workbox injection point is preserved during compilation

Development Mode Handling:

  • Service worker should gracefully handle missing workbox manifest in dev
  • Hot reloading should not interfere with service worker functionality
  • HTTPS requirements handled for development server

Production Build Verification:

  • Workbox manifest properly injected into compiled service worker
  • All precache entries generated correctly
  • Service worker JavaScript is valid and executable

User Stories

Story 1: Disable Conflicting Service Worker Registration

As a user
I want only one service worker to be registered
So that there are no conflicts and PWA functionality works correctly

Acceptance Criteria:

  • SvelteKit's built-in service worker registration is disabled
  • Only @vite-pwa/sveltekit registers the service worker
  • No service worker evaluation errors in browser console
  • Service worker registration visible in browser dev tools shows only one registration
  • Application continues to work in all browsers (Chrome, Firefox, Safari, Edge)

Implementation:

  • Modify svelte.config.js to set serviceWorker: { register: false }
  • Ensure vite-pwa plugin handles registration correctly
  • Test registration in both development and production builds

Validation:

  • Browser console shows no service worker errors
  • Application tab in dev tools shows single service worker registration
  • PWA install prompt appears correctly

Story 2: Ensure Proper Workbox Manifest Injection

As a developer
I want the workbox manifest to be properly injected into the service worker
So that precaching and offline functionality work correctly

Acceptance Criteria:

  • self.__WB_MANIFEST is properly defined and populated in built service worker
  • Service worker can successfully call precacheAndRoute(self.__WB_MANIFEST)
  • All client-side assets are precached according to glob patterns
  • Offline functionality works for precached routes
  • Cache updates work correctly when app is updated

Implementation:

  • Verify injectionPoint: 'self.__WB_MANIFEST' configuration
  • Ensure TypeScript compilation preserves injection point
  • Add validation logging for manifest contents
  • Test build output for proper manifest injection

Validation:

  • Service worker console logs show manifest with expected entry count
  • Network tab shows precaching requests during service worker installation
  • Offline browsing works for precached resources

Story 3: Maintain All Push Notification Functionality

As a user
I want push notifications to continue working exactly as before
So that I receive notifications about recipe extraction progress and completion

Acceptance Criteria:

  • Push notification registration works correctly
  • Custom notification actions (view, retry, dismiss) function properly
  • Notification click handlers navigate to correct pages
  • Background sync continues to work for retry operations
  • Message passing between service worker and clients works
  • Keep-alive mechanism maintains notification display
  • All existing notification types continue to work

Implementation:

  • Preserve all existing push notification event handlers
  • Maintain client communication via postMessage()
  • Keep background sync registration and handling
  • Preserve notification action definitions
  • Test all notification workflows

Validation:

  • Push notifications display correctly with custom actions
  • Clicking notifications navigates to expected pages
  • Retry functionality works through notifications
  • Background sync triggers on network restoration
  • Service worker responds to client messages correctly

Story 4: Implement Environment-Specific Configuration

As a developer
I want different service worker behavior in development vs production
So that development workflow is smooth and production is optimized

Acceptance Criteria:

  • Development mode gracefully handles missing workbox manifest
  • Hot reloading doesn't interfere with service worker functionality
  • Production mode has full precaching and offline support
  • SSL requirements handled correctly in both environments
  • Build process generates appropriate service worker for each environment

Implementation:

  • Configure vite-pwa plugin with environment-specific options
  • Add environment detection in service worker
  • Handle development mode gracefully without full precaching
  • Ensure production builds have complete PWA functionality

Validation:

  • Development server starts without service worker errors
  • Hot reloading works correctly with service worker active
  • Production builds pass all PWA audits
  • Both environments support push notifications

Story 5: Validate TypeScript Service Worker Compilation

As a developer
I want the TypeScript service worker to compile correctly
So that all functionality works and maintenance remains easy

Acceptance Criteria:

  • Service worker TypeScript compiles to valid JavaScript
  • All import statements resolve correctly in compiled output
  • Type definitions are available during development
  • Build process doesn't produce compilation errors
  • Compiled service worker executes without runtime errors

Implementation:

  • Verify vite-pwa plugin TypeScript processing
  • Ensure proper type definitions for service worker globals
  • Test compilation with current workbox imports
  • Validate runtime execution of compiled service worker

Validation:

  • Build process completes without TypeScript errors
  • Compiled service worker JavaScript is syntactically valid
  • Runtime execution produces expected console logs
  • All service worker functionality works as expected

Implementation Roadmap

Phase 1: Configuration Changes (1-2 hours)

Tasks:

  1. Update svelte.config.js

    • Add serviceWorker: { register: false } to disable SvelteKit's service worker
    • Test development server startup
  2. Enhance vite.config.ts

    • Add environment-specific mode configuration
    • Update workbox configuration for better manifest generation
    • Configure development options properly
  3. Validate TypeScript Configuration

    • Ensure service worker types are properly configured in tsconfig.json
    • Verify workbox type definitions are available

Validation:

  • Development server starts without conflicts
  • No duplicate service worker registration attempts
  • TypeScript compilation passes without errors

Phase 2: Service Worker Enhancements (2-3 hours)

Tasks:

  1. Add Manifest Validation

    • Enhance workbox manifest existence and format checks
    • Add informative logging for development vs production modes
    • Implement graceful degradation when manifest is missing
  2. Environment Detection

    • Add runtime environment detection in service worker
    • Configure different behaviors for development and production
    • Handle SSL requirements appropriately
  3. Build Process Validation

    • Test TypeScript compilation of service worker
    • Verify workbox manifest injection in built output
    • Ensure all imports resolve correctly

Validation:

  • Service worker initializes correctly in both environments
  • Workbox manifest is properly injected in production builds
  • Development mode works without precaching errors

Phase 3: Functionality Testing (2-3 hours)

Tasks:

  1. Push Notification Testing

    • Test all existing push notification flows
    • Verify custom notification actions work
    • Test background sync and retry mechanisms
    • Validate client-service worker message passing
  2. PWA Feature Testing

    • Test app installation prompt
    • Verify offline functionality with precaching
    • Test navigation routes work offline
    • Validate manifest.json integration
  3. Cross-Browser Testing

    • Test in Chrome, Firefox, Safari, and Edge
    • Verify service worker registration in all browsers
    • Test push notifications across browsers
    • Validate PWA features in each browser

Validation:

  • All push notification types work correctly
  • PWA installation and offline functionality work
  • Cross-browser compatibility maintained
  • No regression in existing functionality

Phase 4: Performance and Optimization (1-2 hours)

Tasks:

  1. Cache Strategy Optimization

    • Review and optimize workbox glob patterns
    • Ensure efficient precaching strategy
    • Test cache update mechanisms
  2. Service Worker Performance

    • Minimize service worker bundle size
    • Optimize registration timing
    • Test service worker update flows
  3. Documentation and Monitoring

    • Document new service worker architecture
    • Add monitoring for service worker errors
    • Create troubleshooting guide for common issues

Validation:

  • Service worker performs efficiently
  • Cache updates work smoothly
  • Performance metrics meet expectations
  • Documentation is complete and accurate

Risk Assessment

High Risk

Service Worker Compilation Issues

  • Risk: TypeScript service worker fails to compile correctly with vite-pwa plugin
  • Impact: Complete service worker functionality loss
  • Mitigation: Thorough testing in development environment before production deployment
  • Rollback: Keep current service worker as backup, implement feature flags

Push Notification Regression

  • Risk: Changes break existing push notification functionality
  • Impact: Users stop receiving important notifications about recipe extraction
  • Mitigation: Comprehensive testing of all notification workflows before deployment
  • Rollback: Immediate rollback capability with previous service worker version

Medium Risk

Cross-Browser Compatibility

  • Risk: Changes work in some browsers but not others
  • Impact: Partial user base loses PWA functionality
  • Mitigation: Test in all major browsers during development
  • Rollback: Browser-specific service worker deployment if needed

Development Workflow Disruption

  • Risk: Changes interfere with hot reloading or development server
  • Impact: Slower development process
  • Mitigation: Test development environment thoroughly, configure dev-specific options
  • Rollback: Environment-specific service worker configurations

Low Risk

PWA Manifest Issues

  • Risk: App installation prompt doesn't work correctly
  • Impact: Users can't install PWA but core functionality remains
  • Mitigation: Test PWA installation on multiple devices and browsers
  • Rollback: Manifest configuration is easily reversible

Cache Strategy Changes

  • Risk: New precaching strategy is less efficient
  • Impact: Slower offline performance but functionality maintained
  • Mitigation: Monitor cache performance metrics
  • Rollback: Revert to previous glob patterns and cache configuration

Definition of Done

Technical Requirements

  • SvelteKit's built-in service worker is properly disabled
  • @vite-pwa/sveltekit plugin successfully registers single service worker
  • TypeScript service worker compiles correctly for both dev and production
  • Workbox manifest is properly injected in production builds
  • All existing push notification functionality is preserved
  • Service worker works correctly in all major browsers
  • PWA installation and offline functionality work as expected
  • No service worker evaluation errors in browser console
  • Build process completes without TypeScript or compilation errors

Functional Requirements

  • Push notifications display correctly with custom actions
  • Notification click handlers navigate to expected pages
  • Background sync and retry mechanisms function properly
  • Service worker responds to client messages (SKIP_WAITING, GET_VERSION, QUEUE_RETRY)
  • App can be installed as PWA on mobile and desktop
  • Offline functionality works for precached routes
  • Hot reloading works correctly in development mode
  • Production builds pass PWA audits

Quality Assurance

  • All existing tests pass
  • Cross-browser testing completed (Chrome, Firefox, Safari, Edge)
  • Performance testing shows no significant regression
  • Security review confirms no new vulnerabilities
  • Documentation updated to reflect new architecture
  • Monitoring and logging implemented for service worker issues

Deployment Requirements

  • Feature can be deployed to current branch without breaking changes
  • Rollback plan documented and tested
  • Production deployment tested in staging environment
  • Team members trained on new service worker architecture
  • Troubleshooting guide created for common issues

Success Metrics

Primary Metrics

  • Service Worker Registration Success Rate: 100% (no evaluation errors)
  • Push Notification Delivery Rate: Maintain current rate (>95%)
  • PWA Installation Success Rate: >90% on supported devices
  • Offline Functionality Success Rate: >95% for precached routes

Secondary Metrics

  • Build Time: No increase >10% from baseline
  • Service Worker Bundle Size: Maintain or decrease current size
  • Time to First Notification: <2 seconds after registration
  • Cache Hit Rate: >80% for precached resources

Qualitative Metrics

  • No user-reported issues with notifications or PWA functionality
  • Developer feedback on improved development workflow
  • Reduced service worker-related error reports
  • Positive PWA audit scores in Lighthouse

Conclusion

This refactoring addresses critical service worker conflicts by adopting a pure @vite-pwa/sveltekit approach while preserving all existing push notification functionality. The plan prioritizes maintaining current features while resolving architectural issues that prevent proper PWA operation.

The implementation is designed to be completed on the current branch with comprehensive testing and rollback capabilities to ensure no disruption to users or development workflow.

Next Step: Execute this plan using the @dev RefactorServiceWorkerForProperPWACompliance command to begin implementation.