@bleedingdev/modern-js-renderer-core 0.0.0-bootstrap → 3.9.3-ultramodern.1

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 (147) hide show
  1. package/LICENSE +21 -0
  2. package/dist/cjs/abort.js +65 -0
  3. package/dist/cjs/adapter.js +62 -0
  4. package/dist/cjs/data/body.js +78 -0
  5. package/dist/cjs/data/client.js +409 -0
  6. package/dist/cjs/data/codec.js +168 -0
  7. package/dist/cjs/data/index.js +125 -0
  8. package/dist/cjs/data/private.js +77 -0
  9. package/dist/cjs/data/routes.js +149 -0
  10. package/dist/cjs/data/server.js +791 -0
  11. package/dist/cjs/data/static.js +110 -0
  12. package/dist/cjs/data/tree.js +231 -0
  13. package/dist/cjs/data/types.js +56 -0
  14. package/dist/cjs/document.js +184 -0
  15. package/dist/cjs/entry-client.js +142 -0
  16. package/dist/cjs/entry-server.js +253 -0
  17. package/dist/cjs/federation.js +80 -0
  18. package/dist/cjs/identity.js +120 -0
  19. package/dist/cjs/index.js +46 -0
  20. package/dist/cjs/localization.js +48 -0
  21. package/dist/cjs/router.js +293 -0
  22. package/dist/cjs/server/assets.js +56 -0
  23. package/dist/cjs/server/dispatch.js +351 -0
  24. package/dist/cjs/server/index.js +57 -0
  25. package/dist/cjs/server/types.js +18 -0
  26. package/dist/cjs/server/worker.js +73 -0
  27. package/dist/cjs/session/cache.js +172 -0
  28. package/dist/cjs/session/index.js +63 -0
  29. package/dist/cjs/session/request.js +269 -0
  30. package/dist/cjs/session/types.js +18 -0
  31. package/dist/esm/abort.mjs +27 -0
  32. package/dist/esm/adapter.mjs +21 -0
  33. package/dist/esm/data/body.mjs +40 -0
  34. package/dist/esm/data/client.mjs +368 -0
  35. package/dist/esm/data/codec.mjs +112 -0
  36. package/dist/esm/data/index.mjs +7 -0
  37. package/dist/esm/data/private.mjs +39 -0
  38. package/dist/esm/data/routes.mjs +108 -0
  39. package/dist/esm/data/server.mjs +723 -0
  40. package/dist/esm/data/static.mjs +51 -0
  41. package/dist/esm/data/tree.mjs +193 -0
  42. package/dist/esm/data/types.mjs +6 -0
  43. package/dist/esm/document.mjs +131 -0
  44. package/dist/esm/entry-client.mjs +104 -0
  45. package/dist/esm/entry-server.mjs +215 -0
  46. package/dist/esm/federation.mjs +36 -0
  47. package/dist/esm/identity.mjs +63 -0
  48. package/dist/esm/index.mjs +1 -0
  49. package/dist/esm/localization.mjs +10 -0
  50. package/dist/esm/router.mjs +225 -0
  51. package/dist/esm/server/assets.mjs +15 -0
  52. package/dist/esm/server/dispatch.mjs +307 -0
  53. package/dist/esm/server/index.mjs +3 -0
  54. package/dist/esm/server/types.mjs +0 -0
  55. package/dist/esm/server/worker.mjs +35 -0
  56. package/dist/esm/session/cache.mjs +116 -0
  57. package/dist/esm/session/index.mjs +3 -0
  58. package/dist/esm/session/request.mjs +231 -0
  59. package/dist/esm/session/types.mjs +0 -0
  60. package/dist/esm-node/abort.mjs +28 -0
  61. package/dist/esm-node/adapter.mjs +22 -0
  62. package/dist/esm-node/data/body.mjs +41 -0
  63. package/dist/esm-node/data/client.mjs +369 -0
  64. package/dist/esm-node/data/codec.mjs +113 -0
  65. package/dist/esm-node/data/index.mjs +8 -0
  66. package/dist/esm-node/data/private.mjs +40 -0
  67. package/dist/esm-node/data/routes.mjs +109 -0
  68. package/dist/esm-node/data/server.mjs +724 -0
  69. package/dist/esm-node/data/static.mjs +52 -0
  70. package/dist/esm-node/data/tree.mjs +194 -0
  71. package/dist/esm-node/data/types.mjs +7 -0
  72. package/dist/esm-node/document.mjs +132 -0
  73. package/dist/esm-node/entry-client.mjs +105 -0
  74. package/dist/esm-node/entry-server.mjs +216 -0
  75. package/dist/esm-node/federation.mjs +37 -0
  76. package/dist/esm-node/identity.mjs +64 -0
  77. package/dist/esm-node/index.mjs +2 -0
  78. package/dist/esm-node/localization.mjs +11 -0
  79. package/dist/esm-node/router.mjs +226 -0
  80. package/dist/esm-node/server/assets.mjs +16 -0
  81. package/dist/esm-node/server/dispatch.mjs +308 -0
  82. package/dist/esm-node/server/index.mjs +4 -0
  83. package/dist/esm-node/server/types.mjs +1 -0
  84. package/dist/esm-node/server/worker.mjs +36 -0
  85. package/dist/esm-node/session/cache.mjs +117 -0
  86. package/dist/esm-node/session/index.mjs +4 -0
  87. package/dist/esm-node/session/request.mjs +232 -0
  88. package/dist/esm-node/session/types.mjs +1 -0
  89. package/dist/types/abort.d.ts +6 -0
  90. package/dist/types/adapter.d.ts +195 -0
  91. package/dist/types/data/body.d.ts +2 -0
  92. package/dist/types/data/client.d.ts +17 -0
  93. package/dist/types/data/codec.d.ts +14 -0
  94. package/dist/types/data/index.d.ts +8 -0
  95. package/dist/types/data/private.d.ts +6 -0
  96. package/dist/types/data/routes.d.ts +28 -0
  97. package/dist/types/data/server.d.ts +59 -0
  98. package/dist/types/data/static.d.ts +31 -0
  99. package/dist/types/data/tree.d.ts +3 -0
  100. package/dist/types/data/types.d.ts +104 -0
  101. package/dist/types/document.d.ts +76 -0
  102. package/dist/types/entry-client.d.ts +53 -0
  103. package/dist/types/entry-server.d.ts +63 -0
  104. package/dist/types/federation.d.ts +56 -0
  105. package/dist/types/identity.d.ts +27 -0
  106. package/dist/types/index.d.ts +1 -0
  107. package/dist/types/localization.d.ts +58 -0
  108. package/dist/types/router.d.ts +201 -0
  109. package/dist/types/server/assets.d.ts +14 -0
  110. package/dist/types/server/dispatch.d.ts +11 -0
  111. package/dist/types/server/index.d.ts +4 -0
  112. package/dist/types/server/types.d.ts +64 -0
  113. package/dist/types/server/worker.d.ts +25 -0
  114. package/dist/types/session/cache.d.ts +25 -0
  115. package/dist/types/session/index.d.ts +4 -0
  116. package/dist/types/session/request.d.ts +8 -0
  117. package/dist/types/session/types.d.ts +48 -0
  118. package/package.json +159 -4
  119. package/src/abort.ts +40 -0
  120. package/src/adapter.ts +255 -0
  121. package/src/data/body.ts +43 -0
  122. package/src/data/client.ts +501 -0
  123. package/src/data/codec.ts +247 -0
  124. package/src/data/index.ts +8 -0
  125. package/src/data/private.ts +68 -0
  126. package/src/data/routes.ts +201 -0
  127. package/src/data/server.ts +977 -0
  128. package/src/data/static.ts +105 -0
  129. package/src/data/tree.ts +244 -0
  130. package/src/data/types.ts +98 -0
  131. package/src/document.ts +338 -0
  132. package/src/entry-client.ts +236 -0
  133. package/src/entry-server.ts +393 -0
  134. package/src/federation.ts +111 -0
  135. package/src/identity.ts +128 -0
  136. package/src/index.ts +7 -0
  137. package/src/localization.ts +77 -0
  138. package/src/router.ts +475 -0
  139. package/src/server/assets.ts +60 -0
  140. package/src/server/dispatch.ts +523 -0
  141. package/src/server/index.ts +16 -0
  142. package/src/server/types.ts +94 -0
  143. package/src/server/worker.ts +94 -0
  144. package/src/session/cache.ts +177 -0
  145. package/src/session/index.ts +11 -0
  146. package/src/session/request.ts +324 -0
  147. package/src/session/types.ts +60 -0
@@ -0,0 +1,63 @@
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
+ createRequestSession: ()=>external_request_js_namespaceObject.createRequestSession,
32
+ documentCacheKey: ()=>external_cache_js_namespaceObject.documentCacheKey,
33
+ headerMaxAgeSeconds: ()=>external_cache_js_namespaceObject.headerMaxAgeSeconds,
34
+ permitsDocumentCache: ()=>external_cache_js_namespaceObject.permitsDocumentCache,
35
+ policyHeaders: ()=>external_cache_js_namespaceObject.policyHeaders,
36
+ responseHeaders: ()=>external_cache_js_namespaceObject.responseHeaders,
37
+ restrictDocumentCache: ()=>external_cache_js_namespaceObject.restrictDocumentCache,
38
+ untilAborted: ()=>external_abort_js_namespaceObject.untilAborted
39
+ });
40
+ const external_abort_js_namespaceObject = require("../abort.js");
41
+ const external_cache_js_namespaceObject = require("./cache.js");
42
+ const external_request_js_namespaceObject = require("./request.js");
43
+ exports.createRequestSession = __webpack_exports__.createRequestSession;
44
+ exports.documentCacheKey = __webpack_exports__.documentCacheKey;
45
+ exports.headerMaxAgeSeconds = __webpack_exports__.headerMaxAgeSeconds;
46
+ exports.permitsDocumentCache = __webpack_exports__.permitsDocumentCache;
47
+ exports.policyHeaders = __webpack_exports__.policyHeaders;
48
+ exports.responseHeaders = __webpack_exports__.responseHeaders;
49
+ exports.restrictDocumentCache = __webpack_exports__.restrictDocumentCache;
50
+ exports.untilAborted = __webpack_exports__.untilAborted;
51
+ for(var __rspack_i in __webpack_exports__)if (-1 === [
52
+ "createRequestSession",
53
+ "documentCacheKey",
54
+ "headerMaxAgeSeconds",
55
+ "permitsDocumentCache",
56
+ "policyHeaders",
57
+ "responseHeaders",
58
+ "restrictDocumentCache",
59
+ "untilAborted"
60
+ ].indexOf(__rspack_i)) exports[__rspack_i] = __webpack_exports__[__rspack_i];
61
+ Object.defineProperty(exports, '__esModule', {
62
+ value: true
63
+ });
@@ -0,0 +1,269 @@
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
+ createRequestSession: ()=>createRequestSession
32
+ });
33
+ const external_identity_js_namespaceObject = require("../identity.js");
34
+ const external_cache_js_namespaceObject = require("./cache.js");
35
+ function freezeResponsePolicy(policy) {
36
+ if (!Number.isInteger(policy.status) || policy.status < 200 || policy.status > 599) throw new TypeError('A renderer response status must be an integer from 200 to 599.');
37
+ if ('document' !== policy.kind && 'terminal' !== policy.kind) throw new TypeError('A renderer response must identify its document or terminal outcome.');
38
+ const statusText = policy.statusText;
39
+ if (void 0 !== statusText && 'string' != typeof statusText) throw new TypeError('A renderer response status text must be a string.');
40
+ new Response(null, {
41
+ status: policy.status,
42
+ ...void 0 === statusText ? {} : {
43
+ statusText
44
+ }
45
+ });
46
+ if (![
47
+ 'no-store',
48
+ 'private',
49
+ 'public'
50
+ ].includes(policy.cache.mode)) throw new TypeError('A renderer response has an unknown cache policy.');
51
+ if ('public' === policy.cache.mode && (!Number.isInteger(policy.cache.maxAgeSeconds) || policy.cache.maxAgeSeconds < 0)) throw new TypeError('A public document cache lifetime must be a nonnegative integer.');
52
+ const headers = policy.headers.map(([name, value])=>{
53
+ new Headers([
54
+ [
55
+ name,
56
+ value
57
+ ]
58
+ ]);
59
+ return Object.freeze([
60
+ name,
61
+ value
62
+ ]);
63
+ });
64
+ return Object.freeze({
65
+ kind: policy.kind,
66
+ status: policy.status,
67
+ ...void 0 === statusText ? {} : {
68
+ statusText
69
+ },
70
+ headers: Object.freeze(headers),
71
+ cache: Object.freeze({
72
+ ...policy.cache
73
+ })
74
+ });
75
+ }
76
+ function createRequestSession(input) {
77
+ (0, external_identity_js_namespaceObject.identityCacheKey)(input.identity);
78
+ if ('node' !== input.platform.kind && 'worker' !== input.platform.kind) throw new TypeError('A renderer request requires an explicit Node or worker binding.');
79
+ const identity = Object.freeze({
80
+ ...input.identity
81
+ });
82
+ const platform = Object.freeze({
83
+ ...input.platform
84
+ });
85
+ const abortController = new AbortController();
86
+ const disposers = new Set();
87
+ let state = 'matching';
88
+ let policy;
89
+ let committedPolicy;
90
+ let fallback = false;
91
+ let responseCreated = false;
92
+ let hasDocumentBody = false;
93
+ let deliveredResponse;
94
+ let deliveredHeaders;
95
+ let reader;
96
+ let bodyController;
97
+ let cancelPromise;
98
+ let finishPromise;
99
+ let resolveCompletion;
100
+ const completion = new Promise((resolve)=>{
101
+ resolveCompletion = resolve;
102
+ });
103
+ const cancelSource = (reason)=>{
104
+ cancelPromise ??= reader ? reader.cancel(reason).finally(()=>reader?.releaseLock()) : Promise.resolve();
105
+ return cancelPromise;
106
+ };
107
+ const finish = (terminalState, error)=>{
108
+ if (finishPromise) return finishPromise;
109
+ state = terminalState;
110
+ input.request.signal.removeEventListener('abort', onRequestAbort);
111
+ const ownedDisposers = [
112
+ ...disposers
113
+ ].reverse();
114
+ disposers.clear();
115
+ finishPromise = Promise.resolve().then(async ()=>{
116
+ const cleanupErrors = [];
117
+ let recorded = false;
118
+ if ('completed' !== terminalState) cancelSource(error).catch((cancelError)=>{
119
+ if (!recorded) cleanupErrors.push(cancelError);
120
+ });
121
+ for (const dispose of ownedDisposers)try {
122
+ await dispose();
123
+ } catch (cleanupError) {
124
+ cleanupErrors.push(cleanupError);
125
+ }
126
+ await Promise.resolve();
127
+ recorded = true;
128
+ if ('completed' === terminalState && cleanupErrors.length > 0) state = 'failed';
129
+ const result = Object.freeze({
130
+ state: state,
131
+ fallback,
132
+ ...void 0 !== error ? {
133
+ error
134
+ } : {},
135
+ cleanupErrors: Object.freeze(cleanupErrors),
136
+ cacheEligible: 'completed' === state && hasDocumentBody && !fallback && void 0 !== committedPolicy && (0, external_cache_js_namespaceObject.permitsDocumentCache)({
137
+ ...committedPolicy,
138
+ headers: deliveredHeaders ? [
139
+ ...deliveredHeaders.entries()
140
+ ] : committedPolicy.headers
141
+ })
142
+ });
143
+ resolveCompletion(result);
144
+ return result;
145
+ });
146
+ if ('completed' !== terminalState) {
147
+ abortController.abort(error);
148
+ bodyController?.error(error);
149
+ }
150
+ return finishPromise;
151
+ };
152
+ const abort = (reason = new DOMException('The renderer request was aborted.', 'AbortError'))=>{
153
+ finish('aborted', reason);
154
+ };
155
+ function onRequestAbort() {
156
+ abort(input.request.signal.reason);
157
+ }
158
+ const session = {
159
+ request: input.request,
160
+ identity,
161
+ platform,
162
+ signal: abortController.signal,
163
+ get state () {
164
+ return state;
165
+ },
166
+ get responsePolicy () {
167
+ return policy;
168
+ },
169
+ get committedPolicy () {
170
+ return committedPolicy;
171
+ },
172
+ completion,
173
+ resolveResponse (nextPolicy) {
174
+ if (committedPolicy || finishPromise) throw new Error('Renderer response status and headers are already committed or terminated.');
175
+ policy = freezeResponsePolicy(nextPolicy);
176
+ if ('matching' === state) state = 'ready';
177
+ },
178
+ startRendering () {
179
+ if ('ready' !== state) throw new Error('Resolve the blocking HTTP outcome before starting the renderer.');
180
+ state = 'rendering';
181
+ },
182
+ registerCleanup (dispose) {
183
+ if (finishPromise) throw new Error('Cannot register cleanup after a renderer request terminates.');
184
+ disposers.add(dispose);
185
+ return ()=>{
186
+ disposers.delete(dispose);
187
+ };
188
+ },
189
+ markFallback () {
190
+ if (finishPromise) throw new Error('Cannot change fallback disposition after a renderer request terminates.');
191
+ fallback = true;
192
+ },
193
+ respond (body) {
194
+ if (responseCreated || committedPolicy || finishPromise) throw new Error('A renderer request has exactly one response body consumer.');
195
+ if (!policy || 'ready' !== state && 'rendering' !== state) throw new Error('Resolve the blocking HTTP outcome before committing a response.');
196
+ if (null !== body && [
197
+ 204,
198
+ 205,
199
+ 304
200
+ ].includes(policy.status)) throw new TypeError(`HTTP ${policy.status} cannot contain a renderer response body.`);
201
+ reader = body?.getReader();
202
+ hasDocumentBody = null !== body;
203
+ responseCreated = true;
204
+ committedPolicy = policy;
205
+ state = 'committed';
206
+ const headers = (0, external_cache_js_namespaceObject.policyHeaders)(committedPolicy.headers);
207
+ let wrappedBody = null;
208
+ if (reader) {
209
+ const sourceReader = reader;
210
+ wrappedBody = new ReadableStream({
211
+ start (controller) {
212
+ bodyController = controller;
213
+ },
214
+ async pull (controller) {
215
+ try {
216
+ const next = await sourceReader.read();
217
+ if (finishPromise) return;
218
+ if (!next.done) return void controller.enqueue(next.value);
219
+ sourceReader.releaseLock();
220
+ const result = await finish('completed');
221
+ if (result.cleanupErrors.length > 0) controller.error(new AggregateError(result.cleanupErrors, 'Renderer request cleanup failed.'));
222
+ else controller.close();
223
+ } catch (error) {
224
+ if (!finishPromise) {
225
+ await finish('failed', error);
226
+ controller.error(error);
227
+ }
228
+ }
229
+ },
230
+ cancel (reason) {
231
+ abort(reason);
232
+ return completion.then(()=>{});
233
+ }
234
+ }, {
235
+ highWaterMark: 0
236
+ });
237
+ } else finish('completed');
238
+ const response = new Response(wrappedBody, {
239
+ status: committedPolicy.status,
240
+ ...void 0 === committedPolicy.statusText ? {} : {
241
+ statusText: committedPolicy.statusText
242
+ },
243
+ headers
244
+ });
245
+ deliveredResponse = response;
246
+ deliveredHeaders = response.headers;
247
+ return response;
248
+ },
249
+ ownsResponseBody (response) {
250
+ return void 0 !== deliveredResponse && (response === deliveredResponse || null !== deliveredResponse.body && response.body === deliveredResponse.body);
251
+ },
252
+ fail (error) {
253
+ finish('failed', error);
254
+ },
255
+ abort
256
+ };
257
+ if (input.request.signal.aborted) onRequestAbort();
258
+ else input.request.signal.addEventListener('abort', onRequestAbort, {
259
+ once: true
260
+ });
261
+ return session;
262
+ }
263
+ exports.createRequestSession = __webpack_exports__.createRequestSession;
264
+ for(var __rspack_i in __webpack_exports__)if (-1 === [
265
+ "createRequestSession"
266
+ ].indexOf(__rspack_i)) exports[__rspack_i] = __webpack_exports__[__rspack_i];
267
+ Object.defineProperty(exports, '__esModule', {
268
+ value: true
269
+ });
@@ -0,0 +1,18 @@
1
+ "use strict";
2
+ var __webpack_require__ = {};
3
+ (()=>{
4
+ __webpack_require__.r = (exports1)=>{
5
+ if ("u" > typeof Symbol && Symbol.toStringTag) Object.defineProperty(exports1, Symbol.toStringTag, {
6
+ value: 'Module'
7
+ });
8
+ Object.defineProperty(exports1, '__esModule', {
9
+ value: true
10
+ });
11
+ };
12
+ })();
13
+ var __webpack_exports__ = {};
14
+ __webpack_require__.r(__webpack_exports__);
15
+ for(var __rspack_i in __webpack_exports__)exports[__rspack_i] = __webpack_exports__[__rspack_i];
16
+ Object.defineProperty(exports, '__esModule', {
17
+ value: true
18
+ });
@@ -0,0 +1,27 @@
1
+ function untilAborted(handled, signal) {
2
+ const settled = Promise.resolve(handled);
3
+ const discard = ()=>void settled.then((value)=>{
4
+ if (value instanceof Response) value.body?.cancel().catch(()=>{});
5
+ }, ()=>{});
6
+ if (signal.aborted) {
7
+ discard();
8
+ return Promise.reject(signal.reason);
9
+ }
10
+ return new Promise((resolve, reject)=>{
11
+ const onAbort = ()=>{
12
+ discard();
13
+ reject(signal.reason);
14
+ };
15
+ signal.addEventListener('abort', onAbort, {
16
+ once: true
17
+ });
18
+ settled.then((value)=>{
19
+ signal.removeEventListener('abort', onAbort);
20
+ resolve(value);
21
+ }, (error)=>{
22
+ signal.removeEventListener('abort', onAbort);
23
+ reject(error);
24
+ });
25
+ });
26
+ }
27
+ export { untilAborted };
@@ -0,0 +1,21 @@
1
+ const adapterError = (name, detail)=>new Error(`Invalid renderer adapter ${String(name)}: ${detail}`);
2
+ function defineRendererAdapter(adapter) {
3
+ const { name, profile } = adapter;
4
+ if (profile.renderer !== name) throw adapterError(name, `profile names ${profile.renderer}`);
5
+ if (!adapter.routerFrameworks.length) throw adapterError(name, 'it declares no router framework');
6
+ if (adapter.worker.rsc !== profile.capabilities.rsc) throw adapterError(name, 'worker RSC support contradicts its profile');
7
+ if ('native' === adapter.kind) {
8
+ if (true !== adapter.worker.nativeDocuments) throw adapterError(name, 'native documents come from its server handler');
9
+ const federation = adapter.federation;
10
+ const capability = profile.capabilities.moduleFederation;
11
+ if (void 0 === federation !== (false === capability) || void 0 !== federation && federation.ssr !== (true === capability)) throw adapterError(name, 'federation support contradicts its profile');
12
+ }
13
+ return Object.freeze(adapter);
14
+ }
15
+ function nativeRendererDependencies(profile) {
16
+ return {
17
+ ...Object.fromEntries(Object.entries(profile.dependencies).filter(([name])=>!name.startsWith('@modern-js/'))),
18
+ [profile.router.coreName]: profile.router.coreVersion
19
+ };
20
+ }
21
+ export { defineRendererAdapter, nativeRendererDependencies };
@@ -0,0 +1,40 @@
1
+ import { DataProtocolError, MAX_DATA_BYTES } from "./codec.mjs";
2
+ async function readBoundedDataText(response, signal, maxBytes = MAX_DATA_BYTES) {
3
+ if (signal?.aborted) {
4
+ response.body?.cancel(signal.reason).catch(()=>void 0);
5
+ signal.throwIfAborted();
6
+ }
7
+ if (!response.body) return '';
8
+ const reader = response.body.getReader();
9
+ const decoder = new TextDecoder('utf-8', {
10
+ fatal: true
11
+ });
12
+ let bytes = 0;
13
+ let text = '';
14
+ const abort = ()=>{
15
+ reader.cancel(signal?.reason).catch(()=>void 0);
16
+ };
17
+ signal?.addEventListener('abort', abort, {
18
+ once: true
19
+ });
20
+ try {
21
+ while(true){
22
+ const result = await reader.read();
23
+ signal?.throwIfAborted();
24
+ if (result.done) break;
25
+ bytes += result.value.byteLength;
26
+ if (bytes > maxBytes) throw new DataProtocolError('Public data exceeds its byte limit');
27
+ text += decoder.decode(result.value, {
28
+ stream: true
29
+ });
30
+ }
31
+ return text + decoder.decode();
32
+ } catch (error) {
33
+ reader.cancel(error).catch(()=>void 0);
34
+ throw error;
35
+ } finally{
36
+ signal?.removeEventListener('abort', abort);
37
+ reader.releaseLock();
38
+ }
39
+ }
40
+ export { readBoundedDataText };