@memberjunction/core-actions 2.54.0 → 2.56.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/dist/custom/ai/execute-ai-prompt.action.d.ts +94 -0
- package/dist/custom/ai/execute-ai-prompt.action.d.ts.map +1 -0
- package/dist/custom/ai/execute-ai-prompt.action.js +274 -0
- package/dist/custom/ai/execute-ai-prompt.action.js.map +1 -0
- package/dist/custom/communication/slack-webhook.action.d.ts +101 -0
- package/dist/custom/communication/slack-webhook.action.d.ts.map +1 -0
- package/dist/custom/communication/slack-webhook.action.js +269 -0
- package/dist/custom/communication/slack-webhook.action.js.map +1 -0
- package/dist/custom/communication/teams-webhook.action.d.ts +96 -0
- package/dist/custom/communication/teams-webhook.action.d.ts.map +1 -0
- package/dist/custom/communication/teams-webhook.action.js +275 -0
- package/dist/custom/communication/teams-webhook.action.js.map +1 -0
- package/dist/custom/data/aggregate-data.action.d.ts +91 -0
- package/dist/custom/data/aggregate-data.action.d.ts.map +1 -0
- package/dist/custom/data/aggregate-data.action.js +333 -0
- package/dist/custom/data/aggregate-data.action.js.map +1 -0
- package/dist/custom/data/csv-parser.action.d.ts +68 -0
- package/dist/custom/data/csv-parser.action.d.ts.map +1 -0
- package/dist/custom/data/csv-parser.action.js +184 -0
- package/dist/custom/data/csv-parser.action.js.map +1 -0
- package/dist/custom/data/data-mapper.action.d.ts +89 -0
- package/dist/custom/data/data-mapper.action.d.ts.map +1 -0
- package/dist/custom/data/data-mapper.action.js +325 -0
- package/dist/custom/data/data-mapper.action.js.map +1 -0
- package/dist/custom/data/json-transform.action.d.ts +57 -0
- package/dist/custom/data/json-transform.action.d.ts.map +1 -0
- package/dist/custom/data/json-transform.action.js +205 -0
- package/dist/custom/data/json-transform.action.js.map +1 -0
- package/dist/custom/data/xml-parser.action.d.ts +85 -0
- package/dist/custom/data/xml-parser.action.d.ts.map +1 -0
- package/dist/custom/data/xml-parser.action.js +326 -0
- package/dist/custom/data/xml-parser.action.js.map +1 -0
- package/dist/custom/files/excel-reader.action.d.ts +86 -0
- package/dist/custom/files/excel-reader.action.d.ts.map +1 -0
- package/dist/custom/files/excel-reader.action.js +348 -0
- package/dist/custom/files/excel-reader.action.js.map +1 -0
- package/dist/custom/files/excel-writer.action.d.ts +79 -0
- package/dist/custom/files/excel-writer.action.d.ts.map +1 -0
- package/dist/custom/files/excel-writer.action.js +325 -0
- package/dist/custom/files/excel-writer.action.js.map +1 -0
- package/dist/custom/files/file-compress.action.d.ts +90 -0
- package/dist/custom/files/file-compress.action.d.ts.map +1 -0
- package/dist/custom/files/file-compress.action.js +346 -0
- package/dist/custom/files/file-compress.action.js.map +1 -0
- package/dist/custom/files/pdf-extractor.action.d.ts +86 -0
- package/dist/custom/files/pdf-extractor.action.d.ts.map +1 -0
- package/dist/custom/files/pdf-extractor.action.js +247 -0
- package/dist/custom/files/pdf-extractor.action.js.map +1 -0
- package/dist/custom/files/pdf-generator.action.d.ts +70 -0
- package/dist/custom/files/pdf-generator.action.d.ts.map +1 -0
- package/dist/custom/files/pdf-generator.action.js +286 -0
- package/dist/custom/files/pdf-generator.action.js.map +1 -0
- package/dist/custom/integration/api-rate-limiter.action.d.ts +88 -0
- package/dist/custom/integration/api-rate-limiter.action.d.ts.map +1 -0
- package/dist/custom/integration/api-rate-limiter.action.js +363 -0
- package/dist/custom/integration/api-rate-limiter.action.js.map +1 -0
- package/dist/custom/integration/graphql-query.action.d.ts +92 -0
- package/dist/custom/integration/graphql-query.action.d.ts.map +1 -0
- package/dist/custom/integration/graphql-query.action.js +251 -0
- package/dist/custom/integration/graphql-query.action.js.map +1 -0
- package/dist/custom/integration/http-request.action.d.ts +96 -0
- package/dist/custom/integration/http-request.action.d.ts.map +1 -0
- package/dist/custom/integration/http-request.action.js +316 -0
- package/dist/custom/integration/http-request.action.js.map +1 -0
- package/dist/custom/integration/oauth-flow.action.d.ts +130 -0
- package/dist/custom/integration/oauth-flow.action.d.ts.map +1 -0
- package/dist/custom/integration/oauth-flow.action.js +624 -0
- package/dist/custom/integration/oauth-flow.action.js.map +1 -0
- package/dist/custom/security/password-strength.action.d.ts +129 -0
- package/dist/custom/security/password-strength.action.d.ts.map +1 -0
- package/dist/custom/security/password-strength.action.js +463 -0
- package/dist/custom/security/password-strength.action.js.map +1 -0
- package/dist/custom/utilities/base-file-handler.d.ts +54 -0
- package/dist/custom/utilities/base-file-handler.d.ts.map +1 -0
- package/dist/custom/utilities/base-file-handler.js +167 -0
- package/dist/custom/utilities/base-file-handler.js.map +1 -0
- package/dist/custom/utilities/index.d.ts +3 -0
- package/dist/custom/utilities/index.d.ts.map +1 -0
- package/dist/custom/utilities/index.js +19 -0
- package/dist/custom/utilities/index.js.map +1 -0
- package/dist/custom/utilities/json-param-helper.d.ts +33 -0
- package/dist/custom/utilities/json-param-helper.d.ts.map +1 -0
- package/dist/custom/utilities/json-param-helper.js +66 -0
- package/dist/custom/utilities/json-param-helper.js.map +1 -0
- package/dist/custom/web/duckduckgo-rate-limiter.d.ts +85 -0
- package/dist/custom/web/duckduckgo-rate-limiter.d.ts.map +1 -0
- package/dist/custom/web/duckduckgo-rate-limiter.js +257 -0
- package/dist/custom/web/duckduckgo-rate-limiter.js.map +1 -0
- package/dist/custom/web/web-search.action.d.ts +1 -0
- package/dist/custom/web/web-search.action.d.ts.map +1 -1
- package/dist/custom/web/web-search.action.js +48 -20
- package/dist/custom/web/web-search.action.js.map +1 -1
- package/dist/custom/workflow/conditional.action.d.ts +94 -0
- package/dist/custom/workflow/conditional.action.d.ts.map +1 -0
- package/dist/custom/workflow/conditional.action.js +274 -0
- package/dist/custom/workflow/conditional.action.js.map +1 -0
- package/dist/custom/workflow/delay.action.d.ts +76 -0
- package/dist/custom/workflow/delay.action.d.ts.map +1 -0
- package/dist/custom/workflow/delay.action.js +187 -0
- package/dist/custom/workflow/delay.action.js.map +1 -0
- package/dist/custom/workflow/loop.action.d.ts +112 -0
- package/dist/custom/workflow/loop.action.d.ts.map +1 -0
- package/dist/custom/workflow/loop.action.js +380 -0
- package/dist/custom/workflow/loop.action.js.map +1 -0
- package/dist/custom/workflow/parallel-execute.action.d.ts +105 -0
- package/dist/custom/workflow/parallel-execute.action.d.ts.map +1 -0
- package/dist/custom/workflow/parallel-execute.action.js +457 -0
- package/dist/custom/workflow/parallel-execute.action.js.map +1 -0
- package/dist/custom/workflow/retry.action.d.ts +90 -0
- package/dist/custom/workflow/retry.action.d.ts.map +1 -0
- package/dist/custom/workflow/retry.action.js +378 -0
- package/dist/custom/workflow/retry.action.js.map +1 -0
- package/dist/index.d.ts +23 -0
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +75 -0
- package/dist/index.js.map +1 -1
- package/package.json +25 -10
- package/readme.md +11270 -101
|
@@ -0,0 +1,88 @@
|
|
|
1
|
+
import { ActionResultSimple, RunActionParams } from "@memberjunction/actions-base";
|
|
2
|
+
import { BaseAction } from "@memberjunction/actions";
|
|
3
|
+
/**
|
|
4
|
+
* Action that adds rate limiting to any API endpoint
|
|
5
|
+
*
|
|
6
|
+
* @example
|
|
7
|
+
* ```typescript
|
|
8
|
+
* // Rate limit API calls
|
|
9
|
+
* await runAction({
|
|
10
|
+
* ActionName: 'API Rate Limiter',
|
|
11
|
+
* Params: [{
|
|
12
|
+
* Name: 'URL',
|
|
13
|
+
* Value: 'https://api.example.com/data'
|
|
14
|
+
* }, {
|
|
15
|
+
* Name: 'Method',
|
|
16
|
+
* Value: 'GET'
|
|
17
|
+
* }, {
|
|
18
|
+
* Name: 'RateLimitKey',
|
|
19
|
+
* Value: 'example-api'
|
|
20
|
+
* }, {
|
|
21
|
+
* Name: 'MaxRequestsPerMinute',
|
|
22
|
+
* Value: 60
|
|
23
|
+
* }, {
|
|
24
|
+
* Name: 'MaxConcurrent',
|
|
25
|
+
* Value: 5
|
|
26
|
+
* }]
|
|
27
|
+
* });
|
|
28
|
+
*
|
|
29
|
+
* // With authentication and retry
|
|
30
|
+
* await runAction({
|
|
31
|
+
* ActionName: 'API Rate Limiter',
|
|
32
|
+
* Params: [{
|
|
33
|
+
* Name: 'URL',
|
|
34
|
+
* Value: 'https://api.example.com/users'
|
|
35
|
+
* }, {
|
|
36
|
+
* Name: 'Headers',
|
|
37
|
+
* Value: { 'Authorization': 'Bearer token' }
|
|
38
|
+
* }, {
|
|
39
|
+
* Name: 'RateLimitKey',
|
|
40
|
+
* Value: 'example-api'
|
|
41
|
+
* }, {
|
|
42
|
+
* Name: 'RetryOnRateLimit',
|
|
43
|
+
* Value: true
|
|
44
|
+
* }, {
|
|
45
|
+
* Name: 'BackoffMs',
|
|
46
|
+
* Value: 1000
|
|
47
|
+
* }]
|
|
48
|
+
* });
|
|
49
|
+
* ```
|
|
50
|
+
*/
|
|
51
|
+
export declare class APIRateLimiterAction extends BaseAction {
|
|
52
|
+
/**
|
|
53
|
+
* Execute API request with rate limiting
|
|
54
|
+
*
|
|
55
|
+
* @param params - The action parameters containing:
|
|
56
|
+
* - URL: API endpoint URL (required)
|
|
57
|
+
* - Method: HTTP method (default: GET)
|
|
58
|
+
* - Headers: Request headers
|
|
59
|
+
* - Body: Request body
|
|
60
|
+
* - RateLimitKey: Unique key for rate limiter instance (required)
|
|
61
|
+
* - MaxRequestsPerMinute: Max requests per minute (default: 60)
|
|
62
|
+
* - MaxConcurrent: Max concurrent requests (default: 5)
|
|
63
|
+
* - RetryOnRateLimit: Retry on 429 errors (default: true)
|
|
64
|
+
* - BackoffMs: Initial backoff in ms (default: 1000)
|
|
65
|
+
* - MaxRetries: Max retry attempts (default: 3)
|
|
66
|
+
* - Timeout: Request timeout in ms (default: 30000)
|
|
67
|
+
*
|
|
68
|
+
* @returns API response with rate limit info
|
|
69
|
+
*/
|
|
70
|
+
protected InternalRunAction(params: RunActionParams): Promise<ActionResultSimple>;
|
|
71
|
+
/**
|
|
72
|
+
* Get numeric parameter with default
|
|
73
|
+
*/
|
|
74
|
+
private getNumericParam;
|
|
75
|
+
/**
|
|
76
|
+
* Get boolean parameter with default
|
|
77
|
+
*/
|
|
78
|
+
private getBooleanParam;
|
|
79
|
+
/**
|
|
80
|
+
* Get parameter value by name (case-insensitive)
|
|
81
|
+
*/
|
|
82
|
+
private getParamValue;
|
|
83
|
+
}
|
|
84
|
+
/**
|
|
85
|
+
* Loader function to ensure the APIRateLimiterAction class is included in the bundle
|
|
86
|
+
*/
|
|
87
|
+
export declare function LoadAPIRateLimiterAction(): void;
|
|
88
|
+
//# sourceMappingURL=api-rate-limiter.action.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"api-rate-limiter.action.d.ts","sourceRoot":"","sources":["../../../src/custom/integration/api-rate-limiter.action.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,kBAAkB,EAAE,eAAe,EAAE,MAAM,8BAA8B,CAAC;AAEnF,OAAO,EAAE,UAAU,EAAE,MAAM,yBAAyB,CAAC;AAuIrD;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA+CG;AACH,qBACa,oBAAqB,SAAQ,UAAU;IAEhD;;;;;;;;;;;;;;;;;OAiBG;cACa,iBAAiB,CAAC,MAAM,EAAE,eAAe,GAAG,OAAO,CAAC,kBAAkB,CAAC;IAyJvF;;OAEG;IACH,OAAO,CAAC,eAAe;IAOvB;;OAEG;IACH,OAAO,CAAC,eAAe;IAUvB;;OAEG;IACH,OAAO,CAAC,aAAa;CAIxB;AAED;;GAEG;AACH,wBAAgB,wBAAwB,SAEvC"}
|
|
@@ -0,0 +1,363 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var __decorate = (this && this.__decorate) || function (decorators, target, key, desc) {
|
|
3
|
+
var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;
|
|
4
|
+
if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc);
|
|
5
|
+
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;
|
|
6
|
+
return c > 3 && r && Object.defineProperty(target, key, r), r;
|
|
7
|
+
};
|
|
8
|
+
var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
9
|
+
return (mod && mod.__esModule) ? mod : { "default": mod };
|
|
10
|
+
};
|
|
11
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
12
|
+
exports.LoadAPIRateLimiterAction = exports.APIRateLimiterAction = void 0;
|
|
13
|
+
const global_1 = require("@memberjunction/global");
|
|
14
|
+
const actions_1 = require("@memberjunction/actions");
|
|
15
|
+
const axios_1 = __importDefault(require("axios"));
|
|
16
|
+
const rxjs_1 = require("rxjs");
|
|
17
|
+
const operators_1 = require("rxjs/operators");
|
|
18
|
+
/**
|
|
19
|
+
* Rate limiter singleton for managing API requests across action instances
|
|
20
|
+
*/
|
|
21
|
+
class APIRateLimiterManager {
|
|
22
|
+
static instance;
|
|
23
|
+
limiters = new Map();
|
|
24
|
+
static getInstance() {
|
|
25
|
+
if (!APIRateLimiterManager.instance) {
|
|
26
|
+
APIRateLimiterManager.instance = new APIRateLimiterManager();
|
|
27
|
+
}
|
|
28
|
+
return APIRateLimiterManager.instance;
|
|
29
|
+
}
|
|
30
|
+
getRateLimiter(key, config) {
|
|
31
|
+
if (!this.limiters.has(key)) {
|
|
32
|
+
this.limiters.set(key, new APIRateLimiter(config));
|
|
33
|
+
}
|
|
34
|
+
return this.limiters.get(key);
|
|
35
|
+
}
|
|
36
|
+
}
|
|
37
|
+
class APIRateLimiter {
|
|
38
|
+
config;
|
|
39
|
+
requestQueue$ = new rxjs_1.Subject();
|
|
40
|
+
requestCount = 0;
|
|
41
|
+
windowStart = Date.now();
|
|
42
|
+
activeRequests = 0;
|
|
43
|
+
constructor(config) {
|
|
44
|
+
this.config = config;
|
|
45
|
+
// Process queue with rate limiting
|
|
46
|
+
this.requestQueue$.pipe((0, operators_1.concatMap)(request => this.processRequest(request))).subscribe();
|
|
47
|
+
}
|
|
48
|
+
async execute(axiosConfig) {
|
|
49
|
+
return new Promise((resolve, reject) => {
|
|
50
|
+
this.requestQueue$.next({
|
|
51
|
+
config: axiosConfig,
|
|
52
|
+
resolve,
|
|
53
|
+
reject,
|
|
54
|
+
retryCount: 0
|
|
55
|
+
});
|
|
56
|
+
});
|
|
57
|
+
}
|
|
58
|
+
processRequest(request) {
|
|
59
|
+
return new rxjs_1.Observable(observer => {
|
|
60
|
+
const executeRequest = async () => {
|
|
61
|
+
// Check rate limit window
|
|
62
|
+
const now = Date.now();
|
|
63
|
+
const windowElapsed = now - this.windowStart;
|
|
64
|
+
if (windowElapsed >= 60000) {
|
|
65
|
+
// Reset window
|
|
66
|
+
this.requestCount = 0;
|
|
67
|
+
this.windowStart = now;
|
|
68
|
+
}
|
|
69
|
+
// Wait if we've hit rate limit
|
|
70
|
+
if (this.requestCount >= this.config.maxRequestsPerMinute) {
|
|
71
|
+
const waitTime = 60000 - windowElapsed;
|
|
72
|
+
await new Promise(resolve => setTimeout(resolve, waitTime));
|
|
73
|
+
// Reset after waiting
|
|
74
|
+
this.requestCount = 0;
|
|
75
|
+
this.windowStart = Date.now();
|
|
76
|
+
}
|
|
77
|
+
// Wait if at concurrent limit
|
|
78
|
+
while (this.activeRequests >= this.config.maxConcurrent) {
|
|
79
|
+
await new Promise(resolve => setTimeout(resolve, 100));
|
|
80
|
+
}
|
|
81
|
+
// Execute request
|
|
82
|
+
this.requestCount++;
|
|
83
|
+
this.activeRequests++;
|
|
84
|
+
try {
|
|
85
|
+
const response = await (0, axios_1.default)(request.config);
|
|
86
|
+
this.activeRequests--;
|
|
87
|
+
request.resolve(response);
|
|
88
|
+
observer.next();
|
|
89
|
+
observer.complete();
|
|
90
|
+
}
|
|
91
|
+
catch (error) {
|
|
92
|
+
this.activeRequests--;
|
|
93
|
+
// Check if rate limited
|
|
94
|
+
const isRateLimited = error.response?.status === 429 ||
|
|
95
|
+
error.response?.status === 503 ||
|
|
96
|
+
(error.response?.headers && error.response.headers['x-ratelimit-remaining'] === '0');
|
|
97
|
+
if (isRateLimited && this.config.retryOnRateLimit && request.retryCount < this.config.maxRetries) {
|
|
98
|
+
// Calculate backoff
|
|
99
|
+
const backoffTime = this.config.backoffMs * Math.pow(2, request.retryCount);
|
|
100
|
+
// Retry after backoff
|
|
101
|
+
setTimeout(() => {
|
|
102
|
+
request.retryCount++;
|
|
103
|
+
this.requestQueue$.next(request);
|
|
104
|
+
}, backoffTime);
|
|
105
|
+
observer.next();
|
|
106
|
+
observer.complete();
|
|
107
|
+
}
|
|
108
|
+
else {
|
|
109
|
+
request.reject(error);
|
|
110
|
+
observer.error(error);
|
|
111
|
+
}
|
|
112
|
+
}
|
|
113
|
+
};
|
|
114
|
+
executeRequest().catch(err => observer.error(err));
|
|
115
|
+
});
|
|
116
|
+
}
|
|
117
|
+
}
|
|
118
|
+
/**
|
|
119
|
+
* Action that adds rate limiting to any API endpoint
|
|
120
|
+
*
|
|
121
|
+
* @example
|
|
122
|
+
* ```typescript
|
|
123
|
+
* // Rate limit API calls
|
|
124
|
+
* await runAction({
|
|
125
|
+
* ActionName: 'API Rate Limiter',
|
|
126
|
+
* Params: [{
|
|
127
|
+
* Name: 'URL',
|
|
128
|
+
* Value: 'https://api.example.com/data'
|
|
129
|
+
* }, {
|
|
130
|
+
* Name: 'Method',
|
|
131
|
+
* Value: 'GET'
|
|
132
|
+
* }, {
|
|
133
|
+
* Name: 'RateLimitKey',
|
|
134
|
+
* Value: 'example-api'
|
|
135
|
+
* }, {
|
|
136
|
+
* Name: 'MaxRequestsPerMinute',
|
|
137
|
+
* Value: 60
|
|
138
|
+
* }, {
|
|
139
|
+
* Name: 'MaxConcurrent',
|
|
140
|
+
* Value: 5
|
|
141
|
+
* }]
|
|
142
|
+
* });
|
|
143
|
+
*
|
|
144
|
+
* // With authentication and retry
|
|
145
|
+
* await runAction({
|
|
146
|
+
* ActionName: 'API Rate Limiter',
|
|
147
|
+
* Params: [{
|
|
148
|
+
* Name: 'URL',
|
|
149
|
+
* Value: 'https://api.example.com/users'
|
|
150
|
+
* }, {
|
|
151
|
+
* Name: 'Headers',
|
|
152
|
+
* Value: { 'Authorization': 'Bearer token' }
|
|
153
|
+
* }, {
|
|
154
|
+
* Name: 'RateLimitKey',
|
|
155
|
+
* Value: 'example-api'
|
|
156
|
+
* }, {
|
|
157
|
+
* Name: 'RetryOnRateLimit',
|
|
158
|
+
* Value: true
|
|
159
|
+
* }, {
|
|
160
|
+
* Name: 'BackoffMs',
|
|
161
|
+
* Value: 1000
|
|
162
|
+
* }]
|
|
163
|
+
* });
|
|
164
|
+
* ```
|
|
165
|
+
*/
|
|
166
|
+
let APIRateLimiterAction = class APIRateLimiterAction extends actions_1.BaseAction {
|
|
167
|
+
/**
|
|
168
|
+
* Execute API request with rate limiting
|
|
169
|
+
*
|
|
170
|
+
* @param params - The action parameters containing:
|
|
171
|
+
* - URL: API endpoint URL (required)
|
|
172
|
+
* - Method: HTTP method (default: GET)
|
|
173
|
+
* - Headers: Request headers
|
|
174
|
+
* - Body: Request body
|
|
175
|
+
* - RateLimitKey: Unique key for rate limiter instance (required)
|
|
176
|
+
* - MaxRequestsPerMinute: Max requests per minute (default: 60)
|
|
177
|
+
* - MaxConcurrent: Max concurrent requests (default: 5)
|
|
178
|
+
* - RetryOnRateLimit: Retry on 429 errors (default: true)
|
|
179
|
+
* - BackoffMs: Initial backoff in ms (default: 1000)
|
|
180
|
+
* - MaxRetries: Max retry attempts (default: 3)
|
|
181
|
+
* - Timeout: Request timeout in ms (default: 30000)
|
|
182
|
+
*
|
|
183
|
+
* @returns API response with rate limit info
|
|
184
|
+
*/
|
|
185
|
+
async InternalRunAction(params) {
|
|
186
|
+
try {
|
|
187
|
+
const url = this.getParamValue(params, 'url');
|
|
188
|
+
const method = (this.getParamValue(params, 'method') || 'GET').toUpperCase();
|
|
189
|
+
const headers = this.getParamValue(params, 'headers') || {};
|
|
190
|
+
const body = this.getParamValue(params, 'body');
|
|
191
|
+
const rateLimitKey = this.getParamValue(params, 'ratelimitkey');
|
|
192
|
+
const maxRequestsPerMinute = this.getNumericParam(params, 'maxrequestsperminute', 60);
|
|
193
|
+
const maxConcurrent = this.getNumericParam(params, 'maxconcurrent', 5);
|
|
194
|
+
const retryOnRateLimit = this.getBooleanParam(params, 'retryonratelimit', true);
|
|
195
|
+
const backoffMs = this.getNumericParam(params, 'backoffms', 1000);
|
|
196
|
+
const maxRetries = this.getNumericParam(params, 'maxretries', 3);
|
|
197
|
+
const timeout = this.getNumericParam(params, 'timeout', 30000);
|
|
198
|
+
// Validate required parameters
|
|
199
|
+
if (!url) {
|
|
200
|
+
return {
|
|
201
|
+
Success: false,
|
|
202
|
+
Message: "URL parameter is required",
|
|
203
|
+
ResultCode: "MISSING_URL"
|
|
204
|
+
};
|
|
205
|
+
}
|
|
206
|
+
if (!rateLimitKey) {
|
|
207
|
+
return {
|
|
208
|
+
Success: false,
|
|
209
|
+
Message: "RateLimitKey parameter is required",
|
|
210
|
+
ResultCode: "MISSING_RATE_LIMIT_KEY"
|
|
211
|
+
};
|
|
212
|
+
}
|
|
213
|
+
// Validate rate limit config
|
|
214
|
+
if (maxRequestsPerMinute < 1) {
|
|
215
|
+
return {
|
|
216
|
+
Success: false,
|
|
217
|
+
Message: "MaxRequestsPerMinute must be at least 1",
|
|
218
|
+
ResultCode: "INVALID_RATE_LIMIT"
|
|
219
|
+
};
|
|
220
|
+
}
|
|
221
|
+
if (maxConcurrent < 1) {
|
|
222
|
+
return {
|
|
223
|
+
Success: false,
|
|
224
|
+
Message: "MaxConcurrent must be at least 1",
|
|
225
|
+
ResultCode: "INVALID_CONCURRENT_LIMIT"
|
|
226
|
+
};
|
|
227
|
+
}
|
|
228
|
+
// Get or create rate limiter
|
|
229
|
+
const rateLimiterManager = APIRateLimiterManager.getInstance();
|
|
230
|
+
const rateLimiter = rateLimiterManager.getRateLimiter(rateLimitKey, {
|
|
231
|
+
maxRequestsPerMinute,
|
|
232
|
+
maxConcurrent,
|
|
233
|
+
retryOnRateLimit,
|
|
234
|
+
backoffMs,
|
|
235
|
+
maxRetries
|
|
236
|
+
});
|
|
237
|
+
// Build request config
|
|
238
|
+
const config = {
|
|
239
|
+
url,
|
|
240
|
+
method: method,
|
|
241
|
+
headers,
|
|
242
|
+
timeout,
|
|
243
|
+
validateStatus: () => true // Handle all status codes
|
|
244
|
+
};
|
|
245
|
+
if (body && ['POST', 'PUT', 'PATCH'].includes(method)) {
|
|
246
|
+
config.data = body;
|
|
247
|
+
}
|
|
248
|
+
// Execute with rate limiting
|
|
249
|
+
const startTime = Date.now();
|
|
250
|
+
const response = await rateLimiter.execute(config);
|
|
251
|
+
const duration = Date.now() - startTime;
|
|
252
|
+
// Extract rate limit headers
|
|
253
|
+
const rateLimitHeaders = {};
|
|
254
|
+
const headerNames = [
|
|
255
|
+
'x-ratelimit-limit',
|
|
256
|
+
'x-ratelimit-remaining',
|
|
257
|
+
'x-ratelimit-reset',
|
|
258
|
+
'x-rate-limit-limit',
|
|
259
|
+
'x-rate-limit-remaining',
|
|
260
|
+
'x-rate-limit-reset',
|
|
261
|
+
'ratelimit-limit',
|
|
262
|
+
'ratelimit-remaining',
|
|
263
|
+
'ratelimit-reset'
|
|
264
|
+
];
|
|
265
|
+
for (const header of headerNames) {
|
|
266
|
+
if (response.headers[header]) {
|
|
267
|
+
rateLimitHeaders[header] = response.headers[header];
|
|
268
|
+
}
|
|
269
|
+
}
|
|
270
|
+
// Add output parameters
|
|
271
|
+
params.Params.push({
|
|
272
|
+
Name: 'ResponseStatus',
|
|
273
|
+
Type: 'Output',
|
|
274
|
+
Value: response.status
|
|
275
|
+
});
|
|
276
|
+
params.Params.push({
|
|
277
|
+
Name: 'ResponseHeaders',
|
|
278
|
+
Type: 'Output',
|
|
279
|
+
Value: response.headers
|
|
280
|
+
});
|
|
281
|
+
params.Params.push({
|
|
282
|
+
Name: 'ResponseData',
|
|
283
|
+
Type: 'Output',
|
|
284
|
+
Value: response.data
|
|
285
|
+
});
|
|
286
|
+
params.Params.push({
|
|
287
|
+
Name: 'RateLimitInfo',
|
|
288
|
+
Type: 'Output',
|
|
289
|
+
Value: rateLimitHeaders
|
|
290
|
+
});
|
|
291
|
+
params.Params.push({
|
|
292
|
+
Name: 'RequestDuration',
|
|
293
|
+
Type: 'Output',
|
|
294
|
+
Value: duration
|
|
295
|
+
});
|
|
296
|
+
// Check if request was successful
|
|
297
|
+
const isSuccess = response.status >= 200 && response.status < 300;
|
|
298
|
+
return {
|
|
299
|
+
Success: true,
|
|
300
|
+
ResultCode: isSuccess ? "SUCCESS" : `HTTP_${response.status}`,
|
|
301
|
+
Message: JSON.stringify({
|
|
302
|
+
message: "API request completed with rate limiting",
|
|
303
|
+
status: response.status,
|
|
304
|
+
statusText: response.statusText,
|
|
305
|
+
duration: duration,
|
|
306
|
+
rateLimitInfo: rateLimitHeaders,
|
|
307
|
+
rateLimitKey: rateLimitKey,
|
|
308
|
+
data: response.data
|
|
309
|
+
}, null, 2)
|
|
310
|
+
};
|
|
311
|
+
}
|
|
312
|
+
catch (error) {
|
|
313
|
+
return {
|
|
314
|
+
Success: false,
|
|
315
|
+
Message: `Rate limited API request failed: ${error instanceof Error ? error.message : String(error)}`,
|
|
316
|
+
ResultCode: "REQUEST_FAILED"
|
|
317
|
+
};
|
|
318
|
+
}
|
|
319
|
+
}
|
|
320
|
+
/**
|
|
321
|
+
* Get numeric parameter with default
|
|
322
|
+
*/
|
|
323
|
+
getNumericParam(params, name, defaultValue) {
|
|
324
|
+
const value = this.getParamValue(params, name);
|
|
325
|
+
if (value === undefined || value === null)
|
|
326
|
+
return defaultValue;
|
|
327
|
+
const num = Number(value);
|
|
328
|
+
return isNaN(num) ? defaultValue : num;
|
|
329
|
+
}
|
|
330
|
+
/**
|
|
331
|
+
* Get boolean parameter with default
|
|
332
|
+
*/
|
|
333
|
+
getBooleanParam(params, name, defaultValue) {
|
|
334
|
+
const value = this.getParamValue(params, name);
|
|
335
|
+
if (value === undefined || value === null)
|
|
336
|
+
return defaultValue;
|
|
337
|
+
if (typeof value === 'boolean')
|
|
338
|
+
return value;
|
|
339
|
+
if (typeof value === 'string') {
|
|
340
|
+
return value.toLowerCase() === 'true';
|
|
341
|
+
}
|
|
342
|
+
return defaultValue;
|
|
343
|
+
}
|
|
344
|
+
/**
|
|
345
|
+
* Get parameter value by name (case-insensitive)
|
|
346
|
+
*/
|
|
347
|
+
getParamValue(params, name) {
|
|
348
|
+
const param = params.Params.find(p => p.Name.toLowerCase() === name.toLowerCase());
|
|
349
|
+
return param?.Value;
|
|
350
|
+
}
|
|
351
|
+
};
|
|
352
|
+
exports.APIRateLimiterAction = APIRateLimiterAction;
|
|
353
|
+
exports.APIRateLimiterAction = APIRateLimiterAction = __decorate([
|
|
354
|
+
(0, global_1.RegisterClass)(actions_1.BaseAction, "API Rate Limiter")
|
|
355
|
+
], APIRateLimiterAction);
|
|
356
|
+
/**
|
|
357
|
+
* Loader function to ensure the APIRateLimiterAction class is included in the bundle
|
|
358
|
+
*/
|
|
359
|
+
function LoadAPIRateLimiterAction() {
|
|
360
|
+
// Stub function to prevent tree shaking
|
|
361
|
+
}
|
|
362
|
+
exports.LoadAPIRateLimiterAction = LoadAPIRateLimiterAction;
|
|
363
|
+
//# sourceMappingURL=api-rate-limiter.action.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"api-rate-limiter.action.js","sourceRoot":"","sources":["../../../src/custom/integration/api-rate-limiter.action.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,92 @@
|
|
|
1
|
+
import { ActionResultSimple, RunActionParams } from "@memberjunction/actions-base";
|
|
2
|
+
import { BaseAction } from "@memberjunction/actions";
|
|
3
|
+
/**
|
|
4
|
+
* Action that executes GraphQL queries and mutations
|
|
5
|
+
*
|
|
6
|
+
* @example
|
|
7
|
+
* ```typescript
|
|
8
|
+
* // Simple query
|
|
9
|
+
* await runAction({
|
|
10
|
+
* ActionName: 'GraphQL Query',
|
|
11
|
+
* Params: [{
|
|
12
|
+
* Name: 'Endpoint',
|
|
13
|
+
* Value: 'https://api.example.com/graphql'
|
|
14
|
+
* }, {
|
|
15
|
+
* Name: 'Query',
|
|
16
|
+
* Value: `
|
|
17
|
+
* query GetUser($id: ID!) {
|
|
18
|
+
* user(id: $id) {
|
|
19
|
+
* id
|
|
20
|
+
* name
|
|
21
|
+
* email
|
|
22
|
+
* }
|
|
23
|
+
* }
|
|
24
|
+
* `
|
|
25
|
+
* }, {
|
|
26
|
+
* Name: 'Variables',
|
|
27
|
+
* Value: { id: '123' }
|
|
28
|
+
* }]
|
|
29
|
+
* });
|
|
30
|
+
*
|
|
31
|
+
* // Mutation with headers
|
|
32
|
+
* await runAction({
|
|
33
|
+
* ActionName: 'GraphQL Query',
|
|
34
|
+
* Params: [{
|
|
35
|
+
* Name: 'Endpoint',
|
|
36
|
+
* Value: 'https://api.example.com/graphql'
|
|
37
|
+
* }, {
|
|
38
|
+
* Name: 'Query',
|
|
39
|
+
* Value: `
|
|
40
|
+
* mutation CreateUser($input: CreateUserInput!) {
|
|
41
|
+
* createUser(input: $input) {
|
|
42
|
+
* id
|
|
43
|
+
* name
|
|
44
|
+
* }
|
|
45
|
+
* }
|
|
46
|
+
* `
|
|
47
|
+
* }, {
|
|
48
|
+
* Name: 'Variables',
|
|
49
|
+
* Value: {
|
|
50
|
+
* input: {
|
|
51
|
+
* name: 'John Doe',
|
|
52
|
+
* email: 'john@example.com'
|
|
53
|
+
* }
|
|
54
|
+
* }
|
|
55
|
+
* }, {
|
|
56
|
+
* Name: 'Headers',
|
|
57
|
+
* Value: {
|
|
58
|
+
* 'Authorization': 'Bearer token123'
|
|
59
|
+
* }
|
|
60
|
+
* }]
|
|
61
|
+
* });
|
|
62
|
+
* ```
|
|
63
|
+
*/
|
|
64
|
+
export declare class GraphQLQueryAction extends BaseAction {
|
|
65
|
+
/**
|
|
66
|
+
* Executes a GraphQL query or mutation
|
|
67
|
+
*
|
|
68
|
+
* @param params - The action parameters containing:
|
|
69
|
+
* - Endpoint: GraphQL endpoint URL (required)
|
|
70
|
+
* - Query: GraphQL query/mutation string (required)
|
|
71
|
+
* - Variables: Variables object for the query (optional)
|
|
72
|
+
* - Headers: Additional headers for the request (optional)
|
|
73
|
+
* - OperationName: For multi-operation documents (optional)
|
|
74
|
+
* - Timeout: Request timeout in milliseconds - default: 30000
|
|
75
|
+
*
|
|
76
|
+
* @returns GraphQL response data
|
|
77
|
+
*/
|
|
78
|
+
protected InternalRunAction(params: RunActionParams): Promise<ActionResultSimple>;
|
|
79
|
+
/**
|
|
80
|
+
* Get numeric parameter with default
|
|
81
|
+
*/
|
|
82
|
+
private getNumericParam;
|
|
83
|
+
/**
|
|
84
|
+
* Get parameter value by name (case-insensitive)
|
|
85
|
+
*/
|
|
86
|
+
private getParamValue;
|
|
87
|
+
}
|
|
88
|
+
/**
|
|
89
|
+
* Loader function to ensure the GraphQLQueryAction class is included in the bundle
|
|
90
|
+
*/
|
|
91
|
+
export declare function LoadGraphQLQueryAction(): void;
|
|
92
|
+
//# sourceMappingURL=graphql-query.action.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"graphql-query.action.d.ts","sourceRoot":"","sources":["../../../src/custom/integration/graphql-query.action.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,kBAAkB,EAAE,eAAe,EAAE,MAAM,8BAA8B,CAAC;AAEnF,OAAO,EAAE,UAAU,EAAE,MAAM,yBAAyB,CAAC;AAIrD;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA4DG;AACH,qBACa,kBAAmB,SAAQ,UAAU;IAE9C;;;;;;;;;;;;OAYG;cACa,iBAAiB,CAAC,MAAM,EAAE,eAAe,GAAG,OAAO,CAAC,kBAAkB,CAAC;IA8IvF;;OAEG;IACH,OAAO,CAAC,eAAe;IAOvB;;OAEG;IACH,OAAO,CAAC,aAAa;CAIxB;AAED;;GAEG;AACH,wBAAgB,sBAAsB,SAErC"}
|