@dereekb/nestjs 13.0.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.
@@ -1,28 +1,27 @@
1
1
  {
2
2
  "name": "@dereekb/nestjs/mailgun",
3
- "version": "13.0.0",
4
- "types": "./src/index.d.ts",
5
- "module": "./index.esm.js",
6
- "main": "./index.cjs.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
+ "form-data": "^4.0.0",
13
+ "mailgun.js": "^12.0.0"
14
+ },
7
15
  "exports": {
16
+ "./package.json": "./package.json",
8
17
  ".": {
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
- },
18
+ "module": "./index.esm.js",
19
+ "types": "./index.d.ts",
20
+ "import": "./index.cjs.mjs",
17
21
  "default": "./index.cjs.js"
18
22
  }
19
23
  },
20
- "peerDependencies": {
21
- "@dereekb/date": "13.0.0",
22
- "@dereekb/nestjs": "13.0.0",
23
- "@dereekb/model": "13.0.0",
24
- "@dereekb/rxjs": "13.0.0",
25
- "@dereekb/util": "13.0.0",
26
- "core-js": "^3.0.0"
27
- }
24
+ "module": "./index.esm.js",
25
+ "main": "./index.cjs.js",
26
+ "types": "./index.d.ts"
28
27
  }
@@ -0,0 +1 @@
1
+ exports._default = require('./index.cjs.js').default;
@@ -13,32 +13,32 @@ var config = require('@nestjs/config');
13
13
  * @returns
14
14
  */
15
15
  function openAIWebhookEvent(event) {
16
- return event;
16
+ return event;
17
17
  }
18
- const openaiEventHandlerFactory = util.handlerFactory(x => x.type);
18
+ const openaiEventHandlerFactory = util.handlerFactory((x) => x.type);
19
19
  const openaiEventHandlerConfigurerFactory = util.handlerConfigurerFactory({
20
- configurerForAccessor: accessor => {
21
- // eslint-disable-next-line
22
- const fnWithKey = util.handlerMappedSetFunctionFactory(accessor, openAIWebhookEvent);
23
- const configurer = {
24
- ...accessor,
25
- handleBatchCancelled: fnWithKey('batch.cancelled'),
26
- handleBatchCompleted: fnWithKey('batch.completed'),
27
- handleBatchExpired: fnWithKey('batch.expired'),
28
- handleBatchFailed: fnWithKey('batch.failed'),
29
- handleEvalRunCanceled: fnWithKey('eval.run.canceled'),
30
- handleEvalRunFailed: fnWithKey('eval.run.failed'),
31
- handleEvalRunSucceeded: fnWithKey('eval.run.succeeded'),
32
- handleFineTuningJobCancelled: fnWithKey('fine_tuning.job.cancelled'),
33
- handleFineTuningJobFailed: fnWithKey('fine_tuning.job.failed'),
34
- handleFineTuningJobSucceeded: fnWithKey('fine_tuning.job.succeeded'),
35
- handleResponseCancelled: fnWithKey('response.cancelled'),
36
- handleResponseCompleted: fnWithKey('response.completed'),
37
- handleResponseFailed: fnWithKey('response.failed'),
38
- handleResponseIncomplete: fnWithKey('response.incomplete')
39
- };
40
- return configurer;
41
- }
20
+ configurerForAccessor: (accessor) => {
21
+ // eslint-disable-next-line
22
+ const fnWithKey = util.handlerMappedSetFunctionFactory(accessor, openAIWebhookEvent);
23
+ const configurer = {
24
+ ...accessor,
25
+ handleBatchCancelled: fnWithKey('batch.cancelled'),
26
+ handleBatchCompleted: fnWithKey('batch.completed'),
27
+ handleBatchExpired: fnWithKey('batch.expired'),
28
+ handleBatchFailed: fnWithKey('batch.failed'),
29
+ handleEvalRunCanceled: fnWithKey('eval.run.canceled'),
30
+ handleEvalRunFailed: fnWithKey('eval.run.failed'),
31
+ handleEvalRunSucceeded: fnWithKey('eval.run.succeeded'),
32
+ handleFineTuningJobCancelled: fnWithKey('fine_tuning.job.cancelled'),
33
+ handleFineTuningJobFailed: fnWithKey('fine_tuning.job.failed'),
34
+ handleFineTuningJobSucceeded: fnWithKey('fine_tuning.job.succeeded'),
35
+ handleResponseCancelled: fnWithKey('response.cancelled'),
36
+ handleResponseCompleted: fnWithKey('response.completed'),
37
+ handleResponseFailed: fnWithKey('response.failed'),
38
+ handleResponseIncomplete: fnWithKey('response.incomplete')
39
+ };
40
+ return configurer;
41
+ }
42
42
  });
43
43
 
44
44
  const OPENAI_WEBHOOK_SECRET_TOKEN_ENV_VAR = 'OPENAI_WEBHOOK_SECRET_TOKEN';
@@ -46,12 +46,12 @@ const OPENAI_WEBHOOK_SECRET_TOKEN_ENV_VAR = 'OPENAI_WEBHOOK_SECRET_TOKEN';
46
46
  * Configuration for OpenAIService
47
47
  */
48
48
  class OpenAIWebhookServiceConfig {
49
- openaiWebhook;
50
- static assertValidConfig(config) {
51
- if (!config.openaiWebhook.webhookSecret) {
52
- throw new Error('No OpenAI webhook secret specified.');
49
+ openaiWebhook;
50
+ static assertValidConfig(config) {
51
+ if (!config.openaiWebhook.webhookSecret) {
52
+ throw new Error('No OpenAI webhook secret specified.');
53
+ }
53
54
  }
54
- }
55
55
  }
56
56
 
57
57
  /******************************************************************************
@@ -102,27 +102,33 @@ const OPENAI_PROJECT_ID_ENV_VAR = 'OPENAI_PROJECT_ID';
102
102
  * Configuration for OpenAIService
103
103
  */
104
104
  class OpenAIServiceConfig {
105
- openai;
106
- static assertValidConfig(config) {
107
- if (!config.openai.config.apiKey) {
108
- throw new Error('No OpenAI API key specified.');
109
- } else if (!config.openai.config.organization) {
110
- throw new Error('No OpenAI organization specified.');
111
- } else if (!config.openai.config.project) {
112
- throw new Error('No OpenAI project specified.');
105
+ openai;
106
+ static assertValidConfig(config) {
107
+ if (!config.openai.config.apiKey) {
108
+ throw new Error('No OpenAI API key specified.');
109
+ }
110
+ else if (!config.openai.config.organization) {
111
+ throw new Error('No OpenAI organization specified.');
112
+ }
113
+ else if (!config.openai.config.project) {
114
+ throw new Error('No OpenAI project specified.');
115
+ }
113
116
  }
114
- }
115
117
  }
116
118
 
117
119
  exports.OpenAIApi = class OpenAIApi {
118
- config;
119
- openAIClient;
120
- constructor(config) {
121
- this.config = config;
122
- this.openAIClient = new openai.OpenAI(config.openai.config);
123
- }
120
+ config;
121
+ openAIClient;
122
+ constructor(config) {
123
+ this.config = config;
124
+ this.openAIClient = new openai.OpenAI(config.openai.config);
125
+ }
124
126
  };
125
- exports.OpenAIApi = __decorate([common.Injectable(), __param(0, common.Inject(OpenAIServiceConfig)), __metadata("design:paramtypes", [OpenAIServiceConfig])], exports.OpenAIApi);
127
+ exports.OpenAIApi = __decorate([
128
+ common.Injectable(),
129
+ __param(0, common.Inject(OpenAIServiceConfig)),
130
+ __metadata("design:paramtypes", [OpenAIServiceConfig])
131
+ ], exports.OpenAIApi);
126
132
 
127
133
  /**
128
134
  * Verifies a OpenAI webhook event header.
@@ -131,124 +137,150 @@ exports.OpenAIApi = __decorate([common.Injectable(), __param(0, common.Inject(Op
131
137
  * @returns A function that verifies a OpenAI webhook event.
132
138
  */
133
139
  function openAIWebhookEventVerifier(config) {
134
- const {
135
- secret,
136
- client
137
- } = config;
138
- return async (request, rawBody) => {
139
- const headers = request.headers;
140
- const requestBodyString = String(request.body);
141
- let event;
142
- let valid = false;
143
- try {
144
- event = await client.webhooks.unwrap(requestBodyString, headers, secret);
145
- valid = true;
146
- } catch (e) {
147
- if (e instanceof openai.InvalidWebhookSignatureError) {
148
- valid = false;
149
- } else {
150
- throw e;
151
- }
152
- }
153
- const result = {
154
- valid,
155
- event
140
+ const { secret, client } = config;
141
+ return async (request, rawBody) => {
142
+ const headers = request.headers;
143
+ const requestBodyString = String(request.body);
144
+ let event;
145
+ let valid = false;
146
+ try {
147
+ event = await client.webhooks.unwrap(requestBodyString, headers, secret);
148
+ valid = true;
149
+ }
150
+ catch (e) {
151
+ if (e instanceof openai.InvalidWebhookSignatureError) {
152
+ valid = false;
153
+ }
154
+ else {
155
+ throw e;
156
+ }
157
+ }
158
+ const result = {
159
+ valid,
160
+ event
161
+ };
162
+ return result;
156
163
  };
157
- return result;
158
- };
159
164
  }
160
165
 
161
166
  /**
162
167
  * Service that makes system changes based on OpenAI webhook events.
163
168
  */
164
169
  exports.OpenAIWebhookService = class OpenAIWebhookService {
165
- logger = new common.Logger('OpenAIWebhookService');
166
- _verifier;
167
- handler = openaiEventHandlerFactory();
168
- configure = openaiEventHandlerConfigurerFactory(this.handler);
169
- constructor(openAiApi, openAIWebhookServiceConfig) {
170
- const {
171
- webhookSecret
172
- } = openAIWebhookServiceConfig.openaiWebhook;
173
- this._verifier = openAIWebhookEventVerifier({
174
- secret: webhookSecret,
175
- client: openAiApi.openAIClient
176
- });
177
- }
178
- async updateForWebhook(req, rawBody) {
179
- const result = await this._verifier(req, rawBody);
180
- if (!result.valid) {
181
- this.logger.warn('Received invalid OpenAI event.', req);
182
- } else {
183
- await this.updateForOpenAIEvent(result.event);
170
+ logger = new common.Logger('OpenAIWebhookService');
171
+ _verifier;
172
+ handler = openaiEventHandlerFactory();
173
+ configure = openaiEventHandlerConfigurerFactory(this.handler);
174
+ constructor(openAiApi, openAIWebhookServiceConfig) {
175
+ const { webhookSecret } = openAIWebhookServiceConfig.openaiWebhook;
176
+ this._verifier = openAIWebhookEventVerifier({
177
+ secret: webhookSecret,
178
+ client: openAiApi.openAIClient
179
+ });
184
180
  }
185
- }
186
- async updateForOpenAIEvent(event) {
187
- const result = await this.handler(event);
188
- if (!result) {
189
- this.logger.warn('Received unexpected/unhandled OpenAI event.', event);
181
+ async updateForWebhook(req, rawBody) {
182
+ const result = await this._verifier(req, rawBody);
183
+ if (!result.valid) {
184
+ this.logger.warn('Received invalid OpenAI event.', req);
185
+ }
186
+ else {
187
+ await this.updateForOpenAIEvent(result.event);
188
+ }
189
+ }
190
+ async updateForOpenAIEvent(event) {
191
+ const result = await this.handler(event);
192
+ if (!result) {
193
+ this.logger.warn('Received unexpected/unhandled OpenAI event.', event);
194
+ }
190
195
  }
191
- }
192
196
  };
193
- exports.OpenAIWebhookService = __decorate([common.Injectable(), __param(0, common.Inject(exports.OpenAIApi)), __param(1, common.Inject(OpenAIWebhookServiceConfig)), __metadata("design:paramtypes", [exports.OpenAIApi, OpenAIWebhookServiceConfig])], exports.OpenAIWebhookService);
197
+ exports.OpenAIWebhookService = __decorate([
198
+ common.Injectable(),
199
+ __param(0, common.Inject(exports.OpenAIApi)),
200
+ __param(1, common.Inject(OpenAIWebhookServiceConfig)),
201
+ __metadata("design:paramtypes", [exports.OpenAIApi, OpenAIWebhookServiceConfig])
202
+ ], exports.OpenAIWebhookService);
194
203
 
195
204
  exports.OpenAIWebhookController = class OpenAIWebhookController {
196
- _openaiWebhookService;
197
- constructor(openaiWebhookService) {
198
- this._openaiWebhookService = openaiWebhookService;
199
- }
200
- async handleOpenAIWebhook(req, rawBody) {
201
- await this._openaiWebhookService.updateForWebhook(req, rawBody);
202
- }
205
+ _openaiWebhookService;
206
+ constructor(openaiWebhookService) {
207
+ this._openaiWebhookService = openaiWebhookService;
208
+ }
209
+ async handleOpenAIWebhook(req, rawBody) {
210
+ await this._openaiWebhookService.updateForWebhook(req, rawBody);
211
+ }
203
212
  };
204
- __decorate([common.Post(), __param(0, common.Req()), __param(1, nestjs.RawBody()), __metadata("design:type", Function), __metadata("design:paramtypes", [Object, Object]), __metadata("design:returntype", Promise)], exports.OpenAIWebhookController.prototype, "handleOpenAIWebhook", null);
205
- exports.OpenAIWebhookController = __decorate([common.Controller('/webhook/openai'), __param(0, common.Inject(exports.OpenAIWebhookService)), __metadata("design:paramtypes", [exports.OpenAIWebhookService])], exports.OpenAIWebhookController);
213
+ __decorate([
214
+ common.Post(),
215
+ __param(0, common.Req()),
216
+ __param(1, nestjs.RawBody()),
217
+ __metadata("design:type", Function),
218
+ __metadata("design:paramtypes", [Object, Object]),
219
+ __metadata("design:returntype", Promise)
220
+ ], exports.OpenAIWebhookController.prototype, "handleOpenAIWebhook", null);
221
+ exports.OpenAIWebhookController = __decorate([
222
+ common.Controller('/webhook/openai'),
223
+ __param(0, common.Inject(exports.OpenAIWebhookService)),
224
+ __metadata("design:paramtypes", [exports.OpenAIWebhookService])
225
+ ], exports.OpenAIWebhookController);
206
226
 
207
227
  function openAIServiceConfigFactory(configService) {
208
- const config = {
209
- openai: {
210
- config: {
211
- apiKey: configService.get(OPENAI_API_KEY_ENV_VAR),
212
- baseURL: configService.get(OPENAI_BASE_URL_ENV_VAR) ?? undefined,
213
- organization: configService.get(OPENAI_ORGANIZATION_ID_ENV_VAR),
214
- project: configService.get(OPENAI_PROJECT_ID_ENV_VAR)
215
- }
216
- }
217
- };
218
- OpenAIServiceConfig.assertValidConfig(config);
219
- return config;
228
+ const config = {
229
+ openai: {
230
+ config: {
231
+ apiKey: configService.get(OPENAI_API_KEY_ENV_VAR),
232
+ baseURL: configService.get(OPENAI_BASE_URL_ENV_VAR) ?? undefined,
233
+ organization: configService.get(OPENAI_ORGANIZATION_ID_ENV_VAR),
234
+ project: configService.get(OPENAI_PROJECT_ID_ENV_VAR)
235
+ }
236
+ }
237
+ };
238
+ OpenAIServiceConfig.assertValidConfig(config);
239
+ return config;
220
240
  }
221
- exports.OpenAIModule = class OpenAIModule {};
222
- exports.OpenAIModule = __decorate([common.Module({
223
- imports: [config.ConfigModule],
224
- providers: [{
225
- provide: OpenAIServiceConfig,
226
- inject: [config.ConfigService],
227
- useFactory: openAIServiceConfigFactory
228
- }, exports.OpenAIApi],
229
- exports: [exports.OpenAIApi]
230
- })], exports.OpenAIModule);
241
+ exports.OpenAIModule = class OpenAIModule {
242
+ };
243
+ exports.OpenAIModule = __decorate([
244
+ common.Module({
245
+ imports: [config.ConfigModule],
246
+ providers: [
247
+ {
248
+ provide: OpenAIServiceConfig,
249
+ inject: [config.ConfigService],
250
+ useFactory: openAIServiceConfigFactory
251
+ },
252
+ exports.OpenAIApi
253
+ ],
254
+ exports: [exports.OpenAIApi]
255
+ })
256
+ ], exports.OpenAIModule);
231
257
 
232
258
  function openAIWebhookServiceConfigFactory(configService) {
233
- const config = {
234
- openaiWebhook: {
235
- webhookSecret: configService.get(OPENAI_WEBHOOK_SECRET_TOKEN_ENV_VAR)
236
- }
237
- };
238
- OpenAIWebhookServiceConfig.assertValidConfig(config);
239
- return config;
259
+ const config = {
260
+ openaiWebhook: {
261
+ webhookSecret: configService.get(OPENAI_WEBHOOK_SECRET_TOKEN_ENV_VAR)
262
+ }
263
+ };
264
+ OpenAIWebhookServiceConfig.assertValidConfig(config);
265
+ return config;
240
266
  }
241
- exports.OpenAIWebhookModule = class OpenAIWebhookModule {};
242
- exports.OpenAIWebhookModule = __decorate([common.Module({
243
- imports: [config.ConfigModule, exports.OpenAIModule],
244
- controllers: [exports.OpenAIWebhookController],
245
- providers: [{
246
- provide: OpenAIWebhookServiceConfig,
247
- inject: [config.ConfigService],
248
- useFactory: openAIWebhookServiceConfigFactory
249
- }, exports.OpenAIWebhookService],
250
- exports: [exports.OpenAIWebhookService]
251
- })], exports.OpenAIWebhookModule);
267
+ exports.OpenAIWebhookModule = class OpenAIWebhookModule {
268
+ };
269
+ exports.OpenAIWebhookModule = __decorate([
270
+ common.Module({
271
+ imports: [config.ConfigModule, exports.OpenAIModule],
272
+ controllers: [exports.OpenAIWebhookController],
273
+ providers: [
274
+ {
275
+ provide: OpenAIWebhookServiceConfig,
276
+ inject: [config.ConfigService],
277
+ useFactory: openAIWebhookServiceConfigFactory
278
+ },
279
+ exports.OpenAIWebhookService
280
+ ],
281
+ exports: [exports.OpenAIWebhookService]
282
+ })
283
+ ], exports.OpenAIWebhookModule);
252
284
 
253
285
  /**
254
286
  * Returns true if the response has a json response.
@@ -257,7 +289,7 @@ exports.OpenAIWebhookModule = __decorate([common.Module({
257
289
  * @returns
258
290
  */
259
291
  function isParsedOpenAIJsonResponseWithJson(response) {
260
- return response.isJsonResponse && Boolean(response.jsonResponse) && Boolean(response.jsonResponseFieldMap);
292
+ return response.isJsonResponse && Boolean(response.jsonResponse) && Boolean(response.jsonResponseFieldMap);
261
293
  }
262
294
  /**
263
295
  * Parses the OpenAI response into a ParsedOpenAIJsonResponse.
@@ -266,21 +298,22 @@ function isParsedOpenAIJsonResponseWithJson(response) {
266
298
  * @returns The parsed OpenAI response.
267
299
  */
268
300
  function parseOpenAIJsonResponse(response) {
269
- const output_text = typeof response === 'string' ? response : response.output_text;
270
- let jsonResponse = undefined;
271
- let jsonResponseFieldMap = undefined;
272
- try {
273
- jsonResponse = JSON.parse(output_text);
274
- jsonResponseFieldMap = openAIJsonResponseFieldsMap(jsonResponse);
275
- } catch (e) {
276
- // ignore
277
- }
278
- return {
279
- output_text,
280
- isJsonResponse: Boolean(jsonResponse),
281
- jsonResponse,
282
- jsonResponseFieldMap
283
- };
301
+ const output_text = typeof response === 'string' ? response : response.output_text;
302
+ let jsonResponse = undefined;
303
+ let jsonResponseFieldMap = undefined;
304
+ try {
305
+ jsonResponse = JSON.parse(output_text);
306
+ jsonResponseFieldMap = openAIJsonResponseFieldsMap(jsonResponse);
307
+ }
308
+ catch (e) {
309
+ // ignore
310
+ }
311
+ return {
312
+ output_text,
313
+ isJsonResponse: Boolean(jsonResponse),
314
+ jsonResponse,
315
+ jsonResponseFieldMap
316
+ };
284
317
  }
285
318
  /**
286
319
  * Creates a map of the OpenAI json response fields.
@@ -289,7 +322,7 @@ function parseOpenAIJsonResponse(response) {
289
322
  * @returns The map of the OpenAI json response fields.
290
323
  */
291
324
  function openAIJsonResponseFieldsMap(response) {
292
- return new Map(response.fields.map(x => [x.field_name, x.field_value]));
325
+ return new Map(response.fields.map((x) => [x.field_name, x.field_value]));
293
326
  }
294
327
 
295
328
  exports.OPENAI_API_KEY_ENV_VAR = OPENAI_API_KEY_ENV_VAR;
@@ -0,0 +1,2 @@
1
+ export * from './index.cjs.js';
2
+ export { _default as default } from './index.cjs.default.js';