@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.
- package/LICENSE +21 -0
- package/dist/cjs/abort.js +65 -0
- package/dist/cjs/adapter.js +62 -0
- package/dist/cjs/data/body.js +78 -0
- package/dist/cjs/data/client.js +409 -0
- package/dist/cjs/data/codec.js +168 -0
- package/dist/cjs/data/index.js +125 -0
- package/dist/cjs/data/private.js +77 -0
- package/dist/cjs/data/routes.js +149 -0
- package/dist/cjs/data/server.js +791 -0
- package/dist/cjs/data/static.js +110 -0
- package/dist/cjs/data/tree.js +231 -0
- package/dist/cjs/data/types.js +56 -0
- package/dist/cjs/document.js +184 -0
- package/dist/cjs/entry-client.js +142 -0
- package/dist/cjs/entry-server.js +253 -0
- package/dist/cjs/federation.js +80 -0
- package/dist/cjs/identity.js +120 -0
- package/dist/cjs/index.js +46 -0
- package/dist/cjs/localization.js +48 -0
- package/dist/cjs/router.js +293 -0
- package/dist/cjs/server/assets.js +56 -0
- package/dist/cjs/server/dispatch.js +351 -0
- package/dist/cjs/server/index.js +57 -0
- package/dist/cjs/server/types.js +18 -0
- package/dist/cjs/server/worker.js +73 -0
- package/dist/cjs/session/cache.js +172 -0
- package/dist/cjs/session/index.js +63 -0
- package/dist/cjs/session/request.js +269 -0
- package/dist/cjs/session/types.js +18 -0
- package/dist/esm/abort.mjs +27 -0
- package/dist/esm/adapter.mjs +21 -0
- package/dist/esm/data/body.mjs +40 -0
- package/dist/esm/data/client.mjs +368 -0
- package/dist/esm/data/codec.mjs +112 -0
- package/dist/esm/data/index.mjs +7 -0
- package/dist/esm/data/private.mjs +39 -0
- package/dist/esm/data/routes.mjs +108 -0
- package/dist/esm/data/server.mjs +723 -0
- package/dist/esm/data/static.mjs +51 -0
- package/dist/esm/data/tree.mjs +193 -0
- package/dist/esm/data/types.mjs +6 -0
- package/dist/esm/document.mjs +131 -0
- package/dist/esm/entry-client.mjs +104 -0
- package/dist/esm/entry-server.mjs +215 -0
- package/dist/esm/federation.mjs +36 -0
- package/dist/esm/identity.mjs +63 -0
- package/dist/esm/index.mjs +1 -0
- package/dist/esm/localization.mjs +10 -0
- package/dist/esm/router.mjs +225 -0
- package/dist/esm/server/assets.mjs +15 -0
- package/dist/esm/server/dispatch.mjs +307 -0
- package/dist/esm/server/index.mjs +3 -0
- package/dist/esm/server/types.mjs +0 -0
- package/dist/esm/server/worker.mjs +35 -0
- package/dist/esm/session/cache.mjs +116 -0
- package/dist/esm/session/index.mjs +3 -0
- package/dist/esm/session/request.mjs +231 -0
- package/dist/esm/session/types.mjs +0 -0
- package/dist/esm-node/abort.mjs +28 -0
- package/dist/esm-node/adapter.mjs +22 -0
- package/dist/esm-node/data/body.mjs +41 -0
- package/dist/esm-node/data/client.mjs +369 -0
- package/dist/esm-node/data/codec.mjs +113 -0
- package/dist/esm-node/data/index.mjs +8 -0
- package/dist/esm-node/data/private.mjs +40 -0
- package/dist/esm-node/data/routes.mjs +109 -0
- package/dist/esm-node/data/server.mjs +724 -0
- package/dist/esm-node/data/static.mjs +52 -0
- package/dist/esm-node/data/tree.mjs +194 -0
- package/dist/esm-node/data/types.mjs +7 -0
- package/dist/esm-node/document.mjs +132 -0
- package/dist/esm-node/entry-client.mjs +105 -0
- package/dist/esm-node/entry-server.mjs +216 -0
- package/dist/esm-node/federation.mjs +37 -0
- package/dist/esm-node/identity.mjs +64 -0
- package/dist/esm-node/index.mjs +2 -0
- package/dist/esm-node/localization.mjs +11 -0
- package/dist/esm-node/router.mjs +226 -0
- package/dist/esm-node/server/assets.mjs +16 -0
- package/dist/esm-node/server/dispatch.mjs +308 -0
- package/dist/esm-node/server/index.mjs +4 -0
- package/dist/esm-node/server/types.mjs +1 -0
- package/dist/esm-node/server/worker.mjs +36 -0
- package/dist/esm-node/session/cache.mjs +117 -0
- package/dist/esm-node/session/index.mjs +4 -0
- package/dist/esm-node/session/request.mjs +232 -0
- package/dist/esm-node/session/types.mjs +1 -0
- package/dist/types/abort.d.ts +6 -0
- package/dist/types/adapter.d.ts +195 -0
- package/dist/types/data/body.d.ts +2 -0
- package/dist/types/data/client.d.ts +17 -0
- package/dist/types/data/codec.d.ts +14 -0
- package/dist/types/data/index.d.ts +8 -0
- package/dist/types/data/private.d.ts +6 -0
- package/dist/types/data/routes.d.ts +28 -0
- package/dist/types/data/server.d.ts +59 -0
- package/dist/types/data/static.d.ts +31 -0
- package/dist/types/data/tree.d.ts +3 -0
- package/dist/types/data/types.d.ts +104 -0
- package/dist/types/document.d.ts +76 -0
- package/dist/types/entry-client.d.ts +53 -0
- package/dist/types/entry-server.d.ts +63 -0
- package/dist/types/federation.d.ts +56 -0
- package/dist/types/identity.d.ts +27 -0
- package/dist/types/index.d.ts +1 -0
- package/dist/types/localization.d.ts +58 -0
- package/dist/types/router.d.ts +201 -0
- package/dist/types/server/assets.d.ts +14 -0
- package/dist/types/server/dispatch.d.ts +11 -0
- package/dist/types/server/index.d.ts +4 -0
- package/dist/types/server/types.d.ts +64 -0
- package/dist/types/server/worker.d.ts +25 -0
- package/dist/types/session/cache.d.ts +25 -0
- package/dist/types/session/index.d.ts +4 -0
- package/dist/types/session/request.d.ts +8 -0
- package/dist/types/session/types.d.ts +48 -0
- package/package.json +159 -4
- package/src/abort.ts +40 -0
- package/src/adapter.ts +255 -0
- package/src/data/body.ts +43 -0
- package/src/data/client.ts +501 -0
- package/src/data/codec.ts +247 -0
- package/src/data/index.ts +8 -0
- package/src/data/private.ts +68 -0
- package/src/data/routes.ts +201 -0
- package/src/data/server.ts +977 -0
- package/src/data/static.ts +105 -0
- package/src/data/tree.ts +244 -0
- package/src/data/types.ts +98 -0
- package/src/document.ts +338 -0
- package/src/entry-client.ts +236 -0
- package/src/entry-server.ts +393 -0
- package/src/federation.ts +111 -0
- package/src/identity.ts +128 -0
- package/src/index.ts +7 -0
- package/src/localization.ts +77 -0
- package/src/router.ts +475 -0
- package/src/server/assets.ts +60 -0
- package/src/server/dispatch.ts +523 -0
- package/src/server/index.ts +16 -0
- package/src/server/types.ts +94 -0
- package/src/server/worker.ts +94 -0
- package/src/session/cache.ts +177 -0
- package/src/session/index.ts +11 -0
- package/src/session/request.ts +324 -0
- package/src/session/types.ts +60 -0
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
|
+
});
|