Description
When building Mailspring on version 1.22.0 and on the master branch (at commit 4e42bfe), using nodejs v24.16.0, @electron/packager indefinitely attempts to package mailspring.
This issue is important as nodejs v24.16.0 is an active long term support release.
As more developers and CI pipelines update to the current LTS, Mailspring’s build will begin failing universally.
[summit@desktop:~/Documents/Mailspring]$ npm run-script build
> mailspring-root@0.0.1 build
> node app/build/build.js
---> Running packager with options:
{
appVersion: '1.22.0',
platform: 'linux',
protocols: [
{
name: 'Mailspring Protocol',
schemes: [ 'mailspring', [length]: 1 ]
},
{ name: 'Mailto Protocol', schemes: [ 'mailto', [length]: 1 ] },
[length]: 2
],
dir: '/home/summit/Documents/Mailspring/app',
appCategoryType: 'public.app-category.business',
tmpdir: '/tmp/nix-shell.zYekPW/nylas-build',
arch: 'x64',
icon: undefined,
name: 'mailspring',
appCopyright: 'Copyright (C) 2014-2026 Foundry 376, LLC. All rights reserved.',
derefSymlinks: false,
asar: {
unpack: '{mailsync,mailsync.exe,mailsync.bin,*.so,*.so.*,*.dll,*.pdb,*.node,**/vendor/**,examples/**,**/src/tasks/**,**/src/quickpreview/**,**/static/all_licenses.html,**/static/extensions/**,**/node_modules/spellchecker/**}'
},
ignore: [
/^\/build.*/ { [lastIndex]: 0 },
/^\/dist.*/ { [lastIndex]: 0 },
/^\/docs.*/ { [lastIndex]: 0 },
/^\/docs_src.*/ { [lastIndex]: 0 },
/^\/script.*/ { [lastIndex]: 0 },
/^\/spec.*/ { [lastIndex]: 0 },
/[/]+gh-pages$/ { [lastIndex]: 0 },
/[/]+docs$/ { [lastIndex]: 0 },
/[/]+obj[/]+gen/ { [lastIndex]: 0 },
/[/]+\.deps$/ { [lastIndex]: 0 },
/\.md$/i { [lastIndex]: 0 },
/\.log$/i { [lastIndex]: 0 },
/\.yml$/i { [lastIndex]: 0 },
/\.gz/i { [lastIndex]: 0 },
/\.zip/i { [lastIndex]: 0 },
/\.h$/ { [lastIndex]: 0 },
/\.cc$/ { [lastIndex]: 0 },
/\.flow$/ { [lastIndex]: 0 },
/\.gyp/ { [lastIndex]: 0 },
/\.mk/ { [lastIndex]: 0 },
/\.dYSM$/ { [lastIndex]: 0 },
/\.map$/ { [lastIndex]: 0 },
/node_modules[/]+less[/]+dist$/ { [lastIndex]: 0 },
/node_modules[/]+react[/]+dist$/ { [lastIndex]: 0 },
/node_modules[/].*[/]tests?$/ { [lastIndex]: 0 },
/node_modules[/].*[/]coverage$/ { [lastIndex]: 0 },
/node_modules[/].*[/]benchmark$/ { [lastIndex]: 0 },
[length]: 27
],
out: '/home/summit/Documents/Mailspring/app/dist',
overwrite: true,
prune: true,
osxSign: undefined,
osxNotarize: undefined,
win32metadata: {
CompanyName: 'Foundry 376, LLC',
FileDescription: 'Mailspring',
LegalCopyright: 'Copyright (C) 2014-2026 Foundry 376, LLC. All rights reserved.',
ProductName: 'Mailspring'
},
extendInfo: '/home/summit/Documents/Mailspring/app/build/resources/mac/extra.plist',
appBundleId: 'com.mailspring.mailspring',
afterCopy: [
<ref *1> [Function: runCopyPlatformSpecificResources] {
[length]: 5,
[name]: 'runCopyPlatformSpecificResources',
[arguments]: null,
[caller]: null,
[prototype]: { [constructor]: [Circular *1] }
},
<ref *2> [Function: runWriteCommitHashIntoPackage] {
[length]: 5,
[name]: 'runWriteCommitHashIntoPackage',
[arguments]: null,
[caller]: null,
[prototype]: { [constructor]: [Circular *2] }
},
<ref *3> [Function: runUpdateSandboxHelperPermissions] {
[length]: 5,
[name]: 'runUpdateSandboxHelperPermissions',
[arguments]: null,
[caller]: null,
[prototype]: { [constructor]: [Circular *3] }
},
<ref *4> [Function: runCopySymlinkedPackages] {
[length]: 5,
[name]: 'runCopySymlinkedPackages',
[arguments]: null,
[caller]: null,
[prototype]: { [constructor]: [Circular *4] }
},
<ref *5> [Function: runTranspilers] {
[length]: 5,
[name]: 'runTranspilers',
[arguments]: null,
[caller]: null,
[prototype]: { [constructor]: [Circular *5] }
},
[AsyncFunction: runUploadSourceMapsToSentry] {
[length]: 5,
[name]: 'runUploadSourceMapsToSentry',
[Symbol(Symbol.toStringTag)]: 'AsyncFunction'
},
[length]: 6
]
}
---> Resolving symlinks
Packaging app for platform linux x64 using electron v41.7.2
---> Packaging for 1s
---> Packaging for 2s
---> Packaging for 3s
---> Packaging for 4s
---> Packaging for 5s
---> Packaging for 6s
---> Packaging for 7s
---> Packaging for 8s
---> Packaging for 9s
---> Packaging for 10s
---> Packaging for 11s
---> Packaging for 12s
---> Packaging for 13s
---> Packaging for 14s
---> Packaging for 15s
---> Packaging for 16s
---> Packaging for 17s
---> Packaging for 18s
---> Packaging for 19s
---> Packaging for 20s
---> Packaging for 21s
---> Packaging for 22s
---> Packaging for 23s
---> Packaging for 24s
---> Packaging for 25s
---> Packaging for 26s
---> Packaging for 27s
---> Packaging for 28s
---> Packaging for 29s
---> Packaging for 30s
---> Packaging for 31s
---> Packaging for 32s
---> Packaging for 33s
---> Packaging for 34s
---> Packaging for 35s
---> Packaging for 36s
---> Packaging for 37s
---> Packaging for 38s
---> Packaging for 39s
---> Packaging for 40s
---> Packaging for 41s
---> Packaging for 42s
---> Packaging for 43s
---> Packaging for 44s
---> Packaging for 45s
---> Packaging for 46s
---> Packaging for 47s
---> Packaging for 48s
---> Packaging for 49s
---> Packaging for 50s
---> Packaging for 51s
---> Packaging for 52s
---> Packaging for 53s
---> Packaging for 54s
---> Packaging for 55s
---> Packaging for 56s
---> Packaging for 57s
---> Packaging for 58s
---> Packaging for 59s
---> Packaging for 60s
---> Packaging for 61s
---> Packaging for 62s
---> Packaging for 63s
---> Packaging for 64s
---> Packaging for 65s
---> Packaging for 66s
---> Packaging for 67s
---> Packaging for 68s
---> Packaging for 69s
---> Packaging for 70s
---> Packaging for 71s
---> Packaging for 72s
---> Packaging for 73s
---> Packaging for 74s
---> Packaging for 75s
---> Packaging for 76s
---> Packaging for 77s
---> Packaging for 78s
---> Packaging for 79s
---> Packaging for 80s
---> Packaging for 81s
---> Packaging for 82s
---> Packaging for 83s
---> Packaging for 84s
---> Packaging for 85s
---> Packaging for 86s
---> Packaging for 87s
---> Packaging for 88s
---> Packaging for 89s
---> Packaging for 90s
---> Packaging for 91s
---> Packaging for 92s
---> Packaging for 93s
---> Packaging for 94s
---> Packaging for 95s
---> Packaging for 96s
---> Packaging for 97s
---> Packaging for 98s
---> Packaging for 99s
---> Packaging for 100s
---> Packaging for 101s
---> Packaging for 102s
---> Packaging for 103s
---> Packaging for 104s
---> Packaging for 105s
---> Packaging for 106s
---> Packaging for 107s
---> Packaging for 108s
---> Packaging for 109s
---> Packaging for 110s
---> Packaging for 111s
---> Packaging for 112s
---> Packaging for 113s
---> Packaging for 114s
---> Packaging for 115s
---> Packaging for 116s
---> Packaging for 117s
---> Packaging for 118s
---> Packaging for 119s
---> Packaging for 120s
---> Packaging for 121s
---> Packaging for 122s
---> Packaging for 123s
---> Packaging for 124s
---> Packaging for 125s
---> Packaging for 126s
---> Packaging for 127s
---> Packaging for 128s
---> Packaging for 129s
---> Packaging for 130s
---> Packaging for 131s
---> Packaging for 132s
---> Packaging for 133s
---> Packaging for 134s
---> Packaging for 135s
---> Packaging for 136s
---> Packaging for 137s
---> Packaging for 138s
---> Packaging for 139s
---> Packaging for 140s
---> Packaging for 141s
---> Packaging for 142s
---> Packaging for 143s
---> Packaging for 144s
---> Packaging for 145s
---> Packaging for 146s
---> Packaging for 147s
---> Packaging for 148s
---> Packaging for 149s
---> Packaging for 150s
---> Packaging for 151s
---> Packaging for 152s
---> Packaging for 153s
---> Packaging for 154s
---> Packaging for 155s
---> Packaging for 156s
---> Packaging for 157s
---> Packaging for 158s
---> Packaging for 159s
---> Packaging for 160s
---> Packaging for 161s
---> Packaging for 162s
---> Packaging for 163s
---> Packaging for 164s
---> Packaging for 165s
---> Packaging for 166s
---> Packaging for 167s
---> Packaging for 168s
---> Packaging for 169s
---> Packaging for 170s
---> Packaging for 171s
---> Packaging for 172s
---> Packaging for 173s
---> Packaging for 174s
---> Packaging for 175s
---> Packaging for 176s
---> Packaging for 177s
---> Packaging for 178s
---> Packaging for 179s
---> Packaging for 180s
---> Packaging for 181s
---> Packaging for 182s
---> Packaging for 183s
---> Packaging for 184s
---> Packaging for 185s
---> Packaging for 186s
---> Packaging for 187s
---> Packaging for 188s
---> Packaging for 189s
---> Packaging for 190s
---> Packaging for 191s
---> Packaging for 192s
---> Packaging for 193s
---> Packaging for 194s
---> Packaging for 195s
---> Packaging for 196s
---> Packaging for 197s
---> Packaging for 198s
---> Packaging for 199s
---> Packaging for 200s
---> Packaging for 201s
---> Packaging for 202s
---> Packaging for 203s
---> Packaging for 204s
---> Packaging for 205s
---> Packaging for 206s
---> Packaging for 207s
---> Packaging for 208s
---> Packaging for 209s
---> Packaging for 210s
---> Packaging for 211s
---> Packaging for 212s
---> Packaging for 213s
^C
While if I downgrade to nodejs v22.23.1, Mailspring builds in a matter of seconds:
---> Resolving symlinks
Packaging app for platform linux x64 using electron v41.7.2
---> Packaging for 1s
---> Packaging for 2s
---> Changing chrome-sandbox permissions
---> Moving symlinked node modules / internal packages into build folder.
---> Running TypeScript Compiler
---> Compiling /internal_packages/account-sidebar/lib/account-commands.ts
---> Compiling /internal_packages/account-sidebar/lib/main.ts
---> Compiling /internal_packages/account-sidebar/lib/sidebar-actions.ts
---> Compiling /internal_packages/account-sidebar/lib/sidebar-item.ts
---> Compiling /internal_packages/account-sidebar/lib/sidebar-section.ts
---> Compiling /internal_packages/account-sidebar/lib/sidebar-store.ts
---> Compiling /internal_packages/account-sidebar/lib/types.ts
---> Compiling /internal_packages/account-sidebar/specs/sidebar-item-spec.es6.ts
---> Compiling /internal_packages/activity/lib/activity-actions.ts
---> Compiling /internal_packages/activity/lib/activity-data-source.ts
---> Compiling /internal_packages/activity/lib/activity-mailbox-perspective.ts
---> Compiling /internal_packages/activity/lib/dashboard/main.ts
---> Compiling /internal_packages/activity/lib/dashboard/timespan.ts
---> Compiling /internal_packages/activity/lib/main.ts
Setup
- OS and Version: NixOS 26.11 (Zokor) - I know this isn’t supported, but this does not affect the issue
- Installation Method: source
- Mailspring Version:
1.22.0and lastest master commit4e42bfe.
Additional Context
This is due to a widely reported problem in newer nodejs versions, where the extract-zippackage makes @electron/packager lock up and not do anything.
See the following issues:
- Node 24.16.0: extract-zip hangs extracting · Issue #63487 · nodejs/node · GitHub
- Zip extraction fail in Node 26.1.0 · Issue #154 · max-mapper/extract-zip · GitHub
- async iteration never starts for openReadStream on uncompressed entries · Issue #169 · thejoshwolfe/yauzl · GitHub
This issue can be fixed in two ways:
-
Upgrading
@electron/packagerto Release v20.0.1 · electron/packager · GitHub, which swapsextract-zipwith@electron-internal/extract-zip -
Or, by bumping
yauzl, a dependency ofextract-zipto any version>3.3.1.
This can be done by adding an override topackage.jsonandapp/package.json.
"overrides": {
"yauzl": "^3.3.1"
}