- 
          
 - 
                Notifications
    
You must be signed in to change notification settings  - Fork 6
 
Description
What were you trying to do?
Use Cloudflare R2 as NativePHP updates provider.
What happened?
After publishing a new version, no popup or notice appear when restarting the app.
How to reproduce the bug
Cloudflare R2 is an S3-compatible object storage. When using it as a NativePHP updates provider, I set env vars to something like this:
AWS_ACCESS_KEY_ID=[R2 API token access key]
AWS_SECRET_ACCESS_KEY=[R2 API token secret access key]
AWS_DEFAULT_REGION=EEUR
AWS_BUCKET=bucket-name
AWS_URL=https://r2-updates.example-domain.com
AWS_ENDPOINT=https://[long-random-string-from-R2].r2.cloudflarestorage.com
AWS_USE_PATH_STYLE_ENDPOINT=false
AWS_S3_TOKEN_VALUE=[R2 API token value]
Note, AWS_URL value is actually a custom subdomain pointing to the R2 bucket. The only current reliable way to make R2 bucket publicly available is to point a custom (sub)domain.
At this point, building and uploading to R2 works.
What is not working – automatic updates. Or, rather, checks if an update is available.
Got some debugging info this way:
- I've cloned nativephp/electron and configured local path as Composer repository.
 - In electron-plugin/dist/index.js changed some code to:
 
    startAutoUpdater(config) {
        const fs = require('fs');
        const path = require('path');
        const customLogger = {
            info: (message) => {
                fs.appendFileSync('/tmp/ivsa-electron-logs.log', `[INFO] ${new Date().toISOString()} - ${message}\n`);
                console.info(message); // Optional: keep console logging too
            },
            warn: (message) => {
                fs.appendFileSync('/tmp/ivsa-electron-logs.log', `[WARN] ${new Date().toISOString()} - ${message}\n`);
                console.warn(message);
            },
            error: (message) => {
                fs.appendFileSync('/tmp/ivsa-electron-logs.log', `[ERROR] ${new Date().toISOString()} - ${message}\n`);
                console.error(message);
            }
        };
        customLogger.info("Starting auto updater");
        customLogger.warn("Starting auto updater");
        customLogger.error("Starting auto updater");
        var _a;
        if (((_a = config === null || config === void 0 ? void 0 : config.updater) === null || _a === void 0 ? void 0 : _a.enabled) === true) {
            customLogger.info("Checking for updates");
            autoUpdater.logger = customLogger;
            autoUpdater.checkForUpdatesAndNotify();
            customLogger.info("Updates checked");
        }
    }- Bundled and ran the app.
 - Got log messages:
 
[INFO] 2025-04-07T14:38:45.343Z - Starting auto updater
[WARN] 2025-04-07T14:38:45.345Z - Starting auto updater
[ERROR] 2025-04-07T14:38:45.345Z - Starting auto updater
[INFO] 2025-04-07T14:38:45.345Z - Checking for updates
[INFO] 2025-04-07T14:38:45.345Z - Checking for update
[INFO] 2025-04-07T14:38:45.345Z - Updates checked
[ERROR] 2025-04-07T14:38:45.823Z - Error: HttpError: 400 Bad Request
"method: GET url: https://[xxxxxx].r2.cloudflarestorage.com/ivsa-updates/latest-mac.yml?noCache=1io8b10jd\n\n          Data:\n          <?xml version=\"1.0\" encoding=\"UTF-8\"?><Error><Code>InvalidArgument</Code><Message>Authorization</Message></Error>\n          "
Headers: {
  "cf-ray": "92ca4540bc0f0ef7-VNO",
  "connection": "keep-alive",
  "content-length": "113",
  "content-type": "application/xml",
  "date": "Mon, 07 Apr 2025 14:38:45 GMT",
  "server": "cloudflare",
  "vary": "Accept-Encoding"
}
    at createHttpError (/Applications/Ivsa.app/Contents/Resources/app.asar/node_modules/builder-util-runtime/out/httpExecutor.js:21:12)
    at IncomingMessage.<anonymous> (/Applications/Ivsa.app/Contents/Resources/app.asar/node_modules/builder-util-runtime/out/httpExecutor.js:152:28)
    at IncomingMessage.emit (node:events:518:28)
    at endReadableNT (node:internal/streams/readable:1698:12)
    at process.processTicksAndRejections (node:internal/process/task_queues:82:21)
The problem is that https://[xxxxxx].r2.cloudflarestorage.com/ivsa-updates/latest-mac.yml is not the right path to load the latest-mac.yml file. But https://r2-updates.example-domain.com/latest-mac.yml is.
In order to form that URL, AWS_ENDPOINT must be changed to https://r2-updates.example-domain.com, but then bundled app upload to R2 fails with error, R2 response's status code 401.
Package Versions
{
    "installed": [
        {
            "name": "nativephp/electron",
            "direct-dependency": true,
            "homepage": "https://github.com/nativephp/electron",
            "source": null,
            "version": "1.0.0-beta.8",
            "description": "Electron wrapper for the NativePHP framework.",
            "abandoned": false
        },
        {
            "name": "nativephp/laravel",
            "direct-dependency": false,
            "homepage": "https://github.com/nativephp/laravel",
            "source": "https://github.com/NativePHP/laravel/tree/1.0.0-beta.4",
            "version": "1.0.0-beta.4",
            "description": "Laravel wrapper for the NativePHP framework.",
            "abandoned": false
        },
        {
            "name": "nativephp/php-bin",
            "direct-dependency": false,
            "homepage": "https://nativephp.com",
            "source": "https://github.com/NativePHP/php-bin/tree/0.6.1",
            "version": "0.6.1",
            "description": "PHP binaries used by the NativePHP framework",
            "abandoned": false
        }
    ]
}PHP Version
8.3.16
Laravel Version
12.7.2
Node Version
22.14.0
Which operating systems have you seen this occur on?
macOS
OS version
macOS 15.3.1
Notes
No response