@dooboostore/simple-boot-http-server-ssr 1.0.11 → 1.0.12
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/README.MD +24 -209
- package/dist/cjs/bundle-entry.js +36 -0
- package/dist/cjs/bundle-entry.js.map +7 -0
- package/dist/cjs/codes/HttpHeaders.js.map +2 -2
- package/dist/cjs/filters/SSRFilter.js +4 -6
- package/dist/cjs/filters/SSRFilter.js.map +2 -2
- package/dist/cjs/filters/SSRWorker.js +1 -2
- package/dist/cjs/filters/SSRWorker.js.map +1 -1
- package/dist/cjs/index.js.map +2 -2
- package/dist/cjs/initializers/JsdomInitializer.js +1 -0
- package/dist/cjs/initializers/JsdomInitializer.js.map +2 -2
- package/dist/cjs/package.json +2 -0
- package/dist/cjs/proxy/SymbolIntentApiServiceProxy.js +17 -2
- package/dist/cjs/proxy/SymbolIntentApiServiceProxy.js.map +3 -3
- package/dist/esm/bundle-entry.js +9 -0
- package/dist/esm/bundle-entry.js.map +7 -0
- package/dist/esm/codes/HttpHeaders.js.map +2 -2
- package/dist/esm/filters/SSRFilter.js +4 -6
- package/dist/esm/filters/SSRFilter.js.map +2 -2
- package/dist/esm/filters/SSRWorker.js +1 -2
- package/dist/esm/filters/SSRWorker.js.map +1 -1
- package/dist/esm/index.js.map +2 -2
- package/dist/esm/initializers/JsdomInitializer.js +1 -0
- package/dist/esm/initializers/JsdomInitializer.js.map +2 -2
- package/dist/esm/proxy/SymbolIntentApiServiceProxy.js +18 -3
- package/dist/esm/proxy/SymbolIntentApiServiceProxy.js.map +3 -3
- package/dist/esm-bundle/dooboostore-simple-boot-http-server-ssr.esm.js +11372 -3
- package/dist/esm-bundle/dooboostore-simple-boot-http-server-ssr.esm.js.map +4 -4
- package/dist/{esm → types}/SimpleBootHttpSSRServer.d.ts +1 -1
- package/dist/types/bundle-entry.d.ts +9 -0
- package/dist/types/bundle-entry.d.ts.map +1 -0
- package/dist/types/codes/HttpHeaders.d.ts +45 -0
- package/dist/types/codes/HttpHeaders.d.ts.map +1 -0
- package/dist/{cjs → types}/filters/SSRFilter.d.ts.map +1 -1
- package/dist/types/index.d.ts +22 -0
- package/dist/{esm → types}/index.d.ts.map +1 -1
- package/dist/{cjs → types}/initializers/JsdomInitializer.d.ts.map +1 -1
- package/dist/{cjs → types}/proxy/SymbolIntentApiServiceProxy.d.ts.map +1 -1
- package/dist/umd-bundle/dooboostore-simple-boot-http-server-ssr.umd.js +11364 -6
- package/dist/umd-bundle/dooboostore-simple-boot-http-server-ssr.umd.js.map +4 -4
- package/package.json +30 -18
- package/src/SimpleBootHttpSSRFactory.ts +11 -0
- package/src/SimpleBootHttpSSRServer.ts +21 -0
- package/src/bundle-entry.ts +8 -0
- package/src/codes/HttpHeaders.ts +17 -0
- package/src/codes/Mimes.ts +6 -0
- package/src/codes/index.ts +2 -0
- package/src/decorators/LoadAroundBefore.ts +28 -0
- package/src/decorators/SaveAroundAfter.ts +27 -0
- package/src/decorators/index.ts +2 -0
- package/src/filters/IntentSchemeFilter.ts +66 -0
- package/src/filters/SSRFilter.ts +339 -0
- package/src/filters/SSRWorker.ts +76 -0
- package/{dist/esm/filters/index.d.ts → src/filters/index.ts} +1 -2
- package/src/index.ts +9 -0
- package/src/initializers/JsdomInitializer.ts +85 -0
- package/src/initializers/index.ts +1 -0
- package/src/option/HttpSSRServerOption.ts +4 -0
- package/src/option/index.ts +1 -0
- package/src/proxy/IntentSchemeFrontProxy.ts +67 -0
- package/src/proxy/IntentSchemeServerProxy.ts +35 -0
- package/src/proxy/SymbolIntentApiServiceProxy.ts +131 -0
- package/src/proxy/SymbolIntentApiServiceProxyBase.ts +97 -0
- package/{dist/esm/proxy/index.d.ts → src/proxy/index.ts} +1 -2
- package/tsconfig.json +24 -0
- package/dist/cjs/SimpleBootHttpSSRServer.d.ts +0 -9
- package/dist/cjs/codes/HttpHeaders.d.ts +0 -45
- package/dist/cjs/codes/HttpHeaders.d.ts.map +0 -1
- package/dist/cjs/index.d.ts +0 -3
- package/dist/cjs/index.d.ts.map +0 -1
- package/dist/esm/SimpleBootHttpSSRFactory.d.ts +0 -8
- package/dist/esm/SimpleBootHttpSSRFactory.d.ts.map +0 -1
- package/dist/esm/SimpleBootHttpSSRServer.d.ts.map +0 -1
- package/dist/esm/codes/HttpHeaders.d.ts +0 -45
- package/dist/esm/codes/HttpHeaders.d.ts.map +0 -1
- package/dist/esm/codes/Mimes.d.ts +0 -31
- package/dist/esm/codes/Mimes.d.ts.map +0 -1
- package/dist/esm/codes/index.d.ts +0 -3
- package/dist/esm/codes/index.d.ts.map +0 -1
- package/dist/esm/decorators/LoadAroundBefore.d.ts +0 -2
- package/dist/esm/decorators/LoadAroundBefore.d.ts.map +0 -1
- package/dist/esm/decorators/SaveAroundAfter.d.ts +0 -3
- package/dist/esm/decorators/SaveAroundAfter.d.ts.map +0 -1
- package/dist/esm/decorators/index.d.ts +0 -3
- package/dist/esm/decorators/index.d.ts.map +0 -1
- package/dist/esm/filters/IntentSchemeFilter.d.ts +0 -20
- package/dist/esm/filters/IntentSchemeFilter.d.ts.map +0 -1
- package/dist/esm/filters/SSRFilter.d.ts +0 -59
- package/dist/esm/filters/SSRFilter.d.ts.map +0 -1
- package/dist/esm/filters/SSRWorker.d.ts +0 -16
- package/dist/esm/filters/SSRWorker.d.ts.map +0 -1
- package/dist/esm/filters/index.d.ts.map +0 -1
- package/dist/esm/index.d.ts +0 -3
- package/dist/esm/initializers/JsdomInitializer.d.ts +0 -11
- package/dist/esm/initializers/JsdomInitializer.d.ts.map +0 -1
- package/dist/esm/initializers/index.d.ts +0 -2
- package/dist/esm/initializers/index.d.ts.map +0 -1
- package/dist/esm/option/HttpSSRServerOption.d.ts +0 -4
- package/dist/esm/option/HttpSSRServerOption.d.ts.map +0 -1
- package/dist/esm/option/index.d.ts +0 -2
- package/dist/esm/option/index.d.ts.map +0 -1
- package/dist/esm/proxy/IntentSchemeFrontProxy.d.ts +0 -4
- package/dist/esm/proxy/IntentSchemeFrontProxy.d.ts.map +0 -1
- package/dist/esm/proxy/IntentSchemeServerProxy.d.ts +0 -4
- package/dist/esm/proxy/IntentSchemeServerProxy.d.ts.map +0 -1
- package/dist/esm/proxy/SymbolIntentApiServiceProxy.d.ts +0 -16
- package/dist/esm/proxy/SymbolIntentApiServiceProxy.d.ts.map +0 -1
- package/dist/esm/proxy/SymbolIntentApiServiceProxyBase.d.ts +0 -13
- package/dist/esm/proxy/SymbolIntentApiServiceProxyBase.d.ts.map +0 -1
- package/dist/esm/proxy/index.d.ts.map +0 -1
- /package/dist/{cjs → types}/SimpleBootHttpSSRFactory.d.ts +0 -0
- /package/dist/{cjs → types}/SimpleBootHttpSSRFactory.d.ts.map +0 -0
- /package/dist/{cjs → types}/SimpleBootHttpSSRServer.d.ts.map +0 -0
- /package/dist/{cjs → types}/codes/Mimes.d.ts +0 -0
- /package/dist/{cjs → types}/codes/Mimes.d.ts.map +0 -0
- /package/dist/{cjs → types}/codes/index.d.ts +0 -0
- /package/dist/{cjs → types}/codes/index.d.ts.map +0 -0
- /package/dist/{cjs → types}/decorators/LoadAroundBefore.d.ts +0 -0
- /package/dist/{cjs → types}/decorators/LoadAroundBefore.d.ts.map +0 -0
- /package/dist/{cjs → types}/decorators/SaveAroundAfter.d.ts +0 -0
- /package/dist/{cjs → types}/decorators/SaveAroundAfter.d.ts.map +0 -0
- /package/dist/{cjs → types}/decorators/index.d.ts +0 -0
- /package/dist/{cjs → types}/decorators/index.d.ts.map +0 -0
- /package/dist/{cjs → types}/filters/IntentSchemeFilter.d.ts +0 -0
- /package/dist/{cjs → types}/filters/IntentSchemeFilter.d.ts.map +0 -0
- /package/dist/{cjs → types}/filters/SSRFilter.d.ts +0 -0
- /package/dist/{cjs → types}/filters/SSRWorker.d.ts +0 -0
- /package/dist/{cjs → types}/filters/SSRWorker.d.ts.map +0 -0
- /package/dist/{cjs → types}/filters/index.d.ts +0 -0
- /package/dist/{cjs → types}/filters/index.d.ts.map +0 -0
- /package/dist/{cjs → types}/initializers/JsdomInitializer.d.ts +0 -0
- /package/dist/{cjs → types}/initializers/index.d.ts +0 -0
- /package/dist/{cjs → types}/initializers/index.d.ts.map +0 -0
- /package/dist/{cjs → types}/option/HttpSSRServerOption.d.ts +0 -0
- /package/dist/{cjs → types}/option/HttpSSRServerOption.d.ts.map +0 -0
- /package/dist/{cjs → types}/option/index.d.ts +0 -0
- /package/dist/{cjs → types}/option/index.d.ts.map +0 -0
- /package/dist/{cjs → types}/proxy/IntentSchemeFrontProxy.d.ts +0 -0
- /package/dist/{cjs → types}/proxy/IntentSchemeFrontProxy.d.ts.map +0 -0
- /package/dist/{cjs → types}/proxy/IntentSchemeServerProxy.d.ts +0 -0
- /package/dist/{cjs → types}/proxy/IntentSchemeServerProxy.d.ts.map +0 -0
- /package/dist/{cjs → types}/proxy/SymbolIntentApiServiceProxy.d.ts +0 -0
- /package/dist/{cjs → types}/proxy/SymbolIntentApiServiceProxyBase.d.ts +0 -0
- /package/dist/{cjs → types}/proxy/SymbolIntentApiServiceProxyBase.d.ts.map +0 -0
- /package/dist/{cjs → types}/proxy/index.d.ts +0 -0
- /package/dist/{cjs → types}/proxy/index.d.ts.map +0 -0
package/README.MD
CHANGED
|
@@ -1,223 +1,38 @@
|
|
|
1
|
-
#
|
|
1
|
+
# @dooboostore/simple-boot-http-server-ssr
|
|
2
2
|
|
|
3
|
-
|
|
3
|
+
[](https://www.npmjs.com/package/@dooboostore/simple-boot-http-server-ssr)
|
|
4
|
+
[](https://github.com/dooboostore-develop/packages/actions/workflows/main.yaml)
|
|
5
|
+
[](https://opensource.org/licenses/MIT)
|
|
4
6
|
|
|
5
|
-
|
|
7
|
+
**Full Documentation:** [https://dooboostore-develop.github.io/packages/simple-boot-http-server-ssr](https://dooboostore-develop.github.io/packages/simple-boot-http-server-ssr)
|
|
6
8
|
|
|
7
|
-
|
|
8
|
-
- **JSDOM Integration**: Uses `jsdom` to create a virtual DOM environment on the server, allowing front-end code to run.
|
|
9
|
-
- **Component Pooling**: Manages a pool of `SimpleBootFront` instances to handle concurrent SSR requests efficiently.
|
|
10
|
-
- **Data Hydration**: Automatically serializes data fetched on the server and hydrates it on the client, avoiding redundant API calls. The `SaveAroundAfter` and `LoadAroundBefore` decorators facilitate this by saving data to `window.server_side_data` on the server and retrieving it on the client.
|
|
11
|
-
- **Unified Codebase**: Enables sharing of routing, services, and components between the server and the client.
|
|
12
|
-
- **Intent-based Communication**: Provides a mechanism for client-server communication using custom HTTP headers and intent publishing, allowing for flexible data fetching and action triggering.
|
|
9
|
+
A framework for building Server-Side Rendered (SSR) applications by seamlessly integrating `@dooboostore/simple-boot-front` and `@dooboostore/simple-boot-http-server`.
|
|
13
10
|
|
|
14
|
-
|
|
11
|
+
---
|
|
15
12
|
|
|
16
|
-
|
|
17
|
-
- **@dooboostore/simple-boot-http-server**: The underlying HTTP server for handling requests.
|
|
13
|
+
## Features
|
|
18
14
|
|
|
19
|
-
|
|
15
|
+
- **Server-Side Rendering**: Renders your single-page application on the server for fast, SEO-friendly websites.
|
|
16
|
+
- **JSDOM Integration**: Uses `jsdom` to create a virtual DOM environment on the server, allowing front-end code to run.
|
|
17
|
+
- **Component Pooling**: Manages a pool of `SimpleBootFront` instances to handle concurrent SSR requests efficiently.
|
|
18
|
+
- **Automatic Data Hydration**: Serializes data fetched on the server and hydrates it on the client to avoid redundant API calls.
|
|
19
|
+
- **Unified Codebase**: Enables sharing of routing, services, and components between the server and the client.
|
|
20
|
+
- **Intent-based Communication**: Provides a mechanism for client-server communication using custom HTTP headers.
|
|
20
21
|
|
|
21
|
-
|
|
22
|
-
npm init @dooboostore/simple-boot-http-server-ssr projectname
|
|
23
|
-
cd projectname
|
|
24
|
-
npm start
|
|
25
|
-
```
|
|
26
|
-
|
|
27
|
-
## 🚀 How It Works
|
|
28
|
-
|
|
29
|
-
The core of this package is the `SSRFilter`. When a request for an HTML page comes in, the filter does the following:
|
|
30
|
-
|
|
31
|
-
1. **Intercepts the Request**: It captures the request before it would normally serve a static `index.html` file.
|
|
32
|
-
2. **Acquires a Browser Environment**: It takes a pre-initialized `jsdom` instance from a pool. This instance acts as a virtual browser on the server.
|
|
33
|
-
3. **Initializes a Front-End App**: It uses a `SimpleBootFront` application instance (also from a pool) and sets its context to the `jsdom` window.
|
|
34
|
-
4. **Executes Routing**: It triggers the front-end router within the `jsdom` environment, using the path from the incoming request.
|
|
35
|
-
5. **Renders Components**: The front-end components render into the virtual DOM.
|
|
36
|
-
6. **Handles Data Fetching**: If components fetch data during their lifecycle, this happens on the server. The `SaveAroundAfter` and `LoadAroundBefore` decorators automatically handle the serialization of this data into `window.server_side_data`.
|
|
37
|
-
7. **Serializes the DOM**: Once rendering is complete, it captures the `outerHTML` of the `jsdom` document.
|
|
38
|
-
8. **Injects Hydration Data**: The serialized data from step 6 is injected into the HTML inside a `<script>` tag.
|
|
39
|
-
9. **Sends Response**: The fully rendered HTML is sent to the client.
|
|
40
|
-
|
|
41
|
-
The client-side application then boots up, sees the pre-rendered HTML and the hydration data, and takes over without needing to re-render the initial view or re-fetch the initial data.
|
|
42
|
-
|
|
43
|
-
Additionally, the `IntentSchemeFilter` handles specific client-server communication. When a request with `Accept: application/json-post+simple-boot-ssr-intent-scheme` and `X-Simple-Boot-Ssr-Intent-Scheme` headers is received, this filter intercepts it, publishes an intent, and returns the result, enabling a robust intent-based API.
|
|
44
|
-
|
|
45
|
-
# 😃 Example Setup
|
|
46
|
-
|
|
47
|
-
### Common Factory (`factory.ts`)
|
|
48
|
-
|
|
49
|
-
This factory is used by both the server (for SSR) and the client (for browser rendering).
|
|
50
|
-
|
|
51
|
-
```typescript
|
|
52
|
-
import { SimpleBootHttpSSRFactory, SimFrontOption, SimpleBootFront } from '@dooboostore/simple-boot-http-server-ssr';
|
|
53
|
-
import { ConstructorType } from '@dooboostore/core';
|
|
54
|
-
import { IndexRouterComponent } from './components/index.router.component';
|
|
55
|
-
|
|
56
|
-
// Function to create a standard front-end option object
|
|
57
|
-
export const MakeSimFrontOption = (window: any): SimFrontOption => {
|
|
58
|
-
return new SimFrontOption(window).setUrlType('path');
|
|
59
|
-
}
|
|
60
|
-
|
|
61
|
-
// The factory class that creates instances of the front-end application
|
|
62
|
-
class Factory extends SimpleBootHttpSSRFactory {
|
|
63
|
-
factory(simFrontOption: SimFrontOption, using: ConstructorType<any>[] = [], domExcludes: ConstructorType<any>[] = []): Promise<SimpleBootFront> {
|
|
64
|
-
const simpleBootFront = new SimpleBootFront(IndexRouterComponent, simFrontOption);
|
|
65
|
-
// Exclude certain types from being proxied by the DOM renderer
|
|
66
|
-
simpleBootFront.domRendoerExcludeProxy.push(...domExcludes);
|
|
67
|
-
return Promise.resolve(simpleBootFront);
|
|
68
|
-
}
|
|
69
|
-
}
|
|
22
|
+
## Quick Start
|
|
70
23
|
|
|
71
|
-
|
|
24
|
+
```bash
|
|
25
|
+
npx @dooboostore/create-simple-boot-http-server-ssr my-ssr-app
|
|
26
|
+
cd my-ssr-app
|
|
27
|
+
npm start
|
|
72
28
|
```
|
|
73
29
|
|
|
74
|
-
|
|
75
|
-
|
|
76
|
-
This sets up the HTTP server with the `SSRFilter` and `IntentSchemeFilter`.
|
|
77
|
-
|
|
78
|
-
```typescript
|
|
79
|
-
import 'reflect-metadata';
|
|
80
|
-
import { ConstructorType } from '@dooboostore/core/types';
|
|
81
|
-
import { SimpleBootHttpSSRServer } from '@dooboostore/simple-boot-http-server-ssr/SimpleBootHttpSSRServer';
|
|
82
|
-
import { HttpSSRServerOption } from '@dooboostore/simple-boot-http-server-ssr/option/HttpSSRServerOption';
|
|
83
|
-
import { environment } from './environments/environment';
|
|
84
|
-
import { NotFoundError } from '@dooboostore/simple-boot-http-server/errors/NotFoundError';
|
|
85
|
-
import { SimpleBootHttpServer } from '@dooboostore/simple-boot-http-server/SimpleBootHttpServer';
|
|
86
|
-
import Factory, { MakeSimFrontOption } from '@src/bootfactory';
|
|
87
|
-
import { FactoryAndParams, SSRFilter } from '@dooboostore/simple-boot-http-server-ssr/filters/SSRFilter';
|
|
88
|
-
import { ResourceFilter } from '@dooboostore/simple-boot-http-server/filters/ResourceFilter';
|
|
89
|
-
import { RootRouter } from '@backend/root.router';
|
|
90
|
-
import { RequestResponse } from '@dooboostore/simple-boot-http-server/models/RequestResponse';
|
|
91
|
-
import { DataSource } from 'typeorm';
|
|
92
|
-
import { DatabaseService } from '@backend/service/database/DatabaseService';
|
|
93
|
-
import { services } from '@backend/service';
|
|
94
|
-
import { IntentSchemeFilter } from '@dooboostore/simple-boot-http-server-ssr/filters/IntentSchemeFilter';
|
|
95
|
-
import { ErrorLogEndPoint } from '@backend/endpoints/ErrorLogEndPoint';
|
|
96
|
-
import { CloseLogEndPoint } from '@backend/endpoints/CloseLogEndPoint';
|
|
97
|
-
import { RequestLogEndPoint } from '@backend/endpoints/RequestLogEndPoint';
|
|
98
|
-
import { GlobalAdvice } from '@backend/advices/GlobalAdvice';
|
|
99
|
-
import { SimpleBootHttpSSRFactory } from '@dooboostore/simple-boot-http-server-ssr/SimpleBootHttpSSRFactory';
|
|
100
|
-
import { Runnable } from '@dooboostore/core/runs/Runnable';
|
|
101
|
-
import { CrossDomainHeaderEndPoint } from '@dooboostore/simple-boot-http-server/endpoints/CrossDomainHeaderEndPoint';
|
|
102
|
-
import { SyncManager } from '@backend/manager';
|
|
103
|
-
import { SecurityService } from '@backend/service/SecurityService';
|
|
104
|
-
|
|
105
|
-
type ENV_MODE = 'ONLY_SYNC' | 'NO_SYNC' | undefined;
|
|
106
|
-
type WORLD = undefined | string;
|
|
107
|
-
|
|
108
|
-
type RunParams = { mode: ENV_MODE, world: WORLD };
|
|
109
|
-
|
|
110
|
-
class Server implements Runnable<void, RunParams> {
|
|
111
|
-
async run(config?: RunParams) {
|
|
112
|
-
const securityService = new SecurityService();
|
|
113
|
-
const databaseService = new DatabaseService(securityService);
|
|
114
|
-
await databaseService.run();
|
|
115
|
-
if (mode !== 'NO_SYNC') {
|
|
116
|
-
const syncManager = new SyncManager(databaseService);
|
|
117
|
-
await syncManager.run(config?.world ? Number(config.world) : undefined);
|
|
118
|
-
}
|
|
119
|
-
|
|
120
|
-
if (mode === 'ONLY_SYNC') {
|
|
121
|
-
return;
|
|
122
|
-
}
|
|
123
|
-
|
|
124
|
-
|
|
125
|
-
// const cacheManager = new CacheManager(databaseService);
|
|
126
|
-
// await cacheManager.run();
|
|
127
|
-
|
|
128
|
-
const otherInstanceSim = new Map<ConstructorType<any>, any>();
|
|
129
|
-
otherInstanceSim.set(SecurityService, securityService);
|
|
130
|
-
otherInstanceSim.set(DatabaseService, databaseService);
|
|
131
|
-
// otherInstanceSim.set(CacheManager, cacheManager);
|
|
132
|
-
|
|
133
|
-
const ssrOption: FactoryAndParams = {
|
|
134
|
-
frontDistPath: environment.frontDistPath,
|
|
135
|
-
frontDistIndexFileName: environment.frontDistIndexFileName,
|
|
136
|
-
factorySimFrontOption: (window: any) => MakeSimFrontOption(window),
|
|
137
|
-
factory: Factory as SimpleBootHttpSSRFactory,
|
|
138
|
-
poolOption: {
|
|
139
|
-
max: 50,
|
|
140
|
-
min: 5
|
|
141
|
-
},
|
|
142
|
-
using: [...services],
|
|
143
|
-
domExcludes: [DataSource] as ConstructorType<any>[],
|
|
144
|
-
ssrExcludeFilter: (rr: RequestResponse) => {
|
|
145
|
-
const firstExcludeFilter = [
|
|
146
|
-
/^\/signs\/confirm-email.*/,
|
|
147
|
-
/^\/assets\/.*/,
|
|
148
|
-
/^\/api\/.*/
|
|
149
|
-
];
|
|
150
|
-
for (const excludeRegExp of firstExcludeFilter) {
|
|
151
|
-
if (excludeRegExp.test(rr.reqUrl)) {
|
|
152
|
-
return true;
|
|
153
|
-
}
|
|
154
|
-
}
|
|
155
|
-
return false;
|
|
156
|
-
},
|
|
157
|
-
simpleBootFront: {
|
|
158
|
-
notFoundError: true
|
|
159
|
-
}
|
|
160
|
-
};
|
|
161
|
-
// const ssrFilter = new SSRFilter(ssrOption, otherInstanceSim);
|
|
162
|
-
|
|
163
|
-
const resourceFilter = new ResourceFilter(environment.frontDistPath,
|
|
164
|
-
[
|
|
165
|
-
'assets/privacy.html', 'assets/.*', '\.js$', '\.map$', '\.ico$', '\.png$', '\.jpg$', '\.jpeg$', '\.gif$', 'offline\.html$', 'webmanifest$', 'manifest\.json', 'service-worker\.js$', 'googlebe4b1abe81ab7cf3\.html$',
|
|
166
|
-
{
|
|
167
|
-
request: (rr) => {
|
|
168
|
-
return RegExp('/.*').test(rr.reqUrlPathName) && rr.reqMethod()?.toUpperCase() === 'GET';
|
|
169
|
-
},
|
|
170
|
-
dist: 'index.html'
|
|
171
|
-
}
|
|
172
|
-
]
|
|
173
|
-
);
|
|
174
|
-
const uploadResourceFilter = new ResourceFilter(environment.uploadTempPath,
|
|
175
|
-
['public/.*']
|
|
176
|
-
);
|
|
177
|
-
|
|
178
|
-
const option = new HttpSSRServerOption();
|
|
179
|
-
option.cache = {
|
|
180
|
-
enable: true
|
|
181
|
-
}
|
|
182
|
-
option.rootRouter = RootRouter;
|
|
183
|
-
option.listen = environment.httpServerConfig.listen;
|
|
184
|
-
option.globalAdvice = new GlobalAdvice();
|
|
185
|
-
option.requestEndPoints = [
|
|
186
|
-
new RequestLogEndPoint(),
|
|
187
|
-
new CrossDomainHeaderEndPoint({accessControlExposeHeaders: 'Set-Cookie', accessControlAllowHeaders: '*', accessControlAllowMethods: '*', accessControlAllowOrigin: '*'}),
|
|
188
|
-
];
|
|
189
|
-
option.closeEndPoints = [new CloseLogEndPoint()];
|
|
190
|
-
option.errorEndPoints = [new ErrorLogEndPoint()];
|
|
191
|
-
option.noSuchRouteEndPointMappingThrow = () => new NotFoundError();
|
|
192
|
-
option.fileUploadTempPath = environment.uploadTempPath;
|
|
193
|
-
option.filters = [
|
|
194
|
-
resourceFilter,
|
|
195
|
-
uploadResourceFilter,
|
|
196
|
-
// ssrFilter,
|
|
197
|
-
// SecurityFilter,
|
|
198
|
-
IntentSchemeFilter
|
|
199
|
-
];
|
|
200
|
-
// option.serverOption = {
|
|
201
|
-
// key: fs.readFileSync(path.resolve(__dirname, '../data/certificates/localhost-key.pem')),
|
|
202
|
-
// cert: fs.readFileSync(path.resolve(__dirname, '../data/certificates/localhost.pem')),
|
|
203
|
-
// }
|
|
204
|
-
option.listen.listeningListener = (server: SimpleBootHttpServer) => {
|
|
205
|
-
console.log(`http server startUP! listening on ${server.option.listen.port}`);
|
|
206
|
-
};
|
|
207
|
-
|
|
208
|
-
const ssr = new SimpleBootHttpSSRServer(option);
|
|
209
|
-
await ssr.run(otherInstanceSim);
|
|
210
|
-
return ssr;
|
|
211
|
-
}
|
|
212
|
-
}
|
|
30
|
+
## Learn More
|
|
213
31
|
|
|
214
|
-
|
|
215
|
-
const world = process.env.WORLD as ENV_MODE;
|
|
216
|
-
new Server().run({mode, world}).then(ssr => {
|
|
217
|
-
console.log(`server started!! (mode:${mode})`);
|
|
218
|
-
});
|
|
219
|
-
console.log(`server wait... (mode:${mode})`);
|
|
32
|
+
The detailed API documentation is available on our documentation website.
|
|
220
33
|
|
|
34
|
+
**[Explore the full documentation »](https://dooboostore-develop.github.io/packages/simple-boot-http-server-ssr)**
|
|
221
35
|
|
|
36
|
+
## License
|
|
222
37
|
|
|
223
|
-
|
|
38
|
+
This package is licensed under the [MIT License](https://opensource.org/licenses/MIT).
|
|
@@ -0,0 +1,36 @@
|
|
|
1
|
+
var __defProp = Object.defineProperty;
|
|
2
|
+
var __getOwnPropDesc = Object.getOwnPropertyDescriptor;
|
|
3
|
+
var __getOwnPropNames = Object.getOwnPropertyNames;
|
|
4
|
+
var __hasOwnProp = Object.prototype.hasOwnProperty;
|
|
5
|
+
var __copyProps = (to, from, except, desc) => {
|
|
6
|
+
if (from && typeof from === "object" || typeof from === "function") {
|
|
7
|
+
for (let key of __getOwnPropNames(from))
|
|
8
|
+
if (!__hasOwnProp.call(to, key) && key !== except)
|
|
9
|
+
__defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable });
|
|
10
|
+
}
|
|
11
|
+
return to;
|
|
12
|
+
};
|
|
13
|
+
var __reExport = (target, mod, secondTarget) => (__copyProps(target, mod, "default"), secondTarget && __copyProps(secondTarget, mod, "default"));
|
|
14
|
+
var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod);
|
|
15
|
+
var bundle_entry_exports = {};
|
|
16
|
+
module.exports = __toCommonJS(bundle_entry_exports);
|
|
17
|
+
__reExport(bundle_entry_exports, require("./codes"), module.exports);
|
|
18
|
+
__reExport(bundle_entry_exports, require("./decorators"), module.exports);
|
|
19
|
+
__reExport(bundle_entry_exports, require("./filters"), module.exports);
|
|
20
|
+
__reExport(bundle_entry_exports, require("./initializers"), module.exports);
|
|
21
|
+
__reExport(bundle_entry_exports, require("./option"), module.exports);
|
|
22
|
+
__reExport(bundle_entry_exports, require("./proxy"), module.exports);
|
|
23
|
+
__reExport(bundle_entry_exports, require("./SimpleBootHttpSSRFactory"), module.exports);
|
|
24
|
+
__reExport(bundle_entry_exports, require("./SimpleBootHttpSSRServer"), module.exports);
|
|
25
|
+
// Annotate the CommonJS export names for ESM import in node:
|
|
26
|
+
0 && (module.exports = {
|
|
27
|
+
...require("./codes"),
|
|
28
|
+
...require("./decorators"),
|
|
29
|
+
...require("./filters"),
|
|
30
|
+
...require("./initializers"),
|
|
31
|
+
...require("./option"),
|
|
32
|
+
...require("./proxy"),
|
|
33
|
+
...require("./SimpleBootHttpSSRFactory"),
|
|
34
|
+
...require("./SimpleBootHttpSSRServer")
|
|
35
|
+
});
|
|
36
|
+
//# sourceMappingURL=bundle-entry.js.map
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
{
|
|
2
|
+
"version": 3,
|
|
3
|
+
"sources": ["../../src/bundle-entry.ts"],
|
|
4
|
+
"sourcesContent": ["export * from './codes';\nexport * from './decorators';\nexport * from './filters';\nexport * from './initializers';\nexport * from './option';\nexport * from './proxy';\nexport * from './SimpleBootHttpSSRFactory';\nexport * from './SimpleBootHttpSSRServer';"],
|
|
5
|
+
"mappings": ";;;;;;;;;;;;;;AAAA;AAAA;AAAA,iCAAc,oBAAd;AACA,iCAAc,yBADd;AAEA,iCAAc,sBAFd;AAGA,iCAAc,2BAHd;AAIA,iCAAc,qBAJd;AAKA,iCAAc,oBALd;AAMA,iCAAc,uCANd;AAOA,iCAAc,sCAPd;",
|
|
6
|
+
"names": []
|
|
7
|
+
}
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
{
|
|
2
2
|
"version": 3,
|
|
3
3
|
"sources": ["../../../src/codes/HttpHeaders.ts"],
|
|
4
|
-
"sourcesContent": ["import { HttpHeaders as AHttpHeaders } from '@dooboostore/simple-boot-http-server/codes/HttpHeaders';\nimport { Mimes } from './Mimes';\n\nexport const HttpHeaders = {\n ...AHttpHeaders,\n XSimpleBootSsrIntentScheme: 'x-simple-boot-ssr-intent-scheme'\n};\n\nexport const makeIntentHeaderBySymbol = (symbol: Symbol): HeadersInit => {\n return {\n [HttpHeaders.Accept]: Mimes.ApplicationJsonPostSimpleBootSsrIntentScheme,\n [HttpHeaders.XSimpleBootSsrIntentScheme]: `Symbol.for(${symbol.description})`\n }\n};\n\n\n"],
|
|
5
|
-
"mappings": ";;;;;;;;;;;;;;;;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,yBAA4C;AAC5C,mBAAsB;AAEf,MAAM,cAAc;AAAA,EACzB,GAAG,mBAAAA;AAAA,EACH,4BAA4B;AAC9B;
|
|
4
|
+
"sourcesContent": ["import { HttpHeaders as AHttpHeaders } from '@dooboostore/simple-boot-http-server/codes/HttpHeaders';\nimport { Mimes } from './Mimes';\n\nexport const HttpHeaders = {\n ...AHttpHeaders,\n XSimpleBootSsrIntentScheme: 'x-simple-boot-ssr-intent-scheme'\n};\nexport type HttpHeadersType = typeof HttpHeaders;\n\nexport const makeIntentHeaderBySymbol = (symbol: Symbol): HeadersInit => {\n return {\n [HttpHeaders.Accept]: Mimes.ApplicationJsonPostSimpleBootSsrIntentScheme,\n [HttpHeaders.XSimpleBootSsrIntentScheme]: `Symbol.for(${symbol.description})`\n }\n};\n\n\n"],
|
|
5
|
+
"mappings": ";;;;;;;;;;;;;;;;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,yBAA4C;AAC5C,mBAAsB;AAEf,MAAM,cAAc;AAAA,EACzB,GAAG,mBAAAA;AAAA,EACH,4BAA4B;AAC9B;AAGO,MAAM,2BAA2B,CAAC,WAAgC;AACvE,SAAO;AAAA,IACL,CAAC,YAAY,MAAM,GAAG,mBAAM;AAAA,IAC5B,CAAC,YAAY,0BAA0B,GAAG,cAAc,OAAO,WAAW;AAAA,EAC5E;AACF;",
|
|
6
6
|
"names": ["AHttpHeaders"]
|
|
7
7
|
}
|
|
@@ -35,15 +35,13 @@ class SSRFilter {
|
|
|
35
35
|
constructor(config, otherInstanceSim) {
|
|
36
36
|
this.config = config;
|
|
37
37
|
this.otherInstanceSim = otherInstanceSim;
|
|
38
|
+
this.simpleBootFrontPool = [];
|
|
39
|
+
this.simpleBootFrontQueue = new import_AsyncBlockingQueue.AsyncBlockingQueue();
|
|
40
|
+
this.welcomUrl = "http://localhost";
|
|
41
|
+
this.poolGeneration = 0;
|
|
38
42
|
config.frontDistIndexFileName = config.frontDistIndexFileName || "index.html";
|
|
39
43
|
this.indexHTML = import_JsdomInitializer.JsdomInitializer.loadFile(this.config.frontDistPath, config.frontDistIndexFileName);
|
|
40
44
|
}
|
|
41
|
-
simpleBootFrontPool = [];
|
|
42
|
-
simpleBootFrontQueue = new import_AsyncBlockingQueue.AsyncBlockingQueue();
|
|
43
|
-
indexHTML;
|
|
44
|
-
welcomUrl = "http://localhost";
|
|
45
|
-
poolGeneration = 0;
|
|
46
|
-
intervalId;
|
|
47
45
|
async onInit(app) {
|
|
48
46
|
for (let i = 0; i < this.config.poolOption.min; i++) {
|
|
49
47
|
await this.pushQueue();
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
{
|
|
2
2
|
"version": 3,
|
|
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": ";;;;;;;;;;;;;;;;;AAAA;AAAA;AAAA;AAAA;AAAA;AACA,yBAA4B;AAG5B,8BAAiC;AAEjC,mBAAsB;AACtB,wBAA2B;AAI3B,gCAAmC;AACnC,yBAA4B;AAE5B,2BAA8B;AAC9B,4BAA+B;AAC/B,oBAAuB;AACvB,mBAAsB;AACtB,4BAA+B;AAoBxB,MAAM,UAA4B;AAAA,EAQvC,YACS,QACA,kBACP;AAFO;AACA;
|
|
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 // await new Promise(r => setTimeout(r, 5000)); // <--\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 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
6
|
"names": []
|
|
7
7
|
}
|
|
@@ -26,9 +26,8 @@ class SSRWorker {
|
|
|
26
26
|
constructor(factory, otherInstanceSim) {
|
|
27
27
|
this.factory = factory;
|
|
28
28
|
this.otherInstanceSim = otherInstanceSim;
|
|
29
|
+
this.welcomUrl = "http://localhost";
|
|
29
30
|
}
|
|
30
|
-
welcomUrl = "http://localhost";
|
|
31
|
-
simpleBootFront;
|
|
32
31
|
async run() {
|
|
33
32
|
this.simpleBootFront = await this.makeFront();
|
|
34
33
|
}
|
|
@@ -2,6 +2,6 @@
|
|
|
2
2
|
"version": 3,
|
|
3
3
|
"sources": ["../../../src/filters/SSRWorker.ts"],
|
|
4
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": ";;;;;;;;;;;;;;;;;AAAA;AAAA;AAAA;AAAA;AAAA;AAEA,8BAA+B;AAE/B,yBAA0B;AAGnB,MAAM,UAAU;AAAA,EAInB,YAAmB,SAAkC,kBAAmD;AAArF;AAAkC;
|
|
5
|
+
"mappings": ";;;;;;;;;;;;;;;;;AAAA;AAAA;AAAA;AAAA;AAAA;AAEA,8BAA+B;AAE/B,yBAA0B;AAGnB,MAAM,UAAU;AAAA,EAInB,YAAmB,SAAkC,kBAAmD;AAArF;AAAkC;AAHrD,SAAO,YAAY;AAAA,EAKnB;AAAA,EAEA,MAAM,MAAM;AACR,SAAK,kBAAkB,MAAM,KAAK,UAAU;AAAA,EAChD;AAAA,EAEA,MAAM,YAAY;AACd,UAAM,QAAQ,MAAM,IAAI,yCAAiB,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,+BAAY,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
6
|
"names": []
|
|
7
7
|
}
|
package/dist/cjs/index.js.map
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
{
|
|
2
2
|
"version": 3,
|
|
3
3
|
"sources": ["../../src/index.ts"],
|
|
4
|
-
"sourcesContent": ["// export * from './
|
|
5
|
-
"mappings": ";;;;;;;;;;;;;;;;;AAAA;AAAA;AAAA;AAAA;AAAA;AAQA,IAAO,cAAQ,
|
|
4
|
+
"sourcesContent": ["// export * from './codes';\n// export * from './decorators';\n// export * from './filters';\n// export * from './initializers';\n// export * from './option';\n// export * from './proxy';\n// export * from './SimpleBootHttpSSRFactory';\n// export * from './SimpleBootHttpSSRServer';\nexport default {}"],
|
|
5
|
+
"mappings": ";;;;;;;;;;;;;;;;;AAAA;AAAA;AAAA;AAAA;AAAA;AAQA,IAAO,cAAQ,CAAC;",
|
|
6
6
|
"names": []
|
|
7
7
|
}
|
|
@@ -60,6 +60,7 @@ class JsdomInitializer {
|
|
|
60
60
|
global.IntersectionObserver = jsdom.window.IntersectionObserver;
|
|
61
61
|
global.NodeFilter = jsdom.window.NodeFilter;
|
|
62
62
|
global.Node = jsdom.window.Node;
|
|
63
|
+
global.DocumentFragment = jsdom.window.DocumentFragment;
|
|
63
64
|
global.HTMLElement = jsdom.window.HTMLElement;
|
|
64
65
|
global.HTMLMetaElement = jsdom.window.HTMLMetaElement;
|
|
65
66
|
global.Element = jsdom.window.Element;
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
{
|
|
2
2
|
"version": 3,
|
|
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;AAAA;AAAA;AAAA;AAAA;AAAA,YAAuB;AAEvB,gBAAe;AACf,kBAAiB;AAEV,MAAM,iBAAiB;AAAA,EAC5B,YACU,eACA,wBACA,qBACR;AAHQ;AACA;AACA;AAAA,EACP;AAAA,EAEH,OAAc,SAAS,UAAkB,UAA0B;AACjE,WAAO,UAAAA,QAAG,aAAa,YAAAC,QAAK,KAAK,UAAU,QAAQ,GAAG,MAAM;AAAA,EAC9D;AAAA,EAEA,MAAM,MAA4B;AAGhC,UAAM,UAAU,YAAAA,QAAK,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;",
|
|
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.DocumentFragment = jsdom.window.DocumentFragment;\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;AAAA;AAAA;AAAA;AAAA;AAAA,YAAuB;AAEvB,gBAAe;AACf,kBAAiB;AAEV,MAAM,iBAAiB;AAAA,EAC5B,YACU,eACA,wBACA,qBACR;AAHQ;AACA;AACA;AAAA,EACP;AAAA,EAEH,OAAc,SAAS,UAAkB,UAA0B;AACjE,WAAO,UAAAA,QAAG,aAAa,YAAAC,QAAK,KAAK,UAAU,QAAQ,GAAG,MAAM;AAAA,EAC9D;AAAA,EAEA,MAAM,MAA4B;AAGhC,UAAM,UAAU,YAAAA,QAAK,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,mBAAmB,MAAM,OAAO;AACvC,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
6
|
"names": ["fs", "path"]
|
|
7
7
|
}
|
package/dist/cjs/package.json
CHANGED
|
@@ -24,10 +24,21 @@ var import_SimDecorator = require("@dooboostore/simple-boot/decorators/SimDecora
|
|
|
24
24
|
var import_HttpHeaders = require("../codes/HttpHeaders");
|
|
25
25
|
var import_ConvertUtils = require("@dooboostore/core/convert/ConvertUtils");
|
|
26
26
|
var import_ApiService = require("@dooboostore/simple-boot/fetch/ApiService");
|
|
27
|
+
var __decorate = function(decorators, target, key, desc) {
|
|
28
|
+
var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;
|
|
29
|
+
if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc);
|
|
30
|
+
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;
|
|
31
|
+
return c > 3 && r && Object.defineProperty(target, key, r), r;
|
|
32
|
+
};
|
|
33
|
+
var __metadata = function(k, v) {
|
|
34
|
+
if (typeof Reflect === "object" && typeof Reflect.metadata === "function") return Reflect.metadata(k, v);
|
|
35
|
+
};
|
|
36
|
+
var _a;
|
|
27
37
|
const _ = import_ApiService.ApiService;
|
|
28
|
-
|
|
38
|
+
let SymbolIntentApiServiceProxy = class SymbolIntentApiServiceProxy2 {
|
|
29
39
|
constructor(apiService) {
|
|
30
40
|
this.apiService = apiService;
|
|
41
|
+
console.log("-------apiService", apiService);
|
|
31
42
|
}
|
|
32
43
|
get(target, prop, receiver) {
|
|
33
44
|
const simConfig = (0, import_SimDecorator.getSim)(target);
|
|
@@ -103,7 +114,11 @@ class SymbolIntentApiServiceProxy {
|
|
|
103
114
|
console.log("SymbolIntentApiServiceProxy apply");
|
|
104
115
|
return Reflect.apply(target, thisArg, argArray);
|
|
105
116
|
}
|
|
106
|
-
}
|
|
117
|
+
};
|
|
118
|
+
SymbolIntentApiServiceProxy = __decorate([
|
|
119
|
+
import_SimDecorator.Sim,
|
|
120
|
+
__metadata("design:paramtypes", [typeof (_a = typeof import_ApiService.ApiService !== "undefined" && import_ApiService.ApiService) === "function" ? _a : Object])
|
|
121
|
+
], SymbolIntentApiServiceProxy);
|
|
107
122
|
// Annotate the CommonJS export names for ESM import in node:
|
|
108
123
|
0 && (module.exports = {
|
|
109
124
|
SymbolIntentApiServiceProxy
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
{
|
|
2
2
|
"version": 3,
|
|
3
3
|
"sources": ["../../../src/proxy/SymbolIntentApiServiceProxy.ts"],
|
|
4
|
-
"sourcesContent": ["import { getSim, Sim } from '@dooboostore/simple-boot/decorators/SimDecorator';\nimport { makeIntentHeaderBySymbol } from '../codes/HttpHeaders';\nimport { ConvertUtils } from '@dooboostore/core/convert/ConvertUtils';\nimport { ApiService } from '@dooboostore/simple-boot/fetch/ApiService';\
|
|
5
|
-
"mappings": "
|
|
6
|
-
"names": []
|
|
4
|
+
"sourcesContent": ["import { getSim, Sim } from '@dooboostore/simple-boot/decorators/SimDecorator';\nimport { makeIntentHeaderBySymbol } from '../codes/HttpHeaders';\nimport { ConvertUtils } from '@dooboostore/core/convert/ConvertUtils';\nimport { ApiService } from '@dooboostore/simple-boot/fetch/ApiService';\n\n\nexport type Config<T = any> = { method?:'get' | 'post' | 'petch' | 'delete' | 'head', multipartFormData?: boolean, bypassTransform?: boolean; transformText?: boolean, headers?: HeadersInit, body?: T };\nconst _ = ApiService;\n@Sim\nexport class SymbolIntentApiServiceProxy<T extends object> implements ProxyHandler<T> {\n\n\n constructor(private apiService: ApiService) {\n console.log('-------apiService', apiService);\n }\n\n get(target: T, prop: string | symbol, receiver: any): any {\n const simConfig = getSim(target)\n const apiService = this.apiService;\n const value = Reflect.get(target, prop, receiver);\n if (typeof value === 'function' && simConfig?.symbol) {\n return function (...args: any[]) {\n const f = value as Function;\n const p = (userConfig: Config) => {\n\n const headers = {...(userConfig?.headers ?? {}), ...makeIntentHeaderBySymbol(simConfig.symbol as Symbol)};\n const method = userConfig?.method ?? 'post';\n if(method === 'post' && userConfig?.multipartFormData) {\n return apiService.post({\n target: `/${String(prop)}`,\n config: {\n bypassTransform: userConfig?.bypassTransform,\n transformText: userConfig?.transformText,\n fetch: {\n credentials: 'include',\n headers: headers,\n body: ConvertUtils.toFormData(userConfig?.body)\n }\n }\n });\n } else if (method === 'post') {\n return apiService.postJson({\n target: `/${String(prop)}`,\n config: {\n bypassTransform: userConfig?.bypassTransform,\n transformText: userConfig?.transformText,\n fetch: {\n credentials: 'include',\n headers: headers,\n body: userConfig?.body\n }\n }\n });\n }else if (method === 'petch') {\n return apiService.patchJson({\n target: `/${String(prop)}`,\n config: {\n bypassTransform: userConfig?.bypassTransform,\n transformText: userConfig?.transformText,\n fetch: {\n credentials: 'include',\n headers: headers,\n body: userConfig?.body\n }\n }\n });\n } else {\n return apiService[method]({\n // return apiService.head({\n target: {url: `/${String(prop)}`, searchParams: userConfig?.body},\n config: {\n bypassTransform: userConfig?.bypassTransform,\n transformText: userConfig?.transformText,\n fetch: {\n credentials: 'include',\n headers: headers,\n }\n }\n });\n }\n\n\n\n\n // if (userConfig?.multipartFormData) {\n // return apiService.post({\n // target: `/${String(prop)}`,\n // config: {\n // bypassTransform: userConfig?.bypassTransform,\n // transformText: userConfig?.transformText,\n // fetch: {\n // credentials: 'include',\n // headers: headers,\n // body: ConvertUtils.toFormData(userConfig?.body)\n // }\n // }\n // });\n // } else {\n // return apiService.postJson({\n // target: `/${String(prop)}`,\n // config: {\n // bypassTransform: userConfig?.bypassTransform,\n // transformText: userConfig?.transformText,\n // fetch: {\n // credentials: 'include',\n // headers: headers,\n // body: userConfig?.body\n // }\n // }\n // });\n // }\n\n };\n args.push(p);\n return Reflect.apply(f, target, args);\n // return f.apply(target, args);\n }\n }\n return Reflect.get(target, prop, receiver);\n }\n\n apply(target: T, thisArg: any, argArray: any[]): any {\n console.log('SymbolIntentApiServiceProxy apply')\n // @ts-ignore\n return Reflect.apply(target, thisArg, argArray);\n }\n\n\n\n\n}"],
|
|
5
|
+
"mappings": ";;;;;;;;;;;;;;;;;;;;;;AAAA,0BAA4B;AAC5B,yBAAyC;AACzC,0BAA6B;AAC7B,wBAA2B;;;;;;;;;;;AAI3B,MAAM,IAAI;AAEH,IAAM,8BAAN,MAAMA,6BAA2B;EAGtC,YAAoB,YAAsB;AAAtB,SAAA,aAAA;AAClB,YAAQ,IAAI,qBAAqB,UAAU;EAC7C;EAEA,IAAI,QAAW,MAAuB,UAAa;AACjD,UAAM,gBAAY,4BAAO,MAAM;AAC/B,UAAM,aAAa,KAAK;AACxB,UAAM,QAAQ,QAAQ,IAAI,QAAQ,MAAM,QAAQ;AAChD,QAAI,OAAO,UAAU,cAAc,WAAW,QAAQ;AACpD,aAAO,YAAa,MAAW;AAC7B,cAAM,IAAI;AACV,cAAM,IAAI,CAAC,eAAsB;AAE/B,gBAAM,UAAU,EAAC,GAAI,YAAY,WAAW,CAAA,GAAK,OAAG,6CAAyB,UAAU,MAAgB,EAAC;AACxG,gBAAM,SAAS,YAAY,UAAU;AACrC,cAAG,WAAW,UAAU,YAAY,mBAAmB;AACrD,mBAAO,WAAW,KAAK;cACrB,QAAQ,IAAI,OAAO,IAAI,CAAC;cACxB,QAAQ;gBACN,iBAAiB,YAAY;gBAC7B,eAAe,YAAY;gBAC3B,OAAO;kBACL,aAAa;kBACb;kBACA,MAAM,iCAAa,WAAW,YAAY,IAAI;;;aAGnD;UACH,WAAW,WAAW,QAAQ;AAC5B,mBAAO,WAAW,SAAS;cACzB,QAAQ,IAAI,OAAO,IAAI,CAAC;cACxB,QAAQ;gBACN,iBAAiB,YAAY;gBAC7B,eAAe,YAAY;gBAC3B,OAAO;kBACL,aAAa;kBACb;kBACA,MAAM,YAAY;;;aAGvB;UACH,WAAU,WAAW,SAAS;AAC5B,mBAAO,WAAW,UAAU;cAC1B,QAAQ,IAAI,OAAO,IAAI,CAAC;cACxB,QAAQ;gBACN,iBAAiB,YAAY;gBAC7B,eAAe,YAAY;gBAC3B,OAAO;kBACL,aAAa;kBACb;kBACA,MAAM,YAAY;;;aAGvB;UACH,OAAO;AACL,mBAAO,WAAW,MAAM,EAAE;;cAExB,QAAQ,EAAC,KAAK,IAAI,OAAO,IAAI,CAAC,IAAI,cAAc,YAAY,KAAI;cAChE,QAAQ;gBACN,iBAAiB,YAAY;gBAC7B,eAAe,YAAY;gBAC3B,OAAO;kBACL,aAAa;kBACb;;;aAGL;UACH;QAiCF;AACA,aAAK,KAAK,CAAC;AACX,eAAO,QAAQ,MAAM,GAAG,QAAQ,IAAI;MAEtC;IACF;AACA,WAAO,QAAQ,IAAI,QAAQ,MAAM,QAAQ;EAC3C;EAEA,MAAM,QAAW,SAAc,UAAe;AAC5C,YAAQ,IAAI,mCAAmC;AAE/C,WAAO,QAAQ,MAAM,QAAQ,SAAS,QAAQ;EAChD;;AApHW,8BAA2B,WAAA;EADvC;uDAIiC,iCAAU,eAAV,kCAAU,aAAA,KAAA,MAAA,CAAA;GAH/B,2BAA2B;",
|
|
6
|
+
"names": ["SymbolIntentApiServiceProxy"]
|
|
7
7
|
}
|