@memberjunction/telephony-adapters 0.0.0 → 6.1.0-edge.7

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 (115) hide show
  1. package/LICENSE +183 -0
  2. package/dist/index.d.ts +33 -0
  3. package/dist/index.d.ts.map +1 -0
  4. package/dist/index.js +83 -0
  5. package/dist/index.js.map +1 -0
  6. package/dist/resolvers/RingCentralTelephonyResolver.d.ts +20 -0
  7. package/dist/resolvers/RingCentralTelephonyResolver.d.ts.map +1 -0
  8. package/dist/resolvers/RingCentralTelephonyResolver.js +83 -0
  9. package/dist/resolvers/RingCentralTelephonyResolver.js.map +1 -0
  10. package/dist/resolvers/TeamsMeetingsResolver.d.ts +21 -0
  11. package/dist/resolvers/TeamsMeetingsResolver.d.ts.map +1 -0
  12. package/dist/resolvers/TeamsMeetingsResolver.js +87 -0
  13. package/dist/resolvers/TeamsMeetingsResolver.js.map +1 -0
  14. package/dist/resolvers/TelephonyResolver.d.ts +20 -0
  15. package/dist/resolvers/TelephonyResolver.d.ts.map +1 -0
  16. package/dist/resolvers/TelephonyResolver.js +83 -0
  17. package/dist/resolvers/TelephonyResolver.js.map +1 -0
  18. package/dist/resolvers/VonageTelephonyResolver.d.ts +20 -0
  19. package/dist/resolvers/VonageTelephonyResolver.d.ts.map +1 -0
  20. package/dist/resolvers/VonageTelephonyResolver.js +83 -0
  21. package/dist/resolvers/VonageTelephonyResolver.js.map +1 -0
  22. package/dist/resolvers/index.d.ts +10 -0
  23. package/dist/resolvers/index.d.ts.map +1 -0
  24. package/dist/resolvers/index.js +10 -0
  25. package/dist/resolvers/index.js.map +1 -0
  26. package/dist/server-extensions/RingCentralTelephonyExtension.d.ts +14 -0
  27. package/dist/server-extensions/RingCentralTelephonyExtension.d.ts.map +1 -0
  28. package/dist/server-extensions/RingCentralTelephonyExtension.js +81 -0
  29. package/dist/server-extensions/RingCentralTelephonyExtension.js.map +1 -0
  30. package/dist/server-extensions/TeamsMeetingsExtension.d.ts +17 -0
  31. package/dist/server-extensions/TeamsMeetingsExtension.d.ts.map +1 -0
  32. package/dist/server-extensions/TeamsMeetingsExtension.js +109 -0
  33. package/dist/server-extensions/TeamsMeetingsExtension.js.map +1 -0
  34. package/dist/server-extensions/TwilioTelephonyExtension.d.ts +14 -0
  35. package/dist/server-extensions/TwilioTelephonyExtension.d.ts.map +1 -0
  36. package/dist/server-extensions/TwilioTelephonyExtension.js +88 -0
  37. package/dist/server-extensions/TwilioTelephonyExtension.js.map +1 -0
  38. package/dist/server-extensions/VonageTelephonyExtension.d.ts +14 -0
  39. package/dist/server-extensions/VonageTelephonyExtension.d.ts.map +1 -0
  40. package/dist/server-extensions/VonageTelephonyExtension.js +89 -0
  41. package/dist/server-extensions/VonageTelephonyExtension.js.map +1 -0
  42. package/dist/sessionManager.d.ts +26 -0
  43. package/dist/sessionManager.d.ts.map +1 -0
  44. package/dist/sessionManager.js +38 -0
  45. package/dist/sessionManager.js.map +1 -0
  46. package/dist/telephony/RingCentralTelephonyService.d.ts +79 -0
  47. package/dist/telephony/RingCentralTelephonyService.d.ts.map +1 -0
  48. package/dist/telephony/RingCentralTelephonyService.js +225 -0
  49. package/dist/telephony/RingCentralTelephonyService.js.map +1 -0
  50. package/dist/telephony/TeamsMeetingsRouter.d.ts +21 -0
  51. package/dist/telephony/TeamsMeetingsRouter.d.ts.map +1 -0
  52. package/dist/telephony/TeamsMeetingsRouter.js +84 -0
  53. package/dist/telephony/TeamsMeetingsRouter.js.map +1 -0
  54. package/dist/telephony/TeamsMeetingsService.d.ts +76 -0
  55. package/dist/telephony/TeamsMeetingsService.d.ts.map +1 -0
  56. package/dist/telephony/TeamsMeetingsService.js +157 -0
  57. package/dist/telephony/TeamsMeetingsService.js.map +1 -0
  58. package/dist/telephony/TwilioTelephonyRouter.d.ts +30 -0
  59. package/dist/telephony/TwilioTelephonyRouter.d.ts.map +1 -0
  60. package/dist/telephony/TwilioTelephonyRouter.js +137 -0
  61. package/dist/telephony/TwilioTelephonyRouter.js.map +1 -0
  62. package/dist/telephony/TwilioTelephonyService.d.ts +91 -0
  63. package/dist/telephony/TwilioTelephonyService.d.ts.map +1 -0
  64. package/dist/telephony/TwilioTelephonyService.js +191 -0
  65. package/dist/telephony/TwilioTelephonyService.js.map +1 -0
  66. package/dist/telephony/VonageTelephonyRouter.d.ts +24 -0
  67. package/dist/telephony/VonageTelephonyRouter.d.ts.map +1 -0
  68. package/dist/telephony/VonageTelephonyRouter.js +175 -0
  69. package/dist/telephony/VonageTelephonyRouter.js.map +1 -0
  70. package/dist/telephony/VonageTelephonyService.d.ts +62 -0
  71. package/dist/telephony/VonageTelephonyService.d.ts.map +1 -0
  72. package/dist/telephony/VonageTelephonyService.js +162 -0
  73. package/dist/telephony/VonageTelephonyService.js.map +1 -0
  74. package/dist/telephony/calendar-scheduler.d.ts +41 -0
  75. package/dist/telephony/calendar-scheduler.d.ts.map +1 -0
  76. package/dist/telephony/calendar-scheduler.js +98 -0
  77. package/dist/telephony/calendar-scheduler.js.map +1 -0
  78. package/dist/telephony/index.d.ts +21 -0
  79. package/dist/telephony/index.d.ts.map +1 -0
  80. package/dist/telephony/index.js +26 -0
  81. package/dist/telephony/index.js.map +1 -0
  82. package/dist/telephony/ringcentral-runtime.d.ts +11 -0
  83. package/dist/telephony/ringcentral-runtime.d.ts.map +1 -0
  84. package/dist/telephony/ringcentral-runtime.js +20 -0
  85. package/dist/telephony/ringcentral-runtime.js.map +1 -0
  86. package/dist/telephony/teams-meetings-runtime.d.ts +11 -0
  87. package/dist/telephony/teams-meetings-runtime.d.ts.map +1 -0
  88. package/dist/telephony/teams-meetings-runtime.js +20 -0
  89. package/dist/telephony/teams-meetings-runtime.js.map +1 -0
  90. package/dist/telephony/teamsAcsMediaRegistry.d.ts +35 -0
  91. package/dist/telephony/teamsAcsMediaRegistry.d.ts.map +1 -0
  92. package/dist/telephony/teamsAcsMediaRegistry.js +86 -0
  93. package/dist/telephony/teamsAcsMediaRegistry.js.map +1 -0
  94. package/dist/telephony/telephony-runtime.d.ts +14 -0
  95. package/dist/telephony/telephony-runtime.d.ts.map +1 -0
  96. package/dist/telephony/telephony-runtime.js +23 -0
  97. package/dist/telephony/telephony-runtime.js.map +1 -0
  98. package/dist/telephony/twilioMediaRegistry.d.ts +60 -0
  99. package/dist/telephony/twilioMediaRegistry.d.ts.map +1 -0
  100. package/dist/telephony/twilioMediaRegistry.js +109 -0
  101. package/dist/telephony/twilioMediaRegistry.js.map +1 -0
  102. package/dist/telephony/vonage-runtime.d.ts +11 -0
  103. package/dist/telephony/vonage-runtime.d.ts.map +1 -0
  104. package/dist/telephony/vonage-runtime.js +20 -0
  105. package/dist/telephony/vonage-runtime.js.map +1 -0
  106. package/dist/telephony/vonageMediaRegistry.d.ts +38 -0
  107. package/dist/telephony/vonageMediaRegistry.d.ts.map +1 -0
  108. package/dist/telephony/vonageMediaRegistry.js +113 -0
  109. package/dist/telephony/vonageMediaRegistry.js.map +1 -0
  110. package/dist/types.d.ts +123 -0
  111. package/dist/types.d.ts.map +1 -0
  112. package/dist/types.js +27 -0
  113. package/dist/types.js.map +1 -0
  114. package/package.json +48 -8
  115. package/README.md +0 -45
@@ -0,0 +1,113 @@
1
+ /**
2
+ * @fileoverview Per-call WebSocket-media pump registry for the Vonage telephony ingress.
3
+ *
4
+ * @module @memberjunction/telephony-adapters
5
+ */
6
+ /**
7
+ * The exact byte size of one outbound audio frame Vonage expects on the `audio/l16;rate=8000` leg: a
8
+ * 20 ms slice = 8000 Hz × 0.020 s = 160 samples × 2 bytes = **320 bytes**.
9
+ */
10
+ const OUTBOUND_FRAME_BYTES = 320;
11
+ /**
12
+ * Coordinates Vonage media websockets with the bridge bindings, keyed by call UUID.
13
+ */
14
+ export class VonageCallMediaRegistry {
15
+ constructor() {
16
+ this.channels = new Map();
17
+ }
18
+ /** Ensures a channel exists for a call (called when a bridge session for the call starts). */
19
+ RegisterCall(callUuid) {
20
+ this.ensureChannel(callUuid);
21
+ }
22
+ // ── IVonageMediaPump ─────────────────────────────────────────────────────────
23
+ SendAudio(callUuid, pcm) {
24
+ const channel = this.ensureChannel(callUuid);
25
+ const incoming = new Uint8Array(pcm);
26
+ const data = channel.partial.length > 0 ? concatBytes(channel.partial, incoming) : incoming;
27
+ let offset = 0;
28
+ while (data.length - offset >= OUTBOUND_FRAME_BYTES) {
29
+ const frame = data.slice(offset, offset + OUTBOUND_FRAME_BYTES);
30
+ offset += OUTBOUND_FRAME_BYTES;
31
+ if (channel.socket) {
32
+ channel.socket.sendBinary(frame);
33
+ }
34
+ else {
35
+ channel.outboundBuffer.push(frame);
36
+ }
37
+ }
38
+ channel.partial = offset < data.length ? data.slice(offset) : new Uint8Array(0);
39
+ }
40
+ OnAudio(callUuid, handler) {
41
+ this.ensureChannel(callUuid).audioHandlers.push(handler);
42
+ }
43
+ OnEvent(callUuid, handler) {
44
+ this.ensureChannel(callUuid).eventHandlers.push(handler);
45
+ }
46
+ Clear(callUuid) {
47
+ const channel = this.channels.get(callUuid);
48
+ if (!channel) {
49
+ return;
50
+ }
51
+ channel.outboundBuffer.length = 0;
52
+ channel.partial = new Uint8Array(0);
53
+ channel.socket?.sendText(JSON.stringify({ action: 'clear' }));
54
+ }
55
+ // ── WSS-server side ─────────────────────────────────────────────────────────
56
+ AttachSocket(callUuid, socket) {
57
+ const channel = this.ensureChannel(callUuid);
58
+ channel.socket = socket;
59
+ const buffered = channel.outboundBuffer.splice(0, channel.outboundBuffer.length);
60
+ for (const frame of buffered) {
61
+ socket.sendBinary(frame);
62
+ }
63
+ }
64
+ DispatchInboundAudio(callUuid, pcm) {
65
+ const channel = this.channels.get(callUuid);
66
+ if (!channel) {
67
+ return;
68
+ }
69
+ for (const handler of channel.audioHandlers) {
70
+ handler(pcm);
71
+ }
72
+ }
73
+ DispatchInboundEvent(callUuid, event) {
74
+ const channel = this.channels.get(callUuid);
75
+ if (!channel) {
76
+ return;
77
+ }
78
+ for (const handler of channel.eventHandlers) {
79
+ handler(event);
80
+ }
81
+ }
82
+ EndCall(callUuid) {
83
+ const channel = this.channels.get(callUuid);
84
+ if (!channel) {
85
+ return;
86
+ }
87
+ try {
88
+ channel.socket?.close();
89
+ }
90
+ catch {
91
+ /* best-effort */
92
+ }
93
+ this.channels.delete(callUuid);
94
+ }
95
+ HasCall(callUuid) {
96
+ return this.channels.has(callUuid);
97
+ }
98
+ ensureChannel(callUuid) {
99
+ let channel = this.channels.get(callUuid);
100
+ if (!channel) {
101
+ channel = { audioHandlers: [], eventHandlers: [], outboundBuffer: [], partial: new Uint8Array(0) };
102
+ this.channels.set(callUuid, channel);
103
+ }
104
+ return channel;
105
+ }
106
+ }
107
+ function concatBytes(a, b) {
108
+ const out = new Uint8Array(a.length + b.length);
109
+ out.set(a, 0);
110
+ out.set(b, a.length);
111
+ return out;
112
+ }
113
+ //# sourceMappingURL=vonageMediaRegistry.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"vonageMediaRegistry.js","sourceRoot":"","sources":["../../src/telephony/vonageMediaRegistry.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAkBH;;;GAGG;AACH,MAAM,oBAAoB,GAAG,GAAG,CAAC;AAWjC;;GAEG;AACH,MAAM,OAAO,uBAAuB;IAApC;QACqB,aAAQ,GAAG,IAAI,GAAG,EAA4B,CAAC;IAsGpE,CAAC;IApGG,8FAA8F;IACvF,YAAY,CAAC,QAAgB;QAChC,IAAI,CAAC,aAAa,CAAC,QAAQ,CAAC,CAAC;IACjC,CAAC;IAED,gFAAgF;IAEzE,SAAS,CAAC,QAAgB,EAAE,GAAgB;QAC/C,MAAM,OAAO,GAAG,IAAI,CAAC,aAAa,CAAC,QAAQ,CAAC,CAAC;QAC7C,MAAM,QAAQ,GAAG,IAAI,UAAU,CAAC,GAAG,CAAC,CAAC;QACrC,MAAM,IAAI,GAAG,OAAO,CAAC,OAAO,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,CAAC,WAAW,CAAC,OAAO,CAAC,OAAO,EAAE,QAAQ,CAAC,CAAC,CAAC,CAAC,QAAQ,CAAC;QAE5F,IAAI,MAAM,GAAG,CAAC,CAAC;QACf,OAAO,IAAI,CAAC,MAAM,GAAG,MAAM,IAAI,oBAAoB,EAAE,CAAC;YAClD,MAAM,KAAK,GAAG,IAAI,CAAC,KAAK,CAAC,MAAM,EAAE,MAAM,GAAG,oBAAoB,CAAC,CAAC;YAChE,MAAM,IAAI,oBAAoB,CAAC;YAC/B,IAAI,OAAO,CAAC,MAAM,EAAE,CAAC;gBACjB,OAAO,CAAC,MAAM,CAAC,UAAU,CAAC,KAAK,CAAC,CAAC;YACrC,CAAC;iBAAM,CAAC;gBACJ,OAAO,CAAC,cAAc,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;YACvC,CAAC;QACL,CAAC;QAED,OAAO,CAAC,OAAO,GAAG,MAAM,GAAG,IAAI,CAAC,MAAM,CAAC,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,IAAI,UAAU,CAAC,CAAC,CAAC,CAAC;IACpF,CAAC;IAEM,OAAO,CAAC,QAAgB,EAAE,OAAmC;QAChE,IAAI,CAAC,aAAa,CAAC,QAAQ,CAAC,CAAC,aAAa,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC;IAC7D,CAAC;IAEM,OAAO,CAAC,QAAgB,EAAE,OAA4C;QACzE,IAAI,CAAC,aAAa,CAAC,QAAQ,CAAC,CAAC,aAAa,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC;IAC7D,CAAC;IAEM,KAAK,CAAC,QAAgB;QACzB,MAAM,OAAO,GAAG,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,QAAQ,CAAC,CAAC;QAC5C,IAAI,CAAC,OAAO,EAAE,CAAC;YACX,OAAO;QACX,CAAC;QACD,OAAO,CAAC,cAAc,CAAC,MAAM,GAAG,CAAC,CAAC;QAClC,OAAO,CAAC,OAAO,GAAG,IAAI,UAAU,CAAC,CAAC,CAAC,CAAC;QACpC,OAAO,CAAC,MAAM,EAAE,QAAQ,CAAC,IAAI,CAAC,SAAS,CAAC,EAAE,MAAM,EAAE,OAAO,EAAE,CAAC,CAAC,CAAC;IAClE,CAAC;IAED,+EAA+E;IAExE,YAAY,CAAC,QAAgB,EAAE,MAA6B;QAC/D,MAAM,OAAO,GAAG,IAAI,CAAC,aAAa,CAAC,QAAQ,CAAC,CAAC;QAC7C,OAAO,CAAC,MAAM,GAAG,MAAM,CAAC;QACxB,MAAM,QAAQ,GAAG,OAAO,CAAC,cAAc,CAAC,MAAM,CAAC,CAAC,EAAE,OAAO,CAAC,cAAc,CAAC,MAAM,CAAC,CAAC;QACjF,KAAK,MAAM,KAAK,IAAI,QAAQ,EAAE,CAAC;YAC3B,MAAM,CAAC,UAAU,CAAC,KAAK,CAAC,CAAC;QAC7B,CAAC;IACL,CAAC;IAEM,oBAAoB,CAAC,QAAgB,EAAE,GAAgB;QAC1D,MAAM,OAAO,GAAG,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,QAAQ,CAAC,CAAC;QAC5C,IAAI,CAAC,OAAO,EAAE,CAAC;YACX,OAAO;QACX,CAAC;QACD,KAAK,MAAM,OAAO,IAAI,OAAO,CAAC,aAAa,EAAE,CAAC;YAC1C,OAAO,CAAC,GAAG,CAAC,CAAC;QACjB,CAAC;IACL,CAAC;IAEM,oBAAoB,CAAC,QAAgB,EAAE,KAAyB;QACnE,MAAM,OAAO,GAAG,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,QAAQ,CAAC,CAAC;QAC5C,IAAI,CAAC,OAAO,EAAE,CAAC;YACX,OAAO;QACX,CAAC;QACD,KAAK,MAAM,OAAO,IAAI,OAAO,CAAC,aAAa,EAAE,CAAC;YAC1C,OAAO,CAAC,KAAK,CAAC,CAAC;QACnB,CAAC;IACL,CAAC;IAEM,OAAO,CAAC,QAAgB;QAC3B,MAAM,OAAO,GAAG,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,QAAQ,CAAC,CAAC;QAC5C,IAAI,CAAC,OAAO,EAAE,CAAC;YACX,OAAO;QACX,CAAC;QACD,IAAI,CAAC;YACD,OAAO,CAAC,MAAM,EAAE,KAAK,EAAE,CAAC;QAC5B,CAAC;QAAC,MAAM,CAAC;YACL,iBAAiB;QACrB,CAAC;QACD,IAAI,CAAC,QAAQ,CAAC,MAAM,CAAC,QAAQ,CAAC,CAAC;IACnC,CAAC;IAEM,OAAO,CAAC,QAAgB;QAC3B,OAAO,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,QAAQ,CAAC,CAAC;IACvC,CAAC;IAEO,aAAa,CAAC,QAAgB;QAClC,IAAI,OAAO,GAAG,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,QAAQ,CAAC,CAAC;QAC1C,IAAI,CAAC,OAAO,EAAE,CAAC;YACX,OAAO,GAAG,EAAE,aAAa,EAAE,EAAE,EAAE,aAAa,EAAE,EAAE,EAAE,cAAc,EAAE,EAAE,EAAE,OAAO,EAAE,IAAI,UAAU,CAAC,CAAC,CAAC,EAAE,CAAC;YACnG,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,QAAQ,EAAE,OAAO,CAAC,CAAC;QACzC,CAAC;QACD,OAAO,OAAO,CAAC;IACnB,CAAC;CACJ;AAED,SAAS,WAAW,CAAC,CAAa,EAAE,CAAa;IAC7C,MAAM,GAAG,GAAG,IAAI,UAAU,CAAC,CAAC,CAAC,MAAM,GAAG,CAAC,CAAC,MAAM,CAAC,CAAC;IAChD,GAAG,CAAC,GAAG,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC;IACd,GAAG,CAAC,GAAG,CAAC,CAAC,EAAE,CAAC,CAAC,MAAM,CAAC,CAAC;IACrB,OAAO,GAAG,CAAC;AACf,CAAC"}
@@ -0,0 +1,123 @@
1
+ import { UserInfo, DatabaseProviderBase } from '@memberjunction/core';
2
+ /**
3
+ * Twilio Programmable Voice + Media Streams telephony binding configuration.
4
+ */
5
+ export interface TwilioTelephonyConfig {
6
+ /** Twilio Account SID (`AC…`). */
7
+ accountSid: string;
8
+ /** Account auth token — REST auth (when no API key pair) AND the HMAC key for X-Twilio-Signature verification. */
9
+ authToken?: string;
10
+ /** API Key SID (`SK…`) — preferred over the auth token for REST auth when paired with apiKeySecret. */
11
+ apiKeySid?: string;
12
+ /** API Key secret — paired with apiKeySid. */
13
+ apiKeySecret?: string;
14
+ /** The publicly reachable `wss://…/telephony/twilio/media` URL Twilio's <Connect><Stream> connects to. */
15
+ streamPublicUrl: string;
16
+ /** Optional shared secret gating the public webhook/WSS endpoints. */
17
+ webhookSigningSecret?: string;
18
+ /** Optional status-callback URL Twilio posts call lifecycle events to. */
19
+ statusCallbackUrl?: string;
20
+ }
21
+ /**
22
+ * Vonage Voice + WebSocket-media telephony binding configuration.
23
+ */
24
+ export interface VonageTelephonyConfig {
25
+ /** Vonage Application ID (UUID) — the JWT-auth identity for the Voice API. */
26
+ applicationId?: string;
27
+ /** The application's RSA private key (PEM) used to sign Voice-API JWTs. */
28
+ privateKey?: string;
29
+ /** Account API key — used for key-scoped operations when no application credential pair is supplied. */
30
+ apiKey?: string;
31
+ /** Account API secret — paired with apiKey. */
32
+ apiSecret?: string;
33
+ /** The publicly reachable `wss://…/telephony/vonage/media` URL the call's connect NCCO opens. */
34
+ mediaPublicUrl: string;
35
+ /** Vonage account signature secret — HMAC key for signed-request `sig` AND HS256 webhook-JWT verification. */
36
+ signatureSecret?: string;
37
+ /** Optional event-webhook URL Vonage posts call lifecycle events to. */
38
+ eventUrl?: string;
39
+ }
40
+ /**
41
+ * RingCentral SIP softphone telephony binding configuration.
42
+ */
43
+ export interface RingCentralTelephonyConfig {
44
+ /** SIP domain (e.g. `sip.ringcentral.com`). */
45
+ sipDomain: string;
46
+ /** SIP outbound proxy (`host:port`, e.g. `sip10.ringcentral.com:5096`). */
47
+ sipOutboundProxy: string;
48
+ /** SIP auth username (the device's phone number / extension). */
49
+ sipUsername: string;
50
+ /** SIP auth password (resolved upstream — never inlined). */
51
+ sipPassword: string;
52
+ /** SIP authorization id (the device's RingCentral authorization id). */
53
+ sipAuthorizationId: string;
54
+ /** Codec to negotiate. Defaults to `OPUS/16000`. */
55
+ codec?: 'OPUS/16000' | 'OPUS/48000/2' | 'PCMU/8000';
56
+ /** Skip TLS cert validation (sandbox/test only — never in production). */
57
+ ignoreTlsCertErrors?: boolean;
58
+ }
59
+ /**
60
+ * Teams meetings binding configuration.
61
+ */
62
+ export interface TeamsMeetingsConfig {
63
+ /** Whether Teams meeting joins are enabled. */
64
+ enabled?: boolean;
65
+ /** Azure App (client) ID with Calling / Cloud Communications permissions. */
66
+ appId?: string;
67
+ /** Azure AD Tenant ID. */
68
+ tenantId?: string;
69
+ /** Pre-resolved bot access token for Microsoft Graph / Calling API calls. */
70
+ botAccessToken?: string;
71
+ /** The shared secret set as `clientState` on the Graph subscription; gates the change-notification webhook. */
72
+ notificationClientState?: string;
73
+ /** The ACS application-hosted-media PCM sample rate (Hz) the audio plane negotiates. Defaults to 16000. */
74
+ acsSampleRate?: number;
75
+ /** The realtime model's PCM16 sample rate (Hz) the binding resamples to/from. Defaults to 16000. */
76
+ modelSampleRate?: number;
77
+ }
78
+ /**
79
+ * Full telephony section configuration shape.
80
+ */
81
+ export interface TelephonyConfig {
82
+ enabled: boolean;
83
+ twilio?: TwilioTelephonyConfig;
84
+ vonage?: VonageTelephonyConfig;
85
+ ringcentral?: RingCentralTelephonyConfig;
86
+ teams?: TeamsMeetingsConfig;
87
+ }
88
+ /**
89
+ * Context user payload passed from auth middleware to GraphQL resolvers.
90
+ */
91
+ export interface UserPayload {
92
+ email: string;
93
+ userRecord?: UserInfo;
94
+ sessionId?: string;
95
+ isSystemUser?: boolean;
96
+ apiKey?: string;
97
+ apiKeyId?: string;
98
+ apiKeyHash?: string;
99
+ emailVerified?: boolean;
100
+ }
101
+ /**
102
+ * Provider info shape passed in GraphQL context.
103
+ */
104
+ export interface ProviderInfo {
105
+ type: string;
106
+ provider: DatabaseProviderBase;
107
+ }
108
+ /**
109
+ * AppContext shape consumed by telephony GraphQL resolvers.
110
+ */
111
+ export interface TelephonyResolverContext {
112
+ userPayload?: UserPayload;
113
+ providers?: ProviderInfo[];
114
+ }
115
+ /**
116
+ * Resolves a UserInfo object from the resolver context userPayload.
117
+ */
118
+ export declare function getUserFromPayload(userPayload?: UserPayload): UserInfo | undefined;
119
+ /**
120
+ * Resolves the primary Read-Write database provider from the resolver context.
121
+ */
122
+ export declare function getReadWriteProvider(providers?: ProviderInfo[]): DatabaseProviderBase | null;
123
+ //# sourceMappingURL=types.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../src/types.ts"],"names":[],"mappings":"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"}
package/dist/types.js ADDED
@@ -0,0 +1,27 @@
1
+ import { UserCache } from '@memberjunction/generic-database-provider';
2
+ /**
3
+ * Resolves a UserInfo object from the resolver context userPayload.
4
+ */
5
+ export function getUserFromPayload(userPayload) {
6
+ if (!userPayload) {
7
+ return undefined;
8
+ }
9
+ if (userPayload.userRecord) {
10
+ return userPayload.userRecord;
11
+ }
12
+ if (!userPayload.email) {
13
+ return undefined;
14
+ }
15
+ return UserCache.Users.find((u) => u.Email.toLowerCase().trim() === userPayload.email.toLowerCase().trim());
16
+ }
17
+ /**
18
+ * Resolves the primary Read-Write database provider from the resolver context.
19
+ */
20
+ export function getReadWriteProvider(providers) {
21
+ if (!providers || providers.length === 0) {
22
+ return null;
23
+ }
24
+ const rw = providers.find((p) => p.type === 'Read-Write');
25
+ return rw ? rw.provider : null;
26
+ }
27
+ //# sourceMappingURL=types.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"types.js","sourceRoot":"","sources":["../src/types.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,SAAS,EAAE,MAAM,2CAA2C,CAAC;AA2HtE;;GAEG;AACH,MAAM,UAAU,kBAAkB,CAAC,WAAyB;IACxD,IAAI,CAAC,WAAW,EAAE,CAAC;QACf,OAAO,SAAS,CAAC;IACrB,CAAC;IACD,IAAI,WAAW,CAAC,UAAU,EAAE,CAAC;QACzB,OAAO,WAAW,CAAC,UAAU,CAAC;IAClC,CAAC;IACD,IAAI,CAAC,WAAW,CAAC,KAAK,EAAE,CAAC;QACrB,OAAO,SAAS,CAAC;IACrB,CAAC;IACD,OAAO,SAAS,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,KAAK,CAAC,WAAW,EAAE,CAAC,IAAI,EAAE,KAAK,WAAW,CAAC,KAAK,CAAC,WAAW,EAAE,CAAC,IAAI,EAAE,CAAC,CAAC;AAChH,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,oBAAoB,CAAC,SAA0B;IAC3D,IAAI,CAAC,SAAS,IAAI,SAAS,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;QACvC,OAAO,IAAI,CAAC;IAChB,CAAC;IACD,MAAM,EAAE,GAAG,SAAS,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,KAAK,YAAY,CAAC,CAAC;IAC1D,OAAO,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC,QAAQ,CAAC,CAAC,CAAC,IAAI,CAAC;AACnC,CAAC"}
package/package.json CHANGED
@@ -1,10 +1,50 @@
1
1
  {
2
2
  "name": "@memberjunction/telephony-adapters",
3
- "version": "0.0.0",
4
- "description": "OIDC trusted publishing setup package for @memberjunction/telephony-adapters",
5
- "keywords": [
6
- "oidc",
7
- "trusted-publishing",
8
- "setup"
9
- ]
10
- }
3
+ "version": "6.1.0-edge.7",
4
+ "description": "MemberJunction: Telephony and meeting platform adapters (Twilio, Vonage, RingCentral, Teams) for routing voice calls and meetings to MJ AI agents via the Server Extension framework",
5
+ "main": "dist/index.js",
6
+ "types": "dist/index.d.ts",
7
+ "type": "module",
8
+ "files": [
9
+ "/dist"
10
+ ],
11
+ "author": "MemberJunction.com",
12
+ "license": "BUSL-1.1",
13
+ "dependencies": {
14
+ "@memberjunction/ai-agents": "6.1.0-edge.7",
15
+ "@memberjunction/ai-bridge-base": "6.1.0-edge.7",
16
+ "@memberjunction/ai-bridge-ringcentral": "6.1.0-edge.7",
17
+ "@memberjunction/ai-bridge-server": "6.1.0-edge.7",
18
+ "@memberjunction/ai-bridge-teams": "6.1.0-edge.7",
19
+ "@memberjunction/ai-bridge-twilio": "6.1.0-edge.7",
20
+ "@memberjunction/ai-bridge-vonage": "6.1.0-edge.7",
21
+ "@memberjunction/core": "6.1.0-edge.7",
22
+ "@memberjunction/core-entities": "6.1.0-edge.7",
23
+ "@memberjunction/generic-database-provider": "6.1.0-edge.7",
24
+ "@memberjunction/global": "6.1.0-edge.7",
25
+ "@memberjunction/server-extensions-core": "6.1.0-edge.7",
26
+ "cors": "^2.8.5",
27
+ "express": "^5.2.1",
28
+ "type-graphql": "2.0.0-beta.3",
29
+ "ws": "^8.19.0"
30
+ },
31
+ "devDependencies": {
32
+ "@types/cors": "^2.8.17",
33
+ "@types/express": "^5.0.6",
34
+ "@types/ws": "^8.5.14",
35
+ "tsc-alias": "^1.8.16",
36
+ "typescript": "^5.9.3",
37
+ "vite-tsconfig-paths": "^5.1.4",
38
+ "vitest": "^3.1.1"
39
+ },
40
+ "repository": {
41
+ "type": "git",
42
+ "url": "https://github.com/MemberJunction/MJ"
43
+ },
44
+ "scripts": {
45
+ "build": "tsc && tsc-alias -f",
46
+ "test": "vitest run",
47
+ "test:watch": "vitest",
48
+ "test:coverage": "vitest run --coverage"
49
+ }
50
+ }
package/README.md DELETED
@@ -1,45 +0,0 @@
1
- # @memberjunction/telephony-adapters
2
-
3
- ## ⚠️ IMPORTANT NOTICE ⚠️
4
-
5
- **This package is created solely for the purpose of setting up OIDC (OpenID Connect) trusted publishing with npm.**
6
-
7
- This is **NOT** a functional package and contains **NO** code or functionality beyond the OIDC setup configuration.
8
-
9
- ## Purpose
10
-
11
- This package exists to:
12
- 1. Configure OIDC trusted publishing for the package name `@memberjunction/telephony-adapters`
13
- 2. Enable secure, token-less publishing from CI/CD workflows
14
- 3. Establish provenance for packages published under this name
15
-
16
- ## What is OIDC Trusted Publishing?
17
-
18
- OIDC trusted publishing allows package maintainers to publish packages directly from their CI/CD workflows without needing to manage npm access tokens. Instead, it uses OpenID Connect to establish trust between the CI/CD provider (like GitHub Actions) and npm.
19
-
20
- ## Setup Instructions
21
-
22
- To properly configure OIDC trusted publishing for this package:
23
-
24
- 1. Go to [npmjs.com](https://www.npmjs.com/) and navigate to your package settings
25
- 2. Configure the trusted publisher (e.g., GitHub Actions)
26
- 3. Specify the repository and workflow that should be allowed to publish
27
- 4. Use the configured workflow to publish your actual package
28
-
29
- ## DO NOT USE THIS PACKAGE
30
-
31
- This package is a placeholder for OIDC configuration only. It:
32
- - Contains no executable code
33
- - Provides no functionality
34
- - Should not be installed as a dependency
35
- - Exists only for administrative purposes
36
-
37
- ## More Information
38
-
39
- For more details about npm's trusted publishing feature, see:
40
- - [npm Trusted Publishing Documentation](https://docs.npmjs.com/generating-provenance-statements)
41
- - [GitHub Actions OIDC Documentation](https://docs.github.com/en/actions/deployment/security-hardening-your-deployments/about-security-hardening-with-openid-connect)
42
-
43
- ---
44
-
45
- **Maintained for OIDC setup purposes only**