@pipedog/core 0.0.0 → 0.2.0

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 (736) hide show
  1. package/LICENSE +25 -0
  2. package/NOTICE +9 -0
  3. package/dist/adapters/base_llm_adapter.d.ts +266 -0
  4. package/dist/adapters/base_llm_adapter.js +489 -0
  5. package/dist/adapters/index.d.ts +2 -0
  6. package/dist/adapters/index.js +8 -0
  7. package/dist/adapters/schemas/direct_function.d.ts +202 -0
  8. package/dist/adapters/schemas/direct_function.js +302 -0
  9. package/dist/adapters/schemas/function_schema.d.ts +67 -0
  10. package/dist/adapters/schemas/function_schema.js +72 -0
  11. package/dist/adapters/schemas/index.d.ts +2 -0
  12. package/dist/adapters/schemas/index.js +8 -0
  13. package/dist/adapters/schemas/tools_schema.d.ts +57 -0
  14. package/dist/adapters/schemas/tools_schema.js +79 -0
  15. package/dist/adapters/services/index.d.ts +2 -0
  16. package/dist/adapters/services/index.js +8 -0
  17. package/dist/adapters/services/open_ai_adapter.d.ts +147 -0
  18. package/dist/adapters/services/open_ai_adapter.js +250 -0
  19. package/dist/audio/dtmf/dtmf_data.d.ts +3 -0
  20. package/dist/audio/dtmf/dtmf_data.js +22 -0
  21. package/dist/audio/dtmf/index.d.ts +2 -0
  22. package/dist/audio/dtmf/index.js +8 -0
  23. package/dist/audio/dtmf/types.d.ts +31 -0
  24. package/dist/audio/dtmf/types.js +35 -0
  25. package/dist/audio/dtmf/utils.d.ts +13 -0
  26. package/dist/audio/dtmf/utils.js +62 -0
  27. package/dist/audio/filters/base_audio_filter.d.ts +51 -0
  28. package/dist/audio/filters/base_audio_filter.js +17 -0
  29. package/dist/audio/filters/index.d.ts +2 -0
  30. package/dist/audio/filters/index.js +8 -0
  31. package/dist/audio/index.d.ts +2 -0
  32. package/dist/audio/index.js +8 -0
  33. package/dist/audio/krisp_instance.d.ts +95 -0
  34. package/dist/audio/krisp_instance.js +229 -0
  35. package/dist/audio/mixers/base_audio_mixer.d.ts +56 -0
  36. package/dist/audio/mixers/base_audio_mixer.js +16 -0
  37. package/dist/audio/mixers/index.d.ts +2 -0
  38. package/dist/audio/mixers/index.js +8 -0
  39. package/dist/audio/resamplers/base_audio_resampler.d.ts +46 -0
  40. package/dist/audio/resamplers/base_audio_resampler.js +35 -0
  41. package/dist/audio/resamplers/engine.d.ts +60 -0
  42. package/dist/audio/resamplers/engine.js +89 -0
  43. package/dist/audio/resamplers/index.d.ts +2 -0
  44. package/dist/audio/resamplers/index.js +8 -0
  45. package/dist/audio/resamplers/resampy_resampler.d.ts +10 -0
  46. package/dist/audio/resamplers/resampy_resampler.js +15 -0
  47. package/dist/audio/resamplers/sinc_engine.d.ts +10 -0
  48. package/dist/audio/resamplers/sinc_engine.js +235 -0
  49. package/dist/audio/resamplers/soxr_resampler.d.ts +58 -0
  50. package/dist/audio/resamplers/soxr_resampler.js +79 -0
  51. package/dist/audio/resamplers/soxr_stream_resampler.d.ts +78 -0
  52. package/dist/audio/resamplers/soxr_stream_resampler.js +159 -0
  53. package/dist/audio/turn/base_turn_analyzer.d.ts +84 -0
  54. package/dist/audio/turn/base_turn_analyzer.js +61 -0
  55. package/dist/audio/turn/index.d.ts +2 -0
  56. package/dist/audio/turn/index.js +8 -0
  57. package/dist/audio/turn/smart_turn/_whisper_features.d.ts +30 -0
  58. package/dist/audio/turn/smart_turn/_whisper_features.js +225 -0
  59. package/dist/audio/turn/smart_turn/base_smart_turn.d.ts +94 -0
  60. package/dist/audio/turn/smart_turn/base_smart_turn.js +239 -0
  61. package/dist/audio/turn/smart_turn/local_smart_turn_v3.d.ts +76 -0
  62. package/dist/audio/turn/smart_turn/local_smart_turn_v3.js +151 -0
  63. package/dist/audio/utils.d.ts +224 -0
  64. package/dist/audio/utils.js +634 -0
  65. package/dist/audio/vad/data/index.d.ts +2 -0
  66. package/dist/audio/vad/data/index.js +8 -0
  67. package/dist/audio/vad/index.d.ts +2 -0
  68. package/dist/audio/vad/index.js +8 -0
  69. package/dist/audio/vad/vad_analyzer.d.ts +134 -0
  70. package/dist/audio/vad/vad_analyzer.js +249 -0
  71. package/dist/audio/vad/vad_controller.d.ts +143 -0
  72. package/dist/audio/vad/vad_controller.js +228 -0
  73. package/dist/audio/volume.d.ts +38 -0
  74. package/dist/audio/volume.js +75 -0
  75. package/dist/bus/adapters/base.d.ts +35 -0
  76. package/dist/bus/adapters/base.js +19 -0
  77. package/dist/bus/adapters/index.d.ts +10 -0
  78. package/dist/bus/adapters/index.js +15 -0
  79. package/dist/bus/adapters/llm_context_adapter.d.ts +36 -0
  80. package/dist/bus/adapters/llm_context_adapter.js +82 -0
  81. package/dist/bus/adapters/tools_schema_adapter.d.ts +25 -0
  82. package/dist/bus/adapters/tools_schema_adapter.js +70 -0
  83. package/dist/bus/bridge_processor.d.ts +111 -0
  84. package/dist/bus/bridge_processor.js +166 -0
  85. package/dist/bus/bus.d.ts +110 -0
  86. package/dist/bus/bus.js +200 -0
  87. package/dist/bus/index.d.ts +22 -0
  88. package/dist/bus/index.js +27 -0
  89. package/dist/bus/local/async_queue.d.ts +12 -0
  90. package/dist/bus/local/async_queue.js +21 -0
  91. package/dist/bus/local/index.d.ts +3 -0
  92. package/dist/bus/local/index.js +8 -0
  93. package/dist/bus/messages.d.ts +378 -0
  94. package/dist/bus/messages.js +357 -0
  95. package/dist/bus/network/index.d.ts +16 -0
  96. package/dist/bus/network/index.js +21 -0
  97. package/dist/bus/queue.d.ts +27 -0
  98. package/dist/bus/queue.js +51 -0
  99. package/dist/bus/serializers/base.d.ts +25 -0
  100. package/dist/bus/serializers/base.js +14 -0
  101. package/dist/bus/serializers/index.d.ts +9 -0
  102. package/dist/bus/serializers/index.js +14 -0
  103. package/dist/bus/serializers/json.d.ts +77 -0
  104. package/dist/bus/serializers/json.js +367 -0
  105. package/dist/bus/subscriber.d.ts +46 -0
  106. package/dist/bus/subscriber.js +27 -0
  107. package/dist/bus/ui/index.d.ts +3 -0
  108. package/dist/bus/ui/index.js +8 -0
  109. package/dist/bus/ui/messages.d.ts +186 -0
  110. package/dist/bus/ui/messages.js +171 -0
  111. package/dist/classifiers/base_classifier.d.ts +263 -0
  112. package/dist/classifiers/base_classifier.js +346 -0
  113. package/dist/classifiers/cloudflare/clef/classifier.d.ts +70 -0
  114. package/dist/classifiers/cloudflare/clef/classifier.js +204 -0
  115. package/dist/classifiers/cloudflare/clef/client.d.ts +104 -0
  116. package/dist/classifiers/cloudflare/clef/client.js +234 -0
  117. package/dist/classifiers/cloudflare/clef/index.d.ts +2 -0
  118. package/dist/classifiers/cloudflare/clef/index.js +8 -0
  119. package/dist/classifiers/cloudflare/index.d.ts +2 -0
  120. package/dist/classifiers/cloudflare/index.js +8 -0
  121. package/dist/classifiers/http_client.d.ts +70 -0
  122. package/dist/classifiers/http_client.js +161 -0
  123. package/dist/classifiers/index.d.ts +2 -0
  124. package/dist/classifiers/index.js +8 -0
  125. package/dist/classifiers/jev/classifier.d.ts +8 -0
  126. package/dist/classifiers/jev/classifier.js +13 -0
  127. package/dist/classifiers/jev/client.d.ts +8 -0
  128. package/dist/classifiers/jev/client.js +13 -0
  129. package/dist/classifiers/jev/index.d.ts +2 -0
  130. package/dist/classifiers/jev/index.js +8 -0
  131. package/dist/classifiers/llm/classifier.d.ts +72 -0
  132. package/dist/classifiers/llm/classifier.js +304 -0
  133. package/dist/classifiers/llm/index.d.ts +2 -0
  134. package/dist/classifiers/llm/index.js +8 -0
  135. package/dist/classifiers/openai/decisions/classifier.d.ts +77 -0
  136. package/dist/classifiers/openai/decisions/classifier.js +241 -0
  137. package/dist/classifiers/openai/decisions/client.d.ts +108 -0
  138. package/dist/classifiers/openai/decisions/client.js +234 -0
  139. package/dist/classifiers/openai/decisions/index.d.ts +2 -0
  140. package/dist/classifiers/openai/decisions/index.js +8 -0
  141. package/dist/classifiers/openai/index.d.ts +2 -0
  142. package/dist/classifiers/openai/index.js +8 -0
  143. package/dist/classifiers/typesafe/index.d.ts +2 -0
  144. package/dist/classifiers/typesafe/index.js +8 -0
  145. package/dist/classifiers/typesafe/jev/classifier.d.ts +70 -0
  146. package/dist/classifiers/typesafe/jev/classifier.js +220 -0
  147. package/dist/classifiers/typesafe/jev/client.d.ts +105 -0
  148. package/dist/classifiers/typesafe/jev/client.js +233 -0
  149. package/dist/classifiers/typesafe/jev/index.d.ts +2 -0
  150. package/dist/classifiers/typesafe/jev/index.js +8 -0
  151. package/dist/clocks/base_clock.d.ts +13 -0
  152. package/dist/clocks/base_clock.js +14 -0
  153. package/dist/clocks/index.d.ts +2 -0
  154. package/dist/clocks/index.js +8 -0
  155. package/dist/clocks/system_clock.d.ts +15 -0
  156. package/dist/clocks/system_clock.js +25 -0
  157. package/dist/frames/frames.d.ts +2533 -0
  158. package/dist/frames/frames.js +2485 -0
  159. package/dist/frames/index.d.ts +2 -0
  160. package/dist/frames/index.js +8 -0
  161. package/dist/frames/protobufs/frames_pb2.d.ts +229 -0
  162. package/dist/frames/protobufs/frames_pb2.js +466 -0
  163. package/dist/index.d.ts +11 -0
  164. package/dist/index.js +56 -0
  165. package/dist/metrics/index.d.ts +2 -0
  166. package/dist/metrics/index.js +8 -0
  167. package/dist/metrics/metrics.d.ts +276 -0
  168. package/dist/metrics/metrics.js +254 -0
  169. package/dist/observers/base_observer.d.ts +173 -0
  170. package/dist/observers/base_observer.js +151 -0
  171. package/dist/observers/error_observer.d.ts +75 -0
  172. package/dist/observers/error_observer.js +87 -0
  173. package/dist/observers/function_call_observer.d.ts +157 -0
  174. package/dist/observers/function_call_observer.js +222 -0
  175. package/dist/observers/index.d.ts +2 -0
  176. package/dist/observers/index.js +8 -0
  177. package/dist/observers/loggers/debug_log_observer.d.ts +91 -0
  178. package/dist/observers/loggers/debug_log_observer.js +228 -0
  179. package/dist/observers/loggers/index.d.ts +2 -0
  180. package/dist/observers/loggers/index.js +8 -0
  181. package/dist/observers/loggers/llm_log_observer.d.ts +24 -0
  182. package/dist/observers/loggers/llm_log_observer.js +110 -0
  183. package/dist/observers/loggers/metrics_log_observer.d.ts +85 -0
  184. package/dist/observers/loggers/metrics_log_observer.js +186 -0
  185. package/dist/observers/loggers/transcription_log_observer.d.ts +23 -0
  186. package/dist/observers/loggers/transcription_log_observer.js +74 -0
  187. package/dist/observers/service_metrics_observer.d.ts +168 -0
  188. package/dist/observers/service_metrics_observer.js +236 -0
  189. package/dist/observers/speaking_observer.d.ts +104 -0
  190. package/dist/observers/speaking_observer.js +150 -0
  191. package/dist/observers/startup_timing_observer.d.ts +221 -0
  192. package/dist/observers/startup_timing_observer.js +365 -0
  193. package/dist/observers/turn_tracking_observer.d.ts +78 -0
  194. package/dist/observers/turn_tracking_observer.js +189 -0
  195. package/dist/observers/user_bot_latency_observer.d.ts +411 -0
  196. package/dist/observers/user_bot_latency_observer.js +974 -0
  197. package/dist/pipeline/base_pipeline.d.ts +49 -0
  198. package/dist/pipeline/base_pipeline.js +101 -0
  199. package/dist/pipeline/capabilities.d.ts +76 -0
  200. package/dist/pipeline/capabilities.js +97 -0
  201. package/dist/pipeline/index.d.ts +2 -0
  202. package/dist/pipeline/index.js +8 -0
  203. package/dist/pipeline/job_context.d.ts +317 -0
  204. package/dist/pipeline/job_context.js +450 -0
  205. package/dist/pipeline/job_decorator.d.ts +54 -0
  206. package/dist/pipeline/job_decorator.js +92 -0
  207. package/dist/pipeline/llm_switcher.d.ts +84 -0
  208. package/dist/pipeline/llm_switcher.js +107 -0
  209. package/dist/pipeline/llm_with_backend.d.ts +435 -0
  210. package/dist/pipeline/llm_with_backend.js +806 -0
  211. package/dist/pipeline/parallel_pipeline.d.ts +83 -0
  212. package/dist/pipeline/parallel_pipeline.js +200 -0
  213. package/dist/pipeline/pipeline.d.ts +126 -0
  214. package/dist/pipeline/pipeline.js +196 -0
  215. package/dist/pipeline/service_switcher.d.ts +287 -0
  216. package/dist/pipeline/service_switcher.js +509 -0
  217. package/dist/pipeline/sync_parallel_pipeline.d.ts +192 -0
  218. package/dist/pipeline/sync_parallel_pipeline.js +387 -0
  219. package/dist/pipeline/worker.d.ts +821 -0
  220. package/dist/pipeline/worker.js +1656 -0
  221. package/dist/pipeline/worker_observer.d.ts +131 -0
  222. package/dist/pipeline/worker_observer.js +274 -0
  223. package/dist/pipeline/worker_ready_decorator.d.ts +45 -0
  224. package/dist/pipeline/worker_ready_decorator.js +76 -0
  225. package/dist/processors/aggregators/async_tool_messages.d.ts +146 -0
  226. package/dist/processors/aggregators/async_tool_messages.js +291 -0
  227. package/dist/processors/aggregators/dtmf_aggregator.d.ts +61 -0
  228. package/dist/processors/aggregators/dtmf_aggregator.js +144 -0
  229. package/dist/processors/aggregators/gated.d.ts +43 -0
  230. package/dist/processors/aggregators/gated.js +86 -0
  231. package/dist/processors/aggregators/gated_llm_context.d.ts +42 -0
  232. package/dist/processors/aggregators/gated_llm_context.js +86 -0
  233. package/dist/processors/aggregators/index.d.ts +2 -0
  234. package/dist/processors/aggregators/index.js +8 -0
  235. package/dist/processors/aggregators/llm_context.d.ts +370 -0
  236. package/dist/processors/aggregators/llm_context.js +580 -0
  237. package/dist/processors/aggregators/llm_context_summarizer.d.ts +219 -0
  238. package/dist/processors/aggregators/llm_context_summarizer.js +447 -0
  239. package/dist/processors/aggregators/llm_response.d.ts +37 -0
  240. package/dist/processors/aggregators/llm_response.js +71 -0
  241. package/dist/processors/aggregators/llm_response_universal.d.ts +966 -0
  242. package/dist/processors/aggregators/llm_response_universal.js +2394 -0
  243. package/dist/processors/aggregators/llm_text_processor.d.ts +53 -0
  244. package/dist/processors/aggregators/llm_text_processor.js +102 -0
  245. package/dist/processors/aggregators/sentence.d.ts +39 -0
  246. package/dist/processors/aggregators/sentence.js +69 -0
  247. package/dist/processors/async_generator.d.ts +42 -0
  248. package/dist/processors/async_generator.js +76 -0
  249. package/dist/processors/audio/audio_buffer_processor.d.ts +241 -0
  250. package/dist/processors/audio/audio_buffer_processor.js +565 -0
  251. package/dist/processors/audio/index.d.ts +2 -0
  252. package/dist/processors/audio/index.js +8 -0
  253. package/dist/processors/audio/vad_processor.d.ts +67 -0
  254. package/dist/processors/audio/vad_processor.js +103 -0
  255. package/dist/processors/consumer_processor.d.ts +49 -0
  256. package/dist/processors/consumer_processor.js +85 -0
  257. package/dist/processors/filters/frame_filter.d.ts +39 -0
  258. package/dist/processors/filters/frame_filter.js +52 -0
  259. package/dist/processors/filters/function_filter.d.ts +59 -0
  260. package/dist/processors/filters/function_filter.js +78 -0
  261. package/dist/processors/filters/identity_filter.d.ts +33 -0
  262. package/dist/processors/filters/identity_filter.js +37 -0
  263. package/dist/processors/filters/index.d.ts +2 -0
  264. package/dist/processors/filters/index.js +8 -0
  265. package/dist/processors/filters/null_filter.d.ts +34 -0
  266. package/dist/processors/filters/null_filter.js +47 -0
  267. package/dist/processors/filters/wake_notifier_filter.d.ts +48 -0
  268. package/dist/processors/filters/wake_notifier_filter.js +49 -0
  269. package/dist/processors/frame_processor.d.ts +360 -0
  270. package/dist/processors/frame_processor.js +932 -0
  271. package/dist/processors/frameworks/index.d.ts +2 -0
  272. package/dist/processors/frameworks/index.js +8 -0
  273. package/dist/processors/frameworks/rtvi/frames.d.ts +241 -0
  274. package/dist/processors/frameworks/rtvi/frames.js +259 -0
  275. package/dist/processors/frameworks/rtvi/index.d.ts +6 -0
  276. package/dist/processors/frameworks/rtvi/index.js +11 -0
  277. package/dist/processors/frameworks/rtvi/models.d.ts +1741 -0
  278. package/dist/processors/frameworks/rtvi/models.js +1807 -0
  279. package/dist/processors/frameworks/rtvi/observer.d.ts +340 -0
  280. package/dist/processors/frameworks/rtvi/observer.js +1113 -0
  281. package/dist/processors/frameworks/rtvi/processor.d.ts +182 -0
  282. package/dist/processors/frameworks/rtvi/processor.js +676 -0
  283. package/dist/processors/idle_frame_processor.d.ts +44 -0
  284. package/dist/processors/idle_frame_processor.js +86 -0
  285. package/dist/processors/index.d.ts +2 -0
  286. package/dist/processors/index.js +8 -0
  287. package/dist/processors/logger.d.ts +42 -0
  288. package/dist/processors/logger.js +87 -0
  289. package/dist/processors/metrics/frame_processor_metrics.d.ts +172 -0
  290. package/dist/processors/metrics/frame_processor_metrics.js +372 -0
  291. package/dist/processors/metrics/index.d.ts +2 -0
  292. package/dist/processors/metrics/index.js +8 -0
  293. package/dist/processors/producer_processor.d.ts +68 -0
  294. package/dist/processors/producer_processor.js +78 -0
  295. package/dist/processors/text_transformer.d.ts +30 -0
  296. package/dist/processors/text_transformer.js +48 -0
  297. package/dist/registry/index.d.ts +3 -0
  298. package/dist/registry/index.js +8 -0
  299. package/dist/registry/registry.d.ts +69 -0
  300. package/dist/registry/registry.js +149 -0
  301. package/dist/registry/types.d.ts +47 -0
  302. package/dist/registry/types.js +39 -0
  303. package/dist/serializers/base_serializer.d.ts +94 -0
  304. package/dist/serializers/base_serializer.js +82 -0
  305. package/dist/serializers/index.d.ts +2 -0
  306. package/dist/serializers/index.js +8 -0
  307. package/dist/services/ai_service.d.ts +145 -0
  308. package/dist/services/ai_service.js +262 -0
  309. package/dist/services/anthropic/index.d.ts +2 -0
  310. package/dist/services/anthropic/index.js +7 -0
  311. package/dist/services/assemblyai/index.d.ts +2 -0
  312. package/dist/services/assemblyai/index.js +7 -0
  313. package/dist/services/asyncai/index.d.ts +2 -0
  314. package/dist/services/asyncai/index.js +7 -0
  315. package/dist/services/aws/index.d.ts +2 -0
  316. package/dist/services/aws/index.js +7 -0
  317. package/dist/services/azure/index.d.ts +2 -0
  318. package/dist/services/azure/index.js +7 -0
  319. package/dist/services/baseten/index.d.ts +2 -0
  320. package/dist/services/baseten/index.js +7 -0
  321. package/dist/services/bland/index.d.ts +2 -0
  322. package/dist/services/bland/index.js +7 -0
  323. package/dist/services/camb/index.d.ts +2 -0
  324. package/dist/services/camb/index.js +7 -0
  325. package/dist/services/cartesia/index.d.ts +2 -0
  326. package/dist/services/cartesia/index.js +7 -0
  327. package/dist/services/cerebras/index.d.ts +2 -0
  328. package/dist/services/cerebras/index.js +7 -0
  329. package/dist/services/crusoe/index.d.ts +2 -0
  330. package/dist/services/crusoe/index.js +7 -0
  331. package/dist/services/deepgram/index.d.ts +2 -0
  332. package/dist/services/deepgram/index.js +7 -0
  333. package/dist/services/deepseek/index.d.ts +2 -0
  334. package/dist/services/deepseek/index.js +7 -0
  335. package/dist/services/elevenlabs/index.d.ts +2 -0
  336. package/dist/services/elevenlabs/index.js +7 -0
  337. package/dist/services/fal/index.d.ts +2 -0
  338. package/dist/services/fal/index.js +7 -0
  339. package/dist/services/fireworks/index.d.ts +2 -0
  340. package/dist/services/fireworks/index.js +7 -0
  341. package/dist/services/fish/index.d.ts +2 -0
  342. package/dist/services/fish/index.js +7 -0
  343. package/dist/services/funasr/index.d.ts +3 -0
  344. package/dist/services/funasr/index.js +8 -0
  345. package/dist/services/gladia/index.d.ts +2 -0
  346. package/dist/services/gladia/index.js +7 -0
  347. package/dist/services/google/index.d.ts +2 -0
  348. package/dist/services/google/index.js +7 -0
  349. package/dist/services/gradium/index.d.ts +2 -0
  350. package/dist/services/gradium/index.js +7 -0
  351. package/dist/services/grok/index.d.ts +2 -0
  352. package/dist/services/grok/index.js +7 -0
  353. package/dist/services/groq/index.d.ts +2 -0
  354. package/dist/services/groq/index.js +7 -0
  355. package/dist/services/heygen/index.d.ts +2 -0
  356. package/dist/services/heygen/index.js +7 -0
  357. package/dist/services/hume/index.d.ts +2 -0
  358. package/dist/services/hume/index.js +7 -0
  359. package/dist/services/image_service.d.ts +52 -0
  360. package/dist/services/image_service.js +60 -0
  361. package/dist/services/inception/index.d.ts +2 -0
  362. package/dist/services/inception/index.js +7 -0
  363. package/dist/services/index.d.ts +2 -0
  364. package/dist/services/index.js +8 -0
  365. package/dist/services/inworld/index.d.ts +2 -0
  366. package/dist/services/inworld/index.js +7 -0
  367. package/dist/services/keenable/index.d.ts +2 -0
  368. package/dist/services/keenable/index.js +7 -0
  369. package/dist/services/kokoro/index.d.ts +2 -0
  370. package/dist/services/kokoro/index.js +7 -0
  371. package/dist/services/llm_service.d.ts +1106 -0
  372. package/dist/services/llm_service.js +2231 -0
  373. package/dist/services/mem0/index.d.ts +2 -0
  374. package/dist/services/mem0/index.js +7 -0
  375. package/dist/services/meta/index.d.ts +2 -0
  376. package/dist/services/meta/index.js +7 -0
  377. package/dist/services/minimax/index.d.ts +2 -0
  378. package/dist/services/minimax/index.js +7 -0
  379. package/dist/services/mistral/index.d.ts +2 -0
  380. package/dist/services/mistral/index.js +7 -0
  381. package/dist/services/moondream/index.d.ts +2 -0
  382. package/dist/services/moondream/index.js +7 -0
  383. package/dist/services/moonshine/index.d.ts +2 -0
  384. package/dist/services/moonshine/index.js +7 -0
  385. package/dist/services/nebius/index.d.ts +2 -0
  386. package/dist/services/nebius/index.js +7 -0
  387. package/dist/services/neuphonic/index.d.ts +2 -0
  388. package/dist/services/neuphonic/index.js +7 -0
  389. package/dist/services/novita/index.d.ts +2 -0
  390. package/dist/services/novita/index.js +7 -0
  391. package/dist/services/nvidia/index.d.ts +2 -0
  392. package/dist/services/nvidia/index.js +11 -0
  393. package/dist/services/ollama/index.d.ts +2 -0
  394. package/dist/services/ollama/index.js +7 -0
  395. package/dist/services/openai/index.d.ts +2 -0
  396. package/dist/services/openai/index.js +7 -0
  397. package/dist/services/openclaw/index.d.ts +14 -0
  398. package/dist/services/openclaw/index.js +19 -0
  399. package/dist/services/openrouter/index.d.ts +2 -0
  400. package/dist/services/openrouter/index.js +7 -0
  401. package/dist/services/perplexity/index.d.ts +2 -0
  402. package/dist/services/perplexity/index.js +7 -0
  403. package/dist/services/piper/index.d.ts +2 -0
  404. package/dist/services/piper/index.js +7 -0
  405. package/dist/services/pocket_tts/index.d.ts +2 -0
  406. package/dist/services/pocket_tts/index.js +7 -0
  407. package/dist/services/qwen/index.d.ts +2 -0
  408. package/dist/services/qwen/index.js +7 -0
  409. package/dist/services/resembleai/index.d.ts +2 -0
  410. package/dist/services/resembleai/index.js +7 -0
  411. package/dist/services/rime/index.d.ts +2 -0
  412. package/dist/services/rime/index.js +7 -0
  413. package/dist/services/sambanova/index.d.ts +2 -0
  414. package/dist/services/sambanova/index.js +7 -0
  415. package/dist/services/sarvam/index.d.ts +2 -0
  416. package/dist/services/sarvam/index.js +7 -0
  417. package/dist/services/settings.d.ts +356 -0
  418. package/dist/services/settings.js +437 -0
  419. package/dist/services/simli/index.d.ts +2 -0
  420. package/dist/services/simli/index.js +7 -0
  421. package/dist/services/smallest/index.d.ts +2 -0
  422. package/dist/services/smallest/index.js +7 -0
  423. package/dist/services/soniox/index.d.ts +2 -0
  424. package/dist/services/soniox/index.js +7 -0
  425. package/dist/services/speechify/index.d.ts +2 -0
  426. package/dist/services/speechify/index.js +7 -0
  427. package/dist/services/speechmatics/index.d.ts +2 -0
  428. package/dist/services/speechmatics/index.js +7 -0
  429. package/dist/services/stt_latency.d.ts +62 -0
  430. package/dist/services/stt_latency.js +71 -0
  431. package/dist/services/stt_service.d.ts +601 -0
  432. package/dist/services/stt_service.js +1044 -0
  433. package/dist/services/tavus/index.d.ts +2 -0
  434. package/dist/services/tavus/index.js +7 -0
  435. package/dist/services/together/index.d.ts +2 -0
  436. package/dist/services/together/index.js +7 -0
  437. package/dist/services/tts_service.d.ts +909 -0
  438. package/dist/services/tts_service.js +2018 -0
  439. package/dist/services/ultravox/index.d.ts +2 -0
  440. package/dist/services/ultravox/index.js +9 -0
  441. package/dist/services/vision_service.d.ts +56 -0
  442. package/dist/services/vision_service.js +62 -0
  443. package/dist/services/websocket_service.d.ts +213 -0
  444. package/dist/services/websocket_service.js +654 -0
  445. package/dist/services/whisper/index.d.ts +2 -0
  446. package/dist/services/whisper/index.js +9 -0
  447. package/dist/services/xai/index.d.ts +2 -0
  448. package/dist/services/xai/index.js +9 -0
  449. package/dist/services/xtts/index.d.ts +2 -0
  450. package/dist/services/xtts/index.js +9 -0
  451. package/dist/tests/index.d.ts +2 -0
  452. package/dist/tests/index.js +8 -0
  453. package/dist/tests/utils.d.ts +123 -0
  454. package/dist/tests/utils.js +212 -0
  455. package/dist/transcriptions/index.d.ts +2 -0
  456. package/dist/transcriptions/index.js +8 -0
  457. package/dist/transcriptions/language.d.ts +376 -0
  458. package/dist/transcriptions/language.js +543 -0
  459. package/dist/transports/base_input.d.ts +149 -0
  460. package/dist/transports/base_input.js +338 -0
  461. package/dist/transports/base_output.d.ts +432 -0
  462. package/dist/transports/base_output.js +1231 -0
  463. package/dist/transports/base_transport.d.ts +223 -0
  464. package/dist/transports/base_transport.js +167 -0
  465. package/dist/transports/daily/index.d.ts +2 -0
  466. package/dist/transports/daily/index.js +9 -0
  467. package/dist/transports/heygen/index.d.ts +2 -0
  468. package/dist/transports/heygen/index.js +9 -0
  469. package/dist/transports/index.d.ts +2 -0
  470. package/dist/transports/index.js +8 -0
  471. package/dist/transports/lemonslice/index.d.ts +2 -0
  472. package/dist/transports/lemonslice/index.js +9 -0
  473. package/dist/transports/livekit/index.d.ts +2 -0
  474. package/dist/transports/livekit/index.js +9 -0
  475. package/dist/transports/local/index.d.ts +2 -0
  476. package/dist/transports/local/index.js +9 -0
  477. package/dist/transports/moq/index.d.ts +2 -0
  478. package/dist/transports/moq/index.js +9 -0
  479. package/dist/transports/smallwebrtc/index.d.ts +2 -0
  480. package/dist/transports/smallwebrtc/index.js +9 -0
  481. package/dist/transports/tavus/index.d.ts +2 -0
  482. package/dist/transports/tavus/index.js +9 -0
  483. package/dist/transports/video_in_sampler.d.ts +157 -0
  484. package/dist/transports/video_in_sampler.js +258 -0
  485. package/dist/transports/vonage/index.d.ts +2 -0
  486. package/dist/transports/vonage/index.js +9 -0
  487. package/dist/transports/websocket/index.d.ts +2 -0
  488. package/dist/transports/websocket/index.js +9 -0
  489. package/dist/transports/whatsapp/index.d.ts +2 -0
  490. package/dist/transports/whatsapp/index.js +9 -0
  491. package/dist/turns/eager_end_of_turn_mixin.d.ts +70 -0
  492. package/dist/turns/eager_end_of_turn_mixin.js +122 -0
  493. package/dist/turns/empty_user_turn.d.ts +55 -0
  494. package/dist/turns/empty_user_turn.js +53 -0
  495. package/dist/turns/index.d.ts +2 -0
  496. package/dist/turns/index.js +8 -0
  497. package/dist/turns/speculation_gate.d.ts +169 -0
  498. package/dist/turns/speculation_gate.js +294 -0
  499. package/dist/turns/types.d.ts +33 -0
  500. package/dist/turns/types.js +35 -0
  501. package/dist/turns/user_idle_controller.d.ts +94 -0
  502. package/dist/turns/user_idle_controller.js +187 -0
  503. package/dist/turns/user_mute/always_user_mute_strategy.d.ts +15 -0
  504. package/dist/turns/user_mute/always_user_mute_strategy.js +29 -0
  505. package/dist/turns/user_mute/base_user_mute_strategy.d.ts +39 -0
  506. package/dist/turns/user_mute/base_user_mute_strategy.js +45 -0
  507. package/dist/turns/user_mute/first_speech_user_mute_strategy.d.ts +28 -0
  508. package/dist/turns/user_mute/first_speech_user_mute_strategy.js +52 -0
  509. package/dist/turns/user_mute/function_call_user_mute_strategy.d.ts +25 -0
  510. package/dist/turns/user_mute/function_call_user_mute_strategy.js +50 -0
  511. package/dist/turns/user_mute/index.d.ts +6 -0
  512. package/dist/turns/user_mute/index.js +11 -0
  513. package/dist/turns/user_mute/mute_until_first_bot_complete_user_mute_strategy.d.ts +43 -0
  514. package/dist/turns/user_mute/mute_until_first_bot_complete_user_mute_strategy.js +76 -0
  515. package/dist/turns/user_start/base_user_turn_start_strategy.d.ts +135 -0
  516. package/dist/turns/user_start/base_user_turn_start_strategy.js +134 -0
  517. package/dist/turns/user_start/external_user_turn_start_strategy.d.ts +45 -0
  518. package/dist/turns/user_start/external_user_turn_start_strategy.js +64 -0
  519. package/dist/turns/user_start/index.d.ts +8 -0
  520. package/dist/turns/user_start/index.js +16 -0
  521. package/dist/turns/user_start/krisp_viva_ip_user_turn_start_strategy.d.ts +133 -0
  522. package/dist/turns/user_start/krisp_viva_ip_user_turn_start_strategy.js +243 -0
  523. package/dist/turns/user_start/min_words_user_turn_start_strategy.d.ts +60 -0
  524. package/dist/turns/user_start/min_words_user_turn_start_strategy.js +102 -0
  525. package/dist/turns/user_start/transcription_user_turn_start_strategy.d.ts +29 -0
  526. package/dist/turns/user_start/transcription_user_turn_start_strategy.js +43 -0
  527. package/dist/turns/user_start/vad_user_turn_start_strategy.d.ts +20 -0
  528. package/dist/turns/user_start/vad_user_turn_start_strategy.js +31 -0
  529. package/dist/turns/user_start/wake_phrase_user_turn_start_strategy.d.ts +141 -0
  530. package/dist/turns/user_start/wake_phrase_user_turn_start_strategy.js +238 -0
  531. package/dist/turns/user_stop/base_user_turn_stop_strategy.d.ts +174 -0
  532. package/dist/turns/user_stop/base_user_turn_stop_strategy.js +170 -0
  533. package/dist/turns/user_stop/deferred_user_turn_stop_strategy.d.ts +81 -0
  534. package/dist/turns/user_stop/deferred_user_turn_stop_strategy.js +107 -0
  535. package/dist/turns/user_stop/eager_match_policy.d.ts +36 -0
  536. package/dist/turns/user_stop/eager_match_policy.js +50 -0
  537. package/dist/turns/user_stop/eager_user_turn_stop_strategy.d.ts +84 -0
  538. package/dist/turns/user_stop/eager_user_turn_stop_strategy.js +154 -0
  539. package/dist/turns/user_stop/external_user_turn_completion_stop_strategy.d.ts +45 -0
  540. package/dist/turns/user_stop/external_user_turn_completion_stop_strategy.js +55 -0
  541. package/dist/turns/user_stop/external_user_turn_stop_strategy.d.ts +115 -0
  542. package/dist/turns/user_stop/external_user_turn_stop_strategy.js +205 -0
  543. package/dist/turns/user_stop/index.d.ts +10 -0
  544. package/dist/turns/user_stop/index.js +15 -0
  545. package/dist/turns/user_stop/llm_turn_completion_user_turn_stop_strategy.d.ts +44 -0
  546. package/dist/turns/user_stop/llm_turn_completion_user_turn_stop_strategy.js +59 -0
  547. package/dist/turns/user_stop/speech_timeout_user_turn_stop_strategy.d.ts +140 -0
  548. package/dist/turns/user_stop/speech_timeout_user_turn_stop_strategy.js +303 -0
  549. package/dist/turns/user_stop/turn_analyzer_user_turn_stop_strategy.d.ts +135 -0
  550. package/dist/turns/user_stop/turn_analyzer_user_turn_stop_strategy.js +332 -0
  551. package/dist/turns/user_turn_completion_mixin.d.ts +147 -0
  552. package/dist/turns/user_turn_completion_mixin.js +591 -0
  553. package/dist/turns/user_turn_controller.d.ts +134 -0
  554. package/dist/turns/user_turn_controller.js +335 -0
  555. package/dist/turns/user_turn_processor.d.ts +87 -0
  556. package/dist/turns/user_turn_processor.js +180 -0
  557. package/dist/turns/user_turn_strategies.d.ts +187 -0
  558. package/dist/turns/user_turn_strategies.js +222 -0
  559. package/dist/utils/async_tool_cancellation.d.ts +35 -0
  560. package/dist/utils/async_tool_cancellation.js +78 -0
  561. package/dist/utils/asyncio/index.d.ts +2 -0
  562. package/dist/utils/asyncio/index.js +7 -0
  563. package/dist/utils/asyncio/task_manager.d.ts +49 -0
  564. package/dist/utils/asyncio/task_manager.js +105 -0
  565. package/dist/utils/base_object.d.ts +76 -0
  566. package/dist/utils/base_object.js +154 -0
  567. package/dist/utils/context/aggregated_frame_sequencer.d.ts +491 -0
  568. package/dist/utils/context/aggregated_frame_sequencer.js +803 -0
  569. package/dist/utils/context/audio_context_manager.d.ts +131 -0
  570. package/dist/utils/context/audio_context_manager.js +233 -0
  571. package/dist/utils/context/index.d.ts +2 -0
  572. package/dist/utils/context/index.js +7 -0
  573. package/dist/utils/context/llm_context_summarization.d.ts +258 -0
  574. package/dist/utils/context/llm_context_summarization.js +511 -0
  575. package/dist/utils/context/text_segment_map.d.ts +611 -0
  576. package/dist/utils/context/text_segment_map.js +1132 -0
  577. package/dist/utils/context/word_completion_tracker.d.ts +273 -0
  578. package/dist/utils/context/word_completion_tracker.js +441 -0
  579. package/dist/utils/context/word_timestamp_tracker.d.ts +72 -0
  580. package/dist/utils/context/word_timestamp_tracker.js +98 -0
  581. package/dist/utils/deprecation.d.ts +28 -0
  582. package/dist/utils/deprecation.js +75 -0
  583. package/dist/utils/env.d.ts +38 -0
  584. package/dist/utils/env.js +62 -0
  585. package/dist/utils/errors.d.ts +75 -0
  586. package/dist/utils/errors.js +202 -0
  587. package/dist/utils/file_resolver.d.ts +126 -0
  588. package/dist/utils/file_resolver.js +314 -0
  589. package/dist/utils/file_storage.d.ts +115 -0
  590. package/dist/utils/file_storage.js +178 -0
  591. package/dist/utils/frame_queue.d.ts +36 -0
  592. package/dist/utils/frame_queue.js +66 -0
  593. package/dist/utils/http.d.ts +39 -0
  594. package/dist/utils/http.js +53 -0
  595. package/dist/utils/image.d.ts +14 -0
  596. package/dist/utils/image.js +63 -0
  597. package/dist/utils/index.d.ts +2 -0
  598. package/dist/utils/index.js +8 -0
  599. package/dist/utils/jpeg_encoder.d.ts +14 -0
  600. package/dist/utils/jpeg_encoder.js +315 -0
  601. package/dist/utils/log_config.d.ts +34 -0
  602. package/dist/utils/log_config.js +76 -0
  603. package/dist/utils/logger.d.ts +40 -0
  604. package/dist/utils/logger.js +91 -0
  605. package/dist/utils/mixin.d.ts +14 -0
  606. package/dist/utils/mixin.js +63 -0
  607. package/dist/utils/network.d.ts +73 -0
  608. package/dist/utils/network.js +90 -0
  609. package/dist/utils/security/allowed_origins.d.ts +16 -0
  610. package/dist/utils/security/allowed_origins.js +34 -0
  611. package/dist/utils/security/index.d.ts +2 -0
  612. package/dist/utils/security/index.js +7 -0
  613. package/dist/utils/security/redaction.d.ts +27 -0
  614. package/dist/utils/security/redaction.js +123 -0
  615. package/dist/utils/security/ssrf.d.ts +79 -0
  616. package/dist/utils/security/ssrf.js +327 -0
  617. package/dist/utils/shared.d.ts +35 -0
  618. package/dist/utils/shared.js +136 -0
  619. package/dist/utils/startup.d.ts +17 -0
  620. package/dist/utils/startup.js +130 -0
  621. package/dist/utils/string.d.ts +116 -0
  622. package/dist/utils/string.js +460 -0
  623. package/dist/utils/sync/base_notifier.d.ts +25 -0
  624. package/dist/utils/sync/base_notifier.js +16 -0
  625. package/dist/utils/sync/event_notifier.d.ts +38 -0
  626. package/dist/utils/sync/event_notifier.js +51 -0
  627. package/dist/utils/sync/index.d.ts +2 -0
  628. package/dist/utils/sync/index.js +7 -0
  629. package/dist/utils/text/alnum_utils.d.ts +109 -0
  630. package/dist/utils/text/alnum_utils.js +262 -0
  631. package/dist/utils/text/base_text_aggregator.d.ts +146 -0
  632. package/dist/utils/text/base_text_aggregator.js +102 -0
  633. package/dist/utils/text/base_text_filter.d.ts +54 -0
  634. package/dist/utils/text/base_text_filter.js +50 -0
  635. package/dist/utils/text/index.d.ts +2 -0
  636. package/dist/utils/text/index.js +7 -0
  637. package/dist/utils/text/markdown_text_filter.d.ts +147 -0
  638. package/dist/utils/text/markdown_text_filter.js +522 -0
  639. package/dist/utils/text/markup_utils.d.ts +54 -0
  640. package/dist/utils/text/markup_utils.js +156 -0
  641. package/dist/utils/text/pattern_pair_aggregator.d.ts +251 -0
  642. package/dist/utils/text/pattern_pair_aggregator.js +478 -0
  643. package/dist/utils/text/phonemes.d.ts +60 -0
  644. package/dist/utils/text/phonemes.js +172 -0
  645. package/dist/utils/text/simple_text_aggregator.d.ts +135 -0
  646. package/dist/utils/text/simple_text_aggregator.js +254 -0
  647. package/dist/utils/text/skip_tags_aggregator.d.ts +85 -0
  648. package/dist/utils/text/skip_tags_aggregator.js +147 -0
  649. package/dist/utils/text/transforms/acronyms.d.ts +21 -0
  650. package/dist/utils/text/transforms/acronyms.js +31 -0
  651. package/dist/utils/text/transforms/currency.d.ts +16 -0
  652. package/dist/utils/text/transforms/currency.js +56 -0
  653. package/dist/utils/text/transforms/dates.d.ts +18 -0
  654. package/dist/utils/text/transforms/dates.js +102 -0
  655. package/dist/utils/text/transforms/email.d.ts +17 -0
  656. package/dist/utils/text/transforms/email.js +35 -0
  657. package/dist/utils/text/transforms/index.d.ts +37 -0
  658. package/dist/utils/text/transforms/index.js +42 -0
  659. package/dist/utils/text/transforms/numbers.d.ts +25 -0
  660. package/dist/utils/text/transforms/numbers.js +59 -0
  661. package/dist/utils/text/transforms/percentages.d.ts +16 -0
  662. package/dist/utils/text/transforms/percentages.js +32 -0
  663. package/dist/utils/text/transforms/phone.d.ts +21 -0
  664. package/dist/utils/text/transforms/phone.js +39 -0
  665. package/dist/utils/text/transforms/pronunciations.d.ts +65 -0
  666. package/dist/utils/text/transforms/pronunciations.js +112 -0
  667. package/dist/utils/text/transforms/replacements.d.ts +39 -0
  668. package/dist/utils/text/transforms/replacements.js +46 -0
  669. package/dist/utils/text/transforms/strip_markdown.d.ts +25 -0
  670. package/dist/utils/text/transforms/strip_markdown.js +60 -0
  671. package/dist/utils/text/transforms/units.d.ts +22 -0
  672. package/dist/utils/text/transforms/units.js +81 -0
  673. package/dist/utils/text/transforms/voice_formatter.d.ts +86 -0
  674. package/dist/utils/text/transforms/voice_formatter.js +98 -0
  675. package/dist/utils/text/unicode_digits.d.ts +3 -0
  676. package/dist/utils/text/unicode_digits.js +34 -0
  677. package/dist/utils/text/word_timestamp_utils.d.ts +26 -0
  678. package/dist/utils/text/word_timestamp_utils.js +52 -0
  679. package/dist/utils/time.d.ts +13 -0
  680. package/dist/utils/time.js +31 -0
  681. package/dist/utils/tracing/index.d.ts +3 -0
  682. package/dist/utils/tracing/index.js +8 -0
  683. package/dist/utils/tracing/service_attributes.d.ts +198 -0
  684. package/dist/utils/tracing/service_attributes.js +434 -0
  685. package/dist/utils/tracing/service_decorators.d.ts +214 -0
  686. package/dist/utils/tracing/service_decorators.js +1662 -0
  687. package/dist/utils/tracing/setup.d.ts +107 -0
  688. package/dist/utils/tracing/setup.js +160 -0
  689. package/dist/utils/tracing/tracing_context.d.ts +55 -0
  690. package/dist/utils/tracing/tracing_context.js +97 -0
  691. package/dist/utils/tracing/turn_trace_observer.d.ts +95 -0
  692. package/dist/utils/tracing/turn_trace_observer.js +233 -0
  693. package/dist/utils/types.d.ts +80 -0
  694. package/dist/utils/types.js +108 -0
  695. package/dist/utils/utils.d.ts +5 -0
  696. package/dist/utils/utils.js +22 -0
  697. package/dist/utils/yaml.d.ts +179 -0
  698. package/dist/utils/yaml.js +556 -0
  699. package/dist/version.d.ts +3 -0
  700. package/dist/version.js +7 -0
  701. package/dist/workers/base_worker.d.ts +772 -0
  702. package/dist/workers/base_worker.js +1298 -0
  703. package/dist/workers/index.d.ts +2 -0
  704. package/dist/workers/index.js +8 -0
  705. package/dist/workers/llm/backend_llm_worker.d.ts +552 -0
  706. package/dist/workers/llm/backend_llm_worker.js +1055 -0
  707. package/dist/workers/llm/index.d.ts +6 -0
  708. package/dist/workers/llm/index.js +11 -0
  709. package/dist/workers/llm/llm_context_worker.d.ts +66 -0
  710. package/dist/workers/llm/llm_context_worker.js +72 -0
  711. package/dist/workers/llm/llm_worker.d.ts +180 -0
  712. package/dist/workers/llm/llm_worker.js +323 -0
  713. package/dist/workers/llm/tool_decorator.d.ts +68 -0
  714. package/dist/workers/llm/tool_decorator.js +60 -0
  715. package/dist/workers/proxy/index.d.ts +3 -0
  716. package/dist/workers/proxy/index.js +9 -0
  717. package/dist/workers/proxy/websocket/client.d.ts +110 -0
  718. package/dist/workers/proxy/websocket/client.js +196 -0
  719. package/dist/workers/proxy/websocket/index.d.ts +3 -0
  720. package/dist/workers/proxy/websocket/index.js +10 -0
  721. package/dist/workers/runner.d.ts +268 -0
  722. package/dist/workers/runner.js +489 -0
  723. package/dist/workers/ui/index.d.ts +22 -0
  724. package/dist/workers/ui/index.js +27 -0
  725. package/dist/workers/ui/ui_event_decorator.d.ts +43 -0
  726. package/dist/workers/ui/ui_event_decorator.js +75 -0
  727. package/dist/workers/ui/ui_job_context.d.ts +12 -0
  728. package/dist/workers/ui/ui_job_context.js +17 -0
  729. package/dist/workers/ui/ui_prompts.d.ts +21 -0
  730. package/dist/workers/ui/ui_prompts.js +41 -0
  731. package/dist/workers/ui/ui_tools.d.ts +32 -0
  732. package/dist/workers/ui/ui_tools.js +112 -0
  733. package/dist/workers/ui/ui_worker.d.ts +571 -0
  734. package/dist/workers/ui/ui_worker.js +1156 -0
  735. package/package.json +61 -3
  736. package/README.md +0 -5
@@ -0,0 +1,654 @@
1
+ // Copyright (c) 2024-2026, Daily
2
+ // Copyright (c) 2026, pipedog contributors
3
+ // SPDX-License-Identifier: BSD-2-Clause
4
+ //
5
+ // Ported from pipecat: src/pipecat/services/websocket_service.py
6
+ /**
7
+ * Base websocket service with automatic reconnection and error handling.
8
+ *
9
+ * Porting notes: upstream connects with the `websockets` library. Here the
10
+ * global `WebSocket` (Bun, Node ≥ 22, Deno, browsers) is wrapped in
11
+ * `WebsocketClientConnection`, which offers the subset of the `websockets`
12
+ * client API services use: `send()`, `recv()`, `async for`, `ping()`,
13
+ * `close()`, `state`, and the `ConnectionClosed` / `ConnectionClosedOK` /
14
+ * `ConnectionClosedError` exceptions. Awaiting `recv()` is a cancellation
15
+ * point, so cancelling a receive task stops it right away.
16
+ */
17
+ import { CancelledError, monotonic, rethrowIfCancelled, sleep, suspend } from "@pipedog/asyncio";
18
+ import { ErrorFrame } from "../frames/frames.js";
19
+ import { logger } from "../utils/logger.js";
20
+ import { defineMixin } from "../utils/mixin.js";
21
+ import { exponentialBackoffTime, QuickFailureTracker } from "../utils/network.js";
22
+ /**
23
+ * Default ceiling, in seconds, on the websocket closing handshake. Disconnect
24
+ * runs while a service handles the EndFrame, before the frame continues
25
+ * downstream, so an unacknowledged close delays pipeline shutdown by this
26
+ * much. The `websockets` default of 10s is long enough to be noticeable once
27
+ * several websocket services tear down in sequence.
28
+ */
29
+ export const WS_CLOSE_TIMEOUT = 2.0;
30
+ /** Default time, in seconds, to wait for the opening handshake (as `websockets`). */
31
+ export const WS_OPEN_TIMEOUT = 10.0;
32
+ //
33
+ // Websocket client (stand-in for the `websockets` asyncio client).
34
+ //
35
+ /** Connection state, with the values of `websockets.protocol.State`. */
36
+ export const State = {
37
+ CONNECTING: 0,
38
+ OPEN: 1,
39
+ CLOSING: 2,
40
+ CLOSED: 3,
41
+ };
42
+ /** Raised when reading from or writing to a closed connection. */
43
+ export class ConnectionClosed extends Error {
44
+ name = "ConnectionClosed";
45
+ /** The close code, or null if no close frame was received. */
46
+ code;
47
+ /** The close reason. */
48
+ reason;
49
+ constructor(code, reason, message) {
50
+ super(message ?? (code === null ? "no close frame received or sent" : `${code} ${reason}`));
51
+ this.code = code;
52
+ this.reason = reason;
53
+ }
54
+ }
55
+ /** The connection was closed normally (close code 1000 or 1001). */
56
+ export class ConnectionClosedOK extends ConnectionClosed {
57
+ name = "ConnectionClosedOK";
58
+ }
59
+ /** The connection was closed with an error (abnormal close code, or none). */
60
+ export class ConnectionClosedError extends ConnectionClosed {
61
+ name = "ConnectionClosedError";
62
+ }
63
+ /**
64
+ * A websocket client connection with the asyncio-style API of the
65
+ * `websockets` library, over a standard `WebSocket`.
66
+ *
67
+ * Received messages are buffered until read with `recv()` or `for await`.
68
+ * Binary messages are returned as `Uint8Array`.
69
+ */
70
+ export class WebsocketClientConnection {
71
+ #ws;
72
+ #messages = [];
73
+ #waiters = new Set();
74
+ #closed = null;
75
+ // The raw close code, as `websockets`' `close_code`: 1006 when no close
76
+ // frame was received, 1005 when one carried no code. The exception's
77
+ // `code` is null in both cases.
78
+ #closeCode = null;
79
+ #closedWaiters = new Set();
80
+ /** Maximum time, in seconds, to wait for the peer to acknowledge a close. */
81
+ closeTimeout;
82
+ constructor(ws, options = {}) {
83
+ this.#ws = ws;
84
+ this.closeTimeout =
85
+ options.closeTimeout === undefined ? WS_CLOSE_TIMEOUT : options.closeTimeout;
86
+ ws.binaryType = "arraybuffer";
87
+ ws.addEventListener("message", (event) => this.#onMessage(event.data));
88
+ ws.addEventListener("close", (event) => this.#onClose(event.code, event.reason));
89
+ if (ws.readyState === WebSocket.CLOSED)
90
+ this.#onClose(1006, "");
91
+ }
92
+ /** The underlying `WebSocket`. */
93
+ get webSocket() {
94
+ return this.#ws;
95
+ }
96
+ /** The connection state. */
97
+ get state() {
98
+ if (this.#closed)
99
+ return State.CLOSED;
100
+ return this.#ws.readyState;
101
+ }
102
+ /** The close code, once the connection is closed. */
103
+ get closeCode() {
104
+ return this.#closeCode;
105
+ }
106
+ /** The close reason, once the connection is closed. */
107
+ get closeReason() {
108
+ return this.#closed?.reason ?? null;
109
+ }
110
+ /**
111
+ * Send a text (string) or binary (bytes) message.
112
+ *
113
+ * @throws ConnectionClosed if the connection is closing or closed.
114
+ */
115
+ async send(message) {
116
+ if (this.#closed)
117
+ throw this.#closed;
118
+ if (this.#ws.readyState !== WebSocket.OPEN) {
119
+ throw new ConnectionClosedError(null, "", "websocket is not open");
120
+ }
121
+ this.#ws.send(message);
122
+ }
123
+ /**
124
+ * Receive the next message. A cancellation point.
125
+ *
126
+ * @throws ConnectionClosedOK / ConnectionClosedError once the connection
127
+ * is closed and every buffered message has been read.
128
+ */
129
+ async recv() {
130
+ const message = this.#messages.shift();
131
+ if (message !== undefined)
132
+ return message;
133
+ if (this.#closed)
134
+ throw this.#closed;
135
+ let waiter;
136
+ return await suspend((resolve, reject) => {
137
+ waiter = { resolve, reject };
138
+ this.#waiters.add(waiter);
139
+ return () => {
140
+ if (waiter)
141
+ this.#waiters.delete(waiter);
142
+ };
143
+ });
144
+ }
145
+ /**
146
+ * Iterate over incoming messages. Ends when the connection closes normally;
147
+ * throws `ConnectionClosedError` when it closes with an error.
148
+ */
149
+ async *[Symbol.asyncIterator]() {
150
+ while (true) {
151
+ try {
152
+ yield await this.recv();
153
+ }
154
+ catch (e) {
155
+ if (e instanceof ConnectionClosedOK)
156
+ return;
157
+ throw e;
158
+ }
159
+ }
160
+ }
161
+ /**
162
+ * Check the connection is alive.
163
+ *
164
+ * The standard `WebSocket` API cannot send ping frames (runtimes answer the
165
+ * peer's pings themselves), so this only checks the connection is open.
166
+ *
167
+ * @throws ConnectionClosed if the connection is closing or closed.
168
+ */
169
+ async ping() {
170
+ if (this.#closed)
171
+ throw this.#closed;
172
+ if (this.#ws.readyState !== WebSocket.OPEN) {
173
+ throw new ConnectionClosedError(null, "", "websocket is not open");
174
+ }
175
+ }
176
+ /**
177
+ * Perform the closing handshake, waiting at most `closeTimeout` seconds for
178
+ * the peer to acknowledge it. Logs if the peer never acknowledged it, which
179
+ * keeps a teardown that silently cost `closeTimeout` from going unnoticed.
180
+ *
181
+ * @param code WebSocket close code.
182
+ * @param reason WebSocket close reason.
183
+ */
184
+ async close(code = 1000, reason = "") {
185
+ if (this.#closed)
186
+ return;
187
+ const start = monotonic();
188
+ try {
189
+ if (this.#ws.readyState === WebSocket.CONNECTING || this.#ws.readyState === WebSocket.OPEN) {
190
+ this.#ws.close(code, reason);
191
+ }
192
+ await this.#waitClosed(this.closeTimeout);
193
+ }
194
+ finally {
195
+ const elapsed = monotonic() - start;
196
+ if (!this.#closed) {
197
+ // The peer never acknowledged the close; drop the connection.
198
+ this.#onClose(1006, "");
199
+ }
200
+ if (this.closeTimeout !== null && elapsed >= this.closeTimeout) {
201
+ // Immediately follows the owning service's "Disconnecting from ..."
202
+ // log, so the connection needs no further identification.
203
+ logger.debug(`Peer did not acknowledge the websocket close within ${this.closeTimeout}s; connection dropped`);
204
+ }
205
+ }
206
+ }
207
+ async #waitClosed(timeout) {
208
+ if (this.#closed)
209
+ return;
210
+ let done;
211
+ await suspend((resolve) => {
212
+ done = () => resolve();
213
+ this.#closedWaiters.add(done);
214
+ const timer = timeout === null ? undefined : setTimeout(resolve, Math.max(0, timeout * 1000));
215
+ return () => {
216
+ if (timer)
217
+ clearTimeout(timer);
218
+ if (done)
219
+ this.#closedWaiters.delete(done);
220
+ };
221
+ }).finally(() => {
222
+ if (done)
223
+ this.#closedWaiters.delete(done);
224
+ });
225
+ }
226
+ #onMessage(data) {
227
+ let message;
228
+ if (typeof data === "string") {
229
+ message = data;
230
+ }
231
+ else if (data instanceof ArrayBuffer) {
232
+ message = new Uint8Array(data);
233
+ }
234
+ else if (ArrayBuffer.isView(data)) {
235
+ message = new Uint8Array(data.buffer, data.byteOffset, data.byteLength);
236
+ }
237
+ else {
238
+ message = String(data);
239
+ }
240
+ const waiter = this.#waiters.values().next().value;
241
+ if (waiter) {
242
+ this.#waiters.delete(waiter);
243
+ waiter.resolve(message);
244
+ }
245
+ else {
246
+ this.#messages.push(message);
247
+ }
248
+ }
249
+ #onClose(code, reason) {
250
+ if (this.#closed)
251
+ return;
252
+ this.#closeCode = code;
253
+ this.#closed =
254
+ code === 1000 || code === 1001
255
+ ? new ConnectionClosedOK(code, reason)
256
+ : new ConnectionClosedError(code === 1005 || code === 1006 ? null : code, reason);
257
+ const waiters = [...this.#waiters];
258
+ this.#waiters.clear();
259
+ for (const waiter of waiters)
260
+ waiter.reject(this.#closed);
261
+ const closedWaiters = [...this.#closedWaiters];
262
+ this.#closedWaiters.clear();
263
+ for (const done of closedWaiters)
264
+ done();
265
+ }
266
+ }
267
+ /**
268
+ * Open a websocket connection (`websockets.asyncio.client.connect`).
269
+ * Waiting for the opening handshake is a cancellation point; a cancelled or
270
+ * timed-out attempt closes the socket.
271
+ *
272
+ * @param uri The websocket URI to connect to.
273
+ * @returns The connected websocket.
274
+ */
275
+ export async function websocketConnect(uri, options = {}) {
276
+ const init = {};
277
+ if (options.additionalHeaders)
278
+ init.headers = options.additionalHeaders;
279
+ if (options.subprotocols)
280
+ init.protocols = options.subprotocols;
281
+ let ws;
282
+ if (options.webSocketFactory) {
283
+ ws = await options.webSocketFactory(uri, init);
284
+ }
285
+ else if (init.headers) {
286
+ // Bun, Node (undici) and Deno accept an init object with headers.
287
+ const WebSocketWithInit = WebSocket;
288
+ ws = new WebSocketWithInit(uri, init);
289
+ }
290
+ else {
291
+ ws = new WebSocket(uri, init.protocols);
292
+ }
293
+ // Attach the listeners before the socket can deliver anything.
294
+ const connection = new WebsocketClientConnection(ws, { closeTimeout: options.closeTimeout });
295
+ const openTimeout = options.openTimeout === undefined ? WS_OPEN_TIMEOUT : options.openTimeout;
296
+ try {
297
+ await suspend((resolve, reject) => {
298
+ if (ws.readyState === WebSocket.OPEN) {
299
+ resolve();
300
+ return () => { };
301
+ }
302
+ const onOpen = () => resolve();
303
+ const onError = () => reject(new Error(`websocket connection to ${uri} failed`));
304
+ const onClose = (event) => reject(new ConnectionClosedError(event.code, event.reason, `websocket connection to ${uri} closed during handshake (${event.code} ${event.reason})`));
305
+ ws.addEventListener("open", onOpen);
306
+ ws.addEventListener("error", onError);
307
+ ws.addEventListener("close", onClose);
308
+ const timer = openTimeout === null
309
+ ? undefined
310
+ : setTimeout(() => reject(new Error(`timed out during opening handshake with ${uri}`)), Math.max(0, openTimeout * 1000));
311
+ return () => {
312
+ if (timer)
313
+ clearTimeout(timer);
314
+ ws.removeEventListener("open", onOpen);
315
+ ws.removeEventListener("error", onError);
316
+ ws.removeEventListener("close", onClose);
317
+ };
318
+ });
319
+ }
320
+ catch (e) {
321
+ try {
322
+ ws.close();
323
+ }
324
+ catch {
325
+ // The socket may not be closable yet; nothing else to release.
326
+ }
327
+ throw e;
328
+ }
329
+ return connection;
330
+ }
331
+ /**
332
+ * Base class for websocket-based services with automatic reconnection.
333
+ *
334
+ * Provides websocket connection management, automatic reconnection with
335
+ * exponential backoff, connection verification, and error handling.
336
+ * Subclasses implement service-specific connection and message handling
337
+ * logic (`_connectWebsocket()`, `_disconnectWebsocket()`, `_receiveMessages()`).
338
+ *
339
+ * Reconnection gives up in two ways, both leaving the service unusable: the
340
+ * provider rejects the configuration, which no amount of retrying will fix,
341
+ * or the attempts are exhausted. Errors are reported through a `reportError`
342
+ * callback, which takes the same optional `forceTreatAsPermanent` flag as
343
+ * `FrameProcessor.pushErrorFrame()`, so that giving up and saying so are the
344
+ * same act.
345
+ *
346
+ * A mixin: `class MyService(TTSService, WebsocketService)` upstream is
347
+ * `class MyService extends WebsocketService(TTSService)` here. Its options
348
+ * (`WebsocketServiceOptions`) are read from the constructor's options object.
349
+ */
350
+ export const WebsocketService = defineMixin("WebsocketService", (Base) => {
351
+ class WebsocketServiceMixin extends Base {
352
+ _websocket = null;
353
+ _reconnectBackoffMinWait;
354
+ _reconnectBackoffMaxWait;
355
+ _reconnectOnError;
356
+ _wsCloseTimeout;
357
+ _reconnectInProgress = false;
358
+ _disconnecting = false;
359
+ // Rapid failure detection: when a server accepts the WebSocket handshake
360
+ // but immediately closes the connection (e.g. invalid API key, policy
361
+ // rejection), exponential backoff won't help because the handshake keeps
362
+ // succeeding. We detect this by tracking how long the connection
363
+ // survives after being established.
364
+ _quickFailureTracker = new QuickFailureTracker();
365
+ _lastConnectTime = 0.0;
366
+ constructor(...args) {
367
+ super(...args);
368
+ const options = (args[0] ?? {});
369
+ this._reconnectBackoffMinWait = options.reconnectBackoffMinWait ?? 4.0;
370
+ this._reconnectBackoffMaxWait = options.reconnectBackoffMaxWait ?? 10.0;
371
+ this._reconnectOnError = options.reconnectOnError ?? true;
372
+ this._wsCloseTimeout = options.wsCloseTimeout ?? WS_CLOSE_TIMEOUT;
373
+ }
374
+ /**
375
+ * Whether the service this is mixed into can still be given work.
376
+ *
377
+ * Always a `FrameProcessor` in practice, but this is a mixin and can't
378
+ * require it.
379
+ */
380
+ get _isServiceUsable() {
381
+ return this.isUsable ?? true;
382
+ }
383
+ /**
384
+ * Open a websocket connection with the service's close timeout applied.
385
+ *
386
+ * Wraps `websocketConnect()`, defaulting `closeTimeout` to
387
+ * `wsCloseTimeout`. Pass `closeTimeout` explicitly to override it for a
388
+ * service whose peer needs different closing behavior.
389
+ *
390
+ * @param uri The websocket URI to connect to.
391
+ * @param options Additional options passed to `websocketConnect()`.
392
+ * @returns The connected websocket.
393
+ */
394
+ async _websocketConnect(uri, options = {}) {
395
+ return await websocketConnect(uri, {
396
+ ...options,
397
+ closeTimeout: options.closeTimeout === undefined ? this._wsCloseTimeout : options.closeTimeout,
398
+ });
399
+ }
400
+ /**
401
+ * Verify the websocket connection is active and responsive.
402
+ *
403
+ * @returns True if connection is verified working, false otherwise.
404
+ */
405
+ async _verifyConnection() {
406
+ try {
407
+ if (!this._websocket || this._websocket.state === State.CLOSED) {
408
+ return false;
409
+ }
410
+ await this._websocket.ping();
411
+ return true;
412
+ }
413
+ catch (e) {
414
+ rethrowIfCancelled(e);
415
+ logger.error(`${this} connection verification failed: ${errorText(e)}`);
416
+ return false;
417
+ }
418
+ }
419
+ /**
420
+ * Reconnect the websocket with the current attempt number.
421
+ *
422
+ * @param attemptNumber Current retry attempt number for logging.
423
+ * @returns True if reconnection and verification successful.
424
+ * @throws Error if the reconnected websocket fails verification.
425
+ */
426
+ async _reconnectWebsocket(attemptNumber) {
427
+ logger.warning(`${this} reconnecting (attempt: ${attemptNumber})`);
428
+ await this._disconnectWebsocket();
429
+ await this._connectWebsocket();
430
+ if (!(await this._verifyConnection())) {
431
+ throw new Error(`${this} websocket reconnection failed verification`);
432
+ }
433
+ return true;
434
+ }
435
+ async _tryReconnect(options = {}) {
436
+ const maxRetries = options.maxRetries ?? 3;
437
+ const reportError = options.reportError ?? null;
438
+ // Prevent concurrent reconnection attempts
439
+ if (this._reconnectInProgress) {
440
+ logger.warning(`${this} reconnect attempt aborted: already in progress`);
441
+ return false;
442
+ }
443
+ // Reconnecting can't fix whatever made the service unusable.
444
+ if (!this._isServiceUsable) {
445
+ logger.error(`${this} not reconnecting: the service is no longer usable`);
446
+ return false;
447
+ }
448
+ this._reconnectInProgress = true;
449
+ let lastException = null;
450
+ try {
451
+ for (let attempt = 1; attempt <= maxRetries; attempt++) {
452
+ try {
453
+ logger.warning(`${this} reconnecting, attempt ${attempt}`);
454
+ if (await this._reconnectWebsocket(attempt)) {
455
+ logger.info(`${this} reconnected successfully on attempt ${attempt}`);
456
+ this._lastConnectTime = monotonic();
457
+ return true;
458
+ }
459
+ }
460
+ catch (e) {
461
+ rethrowIfCancelled(e);
462
+ lastException = e;
463
+ logger.error(`${this} reconnection attempt ${attempt} failed: ${errorText(e)}`);
464
+ if (reportError) {
465
+ await reportError(new ErrorFrame({
466
+ error: `${this} reconnection attempt ${attempt} failed: ${errorText(e)}`,
467
+ exception: e,
468
+ }));
469
+ }
470
+ }
471
+ // A rejected attempt may have been rejected for a reason reporting
472
+ // it identified as terminal.
473
+ if (!this._isServiceUsable) {
474
+ logger.error(`${this} abandoning reconnection: the service is no longer usable`);
475
+ return false;
476
+ }
477
+ const waitTime = exponentialBackoffTime(attempt, this._reconnectBackoffMinWait, this._reconnectBackoffMaxWait);
478
+ await sleep(waitTime);
479
+ }
480
+ let msg = `${this} failed to reconnect after ${maxRetries} attempts`;
481
+ if (lastException) {
482
+ msg += `: ${errorText(lastException)}`;
483
+ }
484
+ logger.error(msg);
485
+ if (reportError) {
486
+ await reportError(new ErrorFrame({ error: msg, exception: lastException }), {
487
+ forceTreatAsPermanent: true,
488
+ });
489
+ }
490
+ return false;
491
+ }
492
+ finally {
493
+ this._reconnectInProgress = false;
494
+ }
495
+ }
496
+ /** Attempt to send a message, retrying after reconnect if necessary. */
497
+ async sendWithRetry(message, reportError) {
498
+ try {
499
+ // If websocket isn't connected/present, treat as a send failure — the
500
+ // broad catch below will trigger a reconnect attempt.
501
+ if (this._websocket === null) {
502
+ throw new Error(`${this} no websocket connected`);
503
+ }
504
+ await this._websocket.send(message);
505
+ }
506
+ catch (e) {
507
+ rethrowIfCancelled(e);
508
+ logger.error(`${this} send failed: ${errorText(e)}, will try to reconnect`);
509
+ // Try to reconnect before retrying
510
+ const success = await this._tryReconnect({ reportError });
511
+ if (success && this._websocket !== null) {
512
+ logger.info(`${this} reconnected successfully, will retry send the message`);
513
+ // trying to send the message one more time
514
+ await this._websocket.send(message);
515
+ }
516
+ else {
517
+ logger.error(`${this} send failed; unable to reconnect`);
518
+ }
519
+ }
520
+ }
521
+ /**
522
+ * Check if reconnection should be attempted and try if appropriate.
523
+ *
524
+ * @param errorMessage Human-readable error message for logging.
525
+ * @param reportError Callback function to report connection errors.
526
+ * @param error The error that occurred (may be null for graceful closes).
527
+ * @returns True if should continue the receive loop, false if should break.
528
+ */
529
+ async _maybeTryReconnect(errorMessage, reportError, error = null) {
530
+ // Don't reconnect if we're intentionally disconnecting
531
+ if (this._disconnecting) {
532
+ if (error) {
533
+ logger.warning(`${this} error during disconnect: ${errorText(error)}`);
534
+ }
535
+ else {
536
+ logger.debug(`${this} receive loop ended during disconnect`);
537
+ }
538
+ return false;
539
+ }
540
+ // Check if the connection died too quickly after being established.
541
+ // This catches cases where the handshake succeeds but the server
542
+ // immediately closes (e.g. invalid API key). Exponential backoff won't
543
+ // help here because the handshake keeps succeeding — we need to stop
544
+ // the loop.
545
+ if (this._lastConnectTime > 0) {
546
+ const connectionDuration = monotonic() - this._lastConnectTime;
547
+ const result = this._quickFailureTracker.record(connectionDuration);
548
+ if (result.isQuickFailure) {
549
+ logger.warning(`${this} connection lasted only ${connectionDuration.toFixed(1)}s ` +
550
+ `(${this._quickFailureTracker.count}/` +
551
+ `${this._quickFailureTracker.maxConsecutiveFailures} ` +
552
+ "consecutive quick failures)");
553
+ }
554
+ if (result.shouldGiveUp) {
555
+ const msg = `${this} connection failed ` +
556
+ `${this._quickFailureTracker.maxConsecutiveFailures} ` +
557
+ "times immediately after connecting";
558
+ logger.error(msg);
559
+ await reportError(new ErrorFrame({ error: msg }), { forceTreatAsPermanent: true });
560
+ return false;
561
+ }
562
+ }
563
+ // Log the message
564
+ logger.warning(errorMessage);
565
+ // Try to reconnect if enabled
566
+ if (this._reconnectOnError) {
567
+ return await this._tryReconnect({ reportError });
568
+ }
569
+ // `reconnectOnError` governs this loop only: services that turn it off
570
+ // reconnect on demand in `sendWithRetry` instead. Reporting the drop as
571
+ // terminal would close that path too.
572
+ await reportError(new ErrorFrame({ error: errorMessage, exception: error }));
573
+ return false;
574
+ }
575
+ /**
576
+ * Handle websocket message receiving with automatic retry logic.
577
+ *
578
+ * Continuously receives messages with automatic reconnection on errors.
579
+ * Uses exponential backoff between retry attempts and reports fatal
580
+ * errors after maximum retries are exhausted.
581
+ *
582
+ * @param reportError Callback function to report connection errors.
583
+ */
584
+ async _receiveTaskHandler(reportError) {
585
+ while (true) {
586
+ this._lastConnectTime = monotonic();
587
+ try {
588
+ await this._receiveMessages();
589
+ // _receiveMessages() returned normally. This happens when the
590
+ // websocket closes gracefully (server sent close frame). The
591
+ // `for await` loop over the websocket exits without throwing in
592
+ // this case. We must handle this to avoid an infinite loop.
593
+ const message = `${this} connection closed by server`;
594
+ const shouldContinue = await this._maybeTryReconnect(message, reportError);
595
+ if (!shouldContinue)
596
+ break;
597
+ }
598
+ catch (e) {
599
+ if (e instanceof CancelledError)
600
+ throw e;
601
+ if (e instanceof ConnectionClosedOK) {
602
+ // Normal closure, don't retry
603
+ logger.debug(`${this} connection closed normally: ${e.message}`);
604
+ break;
605
+ }
606
+ let message;
607
+ if (e instanceof ConnectionClosedError) {
608
+ // Connection closed with error (e.g., no close frame
609
+ // received/sent). This often indicates network issues, server
610
+ // problems, or abrupt disconnection.
611
+ message = `${this} connection closed, but with an error: ${e.message}`;
612
+ }
613
+ else {
614
+ // General error during message receiving
615
+ message = `${this} error receiving messages: ${errorText(e)}`;
616
+ }
617
+ const shouldContinue = await this._maybeTryReconnect(message, reportError, e);
618
+ if (!shouldContinue)
619
+ break;
620
+ }
621
+ }
622
+ }
623
+ /**
624
+ * Connect to the service and reset the disconnecting flag.
625
+ *
626
+ * Manages the disconnecting flag to enable reconnection. Subclasses
627
+ * should call `super._connect()` first, then implement their specific
628
+ * connection logic including websocket connection via
629
+ * `_connectWebsocket()` and any additional setup required.
630
+ */
631
+ async _connect() {
632
+ this._disconnecting = false;
633
+ this._quickFailureTracker.reset();
634
+ }
635
+ /**
636
+ * Disconnect from the service and set the disconnecting flag.
637
+ *
638
+ * Manages the disconnecting flag to prevent reconnection during
639
+ * intentional disconnect. Subclasses should call `super._disconnect()`
640
+ * first, then implement their specific disconnection logic including
641
+ * websocket disconnection via `_disconnectWebsocket()` and any cleanup
642
+ * required.
643
+ */
644
+ async _disconnect() {
645
+ this._disconnecting = true;
646
+ }
647
+ }
648
+ return WebsocketServiceMixin;
649
+ });
650
+ /** Python's `f"{e}"` for an exception. */
651
+ function errorText(e) {
652
+ return e instanceof Error ? e.message : String(e);
653
+ }
654
+ //# sourceMappingURL=websocket_service.js.map
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1,9 @@
1
+ // Copyright (c) 2024-2026, Daily
2
+ // Copyright (c) 2026, pipedog contributors
3
+ // SPDX-License-Identifier: BSD-2-Clause
4
+ //
5
+ // Ported from pipecat: src/pipecat/services/whisper/__init__.py
6
+ // Upstream's __init__.py is empty: it only marks the package. The provider
7
+ // modules themselves live in their own packages (see porting/manifest.json).
8
+ export {};
9
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1,9 @@
1
+ // Copyright (c) 2024-2026, Daily
2
+ // Copyright (c) 2026, pipedog contributors
3
+ // SPDX-License-Identifier: BSD-2-Clause
4
+ //
5
+ // Ported from pipecat: src/pipecat/services/xai/__init__.py
6
+ // Upstream's __init__.py is empty: it only marks the package. The provider
7
+ // modules themselves live in their own packages (see porting/manifest.json).
8
+ export {};
9
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=index.d.ts.map