@dooboostore/simple-boot-http-server-ssr 1.0.14 → 1.0.16

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (184) hide show
  1. package/README.md +98 -0
  2. package/dist/cjs/SimpleBootHttpSSRFactory.js.map +1 -1
  3. package/dist/cjs/SimpleBootHttpSSRServer.js +1 -0
  4. package/dist/cjs/SimpleBootHttpSSRServer.js.map +2 -2
  5. package/dist/cjs/bundle-entry.js +0 -4
  6. package/dist/cjs/bundle-entry.js.map +2 -2
  7. package/dist/cjs/filters/SSRDomParserFilter.js +54 -89
  8. package/dist/cjs/filters/SSRDomParserFilter.js.map +2 -2
  9. package/dist/cjs/filters/SSRFilter.js +10 -14
  10. package/dist/cjs/filters/SSRFilter.js.map +2 -2
  11. package/dist/cjs/filters/{SSRLinkDomDomFilter.js → SSRLinkDomFilter.js} +17 -21
  12. package/dist/cjs/filters/SSRLinkDomFilter.js.map +7 -0
  13. package/dist/cjs/filters/SSRSimpleWebComponentDomParserFilter.js +81 -0
  14. package/dist/cjs/filters/SSRSimpleWebComponentDomParserFilter.js.map +7 -0
  15. package/dist/cjs/filters/SSRSimpleWebComponentFilter.js +223 -0
  16. package/dist/cjs/filters/SSRSimpleWebComponentFilter.js.map +7 -0
  17. package/dist/cjs/filters/SSRWorker.js +2 -2
  18. package/dist/cjs/filters/SSRWorker.js.map +2 -2
  19. package/dist/cjs/filters/index.js +9 -3
  20. package/dist/cjs/filters/index.js.map +2 -2
  21. package/dist/cjs/index.js +16 -8
  22. package/dist/cjs/index.js.map +2 -2
  23. package/dist/cjs/initializers/DomParserInitializer.js +5 -2
  24. package/dist/cjs/initializers/DomParserInitializer.js.map +2 -2
  25. package/dist/cjs/proxy/SSRDomParserFilterDataHydrationProxy.js +92 -0
  26. package/dist/cjs/proxy/SSRDomParserFilterDataHydrationProxy.js.map +7 -0
  27. package/dist/cjs/proxy/index.js +2 -8
  28. package/dist/cjs/proxy/index.js.map +2 -2
  29. package/dist/esm/SimpleBootHttpSSRFactory.js.map +1 -1
  30. package/dist/esm/SimpleBootHttpSSRServer.js +1 -0
  31. package/dist/esm/SimpleBootHttpSSRServer.js.map +2 -2
  32. package/dist/esm/bundle-entry.js +0 -2
  33. package/dist/esm/bundle-entry.js.map +2 -2
  34. package/dist/esm/filters/SSRDomParserFilter.js +52 -87
  35. package/dist/esm/filters/SSRDomParserFilter.js.map +2 -2
  36. package/dist/esm/filters/SSRFilter.js +7 -11
  37. package/dist/esm/filters/SSRFilter.js.map +2 -2
  38. package/dist/esm/filters/{SSRLinkDomDomFilter.js → SSRLinkDomFilter.js} +10 -14
  39. package/dist/esm/filters/SSRLinkDomFilter.js.map +7 -0
  40. package/dist/esm/filters/SSRSimpleWebComponentDomParserFilter.js +58 -0
  41. package/dist/esm/filters/SSRSimpleWebComponentDomParserFilter.js.map +7 -0
  42. package/dist/esm/filters/SSRSimpleWebComponentFilter.js +190 -0
  43. package/dist/esm/filters/SSRSimpleWebComponentFilter.js.map +7 -0
  44. package/dist/esm/filters/SSRWorker.js +1 -1
  45. package/dist/esm/filters/SSRWorker.js.map +2 -2
  46. package/dist/esm/filters/index.js +4 -1
  47. package/dist/esm/filters/index.js.map +2 -2
  48. package/dist/esm/index.js +6 -4
  49. package/dist/esm/index.js.map +2 -2
  50. package/dist/esm/initializers/DomParserInitializer.js +6 -3
  51. package/dist/esm/initializers/DomParserInitializer.js.map +2 -2
  52. package/dist/esm/proxy/SSRDomParserFilterDataHydrationProxy.js +69 -0
  53. package/dist/esm/proxy/SSRDomParserFilterDataHydrationProxy.js.map +7 -0
  54. package/dist/esm/proxy/index.js +1 -4
  55. package/dist/esm/proxy/index.js.map +2 -2
  56. package/dist/esm-bundle/dooboostore-simple-boot-http-server-ssr.esm.js +56266 -10404
  57. package/dist/esm-bundle/dooboostore-simple-boot-http-server-ssr.esm.js.map +4 -4
  58. package/dist/types/SimpleBootHttpSSRFactory.d.ts +1 -1
  59. package/dist/types/SimpleBootHttpSSRFactory.d.ts.map +1 -1
  60. package/dist/types/SimpleBootHttpSSRServer.d.ts +3 -2
  61. package/dist/types/SimpleBootHttpSSRServer.d.ts.map +1 -1
  62. package/dist/types/bundle-entry.d.ts +0 -2
  63. package/dist/types/bundle-entry.d.ts.map +1 -1
  64. package/dist/types/filters/SSRDomParserFilter.d.ts +12 -18
  65. package/dist/types/filters/SSRDomParserFilter.d.ts.map +1 -1
  66. package/dist/types/filters/SSRFilter.d.ts +1 -1
  67. package/dist/types/filters/SSRFilter.d.ts.map +1 -1
  68. package/dist/types/filters/{SSRLinkDomDomFilter.d.ts → SSRLinkDomFilter.d.ts} +6 -6
  69. package/dist/types/filters/SSRLinkDomFilter.d.ts.map +1 -0
  70. package/dist/types/filters/SSRSimpleWebComponentDomParserFilter.d.ts +37 -0
  71. package/dist/types/filters/SSRSimpleWebComponentDomParserFilter.d.ts.map +1 -0
  72. package/dist/types/filters/SSRSimpleWebComponentFilter.d.ts +57 -0
  73. package/dist/types/filters/SSRSimpleWebComponentFilter.d.ts.map +1 -0
  74. package/dist/types/filters/SSRWorker.d.ts +1 -1
  75. package/dist/types/filters/SSRWorker.d.ts.map +1 -1
  76. package/dist/types/filters/index.d.ts +4 -1
  77. package/dist/types/filters/index.d.ts.map +1 -1
  78. package/dist/types/index.d.ts +6 -2
  79. package/dist/types/index.d.ts.map +1 -1
  80. package/dist/types/initializers/DomParserInitializer.d.ts +2 -0
  81. package/dist/types/initializers/DomParserInitializer.d.ts.map +1 -1
  82. package/dist/types/proxy/SSRDomParserFilterDataHydrationProxy.d.ts +7 -0
  83. package/dist/types/proxy/SSRDomParserFilterDataHydrationProxy.d.ts.map +1 -0
  84. package/dist/types/proxy/index.d.ts +1 -4
  85. package/dist/types/proxy/index.d.ts.map +1 -1
  86. package/dist/umd-bundle/dooboostore-simple-boot-http-server-ssr.umd.js +56265 -10408
  87. package/dist/umd-bundle/dooboostore-simple-boot-http-server-ssr.umd.js.map +4 -4
  88. package/package.json +22 -15
  89. package/src/SimpleBootHttpSSRFactory.ts +1 -1
  90. package/src/SimpleBootHttpSSRServer.ts +5 -4
  91. package/src/bundle-entry.ts +0 -2
  92. package/src/filters/SSRDomParserFilter.ts +113 -126
  93. package/src/filters/SSRFilter.ts +7 -12
  94. package/src/filters/{SSRLinkDomDomFilter.ts → SSRLinkDomFilter.ts} +10 -15
  95. package/src/filters/SSRSimpleWebComponentDomParserFilter.ts +106 -0
  96. package/src/filters/SSRSimpleWebComponentFilter.ts +306 -0
  97. package/src/filters/SSRWorker.ts +1 -2
  98. package/src/filters/index.ts +5 -2
  99. package/src/index.ts +6 -9
  100. package/src/initializers/DomParserInitializer.ts +9 -2
  101. package/src/proxy/SSRDomParserFilterDataHydrationProxy.ts +63 -0
  102. package/src/proxy/index.ts +1 -4
  103. package/tsconfig.json +1 -0
  104. package/README.MD +0 -36
  105. package/dist/cjs/codes/HttpHeaders.js +0 -41
  106. package/dist/cjs/codes/HttpHeaders.js.map +0 -7
  107. package/dist/cjs/codes/Mimes.js +0 -33
  108. package/dist/cjs/codes/Mimes.js.map +0 -7
  109. package/dist/cjs/codes/index.js +0 -24
  110. package/dist/cjs/codes/index.js.map +0 -7
  111. package/dist/cjs/decorators/LoadAroundBefore.js +0 -54
  112. package/dist/cjs/decorators/LoadAroundBefore.js.map +0 -7
  113. package/dist/cjs/decorators/SaveAroundAfter.js +0 -53
  114. package/dist/cjs/decorators/SaveAroundAfter.js.map +0 -7
  115. package/dist/cjs/decorators/index.js +0 -24
  116. package/dist/cjs/decorators/index.js.map +0 -7
  117. package/dist/cjs/filters/IntentSchemeFilter.js +0 -92
  118. package/dist/cjs/filters/IntentSchemeFilter.js.map +0 -7
  119. package/dist/cjs/filters/SSRLinkDomDomFilter.js.map +0 -7
  120. package/dist/cjs/proxy/IntentSchemeFrontProxy.js +0 -87
  121. package/dist/cjs/proxy/IntentSchemeFrontProxy.js.map +0 -7
  122. package/dist/cjs/proxy/IntentSchemeServerProxy.js +0 -67
  123. package/dist/cjs/proxy/IntentSchemeServerProxy.js.map +0 -7
  124. package/dist/cjs/proxy/SymbolIntentApiServiceProxy.js +0 -138
  125. package/dist/cjs/proxy/SymbolIntentApiServiceProxy.js.map +0 -7
  126. package/dist/cjs/proxy/SymbolIntentApiServiceProxyBase.js +0 -35
  127. package/dist/cjs/proxy/SymbolIntentApiServiceProxyBase.js.map +0 -7
  128. package/dist/esm/codes/HttpHeaders.js +0 -17
  129. package/dist/esm/codes/HttpHeaders.js.map +0 -7
  130. package/dist/esm/codes/Mimes.js +0 -10
  131. package/dist/esm/codes/Mimes.js.map +0 -7
  132. package/dist/esm/codes/index.js +0 -3
  133. package/dist/esm/codes/index.js.map +0 -7
  134. package/dist/esm/decorators/LoadAroundBefore.js +0 -31
  135. package/dist/esm/decorators/LoadAroundBefore.js.map +0 -7
  136. package/dist/esm/decorators/SaveAroundAfter.js +0 -29
  137. package/dist/esm/decorators/SaveAroundAfter.js.map +0 -7
  138. package/dist/esm/decorators/index.js +0 -3
  139. package/dist/esm/decorators/index.js.map +0 -7
  140. package/dist/esm/filters/IntentSchemeFilter.js +0 -69
  141. package/dist/esm/filters/IntentSchemeFilter.js.map +0 -7
  142. package/dist/esm/filters/SSRLinkDomDomFilter.js.map +0 -7
  143. package/dist/esm/proxy/IntentSchemeFrontProxy.js +0 -64
  144. package/dist/esm/proxy/IntentSchemeFrontProxy.js.map +0 -7
  145. package/dist/esm/proxy/IntentSchemeServerProxy.js +0 -44
  146. package/dist/esm/proxy/IntentSchemeServerProxy.js.map +0 -7
  147. package/dist/esm/proxy/SymbolIntentApiServiceProxy.js +0 -115
  148. package/dist/esm/proxy/SymbolIntentApiServiceProxy.js.map +0 -7
  149. package/dist/esm/proxy/SymbolIntentApiServiceProxyBase.js +0 -12
  150. package/dist/esm/proxy/SymbolIntentApiServiceProxyBase.js.map +0 -7
  151. package/dist/types/codes/HttpHeaders.d.ts +0 -45
  152. package/dist/types/codes/HttpHeaders.d.ts.map +0 -1
  153. package/dist/types/codes/Mimes.d.ts +0 -31
  154. package/dist/types/codes/Mimes.d.ts.map +0 -1
  155. package/dist/types/codes/index.d.ts +0 -3
  156. package/dist/types/codes/index.d.ts.map +0 -1
  157. package/dist/types/decorators/LoadAroundBefore.d.ts +0 -2
  158. package/dist/types/decorators/LoadAroundBefore.d.ts.map +0 -1
  159. package/dist/types/decorators/SaveAroundAfter.d.ts +0 -3
  160. package/dist/types/decorators/SaveAroundAfter.d.ts.map +0 -1
  161. package/dist/types/decorators/index.d.ts +0 -3
  162. package/dist/types/decorators/index.d.ts.map +0 -1
  163. package/dist/types/filters/IntentSchemeFilter.d.ts +0 -20
  164. package/dist/types/filters/IntentSchemeFilter.d.ts.map +0 -1
  165. package/dist/types/filters/SSRLinkDomDomFilter.d.ts.map +0 -1
  166. package/dist/types/proxy/IntentSchemeFrontProxy.d.ts +0 -4
  167. package/dist/types/proxy/IntentSchemeFrontProxy.d.ts.map +0 -1
  168. package/dist/types/proxy/IntentSchemeServerProxy.d.ts +0 -4
  169. package/dist/types/proxy/IntentSchemeServerProxy.d.ts.map +0 -1
  170. package/dist/types/proxy/SymbolIntentApiServiceProxy.d.ts +0 -18
  171. package/dist/types/proxy/SymbolIntentApiServiceProxy.d.ts.map +0 -1
  172. package/dist/types/proxy/SymbolIntentApiServiceProxyBase.d.ts +0 -5
  173. package/dist/types/proxy/SymbolIntentApiServiceProxyBase.d.ts.map +0 -1
  174. package/src/codes/HttpHeaders.ts +0 -17
  175. package/src/codes/Mimes.ts +0 -6
  176. package/src/codes/index.ts +0 -2
  177. package/src/decorators/LoadAroundBefore.ts +0 -28
  178. package/src/decorators/SaveAroundAfter.ts +0 -27
  179. package/src/decorators/index.ts +0 -2
  180. package/src/filters/IntentSchemeFilter.ts +0 -69
  181. package/src/proxy/IntentSchemeFrontProxy.ts +0 -67
  182. package/src/proxy/IntentSchemeServerProxy.ts +0 -35
  183. package/src/proxy/SymbolIntentApiServiceProxy.ts +0 -115
  184. package/src/proxy/SymbolIntentApiServiceProxyBase.ts +0 -19
@@ -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) =>\n it.triggerPoint === '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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",
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, AsyncBlockingQueue, RandomUtils, MessageOperator, MessageInternal } from '@dooboostore/core';\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 * as JSDOM from 'jsdom';\nimport { NotFoundError } from '@dooboostore/simple-boot-http-server/errors/NotFoundError';\nimport { DomRenderProxy } from '@dooboostore/dom-render';\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.routingRouterModule(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 MessageInternal.firstValueFrom(\n // @ts-ignore\n simpleBootFront.routingObservable.pipe(\n // @ts-ignore\n MessageOperator.filter(\n (it) =>\n it.triggerPoint === 'end' &&\n typeof it.routerModule.intent.uri === 'string' &&\n targetUrl.endsWith(it.routerModule.intent.uri)\n ),\n // delay(1000),\n MessageOperator.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
  }
@@ -15,28 +15,24 @@ var __copyProps = (to, from, except, desc) => {
15
15
  return to;
16
16
  };
17
17
  var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod);
18
- var SSRLinkDomDomFilter_exports = {};
19
- __export(SSRLinkDomDomFilter_exports, {
20
- SSRLinkDomDomFilter: () => SSRLinkDomDomFilter
18
+ var SSRLinkDomFilter_exports = {};
19
+ __export(SSRLinkDomFilter_exports, {
20
+ SSRLinkDomFilter: () => SSRLinkDomFilter
21
21
  });
22
- module.exports = __toCommonJS(SSRLinkDomDomFilter_exports);
22
+ module.exports = __toCommonJS(SSRLinkDomFilter_exports);
23
23
  var import_HttpHeaders = require("@dooboostore/simple-boot-http-server/codes/HttpHeaders");
24
+ var import_core = require("@dooboostore/core");
24
25
  var import_Mimes = require("@dooboostore/simple-boot-http-server/codes/Mimes");
25
26
  var import_HttpStatus = require("@dooboostore/simple-boot-http-server/codes/HttpStatus");
26
- var import_AsyncBlockingQueue = require("@dooboostore/core/queues/AsyncBlockingQueue");
27
- var import_RandomUtils = require("@dooboostore/core/random/RandomUtils");
28
27
  var import_NotFoundError = require("@dooboostore/simple-boot-http-server/errors/NotFoundError");
29
- var import_DomRenderProxy = require("@dooboostore/dom-render/DomRenderProxy");
30
- var import_filter = require("@dooboostore/core/message/operators/filter");
31
- var import_first = require("@dooboostore/core/message/operators/first");
32
- var import_firstValueFrom = require("@dooboostore/core/message/internal/firstValueFrom");
28
+ var import_dom_render = require("@dooboostore/dom-render");
33
29
  var import_LinkedomInitializer = require("../initializers/LinkedomInitializer");
34
- class SSRLinkDomDomFilter {
30
+ class SSRLinkDomFilter {
35
31
  constructor(config, otherInstanceSim) {
36
32
  this.config = config;
37
33
  this.otherInstanceSim = otherInstanceSim;
38
34
  this.simpleBootFrontPool = [];
39
- this.simpleBootFrontQueue = new import_AsyncBlockingQueue.AsyncBlockingQueue();
35
+ this.simpleBootFrontQueue = new import_core.AsyncBlockingQueue();
40
36
  // private indexHTML: string;
41
37
  this.welcomUrl = "http://localhost";
42
38
  this.poolGeneration = 0;
@@ -69,9 +65,9 @@ class SSRLinkDomDomFilter {
69
65
  ).run();
70
66
  }
71
67
  async makeFront(window) {
72
- const name = import_RandomUtils.RandomUtils.uuid();
68
+ const name = import_core.RandomUtils.uuid();
73
69
  window.ssrUse = false;
74
- const option = this.config.factorySimFrontOption(import_DomRenderProxy.DomRenderProxy.final(window));
70
+ const option = this.config.factorySimFrontOption(import_dom_render.DomRenderProxy.final(window));
75
71
  const simpleBootFront = await this.config.factory.create(option, this.config.using, this.config.domExcludes);
76
72
  simpleBootFront.run(this.otherInstanceSim);
77
73
  simpleBootFront.generation = this.poolGeneration;
@@ -100,7 +96,7 @@ class SSRLinkDomDomFilter {
100
96
  delete simpleBootFront.option.window.server_side_data;
101
97
  const url = rr.reqUrlObj({ host: "localhost" });
102
98
  if (this.config.simpleBootFront?.notFoundError) {
103
- const intent = await simpleBootFront.getIntent(url.pathname);
99
+ const intent = await simpleBootFront.routingRouterModule(url.pathname);
104
100
  if (intent.module === void 0 && !intent.getRouterPathData(rr.reqUrlPathName)) {
105
101
  throw new import_NotFoundError.NotFoundError({ message: `Not Found: ${rr.reqUrlPathName}` });
106
102
  }
@@ -108,15 +104,15 @@ class SSRLinkDomDomFilter {
108
104
  const targetUrl = url.toString();
109
105
  await simpleBootFront.goRouting(targetUrl);
110
106
  await new Promise((r) => setTimeout(r, 0));
111
- const data = await (0, import_firstValueFrom.firstValueFrom)(
107
+ const data = await import_core.MessageInternal.firstValueFrom(
112
108
  // @ts-ignore
113
- simpleBootFront.routingSubjectObservable.pipe(
109
+ simpleBootFront.routingObservable.pipe(
114
110
  // @ts-ignore
115
- (0, import_filter.filter)(
111
+ import_core.MessageOperator.filter(
116
112
  (it) => it.triggerPoint === "end" && typeof it.routerModule.intent.uri === "string" && targetUrl.endsWith(it.routerModule.intent.uri)
117
113
  ),
118
114
  // delay(1000),
119
- (0, import_first.first)()
115
+ import_core.MessageOperator.first()
120
116
  )
121
117
  );
122
118
  const html = this.makeHTML(simpleBootFront);
@@ -178,6 +174,6 @@ class SSRLinkDomDomFilter {
178
174
  }
179
175
  // Annotate the CommonJS export names for ESM import in node:
180
176
  0 && (module.exports = {
181
- SSRLinkDomDomFilter
177
+ SSRLinkDomFilter
182
178
  });
183
- //# sourceMappingURL=SSRLinkDomDomFilter.js.map
179
+ //# sourceMappingURL=SSRLinkDomFilter.js.map
@@ -0,0 +1,7 @@
1
+ {
2
+ "version": 3,
3
+ "sources": ["../../../src/filters/SSRLinkDomFilter.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, AsyncBlockingQueue, RandomUtils, MessageOperator, MessageInternal } from '@dooboostore/core';\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 * as JSDOM from 'jsdom';\nimport { NotFoundError } from '@dooboostore/simple-boot-http-server/errors/NotFoundError';\nimport { DomRenderProxy } from '@dooboostore/dom-render';\nimport { parseHTML } from 'linkedom';\nimport { LinkedomInitializer } from '../initializers/LinkedomInitializer';\n\nexport type LinkDomFactoryAndParams = {\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 SSRLinkDomFilter 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: LinkDomFactoryAndParams,\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 }\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 async makePage() {\n return new LinkedomInitializer(\n this.config.frontDistPath,\n this.config.frontDistIndexFileName || 'index.html',\n { url: this.welcomUrl }\n ).run();\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(window: Window) {\n const name = RandomUtils.uuid();\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).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 async pushQueue() {\n if (this.simpleBootFrontPool.length < this.config.poolOption.max) {\n this.enqueueFrontApp(await this.makeFront(await this.makePage()));\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 (simpleBootFront.option.window as any).ssrUse = true;\n delete (simpleBootFront.option.window as any).server_side_data;\n const url = rr.reqUrlObj({ host: 'localhost' });\n if (this.config.simpleBootFront?.notFoundError) {\n // intent router check first\n const intent = await simpleBootFront.routingRouterModule(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 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\n\n // simpleBootFront.routingSubjectObservable.subscribe(it=>{\n // console.log('zzzzzzzzzzzzzzzzzzz', it);\n // if (it.triggerPoint==='end') {\n // console.log('zzz@@', it.routerModule.intent);\n // }\n // })\n\n const data = await MessageInternal.firstValueFrom(\n // @ts-ignore\n simpleBootFront.routingObservable.pipe(\n // @ts-ignore\n MessageOperator.filter(\n (it) =>\n it.triggerPoint === 'end' &&\n typeof it.routerModule.intent.uri === 'string' &&\n targetUrl.endsWith(it.routerModule.intent.uri)\n ),\n // delay(1000),\n MessageOperator.first()\n )\n );\n // console.log('???????done');\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 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 this.pushQueue();\n } else {\n // Current instance, return to queue\n this.simpleBootFrontQueue.enqueue(simpleBootFront);\n }\n }\n return false;\n } else {\n return true;\n }\n }\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.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 return true;\n }\n}\n"],
5
+ "mappings": "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",
6
+ "names": []
7
+ }
@@ -0,0 +1,81 @@
1
+ var __defProp = Object.defineProperty;
2
+ var __getOwnPropDesc = Object.getOwnPropertyDescriptor;
3
+ var __getOwnPropNames = Object.getOwnPropertyNames;
4
+ var __hasOwnProp = Object.prototype.hasOwnProperty;
5
+ var __export = (target, all) => {
6
+ for (var name in all)
7
+ __defProp(target, name, { get: all[name], enumerable: true });
8
+ };
9
+ var __copyProps = (to, from, except, desc) => {
10
+ if (from && typeof from === "object" || typeof from === "function") {
11
+ for (let key of __getOwnPropNames(from))
12
+ if (!__hasOwnProp.call(to, key) && key !== except)
13
+ __defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable });
14
+ }
15
+ return to;
16
+ };
17
+ var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod);
18
+ var SSRSimpleWebComponentDomParserFilter_exports = {};
19
+ __export(SSRSimpleWebComponentDomParserFilter_exports, {
20
+ SSRSimpleWebComponentDomParserFilter: () => SSRSimpleWebComponentDomParserFilter
21
+ });
22
+ module.exports = __toCommonJS(SSRSimpleWebComponentDomParserFilter_exports);
23
+ var import_HttpHeaders = require("@dooboostore/simple-boot-http-server/codes/HttpHeaders");
24
+ var import_Mimes = require("@dooboostore/simple-boot-http-server/codes/Mimes");
25
+ var import_HttpStatus = require("@dooboostore/simple-boot-http-server/codes/HttpStatus");
26
+ var import_DomParserInitializer = require("../initializers/DomParserInitializer");
27
+ class SSRSimpleWebComponentDomParserFilter {
28
+ constructor(config) {
29
+ this.config = config;
30
+ this.welcomUrl = "http://localhost";
31
+ this.welcomUrl = config.welcomUrl || this.welcomUrl;
32
+ }
33
+ async onInit(app) {
34
+ }
35
+ async onDestroy() {
36
+ }
37
+ async proceedBefore({ rr }) {
38
+ if (this.config.ssrExcludeFilter?.(rr)) {
39
+ return false;
40
+ }
41
+ if (rr.reqHasAcceptHeader(import_Mimes.Mimes.TextHtml) || rr.reqHasAcceptHeader(import_Mimes.Mimes.All)) {
42
+ const url = rr.reqUrlObj({ host: "localhost" });
43
+ const targetUrl = url.toString() ?? this.welcomUrl;
44
+ const domParserInitializer = new import_DomParserInitializer.DomParserInitializer(this.config.frontDistPath, this.config.frontDistIndexFileName || "index.html", { url: targetUrl });
45
+ const window = await domParserInitializer.run();
46
+ console.log("vvvv22aa");
47
+ try {
48
+ if (this.config.registerComponents) {
49
+ await this.config.registerComponents(window);
50
+ }
51
+ const html = this.makeHTML(window);
52
+ await this.writeOkHtmlAndEnd({ rr }, html);
53
+ } finally {
54
+ window.close();
55
+ domParserInitializer.destroy();
56
+ }
57
+ return false;
58
+ }
59
+ return true;
60
+ }
61
+ makeHTML(window) {
62
+ let html = window.document.documentElement.outerHTML;
63
+ if (!/^<!DOCTYPE html>/i.test(html)) {
64
+ html = "<!DOCTYPE html>\n" + html;
65
+ }
66
+ return html;
67
+ }
68
+ async writeOkHtmlAndEnd({ rr, status = import_HttpStatus.HttpStatus.Ok }, html) {
69
+ rr.resStatusCode(status);
70
+ rr.resSetHeader(import_HttpHeaders.HttpHeaders.ContentType, import_Mimes.Mimes.TextHtml);
71
+ await rr.resEnd(html);
72
+ }
73
+ async proceedAfter() {
74
+ return true;
75
+ }
76
+ }
77
+ // Annotate the CommonJS export names for ESM import in node:
78
+ 0 && (module.exports = {
79
+ SSRSimpleWebComponentDomParserFilter
80
+ });
81
+ //# sourceMappingURL=SSRSimpleWebComponentDomParserFilter.js.map
@@ -0,0 +1,7 @@
1
+ {
2
+ "version": 3,
3
+ "sources": ["../../../src/filters/SSRSimpleWebComponentDomParserFilter.ts"],
4
+ "sourcesContent": ["import {RequestResponse} from '@dooboostore/simple-boot-http-server/models/RequestResponse';\nimport {HttpHeaders} from '@dooboostore/simple-boot-http-server/codes/HttpHeaders';\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 {DomParserInitializer} from '../initializers/DomParserInitializer';\n\nexport type SWCSSRDomParserConfig = {\n frontDistPath: string;\n frontDistIndexFileName?: string;\n welcomUrl?: string;\n ssrExcludeFilter?: (rr: RequestResponse) => boolean;\n /**\n * Function to register components for each request.\n */\n registerComponents?: (window: any) => Promise<void> | void;\n};\n\n/**\n * SSR Filter specifically for Simple Web Component (SWC).\n * It utilizes @dooboostore/dom-parser for rendering and DSD support.\n */\nexport class SSRSimpleWebComponentDomParserFilter implements Filter {\n private welcomUrl = 'http://localhost';\n\n constructor(public config: SWCSSRDomParserConfig) {\n this.welcomUrl = config.welcomUrl || this.welcomUrl;\n }\n\n async onInit(app: SimpleBootHttpServer) {}\n\n async onDestroy() {}\n\n async proceedBefore({ rr }: { rr: RequestResponse; app: SimpleBootHttpServer; carrier: Map<string, any> }) {\n if (this.config.ssrExcludeFilter?.(rr)) {\n return false;\n }\n\n if (rr.reqHasAcceptHeader(Mimes.TextHtml) || rr.reqHasAcceptHeader(Mimes.All)) {\n const url = rr.reqUrlObj({ host: 'localhost' });\n const targetUrl = url.toString() ?? this.welcomUrl;\n\n // 1. Initialize Virtual DOM Environment\n const domParserInitializer = new DomParserInitializer(this.config.frontDistPath, this.config.frontDistIndexFileName || 'index.html', { url: targetUrl });\n const window = await domParserInitializer.run();\n\n console.log('vvvv22aa');\n // web component \uACBD\uC6B0 \uC790\uAE30 tagName\uC744 \uC0DD\uC131\uC790 \uC5D0\uAC8C HTMLElementBase\uC5D0\uB118\uACA8\uC918\uC57C\uB418\uAE30\uB584\uBB38\uC5D0\n // const getTagName = (type: ConstructorType<any>) => {\n // const zz = getElementConfig(type);\n // return zz.name;\n // };\n // (window as any).HTMLElement = class extends HTMLElementBase {\n // constructor(...args: any[]) {\n // const ctor = new.target as any; // \uC774\uB7F0 \uC288\uAC00 \uAE30\uB2A5\uC774...\n // const resolvedTagName = getTagName(ctor);\n // super(resolvedTagName, args[0]);\n // }\n // }\n\n\n try {\n // 2. Register Components if provided\n // We use SwcApplication inside the callback or directly here.\n if (this.config.registerComponents) {\n await this.config.registerComponents(window);\n }\n\n // window.document.querySelector('.sidebar-space').innerHTML = '\uC528\uBC1C\uB188\uC544.';\n // await new Promise<void>((resolve, reject) => setTimeout(resolve, 100));\n // await new Promise<void>((resolve, reject) => setTimeout(resolve, 5000));\n // window.document.body.innerHTML = '';\n // window.document.body.setAttribute('ssr-use', 'true');\n // 3. Generate Final HTML\n const html = this.makeHTML(window);\n // console.log('html: \uD83D\uDC88', html);\n await this.writeOkHtmlAndEnd({ rr }, html);\n } finally {\n // 4. Cleanup\n window.close();\n domParserInitializer.destroy();\n }\n return false;\n }\n return true;\n }\n\n makeHTML(window: any) {\n let html = window.document.documentElement.outerHTML;\n if (!/^<!DOCTYPE html>/i.test(html)) {\n html = '<!DOCTYPE html>\\n' + html;\n }\n return html;\n }\n\n async writeOkHtmlAndEnd({ rr, status = HttpStatus.Ok }: { rr: RequestResponse; status?: HttpStatus }, html: string) {\n rr.resStatusCode(status);\n rr.resSetHeader(HttpHeaders.ContentType, Mimes.TextHtml);\n await rr.resEnd(html);\n }\n\n async proceedAfter() {\n return true;\n }\n}\n"],
5
+ "mappings": ";;;;;;;;;;;;;;;;;AAAA;AAAA;AAAA;AAAA;AAAA;AACA,yBAA0B;AAE1B,mBAAoB;AACpB,wBAAyB;AAEzB,kCAAmC;AAiB5B,MAAM,qCAAuD;AAAA,EAGlE,YAAmB,QAA+B;AAA/B;AAFnB,SAAQ,YAAY;AAGlB,SAAK,YAAY,OAAO,aAAa,KAAK;AAAA,EAC5C;AAAA,EAEA,MAAM,OAAO,KAA2B;AAAA,EAAC;AAAA,EAEzC,MAAM,YAAY;AAAA,EAAC;AAAA,EAEnB,MAAM,cAAc,EAAE,GAAG,GAAkF;AACzG,QAAI,KAAK,OAAO,mBAAmB,EAAE,GAAG;AACtC,aAAO;AAAA,IACT;AAEA,QAAI,GAAG,mBAAmB,mBAAM,QAAQ,KAAK,GAAG,mBAAmB,mBAAM,GAAG,GAAG;AAC7E,YAAM,MAAM,GAAG,UAAU,EAAE,MAAM,YAAY,CAAC;AAC9C,YAAM,YAAY,IAAI,SAAS,KAAK,KAAK;AAGzC,YAAM,uBAAuB,IAAI,iDAAqB,KAAK,OAAO,eAAe,KAAK,OAAO,0BAA0B,cAAc,EAAE,KAAK,UAAU,CAAC;AACvJ,YAAM,SAAS,MAAM,qBAAqB,IAAI;AAE9C,cAAQ,IAAI,UAAU;AAetB,UAAI;AAGF,YAAI,KAAK,OAAO,oBAAoB;AAClC,gBAAM,KAAK,OAAO,mBAAmB,MAAM;AAAA,QAC7C;AAQA,cAAM,OAAO,KAAK,SAAS,MAAM;AAEjC,cAAM,KAAK,kBAAkB,EAAE,GAAG,GAAG,IAAI;AAAA,MAC3C,UAAE;AAEA,eAAO,MAAM;AACb,6BAAqB,QAAQ;AAAA,MAC/B;AACA,aAAO;AAAA,IACT;AACA,WAAO;AAAA,EACT;AAAA,EAEA,SAAS,QAAa;AACpB,QAAI,OAAO,OAAO,SAAS,gBAAgB;AAC3C,QAAI,CAAC,oBAAoB,KAAK,IAAI,GAAG;AACnC,aAAO,sBAAsB;AAAA,IAC/B;AACA,WAAO;AAAA,EACT;AAAA,EAEA,MAAM,kBAAkB,EAAE,IAAI,SAAS,6BAAW,GAAG,GAAiD,MAAc;AAClH,OAAG,cAAc,MAAM;AACvB,OAAG,aAAa,+BAAY,aAAa,mBAAM,QAAQ;AACvD,UAAM,GAAG,OAAO,IAAI;AAAA,EACtB;AAAA,EAEA,MAAM,eAAe;AACnB,WAAO;AAAA,EACT;AACF;",
6
+ "names": []
7
+ }
@@ -0,0 +1,223 @@
1
+ var __create = Object.create;
2
+ var __defProp = Object.defineProperty;
3
+ var __getOwnPropDesc = Object.getOwnPropertyDescriptor;
4
+ var __getOwnPropNames = Object.getOwnPropertyNames;
5
+ var __getProtoOf = Object.getPrototypeOf;
6
+ var __hasOwnProp = Object.prototype.hasOwnProperty;
7
+ var __export = (target, all) => {
8
+ for (var name in all)
9
+ __defProp(target, name, { get: all[name], enumerable: true });
10
+ };
11
+ var __copyProps = (to, from, except, desc) => {
12
+ if (from && typeof from === "object" || typeof from === "function") {
13
+ for (let key of __getOwnPropNames(from))
14
+ if (!__hasOwnProp.call(to, key) && key !== except)
15
+ __defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable });
16
+ }
17
+ return to;
18
+ };
19
+ var __toESM = (mod, isNodeMode, target) => (target = mod != null ? __create(__getProtoOf(mod)) : {}, __copyProps(
20
+ // If the importer is in node compatibility mode or this is not an ESM
21
+ // file that has been converted to a CommonJS file using a Babel-
22
+ // compatible transform (i.e. "__esModule" has not been set), then set
23
+ // "default" to the CommonJS "module.exports" for node compatibility.
24
+ isNodeMode || !mod || !mod.__esModule ? __defProp(target, "default", { value: mod, enumerable: true }) : target,
25
+ mod
26
+ ));
27
+ var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod);
28
+ var SSRSimpleWebComponentFilter_exports = {};
29
+ __export(SSRSimpleWebComponentFilter_exports, {
30
+ SSRSimpleWebComponentFilter: () => SSRSimpleWebComponentFilter
31
+ });
32
+ module.exports = __toCommonJS(SSRSimpleWebComponentFilter_exports);
33
+ var import_HttpHeaders = require("@dooboostore/simple-boot-http-server/codes/HttpHeaders");
34
+ var import_Mimes = require("@dooboostore/simple-boot-http-server/codes/Mimes");
35
+ var import_HttpStatus = require("@dooboostore/simple-boot-http-server/codes/HttpStatus");
36
+ var import_simple_boot_http_server = require("@dooboostore/simple-boot-http-server");
37
+ class SSRSimpleWebComponentFilter {
38
+ constructor(config) {
39
+ this.config = config;
40
+ this.welcomUrl = "http://localhost";
41
+ this.welcomUrl = config.welcomUrl || this.welcomUrl;
42
+ }
43
+ async onInit(app) {
44
+ const { chromium } = await import("playwright");
45
+ this.browser = await chromium.launch({
46
+ headless: true,
47
+ args: ["--no-sandbox", "--disable-setuid-sandbox", "--disable-web-security"]
48
+ // Allow CORS for local dev
49
+ });
50
+ console.log("\u{1F680} Playwright Browser initialized for SSR Filter");
51
+ }
52
+ async onDestroy() {
53
+ if (this.browser) {
54
+ await this.browser.close();
55
+ console.log("\u{1F6D1} Playwright Browser closed");
56
+ }
57
+ }
58
+ async proceedBefore({ rr, app, carrier }) {
59
+ if (this.config.ssrExcludeFilter?.(rr)) {
60
+ return true;
61
+ }
62
+ console.log("playwright2222222", rr.reqHeader("x-ssr-browser"));
63
+ if (rr.reqHeader("x-ssr-browser") === "playwright") {
64
+ return true;
65
+ }
66
+ if (rr.reqIsMethod(import_simple_boot_http_server.HttpMethod.GET) && rr.reqHasContentTypeHeader(import_Mimes.Mimes.TextHtml)) {
67
+ const protocol = app.option.protocol || "http";
68
+ const host = app.option.hostname || "127.0.0.1";
69
+ const port = app.option.port || 80;
70
+ const url = rr.reqUrlObj({ host: `${host}:${port}` });
71
+ url.protocol = protocol;
72
+ const targetUrl = url.toString() ?? this.welcomUrl;
73
+ if (!this.browser) {
74
+ console.error("Playwright browser is not initialized. Bypassing SSR.");
75
+ return true;
76
+ }
77
+ const context = await this.browser.newContext();
78
+ const page = await context.newPage();
79
+ try {
80
+ await page.route("**/*", (route) => {
81
+ const request = route.request();
82
+ const isLocal = request.url().startsWith(targetUrl) || request.url().includes("localhost") || request.url().includes("127.0.0.1");
83
+ const isApi = request.url().includes("/api/");
84
+ if (isLocal && !isApi) {
85
+ const headers = {
86
+ ...request.headers(),
87
+ "x-ssr-browser": "playwright"
88
+ };
89
+ route.continue({ headers }).catch(() => {
90
+ });
91
+ } else {
92
+ route.continue().catch(() => {
93
+ });
94
+ }
95
+ });
96
+ let resolvePlaywrightReady;
97
+ const playwrightReadyPromise = new Promise((resolve) => {
98
+ resolvePlaywrightReady = resolve;
99
+ });
100
+ await page.exposeFunction("onPlaywrightReady", () => {
101
+ console.log('\u26A1\uFE0F [SSR:Playwright] Received "onPlaywrightReady" signal from framework!');
102
+ resolvePlaywrightReady();
103
+ });
104
+ await page.goto(targetUrl, {
105
+ waitUntil: this.config.playwright?.waitUntil ?? "networkidle",
106
+ timeout: this.config.playwright?.timeout ?? 15e3
107
+ });
108
+ await Promise.race([
109
+ playwrightReadyPromise,
110
+ // 직접 exposeFunction에서 트리거된 Promise
111
+ page.waitForFunction(
112
+ () => {
113
+ return window._playwrightReadySignalFired === true;
114
+ },
115
+ { timeout: this.config.playwright?.timeout ?? 15e3 }
116
+ ),
117
+ page.waitForFunction(
118
+ () => {
119
+ return document.body.innerHTML.trim().length > 100;
120
+ },
121
+ { timeout: this.config.playwright?.timeout ?? 15e3 }
122
+ )
123
+ ]).catch(() => console.log("Wait for app mount timeout... proceeding anyway"));
124
+ if (this.config.playwright?.waitForSelector) {
125
+ await page.waitForSelector(this.config.playwright.waitForSelector, {
126
+ timeout: this.config.playwright?.timeout ?? 15e3
127
+ });
128
+ }
129
+ if (this.config.playwright?.waitForTimeout) {
130
+ await page.waitForTimeout(this.config.playwright.waitForTimeout);
131
+ }
132
+ await page.evaluate(() => {
133
+ document.body.setAttribute("ssr-use", "true");
134
+ });
135
+ const html = await page.evaluate((ignoreTags) => {
136
+ const skipTags = new Set(ignoreTags || []);
137
+ function serializeNode(node, inBody = false) {
138
+ if (node.nodeType === Node.TEXT_NODE) {
139
+ const text = node.textContent || "";
140
+ return text.replace(/&/g, "&amp;").replace(/</g, "&lt;").replace(/>/g, "&gt;");
141
+ }
142
+ if (node.nodeType === Node.COMMENT_NODE) {
143
+ return `<!--${node.textContent}-->`;
144
+ }
145
+ if (node.nodeType !== Node.ELEMENT_NODE) {
146
+ return "";
147
+ }
148
+ const el = node;
149
+ const tag = el.tagName.toLowerCase();
150
+ const isBody = tag === "body";
151
+ const isInsideBody = inBody || isBody;
152
+ if (isInsideBody && skipTags.has(tag)) {
153
+ return "";
154
+ }
155
+ let s = `<${tag}`;
156
+ for (let i = 0; i < el.attributes.length; i++) {
157
+ const attr = el.attributes[i];
158
+ s += ` ${attr.name}="${attr.value.replace(/"/g, "&quot;")}"`;
159
+ }
160
+ const voidElements = /* @__PURE__ */ new Set(["area", "base", "br", "col", "embed", "hr", "img", "input", "link", "meta", "param", "source", "track", "wbr"]);
161
+ if (voidElements.has(tag)) {
162
+ s += ">";
163
+ return s;
164
+ }
165
+ s += ">";
166
+ if (el.shadowRoot) {
167
+ s += `<template shadowrootmode="${el.shadowRoot.mode}">`;
168
+ for (let i = 0; i < el.shadowRoot.childNodes.length; i++) {
169
+ s += serializeNode(el.shadowRoot.childNodes[i], isInsideBody);
170
+ }
171
+ s += "</template>";
172
+ }
173
+ for (let i = 0; i < el.childNodes.length; i++) {
174
+ s += serializeNode(el.childNodes[i], isInsideBody);
175
+ }
176
+ s += `</${tag}>`;
177
+ return s;
178
+ }
179
+ let result = "<!DOCTYPE html>\n<html";
180
+ const htmlNode = document.documentElement;
181
+ for (let i = 0; i < htmlNode.attributes.length; i++) {
182
+ const attr = htmlNode.attributes[i];
183
+ result += ` ${attr.name}="${attr.value.replace(/"/g, "&quot;")}"`;
184
+ }
185
+ result += ">\n";
186
+ if (document.head) result += serializeNode(document.head, false);
187
+ result += "\n";
188
+ if (document.body) result += serializeNode(document.body, true);
189
+ result += "\n</html>";
190
+ return result;
191
+ }, this.config.playwright?.ignoreTags || []);
192
+ console.log(`\u{1F488} [SSR:Playwright] Successfully rendered ${targetUrl}`);
193
+ await this.writeOkHtmlAndEnd({ rr }, this.makeHTML(html));
194
+ } catch (e) {
195
+ console.error(`Playwright SSR Error for ${targetUrl}:`, e);
196
+ return true;
197
+ } finally {
198
+ await context.close();
199
+ }
200
+ return false;
201
+ }
202
+ return true;
203
+ }
204
+ makeHTML(html) {
205
+ if (!/^<!DOCTYPE html>/i.test(html)) {
206
+ html = "<!DOCTYPE html>\n" + html;
207
+ }
208
+ return html;
209
+ }
210
+ async writeOkHtmlAndEnd({ rr, status = import_HttpStatus.HttpStatus.Ok }, html) {
211
+ rr.resStatusCode(status);
212
+ rr.resSetHeader(import_HttpHeaders.HttpHeaders.ContentType, import_Mimes.Mimes.TextHtml);
213
+ await rr.resEnd(html);
214
+ }
215
+ async proceedAfter() {
216
+ return true;
217
+ }
218
+ }
219
+ // Annotate the CommonJS export names for ESM import in node:
220
+ 0 && (module.exports = {
221
+ SSRSimpleWebComponentFilter
222
+ });
223
+ //# sourceMappingURL=SSRSimpleWebComponentFilter.js.map
@@ -0,0 +1,7 @@
1
+ {
2
+ "version": 3,
3
+ "sources": ["../../../src/filters/SSRSimpleWebComponentFilter.ts"],
4
+ "sourcesContent": ["import { RequestResponse } from '@dooboostore/simple-boot-http-server/models/RequestResponse';\nimport { HttpHeaders } from '@dooboostore/simple-boot-http-server/codes/HttpHeaders';\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 path from 'path';\nimport fs from 'fs';\nimport {HttpMethod} from \"@dooboostore/simple-boot-http-server\";\n\nexport type SWCSSRConfig = {\n frontDistPath: string;\n frontDistIndexFileName?: string;\n welcomUrl?: string;\n ssrExcludeFilter?: (rr: RequestResponse) => boolean;\n /**\n * (Deprecated for Playwright)\n * Function to register components for each request.\n * Playwright evaluates real JS files loaded from your index.html,\n * so component registration happens automatically in the browser context.\n */\n registerComponents?: (window: any) => Promise<void> | void;\n playwright?: {\n waitUntil?: 'load' | 'domcontentloaded' | 'networkidle' | 'commit';\n waitForSelector?: string;\n waitForTimeout?: number;\n timeout?: number;\n ignoreTags?: string[];\n };\n};\n\n/**\n * SSR Filter specifically for Simple Web Component (SWC).\n * It utilizes Playwright to render the page robustly and perfectly matching browser specs.\n *\n * ### Playwright Setup & Requirements\n *\n * To use this filter, Playwright must be installed in your server environment:\n * 1. Install playwright package: `npm install playwright` or `pnpm add playwright`\n * 2. Install browsers: `npx playwright install chromium`\n *\n * If running inside a Docker container (e.g., Alpine Linux), you must use an image that supports Playwright\n * or manually install OS dependencies. Playwright provides official Docker images: `mcr.microsoft.com/playwright:v1.x.x-focal`.\n */\nexport class SSRSimpleWebComponentFilter implements Filter {\n private welcomUrl = 'http://localhost';\n private browser?: any;\n\n constructor(public config: SWCSSRConfig) {\n this.welcomUrl = config.welcomUrl || this.welcomUrl;\n }\n\n async onInit(app: SimpleBootHttpServer) {\n // 1. Initialize Playwright browser when the server starts\n const { chromium } = await import('playwright');\n this.browser = await chromium.launch({\n headless: true,\n args: ['--no-sandbox', '--disable-setuid-sandbox', '--disable-web-security'] // Allow CORS for local dev\n });\n console.log('\uD83D\uDE80 Playwright Browser initialized for SSR Filter');\n }\n\n async onDestroy() {\n if (this.browser) {\n await this.browser.close();\n console.log('\uD83D\uDED1 Playwright Browser closed');\n }\n }\n\n async proceedBefore({ rr, app, carrier }: { rr: RequestResponse; app: SimpleBootHttpServer; carrier: Map<string, any> }) {\n if (this.config.ssrExcludeFilter?.(rr)) {\n return true; // Bypass SSR and continue server chain\n }\n\n console.log('playwright2222222', rr.reqHeader('x-ssr-browser'));\n\n // 2. Prevent Infinite Loop:\n // If the request comes from Playwright itself, bypass SSR and serve the original static SPA file.\n if (rr.reqHeader('x-ssr-browser') === 'playwright') {\n return true;\n }\n\n if (rr.reqIsMethod(HttpMethod.GET) && rr.reqHasContentTypeHeader(Mimes.TextHtml)) {\n // Build target URL for Playwright to visit\n // Use the server's actual listening address and port if available\n const protocol = app.option.protocol || 'http';\n const host = app.option.hostname || '127.0.0.1';\n const port = app.option.port || 80;\n\n const url = rr.reqUrlObj({ host: `${host}:${port}` });\n url.protocol = protocol;\n\n const targetUrl = url.toString() ?? this.welcomUrl;\n\n if (!this.browser) {\n console.error('Playwright browser is not initialized. Bypassing SSR.');\n return true;\n }\n\n // Create a fresh context for isolation\n // IMPORTANT: We do NOT use `extraHTTPHeaders` globally because it attaches the header to EVERY request\n // Playwright makes (including CORS requests to FontAwesome or API requests).\n // Instead, we will set the header ONLY for the initial navigation request to our server.\n const context = await this.browser.newContext();\n const page = await context.newPage();\n\n try {\n // Intercept ONLY requests going to our local server and append the bypass header\n await page.route('**/*', route => {\n const request = route.request();\n\n // Only append the x-ssr-browser header for requests to the local server that are NOT API requests\n const isLocal = request.url().startsWith(targetUrl) || request.url().includes('localhost') || request.url().includes('127.0.0.1');\n const isApi = request.url().includes('/api/');\n\n if (isLocal && !isApi) {\n const headers = {\n ...request.headers(),\n 'x-ssr-browser': 'playwright'\n };\n route.continue({ headers }).catch(() => {});\n } else {\n // For external requests (like font-awesome CORS) or API calls, do not add the custom header\n route.continue().catch(() => {});\n }\n });\n\n // 3. Navigate to the page and wait for the framework to finish rendering\n // but normally Playwright just navigates to the targetUrl and loads the real SPA resources.\n\n // \uD83D\uDCA1 Playwright \u2194 Framework \uD1B5\uC2E0 \uC124\uC815\n // \uD504\uB860\uD2B8\uC5D4\uB4DC\uC758 `bootfactory.ts` \uC548\uC758 `onRouteChanged` \uB4F1\uC5D0\uC11C\n // `if (window.onPlaywrightReady) window.onPlaywrightReady()` \uB77C\uACE0 \uD638\uCD9C\uD574\uC8FC\uBA74,\n // \uC544\uB798\uC758 Promise\uAC00 \uC989\uC2DC resolve \uB418\uB3C4\uB85D \uC5F0\uACB0\uD569\uB2C8\uB2E4.\n let resolvePlaywrightReady: () => void;\n const playwrightReadyPromise = new Promise<void>(resolve => {\n resolvePlaywrightReady = resolve;\n });\n\n await page.exposeFunction('onPlaywrightReady', () => {\n console.log('\u26A1\uFE0F [SSR:Playwright] Received \"onPlaywrightReady\" signal from framework!');\n resolvePlaywrightReady();\n });\n\n // 3. Navigate to the page and wait for the framework to finish rendering\n // Since the server will return the `index.html` (due to the bypass header), Playwright will download\n // your main.js / bundle.js, evaluate it, and the Custom Elements will register themselves naturally!\n await page.goto(targetUrl, {\n waitUntil: this.config.playwright?.waitUntil ?? 'networkidle',\n timeout: this.config.playwright?.timeout ?? 15000\n });\n\n // \uD83D\uDCA1 Framework Load Wait (Crucial for SWC)\n // Wait for EITHER the framework to call `window.onPlaywrightReady()` OR a specific innerHTML condition\n await Promise.race([\n playwrightReadyPromise, // \uC9C1\uC811 exposeFunction\uC5D0\uC11C \uD2B8\uB9AC\uAC70\uB41C Promise\n\n page.waitForFunction(\n () => {\n // Fallback 1: If explicit signal variable is set\n return (window as any)._playwrightReadySignalFired === true;\n },\n { timeout: this.config.playwright?.timeout ?? 15000 }\n ),\n\n page.waitForFunction(\n () => {\n // Fallback 2: If no signal, just wait until body has content\n return document.body.innerHTML.trim().length > 100;\n },\n { timeout: this.config.playwright?.timeout ?? 15000 }\n )\n ]).catch(() => console.log('Wait for app mount timeout... proceeding anyway'));\n\n // \uAC15\uC81C\uB85C \uCEF4\uD3EC\uB10C\uD2B8 \uB80C\uB354\uB9C1 \uBC0F \uD3F0\uD2B8\uC5B4\uC378 \uB4F1 \uB9AC\uC18C\uC2A4 \uB85C\uB529 \uB300\uAE30 \uC2DC\uAC04 \uCD94\uAC00 (\uC548\uC804 \uC7A5\uCE58)\n // onPlaywrightReady \uC2E0\uD638\uAC00 \uB5A8\uC5B4\uC838\uB3C4, \uBE44\uB3D9\uAE30 \uB80C\uB354\uB9C1(SwcLoop \uB4F1)\uC774 DOM\uC5D0 \uC644\uC804\uD788 \uBC18\uC601\uB418\uB294 \uB370\n // \uC57D\uAC04\uC758 Microtask \uC9C0\uC5F0\uC774 \uC788\uC744 \uC218 \uC788\uC73C\uBBC0\uB85C \uC544\uC8FC \uC9E7\uAC8C\uB9CC \uAE30\uB2E4\uB824 \uC90D\uB2C8\uB2E4.\n // await new Promise(resolve => setTimeout(resolve, 300));\n\n // Optional: Wait for a specific component to be visible\n if (this.config.playwright?.waitForSelector) {\n await page.waitForSelector(this.config.playwright.waitForSelector, {\n timeout: this.config.playwright?.timeout ?? 15000\n });\n }\n\n // Optional: Hardcoded wait time if explicitly set (fallback)\n if (this.config.playwright?.waitForTimeout) {\n await page.waitForTimeout(this.config.playwright.waitForTimeout);\n }\n\n // 4. Set SSR Attribute before extracting HTML\n await page.evaluate(() => {\n document.body.setAttribute('ssr-use', 'true');\n });\n\n // 5. Generate Final HTML\n const html = await page.evaluate(ignoreTags => {\n const skipTags = new Set(ignoreTags || []);\n\n function serializeNode(node: Node, inBody: boolean = false): string {\n if (node.nodeType === Node.TEXT_NODE) {\n const text = node.textContent || '';\n return text.replace(/&/g, '&amp;').replace(/</g, '&lt;').replace(/>/g, '&gt;');\n }\n if (node.nodeType === Node.COMMENT_NODE) {\n return `<!--${node.textContent}-->`;\n }\n if (node.nodeType !== Node.ELEMENT_NODE) {\n return '';\n }\n\n const el = node as Element;\n const tag = el.tagName.toLowerCase();\n const isBody = tag === 'body';\n const isInsideBody = inBody || isBody;\n\n // \uD83D\uDEAB Skip ignored tags (like <style>) ONLY if we are inside the <body>.\n // This ensures <style> tags in the <head> (global styles) are preserved!\n if (isInsideBody && skipTags.has(tag)) {\n return '';\n }\n\n let s = `<${tag}`;\n\n // 1. Serialize Attributes\n for (let i = 0; i < el.attributes.length; i++) {\n const attr = el.attributes[i];\n s += ` ${attr.name}=\"${attr.value.replace(/\"/g, '&quot;')}\"`;\n }\n\n // Handle void elements (self-closing)\n const voidElements = new Set(['area', 'base', 'br', 'col', 'embed', 'hr', 'img', 'input', 'link', 'meta', 'param', 'source', 'track', 'wbr']);\n if (voidElements.has(tag)) {\n s += '>';\n return s;\n }\n s += '>';\n\n // 2. Serialize Shadow DOM (Declarative Shadow DOM)\n // MUST KEEP for SSR: Without this, the user receives an empty shell until JS loads and re-renders everything.\n // This allows the browser to paint the full UI (including styles inside the component) immediately.\n if (el.shadowRoot) {\n s += `<template shadowrootmode=\"${el.shadowRoot.mode}\">`;\n for (let i = 0; i < el.shadowRoot.childNodes.length; i++) {\n s += serializeNode(el.shadowRoot.childNodes[i], isInsideBody);\n }\n s += '</template>';\n }\n\n // 3. Serialize Light DOM Children\n for (let i = 0; i < el.childNodes.length; i++) {\n s += serializeNode(el.childNodes[i], isInsideBody);\n }\n\n s += `</${tag}>`;\n return s;\n }\n\n let result = '<!DOCTYPE html>\\n<html';\n const htmlNode = document.documentElement;\n for (let i = 0; i < htmlNode.attributes.length; i++) {\n const attr = htmlNode.attributes[i];\n result += ` ${attr.name}=\"${attr.value.replace(/\"/g, '&quot;')}\"`;\n }\n result += '>\\n';\n\n if (document.head) result += serializeNode(document.head, false);\n result += '\\n';\n if (document.body) result += serializeNode(document.body, true);\n\n result += '\\n</html>';\n return result;\n }, this.config.playwright?.ignoreTags || []);\n console.log(`\uD83D\uDC88 [SSR:Playwright] Successfully rendered ${targetUrl}`);\n\n await this.writeOkHtmlAndEnd({ rr }, this.makeHTML(html));\n } catch (e) {\n console.error(`Playwright SSR Error for ${targetUrl}:`, e);\n // If Playwright fails (e.g., timeout), we bypass SSR so the client at least gets the CSR app\n return true;\n } finally {\n await context.close();\n }\n return false; // Tell SimpleBootHttpServer to stop routing because we've handled the response\n }\n return true;\n }\n\n makeHTML(html: string) {\n if (!/^<!DOCTYPE html>/i.test(html)) {\n html = '<!DOCTYPE html>\\n' + html;\n }\n return html;\n }\n\n async writeOkHtmlAndEnd({ rr, status = HttpStatus.Ok }: { rr: RequestResponse; status?: HttpStatus }, html: string) {\n rr.resStatusCode(status);\n rr.resSetHeader(HttpHeaders.ContentType, Mimes.TextHtml);\n await rr.resEnd(html);\n }\n\n async proceedAfter() {\n return true;\n }\n}\n"],
5
+ "mappings": "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",
6
+ "names": []
7
+ }
@@ -20,8 +20,8 @@ __export(SSRWorker_exports, {
20
20
  SSRWorker: () => SSRWorker
21
21
  });
22
22
  module.exports = __toCommonJS(SSRWorker_exports);
23
+ var import_core = require("@dooboostore/core");
23
24
  var import_JsdomInitializer = require("../initializers/JsdomInitializer");
24
- var import_RandomUtils = require("@dooboostore/core/random/RandomUtils");
25
25
  class SSRWorker {
26
26
  constructor(factory, otherInstanceSim) {
27
27
  this.factory = factory;
@@ -39,7 +39,7 @@ class SSRWorker {
39
39
  if (!jsdom) {
40
40
  jsdom = await this.makeJsdom();
41
41
  }
42
- const name = import_RandomUtils.RandomUtils.uuid();
42
+ const name = import_core.RandomUtils.uuid();
43
43
  const window = jsdom.window;
44
44
  window.ssrUse = false;
45
45
  const option = this.factory.factorySimFrontOption(window);