|
| 1 | +# Node.js Single-Executable Meeting 2022-09-05 |
| 2 | + |
| 3 | +## Links |
| 4 | + |
| 5 | +* **Recording**: https://youtu.be/Lw3cyjUofI4 |
| 6 | +* **GitHub Issue**: https://github.com/nodejs/single-executable/issues/54 |
| 7 | + |
| 8 | +## Present |
| 9 | + |
| 10 | +* Claudio Wunder @ovflowd |
| 11 | +* Darshan Sen @RaisinTen |
| 12 | +* Juan Cruz Viotti @jviotti |
| 13 | +* Michael Dawson @mhdawson |
| 14 | +* Richard Lau @richardlau |
| 15 | +* Tony Gorez @tony-go |
| 16 | + |
| 17 | +## Agenda |
| 18 | + |
| 19 | +* Inclusion of postject in the Node.js binary |
| 20 | + * Exposing segment names to the public API |
| 21 | + * Darshan: If we don't include Postject into Node.js, the name of the |
| 22 | + segment becomes a part of the interface, so changes to that will be |
| 23 | + semver-major. Hiding that behind something like `node --compile` will |
| 24 | + prevent that. |
| 25 | + * Michael: We want to support more than just one way of doing it, so that if |
| 26 | + anyone wants to inject the data in a different way, then can. |
| 27 | + |
| 28 | + * Single section or multiple sections |
| 29 | + * Darshan: Do want everything to be packed into a single section? |
| 30 | + * Juan: There might be a maximum size limit on the amount of data that can |
| 31 | + be loaded which might be too restrictive. |
| 32 | + * Michael: Most generic solution is if Postject finds you a list of sections |
| 33 | + that we were trying to load and give you the pointers to all of those. |
| 34 | + * Darshan: Another point is that, if we want everything to be in a single |
| 35 | + section, it would require users to pack everything into a specific format. |
| 36 | + |
| 37 | + * Michael: Key things to consider: |
| 38 | + * It might make the binary bigger. |
| 39 | + * We can make it non-invasive enough that people who aren't using it don't |
| 40 | + get affected. |
| 41 | + * Distros don't like big blobs of things that they do not know what's in |
| 42 | + there, so that's problematic for WASM. |
| 43 | + * Since we have a separate project, we have more flexibility, specially in |
| 44 | + the early stages. |
| 45 | + * Darshan: About the size and WASM part, we are trying to get rid of LIEF, so |
| 46 | + that way, we don't have to worry about the WASM part and the code size too |
| 47 | + will go down significantly. |
| 48 | + * Juan: There are 2 keys parts of Postject - the writing part and the reading |
| 49 | + part. Which one are we talking about including in Node.js core? |
| 50 | + * Michael: The reading part is not that big, so including that sounds |
| 51 | + reasonable. |
| 52 | + |
| 53 | + * Testing |
| 54 | + * Darshan: It's not possible to test the creation of Single Executable |
| 55 | + Applications on CI if we keep Postject outside Node.js because using |
| 56 | + Postject would require outbound requests, so we would need to place such a |
| 57 | + test in `test/internet` but that doesn't run on CI. |
| 58 | + * Richard: It should be possible to build Node.js without an internet |
| 59 | + connection if you have the source files locally. There are some caveats, |
| 60 | + like you can't do doc testing because that requires the installation of |
| 61 | + modules. |
| 62 | + * Juan: Maybe we can use `objcopy` as suggested in |
| 63 | + https://github.com/nodejs/postject/issues/63 just for CI? However, a |
| 64 | + downside is that it won't let us create PE files on Linux or macOS. |
| 65 | + * Darshan: We could probably do that but it would feel like dropping support |
| 66 | + for creating binaries for other platforms on a different platform, which |
| 67 | + pkg supports currently. |
| 68 | + * Darshan: Another problem is that while `objcopy` is present by default on |
| 69 | + Linux it needs to be downloaded on macOS using `brew install llvm`. |
| 70 | + * Richard: We don't install llvm anywhere, just Xcode on macOS. If something |
| 71 | + from llvm conflicts with something from Xcode, it might be problematic. |
| 72 | + * Claudio: What about Windows? |
| 73 | + * Michael: How big is Postject? |
| 74 | + * Darshan: 4MB. |
| 75 | + * Michael: Maybe we could include Postject in the test? That way, it could |
| 76 | + be used for testing but not necessarily be a part of the Node.js binary. |
| 77 | + |
| 78 | + * Inclusion of the injection part in Node.js after size reduction |
| 79 | + * Juan: Darshan is working on getting rid of LIEF and writing the injection |
| 80 | + part on only one platform in plain JS. If we accomplish that, it's going |
| 81 | + to significantly reduce the size. Would that change something? |
| 82 | + * Michael: The injection part doesn't necessarily have to be a part of core |
| 83 | + but the reading part does. Having the injection part in core is more about |
| 84 | + ergonomics. |
| 85 | + * Darshan: A reason why the injection part shouldn't be a part of Node.js |
| 86 | + core is that if we run `node --compile` on macOS, it's gonna be a Mach-O |
| 87 | + binary, so creating a PE executable would require sending outbound |
| 88 | + requests to download that from somewhere, which we don't want to do. |
| 89 | + * Juan: How common is that? |
| 90 | + * Michael: You probably want to do it for multiple platforms. |
| 91 | + * Juan: Even if you generate all of them on Linux, you might want jobs |
| 92 | + actually testing the CLI, on multiple platforms, so why not just run pkg |
| 93 | + on all platforms? |
| 94 | + * Darshan: Might not always be the case because if we consider macOS ARM64, |
| 95 | + that's very rare to find, so in most cases you'll build the binary but not |
| 96 | + test it on CI. |
| 97 | + |
| 98 | + * Inclusion of project license and version info |
| 99 | + * Darshan: Should we include the LIEF license in Node.js if we are only using |
| 100 | + the reading part of Postject, just because it's a part of the Postject |
| 101 | + license? |
| 102 | + * Juan, Michael: No. |
| 103 | + * Michael: We should also add a maintaining-postject document, for |
| 104 | + instructions on upgrading, etc. |
| 105 | + * Juan: Should we also include the version in `process.versions`? |
| 106 | + * Darshan: There are several dependencies that don't show up in |
| 107 | + `process.versions`, like `undici`. |
| 108 | + * Darshan: The fuse sentinel string is also a part of Postject, so do we |
| 109 | + want Node.js to use a different string to keep things less tied? |
| 110 | + * Michael: Maybe use a define for that? |
| 111 | + * Michael: Long term, maybe we can make Postject a part of Node.js but for |
| 112 | + now we can keep it as a separate project for more flexibility. |
| 113 | + |
| 114 | + * Experimental warning |
| 115 | + * Darshan: A point that Geoffrey raised is about emitting an experimental |
| 116 | + warning. When should we do that - while compiling the SEA or while running |
| 117 | + the SEA? |
| 118 | + * Michael: Easiest thing is including for both but users can suppress these |
| 119 | + warnings if they want. |
| 120 | + |
| 121 | + * Option for users to opt out of having injectable Node.js binaries |
| 122 | + * Michael: Let's also place even the reading part behind a compile time flag, |
| 123 | + so that users can opt out of having this feature if they want. |
| 124 | + * Darshan: That can be done but how do we test both cases where this feature |
| 125 | + is enabled / disabled? |
| 126 | + * Michael: We can have separate jobs on Jenkins. |
| 127 | + |
| 128 | + * Tony: If we decide to have the read part in Node.js core and the injection |
| 129 | + side in Postject, does that reduce the scope of Postject? |
| 130 | + * Michael: We would need the same functionality, so it doesn't change the |
| 131 | + whole use case in anyway. |
| 132 | + |
| 133 | +### Announcements |
| 134 | + |
| 135 | +* Juan: Tony will start working as a co-maintainer of Postject and work on the |
| 136 | + SEA initiative soon! |
| 137 | + |
| 138 | +## Upcoming Meetings |
| 139 | + |
| 140 | +* **Node.js Project Calendar**: <https://nodejs.org/calendar> |
| 141 | + |
| 142 | +Click `+GoogleCalendar` at the bottom right to add to your own Google calendar. |
0 commit comments