@dooboostore/simple-boot-http-server 1.0.26 → 1.0.27

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 (41) hide show
  1. package/README.md +100 -14
  2. package/dist/cjs/SimpleBootHttpServer.js +20 -16
  3. package/dist/cjs/SimpleBootHttpServer.js.map +2 -2
  4. package/dist/cjs/codes/Mimes.js +2 -0
  5. package/dist/cjs/codes/Mimes.js.map +2 -2
  6. package/dist/cjs/decorators/MethodMapping.js +2 -2
  7. package/dist/cjs/decorators/MethodMapping.js.map +2 -2
  8. package/dist/cjs/filters/ResourceFilter.js +0 -1
  9. package/dist/cjs/filters/ResourceFilter.js.map +2 -2
  10. package/dist/cjs/websocket/WebSocketManager.js +68 -40
  11. package/dist/cjs/websocket/WebSocketManager.js.map +2 -2
  12. package/dist/esm/SimpleBootHttpServer.js +20 -16
  13. package/dist/esm/SimpleBootHttpServer.js.map +2 -2
  14. package/dist/esm/codes/Mimes.js +2 -0
  15. package/dist/esm/codes/Mimes.js.map +2 -2
  16. package/dist/esm/decorators/MethodMapping.js +2 -2
  17. package/dist/esm/decorators/MethodMapping.js.map +2 -2
  18. package/dist/esm/filters/ResourceFilter.js +0 -1
  19. package/dist/esm/filters/ResourceFilter.js.map +2 -2
  20. package/dist/esm/websocket/WebSocketManager.js +68 -40
  21. package/dist/esm/websocket/WebSocketManager.js.map +2 -2
  22. package/dist/esm-bundle/dooboostore-simple-boot-http-server.esm.js +279 -137
  23. package/dist/esm-bundle/dooboostore-simple-boot-http-server.esm.js.map +4 -4
  24. package/dist/types/SimpleBootHttpServer.d.ts.map +1 -1
  25. package/dist/types/codes/Mimes.d.ts +2 -0
  26. package/dist/types/codes/Mimes.d.ts.map +1 -1
  27. package/dist/types/decorators/MethodMapping.d.ts +8 -0
  28. package/dist/types/decorators/MethodMapping.d.ts.map +1 -1
  29. package/dist/types/filters/ResourceFilter.d.ts.map +1 -1
  30. package/dist/types/websocket/WebSocketManager.d.ts +3 -1
  31. package/dist/types/websocket/WebSocketManager.d.ts.map +1 -1
  32. package/dist/umd-bundle/dooboostore-simple-boot-http-server.umd.js +279 -137
  33. package/dist/umd-bundle/dooboostore-simple-boot-http-server.umd.js.map +4 -4
  34. package/dist/umd-bundle/websocket-client.umd.js +209 -9
  35. package/dist/umd-bundle/websocket-client.umd.js.map +4 -4
  36. package/package.json +8 -8
  37. package/src/SimpleBootHttpServer.ts +21 -16
  38. package/src/codes/Mimes.ts +2 -0
  39. package/src/decorators/MethodMapping.ts +14 -7
  40. package/src/filters/ResourceFilter.ts +0 -1
  41. package/src/websocket/WebSocketManager.ts +69 -41
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "version": 3,
3
3
  "sources": ["../../../src/decorators/MethodMapping.ts"],
4
- "sourcesContent": ["import { ConstructorType } from '@dooboostore/core';\nimport { ReflectMethod } from '@dooboostore/simple-boot';\nimport { ReflectUtils } from '@dooboostore/core';\nimport { Resolver } from '../resolvers/Resolver';\nimport { Mimes } from '../codes/Mimes';\nimport { HttpMethod } from '../codes/HttpMethod';\n\nexport enum UrlMappingSituationType {\n REQ_JSON_BODY = 'SIMPLE_BOOT_HTTP_SERVER://URLMAPPING/REQ_JSON_BODY',\n REQ_PATH_DATA = 'SIMPLE_BOOT_HTTP_SERVER://URLMAPPING/REQ_PATH_DATA',\n // REQ_URL_SEARCH_PARAMS = 'SIMPLE_BOOT_HTTP_SERVER://URLMAPPING/REQ_URL_SEARCH_PARAMS',\n REQ_URL_SEARCH_PARAMS_OBJ = 'SIMPLE_BOOT_HTTP_SERVER://URLMAPPING/REQ_URL_SEARCH_PARAMS_OBJ',\n REQ_FORM_URL_BODY = 'SIMPLE_BOOT_HTTP_SERVER://URLMAPPING/REQ_FORM_URL_BODY'\n}\nexport type MappingConfig = {\n method: HttpMethod | string,\n description?: {\n name?: string;\n detail?: string;\n };\n\n req?: {\n contentType?: (Mimes|string)[];\n accept?: (Mimes|string)[];\n };\n\n res?: {\n status?: number;\n header?: {[key: string]: string};\n contentType?: Mimes | string;\n }\n resolver?: Resolver|ConstructorType<Resolver>;\n}\nexport type SaveMappingConfig = {propertyKey: string | symbol; config: MappingConfig}\nconst MappingMetadataKey = Symbol.for('simple-boot-http-server:mapping-metadata');\n// const GETSMappingMetadataKey = Symbol('GET_METHODS');\n// const GETMappingMetadataKey = Symbol('GET_METHOD');\n\nconst process = (config: MappingConfig, target: any, propertyKey: string | symbol, descriptor: PropertyDescriptor) => {\n const saveMappingConfigs = (ReflectUtils.getMetadata(MappingMetadataKey, target.constructor) ?? []) as SaveMappingConfig[];\n saveMappingConfigs.push({propertyKey, config});\n ReflectUtils.defineMetadata(MappingMetadataKey, saveMappingConfigs, target.constructor);\n ReflectUtils.defineMetadata(MappingMetadataKey, config, target, propertyKey);\n}\nexport function UrlMapping(config: MappingConfig): ReflectMethod;\nexport function UrlMapping(target: any, propertyKey: string | symbol, descriptor: PropertyDescriptor): void;\nexport function UrlMapping(configOrtarget?: MappingConfig | any, propertyKey?: string | symbol, descriptor?: PropertyDescriptor): ReflectMethod | void {\n if (propertyKey && descriptor) {\n process({method: HttpMethod.GET}, configOrtarget, propertyKey, descriptor);\n } else {\n return (target: any, propertyKey: string | symbol, descriptor: PropertyDescriptor) => {\n process(configOrtarget, target, propertyKey, descriptor);\n }\n }\n}\nexport const getUrlMapping = (target: any, propertyKey: string | symbol): MappingConfig | undefined => {\n return ReflectUtils.getMetadata(MappingMetadataKey, target, propertyKey);\n}\n\nexport const getUrlMappings = (target: any): SaveMappingConfig[] => {\n if (target !== null && undefined !== target && typeof target === 'object') {\n target = target.constructor;\n }\n return ReflectUtils.getMetadata(MappingMetadataKey, target);\n}\nexport function GET(config: Omit<MappingConfig, 'method'>): ReflectMethod;\nexport function GET(target: any, propertyKey: string | symbol, descriptor: PropertyDescriptor): void;\nexport function GET(configOrTarget?: Omit<MappingConfig, 'method'> | any, propertyKey?: string | symbol, descriptor?: PropertyDescriptor): ReflectMethod | void {\n if (propertyKey && descriptor) {\n process({method: HttpMethod.GET}, configOrTarget, propertyKey, descriptor);\n } else {\n return (target: any, propertyKey: string | symbol, descriptor: PropertyDescriptor) => {\n configOrTarget.method = HttpMethod.GET;\n process(configOrTarget, target, propertyKey, descriptor);\n }\n }\n}\n\nexport const getGET = (target: any, propertyKey: string | symbol): MappingConfig | undefined => {\n return getUrlMapping(target, propertyKey);\n}\nexport const getGETS = (target: any): SaveMappingConfig[] => {\n return getUrlMappings(target)?.filter(it => it.config?.method.toUpperCase() === HttpMethod.GET);\n}\nexport function POST(config: Omit<MappingConfig, 'method'>): ReflectMethod;\nexport function POST(target: any, propertyKey: string | symbol, descriptor: PropertyDescriptor): void;\nexport function POST(configOrTarget?: Omit<MappingConfig, 'method'> | any, propertyKey?: string | symbol, descriptor?: PropertyDescriptor): ReflectMethod | void {\n if (propertyKey && descriptor) {\n process({method: HttpMethod.POST}, configOrTarget, propertyKey, descriptor);\n } else {\n return (target: any, propertyKey: string | symbol, descriptor: PropertyDescriptor) => {\n configOrTarget.method = HttpMethod.POST;\n process(configOrTarget, target, propertyKey, descriptor);\n }\n }\n}\n\nexport const getPOST = (target: any, propertyKey: string | symbol): MappingConfig | undefined => {\n return getUrlMapping(target, propertyKey);\n}\nexport const getPOSTS = (target: any): SaveMappingConfig[] => {\n return getUrlMappings(target)?.filter(it => it.config?.method.toUpperCase() === HttpMethod.POST);\n}\nexport function DELETE(config: Omit<MappingConfig, 'method'>): ReflectMethod;\nexport function DELETE(target: any, propertyKey: string | symbol, descriptor: PropertyDescriptor): void;\nexport function DELETE(configOrTarget?: Omit<MappingConfig, 'method'> | any, propertyKey?: string | symbol, descriptor?: PropertyDescriptor): ReflectMethod | void {\n if (propertyKey && descriptor) {\n process({method: HttpMethod.DELETE}, configOrTarget, propertyKey, descriptor);\n } else {\n return (target: any, propertyKey: string | symbol, descriptor: PropertyDescriptor) => {\n configOrTarget.method = HttpMethod.DELETE;\n process(configOrTarget, target, propertyKey, descriptor);\n }\n }\n}\n\nexport const getDELETE = (target: any, propertyKey: string | symbol): MappingConfig | undefined => {\n return getUrlMapping(target, propertyKey);\n}\nexport const getDELETES = (target: any): SaveMappingConfig[] => {\n return getUrlMappings(target)?.filter(it => it.config?.method.toUpperCase() === HttpMethod.DELETE);\n}\nexport function PUT(config: Omit<MappingConfig, 'method'>): ReflectMethod;\nexport function PUT(target: any, propertyKey: string | symbol, descriptor: PropertyDescriptor): void;\nexport function PUT(configOrTarget?: Omit<MappingConfig, 'method'> | any, propertyKey?: string | symbol, descriptor?: PropertyDescriptor): ReflectMethod | void {\n if (propertyKey && descriptor) {\n process({method: HttpMethod.PUT}, configOrTarget, propertyKey, descriptor);\n } else {\n return (target: any, propertyKey: string | symbol, descriptor: PropertyDescriptor) => {\n configOrTarget.method = HttpMethod.PUT;\n process(configOrTarget, target, propertyKey, descriptor);\n }\n }\n}\n\nexport const getPUT = (target: any, propertyKey: string | symbol): MappingConfig | undefined => {\n return getUrlMapping(target, propertyKey);\n}\nexport const getPUTS = (target: any): SaveMappingConfig[] => {\n return getUrlMappings(target)?.filter(it => it.config?.method.toUpperCase() === HttpMethod.PUT);\n}\nexport function PATCH(config: Omit<MappingConfig, 'method'>): ReflectMethod;\nexport function PATCH(target: any, propertyKey: string | symbol, descriptor: PropertyDescriptor): void;\nexport function PATCH(configOrTarget?: Omit<MappingConfig, 'method'> | any, propertyKey?: string | symbol, descriptor?: PropertyDescriptor): ReflectMethod | void {\n if (propertyKey && descriptor) {\n process({method: HttpMethod.PATCH}, configOrTarget, propertyKey, descriptor);\n } else {\n return (target: any, propertyKey: string | symbol, descriptor: PropertyDescriptor) => {\n configOrTarget.method = HttpMethod.PATCH;\n process(configOrTarget, target, propertyKey, descriptor);\n }\n }\n}\n\nexport const getPATCH = (target: any, propertyKey: string | symbol): MappingConfig | undefined => {\n return getUrlMapping(target, propertyKey);\n}\nexport const getPATCHS = (target: any): SaveMappingConfig[] => {\n return getUrlMappings(target)?.filter(it => it.config?.method.toUpperCase() === HttpMethod.GET);\n}\nexport function OPTIONS(config: Omit<MappingConfig, 'method'>): ReflectMethod;\nexport function OPTIONS(target: any, propertyKey: string | symbol, descriptor: PropertyDescriptor): void;\nexport function OPTIONS(configOrTarget?: Omit<MappingConfig, 'method'> | any, propertyKey?: string | symbol, descriptor?: PropertyDescriptor): ReflectMethod | void {\n if (propertyKey && descriptor) {\n process({method: HttpMethod.OPTIONS}, configOrTarget, propertyKey, descriptor);\n } else {\n return (target: any, propertyKey: string | symbol, descriptor: PropertyDescriptor) => {\n configOrTarget.method = HttpMethod.OPTIONS;\n process(configOrTarget, target, propertyKey, descriptor);\n }\n }\n}\n\nexport const getOPTIONS = (target: any, propertyKey: string | symbol): MappingConfig | undefined => {\n return getUrlMapping(target, propertyKey);\n}\nexport const getOPTIONSS = (target: any): SaveMappingConfig[] => {\n return getUrlMappings(target)?.filter(it => it.config?.method.toUpperCase() === HttpMethod.OPTIONS);\n}\nexport function HEAD(config: Omit<MappingConfig, 'method'>): ReflectMethod;\nexport function HEAD(target: any, propertyKey: string | symbol, descriptor: PropertyDescriptor): void;\nexport function HEAD(configOrTarget?: Omit<MappingConfig, 'method'> | any, propertyKey?: string | symbol, descriptor?: PropertyDescriptor): ReflectMethod | void {\n if (propertyKey && descriptor) {\n process({method: HttpMethod.HEAD}, configOrTarget, propertyKey, descriptor);\n } else {\n return (target: any, propertyKey: string | symbol, descriptor: PropertyDescriptor) => {\n configOrTarget.method = HttpMethod.HEAD;\n process(configOrTarget, target, propertyKey, descriptor);\n }\n }\n}\n\nexport const getHEAD = (target: any, propertyKey: string | symbol): MappingConfig | undefined => {\n return getUrlMapping(target, propertyKey);\n}\nexport const getHEADS = (target: any): SaveMappingConfig[] => {\n return getUrlMappings(target)?.filter(it => it.config?.method.toUpperCase() === HttpMethod.GET);\n}\nexport function TRACE(config: Omit<MappingConfig, 'method'>): ReflectMethod;\nexport function TRACE(target: any, propertyKey: string | symbol, descriptor: PropertyDescriptor): void;\nexport function TRACE(configOrTarget?: Omit<MappingConfig, 'method'> | any, propertyKey?: string | symbol, descriptor?: PropertyDescriptor): ReflectMethod | void {\n if (propertyKey && descriptor) {\n process({method: HttpMethod.TRACE}, configOrTarget, propertyKey, descriptor);\n } else {\n return (target: any, propertyKey: string | symbol, descriptor: PropertyDescriptor) => {\n configOrTarget.method = HttpMethod.TRACE;\n process(configOrTarget, target, propertyKey, descriptor);\n }\n }\n}\n\nexport const getTRACE = (target: any, propertyKey: string | symbol): MappingConfig | undefined => {\n return getUrlMapping(target, propertyKey);\n}\nexport const getTRACES = (target: any): SaveMappingConfig[] => {\n return getUrlMappings(target)?.filter(it => it.config?.method.toUpperCase() === HttpMethod.TRACE);\n}\nexport function CONNECT(config: Omit<MappingConfig, 'method'>): ReflectMethod;\nexport function CONNECT(target: any, propertyKey: string | symbol, descriptor: PropertyDescriptor): void;\nexport function CONNECT(configOrTarget?: Omit<MappingConfig, 'method'> | any, propertyKey?: string | symbol, descriptor?: PropertyDescriptor): ReflectMethod | void {\n if (propertyKey && descriptor) {\n process({method: HttpMethod.CONNECT}, configOrTarget, propertyKey, descriptor);\n } else {\n return (target: any, propertyKey: string | symbol, descriptor: PropertyDescriptor) => {\n configOrTarget.method = HttpMethod.CONNECT;\n process(configOrTarget, target, propertyKey, descriptor);\n }\n }\n}\n\nexport const getCONNECT = (target: any, propertyKey: string | symbol): MappingConfig | undefined => {\n return getUrlMapping(target, propertyKey);\n}\nexport const getCONNECTS = (target: any): SaveMappingConfig[] => {\n return getUrlMappings(target)?.filter(it => it.config?.method.toUpperCase() === HttpMethod.CONNECT);\n}\n\n// Aliases for lowercase\nexport const urlMapping = UrlMapping;\nexport const getMethod = GET;\nexport const postMethod = POST;\nexport const patchMethod = PATCH;\nexport const putMethod = PUT;\nexport const deleteMethod = DELETE;\nexport const optionsMethod = OPTIONS;\nexport const headMethod = HEAD;\nexport const traceMethod = TRACE;\nexport const connectMethod = CONNECT;\n"],
5
- "mappings": "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",
4
+ "sourcesContent": ["import { ConstructorType } from '@dooboostore/core';\nimport { ReflectMethod } from '@dooboostore/simple-boot';\nimport { ReflectUtils } from '@dooboostore/core';\nimport { Resolver } from '../resolvers/Resolver';\nimport { Mimes } from '../codes/Mimes';\nimport { HttpMethod } from '../codes/HttpMethod';\n\nexport enum UrlMappingSituationType {\n REQ_JSON_BODY = 'SIMPLE_BOOT_HTTP_SERVER://URLMAPPING/REQ_JSON_BODY',\n REQ_PATH_DATA = 'SIMPLE_BOOT_HTTP_SERVER://URLMAPPING/REQ_PATH_DATA',\n // REQ_URL_SEARCH_PARAMS = 'SIMPLE_BOOT_HTTP_SERVER://URLMAPPING/REQ_URL_SEARCH_PARAMS',\n REQ_URL_SEARCH_PARAMS_OBJ = 'SIMPLE_BOOT_HTTP_SERVER://URLMAPPING/REQ_URL_SEARCH_PARAMS_OBJ',\n REQ_FORM_URL_BODY = 'SIMPLE_BOOT_HTTP_SERVER://URLMAPPING/REQ_FORM_URL_BODY'\n}\nexport type MappingConfig = {\n method: HttpMethod | string,\n description?: {\n name?: string;\n detail?: string;\n };\n\n req?: {\n contentType?: (Mimes|string)[];\n accept?: (Mimes|string)[];\n };\n\n res?:\n | {\n status?: number;\n header?: {[key: string]: string};\n contentType?: Mimes | string;\n manual?: false;\n }\n /**\n * manual: true \u2014 \uB9AC\uD134\uAC12\uC744 \uC774\uC6A9\uD55C \uC790\uB3D9 status/header/body \uCC98\uB9AC(\uBC0F resolver \uD638\uCD9C)\uB97C \uAC74\uB108\uB6F4\uB2E4.\n * SSE \uB4F1 \uD578\uB4E4\uB7EC\uAC00 ServerResponse\uB97C \uC9C1\uC811 \uC8FC\uC785\uBC1B\uC544 writeHead/write/end\uB97C \uC2A4\uC2A4\uB85C \uC81C\uC5B4\uD558\uB294 \uACBD\uC6B0 \uC0AC\uC6A9.\n */\n | { manual: true };\n resolver?: Resolver|ConstructorType<Resolver>;\n}\nexport type SaveMappingConfig = {propertyKey: string | symbol; config: MappingConfig}\nconst MappingMetadataKey = Symbol.for('simple-boot-http-server:mapping-metadata');\n// const GETSMappingMetadataKey = Symbol('GET_METHODS');\n// const GETMappingMetadataKey = Symbol('GET_METHOD');\n\nconst process = (config: MappingConfig, target: any, propertyKey: string | symbol, descriptor: PropertyDescriptor) => {\n const saveMappingConfigs = (ReflectUtils.getMetadata(MappingMetadataKey, target.constructor) ?? []) as SaveMappingConfig[];\n saveMappingConfigs.push({propertyKey, config});\n ReflectUtils.defineMetadata(MappingMetadataKey, saveMappingConfigs, target.constructor);\n ReflectUtils.defineMetadata(MappingMetadataKey, config, target, propertyKey);\n}\nexport function UrlMapping(config: MappingConfig): ReflectMethod;\nexport function UrlMapping(target: any, propertyKey: string | symbol, descriptor: PropertyDescriptor): void;\nexport function UrlMapping(configOrtarget?: MappingConfig | any, propertyKey?: string | symbol, descriptor?: PropertyDescriptor): ReflectMethod | void {\n if (propertyKey && descriptor) {\n process({method: HttpMethod.GET}, configOrtarget, propertyKey, descriptor);\n } else {\n return (target: any, propertyKey: string | symbol, descriptor: PropertyDescriptor) => {\n process(configOrtarget, target, propertyKey, descriptor);\n }\n }\n}\nexport const getUrlMapping = (target: any, propertyKey: string | symbol): MappingConfig | undefined => {\n return ReflectUtils.getMetadata(MappingMetadataKey, target, propertyKey);\n}\n\nexport const getUrlMappings = (target: any): SaveMappingConfig[] => {\n if (target !== null && undefined !== target && typeof target === 'object') {\n target = target.constructor;\n }\n return ReflectUtils.getMetadata(MappingMetadataKey, target);\n}\nexport function GET(config: Omit<MappingConfig, 'method'>): ReflectMethod;\nexport function GET(target: any, propertyKey: string | symbol, descriptor: PropertyDescriptor): void;\nexport function GET(configOrTarget?: Omit<MappingConfig, 'method'> | any, propertyKey?: string | symbol, descriptor?: PropertyDescriptor): ReflectMethod | void {\n if (propertyKey && descriptor) {\n process({method: HttpMethod.GET}, configOrTarget, propertyKey, descriptor);\n } else {\n return (target: any, propertyKey: string | symbol, descriptor: PropertyDescriptor) => {\n configOrTarget.method = HttpMethod.GET;\n process(configOrTarget, target, propertyKey, descriptor);\n }\n }\n}\n\nexport const getGET = (target: any, propertyKey: string | symbol): MappingConfig | undefined => {\n return getUrlMapping(target, propertyKey);\n}\nexport const getGETS = (target: any): SaveMappingConfig[] => {\n return getUrlMappings(target)?.filter(it => it.config?.method.toUpperCase() === HttpMethod.GET);\n}\nexport function POST(config: Omit<MappingConfig, 'method'>): ReflectMethod;\nexport function POST(target: any, propertyKey: string | symbol, descriptor: PropertyDescriptor): void;\nexport function POST(configOrTarget?: Omit<MappingConfig, 'method'> | any, propertyKey?: string | symbol, descriptor?: PropertyDescriptor): ReflectMethod | void {\n if (propertyKey && descriptor) {\n process({method: HttpMethod.POST}, configOrTarget, propertyKey, descriptor);\n } else {\n return (target: any, propertyKey: string | symbol, descriptor: PropertyDescriptor) => {\n configOrTarget.method = HttpMethod.POST;\n process(configOrTarget, target, propertyKey, descriptor);\n }\n }\n}\n\nexport const getPOST = (target: any, propertyKey: string | symbol): MappingConfig | undefined => {\n return getUrlMapping(target, propertyKey);\n}\nexport const getPOSTS = (target: any): SaveMappingConfig[] => {\n return getUrlMappings(target)?.filter(it => it.config?.method.toUpperCase() === HttpMethod.POST);\n}\nexport function DELETE(config: Omit<MappingConfig, 'method'>): ReflectMethod;\nexport function DELETE(target: any, propertyKey: string | symbol, descriptor: PropertyDescriptor): void;\nexport function DELETE(configOrTarget?: Omit<MappingConfig, 'method'> | any, propertyKey?: string | symbol, descriptor?: PropertyDescriptor): ReflectMethod | void {\n if (propertyKey && descriptor) {\n process({method: HttpMethod.DELETE}, configOrTarget, propertyKey, descriptor);\n } else {\n return (target: any, propertyKey: string | symbol, descriptor: PropertyDescriptor) => {\n configOrTarget.method = HttpMethod.DELETE;\n process(configOrTarget, target, propertyKey, descriptor);\n }\n }\n}\n\nexport const getDELETE = (target: any, propertyKey: string | symbol): MappingConfig | undefined => {\n return getUrlMapping(target, propertyKey);\n}\nexport const getDELETES = (target: any): SaveMappingConfig[] => {\n return getUrlMappings(target)?.filter(it => it.config?.method.toUpperCase() === HttpMethod.DELETE);\n}\nexport function PUT(config: Omit<MappingConfig, 'method'>): ReflectMethod;\nexport function PUT(target: any, propertyKey: string | symbol, descriptor: PropertyDescriptor): void;\nexport function PUT(configOrTarget?: Omit<MappingConfig, 'method'> | any, propertyKey?: string | symbol, descriptor?: PropertyDescriptor): ReflectMethod | void {\n if (propertyKey && descriptor) {\n process({method: HttpMethod.PUT}, configOrTarget, propertyKey, descriptor);\n } else {\n return (target: any, propertyKey: string | symbol, descriptor: PropertyDescriptor) => {\n configOrTarget.method = HttpMethod.PUT;\n process(configOrTarget, target, propertyKey, descriptor);\n }\n }\n}\n\nexport const getPUT = (target: any, propertyKey: string | symbol): MappingConfig | undefined => {\n return getUrlMapping(target, propertyKey);\n}\nexport const getPUTS = (target: any): SaveMappingConfig[] => {\n return getUrlMappings(target)?.filter(it => it.config?.method.toUpperCase() === HttpMethod.PUT);\n}\nexport function PATCH(config: Omit<MappingConfig, 'method'>): ReflectMethod;\nexport function PATCH(target: any, propertyKey: string | symbol, descriptor: PropertyDescriptor): void;\nexport function PATCH(configOrTarget?: Omit<MappingConfig, 'method'> | any, propertyKey?: string | symbol, descriptor?: PropertyDescriptor): ReflectMethod | void {\n if (propertyKey && descriptor) {\n process({method: HttpMethod.PATCH}, configOrTarget, propertyKey, descriptor);\n } else {\n return (target: any, propertyKey: string | symbol, descriptor: PropertyDescriptor) => {\n configOrTarget.method = HttpMethod.PATCH;\n process(configOrTarget, target, propertyKey, descriptor);\n }\n }\n}\n\nexport const getPATCH = (target: any, propertyKey: string | symbol): MappingConfig | undefined => {\n return getUrlMapping(target, propertyKey);\n}\nexport const getPATCHS = (target: any): SaveMappingConfig[] => {\n return getUrlMappings(target)?.filter(it => it.config?.method.toUpperCase() === HttpMethod.PATCH);\n}\nexport function OPTIONS(config: Omit<MappingConfig, 'method'>): ReflectMethod;\nexport function OPTIONS(target: any, propertyKey: string | symbol, descriptor: PropertyDescriptor): void;\nexport function OPTIONS(configOrTarget?: Omit<MappingConfig, 'method'> | any, propertyKey?: string | symbol, descriptor?: PropertyDescriptor): ReflectMethod | void {\n if (propertyKey && descriptor) {\n process({method: HttpMethod.OPTIONS}, configOrTarget, propertyKey, descriptor);\n } else {\n return (target: any, propertyKey: string | symbol, descriptor: PropertyDescriptor) => {\n configOrTarget.method = HttpMethod.OPTIONS;\n process(configOrTarget, target, propertyKey, descriptor);\n }\n }\n}\n\nexport const getOPTIONS = (target: any, propertyKey: string | symbol): MappingConfig | undefined => {\n return getUrlMapping(target, propertyKey);\n}\nexport const getOPTIONSS = (target: any): SaveMappingConfig[] => {\n return getUrlMappings(target)?.filter(it => it.config?.method.toUpperCase() === HttpMethod.OPTIONS);\n}\nexport function HEAD(config: Omit<MappingConfig, 'method'>): ReflectMethod;\nexport function HEAD(target: any, propertyKey: string | symbol, descriptor: PropertyDescriptor): void;\nexport function HEAD(configOrTarget?: Omit<MappingConfig, 'method'> | any, propertyKey?: string | symbol, descriptor?: PropertyDescriptor): ReflectMethod | void {\n if (propertyKey && descriptor) {\n process({method: HttpMethod.HEAD}, configOrTarget, propertyKey, descriptor);\n } else {\n return (target: any, propertyKey: string | symbol, descriptor: PropertyDescriptor) => {\n configOrTarget.method = HttpMethod.HEAD;\n process(configOrTarget, target, propertyKey, descriptor);\n }\n }\n}\n\nexport const getHEAD = (target: any, propertyKey: string | symbol): MappingConfig | undefined => {\n return getUrlMapping(target, propertyKey);\n}\nexport const getHEADS = (target: any): SaveMappingConfig[] => {\n return getUrlMappings(target)?.filter(it => it.config?.method.toUpperCase() === HttpMethod.HEAD);\n}\nexport function TRACE(config: Omit<MappingConfig, 'method'>): ReflectMethod;\nexport function TRACE(target: any, propertyKey: string | symbol, descriptor: PropertyDescriptor): void;\nexport function TRACE(configOrTarget?: Omit<MappingConfig, 'method'> | any, propertyKey?: string | symbol, descriptor?: PropertyDescriptor): ReflectMethod | void {\n if (propertyKey && descriptor) {\n process({method: HttpMethod.TRACE}, configOrTarget, propertyKey, descriptor);\n } else {\n return (target: any, propertyKey: string | symbol, descriptor: PropertyDescriptor) => {\n configOrTarget.method = HttpMethod.TRACE;\n process(configOrTarget, target, propertyKey, descriptor);\n }\n }\n}\n\nexport const getTRACE = (target: any, propertyKey: string | symbol): MappingConfig | undefined => {\n return getUrlMapping(target, propertyKey);\n}\nexport const getTRACES = (target: any): SaveMappingConfig[] => {\n return getUrlMappings(target)?.filter(it => it.config?.method.toUpperCase() === HttpMethod.TRACE);\n}\nexport function CONNECT(config: Omit<MappingConfig, 'method'>): ReflectMethod;\nexport function CONNECT(target: any, propertyKey: string | symbol, descriptor: PropertyDescriptor): void;\nexport function CONNECT(configOrTarget?: Omit<MappingConfig, 'method'> | any, propertyKey?: string | symbol, descriptor?: PropertyDescriptor): ReflectMethod | void {\n if (propertyKey && descriptor) {\n process({method: HttpMethod.CONNECT}, configOrTarget, propertyKey, descriptor);\n } else {\n return (target: any, propertyKey: string | symbol, descriptor: PropertyDescriptor) => {\n configOrTarget.method = HttpMethod.CONNECT;\n process(configOrTarget, target, propertyKey, descriptor);\n }\n }\n}\n\nexport const getCONNECT = (target: any, propertyKey: string | symbol): MappingConfig | undefined => {\n return getUrlMapping(target, propertyKey);\n}\nexport const getCONNECTS = (target: any): SaveMappingConfig[] => {\n return getUrlMappings(target)?.filter(it => it.config?.method.toUpperCase() === HttpMethod.CONNECT);\n}\n\n// Aliases for lowercase\nexport const urlMapping = UrlMapping;\nexport const getMethod = GET;\nexport const postMethod = POST;\nexport const patchMethod = PATCH;\nexport const putMethod = PUT;\nexport const deleteMethod = DELETE;\nexport const optionsMethod = OPTIONS;\nexport const headMethod = HEAD;\nexport const traceMethod = TRACE;\nexport const connectMethod = CONNECT;\n"],
5
+ "mappings": "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",
6
6
  "names": ["UrlMappingSituationType", "propertyKey", "descriptor"]
7
7
  }
@@ -32,7 +32,6 @@ class ResourceFilter {
32
32
  return it.test(url);
33
33
  }
34
34
  if (typeof it === "string") {
35
- console.log("url!!!!!!!", url);
36
35
  return it === url;
37
36
  }
38
37
  if (typeof it === "function") {
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "version": 3,
3
3
  "sources": ["../../../src/filters/ResourceFilter.ts"],
4
- "sourcesContent": ["import { Filter } from '../filters/Filter';\nimport fs from 'node:fs';\nimport path from 'node:path';\nimport mime from 'mime-types';\nimport { HttpHeaders } from '../codes/HttpHeaders';\nimport { HttpStatus } from '../codes/HttpStatus';\nimport { SimpleBootHttpServer } from '../SimpleBootHttpServer';\nimport { RequestResponse } from '../models/RequestResponse';\nimport { Blob } from 'node:buffer';\n\nexport type RequestFilterType = string | RegExp | ((rr: RequestResponse, app: SimpleBootHttpServer) => boolean) | ((rr: RequestResponse, app: SimpleBootHttpServer) => Promise<boolean>);\n\ntype PathDist = RequestFilterType|{request: RequestFilterType, dist: string | ((rr: RequestResponse, app: SimpleBootHttpServer) => string)};\n\ntype DataDist = {request: RequestFilterType, response: (rr: RequestResponse, app: SimpleBootHttpServer) => (string | Promise<Blob | ArrayBuffer | Response>)};\nexport const isPathDist = (item: any): item is PathDist => {\n return typeof item === 'object' && ('request' in item) && ('dist' in item);\n};\nexport const isDataDist = (item: any): item is DataDist => {\n return typeof item === 'object' && ('request' in item) && ('response' in item);\n};\nexport class ResourceFilter implements Filter {\n // private requestFilter: RequestFilterType;\n private resourceDistPath?: string;\n private resources?: (DataDist|PathDist)[];\n constructor(resourceDistPath: string, resourceRegex: PathDist[]);\n constructor(resourceRegex: DataDist[]);\n constructor(resourceDistPathOrResourceRegex: string | DataDist[], resourceRegex?: PathDist[]) {\n if (typeof resourceDistPathOrResourceRegex === 'string') {\n this.resourceDistPath = resourceDistPathOrResourceRegex;\n this.resources = resourceRegex;\n } else {\n this.resources = resourceDistPathOrResourceRegex;\n // this.requestFilter = resourceDistPathOrResourceRegex\n }\n }\n // constructor(private resourceDistPath: string, private resourceRegex: (RequestFilterType | { request: RequestFilterType, dist: string | ((rr: RequestResponse, app: SimpleBootHttpServer) => (string|Promise<Blob |ArrayBuffer| Response>)) })[] = []) {\n // }\n\n async onInit(app: SimpleBootHttpServer) {\n }\n\n async proceedBefore({rr, app}: {rr: RequestResponse, app: SimpleBootHttpServer, carrier: Map<string, any>}) {\n const url = (rr.reqUrlPathName ?? '').replace(/\\.\\./g, '');\n const urlObj = rr.reqUrlObject;\n // const requestUrl = parse(rr.reqUrl ?? '', true);\n // console.log('resource filter!!**-------', url);\n let sw = true;\n const regExps = this.resources?.filter(it => {\n // console.log('---it', it, it instanceof RegExp, typeof it)\n if (it instanceof RegExp) {\n // console.log('--------', it.test(url))\n return it.test(url);\n }\n\n if (typeof it === 'string') {\n console.log('url!!!!!!!', url)\n return it === url;\n // return RegExp(it).test(url);\n }\n\n if (typeof it === 'function') {\n return it(rr, app);\n }\n\n if (typeof it === 'object' && 'request' in it) {\n if (typeof it.request === 'function') {\n return it.request(rr, app);\n } else if (it .request instanceof RegExp) {\n return it.request.test(url);\n } else {\n // return RegExp(it.request).test(url);\n return it.request === url\n }\n }\n })??[]\n // console.log('regExps', regExps, url);\n // eslint-disable-next-line no-unused-vars\n for (const it of regExps) {\n sw = false;\n //DataDist\n if (isDataDist(it)) {\n let distValue = typeof it.response === 'function' ? it.response(rr,app) : it.response;\n if (distValue instanceof Promise) {\n const result = await distValue;\n if (result instanceof Response) {\n await rr.resEnd(result);\n break;\n } else if (result instanceof Blob) {\n rr.resStatusCode(HttpStatus.Ok);\n await rr.resEnd(result);\n break;\n }\n }\n } else {\n //PathDist or undefined\n const dist = typeof it === 'object' && 'dist' in it ? it.dist : urlObj.pathname;\n let distValue = typeof dist === 'function' ? dist(rr, app) : dist;\n if (this.resourceDistPath) {\n // It's a string path\n const resourcePath = path.join(this.resourceDistPath, distValue);\n // console.log('-----------',this.resourceDistPath, resourcePath);\n if (fs.existsSync(resourcePath)) {\n rr.resStatusCode(HttpStatus.Ok);\n rr.resSetHeader(HttpHeaders.ContentType, mime.lookup(resourcePath).toString());\n await rr.resEnd(fs.readFileSync(resourcePath));\n break;\n } else {\n rr.resStatusCode(HttpStatus.NotFound);\n await rr.resEnd();\n break;\n }\n } else {\n rr.resStatusCode(HttpStatus.InternalServerError);\n await rr.resEnd();\n break;\n }\n }\n sw = true;\n }\n return sw;\n }\n\n async proceedAfter({rr, app}: {rr: RequestResponse, app: SimpleBootHttpServer, carrier: Map<string, any>}) {\n // console.log('resource filter!!end@@**-------');\n return true;\n }\n}"],
5
- "mappings": "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",
4
+ "sourcesContent": ["import { Filter } from '../filters/Filter';\nimport fs from 'node:fs';\nimport path from 'node:path';\nimport mime from 'mime-types';\nimport { HttpHeaders } from '../codes/HttpHeaders';\nimport { HttpStatus } from '../codes/HttpStatus';\nimport { SimpleBootHttpServer } from '../SimpleBootHttpServer';\nimport { RequestResponse } from '../models/RequestResponse';\nimport { Blob } from 'node:buffer';\n\nexport type RequestFilterType = string | RegExp | ((rr: RequestResponse, app: SimpleBootHttpServer) => boolean) | ((rr: RequestResponse, app: SimpleBootHttpServer) => Promise<boolean>);\n\ntype PathDist = RequestFilterType|{request: RequestFilterType, dist: string | ((rr: RequestResponse, app: SimpleBootHttpServer) => string)};\n\ntype DataDist = {request: RequestFilterType, response: (rr: RequestResponse, app: SimpleBootHttpServer) => (string | Promise<Blob | ArrayBuffer | Response>)};\nexport const isPathDist = (item: any): item is PathDist => {\n return typeof item === 'object' && ('request' in item) && ('dist' in item);\n};\nexport const isDataDist = (item: any): item is DataDist => {\n return typeof item === 'object' && ('request' in item) && ('response' in item);\n};\nexport class ResourceFilter implements Filter {\n // private requestFilter: RequestFilterType;\n private resourceDistPath?: string;\n private resources?: (DataDist|PathDist)[];\n constructor(resourceDistPath: string, resourceRegex: PathDist[]);\n constructor(resourceRegex: DataDist[]);\n constructor(resourceDistPathOrResourceRegex: string | DataDist[], resourceRegex?: PathDist[]) {\n if (typeof resourceDistPathOrResourceRegex === 'string') {\n this.resourceDistPath = resourceDistPathOrResourceRegex;\n this.resources = resourceRegex;\n } else {\n this.resources = resourceDistPathOrResourceRegex;\n // this.requestFilter = resourceDistPathOrResourceRegex\n }\n }\n // constructor(private resourceDistPath: string, private resourceRegex: (RequestFilterType | { request: RequestFilterType, dist: string | ((rr: RequestResponse, app: SimpleBootHttpServer) => (string|Promise<Blob |ArrayBuffer| Response>)) })[] = []) {\n // }\n\n async onInit(app: SimpleBootHttpServer) {\n }\n\n async proceedBefore({rr, app}: {rr: RequestResponse, app: SimpleBootHttpServer, carrier: Map<string, any>}) {\n const url = (rr.reqUrlPathName ?? '').replace(/\\.\\./g, '');\n const urlObj = rr.reqUrlObject;\n // const requestUrl = parse(rr.reqUrl ?? '', true);\n // console.log('resource filter!!**-------', url);\n let sw = true;\n const regExps = this.resources?.filter(it => {\n // console.log('---it', it, it instanceof RegExp, typeof it)\n if (it instanceof RegExp) {\n // console.log('--------', it.test(url))\n return it.test(url);\n }\n\n if (typeof it === 'string') {\n return it === url;\n // return RegExp(it).test(url);\n }\n\n if (typeof it === 'function') {\n return it(rr, app);\n }\n\n if (typeof it === 'object' && 'request' in it) {\n if (typeof it.request === 'function') {\n return it.request(rr, app);\n } else if (it .request instanceof RegExp) {\n return it.request.test(url);\n } else {\n // return RegExp(it.request).test(url);\n return it.request === url\n }\n }\n })??[]\n // console.log('regExps', regExps, url);\n // eslint-disable-next-line no-unused-vars\n for (const it of regExps) {\n sw = false;\n //DataDist\n if (isDataDist(it)) {\n let distValue = typeof it.response === 'function' ? it.response(rr,app) : it.response;\n if (distValue instanceof Promise) {\n const result = await distValue;\n if (result instanceof Response) {\n await rr.resEnd(result);\n break;\n } else if (result instanceof Blob) {\n rr.resStatusCode(HttpStatus.Ok);\n await rr.resEnd(result);\n break;\n }\n }\n } else {\n //PathDist or undefined\n const dist = typeof it === 'object' && 'dist' in it ? it.dist : urlObj.pathname;\n let distValue = typeof dist === 'function' ? dist(rr, app) : dist;\n if (this.resourceDistPath) {\n // It's a string path\n const resourcePath = path.join(this.resourceDistPath, distValue);\n // console.log('-----------',this.resourceDistPath, resourcePath);\n if (fs.existsSync(resourcePath)) {\n rr.resStatusCode(HttpStatus.Ok);\n rr.resSetHeader(HttpHeaders.ContentType, mime.lookup(resourcePath).toString());\n await rr.resEnd(fs.readFileSync(resourcePath));\n break;\n } else {\n rr.resStatusCode(HttpStatus.NotFound);\n await rr.resEnd();\n break;\n }\n } else {\n rr.resStatusCode(HttpStatus.InternalServerError);\n await rr.resEnd();\n break;\n }\n }\n sw = true;\n }\n return sw;\n }\n\n async proceedAfter({rr, app}: {rr: RequestResponse, app: SimpleBootHttpServer, carrier: Map<string, any>}) {\n // console.log('resource filter!!end@@**-------');\n return true;\n }\n}"],
5
+ "mappings": "AACA,OAAO,QAAQ;AACf,OAAO,UAAU;AACjB,OAAO,UAAU;AACjB,SAAS,mBAAmB;AAC5B,SAAS,kBAAkB;AAG3B,SAAS,YAAY;AAOd,MAAM,aAAa,CAAC,SAAgC;AACvD,SAAO,OAAO,SAAS,YAAa,aAAa,QAAU,UAAU;AACzE;AACO,MAAM,aAAa,CAAC,SAAgC;AACvD,SAAO,OAAO,SAAS,YAAa,aAAa,QAAU,cAAc;AAC7E;AACO,MAAM,eAAiC;AAAA,EAM5C,YAAY,iCAAuD,eAA4B;AAC7F,QAAI,OAAO,oCAAoC,UAAU;AACvD,WAAK,mBAAmB;AACxB,WAAK,YAAY;AAAA,IACnB,OAAO;AACL,WAAK,YAAY;AAAA,IAEnB;AAAA,EACF;AAAA;AAAA;AAAA,EAIE,MAAM,OAAO,KAA2B;AAAA,EACxC;AAAA,EAEA,MAAM,cAAc,EAAC,IAAI,IAAG,GAAgF;AACxG,UAAM,OAAO,GAAG,kBAAkB,IAAI,QAAQ,SAAS,EAAE;AACzD,UAAM,SAAS,GAAG;AAGlB,QAAI,KAAK;AACT,UAAM,UAAU,KAAK,WAAW,OAAO,QAAM;AAEzC,UAAI,cAAc,QAAQ;AAEtB,eAAO,GAAG,KAAK,GAAG;AAAA,MACtB;AAEA,UAAI,OAAO,OAAO,UAAU;AACxB,eAAO,OAAO;AAAA,MAElB;AAEA,UAAI,OAAO,OAAO,YAAY;AAC1B,eAAO,GAAG,IAAI,GAAG;AAAA,MACrB;AAEA,UAAI,OAAO,OAAO,YAAY,aAAa,IAAI;AAC3C,YAAI,OAAO,GAAG,YAAY,YAAY;AAClC,iBAAO,GAAG,QAAQ,IAAI,GAAG;AAAA,QAC7B,WAAW,GAAI,mBAAmB,QAAQ;AACtC,iBAAO,GAAG,QAAQ,KAAK,GAAG;AAAA,QAC9B,OAAO;AAEL,iBAAO,GAAG,YAAY;AAAA,QACxB;AAAA,MACJ;AAAA,IACJ,CAAC,KAAG,CAAC;AAGL,eAAW,MAAM,SAAS;AACtB,WAAK;AAEL,UAAI,WAAW,EAAE,GAAG;AAClB,YAAI,YAAY,OAAO,GAAG,aAAa,aAAa,GAAG,SAAS,IAAG,GAAG,IAAI,GAAG;AAC7E,YAAI,qBAAqB,SAAS;AAChC,gBAAM,SAAS,MAAM;AACrB,cAAI,kBAAkB,UAAU;AAC9B,kBAAM,GAAG,OAAO,MAAM;AACtB;AAAA,UACF,WAAW,kBAAkB,MAAM;AACjC,eAAG,cAAc,WAAW,EAAE;AAC9B,kBAAM,GAAG,OAAO,MAAM;AACtB;AAAA,UACF;AAAA,QACF;AAAA,MACF,OAAO;AAEL,cAAM,OAAO,OAAO,OAAO,YAAY,UAAU,KAAK,GAAG,OAAO,OAAO;AACvE,YAAI,YAAY,OAAO,SAAS,aAAa,KAAK,IAAI,GAAG,IAAI;AAC7D,YAAI,KAAK,kBAAkB;AAEzB,gBAAM,eAAe,KAAK,KAAK,KAAK,kBAAkB,SAAS;AAE/D,cAAI,GAAG,WAAW,YAAY,GAAG;AAC/B,eAAG,cAAc,WAAW,EAAE;AAC9B,eAAG,aAAa,YAAY,aAAa,KAAK,OAAO,YAAY,EAAE,SAAS,CAAC;AAC7E,kBAAM,GAAG,OAAO,GAAG,aAAa,YAAY,CAAC;AAC7C;AAAA,UACF,OAAO;AACL,eAAG,cAAc,WAAW,QAAQ;AACpC,kBAAM,GAAG,OAAO;AAChB;AAAA,UACF;AAAA,QACF,OAAO;AACL,aAAG,cAAc,WAAW,mBAAmB;AAC/C,gBAAM,GAAG,OAAO;AAChB;AAAA,QACF;AAAA,MACF;AACF,WAAK;AAAA,IACP;AACA,WAAO;AAAA,EACX;AAAA,EAEA,MAAM,aAAa,EAAC,IAAI,IAAG,GAAgF;AAEvG,WAAO;AAAA,EACX;AACJ;",
6
6
  "names": []
7
7
  }
@@ -40,7 +40,9 @@ let WebSocketManager = class WebSocketManager2 {
40
40
  constructor(intentManager, routerManager) {
41
41
  this.intentManager = intentManager;
42
42
  this.routerManager = routerManager;
43
- this.clients = /* @__PURE__ */ new Map();
43
+ this.connections = /* @__PURE__ */ new Map();
44
+ this.registrations = /* @__PURE__ */ new Map();
45
+ this.targets = /* @__PURE__ */ new Map();
44
46
  this.eventSubscriptions = /* @__PURE__ */ new Map();
45
47
  this.subject = new Subject();
46
48
  }
@@ -48,61 +50,76 @@ let WebSocketManager = class WebSocketManager2 {
48
50
  return this.subject.asObservable();
49
51
  }
50
52
  connect(wsSet) {
51
- this.clients.set(wsSet, []);
53
+ this.connections.set(wsSet, /* @__PURE__ */ new Set());
52
54
  console.log("WebSocket connected:", wsSet.request.url);
53
55
  }
54
56
  close(wsSet) {
55
57
  this.removeAllClientsByWebSocketSet(wsSet);
56
- this.clients.delete(wsSet);
58
+ this.connections.delete(wsSet);
57
59
  console.log("WebSocket disconnected:", wsSet.request.url);
58
60
  }
59
61
  setClientTopic(wsSet, uuid, target, subscribeBody) {
60
- const clientTopics = this.clients.get(wsSet);
61
- if (clientTopics && !clientTopics.find((it) => it.uuid === uuid)) {
62
- clientTopics.push({ uuid, target, subscribeBody });
63
- this.clients.set(wsSet, clientTopics);
64
- } else if (clientTopics) {
65
- throw { message: "Already subscribed topic" };
62
+ const uuidSet = this.connections.get(wsSet);
63
+ if (!uuidSet) {
64
+ return;
65
+ }
66
+ if (this.registrations.has(uuid)) {
67
+ throw new Error("Already subscribed topic");
68
+ }
69
+ this.registrations.set(uuid, { uuid, target, subscribeBody, webSocketSet: wsSet });
70
+ uuidSet.add(uuid);
71
+ if (!this.targets.get(target)) {
72
+ this.targets.set(target, /* @__PURE__ */ new Set());
66
73
  }
74
+ this.targets.get(target)?.add(uuid);
67
75
  }
68
76
  findAllClientsByTarget(target) {
77
+ const uuids = this.targets.get(target);
78
+ if (!uuids) {
79
+ return [];
80
+ }
69
81
  const results = [];
70
- for (const [wsSet, topics] of Array.from(this.clients.entries())) {
71
- const find = topics.find((it) => it.target === target);
72
- if (find) {
73
- results.push({ ...find, webSocketSet: wsSet });
82
+ uuids.forEach((uuid) => {
83
+ const reg = this.registrations.get(uuid);
84
+ if (reg) {
85
+ results.push({ ...reg });
74
86
  }
75
- }
87
+ });
76
88
  return results;
77
89
  }
78
90
  findClientsByTarget(target) {
79
- for (const [wsSet, topics] of Array.from(this.clients.entries())) {
80
- const find = topics.find((it) => it.target === target);
81
- if (find) {
82
- return { ...find, webSocketSet: wsSet };
91
+ const uuids = this.targets.get(target);
92
+ if (!uuids) {
93
+ return void 0;
94
+ }
95
+ for (const uuid of Array.from(uuids)) {
96
+ const reg = this.registrations.get(uuid);
97
+ if (reg) {
98
+ return { ...reg };
83
99
  }
84
100
  }
101
+ return void 0;
85
102
  }
86
103
  removeClientByUUID(uuid) {
87
- for (const [wsSet, topics] of Array.from(this.clients.entries())) {
88
- const findIndex = topics.findIndex((it) => it.uuid === uuid);
89
- if (findIndex >= 0) {
90
- topics.splice(findIndex, 1);
91
- this.clients.set(wsSet, topics);
92
- this.eventSubscriptions.delete(uuid);
93
- return true;
104
+ const reg = this.registrations.get(uuid);
105
+ if (!reg) {
106
+ return false;
107
+ }
108
+ this.registrations.delete(uuid);
109
+ this.connections.get(reg.webSocketSet)?.delete(uuid);
110
+ const targetSet = this.targets.get(reg.target);
111
+ if (targetSet) {
112
+ targetSet.delete(uuid);
113
+ if (targetSet.size <= 0) {
114
+ this.targets.delete(reg.target);
94
115
  }
95
116
  }
96
- return false;
117
+ this.eventSubscriptions.delete(uuid);
118
+ return true;
97
119
  }
98
120
  findClientByUUID(uuid) {
99
- for (const [wsSet, topics] of Array.from(this.clients.entries())) {
100
- const find = topics.find((it) => it.uuid === uuid);
101
- if (find) {
102
- return { ...find, webSocketSet: wsSet };
103
- }
104
- }
105
- return void 0;
121
+ const reg = this.registrations.get(uuid);
122
+ return reg ? { ...reg } : void 0;
106
123
  }
107
124
  sendDataByUUID({ uuid, body }) {
108
125
  const client = this.findClientByUUID(uuid);
@@ -267,7 +284,7 @@ let WebSocketManager = class WebSocketManager2 {
267
284
  }
268
285
  }
269
286
  getOpenClients() {
270
- return Array.from(this.clients.keys()).filter((it) => it.socket.readyState === WebSocket.OPEN);
287
+ return Array.from(this.connections.keys()).filter((it) => it.socket.readyState === WebSocket.OPEN);
271
288
  }
272
289
  isBinaryPayload(value) {
273
290
  if (!value) {
@@ -595,14 +612,25 @@ let WebSocketManager = class WebSocketManager2 {
595
612
  }
596
613
  }
597
614
  removeAllClientsByWebSocketSet(wsSet) {
598
- const topics = this.clients.get(wsSet);
599
- if (!topics) {
615
+ const uuidSet = this.connections.get(wsSet);
616
+ if (!uuidSet) {
600
617
  return;
601
618
  }
602
- for (const topic of topics) {
603
- this.eventSubscriptions.delete(topic.uuid);
604
- }
605
- this.clients.set(wsSet, []);
619
+ uuidSet.forEach((uuid) => {
620
+ const reg = this.registrations.get(uuid);
621
+ if (reg) {
622
+ this.registrations.delete(uuid);
623
+ const targetSet = this.targets.get(reg.target);
624
+ if (targetSet) {
625
+ targetSet.delete(uuid);
626
+ if (targetSet.size <= 0) {
627
+ this.targets.delete(reg.target);
628
+ }
629
+ }
630
+ }
631
+ this.eventSubscriptions.delete(uuid);
632
+ });
633
+ uuidSet.clear();
606
634
  }
607
635
  };
608
636
  WebSocketManager = __decorate([
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "version": 3,
3
3
  "sources": ["../../../src/websocket/WebSocketManager.ts"],
4
- "sourcesContent": ["import { Sim } from '@dooboostore/simple-boot';\nimport { WebSocketEndPoint, WebSocketSet } from '../endpoints/WebSocketEndPoint';\nimport { RawData, WebSocket } from 'ws';\nimport { IntentManager } from '@dooboostore/simple-boot';\nimport { RouterManager } from '@dooboostore/simple-boot';\nimport { Intent } from '@dooboostore/simple-boot';\nimport { RandomUtils } from '@dooboostore/core';\nimport { Subject } from '@dooboostore/core';\nexport type WebSocketRequest = { webSocketSet: WebSocketSet; uuid: string; webSocketManager: WebSocketManager; sendEvent: <R>(event: string, body: any, config?: { responseTimeout?: number }) => Promise<R> };\nexport type TopicType = 'intent' | 'router';\nexport type SubscribeType = 'subscribe';\nexport type UnsubscribeType = 'unsubscribe';\nexport type TopicRequest<T = any> = {\n type?: TopicType;\n uuid: string;\n requestUUID: string;\n body?: T;\n};\nexport type TopicSubscribeRequest<T = any> = {\n type: SubscribeType;\n target: string;\n uuid: string;\n body?: T;\n};\nexport type TopicUnsubscribeRequest = {\n type: UnsubscribeType;\n uuid: string;\n};\n\nexport type TopicResponse<T = any> = {\n state: 'success' | 'error';\n // type: TopicType | SubscribeType | UnsubscribeType;\n target: string;\n uuid: string;\n requestUUID?: string;\n body: T;\n};\n\nexport type TopicServerEventRequest<T = any> = {\n type: 'event';\n uuid: string;\n eventUUID: string;\n event: string;\n body?: T;\n};\nexport type TopicServerEventUnSubscribeRequest = {\n type: 'unsubscribe';\n uuid: string;\n};\nexport type TopicServerEventResponse<T = any> = {\n type: 'event';\n uuid: string;\n eventUUID: string;\n body?: T;\n};\n\nexport const isTopicRequest = <T = any>(obj: any): obj is TopicRequest<T> => {\n return typeof obj === 'object' && obj !== null && 'uuid' in obj && typeof obj.uuid === 'string' && (obj.type === undefined || obj.type === 'intent' || obj.type === 'router') && (obj.body === undefined || true);\n};\n\nexport const isTopicSubscribeRequest = <T = any>(obj: any): obj is TopicSubscribeRequest<T> => {\n return typeof obj === 'object' && obj !== null && 'type' in obj && obj.type === 'subscribe' && 'target' in obj && typeof obj.target === 'string' && 'uuid' in obj && typeof obj.uuid === 'string' && (obj.body === undefined || true);\n};\n\nexport const isTopicUnsubscribeRequest = (obj: any): obj is TopicUnsubscribeRequest => {\n return typeof obj === 'object' && obj !== null && 'type' in obj && obj.type === 'unsubscribe' && 'uuid' in obj && typeof obj.uuid === 'string';\n};\n\nexport const isTopicResponse = <T = any>(obj: any): obj is TopicResponse<T> => {\n return typeof obj === 'object' && obj !== null && 'state' in obj && (obj.state === 'success' || obj.state === 'error') && 'target' in obj && typeof obj.target === 'string' && 'uuid' in obj && typeof obj.uuid === 'string' && 'body' in obj;\n};\n\nexport const isTopicServerEventRequest = <T = any>(obj: any): obj is TopicServerEventRequest<T> => {\n return typeof obj === 'object' && obj !== null && 'type' in obj && obj.type === 'event' && 'uuid' in obj && typeof obj.uuid === 'string' && 'eventUUID' in obj && typeof obj.eventUUID === 'string' && 'event' in obj && typeof obj.event === 'string' && (obj.body === undefined || true);\n};\n\nexport const isTopicServerEventResponse = <T = any>(obj: any): obj is TopicServerEventResponse<T> => {\n return typeof obj === 'object' && obj !== null && 'type' in obj && obj.type === 'event' && 'uuid' in obj && typeof obj.uuid === 'string' && 'eventUUID' in obj && typeof obj.eventUUID === 'string' && (obj.body === undefined || true);\n};\n\nexport const isTopicServerEventUnSubscribeRequest = (obj: any): obj is TopicServerEventUnSubscribeRequest => {\n return typeof obj === 'object' && obj !== null && 'type' in obj && obj.type === 'unsubscribe' && 'uuid' in obj && typeof obj.uuid === 'string';\n};\n\ntype EventResponseCallBack = <T>(data: T, wsSet: WebSocketSet) => void;\n\nexport type RegisteredClient<T = any> = { uuid: string; target: string; subscribeBody?: T };\n\ntype RegisteredClientSet<T = any> = RegisteredClient<T> & { webSocketSet: WebSocketSet };\n\n@Sim\nexport class WebSocketManager implements WebSocketEndPoint {\n private clients: Map<WebSocketSet, RegisteredClient[]> = new Map();\n private eventSubscriptions: Map<string, Map<string, EventResponseCallBack>> = new Map();\n private subject = new Subject<TopicRequest | TopicUnsubscribeRequest | TopicSubscribeRequest | TopicServerEventResponse>();\n constructor(\n private intentManager: IntentManager,\n private routerManager: RouterManager\n ) {}\n\n get observable() {\n return this.subject.asObservable();\n }\n connect(wsSet: WebSocketSet) {\n this.clients.set(wsSet, []);\n console.log('WebSocket connected:', wsSet.request.url);\n }\n close(wsSet: WebSocketSet) {\n this.removeAllClientsByWebSocketSet(wsSet);\n this.clients.delete(wsSet);\n console.log('WebSocket disconnected:', wsSet.request.url);\n }\n\n setClientTopic(wsSet: WebSocketSet, uuid: string, target: string, subscribeBody?: any) {\n const clientTopics = this.clients.get(wsSet);\n if (clientTopics && !clientTopics.find(it => it.uuid === uuid)) {\n clientTopics.push({ uuid, target, subscribeBody });\n this.clients.set(wsSet, clientTopics);\n } else if (clientTopics) {\n throw { message: 'Already subscribed topic' };\n }\n }\n\n findAllClientsByTarget(target: string): RegisteredClientSet[] {\n const results: RegisteredClientSet[] = [];\n for (const [wsSet, topics] of Array.from(this.clients.entries())) {\n const find = topics.find(it => it.target === target);\n if (find) {\n results.push({ ...find, webSocketSet: wsSet });\n }\n }\n return results;\n }\n\n findClientsByTarget(target: string): RegisteredClientSet {\n for (const [wsSet, topics] of Array.from(this.clients.entries())) {\n const find = topics.find(it => it.target === target);\n if (find) {\n return { ...find, webSocketSet: wsSet };\n }\n }\n }\n\n removeClientByUUID(uuid: string) {\n for (const [wsSet, topics] of Array.from(this.clients.entries())) {\n const findIndex = topics.findIndex(it => it.uuid === uuid);\n if (findIndex >= 0) {\n topics.splice(findIndex, 1);\n this.clients.set(wsSet, topics);\n // 이벤트 구독도 함께 정리\n this.eventSubscriptions.delete(uuid);\n return true;\n }\n }\n return false;\n }\n\n findClientByUUID(uuid: string): RegisteredClientSet | undefined {\n for (const [wsSet, topics] of Array.from(this.clients.entries())) {\n const find = topics.find(it => it.uuid === uuid);\n if (find) {\n return { ...find, webSocketSet: wsSet };\n }\n }\n return undefined;\n }\n\n sendDataByUUID({ uuid, body }: { uuid: string; body?: any }) {\n const client = this.findClientByUUID(uuid);\n if (client) {\n const data: TopicResponse = {\n state: 'success',\n target: client.target,\n uuid: uuid,\n body: body\n };\n this.sendTopic(client.webSocketSet, data);\n return true;\n }\n return false;\n }\n\n sendUnSubscribeByUUID({ uuid }: { uuid: string }) {\n const client = this.findClientByUUID(uuid);\n if (client) {\n const data: TopicServerEventUnSubscribeRequest = {\n type: 'unsubscribe',\n uuid: uuid\n };\n this.removeClientByUUID(uuid);\n this.sendTopic(client.webSocketSet, data);\n return true;\n }\n return false;\n }\n\n sendAllDataByTarget({ target, body }: { target: string; body?: any }) {\n const clients = this.findAllClientsByTarget(target);\n clients.forEach(it => {\n const data: TopicResponse = {\n state: 'success',\n target: it.target,\n uuid: it.uuid,\n body: body\n };\n this.sendTopic(it.webSocketSet, data);\n });\n return clients.length;\n }\n sendAllUnSubscribeByTarget({ target }: { target: string }) {\n const clients = this.findAllClientsByTarget(target);\n clients.forEach(it => {\n const data: TopicUnsubscribeRequest = {\n type: 'unsubscribe',\n uuid: it.uuid\n };\n this.removeClientByUUID(it.uuid);\n this.sendTopic(it.webSocketSet, data);\n });\n return clients.length;\n }\n\n sendEventDataByUUID({ uuid, event, body }: { uuid: string; event: string; body?: any }, config?: { responseCallBack?: EventResponseCallBack }): string | undefined {\n const client = this.findClientByUUID(uuid);\n if (client) {\n const eventUUID = RandomUtils.uuid4();\n const eventTopic: TopicServerEventRequest = {\n type: 'event',\n uuid: uuid,\n // target: client.target,\n eventUUID: eventUUID,\n event: event,\n body: body\n };\n\n if (config.responseCallBack) {\n this.addEventSubscribes(uuid, eventUUID, config.responseCallBack);\n }\n this.sendTopic(client.webSocketSet, eventTopic);\n return eventUUID;\n }\n return undefined;\n }\n\n sendEventDataByUUIDPromise<R>({ uuid, event, body }: { uuid: string; event: string; body?: any }, config?: { responseTimeout?: number }): Promise<R> {\n return new Promise((resolve, reject) => {\n let timeoutId: NodeJS.Timeout | undefined;\n let eventUUIDForCleanup: string | undefined;\n\n if (config?.responseTimeout !== undefined) {\n timeoutId = setTimeout(() => {\n if (eventUUIDForCleanup) {\n const subscriptions = this.eventSubscriptions.get(uuid);\n if (subscriptions) {\n subscriptions.delete(eventUUIDForCleanup);\n if (subscriptions.size <= 0) {\n this.eventSubscriptions.delete(uuid);\n }\n }\n }\n reject(new Error('WebSocket event response timeout for UUID: ' + uuid));\n }, config.responseTimeout);\n }\n\n const eventUUID = this.sendEventDataByUUID(\n { uuid, event, body },\n {\n responseCallBack: (data: any) => {\n if (timeoutId) clearTimeout(timeoutId);\n resolve(data);\n }\n }\n );\n eventUUIDForCleanup = eventUUID;\n\n if (!eventUUID) {\n if (timeoutId) clearTimeout(timeoutId);\n reject(new Error('WebSocket client not found for UUID: ' + uuid));\n }\n });\n }\n\n async sendEventDataByUUIDPromiseSettled<R>({ uuid, event, body }: { uuid: string; event: string; body?: any }, config?: { responseTimeout?: number }): Promise<PromiseSettledResult<R>> {\n try {\n const value = await this.sendEventDataByUUIDPromise<R>({ uuid, event, body }, config);\n return { status: 'fulfilled', value };\n } catch (reason) {\n return { status: 'rejected', reason };\n }\n }\n\n sendAllEventDataByTargetPromise<R>({ target, event, body }: { target: string; event: string; body?: any }, config?: { responseTimeout?: number }): Promise<{ body: R; uuid: string }[]> {\n const clients = this.findAllClientsByTarget(target);\n const promises: Promise<{ body: R; uuid: string }>[] = clients.map(it => {\n return this.sendEventDataByUUIDPromise<R>({ uuid: it.uuid, event, body }, config).then(result => ({\n body: result,\n uuid: it.uuid\n }));\n });\n return Promise.all(promises);\n }\n sendAllEventDataByTargetPromiseSettled<R>({ target, event, body }: { target: string; event: string; body?: any }, config?: { responseTimeout?: number }): Promise<PromiseSettledResult<{ body: R; uuid: string }>[]> {\n const clients = this.findAllClientsByTarget(target);\n const promises: Promise<{ body: R; uuid: string }>[] = clients.map(it => {\n return this.sendEventDataByUUIDPromise<R>({ uuid: it.uuid, event, body }, config).then(result => ({\n body: result,\n uuid: it.uuid\n }));\n });\n return Promise.allSettled(promises);\n }\n\n sendAllEventDataByTarget({ target, event, body }: { target: string; event: string; body?: any }, config?: { responseCallBack?: EventResponseCallBack }) {\n const clients = this.findAllClientsByTarget(target);\n clients.forEach(it => {\n const eventUUID = RandomUtils.uuid4();\n const eventTopic: TopicServerEventRequest = {\n type: 'event',\n uuid: it.uuid,\n // target: it.target,\n eventUUID: eventUUID,\n event: event,\n body: body\n };\n if (config?.responseCallBack) {\n this.addEventSubscribes(it.uuid, eventUUID, config?.responseCallBack);\n }\n this.sendTopic(it.webSocketSet, eventTopic);\n });\n return clients.length;\n }\n\n private addEventSubscribes(uuid: string, eventUUID: string, eventResponseCallBack: EventResponseCallBack) {\n let eventMap = this.eventSubscriptions.get(uuid);\n if (eventMap) {\n eventMap.set(eventUUID, eventResponseCallBack);\n } else {\n eventMap = new Map();\n eventMap.set(eventUUID, eventResponseCallBack);\n this.eventSubscriptions.set(uuid, eventMap);\n }\n }\n\n getOpenClients() {\n return Array.from(this.clients.keys()).filter(it => it.socket.readyState === WebSocket.OPEN);\n }\n\n private isBinaryPayload(value: any) {\n if (!value) {\n return false;\n }\n if (Buffer.isBuffer(value)) {\n return true;\n }\n if (typeof Uint8Array !== 'undefined' && value instanceof Uint8Array) {\n return true;\n }\n if (typeof ArrayBuffer !== 'undefined' && value instanceof ArrayBuffer) {\n return true;\n }\n if (value && typeof value === 'object' && 'buffer' in value) {\n const bufferValue = (value as any).buffer;\n return Buffer.isBuffer(bufferValue) || bufferValue instanceof Uint8Array || bufferValue instanceof ArrayBuffer;\n }\n return false;\n }\n\n private hasBinaryPayload(value: any): boolean {\n if (this.isBinaryPayload(value)) {\n return true;\n }\n if (Array.isArray(value)) {\n return value.some(item => this.hasBinaryPayload(item));\n }\n if (value && typeof value === 'object') {\n return Object.keys(value).some(key => this.hasBinaryPayload(value[key]));\n }\n return false;\n }\n\n private buildBinaryTopic(topic: any): Buffer {\n const fileRefs = new Map<any, string>();\n const fileEntries: Array<{ id: string; name: string; mime: string; buffer: Buffer }> = [];\n let fileIndex = 0;\n\n const registerFile = (value: any) => {\n const existing = fileRefs.get(value);\n if (existing) {\n return existing;\n }\n const id = `f${++fileIndex}`;\n fileRefs.set(value, id);\n\n let name = 'file';\n let mime = 'application/octet-stream';\n let buffer: Buffer = Buffer.alloc(0);\n\n if (Buffer.isBuffer(value)) {\n buffer = value;\n } else if (value instanceof Uint8Array) {\n buffer = Buffer.from(value);\n } else if (value instanceof ArrayBuffer) {\n buffer = Buffer.from(value);\n } else if (value && typeof value === 'object' && 'buffer' in value) {\n const fileLike = value as any;\n if (typeof fileLike.name === 'string') {\n name = fileLike.name || name;\n }\n if (typeof fileLike.mime === 'string') {\n mime = fileLike.mime || mime;\n }\n const innerBuffer = fileLike.buffer;\n if (Buffer.isBuffer(innerBuffer)) {\n buffer = innerBuffer;\n } else if (innerBuffer instanceof Uint8Array) {\n buffer = Buffer.from(innerBuffer);\n } else if (innerBuffer instanceof ArrayBuffer) {\n buffer = Buffer.from(innerBuffer);\n }\n }\n\n fileEntries.push({ id, name, mime, buffer });\n return id;\n };\n\n const replaceFiles = (value: any): any => {\n if (this.isBinaryPayload(value)) {\n const id = registerFile(value);\n return { $file: id };\n }\n if (Array.isArray(value)) {\n return value.map(item => replaceFiles(item));\n }\n if (value && typeof value === 'object') {\n const result: Record<string, any> = {};\n Object.keys(value).forEach(key => {\n result[key] = replaceFiles(value[key]);\n });\n return result;\n }\n return value;\n };\n\n const payload = replaceFiles(topic.body);\n let offset = 0;\n const files = fileEntries.map(entry => {\n const size = entry.buffer.length;\n const meta = {\n id: entry.id,\n name: entry.name,\n mime: entry.mime,\n size,\n offset\n };\n offset += size;\n return meta;\n });\n\n const meta = { ...topic, body: payload, files };\n const json = Buffer.from(JSON.stringify(meta), 'utf8');\n const header = Buffer.alloc(4);\n header.writeUInt32LE(json.length, 0);\n\n const buffers = [header, json, ...fileEntries.map(entry => entry.buffer)];\n return Buffer.concat(buffers);\n }\n\n private sendTopic(wsSet: WebSocketSet, topic: any) {\n if (this.hasBinaryPayload(topic?.body)) {\n const buffer = this.buildBinaryTopic(topic);\n wsSet.socket.send(buffer, { binary: true });\n return;\n }\n wsSet.socket.send(JSON.stringify(topic), { binary: false });\n }\n\n private parseBinaryTopic(data: RawData): TopicRequest | undefined {\n let buffer: Buffer;\n if (Buffer.isBuffer(data)) {\n buffer = data;\n } else if (data instanceof ArrayBuffer) {\n buffer = Buffer.from(data);\n } else if (Array.isArray(data)) {\n buffer = Buffer.concat(data.map(item => (Buffer.isBuffer(item) ? item : Buffer.from(item as any))));\n } else {\n return undefined;\n }\n\n if (buffer.length < 4) {\n return undefined;\n }\n\n const jsonLength = buffer.readUInt32LE(0);\n const jsonStart = 4;\n const jsonEnd = jsonStart + jsonLength;\n if (buffer.length < jsonEnd) {\n return undefined;\n }\n\n const jsonText = buffer.slice(jsonStart, jsonEnd).toString('utf8');\n let meta: any;\n try {\n meta = JSON.parse(jsonText);\n } catch (error) {\n console.warn('Invalid WebSocket binary payload:', error);\n return undefined;\n }\n\n const filesMeta = Array.isArray(meta.files) ? meta.files : [];\n const fileMap = new Map<string, { name: string; mime: string; size: number; buffer: Buffer }>();\n filesMeta.forEach((file: any) => {\n if (!file || typeof file.id !== 'string' || typeof file.size !== 'number' || typeof file.offset !== 'number') {\n return;\n }\n const start = jsonEnd + file.offset;\n const end = start + file.size;\n if (start < jsonEnd || end > buffer.length) {\n return;\n }\n const slice = buffer.slice(start, end);\n fileMap.set(file.id, {\n name: file.name || 'file',\n mime: file.mime || 'application/octet-stream',\n size: file.size,\n buffer: slice\n });\n });\n\n const replaceFileRefs = (value: any): any => {\n if (value && typeof value === 'object' && '$file' in value && typeof value.$file === 'string') {\n const file = fileMap.get(value.$file);\n if (file) {\n return file;\n }\n }\n if (Array.isArray(value)) {\n return value.map(item => replaceFileRefs(item));\n }\n if (value && typeof value === 'object') {\n const result: Record<string, any> = {};\n Object.keys(value).forEach(key => {\n result[key] = replaceFileRefs(value[key]);\n });\n return result;\n }\n return value;\n };\n\n const body = replaceFileRefs(meta.body);\n return {\n type: meta.type,\n uuid: meta.uuid,\n requestUUID: meta.requestUUID,\n body\n };\n }\n\n message(wsSet: WebSocketSet, data: { data: RawData; isBinary: boolean }): void {\n let topic: TopicRequest | TopicUnsubscribeRequest | TopicSubscribeRequest | TopicServerEventResponse | undefined;\n if (data.isBinary) {\n topic = this.parseBinaryTopic(data.data);\n if (!topic) {\n return;\n }\n } else {\n try {\n topic = JSON.parse(data.data.toString());\n } catch (error) {\n console.warn('Invalid WebSocket payload:', error);\n return;\n }\n }\n\n this.subject.next(topic);\n // console.log('WebSocket message received:', topic);\n const uuid = topic.uuid;\n // const client = this.findClientByUUID(uuid);\n // if (!client) return;\n\n // 구독\n if (topic.type === 'subscribe') {\n try {\n this.setClientTopic(wsSet, topic.uuid, topic.target, topic.body);\n } catch (err: any) {\n const responseTopic: TopicResponse = {\n state: 'error',\n // type: topic.type,\n target: topic.target,\n uuid: topic.uuid,\n body: { message: err.message || 'Error subscribing topic' }\n };\n wsSet.socket.send(JSON.stringify(responseTopic), { binary: false });\n }\n return;\n // 구독 해제\n } else if (topic.type === 'unsubscribe') {\n this.removeClientByUUID(uuid);\n return;\n } else if (topic.type === 'event') {\n const subscriptions = this.eventSubscriptions.get(topic.uuid);\n if (subscriptions) {\n const eventCallback = subscriptions.get(topic.eventUUID);\n if (eventCallback) {\n eventCallback(topic.body, wsSet);\n subscriptions.delete(topic.eventUUID);\n }\n if (subscriptions.size <= 0) {\n this.eventSubscriptions.delete(topic.uuid);\n }\n }\n return;\n } else {\n // 실행!!\n // 등록 체크\n const clientTopics = this.findClientByUUID(uuid);\n if (!clientTopics) {\n const responseTopic: TopicResponse = {\n state: 'error',\n uuid: topic.uuid,\n requestUUID: topic.requestUUID,\n target: '',\n body: { message: 'WebSocket client not registered' }\n };\n this.sendTopic(wsSet, responseTopic);\n return;\n }\n\n const intent = new Intent(clientTopics.target);\n const webSocketRequest: WebSocketRequest = {\n webSocketSet: wsSet,\n uuid: clientTopics.uuid,\n webSocketManager: this,\n sendEvent: <R>(event: string, body: any, config?: { responseTimeout?: number }) => this.sendEventDataByUUIDPromise<R>({ uuid: clientTopics.uuid, event, body }, config)\n };\n intent.data = [topic.body, webSocketRequest];\n if (topic.type === 'intent') {\n this.intentManager.publishMeta(intent).then(async it => {\n if (it.target.length <= 0) {\n const responseTopic: TopicResponse = {\n state: 'error',\n // type: topic.type,\n target: clientTopics.target,\n uuid: topic.uuid,\n requestUUID: topic.requestUUID,\n body: { message: 'Not found intent target' }\n };\n this.sendTopic(wsSet, responseTopic);\n } else {\n const rdata = it.return[0];\n const wdata = rdata instanceof Promise ? await rdata : rdata;\n const responseTopic: TopicResponse = {\n state: 'success',\n uuid: topic.uuid,\n requestUUID: topic.requestUUID,\n target: clientTopics.target,\n body: wdata\n };\n this.sendTopic(wsSet, responseTopic);\n }\n });\n } else if (topic.type === 'router') {\n this.routerManager.routing(intent).then(async routerModule => {\n const moduleInstance = routerModule.getModuleInstance?.();\n if (routerModule && moduleInstance) {\n if (routerModule.propertyKeys) {\n for (const it of routerModule.propertyKeys) {\n let r = moduleInstance[it]?.(topic.body, webSocketRequest);\n r = r instanceof Promise ? await r : r;\n const responseTopic: TopicResponse = {\n state: 'success',\n requestUUID: topic.requestUUID,\n uuid: topic.uuid,\n target: clientTopics.target,\n body: r\n };\n this.sendTopic(wsSet, responseTopic);\n }\n } else {\n const responseTopic: TopicResponse = {\n state: 'error',\n uuid: topic.uuid,\n requestUUID: topic.requestUUID,\n target: clientTopics.target,\n body: { message: 'Not found router target' }\n };\n this.sendTopic(wsSet, responseTopic);\n }\n } else {\n const responseTopic: TopicResponse = {\n state: 'error',\n uuid: topic.uuid,\n requestUUID: topic.requestUUID,\n target: clientTopics.target,\n body: { message: 'Not found router target' }\n };\n this.sendTopic(wsSet, responseTopic);\n }\n });\n }\n }\n }\n\n private removeAllClientsByWebSocketSet(wsSet: WebSocketSet) {\n const topics = this.clients.get(wsSet);\n if (!topics) {\n return;\n }\n for (const topic of topics) {\n this.eventSubscriptions.delete(topic.uuid);\n }\n this.clients.set(wsSet, []);\n }\n}\n"],
5
- "mappings": "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",
4
+ "sourcesContent": ["import { Sim } from '@dooboostore/simple-boot';\nimport { WebSocketEndPoint, WebSocketSet } from '../endpoints/WebSocketEndPoint';\nimport { RawData, WebSocket } from 'ws';\nimport { IntentManager } from '@dooboostore/simple-boot';\nimport { RouterManager } from '@dooboostore/simple-boot';\nimport { Intent } from '@dooboostore/simple-boot';\nimport { RandomUtils } from '@dooboostore/core';\nimport { Subject } from '@dooboostore/core';\nexport type WebSocketRequest = { webSocketSet: WebSocketSet; uuid: string; webSocketManager: WebSocketManager; sendEvent: <R>(event: string, body: any, config?: { responseTimeout?: number }) => Promise<R> };\nexport type TopicType = 'intent' | 'router';\nexport type SubscribeType = 'subscribe';\nexport type UnsubscribeType = 'unsubscribe';\nexport type TopicRequest<T = any> = {\n type?: TopicType;\n uuid: string;\n requestUUID: string;\n body?: T;\n};\nexport type TopicSubscribeRequest<T = any> = {\n type: SubscribeType;\n target: string;\n uuid: string;\n body?: T;\n};\nexport type TopicUnsubscribeRequest = {\n type: UnsubscribeType;\n uuid: string;\n};\n\nexport type TopicResponse<T = any> = {\n state: 'success' | 'error';\n // type: TopicType | SubscribeType | UnsubscribeType;\n target: string;\n uuid: string;\n requestUUID?: string;\n body: T;\n};\n\nexport type TopicServerEventRequest<T = any> = {\n type: 'event';\n uuid: string;\n eventUUID: string;\n event: string;\n body?: T;\n};\nexport type TopicServerEventUnSubscribeRequest = {\n type: 'unsubscribe';\n uuid: string;\n};\nexport type TopicServerEventResponse<T = any> = {\n type: 'event';\n uuid: string;\n eventUUID: string;\n body?: T;\n};\n\nexport const isTopicRequest = <T = any>(obj: any): obj is TopicRequest<T> => {\n return typeof obj === 'object' && obj !== null && 'uuid' in obj && typeof obj.uuid === 'string' && (obj.type === undefined || obj.type === 'intent' || obj.type === 'router') && (obj.body === undefined || true);\n};\n\nexport const isTopicSubscribeRequest = <T = any>(obj: any): obj is TopicSubscribeRequest<T> => {\n return typeof obj === 'object' && obj !== null && 'type' in obj && obj.type === 'subscribe' && 'target' in obj && typeof obj.target === 'string' && 'uuid' in obj && typeof obj.uuid === 'string' && (obj.body === undefined || true);\n};\n\nexport const isTopicUnsubscribeRequest = (obj: any): obj is TopicUnsubscribeRequest => {\n return typeof obj === 'object' && obj !== null && 'type' in obj && obj.type === 'unsubscribe' && 'uuid' in obj && typeof obj.uuid === 'string';\n};\n\nexport const isTopicResponse = <T = any>(obj: any): obj is TopicResponse<T> => {\n return typeof obj === 'object' && obj !== null && 'state' in obj && (obj.state === 'success' || obj.state === 'error') && 'target' in obj && typeof obj.target === 'string' && 'uuid' in obj && typeof obj.uuid === 'string' && 'body' in obj;\n};\n\nexport const isTopicServerEventRequest = <T = any>(obj: any): obj is TopicServerEventRequest<T> => {\n return typeof obj === 'object' && obj !== null && 'type' in obj && obj.type === 'event' && 'uuid' in obj && typeof obj.uuid === 'string' && 'eventUUID' in obj && typeof obj.eventUUID === 'string' && 'event' in obj && typeof obj.event === 'string' && (obj.body === undefined || true);\n};\n\nexport const isTopicServerEventResponse = <T = any>(obj: any): obj is TopicServerEventResponse<T> => {\n return typeof obj === 'object' && obj !== null && 'type' in obj && obj.type === 'event' && 'uuid' in obj && typeof obj.uuid === 'string' && 'eventUUID' in obj && typeof obj.eventUUID === 'string' && (obj.body === undefined || true);\n};\n\nexport const isTopicServerEventUnSubscribeRequest = (obj: any): obj is TopicServerEventUnSubscribeRequest => {\n return typeof obj === 'object' && obj !== null && 'type' in obj && obj.type === 'unsubscribe' && 'uuid' in obj && typeof obj.uuid === 'string';\n};\n\ntype EventResponseCallBack = <T>(data: T, wsSet: WebSocketSet) => void;\n\nexport type RegisteredClient<T = any> = { uuid: string; target: string; subscribeBody?: T };\n\ntype RegisteredClientSet<T = any> = RegisteredClient<T> & { webSocketSet: WebSocketSet };\n\n@Sim\nexport class WebSocketManager implements WebSocketEndPoint {\n private connections: Map<WebSocketSet, Set<string>> = new Map();\n private registrations: Map<string, RegisteredClientSet> = new Map();\n private targets: Map<string, Set<string>> = new Map();\n private eventSubscriptions: Map<string, Map<string, EventResponseCallBack>> = new Map();\n private subject = new Subject<TopicRequest | TopicUnsubscribeRequest | TopicSubscribeRequest | TopicServerEventResponse>();\n constructor(\n private intentManager: IntentManager,\n private routerManager: RouterManager\n ) {}\n\n get observable() {\n return this.subject.asObservable();\n }\n connect(wsSet: WebSocketSet) {\n this.connections.set(wsSet, new Set<string>());\n console.log('WebSocket connected:', wsSet.request.url);\n }\n close(wsSet: WebSocketSet) {\n this.removeAllClientsByWebSocketSet(wsSet);\n this.connections.delete(wsSet);\n console.log('WebSocket disconnected:', wsSet.request.url);\n }\n\n setClientTopic(wsSet: WebSocketSet, uuid: string, target: string, subscribeBody?: any) {\n const uuidSet = this.connections.get(wsSet);\n if (!uuidSet) {\n return;\n }\n if (this.registrations.has(uuid)) {\n throw new Error('Already subscribed topic');\n }\n this.registrations.set(uuid, { uuid, target, subscribeBody, webSocketSet: wsSet });\n uuidSet.add(uuid);\n if (!this.targets.get(target)) {\n this.targets.set(target, new Set<string>());\n }\n this.targets.get(target)?.add(uuid);\n }\n\n findAllClientsByTarget(target: string): RegisteredClientSet[] {\n const uuids = this.targets.get(target);\n if (!uuids) {\n return [];\n }\n const results: RegisteredClientSet[] = [];\n uuids.forEach(uuid => {\n const reg = this.registrations.get(uuid);\n if (reg) {\n results.push({ ...reg });\n }\n });\n return results;\n }\n\n findClientsByTarget(target: string): RegisteredClientSet {\n const uuids = this.targets.get(target);\n if (!uuids) {\n return undefined as any;\n }\n for (const uuid of Array.from(uuids)) {\n const reg = this.registrations.get(uuid);\n if (reg) {\n return { ...reg };\n }\n }\n return undefined as any;\n }\n\n removeClientByUUID(uuid: string) {\n const reg = this.registrations.get(uuid);\n if (!reg) {\n return false;\n }\n this.registrations.delete(uuid);\n this.connections.get(reg.webSocketSet)?.delete(uuid);\n const targetSet = this.targets.get(reg.target);\n if (targetSet) {\n targetSet.delete(uuid);\n if (targetSet.size <= 0) {\n this.targets.delete(reg.target);\n }\n }\n // 이벤트 구독도 함께 정리\n this.eventSubscriptions.delete(uuid);\n return true;\n }\n\n findClientByUUID(uuid: string): RegisteredClientSet | undefined {\n const reg = this.registrations.get(uuid);\n return reg ? { ...reg } : undefined;\n }\n\n sendDataByUUID({ uuid, body }: { uuid: string; body?: any }) {\n const client = this.findClientByUUID(uuid);\n if (client) {\n const data: TopicResponse = {\n state: 'success',\n target: client.target,\n uuid: uuid,\n body: body\n };\n this.sendTopic(client.webSocketSet, data);\n return true;\n }\n return false;\n }\n\n sendUnSubscribeByUUID({ uuid }: { uuid: string }) {\n const client = this.findClientByUUID(uuid);\n if (client) {\n const data: TopicServerEventUnSubscribeRequest = {\n type: 'unsubscribe',\n uuid: uuid\n };\n this.removeClientByUUID(uuid);\n this.sendTopic(client.webSocketSet, data);\n return true;\n }\n return false;\n }\n\n sendAllDataByTarget({ target, body }: { target: string; body?: any }) {\n const clients = this.findAllClientsByTarget(target);\n clients.forEach(it => {\n const data: TopicResponse = {\n state: 'success',\n target: it.target,\n uuid: it.uuid,\n body: body\n };\n this.sendTopic(it.webSocketSet, data);\n });\n return clients.length;\n }\n sendAllUnSubscribeByTarget({ target }: { target: string }) {\n const clients = this.findAllClientsByTarget(target);\n clients.forEach(it => {\n const data: TopicUnsubscribeRequest = {\n type: 'unsubscribe',\n uuid: it.uuid\n };\n this.removeClientByUUID(it.uuid);\n this.sendTopic(it.webSocketSet, data);\n });\n return clients.length;\n }\n\n sendEventDataByUUID({ uuid, event, body }: { uuid: string; event: string; body?: any }, config?: { responseCallBack?: EventResponseCallBack }): string | undefined {\n const client = this.findClientByUUID(uuid);\n if (client) {\n const eventUUID = RandomUtils.uuid4();\n const eventTopic: TopicServerEventRequest = {\n type: 'event',\n uuid: uuid,\n // target: client.target,\n eventUUID: eventUUID,\n event: event,\n body: body\n };\n\n if (config.responseCallBack) {\n this.addEventSubscribes(uuid, eventUUID, config.responseCallBack);\n }\n this.sendTopic(client.webSocketSet, eventTopic);\n return eventUUID;\n }\n return undefined;\n }\n\n sendEventDataByUUIDPromise<R>({ uuid, event, body }: { uuid: string; event: string; body?: any }, config?: { responseTimeout?: number }): Promise<R> {\n return new Promise((resolve, reject) => {\n let timeoutId: NodeJS.Timeout | undefined;\n let eventUUIDForCleanup: string | undefined;\n\n if (config?.responseTimeout !== undefined) {\n timeoutId = setTimeout(() => {\n if (eventUUIDForCleanup) {\n const subscriptions = this.eventSubscriptions.get(uuid);\n if (subscriptions) {\n subscriptions.delete(eventUUIDForCleanup);\n if (subscriptions.size <= 0) {\n this.eventSubscriptions.delete(uuid);\n }\n }\n }\n reject(new Error('WebSocket event response timeout for UUID: ' + uuid));\n }, config.responseTimeout);\n }\n\n const eventUUID = this.sendEventDataByUUID(\n { uuid, event, body },\n {\n responseCallBack: (data: any) => {\n if (timeoutId) clearTimeout(timeoutId);\n resolve(data);\n }\n }\n );\n eventUUIDForCleanup = eventUUID;\n\n if (!eventUUID) {\n if (timeoutId) clearTimeout(timeoutId);\n reject(new Error('WebSocket client not found for UUID: ' + uuid));\n }\n });\n }\n\n async sendEventDataByUUIDPromiseSettled<R>({ uuid, event, body }: { uuid: string; event: string; body?: any }, config?: { responseTimeout?: number }): Promise<PromiseSettledResult<R>> {\n try {\n const value = await this.sendEventDataByUUIDPromise<R>({ uuid, event, body }, config);\n return { status: 'fulfilled', value };\n } catch (reason) {\n return { status: 'rejected', reason };\n }\n }\n\n sendAllEventDataByTargetPromise<R>({ target, event, body }: { target: string; event: string; body?: any }, config?: { responseTimeout?: number }): Promise<{ body: R; uuid: string }[]> {\n const clients = this.findAllClientsByTarget(target);\n const promises: Promise<{ body: R; uuid: string }>[] = clients.map(it => {\n return this.sendEventDataByUUIDPromise<R>({ uuid: it.uuid, event, body }, config).then(result => ({\n body: result,\n uuid: it.uuid\n }));\n });\n return Promise.all(promises);\n }\n sendAllEventDataByTargetPromiseSettled<R>({ target, event, body }: { target: string; event: string; body?: any }, config?: { responseTimeout?: number }): Promise<PromiseSettledResult<{ body: R; uuid: string }>[]> {\n const clients = this.findAllClientsByTarget(target);\n const promises: Promise<{ body: R; uuid: string }>[] = clients.map(it => {\n return this.sendEventDataByUUIDPromise<R>({ uuid: it.uuid, event, body }, config).then(result => ({\n body: result,\n uuid: it.uuid\n }));\n });\n return Promise.allSettled(promises);\n }\n\n sendAllEventDataByTarget({ target, event, body }: { target: string; event: string; body?: any }, config?: { responseCallBack?: EventResponseCallBack }) {\n const clients = this.findAllClientsByTarget(target);\n clients.forEach(it => {\n const eventUUID = RandomUtils.uuid4();\n const eventTopic: TopicServerEventRequest = {\n type: 'event',\n uuid: it.uuid,\n // target: it.target,\n eventUUID: eventUUID,\n event: event,\n body: body\n };\n if (config?.responseCallBack) {\n this.addEventSubscribes(it.uuid, eventUUID, config?.responseCallBack);\n }\n this.sendTopic(it.webSocketSet, eventTopic);\n });\n return clients.length;\n }\n\n private addEventSubscribes(uuid: string, eventUUID: string, eventResponseCallBack: EventResponseCallBack) {\n let eventMap = this.eventSubscriptions.get(uuid);\n if (eventMap) {\n eventMap.set(eventUUID, eventResponseCallBack);\n } else {\n eventMap = new Map();\n eventMap.set(eventUUID, eventResponseCallBack);\n this.eventSubscriptions.set(uuid, eventMap);\n }\n }\n\n getOpenClients() {\n return Array.from(this.connections.keys()).filter(it => it.socket.readyState === WebSocket.OPEN);\n }\n\n private isBinaryPayload(value: any) {\n if (!value) {\n return false;\n }\n if (Buffer.isBuffer(value)) {\n return true;\n }\n if (typeof Uint8Array !== 'undefined' && value instanceof Uint8Array) {\n return true;\n }\n if (typeof ArrayBuffer !== 'undefined' && value instanceof ArrayBuffer) {\n return true;\n }\n if (value && typeof value === 'object' && 'buffer' in value) {\n const bufferValue = (value as any).buffer;\n return Buffer.isBuffer(bufferValue) || bufferValue instanceof Uint8Array || bufferValue instanceof ArrayBuffer;\n }\n return false;\n }\n\n private hasBinaryPayload(value: any): boolean {\n if (this.isBinaryPayload(value)) {\n return true;\n }\n if (Array.isArray(value)) {\n return value.some(item => this.hasBinaryPayload(item));\n }\n if (value && typeof value === 'object') {\n return Object.keys(value).some(key => this.hasBinaryPayload(value[key]));\n }\n return false;\n }\n\n private buildBinaryTopic(topic: any): Buffer {\n const fileRefs = new Map<any, string>();\n const fileEntries: Array<{ id: string; name: string; mime: string; buffer: Buffer }> = [];\n let fileIndex = 0;\n\n const registerFile = (value: any) => {\n const existing = fileRefs.get(value);\n if (existing) {\n return existing;\n }\n const id = `f${++fileIndex}`;\n fileRefs.set(value, id);\n\n let name = 'file';\n let mime = 'application/octet-stream';\n let buffer: Buffer = Buffer.alloc(0);\n\n if (Buffer.isBuffer(value)) {\n buffer = value;\n } else if (value instanceof Uint8Array) {\n buffer = Buffer.from(value);\n } else if (value instanceof ArrayBuffer) {\n buffer = Buffer.from(value);\n } else if (value && typeof value === 'object' && 'buffer' in value) {\n const fileLike = value as any;\n if (typeof fileLike.name === 'string') {\n name = fileLike.name || name;\n }\n if (typeof fileLike.mime === 'string') {\n mime = fileLike.mime || mime;\n }\n const innerBuffer = fileLike.buffer;\n if (Buffer.isBuffer(innerBuffer)) {\n buffer = innerBuffer;\n } else if (innerBuffer instanceof Uint8Array) {\n buffer = Buffer.from(innerBuffer);\n } else if (innerBuffer instanceof ArrayBuffer) {\n buffer = Buffer.from(innerBuffer);\n }\n }\n\n fileEntries.push({ id, name, mime, buffer });\n return id;\n };\n\n const replaceFiles = (value: any): any => {\n if (this.isBinaryPayload(value)) {\n const id = registerFile(value);\n return { $file: id };\n }\n if (Array.isArray(value)) {\n return value.map(item => replaceFiles(item));\n }\n if (value && typeof value === 'object') {\n const result: Record<string, any> = {};\n Object.keys(value).forEach(key => {\n result[key] = replaceFiles(value[key]);\n });\n return result;\n }\n return value;\n };\n\n const payload = replaceFiles(topic.body);\n let offset = 0;\n const files = fileEntries.map(entry => {\n const size = entry.buffer.length;\n const meta = {\n id: entry.id,\n name: entry.name,\n mime: entry.mime,\n size,\n offset\n };\n offset += size;\n return meta;\n });\n\n const meta = { ...topic, body: payload, files };\n const json = Buffer.from(JSON.stringify(meta), 'utf8');\n const header = Buffer.alloc(4);\n header.writeUInt32LE(json.length, 0);\n\n const buffers = [header, json, ...fileEntries.map(entry => entry.buffer)];\n return Buffer.concat(buffers);\n }\n\n private sendTopic(wsSet: WebSocketSet, topic: any) {\n if (this.hasBinaryPayload(topic?.body)) {\n const buffer = this.buildBinaryTopic(topic);\n wsSet.socket.send(buffer, { binary: true });\n return;\n }\n wsSet.socket.send(JSON.stringify(topic), { binary: false });\n }\n\n private parseBinaryTopic(data: RawData): TopicRequest | undefined {\n let buffer: Buffer;\n if (Buffer.isBuffer(data)) {\n buffer = data;\n } else if (data instanceof ArrayBuffer) {\n buffer = Buffer.from(data);\n } else if (Array.isArray(data)) {\n buffer = Buffer.concat(data.map(item => (Buffer.isBuffer(item) ? item : Buffer.from(item as any))));\n } else {\n return undefined;\n }\n\n if (buffer.length < 4) {\n return undefined;\n }\n\n const jsonLength = buffer.readUInt32LE(0);\n const jsonStart = 4;\n const jsonEnd = jsonStart + jsonLength;\n if (buffer.length < jsonEnd) {\n return undefined;\n }\n\n const jsonText = buffer.slice(jsonStart, jsonEnd).toString('utf8');\n let meta: any;\n try {\n meta = JSON.parse(jsonText);\n } catch (error) {\n console.warn('Invalid WebSocket binary payload:', error);\n return undefined;\n }\n\n const filesMeta = Array.isArray(meta.files) ? meta.files : [];\n const fileMap = new Map<string, { name: string; mime: string; size: number; buffer: Buffer }>();\n filesMeta.forEach((file: any) => {\n if (!file || typeof file.id !== 'string' || typeof file.size !== 'number' || typeof file.offset !== 'number') {\n return;\n }\n const start = jsonEnd + file.offset;\n const end = start + file.size;\n if (start < jsonEnd || end > buffer.length) {\n return;\n }\n const slice = buffer.slice(start, end);\n fileMap.set(file.id, {\n name: file.name || 'file',\n mime: file.mime || 'application/octet-stream',\n size: file.size,\n buffer: slice\n });\n });\n\n const replaceFileRefs = (value: any): any => {\n if (value && typeof value === 'object' && '$file' in value && typeof value.$file === 'string') {\n const file = fileMap.get(value.$file);\n if (file) {\n return file;\n }\n }\n if (Array.isArray(value)) {\n return value.map(item => replaceFileRefs(item));\n }\n if (value && typeof value === 'object') {\n const result: Record<string, any> = {};\n Object.keys(value).forEach(key => {\n result[key] = replaceFileRefs(value[key]);\n });\n return result;\n }\n return value;\n };\n\n const body = replaceFileRefs(meta.body);\n return {\n type: meta.type,\n uuid: meta.uuid,\n requestUUID: meta.requestUUID,\n body\n };\n }\n\n message(wsSet: WebSocketSet, data: { data: RawData; isBinary: boolean }): void {\n let topic: TopicRequest | TopicUnsubscribeRequest | TopicSubscribeRequest | TopicServerEventResponse | undefined;\n if (data.isBinary) {\n topic = this.parseBinaryTopic(data.data);\n if (!topic) {\n return;\n }\n } else {\n try {\n topic = JSON.parse(data.data.toString());\n } catch (error) {\n console.warn('Invalid WebSocket payload:', error);\n return;\n }\n }\n\n this.subject.next(topic);\n // console.log('WebSocket message received:', topic);\n const uuid = topic.uuid;\n // const client = this.findClientByUUID(uuid);\n // if (!client) return;\n\n // 구독\n if (topic.type === 'subscribe') {\n try {\n this.setClientTopic(wsSet, topic.uuid, topic.target, topic.body);\n } catch (err: any) {\n const responseTopic: TopicResponse = {\n state: 'error',\n // type: topic.type,\n target: topic.target,\n uuid: topic.uuid,\n body: { message: err.message || 'Error subscribing topic' }\n };\n wsSet.socket.send(JSON.stringify(responseTopic), { binary: false });\n }\n return;\n // 구독 해제\n } else if (topic.type === 'unsubscribe') {\n this.removeClientByUUID(uuid);\n return;\n } else if (topic.type === 'event') {\n const subscriptions = this.eventSubscriptions.get(topic.uuid);\n if (subscriptions) {\n const eventCallback = subscriptions.get(topic.eventUUID);\n if (eventCallback) {\n eventCallback(topic.body, wsSet);\n subscriptions.delete(topic.eventUUID);\n }\n if (subscriptions.size <= 0) {\n this.eventSubscriptions.delete(topic.uuid);\n }\n }\n return;\n } else {\n // 실행!!\n // 등록 체크\n const clientTopics = this.findClientByUUID(uuid);\n if (!clientTopics) {\n const responseTopic: TopicResponse = {\n state: 'error',\n uuid: topic.uuid,\n requestUUID: topic.requestUUID,\n target: '',\n body: { message: 'WebSocket client not registered' }\n };\n this.sendTopic(wsSet, responseTopic);\n return;\n }\n\n const intent = new Intent(clientTopics.target);\n const webSocketRequest: WebSocketRequest = {\n webSocketSet: wsSet,\n uuid: clientTopics.uuid,\n webSocketManager: this,\n sendEvent: <R>(event: string, body: any, config?: { responseTimeout?: number }) => this.sendEventDataByUUIDPromise<R>({ uuid: clientTopics.uuid, event, body }, config)\n };\n intent.data = [topic.body, webSocketRequest];\n if (topic.type === 'intent') {\n this.intentManager.publishMeta(intent).then(async it => {\n if (it.target.length <= 0) {\n const responseTopic: TopicResponse = {\n state: 'error',\n // type: topic.type,\n target: clientTopics.target,\n uuid: topic.uuid,\n requestUUID: topic.requestUUID,\n body: { message: 'Not found intent target' }\n };\n this.sendTopic(wsSet, responseTopic);\n } else {\n const rdata = it.return[0];\n const wdata = rdata instanceof Promise ? await rdata : rdata;\n const responseTopic: TopicResponse = {\n state: 'success',\n uuid: topic.uuid,\n requestUUID: topic.requestUUID,\n target: clientTopics.target,\n body: wdata\n };\n this.sendTopic(wsSet, responseTopic);\n }\n });\n } else if (topic.type === 'router') {\n this.routerManager.routing(intent).then(async routerModule => {\n const moduleInstance = routerModule.getModuleInstance?.();\n if (routerModule && moduleInstance) {\n if (routerModule.propertyKeys) {\n for (const it of routerModule.propertyKeys) {\n let r = moduleInstance[it]?.(topic.body, webSocketRequest);\n r = r instanceof Promise ? await r : r;\n const responseTopic: TopicResponse = {\n state: 'success',\n requestUUID: topic.requestUUID,\n uuid: topic.uuid,\n target: clientTopics.target,\n body: r\n };\n this.sendTopic(wsSet, responseTopic);\n }\n } else {\n const responseTopic: TopicResponse = {\n state: 'error',\n uuid: topic.uuid,\n requestUUID: topic.requestUUID,\n target: clientTopics.target,\n body: { message: 'Not found router target' }\n };\n this.sendTopic(wsSet, responseTopic);\n }\n } else {\n const responseTopic: TopicResponse = {\n state: 'error',\n uuid: topic.uuid,\n requestUUID: topic.requestUUID,\n target: clientTopics.target,\n body: { message: 'Not found router target' }\n };\n this.sendTopic(wsSet, responseTopic);\n }\n });\n }\n }\n }\n\n private removeAllClientsByWebSocketSet(wsSet: WebSocketSet) {\n const uuidSet = this.connections.get(wsSet);\n if (!uuidSet) {\n return;\n }\n uuidSet.forEach(uuid => {\n const reg = this.registrations.get(uuid);\n if (reg) {\n this.registrations.delete(uuid);\n const targetSet = this.targets.get(reg.target);\n if (targetSet) {\n targetSet.delete(uuid);\n if (targetSet.size <= 0) {\n this.targets.delete(reg.target);\n }\n }\n }\n this.eventSubscriptions.delete(uuid);\n });\n uuidSet.clear();\n }\n}\n"],
5
+ "mappings": "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",
6
6
  "names": ["WebSocketManager", "meta"]
7
7
  }