@optimizely-opal/opal-tool-ocp-sdk 1.0.0-beta.1 → 1.0.0-beta.3
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/README.md +42 -0
- package/dist/function/GlobalToolFunction.d.ts +1 -0
- package/dist/function/GlobalToolFunction.d.ts.map +1 -1
- package/dist/function/GlobalToolFunction.js +8 -0
- package/dist/function/GlobalToolFunction.js.map +1 -1
- package/dist/function/GlobalToolFunction.test.js +3 -0
- package/dist/function/GlobalToolFunction.test.js.map +1 -1
- package/dist/function/ToolFunction.d.ts +7 -1
- package/dist/function/ToolFunction.d.ts.map +1 -1
- package/dist/function/ToolFunction.js +14 -1
- package/dist/function/ToolFunction.js.map +1 -1
- package/dist/function/ToolFunction.test.js +3 -0
- package/dist/function/ToolFunction.test.js.map +1 -1
- package/dist/logging/ToolLogger.d.ts +34 -0
- package/dist/logging/ToolLogger.d.ts.map +1 -0
- package/dist/logging/ToolLogger.js +153 -0
- package/dist/logging/ToolLogger.js.map +1 -0
- package/dist/logging/ToolLogger.test.d.ts +2 -0
- package/dist/logging/ToolLogger.test.d.ts.map +1 -0
- package/dist/logging/ToolLogger.test.js +646 -0
- package/dist/logging/ToolLogger.test.js.map +1 -0
- package/dist/service/Service.d.ts.map +1 -1
- package/dist/service/Service.js +17 -0
- package/dist/service/Service.js.map +1 -1
- package/dist/service/Service.test.js +114 -6
- package/dist/service/Service.test.js.map +1 -1
- package/dist/validation/ParameterValidator.d.ts +42 -0
- package/dist/validation/ParameterValidator.d.ts.map +1 -0
- package/dist/validation/ParameterValidator.js +122 -0
- package/dist/validation/ParameterValidator.js.map +1 -0
- package/dist/validation/ParameterValidator.test.d.ts +2 -0
- package/dist/validation/ParameterValidator.test.d.ts.map +1 -0
- package/dist/validation/ParameterValidator.test.js +282 -0
- package/dist/validation/ParameterValidator.test.js.map +1 -0
- package/package.json +1 -1
- package/src/function/GlobalToolFunction.test.ts +3 -0
- package/src/function/GlobalToolFunction.ts +11 -0
- package/src/function/ToolFunction.test.ts +3 -0
- package/src/function/ToolFunction.ts +19 -1
- package/src/logging/ToolLogger.test.ts +753 -0
- package/src/logging/ToolLogger.ts +177 -0
- package/src/service/Service.test.ts +155 -14
- package/src/service/Service.ts +19 -1
- package/src/validation/ParameterValidator.test.ts +341 -0
- package/src/validation/ParameterValidator.ts +153 -0
|
@@ -0,0 +1,282 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
const ParameterValidator_1 = require("./ParameterValidator");
|
|
4
|
+
const Models_1 = require("../types/Models");
|
|
5
|
+
describe('ParameterValidator', () => {
|
|
6
|
+
describe('validate', () => {
|
|
7
|
+
it('should pass validation for valid parameters', () => {
|
|
8
|
+
const paramDefs = [
|
|
9
|
+
new Models_1.Parameter('name', Models_1.ParameterType.String, 'User name', true),
|
|
10
|
+
new Models_1.Parameter('age', Models_1.ParameterType.Integer, 'User age', false),
|
|
11
|
+
new Models_1.Parameter('score', Models_1.ParameterType.Number, 'User score', false),
|
|
12
|
+
new Models_1.Parameter('active', Models_1.ParameterType.Boolean, 'Is active', false),
|
|
13
|
+
new Models_1.Parameter('tags', Models_1.ParameterType.List, 'User tags', false),
|
|
14
|
+
new Models_1.Parameter('config', Models_1.ParameterType.Dictionary, 'User config', false)
|
|
15
|
+
];
|
|
16
|
+
const validParams = {
|
|
17
|
+
name: 'John Doe',
|
|
18
|
+
age: 25,
|
|
19
|
+
score: 85.5,
|
|
20
|
+
active: true,
|
|
21
|
+
tags: ['admin', 'user'],
|
|
22
|
+
config: { theme: 'dark', language: 'en' }
|
|
23
|
+
};
|
|
24
|
+
const result = ParameterValidator_1.ParameterValidator.validate(validParams, paramDefs);
|
|
25
|
+
expect(result.isValid).toBe(true);
|
|
26
|
+
expect(result.errors).toHaveLength(0);
|
|
27
|
+
});
|
|
28
|
+
it('should fail validation for missing required parameters', () => {
|
|
29
|
+
const paramDefs = [
|
|
30
|
+
new Models_1.Parameter('name', Models_1.ParameterType.String, 'User name', true),
|
|
31
|
+
new Models_1.Parameter('email', Models_1.ParameterType.String, 'User email', true)
|
|
32
|
+
];
|
|
33
|
+
const params = {
|
|
34
|
+
name: 'John Doe'
|
|
35
|
+
// email is missing
|
|
36
|
+
};
|
|
37
|
+
const result = ParameterValidator_1.ParameterValidator.validate(params, paramDefs);
|
|
38
|
+
expect(result.isValid).toBe(false);
|
|
39
|
+
expect(result.errors).toHaveLength(1);
|
|
40
|
+
expect(result.errors[0]).toEqual({
|
|
41
|
+
field: 'email',
|
|
42
|
+
message: "Required parameter 'email' is missing"
|
|
43
|
+
});
|
|
44
|
+
});
|
|
45
|
+
it('should fail validation for wrong parameter types', () => {
|
|
46
|
+
const paramDefs = [
|
|
47
|
+
new Models_1.Parameter('name', Models_1.ParameterType.String, 'User name', true),
|
|
48
|
+
new Models_1.Parameter('age', Models_1.ParameterType.Integer, 'User age', true),
|
|
49
|
+
new Models_1.Parameter('active', Models_1.ParameterType.Boolean, 'Is active', true),
|
|
50
|
+
new Models_1.Parameter('tags', Models_1.ParameterType.List, 'User tags', true),
|
|
51
|
+
new Models_1.Parameter('config', Models_1.ParameterType.Dictionary, 'User config', true)
|
|
52
|
+
];
|
|
53
|
+
const invalidParams = {
|
|
54
|
+
name: 123, // should be string
|
|
55
|
+
age: '25', // should be integer
|
|
56
|
+
active: 'true', // should be boolean
|
|
57
|
+
tags: 'tag1,tag2', // should be array
|
|
58
|
+
config: 'invalid' // should be object
|
|
59
|
+
};
|
|
60
|
+
const result = ParameterValidator_1.ParameterValidator.validate(invalidParams, paramDefs);
|
|
61
|
+
expect(result.isValid).toBe(false);
|
|
62
|
+
expect(result.errors).toHaveLength(5);
|
|
63
|
+
expect(result.errors[0].field).toBe('name');
|
|
64
|
+
expect(result.errors[0].message).toContain('must be a string');
|
|
65
|
+
expect(result.errors[1].field).toBe('age');
|
|
66
|
+
expect(result.errors[1].message).toContain('must be an integer');
|
|
67
|
+
expect(result.errors[2].field).toBe('active');
|
|
68
|
+
expect(result.errors[2].message).toContain('must be a boolean');
|
|
69
|
+
expect(result.errors[3].field).toBe('tags');
|
|
70
|
+
expect(result.errors[3].message).toContain('must be an array');
|
|
71
|
+
expect(result.errors[4].field).toBe('config');
|
|
72
|
+
expect(result.errors[4].message).toContain('must be an object');
|
|
73
|
+
});
|
|
74
|
+
it('should handle null/undefined parameters correctly', () => {
|
|
75
|
+
const paramDefs = [
|
|
76
|
+
new Models_1.Parameter('required', Models_1.ParameterType.String, 'Required param', true),
|
|
77
|
+
new Models_1.Parameter('optional', Models_1.ParameterType.String, 'Optional param', false)
|
|
78
|
+
];
|
|
79
|
+
const result1 = ParameterValidator_1.ParameterValidator.validate(null, paramDefs);
|
|
80
|
+
expect(result1.isValid).toBe(false);
|
|
81
|
+
expect(result1.errors).toHaveLength(1);
|
|
82
|
+
expect(result1.errors[0].field).toBe('required');
|
|
83
|
+
const result2 = ParameterValidator_1.ParameterValidator.validate(undefined, paramDefs);
|
|
84
|
+
expect(result2.isValid).toBe(false);
|
|
85
|
+
expect(result2.errors).toHaveLength(1);
|
|
86
|
+
expect(result2.errors[0].field).toBe('required');
|
|
87
|
+
});
|
|
88
|
+
it('should allow optional parameters to be missing', () => {
|
|
89
|
+
const paramDefs = [
|
|
90
|
+
new Models_1.Parameter('name', Models_1.ParameterType.String, 'User name', true),
|
|
91
|
+
new Models_1.Parameter('age', Models_1.ParameterType.Integer, 'User age', false)
|
|
92
|
+
];
|
|
93
|
+
const params = {
|
|
94
|
+
name: 'John Doe'
|
|
95
|
+
// age is optional and missing
|
|
96
|
+
};
|
|
97
|
+
const result = ParameterValidator_1.ParameterValidator.validate(params, paramDefs);
|
|
98
|
+
expect(result.isValid).toBe(true);
|
|
99
|
+
expect(result.errors).toHaveLength(0);
|
|
100
|
+
});
|
|
101
|
+
it('should distinguish between integer and number types', () => {
|
|
102
|
+
const paramDefs = [
|
|
103
|
+
new Models_1.Parameter('count', Models_1.ParameterType.Integer, 'Item count', true),
|
|
104
|
+
new Models_1.Parameter('score', Models_1.ParameterType.Number, 'Score value', true)
|
|
105
|
+
];
|
|
106
|
+
const params1 = {
|
|
107
|
+
count: 25.5, // should be integer, not float
|
|
108
|
+
score: 85.5 // number is fine
|
|
109
|
+
};
|
|
110
|
+
const result1 = ParameterValidator_1.ParameterValidator.validate(params1, paramDefs);
|
|
111
|
+
expect(result1.isValid).toBe(false);
|
|
112
|
+
expect(result1.errors).toHaveLength(1);
|
|
113
|
+
expect(result1.errors[0].field).toBe('count');
|
|
114
|
+
expect(result1.errors[0].message).toContain('must be an integer');
|
|
115
|
+
const params2 = {
|
|
116
|
+
count: 25, // integer is fine
|
|
117
|
+
score: 85.5 // number is fine
|
|
118
|
+
};
|
|
119
|
+
const result2 = ParameterValidator_1.ParameterValidator.validate(params2, paramDefs);
|
|
120
|
+
expect(result2.isValid).toBe(true);
|
|
121
|
+
expect(result2.errors).toHaveLength(0);
|
|
122
|
+
});
|
|
123
|
+
it('should handle array vs object distinction', () => {
|
|
124
|
+
const paramDefs = [
|
|
125
|
+
new Models_1.Parameter('tags', Models_1.ParameterType.List, 'Tag list', true),
|
|
126
|
+
new Models_1.Parameter('config', Models_1.ParameterType.Dictionary, 'Config object', true)
|
|
127
|
+
];
|
|
128
|
+
const params = {
|
|
129
|
+
tags: { 0: 'tag1', 1: 'tag2' }, // object that looks like array
|
|
130
|
+
config: ['key1', 'key2'] // array instead of object
|
|
131
|
+
};
|
|
132
|
+
const result = ParameterValidator_1.ParameterValidator.validate(params, paramDefs);
|
|
133
|
+
expect(result.isValid).toBe(false);
|
|
134
|
+
expect(result.errors).toHaveLength(2);
|
|
135
|
+
expect(result.errors[0].field).toBe('tags');
|
|
136
|
+
expect(result.errors[0].message).toContain('must be an array');
|
|
137
|
+
expect(result.errors[1].field).toBe('config');
|
|
138
|
+
expect(result.errors[1].message).toContain('must be an object');
|
|
139
|
+
});
|
|
140
|
+
it('should handle null values for optional parameters', () => {
|
|
141
|
+
const paramDefs = [
|
|
142
|
+
new Models_1.Parameter('name', Models_1.ParameterType.String, 'User name', true),
|
|
143
|
+
new Models_1.Parameter('age', Models_1.ParameterType.Integer, 'User age', false)
|
|
144
|
+
];
|
|
145
|
+
const params = {
|
|
146
|
+
name: 'John Doe',
|
|
147
|
+
age: null // null for optional parameter should be allowed
|
|
148
|
+
};
|
|
149
|
+
const result = ParameterValidator_1.ParameterValidator.validate(params, paramDefs);
|
|
150
|
+
expect(result.isValid).toBe(true);
|
|
151
|
+
expect(result.errors).toHaveLength(0);
|
|
152
|
+
});
|
|
153
|
+
it('should handle edge cases for number validation', () => {
|
|
154
|
+
const paramDefs = [
|
|
155
|
+
new Models_1.Parameter('score', Models_1.ParameterType.Number, 'Score value', true)
|
|
156
|
+
];
|
|
157
|
+
// Test NaN
|
|
158
|
+
const params1 = { score: NaN };
|
|
159
|
+
const result1 = ParameterValidator_1.ParameterValidator.validate(params1, paramDefs);
|
|
160
|
+
expect(result1.isValid).toBe(false);
|
|
161
|
+
expect(result1.errors[0].message).toContain('must be a number');
|
|
162
|
+
// Test Infinity
|
|
163
|
+
const params2 = { score: Infinity };
|
|
164
|
+
const result2 = ParameterValidator_1.ParameterValidator.validate(params2, paramDefs);
|
|
165
|
+
expect(result2.isValid).toBe(true);
|
|
166
|
+
expect(result2.errors).toHaveLength(0);
|
|
167
|
+
// Test negative numbers
|
|
168
|
+
const params3 = { score: -42.5 };
|
|
169
|
+
const result3 = ParameterValidator_1.ParameterValidator.validate(params3, paramDefs);
|
|
170
|
+
expect(result3.isValid).toBe(true);
|
|
171
|
+
expect(result3.errors).toHaveLength(0);
|
|
172
|
+
});
|
|
173
|
+
it('should handle edge cases for integer validation', () => {
|
|
174
|
+
const paramDefs = [
|
|
175
|
+
new Models_1.Parameter('count', Models_1.ParameterType.Integer, 'Item count', true)
|
|
176
|
+
];
|
|
177
|
+
// Test negative integers
|
|
178
|
+
const params1 = { count: -5 };
|
|
179
|
+
const result1 = ParameterValidator_1.ParameterValidator.validate(params1, paramDefs);
|
|
180
|
+
expect(result1.isValid).toBe(true);
|
|
181
|
+
expect(result1.errors).toHaveLength(0);
|
|
182
|
+
// Test zero
|
|
183
|
+
const params2 = { count: 0 };
|
|
184
|
+
const result2 = ParameterValidator_1.ParameterValidator.validate(params2, paramDefs);
|
|
185
|
+
expect(result2.isValid).toBe(true);
|
|
186
|
+
expect(result2.errors).toHaveLength(0);
|
|
187
|
+
// Test very large integers
|
|
188
|
+
const params3 = { count: Number.MAX_SAFE_INTEGER };
|
|
189
|
+
const result3 = ParameterValidator_1.ParameterValidator.validate(params3, paramDefs);
|
|
190
|
+
expect(result3.isValid).toBe(true);
|
|
191
|
+
expect(result3.errors).toHaveLength(0);
|
|
192
|
+
});
|
|
193
|
+
it('should handle empty arrays and objects', () => {
|
|
194
|
+
const paramDefs = [
|
|
195
|
+
new Models_1.Parameter('tags', Models_1.ParameterType.List, 'Tag list', true),
|
|
196
|
+
new Models_1.Parameter('config', Models_1.ParameterType.Dictionary, 'Config object', true)
|
|
197
|
+
];
|
|
198
|
+
const params = {
|
|
199
|
+
tags: [], // empty array should be valid
|
|
200
|
+
config: {} // empty object should be valid
|
|
201
|
+
};
|
|
202
|
+
const result = ParameterValidator_1.ParameterValidator.validate(params, paramDefs);
|
|
203
|
+
expect(result.isValid).toBe(true);
|
|
204
|
+
expect(result.errors).toHaveLength(0);
|
|
205
|
+
});
|
|
206
|
+
it('should handle special string values', () => {
|
|
207
|
+
const paramDefs = [
|
|
208
|
+
new Models_1.Parameter('text', Models_1.ParameterType.String, 'Text value', true)
|
|
209
|
+
];
|
|
210
|
+
// Test empty string
|
|
211
|
+
const params1 = { text: '' };
|
|
212
|
+
const result1 = ParameterValidator_1.ParameterValidator.validate(params1, paramDefs);
|
|
213
|
+
expect(result1.isValid).toBe(true);
|
|
214
|
+
expect(result1.errors).toHaveLength(0);
|
|
215
|
+
// Test string with special characters
|
|
216
|
+
const params2 = { text: 'Hello\nWorld\t!' };
|
|
217
|
+
const result2 = ParameterValidator_1.ParameterValidator.validate(params2, paramDefs);
|
|
218
|
+
expect(result2.isValid).toBe(true);
|
|
219
|
+
expect(result2.errors).toHaveLength(0);
|
|
220
|
+
});
|
|
221
|
+
it('should handle multiple validation errors', () => {
|
|
222
|
+
const paramDefs = [
|
|
223
|
+
new Models_1.Parameter('name', Models_1.ParameterType.String, 'User name', true),
|
|
224
|
+
new Models_1.Parameter('age', Models_1.ParameterType.Integer, 'User age', true),
|
|
225
|
+
new Models_1.Parameter('email', Models_1.ParameterType.String, 'User email', true)
|
|
226
|
+
];
|
|
227
|
+
const params = {
|
|
228
|
+
name: 123, // wrong type
|
|
229
|
+
age: '25' // wrong type
|
|
230
|
+
// email is missing
|
|
231
|
+
};
|
|
232
|
+
const result = ParameterValidator_1.ParameterValidator.validate(params, paramDefs);
|
|
233
|
+
expect(result.isValid).toBe(false);
|
|
234
|
+
expect(result.errors).toHaveLength(3);
|
|
235
|
+
expect(result.errors.some((e) => e.field === 'name')).toBe(true);
|
|
236
|
+
expect(result.errors.some((e) => e.field === 'age')).toBe(true);
|
|
237
|
+
expect(result.errors.some((e) => e.field === 'email')).toBe(true);
|
|
238
|
+
});
|
|
239
|
+
it('should handle tools with no parameter definitions', () => {
|
|
240
|
+
const result = ParameterValidator_1.ParameterValidator.validate({ someParam: 'value' }, []);
|
|
241
|
+
expect(result.isValid).toBe(true);
|
|
242
|
+
expect(result.errors).toHaveLength(0);
|
|
243
|
+
});
|
|
244
|
+
it('should handle extra parameters not in definition', () => {
|
|
245
|
+
const paramDefs = [
|
|
246
|
+
new Models_1.Parameter('name', Models_1.ParameterType.String, 'User name', true)
|
|
247
|
+
];
|
|
248
|
+
const params = {
|
|
249
|
+
name: 'John Doe',
|
|
250
|
+
extraParam: 'should be ignored'
|
|
251
|
+
};
|
|
252
|
+
const result = ParameterValidator_1.ParameterValidator.validate(params, paramDefs);
|
|
253
|
+
expect(result.isValid).toBe(true);
|
|
254
|
+
expect(result.errors).toHaveLength(0);
|
|
255
|
+
});
|
|
256
|
+
it('should handle nested objects and arrays', () => {
|
|
257
|
+
const paramDefs = [
|
|
258
|
+
new Models_1.Parameter('config', Models_1.ParameterType.Dictionary, 'Config object', true),
|
|
259
|
+
new Models_1.Parameter('matrix', Models_1.ParameterType.List, 'Matrix data', true)
|
|
260
|
+
];
|
|
261
|
+
const params = {
|
|
262
|
+
config: {
|
|
263
|
+
nested: {
|
|
264
|
+
deep: {
|
|
265
|
+
value: 'test'
|
|
266
|
+
}
|
|
267
|
+
},
|
|
268
|
+
array: [1, 2, 3]
|
|
269
|
+
},
|
|
270
|
+
matrix: [
|
|
271
|
+
[1, 2, 3],
|
|
272
|
+
[4, 5, 6],
|
|
273
|
+
{ nested: 'object in array' }
|
|
274
|
+
]
|
|
275
|
+
};
|
|
276
|
+
const result = ParameterValidator_1.ParameterValidator.validate(params, paramDefs);
|
|
277
|
+
expect(result.isValid).toBe(true);
|
|
278
|
+
expect(result.errors).toHaveLength(0);
|
|
279
|
+
});
|
|
280
|
+
});
|
|
281
|
+
});
|
|
282
|
+
//# sourceMappingURL=ParameterValidator.test.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"ParameterValidator.test.js","sourceRoot":"","sources":["../../src/validation/ParameterValidator.test.ts"],"names":[],"mappings":"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"}
|
package/package.json
CHANGED
|
@@ -1,6 +1,7 @@
|
|
|
1
1
|
import { GlobalFunction, Response, amendLogContext } from '@zaiusinc/app-sdk';
|
|
2
2
|
import { authenticateGlobalRequest, extractAuthData } from '../auth/AuthUtils';
|
|
3
3
|
import { toolsService } from '../service/Service';
|
|
4
|
+
import { ToolLogger } from '../logging/ToolLogger';
|
|
4
5
|
|
|
5
6
|
/**
|
|
6
7
|
* Abstract base class for global tool-based function execution
|
|
@@ -24,6 +25,8 @@ export abstract class GlobalToolFunction extends GlobalFunction {
|
|
|
24
25
|
* @returns Response as the HTTP response
|
|
25
26
|
*/
|
|
26
27
|
public async perform(): Promise<Response> {
|
|
28
|
+
const startTime = Date.now();
|
|
29
|
+
|
|
27
30
|
// Extract customer_id from auth data for global context attribution
|
|
28
31
|
const authInfo = extractAuthData(this.request);
|
|
29
32
|
const customerId = authInfo?.authData?.credentials?.customer_id;
|
|
@@ -33,6 +36,14 @@ export abstract class GlobalToolFunction extends GlobalFunction {
|
|
|
33
36
|
customerId: customerId || ''
|
|
34
37
|
});
|
|
35
38
|
|
|
39
|
+
ToolLogger.logRequest(this.request);
|
|
40
|
+
|
|
41
|
+
const response = await this.handleRequest();
|
|
42
|
+
ToolLogger.logResponse(this.request, response, Date.now() - startTime);
|
|
43
|
+
return response;
|
|
44
|
+
}
|
|
45
|
+
|
|
46
|
+
private async handleRequest(): Promise<Response> {
|
|
36
47
|
if (!(await this.authorizeRequest())) {
|
|
37
48
|
return new Response(403, { error: 'Forbidden' });
|
|
38
49
|
}
|
|
@@ -1,6 +1,7 @@
|
|
|
1
1
|
import { Function, Response, amendLogContext } from '@zaiusinc/app-sdk';
|
|
2
2
|
import { authenticateRegularRequest } from '../auth/AuthUtils';
|
|
3
3
|
import { toolsService } from '../service/Service';
|
|
4
|
+
import { ToolLogger } from '../logging/ToolLogger';
|
|
4
5
|
|
|
5
6
|
/**
|
|
6
7
|
* Abstract base class for tool-based function execution
|
|
@@ -19,12 +20,28 @@ export abstract class ToolFunction extends Function {
|
|
|
19
20
|
}
|
|
20
21
|
|
|
21
22
|
/**
|
|
22
|
-
* Process the incoming request
|
|
23
|
+
* Process the incoming request with logging
|
|
23
24
|
*
|
|
24
25
|
* @returns Response as the HTTP response
|
|
25
26
|
*/
|
|
26
27
|
public async perform(): Promise<Response> {
|
|
28
|
+
const startTime = Date.now();
|
|
27
29
|
amendLogContext({ opalThreadId: this.request.headers.get('x-opal-thread-id') || '' });
|
|
30
|
+
|
|
31
|
+
ToolLogger.logRequest(this.request);
|
|
32
|
+
|
|
33
|
+
const response = await this.handleRequest();
|
|
34
|
+
|
|
35
|
+
ToolLogger.logResponse(this.request, response, Date.now() - startTime);
|
|
36
|
+
return response;
|
|
37
|
+
}
|
|
38
|
+
|
|
39
|
+
/**
|
|
40
|
+
* Handle the core request processing logic
|
|
41
|
+
*
|
|
42
|
+
* @returns Response as the HTTP response
|
|
43
|
+
*/
|
|
44
|
+
private async handleRequest(): Promise<Response> {
|
|
28
45
|
if (!(await this.authorizeRequest())) {
|
|
29
46
|
return new Response(403, { error: 'Forbidden' });
|
|
30
47
|
}
|
|
@@ -33,6 +50,7 @@ export abstract class ToolFunction extends Function {
|
|
|
33
50
|
const isReady = await this.ready();
|
|
34
51
|
return new Response(200, { ready: isReady });
|
|
35
52
|
}
|
|
53
|
+
|
|
36
54
|
// Pass 'this' as context so decorated methods can use the existing instance
|
|
37
55
|
return toolsService.processRequest(this.request, this);
|
|
38
56
|
}
|