@optimizely-opal/opal-tool-ocp-sdk 1.0.0-beta.2 → 1.0.0-beta.4

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (67) hide show
  1. package/README.md +114 -0
  2. package/dist/auth/AuthUtils.d.ts +5 -5
  3. package/dist/auth/AuthUtils.d.ts.map +1 -1
  4. package/dist/auth/AuthUtils.js +53 -25
  5. package/dist/auth/AuthUtils.js.map +1 -1
  6. package/dist/auth/AuthUtils.test.js +62 -117
  7. package/dist/auth/AuthUtils.test.js.map +1 -1
  8. package/dist/function/GlobalToolFunction.d.ts +2 -1
  9. package/dist/function/GlobalToolFunction.d.ts.map +1 -1
  10. package/dist/function/GlobalToolFunction.js +25 -4
  11. package/dist/function/GlobalToolFunction.js.map +1 -1
  12. package/dist/function/GlobalToolFunction.test.js +57 -8
  13. package/dist/function/GlobalToolFunction.test.js.map +1 -1
  14. package/dist/function/ToolFunction.d.ts +8 -2
  15. package/dist/function/ToolFunction.d.ts.map +1 -1
  16. package/dist/function/ToolFunction.js +31 -5
  17. package/dist/function/ToolFunction.js.map +1 -1
  18. package/dist/function/ToolFunction.test.js +57 -8
  19. package/dist/function/ToolFunction.test.js.map +1 -1
  20. package/dist/index.d.ts +1 -0
  21. package/dist/index.d.ts.map +1 -1
  22. package/dist/index.js +1 -0
  23. package/dist/index.js.map +1 -1
  24. package/dist/logging/ToolLogger.d.ts +34 -0
  25. package/dist/logging/ToolLogger.d.ts.map +1 -0
  26. package/dist/logging/ToolLogger.js +153 -0
  27. package/dist/logging/ToolLogger.js.map +1 -0
  28. package/dist/logging/ToolLogger.test.d.ts +2 -0
  29. package/dist/logging/ToolLogger.test.d.ts.map +1 -0
  30. package/dist/logging/ToolLogger.test.js +646 -0
  31. package/dist/logging/ToolLogger.test.js.map +1 -0
  32. package/dist/service/Service.d.ts +15 -2
  33. package/dist/service/Service.d.ts.map +1 -1
  34. package/dist/service/Service.js +43 -17
  35. package/dist/service/Service.js.map +1 -1
  36. package/dist/service/Service.test.js +84 -2
  37. package/dist/service/Service.test.js.map +1 -1
  38. package/dist/types/ToolError.d.ts +59 -0
  39. package/dist/types/ToolError.d.ts.map +1 -0
  40. package/dist/types/ToolError.js +79 -0
  41. package/dist/types/ToolError.js.map +1 -0
  42. package/dist/types/ToolError.test.d.ts +2 -0
  43. package/dist/types/ToolError.test.d.ts.map +1 -0
  44. package/dist/types/ToolError.test.js +161 -0
  45. package/dist/types/ToolError.test.js.map +1 -0
  46. package/dist/validation/ParameterValidator.d.ts +5 -16
  47. package/dist/validation/ParameterValidator.d.ts.map +1 -1
  48. package/dist/validation/ParameterValidator.js +10 -3
  49. package/dist/validation/ParameterValidator.js.map +1 -1
  50. package/dist/validation/ParameterValidator.test.js +186 -146
  51. package/dist/validation/ParameterValidator.test.js.map +1 -1
  52. package/package.json +1 -1
  53. package/src/auth/AuthUtils.test.ts +62 -157
  54. package/src/auth/AuthUtils.ts +66 -32
  55. package/src/function/GlobalToolFunction.test.ts +57 -8
  56. package/src/function/GlobalToolFunction.ts +37 -6
  57. package/src/function/ToolFunction.test.ts +57 -8
  58. package/src/function/ToolFunction.ts +45 -7
  59. package/src/index.ts +1 -0
  60. package/src/logging/ToolLogger.test.ts +753 -0
  61. package/src/logging/ToolLogger.ts +177 -0
  62. package/src/service/Service.test.ts +103 -2
  63. package/src/service/Service.ts +45 -17
  64. package/src/types/ToolError.test.ts +192 -0
  65. package/src/types/ToolError.ts +95 -0
  66. package/src/validation/ParameterValidator.test.ts +185 -158
  67. package/src/validation/ParameterValidator.ts +17 -20
@@ -0,0 +1,153 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.ToolLogger = void 0;
4
+ const app_sdk_1 = require("@zaiusinc/app-sdk");
5
+ /**
6
+ * Utility class for logging Opal tool requests and responses with security considerations
7
+ */
8
+ class ToolLogger {
9
+ static SENSITIVE_FIELDS = [
10
+ // Authentication / secrets
11
+ 'password',
12
+ 'pass',
13
+ 'secret',
14
+ 'key',
15
+ 'token',
16
+ 'auth',
17
+ 'credentials',
18
+ 'access_token',
19
+ 'refresh_token',
20
+ 'api_key',
21
+ 'private_key',
22
+ 'client_secret',
23
+ 'session_token',
24
+ 'authorization',
25
+ // Payment-related
26
+ 'card_number',
27
+ 'credit_card',
28
+ 'cvv',
29
+ 'expiry_date',
30
+ // Personal info
31
+ 'ssn', // social security number
32
+ 'nid', // national ID
33
+ 'passport',
34
+ 'dob', // date of birth
35
+ 'email',
36
+ 'phone',
37
+ 'address',
38
+ // Misc / environment
39
+ 'otp',
40
+ 'pin',
41
+ 'security_answer',
42
+ 'security_question',
43
+ 'signing_key',
44
+ 'encryption_key',
45
+ 'jwt',
46
+ 'bearer_token'
47
+ ];
48
+ static MAX_PARAM_LENGTH = 100;
49
+ static MAX_ARRAY_ITEMS = 10;
50
+ /**
51
+ * Redacts sensitive data from an object
52
+ */
53
+ static redactSensitiveData(data, maxDepth = 5) {
54
+ if (maxDepth <= 0) {
55
+ return '[MAX_DEPTH_EXCEEDED]';
56
+ }
57
+ if (data === null || data === undefined) {
58
+ return data;
59
+ }
60
+ if (typeof data === 'string') {
61
+ return data.length > this.MAX_PARAM_LENGTH
62
+ ? `${data.substring(0, this.MAX_PARAM_LENGTH)}... (truncated, ${data.length} chars total)`
63
+ : data;
64
+ }
65
+ if (typeof data === 'number' || typeof data === 'boolean') {
66
+ return data;
67
+ }
68
+ if (Array.isArray(data)) {
69
+ const truncated = data.slice(0, this.MAX_ARRAY_ITEMS);
70
+ const result = truncated.map((item) => this.redactSensitiveData(item, maxDepth - 1));
71
+ if (data.length > this.MAX_ARRAY_ITEMS) {
72
+ result.push(`... (${data.length - this.MAX_ARRAY_ITEMS} more items truncated)`);
73
+ }
74
+ return result;
75
+ }
76
+ if (typeof data === 'object') {
77
+ const result = {};
78
+ for (const [key, value] of Object.entries(data)) {
79
+ // Check if this field contains sensitive data
80
+ const isSensitive = this.isSensitiveField(key);
81
+ if (isSensitive) {
82
+ result[key] = '[REDACTED]';
83
+ }
84
+ else {
85
+ result[key] = this.redactSensitiveData(value, maxDepth - 1);
86
+ }
87
+ }
88
+ return result;
89
+ }
90
+ return data;
91
+ }
92
+ /**
93
+ * Checks if a field name is considered sensitive
94
+ */
95
+ static isSensitiveField(fieldName) {
96
+ const lowerKey = fieldName.toLowerCase();
97
+ return this.SENSITIVE_FIELDS.some((sensitiveField) => lowerKey.includes(sensitiveField));
98
+ }
99
+ /**
100
+ * Creates a summary of request parameters
101
+ */
102
+ static createParameterSummary(params) {
103
+ if (!params) {
104
+ return null;
105
+ }
106
+ return this.redactSensitiveData(params);
107
+ }
108
+ /**
109
+ * Calculates content length of response data
110
+ */
111
+ static calculateContentLength(response) {
112
+ if (!response) {
113
+ return 0;
114
+ }
115
+ try {
116
+ return response.bodyAsU8Array?.length || 'unknown';
117
+ }
118
+ catch {
119
+ return 'unknown';
120
+ }
121
+ }
122
+ /**
123
+ * Logs an incoming request
124
+ */
125
+ static logRequest(req) {
126
+ const params = req.bodyJSON && req.bodyJSON.parameters ? req.bodyJSON.parameters : req.bodyJSON;
127
+ const requestLog = {
128
+ event: 'opal_tool_request',
129
+ path: req.path,
130
+ parameters: this.createParameterSummary(params)
131
+ };
132
+ // Log with Zaius audience so developers only see requests for accounts they have access to
133
+ app_sdk_1.logger.info(app_sdk_1.LogVisibility.Zaius, JSON.stringify(requestLog));
134
+ }
135
+ /**
136
+ * Logs a successful response
137
+ */
138
+ static logResponse(req, response, processingTimeMs) {
139
+ const responseLog = {
140
+ event: 'opal_tool_response',
141
+ path: req.path,
142
+ duration: processingTimeMs ? `${processingTimeMs}ms` : undefined,
143
+ status: response.status,
144
+ contentType: response.headers?.get('content-type') || 'unknown',
145
+ contentLength: this.calculateContentLength(response),
146
+ success: response.status >= 200 && response.status < 300
147
+ };
148
+ // Log with Zaius audience so developers only see requests for accounts they have access to
149
+ app_sdk_1.logger.info(app_sdk_1.LogVisibility.Zaius, JSON.stringify(responseLog));
150
+ }
151
+ }
152
+ exports.ToolLogger = ToolLogger;
153
+ //# sourceMappingURL=ToolLogger.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ToolLogger.js","sourceRoot":"","sources":["../../src/logging/ToolLogger.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=ToolLogger.test.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ToolLogger.test.d.ts","sourceRoot":"","sources":["../../src/logging/ToolLogger.test.ts"],"names":[],"mappings":""}