@bleedingdev/modern-js-renderer-core 0.0.0-stage → 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 (148) 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 +164 -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
  148. package/README.md +0 -3
package/LICENSE ADDED
@@ -0,0 +1,21 @@
1
+ MIT License
2
+
3
+ Copyright (c) 2021-present Modern.js
4
+
5
+ Permission is hereby granted, free of charge, to any person obtaining a copy
6
+ of this software and associated documentation files (the "Software"), to deal
7
+ in the Software without restriction, including without limitation the rights
8
+ to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
9
+ copies of the Software, and to permit persons to whom the Software is
10
+ furnished to do so, subject to the following conditions:
11
+
12
+ The above copyright notice and this permission notice shall be included in all
13
+ copies or substantial portions of the Software.
14
+
15
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
16
+ IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
17
+ FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
18
+ AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
19
+ LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
20
+ OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
21
+ SOFTWARE.
@@ -0,0 +1,65 @@
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
+ function untilAborted(handled, signal) {
31
+ const settled = Promise.resolve(handled);
32
+ const discard = ()=>void settled.then((value)=>{
33
+ if (value instanceof Response) value.body?.cancel().catch(()=>{});
34
+ }, ()=>{});
35
+ if (signal.aborted) {
36
+ discard();
37
+ return Promise.reject(signal.reason);
38
+ }
39
+ return new Promise((resolve, reject)=>{
40
+ const onAbort = ()=>{
41
+ discard();
42
+ reject(signal.reason);
43
+ };
44
+ signal.addEventListener('abort', onAbort, {
45
+ once: true
46
+ });
47
+ settled.then((value)=>{
48
+ signal.removeEventListener('abort', onAbort);
49
+ resolve(value);
50
+ }, (error)=>{
51
+ signal.removeEventListener('abort', onAbort);
52
+ reject(error);
53
+ });
54
+ });
55
+ }
56
+ __webpack_require__.d(__webpack_exports__, {
57
+ untilAborted: ()=>untilAborted
58
+ });
59
+ exports.untilAborted = __webpack_exports__.untilAborted;
60
+ for(var __rspack_i in __webpack_exports__)if (-1 === [
61
+ "untilAborted"
62
+ ].indexOf(__rspack_i)) exports[__rspack_i] = __webpack_exports__[__rspack_i];
63
+ Object.defineProperty(exports, '__esModule', {
64
+ value: true
65
+ });
@@ -0,0 +1,62 @@
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
+ const adapterError = (name, detail)=>new Error(`Invalid renderer adapter ${String(name)}: ${detail}`);
31
+ function defineRendererAdapter(adapter) {
32
+ const { name, profile } = adapter;
33
+ if (profile.renderer !== name) throw adapterError(name, `profile names ${profile.renderer}`);
34
+ if (!adapter.routerFrameworks.length) throw adapterError(name, 'it declares no router framework');
35
+ if (adapter.worker.rsc !== profile.capabilities.rsc) throw adapterError(name, 'worker RSC support contradicts its profile');
36
+ if ('native' === adapter.kind) {
37
+ if (true !== adapter.worker.nativeDocuments) throw adapterError(name, 'native documents come from its server handler');
38
+ const federation = adapter.federation;
39
+ const capability = profile.capabilities.moduleFederation;
40
+ if (void 0 === federation !== (false === capability) || void 0 !== federation && federation.ssr !== (true === capability)) throw adapterError(name, 'federation support contradicts its profile');
41
+ }
42
+ return Object.freeze(adapter);
43
+ }
44
+ function nativeRendererDependencies(profile) {
45
+ return {
46
+ ...Object.fromEntries(Object.entries(profile.dependencies).filter(([name])=>!name.startsWith('@modern-js/'))),
47
+ [profile.router.coreName]: profile.router.coreVersion
48
+ };
49
+ }
50
+ __webpack_require__.d(__webpack_exports__, {
51
+ defineRendererAdapter: ()=>defineRendererAdapter,
52
+ nativeRendererDependencies: ()=>nativeRendererDependencies
53
+ });
54
+ exports.defineRendererAdapter = __webpack_exports__.defineRendererAdapter;
55
+ exports.nativeRendererDependencies = __webpack_exports__.nativeRendererDependencies;
56
+ for(var __rspack_i in __webpack_exports__)if (-1 === [
57
+ "defineRendererAdapter",
58
+ "nativeRendererDependencies"
59
+ ].indexOf(__rspack_i)) exports[__rspack_i] = __webpack_exports__[__rspack_i];
60
+ Object.defineProperty(exports, '__esModule', {
61
+ value: true
62
+ });
@@ -0,0 +1,78 @@
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
+ readBoundedDataText: ()=>readBoundedDataText
32
+ });
33
+ const external_codec_js_namespaceObject = require("./codec.js");
34
+ async function readBoundedDataText(response, signal, maxBytes = external_codec_js_namespaceObject.MAX_DATA_BYTES) {
35
+ if (signal?.aborted) {
36
+ response.body?.cancel(signal.reason).catch(()=>void 0);
37
+ signal.throwIfAborted();
38
+ }
39
+ if (!response.body) return '';
40
+ const reader = response.body.getReader();
41
+ const decoder = new TextDecoder('utf-8', {
42
+ fatal: true
43
+ });
44
+ let bytes = 0;
45
+ let text = '';
46
+ const abort = ()=>{
47
+ reader.cancel(signal?.reason).catch(()=>void 0);
48
+ };
49
+ signal?.addEventListener('abort', abort, {
50
+ once: true
51
+ });
52
+ try {
53
+ while(true){
54
+ const result = await reader.read();
55
+ signal?.throwIfAborted();
56
+ if (result.done) break;
57
+ bytes += result.value.byteLength;
58
+ if (bytes > maxBytes) throw new external_codec_js_namespaceObject.DataProtocolError('Public data exceeds its byte limit');
59
+ text += decoder.decode(result.value, {
60
+ stream: true
61
+ });
62
+ }
63
+ return text + decoder.decode();
64
+ } catch (error) {
65
+ reader.cancel(error).catch(()=>void 0);
66
+ throw error;
67
+ } finally{
68
+ signal?.removeEventListener('abort', abort);
69
+ reader.releaseLock();
70
+ }
71
+ }
72
+ exports.readBoundedDataText = __webpack_exports__.readBoundedDataText;
73
+ for(var __rspack_i in __webpack_exports__)if (-1 === [
74
+ "readBoundedDataText"
75
+ ].indexOf(__rspack_i)) exports[__rspack_i] = __webpack_exports__[__rspack_i];
76
+ Object.defineProperty(exports, '__esModule', {
77
+ value: true
78
+ });
@@ -0,0 +1,409 @@
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
+ createDataClient: ()=>createDataClient,
32
+ readDataResponse: ()=>readDataResponse
33
+ });
34
+ const external_abort_js_namespaceObject = require("../abort.js");
35
+ const external_identity_js_namespaceObject = require("../identity.js");
36
+ const external_body_js_namespaceObject = require("./body.js");
37
+ const external_codec_js_namespaceObject = require("./codec.js");
38
+ const external_static_js_namespaceObject = require("./static.js");
39
+ const external_types_js_namespaceObject = require("./types.js");
40
+ const isRecord = (value)=>null !== value && 'object' == typeof value && !Array.isArray(value);
41
+ function assertKeys(record, keys, required = []) {
42
+ if (Object.keys(record).some((key)=>!keys.includes(key))) throw new external_codec_js_namespaceObject.DataProtocolError('Unknown data protocol field');
43
+ if (required.some((key)=>!Object.hasOwn(record, key))) throw new external_codec_js_namespaceObject.DataProtocolError('Missing data protocol field');
44
+ }
45
+ function assertError(value) {
46
+ if (!isRecord(value)) throw new external_codec_js_namespaceObject.DataProtocolError('Malformed public error');
47
+ assertKeys(value, [
48
+ 'name',
49
+ 'message',
50
+ 'stack'
51
+ ]);
52
+ if ('string' != typeof value['name'] || 'string' != typeof value['message'] || Object.hasOwn(value, 'stack') && 'string' != typeof value['stack']) throw new external_codec_js_namespaceObject.DataProtocolError('Malformed public error');
53
+ }
54
+ function assertEnvelope(value, expected) {
55
+ if (!isRecord(value) || value['version'] !== external_types_js_namespaceObject.DATA_PROTOCOL_VERSION || value['routeId'] !== expected.routeId || value['operation'] !== expected.operation || !isRecord(value['identity']) || !isRecord(value['outcome'])) throw new external_codec_js_namespaceObject.DataProtocolError('Data protocol or route identity mismatch');
56
+ assertKeys(value, [
57
+ 'version',
58
+ 'identity',
59
+ 'routeId',
60
+ 'operation',
61
+ 'outcome',
62
+ 'deferredKeys'
63
+ ]);
64
+ assertKeys(value['identity'], [
65
+ 'renderer',
66
+ 'appId',
67
+ 'entryName',
68
+ 'protocolVersion',
69
+ 'buildId'
70
+ ]);
71
+ try {
72
+ (0, external_identity_js_namespaceObject.assertRendererIdentity)(value['identity'], expected.identity);
73
+ } catch {
74
+ throw new external_codec_js_namespaceObject.DataProtocolError('Data renderer or build identity mismatch');
75
+ }
76
+ const outcome = value['outcome'];
77
+ if (!Number.isInteger(outcome['status']) || outcome['status'] < 200 || outcome['status'] > 599) throw new external_codec_js_namespaceObject.DataProtocolError('Malformed data response status');
78
+ switch(outcome['kind']){
79
+ case 'success':
80
+ assertKeys(outcome, [
81
+ 'kind',
82
+ 'value',
83
+ 'status'
84
+ ], [
85
+ 'value'
86
+ ]);
87
+ break;
88
+ case 'redirect':
89
+ assertKeys(outcome, [
90
+ 'kind',
91
+ 'location',
92
+ 'status'
93
+ ]);
94
+ if ('string' != typeof outcome['location'] || ![
95
+ 301,
96
+ 302,
97
+ 303,
98
+ 307,
99
+ 308
100
+ ].includes(outcome['status'])) throw new external_codec_js_namespaceObject.DataProtocolError('Malformed data redirect');
101
+ break;
102
+ case 'not-found':
103
+ assertKeys(outcome, [
104
+ 'kind',
105
+ 'value',
106
+ 'thrown',
107
+ 'status'
108
+ ], [
109
+ 'value'
110
+ ]);
111
+ if (404 !== outcome['status'] || 'boolean' != typeof outcome['thrown']) throw new external_codec_js_namespaceObject.DataProtocolError('Malformed not-found outcome');
112
+ break;
113
+ case 'error':
114
+ assertKeys(outcome, [
115
+ 'kind',
116
+ 'error',
117
+ 'data',
118
+ 'thrown',
119
+ 'status'
120
+ ]);
121
+ assertError(outcome['error']);
122
+ if ('boolean' != typeof outcome['thrown']) throw new external_codec_js_namespaceObject.DataProtocolError('Malformed error outcome');
123
+ break;
124
+ default:
125
+ throw new external_codec_js_namespaceObject.DataProtocolError('Unknown data outcome');
126
+ }
127
+ if (Object.hasOwn(value, 'deferredKeys')) {
128
+ if (!Array.isArray(value['deferredKeys']) || value['deferredKeys'].some((key)=>'string' != typeof key) || new Set(value['deferredKeys']).size !== value['deferredKeys'].length || 'success' !== outcome['kind'] || !isRecord(outcome['value']) || value['deferredKeys'].some((key)=>Object.hasOwn(outcome['value'], key))) throw new external_codec_js_namespaceObject.DataProtocolError('Malformed deferred data keys');
129
+ }
130
+ }
131
+ function dataError(error) {
132
+ const result = new Error(error.message);
133
+ result.name = error.name;
134
+ if (void 0 !== error.stack) result.stack = error.stack;
135
+ else delete result.stack;
136
+ return result;
137
+ }
138
+ async function readDeferredResponse(response, expected, signal) {
139
+ if (!response.body) throw new external_codec_js_namespaceObject.DataProtocolError('Missing deferred data body');
140
+ const reader = response.body.getReader();
141
+ const decoder = new TextDecoder('utf-8', {
142
+ fatal: true
143
+ });
144
+ let buffer = '';
145
+ let initialized = false;
146
+ let completed = false;
147
+ let initialResolve;
148
+ let initialReject;
149
+ const initial = new Promise((resolve, reject)=>{
150
+ initialResolve = resolve;
151
+ initialReject = reject;
152
+ });
153
+ let completionResolve;
154
+ let completionReject;
155
+ const completion = new Promise((resolve, reject)=>{
156
+ completionResolve = resolve;
157
+ completionReject = reject;
158
+ });
159
+ completion.catch(()=>void 0);
160
+ const pending = new Map();
161
+ const reject = (error)=>{
162
+ completionReject(error);
163
+ if (!initialized) initialReject(error);
164
+ for (const promise of pending.values())promise.reject(error);
165
+ pending.clear();
166
+ };
167
+ const abort = ()=>{
168
+ const reason = signal?.reason ?? new DOMException('The data request was aborted', 'AbortError');
169
+ reject(reason);
170
+ reader.cancel(reason).catch(()=>void 0);
171
+ };
172
+ if (signal?.aborted) abort();
173
+ else signal?.addEventListener('abort', abort, {
174
+ once: true
175
+ });
176
+ const consume = (text)=>{
177
+ if (completed) throw new external_codec_js_namespaceObject.DataProtocolError('Data frames follow stream completion');
178
+ const frame = (0, external_codec_js_namespaceObject.parsePublicData)(text);
179
+ if (!isRecord(frame)) throw new external_codec_js_namespaceObject.DataProtocolError('Malformed data stream frame');
180
+ if ('initial' === frame['type']) {
181
+ assertKeys(frame, [
182
+ 'type',
183
+ 'envelope'
184
+ ]);
185
+ if (initialized) throw new external_codec_js_namespaceObject.DataProtocolError('Duplicate initial data frame');
186
+ assertEnvelope(frame['envelope'], expected);
187
+ const envelope = frame['envelope'];
188
+ if (!Array.isArray(envelope.deferredKeys) || 'success' !== envelope.outcome.kind) throw new external_codec_js_namespaceObject.DataProtocolError('Initial stream frame needs deferred keys');
189
+ const value = envelope.outcome.value;
190
+ for (const key of envelope.deferredKeys){
191
+ const promise = new Promise((resolve, rejectPromise)=>{
192
+ pending.set(key, {
193
+ resolve,
194
+ reject: rejectPromise
195
+ });
196
+ });
197
+ promise.catch(()=>void 0);
198
+ Object.defineProperty(value, key, {
199
+ value: promise,
200
+ writable: true,
201
+ enumerable: true,
202
+ configurable: true
203
+ });
204
+ }
205
+ initialized = true;
206
+ const outcome = {
207
+ ...envelope.outcome,
208
+ value
209
+ };
210
+ Object.defineProperty(outcome, 'completion', {
211
+ value: completion
212
+ });
213
+ initialResolve(outcome);
214
+ return;
215
+ }
216
+ if (!initialized) throw new external_codec_js_namespaceObject.DataProtocolError('Deferred data arrived before the initial frame');
217
+ if ('complete' === frame['type']) {
218
+ assertKeys(frame, [
219
+ 'type'
220
+ ]);
221
+ if (0 !== pending.size) throw new external_codec_js_namespaceObject.DataProtocolError('Deferred stream completed with unresolved values');
222
+ completed = true;
223
+ return;
224
+ }
225
+ if ('resolve' !== frame['type'] && 'reject' !== frame['type']) throw new external_codec_js_namespaceObject.DataProtocolError('Unknown data stream frame');
226
+ 'resolve' === frame['type'] ? assertKeys(frame, [
227
+ 'type',
228
+ 'key',
229
+ 'value'
230
+ ], [
231
+ 'value'
232
+ ]) : assertKeys(frame, [
233
+ 'type',
234
+ 'key',
235
+ 'error'
236
+ ]);
237
+ if ('string' != typeof frame['key'] || !pending.has(frame['key'])) throw new external_codec_js_namespaceObject.DataProtocolError('Unknown or duplicate deferred data key');
238
+ const promise = pending.get(frame['key']);
239
+ if ('resolve' === frame['type']) promise.resolve(frame['value']);
240
+ else {
241
+ assertError(frame['error']);
242
+ promise.reject(dataError(frame['error']));
243
+ }
244
+ pending.delete(frame['key']);
245
+ };
246
+ const append = (text)=>{
247
+ buffer += text;
248
+ let lineEnd = buffer.indexOf('\n');
249
+ while(-1 !== lineEnd){
250
+ const line = buffer.slice(0, lineEnd);
251
+ buffer = buffer.slice(lineEnd + 1);
252
+ if (!line) throw new external_codec_js_namespaceObject.DataProtocolError('Empty data stream frame');
253
+ consume(line);
254
+ lineEnd = buffer.indexOf('\n');
255
+ }
256
+ if (new TextEncoder().encode(buffer).byteLength > external_codec_js_namespaceObject.MAX_DATA_BYTES) throw new external_codec_js_namespaceObject.DataProtocolError('Deferred data frame exceeds its size limit');
257
+ };
258
+ (async ()=>{
259
+ try {
260
+ while(true){
261
+ const chunk = await reader.read();
262
+ if (chunk.done) {
263
+ append(decoder.decode());
264
+ break;
265
+ }
266
+ for(let offset = 0; offset < chunk.value.byteLength; offset += 65536)append(decoder.decode(chunk.value.subarray(offset, offset + 65536), {
267
+ stream: true
268
+ }));
269
+ }
270
+ if ('' !== buffer || !completed) throw new external_codec_js_namespaceObject.DataProtocolError('Truncated deferred data stream');
271
+ completionResolve();
272
+ } catch (error) {
273
+ reject(error);
274
+ reader.cancel(error).catch(()=>void 0);
275
+ } finally{
276
+ signal?.removeEventListener('abort', abort);
277
+ reader.releaseLock();
278
+ }
279
+ })();
280
+ return initial;
281
+ }
282
+ async function readDataResponse(response, expected, signal) {
283
+ const discard = (reason)=>{
284
+ response.body?.cancel(reason).catch(()=>void 0);
285
+ };
286
+ if (signal?.aborted) {
287
+ discard(signal.reason);
288
+ signal.throwIfAborted();
289
+ }
290
+ const contentType = response.headers.get('content-type')?.split(';')[0]?.trim();
291
+ if (contentType === external_types_js_namespaceObject.DATA_STREAM_CONTENT_TYPE) return readDeferredResponse(response, expected, signal);
292
+ if (contentType !== external_types_js_namespaceObject.DATA_CONTENT_TYPE) {
293
+ const error = new external_codec_js_namespaceObject.DataProtocolError(`Expected an UltraModern data response, received HTTP ${response.status}`);
294
+ discard(error);
295
+ throw error;
296
+ }
297
+ const value = (0, external_codec_js_namespaceObject.parsePublicData)(await (0, external_body_js_namespaceObject.readBoundedDataText)(response, signal));
298
+ signal?.throwIfAborted();
299
+ assertEnvelope(value, expected);
300
+ if (Object.hasOwn(value, 'deferredKeys')) throw new external_codec_js_namespaceObject.DataProtocolError('Deferred values require the stream protocol');
301
+ return value.outcome;
302
+ }
303
+ async function readStaticPayload(url, routeId, fetchData, request) {
304
+ if (url.search || !(0, external_static_js_namespaceObject.isPrerenderedDocument)()) return;
305
+ let response;
306
+ try {
307
+ response = await (0, external_abort_js_namespaceObject.untilAborted)(fetchData(new URL((0, external_static_js_namespaceObject.staticDataPayloadPath)(url.pathname, routeId), url), {
308
+ credentials: 'same-origin',
309
+ signal: request.signal
310
+ }), request.signal);
311
+ } catch {
312
+ request.signal.throwIfAborted();
313
+ return;
314
+ }
315
+ if (!response.ok) return void response.body?.cancel().catch(()=>void 0);
316
+ let payload;
317
+ try {
318
+ payload = JSON.parse(await (0, external_body_js_namespaceObject.readBoundedDataText)(response, request.signal, external_static_js_namespaceObject.STATIC_DATA_PAYLOAD_MAX_BYTES));
319
+ } catch {
320
+ request.signal.throwIfAborted();
321
+ return;
322
+ }
323
+ if (!(0, external_static_js_namespaceObject.isStaticDataPayload)(payload)) return;
324
+ return new Response(payload.body, {
325
+ status: payload.status,
326
+ headers: {
327
+ 'content-type': payload.contentType
328
+ }
329
+ });
330
+ }
331
+ async function bufferRequestBody(request) {
332
+ if (!request.body) return null;
333
+ const { signal } = request;
334
+ if (/^multipart\/form-data\b/iu.test(request.headers.get('content-type') ?? '')) return (0, external_abort_js_namespaceObject.untilAborted)(request.blob(), signal);
335
+ const reader = request.body.getReader();
336
+ const cancel = ()=>{
337
+ reader.cancel(signal.reason).catch(()=>{});
338
+ };
339
+ signal.addEventListener('abort', cancel, {
340
+ once: true
341
+ });
342
+ try {
343
+ const chunks = [];
344
+ for(;;){
345
+ const part = await reader.read();
346
+ signal.throwIfAborted();
347
+ if (part.done) break;
348
+ chunks.push(part.value);
349
+ }
350
+ return new Blob(chunks, {
351
+ type: request.headers.get('content-type') ?? ''
352
+ });
353
+ } finally{
354
+ signal.removeEventListener('abort', cancel);
355
+ }
356
+ }
357
+ function createDataClient(routeId, identity, options = {}) {
358
+ if (!routeId) throw new external_codec_js_namespaceObject.DataProtocolError('A data client requires a route ID');
359
+ const fetchData = options.fetch ?? globalThis.fetch;
360
+ const execute = async (operation, input)=>{
361
+ const request = input.request;
362
+ request.signal.throwIfAborted();
363
+ if ('loader' === operation && 'GET' !== request.method) throw new external_codec_js_namespaceObject.DataProtocolError('A loader client needs a GET Request');
364
+ if ('action' === operation && [
365
+ 'GET',
366
+ 'HEAD'
367
+ ].includes(request.method)) throw new external_codec_js_namespaceObject.DataProtocolError('An action client needs a mutation Request');
368
+ const url = new URL(request.url);
369
+ if ('loader' === operation) {
370
+ const replayed = await readStaticPayload(url, routeId, fetchData, request);
371
+ if (replayed) return readDataResponse(replayed, {
372
+ identity,
373
+ routeId,
374
+ operation
375
+ }, request.signal);
376
+ }
377
+ url.searchParams.set(external_types_js_namespaceObject.LOADER_ID_PARAM, routeId);
378
+ url.searchParams.set(external_types_js_namespaceObject.DIRECT_PARAM, 'true');
379
+ const proxyRequest = new Request(url, {
380
+ method: request.method,
381
+ headers: request.headers,
382
+ body: 'action' === operation ? await bufferRequestBody(request) : null,
383
+ signal: request.signal
384
+ });
385
+ const response = await (0, external_abort_js_namespaceObject.untilAborted)(fetchData(proxyRequest, {
386
+ credentials: 'same-origin',
387
+ redirect: 'manual',
388
+ signal: request.signal
389
+ }), request.signal);
390
+ return readDataResponse(response, {
391
+ identity,
392
+ routeId,
393
+ operation
394
+ }, request.signal);
395
+ };
396
+ return {
397
+ loader: (input)=>execute('loader', input),
398
+ action: (input)=>execute('action', input)
399
+ };
400
+ }
401
+ exports.createDataClient = __webpack_exports__.createDataClient;
402
+ exports.readDataResponse = __webpack_exports__.readDataResponse;
403
+ for(var __rspack_i in __webpack_exports__)if (-1 === [
404
+ "createDataClient",
405
+ "readDataResponse"
406
+ ].indexOf(__rspack_i)) exports[__rspack_i] = __webpack_exports__[__rspack_i];
407
+ Object.defineProperty(exports, '__esModule', {
408
+ value: true
409
+ });