@bleedingdev/modern-js-renderer-octane 3.9.3-ultramodern.6 → 3.9.3-ultramodern.8

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 (49) hide show
  1. package/dist/cjs/entry-server.js +2 -2
  2. package/dist/cjs/i18n/I18nProvider.js +6 -14
  3. package/dist/cjs/index.js +4 -4
  4. package/dist/cjs/manifest.js +2 -2
  5. package/dist/cjs/plugin/compiler.js +2 -5
  6. package/dist/cjs/plugin/index.js +1 -1
  7. package/dist/cjs/plugin/profile.js +11 -10
  8. package/dist/cjs/router-client.js +1 -1
  9. package/dist/cjs/router-handler.js +11 -8
  10. package/dist/cjs/router-server.js +3 -11
  11. package/dist/cjs/router.js +1 -1
  12. package/dist/cjs/routes.js +11 -17
  13. package/dist/cjs/server.js +14 -6
  14. package/dist/esm/entry-server.mjs +3 -3
  15. package/dist/esm/i18n/I18nProvider.mjs +7 -15
  16. package/dist/esm/index.mjs +4 -4
  17. package/dist/esm/manifest.mjs +2 -2
  18. package/dist/esm/router-client.mjs +1 -1
  19. package/dist/esm/router-handler.mjs +11 -8
  20. package/dist/esm/router-server.mjs +0 -1
  21. package/dist/esm/router.mjs +2 -2
  22. package/dist/esm/routes.mjs +11 -17
  23. package/dist/esm/server.mjs +9 -1
  24. package/dist/esm-node/manifest.mjs +2 -2
  25. package/dist/esm-node/plugin/compiler.mjs +2 -5
  26. package/dist/esm-node/plugin/index.mjs +1 -1
  27. package/dist/esm-node/plugin/profile.mjs +11 -10
  28. package/dist/types/index.d.ts +4 -4
  29. package/dist/types/manifest.d.ts +2 -2
  30. package/dist/types/router-server.d.ts +0 -2
  31. package/dist/types/server.d.ts +3 -0
  32. package/package.json +23 -18
  33. package/src/entry-server.ts +3 -3
  34. package/src/i18n/I18nProvider.ts +11 -20
  35. package/src/index.ts +4 -4
  36. package/src/manifest.ts +2 -2
  37. package/src/plugin/compiler.ts +6 -14
  38. package/src/plugin/index.ts +3 -1
  39. package/src/plugin/profile.ts +12 -10
  40. package/src/router-client.ts +1 -1
  41. package/src/router-handler.ts +11 -8
  42. package/src/router-server.ts +0 -2
  43. package/src/router.ts +2 -2
  44. package/src/routes.ts +28 -26
  45. package/src/server.ts +16 -1
  46. package/dist/cjs/router-injection.js +0 -139
  47. package/dist/esm/router-injection.mjs +0 -101
  48. package/dist/types/router-injection.d.ts +0 -8
  49. package/src/router-injection.ts +0 -145
package/src/server.ts CHANGED
@@ -9,6 +9,8 @@ import {
9
9
  type ResponsePolicy,
10
10
  untilAborted,
11
11
  } from '@modern-js/renderer-core/session';
12
+ import type { AnyRouter } from '@octanejs/tanstack-router';
13
+ import { transformReadableStreamWithRouter } from '@octanejs/tanstack-router/ssr/server';
12
14
  import {
13
15
  createElement,
14
16
  earlySignalBootstrapScript,
@@ -56,6 +58,8 @@ export interface RenderOctaneApplicationOptions<
56
58
  readonly props?: unknown;
57
59
  /** Native router serialization, owned by this request's router SSR context. */
58
60
  readonly injection?: StreamOptions['injection'];
61
+ readonly router?: AnyRouter;
62
+ readonly routerSerializationTimeoutMs?: number;
59
63
  /** This server compilation's native Module Federation runtime. */
60
64
  readonly federation?: NativeFederationBinding;
61
65
  }
@@ -292,7 +296,18 @@ export async function renderOctaneApplication<Bindings extends object>(
292
296
  },
293
297
  { highWaterMark: 0 },
294
298
  );
295
- return session.respond(body);
299
+ return session.respond(
300
+ input.router
301
+ ? transformReadableStreamWithRouter(input.router, body, {
302
+ signal: session.signal,
303
+ rendererSafePoint: 'script-close',
304
+ timeoutMs: input.routerSerializationTimeoutMs,
305
+ onAbort: reason => {
306
+ void session.fail(reason);
307
+ },
308
+ })
309
+ : body,
310
+ );
296
311
  } catch (error) {
297
312
  await session.fail(error);
298
313
  throw error;
@@ -1,139 +0,0 @@
1
- "use strict";
2
- var __webpack_require__ = {};
3
- (()=>{
4
- __webpack_require__.d = (exports1, getters, values)=>{
5
- var define = (defs, kind)=>{
6
- for(var key in defs)if (__webpack_require__.o(defs, key) && !__webpack_require__.o(exports1, key)) Object.defineProperty(exports1, key, {
7
- enumerable: true,
8
- [kind]: defs[key]
9
- });
10
- };
11
- define(getters, "get");
12
- define(values, "value");
13
- };
14
- })();
15
- (()=>{
16
- __webpack_require__.o = (obj, prop)=>Object.prototype.hasOwnProperty.call(obj, prop);
17
- })();
18
- (()=>{
19
- __webpack_require__.r = (exports1)=>{
20
- if ("u" > typeof Symbol && Symbol.toStringTag) Object.defineProperty(exports1, Symbol.toStringTag, {
21
- value: 'Module'
22
- });
23
- Object.defineProperty(exports1, '__esModule', {
24
- value: true
25
- });
26
- };
27
- })();
28
- var __webpack_exports__ = {};
29
- __webpack_require__.r(__webpack_exports__);
30
- __webpack_require__.d(__webpack_exports__, {
31
- createOctaneRouterInjection: ()=>createOctaneRouterInjection
32
- });
33
- const external_router_server_cleanup_js_namespaceObject = require("./router-server-cleanup.js");
34
- const SERIALIZATION_TIMEOUT_MS = 60000;
35
- function createOctaneRouterInjection(router, session, options = {}) {
36
- const serverSsr = router.serverSsr;
37
- if (!serverSsr) throw new Error('Native Octane router.serverSsr is required for streaming');
38
- const timeoutMs = options.serializationTimeoutMs ?? SERIALIZATION_TIMEOUT_MS;
39
- if (!Number.isInteger(timeoutMs) || timeoutMs <= 0 || timeoutMs > SERIALIZATION_TIMEOUT_MS) throw new TypeError('Octane router serialization timeout must be 1 to 60000 ms');
40
- session.signal.throwIfAborted();
41
- let settled = false;
42
- let released = false;
43
- let renderFinished = false;
44
- let timer;
45
- let stopSerialization;
46
- const subscriptions = new Set();
47
- let resolveDone;
48
- let rejectDone;
49
- const done = new Promise((resolve, reject)=>{
50
- resolveDone = resolve;
51
- rejectDone = reject;
52
- });
53
- done.catch(()=>{});
54
- const settle = (error)=>{
55
- if (settled) return;
56
- settled = true;
57
- if (void 0 !== timer) clearTimeout(timer);
58
- timer = void 0;
59
- stopSerialization?.();
60
- stopSerialization = void 0;
61
- if (void 0 === error) resolveDone();
62
- else rejectDone(error);
63
- };
64
- const release = ()=>{
65
- if (released) return;
66
- released = true;
67
- if (void 0 !== timer) clearTimeout(timer);
68
- timer = void 0;
69
- stopSerialization?.();
70
- stopSerialization = void 0;
71
- for (const unsubscribe of subscriptions)unsubscribe();
72
- subscriptions.clear();
73
- session.signal.removeEventListener('abort', onAbort);
74
- if (!settled) settle(session.signal.reason ?? new Error('Octane router serialization was interrupted'));
75
- };
76
- function onAbort() {
77
- settle(session.signal.reason ?? new DOMException('Octane request aborted', 'AbortError'));
78
- release();
79
- }
80
- if (serverSsr.isSerializationFinished()) settle();
81
- else stopSerialization = serverSsr.onSerializationFinished(()=>settle());
82
- serverSsr.onCleanup(release);
83
- session.signal.addEventListener('abort', onAbort, {
84
- once: true
85
- });
86
- try {
87
- session.registerCleanup(()=>{
88
- release();
89
- (0, external_router_server_cleanup_js_namespaceObject.cleanupOctaneRouterSSR)(router);
90
- });
91
- } catch (error) {
92
- release();
93
- (0, external_router_server_cleanup_js_namespaceObject.cleanupOctaneRouterSSR)(router);
94
- throw error;
95
- }
96
- return {
97
- take () {
98
- if (released) return '';
99
- serverSsr.liftScriptBarrier();
100
- return serverSsr.takeBufferedHtml() ?? '';
101
- },
102
- subscribe (notify) {
103
- if (released) return ()=>{};
104
- const stop = serverSsr.onInjectedHtml(notify);
105
- let subscribed = true;
106
- const unsubscribe = ()=>{
107
- if (!subscribed) return;
108
- subscribed = false;
109
- subscriptions.delete(unsubscribe);
110
- stop();
111
- };
112
- subscriptions.add(unsubscribe);
113
- return unsubscribe;
114
- },
115
- done,
116
- cancel (reason) {
117
- settle(reason ?? new DOMException('Octane rendering cancelled', 'AbortError'));
118
- release();
119
- session.abort(reason);
120
- },
121
- renderComplete () {
122
- if (released || renderFinished) return;
123
- renderFinished = true;
124
- serverSsr.setRenderFinished();
125
- if (!serverSsr.isSerializationFinished() && !settled) timer = setTimeout(()=>{
126
- const error = new Error('Octane router serialization timed out after app rendering');
127
- settle(error);
128
- session.fail(error);
129
- }, timeoutMs);
130
- }
131
- };
132
- }
133
- exports.createOctaneRouterInjection = __webpack_exports__.createOctaneRouterInjection;
134
- for(var __rspack_i in __webpack_exports__)if (-1 === [
135
- "createOctaneRouterInjection"
136
- ].indexOf(__rspack_i)) exports[__rspack_i] = __webpack_exports__[__rspack_i];
137
- Object.defineProperty(exports, '__esModule', {
138
- value: true
139
- });
@@ -1,101 +0,0 @@
1
- import { cleanupOctaneRouterSSR } from "./router-server-cleanup.mjs";
2
- const SERIALIZATION_TIMEOUT_MS = 60000;
3
- function createOctaneRouterInjection(router, session, options = {}) {
4
- const serverSsr = router.serverSsr;
5
- if (!serverSsr) throw new Error('Native Octane router.serverSsr is required for streaming');
6
- const timeoutMs = options.serializationTimeoutMs ?? SERIALIZATION_TIMEOUT_MS;
7
- if (!Number.isInteger(timeoutMs) || timeoutMs <= 0 || timeoutMs > SERIALIZATION_TIMEOUT_MS) throw new TypeError('Octane router serialization timeout must be 1 to 60000 ms');
8
- session.signal.throwIfAborted();
9
- let settled = false;
10
- let released = false;
11
- let renderFinished = false;
12
- let timer;
13
- let stopSerialization;
14
- const subscriptions = new Set();
15
- let resolveDone;
16
- let rejectDone;
17
- const done = new Promise((resolve, reject)=>{
18
- resolveDone = resolve;
19
- rejectDone = reject;
20
- });
21
- done.catch(()=>{});
22
- const settle = (error)=>{
23
- if (settled) return;
24
- settled = true;
25
- if (void 0 !== timer) clearTimeout(timer);
26
- timer = void 0;
27
- stopSerialization?.();
28
- stopSerialization = void 0;
29
- if (void 0 === error) resolveDone();
30
- else rejectDone(error);
31
- };
32
- const release = ()=>{
33
- if (released) return;
34
- released = true;
35
- if (void 0 !== timer) clearTimeout(timer);
36
- timer = void 0;
37
- stopSerialization?.();
38
- stopSerialization = void 0;
39
- for (const unsubscribe of subscriptions)unsubscribe();
40
- subscriptions.clear();
41
- session.signal.removeEventListener('abort', onAbort);
42
- if (!settled) settle(session.signal.reason ?? new Error('Octane router serialization was interrupted'));
43
- };
44
- function onAbort() {
45
- settle(session.signal.reason ?? new DOMException('Octane request aborted', 'AbortError'));
46
- release();
47
- }
48
- if (serverSsr.isSerializationFinished()) settle();
49
- else stopSerialization = serverSsr.onSerializationFinished(()=>settle());
50
- serverSsr.onCleanup(release);
51
- session.signal.addEventListener('abort', onAbort, {
52
- once: true
53
- });
54
- try {
55
- session.registerCleanup(()=>{
56
- release();
57
- cleanupOctaneRouterSSR(router);
58
- });
59
- } catch (error) {
60
- release();
61
- cleanupOctaneRouterSSR(router);
62
- throw error;
63
- }
64
- return {
65
- take () {
66
- if (released) return '';
67
- serverSsr.liftScriptBarrier();
68
- return serverSsr.takeBufferedHtml() ?? '';
69
- },
70
- subscribe (notify) {
71
- if (released) return ()=>{};
72
- const stop = serverSsr.onInjectedHtml(notify);
73
- let subscribed = true;
74
- const unsubscribe = ()=>{
75
- if (!subscribed) return;
76
- subscribed = false;
77
- subscriptions.delete(unsubscribe);
78
- stop();
79
- };
80
- subscriptions.add(unsubscribe);
81
- return unsubscribe;
82
- },
83
- done,
84
- cancel (reason) {
85
- settle(reason ?? new DOMException('Octane rendering cancelled', 'AbortError'));
86
- release();
87
- session.abort(reason);
88
- },
89
- renderComplete () {
90
- if (released || renderFinished) return;
91
- renderFinished = true;
92
- serverSsr.setRenderFinished();
93
- if (!serverSsr.isSerializationFinished() && !settled) timer = setTimeout(()=>{
94
- const error = new Error('Octane router serialization timed out after app rendering');
95
- settle(error);
96
- session.fail(error);
97
- }, timeoutMs);
98
- }
99
- };
100
- }
101
- export { createOctaneRouterInjection };
@@ -1,8 +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
- export interface OctaneRouterInjectionOptions {
5
- serializationTimeoutMs?: number;
6
- }
7
- /** Couple native router serialization to the response's single stream owner. */
8
- export declare function createOctaneRouterInjection(router: AnyRouter, session: RequestSession, options?: OctaneRouterInjectionOptions): StreamInjectionSource;
@@ -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
- }