You signed in with another tab or window. Reload to refresh your session.You signed out in another tab or window. Reload to refresh your session.You switched accounts on another tab or window. Reload to refresh your session.Dismiss alert
{{ message }}
Repository navigation
Commit 2cd9b64
Browse filesBrowse the repository at this point in the historyBrowse files
The loader merged: say "in Node", and name the release it ships in
nodejs/node#65748, the --vfs-mount / --vfs-load flags and registerProvider,
merged on 17 September — one day after v26.9.0 was cut. v26.9.0 itself shipped
three of the others: the ZipProvider (#64915), native addons from a mount
(#65680) and SEA assets behind a VFS mount (#65675). So every piece is in Node,
all but one released, and that one ships in the next 26.x.
"The next 26.x" rather than a version number on purpose. A new CLI flag is
normally semver-minor, and minor changes do not go into patch releases, so this
may well be 26.10.0 rather than 26.9.1; there is no release proposal yet to
settle it, and wording that is right either way is worth more than a number that
may need correcting.
README: the header note, the requirements table (with rows for "useVfs" and for
"vfsArchive", #65810, which is still open and needed by `bundle sea` only), the
prose around it, and the development note. HISTORY: the three additions, the
section headings, the addon and SEA passages, and why the release workflow
still ships disabled — now a wait of one release rather than an open PR. The
workflow header and the example's requirements say the same.
The deck's status slide gets back the headline its own checklist said to
restore once the flags landed, "This is in Node.", with version tags on the
released rows and "next 26.x" on the one that is not. The speaker notes stop
warning against saying "landed" and start being precise about merged versus
released instead; the title slide's tense note says what to open with before
that release exists.
### 3. `--vfs-mount` / `--vfs-load` startup flags — the keystone *([nodejs/node#65748](https://github.com/nodejs/node/pull/65748) — merged, in the next 26.x release)*
187
187
188
188
This is what wires VFS into Node's *startup and module resolution* so a mounted tree
189
189
becomes the thing the program actually runs from. Mounting and running stay separate
@@ -230,7 +230,7 @@ several mounts and still have exactly one entry point:
230
230
not load: the same sources are mounted in the same order, so the reserved paths line up,
231
231
and the worker runs its own entry point.
232
232
-**Native addons** were a separate pull request,
233
-
[nodejs/node#65680](https://github.com/nodejs/node/pull/65680), merged on 4 September. The
233
+
[nodejs/node#65680](https://github.com/nodejs/node/pull/65680), released in v26.9.0. The
234
234
reason they needed one is that
235
235
`dlopen()`/`LoadLibrary()` open a shared object *by path* and a VFS path has no inode to
236
236
open. It reads the addon's bytes out of the mount and loads them from a private,
@@ -898,9 +898,10 @@ environment — one build, decided about later.
898
898
899
899
**The package rides inside as an archive node mounts for itself.** The stub runs before
900
900
anything is mounted, so it cannot import this package the ordinary way. It no longer has to:
901
-
`"useVfs": true` with `"vfsArchive"` ([nodejs/node#65675](https://github.com/nodejs/node/pull/65675),
902
-
and the `vfsArchive` that followed it) embeds a ZIP in the executable and mounts it as the
903
-
file system the main script runs from. The stub is injected at the root of that mount, so
901
+
`"useVfs": true` ([nodejs/node#65675](https://github.com/nodejs/node/pull/65675), released in
902
+
v26.9.0) with `"vfsArchive"` ([nodejs/node#65810](https://github.com/nodejs/node/pull/65810),
903
+
still open) embeds a ZIP in the executable and mounts it as the file system the main script
904
+
runs from. The stub is injected at the root of that mount, so
904
905
requiring the launcher is a relative path and nothing else.
905
906
906
907
That replaced the userland version of the same idea: the verifier bundle as a raw SEA asset,
@@ -1154,7 +1155,8 @@ its attestation from it. Two attestations over one artifact, from one identity:
1154
1155
the registry copy, and this project's over the bytes inside it.
1155
1156
1156
1157
> **It cannot run yet.** Every step depends on the `--vfs-mount` / `--vfs-load` work, which
1157
-
> is still an open pull request, so there is no `node-version` that would make it pass. The
1158
+
> is merged but not yet in a release, so there is no `node-version` that would make it pass
1159
+
> until the next 26.x ships. The
1158
1160
> file is disabled two ways over — it does not end in `.yml`, so GitHub never parses it, and
1159
1161
> its body is commented out — and it carries the one-line command that turns it back into a
1160
1162
> live workflow. It is there to be read.
@@ -1876,11 +1878,12 @@ the right one for a release pipeline specifically — less obviously so for ordi
1876
1878
1877
1879
#### Why it ships disabled
1878
1880
1879
-
None of this can run yet. `node:vfs` and the ZIP support in `node:zlib` are released and
1880
-
`ZipProvider` is merged, but the `--vfs-mount` / `--vfs-load` loader is still open, so there
1881
-
is no `node-version` GitHub Actions can install that would make the workflow pass, and
1882
-
shipping it live would produce a permanently red workflow and a repository that looks
1883
-
broken.
1881
+
None of this can run yet. Everything it needs is in Node, and most of it is released —
1882
+
but the `--vfs-mount` / `--vfs-load` loader merged the day after v26.9.0 was cut, so until
1883
+
the next 26.x release there is no `node-version` GitHub Actions can install that would make
1884
+
the workflow pass, and shipping it live would produce a permanently red workflow and a
1885
+
repository that looks broken. That is a wait of one release, and the header carries the
1886
+
command that ends it.
1884
1887
1885
1888
It is kept anyway, at `.github/workflows/release.yml.disabled`: the file does not end in
1886
1889
`.yml`, so GitHub never parses it, and the body is commented out on top of that. The header
Copy file name to clipboardExpand all lines: README.md
+37-29Lines changed: 37 additions & 29 deletions
Display the source diff
Display the rich diff
Original file line number
Diff line number
Diff line change
@@ -15,11 +15,11 @@ filesystem, so an archive that does not check out never becomes one and its entr
15
15
never runs. Every member is re-hashed against its signed digest as it is read, for the life
16
16
of the process.
17
17
18
-
> **Requires a Node built from `main`, with one open pull request applied.**`node:vfs` and
19
-
> the ZIP support in `node:zlib` are released, and `ZipProvider` is merged and should be in
20
-
> the next release; the `--vfs-mount` / `--vfs-load` loader — and with it
21
-
> `vfs.registerProvider()` — is still open, and is the piece nothing here runs without. See
22
-
> [Requirements](#requirements). Everything here is experimental.
18
+
> **Requires the next Node 26 release.** Everything this needs is in Node: most of it is
19
+
> released, through v26.9.0, and the `--vfs-mount` / `--vfs-load` loader — the piece nothing
20
+
> here runs without — merged on 17 September, the day after v26.9.0 shipped. Until the next
21
+
> 26.x release, that means a Node built from `main`. See[Requirements](#requirements).
22
+
> Everything here is experimental.
23
23
24
24
---
25
25
@@ -403,10 +403,10 @@ From code, `createSeaBase()` and `buildSea()` split the expensive half (a ~155 M
403
403
Node) from the cheap one, `@pipobscure/bundle/launch` is the entry point all of this runs
404
404
through — `run()`, `runSelf()`, `verify()`, `main()` — and `verifySelf()` lets an application
405
405
report on its own provenance. The package rides inside the executable as an archive that node
406
-
mounts for itself: `"useVfs": true`with `"vfsArchive"`
407
-
([nodejs/node#65675](https://github.com/nodejs/node/pull/65675) and the `vfsArchive` that
408
-
followed it), which is why the generated stub is three lines and why there is no second copy
409
-
of the verifier anywhere.
406
+
mounts for itself: `"useVfs": true`([nodejs/node#65675](https://github.com/nodejs/node/pull/65675),
407
+
released in v26.9.0) with `"vfsArchive"`([nodejs/node#65810](https://github.com/nodejs/node/pull/65810),
408
+
still open), which is why the generated stub is a handful of lines and why there is no second
409
+
copy of the verifier anywhere.
410
410
411
411
---
412
412
@@ -490,21 +490,28 @@ Everything here sits on Node's experimental `node:vfs` (by Matteo Collina) and r
490
490
|---|---|
491
491
|**`node:vfs`**, and modules resolving and loading out of a mount | released, v26.4.0 |
492
492
|**ZIP support in `node:zlib`** — `ZipFile`, `ZipBuffer`, `ZipEntry`| released, v26.8.0 |
493
-
|**`ZipProvider`**, a VFS provider backed by such an archive | merged — [nodejs/node#64915](https://github.com/nodejs/node/pull/64915)|
494
-
|**`--vfs-mount` / `--vfs-load`**, and `vfs.registerProvider()`| open — [nodejs/node#65748](https://github.com/nodejs/node/pull/65748)|
495
-
|**Native addons loaded from a mount**| merged — [nodejs/node#65680](https://github.com/nodejs/node/pull/65680)|
496
-
497
-
A released Node already reads ZIP archives and already resolves modules out of a mount; the
498
-
provider that turns one into the other is merged, so `main` today has everything a program
499
-
needs to *be* an archive. What is still missing is the way to ask for that mount from outside
500
-
the program, which is the whole hinge: **`--vfs-mount` / `--vfs-load`** make a mounted tree
501
-
the thing a program resolves and runs from, and the same pull request brings
502
-
`vfs.registerProvider()` — the extension point that lets a preload decide what backs a mount,
503
-
and therefore the one that makes a *verifying* mount possible from userland at all. Until it
504
-
lands, build Node from `main` with it applied; nothing in this package runs without it.
505
-
506
-
Native addons out of a mount landed on 4 September as
507
-
[nodejs/node#65680](https://github.com/nodejs/node/pull/65680), which closes the last gap in
493
+
|**`ZipProvider`**, a VFS provider backed by such an archive | released, v26.9.0 — [nodejs/node#64915](https://github.com/nodejs/node/pull/64915)|
494
+
|**Native addons loaded from a mount**| released, v26.9.0 — [nodejs/node#65680](https://github.com/nodejs/node/pull/65680)|
495
+
|**`"useVfs"`**, a SEA's assets behind a VFS mount | released, v26.9.0 — [nodejs/node#65675](https://github.com/nodejs/node/pull/65675)|
496
+
|**`--vfs-mount` / `--vfs-load`**, and `vfs.registerProvider()`| merged 17 Sep, in the next 26.x release — [nodejs/node#65748](https://github.com/nodejs/node/pull/65748)|
497
+
|**`"vfsArchive"`**, a ZIP as a SEA's file system — `bundle sea` only | open — [nodejs/node#65810](https://github.com/nodejs/node/pull/65810)|
498
+
499
+
v26.9.0 already has everything a program needs to *be* an archive: it reads ZIP archives,
500
+
turns one into a file system, resolves modules out of it, and loads native addons from it. The
501
+
one thing it lacks is the way to ask for that mount from *outside* the program, which is the
502
+
whole hinge: **`--vfs-mount` / `--vfs-load`** make a mounted tree the thing a program resolves
503
+
and runs from, and the same pull request brings `vfs.registerProvider()` — the extension point
504
+
that lets a preload decide what backs a mount, and therefore the one that makes a *verifying*
505
+
mount possible from userland at all. It merged on 17 September, one day after v26.9.0 was
506
+
cut, so it ships in the next 26.x release. Until then, build Node from `main`.
507
+
508
+
[nodejs/node#65810](https://github.com/nodejs/node/pull/65810) is needed only to build an
509
+
executable. It lets a SEA's file system *be* a ZIP archive rather than a list of assets, which
510
+
is how this package gets inside one: `bundle sea` embeds the verifier bundle whole and node
511
+
mounts it. It is still open; everything else here works without it.
512
+
513
+
Native addons out of a mount shipped in v26.9.0, as
514
+
[nodejs/node#65680](https://github.com/nodejs/node/pull/65680), which closed the last gap in
508
515
what a bundle can contain. A `dlopen()` needs a path with an inode behind it and a VFS path
509
516
has none, so it reads the addon's bytes out of the mount and loads them from a private,
510
517
self-cleaning image instead — an anonymous memfd on Linux, an unlinked temp file elsewhere.
@@ -526,9 +533,10 @@ npm test # 144 tests; generates a throwaway PKI into build/certs/
526
533
npm run typecheck
527
534
```
528
535
529
-
The suite needs a Node carrying the [requirements](#requirements); against a build of
530
-
[nodejs/node#65748](https://github.com/nodejs/node/pull/65748) all 144 pass, launcher, mount
531
-
and executable tests included.
536
+
The suite needs a Node carrying the [requirements](#requirements) — today, one built from
537
+
`main` with [nodejs/node#65810](https://github.com/nodejs/node/pull/65810) applied for the
538
+
executable tests; from the next 26.x release, only that. Against such a build all 144 pass,
539
+
launcher, mount and executable tests included.
532
540
533
541
Tests import the sources rather than the build, so they run under Node's type stripping. The
534
542
test PKI is generated on demand by `tools/testpki.ts` and is **never committed** — a private
@@ -566,8 +574,8 @@ does to release itself is something you can do to your own project.
566
574
[`.github/workflows/release.yml.disabled`](.github/workflows/release.yml.disabled) is the
567
575
whole pipeline as a workflow — CI, pack, fetch the published release, audit the diff, gate,
568
576
sign through sigstore with the workflow's OIDC identity, publish with npm provenance, every
569
-
action pinned to a commit SHA. It is inert, because the Node it needs is not released yet; the
570
-
header carries the command that makes it live.
577
+
action pinned to a commit SHA. It is inert until the next 26.x release gives GitHub Actions a
578
+
Node it can install; the header carries the command that makes it live.
0 commit comments