@dereekb/nestjs 13.16.0 → 13.18.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/discord/package.json +4 -4
- package/eslint/package.json +2 -2
- package/mailgun/package.json +6 -6
- package/openai/package.json +6 -6
- package/openrouter/index.cjs.default.js +1 -0
- package/openrouter/index.cjs.js +1200 -0
- package/openrouter/index.cjs.mjs +2 -0
- package/openrouter/index.d.ts +1 -0
- package/openrouter/index.esm.js +1170 -0
- package/openrouter/package.json +24 -0
- package/openrouter/src/index.d.ts +1 -0
- package/openrouter/src/lib/index.d.ts +5 -0
- package/openrouter/src/lib/openrouter.api.d.ts +7 -0
- package/openrouter/src/lib/openrouter.config.d.ts +29 -0
- package/openrouter/src/lib/openrouter.module.d.ts +18 -0
- package/openrouter/src/lib/openrouter.type.d.ts +28 -0
- package/openrouter/src/lib/webhook/index.d.ts +6 -0
- package/openrouter/src/lib/webhook/webhook.openrouter.config.d.ts +40 -0
- package/openrouter/src/lib/webhook/webhook.openrouter.controller.d.ts +16 -0
- package/openrouter/src/lib/webhook/webhook.openrouter.d.ts +182 -0
- package/openrouter/src/lib/webhook/webhook.openrouter.module.d.ts +21 -0
- package/openrouter/src/lib/webhook/webhook.openrouter.service.d.ts +33 -0
- package/openrouter/src/lib/webhook/webhook.openrouter.verify.d.ts +66 -0
- package/package.json +10 -3
- package/stripe/package.json +6 -6
- package/twilio/package.json +6 -6
- package/typeform/package.json +6 -6
- package/vapiai/package.json +6 -6
|
@@ -0,0 +1,1200 @@
|
|
|
1
|
+
'use strict';
|
|
2
|
+
|
|
3
|
+
var util = require('@dereekb/util');
|
|
4
|
+
var common = require('@nestjs/common');
|
|
5
|
+
var node_crypto = require('node:crypto');
|
|
6
|
+
var config = require('@nestjs/config');
|
|
7
|
+
var sdk = require('@openrouter/sdk');
|
|
8
|
+
|
|
9
|
+
function _define_property$5(obj, key, value) {
|
|
10
|
+
if (key in obj) {
|
|
11
|
+
Object.defineProperty(obj, key, {
|
|
12
|
+
value: value,
|
|
13
|
+
enumerable: true,
|
|
14
|
+
configurable: true,
|
|
15
|
+
writable: true
|
|
16
|
+
});
|
|
17
|
+
} else {
|
|
18
|
+
obj[key] = value;
|
|
19
|
+
}
|
|
20
|
+
return obj;
|
|
21
|
+
}
|
|
22
|
+
function _object_spread(target) {
|
|
23
|
+
for(var i = 1; i < arguments.length; i++){
|
|
24
|
+
var source = arguments[i] != null ? arguments[i] : {};
|
|
25
|
+
var ownKeys = Object.keys(source);
|
|
26
|
+
if (typeof Object.getOwnPropertySymbols === "function") {
|
|
27
|
+
ownKeys = ownKeys.concat(Object.getOwnPropertySymbols(source).filter(function(sym) {
|
|
28
|
+
return Object.getOwnPropertyDescriptor(source, sym).enumerable;
|
|
29
|
+
}));
|
|
30
|
+
}
|
|
31
|
+
ownKeys.forEach(function(key) {
|
|
32
|
+
_define_property$5(target, key, source[key]);
|
|
33
|
+
});
|
|
34
|
+
}
|
|
35
|
+
return target;
|
|
36
|
+
}
|
|
37
|
+
function ownKeys(object, enumerableOnly) {
|
|
38
|
+
var keys = Object.keys(object);
|
|
39
|
+
if (Object.getOwnPropertySymbols) {
|
|
40
|
+
var symbols = Object.getOwnPropertySymbols(object);
|
|
41
|
+
keys.push.apply(keys, symbols);
|
|
42
|
+
}
|
|
43
|
+
return keys;
|
|
44
|
+
}
|
|
45
|
+
function _object_spread_props(target, source) {
|
|
46
|
+
source = source != null ? source : {};
|
|
47
|
+
if (Object.getOwnPropertyDescriptors) {
|
|
48
|
+
Object.defineProperties(target, Object.getOwnPropertyDescriptors(source));
|
|
49
|
+
} else {
|
|
50
|
+
ownKeys(Object(source)).forEach(function(key) {
|
|
51
|
+
Object.defineProperty(target, key, Object.getOwnPropertyDescriptor(source, key));
|
|
52
|
+
});
|
|
53
|
+
}
|
|
54
|
+
return target;
|
|
55
|
+
}
|
|
56
|
+
// MARK: Attribute Keys
|
|
57
|
+
/**
|
|
58
|
+
* Candidate attribute keys for the request model. OpenRouter follows the OpenTelemetry GenAI
|
|
59
|
+
* semantic conventions (`gen_ai.*`).
|
|
60
|
+
*/ var OPENROUTER_SPAN_ATTRIBUTE_MODEL_KEYS = [
|
|
61
|
+
'gen_ai.request.model',
|
|
62
|
+
'gen_ai.response.model'
|
|
63
|
+
];
|
|
64
|
+
var OPENROUTER_SPAN_ATTRIBUTE_PROVIDER_KEYS = [
|
|
65
|
+
'gen_ai.provider.name',
|
|
66
|
+
'gen_ai.system'
|
|
67
|
+
];
|
|
68
|
+
var OPENROUTER_SPAN_ATTRIBUTE_PROMPT_TOKENS_KEYS = [
|
|
69
|
+
'gen_ai.usage.prompt_tokens',
|
|
70
|
+
'gen_ai.usage.input_tokens'
|
|
71
|
+
];
|
|
72
|
+
var OPENROUTER_SPAN_ATTRIBUTE_COMPLETION_TOKENS_KEYS = [
|
|
73
|
+
'gen_ai.usage.completion_tokens',
|
|
74
|
+
'gen_ai.usage.output_tokens'
|
|
75
|
+
];
|
|
76
|
+
var OPENROUTER_SPAN_ATTRIBUTE_TOTAL_TOKENS_KEYS = [
|
|
77
|
+
'gen_ai.usage.total_tokens'
|
|
78
|
+
];
|
|
79
|
+
var OPENROUTER_SPAN_ATTRIBUTE_COST_KEYS = [
|
|
80
|
+
'gen_ai.usage.cost',
|
|
81
|
+
'gen_ai.response.cost'
|
|
82
|
+
];
|
|
83
|
+
var OPENROUTER_SPAN_ATTRIBUTE_GENERATION_ID_KEYS = [
|
|
84
|
+
'gen_ai.response.id'
|
|
85
|
+
];
|
|
86
|
+
/**
|
|
87
|
+
* Extracts the primitive value from an OTLP `AnyValue`. Integer values encoded as strings are
|
|
88
|
+
* parsed to numbers; nested array/kvlist/bytes values are ignored.
|
|
89
|
+
*
|
|
90
|
+
* @param value - The OTLP AnyValue to read.
|
|
91
|
+
* @returns The primitive value, or undefined when none of the modeled variants are present.
|
|
92
|
+
*/ function readOpenRouterAnyValue(value) {
|
|
93
|
+
var result;
|
|
94
|
+
if (value != null) {
|
|
95
|
+
if (value.stringValue != null) {
|
|
96
|
+
result = value.stringValue;
|
|
97
|
+
} else if (value.boolValue != null) {
|
|
98
|
+
result = value.boolValue;
|
|
99
|
+
} else if (value.doubleValue != null) {
|
|
100
|
+
result = value.doubleValue;
|
|
101
|
+
} else if (value.intValue != null) {
|
|
102
|
+
result = typeof value.intValue === 'number' ? value.intValue : Number(value.intValue);
|
|
103
|
+
}
|
|
104
|
+
}
|
|
105
|
+
return result;
|
|
106
|
+
}
|
|
107
|
+
/**
|
|
108
|
+
* Builds a flat attribute map from a list of OTLP key/value pairs.
|
|
109
|
+
*
|
|
110
|
+
* @param attributes - The OTLP attributes to flatten.
|
|
111
|
+
* @returns The attribute values indexed by name for direct lookup.
|
|
112
|
+
*/ function openRouterAttributeMap(attributes) {
|
|
113
|
+
var map = new Map();
|
|
114
|
+
attributes === null || attributes === void 0 ? void 0 : attributes.forEach(function(attribute) {
|
|
115
|
+
var value = readOpenRouterAnyValue(attribute.value);
|
|
116
|
+
if (value != null) {
|
|
117
|
+
map.set(attribute.key, value);
|
|
118
|
+
}
|
|
119
|
+
});
|
|
120
|
+
return map;
|
|
121
|
+
}
|
|
122
|
+
function firstStringAttribute(map, keys) {
|
|
123
|
+
var result;
|
|
124
|
+
var _iteratorNormalCompletion = true, _didIteratorError = false, _iteratorError = undefined;
|
|
125
|
+
try {
|
|
126
|
+
for(var _iterator = keys[Symbol.iterator](), _step; !(_iteratorNormalCompletion = (_step = _iterator.next()).done); _iteratorNormalCompletion = true){
|
|
127
|
+
var key = _step.value;
|
|
128
|
+
var value = map.get(key);
|
|
129
|
+
if (value != null) {
|
|
130
|
+
result = String(value);
|
|
131
|
+
break;
|
|
132
|
+
}
|
|
133
|
+
}
|
|
134
|
+
} catch (err) {
|
|
135
|
+
_didIteratorError = true;
|
|
136
|
+
_iteratorError = err;
|
|
137
|
+
} finally{
|
|
138
|
+
try {
|
|
139
|
+
if (!_iteratorNormalCompletion && _iterator.return != null) {
|
|
140
|
+
_iterator.return();
|
|
141
|
+
}
|
|
142
|
+
} finally{
|
|
143
|
+
if (_didIteratorError) {
|
|
144
|
+
throw _iteratorError;
|
|
145
|
+
}
|
|
146
|
+
}
|
|
147
|
+
}
|
|
148
|
+
return result;
|
|
149
|
+
}
|
|
150
|
+
function firstNumberAttribute(map, keys) {
|
|
151
|
+
var result;
|
|
152
|
+
var _iteratorNormalCompletion = true, _didIteratorError = false, _iteratorError = undefined;
|
|
153
|
+
try {
|
|
154
|
+
for(var _iterator = keys[Symbol.iterator](), _step; !(_iteratorNormalCompletion = (_step = _iterator.next()).done); _iteratorNormalCompletion = true){
|
|
155
|
+
var key = _step.value;
|
|
156
|
+
var value = map.get(key);
|
|
157
|
+
if (value != null) {
|
|
158
|
+
var asNumber = typeof value === 'number' ? value : Number(value);
|
|
159
|
+
if (!Number.isNaN(asNumber)) {
|
|
160
|
+
result = asNumber;
|
|
161
|
+
break;
|
|
162
|
+
}
|
|
163
|
+
}
|
|
164
|
+
}
|
|
165
|
+
} catch (err) {
|
|
166
|
+
_didIteratorError = true;
|
|
167
|
+
_iteratorError = err;
|
|
168
|
+
} finally{
|
|
169
|
+
try {
|
|
170
|
+
if (!_iteratorNormalCompletion && _iterator.return != null) {
|
|
171
|
+
_iterator.return();
|
|
172
|
+
}
|
|
173
|
+
} finally{
|
|
174
|
+
if (_didIteratorError) {
|
|
175
|
+
throw _iteratorError;
|
|
176
|
+
}
|
|
177
|
+
}
|
|
178
|
+
}
|
|
179
|
+
return result;
|
|
180
|
+
}
|
|
181
|
+
/**
|
|
182
|
+
* Extracts the commonly-used generation fields (model, provider, token usage, cost, generation id)
|
|
183
|
+
* from a flattened attribute map.
|
|
184
|
+
*
|
|
185
|
+
* @param map - The flattened span attribute map.
|
|
186
|
+
* @returns The extracted generation info.
|
|
187
|
+
*/ function openRouterGenerationInfoFromAttributes(map) {
|
|
188
|
+
return {
|
|
189
|
+
generationId: firstStringAttribute(map, OPENROUTER_SPAN_ATTRIBUTE_GENERATION_ID_KEYS),
|
|
190
|
+
model: firstStringAttribute(map, OPENROUTER_SPAN_ATTRIBUTE_MODEL_KEYS),
|
|
191
|
+
provider: firstStringAttribute(map, OPENROUTER_SPAN_ATTRIBUTE_PROVIDER_KEYS),
|
|
192
|
+
promptTokens: firstNumberAttribute(map, OPENROUTER_SPAN_ATTRIBUTE_PROMPT_TOKENS_KEYS),
|
|
193
|
+
completionTokens: firstNumberAttribute(map, OPENROUTER_SPAN_ATTRIBUTE_COMPLETION_TOKENS_KEYS),
|
|
194
|
+
totalTokens: firstNumberAttribute(map, OPENROUTER_SPAN_ATTRIBUTE_TOTAL_TOKENS_KEYS),
|
|
195
|
+
cost: firstNumberAttribute(map, OPENROUTER_SPAN_ATTRIBUTE_COST_KEYS)
|
|
196
|
+
};
|
|
197
|
+
}
|
|
198
|
+
/**
|
|
199
|
+
* Flattens a broadcast payload into a list of {@link OpenRouterBroadcastSpan}s, extracting
|
|
200
|
+
* attributes and generation info from each span.
|
|
201
|
+
*
|
|
202
|
+
* @param payload - The OTLP broadcast payload.
|
|
203
|
+
* @returns The flattened broadcast spans (empty for an empty / test-connection payload).
|
|
204
|
+
*/ function openRouterBroadcastSpansFromPayload(payload) {
|
|
205
|
+
var _payload_resourceSpans;
|
|
206
|
+
var result = [];
|
|
207
|
+
payload === null || payload === void 0 ? void 0 : (_payload_resourceSpans = payload.resourceSpans) === null || _payload_resourceSpans === void 0 ? void 0 : _payload_resourceSpans.forEach(function(resourceSpan) {
|
|
208
|
+
var _resourceSpan_resource, _resourceSpan_scopeSpans;
|
|
209
|
+
var resourceAttributes = openRouterAttributeMap((_resourceSpan_resource = resourceSpan.resource) === null || _resourceSpan_resource === void 0 ? void 0 : _resourceSpan_resource.attributes);
|
|
210
|
+
(_resourceSpan_scopeSpans = resourceSpan.scopeSpans) === null || _resourceSpan_scopeSpans === void 0 ? void 0 : _resourceSpan_scopeSpans.forEach(function(scopeSpan) {
|
|
211
|
+
var _scopeSpan_spans;
|
|
212
|
+
(_scopeSpan_spans = scopeSpan.spans) === null || _scopeSpan_spans === void 0 ? void 0 : _scopeSpan_spans.forEach(function(span) {
|
|
213
|
+
var attributes = openRouterAttributeMap(span.attributes);
|
|
214
|
+
result.push({
|
|
215
|
+
span: span,
|
|
216
|
+
name: span.name,
|
|
217
|
+
attributes: attributes,
|
|
218
|
+
resourceAttributes: resourceAttributes,
|
|
219
|
+
generation: openRouterGenerationInfoFromAttributes(attributes)
|
|
220
|
+
});
|
|
221
|
+
});
|
|
222
|
+
});
|
|
223
|
+
});
|
|
224
|
+
return result;
|
|
225
|
+
}
|
|
226
|
+
/**
|
|
227
|
+
* Creates a handler that dispatches broadcast spans by their span name.
|
|
228
|
+
*/ var openRouterEventHandlerFactory = util.handlerFactory(function(x) {
|
|
229
|
+
return x.name;
|
|
230
|
+
});
|
|
231
|
+
/**
|
|
232
|
+
* Identity map for broadcast spans, used by the handler configurer.
|
|
233
|
+
*
|
|
234
|
+
* @param span - The broadcast span.
|
|
235
|
+
* @returns The same broadcast span.
|
|
236
|
+
*/ function openRouterBroadcastSpan(span) {
|
|
237
|
+
return span;
|
|
238
|
+
}
|
|
239
|
+
var openRouterEventHandlerConfigurerFactory = util.handlerConfigurerFactory({
|
|
240
|
+
configurerForAccessor: function configurerForAccessor(accessor) {
|
|
241
|
+
var fnWithKey = util.handlerMappedSetFunctionFactory(accessor, openRouterBroadcastSpan);
|
|
242
|
+
var configurer = _object_spread_props(_object_spread({}, accessor), {
|
|
243
|
+
handleSpanName: fnWithKey,
|
|
244
|
+
handleAnySpan: fnWithKey(util.catchAllHandlerKey())
|
|
245
|
+
});
|
|
246
|
+
return configurer;
|
|
247
|
+
}
|
|
248
|
+
});
|
|
249
|
+
|
|
250
|
+
function _class_call_check$6(instance, Constructor) {
|
|
251
|
+
if (!(instance instanceof Constructor)) {
|
|
252
|
+
throw new TypeError("Cannot call a class as a function");
|
|
253
|
+
}
|
|
254
|
+
}
|
|
255
|
+
function _defineProperties$3(target, props) {
|
|
256
|
+
for(var i = 0; i < props.length; i++){
|
|
257
|
+
var descriptor = props[i];
|
|
258
|
+
descriptor.enumerable = descriptor.enumerable || false;
|
|
259
|
+
descriptor.configurable = true;
|
|
260
|
+
if ("value" in descriptor) descriptor.writable = true;
|
|
261
|
+
Object.defineProperty(target, descriptor.key, descriptor);
|
|
262
|
+
}
|
|
263
|
+
}
|
|
264
|
+
function _create_class$3(Constructor, protoProps, staticProps) {
|
|
265
|
+
if (staticProps) _defineProperties$3(Constructor, staticProps);
|
|
266
|
+
return Constructor;
|
|
267
|
+
}
|
|
268
|
+
function _define_property$4(obj, key, value) {
|
|
269
|
+
if (key in obj) {
|
|
270
|
+
Object.defineProperty(obj, key, {
|
|
271
|
+
value: value,
|
|
272
|
+
enumerable: true,
|
|
273
|
+
configurable: true,
|
|
274
|
+
writable: true
|
|
275
|
+
});
|
|
276
|
+
} else {
|
|
277
|
+
obj[key] = value;
|
|
278
|
+
}
|
|
279
|
+
return obj;
|
|
280
|
+
}
|
|
281
|
+
var OPENROUTER_WEBHOOK_SECRET_TOKEN_ENV_VAR = 'OPENROUTER_WEBHOOK_SECRET_TOKEN';
|
|
282
|
+
var OPENROUTER_WEBHOOK_HEADER_ENV_VAR = 'OPENROUTER_WEBHOOK_HEADER';
|
|
283
|
+
var OPENROUTER_WEBHOOK_SCHEME_ENV_VAR = 'OPENROUTER_WEBHOOK_SCHEME';
|
|
284
|
+
/**
|
|
285
|
+
* Default request header that carries the OpenRouter webhook secret.
|
|
286
|
+
*
|
|
287
|
+
* OpenRouter broadcast webhooks send a user-configured header (commonly `Authorization`)
|
|
288
|
+
* verbatim with each request. Express lower-cases incoming header names.
|
|
289
|
+
*/ var DEFAULT_OPENROUTER_WEBHOOK_HEADER = 'authorization';
|
|
290
|
+
/**
|
|
291
|
+
* Default scheme prefix expected on the secret-bearing header value (e.g. `Bearer <secret>`).
|
|
292
|
+
*/ var DEFAULT_OPENROUTER_WEBHOOK_SCHEME = 'Bearer';
|
|
293
|
+
/**
|
|
294
|
+
* Configuration for OpenRouterWebhookService.
|
|
295
|
+
*/ var OpenRouterWebhookServiceConfig = /*#__PURE__*/ function() {
|
|
296
|
+
function OpenRouterWebhookServiceConfig() {
|
|
297
|
+
_class_call_check$6(this, OpenRouterWebhookServiceConfig);
|
|
298
|
+
_define_property$4(this, "openrouterWebhook", void 0);
|
|
299
|
+
}
|
|
300
|
+
_create_class$3(OpenRouterWebhookServiceConfig, null, [
|
|
301
|
+
{
|
|
302
|
+
key: "assertValidConfig",
|
|
303
|
+
value: function assertValidConfig(config) {
|
|
304
|
+
if (!config.openrouterWebhook.webhookSecret) {
|
|
305
|
+
throw new Error('No OpenRouter webhook secret specified.');
|
|
306
|
+
}
|
|
307
|
+
}
|
|
308
|
+
}
|
|
309
|
+
]);
|
|
310
|
+
return OpenRouterWebhookServiceConfig;
|
|
311
|
+
}
|
|
312
|
+
();
|
|
313
|
+
|
|
314
|
+
function _type_of(obj) {
|
|
315
|
+
"@swc/helpers - typeof";
|
|
316
|
+
return obj && typeof Symbol !== "undefined" && obj.constructor === Symbol ? "symbol" : typeof obj;
|
|
317
|
+
}
|
|
318
|
+
function __decorate(decorators, target, key, desc) {
|
|
319
|
+
var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;
|
|
320
|
+
if ((typeof Reflect === "undefined" ? "undefined" : _type_of(Reflect)) === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc);
|
|
321
|
+
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;
|
|
322
|
+
return c > 3 && r && Object.defineProperty(target, key, r), r;
|
|
323
|
+
}
|
|
324
|
+
function __param(paramIndex, decorator) {
|
|
325
|
+
return function(target, key) {
|
|
326
|
+
decorator(target, key, paramIndex);
|
|
327
|
+
};
|
|
328
|
+
}
|
|
329
|
+
typeof SuppressedError === "function" ? SuppressedError : function(error, suppressed, message) {
|
|
330
|
+
var e = new Error(message);
|
|
331
|
+
return e.name = "SuppressedError", e.error = error, e.suppressed = suppressed, e;
|
|
332
|
+
};
|
|
333
|
+
|
|
334
|
+
/**
|
|
335
|
+
* Constant-time comparison of two secret tokens.
|
|
336
|
+
*
|
|
337
|
+
* Guards against the length-mismatch exception thrown by `crypto.timingSafeEqual` by
|
|
338
|
+
* returning false up front when lengths differ.
|
|
339
|
+
*
|
|
340
|
+
* @param provided - The token presented on the request.
|
|
341
|
+
* @param expected - The configured expected secret token.
|
|
342
|
+
* @returns True when the tokens are byte-for-byte equal.
|
|
343
|
+
*/ function safeCompareOpenRouterWebhookToken(provided, expected) {
|
|
344
|
+
var providedBuffer = Buffer.from(provided, 'utf8');
|
|
345
|
+
var expectedBuffer = Buffer.from(expected, 'utf8');
|
|
346
|
+
var valid = false;
|
|
347
|
+
if (providedBuffer.length === expectedBuffer.length) {
|
|
348
|
+
valid = node_crypto.timingSafeEqual(providedBuffer, expectedBuffer);
|
|
349
|
+
}
|
|
350
|
+
return valid;
|
|
351
|
+
}
|
|
352
|
+
/**
|
|
353
|
+
* Reads a single header value from the request, normalizing array-valued headers to their first entry.
|
|
354
|
+
*
|
|
355
|
+
* @param req - The incoming request.
|
|
356
|
+
* @param header - The (case-insensitive) header name to read.
|
|
357
|
+
* @returns The header value, or undefined when absent.
|
|
358
|
+
*/ function readOpenRouterWebhookHeader(req, header) {
|
|
359
|
+
var value = req.headers[header.toLowerCase()];
|
|
360
|
+
return Array.isArray(value) ? value[0] : value;
|
|
361
|
+
}
|
|
362
|
+
/**
|
|
363
|
+
* Strips a scheme prefix (e.g. `Bearer `) from a header value, case-insensitively.
|
|
364
|
+
*
|
|
365
|
+
* @param value - The raw header value.
|
|
366
|
+
* @param scheme - The scheme prefix to strip, or null/empty to leave the value untouched.
|
|
367
|
+
* @returns The token portion of the header value, trimmed.
|
|
368
|
+
*/ function stripOpenRouterWebhookScheme(value, scheme) {
|
|
369
|
+
var token = value.trim();
|
|
370
|
+
if (scheme) {
|
|
371
|
+
var prefix = "".concat(scheme.toLowerCase(), " ");
|
|
372
|
+
if (token.toLowerCase().startsWith(prefix)) {
|
|
373
|
+
token = token.slice(prefix.length).trim();
|
|
374
|
+
}
|
|
375
|
+
}
|
|
376
|
+
return token;
|
|
377
|
+
}
|
|
378
|
+
/**
|
|
379
|
+
* Creates a verifier for OpenRouter broadcast webhook requests.
|
|
380
|
+
*
|
|
381
|
+
* OpenRouter broadcast webhooks have no HMAC signature scheme. Authentication is a
|
|
382
|
+
* user-configured custom header (e.g. `Authorization: Bearer <secret>`) sent verbatim on every
|
|
383
|
+
* request. This verifier extracts the configured header, strips the scheme prefix, and compares
|
|
384
|
+
* the token to the expected secret using a constant-time comparison.
|
|
385
|
+
*
|
|
386
|
+
* @param config - Verification config containing the secret, header, and scheme.
|
|
387
|
+
* @returns A verifier function that validates each request's secret token.
|
|
388
|
+
*/ function openRouterWebhookEventVerifier(config) {
|
|
389
|
+
var secret = config.secret;
|
|
390
|
+
var header = config.header || DEFAULT_OPENROUTER_WEBHOOK_HEADER;
|
|
391
|
+
var scheme = config.scheme === undefined ? DEFAULT_OPENROUTER_WEBHOOK_SCHEME : config.scheme;
|
|
392
|
+
return function(req) {
|
|
393
|
+
var headerValue = readOpenRouterWebhookHeader(req, header);
|
|
394
|
+
var valid = false;
|
|
395
|
+
if (headerValue) {
|
|
396
|
+
var token = stripOpenRouterWebhookScheme(headerValue, scheme);
|
|
397
|
+
valid = safeCompareOpenRouterWebhookToken(token, secret);
|
|
398
|
+
}
|
|
399
|
+
var result = {
|
|
400
|
+
valid: valid
|
|
401
|
+
};
|
|
402
|
+
return result;
|
|
403
|
+
};
|
|
404
|
+
}
|
|
405
|
+
|
|
406
|
+
function asyncGeneratorStep$1(gen, resolve, reject, _next, _throw, key, arg) {
|
|
407
|
+
try {
|
|
408
|
+
var info = gen[key](arg);
|
|
409
|
+
var value = info.value;
|
|
410
|
+
} catch (error) {
|
|
411
|
+
reject(error);
|
|
412
|
+
return;
|
|
413
|
+
}
|
|
414
|
+
if (info.done) {
|
|
415
|
+
resolve(value);
|
|
416
|
+
} else {
|
|
417
|
+
Promise.resolve(value).then(_next, _throw);
|
|
418
|
+
}
|
|
419
|
+
}
|
|
420
|
+
function _async_to_generator$1(fn) {
|
|
421
|
+
return function() {
|
|
422
|
+
var self = this, args = arguments;
|
|
423
|
+
return new Promise(function(resolve, reject) {
|
|
424
|
+
var gen = fn.apply(self, args);
|
|
425
|
+
function _next(value) {
|
|
426
|
+
asyncGeneratorStep$1(gen, resolve, reject, _next, _throw, "next", value);
|
|
427
|
+
}
|
|
428
|
+
function _throw(err) {
|
|
429
|
+
asyncGeneratorStep$1(gen, resolve, reject, _next, _throw, "throw", err);
|
|
430
|
+
}
|
|
431
|
+
_next(undefined);
|
|
432
|
+
});
|
|
433
|
+
};
|
|
434
|
+
}
|
|
435
|
+
function _class_call_check$5(instance, Constructor) {
|
|
436
|
+
if (!(instance instanceof Constructor)) {
|
|
437
|
+
throw new TypeError("Cannot call a class as a function");
|
|
438
|
+
}
|
|
439
|
+
}
|
|
440
|
+
function _defineProperties$2(target, props) {
|
|
441
|
+
for(var i = 0; i < props.length; i++){
|
|
442
|
+
var descriptor = props[i];
|
|
443
|
+
descriptor.enumerable = descriptor.enumerable || false;
|
|
444
|
+
descriptor.configurable = true;
|
|
445
|
+
if ("value" in descriptor) descriptor.writable = true;
|
|
446
|
+
Object.defineProperty(target, descriptor.key, descriptor);
|
|
447
|
+
}
|
|
448
|
+
}
|
|
449
|
+
function _create_class$2(Constructor, protoProps, staticProps) {
|
|
450
|
+
if (protoProps) _defineProperties$2(Constructor.prototype, protoProps);
|
|
451
|
+
return Constructor;
|
|
452
|
+
}
|
|
453
|
+
function _define_property$3(obj, key, value) {
|
|
454
|
+
if (key in obj) {
|
|
455
|
+
Object.defineProperty(obj, key, {
|
|
456
|
+
value: value,
|
|
457
|
+
enumerable: true,
|
|
458
|
+
configurable: true,
|
|
459
|
+
writable: true
|
|
460
|
+
});
|
|
461
|
+
} else {
|
|
462
|
+
obj[key] = value;
|
|
463
|
+
}
|
|
464
|
+
return obj;
|
|
465
|
+
}
|
|
466
|
+
function _ts_generator$1(thisArg, body) {
|
|
467
|
+
var f, y, t, _ = {
|
|
468
|
+
label: 0,
|
|
469
|
+
sent: function() {
|
|
470
|
+
if (t[0] & 1) throw t[1];
|
|
471
|
+
return t[1];
|
|
472
|
+
},
|
|
473
|
+
trys: [],
|
|
474
|
+
ops: []
|
|
475
|
+
}, g = Object.create((typeof Iterator === "function" ? Iterator : Object).prototype), d = Object.defineProperty;
|
|
476
|
+
return d(g, "next", {
|
|
477
|
+
value: verb(0)
|
|
478
|
+
}), d(g, "throw", {
|
|
479
|
+
value: verb(1)
|
|
480
|
+
}), d(g, "return", {
|
|
481
|
+
value: verb(2)
|
|
482
|
+
}), typeof Symbol === "function" && d(g, Symbol.iterator, {
|
|
483
|
+
value: function() {
|
|
484
|
+
return this;
|
|
485
|
+
}
|
|
486
|
+
}), g;
|
|
487
|
+
function verb(n) {
|
|
488
|
+
return function(v) {
|
|
489
|
+
return step([
|
|
490
|
+
n,
|
|
491
|
+
v
|
|
492
|
+
]);
|
|
493
|
+
};
|
|
494
|
+
}
|
|
495
|
+
function step(op) {
|
|
496
|
+
if (f) throw new TypeError("Generator is already executing.");
|
|
497
|
+
while(g && (g = 0, op[0] && (_ = 0)), _)try {
|
|
498
|
+
if (f = 1, y && (t = op[0] & 2 ? y["return"] : op[0] ? y["throw"] || ((t = y["return"]) && t.call(y), 0) : y.next) && !(t = t.call(y, op[1])).done) return t;
|
|
499
|
+
if (y = 0, t) op = [
|
|
500
|
+
op[0] & 2,
|
|
501
|
+
t.value
|
|
502
|
+
];
|
|
503
|
+
switch(op[0]){
|
|
504
|
+
case 0:
|
|
505
|
+
case 1:
|
|
506
|
+
t = op;
|
|
507
|
+
break;
|
|
508
|
+
case 4:
|
|
509
|
+
_.label++;
|
|
510
|
+
return {
|
|
511
|
+
value: op[1],
|
|
512
|
+
done: false
|
|
513
|
+
};
|
|
514
|
+
case 5:
|
|
515
|
+
_.label++;
|
|
516
|
+
y = op[1];
|
|
517
|
+
op = [
|
|
518
|
+
0
|
|
519
|
+
];
|
|
520
|
+
continue;
|
|
521
|
+
case 7:
|
|
522
|
+
op = _.ops.pop();
|
|
523
|
+
_.trys.pop();
|
|
524
|
+
continue;
|
|
525
|
+
default:
|
|
526
|
+
if (!(t = _.trys, t = t.length > 0 && t[t.length - 1]) && (op[0] === 6 || op[0] === 2)) {
|
|
527
|
+
_ = 0;
|
|
528
|
+
continue;
|
|
529
|
+
}
|
|
530
|
+
if (op[0] === 3 && (!t || op[1] > t[0] && op[1] < t[3])) {
|
|
531
|
+
_.label = op[1];
|
|
532
|
+
break;
|
|
533
|
+
}
|
|
534
|
+
if (op[0] === 6 && _.label < t[1]) {
|
|
535
|
+
_.label = t[1];
|
|
536
|
+
t = op;
|
|
537
|
+
break;
|
|
538
|
+
}
|
|
539
|
+
if (t && _.label < t[2]) {
|
|
540
|
+
_.label = t[2];
|
|
541
|
+
_.ops.push(op);
|
|
542
|
+
break;
|
|
543
|
+
}
|
|
544
|
+
if (t[2]) _.ops.pop();
|
|
545
|
+
_.trys.pop();
|
|
546
|
+
continue;
|
|
547
|
+
}
|
|
548
|
+
op = body.call(thisArg, _);
|
|
549
|
+
} catch (e) {
|
|
550
|
+
op = [
|
|
551
|
+
6,
|
|
552
|
+
e
|
|
553
|
+
];
|
|
554
|
+
y = 0;
|
|
555
|
+
} finally{
|
|
556
|
+
f = t = 0;
|
|
557
|
+
}
|
|
558
|
+
if (op[0] & 5) throw op[1];
|
|
559
|
+
return {
|
|
560
|
+
value: op[0] ? op[1] : void 0,
|
|
561
|
+
done: true
|
|
562
|
+
};
|
|
563
|
+
}
|
|
564
|
+
}
|
|
565
|
+
/**
|
|
566
|
+
* Service that makes system changes based on OpenRouter broadcast webhook events.
|
|
567
|
+
*/ exports.OpenRouterWebhookService = /*#__PURE__*/ function() {
|
|
568
|
+
function OpenRouterWebhookService(openRouterWebhookServiceConfig) {
|
|
569
|
+
_class_call_check$5(this, OpenRouterWebhookService);
|
|
570
|
+
_define_property$3(this, "logger", new common.Logger('OpenRouterWebhookService'));
|
|
571
|
+
_define_property$3(this, "_verifier", void 0);
|
|
572
|
+
_define_property$3(this, "handler", openRouterEventHandlerFactory());
|
|
573
|
+
_define_property$3(this, "configure", openRouterEventHandlerConfigurerFactory(this.handler));
|
|
574
|
+
var _openRouterWebhookServiceConfig_openrouterWebhook = openRouterWebhookServiceConfig.openrouterWebhook, webhookSecret = _openRouterWebhookServiceConfig_openrouterWebhook.webhookSecret, header = _openRouterWebhookServiceConfig_openrouterWebhook.header, scheme = _openRouterWebhookServiceConfig_openrouterWebhook.scheme;
|
|
575
|
+
this._verifier = openRouterWebhookEventVerifier({
|
|
576
|
+
secret: webhookSecret,
|
|
577
|
+
header: header,
|
|
578
|
+
scheme: scheme
|
|
579
|
+
});
|
|
580
|
+
}
|
|
581
|
+
_create_class$2(OpenRouterWebhookService, [
|
|
582
|
+
{
|
|
583
|
+
key: "updateForWebhook",
|
|
584
|
+
value: function updateForWebhook(req, body) {
|
|
585
|
+
return _async_to_generator$1(function() {
|
|
586
|
+
var valid, result;
|
|
587
|
+
return _ts_generator$1(this, function(_state) {
|
|
588
|
+
switch(_state.label){
|
|
589
|
+
case 0:
|
|
590
|
+
valid = this._verifier(req).valid;
|
|
591
|
+
if (!valid) return [
|
|
592
|
+
3,
|
|
593
|
+
2
|
|
594
|
+
];
|
|
595
|
+
return [
|
|
596
|
+
4,
|
|
597
|
+
this.updateForBroadcast(body)
|
|
598
|
+
];
|
|
599
|
+
case 1:
|
|
600
|
+
result = _state.sent();
|
|
601
|
+
return [
|
|
602
|
+
3,
|
|
603
|
+
3
|
|
604
|
+
];
|
|
605
|
+
case 2:
|
|
606
|
+
this.logger.warn('Received OpenRouter webhook with an invalid secret token.');
|
|
607
|
+
result = {
|
|
608
|
+
valid: false,
|
|
609
|
+
totalSpans: 0,
|
|
610
|
+
handledSpans: 0
|
|
611
|
+
};
|
|
612
|
+
_state.label = 3;
|
|
613
|
+
case 3:
|
|
614
|
+
return [
|
|
615
|
+
2,
|
|
616
|
+
result
|
|
617
|
+
];
|
|
618
|
+
}
|
|
619
|
+
});
|
|
620
|
+
}).call(this);
|
|
621
|
+
}
|
|
622
|
+
},
|
|
623
|
+
{
|
|
624
|
+
key: "updateForBroadcast",
|
|
625
|
+
value: function updateForBroadcast(payload) {
|
|
626
|
+
return _async_to_generator$1(function() {
|
|
627
|
+
var spans, handledSpans, _iteratorNormalCompletion, _didIteratorError, _iteratorError, _iterator, _step, span, handled, err;
|
|
628
|
+
return _ts_generator$1(this, function(_state) {
|
|
629
|
+
switch(_state.label){
|
|
630
|
+
case 0:
|
|
631
|
+
spans = openRouterBroadcastSpansFromPayload(payload);
|
|
632
|
+
handledSpans = 0;
|
|
633
|
+
_iteratorNormalCompletion = true, _didIteratorError = false, _iteratorError = undefined;
|
|
634
|
+
_state.label = 1;
|
|
635
|
+
case 1:
|
|
636
|
+
_state.trys.push([
|
|
637
|
+
1,
|
|
638
|
+
6,
|
|
639
|
+
7,
|
|
640
|
+
8
|
|
641
|
+
]);
|
|
642
|
+
_iterator = spans[Symbol.iterator]();
|
|
643
|
+
_state.label = 2;
|
|
644
|
+
case 2:
|
|
645
|
+
if (!!(_iteratorNormalCompletion = (_step = _iterator.next()).done)) return [
|
|
646
|
+
3,
|
|
647
|
+
5
|
|
648
|
+
];
|
|
649
|
+
span = _step.value;
|
|
650
|
+
return [
|
|
651
|
+
4,
|
|
652
|
+
this.handler(span)
|
|
653
|
+
];
|
|
654
|
+
case 3:
|
|
655
|
+
handled = _state.sent();
|
|
656
|
+
if (handled) {
|
|
657
|
+
handledSpans += 1;
|
|
658
|
+
}
|
|
659
|
+
_state.label = 4;
|
|
660
|
+
case 4:
|
|
661
|
+
_iteratorNormalCompletion = true;
|
|
662
|
+
return [
|
|
663
|
+
3,
|
|
664
|
+
2
|
|
665
|
+
];
|
|
666
|
+
case 5:
|
|
667
|
+
return [
|
|
668
|
+
3,
|
|
669
|
+
8
|
|
670
|
+
];
|
|
671
|
+
case 6:
|
|
672
|
+
err = _state.sent();
|
|
673
|
+
_didIteratorError = true;
|
|
674
|
+
_iteratorError = err;
|
|
675
|
+
return [
|
|
676
|
+
3,
|
|
677
|
+
8
|
|
678
|
+
];
|
|
679
|
+
case 7:
|
|
680
|
+
try {
|
|
681
|
+
if (!_iteratorNormalCompletion && _iterator.return != null) {
|
|
682
|
+
_iterator.return();
|
|
683
|
+
}
|
|
684
|
+
} finally{
|
|
685
|
+
if (_didIteratorError) {
|
|
686
|
+
throw _iteratorError;
|
|
687
|
+
}
|
|
688
|
+
}
|
|
689
|
+
return [
|
|
690
|
+
7
|
|
691
|
+
];
|
|
692
|
+
case 8:
|
|
693
|
+
return [
|
|
694
|
+
2,
|
|
695
|
+
{
|
|
696
|
+
valid: true,
|
|
697
|
+
totalSpans: spans.length,
|
|
698
|
+
handledSpans: handledSpans
|
|
699
|
+
}
|
|
700
|
+
];
|
|
701
|
+
}
|
|
702
|
+
});
|
|
703
|
+
}).call(this);
|
|
704
|
+
}
|
|
705
|
+
}
|
|
706
|
+
]);
|
|
707
|
+
return OpenRouterWebhookService;
|
|
708
|
+
}();
|
|
709
|
+
exports.OpenRouterWebhookService = __decorate([
|
|
710
|
+
common.Injectable(),
|
|
711
|
+
__param(0, common.Inject(OpenRouterWebhookServiceConfig))
|
|
712
|
+
], exports.OpenRouterWebhookService);
|
|
713
|
+
|
|
714
|
+
function asyncGeneratorStep(gen, resolve, reject, _next, _throw, key, arg) {
|
|
715
|
+
try {
|
|
716
|
+
var info = gen[key](arg);
|
|
717
|
+
var value = info.value;
|
|
718
|
+
} catch (error) {
|
|
719
|
+
reject(error);
|
|
720
|
+
return;
|
|
721
|
+
}
|
|
722
|
+
if (info.done) {
|
|
723
|
+
resolve(value);
|
|
724
|
+
} else {
|
|
725
|
+
Promise.resolve(value).then(_next, _throw);
|
|
726
|
+
}
|
|
727
|
+
}
|
|
728
|
+
function _async_to_generator(fn) {
|
|
729
|
+
return function() {
|
|
730
|
+
var self = this, args = arguments;
|
|
731
|
+
return new Promise(function(resolve, reject) {
|
|
732
|
+
var gen = fn.apply(self, args);
|
|
733
|
+
function _next(value) {
|
|
734
|
+
asyncGeneratorStep(gen, resolve, reject, _next, _throw, "next", value);
|
|
735
|
+
}
|
|
736
|
+
function _throw(err) {
|
|
737
|
+
asyncGeneratorStep(gen, resolve, reject, _next, _throw, "throw", err);
|
|
738
|
+
}
|
|
739
|
+
_next(undefined);
|
|
740
|
+
});
|
|
741
|
+
};
|
|
742
|
+
}
|
|
743
|
+
function _class_call_check$4(instance, Constructor) {
|
|
744
|
+
if (!(instance instanceof Constructor)) {
|
|
745
|
+
throw new TypeError("Cannot call a class as a function");
|
|
746
|
+
}
|
|
747
|
+
}
|
|
748
|
+
function _defineProperties$1(target, props) {
|
|
749
|
+
for(var i = 0; i < props.length; i++){
|
|
750
|
+
var descriptor = props[i];
|
|
751
|
+
descriptor.enumerable = descriptor.enumerable || false;
|
|
752
|
+
descriptor.configurable = true;
|
|
753
|
+
if ("value" in descriptor) descriptor.writable = true;
|
|
754
|
+
Object.defineProperty(target, descriptor.key, descriptor);
|
|
755
|
+
}
|
|
756
|
+
}
|
|
757
|
+
function _create_class$1(Constructor, protoProps, staticProps) {
|
|
758
|
+
if (protoProps) _defineProperties$1(Constructor.prototype, protoProps);
|
|
759
|
+
return Constructor;
|
|
760
|
+
}
|
|
761
|
+
function _define_property$2(obj, key, value) {
|
|
762
|
+
if (key in obj) {
|
|
763
|
+
Object.defineProperty(obj, key, {
|
|
764
|
+
value: value,
|
|
765
|
+
enumerable: true,
|
|
766
|
+
configurable: true,
|
|
767
|
+
writable: true
|
|
768
|
+
});
|
|
769
|
+
} else {
|
|
770
|
+
obj[key] = value;
|
|
771
|
+
}
|
|
772
|
+
return obj;
|
|
773
|
+
}
|
|
774
|
+
function _ts_generator(thisArg, body) {
|
|
775
|
+
var f, y, t, _ = {
|
|
776
|
+
label: 0,
|
|
777
|
+
sent: function() {
|
|
778
|
+
if (t[0] & 1) throw t[1];
|
|
779
|
+
return t[1];
|
|
780
|
+
},
|
|
781
|
+
trys: [],
|
|
782
|
+
ops: []
|
|
783
|
+
}, g = Object.create((typeof Iterator === "function" ? Iterator : Object).prototype), d = Object.defineProperty;
|
|
784
|
+
return d(g, "next", {
|
|
785
|
+
value: verb(0)
|
|
786
|
+
}), d(g, "throw", {
|
|
787
|
+
value: verb(1)
|
|
788
|
+
}), d(g, "return", {
|
|
789
|
+
value: verb(2)
|
|
790
|
+
}), typeof Symbol === "function" && d(g, Symbol.iterator, {
|
|
791
|
+
value: function() {
|
|
792
|
+
return this;
|
|
793
|
+
}
|
|
794
|
+
}), g;
|
|
795
|
+
function verb(n) {
|
|
796
|
+
return function(v) {
|
|
797
|
+
return step([
|
|
798
|
+
n,
|
|
799
|
+
v
|
|
800
|
+
]);
|
|
801
|
+
};
|
|
802
|
+
}
|
|
803
|
+
function step(op) {
|
|
804
|
+
if (f) throw new TypeError("Generator is already executing.");
|
|
805
|
+
while(g && (g = 0, op[0] && (_ = 0)), _)try {
|
|
806
|
+
if (f = 1, y && (t = op[0] & 2 ? y["return"] : op[0] ? y["throw"] || ((t = y["return"]) && t.call(y), 0) : y.next) && !(t = t.call(y, op[1])).done) return t;
|
|
807
|
+
if (y = 0, t) op = [
|
|
808
|
+
op[0] & 2,
|
|
809
|
+
t.value
|
|
810
|
+
];
|
|
811
|
+
switch(op[0]){
|
|
812
|
+
case 0:
|
|
813
|
+
case 1:
|
|
814
|
+
t = op;
|
|
815
|
+
break;
|
|
816
|
+
case 4:
|
|
817
|
+
_.label++;
|
|
818
|
+
return {
|
|
819
|
+
value: op[1],
|
|
820
|
+
done: false
|
|
821
|
+
};
|
|
822
|
+
case 5:
|
|
823
|
+
_.label++;
|
|
824
|
+
y = op[1];
|
|
825
|
+
op = [
|
|
826
|
+
0
|
|
827
|
+
];
|
|
828
|
+
continue;
|
|
829
|
+
case 7:
|
|
830
|
+
op = _.ops.pop();
|
|
831
|
+
_.trys.pop();
|
|
832
|
+
continue;
|
|
833
|
+
default:
|
|
834
|
+
if (!(t = _.trys, t = t.length > 0 && t[t.length - 1]) && (op[0] === 6 || op[0] === 2)) {
|
|
835
|
+
_ = 0;
|
|
836
|
+
continue;
|
|
837
|
+
}
|
|
838
|
+
if (op[0] === 3 && (!t || op[1] > t[0] && op[1] < t[3])) {
|
|
839
|
+
_.label = op[1];
|
|
840
|
+
break;
|
|
841
|
+
}
|
|
842
|
+
if (op[0] === 6 && _.label < t[1]) {
|
|
843
|
+
_.label = t[1];
|
|
844
|
+
t = op;
|
|
845
|
+
break;
|
|
846
|
+
}
|
|
847
|
+
if (t && _.label < t[2]) {
|
|
848
|
+
_.label = t[2];
|
|
849
|
+
_.ops.push(op);
|
|
850
|
+
break;
|
|
851
|
+
}
|
|
852
|
+
if (t[2]) _.ops.pop();
|
|
853
|
+
_.trys.pop();
|
|
854
|
+
continue;
|
|
855
|
+
}
|
|
856
|
+
op = body.call(thisArg, _);
|
|
857
|
+
} catch (e) {
|
|
858
|
+
op = [
|
|
859
|
+
6,
|
|
860
|
+
e
|
|
861
|
+
];
|
|
862
|
+
y = 0;
|
|
863
|
+
} finally{
|
|
864
|
+
f = t = 0;
|
|
865
|
+
}
|
|
866
|
+
if (op[0] & 5) throw op[1];
|
|
867
|
+
return {
|
|
868
|
+
value: op[0] ? op[1] : void 0,
|
|
869
|
+
done: true
|
|
870
|
+
};
|
|
871
|
+
}
|
|
872
|
+
}
|
|
873
|
+
/**
|
|
874
|
+
* Controller for incoming OpenRouter broadcast webhook requests.
|
|
875
|
+
*
|
|
876
|
+
* OpenRouter can be configured to deliver broadcast traces via POST (default) or PUT, so both
|
|
877
|
+
* verbs are handled. Authentication is a user-configured header carrying a shared secret, so a
|
|
878
|
+
* plain `@Body()` (parsed JSON) is sufficient — no raw-body middleware is required.
|
|
879
|
+
*/ exports.OpenRouterWebhookController = /*#__PURE__*/ function() {
|
|
880
|
+
function OpenRouterWebhookController(openrouterWebhookService) {
|
|
881
|
+
_class_call_check$4(this, OpenRouterWebhookController);
|
|
882
|
+
_define_property$2(this, "_openrouterWebhookService", void 0);
|
|
883
|
+
this._openrouterWebhookService = openrouterWebhookService;
|
|
884
|
+
}
|
|
885
|
+
_create_class$1(OpenRouterWebhookController, [
|
|
886
|
+
{
|
|
887
|
+
key: "handleOpenRouterWebhookPost",
|
|
888
|
+
value: function handleOpenRouterWebhookPost(req, body) {
|
|
889
|
+
return _async_to_generator(function() {
|
|
890
|
+
return _ts_generator(this, function(_state) {
|
|
891
|
+
switch(_state.label){
|
|
892
|
+
case 0:
|
|
893
|
+
return [
|
|
894
|
+
4,
|
|
895
|
+
this.handleOpenRouterWebhook(req, body)
|
|
896
|
+
];
|
|
897
|
+
case 1:
|
|
898
|
+
_state.sent();
|
|
899
|
+
return [
|
|
900
|
+
2
|
|
901
|
+
];
|
|
902
|
+
}
|
|
903
|
+
});
|
|
904
|
+
}).call(this);
|
|
905
|
+
}
|
|
906
|
+
},
|
|
907
|
+
{
|
|
908
|
+
key: "handleOpenRouterWebhookPut",
|
|
909
|
+
value: function handleOpenRouterWebhookPut(req, body) {
|
|
910
|
+
return _async_to_generator(function() {
|
|
911
|
+
return _ts_generator(this, function(_state) {
|
|
912
|
+
switch(_state.label){
|
|
913
|
+
case 0:
|
|
914
|
+
return [
|
|
915
|
+
4,
|
|
916
|
+
this.handleOpenRouterWebhook(req, body)
|
|
917
|
+
];
|
|
918
|
+
case 1:
|
|
919
|
+
_state.sent();
|
|
920
|
+
return [
|
|
921
|
+
2
|
|
922
|
+
];
|
|
923
|
+
}
|
|
924
|
+
});
|
|
925
|
+
}).call(this);
|
|
926
|
+
}
|
|
927
|
+
},
|
|
928
|
+
{
|
|
929
|
+
key: "handleOpenRouterWebhook",
|
|
930
|
+
value: function handleOpenRouterWebhook(req, body) {
|
|
931
|
+
return _async_to_generator(function() {
|
|
932
|
+
var result;
|
|
933
|
+
return _ts_generator(this, function(_state) {
|
|
934
|
+
switch(_state.label){
|
|
935
|
+
case 0:
|
|
936
|
+
return [
|
|
937
|
+
4,
|
|
938
|
+
this._openrouterWebhookService.updateForWebhook(req, body)
|
|
939
|
+
];
|
|
940
|
+
case 1:
|
|
941
|
+
result = _state.sent();
|
|
942
|
+
if (!result.valid) {
|
|
943
|
+
throw new common.UnauthorizedException('Invalid OpenRouter webhook token.');
|
|
944
|
+
}
|
|
945
|
+
return [
|
|
946
|
+
2
|
|
947
|
+
];
|
|
948
|
+
}
|
|
949
|
+
});
|
|
950
|
+
}).call(this);
|
|
951
|
+
}
|
|
952
|
+
}
|
|
953
|
+
]);
|
|
954
|
+
return OpenRouterWebhookController;
|
|
955
|
+
}();
|
|
956
|
+
__decorate([
|
|
957
|
+
common.Post(),
|
|
958
|
+
__param(0, common.Req()),
|
|
959
|
+
__param(1, common.Body())
|
|
960
|
+
], exports.OpenRouterWebhookController.prototype, "handleOpenRouterWebhookPost", null);
|
|
961
|
+
__decorate([
|
|
962
|
+
common.Put(),
|
|
963
|
+
__param(0, common.Req()),
|
|
964
|
+
__param(1, common.Body())
|
|
965
|
+
], exports.OpenRouterWebhookController.prototype, "handleOpenRouterWebhookPut", null);
|
|
966
|
+
exports.OpenRouterWebhookController = __decorate([
|
|
967
|
+
common.Controller('/webhook/openrouter'),
|
|
968
|
+
__param(0, common.Inject(exports.OpenRouterWebhookService))
|
|
969
|
+
], exports.OpenRouterWebhookController);
|
|
970
|
+
|
|
971
|
+
function _class_call_check$3(instance, Constructor) {
|
|
972
|
+
if (!(instance instanceof Constructor)) {
|
|
973
|
+
throw new TypeError("Cannot call a class as a function");
|
|
974
|
+
}
|
|
975
|
+
}
|
|
976
|
+
/**
|
|
977
|
+
* Factory that creates an OpenRouterWebhookServiceConfig from environment variables.
|
|
978
|
+
*
|
|
979
|
+
* Reads the OpenRouter webhook secret token, and the optional header name and scheme, from
|
|
980
|
+
* environment variables.
|
|
981
|
+
*
|
|
982
|
+
* @param configService - NestJS config service for reading environment variables.
|
|
983
|
+
* @returns A validated OpenRouterWebhookServiceConfig.
|
|
984
|
+
*/ function openRouterWebhookServiceConfigFactory(configService) {
|
|
985
|
+
var _configService_get, _configService_get1;
|
|
986
|
+
var config = {
|
|
987
|
+
openrouterWebhook: {
|
|
988
|
+
webhookSecret: configService.get(OPENROUTER_WEBHOOK_SECRET_TOKEN_ENV_VAR),
|
|
989
|
+
header: (_configService_get = configService.get(OPENROUTER_WEBHOOK_HEADER_ENV_VAR)) !== null && _configService_get !== void 0 ? _configService_get : undefined,
|
|
990
|
+
scheme: (_configService_get1 = configService.get(OPENROUTER_WEBHOOK_SCHEME_ENV_VAR)) !== null && _configService_get1 !== void 0 ? _configService_get1 : undefined
|
|
991
|
+
}
|
|
992
|
+
};
|
|
993
|
+
OpenRouterWebhookServiceConfig.assertValidConfig(config);
|
|
994
|
+
return config;
|
|
995
|
+
}
|
|
996
|
+
/**
|
|
997
|
+
* NestJS module that handles incoming OpenRouter broadcast webhook events.
|
|
998
|
+
*
|
|
999
|
+
* Standalone — does not depend on OpenRouterModule (no API key needed). Verification is a
|
|
1000
|
+
* constant-time comparison of the user-configured secret header, so the SDK client is unused here.
|
|
1001
|
+
* Provides the OpenRouterWebhookService and controller for verifying and processing broadcast payloads.
|
|
1002
|
+
*/ exports.OpenRouterWebhookModule = function OpenRouterWebhookModule() {
|
|
1003
|
+
_class_call_check$3(this, OpenRouterWebhookModule);
|
|
1004
|
+
};
|
|
1005
|
+
exports.OpenRouterWebhookModule = __decorate([
|
|
1006
|
+
common.Module({
|
|
1007
|
+
imports: [
|
|
1008
|
+
config.ConfigModule
|
|
1009
|
+
],
|
|
1010
|
+
controllers: [
|
|
1011
|
+
exports.OpenRouterWebhookController
|
|
1012
|
+
],
|
|
1013
|
+
providers: [
|
|
1014
|
+
{
|
|
1015
|
+
provide: OpenRouterWebhookServiceConfig,
|
|
1016
|
+
inject: [
|
|
1017
|
+
config.ConfigService
|
|
1018
|
+
],
|
|
1019
|
+
useFactory: openRouterWebhookServiceConfigFactory
|
|
1020
|
+
},
|
|
1021
|
+
exports.OpenRouterWebhookService
|
|
1022
|
+
],
|
|
1023
|
+
exports: [
|
|
1024
|
+
exports.OpenRouterWebhookService
|
|
1025
|
+
]
|
|
1026
|
+
})
|
|
1027
|
+
], exports.OpenRouterWebhookModule);
|
|
1028
|
+
|
|
1029
|
+
function _class_call_check$2(instance, Constructor) {
|
|
1030
|
+
if (!(instance instanceof Constructor)) {
|
|
1031
|
+
throw new TypeError("Cannot call a class as a function");
|
|
1032
|
+
}
|
|
1033
|
+
}
|
|
1034
|
+
function _defineProperties(target, props) {
|
|
1035
|
+
for(var i = 0; i < props.length; i++){
|
|
1036
|
+
var descriptor = props[i];
|
|
1037
|
+
descriptor.enumerable = descriptor.enumerable || false;
|
|
1038
|
+
descriptor.configurable = true;
|
|
1039
|
+
if ("value" in descriptor) descriptor.writable = true;
|
|
1040
|
+
Object.defineProperty(target, descriptor.key, descriptor);
|
|
1041
|
+
}
|
|
1042
|
+
}
|
|
1043
|
+
function _create_class(Constructor, protoProps, staticProps) {
|
|
1044
|
+
if (staticProps) _defineProperties(Constructor, staticProps);
|
|
1045
|
+
return Constructor;
|
|
1046
|
+
}
|
|
1047
|
+
function _define_property$1(obj, key, value) {
|
|
1048
|
+
if (key in obj) {
|
|
1049
|
+
Object.defineProperty(obj, key, {
|
|
1050
|
+
value: value,
|
|
1051
|
+
enumerable: true,
|
|
1052
|
+
configurable: true,
|
|
1053
|
+
writable: true
|
|
1054
|
+
});
|
|
1055
|
+
} else {
|
|
1056
|
+
obj[key] = value;
|
|
1057
|
+
}
|
|
1058
|
+
return obj;
|
|
1059
|
+
}
|
|
1060
|
+
/**
|
|
1061
|
+
* Default environment variable for the OpenRouter API key.
|
|
1062
|
+
*/ var OPENROUTER_API_KEY_ENV_VAR = 'OPENROUTER_API_KEY';
|
|
1063
|
+
/**
|
|
1064
|
+
* Optional environment variable for overriding the OpenRouter server/base URL.
|
|
1065
|
+
*/ var OPENROUTER_SERVER_URL_ENV_VAR = 'OPENROUTER_SERVER_URL';
|
|
1066
|
+
/**
|
|
1067
|
+
* Configuration for OpenRouterApi.
|
|
1068
|
+
*/ var OpenRouterServiceConfig = /*#__PURE__*/ function() {
|
|
1069
|
+
function OpenRouterServiceConfig() {
|
|
1070
|
+
_class_call_check$2(this, OpenRouterServiceConfig);
|
|
1071
|
+
_define_property$1(this, "openrouter", void 0);
|
|
1072
|
+
}
|
|
1073
|
+
_create_class(OpenRouterServiceConfig, null, [
|
|
1074
|
+
{
|
|
1075
|
+
key: "assertValidConfig",
|
|
1076
|
+
value: function assertValidConfig(config) {
|
|
1077
|
+
if (!config.openrouter.apiKey) {
|
|
1078
|
+
throw new Error('No OpenRouter API key specified.');
|
|
1079
|
+
}
|
|
1080
|
+
}
|
|
1081
|
+
}
|
|
1082
|
+
]);
|
|
1083
|
+
return OpenRouterServiceConfig;
|
|
1084
|
+
}
|
|
1085
|
+
();
|
|
1086
|
+
|
|
1087
|
+
function _class_call_check$1(instance, Constructor) {
|
|
1088
|
+
if (!(instance instanceof Constructor)) {
|
|
1089
|
+
throw new TypeError("Cannot call a class as a function");
|
|
1090
|
+
}
|
|
1091
|
+
}
|
|
1092
|
+
function _define_property(obj, key, value) {
|
|
1093
|
+
if (key in obj) {
|
|
1094
|
+
Object.defineProperty(obj, key, {
|
|
1095
|
+
value: value,
|
|
1096
|
+
enumerable: true,
|
|
1097
|
+
configurable: true,
|
|
1098
|
+
writable: true
|
|
1099
|
+
});
|
|
1100
|
+
} else {
|
|
1101
|
+
obj[key] = value;
|
|
1102
|
+
}
|
|
1103
|
+
return obj;
|
|
1104
|
+
}
|
|
1105
|
+
exports.OpenRouterApi = function OpenRouterApi(config) {
|
|
1106
|
+
_class_call_check$1(this, OpenRouterApi);
|
|
1107
|
+
_define_property(this, "config", void 0);
|
|
1108
|
+
_define_property(this, "openRouterClient", void 0);
|
|
1109
|
+
this.config = config;
|
|
1110
|
+
var _config_openrouter = config.openrouter, apiKey = _config_openrouter.apiKey, serverURL = _config_openrouter.serverURL;
|
|
1111
|
+
this.openRouterClient = new sdk.OpenRouter({
|
|
1112
|
+
apiKey: apiKey,
|
|
1113
|
+
serverURL: serverURL
|
|
1114
|
+
});
|
|
1115
|
+
};
|
|
1116
|
+
exports.OpenRouterApi = __decorate([
|
|
1117
|
+
common.Injectable(),
|
|
1118
|
+
__param(0, common.Inject(OpenRouterServiceConfig))
|
|
1119
|
+
], exports.OpenRouterApi);
|
|
1120
|
+
|
|
1121
|
+
function _class_call_check(instance, Constructor) {
|
|
1122
|
+
if (!(instance instanceof Constructor)) {
|
|
1123
|
+
throw new TypeError("Cannot call a class as a function");
|
|
1124
|
+
}
|
|
1125
|
+
}
|
|
1126
|
+
/**
|
|
1127
|
+
* Factory that creates an OpenRouterServiceConfig from environment variables.
|
|
1128
|
+
*
|
|
1129
|
+
* Reads the API key and optional server/base URL override from environment variables.
|
|
1130
|
+
*
|
|
1131
|
+
* @param configService - NestJS config service for reading environment variables.
|
|
1132
|
+
* @returns A validated OpenRouterServiceConfig.
|
|
1133
|
+
*/ function openRouterServiceConfigFactory(configService) {
|
|
1134
|
+
var _configService_get;
|
|
1135
|
+
var config = {
|
|
1136
|
+
openrouter: {
|
|
1137
|
+
apiKey: configService.get(OPENROUTER_API_KEY_ENV_VAR),
|
|
1138
|
+
serverURL: (_configService_get = configService.get(OPENROUTER_SERVER_URL_ENV_VAR)) !== null && _configService_get !== void 0 ? _configService_get : undefined
|
|
1139
|
+
}
|
|
1140
|
+
};
|
|
1141
|
+
OpenRouterServiceConfig.assertValidConfig(config);
|
|
1142
|
+
return config;
|
|
1143
|
+
}
|
|
1144
|
+
/**
|
|
1145
|
+
* NestJS module that provides the OpenRouterApi service.
|
|
1146
|
+
*
|
|
1147
|
+
* Reads the OpenRouter API key and optional server URL override from environment variables.
|
|
1148
|
+
*/ exports.OpenRouterModule = function OpenRouterModule() {
|
|
1149
|
+
_class_call_check(this, OpenRouterModule);
|
|
1150
|
+
};
|
|
1151
|
+
exports.OpenRouterModule = __decorate([
|
|
1152
|
+
common.Module({
|
|
1153
|
+
imports: [
|
|
1154
|
+
config.ConfigModule
|
|
1155
|
+
],
|
|
1156
|
+
providers: [
|
|
1157
|
+
{
|
|
1158
|
+
provide: OpenRouterServiceConfig,
|
|
1159
|
+
inject: [
|
|
1160
|
+
config.ConfigService
|
|
1161
|
+
],
|
|
1162
|
+
useFactory: openRouterServiceConfigFactory
|
|
1163
|
+
},
|
|
1164
|
+
exports.OpenRouterApi
|
|
1165
|
+
],
|
|
1166
|
+
exports: [
|
|
1167
|
+
exports.OpenRouterApi
|
|
1168
|
+
]
|
|
1169
|
+
})
|
|
1170
|
+
], exports.OpenRouterModule);
|
|
1171
|
+
|
|
1172
|
+
exports.DEFAULT_OPENROUTER_WEBHOOK_HEADER = DEFAULT_OPENROUTER_WEBHOOK_HEADER;
|
|
1173
|
+
exports.DEFAULT_OPENROUTER_WEBHOOK_SCHEME = DEFAULT_OPENROUTER_WEBHOOK_SCHEME;
|
|
1174
|
+
exports.OPENROUTER_API_KEY_ENV_VAR = OPENROUTER_API_KEY_ENV_VAR;
|
|
1175
|
+
exports.OPENROUTER_SERVER_URL_ENV_VAR = OPENROUTER_SERVER_URL_ENV_VAR;
|
|
1176
|
+
exports.OPENROUTER_SPAN_ATTRIBUTE_COMPLETION_TOKENS_KEYS = OPENROUTER_SPAN_ATTRIBUTE_COMPLETION_TOKENS_KEYS;
|
|
1177
|
+
exports.OPENROUTER_SPAN_ATTRIBUTE_COST_KEYS = OPENROUTER_SPAN_ATTRIBUTE_COST_KEYS;
|
|
1178
|
+
exports.OPENROUTER_SPAN_ATTRIBUTE_GENERATION_ID_KEYS = OPENROUTER_SPAN_ATTRIBUTE_GENERATION_ID_KEYS;
|
|
1179
|
+
exports.OPENROUTER_SPAN_ATTRIBUTE_MODEL_KEYS = OPENROUTER_SPAN_ATTRIBUTE_MODEL_KEYS;
|
|
1180
|
+
exports.OPENROUTER_SPAN_ATTRIBUTE_PROMPT_TOKENS_KEYS = OPENROUTER_SPAN_ATTRIBUTE_PROMPT_TOKENS_KEYS;
|
|
1181
|
+
exports.OPENROUTER_SPAN_ATTRIBUTE_PROVIDER_KEYS = OPENROUTER_SPAN_ATTRIBUTE_PROVIDER_KEYS;
|
|
1182
|
+
exports.OPENROUTER_SPAN_ATTRIBUTE_TOTAL_TOKENS_KEYS = OPENROUTER_SPAN_ATTRIBUTE_TOTAL_TOKENS_KEYS;
|
|
1183
|
+
exports.OPENROUTER_WEBHOOK_HEADER_ENV_VAR = OPENROUTER_WEBHOOK_HEADER_ENV_VAR;
|
|
1184
|
+
exports.OPENROUTER_WEBHOOK_SCHEME_ENV_VAR = OPENROUTER_WEBHOOK_SCHEME_ENV_VAR;
|
|
1185
|
+
exports.OPENROUTER_WEBHOOK_SECRET_TOKEN_ENV_VAR = OPENROUTER_WEBHOOK_SECRET_TOKEN_ENV_VAR;
|
|
1186
|
+
exports.OpenRouterServiceConfig = OpenRouterServiceConfig;
|
|
1187
|
+
exports.OpenRouterWebhookServiceConfig = OpenRouterWebhookServiceConfig;
|
|
1188
|
+
exports.openRouterAttributeMap = openRouterAttributeMap;
|
|
1189
|
+
exports.openRouterBroadcastSpan = openRouterBroadcastSpan;
|
|
1190
|
+
exports.openRouterBroadcastSpansFromPayload = openRouterBroadcastSpansFromPayload;
|
|
1191
|
+
exports.openRouterEventHandlerConfigurerFactory = openRouterEventHandlerConfigurerFactory;
|
|
1192
|
+
exports.openRouterEventHandlerFactory = openRouterEventHandlerFactory;
|
|
1193
|
+
exports.openRouterGenerationInfoFromAttributes = openRouterGenerationInfoFromAttributes;
|
|
1194
|
+
exports.openRouterServiceConfigFactory = openRouterServiceConfigFactory;
|
|
1195
|
+
exports.openRouterWebhookEventVerifier = openRouterWebhookEventVerifier;
|
|
1196
|
+
exports.openRouterWebhookServiceConfigFactory = openRouterWebhookServiceConfigFactory;
|
|
1197
|
+
exports.readOpenRouterAnyValue = readOpenRouterAnyValue;
|
|
1198
|
+
exports.readOpenRouterWebhookHeader = readOpenRouterWebhookHeader;
|
|
1199
|
+
exports.safeCompareOpenRouterWebhookToken = safeCompareOpenRouterWebhookToken;
|
|
1200
|
+
exports.stripOpenRouterWebhookScheme = stripOpenRouterWebhookScheme;
|