@dereekb/nestjs 12.6.21 → 13.0.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 +1 -1
- package/index.cjs.js +292 -0
- package/index.d.ts +1 -0
- package/index.esm.js +270 -0
- package/mailgun/index.cjs.js +646 -0
- package/mailgun/index.d.ts +1 -0
- package/mailgun/index.esm.js +633 -0
- package/mailgun/package.json +24 -3
- package/mailgun/src/lib/mailgun.d.ts +2 -2
- package/mailgun/src/lib/mailgun.type.d.ts +1 -1
- package/mailgun/src/lib/mailgun.util.d.ts +22 -17
- package/openai/index.cjs.js +310 -0
- package/openai/index.d.ts +1 -0
- package/openai/index.esm.js +293 -0
- package/openai/package.json +24 -5
- package/openai/src/lib/index.d.ts +0 -1
- package/openai/src/lib/webhook/webhook.openai.controller.d.ts +1 -1
- package/openai/src/lib/webhook/webhook.openai.d.ts +2 -2
- package/openai/src/lib/webhook/webhook.openai.service.d.ts +1 -1
- package/package.json +58 -28
- package/stripe/index.cjs.js +223 -0
- package/stripe/index.d.ts +1 -0
- package/stripe/index.esm.js +215 -0
- package/stripe/package.json +24 -5
- package/stripe/src/lib/index.d.ts +1 -1
- package/stripe/src/lib/stripe.module.d.ts +2 -2
- package/stripe/src/lib/webhook/webhook.stripe.controller.d.ts +1 -1
- package/typeform/index.cjs.js +378 -0
- package/typeform/index.d.ts +1 -0
- package/typeform/index.esm.js +363 -0
- package/typeform/package.json +24 -5
- package/typeform/src/lib/index.d.ts +0 -1
- package/typeform/src/lib/webhook/webhook.typeform.controller.d.ts +1 -1
- package/vapiai/index.cjs.js +306 -0
- package/vapiai/index.d.ts +1 -0
- package/vapiai/index.esm.js +297 -0
- package/vapiai/package.json +24 -5
- package/vapiai/src/lib/index.d.ts +0 -1
- package/vapiai/src/lib/vapiai.type.d.ts +3 -1
- package/vapiai/src/lib/webhook/webhook.vapiai.controller.d.ts +1 -1
- package/vapiai/src/lib/webhook/webhook.vapiai.d.ts +1 -9
- package/vapiai/src/lib/webhook/webhook.vapiai.types.d.ts +6 -34
- package/CHANGELOG.md +0 -1997
- package/mailgun/LICENSE +0 -21
- package/mailgun/src/index.js +0 -5
- package/mailgun/src/index.js.map +0 -1
- package/mailgun/src/lib/index.js +0 -10
- package/mailgun/src/lib/index.js.map +0 -1
- package/mailgun/src/lib/mailgun.api.js +0 -37
- package/mailgun/src/lib/mailgun.api.js.map +0 -1
- package/mailgun/src/lib/mailgun.config.js +0 -45
- package/mailgun/src/lib/mailgun.config.js.map +0 -1
- package/mailgun/src/lib/mailgun.js +0 -205
- package/mailgun/src/lib/mailgun.js.map +0 -1
- package/mailgun/src/lib/mailgun.service.js +0 -53
- package/mailgun/src/lib/mailgun.service.js.map +0 -1
- package/mailgun/src/lib/mailgun.service.module.js +0 -84
- package/mailgun/src/lib/mailgun.service.module.js.map +0 -1
- package/mailgun/src/lib/mailgun.type.js +0 -3
- package/mailgun/src/lib/mailgun.type.js.map +0 -1
- package/mailgun/src/lib/mailgun.util.js +0 -206
- package/mailgun/src/lib/mailgun.util.js.map +0 -1
- package/openai/LICENSE +0 -21
- package/openai/src/index.js +0 -5
- package/openai/src/index.js.map +0 -1
- package/openai/src/lib/index.js +0 -11
- package/openai/src/lib/index.js.map +0 -1
- package/openai/src/lib/openai.api.js +0 -22
- package/openai/src/lib/openai.api.js.map +0 -1
- package/openai/src/lib/openai.config.js +0 -29
- package/openai/src/lib/openai.config.js.map +0 -1
- package/openai/src/lib/openai.module.js +0 -41
- package/openai/src/lib/openai.module.js.map +0 -1
- package/openai/src/lib/openai.type.js +0 -3
- package/openai/src/lib/openai.type.js.map +0 -1
- package/openai/src/lib/openai.util.js +0 -48
- package/openai/src/lib/openai.util.js.map +0 -1
- package/openai/src/lib/webhook/index.js +0 -10
- package/openai/src/lib/webhook/index.js.map +0 -1
- package/openai/src/lib/webhook/webhook.openai.config.js +0 -17
- package/openai/src/lib/webhook/webhook.openai.config.js.map +0 -1
- package/openai/src/lib/webhook/webhook.openai.controller.js +0 -30
- package/openai/src/lib/webhook/webhook.openai.controller.js.map +0 -1
- package/openai/src/lib/webhook/webhook.openai.js +0 -41
- package/openai/src/lib/webhook/webhook.openai.js.map +0 -1
- package/openai/src/lib/webhook/webhook.openai.module.js +0 -39
- package/openai/src/lib/webhook/webhook.openai.module.js.map +0 -1
- package/openai/src/lib/webhook/webhook.openai.service.js +0 -48
- package/openai/src/lib/webhook/webhook.openai.service.js.map +0 -1
- package/openai/src/lib/webhook/webhook.openai.verify.js +0 -37
- package/openai/src/lib/webhook/webhook.openai.verify.js.map +0 -1
- package/src/index.js +0 -5
- package/src/index.js.map +0 -1
- package/src/lib/decorators/index.js +0 -6
- package/src/lib/decorators/index.js.map +0 -1
- package/src/lib/decorators/local.decorator.js +0 -17
- package/src/lib/decorators/local.decorator.js.map +0 -1
- package/src/lib/decorators/rawbody.js +0 -44
- package/src/lib/decorators/rawbody.js.map +0 -1
- package/src/lib/index.js +0 -7
- package/src/lib/index.js.map +0 -1
- package/src/lib/middlewares/index.js +0 -7
- package/src/lib/middlewares/index.js.map +0 -1
- package/src/lib/middlewares/json.middleware.js +0 -16
- package/src/lib/middlewares/json.middleware.js.map +0 -1
- package/src/lib/middlewares/rawbody.middleware.js +0 -16
- package/src/lib/middlewares/rawbody.middleware.js.map +0 -1
- package/src/lib/middlewares/webhook.js +0 -51
- package/src/lib/middlewares/webhook.js.map +0 -1
- package/src/lib/module/client/client.config.js +0 -13
- package/src/lib/module/client/client.config.js.map +0 -1
- package/src/lib/module/client/client.js +0 -8
- package/src/lib/module/client/client.js.map +0 -1
- package/src/lib/module/client/client.module.js +0 -36
- package/src/lib/module/client/client.module.js.map +0 -1
- package/src/lib/module/client/client.service.js +0 -30
- package/src/lib/module/client/client.service.js.map +0 -1
- package/src/lib/module/client/index.js +0 -8
- package/src/lib/module/client/index.js.map +0 -1
- package/src/lib/module/env/env.config.js +0 -14
- package/src/lib/module/env/env.config.js.map +0 -1
- package/src/lib/module/env/env.js +0 -10
- package/src/lib/module/env/env.js.map +0 -1
- package/src/lib/module/env/env.nest.js +0 -16
- package/src/lib/module/env/env.nest.js.map +0 -1
- package/src/lib/module/env/env.service.js +0 -33
- package/src/lib/module/env/env.service.js.map +0 -1
- package/src/lib/module/env/index.js +0 -8
- package/src/lib/module/env/index.js.map +0 -1
- package/src/lib/module/index.js +0 -7
- package/src/lib/module/index.js.map +0 -1
- package/src/lib/module/module.js +0 -26
- package/src/lib/module/module.js.map +0 -1
- package/stripe/LICENSE +0 -21
- package/stripe/src/index.js +0 -5
- package/stripe/src/index.js.map +0 -1
- package/stripe/src/lib/index.js +0 -8
- package/stripe/src/lib/index.js.map +0 -1
- package/stripe/src/lib/stripe.api.js +0 -40
- package/stripe/src/lib/stripe.api.js.map +0 -1
- package/stripe/src/lib/stripe.config.js +0 -19
- package/stripe/src/lib/stripe.config.js.map +0 -1
- package/stripe/src/lib/stripe.module.js +0 -41
- package/stripe/src/lib/stripe.module.js.map +0 -1
- package/stripe/src/lib/stripe.type.js +0 -4
- package/stripe/src/lib/stripe.type.js.map +0 -1
- package/stripe/src/lib/webhook/index.js +0 -8
- package/stripe/src/lib/webhook/index.js.map +0 -1
- package/stripe/src/lib/webhook/webhook.stripe.controller.js +0 -30
- package/stripe/src/lib/webhook/webhook.stripe.controller.js.map +0 -1
- package/stripe/src/lib/webhook/webhook.stripe.js +0 -67
- package/stripe/src/lib/webhook/webhook.stripe.js.map +0 -1
- package/stripe/src/lib/webhook/webhook.stripe.module.js +0 -20
- package/stripe/src/lib/webhook/webhook.stripe.module.js.map +0 -1
- package/stripe/src/lib/webhook/webhook.stripe.service.js +0 -36
- package/stripe/src/lib/webhook/webhook.stripe.service.js.map +0 -1
- package/typeform/LICENSE +0 -21
- package/typeform/src/index.js +0 -5
- package/typeform/src/index.js.map +0 -1
- package/typeform/src/lib/index.js +0 -11
- package/typeform/src/lib/index.js.map +0 -1
- package/typeform/src/lib/typeform.api.js +0 -22
- package/typeform/src/lib/typeform.api.js.map +0 -1
- package/typeform/src/lib/typeform.config.js +0 -21
- package/typeform/src/lib/typeform.config.js.map +0 -1
- package/typeform/src/lib/typeform.module.js +0 -39
- package/typeform/src/lib/typeform.module.js.map +0 -1
- package/typeform/src/lib/typeform.type.js +0 -3
- package/typeform/src/lib/typeform.type.js.map +0 -1
- package/typeform/src/lib/typeform.util.js +0 -26
- package/typeform/src/lib/typeform.util.js.map +0 -1
- package/typeform/src/lib/webhook/index.js +0 -12
- package/typeform/src/lib/webhook/index.js.map +0 -1
- package/typeform/src/lib/webhook/webhook.typeform.config.js +0 -17
- package/typeform/src/lib/webhook/webhook.typeform.config.js.map +0 -1
- package/typeform/src/lib/webhook/webhook.typeform.controller.js +0 -30
- package/typeform/src/lib/webhook/webhook.typeform.controller.js.map +0 -1
- package/typeform/src/lib/webhook/webhook.typeform.form.js +0 -113
- package/typeform/src/lib/webhook/webhook.typeform.form.js.map +0 -1
- package/typeform/src/lib/webhook/webhook.typeform.js +0 -27
- package/typeform/src/lib/webhook/webhook.typeform.js.map +0 -1
- package/typeform/src/lib/webhook/webhook.typeform.module.js +0 -38
- package/typeform/src/lib/webhook/webhook.typeform.module.js.map +0 -1
- package/typeform/src/lib/webhook/webhook.typeform.service.js +0 -45
- package/typeform/src/lib/webhook/webhook.typeform.service.js.map +0 -1
- package/typeform/src/lib/webhook/webhook.typeform.type.js +0 -3
- package/typeform/src/lib/webhook/webhook.typeform.type.js.map +0 -1
- package/typeform/src/lib/webhook/webhook.typeform.verify.js +0 -28
- package/typeform/src/lib/webhook/webhook.typeform.verify.js.map +0 -1
- package/vapiai/LICENSE +0 -21
- package/vapiai/src/index.js +0 -5
- package/vapiai/src/index.js.map +0 -1
- package/vapiai/src/lib/index.js +0 -10
- package/vapiai/src/lib/index.js.map +0 -1
- package/vapiai/src/lib/vapiai.api.js +0 -32
- package/vapiai/src/lib/vapiai.api.js.map +0 -1
- package/vapiai/src/lib/vapiai.config.js +0 -17
- package/vapiai/src/lib/vapiai.config.js.map +0 -1
- package/vapiai/src/lib/vapiai.module.js +0 -38
- package/vapiai/src/lib/vapiai.module.js.map +0 -1
- package/vapiai/src/lib/vapiai.type.js +0 -3
- package/vapiai/src/lib/vapiai.type.js.map +0 -1
- package/vapiai/src/lib/webhook/index.js +0 -10
- package/vapiai/src/lib/webhook/index.js.map +0 -1
- package/vapiai/src/lib/webhook/webhook.vapi.config.js +0 -20
- package/vapiai/src/lib/webhook/webhook.vapi.config.js.map +0 -1
- package/vapiai/src/lib/webhook/webhook.vapiai.controller.js +0 -38
- package/vapiai/src/lib/webhook/webhook.vapiai.controller.js.map +0 -1
- package/vapiai/src/lib/webhook/webhook.vapiai.js +0 -42
- package/vapiai/src/lib/webhook/webhook.vapiai.js.map +0 -1
- package/vapiai/src/lib/webhook/webhook.vapiai.module.js +0 -41
- package/vapiai/src/lib/webhook/webhook.vapiai.module.js.map +0 -1
- package/vapiai/src/lib/webhook/webhook.vapiai.service.js +0 -52
- package/vapiai/src/lib/webhook/webhook.vapiai.service.js.map +0 -1
- package/vapiai/src/lib/webhook/webhook.vapiai.types.js +0 -25
- package/vapiai/src/lib/webhook/webhook.vapiai.types.js.map +0 -1
- package/vapiai/src/lib/webhook/webhook.vapiai.verify.js +0 -49
- package/vapiai/src/lib/webhook/webhook.vapiai.verify.js.map +0 -1
|
@@ -0,0 +1,293 @@
|
|
|
1
|
+
import { handlerFactory, handlerConfigurerFactory, handlerMappedSetFunctionFactory } from '@dereekb/util';
|
|
2
|
+
import { RawBody } from '@dereekb/nestjs';
|
|
3
|
+
import { Injectable, Inject, Logger, Post, Req, Controller, Module } from '@nestjs/common';
|
|
4
|
+
import { OpenAI, InvalidWebhookSignatureError } from 'openai';
|
|
5
|
+
import { ConfigService, ConfigModule } from '@nestjs/config';
|
|
6
|
+
|
|
7
|
+
/**
|
|
8
|
+
* Creates a OpenAIWebhookEvent and treats the data as the input type.
|
|
9
|
+
*
|
|
10
|
+
* @param event
|
|
11
|
+
* @returns
|
|
12
|
+
*/
|
|
13
|
+
function openAIWebhookEvent(event) {
|
|
14
|
+
return event;
|
|
15
|
+
}
|
|
16
|
+
const openaiEventHandlerFactory = handlerFactory(x => x.type);
|
|
17
|
+
const openaiEventHandlerConfigurerFactory = handlerConfigurerFactory({
|
|
18
|
+
configurerForAccessor: accessor => {
|
|
19
|
+
// eslint-disable-next-line
|
|
20
|
+
const fnWithKey = handlerMappedSetFunctionFactory(accessor, openAIWebhookEvent);
|
|
21
|
+
const configurer = {
|
|
22
|
+
...accessor,
|
|
23
|
+
handleBatchCancelled: fnWithKey('batch.cancelled'),
|
|
24
|
+
handleBatchCompleted: fnWithKey('batch.completed'),
|
|
25
|
+
handleBatchExpired: fnWithKey('batch.expired'),
|
|
26
|
+
handleBatchFailed: fnWithKey('batch.failed'),
|
|
27
|
+
handleEvalRunCanceled: fnWithKey('eval.run.canceled'),
|
|
28
|
+
handleEvalRunFailed: fnWithKey('eval.run.failed'),
|
|
29
|
+
handleEvalRunSucceeded: fnWithKey('eval.run.succeeded'),
|
|
30
|
+
handleFineTuningJobCancelled: fnWithKey('fine_tuning.job.cancelled'),
|
|
31
|
+
handleFineTuningJobFailed: fnWithKey('fine_tuning.job.failed'),
|
|
32
|
+
handleFineTuningJobSucceeded: fnWithKey('fine_tuning.job.succeeded'),
|
|
33
|
+
handleResponseCancelled: fnWithKey('response.cancelled'),
|
|
34
|
+
handleResponseCompleted: fnWithKey('response.completed'),
|
|
35
|
+
handleResponseFailed: fnWithKey('response.failed'),
|
|
36
|
+
handleResponseIncomplete: fnWithKey('response.incomplete')
|
|
37
|
+
};
|
|
38
|
+
return configurer;
|
|
39
|
+
}
|
|
40
|
+
});
|
|
41
|
+
|
|
42
|
+
const OPENAI_WEBHOOK_SECRET_TOKEN_ENV_VAR = 'OPENAI_WEBHOOK_SECRET_TOKEN';
|
|
43
|
+
/**
|
|
44
|
+
* Configuration for OpenAIService
|
|
45
|
+
*/
|
|
46
|
+
class OpenAIWebhookServiceConfig {
|
|
47
|
+
openaiWebhook;
|
|
48
|
+
static assertValidConfig(config) {
|
|
49
|
+
if (!config.openaiWebhook.webhookSecret) {
|
|
50
|
+
throw new Error('No OpenAI webhook secret specified.');
|
|
51
|
+
}
|
|
52
|
+
}
|
|
53
|
+
}
|
|
54
|
+
|
|
55
|
+
/******************************************************************************
|
|
56
|
+
Copyright (c) Microsoft Corporation.
|
|
57
|
+
|
|
58
|
+
Permission to use, copy, modify, and/or distribute this software for any
|
|
59
|
+
purpose with or without fee is hereby granted.
|
|
60
|
+
|
|
61
|
+
THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES WITH
|
|
62
|
+
REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY
|
|
63
|
+
AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT,
|
|
64
|
+
INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM
|
|
65
|
+
LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR
|
|
66
|
+
OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR
|
|
67
|
+
PERFORMANCE OF THIS SOFTWARE.
|
|
68
|
+
***************************************************************************** */
|
|
69
|
+
/* global Reflect, Promise, SuppressedError, Symbol, Iterator */
|
|
70
|
+
|
|
71
|
+
|
|
72
|
+
function __decorate(decorators, target, key, desc) {
|
|
73
|
+
var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;
|
|
74
|
+
if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc);
|
|
75
|
+
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;
|
|
76
|
+
return c > 3 && r && Object.defineProperty(target, key, r), r;
|
|
77
|
+
}
|
|
78
|
+
|
|
79
|
+
function __param(paramIndex, decorator) {
|
|
80
|
+
return function (target, key) { decorator(target, key, paramIndex); }
|
|
81
|
+
}
|
|
82
|
+
|
|
83
|
+
function __metadata(metadataKey, metadataValue) {
|
|
84
|
+
if (typeof Reflect === "object" && typeof Reflect.metadata === "function") return Reflect.metadata(metadataKey, metadataValue);
|
|
85
|
+
}
|
|
86
|
+
|
|
87
|
+
typeof SuppressedError === "function" ? SuppressedError : function (error, suppressed, message) {
|
|
88
|
+
var e = new Error(message);
|
|
89
|
+
return e.name = "SuppressedError", e.error = error, e.suppressed = suppressed, e;
|
|
90
|
+
};
|
|
91
|
+
|
|
92
|
+
/**
|
|
93
|
+
* Default environment variable for the OpenAI API key.
|
|
94
|
+
*/
|
|
95
|
+
const OPENAI_API_KEY_ENV_VAR = 'OPENAI_API_KEY';
|
|
96
|
+
const OPENAI_BASE_URL_ENV_VAR = 'OPENAI_BASE_URL';
|
|
97
|
+
const OPENAI_ORGANIZATION_ID_ENV_VAR = 'OPENAI_ORG_ID';
|
|
98
|
+
const OPENAI_PROJECT_ID_ENV_VAR = 'OPENAI_PROJECT_ID';
|
|
99
|
+
/**
|
|
100
|
+
* Configuration for OpenAIService
|
|
101
|
+
*/
|
|
102
|
+
class OpenAIServiceConfig {
|
|
103
|
+
openai;
|
|
104
|
+
static assertValidConfig(config) {
|
|
105
|
+
if (!config.openai.config.apiKey) {
|
|
106
|
+
throw new Error('No OpenAI API key specified.');
|
|
107
|
+
} else if (!config.openai.config.organization) {
|
|
108
|
+
throw new Error('No OpenAI organization specified.');
|
|
109
|
+
} else if (!config.openai.config.project) {
|
|
110
|
+
throw new Error('No OpenAI project specified.');
|
|
111
|
+
}
|
|
112
|
+
}
|
|
113
|
+
}
|
|
114
|
+
|
|
115
|
+
let OpenAIApi = class OpenAIApi {
|
|
116
|
+
config;
|
|
117
|
+
openAIClient;
|
|
118
|
+
constructor(config) {
|
|
119
|
+
this.config = config;
|
|
120
|
+
this.openAIClient = new OpenAI(config.openai.config);
|
|
121
|
+
}
|
|
122
|
+
};
|
|
123
|
+
OpenAIApi = __decorate([Injectable(), __param(0, Inject(OpenAIServiceConfig)), __metadata("design:paramtypes", [OpenAIServiceConfig])], OpenAIApi);
|
|
124
|
+
|
|
125
|
+
/**
|
|
126
|
+
* Verifies a OpenAI webhook event header.
|
|
127
|
+
*
|
|
128
|
+
* @param vapiSecretTokenGetter The OpenAI secret token. The Vapi client allows for using an AsyncGetterOrValue type, so the verifier supports that as well.
|
|
129
|
+
* @returns A function that verifies a OpenAI webhook event.
|
|
130
|
+
*/
|
|
131
|
+
function openAIWebhookEventVerifier(config) {
|
|
132
|
+
const {
|
|
133
|
+
secret,
|
|
134
|
+
client
|
|
135
|
+
} = config;
|
|
136
|
+
return async (request, rawBody) => {
|
|
137
|
+
const headers = request.headers;
|
|
138
|
+
const requestBodyString = String(request.body);
|
|
139
|
+
let event;
|
|
140
|
+
let valid = false;
|
|
141
|
+
try {
|
|
142
|
+
event = await client.webhooks.unwrap(requestBodyString, headers, secret);
|
|
143
|
+
valid = true;
|
|
144
|
+
} catch (e) {
|
|
145
|
+
if (e instanceof InvalidWebhookSignatureError) {
|
|
146
|
+
valid = false;
|
|
147
|
+
} else {
|
|
148
|
+
throw e;
|
|
149
|
+
}
|
|
150
|
+
}
|
|
151
|
+
const result = {
|
|
152
|
+
valid,
|
|
153
|
+
event
|
|
154
|
+
};
|
|
155
|
+
return result;
|
|
156
|
+
};
|
|
157
|
+
}
|
|
158
|
+
|
|
159
|
+
/**
|
|
160
|
+
* Service that makes system changes based on OpenAI webhook events.
|
|
161
|
+
*/
|
|
162
|
+
let OpenAIWebhookService = class OpenAIWebhookService {
|
|
163
|
+
logger = new Logger('OpenAIWebhookService');
|
|
164
|
+
_verifier;
|
|
165
|
+
handler = openaiEventHandlerFactory();
|
|
166
|
+
configure = openaiEventHandlerConfigurerFactory(this.handler);
|
|
167
|
+
constructor(openAiApi, openAIWebhookServiceConfig) {
|
|
168
|
+
const {
|
|
169
|
+
webhookSecret
|
|
170
|
+
} = openAIWebhookServiceConfig.openaiWebhook;
|
|
171
|
+
this._verifier = openAIWebhookEventVerifier({
|
|
172
|
+
secret: webhookSecret,
|
|
173
|
+
client: openAiApi.openAIClient
|
|
174
|
+
});
|
|
175
|
+
}
|
|
176
|
+
async updateForWebhook(req, rawBody) {
|
|
177
|
+
const result = await this._verifier(req, rawBody);
|
|
178
|
+
if (!result.valid) {
|
|
179
|
+
this.logger.warn('Received invalid OpenAI event.', req);
|
|
180
|
+
} else {
|
|
181
|
+
await this.updateForOpenAIEvent(result.event);
|
|
182
|
+
}
|
|
183
|
+
}
|
|
184
|
+
async updateForOpenAIEvent(event) {
|
|
185
|
+
const result = await this.handler(event);
|
|
186
|
+
if (!result) {
|
|
187
|
+
this.logger.warn('Received unexpected/unhandled OpenAI event.', event);
|
|
188
|
+
}
|
|
189
|
+
}
|
|
190
|
+
};
|
|
191
|
+
OpenAIWebhookService = __decorate([Injectable(), __param(0, Inject(OpenAIApi)), __param(1, Inject(OpenAIWebhookServiceConfig)), __metadata("design:paramtypes", [OpenAIApi, OpenAIWebhookServiceConfig])], OpenAIWebhookService);
|
|
192
|
+
|
|
193
|
+
let OpenAIWebhookController = class OpenAIWebhookController {
|
|
194
|
+
_openaiWebhookService;
|
|
195
|
+
constructor(openaiWebhookService) {
|
|
196
|
+
this._openaiWebhookService = openaiWebhookService;
|
|
197
|
+
}
|
|
198
|
+
async handleOpenAIWebhook(req, rawBody) {
|
|
199
|
+
await this._openaiWebhookService.updateForWebhook(req, rawBody);
|
|
200
|
+
}
|
|
201
|
+
};
|
|
202
|
+
__decorate([Post(), __param(0, Req()), __param(1, RawBody()), __metadata("design:type", Function), __metadata("design:paramtypes", [Object, Object]), __metadata("design:returntype", Promise)], OpenAIWebhookController.prototype, "handleOpenAIWebhook", null);
|
|
203
|
+
OpenAIWebhookController = __decorate([Controller('/webhook/openai'), __param(0, Inject(OpenAIWebhookService)), __metadata("design:paramtypes", [OpenAIWebhookService])], OpenAIWebhookController);
|
|
204
|
+
|
|
205
|
+
function openAIServiceConfigFactory(configService) {
|
|
206
|
+
const config = {
|
|
207
|
+
openai: {
|
|
208
|
+
config: {
|
|
209
|
+
apiKey: configService.get(OPENAI_API_KEY_ENV_VAR),
|
|
210
|
+
baseURL: configService.get(OPENAI_BASE_URL_ENV_VAR) ?? undefined,
|
|
211
|
+
organization: configService.get(OPENAI_ORGANIZATION_ID_ENV_VAR),
|
|
212
|
+
project: configService.get(OPENAI_PROJECT_ID_ENV_VAR)
|
|
213
|
+
}
|
|
214
|
+
}
|
|
215
|
+
};
|
|
216
|
+
OpenAIServiceConfig.assertValidConfig(config);
|
|
217
|
+
return config;
|
|
218
|
+
}
|
|
219
|
+
let OpenAIModule = class OpenAIModule {};
|
|
220
|
+
OpenAIModule = __decorate([Module({
|
|
221
|
+
imports: [ConfigModule],
|
|
222
|
+
providers: [{
|
|
223
|
+
provide: OpenAIServiceConfig,
|
|
224
|
+
inject: [ConfigService],
|
|
225
|
+
useFactory: openAIServiceConfigFactory
|
|
226
|
+
}, OpenAIApi],
|
|
227
|
+
exports: [OpenAIApi]
|
|
228
|
+
})], OpenAIModule);
|
|
229
|
+
|
|
230
|
+
function openAIWebhookServiceConfigFactory(configService) {
|
|
231
|
+
const config = {
|
|
232
|
+
openaiWebhook: {
|
|
233
|
+
webhookSecret: configService.get(OPENAI_WEBHOOK_SECRET_TOKEN_ENV_VAR)
|
|
234
|
+
}
|
|
235
|
+
};
|
|
236
|
+
OpenAIWebhookServiceConfig.assertValidConfig(config);
|
|
237
|
+
return config;
|
|
238
|
+
}
|
|
239
|
+
let OpenAIWebhookModule = class OpenAIWebhookModule {};
|
|
240
|
+
OpenAIWebhookModule = __decorate([Module({
|
|
241
|
+
imports: [ConfigModule, OpenAIModule],
|
|
242
|
+
controllers: [OpenAIWebhookController],
|
|
243
|
+
providers: [{
|
|
244
|
+
provide: OpenAIWebhookServiceConfig,
|
|
245
|
+
inject: [ConfigService],
|
|
246
|
+
useFactory: openAIWebhookServiceConfigFactory
|
|
247
|
+
}, OpenAIWebhookService],
|
|
248
|
+
exports: [OpenAIWebhookService]
|
|
249
|
+
})], OpenAIWebhookModule);
|
|
250
|
+
|
|
251
|
+
/**
|
|
252
|
+
* Returns true if the response has a json response.
|
|
253
|
+
*
|
|
254
|
+
* @param response
|
|
255
|
+
* @returns
|
|
256
|
+
*/
|
|
257
|
+
function isParsedOpenAIJsonResponseWithJson(response) {
|
|
258
|
+
return response.isJsonResponse && Boolean(response.jsonResponse) && Boolean(response.jsonResponseFieldMap);
|
|
259
|
+
}
|
|
260
|
+
/**
|
|
261
|
+
* Parses the OpenAI response into a ParsedOpenAIJsonResponse.
|
|
262
|
+
*
|
|
263
|
+
* @param response The OpenAI response to parse.
|
|
264
|
+
* @returns The parsed OpenAI response.
|
|
265
|
+
*/
|
|
266
|
+
function parseOpenAIJsonResponse(response) {
|
|
267
|
+
const output_text = typeof response === 'string' ? response : response.output_text;
|
|
268
|
+
let jsonResponse = undefined;
|
|
269
|
+
let jsonResponseFieldMap = undefined;
|
|
270
|
+
try {
|
|
271
|
+
jsonResponse = JSON.parse(output_text);
|
|
272
|
+
jsonResponseFieldMap = openAIJsonResponseFieldsMap(jsonResponse);
|
|
273
|
+
} catch (e) {
|
|
274
|
+
// ignore
|
|
275
|
+
}
|
|
276
|
+
return {
|
|
277
|
+
output_text,
|
|
278
|
+
isJsonResponse: Boolean(jsonResponse),
|
|
279
|
+
jsonResponse,
|
|
280
|
+
jsonResponseFieldMap
|
|
281
|
+
};
|
|
282
|
+
}
|
|
283
|
+
/**
|
|
284
|
+
* Creates a map of the OpenAI json response fields.
|
|
285
|
+
*
|
|
286
|
+
* @param response The OpenAI json response to create a map from.
|
|
287
|
+
* @returns The map of the OpenAI json response fields.
|
|
288
|
+
*/
|
|
289
|
+
function openAIJsonResponseFieldsMap(response) {
|
|
290
|
+
return new Map(response.fields.map(x => [x.field_name, x.field_value]));
|
|
291
|
+
}
|
|
292
|
+
|
|
293
|
+
export { OPENAI_API_KEY_ENV_VAR, OPENAI_BASE_URL_ENV_VAR, OPENAI_ORGANIZATION_ID_ENV_VAR, OPENAI_PROJECT_ID_ENV_VAR, OPENAI_WEBHOOK_SECRET_TOKEN_ENV_VAR, OpenAIApi, OpenAIModule, OpenAIServiceConfig, OpenAIWebhookController, OpenAIWebhookModule, OpenAIWebhookService, OpenAIWebhookServiceConfig, isParsedOpenAIJsonResponseWithJson, openAIJsonResponseFieldsMap, openAIServiceConfigFactory, openAIWebhookEvent, openAIWebhookEventVerifier, openAIWebhookServiceConfigFactory, openaiEventHandlerConfigurerFactory, openaiEventHandlerFactory, parseOpenAIJsonResponse };
|
package/openai/package.json
CHANGED
|
@@ -1,9 +1,28 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@dereekb/nestjs/openai",
|
|
3
|
-
"version": "
|
|
4
|
-
"type": "commonjs",
|
|
5
|
-
"peerDependencies": {},
|
|
6
|
-
"dependencies": {},
|
|
3
|
+
"version": "13.0.0",
|
|
7
4
|
"types": "./src/index.d.ts",
|
|
8
|
-
"
|
|
5
|
+
"module": "./index.esm.js",
|
|
6
|
+
"main": "./index.cjs.js",
|
|
7
|
+
"exports": {
|
|
8
|
+
".": {
|
|
9
|
+
"types": "./src/index.d.ts",
|
|
10
|
+
"node": {
|
|
11
|
+
"require": "./index.cjs.js"
|
|
12
|
+
},
|
|
13
|
+
"browser": {
|
|
14
|
+
"require": "./index.cjs.js",
|
|
15
|
+
"import": "./index.esm.js"
|
|
16
|
+
},
|
|
17
|
+
"default": "./index.cjs.js"
|
|
18
|
+
}
|
|
19
|
+
},
|
|
20
|
+
"peerDependencies": {
|
|
21
|
+
"@dereekb/util": "13.0.0",
|
|
22
|
+
"@dereekb/date": "13.0.0",
|
|
23
|
+
"@dereekb/nestjs": "13.0.0",
|
|
24
|
+
"@dereekb/model": "13.0.0",
|
|
25
|
+
"@dereekb/rxjs": "13.0.0",
|
|
26
|
+
"core-js": "^3.0.0"
|
|
27
|
+
}
|
|
9
28
|
}
|
|
@@ -23,7 +23,7 @@ export type UntypedOpenAIWebhookEvent = UnwrapWebhookEvent;
|
|
|
23
23
|
*/
|
|
24
24
|
export declare function openAIWebhookEvent<T extends UnwrapWebhookEvent = UnwrapWebhookEvent>(event: UntypedOpenAIWebhookEvent): OpenAIWebhookEvent<T>;
|
|
25
25
|
export type OpenAIEventHandler = Handler<UntypedOpenAIWebhookEvent, OpenAIWebhookEventType>;
|
|
26
|
-
export declare const openaiEventHandlerFactory: import("@dereekb/util").HandlerFactory<UnwrapWebhookEvent, "batch.cancelled" | "batch.completed" | "batch.expired" | "batch.failed" | "eval.run.canceled" | "eval.run.failed" | "eval.run.succeeded" | "fine_tuning.job.cancelled" | "fine_tuning.job.failed" | "fine_tuning.job.succeeded" | "response.cancelled" | "response.completed" | "response.failed" | "response.incomplete", boolean>;
|
|
26
|
+
export declare const openaiEventHandlerFactory: import("@dereekb/util").HandlerFactory<UnwrapWebhookEvent, "batch.cancelled" | "batch.completed" | "batch.expired" | "batch.failed" | "eval.run.canceled" | "eval.run.failed" | "eval.run.succeeded" | "fine_tuning.job.cancelled" | "fine_tuning.job.failed" | "fine_tuning.job.succeeded" | "realtime.call.incoming" | "response.cancelled" | "response.completed" | "response.failed" | "response.incomplete", boolean>;
|
|
27
27
|
export type OpenAIHandlerMappedSetFunction<T extends UnwrapWebhookEvent = UnwrapWebhookEvent> = HandlerMappedSetFunction<OpenAIWebhookEvent<T>>;
|
|
28
28
|
export interface OpenAIEventHandlerConfigurer extends HandlerBindAccessor<UntypedOpenAIWebhookEvent, OpenAIWebhookEventType> {
|
|
29
29
|
readonly handleBatchCancelled: OpenAIHandlerMappedSetFunction<BatchCancelledWebhookEvent>;
|
|
@@ -41,4 +41,4 @@ export interface OpenAIEventHandlerConfigurer extends HandlerBindAccessor<Untype
|
|
|
41
41
|
readonly handleResponseFailed: OpenAIHandlerMappedSetFunction<ResponseFailedWebhookEvent>;
|
|
42
42
|
readonly handleResponseIncomplete: OpenAIHandlerMappedSetFunction<ResponseIncompleteWebhookEvent>;
|
|
43
43
|
}
|
|
44
|
-
export declare const openaiEventHandlerConfigurerFactory: import("@dereekb/util").HandlerConfigurerFactory<OpenAIEventHandlerConfigurer, UnwrapWebhookEvent, "batch.cancelled" | "batch.completed" | "batch.expired" | "batch.failed" | "eval.run.canceled" | "eval.run.failed" | "eval.run.succeeded" | "fine_tuning.job.cancelled" | "fine_tuning.job.failed" | "fine_tuning.job.succeeded" | "response.cancelled" | "response.completed" | "response.failed" | "response.incomplete", boolean>;
|
|
44
|
+
export declare const openaiEventHandlerConfigurerFactory: import("@dereekb/util").HandlerConfigurerFactory<OpenAIEventHandlerConfigurer, UnwrapWebhookEvent, "batch.cancelled" | "batch.completed" | "batch.expired" | "batch.failed" | "eval.run.canceled" | "eval.run.failed" | "eval.run.succeeded" | "fine_tuning.job.cancelled" | "fine_tuning.job.failed" | "fine_tuning.job.succeeded" | "realtime.call.incoming" | "response.cancelled" | "response.completed" | "response.failed" | "response.incomplete", boolean>;
|
|
@@ -10,7 +10,7 @@ export declare class OpenAIWebhookService {
|
|
|
10
10
|
private readonly logger;
|
|
11
11
|
private readonly _verifier;
|
|
12
12
|
readonly handler: Handler<OpenAIWebhookEvent, OpenAIWebhookEventType>;
|
|
13
|
-
readonly configure: import("@dereekb/util").HandlerConfigurer<import("./webhook.openai").OpenAIEventHandlerConfigurer, import("openai/resources/webhooks").UnwrapWebhookEvent, "batch.cancelled" | "batch.completed" | "batch.expired" | "batch.failed" | "eval.run.canceled" | "eval.run.failed" | "eval.run.succeeded" | "fine_tuning.job.cancelled" | "fine_tuning.job.failed" | "fine_tuning.job.succeeded" | "response.cancelled" | "response.completed" | "response.failed" | "response.incomplete", boolean>;
|
|
13
|
+
readonly configure: import("@dereekb/util").HandlerConfigurer<import("./webhook.openai").OpenAIEventHandlerConfigurer, import("openai/resources/webhooks.mjs").UnwrapWebhookEvent, "batch.cancelled" | "batch.completed" | "batch.expired" | "batch.failed" | "eval.run.canceled" | "eval.run.failed" | "eval.run.succeeded" | "fine_tuning.job.cancelled" | "fine_tuning.job.failed" | "fine_tuning.job.succeeded" | "realtime.call.incoming" | "response.cancelled" | "response.completed" | "response.failed" | "response.incomplete", boolean>;
|
|
14
14
|
constructor(openAiApi: OpenAIApi, openAIWebhookServiceConfig: OpenAIWebhookServiceConfig);
|
|
15
15
|
updateForWebhook(req: Request, rawBody: Buffer): Promise<void>;
|
|
16
16
|
updateForOpenAIEvent(event: OpenAIWebhookEvent): Promise<void>;
|
package/package.json
CHANGED
|
@@ -1,54 +1,84 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@dereekb/nestjs",
|
|
3
|
-
"version": "
|
|
4
|
-
"
|
|
3
|
+
"version": "13.0.0",
|
|
4
|
+
"types": "./src/index.d.ts",
|
|
5
|
+
"module": "./index.esm.js",
|
|
6
|
+
"main": "./index.cjs.js",
|
|
5
7
|
"exports": {
|
|
6
8
|
".": {
|
|
7
9
|
"types": "./src/index.d.ts",
|
|
8
|
-
"
|
|
9
|
-
|
|
10
|
-
|
|
10
|
+
"node": {
|
|
11
|
+
"require": "./index.cjs.js"
|
|
12
|
+
},
|
|
13
|
+
"browser": {
|
|
14
|
+
"require": "./index.cjs.js",
|
|
15
|
+
"import": "./index.esm.js"
|
|
16
|
+
},
|
|
17
|
+
"default": "./index.cjs.js"
|
|
11
18
|
},
|
|
12
19
|
"./stripe": {
|
|
13
20
|
"types": "./stripe/src/index.d.ts",
|
|
14
|
-
"
|
|
15
|
-
|
|
16
|
-
|
|
21
|
+
"node": {
|
|
22
|
+
"require": "./stripe/index.cjs.js"
|
|
23
|
+
},
|
|
24
|
+
"browser": {
|
|
25
|
+
"require": "./stripe/index.cjs.js",
|
|
26
|
+
"import": "./stripe/index.esm.js"
|
|
27
|
+
},
|
|
28
|
+
"default": "./stripe/index.cjs.js"
|
|
17
29
|
},
|
|
18
30
|
"./mailgun": {
|
|
19
31
|
"types": "./mailgun/src/index.d.ts",
|
|
20
|
-
"
|
|
21
|
-
|
|
22
|
-
|
|
32
|
+
"node": {
|
|
33
|
+
"require": "./mailgun/index.cjs.js"
|
|
34
|
+
},
|
|
35
|
+
"browser": {
|
|
36
|
+
"require": "./mailgun/index.cjs.js",
|
|
37
|
+
"import": "./mailgun/index.esm.js"
|
|
38
|
+
},
|
|
39
|
+
"default": "./mailgun/index.cjs.js"
|
|
23
40
|
},
|
|
24
41
|
"./vapiai": {
|
|
25
42
|
"types": "./vapiai/src/index.d.ts",
|
|
26
|
-
"
|
|
27
|
-
|
|
28
|
-
|
|
43
|
+
"node": {
|
|
44
|
+
"require": "./vapiai/index.cjs.js"
|
|
45
|
+
},
|
|
46
|
+
"browser": {
|
|
47
|
+
"require": "./vapiai/index.cjs.js",
|
|
48
|
+
"import": "./vapiai/index.esm.js"
|
|
49
|
+
},
|
|
50
|
+
"default": "./vapiai/index.cjs.js"
|
|
29
51
|
},
|
|
30
52
|
"./openai": {
|
|
31
53
|
"types": "./openai/src/index.d.ts",
|
|
32
|
-
"
|
|
33
|
-
|
|
34
|
-
|
|
54
|
+
"node": {
|
|
55
|
+
"require": "./openai/index.cjs.js"
|
|
56
|
+
},
|
|
57
|
+
"browser": {
|
|
58
|
+
"require": "./openai/index.cjs.js",
|
|
59
|
+
"import": "./openai/index.esm.js"
|
|
60
|
+
},
|
|
61
|
+
"default": "./openai/index.cjs.js"
|
|
35
62
|
},
|
|
36
63
|
"./typeform": {
|
|
37
64
|
"types": "./typeform/src/index.d.ts",
|
|
38
|
-
"
|
|
39
|
-
|
|
40
|
-
|
|
65
|
+
"node": {
|
|
66
|
+
"require": "./typeform/index.cjs.js"
|
|
67
|
+
},
|
|
68
|
+
"browser": {
|
|
69
|
+
"require": "./typeform/index.cjs.js",
|
|
70
|
+
"import": "./typeform/index.esm.js"
|
|
71
|
+
},
|
|
72
|
+
"default": "./typeform/index.cjs.js"
|
|
41
73
|
}
|
|
42
74
|
},
|
|
43
|
-
"main": "./src/index.js",
|
|
44
|
-
"types": "./src/index.d.ts",
|
|
45
75
|
"peerDependencies": {
|
|
46
|
-
"@nestjs/common": "^
|
|
47
|
-
"express": "
|
|
48
|
-
"raw-body": "
|
|
49
|
-
"body-parser": "
|
|
50
|
-
"@nestjs/config": "^
|
|
51
|
-
"@dereekb/util": "
|
|
76
|
+
"@nestjs/common": "^11.0.0",
|
|
77
|
+
"express": "^5.0.0",
|
|
78
|
+
"raw-body": "^3.0.0",
|
|
79
|
+
"body-parser": "^2.0.0",
|
|
80
|
+
"@nestjs/config": "^4.0.0",
|
|
81
|
+
"@dereekb/util": "13.0.0"
|
|
52
82
|
},
|
|
53
83
|
"dependencies": {}
|
|
54
84
|
}
|