@dereekb/nestjs 12.7.0 → 13.0.1

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 (230) hide show
  1. package/LICENSE +1 -1
  2. package/index.cjs.default.js +1 -0
  3. package/index.cjs.js +310 -0
  4. package/index.cjs.mjs +2 -0
  5. package/index.d.ts +1 -0
  6. package/index.esm.js +288 -0
  7. package/mailgun/index.cjs.default.js +1 -0
  8. package/mailgun/index.cjs.js +639 -0
  9. package/mailgun/index.cjs.mjs +2 -0
  10. package/mailgun/index.d.ts +1 -0
  11. package/mailgun/index.esm.js +626 -0
  12. package/mailgun/package.json +24 -4
  13. package/mailgun/src/lib/mailgun.d.ts +2 -2
  14. package/mailgun/src/lib/mailgun.type.d.ts +1 -1
  15. package/mailgun/src/lib/mailgun.util.d.ts +22 -17
  16. package/openai/index.cjs.default.js +1 -0
  17. package/openai/index.cjs.js +343 -0
  18. package/openai/index.cjs.mjs +2 -0
  19. package/openai/index.d.ts +1 -0
  20. package/openai/index.esm.js +326 -0
  21. package/openai/package.json +24 -6
  22. package/openai/src/lib/index.d.ts +0 -1
  23. package/openai/src/lib/webhook/webhook.openai.controller.d.ts +1 -1
  24. package/openai/src/lib/webhook/webhook.openai.d.ts +2 -2
  25. package/openai/src/lib/webhook/webhook.openai.service.d.ts +1 -1
  26. package/package.json +43 -36
  27. package/stripe/index.cjs.default.js +1 -0
  28. package/stripe/index.cjs.js +253 -0
  29. package/stripe/index.cjs.mjs +2 -0
  30. package/stripe/index.d.ts +1 -0
  31. package/stripe/index.esm.js +245 -0
  32. package/stripe/package.json +24 -6
  33. package/stripe/src/lib/index.d.ts +1 -1
  34. package/stripe/src/lib/stripe.module.d.ts +2 -2
  35. package/stripe/src/lib/webhook/webhook.stripe.controller.d.ts +1 -1
  36. package/typeform/index.cjs.default.js +1 -0
  37. package/typeform/index.cjs.js +395 -0
  38. package/typeform/index.cjs.mjs +2 -0
  39. package/typeform/index.d.ts +1 -0
  40. package/typeform/index.esm.js +380 -0
  41. package/typeform/package.json +24 -6
  42. package/typeform/src/lib/index.d.ts +0 -1
  43. package/typeform/src/lib/webhook/webhook.typeform.controller.d.ts +1 -1
  44. package/vapiai/index.cjs.default.js +1 -0
  45. package/vapiai/index.cjs.js +319 -0
  46. package/vapiai/index.cjs.mjs +2 -0
  47. package/vapiai/index.d.ts +1 -0
  48. package/vapiai/index.esm.js +310 -0
  49. package/vapiai/package.json +24 -6
  50. package/vapiai/src/lib/index.d.ts +0 -1
  51. package/vapiai/src/lib/vapiai.type.d.ts +3 -1
  52. package/vapiai/src/lib/webhook/webhook.vapiai.controller.d.ts +1 -1
  53. package/vapiai/src/lib/webhook/webhook.vapiai.d.ts +1 -9
  54. package/vapiai/src/lib/webhook/webhook.vapiai.types.d.ts +6 -34
  55. package/CHANGELOG.md +0 -2001
  56. package/mailgun/LICENSE +0 -21
  57. package/mailgun/src/index.js +0 -5
  58. package/mailgun/src/index.js.map +0 -1
  59. package/mailgun/src/lib/index.js +0 -10
  60. package/mailgun/src/lib/index.js.map +0 -1
  61. package/mailgun/src/lib/mailgun.api.js +0 -37
  62. package/mailgun/src/lib/mailgun.api.js.map +0 -1
  63. package/mailgun/src/lib/mailgun.config.js +0 -45
  64. package/mailgun/src/lib/mailgun.config.js.map +0 -1
  65. package/mailgun/src/lib/mailgun.js +0 -205
  66. package/mailgun/src/lib/mailgun.js.map +0 -1
  67. package/mailgun/src/lib/mailgun.service.js +0 -53
  68. package/mailgun/src/lib/mailgun.service.js.map +0 -1
  69. package/mailgun/src/lib/mailgun.service.module.js +0 -84
  70. package/mailgun/src/lib/mailgun.service.module.js.map +0 -1
  71. package/mailgun/src/lib/mailgun.type.js +0 -3
  72. package/mailgun/src/lib/mailgun.type.js.map +0 -1
  73. package/mailgun/src/lib/mailgun.util.js +0 -206
  74. package/mailgun/src/lib/mailgun.util.js.map +0 -1
  75. package/openai/LICENSE +0 -21
  76. package/openai/src/index.js +0 -5
  77. package/openai/src/index.js.map +0 -1
  78. package/openai/src/lib/index.js +0 -11
  79. package/openai/src/lib/index.js.map +0 -1
  80. package/openai/src/lib/openai.api.js +0 -22
  81. package/openai/src/lib/openai.api.js.map +0 -1
  82. package/openai/src/lib/openai.config.js +0 -29
  83. package/openai/src/lib/openai.config.js.map +0 -1
  84. package/openai/src/lib/openai.module.js +0 -41
  85. package/openai/src/lib/openai.module.js.map +0 -1
  86. package/openai/src/lib/openai.type.js +0 -3
  87. package/openai/src/lib/openai.type.js.map +0 -1
  88. package/openai/src/lib/openai.util.js +0 -48
  89. package/openai/src/lib/openai.util.js.map +0 -1
  90. package/openai/src/lib/webhook/index.js +0 -10
  91. package/openai/src/lib/webhook/index.js.map +0 -1
  92. package/openai/src/lib/webhook/webhook.openai.config.js +0 -17
  93. package/openai/src/lib/webhook/webhook.openai.config.js.map +0 -1
  94. package/openai/src/lib/webhook/webhook.openai.controller.js +0 -30
  95. package/openai/src/lib/webhook/webhook.openai.controller.js.map +0 -1
  96. package/openai/src/lib/webhook/webhook.openai.js +0 -41
  97. package/openai/src/lib/webhook/webhook.openai.js.map +0 -1
  98. package/openai/src/lib/webhook/webhook.openai.module.js +0 -39
  99. package/openai/src/lib/webhook/webhook.openai.module.js.map +0 -1
  100. package/openai/src/lib/webhook/webhook.openai.service.js +0 -48
  101. package/openai/src/lib/webhook/webhook.openai.service.js.map +0 -1
  102. package/openai/src/lib/webhook/webhook.openai.verify.js +0 -37
  103. package/openai/src/lib/webhook/webhook.openai.verify.js.map +0 -1
  104. package/src/index.js +0 -5
  105. package/src/index.js.map +0 -1
  106. package/src/lib/decorators/index.js +0 -6
  107. package/src/lib/decorators/index.js.map +0 -1
  108. package/src/lib/decorators/local.decorator.js +0 -17
  109. package/src/lib/decorators/local.decorator.js.map +0 -1
  110. package/src/lib/decorators/rawbody.js +0 -44
  111. package/src/lib/decorators/rawbody.js.map +0 -1
  112. package/src/lib/index.js +0 -7
  113. package/src/lib/index.js.map +0 -1
  114. package/src/lib/middlewares/index.js +0 -7
  115. package/src/lib/middlewares/index.js.map +0 -1
  116. package/src/lib/middlewares/json.middleware.js +0 -16
  117. package/src/lib/middlewares/json.middleware.js.map +0 -1
  118. package/src/lib/middlewares/rawbody.middleware.js +0 -16
  119. package/src/lib/middlewares/rawbody.middleware.js.map +0 -1
  120. package/src/lib/middlewares/webhook.js +0 -51
  121. package/src/lib/middlewares/webhook.js.map +0 -1
  122. package/src/lib/module/client/client.config.js +0 -13
  123. package/src/lib/module/client/client.config.js.map +0 -1
  124. package/src/lib/module/client/client.js +0 -8
  125. package/src/lib/module/client/client.js.map +0 -1
  126. package/src/lib/module/client/client.module.js +0 -36
  127. package/src/lib/module/client/client.module.js.map +0 -1
  128. package/src/lib/module/client/client.service.js +0 -30
  129. package/src/lib/module/client/client.service.js.map +0 -1
  130. package/src/lib/module/client/index.js +0 -8
  131. package/src/lib/module/client/index.js.map +0 -1
  132. package/src/lib/module/env/env.config.js +0 -14
  133. package/src/lib/module/env/env.config.js.map +0 -1
  134. package/src/lib/module/env/env.js +0 -10
  135. package/src/lib/module/env/env.js.map +0 -1
  136. package/src/lib/module/env/env.nest.js +0 -16
  137. package/src/lib/module/env/env.nest.js.map +0 -1
  138. package/src/lib/module/env/env.service.js +0 -33
  139. package/src/lib/module/env/env.service.js.map +0 -1
  140. package/src/lib/module/env/index.js +0 -8
  141. package/src/lib/module/env/index.js.map +0 -1
  142. package/src/lib/module/index.js +0 -7
  143. package/src/lib/module/index.js.map +0 -1
  144. package/src/lib/module/module.js +0 -26
  145. package/src/lib/module/module.js.map +0 -1
  146. package/stripe/LICENSE +0 -21
  147. package/stripe/src/index.js +0 -5
  148. package/stripe/src/index.js.map +0 -1
  149. package/stripe/src/lib/index.js +0 -8
  150. package/stripe/src/lib/index.js.map +0 -1
  151. package/stripe/src/lib/stripe.api.js +0 -40
  152. package/stripe/src/lib/stripe.api.js.map +0 -1
  153. package/stripe/src/lib/stripe.config.js +0 -19
  154. package/stripe/src/lib/stripe.config.js.map +0 -1
  155. package/stripe/src/lib/stripe.module.js +0 -41
  156. package/stripe/src/lib/stripe.module.js.map +0 -1
  157. package/stripe/src/lib/stripe.type.js +0 -4
  158. package/stripe/src/lib/stripe.type.js.map +0 -1
  159. package/stripe/src/lib/webhook/index.js +0 -8
  160. package/stripe/src/lib/webhook/index.js.map +0 -1
  161. package/stripe/src/lib/webhook/webhook.stripe.controller.js +0 -30
  162. package/stripe/src/lib/webhook/webhook.stripe.controller.js.map +0 -1
  163. package/stripe/src/lib/webhook/webhook.stripe.js +0 -67
  164. package/stripe/src/lib/webhook/webhook.stripe.js.map +0 -1
  165. package/stripe/src/lib/webhook/webhook.stripe.module.js +0 -20
  166. package/stripe/src/lib/webhook/webhook.stripe.module.js.map +0 -1
  167. package/stripe/src/lib/webhook/webhook.stripe.service.js +0 -36
  168. package/stripe/src/lib/webhook/webhook.stripe.service.js.map +0 -1
  169. package/typeform/LICENSE +0 -21
  170. package/typeform/src/index.js +0 -5
  171. package/typeform/src/index.js.map +0 -1
  172. package/typeform/src/lib/index.js +0 -11
  173. package/typeform/src/lib/index.js.map +0 -1
  174. package/typeform/src/lib/typeform.api.js +0 -22
  175. package/typeform/src/lib/typeform.api.js.map +0 -1
  176. package/typeform/src/lib/typeform.config.js +0 -21
  177. package/typeform/src/lib/typeform.config.js.map +0 -1
  178. package/typeform/src/lib/typeform.module.js +0 -39
  179. package/typeform/src/lib/typeform.module.js.map +0 -1
  180. package/typeform/src/lib/typeform.type.js +0 -3
  181. package/typeform/src/lib/typeform.type.js.map +0 -1
  182. package/typeform/src/lib/typeform.util.js +0 -26
  183. package/typeform/src/lib/typeform.util.js.map +0 -1
  184. package/typeform/src/lib/webhook/index.js +0 -12
  185. package/typeform/src/lib/webhook/index.js.map +0 -1
  186. package/typeform/src/lib/webhook/webhook.typeform.config.js +0 -17
  187. package/typeform/src/lib/webhook/webhook.typeform.config.js.map +0 -1
  188. package/typeform/src/lib/webhook/webhook.typeform.controller.js +0 -30
  189. package/typeform/src/lib/webhook/webhook.typeform.controller.js.map +0 -1
  190. package/typeform/src/lib/webhook/webhook.typeform.form.js +0 -113
  191. package/typeform/src/lib/webhook/webhook.typeform.form.js.map +0 -1
  192. package/typeform/src/lib/webhook/webhook.typeform.js +0 -27
  193. package/typeform/src/lib/webhook/webhook.typeform.js.map +0 -1
  194. package/typeform/src/lib/webhook/webhook.typeform.module.js +0 -38
  195. package/typeform/src/lib/webhook/webhook.typeform.module.js.map +0 -1
  196. package/typeform/src/lib/webhook/webhook.typeform.service.js +0 -45
  197. package/typeform/src/lib/webhook/webhook.typeform.service.js.map +0 -1
  198. package/typeform/src/lib/webhook/webhook.typeform.type.js +0 -3
  199. package/typeform/src/lib/webhook/webhook.typeform.type.js.map +0 -1
  200. package/typeform/src/lib/webhook/webhook.typeform.verify.js +0 -28
  201. package/typeform/src/lib/webhook/webhook.typeform.verify.js.map +0 -1
  202. package/vapiai/LICENSE +0 -21
  203. package/vapiai/src/index.js +0 -5
  204. package/vapiai/src/index.js.map +0 -1
  205. package/vapiai/src/lib/index.js +0 -10
  206. package/vapiai/src/lib/index.js.map +0 -1
  207. package/vapiai/src/lib/vapiai.api.js +0 -32
  208. package/vapiai/src/lib/vapiai.api.js.map +0 -1
  209. package/vapiai/src/lib/vapiai.config.js +0 -17
  210. package/vapiai/src/lib/vapiai.config.js.map +0 -1
  211. package/vapiai/src/lib/vapiai.module.js +0 -38
  212. package/vapiai/src/lib/vapiai.module.js.map +0 -1
  213. package/vapiai/src/lib/vapiai.type.js +0 -3
  214. package/vapiai/src/lib/vapiai.type.js.map +0 -1
  215. package/vapiai/src/lib/webhook/index.js +0 -10
  216. package/vapiai/src/lib/webhook/index.js.map +0 -1
  217. package/vapiai/src/lib/webhook/webhook.vapi.config.js +0 -20
  218. package/vapiai/src/lib/webhook/webhook.vapi.config.js.map +0 -1
  219. package/vapiai/src/lib/webhook/webhook.vapiai.controller.js +0 -38
  220. package/vapiai/src/lib/webhook/webhook.vapiai.controller.js.map +0 -1
  221. package/vapiai/src/lib/webhook/webhook.vapiai.js +0 -42
  222. package/vapiai/src/lib/webhook/webhook.vapiai.js.map +0 -1
  223. package/vapiai/src/lib/webhook/webhook.vapiai.module.js +0 -41
  224. package/vapiai/src/lib/webhook/webhook.vapiai.module.js.map +0 -1
  225. package/vapiai/src/lib/webhook/webhook.vapiai.service.js +0 -52
  226. package/vapiai/src/lib/webhook/webhook.vapiai.service.js.map +0 -1
  227. package/vapiai/src/lib/webhook/webhook.vapiai.types.js +0 -25
  228. package/vapiai/src/lib/webhook/webhook.vapiai.types.js.map +0 -1
  229. package/vapiai/src/lib/webhook/webhook.vapiai.verify.js +0 -49
  230. package/vapiai/src/lib/webhook/webhook.vapiai.verify.js.map +0 -1
@@ -0,0 +1,319 @@
1
+ 'use strict';
2
+
3
+ var util = require('@dereekb/util');
4
+ var nestjs = require('@dereekb/nestjs');
5
+ var common = require('@nestjs/common');
6
+ var crypto = require('crypto');
7
+ var config = require('@nestjs/config');
8
+ var serverSdk = require('@vapi-ai/server-sdk');
9
+
10
+ /**
11
+ * Creates a VapiAiWebhookEvent and treats the data as the input type.
12
+ *
13
+ * @param event
14
+ * @returns
15
+ */
16
+ function vapiAiWebhookEvent(event) {
17
+ return event;
18
+ }
19
+ const vapiaiEventHandlerFactory = util.handlerFactory((x) => x.type, {
20
+ defaultResult: {
21
+ handled: true,
22
+ response: undefined
23
+ },
24
+ negativeResult: {
25
+ handled: true,
26
+ response: undefined
27
+ }
28
+ });
29
+ const vapiaiEventHandlerConfigurerFactory = util.handlerConfigurerFactory({
30
+ configurerForAccessor: (accessor) => {
31
+ // eslint-disable-next-line
32
+ const fnWithKey = util.handlerMappedSetFunctionFactory(accessor, vapiAiWebhookEvent);
33
+ const configurer = {
34
+ ...accessor,
35
+ handleAssistantRequest: fnWithKey('assistant-request'),
36
+ handleStatusUpdate: fnWithKey('status-update'),
37
+ handleFunctionCall: fnWithKey('function-call'),
38
+ handleEndOfCallReport: fnWithKey('end-of-call-report'),
39
+ handleHang: fnWithKey('hang')
40
+ };
41
+ return configurer;
42
+ }
43
+ });
44
+
45
+ /******************************************************************************
46
+ Copyright (c) Microsoft Corporation.
47
+
48
+ Permission to use, copy, modify, and/or distribute this software for any
49
+ purpose with or without fee is hereby granted.
50
+
51
+ THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES WITH
52
+ REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY
53
+ AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT,
54
+ INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM
55
+ LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR
56
+ OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR
57
+ PERFORMANCE OF THIS SOFTWARE.
58
+ ***************************************************************************** */
59
+ /* global Reflect, Promise, SuppressedError, Symbol, Iterator */
60
+
61
+
62
+ function __decorate(decorators, target, key, desc) {
63
+ var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;
64
+ if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc);
65
+ else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;
66
+ return c > 3 && r && Object.defineProperty(target, key, r), r;
67
+ }
68
+
69
+ function __param(paramIndex, decorator) {
70
+ return function (target, key) { decorator(target, key, paramIndex); }
71
+ }
72
+
73
+ function __metadata(metadataKey, metadataValue) {
74
+ if (typeof Reflect === "object" && typeof Reflect.metadata === "function") return Reflect.metadata(metadataKey, metadataValue);
75
+ }
76
+
77
+ typeof SuppressedError === "function" ? SuppressedError : function (error, suppressed, message) {
78
+ var e = new Error(message);
79
+ return e.name = "SuppressedError", e.error = error, e.suppressed = suppressed, e;
80
+ };
81
+
82
+ /**
83
+ * Verifies a VapiAi webhook event header.
84
+ *
85
+ * @param vapiSecretTokenGetter The VapiAi secret token. The Vapi client allows for using an AsyncGetterOrValue type, so the verifier supports that as well.
86
+ * @returns A function that verifies a VapiAi webhook event.
87
+ */
88
+ function vapiAiWebhookEventVerifier(config) {
89
+ const { verificationType: inputVerificationType, secret: inputSecret, hmacSecret: inputHmacSecret, signaturePrefix: inputSignaturePrefix } = config;
90
+ const verificationType = inputVerificationType ?? (inputHmacSecret != null ? 'hmac' : 'secret'); // default to secret always, never default to none
91
+ const secretToken = (verificationType === 'hmac' ? (inputHmacSecret ?? inputSecret) : inputSecret) ?? '';
92
+ const signaturePrefix = inputSignaturePrefix ?? '';
93
+ function verifyNone(input) {
94
+ return true;
95
+ }
96
+ function verifySecret(input) {
97
+ const { request } = input;
98
+ const headers = request.headers;
99
+ const vapiSecret = headers['x-vapi-secret'];
100
+ const valid = vapiSecret === secretToken;
101
+ return valid;
102
+ }
103
+ function verifyHmac(input) {
104
+ const { request, requestBodyString } = input;
105
+ const headers = request.headers;
106
+ const timestamp = headers['x-timestamp'];
107
+ const vapiSignature = headers['x-signature'];
108
+ const message = `${timestamp}.${requestBodyString}`;
109
+ const hashForVerify = crypto.createHmac('sha256', secretToken).update(message).digest('hex');
110
+ const signature = `${signaturePrefix}${hashForVerify}`;
111
+ const valid = vapiSignature === signature;
112
+ return valid;
113
+ }
114
+ const verify = verificationType === 'hmac' ? verifyHmac : verificationType === 'secret' ? verifySecret : verifyNone;
115
+ return async (request, rawBody) => {
116
+ const requestBodyString = String(request.body);
117
+ const valid = verify({ request, requestBodyString });
118
+ const requestBody = JSON.parse(requestBodyString);
119
+ const result = {
120
+ valid,
121
+ event: requestBody.message
122
+ };
123
+ return result;
124
+ };
125
+ }
126
+
127
+ const VAPI_AI_WEBHOOK_SECRET_TOKEN_ENV_VAR = 'VAPI_AI_WEBHOOK_SECRET_TOKEN';
128
+ const VAPI_AI_WEBHOOK_HMAC_SECRET_TOKEN_ENV_VAR = 'VAPI_AI_WEBHOOK_HMAC_SECRET_TOKEN';
129
+ const VAPI_AI_WEBHOOK_SECRET_VERIFICATION_TYPE_ENV_VAR = 'VAPI_AI_WEBHOOK_SECRET_VERIFICATION_TYPE';
130
+ const VAPI_AI_WEBHOOK_SIGNATURE_PREFIX_ENV_VAR = 'VAPI_AI_WEBHOOK_SIGNATURE_PREFIX';
131
+ /**
132
+ * Configuration for VapiAiService
133
+ */
134
+ class VapiAiWebhookServiceConfig {
135
+ webhookConfig;
136
+ static assertValidConfig(config) {
137
+ if (!config.webhookConfig.secret && !config.webhookConfig.hmacSecret) {
138
+ throw new Error('No Vapi.ai webhook secret token specified.');
139
+ }
140
+ }
141
+ }
142
+
143
+ /**
144
+ * Service that makes system changes based on VapiAi webhook events.
145
+ */
146
+ exports.VapiAiWebhookService = class VapiAiWebhookService {
147
+ logger = new common.Logger('VapiAiWebhookService');
148
+ _verifier;
149
+ handler = vapiaiEventHandlerFactory();
150
+ configure = vapiaiEventHandlerConfigurerFactory(this.handler);
151
+ constructor(vapiAiWebhookServiceConfig) {
152
+ this._verifier = vapiAiWebhookEventVerifier(vapiAiWebhookServiceConfig.webhookConfig);
153
+ }
154
+ async updateForWebhook(req, rawBody) {
155
+ const { valid, event } = await this._verifier(req, rawBody);
156
+ let result = {
157
+ handled: false
158
+ };
159
+ if (!valid) {
160
+ this.logger.warn('Received invalid Vapi.ai event: ', event);
161
+ }
162
+ else {
163
+ result = await this.updateForVapiAiEvent(event);
164
+ }
165
+ const response = {
166
+ valid,
167
+ event,
168
+ ...result
169
+ };
170
+ return response;
171
+ }
172
+ async updateForVapiAiEvent(event) {
173
+ const result = await this.handler(event);
174
+ if (!result.handled) {
175
+ this.logger.warn('Received unexpected/unhandled Vapi.ai event: ', event);
176
+ }
177
+ return result;
178
+ }
179
+ };
180
+ exports.VapiAiWebhookService = __decorate([
181
+ common.Injectable(),
182
+ __param(0, common.Inject(VapiAiWebhookServiceConfig)),
183
+ __metadata("design:paramtypes", [VapiAiWebhookServiceConfig])
184
+ ], exports.VapiAiWebhookService);
185
+
186
+ exports.VapiAiWebhookController = class VapiAiWebhookController {
187
+ _vapiaiWebhookService;
188
+ constructor(vapiaiWebhookService) {
189
+ this._vapiaiWebhookService = vapiaiWebhookService;
190
+ }
191
+ async handleVapiAiWebhook(res, req, rawBody) {
192
+ const { valid, response: responseData } = await this._vapiaiWebhookService.updateForWebhook(req, rawBody);
193
+ const response = res.status(200); // always return a 200 status code
194
+ if (valid && responseData) {
195
+ response.json(responseData);
196
+ }
197
+ else {
198
+ response.json({});
199
+ }
200
+ }
201
+ };
202
+ __decorate([
203
+ common.Post(),
204
+ __param(0, common.Res()),
205
+ __param(1, common.Req()),
206
+ __param(2, nestjs.RawBody()),
207
+ __metadata("design:type", Function),
208
+ __metadata("design:paramtypes", [Object, Object, Object]),
209
+ __metadata("design:returntype", Promise)
210
+ ], exports.VapiAiWebhookController.prototype, "handleVapiAiWebhook", null);
211
+ exports.VapiAiWebhookController = __decorate([
212
+ common.Controller('/webhook/vapiai'),
213
+ __param(0, common.Inject(exports.VapiAiWebhookService)),
214
+ __metadata("design:paramtypes", [exports.VapiAiWebhookService])
215
+ ], exports.VapiAiWebhookController);
216
+
217
+ function vapiaiWebhookServiceConfigFactory(configService) {
218
+ const config = {
219
+ webhookConfig: {
220
+ secret: configService.get(VAPI_AI_WEBHOOK_SECRET_TOKEN_ENV_VAR),
221
+ hmacSecret: configService.get(VAPI_AI_WEBHOOK_HMAC_SECRET_TOKEN_ENV_VAR),
222
+ verificationType: configService.get(VAPI_AI_WEBHOOK_SECRET_VERIFICATION_TYPE_ENV_VAR),
223
+ signaturePrefix: configService.get(VAPI_AI_WEBHOOK_SIGNATURE_PREFIX_ENV_VAR)
224
+ }
225
+ };
226
+ VapiAiWebhookServiceConfig.assertValidConfig(config);
227
+ return config;
228
+ }
229
+ exports.VapiAiWebhookModule = class VapiAiWebhookModule {
230
+ };
231
+ exports.VapiAiWebhookModule = __decorate([
232
+ common.Module({
233
+ imports: [config.ConfigModule],
234
+ controllers: [exports.VapiAiWebhookController],
235
+ providers: [
236
+ {
237
+ provide: VapiAiWebhookServiceConfig,
238
+ inject: [config.ConfigService],
239
+ useFactory: vapiaiWebhookServiceConfigFactory
240
+ },
241
+ exports.VapiAiWebhookService
242
+ ],
243
+ exports: [exports.VapiAiWebhookService]
244
+ })
245
+ ], exports.VapiAiWebhookModule);
246
+
247
+ const VAPI_AI_SECRET_TOKEN_ENV_VAR = 'VAPI_AI_SECRET_TOKEN';
248
+ /**
249
+ * Configuration for VapiAiService
250
+ */
251
+ class VapiAiServiceConfig {
252
+ vapiai;
253
+ static assertValidConfig(config) {
254
+ if (!config.vapiai.config.token) {
255
+ throw new Error('No Vapi.ai secret/token specified.');
256
+ }
257
+ }
258
+ }
259
+
260
+ exports.VapiAiApi = class VapiAiApi {
261
+ config;
262
+ vapiClient;
263
+ constructor(config) {
264
+ this.config = config;
265
+ this.vapiClient = new serverSdk.VapiClient(config.vapiai.config);
266
+ }
267
+ // MARK: Accessors
268
+ /**
269
+ * Gets a call by ID.
270
+ *
271
+ * @param callId
272
+ * @returns
273
+ */
274
+ getCall(callId) {
275
+ return this.vapiClient.calls.get({ id: callId });
276
+ }
277
+ };
278
+ exports.VapiAiApi = __decorate([
279
+ common.Injectable(),
280
+ __param(0, common.Inject(VapiAiServiceConfig)),
281
+ __metadata("design:paramtypes", [VapiAiServiceConfig])
282
+ ], exports.VapiAiApi);
283
+
284
+ function vapiaiServiceConfigFactory(configService) {
285
+ const config = {
286
+ vapiai: {
287
+ config: {
288
+ token: configService.get(VAPI_AI_SECRET_TOKEN_ENV_VAR)
289
+ }
290
+ }
291
+ };
292
+ VapiAiServiceConfig.assertValidConfig(config);
293
+ return config;
294
+ }
295
+ exports.VapiAiModule = class VapiAiModule {
296
+ };
297
+ exports.VapiAiModule = __decorate([
298
+ common.Module({
299
+ imports: [config.ConfigModule],
300
+ providers: [
301
+ {
302
+ provide: VapiAiServiceConfig,
303
+ inject: [config.ConfigService],
304
+ useFactory: vapiaiServiceConfigFactory
305
+ },
306
+ exports.VapiAiApi
307
+ ],
308
+ exports: [exports.VapiAiApi]
309
+ })
310
+ ], exports.VapiAiModule);
311
+
312
+ exports.VAPI_AI_SECRET_TOKEN_ENV_VAR = VAPI_AI_SECRET_TOKEN_ENV_VAR;
313
+ exports.VapiAiServiceConfig = VapiAiServiceConfig;
314
+ exports.vapiAiWebhookEvent = vapiAiWebhookEvent;
315
+ exports.vapiAiWebhookEventVerifier = vapiAiWebhookEventVerifier;
316
+ exports.vapiaiEventHandlerConfigurerFactory = vapiaiEventHandlerConfigurerFactory;
317
+ exports.vapiaiEventHandlerFactory = vapiaiEventHandlerFactory;
318
+ exports.vapiaiServiceConfigFactory = vapiaiServiceConfigFactory;
319
+ exports.vapiaiWebhookServiceConfigFactory = vapiaiWebhookServiceConfigFactory;
@@ -0,0 +1,2 @@
1
+ export * from './index.cjs.js';
2
+ export { _default as default } from './index.cjs.default.js';
@@ -0,0 +1 @@
1
+ export * from "./src/index";
@@ -0,0 +1,310 @@
1
+ import { handlerFactory, handlerConfigurerFactory, handlerMappedSetFunctionFactory } from '@dereekb/util';
2
+ import { RawBody } from '@dereekb/nestjs';
3
+ import { Injectable, Inject, Logger, Post, Res, Req, Controller, Module } from '@nestjs/common';
4
+ import { createHmac } from 'crypto';
5
+ import { ConfigService, ConfigModule } from '@nestjs/config';
6
+ import { VapiClient } from '@vapi-ai/server-sdk';
7
+
8
+ /**
9
+ * Creates a VapiAiWebhookEvent and treats the data as the input type.
10
+ *
11
+ * @param event
12
+ * @returns
13
+ */
14
+ function vapiAiWebhookEvent(event) {
15
+ return event;
16
+ }
17
+ const vapiaiEventHandlerFactory = handlerFactory((x) => x.type, {
18
+ defaultResult: {
19
+ handled: true,
20
+ response: undefined
21
+ },
22
+ negativeResult: {
23
+ handled: true,
24
+ response: undefined
25
+ }
26
+ });
27
+ const vapiaiEventHandlerConfigurerFactory = handlerConfigurerFactory({
28
+ configurerForAccessor: (accessor) => {
29
+ // eslint-disable-next-line
30
+ const fnWithKey = handlerMappedSetFunctionFactory(accessor, vapiAiWebhookEvent);
31
+ const configurer = {
32
+ ...accessor,
33
+ handleAssistantRequest: fnWithKey('assistant-request'),
34
+ handleStatusUpdate: fnWithKey('status-update'),
35
+ handleFunctionCall: fnWithKey('function-call'),
36
+ handleEndOfCallReport: fnWithKey('end-of-call-report'),
37
+ handleHang: fnWithKey('hang')
38
+ };
39
+ return configurer;
40
+ }
41
+ });
42
+
43
+ /******************************************************************************
44
+ Copyright (c) Microsoft Corporation.
45
+
46
+ Permission to use, copy, modify, and/or distribute this software for any
47
+ purpose with or without fee is hereby granted.
48
+
49
+ THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES WITH
50
+ REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY
51
+ AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT,
52
+ INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM
53
+ LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR
54
+ OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR
55
+ PERFORMANCE OF THIS SOFTWARE.
56
+ ***************************************************************************** */
57
+ /* global Reflect, Promise, SuppressedError, Symbol, Iterator */
58
+
59
+
60
+ function __decorate(decorators, target, key, desc) {
61
+ var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;
62
+ if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc);
63
+ else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;
64
+ return c > 3 && r && Object.defineProperty(target, key, r), r;
65
+ }
66
+
67
+ function __param(paramIndex, decorator) {
68
+ return function (target, key) { decorator(target, key, paramIndex); }
69
+ }
70
+
71
+ function __metadata(metadataKey, metadataValue) {
72
+ if (typeof Reflect === "object" && typeof Reflect.metadata === "function") return Reflect.metadata(metadataKey, metadataValue);
73
+ }
74
+
75
+ typeof SuppressedError === "function" ? SuppressedError : function (error, suppressed, message) {
76
+ var e = new Error(message);
77
+ return e.name = "SuppressedError", e.error = error, e.suppressed = suppressed, e;
78
+ };
79
+
80
+ /**
81
+ * Verifies a VapiAi webhook event header.
82
+ *
83
+ * @param vapiSecretTokenGetter The VapiAi secret token. The Vapi client allows for using an AsyncGetterOrValue type, so the verifier supports that as well.
84
+ * @returns A function that verifies a VapiAi webhook event.
85
+ */
86
+ function vapiAiWebhookEventVerifier(config) {
87
+ const { verificationType: inputVerificationType, secret: inputSecret, hmacSecret: inputHmacSecret, signaturePrefix: inputSignaturePrefix } = config;
88
+ const verificationType = inputVerificationType ?? (inputHmacSecret != null ? 'hmac' : 'secret'); // default to secret always, never default to none
89
+ const secretToken = (verificationType === 'hmac' ? (inputHmacSecret ?? inputSecret) : inputSecret) ?? '';
90
+ const signaturePrefix = inputSignaturePrefix ?? '';
91
+ function verifyNone(input) {
92
+ return true;
93
+ }
94
+ function verifySecret(input) {
95
+ const { request } = input;
96
+ const headers = request.headers;
97
+ const vapiSecret = headers['x-vapi-secret'];
98
+ const valid = vapiSecret === secretToken;
99
+ return valid;
100
+ }
101
+ function verifyHmac(input) {
102
+ const { request, requestBodyString } = input;
103
+ const headers = request.headers;
104
+ const timestamp = headers['x-timestamp'];
105
+ const vapiSignature = headers['x-signature'];
106
+ const message = `${timestamp}.${requestBodyString}`;
107
+ const hashForVerify = createHmac('sha256', secretToken).update(message).digest('hex');
108
+ const signature = `${signaturePrefix}${hashForVerify}`;
109
+ const valid = vapiSignature === signature;
110
+ return valid;
111
+ }
112
+ const verify = verificationType === 'hmac' ? verifyHmac : verificationType === 'secret' ? verifySecret : verifyNone;
113
+ return async (request, rawBody) => {
114
+ const requestBodyString = String(request.body);
115
+ const valid = verify({ request, requestBodyString });
116
+ const requestBody = JSON.parse(requestBodyString);
117
+ const result = {
118
+ valid,
119
+ event: requestBody.message
120
+ };
121
+ return result;
122
+ };
123
+ }
124
+
125
+ const VAPI_AI_WEBHOOK_SECRET_TOKEN_ENV_VAR = 'VAPI_AI_WEBHOOK_SECRET_TOKEN';
126
+ const VAPI_AI_WEBHOOK_HMAC_SECRET_TOKEN_ENV_VAR = 'VAPI_AI_WEBHOOK_HMAC_SECRET_TOKEN';
127
+ const VAPI_AI_WEBHOOK_SECRET_VERIFICATION_TYPE_ENV_VAR = 'VAPI_AI_WEBHOOK_SECRET_VERIFICATION_TYPE';
128
+ const VAPI_AI_WEBHOOK_SIGNATURE_PREFIX_ENV_VAR = 'VAPI_AI_WEBHOOK_SIGNATURE_PREFIX';
129
+ /**
130
+ * Configuration for VapiAiService
131
+ */
132
+ class VapiAiWebhookServiceConfig {
133
+ webhookConfig;
134
+ static assertValidConfig(config) {
135
+ if (!config.webhookConfig.secret && !config.webhookConfig.hmacSecret) {
136
+ throw new Error('No Vapi.ai webhook secret token specified.');
137
+ }
138
+ }
139
+ }
140
+
141
+ /**
142
+ * Service that makes system changes based on VapiAi webhook events.
143
+ */
144
+ let VapiAiWebhookService = class VapiAiWebhookService {
145
+ logger = new Logger('VapiAiWebhookService');
146
+ _verifier;
147
+ handler = vapiaiEventHandlerFactory();
148
+ configure = vapiaiEventHandlerConfigurerFactory(this.handler);
149
+ constructor(vapiAiWebhookServiceConfig) {
150
+ this._verifier = vapiAiWebhookEventVerifier(vapiAiWebhookServiceConfig.webhookConfig);
151
+ }
152
+ async updateForWebhook(req, rawBody) {
153
+ const { valid, event } = await this._verifier(req, rawBody);
154
+ let result = {
155
+ handled: false
156
+ };
157
+ if (!valid) {
158
+ this.logger.warn('Received invalid Vapi.ai event: ', event);
159
+ }
160
+ else {
161
+ result = await this.updateForVapiAiEvent(event);
162
+ }
163
+ const response = {
164
+ valid,
165
+ event,
166
+ ...result
167
+ };
168
+ return response;
169
+ }
170
+ async updateForVapiAiEvent(event) {
171
+ const result = await this.handler(event);
172
+ if (!result.handled) {
173
+ this.logger.warn('Received unexpected/unhandled Vapi.ai event: ', event);
174
+ }
175
+ return result;
176
+ }
177
+ };
178
+ VapiAiWebhookService = __decorate([
179
+ Injectable(),
180
+ __param(0, Inject(VapiAiWebhookServiceConfig)),
181
+ __metadata("design:paramtypes", [VapiAiWebhookServiceConfig])
182
+ ], VapiAiWebhookService);
183
+
184
+ let VapiAiWebhookController = class VapiAiWebhookController {
185
+ _vapiaiWebhookService;
186
+ constructor(vapiaiWebhookService) {
187
+ this._vapiaiWebhookService = vapiaiWebhookService;
188
+ }
189
+ async handleVapiAiWebhook(res, req, rawBody) {
190
+ const { valid, response: responseData } = await this._vapiaiWebhookService.updateForWebhook(req, rawBody);
191
+ const response = res.status(200); // always return a 200 status code
192
+ if (valid && responseData) {
193
+ response.json(responseData);
194
+ }
195
+ else {
196
+ response.json({});
197
+ }
198
+ }
199
+ };
200
+ __decorate([
201
+ Post(),
202
+ __param(0, Res()),
203
+ __param(1, Req()),
204
+ __param(2, RawBody()),
205
+ __metadata("design:type", Function),
206
+ __metadata("design:paramtypes", [Object, Object, Object]),
207
+ __metadata("design:returntype", Promise)
208
+ ], VapiAiWebhookController.prototype, "handleVapiAiWebhook", null);
209
+ VapiAiWebhookController = __decorate([
210
+ Controller('/webhook/vapiai'),
211
+ __param(0, Inject(VapiAiWebhookService)),
212
+ __metadata("design:paramtypes", [VapiAiWebhookService])
213
+ ], VapiAiWebhookController);
214
+
215
+ function vapiaiWebhookServiceConfigFactory(configService) {
216
+ const config = {
217
+ webhookConfig: {
218
+ secret: configService.get(VAPI_AI_WEBHOOK_SECRET_TOKEN_ENV_VAR),
219
+ hmacSecret: configService.get(VAPI_AI_WEBHOOK_HMAC_SECRET_TOKEN_ENV_VAR),
220
+ verificationType: configService.get(VAPI_AI_WEBHOOK_SECRET_VERIFICATION_TYPE_ENV_VAR),
221
+ signaturePrefix: configService.get(VAPI_AI_WEBHOOK_SIGNATURE_PREFIX_ENV_VAR)
222
+ }
223
+ };
224
+ VapiAiWebhookServiceConfig.assertValidConfig(config);
225
+ return config;
226
+ }
227
+ let VapiAiWebhookModule = class VapiAiWebhookModule {
228
+ };
229
+ VapiAiWebhookModule = __decorate([
230
+ Module({
231
+ imports: [ConfigModule],
232
+ controllers: [VapiAiWebhookController],
233
+ providers: [
234
+ {
235
+ provide: VapiAiWebhookServiceConfig,
236
+ inject: [ConfigService],
237
+ useFactory: vapiaiWebhookServiceConfigFactory
238
+ },
239
+ VapiAiWebhookService
240
+ ],
241
+ exports: [VapiAiWebhookService]
242
+ })
243
+ ], VapiAiWebhookModule);
244
+
245
+ const VAPI_AI_SECRET_TOKEN_ENV_VAR = 'VAPI_AI_SECRET_TOKEN';
246
+ /**
247
+ * Configuration for VapiAiService
248
+ */
249
+ class VapiAiServiceConfig {
250
+ vapiai;
251
+ static assertValidConfig(config) {
252
+ if (!config.vapiai.config.token) {
253
+ throw new Error('No Vapi.ai secret/token specified.');
254
+ }
255
+ }
256
+ }
257
+
258
+ let VapiAiApi = class VapiAiApi {
259
+ config;
260
+ vapiClient;
261
+ constructor(config) {
262
+ this.config = config;
263
+ this.vapiClient = new VapiClient(config.vapiai.config);
264
+ }
265
+ // MARK: Accessors
266
+ /**
267
+ * Gets a call by ID.
268
+ *
269
+ * @param callId
270
+ * @returns
271
+ */
272
+ getCall(callId) {
273
+ return this.vapiClient.calls.get({ id: callId });
274
+ }
275
+ };
276
+ VapiAiApi = __decorate([
277
+ Injectable(),
278
+ __param(0, Inject(VapiAiServiceConfig)),
279
+ __metadata("design:paramtypes", [VapiAiServiceConfig])
280
+ ], VapiAiApi);
281
+
282
+ function vapiaiServiceConfigFactory(configService) {
283
+ const config = {
284
+ vapiai: {
285
+ config: {
286
+ token: configService.get(VAPI_AI_SECRET_TOKEN_ENV_VAR)
287
+ }
288
+ }
289
+ };
290
+ VapiAiServiceConfig.assertValidConfig(config);
291
+ return config;
292
+ }
293
+ let VapiAiModule = class VapiAiModule {
294
+ };
295
+ VapiAiModule = __decorate([
296
+ Module({
297
+ imports: [ConfigModule],
298
+ providers: [
299
+ {
300
+ provide: VapiAiServiceConfig,
301
+ inject: [ConfigService],
302
+ useFactory: vapiaiServiceConfigFactory
303
+ },
304
+ VapiAiApi
305
+ ],
306
+ exports: [VapiAiApi]
307
+ })
308
+ ], VapiAiModule);
309
+
310
+ export { VAPI_AI_SECRET_TOKEN_ENV_VAR, VapiAiApi, VapiAiModule, VapiAiServiceConfig, VapiAiWebhookController, VapiAiWebhookModule, VapiAiWebhookService, vapiAiWebhookEvent, vapiAiWebhookEventVerifier, vapiaiEventHandlerConfigurerFactory, vapiaiEventHandlerFactory, vapiaiServiceConfigFactory, vapiaiWebhookServiceConfigFactory };
@@ -1,9 +1,27 @@
1
1
  {
2
2
  "name": "@dereekb/nestjs/vapiai",
3
- "version": "12.7.0",
4
- "type": "commonjs",
5
- "peerDependencies": {},
6
- "dependencies": {},
7
- "types": "./src/index.d.ts",
8
- "main": "./src/index.js"
3
+ "version": "13.0.1",
4
+ "peerDependencies": {
5
+ "@dereekb/date": "13.0.1",
6
+ "@dereekb/model": "13.0.1",
7
+ "@dereekb/nestjs": "13.0.1",
8
+ "@dereekb/rxjs": "13.0.1",
9
+ "@dereekb/util": "13.0.1",
10
+ "@nestjs/common": "^11.0.0",
11
+ "@nestjs/config": "^4.0.0",
12
+ "@vapi-ai/server-sdk": "^0.11.0",
13
+ "express": "^5.0.0"
14
+ },
15
+ "exports": {
16
+ "./package.json": "./package.json",
17
+ ".": {
18
+ "module": "./index.esm.js",
19
+ "types": "./index.d.ts",
20
+ "import": "./index.cjs.mjs",
21
+ "default": "./index.cjs.js"
22
+ }
23
+ },
24
+ "module": "./index.esm.js",
25
+ "main": "./index.cjs.js",
26
+ "types": "./index.d.ts"
9
27
  }
@@ -1,6 +1,5 @@
1
1
  export * from './webhook';
2
2
  export * from './vapiai.module';
3
3
  export * from './vapiai.api';
4
- export * from './vapiai.module';
5
4
  export * from './vapiai.config';
6
5
  export * from './vapiai.type';