[{"data":1,"prerenderedAt":1041},["ShallowReactive",2],{"docs-nav:en":3,"docs:\u002Fdocs\u002Finfra\u002Flifecycle":186},[4],{"title":5,"path":6,"stem":7,"children":8},"Docs","\u002Fdocs","docs",[9,12,16,20,24,28,50,75,120,145],{"title":10,"path":6,"stem":11},"What is Fougere","docs\u002Findex",{"title":13,"path":14,"stem":15},"Getting started","\u002Fdocs\u002Fgetting-started","docs\u002F01.getting-started",{"title":17,"path":18,"stem":19},"An app you already have","\u002Fdocs\u002Fexisting-app","docs\u002F02.existing-app",{"title":21,"path":22,"stem":23},"Bring your schema","\u002Fdocs\u002Fbring-your-schema","docs\u002F03.bring-your-schema",{"title":25,"path":26,"stem":27},"The CLI","\u002Fdocs\u002Fcli","docs\u002F04.cli",{"title":29,"path":30,"stem":31,"children":32,"page":49},"Concepts","\u002Fdocs\u002Fconcepts","docs\u002F2.concepts",[33,37,41,45],{"title":34,"path":35,"stem":36},"Philosophy","\u002Fdocs\u002Fconcepts\u002Fphilosophy","docs\u002F2.concepts\u002F1.philosophy",{"title":38,"path":39,"stem":40},"The Frond","\u002Fdocs\u002Fconcepts\u002Ffrond","docs\u002F2.concepts\u002F2.frond",{"title":42,"path":43,"stem":44},"The shortest path","\u002Fdocs\u002Fconcepts\u002Fshortest-path","docs\u002F2.concepts\u002F3.shortest-path",{"title":46,"path":47,"stem":48},"The base","\u002Fdocs\u002Fconcepts\u002Fthe-base","docs\u002F2.concepts\u002F4.the-base",false,{"title":51,"path":52,"stem":53,"children":54,"page":49},"Schema","\u002Fdocs\u002Fschema","docs\u002F3.schema",[55,59,63,67,71],{"title":56,"path":57,"stem":58},"Entities","\u002Fdocs\u002Fschema\u002Fentities","docs\u002F3.schema\u002F1.entities",{"title":60,"path":61,"stem":62},"Views","\u002Fdocs\u002Fschema\u002Fviews","docs\u002F3.schema\u002F2.views",{"title":64,"path":65,"stem":66},"The identity card","\u002Fdocs\u002Fschema\u002Fcard","docs\u002F3.schema\u002F3.card",{"title":68,"path":69,"stem":70},"Standard Schema","\u002Fdocs\u002Fschema\u002Fstandard-schema","docs\u002F3.schema\u002F4.standard-schema",{"title":72,"path":73,"stem":74},"How a schema moves","\u002Fdocs\u002Fschema\u002Fevolution","docs\u002F3.schema\u002F5.evolution",{"title":76,"path":77,"stem":78,"children":79,"page":49},"Business","\u002Fdocs\u002Fbusiness","docs\u002F4.business",[80,84,88,92,96,100,104,108,112,116],{"title":81,"path":82,"stem":83},"Handlers","\u002Fdocs\u002Fbusiness\u002Fhandlers","docs\u002F4.business\u002F1.handlers",{"title":85,"path":86,"stem":87},"Ports","\u002Fdocs\u002Fbusiness\u002Fports","docs\u002F4.business\u002F10.ports",{"title":89,"path":90,"stem":91},"Presenters","\u002Fdocs\u002Fbusiness\u002Fpresenters","docs\u002F4.business\u002F2.presenters",{"title":93,"path":94,"stem":95},"Collectors","\u002Fdocs\u002Fbusiness\u002Fcollectors","docs\u002F4.business\u002F3.collectors",{"title":97,"path":98,"stem":99},"Errors","\u002Fdocs\u002Fbusiness\u002Ferrors","docs\u002F4.business\u002F4.errors",{"title":101,"path":102,"stem":103},"Seeds","\u002Fdocs\u002Fbusiness\u002Fseeds","docs\u002F4.business\u002F5.seeds",{"title":105,"path":106,"stem":107},"Facts","\u002Fdocs\u002Fbusiness\u002Ffacts","docs\u002F4.business\u002F6.facts",{"title":109,"path":110,"stem":111},"Storage","\u002Fdocs\u002Fbusiness\u002Fstorage","docs\u002F4.business\u002F7.storage",{"title":113,"path":114,"stem":115},"Writes that stand or fall as one","\u002Fdocs\u002Fbusiness\u002Ftogether","docs\u002F4.business\u002F8.together",{"title":117,"path":118,"stem":119},"Repositories","\u002Fdocs\u002Fbusiness\u002Frepositories","docs\u002F4.business\u002F9.repositories",{"title":121,"path":122,"stem":123,"children":124,"page":49},"Client","\u002Fdocs\u002Fclient","docs\u002F5.client",[125,129,133,137,141],{"title":126,"path":127,"stem":128},"Queries & commands","\u002Fdocs\u002Fclient\u002Fqueries-commands","docs\u002F5.client\u002F1.queries-commands",{"title":130,"path":131,"stem":132},"Forms","\u002Fdocs\u002Fclient\u002Fforms","docs\u002F5.client\u002F2.forms",{"title":134,"path":135,"stem":136},"Session","\u002Fdocs\u002Fclient\u002Fsession","docs\u002F5.client\u002F3.session",{"title":138,"path":139,"stem":140},"invoke","\u002Fdocs\u002Fclient\u002Finvoke","docs\u002F5.client\u002F4.invoke",{"title":142,"path":143,"stem":144},"Back-office","\u002Fdocs\u002Fclient\u002Fadmin","docs\u002F5.client\u002F5.admin",{"title":146,"path":147,"stem":148,"children":149,"page":49},"Infrastructure","\u002Fdocs\u002Finfra","docs\u002F6.infra",[150,154,158,162,166,170,174,178,182],{"title":151,"path":152,"stem":153},"The gradient","\u002Fdocs\u002Finfra\u002Fgradient","docs\u002F6.infra\u002F1.gradient",{"title":155,"path":156,"stem":157},"Surfaces — REST & GraphQL","\u002Fdocs\u002Finfra\u002Fsurfaces","docs\u002F6.infra\u002F2.surfaces",{"title":159,"path":160,"stem":161},"Deployment","\u002Fdocs\u002Finfra\u002Fdeployment","docs\u002F6.infra\u002F3.deployment",{"title":163,"path":164,"stem":165},"Hosts","\u002Fdocs\u002Finfra\u002Fhosts","docs\u002F6.infra\u002F4.hosts",{"title":167,"path":168,"stem":169},"Sources","\u002Fdocs\u002Finfra\u002Fsources","docs\u002F6.infra\u002F5.sources",{"title":171,"path":172,"stem":173},"Lifecycle","\u002Fdocs\u002Finfra\u002Flifecycle","docs\u002F6.infra\u002F6.lifecycle",{"title":175,"path":176,"stem":177},"Identity across Fronds","\u002Fdocs\u002Finfra\u002Fidentity","docs\u002F6.infra\u002F7.identity",{"title":179,"path":180,"stem":181},"Observability","\u002Fdocs\u002Finfra\u002Fobservability","docs\u002F6.infra\u002F8.observability",{"title":183,"path":184,"stem":185},"Testing","\u002Fdocs\u002Finfra\u002Ftesting","docs\u002F6.infra\u002F9.testing",{"id":187,"title":171,"body":188,"description":1035,"extension":1036,"meta":1037,"navigation":1038,"path":172,"seo":1039,"stem":173,"__hash__":1040},"docs_en\u002Fdocs\u002F6.infra\u002F6.lifecycle.md",{"type":189,"value":190,"toc":1027},"minimark",[191,195,199,208,223,228,238,245,337,358,361,405,415,517,520,544,559,563,573,722,728,741,745,748,769,780,784,787,828,834,837,858,861,865,872,982,993,999,1003,1010,1023],[192,193,171],"h1",{"id":194},"lifecycle",[196,197,198],"p",{},"A config value falls into one of two kinds, and everything on this page follows from\nwhich one it is:",[200,201,202],"blockquote",{},[196,203,204],{},[205,206,207],"strong",{},"A value that is CONSULTED can change under a running app. A value that was CONSUMED\nto build something cannot, without rebuilding what it built.",[196,209,210,214,215,218,219,222],{},[211,212,213],"code",{},"logLevel"," is consulted at every emission. ",[211,216,217],{},"db"," opened a connection, ",[211,220,221],{},"ports:"," registered a\nclass, the entities built façades — those were consumed.",[224,225,227],"h2",{"id":226},"the-way-up","The way up",[196,229,230,233,234,237],{},[211,231,232],{},"dispose()"," had a shape from the start: reverse order, only what it built. The way UP had\nnone — it lived in four places under the name ",[211,235,236],{},"afterBoot",", meaning two different things, and\na host that wanted its own seeding had to claim EVERYTHING after the boot to get it.",[196,239,240,241,244],{},"So the pair is one value. An ",[205,242,243],{},"extension"," states what it does to an app and what it undoes:",[246,247,252],"pre",{"className":248,"code":249,"language":250,"meta":251,"style":251},"language-ts shiki shiki-themes material-theme-lighter github-light github-dark","const app = await createApp({\n  root,\n  createContainer,\n  extensions: [observability()],\n});\n","ts","",[211,253,254,287,296,304,325],{"__ignoreMap":251},[255,256,259,263,267,271,275,279,283],"span",{"class":257,"line":258},"line",1,[255,260,262],{"class":261},"sbsja","const",[255,264,266],{"class":265},"s_hVV"," app",[255,268,270],{"class":269},"smGrS"," =",[255,272,274],{"class":273},"sVHd0"," await",[255,276,278],{"class":277},"sGLFI"," createApp",[255,280,282],{"class":281},"su5hD","(",[255,284,286],{"class":285},"sP7_E","{\n",[255,288,290,293],{"class":257,"line":289},2,[255,291,292],{"class":281},"  root",[255,294,295],{"class":285},",\n",[255,297,299,302],{"class":257,"line":298},3,[255,300,301],{"class":281},"  createContainer",[255,303,295],{"class":285},[255,305,307,311,314,317,320,323],{"class":257,"line":306},4,[255,308,310],{"class":309},"skxfh","  extensions",[255,312,313],{"class":285},":",[255,315,316],{"class":281}," [",[255,318,319],{"class":277},"observability",[255,321,322],{"class":281},"()]",[255,324,295],{"class":285},[255,326,328,331,334],{"class":257,"line":327},5,[255,329,330],{"class":285},"}",[255,332,333],{"class":281},")",[255,335,336],{"class":285},";\n",[196,338,339,342,343,346,347,350,351,353,354,357],{},[211,340,341],{},"up"," runs before ",[211,344,345],{},"createApp"," returns, in declaration order; ",[211,348,349],{},"down"," runs inside ",[211,352,232],{},",\nin reverse. It is also the one point in the boot that may ",[205,355,356],{},"await",", which is where a\nprovider that has to open something belongs — a constructor cannot.",[196,359,360],{},"Two members are the framework's own, and they are ordinary members:",[362,363,364,377],"table",{},[365,366,367],"thead",{},[368,369,370,374],"tr",{},[371,372,373],"th",{},"name",[371,375,376],{},"what it does",[378,379,380,391],"tbody",{},[368,381,382,388],{},[383,384,385],"td",{},[211,386,387],{},"migrate",[383,389,390],{},"brings the schema up to date — tables before rows. The slot is declared even when nothing migrates, so a host filling it REPLACES this member rather than landing after the seeds",[368,392,393,398],{},[383,394,395],{},[211,396,397],{},"seeds",[383,399,400,401,404],{},"plants what ",[211,402,403],{},"seeds\u002F"," declares, in dependency order",[196,406,407,410,411,313],{},[205,408,409],{},"A name already declared is replaced, not refused."," That is how a host says ",[412,413,414],"em",{},"the seeding,\nbut mine",[246,416,418],{"className":248,"code":417,"language":250,"meta":251,"style":251},"\u002F\u002F what @fougere\u002Fnuxt generates: a bundler needs its seed modules as static imports\nextensions: [\n  migrating(storage.migrate),\n  { name: 'seeds', up: (app) => runSeeds(app, [\u002F* imported above *\u002F]) },\n]\n",[211,419,420,426,437,453,512],{"__ignoreMap":251},[255,421,422],{"class":257,"line":258},[255,423,425],{"class":424},"sutJx","\u002F\u002F what @fougere\u002Fnuxt generates: a bundler needs its seed modules as static imports\n",[255,427,428,432,434],{"class":257,"line":289},[255,429,431],{"class":430},"sbgvK","extensions",[255,433,313],{"class":285},[255,435,436],{"class":281}," [\n",[255,438,439,442,445,448,451],{"class":257,"line":298},[255,440,441],{"class":277},"  migrating",[255,443,444],{"class":281},"(storage",[255,446,447],{"class":285},".",[255,449,450],{"class":281},"migrate)",[255,452,295],{"class":285},[255,454,455,458,461,463,467,470,473,476,479,481,484,488,490,493,496,499,501,503,506,509],{"class":257,"line":306},[255,456,457],{"class":285},"  {",[255,459,460],{"class":309}," name",[255,462,313],{"class":285},[255,464,466],{"class":465},"sjJ54"," '",[255,468,397],{"class":469},"s_sjI",[255,471,472],{"class":465},"'",[255,474,475],{"class":285},",",[255,477,478],{"class":277}," up",[255,480,313],{"class":285},[255,482,483],{"class":285}," (",[255,485,487],{"class":486},"s99_P","app",[255,489,333],{"class":285},[255,491,492],{"class":261}," =>",[255,494,495],{"class":277}," runSeeds",[255,497,498],{"class":281},"(app",[255,500,475],{"class":285},[255,502,316],{"class":281},[255,504,505],{"class":424},"\u002F* imported above *\u002F",[255,507,508],{"class":281},"]) ",[255,510,511],{"class":285},"},\n",[255,513,514],{"class":257,"line":327},[255,515,516],{"class":281},"]\n",[196,518,519],{},"The ascent and the descent refuse in opposite ways, on purpose:",[521,522,523,532],"ul",{},[524,525,526,531],"li",{},[205,527,528,530],{},[211,529,341],{}," stops at the first refusal."," A seed that assumes a migration ran must not run when\nit did not, and a half-started app must not be handed out.",[524,533,534,539,540,543],{},[205,535,536,538],{},[211,537,349],{}," releases every member even when one throws",", and the refusals leave together in\nan ",[211,541,542],{},"AggregateError"," — a release that gives up on the first failure leaks everything after it.",[196,545,546,547,550,551,554,555,558],{},"An extension is not a Frond and cannot become one: a Frond has entities and may move behind\n",[211,548,549],{},"remotes:",", while an extension belongs to the ",[205,552,553],{},"process"," that hosts them. ",[211,556,557],{},"observability()","\nis the case that proves it — moved, it would report the observer instead of the observed.",[224,560,562],{"id":561},"re-reading-the-config","Re-reading the config",[196,564,565,568,569,572],{},[211,566,567],{},"applyConfig"," is the one place that answers ",[412,570,571],{},"what a re-read changes in a running app",". It\napplies what is consulted and reports the rest instead of ignoring it:",[246,574,576],{"className":248,"code":575,"language":250,"meta":251,"style":251},"\u002F\u002F the host owns the process, so the host owns the signal — Fougere catches none\nprocess.on('SIGHUP', async () => {\n  const next = await loadConfig(root, { fresh: true });\n  const { applied, pending } = applyConfig(next, inForce);\n  inForce = next;\n  \u002F\u002F applied: ['logLevel: warn → debug']\n  \u002F\u002F pending: ['db']  — changed in the file, and it opened a connection\n});\n",[211,577,578,583,614,655,690,701,707,713],{"__ignoreMap":251},[255,579,580],{"class":257,"line":258},[255,581,582],{"class":424},"\u002F\u002F the host owns the process, so the host owns the signal — Fougere catches none\n",[255,584,585,587,589,592,594,596,599,601,603,606,609,611],{"class":257,"line":289},[255,586,553],{"class":281},[255,588,447],{"class":285},[255,590,591],{"class":277},"on",[255,593,282],{"class":281},[255,595,472],{"class":465},[255,597,598],{"class":469},"SIGHUP",[255,600,472],{"class":465},[255,602,475],{"class":285},[255,604,605],{"class":261}," async",[255,607,608],{"class":285}," ()",[255,610,492],{"class":261},[255,612,613],{"class":285}," {\n",[255,615,616,619,622,624,626,629,631,634,636,639,642,644,648,651,653],{"class":257,"line":298},[255,617,618],{"class":261},"  const",[255,620,621],{"class":265}," next",[255,623,270],{"class":269},[255,625,274],{"class":273},[255,627,628],{"class":277}," loadConfig",[255,630,282],{"class":309},[255,632,633],{"class":281},"root",[255,635,475],{"class":285},[255,637,638],{"class":285}," {",[255,640,641],{"class":309}," fresh",[255,643,313],{"class":285},[255,645,647],{"class":646},"syTEX"," true",[255,649,650],{"class":285}," }",[255,652,333],{"class":309},[255,654,336],{"class":285},[255,656,657,659,661,664,666,669,671,673,676,678,681,683,686,688],{"class":257,"line":306},[255,658,618],{"class":261},[255,660,638],{"class":285},[255,662,663],{"class":265}," applied",[255,665,475],{"class":285},[255,667,668],{"class":265}," pending",[255,670,650],{"class":285},[255,672,270],{"class":269},[255,674,675],{"class":277}," applyConfig",[255,677,282],{"class":309},[255,679,680],{"class":281},"next",[255,682,475],{"class":285},[255,684,685],{"class":281}," inForce",[255,687,333],{"class":309},[255,689,336],{"class":285},[255,691,692,695,697,699],{"class":257,"line":327},[255,693,694],{"class":281},"  inForce",[255,696,270],{"class":269},[255,698,621],{"class":281},[255,700,336],{"class":285},[255,702,704],{"class":257,"line":703},6,[255,705,706],{"class":424},"  \u002F\u002F applied: ['logLevel: warn → debug']\n",[255,708,710],{"class":257,"line":709},7,[255,711,712],{"class":424},"  \u002F\u002F pending: ['db']  — changed in the file, and it opened a connection\n",[255,714,716,718,720],{"class":257,"line":715},8,[255,717,330],{"class":285},[255,719,333],{"class":281},[255,721,336],{"class":285},[196,723,724,727],{},[211,725,726],{},"{ fresh: true }"," is not decoration: a module is cached by its specifier, so a second read\nof an edited file hands back the first one.",[196,729,730,731,737,738,740],{},"The list of consulted keys is declared nowhere — ",[205,732,733,734,736],{},"a key is consulted when ",[211,735,567],{},"\ndoes something with it",", which is the only definition that cannot go stale. Today that is\n",[211,739,213],{},", and a logger built before the change obeys it, children included: the level is\nheld once for the process rather than copied into each instance.",[224,742,744],{"id":743},"turning-the-ring","Turning the ring",[196,746,747],{},"For everything else, the value cannot move under what it built — so the thing is built\nagain. One app is instantiated, the previous one let go:",[246,749,751],{"className":248,"code":750,"language":250,"meta":251,"style":251},"await reloadFougere();     \u002F\u002F instantiate, drain the old, release it\n",[211,752,753],{"__ignoreMap":251},[255,754,755,757,760,763,766],{"class":257,"line":258},[255,756,356],{"class":273},[255,758,759],{"class":277}," reloadFougere",[255,761,762],{"class":281},"()",[255,764,765],{"class":285},";",[255,767,768],{"class":424},"     \u002F\u002F instantiate, drain the old, release it\n",[196,770,771,772,775,776,779],{},"It works because every door reaches the app through ",[211,773,774],{},"useFougereApp()"," ",[205,777,778],{},"inside the request\nit serves",", and none holds it across two. The new app is up before the old one is\nreleased, so a boot that fails leaves the previous one serving.",[224,781,783],{"id":782},"draining","Draining",[196,785,786],{},"Releasing an app closes its storage connection and every Frond scope — which is what the\ncalls still running are standing on. So they are waited for:",[246,788,790],{"className":248,"code":789,"language":250,"meta":251,"style":251},"await app.drain();      \u002F\u002F stop taking calls, wait for the running ones\nawait app.dispose();    \u002F\u002F then close the scopes and the connection\n",[211,791,792,810],{"__ignoreMap":251},[255,793,794,796,798,800,803,805,807],{"class":257,"line":258},[255,795,356],{"class":273},[255,797,266],{"class":281},[255,799,447],{"class":285},[255,801,802],{"class":277},"drain",[255,804,762],{"class":281},[255,806,765],{"class":285},[255,808,809],{"class":424},"      \u002F\u002F stop taking calls, wait for the running ones\n",[255,811,812,814,816,818,821,823,825],{"class":257,"line":289},[255,813,356],{"class":273},[255,815,266],{"class":281},[255,817,447],{"class":285},[255,819,820],{"class":277},"dispose",[255,822,762],{"class":281},[255,824,765],{"class":285},[255,826,827],{"class":424},"    \u002F\u002F then close the scopes and the connection\n",[196,829,830,833],{},[211,831,832],{},"app.inFlight()"," is the count, taken at the single path all three doors and the wire share,\nso one number covers them. A nested call counts twice — the app is not idle while an inner\nop is running.",[196,835,836],{},"Two refusals, both deliberate:",[521,838,839,848],{},[524,840,841,847],{},[205,842,843,846],{},[211,844,845],{},"drain(timeoutMs)"," rejects on its deadline",", naming how many calls are left, rather\nthan resolving as if it had worked. Its caller is about to close a connection under\nwhatever remains, so the decision is theirs.",[524,849,850,853,854,857],{},[205,851,852],{},"A call arriving after the door closed is refused"," with ",[211,855,856],{},"SERVICE_UNAVAILABLE",". The\nhandle already points at the new app, so that caller kept a reference across the turn.",[196,859,860],{},"Waiting and releasing stay two gestures: a script releases at once, a host turning the ring\ndrains first.",[224,862,864],{"id":863},"shutting-down","Shutting down",[196,866,867,868,871],{},"The same two gestures answer ",[211,869,870],{},"SIGTERM",", and nothing else is needed:",[246,873,875],{"className":248,"code":874,"language":250,"meta":251,"style":251},"process.on('SIGTERM', async () => {\n  const app = await useFougereApp();\n  await app.drain(10_000);\n  await app.dispose();\n  process.exit(0);\n});\n",[211,876,877,903,920,941,955,974],{"__ignoreMap":251},[255,878,879,881,883,885,887,889,891,893,895,897,899,901],{"class":257,"line":258},[255,880,553],{"class":281},[255,882,447],{"class":285},[255,884,591],{"class":277},[255,886,282],{"class":281},[255,888,472],{"class":465},[255,890,870],{"class":469},[255,892,472],{"class":465},[255,894,475],{"class":285},[255,896,605],{"class":261},[255,898,608],{"class":285},[255,900,492],{"class":261},[255,902,613],{"class":285},[255,904,905,907,909,911,913,916,918],{"class":257,"line":289},[255,906,618],{"class":261},[255,908,266],{"class":265},[255,910,270],{"class":269},[255,912,274],{"class":273},[255,914,915],{"class":277}," useFougereApp",[255,917,762],{"class":309},[255,919,336],{"class":285},[255,921,922,925,927,929,931,933,937,939],{"class":257,"line":298},[255,923,924],{"class":273},"  await",[255,926,266],{"class":281},[255,928,447],{"class":285},[255,930,802],{"class":277},[255,932,282],{"class":309},[255,934,936],{"class":935},"srdBf","10_000",[255,938,333],{"class":309},[255,940,336],{"class":285},[255,942,943,945,947,949,951,953],{"class":257,"line":306},[255,944,924],{"class":273},[255,946,266],{"class":281},[255,948,447],{"class":285},[255,950,820],{"class":277},[255,952,762],{"class":309},[255,954,336],{"class":285},[255,956,957,960,962,965,967,970,972],{"class":257,"line":327},[255,958,959],{"class":281},"  process",[255,961,447],{"class":285},[255,963,964],{"class":277},"exit",[255,966,282],{"class":309},[255,968,969],{"class":935},"0",[255,971,333],{"class":309},[255,973,336],{"class":285},[255,975,976,978,980],{"class":257,"line":703},[255,977,330],{"class":285},[255,979,333],{"class":281},[255,981,336],{"class":285},[196,983,984,986,987,989,990,992],{},[211,985,232],{}," releases in reverse of construction, at three levels: each extension's ",[211,988,349],{},"\n(built last), then the container — each scope disposing the scopes it opened, deepest first,\nthen what it built itself — then the storage connection that was handed in and opened before\nany of it existed.\nA provider that holds something says so by having a ",[211,991,232],{}," method — nothing declares\nit, the container looks for the method.",[196,994,995,996,998],{},"Failures travel together in an ",[211,997,542],{}," rather than the first one silencing the\nrest: everything gets told to close.",[224,1000,1002],{"id":1001},"what-is-not-here","What is not here",[196,1004,1005,1006,1009],{},"Fougere catches no signal of its own. A process belongs to its host, and the logger it\nships runs on Cloudflare Workers where ",[211,1007,1008],{},"process.on"," does not exist.",[196,1011,1012,1013,1016,1017,1019,1020,1022],{},"Back to ",[1014,1015,167],"a",{"href":168},", or the ",[1014,1018,85],{"href":86}," a ",[211,1021,221],{},"\nline chooses between.",[1024,1025,1026],"style",{},"html pre.shiki code .sbsja, html code.shiki .sbsja{--shiki-light:#9C3EDA;--shiki-default:#D73A49;--shiki-dark:#F97583}html pre.shiki code .s_hVV, html code.shiki .s_hVV{--shiki-light:#90A4AE;--shiki-default:#005CC5;--shiki-dark:#79B8FF}html pre.shiki code .smGrS, html code.shiki .smGrS{--shiki-light:#39ADB5;--shiki-default:#D73A49;--shiki-dark:#F97583}html pre.shiki code .sVHd0, html code.shiki .sVHd0{--shiki-light:#39ADB5;--shiki-light-font-style:italic;--shiki-default:#D73A49;--shiki-default-font-style:inherit;--shiki-dark:#F97583;--shiki-dark-font-style:inherit}html pre.shiki code .sGLFI, html code.shiki .sGLFI{--shiki-light:#6182B8;--shiki-default:#6F42C1;--shiki-dark:#B392F0}html pre.shiki code .su5hD, html code.shiki .su5hD{--shiki-light:#90A4AE;--shiki-default:#24292E;--shiki-dark:#E1E4E8}html pre.shiki code .sP7_E, html code.shiki .sP7_E{--shiki-light:#39ADB5;--shiki-default:#24292E;--shiki-dark:#E1E4E8}html pre.shiki code .skxfh, html code.shiki .skxfh{--shiki-light:#E53935;--shiki-default:#24292E;--shiki-dark:#E1E4E8}html .light .shiki span {color: var(--shiki-light);background: var(--shiki-light-bg);font-style: var(--shiki-light-font-style);font-weight: var(--shiki-light-font-weight);text-decoration: var(--shiki-light-text-decoration);}html.light .shiki span {color: var(--shiki-light);background: var(--shiki-light-bg);font-style: var(--shiki-light-font-style);font-weight: var(--shiki-light-font-weight);text-decoration: var(--shiki-light-text-decoration);}html .default .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}html.dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}html pre.shiki code .sutJx, html code.shiki .sutJx{--shiki-light:#90A4AE;--shiki-light-font-style:italic;--shiki-default:#6A737D;--shiki-default-font-style:inherit;--shiki-dark:#6A737D;--shiki-dark-font-style:inherit}html pre.shiki code .sbgvK, html code.shiki .sbgvK{--shiki-light:#E2931D;--shiki-default:#6F42C1;--shiki-dark:#B392F0}html pre.shiki code .sjJ54, html code.shiki .sjJ54{--shiki-light:#39ADB5;--shiki-default:#032F62;--shiki-dark:#9ECBFF}html pre.shiki code .s_sjI, html code.shiki .s_sjI{--shiki-light:#91B859;--shiki-default:#032F62;--shiki-dark:#9ECBFF}html pre.shiki code .s99_P, html code.shiki .s99_P{--shiki-light:#90A4AE;--shiki-light-font-style:italic;--shiki-default:#E36209;--shiki-default-font-style:inherit;--shiki-dark:#FFAB70;--shiki-dark-font-style:inherit}html pre.shiki code .syTEX, html code.shiki .syTEX{--shiki-light:#FF5370;--shiki-default:#005CC5;--shiki-dark:#79B8FF}html pre.shiki code .srdBf, html code.shiki .srdBf{--shiki-light:#F76D47;--shiki-default:#005CC5;--shiki-dark:#79B8FF}",{"title":251,"searchDepth":289,"depth":289,"links":1028},[1029,1030,1031,1032,1033,1034],{"id":226,"depth":289,"text":227},{"id":561,"depth":289,"text":562},{"id":743,"depth":289,"text":744},{"id":782,"depth":289,"text":783},{"id":863,"depth":289,"text":864},{"id":1001,"depth":289,"text":1002},"What a running app can change without being rebuilt, what needs another turn of the ring, and how a call in flight is not cut in half.","md",{},true,{"title":171,"description":1035},"HZRWZN7RDs3QiBKnSKN3BTpvAKM0w2lpYQljlCGJUs4",1788560231333]