@kuralle-syrinx/server-websocket 4.4.1 → 4.5.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 (132) hide show
  1. package/dist/backchannel-cue-fixtures.d.ts +4 -0
  2. package/dist/backchannel-cue-fixtures.d.ts.map +1 -0
  3. package/dist/backchannel-cue-fixtures.js +25 -0
  4. package/dist/backchannel-cue-fixtures.js.map +1 -0
  5. package/dist/background-audio.d.ts +59 -0
  6. package/dist/background-audio.d.ts.map +1 -0
  7. package/dist/background-audio.js +248 -0
  8. package/dist/background-audio.js.map +1 -0
  9. package/dist/browser-opus.d.ts +12 -0
  10. package/dist/browser-opus.d.ts.map +1 -0
  11. package/dist/browser-opus.js +48 -0
  12. package/dist/browser-opus.js.map +1 -0
  13. package/dist/carrier-commands.d.ts +124 -0
  14. package/dist/carrier-commands.d.ts.map +1 -0
  15. package/dist/carrier-commands.js +193 -0
  16. package/dist/carrier-commands.js.map +1 -0
  17. package/dist/edge-telnyx.d.ts +37 -0
  18. package/dist/edge-telnyx.d.ts.map +1 -0
  19. package/dist/edge-telnyx.js +320 -0
  20. package/dist/edge-telnyx.js.map +1 -0
  21. package/dist/edge-twilio.d.ts +31 -0
  22. package/dist/edge-twilio.d.ts.map +1 -0
  23. package/dist/edge-twilio.js +286 -0
  24. package/dist/edge-twilio.js.map +1 -0
  25. package/dist/edge.d.ts +71 -0
  26. package/dist/edge.d.ts.map +1 -0
  27. package/dist/edge.js +560 -0
  28. package/dist/edge.js.map +1 -0
  29. package/dist/inbound-audio.d.ts +13 -0
  30. package/dist/inbound-audio.d.ts.map +1 -0
  31. package/dist/inbound-audio.js +66 -0
  32. package/dist/inbound-audio.js.map +1 -0
  33. package/dist/index.d.ts +81 -0
  34. package/dist/index.d.ts.map +1 -0
  35. package/dist/index.js +718 -0
  36. package/dist/index.js.map +1 -0
  37. package/dist/json-message.d.ts +7 -0
  38. package/dist/json-message.d.ts.map +1 -0
  39. package/dist/json-message.js +41 -0
  40. package/dist/json-message.js.map +1 -0
  41. package/dist/outbound-playout-pipeline.d.ts +53 -0
  42. package/dist/outbound-playout-pipeline.d.ts.map +1 -0
  43. package/dist/outbound-playout-pipeline.js +148 -0
  44. package/dist/outbound-playout-pipeline.js.map +1 -0
  45. package/dist/paced-playout.d.ts +42 -0
  46. package/dist/paced-playout.d.ts.map +1 -0
  47. package/dist/paced-playout.js +151 -0
  48. package/dist/paced-playout.js.map +1 -0
  49. package/dist/playout-progress.d.ts +26 -0
  50. package/dist/playout-progress.d.ts.map +1 -0
  51. package/dist/playout-progress.js +64 -0
  52. package/dist/playout-progress.js.map +1 -0
  53. package/dist/session-store.d.ts +39 -0
  54. package/dist/session-store.d.ts.map +1 -0
  55. package/dist/session-store.js +80 -0
  56. package/dist/session-store.js.map +1 -0
  57. package/dist/smartpbx.d.ts +47 -0
  58. package/dist/smartpbx.d.ts.map +1 -0
  59. package/dist/smartpbx.js +437 -0
  60. package/dist/smartpbx.js.map +1 -0
  61. package/dist/telnyx-codec.d.ts +41 -0
  62. package/dist/telnyx-codec.d.ts.map +1 -0
  63. package/dist/telnyx-codec.js +114 -0
  64. package/dist/telnyx-codec.js.map +1 -0
  65. package/dist/telnyx.d.ts +52 -0
  66. package/dist/telnyx.d.ts.map +1 -0
  67. package/dist/telnyx.js +550 -0
  68. package/dist/telnyx.js.map +1 -0
  69. package/dist/test-helpers.d.ts +20 -0
  70. package/dist/test-helpers.d.ts.map +1 -0
  71. package/dist/test-helpers.js +242 -0
  72. package/dist/test-helpers.js.map +1 -0
  73. package/dist/transport-helpers.d.ts +12 -0
  74. package/dist/transport-helpers.d.ts.map +1 -0
  75. package/dist/transport-helpers.js +90 -0
  76. package/dist/transport-helpers.js.map +1 -0
  77. package/dist/transport-host.d.ts +56 -0
  78. package/dist/transport-host.d.ts.map +1 -0
  79. package/dist/transport-host.js +110 -0
  80. package/dist/transport-host.js.map +1 -0
  81. package/dist/turn-metrics.d.ts +79 -0
  82. package/dist/turn-metrics.d.ts.map +1 -0
  83. package/dist/turn-metrics.js +208 -0
  84. package/dist/turn-metrics.js.map +1 -0
  85. package/dist/twilio-auth.d.ts +12 -0
  86. package/dist/twilio-auth.d.ts.map +1 -0
  87. package/dist/twilio-auth.js +44 -0
  88. package/dist/twilio-auth.js.map +1 -0
  89. package/dist/twilio.d.ts +56 -0
  90. package/dist/twilio.d.ts.map +1 -0
  91. package/dist/twilio.js +511 -0
  92. package/dist/twilio.js.map +1 -0
  93. package/dist/websocket-close.d.ts +12 -0
  94. package/dist/websocket-close.d.ts.map +1 -0
  95. package/dist/websocket-close.js +58 -0
  96. package/dist/websocket-close.js.map +1 -0
  97. package/dist/websocket-lifecycle.d.ts +29 -0
  98. package/dist/websocket-lifecycle.d.ts.map +1 -0
  99. package/dist/websocket-lifecycle.js +87 -0
  100. package/dist/websocket-lifecycle.js.map +1 -0
  101. package/dist/websocket-upgrade.d.ts +9 -0
  102. package/dist/websocket-upgrade.d.ts.map +1 -0
  103. package/dist/websocket-upgrade.js +91 -0
  104. package/dist/websocket-upgrade.js.map +1 -0
  105. package/dist/wire-carrier-control.d.ts +27 -0
  106. package/dist/wire-carrier-control.d.ts.map +1 -0
  107. package/dist/wire-carrier-control.js +116 -0
  108. package/dist/wire-carrier-control.js.map +1 -0
  109. package/package.json +32 -11
  110. package/src/admission-control.test.ts +270 -0
  111. package/src/background-audio.test.ts +224 -0
  112. package/src/browser-opus.test.ts +41 -0
  113. package/src/browser-pacing.test.ts +440 -0
  114. package/src/carrier-commands.test.ts +198 -0
  115. package/src/edge-telnyx.test.ts +333 -0
  116. package/src/edge-twilio.test.ts +293 -0
  117. package/src/edge.test.ts +727 -0
  118. package/src/graceful-drain.test.ts +306 -0
  119. package/src/inbound-audio.test.ts +58 -0
  120. package/src/index.test.ts +2078 -0
  121. package/src/outbound-playout-pipeline.test.ts +314 -0
  122. package/src/paced-playout.test.ts +247 -0
  123. package/src/playout-progress.test.ts +56 -0
  124. package/src/session-store.test.ts +274 -0
  125. package/src/smartpbx.test.ts +986 -0
  126. package/src/telnyx.test.ts +1633 -0
  127. package/src/transport-host.test.ts +51 -0
  128. package/src/turn-metrics.test.ts +503 -0
  129. package/src/twilio-auth.test.ts +36 -0
  130. package/src/twilio.test.ts +1274 -0
  131. package/src/websocket-close.test.ts +63 -0
  132. package/src/websocket-lifecycle.test.ts +49 -0
@@ -0,0 +1,66 @@
1
+ // SPDX-License-Identifier: MIT
2
+ import { SYRINX_AUDIO_ENVELOPE_NAME, decodeSyrinxAudioEnvelope, hasSyrinxAudioEnvelope, } from "@kuralle-syrinx/core";
3
+ import { pcm16BytesToSamples, pcm16SamplesToBytes, resamplePcm16Streaming, } from "@kuralle-syrinx/core/audio";
4
+ export function socketDataToBytes(data) {
5
+ if (typeof data === "string")
6
+ return new TextEncoder().encode(data);
7
+ return data;
8
+ }
9
+ export function decodeInboundBinaryAudio(data, defaultSampleRateHz, rawBinaryInput, engineInputSampleRateHz, streamingResamplers, decodeOpusIngress) {
10
+ if (!hasSyrinxAudioEnvelope(data)) {
11
+ if (!rawBinaryInput) {
12
+ throw new Error(`Raw binary websocket audio is disabled; use ${SYRINX_AUDIO_ENVELOPE_NAME} or JSON audio frames`);
13
+ }
14
+ return { sampleRateHz: defaultSampleRateHz, audio: data };
15
+ }
16
+ const { header, audio } = decodeSyrinxAudioEnvelope(data);
17
+ const sampleRateHz = requirePositiveIntegerFromHeader(header.sampleRateHz) ?? defaultSampleRateHz;
18
+ const isOpus = header.encoding === "opus";
19
+ const wireAudio = isOpus
20
+ ? decodeOpusIngressMessage(audio, sampleRateHz, decodeOpusIngress, engineInputSampleRateHz, streamingResamplers)
21
+ : audio;
22
+ // Opus ingress is decoded AND resampled to the engine rate inside
23
+ // decodeOpusIngressMessage, so the returned PCM is already at engineInputSampleRateHz.
24
+ // Report that as its rate — reporting the 48 kHz *header* rate made the caller
25
+ // resample the already-16 kHz audio a second time, delivering ~1/3 the samples
26
+ // (3× sped-up audio → STT garbage). PCM carries its true header source rate.
27
+ const effectiveSampleRateHz = isOpus ? engineInputSampleRateHz : sampleRateHz;
28
+ return {
29
+ contextId: typeof header.contextId === "string" && header.contextId.length > 0 ? header.contextId : undefined,
30
+ sampleRateHz: effectiveSampleRateHz,
31
+ sequence: header.sequence,
32
+ audio: wireAudio,
33
+ };
34
+ }
35
+ function decodeOpusIngressMessage(wire, sampleRateHz, decodeOpusIngress, engineInputSampleRateHz, streamingResamplers) {
36
+ if (!decodeOpusIngress)
37
+ throw new Error("Browser websocket opus ingress is not initialized");
38
+ const pcm = decodeOpusIngress(wire, sampleRateHz);
39
+ if (sampleRateHz === engineInputSampleRateHz)
40
+ return pcm;
41
+ const samples = pcm16BytesToSamples(pcm);
42
+ return pcm16SamplesToBytes(resamplePcm16Streaming(streamingResamplers, samples, sampleRateHz, engineInputSampleRateHz));
43
+ }
44
+ export function rememberContextSampleRate(contextSampleRates, contextId, sampleRateHz) {
45
+ const existing = contextSampleRates.get(contextId);
46
+ if (existing !== undefined && existing !== sampleRateHz) {
47
+ throw new Error(`Websocket audio sampleRateHz changed within context ${contextId}: ${existing} -> ${sampleRateHz}`);
48
+ }
49
+ contextSampleRates.set(contextId, sampleRateHz);
50
+ }
51
+ export function resampleAudioBytes(audio, sourceSampleRateHz, targetSampleRateHz, streamingResamplers) {
52
+ if (audio.byteLength % 2 !== 0) {
53
+ throw new Error("PCM16 audio payload must contain an even number of bytes");
54
+ }
55
+ if (sourceSampleRateHz === targetSampleRateHz)
56
+ return audio;
57
+ const samples = pcm16BytesToSamples(audio);
58
+ const resampled = resamplePcm16Streaming(streamingResamplers, samples, sourceSampleRateHz, targetSampleRateHz);
59
+ return pcm16SamplesToBytes(resampled);
60
+ }
61
+ function requirePositiveIntegerFromHeader(value) {
62
+ if (typeof value !== "number" || !Number.isInteger(value) || value <= 0)
63
+ return null;
64
+ return value;
65
+ }
66
+ //# sourceMappingURL=inbound-audio.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"inbound-audio.js","sourceRoot":"","sources":["../src/inbound-audio.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,81 @@
1
+ import type { IncomingMessage } from "node:http";
2
+ import { type Server as HttpServer } from "node:http";
3
+ import { WebSocketServer } from "ws";
4
+ import { type VoiceAgentSession } from "@kuralle-syrinx/core";
5
+ import { type GracefulCloseOptions } from "./transport-host.js";
6
+ import { type BackgroundAudioConfig } from "./background-audio.js";
7
+ import { type SessionStore } from "./session-store.js";
8
+ export * from "./twilio.js";
9
+ export * from "./telnyx.js";
10
+ export * from "./smartpbx.js";
11
+ export * from "./session-store.js";
12
+ export { validateTwilioSignature } from "./twilio-auth.js";
13
+ export { buildTwilioSendDigits, buildTelnyxSendDtmf, buildTwilioTransfer, buildTelnyxTransfer, dispatchTwilioCommand, dispatchTelnyxCommand, resolveTransferSummary, type TwilioSendDigitsCommand, type TelnyxSendDtmfCommand, type TwilioTransferCommand, type TelnyxTransferCommand, type TwilioRestCredentials, type TelnyxRestCredentials, type WarmTransferSummarizer, type FetchLike, } from "./carrier-commands.js";
14
+ export { wireCarrierControl, type CarrierControlOptions } from "./wire-carrier-control.js";
15
+ export { BackgroundAudioMixer, wireBackgroundThinking, wireBackgroundBackchannel, wireBackgroundAudio, type BackgroundAudioConfig, type BackgroundAudioSource, } from "./background-audio.js";
16
+ export { buildPlaceholderBackchannelCues } from "./backchannel-cue-fixtures.js";
17
+ export { installGracefulShutdown, type GracefulClosable } from "./websocket-lifecycle.js";
18
+ export interface VoiceWebSocketServerOptions {
19
+ readonly server?: HttpServer;
20
+ readonly port?: number;
21
+ readonly host?: string;
22
+ readonly path?: string;
23
+ readonly createSession: (request: IncomingMessage) => VoiceAgentSession | Promise<VoiceAgentSession>;
24
+ /** Explicit resolver for the session identity; when set, it takes precedence over the request query. */
25
+ readonly sessionId?: (request: IncomingMessage) => string;
26
+ readonly contextId?: () => string;
27
+ readonly inputSampleRateHz?: number;
28
+ readonly outputSampleRateHz?: number;
29
+ readonly heartbeatIntervalMs?: number;
30
+ readonly startupTimeoutMs?: number;
31
+ readonly maxSessionDurationMs?: number;
32
+ readonly maxBufferedAmountBytes?: number;
33
+ readonly maxInboundMessageBytes?: number;
34
+ readonly resumeWindowMs?: number;
35
+ readonly outboundFrameDurationMs?: number;
36
+ readonly maxQueuedOutputAudioMs?: number;
37
+ /**
38
+ * Raw binary inbound PCM16 lacks turn, sample-rate, sequence, and duration
39
+ * metadata. Keep disabled for production clients; use JSON audio frames or
40
+ * the Syrinx binary envelope instead. Set true only for explicitly managed
41
+ * legacy/embedded clients that send PCM at `inputSampleRateHz`.
42
+ */
43
+ readonly rawBinaryInput?: boolean;
44
+ /**
45
+ * Assistant audio binary frames are wrapped in the Syrinx binary audio
46
+ * envelope by default. Set false only for raw-PCM websocket clients.
47
+ * Inbound binary frames may use the envelope regardless.
48
+ */
49
+ readonly binaryAudioEnvelope?: boolean;
50
+ /**
51
+ * When true (default), outbound browser assistant audio is Opus inside the Syrinx
52
+ * envelope. Set false only for tests or legacy clients that require PCM envelopes.
53
+ */
54
+ readonly browserOpusDownlink?: boolean;
55
+ /**
56
+ * Ambient/thinking bed mixed (ducked) under assistant speech. No idle bed is
57
+ * sent between turns on the browser path — a web client can loop ambience
58
+ * locally; the server-side idle bed exists for telephony wires.
59
+ */
60
+ readonly backgroundAudio?: BackgroundAudioConfig;
61
+ readonly sessionStore?: SessionStore;
62
+ readonly maxConcurrentSessions?: number;
63
+ readonly maxConcurrentSessionsScope?: "path" | "server";
64
+ readonly onTransportMetric?: (name: string) => void;
65
+ /**
66
+ * Authorize each inbound `/ws` upgrade (shared secret / bearer / signature).
67
+ * Return false or throw to reject with 4401. Unset = OPEN — voice endpoints are
68
+ * unauthenticated by default and each connection incurs provider cost and can
69
+ * attach to a live session; set this before exposing the endpoint publicly.
70
+ */
71
+ readonly authorize?: (request: import("node:http").IncomingMessage) => boolean | Promise<boolean>;
72
+ }
73
+ export type { GracefulCloseOptions } from "./transport-host.js";
74
+ export interface VoiceWebSocketServer {
75
+ readonly httpServer: HttpServer;
76
+ readonly wsServer: WebSocketServer;
77
+ address(): ReturnType<HttpServer["address"]>;
78
+ close(opts?: GracefulCloseOptions): Promise<void>;
79
+ }
80
+ export declare function createVoiceWebSocketServer(options: VoiceWebSocketServerOptions): Promise<VoiceWebSocketServer>;
81
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"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"}