@bleedingdev/modern-js-renderer-octane 3.9.3-ultramodern.7 → 3.9.3-ultramodern.9

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 (96) hide show
  1. package/dist/cjs/client.js +56 -6
  2. package/dist/cjs/entry-application.js +7 -2
  3. package/dist/cjs/entry-client.js +3 -0
  4. package/dist/cjs/entry-server.js +13 -5
  5. package/dist/cjs/federation.js +108 -6
  6. package/dist/cjs/i18n/I18nProvider.js +6 -14
  7. package/dist/cjs/i18n/LocalizedLink.js +24 -33
  8. package/dist/cjs/i18n/index.js +0 -3
  9. package/dist/cjs/i18n-external-snapshot.js +645 -0
  10. package/dist/cjs/index.js +4 -4
  11. package/dist/cjs/manifest.js +2 -2
  12. package/dist/cjs/plugin/compiler.js +2 -5
  13. package/dist/cjs/plugin/index.js +2 -2
  14. package/dist/cjs/plugin/profile.js +12 -10
  15. package/dist/cjs/router-client.js +1 -1
  16. package/dist/cjs/router-external-snapshot.js +263 -0
  17. package/dist/cjs/router-handler.js +11 -8
  18. package/dist/cjs/router-server.js +3 -11
  19. package/dist/cjs/router.js +1 -1
  20. package/dist/cjs/routes.js +11 -17
  21. package/dist/cjs/server.js +28 -7
  22. package/dist/cjs/worker-federation-context.js +63 -0
  23. package/dist/cjs/worker-federation-contexts.js +97 -0
  24. package/dist/cjs/worker-federation.js +97 -0
  25. package/dist/esm/client.mjs +56 -6
  26. package/dist/esm/entry-application.mjs +7 -2
  27. package/dist/esm/entry-client.mjs +3 -0
  28. package/dist/esm/entry-server.mjs +11 -6
  29. package/dist/esm/federation.mjs +110 -8
  30. package/dist/esm/i18n/I18nProvider.mjs +7 -15
  31. package/dist/esm/i18n/LocalizedLink.mjs +24 -30
  32. package/dist/esm/i18n/index.mjs +1 -1
  33. package/dist/esm/i18n-external-snapshot.mjs +576 -0
  34. package/dist/esm/index.mjs +4 -4
  35. package/dist/esm/manifest.mjs +2 -2
  36. package/dist/esm/router-client.mjs +1 -1
  37. package/dist/esm/router-external-snapshot.mjs +216 -0
  38. package/dist/esm/router-handler.mjs +11 -8
  39. package/dist/esm/router-server.mjs +0 -1
  40. package/dist/esm/router.mjs +2 -2
  41. package/dist/esm/routes.mjs +11 -17
  42. package/dist/esm/server.mjs +24 -3
  43. package/dist/esm/worker-federation-context.mjs +19 -0
  44. package/dist/esm/worker-federation-contexts.mjs +47 -0
  45. package/dist/esm/worker-federation.mjs +59 -0
  46. package/dist/esm-node/manifest.mjs +2 -2
  47. package/dist/esm-node/plugin/compiler.mjs +2 -5
  48. package/dist/esm-node/plugin/index.mjs +2 -2
  49. package/dist/esm-node/plugin/profile.mjs +12 -10
  50. package/dist/types/client.d.ts +5 -1
  51. package/dist/types/entry-client.d.ts +2 -0
  52. package/dist/types/entry-server.d.ts +4 -1
  53. package/dist/types/federation.d.ts +2 -0
  54. package/dist/types/i18n/LocalizedLink.d.ts +5 -32
  55. package/dist/types/i18n/context.d.ts +1 -1
  56. package/dist/types/i18n/index.d.ts +1 -1
  57. package/dist/types/i18n-external-snapshot.d.ts +43 -0
  58. package/dist/types/index.d.ts +4 -4
  59. package/dist/types/manifest.d.ts +2 -2
  60. package/dist/types/router-external-snapshot.d.ts +10 -0
  61. package/dist/types/router-server.d.ts +0 -2
  62. package/dist/types/server.d.ts +6 -0
  63. package/dist/types/worker-federation-context.d.ts +34 -0
  64. package/dist/types/worker-federation-contexts.d.ts +25 -0
  65. package/dist/types/worker-federation.d.ts +20 -0
  66. package/package.json +84 -22
  67. package/src/client.ts +99 -16
  68. package/src/entry-application.ts +7 -3
  69. package/src/entry-client.ts +10 -0
  70. package/src/entry-server.ts +20 -9
  71. package/src/federation.ts +159 -15
  72. package/src/i18n/I18nProvider.ts +11 -20
  73. package/src/i18n/LocalizedLink.ts +46 -72
  74. package/src/i18n/context.ts +1 -1
  75. package/src/i18n/index.ts +1 -5
  76. package/src/i18n-external-snapshot.ts +803 -0
  77. package/src/index.ts +4 -4
  78. package/src/manifest.ts +2 -2
  79. package/src/plugin/compiler-manifest.cjs +27 -1
  80. package/src/plugin/compiler.ts +6 -14
  81. package/src/plugin/index.ts +4 -2
  82. package/src/plugin/profile.ts +14 -10
  83. package/src/router-client.ts +1 -1
  84. package/src/router-external-snapshot.ts +306 -0
  85. package/src/router-handler.ts +11 -8
  86. package/src/router-server.ts +0 -2
  87. package/src/router.ts +2 -2
  88. package/src/routes.ts +28 -26
  89. package/src/server.ts +45 -5
  90. package/src/worker-federation-context.ts +51 -0
  91. package/src/worker-federation-contexts.ts +91 -0
  92. package/src/worker-federation.ts +120 -0
  93. package/dist/cjs/router-injection.js +0 -139
  94. package/dist/esm/router-injection.mjs +0 -101
  95. package/dist/types/router-injection.d.ts +0 -8
  96. package/src/router-injection.ts +0 -145
@@ -1,145 +0,0 @@
1
- import type { RequestSession } from '@modern-js/renderer-core/session';
2
- import type { AnyRouter } from '@octanejs/tanstack-router';
3
- import type { StreamInjectionSource } from 'octane/server';
4
- import { cleanupOctaneRouterSSR } from './router-server-cleanup';
5
-
6
- const SERIALIZATION_TIMEOUT_MS = 60_000;
7
-
8
- export interface OctaneRouterInjectionOptions {
9
- serializationTimeoutMs?: number;
10
- }
11
-
12
- /** Couple native router serialization to the response's single stream owner. */
13
- export function createOctaneRouterInjection(
14
- router: AnyRouter,
15
- session: RequestSession,
16
- options: OctaneRouterInjectionOptions = {},
17
- ): StreamInjectionSource {
18
- const serverSsr = router.serverSsr;
19
- if (!serverSsr) {
20
- throw new Error('Native Octane router.serverSsr is required for streaming');
21
- }
22
- const timeoutMs = options.serializationTimeoutMs ?? SERIALIZATION_TIMEOUT_MS;
23
- if (
24
- !Number.isInteger(timeoutMs) ||
25
- timeoutMs <= 0 ||
26
- timeoutMs > SERIALIZATION_TIMEOUT_MS
27
- ) {
28
- throw new TypeError(
29
- 'Octane router serialization timeout must be 1 to 60000 ms',
30
- );
31
- }
32
- session.signal.throwIfAborted();
33
- let settled = false;
34
- let released = false;
35
- let renderFinished = false;
36
- let timer: ReturnType<typeof setTimeout> | undefined;
37
- let stopSerialization: (() => void) | undefined;
38
- const subscriptions = new Set<() => void>();
39
- let resolveDone!: () => void;
40
- let rejectDone!: (error: unknown) => void;
41
- const done = new Promise<void>((resolve, reject) => {
42
- resolveDone = resolve;
43
- rejectDone = reject;
44
- });
45
- // The caller may fail before attaching the injection to its native renderer.
46
- void done.catch(() => {});
47
-
48
- const settle = (error?: unknown) => {
49
- if (settled) return;
50
- settled = true;
51
- if (timer !== undefined) clearTimeout(timer);
52
- timer = undefined;
53
- stopSerialization?.();
54
- stopSerialization = undefined;
55
- if (error === undefined) resolveDone();
56
- else rejectDone(error);
57
- };
58
- const release = () => {
59
- if (released) return;
60
- released = true;
61
- if (timer !== undefined) clearTimeout(timer);
62
- timer = undefined;
63
- stopSerialization?.();
64
- stopSerialization = undefined;
65
- for (const unsubscribe of subscriptions) unsubscribe();
66
- subscriptions.clear();
67
- session.signal.removeEventListener('abort', onAbort);
68
- if (!settled) {
69
- settle(
70
- session.signal.reason ??
71
- new Error('Octane router serialization was interrupted'),
72
- );
73
- }
74
- };
75
- function onAbort() {
76
- settle(
77
- session.signal.reason ??
78
- new DOMException('Octane request aborted', 'AbortError'),
79
- );
80
- release();
81
- }
82
-
83
- if (serverSsr.isSerializationFinished()) settle();
84
- else stopSerialization = serverSsr.onSerializationFinished(() => settle());
85
- serverSsr.onCleanup(release);
86
- session.signal.addEventListener('abort', onAbort, { once: true });
87
- try {
88
- session.registerCleanup(() => {
89
- release();
90
- cleanupOctaneRouterSSR(router);
91
- });
92
- } catch (error) {
93
- release();
94
- cleanupOctaneRouterSSR(router);
95
- throw error;
96
- }
97
-
98
- return {
99
- take() {
100
- if (released) return '';
101
- // Octane takes injected HTML only once the shell is rendered, so the
102
- // router's Scripts has already moved the $_TSR bootstrap into its
103
- // barrier script. Lift the barrier here, not on subscribe: streamed
104
- // signals subscribe before rendering. Deferred $_TSR chunks then stream
105
- // as they settle instead of waiting for setRenderFinished.
106
- serverSsr.liftScriptBarrier();
107
- return serverSsr.takeBufferedHtml() ?? '';
108
- },
109
- subscribe(notify) {
110
- if (released) return () => {};
111
- const stop = serverSsr.onInjectedHtml(notify);
112
- let subscribed = true;
113
- const unsubscribe = () => {
114
- if (!subscribed) return;
115
- subscribed = false;
116
- subscriptions.delete(unsubscribe);
117
- stop();
118
- };
119
- subscriptions.add(unsubscribe);
120
- return unsubscribe;
121
- },
122
- done,
123
- cancel(reason) {
124
- settle(
125
- reason ?? new DOMException('Octane rendering cancelled', 'AbortError'),
126
- );
127
- release();
128
- void session.abort(reason);
129
- },
130
- renderComplete() {
131
- if (released || renderFinished) return;
132
- renderFinished = true;
133
- serverSsr.setRenderFinished();
134
- if (!serverSsr.isSerializationFinished() && !settled) {
135
- timer = setTimeout(() => {
136
- const error = new Error(
137
- 'Octane router serialization timed out after app rendering',
138
- );
139
- settle(error);
140
- void session.fail(error);
141
- }, timeoutMs);
142
- }
143
- },
144
- };
145
- }