@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.
- package/LICENSE +25 -0
- package/NOTICE +9 -0
- package/dist/adapters/base_llm_adapter.d.ts +266 -0
- package/dist/adapters/base_llm_adapter.js +489 -0
- package/dist/adapters/index.d.ts +2 -0
- package/dist/adapters/index.js +8 -0
- package/dist/adapters/schemas/direct_function.d.ts +202 -0
- package/dist/adapters/schemas/direct_function.js +302 -0
- package/dist/adapters/schemas/function_schema.d.ts +67 -0
- package/dist/adapters/schemas/function_schema.js +72 -0
- package/dist/adapters/schemas/index.d.ts +2 -0
- package/dist/adapters/schemas/index.js +8 -0
- package/dist/adapters/schemas/tools_schema.d.ts +57 -0
- package/dist/adapters/schemas/tools_schema.js +79 -0
- package/dist/adapters/services/index.d.ts +2 -0
- package/dist/adapters/services/index.js +8 -0
- package/dist/adapters/services/open_ai_adapter.d.ts +147 -0
- package/dist/adapters/services/open_ai_adapter.js +250 -0
- package/dist/audio/dtmf/dtmf_data.d.ts +3 -0
- package/dist/audio/dtmf/dtmf_data.js +22 -0
- package/dist/audio/dtmf/index.d.ts +2 -0
- package/dist/audio/dtmf/index.js +8 -0
- package/dist/audio/dtmf/types.d.ts +31 -0
- package/dist/audio/dtmf/types.js +35 -0
- package/dist/audio/dtmf/utils.d.ts +13 -0
- package/dist/audio/dtmf/utils.js +62 -0
- package/dist/audio/filters/base_audio_filter.d.ts +51 -0
- package/dist/audio/filters/base_audio_filter.js +17 -0
- package/dist/audio/filters/index.d.ts +2 -0
- package/dist/audio/filters/index.js +8 -0
- package/dist/audio/index.d.ts +2 -0
- package/dist/audio/index.js +8 -0
- package/dist/audio/krisp_instance.d.ts +95 -0
- package/dist/audio/krisp_instance.js +229 -0
- package/dist/audio/mixers/base_audio_mixer.d.ts +56 -0
- package/dist/audio/mixers/base_audio_mixer.js +16 -0
- package/dist/audio/mixers/index.d.ts +2 -0
- package/dist/audio/mixers/index.js +8 -0
- package/dist/audio/resamplers/base_audio_resampler.d.ts +46 -0
- package/dist/audio/resamplers/base_audio_resampler.js +35 -0
- package/dist/audio/resamplers/engine.d.ts +60 -0
- package/dist/audio/resamplers/engine.js +89 -0
- package/dist/audio/resamplers/index.d.ts +2 -0
- package/dist/audio/resamplers/index.js +8 -0
- package/dist/audio/resamplers/resampy_resampler.d.ts +10 -0
- package/dist/audio/resamplers/resampy_resampler.js +15 -0
- package/dist/audio/resamplers/sinc_engine.d.ts +10 -0
- package/dist/audio/resamplers/sinc_engine.js +235 -0
- package/dist/audio/resamplers/soxr_resampler.d.ts +58 -0
- package/dist/audio/resamplers/soxr_resampler.js +79 -0
- package/dist/audio/resamplers/soxr_stream_resampler.d.ts +78 -0
- package/dist/audio/resamplers/soxr_stream_resampler.js +159 -0
- package/dist/audio/turn/base_turn_analyzer.d.ts +84 -0
- package/dist/audio/turn/base_turn_analyzer.js +61 -0
- package/dist/audio/turn/index.d.ts +2 -0
- package/dist/audio/turn/index.js +8 -0
- package/dist/audio/turn/smart_turn/_whisper_features.d.ts +30 -0
- package/dist/audio/turn/smart_turn/_whisper_features.js +225 -0
- package/dist/audio/turn/smart_turn/base_smart_turn.d.ts +94 -0
- package/dist/audio/turn/smart_turn/base_smart_turn.js +239 -0
- package/dist/audio/turn/smart_turn/local_smart_turn_v3.d.ts +76 -0
- package/dist/audio/turn/smart_turn/local_smart_turn_v3.js +151 -0
- package/dist/audio/utils.d.ts +224 -0
- package/dist/audio/utils.js +634 -0
- package/dist/audio/vad/data/index.d.ts +2 -0
- package/dist/audio/vad/data/index.js +8 -0
- package/dist/audio/vad/index.d.ts +2 -0
- package/dist/audio/vad/index.js +8 -0
- package/dist/audio/vad/vad_analyzer.d.ts +134 -0
- package/dist/audio/vad/vad_analyzer.js +249 -0
- package/dist/audio/vad/vad_controller.d.ts +143 -0
- package/dist/audio/vad/vad_controller.js +228 -0
- package/dist/audio/volume.d.ts +38 -0
- package/dist/audio/volume.js +75 -0
- package/dist/bus/adapters/base.d.ts +35 -0
- package/dist/bus/adapters/base.js +19 -0
- package/dist/bus/adapters/index.d.ts +10 -0
- package/dist/bus/adapters/index.js +15 -0
- package/dist/bus/adapters/llm_context_adapter.d.ts +36 -0
- package/dist/bus/adapters/llm_context_adapter.js +82 -0
- package/dist/bus/adapters/tools_schema_adapter.d.ts +25 -0
- package/dist/bus/adapters/tools_schema_adapter.js +70 -0
- package/dist/bus/bridge_processor.d.ts +111 -0
- package/dist/bus/bridge_processor.js +166 -0
- package/dist/bus/bus.d.ts +110 -0
- package/dist/bus/bus.js +200 -0
- package/dist/bus/index.d.ts +22 -0
- package/dist/bus/index.js +27 -0
- package/dist/bus/local/async_queue.d.ts +12 -0
- package/dist/bus/local/async_queue.js +21 -0
- package/dist/bus/local/index.d.ts +3 -0
- package/dist/bus/local/index.js +8 -0
- package/dist/bus/messages.d.ts +378 -0
- package/dist/bus/messages.js +357 -0
- package/dist/bus/network/index.d.ts +16 -0
- package/dist/bus/network/index.js +21 -0
- package/dist/bus/queue.d.ts +27 -0
- package/dist/bus/queue.js +51 -0
- package/dist/bus/serializers/base.d.ts +25 -0
- package/dist/bus/serializers/base.js +14 -0
- package/dist/bus/serializers/index.d.ts +9 -0
- package/dist/bus/serializers/index.js +14 -0
- package/dist/bus/serializers/json.d.ts +77 -0
- package/dist/bus/serializers/json.js +367 -0
- package/dist/bus/subscriber.d.ts +46 -0
- package/dist/bus/subscriber.js +27 -0
- package/dist/bus/ui/index.d.ts +3 -0
- package/dist/bus/ui/index.js +8 -0
- package/dist/bus/ui/messages.d.ts +186 -0
- package/dist/bus/ui/messages.js +171 -0
- package/dist/classifiers/base_classifier.d.ts +263 -0
- package/dist/classifiers/base_classifier.js +346 -0
- package/dist/classifiers/cloudflare/clef/classifier.d.ts +70 -0
- package/dist/classifiers/cloudflare/clef/classifier.js +204 -0
- package/dist/classifiers/cloudflare/clef/client.d.ts +104 -0
- package/dist/classifiers/cloudflare/clef/client.js +234 -0
- package/dist/classifiers/cloudflare/clef/index.d.ts +2 -0
- package/dist/classifiers/cloudflare/clef/index.js +8 -0
- package/dist/classifiers/cloudflare/index.d.ts +2 -0
- package/dist/classifiers/cloudflare/index.js +8 -0
- package/dist/classifiers/http_client.d.ts +70 -0
- package/dist/classifiers/http_client.js +161 -0
- package/dist/classifiers/index.d.ts +2 -0
- package/dist/classifiers/index.js +8 -0
- package/dist/classifiers/jev/classifier.d.ts +8 -0
- package/dist/classifiers/jev/classifier.js +13 -0
- package/dist/classifiers/jev/client.d.ts +8 -0
- package/dist/classifiers/jev/client.js +13 -0
- package/dist/classifiers/jev/index.d.ts +2 -0
- package/dist/classifiers/jev/index.js +8 -0
- package/dist/classifiers/llm/classifier.d.ts +72 -0
- package/dist/classifiers/llm/classifier.js +304 -0
- package/dist/classifiers/llm/index.d.ts +2 -0
- package/dist/classifiers/llm/index.js +8 -0
- package/dist/classifiers/openai/decisions/classifier.d.ts +77 -0
- package/dist/classifiers/openai/decisions/classifier.js +241 -0
- package/dist/classifiers/openai/decisions/client.d.ts +108 -0
- package/dist/classifiers/openai/decisions/client.js +234 -0
- package/dist/classifiers/openai/decisions/index.d.ts +2 -0
- package/dist/classifiers/openai/decisions/index.js +8 -0
- package/dist/classifiers/openai/index.d.ts +2 -0
- package/dist/classifiers/openai/index.js +8 -0
- package/dist/classifiers/typesafe/index.d.ts +2 -0
- package/dist/classifiers/typesafe/index.js +8 -0
- package/dist/classifiers/typesafe/jev/classifier.d.ts +70 -0
- package/dist/classifiers/typesafe/jev/classifier.js +220 -0
- package/dist/classifiers/typesafe/jev/client.d.ts +105 -0
- package/dist/classifiers/typesafe/jev/client.js +233 -0
- package/dist/classifiers/typesafe/jev/index.d.ts +2 -0
- package/dist/classifiers/typesafe/jev/index.js +8 -0
- package/dist/clocks/base_clock.d.ts +13 -0
- package/dist/clocks/base_clock.js +14 -0
- package/dist/clocks/index.d.ts +2 -0
- package/dist/clocks/index.js +8 -0
- package/dist/clocks/system_clock.d.ts +15 -0
- package/dist/clocks/system_clock.js +25 -0
- package/dist/frames/frames.d.ts +2533 -0
- package/dist/frames/frames.js +2485 -0
- package/dist/frames/index.d.ts +2 -0
- package/dist/frames/index.js +8 -0
- package/dist/frames/protobufs/frames_pb2.d.ts +229 -0
- package/dist/frames/protobufs/frames_pb2.js +466 -0
- package/dist/index.d.ts +11 -0
- package/dist/index.js +56 -0
- package/dist/metrics/index.d.ts +2 -0
- package/dist/metrics/index.js +8 -0
- package/dist/metrics/metrics.d.ts +276 -0
- package/dist/metrics/metrics.js +254 -0
- package/dist/observers/base_observer.d.ts +173 -0
- package/dist/observers/base_observer.js +151 -0
- package/dist/observers/error_observer.d.ts +75 -0
- package/dist/observers/error_observer.js +87 -0
- package/dist/observers/function_call_observer.d.ts +157 -0
- package/dist/observers/function_call_observer.js +222 -0
- package/dist/observers/index.d.ts +2 -0
- package/dist/observers/index.js +8 -0
- package/dist/observers/loggers/debug_log_observer.d.ts +91 -0
- package/dist/observers/loggers/debug_log_observer.js +228 -0
- package/dist/observers/loggers/index.d.ts +2 -0
- package/dist/observers/loggers/index.js +8 -0
- package/dist/observers/loggers/llm_log_observer.d.ts +24 -0
- package/dist/observers/loggers/llm_log_observer.js +110 -0
- package/dist/observers/loggers/metrics_log_observer.d.ts +85 -0
- package/dist/observers/loggers/metrics_log_observer.js +186 -0
- package/dist/observers/loggers/transcription_log_observer.d.ts +23 -0
- package/dist/observers/loggers/transcription_log_observer.js +74 -0
- package/dist/observers/service_metrics_observer.d.ts +168 -0
- package/dist/observers/service_metrics_observer.js +236 -0
- package/dist/observers/speaking_observer.d.ts +104 -0
- package/dist/observers/speaking_observer.js +150 -0
- package/dist/observers/startup_timing_observer.d.ts +221 -0
- package/dist/observers/startup_timing_observer.js +365 -0
- package/dist/observers/turn_tracking_observer.d.ts +78 -0
- package/dist/observers/turn_tracking_observer.js +189 -0
- package/dist/observers/user_bot_latency_observer.d.ts +411 -0
- package/dist/observers/user_bot_latency_observer.js +974 -0
- package/dist/pipeline/base_pipeline.d.ts +49 -0
- package/dist/pipeline/base_pipeline.js +101 -0
- package/dist/pipeline/capabilities.d.ts +76 -0
- package/dist/pipeline/capabilities.js +97 -0
- package/dist/pipeline/index.d.ts +2 -0
- package/dist/pipeline/index.js +8 -0
- package/dist/pipeline/job_context.d.ts +317 -0
- package/dist/pipeline/job_context.js +450 -0
- package/dist/pipeline/job_decorator.d.ts +54 -0
- package/dist/pipeline/job_decorator.js +92 -0
- package/dist/pipeline/llm_switcher.d.ts +84 -0
- package/dist/pipeline/llm_switcher.js +107 -0
- package/dist/pipeline/llm_with_backend.d.ts +435 -0
- package/dist/pipeline/llm_with_backend.js +806 -0
- package/dist/pipeline/parallel_pipeline.d.ts +83 -0
- package/dist/pipeline/parallel_pipeline.js +200 -0
- package/dist/pipeline/pipeline.d.ts +126 -0
- package/dist/pipeline/pipeline.js +196 -0
- package/dist/pipeline/service_switcher.d.ts +287 -0
- package/dist/pipeline/service_switcher.js +509 -0
- package/dist/pipeline/sync_parallel_pipeline.d.ts +192 -0
- package/dist/pipeline/sync_parallel_pipeline.js +387 -0
- package/dist/pipeline/worker.d.ts +821 -0
- package/dist/pipeline/worker.js +1656 -0
- package/dist/pipeline/worker_observer.d.ts +131 -0
- package/dist/pipeline/worker_observer.js +274 -0
- package/dist/pipeline/worker_ready_decorator.d.ts +45 -0
- package/dist/pipeline/worker_ready_decorator.js +76 -0
- package/dist/processors/aggregators/async_tool_messages.d.ts +146 -0
- package/dist/processors/aggregators/async_tool_messages.js +291 -0
- package/dist/processors/aggregators/dtmf_aggregator.d.ts +61 -0
- package/dist/processors/aggregators/dtmf_aggregator.js +144 -0
- package/dist/processors/aggregators/gated.d.ts +43 -0
- package/dist/processors/aggregators/gated.js +86 -0
- package/dist/processors/aggregators/gated_llm_context.d.ts +42 -0
- package/dist/processors/aggregators/gated_llm_context.js +86 -0
- package/dist/processors/aggregators/index.d.ts +2 -0
- package/dist/processors/aggregators/index.js +8 -0
- package/dist/processors/aggregators/llm_context.d.ts +370 -0
- package/dist/processors/aggregators/llm_context.js +580 -0
- package/dist/processors/aggregators/llm_context_summarizer.d.ts +219 -0
- package/dist/processors/aggregators/llm_context_summarizer.js +447 -0
- package/dist/processors/aggregators/llm_response.d.ts +37 -0
- package/dist/processors/aggregators/llm_response.js +71 -0
- package/dist/processors/aggregators/llm_response_universal.d.ts +966 -0
- package/dist/processors/aggregators/llm_response_universal.js +2394 -0
- package/dist/processors/aggregators/llm_text_processor.d.ts +53 -0
- package/dist/processors/aggregators/llm_text_processor.js +102 -0
- package/dist/processors/aggregators/sentence.d.ts +39 -0
- package/dist/processors/aggregators/sentence.js +69 -0
- package/dist/processors/async_generator.d.ts +42 -0
- package/dist/processors/async_generator.js +76 -0
- package/dist/processors/audio/audio_buffer_processor.d.ts +241 -0
- package/dist/processors/audio/audio_buffer_processor.js +565 -0
- package/dist/processors/audio/index.d.ts +2 -0
- package/dist/processors/audio/index.js +8 -0
- package/dist/processors/audio/vad_processor.d.ts +67 -0
- package/dist/processors/audio/vad_processor.js +103 -0
- package/dist/processors/consumer_processor.d.ts +49 -0
- package/dist/processors/consumer_processor.js +85 -0
- package/dist/processors/filters/frame_filter.d.ts +39 -0
- package/dist/processors/filters/frame_filter.js +52 -0
- package/dist/processors/filters/function_filter.d.ts +59 -0
- package/dist/processors/filters/function_filter.js +78 -0
- package/dist/processors/filters/identity_filter.d.ts +33 -0
- package/dist/processors/filters/identity_filter.js +37 -0
- package/dist/processors/filters/index.d.ts +2 -0
- package/dist/processors/filters/index.js +8 -0
- package/dist/processors/filters/null_filter.d.ts +34 -0
- package/dist/processors/filters/null_filter.js +47 -0
- package/dist/processors/filters/wake_notifier_filter.d.ts +48 -0
- package/dist/processors/filters/wake_notifier_filter.js +49 -0
- package/dist/processors/frame_processor.d.ts +360 -0
- package/dist/processors/frame_processor.js +932 -0
- package/dist/processors/frameworks/index.d.ts +2 -0
- package/dist/processors/frameworks/index.js +8 -0
- package/dist/processors/frameworks/rtvi/frames.d.ts +241 -0
- package/dist/processors/frameworks/rtvi/frames.js +259 -0
- package/dist/processors/frameworks/rtvi/index.d.ts +6 -0
- package/dist/processors/frameworks/rtvi/index.js +11 -0
- package/dist/processors/frameworks/rtvi/models.d.ts +1741 -0
- package/dist/processors/frameworks/rtvi/models.js +1807 -0
- package/dist/processors/frameworks/rtvi/observer.d.ts +340 -0
- package/dist/processors/frameworks/rtvi/observer.js +1113 -0
- package/dist/processors/frameworks/rtvi/processor.d.ts +182 -0
- package/dist/processors/frameworks/rtvi/processor.js +676 -0
- package/dist/processors/idle_frame_processor.d.ts +44 -0
- package/dist/processors/idle_frame_processor.js +86 -0
- package/dist/processors/index.d.ts +2 -0
- package/dist/processors/index.js +8 -0
- package/dist/processors/logger.d.ts +42 -0
- package/dist/processors/logger.js +87 -0
- package/dist/processors/metrics/frame_processor_metrics.d.ts +172 -0
- package/dist/processors/metrics/frame_processor_metrics.js +372 -0
- package/dist/processors/metrics/index.d.ts +2 -0
- package/dist/processors/metrics/index.js +8 -0
- package/dist/processors/producer_processor.d.ts +68 -0
- package/dist/processors/producer_processor.js +78 -0
- package/dist/processors/text_transformer.d.ts +30 -0
- package/dist/processors/text_transformer.js +48 -0
- package/dist/registry/index.d.ts +3 -0
- package/dist/registry/index.js +8 -0
- package/dist/registry/registry.d.ts +69 -0
- package/dist/registry/registry.js +149 -0
- package/dist/registry/types.d.ts +47 -0
- package/dist/registry/types.js +39 -0
- package/dist/serializers/base_serializer.d.ts +94 -0
- package/dist/serializers/base_serializer.js +82 -0
- package/dist/serializers/index.d.ts +2 -0
- package/dist/serializers/index.js +8 -0
- package/dist/services/ai_service.d.ts +145 -0
- package/dist/services/ai_service.js +262 -0
- package/dist/services/anthropic/index.d.ts +2 -0
- package/dist/services/anthropic/index.js +7 -0
- package/dist/services/assemblyai/index.d.ts +2 -0
- package/dist/services/assemblyai/index.js +7 -0
- package/dist/services/asyncai/index.d.ts +2 -0
- package/dist/services/asyncai/index.js +7 -0
- package/dist/services/aws/index.d.ts +2 -0
- package/dist/services/aws/index.js +7 -0
- package/dist/services/azure/index.d.ts +2 -0
- package/dist/services/azure/index.js +7 -0
- package/dist/services/baseten/index.d.ts +2 -0
- package/dist/services/baseten/index.js +7 -0
- package/dist/services/bland/index.d.ts +2 -0
- package/dist/services/bland/index.js +7 -0
- package/dist/services/camb/index.d.ts +2 -0
- package/dist/services/camb/index.js +7 -0
- package/dist/services/cartesia/index.d.ts +2 -0
- package/dist/services/cartesia/index.js +7 -0
- package/dist/services/cerebras/index.d.ts +2 -0
- package/dist/services/cerebras/index.js +7 -0
- package/dist/services/crusoe/index.d.ts +2 -0
- package/dist/services/crusoe/index.js +7 -0
- package/dist/services/deepgram/index.d.ts +2 -0
- package/dist/services/deepgram/index.js +7 -0
- package/dist/services/deepseek/index.d.ts +2 -0
- package/dist/services/deepseek/index.js +7 -0
- package/dist/services/elevenlabs/index.d.ts +2 -0
- package/dist/services/elevenlabs/index.js +7 -0
- package/dist/services/fal/index.d.ts +2 -0
- package/dist/services/fal/index.js +7 -0
- package/dist/services/fireworks/index.d.ts +2 -0
- package/dist/services/fireworks/index.js +7 -0
- package/dist/services/fish/index.d.ts +2 -0
- package/dist/services/fish/index.js +7 -0
- package/dist/services/funasr/index.d.ts +3 -0
- package/dist/services/funasr/index.js +8 -0
- package/dist/services/gladia/index.d.ts +2 -0
- package/dist/services/gladia/index.js +7 -0
- package/dist/services/google/index.d.ts +2 -0
- package/dist/services/google/index.js +7 -0
- package/dist/services/gradium/index.d.ts +2 -0
- package/dist/services/gradium/index.js +7 -0
- package/dist/services/grok/index.d.ts +2 -0
- package/dist/services/grok/index.js +7 -0
- package/dist/services/groq/index.d.ts +2 -0
- package/dist/services/groq/index.js +7 -0
- package/dist/services/heygen/index.d.ts +2 -0
- package/dist/services/heygen/index.js +7 -0
- package/dist/services/hume/index.d.ts +2 -0
- package/dist/services/hume/index.js +7 -0
- package/dist/services/image_service.d.ts +52 -0
- package/dist/services/image_service.js +60 -0
- package/dist/services/inception/index.d.ts +2 -0
- package/dist/services/inception/index.js +7 -0
- package/dist/services/index.d.ts +2 -0
- package/dist/services/index.js +8 -0
- package/dist/services/inworld/index.d.ts +2 -0
- package/dist/services/inworld/index.js +7 -0
- package/dist/services/keenable/index.d.ts +2 -0
- package/dist/services/keenable/index.js +7 -0
- package/dist/services/kokoro/index.d.ts +2 -0
- package/dist/services/kokoro/index.js +7 -0
- package/dist/services/llm_service.d.ts +1106 -0
- package/dist/services/llm_service.js +2231 -0
- package/dist/services/mem0/index.d.ts +2 -0
- package/dist/services/mem0/index.js +7 -0
- package/dist/services/meta/index.d.ts +2 -0
- package/dist/services/meta/index.js +7 -0
- package/dist/services/minimax/index.d.ts +2 -0
- package/dist/services/minimax/index.js +7 -0
- package/dist/services/mistral/index.d.ts +2 -0
- package/dist/services/mistral/index.js +7 -0
- package/dist/services/moondream/index.d.ts +2 -0
- package/dist/services/moondream/index.js +7 -0
- package/dist/services/moonshine/index.d.ts +2 -0
- package/dist/services/moonshine/index.js +7 -0
- package/dist/services/nebius/index.d.ts +2 -0
- package/dist/services/nebius/index.js +7 -0
- package/dist/services/neuphonic/index.d.ts +2 -0
- package/dist/services/neuphonic/index.js +7 -0
- package/dist/services/novita/index.d.ts +2 -0
- package/dist/services/novita/index.js +7 -0
- package/dist/services/nvidia/index.d.ts +2 -0
- package/dist/services/nvidia/index.js +11 -0
- package/dist/services/ollama/index.d.ts +2 -0
- package/dist/services/ollama/index.js +7 -0
- package/dist/services/openai/index.d.ts +2 -0
- package/dist/services/openai/index.js +7 -0
- package/dist/services/openclaw/index.d.ts +14 -0
- package/dist/services/openclaw/index.js +19 -0
- package/dist/services/openrouter/index.d.ts +2 -0
- package/dist/services/openrouter/index.js +7 -0
- package/dist/services/perplexity/index.d.ts +2 -0
- package/dist/services/perplexity/index.js +7 -0
- package/dist/services/piper/index.d.ts +2 -0
- package/dist/services/piper/index.js +7 -0
- package/dist/services/pocket_tts/index.d.ts +2 -0
- package/dist/services/pocket_tts/index.js +7 -0
- package/dist/services/qwen/index.d.ts +2 -0
- package/dist/services/qwen/index.js +7 -0
- package/dist/services/resembleai/index.d.ts +2 -0
- package/dist/services/resembleai/index.js +7 -0
- package/dist/services/rime/index.d.ts +2 -0
- package/dist/services/rime/index.js +7 -0
- package/dist/services/sambanova/index.d.ts +2 -0
- package/dist/services/sambanova/index.js +7 -0
- package/dist/services/sarvam/index.d.ts +2 -0
- package/dist/services/sarvam/index.js +7 -0
- package/dist/services/settings.d.ts +356 -0
- package/dist/services/settings.js +437 -0
- package/dist/services/simli/index.d.ts +2 -0
- package/dist/services/simli/index.js +7 -0
- package/dist/services/smallest/index.d.ts +2 -0
- package/dist/services/smallest/index.js +7 -0
- package/dist/services/soniox/index.d.ts +2 -0
- package/dist/services/soniox/index.js +7 -0
- package/dist/services/speechify/index.d.ts +2 -0
- package/dist/services/speechify/index.js +7 -0
- package/dist/services/speechmatics/index.d.ts +2 -0
- package/dist/services/speechmatics/index.js +7 -0
- package/dist/services/stt_latency.d.ts +62 -0
- package/dist/services/stt_latency.js +71 -0
- package/dist/services/stt_service.d.ts +601 -0
- package/dist/services/stt_service.js +1044 -0
- package/dist/services/tavus/index.d.ts +2 -0
- package/dist/services/tavus/index.js +7 -0
- package/dist/services/together/index.d.ts +2 -0
- package/dist/services/together/index.js +7 -0
- package/dist/services/tts_service.d.ts +909 -0
- package/dist/services/tts_service.js +2018 -0
- package/dist/services/ultravox/index.d.ts +2 -0
- package/dist/services/ultravox/index.js +9 -0
- package/dist/services/vision_service.d.ts +56 -0
- package/dist/services/vision_service.js +62 -0
- package/dist/services/websocket_service.d.ts +213 -0
- package/dist/services/websocket_service.js +654 -0
- package/dist/services/whisper/index.d.ts +2 -0
- package/dist/services/whisper/index.js +9 -0
- package/dist/services/xai/index.d.ts +2 -0
- package/dist/services/xai/index.js +9 -0
- package/dist/services/xtts/index.d.ts +2 -0
- package/dist/services/xtts/index.js +9 -0
- package/dist/tests/index.d.ts +2 -0
- package/dist/tests/index.js +8 -0
- package/dist/tests/utils.d.ts +123 -0
- package/dist/tests/utils.js +212 -0
- package/dist/transcriptions/index.d.ts +2 -0
- package/dist/transcriptions/index.js +8 -0
- package/dist/transcriptions/language.d.ts +376 -0
- package/dist/transcriptions/language.js +543 -0
- package/dist/transports/base_input.d.ts +149 -0
- package/dist/transports/base_input.js +338 -0
- package/dist/transports/base_output.d.ts +432 -0
- package/dist/transports/base_output.js +1231 -0
- package/dist/transports/base_transport.d.ts +223 -0
- package/dist/transports/base_transport.js +167 -0
- package/dist/transports/daily/index.d.ts +2 -0
- package/dist/transports/daily/index.js +9 -0
- package/dist/transports/heygen/index.d.ts +2 -0
- package/dist/transports/heygen/index.js +9 -0
- package/dist/transports/index.d.ts +2 -0
- package/dist/transports/index.js +8 -0
- package/dist/transports/lemonslice/index.d.ts +2 -0
- package/dist/transports/lemonslice/index.js +9 -0
- package/dist/transports/livekit/index.d.ts +2 -0
- package/dist/transports/livekit/index.js +9 -0
- package/dist/transports/local/index.d.ts +2 -0
- package/dist/transports/local/index.js +9 -0
- package/dist/transports/moq/index.d.ts +2 -0
- package/dist/transports/moq/index.js +9 -0
- package/dist/transports/smallwebrtc/index.d.ts +2 -0
- package/dist/transports/smallwebrtc/index.js +9 -0
- package/dist/transports/tavus/index.d.ts +2 -0
- package/dist/transports/tavus/index.js +9 -0
- package/dist/transports/video_in_sampler.d.ts +157 -0
- package/dist/transports/video_in_sampler.js +258 -0
- package/dist/transports/vonage/index.d.ts +2 -0
- package/dist/transports/vonage/index.js +9 -0
- package/dist/transports/websocket/index.d.ts +2 -0
- package/dist/transports/websocket/index.js +9 -0
- package/dist/transports/whatsapp/index.d.ts +2 -0
- package/dist/transports/whatsapp/index.js +9 -0
- package/dist/turns/eager_end_of_turn_mixin.d.ts +70 -0
- package/dist/turns/eager_end_of_turn_mixin.js +122 -0
- package/dist/turns/empty_user_turn.d.ts +55 -0
- package/dist/turns/empty_user_turn.js +53 -0
- package/dist/turns/index.d.ts +2 -0
- package/dist/turns/index.js +8 -0
- package/dist/turns/speculation_gate.d.ts +169 -0
- package/dist/turns/speculation_gate.js +294 -0
- package/dist/turns/types.d.ts +33 -0
- package/dist/turns/types.js +35 -0
- package/dist/turns/user_idle_controller.d.ts +94 -0
- package/dist/turns/user_idle_controller.js +187 -0
- package/dist/turns/user_mute/always_user_mute_strategy.d.ts +15 -0
- package/dist/turns/user_mute/always_user_mute_strategy.js +29 -0
- package/dist/turns/user_mute/base_user_mute_strategy.d.ts +39 -0
- package/dist/turns/user_mute/base_user_mute_strategy.js +45 -0
- package/dist/turns/user_mute/first_speech_user_mute_strategy.d.ts +28 -0
- package/dist/turns/user_mute/first_speech_user_mute_strategy.js +52 -0
- package/dist/turns/user_mute/function_call_user_mute_strategy.d.ts +25 -0
- package/dist/turns/user_mute/function_call_user_mute_strategy.js +50 -0
- package/dist/turns/user_mute/index.d.ts +6 -0
- package/dist/turns/user_mute/index.js +11 -0
- package/dist/turns/user_mute/mute_until_first_bot_complete_user_mute_strategy.d.ts +43 -0
- package/dist/turns/user_mute/mute_until_first_bot_complete_user_mute_strategy.js +76 -0
- package/dist/turns/user_start/base_user_turn_start_strategy.d.ts +135 -0
- package/dist/turns/user_start/base_user_turn_start_strategy.js +134 -0
- package/dist/turns/user_start/external_user_turn_start_strategy.d.ts +45 -0
- package/dist/turns/user_start/external_user_turn_start_strategy.js +64 -0
- package/dist/turns/user_start/index.d.ts +8 -0
- package/dist/turns/user_start/index.js +16 -0
- package/dist/turns/user_start/krisp_viva_ip_user_turn_start_strategy.d.ts +133 -0
- package/dist/turns/user_start/krisp_viva_ip_user_turn_start_strategy.js +243 -0
- package/dist/turns/user_start/min_words_user_turn_start_strategy.d.ts +60 -0
- package/dist/turns/user_start/min_words_user_turn_start_strategy.js +102 -0
- package/dist/turns/user_start/transcription_user_turn_start_strategy.d.ts +29 -0
- package/dist/turns/user_start/transcription_user_turn_start_strategy.js +43 -0
- package/dist/turns/user_start/vad_user_turn_start_strategy.d.ts +20 -0
- package/dist/turns/user_start/vad_user_turn_start_strategy.js +31 -0
- package/dist/turns/user_start/wake_phrase_user_turn_start_strategy.d.ts +141 -0
- package/dist/turns/user_start/wake_phrase_user_turn_start_strategy.js +238 -0
- package/dist/turns/user_stop/base_user_turn_stop_strategy.d.ts +174 -0
- package/dist/turns/user_stop/base_user_turn_stop_strategy.js +170 -0
- package/dist/turns/user_stop/deferred_user_turn_stop_strategy.d.ts +81 -0
- package/dist/turns/user_stop/deferred_user_turn_stop_strategy.js +107 -0
- package/dist/turns/user_stop/eager_match_policy.d.ts +36 -0
- package/dist/turns/user_stop/eager_match_policy.js +50 -0
- package/dist/turns/user_stop/eager_user_turn_stop_strategy.d.ts +84 -0
- package/dist/turns/user_stop/eager_user_turn_stop_strategy.js +154 -0
- package/dist/turns/user_stop/external_user_turn_completion_stop_strategy.d.ts +45 -0
- package/dist/turns/user_stop/external_user_turn_completion_stop_strategy.js +55 -0
- package/dist/turns/user_stop/external_user_turn_stop_strategy.d.ts +115 -0
- package/dist/turns/user_stop/external_user_turn_stop_strategy.js +205 -0
- package/dist/turns/user_stop/index.d.ts +10 -0
- package/dist/turns/user_stop/index.js +15 -0
- package/dist/turns/user_stop/llm_turn_completion_user_turn_stop_strategy.d.ts +44 -0
- package/dist/turns/user_stop/llm_turn_completion_user_turn_stop_strategy.js +59 -0
- package/dist/turns/user_stop/speech_timeout_user_turn_stop_strategy.d.ts +140 -0
- package/dist/turns/user_stop/speech_timeout_user_turn_stop_strategy.js +303 -0
- package/dist/turns/user_stop/turn_analyzer_user_turn_stop_strategy.d.ts +135 -0
- package/dist/turns/user_stop/turn_analyzer_user_turn_stop_strategy.js +332 -0
- package/dist/turns/user_turn_completion_mixin.d.ts +147 -0
- package/dist/turns/user_turn_completion_mixin.js +591 -0
- package/dist/turns/user_turn_controller.d.ts +134 -0
- package/dist/turns/user_turn_controller.js +335 -0
- package/dist/turns/user_turn_processor.d.ts +87 -0
- package/dist/turns/user_turn_processor.js +180 -0
- package/dist/turns/user_turn_strategies.d.ts +187 -0
- package/dist/turns/user_turn_strategies.js +222 -0
- package/dist/utils/async_tool_cancellation.d.ts +35 -0
- package/dist/utils/async_tool_cancellation.js +78 -0
- package/dist/utils/asyncio/index.d.ts +2 -0
- package/dist/utils/asyncio/index.js +7 -0
- package/dist/utils/asyncio/task_manager.d.ts +49 -0
- package/dist/utils/asyncio/task_manager.js +105 -0
- package/dist/utils/base_object.d.ts +76 -0
- package/dist/utils/base_object.js +154 -0
- package/dist/utils/context/aggregated_frame_sequencer.d.ts +491 -0
- package/dist/utils/context/aggregated_frame_sequencer.js +803 -0
- package/dist/utils/context/audio_context_manager.d.ts +131 -0
- package/dist/utils/context/audio_context_manager.js +233 -0
- package/dist/utils/context/index.d.ts +2 -0
- package/dist/utils/context/index.js +7 -0
- package/dist/utils/context/llm_context_summarization.d.ts +258 -0
- package/dist/utils/context/llm_context_summarization.js +511 -0
- package/dist/utils/context/text_segment_map.d.ts +611 -0
- package/dist/utils/context/text_segment_map.js +1132 -0
- package/dist/utils/context/word_completion_tracker.d.ts +273 -0
- package/dist/utils/context/word_completion_tracker.js +441 -0
- package/dist/utils/context/word_timestamp_tracker.d.ts +72 -0
- package/dist/utils/context/word_timestamp_tracker.js +98 -0
- package/dist/utils/deprecation.d.ts +28 -0
- package/dist/utils/deprecation.js +75 -0
- package/dist/utils/env.d.ts +38 -0
- package/dist/utils/env.js +62 -0
- package/dist/utils/errors.d.ts +75 -0
- package/dist/utils/errors.js +202 -0
- package/dist/utils/file_resolver.d.ts +126 -0
- package/dist/utils/file_resolver.js +314 -0
- package/dist/utils/file_storage.d.ts +115 -0
- package/dist/utils/file_storage.js +178 -0
- package/dist/utils/frame_queue.d.ts +36 -0
- package/dist/utils/frame_queue.js +66 -0
- package/dist/utils/http.d.ts +39 -0
- package/dist/utils/http.js +53 -0
- package/dist/utils/image.d.ts +14 -0
- package/dist/utils/image.js +63 -0
- package/dist/utils/index.d.ts +2 -0
- package/dist/utils/index.js +8 -0
- package/dist/utils/jpeg_encoder.d.ts +14 -0
- package/dist/utils/jpeg_encoder.js +315 -0
- package/dist/utils/log_config.d.ts +34 -0
- package/dist/utils/log_config.js +76 -0
- package/dist/utils/logger.d.ts +40 -0
- package/dist/utils/logger.js +91 -0
- package/dist/utils/mixin.d.ts +14 -0
- package/dist/utils/mixin.js +63 -0
- package/dist/utils/network.d.ts +73 -0
- package/dist/utils/network.js +90 -0
- package/dist/utils/security/allowed_origins.d.ts +16 -0
- package/dist/utils/security/allowed_origins.js +34 -0
- package/dist/utils/security/index.d.ts +2 -0
- package/dist/utils/security/index.js +7 -0
- package/dist/utils/security/redaction.d.ts +27 -0
- package/dist/utils/security/redaction.js +123 -0
- package/dist/utils/security/ssrf.d.ts +79 -0
- package/dist/utils/security/ssrf.js +327 -0
- package/dist/utils/shared.d.ts +35 -0
- package/dist/utils/shared.js +136 -0
- package/dist/utils/startup.d.ts +17 -0
- package/dist/utils/startup.js +130 -0
- package/dist/utils/string.d.ts +116 -0
- package/dist/utils/string.js +460 -0
- package/dist/utils/sync/base_notifier.d.ts +25 -0
- package/dist/utils/sync/base_notifier.js +16 -0
- package/dist/utils/sync/event_notifier.d.ts +38 -0
- package/dist/utils/sync/event_notifier.js +51 -0
- package/dist/utils/sync/index.d.ts +2 -0
- package/dist/utils/sync/index.js +7 -0
- package/dist/utils/text/alnum_utils.d.ts +109 -0
- package/dist/utils/text/alnum_utils.js +262 -0
- package/dist/utils/text/base_text_aggregator.d.ts +146 -0
- package/dist/utils/text/base_text_aggregator.js +102 -0
- package/dist/utils/text/base_text_filter.d.ts +54 -0
- package/dist/utils/text/base_text_filter.js +50 -0
- package/dist/utils/text/index.d.ts +2 -0
- package/dist/utils/text/index.js +7 -0
- package/dist/utils/text/markdown_text_filter.d.ts +147 -0
- package/dist/utils/text/markdown_text_filter.js +522 -0
- package/dist/utils/text/markup_utils.d.ts +54 -0
- package/dist/utils/text/markup_utils.js +156 -0
- package/dist/utils/text/pattern_pair_aggregator.d.ts +251 -0
- package/dist/utils/text/pattern_pair_aggregator.js +478 -0
- package/dist/utils/text/phonemes.d.ts +60 -0
- package/dist/utils/text/phonemes.js +172 -0
- package/dist/utils/text/simple_text_aggregator.d.ts +135 -0
- package/dist/utils/text/simple_text_aggregator.js +254 -0
- package/dist/utils/text/skip_tags_aggregator.d.ts +85 -0
- package/dist/utils/text/skip_tags_aggregator.js +147 -0
- package/dist/utils/text/transforms/acronyms.d.ts +21 -0
- package/dist/utils/text/transforms/acronyms.js +31 -0
- package/dist/utils/text/transforms/currency.d.ts +16 -0
- package/dist/utils/text/transforms/currency.js +56 -0
- package/dist/utils/text/transforms/dates.d.ts +18 -0
- package/dist/utils/text/transforms/dates.js +102 -0
- package/dist/utils/text/transforms/email.d.ts +17 -0
- package/dist/utils/text/transforms/email.js +35 -0
- package/dist/utils/text/transforms/index.d.ts +37 -0
- package/dist/utils/text/transforms/index.js +42 -0
- package/dist/utils/text/transforms/numbers.d.ts +25 -0
- package/dist/utils/text/transforms/numbers.js +59 -0
- package/dist/utils/text/transforms/percentages.d.ts +16 -0
- package/dist/utils/text/transforms/percentages.js +32 -0
- package/dist/utils/text/transforms/phone.d.ts +21 -0
- package/dist/utils/text/transforms/phone.js +39 -0
- package/dist/utils/text/transforms/pronunciations.d.ts +65 -0
- package/dist/utils/text/transforms/pronunciations.js +112 -0
- package/dist/utils/text/transforms/replacements.d.ts +39 -0
- package/dist/utils/text/transforms/replacements.js +46 -0
- package/dist/utils/text/transforms/strip_markdown.d.ts +25 -0
- package/dist/utils/text/transforms/strip_markdown.js +60 -0
- package/dist/utils/text/transforms/units.d.ts +22 -0
- package/dist/utils/text/transforms/units.js +81 -0
- package/dist/utils/text/transforms/voice_formatter.d.ts +86 -0
- package/dist/utils/text/transforms/voice_formatter.js +98 -0
- package/dist/utils/text/unicode_digits.d.ts +3 -0
- package/dist/utils/text/unicode_digits.js +34 -0
- package/dist/utils/text/word_timestamp_utils.d.ts +26 -0
- package/dist/utils/text/word_timestamp_utils.js +52 -0
- package/dist/utils/time.d.ts +13 -0
- package/dist/utils/time.js +31 -0
- package/dist/utils/tracing/index.d.ts +3 -0
- package/dist/utils/tracing/index.js +8 -0
- package/dist/utils/tracing/service_attributes.d.ts +198 -0
- package/dist/utils/tracing/service_attributes.js +434 -0
- package/dist/utils/tracing/service_decorators.d.ts +214 -0
- package/dist/utils/tracing/service_decorators.js +1662 -0
- package/dist/utils/tracing/setup.d.ts +107 -0
- package/dist/utils/tracing/setup.js +160 -0
- package/dist/utils/tracing/tracing_context.d.ts +55 -0
- package/dist/utils/tracing/tracing_context.js +97 -0
- package/dist/utils/tracing/turn_trace_observer.d.ts +95 -0
- package/dist/utils/tracing/turn_trace_observer.js +233 -0
- package/dist/utils/types.d.ts +80 -0
- package/dist/utils/types.js +108 -0
- package/dist/utils/utils.d.ts +5 -0
- package/dist/utils/utils.js +22 -0
- package/dist/utils/yaml.d.ts +179 -0
- package/dist/utils/yaml.js +556 -0
- package/dist/version.d.ts +3 -0
- package/dist/version.js +7 -0
- package/dist/workers/base_worker.d.ts +772 -0
- package/dist/workers/base_worker.js +1298 -0
- package/dist/workers/index.d.ts +2 -0
- package/dist/workers/index.js +8 -0
- package/dist/workers/llm/backend_llm_worker.d.ts +552 -0
- package/dist/workers/llm/backend_llm_worker.js +1055 -0
- package/dist/workers/llm/index.d.ts +6 -0
- package/dist/workers/llm/index.js +11 -0
- package/dist/workers/llm/llm_context_worker.d.ts +66 -0
- package/dist/workers/llm/llm_context_worker.js +72 -0
- package/dist/workers/llm/llm_worker.d.ts +180 -0
- package/dist/workers/llm/llm_worker.js +323 -0
- package/dist/workers/llm/tool_decorator.d.ts +68 -0
- package/dist/workers/llm/tool_decorator.js +60 -0
- package/dist/workers/proxy/index.d.ts +3 -0
- package/dist/workers/proxy/index.js +9 -0
- package/dist/workers/proxy/websocket/client.d.ts +110 -0
- package/dist/workers/proxy/websocket/client.js +196 -0
- package/dist/workers/proxy/websocket/index.d.ts +3 -0
- package/dist/workers/proxy/websocket/index.js +10 -0
- package/dist/workers/runner.d.ts +268 -0
- package/dist/workers/runner.js +489 -0
- package/dist/workers/ui/index.d.ts +22 -0
- package/dist/workers/ui/index.js +27 -0
- package/dist/workers/ui/ui_event_decorator.d.ts +43 -0
- package/dist/workers/ui/ui_event_decorator.js +75 -0
- package/dist/workers/ui/ui_job_context.d.ts +12 -0
- package/dist/workers/ui/ui_job_context.js +17 -0
- package/dist/workers/ui/ui_prompts.d.ts +21 -0
- package/dist/workers/ui/ui_prompts.js +41 -0
- package/dist/workers/ui/ui_tools.d.ts +32 -0
- package/dist/workers/ui/ui_tools.js +112 -0
- package/dist/workers/ui/ui_worker.d.ts +571 -0
- package/dist/workers/ui/ui_worker.js +1156 -0
- package/package.json +61 -3
- package/README.md +0 -5
|
@@ -0,0 +1,509 @@
|
|
|
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/pipeline/service_switcher.py
|
|
6
|
+
/**
|
|
7
|
+
* Service switcher for switching between different services at runtime, with
|
|
8
|
+
* different switching strategies.
|
|
9
|
+
*/
|
|
10
|
+
import { ErrorFrame, ManuallySwitchServiceFrame, renewFrameIdentity, ServiceMetadataFrame, ServiceSwitcherFrame, ServiceSwitcherRequestMetadataFrame, ServiceUpdateSettingsFrame, } from "../frames/frames.js";
|
|
11
|
+
import { FunctionFilter } from "../processors/filters/function_filter.js";
|
|
12
|
+
import { FrameDirection } from "../processors/frame_processor.js";
|
|
13
|
+
import { BaseObject } from "../utils/base_object.js";
|
|
14
|
+
import { ErrorCategory } from "../utils/errors.js";
|
|
15
|
+
import { logger } from "../utils/logger.js";
|
|
16
|
+
import { ParallelPipeline } from "./parallel_pipeline.js";
|
|
17
|
+
/**
|
|
18
|
+
* Base class for service switching strategies.
|
|
19
|
+
*
|
|
20
|
+
* Note: strategy classes are instantiated internally by ServiceSwitcher.
|
|
21
|
+
* Developers should pass the strategy class (not an instance) to
|
|
22
|
+
* ServiceSwitcher.
|
|
23
|
+
*
|
|
24
|
+
* Event handlers available:
|
|
25
|
+
*
|
|
26
|
+
* - on_service_switched: called when the active service changes.
|
|
27
|
+
*
|
|
28
|
+
* @example
|
|
29
|
+
* strategy.eventHandler("on_service_switched", async (strategy, service) => { ... });
|
|
30
|
+
*/
|
|
31
|
+
export class ServiceSwitcherStrategy extends BaseObject {
|
|
32
|
+
_services;
|
|
33
|
+
_activeService;
|
|
34
|
+
/**
|
|
35
|
+
* Initialize the service switcher strategy with a list of services.
|
|
36
|
+
*
|
|
37
|
+
* Note: this is called internally by ServiceSwitcher. Do not instantiate
|
|
38
|
+
* directly.
|
|
39
|
+
*
|
|
40
|
+
* @param services List of frame processors to switch between.
|
|
41
|
+
*/
|
|
42
|
+
constructor(services) {
|
|
43
|
+
super();
|
|
44
|
+
if (services.length === 0) {
|
|
45
|
+
throw new Error("ServiceSwitcherStrategy needs at least one service");
|
|
46
|
+
}
|
|
47
|
+
this._services = services;
|
|
48
|
+
this._activeService = services[0];
|
|
49
|
+
this._registerEventHandler("on_service_switched");
|
|
50
|
+
}
|
|
51
|
+
/** The list of available services. */
|
|
52
|
+
get services() {
|
|
53
|
+
return this._services;
|
|
54
|
+
}
|
|
55
|
+
/** The currently active service. */
|
|
56
|
+
get activeService() {
|
|
57
|
+
return this._activeService;
|
|
58
|
+
}
|
|
59
|
+
/** The services that can still be given work, in order. */
|
|
60
|
+
get usableServices() {
|
|
61
|
+
return this._services.filter((service) => service.isUsable);
|
|
62
|
+
}
|
|
63
|
+
/**
|
|
64
|
+
* Handle a frame that controls service switching.
|
|
65
|
+
*
|
|
66
|
+
* The base implementation returns null for all frames. Subclasses override
|
|
67
|
+
* this to implement specific switching behaviors.
|
|
68
|
+
*
|
|
69
|
+
* @param frame The frame to handle.
|
|
70
|
+
* @param direction The direction of the frame (upstream or downstream).
|
|
71
|
+
* @returns The newly active service if a switch occurred, or null otherwise.
|
|
72
|
+
*/
|
|
73
|
+
async handleFrame(_frame, _direction) {
|
|
74
|
+
return null;
|
|
75
|
+
}
|
|
76
|
+
/**
|
|
77
|
+
* Handle an error from the active service.
|
|
78
|
+
*
|
|
79
|
+
* Called by `ServiceSwitcher` for every `ErrorFrame` the active service
|
|
80
|
+
* pushes upstream, whether or not the service can carry on from it.
|
|
81
|
+
* Subclasses override this to decide which errors are worth switching away
|
|
82
|
+
* from: `error.processor.isUsable` tells a service that is finished apart
|
|
83
|
+
* from one having a bad moment, and a subclass is free to switch on either.
|
|
84
|
+
*
|
|
85
|
+
* @param error The error frame pushed by the active service.
|
|
86
|
+
* @returns The newly active service if a switch occurred, or null otherwise.
|
|
87
|
+
*/
|
|
88
|
+
async handleError(_error) {
|
|
89
|
+
return null;
|
|
90
|
+
}
|
|
91
|
+
/**
|
|
92
|
+
* Set the active service to the given one, if it is in the list of
|
|
93
|
+
* available services.
|
|
94
|
+
*
|
|
95
|
+
* If it's not in the list, the request is ignored, as it may have been
|
|
96
|
+
* intended for another ServiceSwitcher in the pipeline. A service that can
|
|
97
|
+
* no longer do its job (`isUsable` false) is refused, since making it active
|
|
98
|
+
* would only route work to something that can't handle it; call
|
|
99
|
+
* `FrameProcessor.setUsable` on it first once whatever stopped it working
|
|
100
|
+
* has been dealt with.
|
|
101
|
+
*
|
|
102
|
+
* @param service The service to set as active.
|
|
103
|
+
* @returns The newly active service, or null if the service was not found
|
|
104
|
+
* or can no longer be given work.
|
|
105
|
+
*/
|
|
106
|
+
async _setActiveIfAvailable(service) {
|
|
107
|
+
if (!this.services.includes(service)) {
|
|
108
|
+
return null;
|
|
109
|
+
}
|
|
110
|
+
if (!service.isUsable) {
|
|
111
|
+
logger.warning(`Not switching to ${service.name}: it can no longer do its job`);
|
|
112
|
+
return null;
|
|
113
|
+
}
|
|
114
|
+
this._activeService = service;
|
|
115
|
+
await service.queueFrame(new ServiceSwitcherRequestMetadataFrame({ service }));
|
|
116
|
+
await this._callEventHandler("on_service_switched", service);
|
|
117
|
+
return service;
|
|
118
|
+
}
|
|
119
|
+
}
|
|
120
|
+
/**
|
|
121
|
+
* A strategy for switching between services manually.
|
|
122
|
+
*
|
|
123
|
+
* This strategy allows the user to manually select which service is active.
|
|
124
|
+
* The initial active service is the first one in the list.
|
|
125
|
+
*
|
|
126
|
+
* @example
|
|
127
|
+
* const sttSwitcher = new ServiceSwitcher([stt1, stt2], {
|
|
128
|
+
* strategyType: ServiceSwitcherStrategyManual,
|
|
129
|
+
* });
|
|
130
|
+
*/
|
|
131
|
+
export class ServiceSwitcherStrategyManual extends ServiceSwitcherStrategy {
|
|
132
|
+
/**
|
|
133
|
+
* Handle a frame that controls service switching.
|
|
134
|
+
*
|
|
135
|
+
* @param frame The frame to handle.
|
|
136
|
+
* @param direction The direction of the frame (upstream or downstream).
|
|
137
|
+
* @returns The newly active service if a switch occurred, or null otherwise.
|
|
138
|
+
*/
|
|
139
|
+
async handleFrame(frame, _direction) {
|
|
140
|
+
if (frame instanceof ManuallySwitchServiceFrame) {
|
|
141
|
+
return await this._setActiveIfAvailable(frame.service);
|
|
142
|
+
}
|
|
143
|
+
return null;
|
|
144
|
+
}
|
|
145
|
+
}
|
|
146
|
+
/**
|
|
147
|
+
* A strategy that automatically switches to a backup service on failure.
|
|
148
|
+
*
|
|
149
|
+
* This strategy switches when the active service reports an error that leaves
|
|
150
|
+
* it unable to do its job (`isUsable` false), moving to the next service in
|
|
151
|
+
* the list that can still do its own. Errors the service can carry on from are
|
|
152
|
+
* left alone, so a provider hiccup doesn't cost a failover. Recovery and
|
|
153
|
+
* fallback policies are left to application code via the
|
|
154
|
+
* `on_service_switched` event.
|
|
155
|
+
*
|
|
156
|
+
* Event handlers available:
|
|
157
|
+
*
|
|
158
|
+
* - on_service_switched: called when the active service changes.
|
|
159
|
+
*
|
|
160
|
+
* @example
|
|
161
|
+
* const switcher = new ServiceSwitcher([primaryStt, backupStt], {
|
|
162
|
+
* strategyType: ServiceSwitcherStrategyFailover,
|
|
163
|
+
* });
|
|
164
|
+
*
|
|
165
|
+
* switcher.strategy.eventHandler("on_service_switched", async (strategy, service) => {
|
|
166
|
+
* // App decides when/how to recover the failed service
|
|
167
|
+
* });
|
|
168
|
+
*/
|
|
169
|
+
export class ServiceSwitcherStrategyFailover extends ServiceSwitcherStrategyManual {
|
|
170
|
+
/**
|
|
171
|
+
* Handle an error from the active service by failing over.
|
|
172
|
+
*
|
|
173
|
+
* Only an error that leaves the service unable to do its job is worth a
|
|
174
|
+
* failover; anything it can carry on from is ignored. When one does,
|
|
175
|
+
* switches to the next service in the list that can still do its job,
|
|
176
|
+
* wrapping around from the end. The failed service stays in the list and can
|
|
177
|
+
* be switched back to once it has been brought back with
|
|
178
|
+
* `FrameProcessor.setUsable`.
|
|
179
|
+
*
|
|
180
|
+
* @param error The error frame pushed by the active service.
|
|
181
|
+
* @returns The newly active service if a switch occurred, or null if the
|
|
182
|
+
* error didn't warrant one or no other service can be given work.
|
|
183
|
+
*/
|
|
184
|
+
async handleError(error) {
|
|
185
|
+
const failedService = error.processor ?? this._activeService;
|
|
186
|
+
// The service is still working, so there is nothing to fail over from.
|
|
187
|
+
if (failedService.isUsable) {
|
|
188
|
+
return null;
|
|
189
|
+
}
|
|
190
|
+
logger.warning(`Service ${failedService.name} reported an error: ${error.error}`);
|
|
191
|
+
// Walk the list from the one after the active service so failover follows
|
|
192
|
+
// the order the services were given in.
|
|
193
|
+
const currentIdx = this._services.indexOf(this._activeService);
|
|
194
|
+
for (let offset = 1; offset < this._services.length; offset++) {
|
|
195
|
+
const candidate = this._services[(currentIdx + offset) % this._services.length];
|
|
196
|
+
if (candidate.isUsable) {
|
|
197
|
+
return await this._setActiveIfAvailable(candidate);
|
|
198
|
+
}
|
|
199
|
+
}
|
|
200
|
+
logger.error("No other service available to switch to");
|
|
201
|
+
return null;
|
|
202
|
+
}
|
|
203
|
+
}
|
|
204
|
+
// Upstream keeps a `deque(maxlen=64)`.
|
|
205
|
+
const INACTIVE_SERVICE_UPDATES_MAXLEN = 64;
|
|
206
|
+
/**
|
|
207
|
+
* Parallel pipeline that routes frames to one active service at a time.
|
|
208
|
+
*
|
|
209
|
+
* Wraps each service in a pair of filters that gate frame flow based on which
|
|
210
|
+
* service is currently active. Switching is controlled by
|
|
211
|
+
* `ServiceSwitcherFrame` frames and delegated to a pluggable
|
|
212
|
+
* `ServiceSwitcherStrategy`.
|
|
213
|
+
*
|
|
214
|
+
* `ServiceUpdateSettingsFrame` is the exception to the gating. A settings
|
|
215
|
+
* update addressed to a member service (`service`) reaches it whether or not
|
|
216
|
+
* it is active, and one marked `reachInactiveServices` reaches every member,
|
|
217
|
+
* so whichever service becomes active later is already configured. Any other
|
|
218
|
+
* settings update applies to the active service alone.
|
|
219
|
+
*
|
|
220
|
+
* @example
|
|
221
|
+
* const switcher = new ServiceSwitcher([stt1, stt2]);
|
|
222
|
+
*/
|
|
223
|
+
export class ServiceSwitcher extends ParallelPipeline {
|
|
224
|
+
_services;
|
|
225
|
+
_strategy;
|
|
226
|
+
// Ids of the settings updates handed to services that weren't active, so
|
|
227
|
+
// they can be consumed again on their way out. A small ring is enough: an
|
|
228
|
+
// update crosses its service long before the ring wraps.
|
|
229
|
+
_inactiveServiceUpdates = [];
|
|
230
|
+
// `isUsable` is read from the services, so keep the last value announced: a
|
|
231
|
+
// service changing its own doesn't always change the switcher's.
|
|
232
|
+
_announcedUsable;
|
|
233
|
+
/**
|
|
234
|
+
* Initialize the service switcher with a list of services and a switching strategy.
|
|
235
|
+
*
|
|
236
|
+
* @param services List of frame processors to switch between.
|
|
237
|
+
* @param options.strategyType The strategy class to use for switching
|
|
238
|
+
* between services. Defaults to `ServiceSwitcherStrategyManual`.
|
|
239
|
+
*/
|
|
240
|
+
constructor(services, options = {}) {
|
|
241
|
+
const strategyType = (options.strategyType ??
|
|
242
|
+
ServiceSwitcherStrategyManual);
|
|
243
|
+
const strategy = new strategyType(services);
|
|
244
|
+
super(...ServiceSwitcher._makePipelineDefinitions(services, strategy));
|
|
245
|
+
this._services = services;
|
|
246
|
+
this._strategy = strategy;
|
|
247
|
+
this._announcedUsable = this.isUsable;
|
|
248
|
+
for (const service of services) {
|
|
249
|
+
service.addEventHandler("on_usable_changed", (s, isUsable) => this._onServiceUsableChanged(s, isUsable));
|
|
250
|
+
}
|
|
251
|
+
}
|
|
252
|
+
/**
|
|
253
|
+
* Ignore an attempt to set this switcher's usability directly.
|
|
254
|
+
*
|
|
255
|
+
* A switcher has no usability of its own to set: what it reports is a
|
|
256
|
+
* reading of its services. Bring an individual service back with its own
|
|
257
|
+
* `FrameProcessor.setUsable`, which brings the switcher back with it.
|
|
258
|
+
*
|
|
259
|
+
* @param isUsable Whether the switcher can be given work. Ignored.
|
|
260
|
+
*/
|
|
261
|
+
async setUsable(isUsable) {
|
|
262
|
+
// Not calling super: it would set a flag this switcher never reads, and
|
|
263
|
+
// announce a change that didn't happen.
|
|
264
|
+
logger.debug(`${this}: ignoring set_usable(${isUsable}); a switcher reports whether any of ` +
|
|
265
|
+
"its services can be given work");
|
|
266
|
+
}
|
|
267
|
+
/**
|
|
268
|
+
* Announce this switcher's usability after a service changed its own.
|
|
269
|
+
*
|
|
270
|
+
* @param service The service whose usability changed.
|
|
271
|
+
* @param isUsable Whether that service can now be given work.
|
|
272
|
+
*/
|
|
273
|
+
async _onServiceUsableChanged(_service, _isUsable) {
|
|
274
|
+
await this._announceUsable();
|
|
275
|
+
}
|
|
276
|
+
/** Raise `on_usable_changed` if what this switcher reports has moved. */
|
|
277
|
+
async _announceUsable() {
|
|
278
|
+
const isUsable = this.isUsable;
|
|
279
|
+
if (isUsable === this._announcedUsable) {
|
|
280
|
+
return;
|
|
281
|
+
}
|
|
282
|
+
this._announcedUsable = isUsable;
|
|
283
|
+
logger.debug(`${this}: ${isUsable ? "usable" : "no longer usable"}`);
|
|
284
|
+
await this._callEventHandler("on_usable_changed", isUsable);
|
|
285
|
+
}
|
|
286
|
+
/** The active switching strategy. */
|
|
287
|
+
get strategy() {
|
|
288
|
+
return this._strategy;
|
|
289
|
+
}
|
|
290
|
+
/** The list of available services. */
|
|
291
|
+
get services() {
|
|
292
|
+
return this._services;
|
|
293
|
+
}
|
|
294
|
+
/**
|
|
295
|
+
* Whether any of the switched services can still be given work.
|
|
296
|
+
*
|
|
297
|
+
* A switcher is only as dead as its last service: it can keep doing its job
|
|
298
|
+
* by moving work to a different one, so it reports itself unusable only once
|
|
299
|
+
* none of them can do theirs. This is a reading of the services rather than
|
|
300
|
+
* a state of its own, so bringing a service back with
|
|
301
|
+
* `FrameProcessor.setUsable` brings the switcher back too, and calling that
|
|
302
|
+
* on the switcher itself does nothing. The switcher raises
|
|
303
|
+
* `on_usable_changed` for itself as the reading moves, so watching it is
|
|
304
|
+
* enough to hear about the services it holds.
|
|
305
|
+
*
|
|
306
|
+
* @returns True while at least one service can be given work.
|
|
307
|
+
*/
|
|
308
|
+
get isUsable() {
|
|
309
|
+
return (this._services ?? []).some((service) => service.isUsable);
|
|
310
|
+
}
|
|
311
|
+
static _makePipelineDefinitions(services, strategy) {
|
|
312
|
+
const pipelines = [];
|
|
313
|
+
for (const service of services) {
|
|
314
|
+
pipelines.push(ServiceSwitcher._makePipelineDefinition(service, strategy));
|
|
315
|
+
}
|
|
316
|
+
return pipelines;
|
|
317
|
+
}
|
|
318
|
+
static _makePipelineDefinition(service, strategy) {
|
|
319
|
+
const filter = async (_) => {
|
|
320
|
+
return service === strategy.activeService;
|
|
321
|
+
};
|
|
322
|
+
// Layout: Filter → Service → Filter
|
|
323
|
+
//
|
|
324
|
+
// filterSystemFrames: we want to run filter functions also on system
|
|
325
|
+
// frames.
|
|
326
|
+
//
|
|
327
|
+
// enableDirectMode: filter functions are quick so we don't need
|
|
328
|
+
// additional tasks.
|
|
329
|
+
return [
|
|
330
|
+
new FunctionFilter({
|
|
331
|
+
filter,
|
|
332
|
+
direction: FrameDirection.DOWNSTREAM,
|
|
333
|
+
filterSystemFrames: true,
|
|
334
|
+
enableDirectMode: true,
|
|
335
|
+
}),
|
|
336
|
+
service,
|
|
337
|
+
new FunctionFilter({
|
|
338
|
+
filter,
|
|
339
|
+
direction: FrameDirection.UPSTREAM,
|
|
340
|
+
filterSystemFrames: true,
|
|
341
|
+
enableDirectMode: true,
|
|
342
|
+
}),
|
|
343
|
+
];
|
|
344
|
+
}
|
|
345
|
+
/**
|
|
346
|
+
* Push a frame out of the service switcher.
|
|
347
|
+
*
|
|
348
|
+
* Suppresses `ServiceSwitcherRequestMetadataFrame` targeting the active
|
|
349
|
+
* service (since it has already been handled) and `ServiceMetadataFrame`
|
|
350
|
+
* from inactive services so only the active service's metadata reaches
|
|
351
|
+
* downstream processors. One case this happens is with `StartFrame` since
|
|
352
|
+
* all the filters let it pass, and `StartFrame` causes the service to
|
|
353
|
+
* generate `ServiceMetadataFrame`.
|
|
354
|
+
*
|
|
355
|
+
* Also suppresses the copies of a `ServiceUpdateSettingsFrame` handed to
|
|
356
|
+
* the inactive services, so that the update the rest of the pipeline sees
|
|
357
|
+
* is the one travelling the active service's branch.
|
|
358
|
+
*
|
|
359
|
+
* `ErrorFrame` instances from the services being switched between are
|
|
360
|
+
* answered for here rather than travelling on, since the rest of the
|
|
361
|
+
* pipeline deals with the switcher and not with what it holds. Errors from
|
|
362
|
+
* a service the switcher isn't using stop here outright. Every error from
|
|
363
|
+
* the active service is forwarded to the strategy via `handleError`, which
|
|
364
|
+
* decides whether it warrants a switch; a successful switch absorbs it, the
|
|
365
|
+
* switcher having gone on doing its job. An error that leaves the active
|
|
366
|
+
* service unable to do its job with no switch to be made is reported
|
|
367
|
+
* against the switcher, so that the rest of the pipeline judges it by what
|
|
368
|
+
* the switcher has left rather than by the one service that failed. Every
|
|
369
|
+
* other error travels upstream as usual.
|
|
370
|
+
*/
|
|
371
|
+
async pushFrame(frame, direction = FrameDirection.DOWNSTREAM) {
|
|
372
|
+
// Consume ServiceSwitcherRequestMetadataFrame once the targeted service
|
|
373
|
+
// has handled it (i.e. the active service).
|
|
374
|
+
if (frame instanceof ServiceSwitcherRequestMetadataFrame) {
|
|
375
|
+
if (frame.service === this.strategy.activeService) {
|
|
376
|
+
return;
|
|
377
|
+
}
|
|
378
|
+
}
|
|
379
|
+
// Only let metadata from the active service escape.
|
|
380
|
+
if (frame instanceof ServiceMetadataFrame) {
|
|
381
|
+
if (frame.serviceName !== this.strategy.activeService.name) {
|
|
382
|
+
return;
|
|
383
|
+
}
|
|
384
|
+
}
|
|
385
|
+
// Consume the settings updates handed to the inactive services: they have
|
|
386
|
+
// been delivered, and only the active service's copy travels on.
|
|
387
|
+
if (frame instanceof ServiceUpdateSettingsFrame) {
|
|
388
|
+
if (this._inactiveServiceUpdates.includes(frame.id)) {
|
|
389
|
+
return;
|
|
390
|
+
}
|
|
391
|
+
}
|
|
392
|
+
// Errors from the switched services are the switcher's to answer for.
|
|
393
|
+
// Errors from anywhere else are just passing through, and travel on.
|
|
394
|
+
if (frame instanceof ErrorFrame && frame.processor !== null) {
|
|
395
|
+
const failedService = frame.processor;
|
|
396
|
+
const activeService = this.strategy.activeService;
|
|
397
|
+
// A service the switcher isn't using can't stop it doing its job, so
|
|
398
|
+
// its errors go no further. Watch a service's own `on_usable_changed`
|
|
399
|
+
// to hear about the ones held in reserve.
|
|
400
|
+
if (this._services.includes(failedService) && failedService !== activeService) {
|
|
401
|
+
return;
|
|
402
|
+
}
|
|
403
|
+
if (failedService === activeService) {
|
|
404
|
+
// The strategy decides which errors are worth switching away from. A
|
|
405
|
+
// switch means the switcher recovered on its own, so the error goes no
|
|
406
|
+
// further.
|
|
407
|
+
if (await this.strategy.handleError(frame)) {
|
|
408
|
+
return;
|
|
409
|
+
}
|
|
410
|
+
// No switch was made. If the service can no longer work, the switcher
|
|
411
|
+
// has nowhere left to send the work, so it reports the failure as its
|
|
412
|
+
// own. Any other error travels upstream.
|
|
413
|
+
if (!failedService.isUsable) {
|
|
414
|
+
await this._reportServiceFailure(failedService, frame);
|
|
415
|
+
return;
|
|
416
|
+
}
|
|
417
|
+
}
|
|
418
|
+
}
|
|
419
|
+
await super.pushFrame(frame, direction);
|
|
420
|
+
}
|
|
421
|
+
/**
|
|
422
|
+
* Report a service failure the switcher could not switch away from.
|
|
423
|
+
*
|
|
424
|
+
* Re-attributes the error to the switcher, which is the processor the rest
|
|
425
|
+
* of the pipeline deals with. Whether losing this service matters depends
|
|
426
|
+
* on what the switcher has left, not on the service that just failed, so
|
|
427
|
+
* `isUsable` on the reported error answers for the switcher as a whole.
|
|
428
|
+
*
|
|
429
|
+
* @param failedService The service that can no longer do its job.
|
|
430
|
+
* @param error The error it reported.
|
|
431
|
+
*/
|
|
432
|
+
async _reportServiceFailure(failedService, error) {
|
|
433
|
+
await this.pushError(`${failedService.name} can no longer do its job: ${error.error}`, {
|
|
434
|
+
exception: error.exception,
|
|
435
|
+
// A permanent category would cost the switcher its own `isUsable`,
|
|
436
|
+
// writing it off along with the one service that failed.
|
|
437
|
+
category: ErrorCategory.UNKNOWN,
|
|
438
|
+
});
|
|
439
|
+
}
|
|
440
|
+
/**
|
|
441
|
+
* Process a frame, handling frames which affect service switching.
|
|
442
|
+
*
|
|
443
|
+
* @param frame The frame to process.
|
|
444
|
+
* @param direction The direction of the frame (upstream or downstream).
|
|
445
|
+
*/
|
|
446
|
+
async processFrame(frame, direction) {
|
|
447
|
+
if (frame instanceof ServiceSwitcherFrame) {
|
|
448
|
+
const service = await this.strategy.handleFrame(frame, direction);
|
|
449
|
+
// If we don't switch to a new service we need to keep processing the
|
|
450
|
+
// frame. If we switched, we just swallow the frame.
|
|
451
|
+
if (!service) {
|
|
452
|
+
await super.processFrame(frame, direction);
|
|
453
|
+
}
|
|
454
|
+
}
|
|
455
|
+
else {
|
|
456
|
+
await super.processFrame(frame, direction);
|
|
457
|
+
if (frame instanceof ServiceUpdateSettingsFrame) {
|
|
458
|
+
await this._updateInactiveServices(frame, direction);
|
|
459
|
+
}
|
|
460
|
+
}
|
|
461
|
+
}
|
|
462
|
+
/**
|
|
463
|
+
* Hand a settings update to the member services that aren't active.
|
|
464
|
+
*
|
|
465
|
+
* The active service receives the update through its branch like any other
|
|
466
|
+
* frame. The inactive ones sit behind closed filters, so each is handed its
|
|
467
|
+
* own copy directly.
|
|
468
|
+
*
|
|
469
|
+
* @param frame The settings update to hand over.
|
|
470
|
+
* @param direction The direction the settings update is travelling.
|
|
471
|
+
*/
|
|
472
|
+
async _updateInactiveServices(frame, direction) {
|
|
473
|
+
for (const service of this._inactiveUpdateTargets(frame)) {
|
|
474
|
+
// A copy carries the same update with an id of its own, which is how
|
|
475
|
+
// pushFrame tells it from the active service's.
|
|
476
|
+
const update = copyFrame(frame);
|
|
477
|
+
this._inactiveServiceUpdates.push(update.id);
|
|
478
|
+
if (this._inactiveServiceUpdates.length > INACTIVE_SERVICE_UPDATES_MAXLEN) {
|
|
479
|
+
this._inactiveServiceUpdates.shift();
|
|
480
|
+
}
|
|
481
|
+
await service.queueFrame(update, direction);
|
|
482
|
+
}
|
|
483
|
+
}
|
|
484
|
+
/**
|
|
485
|
+
* Return the inactive member services that should apply a settings update.
|
|
486
|
+
*
|
|
487
|
+
* @param frame The settings update to route.
|
|
488
|
+
* @returns The services to hand the update to, which may be empty.
|
|
489
|
+
*/
|
|
490
|
+
_inactiveUpdateTargets(frame) {
|
|
491
|
+
const inactive = this.services.filter((s) => s !== this.strategy.activeService);
|
|
492
|
+
// An addressed update goes to its service alone, active or not. One
|
|
493
|
+
// addressed elsewhere in the pipeline is left for the switcher that
|
|
494
|
+
// manages it.
|
|
495
|
+
if (frame.service !== null) {
|
|
496
|
+
return inactive.includes(frame.service) ? [frame.service] : [];
|
|
497
|
+
}
|
|
498
|
+
// Any other update crosses to the inactive services only if it opts in,
|
|
499
|
+
// since settings values are often specific to one provider.
|
|
500
|
+
return frame.reachInactiveServices ? inactive : [];
|
|
501
|
+
}
|
|
502
|
+
}
|
|
503
|
+
/** `dataclasses.replace(frame)`: a shallow copy with a fresh `id` and `name`. */
|
|
504
|
+
function copyFrame(frame) {
|
|
505
|
+
const clone = Object.assign(Object.create(Object.getPrototypeOf(frame)), frame);
|
|
506
|
+
renewFrameIdentity(clone);
|
|
507
|
+
return clone;
|
|
508
|
+
}
|
|
509
|
+
//# sourceMappingURL=service_switcher.js.map
|