@dooboostore/simple-boot-http-server-ssr 1.0.9 → 1.0.11
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.md +7 -0
- package/dist/cjs/SimpleBootHttpSSRFactory.d.ts.map +1 -0
- package/dist/cjs/SimpleBootHttpSSRFactory.js +33 -0
- package/dist/cjs/SimpleBootHttpSSRFactory.js.map +7 -0
- package/{SimpleBootHttpSSRServer.d.ts → dist/cjs/SimpleBootHttpSSRServer.d.ts} +2 -2
- package/dist/cjs/SimpleBootHttpSSRServer.d.ts.map +1 -0
- package/dist/cjs/SimpleBootHttpSSRServer.js +41 -0
- package/dist/cjs/SimpleBootHttpSSRServer.js.map +7 -0
- package/dist/cjs/codes/HttpHeaders.d.ts.map +1 -0
- package/dist/cjs/codes/HttpHeaders.js +41 -0
- package/dist/cjs/codes/HttpHeaders.js.map +7 -0
- package/dist/cjs/codes/Mimes.d.ts.map +1 -0
- package/dist/cjs/codes/Mimes.js +33 -0
- package/dist/cjs/codes/Mimes.js.map +7 -0
- package/dist/cjs/codes/index.d.ts +3 -0
- package/dist/cjs/codes/index.d.ts.map +1 -0
- package/dist/cjs/codes/index.js +24 -0
- package/dist/cjs/codes/index.js.map +7 -0
- package/dist/cjs/decorators/LoadAroundBefore.d.ts.map +1 -0
- package/dist/cjs/decorators/LoadAroundBefore.js +54 -0
- package/dist/cjs/decorators/LoadAroundBefore.js.map +7 -0
- package/dist/cjs/decorators/SaveAroundAfter.d.ts.map +1 -0
- package/dist/cjs/decorators/SaveAroundAfter.js +53 -0
- package/dist/cjs/decorators/SaveAroundAfter.js.map +7 -0
- package/dist/cjs/decorators/index.d.ts +3 -0
- package/dist/cjs/decorators/index.d.ts.map +1 -0
- package/dist/cjs/decorators/index.js +24 -0
- package/dist/cjs/decorators/index.js.map +7 -0
- package/dist/cjs/filters/IntentSchemeFilter.d.ts.map +1 -0
- package/dist/cjs/filters/IntentSchemeFilter.js +92 -0
- package/dist/cjs/filters/IntentSchemeFilter.js.map +7 -0
- package/{filters → dist/cjs/filters}/SSRFilter.d.ts +5 -0
- package/dist/cjs/filters/SSRFilter.d.ts.map +1 -0
- package/dist/cjs/filters/SSRFilter.js +204 -0
- package/dist/cjs/filters/SSRFilter.js.map +7 -0
- package/dist/cjs/filters/SSRWorker.d.ts.map +1 -0
- package/dist/cjs/filters/SSRWorker.js +85 -0
- package/dist/cjs/filters/SSRWorker.js.map +7 -0
- package/dist/cjs/filters/index.d.ts +4 -0
- package/dist/cjs/filters/index.d.ts.map +1 -0
- package/dist/cjs/filters/index.js +26 -0
- package/dist/cjs/filters/index.js.map +7 -0
- package/dist/cjs/index.d.ts +3 -0
- package/dist/cjs/index.d.ts.map +1 -0
- package/dist/cjs/index.js +24 -0
- package/dist/cjs/index.js.map +7 -0
- package/dist/cjs/initializers/JsdomInitializer.d.ts.map +1 -0
- package/dist/cjs/initializers/JsdomInitializer.js +82 -0
- package/dist/cjs/initializers/JsdomInitializer.js.map +7 -0
- package/dist/cjs/initializers/index.d.ts +2 -0
- package/dist/cjs/initializers/index.d.ts.map +1 -0
- package/dist/cjs/initializers/index.js +22 -0
- package/dist/cjs/initializers/index.js.map +7 -0
- package/dist/cjs/option/HttpSSRServerOption.d.ts.map +1 -0
- package/dist/cjs/option/HttpSSRServerOption.js +30 -0
- package/dist/cjs/option/HttpSSRServerOption.js.map +7 -0
- package/dist/cjs/option/index.d.ts +2 -0
- package/dist/cjs/option/index.d.ts.map +1 -0
- package/dist/cjs/option/index.js +22 -0
- package/dist/cjs/option/index.js.map +7 -0
- package/dist/cjs/package.json +3 -0
- package/dist/cjs/proxy/IntentSchemeFrontProxy.d.ts.map +1 -0
- package/dist/cjs/proxy/IntentSchemeFrontProxy.js +87 -0
- package/dist/cjs/proxy/IntentSchemeFrontProxy.js.map +7 -0
- package/dist/cjs/proxy/IntentSchemeServerProxy.d.ts.map +1 -0
- package/dist/cjs/proxy/IntentSchemeServerProxy.js +67 -0
- package/dist/cjs/proxy/IntentSchemeServerProxy.js.map +7 -0
- package/{proxy → dist/cjs/proxy}/SymbolIntentApiServiceProxy.d.ts +1 -0
- package/dist/cjs/proxy/SymbolIntentApiServiceProxy.d.ts.map +1 -0
- package/dist/cjs/proxy/SymbolIntentApiServiceProxy.js +111 -0
- package/dist/cjs/proxy/SymbolIntentApiServiceProxy.js.map +7 -0
- package/dist/cjs/proxy/SymbolIntentApiServiceProxyBase.d.ts +13 -0
- package/dist/cjs/proxy/SymbolIntentApiServiceProxyBase.d.ts.map +1 -0
- package/dist/cjs/proxy/SymbolIntentApiServiceProxyBase.js +110 -0
- package/dist/cjs/proxy/SymbolIntentApiServiceProxyBase.js.map +7 -0
- package/dist/cjs/proxy/index.d.ts +5 -0
- package/dist/cjs/proxy/index.d.ts.map +1 -0
- package/dist/cjs/proxy/index.js +28 -0
- package/dist/cjs/proxy/index.js.map +7 -0
- package/dist/esm/SimpleBootHttpSSRFactory.d.ts +8 -0
- package/dist/esm/SimpleBootHttpSSRFactory.d.ts.map +1 -0
- package/dist/esm/SimpleBootHttpSSRFactory.js +10 -0
- package/dist/esm/SimpleBootHttpSSRFactory.js.map +7 -0
- package/dist/esm/SimpleBootHttpSSRServer.d.ts +9 -0
- package/dist/esm/SimpleBootHttpSSRServer.d.ts.map +1 -0
- package/dist/esm/SimpleBootHttpSSRServer.js +18 -0
- package/dist/esm/SimpleBootHttpSSRServer.js.map +7 -0
- package/dist/esm/codes/HttpHeaders.d.ts +45 -0
- package/dist/esm/codes/HttpHeaders.d.ts.map +1 -0
- package/dist/esm/codes/HttpHeaders.js +17 -0
- package/dist/esm/codes/HttpHeaders.js.map +7 -0
- package/dist/esm/codes/Mimes.d.ts +31 -0
- package/dist/esm/codes/Mimes.d.ts.map +1 -0
- package/dist/esm/codes/Mimes.js +10 -0
- package/dist/esm/codes/Mimes.js.map +7 -0
- package/dist/esm/codes/index.d.ts +3 -0
- package/dist/esm/codes/index.d.ts.map +1 -0
- package/dist/esm/codes/index.js +3 -0
- package/dist/esm/codes/index.js.map +7 -0
- package/dist/esm/decorators/LoadAroundBefore.d.ts +2 -0
- package/dist/esm/decorators/LoadAroundBefore.d.ts.map +1 -0
- package/dist/esm/decorators/LoadAroundBefore.js +31 -0
- package/dist/esm/decorators/LoadAroundBefore.js.map +7 -0
- package/dist/esm/decorators/SaveAroundAfter.d.ts +3 -0
- package/dist/esm/decorators/SaveAroundAfter.d.ts.map +1 -0
- package/dist/esm/decorators/SaveAroundAfter.js +29 -0
- package/dist/esm/decorators/SaveAroundAfter.js.map +7 -0
- package/dist/esm/decorators/index.d.ts +3 -0
- package/dist/esm/decorators/index.d.ts.map +1 -0
- package/dist/esm/decorators/index.js +3 -0
- package/dist/esm/decorators/index.js.map +7 -0
- package/dist/esm/filters/IntentSchemeFilter.d.ts +20 -0
- package/dist/esm/filters/IntentSchemeFilter.d.ts.map +1 -0
- package/dist/esm/filters/IntentSchemeFilter.js +69 -0
- package/dist/esm/filters/IntentSchemeFilter.js.map +7 -0
- package/dist/esm/filters/SSRFilter.d.ts +59 -0
- package/dist/esm/filters/SSRFilter.d.ts.map +1 -0
- package/dist/esm/filters/SSRFilter.js +181 -0
- package/dist/esm/filters/SSRFilter.js.map +7 -0
- package/dist/esm/filters/SSRWorker.d.ts +16 -0
- package/dist/esm/filters/SSRWorker.d.ts.map +1 -0
- package/dist/esm/filters/SSRWorker.js +62 -0
- package/dist/esm/filters/SSRWorker.js.map +7 -0
- package/dist/esm/filters/index.d.ts +4 -0
- package/dist/esm/filters/index.d.ts.map +1 -0
- package/dist/esm/filters/index.js +4 -0
- package/dist/esm/filters/index.js.map +7 -0
- package/dist/esm/index.d.ts +3 -0
- package/dist/esm/index.d.ts.map +1 -0
- package/dist/esm/index.js +5 -0
- package/dist/esm/index.js.map +7 -0
- package/dist/esm/initializers/JsdomInitializer.d.ts +11 -0
- package/dist/esm/initializers/JsdomInitializer.d.ts.map +1 -0
- package/dist/esm/initializers/JsdomInitializer.js +49 -0
- package/dist/esm/initializers/JsdomInitializer.js.map +7 -0
- package/dist/esm/initializers/index.d.ts +2 -0
- package/dist/esm/initializers/index.d.ts.map +1 -0
- package/dist/esm/initializers/index.js +2 -0
- package/dist/esm/initializers/index.js.map +7 -0
- package/dist/esm/option/HttpSSRServerOption.d.ts +4 -0
- package/dist/esm/option/HttpSSRServerOption.d.ts.map +1 -0
- package/dist/esm/option/HttpSSRServerOption.js +7 -0
- package/dist/esm/option/HttpSSRServerOption.js.map +7 -0
- package/dist/esm/option/index.d.ts +2 -0
- package/dist/esm/option/index.d.ts.map +1 -0
- package/dist/esm/option/index.js +2 -0
- package/dist/esm/option/index.js.map +7 -0
- package/dist/esm/proxy/IntentSchemeFrontProxy.d.ts +4 -0
- package/dist/esm/proxy/IntentSchemeFrontProxy.d.ts.map +1 -0
- package/dist/esm/proxy/IntentSchemeFrontProxy.js +64 -0
- package/dist/esm/proxy/IntentSchemeFrontProxy.js.map +7 -0
- package/dist/esm/proxy/IntentSchemeServerProxy.d.ts +4 -0
- package/dist/esm/proxy/IntentSchemeServerProxy.d.ts.map +1 -0
- package/dist/esm/proxy/IntentSchemeServerProxy.js +44 -0
- package/dist/esm/proxy/IntentSchemeServerProxy.js.map +7 -0
- package/dist/esm/proxy/SymbolIntentApiServiceProxy.d.ts +16 -0
- package/dist/esm/proxy/SymbolIntentApiServiceProxy.d.ts.map +1 -0
- package/dist/esm/proxy/SymbolIntentApiServiceProxy.js +88 -0
- package/dist/esm/proxy/SymbolIntentApiServiceProxy.js.map +7 -0
- package/dist/esm/proxy/SymbolIntentApiServiceProxyBase.d.ts +13 -0
- package/dist/esm/proxy/SymbolIntentApiServiceProxyBase.d.ts.map +1 -0
- package/dist/esm/proxy/SymbolIntentApiServiceProxyBase.js +87 -0
- package/dist/esm/proxy/SymbolIntentApiServiceProxyBase.js.map +7 -0
- package/dist/esm/proxy/index.d.ts +5 -0
- package/dist/esm/proxy/index.d.ts.map +1 -0
- package/dist/esm/proxy/index.js +5 -0
- package/dist/esm/proxy/index.js.map +7 -0
- package/dist/esm-bundle/dooboostore-simple-boot-http-server-ssr.esm.js +6 -0
- package/dist/esm-bundle/dooboostore-simple-boot-http-server-ssr.esm.js.map +7 -0
- package/dist/umd-bundle/dooboostore-simple-boot-http-server-ssr.umd.js +28 -0
- package/dist/umd-bundle/dooboostore-simple-boot-http-server-ssr.umd.js.map +7 -0
- package/package.json +60 -45
- package/SimpleBootHttpSSRFactory.js +0 -10
- package/SimpleBootHttpSSRServer.js +0 -12
- package/codes/HttpHeaders.js +0 -10
- package/codes/Mimes.js +0 -3
- package/decorators/LoadAroundBefore.js +0 -31
- package/decorators/SaveAroundAfter.js +0 -26
- package/filters/IntentSchemeFilter.js +0 -72
- package/filters/SSRFilter.js +0 -232
- package/filters/SSRWorker.js +0 -72
- package/initializers/JsdomInitializer.js +0 -63
- package/option/HttpSSRServerOption.js +0 -4
- package/proxy/IntentSchemeFrontProxy.js +0 -68
- package/proxy/IntentSchemeServerProxy.js +0 -39
- package/proxy/SymbolIntentApiServiceProxy.js +0 -67
- /package/{SimpleBootHttpSSRFactory.d.ts → dist/cjs/SimpleBootHttpSSRFactory.d.ts} +0 -0
- /package/{codes → dist/cjs/codes}/HttpHeaders.d.ts +0 -0
- /package/{codes → dist/cjs/codes}/Mimes.d.ts +0 -0
- /package/{decorators → dist/cjs/decorators}/LoadAroundBefore.d.ts +0 -0
- /package/{decorators → dist/cjs/decorators}/SaveAroundAfter.d.ts +0 -0
- /package/{filters → dist/cjs/filters}/IntentSchemeFilter.d.ts +0 -0
- /package/{filters → dist/cjs/filters}/SSRWorker.d.ts +0 -0
- /package/{initializers → dist/cjs/initializers}/JsdomInitializer.d.ts +0 -0
- /package/{option → dist/cjs/option}/HttpSSRServerOption.d.ts +0 -0
- /package/{proxy → dist/cjs/proxy}/IntentSchemeFrontProxy.d.ts +0 -0
- /package/{proxy → dist/cjs/proxy}/IntentSchemeServerProxy.d.ts +0 -0
|
@@ -0,0 +1,181 @@
|
|
|
1
|
+
import { HttpHeaders } from "@dooboostore/simple-boot-http-server/codes/HttpHeaders";
|
|
2
|
+
import { JsdomInitializer } from "../initializers/JsdomInitializer.js";
|
|
3
|
+
import { Mimes } from "@dooboostore/simple-boot-http-server/codes/Mimes";
|
|
4
|
+
import { HttpStatus } from "@dooboostore/simple-boot-http-server/codes/HttpStatus";
|
|
5
|
+
import { AsyncBlockingQueue } from "@dooboostore/core/queues/AsyncBlockingQueue";
|
|
6
|
+
import { RandomUtils } from "@dooboostore/core/random/RandomUtils";
|
|
7
|
+
import { NotFoundError } from "@dooboostore/simple-boot-http-server/errors/NotFoundError";
|
|
8
|
+
import { DomRenderProxy } from "@dooboostore/dom-render/DomRenderProxy";
|
|
9
|
+
import { filter } from "@dooboostore/core/message/operators/filter";
|
|
10
|
+
import { first } from "@dooboostore/core/message/operators/first";
|
|
11
|
+
import { firstValueFrom } from "@dooboostore/core/message/internal/firstValueFrom";
|
|
12
|
+
class SSRFilter {
|
|
13
|
+
constructor(config, otherInstanceSim) {
|
|
14
|
+
this.config = config;
|
|
15
|
+
this.otherInstanceSim = otherInstanceSim;
|
|
16
|
+
config.frontDistIndexFileName = config.frontDistIndexFileName || "index.html";
|
|
17
|
+
this.indexHTML = JsdomInitializer.loadFile(this.config.frontDistPath, config.frontDistIndexFileName);
|
|
18
|
+
}
|
|
19
|
+
simpleBootFrontPool = [];
|
|
20
|
+
simpleBootFrontQueue = new AsyncBlockingQueue();
|
|
21
|
+
indexHTML;
|
|
22
|
+
welcomUrl = "http://localhost";
|
|
23
|
+
poolGeneration = 0;
|
|
24
|
+
intervalId;
|
|
25
|
+
async onInit(app) {
|
|
26
|
+
for (let i = 0; i < this.config.poolOption.min; i++) {
|
|
27
|
+
await this.pushQueue();
|
|
28
|
+
}
|
|
29
|
+
if (this.config.poolOption.clearIntervalTime && this.config.poolOption.clearIntervalTime > 0) {
|
|
30
|
+
this.intervalId = setInterval(() => {
|
|
31
|
+
this.poolGeneration++;
|
|
32
|
+
}, this.config.poolOption.clearIntervalTime);
|
|
33
|
+
}
|
|
34
|
+
}
|
|
35
|
+
async onDestroy() {
|
|
36
|
+
if (this.intervalId) {
|
|
37
|
+
clearInterval(this.intervalId);
|
|
38
|
+
}
|
|
39
|
+
this.simpleBootFrontPool.forEach((front) => {
|
|
40
|
+
front.jsdom?.window.close();
|
|
41
|
+
});
|
|
42
|
+
this.simpleBootFrontPool = [];
|
|
43
|
+
}
|
|
44
|
+
// workerTs(workerOptions: WorkerOptions) {
|
|
45
|
+
// workerOptions.eval = true;
|
|
46
|
+
// if (!workerOptions.workerData) {
|
|
47
|
+
// workerOptions.workerData = {};
|
|
48
|
+
// }
|
|
49
|
+
// workerOptions.workerData.__filename = '/Users/hyunhakim/source/visualkhh/pet-space/libs/simple-boot-http-ssr/dist/filters/SSRCreatorWorker.js';
|
|
50
|
+
// return new Worker(` const wk = require('worker_threads'); require('ts-node').register(); let file = wk.workerData.__filename; require(file); `, workerOptions,);
|
|
51
|
+
// }
|
|
52
|
+
async makeJsdom() {
|
|
53
|
+
const jsdom = await new JsdomInitializer(
|
|
54
|
+
this.config.frontDistPath,
|
|
55
|
+
this.config.frontDistIndexFileName || "index.html",
|
|
56
|
+
{ url: this.welcomUrl }
|
|
57
|
+
).run();
|
|
58
|
+
return jsdom;
|
|
59
|
+
}
|
|
60
|
+
async makeFront(jsdom) {
|
|
61
|
+
const name = RandomUtils.uuid();
|
|
62
|
+
const window = jsdom.window;
|
|
63
|
+
window.ssrUse = false;
|
|
64
|
+
const option = this.config.factorySimFrontOption(DomRenderProxy.final(window));
|
|
65
|
+
const simpleBootFront = await this.config.factory.create(option, this.config.using, this.config.domExcludes);
|
|
66
|
+
simpleBootFront.run(this.otherInstanceSim);
|
|
67
|
+
simpleBootFront.jsdom = jsdom;
|
|
68
|
+
simpleBootFront.generation = this.poolGeneration;
|
|
69
|
+
return simpleBootFront;
|
|
70
|
+
}
|
|
71
|
+
enqueueFrontApp(simpleBootFront) {
|
|
72
|
+
this.simpleBootFrontPool.push(simpleBootFront);
|
|
73
|
+
this.simpleBootFrontQueue.enqueue(simpleBootFront);
|
|
74
|
+
}
|
|
75
|
+
// async pushQueue(destorFront?: SimpleBootFront) {
|
|
76
|
+
// if (destorFront) {
|
|
77
|
+
// this.simpleBootFrontPool.delete(destorFront.option.name!);
|
|
78
|
+
// }
|
|
79
|
+
async pushQueue() {
|
|
80
|
+
if (this.simpleBootFrontPool.length < this.config.poolOption.max) {
|
|
81
|
+
this.enqueueFrontApp(await this.makeFront(await this.makeJsdom()));
|
|
82
|
+
}
|
|
83
|
+
}
|
|
84
|
+
async proceedBefore({ rr, app }) {
|
|
85
|
+
if (this.config.ssrExcludeFilter?.(rr)) {
|
|
86
|
+
return false;
|
|
87
|
+
}
|
|
88
|
+
if (rr.reqHasAcceptHeader(Mimes.TextHtml) || rr.reqHasAcceptHeader(Mimes.All)) {
|
|
89
|
+
if (this.simpleBootFrontQueue.isEmpty()) {
|
|
90
|
+
await this.pushQueue();
|
|
91
|
+
}
|
|
92
|
+
const simpleBootFront = await this.simpleBootFrontQueue.dequeue();
|
|
93
|
+
try {
|
|
94
|
+
simpleBootFront.option.window.ssrUse = true;
|
|
95
|
+
delete simpleBootFront.option.window.server_side_data;
|
|
96
|
+
const url = rr.reqUrlObj({ host: "localhost" });
|
|
97
|
+
if (this.config.simpleBootFront?.notFoundError) {
|
|
98
|
+
const intent = await simpleBootFront.getIntent(url.pathname);
|
|
99
|
+
if (intent.module === void 0 && !intent.getRouterPathData(rr.reqUrlPathName)) {
|
|
100
|
+
throw new NotFoundError({ message: `Not Found: ${rr.reqUrlPathName}` });
|
|
101
|
+
}
|
|
102
|
+
}
|
|
103
|
+
const targetUrl = url.toString();
|
|
104
|
+
await simpleBootFront.goRouting(targetUrl);
|
|
105
|
+
await new Promise((r) => setTimeout(r, 0));
|
|
106
|
+
const data = await firstValueFrom(
|
|
107
|
+
// @ts-ignore
|
|
108
|
+
simpleBootFront.routingSubjectObservable.pipe(
|
|
109
|
+
// @ts-ignore
|
|
110
|
+
filter(
|
|
111
|
+
(it) => it.state === "end" && typeof it.routerModule.intent.uri === "string" && targetUrl.endsWith(it.routerModule.intent.uri)
|
|
112
|
+
),
|
|
113
|
+
// delay(1000),
|
|
114
|
+
first()
|
|
115
|
+
)
|
|
116
|
+
);
|
|
117
|
+
const html = this.makeHTML(simpleBootFront);
|
|
118
|
+
await this.writeOkHtmlAndEnd({ rr }, html);
|
|
119
|
+
} finally {
|
|
120
|
+
simpleBootFront.option.window.ssrUse = false;
|
|
121
|
+
delete simpleBootFront.option.window.server_side_data;
|
|
122
|
+
if (simpleBootFront.generation < this.poolGeneration) {
|
|
123
|
+
const jsdom = simpleBootFront.jsdom;
|
|
124
|
+
jsdom?.window.close();
|
|
125
|
+
const index = this.simpleBootFrontPool.indexOf(simpleBootFront);
|
|
126
|
+
if (index > -1) {
|
|
127
|
+
this.simpleBootFrontPool.splice(index, 1);
|
|
128
|
+
}
|
|
129
|
+
this.pushQueue();
|
|
130
|
+
} else {
|
|
131
|
+
this.simpleBootFrontQueue.enqueue(simpleBootFront);
|
|
132
|
+
}
|
|
133
|
+
}
|
|
134
|
+
return false;
|
|
135
|
+
} else {
|
|
136
|
+
return true;
|
|
137
|
+
}
|
|
138
|
+
}
|
|
139
|
+
// const e = Expression.Path.pathNameData(rr.reqUrlPathName, intent.getRouterPath())
|
|
140
|
+
// console.log('------intent', rr.reqUrl, rr.reqUrlPathName, intent.module, intent.getRouterPath(), e)
|
|
141
|
+
// simpleBootFront.option.window.document.documentElemenh
|
|
142
|
+
// "dr-"로 시작하는 모든 attribute를 가진 element에서 해당 attribute를 제거
|
|
143
|
+
makeHTML(simpleBootFront) {
|
|
144
|
+
simpleBootFront.option.window.document.querySelectorAll("*").forEach((el) => {
|
|
145
|
+
Array.from(el.attributes).forEach((attr) => {
|
|
146
|
+
if (/^dr-/.test(attr.name) || /^domstyle/.test(attr.name) || /this-path/.test(attr.name)) {
|
|
147
|
+
el.removeAttribute(attr.name);
|
|
148
|
+
}
|
|
149
|
+
});
|
|
150
|
+
});
|
|
151
|
+
let html = simpleBootFront.option.window.document.documentElement.outerHTML;
|
|
152
|
+
html = "<!DOCTYPE html>" + html;
|
|
153
|
+
html = html.replace(/\$\{[\s\S]*?\}\$/g, "");
|
|
154
|
+
const serverSideData = simpleBootFront.option.window.server_side_data;
|
|
155
|
+
if (serverSideData) {
|
|
156
|
+
const data = Object.entries(serverSideData).map(([k, v]) => {
|
|
157
|
+
if (typeof v === "string") {
|
|
158
|
+
return `window.server_side_data.${k} = ${v}`;
|
|
159
|
+
} else {
|
|
160
|
+
return `window.server_side_data.${k} = ${JSON.stringify(v)}`;
|
|
161
|
+
}
|
|
162
|
+
}).join(";");
|
|
163
|
+
if (data) {
|
|
164
|
+
html = html.replace("</head>", `<script> window.server_side_data={}; ${data}; </script></head>`);
|
|
165
|
+
}
|
|
166
|
+
}
|
|
167
|
+
return html;
|
|
168
|
+
}
|
|
169
|
+
async writeOkHtmlAndEnd({ rr, status = HttpStatus.Ok }, html) {
|
|
170
|
+
rr.resStatusCode(status);
|
|
171
|
+
rr.resSetHeader(HttpHeaders.ContentType, Mimes.TextHtml);
|
|
172
|
+
await rr.resEnd(html);
|
|
173
|
+
}
|
|
174
|
+
async proceedAfter({ rr, app }) {
|
|
175
|
+
return true;
|
|
176
|
+
}
|
|
177
|
+
}
|
|
178
|
+
export {
|
|
179
|
+
SSRFilter
|
|
180
|
+
};
|
|
181
|
+
//# sourceMappingURL=SSRFilter.js.map
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
{
|
|
2
|
+
"version": 3,
|
|
3
|
+
"sources": ["../../../src/filters/SSRFilter.ts"],
|
|
4
|
+
"sourcesContent": ["import { RequestResponse } from '@dooboostore/simple-boot-http-server/models/RequestResponse';\nimport { HttpHeaders } from '@dooboostore/simple-boot-http-server/codes/HttpHeaders';\nimport { SimpleBootHttpSSRFactory } from '../SimpleBootHttpSSRFactory';\nimport { ConstructorType } from '@dooboostore/core/types';\nimport { JsdomInitializer } from '../initializers/JsdomInitializer';\nimport { Filter } from '@dooboostore/simple-boot-http-server/filters/Filter';\nimport { Mimes } from '@dooboostore/simple-boot-http-server/codes/Mimes';\nimport { HttpStatus } from '@dooboostore/simple-boot-http-server/codes/HttpStatus';\nimport { SimpleBootHttpServer } from '@dooboostore/simple-boot-http-server/SimpleBootHttpServer';\nimport { SimFrontOption } from '@dooboostore/simple-boot-front/option/SimFrontOption';\nimport { SimpleBootFront } from '@dooboostore/simple-boot-front/SimpleBootFront';\nimport { AsyncBlockingQueue } from '@dooboostore/core/queues/AsyncBlockingQueue';\nimport { RandomUtils } from '@dooboostore/core/random/RandomUtils';\nimport * as JSDOM from 'jsdom';\nimport { NotFoundError } from '@dooboostore/simple-boot-http-server/errors/NotFoundError';\nimport { DomRenderProxy } from '@dooboostore/dom-render/DomRenderProxy';\nimport { filter } from '@dooboostore/core/message/operators/filter';\nimport { first } from '@dooboostore/core/message/operators/first';\nimport { firstValueFrom } from '@dooboostore/core/message/internal/firstValueFrom';\n\nexport type FactoryAndParams = {\n frontDistPath: string;\n frontDistIndexFileName?: string;\n factorySimFrontOption: (window: any) => SimFrontOption;\n factory: SimpleBootHttpSSRFactory;\n poolOption: {\n max: number;\n min: number;\n clearIntervalTime?: number;\n };\n using: ConstructorType<any>[];\n domExcludes?: ConstructorType<any>[];\n ssrExcludeFilter?: (rr: RequestResponse) => boolean;\n simpleBootFront?: {\n notFoundError?: boolean;\n };\n};\n\nexport class SSRFilter implements Filter {\n private simpleBootFrontPool: SimpleBootFront[] = [];\n private simpleBootFrontQueue = new AsyncBlockingQueue<SimpleBootFront>();\n private indexHTML: string;\n private welcomUrl = 'http://localhost';\n private poolGeneration = 0;\n private intervalId?: NodeJS.Timeout;\n\n constructor(\n public config: FactoryAndParams,\n public otherInstanceSim?: Map<ConstructorType<any>, any>\n ) {\n config.frontDistIndexFileName = config.frontDistIndexFileName || 'index.html';\n this.indexHTML = JsdomInitializer.loadFile(this.config.frontDistPath, config.frontDistIndexFileName);\n }\n\n async onInit(app: SimpleBootHttpServer) {\n for (let i = 0; i < this.config.poolOption.min; i++) {\n await this.pushQueue();\n }\n\n if (this.config.poolOption.clearIntervalTime && this.config.poolOption.clearIntervalTime > 0) {\n this.intervalId = setInterval(() => {\n this.poolGeneration++;\n }, this.config.poolOption.clearIntervalTime);\n }\n // console.log('SimpleBootHttpSSRFactory init success ', + this.simpleBootFrontPool.length)\n }\n\n async onDestroy() {\n if (this.intervalId) {\n clearInterval(this.intervalId);\n }\n // this.simpleBootFrontQueue.clear();\n this.simpleBootFrontPool.forEach(front => {\n (front as any).jsdom?.window.close();\n });\n this.simpleBootFrontPool = [];\n }\n\n // workerTs(workerOptions: WorkerOptions) {\n // workerOptions.eval = true;\n // if (!workerOptions.workerData) {\n // workerOptions.workerData = {};\n // }\n // workerOptions.workerData.__filename = '/Users/hyunhakim/source/visualkhh/pet-space/libs/simple-boot-http-ssr/dist/filters/SSRCreatorWorker.js';\n // return new Worker(` const wk = require('worker_threads'); require('ts-node').register(); let file = wk.workerData.__filename; require(file); `, workerOptions,);\n // }\n\n async makeJsdom() {\n const jsdom = await new JsdomInitializer(\n this.config.frontDistPath,\n this.config.frontDistIndexFileName || 'index.html',\n { url: this.welcomUrl }\n ).run();\n return jsdom;\n }\n\n async makeFront(jsdom: JSDOM.JSDOM) {\n const name = RandomUtils.uuid();\n // const jsdom = await this.makeJsdom();\n const window = jsdom.window as unknown as Window & typeof globalThis;\n (window as any).ssrUse = false;\n const option = this.config.factorySimFrontOption(DomRenderProxy.final(window));\n const simpleBootFront = await this.config.factory.create(option, this.config.using, this.config.domExcludes);\n simpleBootFront.run(this.otherInstanceSim);\n (simpleBootFront as any).jsdom = jsdom;\n (simpleBootFront as any).generation = this.poolGeneration;\n return simpleBootFront;\n }\n\n enqueueFrontApp(simpleBootFront: SimpleBootFront) {\n // this.simpleBootFrontPool.set(simpleBootFront.option.name!, simpleBootFront);\n this.simpleBootFrontPool.push(simpleBootFront);\n this.simpleBootFrontQueue.enqueue(simpleBootFront);\n }\n\n // async pushQueue(destorFront?: SimpleBootFront) {\n // if (destorFront) {\n // this.simpleBootFrontPool.delete(destorFront.option.name!);\n // }\n async pushQueue() {\n if (this.simpleBootFrontPool.length < this.config.poolOption.max) {\n this.enqueueFrontApp(await this.makeFront(await this.makeJsdom()));\n }\n }\n\n async proceedBefore({ rr, app }: { rr: RequestResponse; app: SimpleBootHttpServer; carrier: Map<string, any> }) {\n if (this.config.ssrExcludeFilter?.(rr)) {\n return false;\n }\n if (rr.reqHasAcceptHeader(Mimes.TextHtml) || rr.reqHasAcceptHeader(Mimes.All)) {\n if (this.simpleBootFrontQueue.isEmpty()) {\n await this.pushQueue();\n }\n const simpleBootFront = await this.simpleBootFrontQueue.dequeue();\n try {\n // console.log('SSRFilter before-->' , simpleBootFront.option.name, 'poolLength:',this.simpleBootFrontPool.size);\n (simpleBootFront.option.window as any).ssrUse = true;\n delete (simpleBootFront.option.window as any).server_side_data;\n\n const url = rr.reqUrlObj({ host: 'localhost' });\n if (this.config.simpleBootFront?.notFoundError) {\n // intent router check first\n const intent = await simpleBootFront.getIntent(url.pathname);\n // route\uB97C \uBABB\uCC3E\uC740\uC0C1\uD0DC\uC5D0\uC11C router path\uAE4C\uC9C0 \uC548\uB9DE\uC73C\uBA74 404 \uCC98\uB9AC\uD55C\uB2E4. route\uB791 router\uB791 \uB2E4\uB974\uB2C8\uAE50 \uD5DB\uAC08\uB9AC\uC9C0\uB9D0\uB3C4\uB85D\n if (intent.module === undefined && !intent.getRouterPathData(rr.reqUrlPathName)) {\n throw new NotFoundError({ message: `Not Found: ${rr.reqUrlPathName}` });\n }\n }\n\n // runRouting!!\n const targetUrl = url.toString();\n // console.log('rrrrr');\n // simpleBootFront.routingSubjectObservable.subscribe(it => {\n // if (it.state === 'end' && it.routerModule.intent.uri === targetUrl) {\n // console.log('vvvvvvvvvvvv', it.state, it.routerModule.intent.uri);\n // }\n // });\n await simpleBootFront.goRouting(targetUrl);\n await new Promise(r => setTimeout(r, 0)); // <--\uC911\uC694: \uC774\uAC70 \uB123\uC5B4\uC57C\uC9C0 \uB450\uBC88\uBD88\uB7EC\uC9C0\uB294\uAC8C \uC5C6\uC5B4\uC9C0\uB294\uB4EF? \uBB50\uC9C0 event loop \uBCC0\uACBD\uB41C\uAC74\uAC00?\n // TODO: \uC635\uC158\uC73C\uB85C \uC774\uAC70 \uD0A4\uACE0 \uB044\uACE0\uD560\uC218\uC788\uAC8C \uD574\uC57C\uB420\uAE4C..?\n // simpleBootFront.routingSubjectObservable.pipe(\n // filter((it) =>\n // it.state === 'end' &&\n // typeof it.routerModule.intent.uri === 'string' &&\n // targetUrl.endsWith(it.routerModule.intent.uri)\n // ),\n // // delay(1000),\n // first()\n // );\n const data = await firstValueFrom(\n // @ts-ignore\n simpleBootFront.routingSubjectObservable.pipe(\n // @ts-ignore\n filter(\n (it: any) =>\n it.state === 'end' &&\n typeof it.routerModule.intent.uri === 'string' &&\n targetUrl.endsWith(it.routerModule.intent.uri)\n ),\n // delay(1000),\n first()\n )\n );\n // console.log('rrrrrssss');\n // console.log('rrrrrssss122');\n const html = this.makeHTML(simpleBootFront);\n await this.writeOkHtmlAndEnd({ rr }, html);\n } finally {\n (simpleBootFront.option.window as any).ssrUse = false;\n delete (simpleBootFront.option.window as any).server_side_data;\n // console.log('--------->', simpleBootFront.option.window)\n // simpleBootFront.ninitWriteRootRouter();\n // ((simpleBootFront as any).jsdom as JSDOM.JSDOM)?.reconfigure({url: '/' });\n // simpleBootFront.option.window.location.href = 'about:blank';\n // console.log('ddddddddd', (simpleBootFront as any).generation, this.poolGeneration)\n if ((simpleBootFront as any).generation < this.poolGeneration) {\n // Stale instance, destroy it\n const jsdom = (simpleBootFront as any).jsdom as JSDOM.JSDOM | undefined;\n jsdom?.window.close();\n const index = this.simpleBootFrontPool.indexOf(simpleBootFront);\n if (index > -1) {\n this.simpleBootFrontPool.splice(index, 1);\n }\n // Create a new one to maintain pool size\n this.pushQueue();\n } else {\n // Current instance, return to queue\n this.simpleBootFrontQueue.enqueue(simpleBootFront);\n }\n // simpleBootFront.option.window.document.body.innerHTML = this.rootJSDOM.window.document.body.innerHTML;\n // simpleBootFront.writeRootRouter()\n // await simpleBootFront.goRouting('/');\n\n // ((simpleBootFront as any).jsdom as JSDOM.JSDOM)?.reconfigure({url: this.welcomUrl });\n\n // simpleBootFront.option.window.location.href = this.welcomUrl;\n // simpleBootFront.option.window.document.documentElement.outerHTML = this.indexHTML;\n // this.simpleBootFrontQueue.enqueue(simpleBootFront);\n // await new Promise((re, r) => setTimeout(() => re(true), 10000));\n // new Promise((re, r) => setTimeout(() => re(true), 10000)).then(it => {\n // console.log('ddddddddddd')\n // });\n // this.simpleBootFrontPool.delete(simpleBootFront.option.name!);\n // if (isMainThread) { // \uBA54\uC778 \uC2A4\uB808\uB4DC\n // console.log('file-->', __filename)\n // const worker = new Worker(__filename);\n // worker.on('message', (value: any) => {\n // console.log('\uC6CC\uCEE4\uB85C\uBD80\uD130', value)\n // })\n // worker.on('exit', (value: any) => { // parentPort.close()\uAC00 \uC77C\uC5B4\uB098\uBA74 \uC774\uBCA4\uD2B8 \uBC1C\uC0DD\n // console.log('\uC6CC\uCEE4 \uB05D~');\n // })\n // worker.postMessage('ping'); // \uC6CC\uCEE4\uC2A4\uB808\uB4DC\uC5D0\uAC8C \uBA54\uC138\uC9C0\uB97C \uBCF4\uB0B8\uB2E4.\n // } else { // \uC6CC\uCEE4\uC2A4\uB808\uB4DC\n // parentPort.on('message', (value: any) => {\n // console.log(\"\uBD80\uBAA8\uB85C\uBD80\uD130\", value);\n // parentPort.postMessage('pong');\n // parentPort.close(); // \uC6CC\uCEE4\uC2A4\uB808\uB4DC \uC885\uB8CC\uB77C\uACE0 \uBA54\uC778\uC2A4\uB808\uB4DC\uC5D0 \uC54C\uB824\uC918\uC57C exit\uC774\uBCA4\uD2B8 \uBC1C\uC0DD\n // })\n // }\n\n //worker thrad\n // const workerPath = path.join(__dirname, 'SSRWorker.js');\n // const worker = new Worker(workerPath);\n // worker.once('message', (value: any) => {\n // console.log('\uC6CC\uCEE4\uB85C\uBD80\uD130', value)\n // });\n // const receiveWorker = new Worker('/Users/hyunhakim/source/visualkhh/pet-space/libs/simple-boot-http-ssr/dist/filters/SSRCreatorWorker.js');\n // receiveWorker.on('message', (msg: JSDOM.JSDOM)=>{\n // console.log('\uC6CC\uCEE4\uB85C\uBD80\uD130', msg, msg.window.document.body.innerHTML)\n // console.log('a message is sent! : ', msg)\n //\n // });\n //\n // receiveWorker.on('error', err=>{\n // console.error(err);\n // })\n //\n // receiveWorker.on('exit', ()=>console.log('exited!'));\n // receiveWorker.postMessage(\n // {\n // frontDistPath: this.factory.frontDistPath,\n // frontDistIndexFileName: this.factory.frontDistIndexFileName,\n // }\n // );\n\n // const myWorkers = this.workerTs({});\n // myWorkers.postMessage(this);\n // myWorkers.on('message', (value: SimpleBootFront) => {\n // this.pushQueue(value);\n // })\n // this\n // this.pushQueue(simpleBootFront).then(it => {\n // console.log('deee')\n // });\n // console.log('-1->', simpleBootFront.option.window.location.href);\n // simpleBootFront.option.window.location.href = this.welcomUrl;\n // simpleBootFront.option.window.location.reload();\n // console.log('-2->', simpleBootFront.option.window.location.href);\n // simpleBootFront.option.window.location.reload();\n // console.log('-3->', simpleBootFront.option.window.location.href);\n // this.simpleBootFrontQueue.enqueue(simpleBootFront);\n // await this.makeJsdom();\n // simpleBootFront.option.window.location.href = this.welcomUrl;\n }\n // console.log('----doen')\n return false;\n } else {\n // console.log('----doen2')\n return true;\n }\n }\n\n // const e = Expression.Path.pathNameData(rr.reqUrlPathName, intent.getRouterPath())\n // console.log('------intent', rr.reqUrl, rr.reqUrlPathName, intent.module, intent.getRouterPath(), e)\n // simpleBootFront.option.window.document.documentElemenh\n // \"dr-\"\uB85C \uC2DC\uC791\uD558\uB294 \uBAA8\uB4E0 attribute\uB97C \uAC00\uC9C4 element\uC5D0\uC11C \uD574\uB2F9 attribute\uB97C \uC81C\uAC70\n\n makeHTML(simpleBootFront: SimpleBootFront) {\n (simpleBootFront.option.window as any).document.querySelectorAll('*').forEach((el:HTMLElement )=> {\n Array.from(el.attributes).forEach(attr => {\n if (/^dr-/.test(attr.name) || /^domstyle/.test(attr.name) || /this-path/.test(attr.name)) {\n el.removeAttribute(attr.name);\n }\n });\n });\n let html = simpleBootFront.option.window.document.documentElement.outerHTML;\n html = '<!DOCTYPE html>' + html;\n html = html.replace(/\\$\\{[\\s\\S]*?\\}\\$/g, '');\n const serverSideData = (simpleBootFront.option.window as any).server_side_data;\n if (serverSideData) {\n const data = Object.entries(serverSideData)\n .map(([k, v]) => {\n if (typeof v === 'string') {\n return `window.server_side_data.${k} = ${v}`;\n } else {\n return `window.server_side_data.${k} = ${JSON.stringify(v)}`;\n }\n })\n .join(';');\n if (data) {\n html = html.replace('</head>', `<script> window.server_side_data={}; ${data}; </script></head>`);\n }\n }\n return html;\n }\n async writeOkHtmlAndEnd({ rr, status = HttpStatus.Ok }: { rr: RequestResponse; status?: HttpStatus }, html: string) {\n // rr.res.writeHead(status, {[HttpHeaders.ContentType]: Mimes.TextHtml});\n rr.resStatusCode(status);\n rr.resSetHeader(HttpHeaders.ContentType, Mimes.TextHtml);\n await rr.resEnd(html);\n }\n\n async proceedAfter({ rr, app }: { rr: RequestResponse; app: SimpleBootHttpServer; carrier: Map<string, any> }) {\n // console.log('done--------', sw)\n return true;\n }\n}\n"],
|
|
5
|
+
"mappings": "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",
|
|
6
|
+
"names": []
|
|
7
|
+
}
|
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
import { ConstructorType } from '@dooboostore/core/types';
|
|
2
|
+
import { FactoryAndParams } from './SSRFilter';
|
|
3
|
+
import JSDOM from 'jsdom';
|
|
4
|
+
import { SimpleBootFront } from '@dooboostore/simple-boot-front/SimpleBootFront';
|
|
5
|
+
export declare class SSRWorker {
|
|
6
|
+
factory: FactoryAndParams;
|
|
7
|
+
otherInstanceSim?: Map<ConstructorType<any>, any>;
|
|
8
|
+
welcomUrl: string;
|
|
9
|
+
private simpleBootFront?;
|
|
10
|
+
constructor(factory: FactoryAndParams, otherInstanceSim?: Map<ConstructorType<any>, any>);
|
|
11
|
+
run(): Promise<void>;
|
|
12
|
+
makeJsdom(): Promise<JSDOM.JSDOM>;
|
|
13
|
+
makeFront(jsdom?: JSDOM.JSDOM): Promise<SimpleBootFront>;
|
|
14
|
+
getHtml(url: string): Promise<string>;
|
|
15
|
+
}
|
|
16
|
+
//# sourceMappingURL=SSRWorker.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"SSRWorker.d.ts","sourceRoot":"","sources":["../../../src/filters/SSRWorker.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,eAAe,EAAE,MAAM,yBAAyB,CAAC;AAC1D,OAAO,EAAC,gBAAgB,EAAC,MAAM,aAAa,CAAC;AAE7C,OAAO,KAAK,MAAM,OAAO,CAAC;AAE1B,OAAO,EAAC,eAAe,EAAC,MAAM,gDAAgD,CAAC;AAE/E,qBAAa,SAAS;IAIC,OAAO,EAAE,gBAAgB;IAAS,gBAAgB,CAAC,EAAE,GAAG,CAAC,eAAe,CAAC,GAAG,CAAC,EAAE,GAAG,CAAC;IAH/F,SAAS,SAAqB;IACrC,OAAO,CAAC,eAAe,CAAC,CAAkB;gBAEvB,OAAO,EAAE,gBAAgB,EAAS,gBAAgB,CAAC,EAAE,GAAG,CAAC,eAAe,CAAC,GAAG,CAAC,EAAE,GAAG,CAAC;IAIhG,GAAG;IAIH,SAAS;IAKT,SAAS,CAAC,KAAK,CAAC,EAAE,KAAK,CAAC,KAAK;IAiB7B,OAAO,CAAC,GAAG,EAAE,MAAM;CAkC5B"}
|
|
@@ -0,0 +1,62 @@
|
|
|
1
|
+
import { JsdomInitializer } from "../initializers/JsdomInitializer.js";
|
|
2
|
+
import { RandomUtils } from "@dooboostore/core/random/RandomUtils";
|
|
3
|
+
class SSRWorker {
|
|
4
|
+
constructor(factory, otherInstanceSim) {
|
|
5
|
+
this.factory = factory;
|
|
6
|
+
this.otherInstanceSim = otherInstanceSim;
|
|
7
|
+
}
|
|
8
|
+
welcomUrl = "http://localhost";
|
|
9
|
+
simpleBootFront;
|
|
10
|
+
async run() {
|
|
11
|
+
this.simpleBootFront = await this.makeFront();
|
|
12
|
+
}
|
|
13
|
+
async makeJsdom() {
|
|
14
|
+
const jsdom = await new JsdomInitializer(this.factory.frontDistPath, this.factory.frontDistIndexFileName || "index.html", { url: this.welcomUrl }).run();
|
|
15
|
+
return jsdom;
|
|
16
|
+
}
|
|
17
|
+
async makeFront(jsdom) {
|
|
18
|
+
if (!jsdom) {
|
|
19
|
+
jsdom = await this.makeJsdom();
|
|
20
|
+
}
|
|
21
|
+
const name = RandomUtils.uuid();
|
|
22
|
+
const window = jsdom.window;
|
|
23
|
+
window.ssrUse = false;
|
|
24
|
+
const option = this.factory.factorySimFrontOption(window);
|
|
25
|
+
const simpleBootFront = await this.factory.factory.create(option, this.factory.using, this.factory.domExcludes);
|
|
26
|
+
simpleBootFront.run(this.otherInstanceSim);
|
|
27
|
+
simpleBootFront.jsdom = jsdom;
|
|
28
|
+
return simpleBootFront;
|
|
29
|
+
}
|
|
30
|
+
async getHtml(url) {
|
|
31
|
+
if (this.simpleBootFront && this.simpleBootFront.option.window.ssrUse) {
|
|
32
|
+
} else if (this.simpleBootFront) {
|
|
33
|
+
this.simpleBootFront.option.window.ssrUse = true;
|
|
34
|
+
delete this.simpleBootFront.option.window.server_side_data;
|
|
35
|
+
await this.simpleBootFront.goRouting(url);
|
|
36
|
+
let html = this.simpleBootFront.option.window.document.documentElement.outerHTML;
|
|
37
|
+
const serverSideData = this.simpleBootFront.option.window.server_side_data;
|
|
38
|
+
if (serverSideData) {
|
|
39
|
+
const data = Object.entries(serverSideData).map(([k, v]) => {
|
|
40
|
+
if (typeof v === "string") {
|
|
41
|
+
return `window.server_side_data.${k} = ${v}`;
|
|
42
|
+
} else {
|
|
43
|
+
return `window.server_side_data.${k} = ${JSON.stringify(v)}`;
|
|
44
|
+
}
|
|
45
|
+
}).join(";");
|
|
46
|
+
if (data) {
|
|
47
|
+
html = html.replace("</head>", `<script> window.server_side_data={}; ${data}; </script></head>`);
|
|
48
|
+
}
|
|
49
|
+
}
|
|
50
|
+
this.makeFront().then((it) => {
|
|
51
|
+
this.simpleBootFront = it;
|
|
52
|
+
});
|
|
53
|
+
return html;
|
|
54
|
+
}
|
|
55
|
+
{
|
|
56
|
+
}
|
|
57
|
+
}
|
|
58
|
+
}
|
|
59
|
+
export {
|
|
60
|
+
SSRWorker
|
|
61
|
+
};
|
|
62
|
+
//# sourceMappingURL=SSRWorker.js.map
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
{
|
|
2
|
+
"version": 3,
|
|
3
|
+
"sources": ["../../../src/filters/SSRWorker.ts"],
|
|
4
|
+
"sourcesContent": ["import { ConstructorType } from '@dooboostore/core/types';\nimport {FactoryAndParams} from './SSRFilter';\nimport {JsdomInitializer} from '../initializers/JsdomInitializer';\nimport JSDOM from 'jsdom';\nimport {RandomUtils} from '@dooboostore/core/random/RandomUtils';\nimport {SimpleBootFront} from '@dooboostore/simple-boot-front/SimpleBootFront';\n\nexport class SSRWorker {\n public welcomUrl = 'http://localhost'\n private simpleBootFront?: SimpleBootFront;\n\n constructor(public factory: FactoryAndParams, public otherInstanceSim?: Map<ConstructorType<any>, any>) {\n\n }\n\n async run() {\n this.simpleBootFront = await this.makeFront();\n }\n\n async makeJsdom() {\n const jsdom = await new JsdomInitializer(this.factory.frontDistPath, this.factory.frontDistIndexFileName || 'index.html', {url: this.welcomUrl}).run();\n return jsdom;\n }\n\n async makeFront(jsdom?: JSDOM.JSDOM) {\n if (!jsdom) {\n jsdom = await this.makeJsdom();\n }\n const name = RandomUtils.uuid();\n // const jsdom = await this.makeJsdom();\n const window = jsdom.window as unknown as Window & typeof globalThis;\n (window as any).ssrUse = false;\n const option = this.factory.factorySimFrontOption(window);\n // option.name = name;\n const simpleBootFront = await this.factory.factory.create(option, this.factory.using, this.factory.domExcludes);\n simpleBootFront.run(this.otherInstanceSim);\n (simpleBootFront as any).jsdom = jsdom;\n return simpleBootFront;\n }\n\n\n async getHtml(url: string) {\n if (this.simpleBootFront && (this.simpleBootFront.option.window as any).ssrUse) {\n\n } else if (this.simpleBootFront) {\n (this.simpleBootFront.option.window as any).ssrUse = true;\n delete (this.simpleBootFront.option.window as any).server_side_data;\n\n // run\n await this.simpleBootFront.goRouting(url);\n let html = this.simpleBootFront.option.window.document.documentElement.outerHTML;\n\n const serverSideData = (this.simpleBootFront.option.window as any).server_side_data;\n if (serverSideData) {\n const data = Object.entries(serverSideData).map(([k, v]) => {\n if (typeof v === 'string') {\n return `window.server_side_data.${k} = ${v}`;\n } else {\n return `window.server_side_data.${k} = ${JSON.stringify(v)}`;\n }\n }).join(';');\n if (data) {\n html = html.replace('</head>', `<script> window.server_side_data={}; ${data}; </script></head>`);\n }\n }\n\n this.makeFront().then(it => {\n this.simpleBootFront = it;\n });\n return html;\n } {\n\n }\n\n }\n}"],
|
|
5
|
+
"mappings": "AAEA,SAAQ,wBAAuB;AAE/B,SAAQ,mBAAkB;AAGnB,MAAM,UAAU;AAAA,EAInB,YAAmB,SAAkC,kBAAmD;AAArF;AAAkC;AAAA,EAErD;AAAA,EALO,YAAY;AAAA,EACX;AAAA,EAMR,MAAM,MAAM;AACR,SAAK,kBAAkB,MAAM,KAAK,UAAU;AAAA,EAChD;AAAA,EAEA,MAAM,YAAY;AACd,UAAM,QAAQ,MAAM,IAAI,iBAAiB,KAAK,QAAQ,eAAe,KAAK,QAAQ,0BAA0B,cAAc,EAAC,KAAK,KAAK,UAAS,CAAC,EAAE,IAAI;AACrJ,WAAO;AAAA,EACX;AAAA,EAEA,MAAM,UAAU,OAAqB;AACjC,QAAI,CAAC,OAAO;AACR,cAAQ,MAAM,KAAK,UAAU;AAAA,IACjC;AACA,UAAM,OAAO,YAAY,KAAK;AAE9B,UAAM,SAAS,MAAM;AACrB,IAAC,OAAe,SAAS;AACzB,UAAM,SAAS,KAAK,QAAQ,sBAAsB,MAAM;AAExD,UAAM,kBAAkB,MAAM,KAAK,QAAQ,QAAQ,OAAO,QAAQ,KAAK,QAAQ,OAAO,KAAK,QAAQ,WAAW;AAC9G,oBAAgB,IAAI,KAAK,gBAAgB;AACzC,IAAC,gBAAwB,QAAQ;AACjC,WAAO;AAAA,EACX;AAAA,EAGA,MAAM,QAAQ,KAAa;AACvB,QAAI,KAAK,mBAAoB,KAAK,gBAAgB,OAAO,OAAe,QAAQ;AAAA,IAEhF,WAAW,KAAK,iBAAiB;AAC7B,MAAC,KAAK,gBAAgB,OAAO,OAAe,SAAS;AACrD,aAAQ,KAAK,gBAAgB,OAAO,OAAe;AAGnD,YAAM,KAAK,gBAAgB,UAAU,GAAG;AACxC,UAAI,OAAO,KAAK,gBAAgB,OAAO,OAAO,SAAS,gBAAgB;AAEvE,YAAM,iBAAkB,KAAK,gBAAgB,OAAO,OAAe;AACnE,UAAI,gBAAgB;AAChB,cAAM,OAAO,OAAO,QAAQ,cAAc,EAAE,IAAI,CAAC,CAAC,GAAG,CAAC,MAAM;AACxD,cAAI,OAAO,MAAM,UAAU;AACvB,mBAAO,2BAA2B,CAAC,MAAM,CAAC;AAAA,UAC9C,OAAO;AACH,mBAAO,2BAA2B,CAAC,MAAM,KAAK,UAAU,CAAC,CAAC;AAAA,UAC9D;AAAA,QACJ,CAAC,EAAE,KAAK,GAAG;AACX,YAAI,MAAM;AACN,iBAAO,KAAK,QAAQ,WAAW,wCAAwC,IAAI,oBAAoB;AAAA,QACnG;AAAA,MACJ;AAEA,WAAK,UAAU,EAAE,KAAK,QAAM;AACxB,aAAK,kBAAkB;AAAA,MAC3B,CAAC;AACD,aAAO;AAAA,IACX;AAAE;AAAA,IAEF;AAAA,EAEJ;AACJ;",
|
|
6
|
+
"names": []
|
|
7
|
+
}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/filters/index.ts"],"names":[],"mappings":"AAAA,cAAc,sBAAsB,CAAC;AACrC,cAAc,aAAa,CAAC;AAC5B,cAAc,aAAa,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/index.ts"],"names":[],"mappings":";AAQA,wBAEC"}
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
{
|
|
2
|
+
"version": 3,
|
|
3
|
+
"sources": ["../../src/index.ts"],
|
|
4
|
+
"sourcesContent": ["// export * from './SimpleBootHttpSSRFactory';\n// export * from './SimpleBootHttpSSRServer';\n// export * from './codes';\n// export * from './decorators';\n// export * from './filters';\n// export * from './initializers';\n// export * from './option';\n// export * from './proxy';\nexport default {\n\n}"],
|
|
5
|
+
"mappings": "AAQA,IAAO,cAAQ,CAEf;",
|
|
6
|
+
"names": []
|
|
7
|
+
}
|
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
import * as JSDOM from 'jsdom';
|
|
2
|
+
import { ReconfigureSettings } from 'jsdom';
|
|
3
|
+
export declare class JsdomInitializer {
|
|
4
|
+
private frontDistPath;
|
|
5
|
+
private frontDistIndexFileName;
|
|
6
|
+
private reconfigureSettings?;
|
|
7
|
+
constructor(frontDistPath: string, frontDistIndexFileName: string, reconfigureSettings?: ReconfigureSettings);
|
|
8
|
+
static loadFile(distPath: string, filePath: string): string;
|
|
9
|
+
run(): Promise<JSDOM.JSDOM>;
|
|
10
|
+
}
|
|
11
|
+
//# sourceMappingURL=JsdomInitializer.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"JsdomInitializer.d.ts","sourceRoot":"","sources":["../../../src/initializers/JsdomInitializer.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,KAAK,MAAM,OAAO,CAAC;AAC/B,OAAO,EAAE,mBAAmB,EAAE,MAAM,OAAO,CAAC;AAI5C,qBAAa,gBAAgB;IAEzB,OAAO,CAAC,aAAa;IACrB,OAAO,CAAC,sBAAsB;IAC9B,OAAO,CAAC,mBAAmB,CAAC;gBAFpB,aAAa,EAAE,MAAM,EACrB,sBAAsB,EAAE,MAAM,EAC9B,mBAAmB,CAAC,EAAE,mBAAmB;WAGrC,QAAQ,CAAC,QAAQ,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,GAAG,MAAM;IAI5D,GAAG,IAAI,OAAO,CAAC,KAAK,CAAC,KAAK,CAAC;CAiElC"}
|
|
@@ -0,0 +1,49 @@
|
|
|
1
|
+
import * as JSDOM from "jsdom";
|
|
2
|
+
import fs from "fs";
|
|
3
|
+
import path from "path";
|
|
4
|
+
class JsdomInitializer {
|
|
5
|
+
constructor(frontDistPath, frontDistIndexFileName, reconfigureSettings) {
|
|
6
|
+
this.frontDistPath = frontDistPath;
|
|
7
|
+
this.frontDistIndexFileName = frontDistIndexFileName;
|
|
8
|
+
this.reconfigureSettings = reconfigureSettings;
|
|
9
|
+
}
|
|
10
|
+
static loadFile(distPath, filePath) {
|
|
11
|
+
return fs.readFileSync(path.join(distPath, filePath), "utf8");
|
|
12
|
+
}
|
|
13
|
+
async run() {
|
|
14
|
+
const pathStr = path.join(this.frontDistPath, this.frontDistIndexFileName);
|
|
15
|
+
const jsdom = await JSDOM.JSDOM.fromFile(pathStr, {});
|
|
16
|
+
if (this.reconfigureSettings) {
|
|
17
|
+
jsdom.reconfigure(this.reconfigureSettings);
|
|
18
|
+
}
|
|
19
|
+
global.document = jsdom.window.document;
|
|
20
|
+
global.window = jsdom.window;
|
|
21
|
+
global.window.requestAnimationFrame = () => {
|
|
22
|
+
};
|
|
23
|
+
global.window.scrollTo = () => {
|
|
24
|
+
};
|
|
25
|
+
global.history = jsdom.window.history;
|
|
26
|
+
global.Event = jsdom.window.Event;
|
|
27
|
+
global.PopStateEvent = jsdom.window.Event;
|
|
28
|
+
global.IntersectionObserver = jsdom.window.IntersectionObserver;
|
|
29
|
+
global.NodeFilter = jsdom.window.NodeFilter;
|
|
30
|
+
global.Node = jsdom.window.Node;
|
|
31
|
+
global.HTMLElement = jsdom.window.HTMLElement;
|
|
32
|
+
global.HTMLMetaElement = jsdom.window.HTMLMetaElement;
|
|
33
|
+
global.Element = jsdom.window.Element;
|
|
34
|
+
global.HTMLCanvasElement = jsdom.window.HTMLCanvasElement;
|
|
35
|
+
global.HTMLCanvasElement.prototype.getContext = () => {
|
|
36
|
+
return null;
|
|
37
|
+
};
|
|
38
|
+
global.CanvasRenderingContext2D = jsdom.window.CanvasRenderingContext2D;
|
|
39
|
+
global.CanvasPattern = jsdom.window.CanvasPattern;
|
|
40
|
+
global.CanvasGradient = jsdom.window.CanvasGradient;
|
|
41
|
+
global.Path2D = jsdom.window.Path2D;
|
|
42
|
+
global.ImageData = jsdom.window.ImageData;
|
|
43
|
+
return jsdom;
|
|
44
|
+
}
|
|
45
|
+
}
|
|
46
|
+
export {
|
|
47
|
+
JsdomInitializer
|
|
48
|
+
};
|
|
49
|
+
//# sourceMappingURL=JsdomInitializer.js.map
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
{
|
|
2
|
+
"version": 3,
|
|
3
|
+
"sources": ["../../../src/initializers/JsdomInitializer.ts"],
|
|
4
|
+
"sourcesContent": ["import * as JSDOM from 'jsdom';\nimport { ReconfigureSettings } from 'jsdom';\nimport fs from 'fs';\nimport path from 'path';\n\nexport class JsdomInitializer {\n constructor(\n private frontDistPath: string,\n private frontDistIndexFileName: string,\n private reconfigureSettings?: ReconfigureSettings\n ) {}\n\n public static loadFile(distPath: string, filePath: string): string {\n return fs.readFileSync(path.join(distPath, filePath), 'utf8');\n }\n\n async run(): Promise<JSDOM.JSDOM> {\n // const indexHTML = fs.readFileSync(path.join(this.frontDistPath, 'index.html'), 'utf8');\n // const indexHTML = JsdomInitializer.loadFile(this.frontDistPath, this.frontDistIndexFileName);\n const pathStr = path.join(this.frontDistPath, this.frontDistIndexFileName);\n\n const jsdom = await JSDOM.JSDOM.fromFile(pathStr, {});\n if (this.reconfigureSettings) {\n jsdom.reconfigure(this.reconfigureSettings);\n }\n // devDependencies\n // \"@types/jsdom\": \"^21.1.2\",\n // \"canvas\": \"^3.1.0\",\n // global setting\n // @ts-ignore\n global.document = jsdom.window.document;\n // @ts-ignore\n global.window = jsdom.window as unknown as Window & typeof globalThis;\n // @ts-ignore\n global.window.requestAnimationFrame = () => {};\n global.window.scrollTo = () => {};\n // const originalPushState = global.window.history.pushState;\n // global.window.history.pushState = (data: any,title: any,path: string) => {\n // console.log('----iida',path)\n // path.replace()\n //\n // let s = `${UrlUtils.origin(global.window.location.href)}${path?`${path}`:''}`;\n // console.log('----da',s)\n // originalPushState.apply(global.window.history, [data, title, s]);\n // }\n // const originalReplaceState = global.window.history.replaceState;\n // global.window.history.replaceState = (data: any,title: any,path: string) => {\n // let s = `${UrlUtils.origin(global.window.location.href)}${path?`${path}`:''}`;\n // originalReplaceState.apply(global.window.history, [data, title, s]);\n // }\n // const dummyResponse = {ok: false, json: () => Promise.resolve({})}; // as Response;\n // global.fetch = (...data: any): Promise<any> => {\n // console.log('dummy fetch')\n // return Promise.resolve(dummyResponse)\n // };\n // @ts-ignore\n global.history = jsdom.window.history;\n global.Event = jsdom.window.Event;\n // @ts-ignore\n global.PopStateEvent = jsdom.window.Event;\n global.IntersectionObserver = jsdom.window.IntersectionObserver;\n // @ts-ignore\n // global.Error = ErrorBase;\n // @ts-ignore\n // global.navigator = jsdom.window.navigator;\n global.NodeFilter = jsdom.window.NodeFilter;\n global.Node = jsdom.window.Node;\n global.HTMLElement = jsdom.window.HTMLElement;\n global.HTMLMetaElement = jsdom.window.HTMLMetaElement;\n global.Element = jsdom.window.Element;\n global.HTMLCanvasElement = jsdom.window.HTMLCanvasElement;\n global.HTMLCanvasElement.prototype.getContext = () => {\n return null;\n };\n global.CanvasRenderingContext2D = jsdom.window.CanvasRenderingContext2D;\n global.CanvasPattern = jsdom.window.CanvasPattern;\n global.CanvasGradient = jsdom.window.CanvasGradient;\n global.Path2D = jsdom.window.Path2D;\n global.ImageData = jsdom.window.ImageData;\n return jsdom;\n }\n}\n//\n// export default new JsdomInitializer();\n"],
|
|
5
|
+
"mappings": "AAAA,YAAY,WAAW;AAEvB,OAAO,QAAQ;AACf,OAAO,UAAU;AAEV,MAAM,iBAAiB;AAAA,EAC5B,YACU,eACA,wBACA,qBACR;AAHQ;AACA;AACA;AAAA,EACP;AAAA,EAEH,OAAc,SAAS,UAAkB,UAA0B;AACjE,WAAO,GAAG,aAAa,KAAK,KAAK,UAAU,QAAQ,GAAG,MAAM;AAAA,EAC9D;AAAA,EAEA,MAAM,MAA4B;AAGhC,UAAM,UAAU,KAAK,KAAK,KAAK,eAAe,KAAK,sBAAsB;AAEzE,UAAM,QAAQ,MAAM,MAAM,MAAM,SAAS,SAAS,CAAC,CAAC;AACpD,QAAI,KAAK,qBAAqB;AAC5B,YAAM,YAAY,KAAK,mBAAmB;AAAA,IAC5C;AAMA,WAAO,WAAW,MAAM,OAAO;AAE/B,WAAO,SAAS,MAAM;AAEtB,WAAO,OAAO,wBAAwB,MAAM;AAAA,IAAC;AAC7C,WAAO,OAAO,WAAW,MAAM;AAAA,IAAC;AAqBhC,WAAO,UAAU,MAAM,OAAO;AAC9B,WAAO,QAAQ,MAAM,OAAO;AAE5B,WAAO,gBAAgB,MAAM,OAAO;AACpC,WAAO,uBAAuB,MAAM,OAAO;AAK3C,WAAO,aAAa,MAAM,OAAO;AACjC,WAAO,OAAO,MAAM,OAAO;AAC3B,WAAO,cAAc,MAAM,OAAO;AAClC,WAAO,kBAAkB,MAAM,OAAO;AACtC,WAAO,UAAU,MAAM,OAAO;AAC9B,WAAO,oBAAoB,MAAM,OAAO;AACxC,WAAO,kBAAkB,UAAU,aAAa,MAAM;AACpD,aAAO;AAAA,IACT;AACA,WAAO,2BAA2B,MAAM,OAAO;AAC/C,WAAO,gBAAgB,MAAM,OAAO;AACpC,WAAO,iBAAiB,MAAM,OAAO;AACrC,WAAO,SAAS,MAAM,OAAO;AAC7B,WAAO,YAAY,MAAM,OAAO;AAChC,WAAO;AAAA,EACT;AACF;",
|
|
6
|
+
"names": []
|
|
7
|
+
}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/initializers/index.ts"],"names":[],"mappings":"AAAA,cAAc,oBAAoB,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"HttpSSRServerOption.d.ts","sourceRoot":"","sources":["../../../src/option/HttpSSRServerOption.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,gBAAgB,EAAE,MAAM,8DAA8D,CAAC;AAEhG,qBAAa,mBAAoB,SAAQ,gBAAgB;CACxD"}
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
{
|
|
2
|
+
"version": 3,
|
|
3
|
+
"sources": ["../../../src/option/HttpSSRServerOption.ts"],
|
|
4
|
+
"sourcesContent": ["import { HttpServerOption } from '@dooboostore/simple-boot-http-server/option/HttpServerOption';\n\nexport class HttpSSRServerOption extends HttpServerOption {\n}\n"],
|
|
5
|
+
"mappings": "AAAA,SAAS,wBAAwB;AAE1B,MAAM,4BAA4B,iBAAiB;AAC1D;",
|
|
6
|
+
"names": []
|
|
7
|
+
}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/option/index.ts"],"names":[],"mappings":"AAAA,cAAc,uBAAuB,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"IntentSchemeFrontProxy.d.ts","sourceRoot":"","sources":["../../../src/proxy/IntentSchemeFrontProxy.ts"],"names":[],"mappings":"AAOA,qBACa,sBAAuB,YAAW,YAAY,CAAC,GAAG,CAAC;IACvD,GAAG,CAAC,MAAM,EAAE,GAAG,EAAE,IAAI,EAAE,MAAM,GAAG,GAAG;CAyD3C"}
|
|
@@ -0,0 +1,64 @@
|
|
|
1
|
+
var __decorate = function(decorators, target, key, desc) {
|
|
2
|
+
var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;
|
|
3
|
+
if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc);
|
|
4
|
+
else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;
|
|
5
|
+
return c > 3 && r && Object.defineProperty(target, key, r), r;
|
|
6
|
+
};
|
|
7
|
+
import { getSim, Sim } from "@dooboostore/simple-boot/decorators/SimDecorator";
|
|
8
|
+
import { HttpHeaders } from "@dooboostore/simple-boot-http-server/codes/HttpHeaders";
|
|
9
|
+
import { HttpHeaders as SSRHttpHeaders } from "../codes/HttpHeaders.js";
|
|
10
|
+
import { Mimes as SSRMimes } from "../codes/Mimes.js";
|
|
11
|
+
import { ReflectUtils } from "@dooboostore/core/reflect/ReflectUtils";
|
|
12
|
+
import { ConvertUtils } from "@dooboostore/core/convert/ConvertUtils";
|
|
13
|
+
let IntentSchemeFrontProxy = class IntentSchemeFrontProxy2 {
|
|
14
|
+
get(target, prop) {
|
|
15
|
+
const t = target[prop];
|
|
16
|
+
if (!["constructor", "onProxyDomRender", "toString"].includes(prop)) {
|
|
17
|
+
return (...args) => {
|
|
18
|
+
const simOption = target._SimpleBoot_simOption;
|
|
19
|
+
const config = getSim(target);
|
|
20
|
+
const firstScheme = ConvertUtils.flatArray(config?.scheme)[0];
|
|
21
|
+
const key = firstScheme + "_" + prop;
|
|
22
|
+
const type = ReflectUtils.getReturnType(target, prop);
|
|
23
|
+
const isHas = key in (simOption.window.server_side_data ?? {});
|
|
24
|
+
if (isHas) {
|
|
25
|
+
const data = simOption.window.server_side_data?.[key];
|
|
26
|
+
delete simOption.window.server_side_data?.[key];
|
|
27
|
+
let rdata;
|
|
28
|
+
if (type instanceof Promise) {
|
|
29
|
+
rdata = Promise.resolve(data);
|
|
30
|
+
} else {
|
|
31
|
+
rdata = data;
|
|
32
|
+
}
|
|
33
|
+
return rdata;
|
|
34
|
+
} else {
|
|
35
|
+
return fetch(`/${prop.toString()}`, {
|
|
36
|
+
method: "POST",
|
|
37
|
+
headers: { [HttpHeaders.ContentType]: SSRMimes.ApplicationJsonPostSimpleBootSsrIntentScheme, [SSRHttpHeaders.XSimpleBootSsrIntentScheme]: firstScheme ?? "" },
|
|
38
|
+
body: JSON.stringify(args[0])
|
|
39
|
+
}).then(async (res) => {
|
|
40
|
+
try {
|
|
41
|
+
const data = await res.json();
|
|
42
|
+
return data;
|
|
43
|
+
} catch (e) {
|
|
44
|
+
try {
|
|
45
|
+
return await res.text();
|
|
46
|
+
} catch (e2) {
|
|
47
|
+
return void 0;
|
|
48
|
+
}
|
|
49
|
+
}
|
|
50
|
+
});
|
|
51
|
+
}
|
|
52
|
+
};
|
|
53
|
+
} else {
|
|
54
|
+
return t;
|
|
55
|
+
}
|
|
56
|
+
}
|
|
57
|
+
};
|
|
58
|
+
IntentSchemeFrontProxy = __decorate([
|
|
59
|
+
Sim
|
|
60
|
+
], IntentSchemeFrontProxy);
|
|
61
|
+
export {
|
|
62
|
+
IntentSchemeFrontProxy
|
|
63
|
+
};
|
|
64
|
+
//# sourceMappingURL=IntentSchemeFrontProxy.js.map
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
{
|
|
2
|
+
"version": 3,
|
|
3
|
+
"sources": ["../../../src/proxy/IntentSchemeFrontProxy.ts"],
|
|
4
|
+
"sourcesContent": ["import { getSim, Sim } from '@dooboostore/simple-boot/decorators/SimDecorator';\nimport { HttpHeaders } from '@dooboostore/simple-boot-http-server/codes/HttpHeaders';\nimport { HttpHeaders as SSRHttpHeaders } from '../codes/HttpHeaders';\nimport { Mimes as SSRMimes } from '../codes/Mimes';\nimport { ReflectUtils } from '@dooboostore/core/reflect/ReflectUtils';\nimport { ConvertUtils } from '@dooboostore/core/convert/ConvertUtils';\n\n@Sim\nexport class IntentSchemeFrontProxy implements ProxyHandler<any> {\n public get(target: any, prop: string): any {\n const t = target[prop];\n // TODO: 여기에 추가적인 프로퍼티 작성으 추가적으로 해야된다..\n // if (typeof t === 'function') {\n if (!['constructor', 'onProxyDomRender', 'toString'].includes(prop)) {\n return (...args: any[]) => {\n // const simstanceManager = target._SimpleBoot_simstanceManager;\n const simOption = target._SimpleBoot_simOption;\n const config = getSim(target);\n // const scheme = getSim(target)?.scheme;\n const firstScheme = ConvertUtils.flatArray(config?.scheme)[0];\n const key = firstScheme + '_' + prop;\n const type = ReflectUtils.getReturnType(target, prop);\n const isHas = (key in (simOption.window.server_side_data ?? {}));\n if (isHas) {\n const data = simOption.window.server_side_data?.[key];\n delete simOption.window.server_side_data?.[key];\n let rdata;\n if (type instanceof Promise) {\n rdata = Promise.resolve(data);\n } else {\n rdata = data;\n }\n return rdata;\n } else {\n return fetch(`/${prop.toString()}`,\n {\n method: 'POST',\n headers: {[HttpHeaders.ContentType]: SSRMimes.ApplicationJsonPostSimpleBootSsrIntentScheme, [SSRHttpHeaders.XSimpleBootSsrIntentScheme]: firstScheme ?? ''},\n body: JSON.stringify(args[0])\n }\n ).then(async (res) => {\n try {\n const data = await res.json();\n return data;\n } catch(e) {\n try {\n return await res.text();\n } catch(e) {\n return undefined;\n }\n }\n });\n }\n // return t.apply(target, args);\n }\n } else {\n return t;\n }\n }\n\n\n // apply(target: Function, thisArg: any, ...argumentsList: any[]): any {\n // console.log('-IntentSchemeFrontProxyHandler----?????')\n // return target(...argumentsList);\n // }\n\n}\n"],
|
|
5
|
+
"mappings": ";;;;;;AAAA,SAAS,QAAQ,WAAW;AAC5B,SAAS,mBAAmB;AAC5B,SAAS,eAAe,sBAAsB;AAC9C,SAAS,SAAS,gBAAgB;AAClC,SAAS,oBAAoB;AAC7B,SAAS,oBAAoB;AAGtB,IAAM,yBAAN,MAAMA,wBAAsB;EAC1B,IAAI,QAAa,MAAY;AAClC,UAAM,IAAI,OAAO,IAAI;AAGrB,QAAI,CAAC,CAAC,eAAe,oBAAoB,UAAU,EAAE,SAAS,IAAI,GAAG;AACnE,aAAO,IAAI,SAAe;AAExB,cAAM,YAAY,OAAO;AACzB,cAAM,SAAS,OAAO,MAAM;AAE5B,cAAM,cAAc,aAAa,UAAU,QAAQ,MAAM,EAAE,CAAC;AAC5D,cAAM,MAAM,cAAc,MAAM;AAChC,cAAM,OAAO,aAAa,cAAc,QAAQ,IAAI;AACpD,cAAM,QAAS,QAAQ,UAAU,OAAO,oBAAoB,CAAA;AAC5D,YAAI,OAAO;AACP,gBAAM,OAAO,UAAU,OAAO,mBAAmB,GAAG;AACpD,iBAAO,UAAU,OAAO,mBAAmB,GAAG;AAC9C,cAAI;AACJ,cAAI,gBAAgB,SAAS;AAC3B,oBAAQ,QAAQ,QAAQ,IAAI;UAC9B,OAAO;AACL,oBAAQ;UACV;AACA,iBAAO;QACX,OAAO;AACN,iBAAO,MAAM,IAAI,KAAK,SAAQ,CAAE,IAC7B;YACE,QAAQ;YACR,SAAS,EAAC,CAAC,YAAY,WAAW,GAAG,SAAS,8CAA8C,CAAC,eAAe,0BAA0B,GAAG,eAAe,GAAE;YAC1J,MAAM,KAAK,UAAU,KAAK,CAAC,CAAC;WAC7B,EACD,KAAK,OAAO,QAAO;AACpB,gBAAI;AACF,oBAAM,OAAO,MAAM,IAAI,KAAI;AAC3B,qBAAO;YACT,SAAQ,GAAG;AACT,kBAAI;AACF,uBAAO,MAAM,IAAI,KAAI;cACvB,SAAQC,IAAG;AACT,uBAAO;cACT;YACF;UACD,CAAC;QACH;MAEF;IACF,OAAO;AACL,aAAO;IACT;EACF;;AAlDW,yBAAsB,WAAA;EADlC;GACY,sBAAsB;",
|
|
6
|
+
"names": ["IntentSchemeFrontProxy", "e"]
|
|
7
|
+
}
|