dom-expressions 0.41.0-next.21 → 0.41.0-next.22

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (2) hide show
  1. package/package.json +2 -2
  2. package/src/server.js +63 -39
package/package.json CHANGED
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "name": "dom-expressions",
3
3
  "description": "A Fine-Grained Runtime for Performant DOM Rendering",
4
- "version": "0.41.0-next.21",
4
+ "version": "0.41.0-next.22",
5
5
  "author": "Ryan Carniato",
6
6
  "license": "MIT",
7
7
  "repository": {
@@ -29,5 +29,5 @@
29
29
  "seroval": "~1.5.0",
30
30
  "seroval-plugins": "~1.5.0"
31
31
  },
32
- "gitHead": "028c2e840d9dcfbd993c2704000b795a4305121d"
32
+ "gitHead": "82bd2edff39d186d53eaa102672e549d458ddd50"
33
33
  }
package/src/server.js CHANGED
@@ -422,10 +422,26 @@ export function renderToStream(code, options = {}) {
422
422
  function doShell() {
423
423
  if (shellCompleted) return;
424
424
  if (rootHoles) {
425
+ const pending = [];
425
426
  for (const { id, fn } of rootHoles) {
426
427
  const marker = `<!--rh${id}-->`;
427
428
  const res = resolveSSRNode(fn);
428
- html = html.replace(marker, !res.h.length ? res.t[0] : "");
429
+ if (!res.h.length) {
430
+ html = html.replace(marker, res.t[0]);
431
+ } else {
432
+ let out = res.t[0];
433
+ for (let j = 0; j < res.h.length; j++) {
434
+ const newId = nextHoleId++;
435
+ pending.push({ id: newId, fn: res.h[j] });
436
+ out += `<!--rh${newId}-->` + res.t[j + 1];
437
+ }
438
+ html = html.replace(marker, out);
439
+ for (const p of res.p) blockingPromises.add(p);
440
+ }
441
+ }
442
+ if (pending.length) {
443
+ rootHoles = pending;
444
+ return;
429
445
  }
430
446
  rootHoles = null;
431
447
  }
@@ -464,48 +480,56 @@ export function renderToStream(code, options = {}) {
464
480
  queue(flushEnd);
465
481
  },
466
482
  pipe(w) {
467
- allSettled(blockingPromises).then(() => {
468
- setTimeout(() => {
469
- doShell();
470
- buffer = writable = w;
471
- buffer.write(tmp);
472
- firstFlushed = true;
473
- if (completed) {
474
- dispose();
475
- writable.end();
476
- } else flushEnd();
483
+ function flush() {
484
+ allSettled(blockingPromises).then(() => {
485
+ setTimeout(() => {
486
+ doShell();
487
+ if (!shellCompleted) return flush();
488
+ buffer = writable = w;
489
+ buffer.write(tmp);
490
+ firstFlushed = true;
491
+ if (completed) {
492
+ dispose();
493
+ writable.end();
494
+ } else flushEnd();
495
+ });
477
496
  });
478
- });
497
+ }
498
+ flush();
479
499
  },
480
500
  pipeTo(w) {
481
- return allSettled(blockingPromises).then(() => {
482
- let resolve;
483
- const p = new Promise(r => (resolve = r));
484
- setTimeout(() => {
485
- doShell();
486
- const encoder = new TextEncoder();
487
- const writer = w.getWriter();
488
- writable = {
489
- end() {
490
- writer.releaseLock();
491
- w.close().catch(() => {});
492
- resolve();
493
- }
494
- };
495
- buffer = {
496
- write(payload) {
497
- writer.write(encoder.encode(payload)).catch(() => {});
498
- }
499
- };
500
- buffer.write(tmp);
501
- firstFlushed = true;
502
- if (completed) {
503
- dispose();
504
- writable.end();
505
- } else flushEnd();
501
+ let resolve;
502
+ const p = new Promise(r => (resolve = r));
503
+ function flush() {
504
+ allSettled(blockingPromises).then(() => {
505
+ setTimeout(() => {
506
+ doShell();
507
+ if (!shellCompleted) return flush();
508
+ const encoder = new TextEncoder();
509
+ const writer = w.getWriter();
510
+ writable = {
511
+ end() {
512
+ writer.releaseLock();
513
+ w.close().catch(() => {});
514
+ resolve();
515
+ }
516
+ };
517
+ buffer = {
518
+ write(payload) {
519
+ writer.write(encoder.encode(payload)).catch(() => {});
520
+ }
521
+ };
522
+ buffer.write(tmp);
523
+ firstFlushed = true;
524
+ if (completed) {
525
+ dispose();
526
+ writable.end();
527
+ } else flushEnd();
528
+ });
506
529
  });
507
- return p;
508
- });
530
+ }
531
+ flush();
532
+ return p;
509
533
  }
510
534
  };
511
535
  }