@dooboostore/simple-boot-http-server 1.0.23 → 1.0.24

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 (167) hide show
  1. package/README.MD +27 -1
  2. package/dist/cjs/SimpleBootHttpServer.js +79 -39
  3. package/dist/cjs/SimpleBootHttpServer.js.map +3 -3
  4. package/dist/cjs/codes/HttpHeaders.js +14 -3
  5. package/dist/cjs/codes/HttpHeaders.js.map +2 -2
  6. package/dist/cjs/codes/Mimes.js +2 -0
  7. package/dist/cjs/codes/Mimes.js.map +2 -2
  8. package/dist/cjs/decorators/MethodMapping.js +7 -6
  9. package/dist/cjs/decorators/MethodMapping.js.map +3 -3
  10. package/dist/cjs/endpoints/WebSocketEndPoint.js +16 -0
  11. package/dist/cjs/endpoints/WebSocketEndPoint.js.map +7 -0
  12. package/dist/cjs/filters/CacheFilter.js +75 -35
  13. package/dist/cjs/filters/CacheFilter.js.map +3 -3
  14. package/dist/cjs/filters/IntentSchemeFilter.js +98 -0
  15. package/dist/cjs/filters/IntentSchemeFilter.js.map +7 -0
  16. package/dist/cjs/filters/ResourceFilter.js +4 -1
  17. package/dist/cjs/filters/ResourceFilter.js.map +2 -2
  18. package/dist/cjs/filters/TopicProtocolFilter.js +343 -0
  19. package/dist/cjs/filters/TopicProtocolFilter.js.map +7 -0
  20. package/dist/cjs/filters/index.js +2 -0
  21. package/dist/cjs/filters/index.js.map +2 -2
  22. package/dist/cjs/index.js +28 -0
  23. package/dist/cjs/index.js.map +2 -2
  24. package/dist/cjs/models/RequestResponse.js +51 -89
  25. package/dist/cjs/models/RequestResponse.js.map +3 -3
  26. package/dist/cjs/models/datas/body/ReqPathData.js +29 -0
  27. package/dist/cjs/models/datas/body/ReqPathData.js.map +7 -0
  28. package/dist/cjs/option/HttpServerOption.js +25 -5
  29. package/dist/cjs/option/HttpServerOption.js.map +2 -2
  30. package/dist/cjs/proxy/SymbolIntentApiServiceProxy.js +141 -0
  31. package/dist/cjs/proxy/SymbolIntentApiServiceProxy.js.map +7 -0
  32. package/dist/cjs/proxy/SymbolIntentApiServiceProxyBase.js +35 -0
  33. package/dist/cjs/proxy/SymbolIntentApiServiceProxyBase.js.map +7 -0
  34. package/dist/cjs/proxy/TopicProtocolApiServiceProxy.js +324 -0
  35. package/dist/cjs/proxy/TopicProtocolApiServiceProxy.js.map +7 -0
  36. package/dist/cjs/proxy/index.js +26 -0
  37. package/dist/cjs/proxy/index.js.map +7 -0
  38. package/dist/cjs/resolvers/ResourceResolver.js +2 -2
  39. package/dist/cjs/resolvers/ResourceResolver.js.map +2 -2
  40. package/dist/cjs/session/SessionManager.js +2 -2
  41. package/dist/cjs/session/SessionManager.js.map +2 -2
  42. package/dist/cjs/websocket/WebSocketClient.js +554 -0
  43. package/dist/cjs/websocket/WebSocketClient.js.map +7 -0
  44. package/dist/cjs/websocket/WebSocketManager.js +652 -0
  45. package/dist/cjs/websocket/WebSocketManager.js.map +7 -0
  46. package/dist/cjs/websocket/index.js +24 -0
  47. package/dist/cjs/websocket/index.js.map +7 -0
  48. package/dist/esm/SimpleBootHttpServer.js +59 -19
  49. package/dist/esm/SimpleBootHttpServer.js.map +2 -2
  50. package/dist/esm/codes/HttpHeaders.js +12 -2
  51. package/dist/esm/codes/HttpHeaders.js.map +2 -2
  52. package/dist/esm/codes/Mimes.js +2 -0
  53. package/dist/esm/codes/Mimes.js.map +2 -2
  54. package/dist/esm/decorators/MethodMapping.js +2 -1
  55. package/dist/esm/decorators/MethodMapping.js.map +2 -2
  56. package/dist/esm/endpoints/WebSocketEndPoint.js +1 -0
  57. package/dist/esm/endpoints/WebSocketEndPoint.js.map +7 -0
  58. package/dist/esm/filters/CacheFilter.js +67 -27
  59. package/dist/esm/filters/CacheFilter.js.map +2 -2
  60. package/dist/esm/filters/IntentSchemeFilter.js +75 -0
  61. package/dist/esm/filters/IntentSchemeFilter.js.map +7 -0
  62. package/dist/esm/filters/ResourceFilter.js +4 -1
  63. package/dist/esm/filters/ResourceFilter.js.map +2 -2
  64. package/dist/esm/filters/TopicProtocolFilter.js +310 -0
  65. package/dist/esm/filters/TopicProtocolFilter.js.map +7 -0
  66. package/dist/esm/filters/index.js +1 -0
  67. package/dist/esm/filters/index.js.map +2 -2
  68. package/dist/esm/index.js +12 -0
  69. package/dist/esm/index.js.map +2 -2
  70. package/dist/esm/models/RequestResponse.js +46 -84
  71. package/dist/esm/models/RequestResponse.js.map +2 -2
  72. package/dist/esm/models/datas/body/ReqPathData.js +6 -0
  73. package/dist/esm/models/datas/body/ReqPathData.js.map +7 -0
  74. package/dist/esm/option/HttpServerOption.js +24 -4
  75. package/dist/esm/option/HttpServerOption.js.map +2 -2
  76. package/dist/esm/proxy/SymbolIntentApiServiceProxy.js +118 -0
  77. package/dist/esm/proxy/SymbolIntentApiServiceProxy.js.map +7 -0
  78. package/dist/esm/proxy/SymbolIntentApiServiceProxyBase.js +12 -0
  79. package/dist/esm/proxy/SymbolIntentApiServiceProxyBase.js.map +7 -0
  80. package/dist/esm/proxy/TopicProtocolApiServiceProxy.js +301 -0
  81. package/dist/esm/proxy/TopicProtocolApiServiceProxy.js.map +7 -0
  82. package/dist/esm/proxy/index.js +4 -0
  83. package/dist/esm/proxy/index.js.map +7 -0
  84. package/dist/esm/resolvers/ResourceResolver.js +1 -1
  85. package/dist/esm/resolvers/ResourceResolver.js.map +1 -1
  86. package/dist/esm/session/SessionManager.js +1 -1
  87. package/dist/esm/session/SessionManager.js.map +1 -1
  88. package/dist/esm/websocket/WebSocketClient.js +529 -0
  89. package/dist/esm/websocket/WebSocketClient.js.map +7 -0
  90. package/dist/esm/websocket/WebSocketManager.js +622 -0
  91. package/dist/esm/websocket/WebSocketManager.js.map +7 -0
  92. package/dist/esm/websocket/index.js +3 -0
  93. package/dist/esm/websocket/index.js.map +7 -0
  94. package/dist/esm-bundle/dooboostore-simple-boot-http-server.esm.js +13190 -4886
  95. package/dist/esm-bundle/dooboostore-simple-boot-http-server.esm.js.map +4 -4
  96. package/dist/types/SimpleBootHttpServer.d.ts +5 -3
  97. package/dist/types/SimpleBootHttpServer.d.ts.map +1 -1
  98. package/dist/types/codes/HttpHeaders.d.ts +3 -0
  99. package/dist/types/codes/HttpHeaders.d.ts.map +1 -1
  100. package/dist/types/codes/Mimes.d.ts +3 -1
  101. package/dist/types/codes/Mimes.d.ts.map +1 -1
  102. package/dist/types/decorators/MethodMapping.d.ts +3 -2
  103. package/dist/types/decorators/MethodMapping.d.ts.map +1 -1
  104. package/dist/types/endpoints/WebSocketEndPoint.d.ts +17 -0
  105. package/dist/types/endpoints/WebSocketEndPoint.d.ts.map +1 -0
  106. package/dist/types/filters/CacheFilter.d.ts +6 -0
  107. package/dist/types/filters/CacheFilter.d.ts.map +1 -1
  108. package/dist/types/filters/IntentSchemeFilter.d.ts +20 -0
  109. package/dist/types/filters/IntentSchemeFilter.d.ts.map +1 -0
  110. package/dist/types/filters/ResourceFilter.d.ts.map +1 -1
  111. package/dist/types/filters/TopicProtocolFilter.d.ts +34 -0
  112. package/dist/types/filters/TopicProtocolFilter.d.ts.map +1 -0
  113. package/dist/types/filters/index.d.ts +1 -0
  114. package/dist/types/filters/index.d.ts.map +1 -1
  115. package/dist/types/index.d.ts +12 -0
  116. package/dist/types/index.d.ts.map +1 -1
  117. package/dist/types/models/RequestResponse.d.ts +9 -6
  118. package/dist/types/models/RequestResponse.d.ts.map +1 -1
  119. package/dist/types/models/datas/body/ReqPathData.d.ts +4 -0
  120. package/dist/types/models/datas/body/ReqPathData.d.ts.map +1 -0
  121. package/dist/types/option/HttpServerOption.d.ts +30 -20
  122. package/dist/types/option/HttpServerOption.d.ts.map +1 -1
  123. package/dist/types/proxy/SymbolIntentApiServiceProxy.d.ts +18 -0
  124. package/dist/types/proxy/SymbolIntentApiServiceProxy.d.ts.map +1 -0
  125. package/dist/types/proxy/SymbolIntentApiServiceProxyBase.d.ts +5 -0
  126. package/dist/types/proxy/SymbolIntentApiServiceProxyBase.d.ts.map +1 -0
  127. package/dist/types/proxy/TopicProtocolApiServiceProxy.d.ts +28 -0
  128. package/dist/types/proxy/TopicProtocolApiServiceProxy.d.ts.map +1 -0
  129. package/dist/types/proxy/index.d.ts +4 -0
  130. package/dist/types/proxy/index.d.ts.map +1 -0
  131. package/dist/types/session/SessionManager.d.ts +2 -17
  132. package/dist/types/session/SessionManager.d.ts.map +1 -1
  133. package/dist/types/websocket/WebSocketClient.d.ts +88 -0
  134. package/dist/types/websocket/WebSocketClient.d.ts.map +1 -0
  135. package/dist/types/websocket/WebSocketManager.d.ts +163 -0
  136. package/dist/types/websocket/WebSocketManager.d.ts.map +1 -0
  137. package/dist/types/websocket/index.d.ts +3 -0
  138. package/dist/types/websocket/index.d.ts.map +1 -0
  139. package/dist/umd-bundle/dooboostore-simple-boot-http-server.umd.js +13262 -4958
  140. package/dist/umd-bundle/dooboostore-simple-boot-http-server.umd.js.map +4 -4
  141. package/dist/umd-bundle/websocket-client.umd.js +11194 -0
  142. package/dist/umd-bundle/websocket-client.umd.js.map +7 -0
  143. package/package.json +24 -15
  144. package/src/SimpleBootHttpServer.ts +366 -312
  145. package/src/codes/HttpHeaders.ts +13 -2
  146. package/src/codes/Mimes.ts +27 -25
  147. package/src/decorators/MethodMapping.ts +4 -3
  148. package/src/endpoints/WebSocketEndPoint.ts +12 -0
  149. package/src/filters/CacheFilter.ts +112 -67
  150. package/src/filters/IntentSchemeFilter.ts +69 -0
  151. package/src/filters/ResourceFilter.ts +6 -1
  152. package/src/filters/TopicProtocolFilter.ts +349 -0
  153. package/src/filters/index.ts +1 -0
  154. package/src/index.ts +12 -12
  155. package/src/models/RequestResponse.ts +108 -240
  156. package/src/models/datas/body/ReqPathData.ts +3 -0
  157. package/src/option/HttpServerOption.ts +73 -23
  158. package/src/proxy/SymbolIntentApiServiceProxy.ts +120 -0
  159. package/src/proxy/SymbolIntentApiServiceProxyBase.ts +16 -0
  160. package/src/proxy/TopicProtocolApiServiceProxy.ts +328 -0
  161. package/src/proxy/index.ts +3 -0
  162. package/src/resolvers/ResourceResolver.ts +1 -1
  163. package/src/session/SessionManager.ts +3 -3
  164. package/src/websocket/WebSocketClient.ts +637 -0
  165. package/src/websocket/WebSocketManager.ts +713 -0
  166. package/src/websocket/index.ts +2 -0
  167. package/tsconfig.json +3 -1
@@ -0,0 +1,7 @@
1
+ {
2
+ "version": 3,
3
+ "sources": ["../../../src/websocket/WebSocketClient.ts"],
4
+ "sourcesContent": ["import {RandomUtils} from '@dooboostore/core';\nimport {TopicRequest, TopicResponse, TopicServerEventRequest, TopicServerEventResponse, TopicServerEventUnSubscribeRequest, TopicSubscribeRequest, TopicType, TopicUnsubscribeRequest} from './WebSocketManager';\nimport {MessageOperator, Observable, Subject} from '@dooboostore/core';\n\nexport * from '@dooboostore/core';\n\ntype TopicObserverNextCallBack<T> = <R = any>(data: T, meta: { socket: WebSocket }) => void;\ntype TopicObserverEventCallBack = { [event: string]: <T, R = any>(data: T, meta: { socket: WebSocket }) => Promise<R> | void | any } | (<T, R = any>(event: string, data: T, meta: { socket: WebSocket }) => Promise<R> | void | any);\ntype TopicObserverErrorCallBack = <R = any>(err: any) => void;\nexport type TopicObserverCallBack<T> = { next: TopicObserverNextCallBack<T>; event?: TopicObserverEventCallBack; error?: TopicObserverErrorCallBack; complete?: () => void } | TopicObserverNextCallBack<T>;\n\nexport interface WebSocketClientConfig {\n retryConnectionCount?: number;\n retryConnectionDelay?: number;\n maxPendingMessages?: number;\n maxPendingBinaryMessages?: number;\n}\n\ntype OnUnsubscribeCallback = (type: 'server' | 'manual') => void;\nexport type Subscription = {\n closed: boolean;\n unsubscribe: () => void;\n};\n\nexport class WebSocketClient {\n private websocket: WebSocket;\n private topics = new Map<string, { observer: TopicObserverCallBack<any>; subscription: Subscription; onUnsubscribes: OnUnsubscribeCallback[]; target: string }>();\n private observer?: (data: TopicResponse | TopicServerEventRequest | TopicServerEventUnSubscribeRequest) => void;\n private pendingMessages: any[] = [];\n private pendingBinaryMessages: Array<ArrayBuffer | Blob | Uint8Array> = [];\n private isConnected = false;\n private onOpenCallback: () => void;\n private onCloseCallback: () => void;\n private _subject = new Subject<TopicResponse | TopicServerEventRequest | TopicServerEventUnSubscribeRequest>();\n // Reconnection properties\n private connectionUrl: string | URL;\n private connectionProtocols?: string | string[];\n private retryConnectionCount: number;\n private retryConnectionDelay: number;\n private currentRetryCount = 0;\n private reconnectTimeout?: number;\n private isManualClose = false;\n private isConnecting = false;\n private maxPendingMessages: number;\n private maxPendingBinaryMessages: number;\n\n constructor(connection: { url: string | URL; protocols?: string | string[] }, config?: WebSocketClientConfig);\n constructor(connection: string, config?: WebSocketClientConfig);\n constructor(connection: URL, config?: WebSocketClientConfig);\n constructor(connection: { url: string | URL; protocols?: string | string[] } | string | URL, config?: WebSocketClientConfig) {\n // Store connection info for reconnection\n if (typeof connection === 'string' || connection instanceof URL) {\n this.connectionUrl = connection;\n } else {\n this.connectionUrl = connection.url;\n this.connectionProtocols = connection.protocols;\n }\n\n // Set config with defaults\n this.retryConnectionCount = config?.retryConnectionCount ?? 0;\n this.retryConnectionDelay = config?.retryConnectionDelay ?? 1000;\n this.maxPendingMessages = config?.maxPendingMessages ?? 1000;\n this.maxPendingBinaryMessages = config?.maxPendingBinaryMessages ?? 100;\n\n this.connect();\n }\n\n private get observable() {\n return this._subject.asObservable();\n }\n\n private connect() {\n if (this.isConnecting) {\n return;\n }\n if (this.websocket && (this.websocket.readyState === WebSocket.OPEN || this.websocket.readyState === WebSocket.CONNECTING)) {\n return;\n }\n this.isConnecting = true;\n if (this.connectionProtocols) {\n this.websocket = new WebSocket(this.connectionUrl, this.connectionProtocols);\n } else {\n this.websocket = new WebSocket(this.connectionUrl);\n }\n\n this.websocket.binaryType = 'arraybuffer';\n\n this.websocket.addEventListener('open', () => {\n this.isConnecting = false;\n this.isConnected = true;\n this.currentRetryCount = 0; // Reset retry count on successful connection\n if (this.reconnectTimeout) {\n clearTimeout(this.reconnectTimeout);\n this.reconnectTimeout = undefined;\n }\n console.log('WebSocket connected');\n this.onOpenCallback?.();\n\n // Re-subscribe to all existing topics after reconnection\n this.topics.forEach((topicData, uuid) => {\n // closed\uB41C subscription\uC740 \uC7AC\uAD6C\uB3C5\uD558\uC9C0 \uC54A\uC74C\n if (!topicData.subscription.closed) {\n const subscribeTopic: TopicSubscribeRequest = {\n type: 'subscribe',\n uuid,\n target: topicData.target\n };\n // console.log('????')\n this.websocket.send(JSON.stringify(subscribeTopic));\n }\n });\n\n // \uB300\uAE30 \uC911\uC778 \uBAA8\uB4E0 \uBA54\uC2DC\uC9C0 \uC804\uC1A1\n while (this.pendingMessages.length > 0) {\n const message = this.pendingMessages.shift();\n this.websocket.send(JSON.stringify(message));\n }\n\n while (this.pendingBinaryMessages.length > 0) {\n const message = this.pendingBinaryMessages.shift();\n if (message) {\n this.websocket.send(message);\n }\n }\n });\n\n this.websocket.addEventListener('close', event => {\n this.isConnecting = false;\n this.isConnected = false;\n console.log('WebSocket closed', event.code, event.reason);\n this.onCloseCallback?.();\n\n // Attempt reconnection if not manually closed\n if (!this.isManualClose) {\n this.attemptReconnect();\n }\n });\n\n this.websocket.addEventListener('error', error => {\n console.error('WebSocket error:', error);\n });\n\n this.websocket.addEventListener('message', async event => {\n const topic = await this.parseIncomingTopic(event.data);\n if (!topic) {\n return;\n }\n this._subject.next(topic);\n this.observer?.(topic);\n if (topic.uuid) {\n const topicData = this.topics.get(topic.uuid);\n if (topicData) {\n const observer = topicData.observer;\n const nextCallback = typeof observer === 'function' ? observer : observer.next;\n const errorCallback = typeof observer === 'function' ? undefined : observer.error;\n const eventCallback = typeof observer === 'function' ? undefined : observer.event;\n if ('state' in topic && topic.state === 'success') {\n await nextCallback(topic.body, { socket: this.websocket });\n } else if ('state' in topic && topic.state === 'error' && errorCallback) {\n await errorCallback(topic.body);\n } else if ('type' in topic && topic.type === 'unsubscribe') {\n topicData.subscription.closed = true;\n this.topics.delete(topic.uuid);\n topicData.onUnsubscribes.forEach(it => it('server'));\n } else if ('type' in topic && topic.type === 'event' && eventCallback) {\n /////////// event ///////////\n let eventResponse = typeof eventCallback === 'function' ? await eventCallback(topic.event, topic.body, { socket: this.websocket }) : await eventCallback[topic.event]?.(topic.body, { socket: this.websocket });\n\n if (eventResponse !== undefined && eventResponse !== null) {\n const value: TopicServerEventResponse = {\n uuid: topic.uuid,\n eventUUID: topic.eventUUID,\n type: topic.type,\n body: eventResponse\n };\n this.websocket.send(JSON.stringify(value));\n }\n }\n }\n }\n });\n }\n\n private attemptReconnect() {\n if (this.currentRetryCount >= this.retryConnectionCount) {\n console.error(`WebSocket reconnection failed after ${this.retryConnectionCount} attempts`);\n return;\n }\n if (this.reconnectTimeout) {\n return;\n }\n\n this.currentRetryCount++;\n console.log(`Attempting to reconnect... (${this.currentRetryCount}/${this.retryConnectionCount})`);\n\n this.reconnectTimeout = window.setTimeout(() => {\n this.reconnectTimeout = undefined;\n this.connect();\n // Subscribe messages are already in pendingMessages and will be sent automatically\n }, this.retryConnectionDelay);\n }\n\n private sendMessage(message: TopicRequest | TopicUnsubscribeRequest | TopicSubscribeRequest) {\n if (this.isConnected && this.websocket.readyState === WebSocket.OPEN) {\n this.websocket.send(JSON.stringify(message));\n return;\n }\n if (message.type === 'subscribe' || message.type === 'unsubscribe') {\n return;\n }\n if (this.maxPendingMessages <= 0) {\n return;\n }\n if (this.pendingMessages.length >= this.maxPendingMessages) {\n this.pendingMessages.shift();\n }\n this.pendingMessages.push(message);\n }\n\n sendBinary(data: ArrayBuffer | Blob | Uint8Array) {\n if (this.isConnected && this.websocket.readyState === WebSocket.OPEN) {\n this.websocket.send(data);\n return;\n }\n if (this.maxPendingBinaryMessages <= 0) {\n return;\n }\n if (this.pendingBinaryMessages.length >= this.maxPendingBinaryMessages) {\n this.pendingBinaryMessages.shift();\n }\n this.pendingBinaryMessages.push(data);\n }\n\n private async parseIncomingTopic(data: any): Promise<TopicResponse | TopicServerEventRequest | TopicServerEventUnSubscribeRequest | undefined> {\n if (typeof data === 'string') {\n try {\n return JSON.parse(data);\n } catch (error) {\n console.warn('Invalid WebSocket payload:', error);\n return undefined;\n }\n }\n\n if (data instanceof ArrayBuffer) {\n return this.parseBinaryTopic(data);\n }\n\n if (typeof Blob !== 'undefined' && data instanceof Blob) {\n const buffer = await data.arrayBuffer();\n return this.parseBinaryTopic(buffer);\n }\n\n return undefined;\n }\n\n private parseBinaryTopic(data: ArrayBuffer): TopicResponse | TopicServerEventRequest | TopicServerEventUnSubscribeRequest | undefined {\n if (data.byteLength < 4) {\n return undefined;\n }\n const view = new DataView(data);\n const jsonLength = view.getUint32(0, true);\n const jsonStart = 4;\n const jsonEnd = jsonStart + jsonLength;\n if (data.byteLength < jsonEnd) {\n return undefined;\n }\n\n const jsonBytes = new Uint8Array(data, jsonStart, jsonLength);\n let meta: any;\n try {\n const decoder = new TextDecoder();\n meta = JSON.parse(decoder.decode(jsonBytes));\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, any>();\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 > data.byteLength) {\n return;\n }\n const slice = data.slice(start, end);\n const mime = file.mime || 'application/octet-stream';\n let fileValue: any;\n if (typeof File !== 'undefined') {\n fileValue = new File([slice], file.name || 'file', { type: mime });\n } else {\n fileValue = { name: file.name || 'file', mime, size: file.size, buffer: slice };\n }\n fileMap.set(file.id, fileValue);\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 meta.body = replaceFileRefs(meta.body);\n return meta as TopicResponse | TopicServerEventRequest | TopicServerEventUnSubscribeRequest;\n }\n\n private isBinaryPayload(value: any) {\n if (!value) {\n return false;\n }\n if (typeof ArrayBuffer !== 'undefined' && value instanceof ArrayBuffer) {\n return true;\n }\n if (typeof Uint8Array !== 'undefined' && value instanceof Uint8Array) {\n return true;\n }\n if (typeof Blob !== 'undefined' && value instanceof Blob) {\n return true;\n }\n if (value && typeof value === 'object' && 'buffer' in value) {\n const bufferValue = (value as any).buffer;\n return this.isBinaryPayload(bufferValue);\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 async buildBinaryMessage(body: any, meta: { type?: TopicType; uuid: string; requestUUID: string }) {\n const fileRefs = new Map<any, string>();\n const fileEntries: Array<{ id: string; name: string; mime: string; buffer: Promise<ArrayBuffer | SharedArrayBuffer> }> = [];\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: Promise<ArrayBuffer | SharedArrayBuffer>;\n\n if (typeof Blob !== 'undefined' && value instanceof Blob) {\n const fileLike = value as File | Blob;\n if ('name' in fileLike && typeof (fileLike as File).name === 'string') {\n name = (fileLike as File).name || name;\n }\n mime = fileLike.type || mime;\n buffer = fileLike.arrayBuffer();\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 (typeof Blob !== 'undefined' && innerBuffer instanceof Blob) {\n buffer = innerBuffer.arrayBuffer();\n } else if (typeof Uint8Array !== 'undefined' && innerBuffer instanceof Uint8Array) {\n const sliced = innerBuffer.buffer.slice(innerBuffer.byteOffset, innerBuffer.byteOffset + innerBuffer.byteLength);\n buffer = Promise.resolve(sliced instanceof ArrayBuffer ? sliced : new Uint8Array(sliced).buffer);\n } else if (typeof ArrayBuffer !== 'undefined' && innerBuffer instanceof ArrayBuffer) {\n buffer = Promise.resolve(innerBuffer as ArrayBuffer);\n } else {\n buffer = Promise.resolve(new ArrayBuffer(0));\n }\n } else if (typeof Uint8Array !== 'undefined' && value instanceof Uint8Array) {\n const view = value as Uint8Array;\n const sliced = view.buffer.slice(view.byteOffset, view.byteOffset + view.byteLength);\n buffer = Promise.resolve(sliced instanceof ArrayBuffer ? sliced : new Uint8Array(sliced).buffer);\n } else if (typeof ArrayBuffer !== 'undefined' && value instanceof ArrayBuffer) {\n buffer = Promise.resolve(value as ArrayBuffer);\n } else {\n buffer = Promise.resolve(new ArrayBuffer(0));\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(body);\n const buffers = await Promise.all(fileEntries.map(entry => entry.buffer));\n\n let offset = 0;\n const files = fileEntries.map((entry, index) => {\n const size = buffers[index].byteLength;\n const fileMeta = {\n id: entry.id,\n name: entry.name,\n mime: entry.mime,\n size,\n offset\n };\n offset += size;\n return fileMeta;\n });\n\n const json = JSON.stringify({\n type: meta.type,\n uuid: meta.uuid,\n requestUUID: meta.requestUUID,\n body: payload,\n files\n });\n\n const encoder = new TextEncoder();\n const jsonBytes = encoder.encode(json);\n const header = new Uint8Array(4);\n new DataView(header.buffer).setUint32(0, jsonBytes.byteLength, true);\n\n const totalSize = header.byteLength + jsonBytes.byteLength + offset;\n const combined = new Uint8Array(totalSize);\n combined.set(header, 0);\n combined.set(jsonBytes, header.byteLength);\n\n let cursor = header.byteLength + jsonBytes.byteLength;\n buffers.forEach(buffer => {\n const view = buffer instanceof ArrayBuffer ? new Uint8Array(buffer) : new Uint8Array(buffer);\n combined.set(view, cursor);\n cursor += buffer.byteLength;\n });\n\n return combined.buffer;\n }\n\n subject(target: string, option?: { type?: TopicType; subScribeBody?: any; observer?: TopicObserverCallBack<any>; onUnsubscribe?: OnUnsubscribeCallback }) {\n const self = this;\n const uuid = RandomUtils.uuid4();\n const onUnsubscribes: OnUnsubscribeCallback[] = [];\n if (option?.onUnsubscribe) {\n onUnsubscribes.push(option.onUnsubscribe);\n }\n if (option?.observer && typeof option.observer !== 'function' && option.observer.complete) {\n onUnsubscribes.push(() => (option.observer as any).complete());\n }\n const topicSubject = new Subject<any>();\n onUnsubscribes.push(() => topicSubject.complete());\n\n let isClosed = false;\n let activeSubscription: Subscription | undefined;\n\n const unsubscribeLogic = () => {\n if (isClosed) return;\n const unSubscribeTopic: TopicUnsubscribeRequest = { type: 'unsubscribe', uuid };\n self.sendMessage(unSubscribeTopic);\n isClosed = true;\n self.topics.delete(uuid);\n onUnsubscribes.forEach(it => it('manual'));\n if (activeSubscription) {\n activeSubscription.closed = true;\n }\n };\n\n const doSubscribe = <T>(observer?: TopicObserverCallBack<T>) => {\n const subscription: Subscription = {\n closed: isClosed,\n unsubscribe: unsubscribeLogic\n };\n\n const wrappedObserver: TopicObserverCallBack<T> = {\n next: (data, meta) => {\n topicSubject.next(data);\n if (observer) {\n return typeof observer === 'function' ? observer(data, meta) : observer.next(data, meta);\n }\n },\n error: err => {\n topicSubject.error(err);\n if (observer && typeof observer !== 'function' && observer.error) {\n observer.error(err);\n }\n },\n event: observer && typeof observer !== 'function' ? observer.event : undefined\n };\n\n self.topics.set(uuid, { observer: wrappedObserver, target, subscription, onUnsubscribes });\n const subscribeTopic: TopicSubscribeRequest = { type: 'subscribe', uuid, target: target, body: option?.subScribeBody };\n\n self.sendMessage(subscribeTopic);\n // console.log('----------')\n activeSubscription = subscription;\n return subscription;\n };\n\n if (option?.observer) {\n doSubscribe(option.observer);\n }\n\n return {\n get closed() {\n return isClosed;\n },\n unsubscribe: unsubscribeLogic,\n get observable() {\n return new Observable<any>(subscriber => {\n if (!activeSubscription && !isClosed) {\n doSubscribe();\n }\n return topicSubject.subscribe({\n next: value => subscriber.next(value),\n error: err => subscriber.error(err),\n complete: () => subscriber.complete()\n });\n });\n },\n send: (body?: any) => {\n if (!activeSubscription && !self.topics.has(uuid) && !isClosed) {\n doSubscribe();\n }\n const requestUUID = RandomUtils.uuid4();\n if (self.hasBinaryPayload(body)) {\n self.buildBinaryMessage(body, { type: option?.type, uuid, requestUUID }).then(buffer => self.sendBinary(buffer));\n } else {\n const value: TopicRequest = { type: option?.type, uuid, requestUUID, body: body };\n self.sendMessage(value);\n }\n return topicSubject.pipe(MessageOperator.filter(data => data && data.requestUUID === requestUUID));\n },\n onUnsubscribe: (callback: OnUnsubscribeCallback) => {\n onUnsubscribes.push(callback);\n }\n };\n }\n\n onOpen(callback: () => void) {\n this.onOpenCallback = callback;\n }\n\n onClose(callback: () => void) {\n this.onCloseCallback = callback;\n }\n\n subscribe<T = any>(observer: (data: TopicResponse<T> | TopicServerEventRequest<T>) => void) {\n this.observer = observer;\n }\n\n close() {\n this.isManualClose = true;\n if (this.reconnectTimeout) {\n clearTimeout(this.reconnectTimeout);\n this.reconnectTimeout = undefined;\n }\n this.pendingMessages = [];\n this.pendingBinaryMessages = [];\n this.isConnecting = false;\n this.topics.forEach(topicData => {\n topicData.subscription.closed = true;\n topicData.onUnsubscribes.forEach(it => it('manual'));\n });\n this.topics.clear();\n this.websocket.close();\n }\n\n reconnect() {\n // \uAE30\uC874 \uC5F0\uACB0 \uC885\uB8CC\n this.isManualClose = true;\n if (this.reconnectTimeout) {\n clearTimeout(this.reconnectTimeout);\n }\n\n // close \uC774\uBCA4\uD2B8 \uD6C4\uC5D0 \uC7AC\uC5F0\uACB0\uD558\uB3C4\uB85D \uC124\uC815\n const reconnectAfterClose = () => {\n console.log('close websocket');\n this.isManualClose = false;\n this.currentRetryCount = 0;\n this.connect();\n };\n\n // \uC774\uBBF8 \uB2EB\uD600\uC788\uC73C\uBA74 \uBC14\uB85C \uC7AC\uC5F0\uACB0\n if (this.websocket.readyState === WebSocket.CLOSED || this.websocket.readyState === WebSocket.CLOSING) {\n reconnectAfterClose();\n } else {\n // \uC5F0\uACB0\uC774 \uB2EB\uD790 \uB54C\uAE4C\uC9C0 \uAE30\uB2E4\uB838\uB2E4\uAC00 \uC7AC\uC5F0\uACB0\n this.websocket.addEventListener('close', reconnectAfterClose, { once: true });\n this.websocket.close();\n }\n }\n\n getReadyState(): number {\n return this.websocket.readyState;\n }\n\n isConnectionOpen(): boolean {\n return this.isConnected && this.websocket.readyState === WebSocket.OPEN;\n }\n}\n"],
5
+ "mappings": "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",
6
+ "names": ["import_core"]
7
+ }